
######cintcode/com/makeinit.b#
/*.MakeInit.--.Construct.an.initialisation.file.for
.a#0A*..multi-file.NATBCPL.application#2E#0A*..Writ
ten.by.Colin.Liebenrood..(cjlieben@waitrose#2Ecom)#0A
*#0A*..Slightly.modified.by.Martin.Richards.(mr@cl#2E
cam#2Eac#2Euk)#0A*..to.give.it.the.following.usage:
#0A*#0A*.makeinit.aaa#2Eb.bbb#2Eb.#2E#2E#2E.kkk#2Eb
.to.init#2Ec.stacksize.20000.gsize.2000#0A*#0A*.$Lo
g:.makeinit#2Eb,v.$#0A*#0A*.Revision.1#2E9..2009/09
/07.12:50:13..martin#0A*.Used.BCPLWORD.instead.of.W
ORD.plus.other.minor.changes#0A*.Changed.performget
.to.be.compatible.with.the.latest.bcplfe#0A*#0A*.Re
vision.1#2E8..2004/04/25.07:38:23..martin#0A*.Made.
GET.directives.use.BCPLHDRS.environment.variable#0A
*#0A*.Revision.1#2E7..2004/04/21.16:35:00..martin#0A
*.Changed.rdargs.format.to.",,,,,,,,,,TO/k/a,STKSIZ
E/k,GLOBSIZE/k"#0A*#0A*.Revision.1#2E6..2004/04/03.
14:53:05..colin#0A*.Revised.order.of.arguments,.to.
allow.input.from.stdin.with.named.output.only#0A*.U
se.rdargs()-style.command.line#2E..Protect.against.
no.files.in.input-list#2E#0A*.Tidy.version-number.d
isplay#2E#0A*#0A*.Revision.1#2E5..2004/04/01.16:12:
22..colin#0A*.Made.target.stack-size.and.global.vec
tor.size.into.parameters#2E#0A*.Altered.emitted.cod
e.to.conform.to.revised.function.prototypes.in.bcpl
#2Eh#0A*#0A*.Revision.1#2E4..2004/03/21.17:45:13..c
olin#0A*.Fix.coding.error#0A*#0A*.Revision.1#2E3..2
004/03/21.17:42:03..colin#0A*.Fully.working?.with.c
omments.updated#0A*#0A*.Revision.1#2E2..2004/03/19.
20:17:00..colin#0A*.Handling.multiple.files.and.sto
ring.section-names#2E.Wrong.status.returns#0A*#0A*.
Revision.1#2E1..2004/03/18.15:54:10..colin#0A*.Init
ial.revision#0A*#0A*#0A*/#0A#0ASECTION."MakeInit"#0A
#0AGET."libhdr"#0A.#0AMANIFEST.{.#0A//.Used.in.scan
forsection(),.lex().and.friends#0As_number#3D1;.s_n
ame;.s_string;.s_true;.s_false#0As_div;.s_logand;.s
_needs;.s_section#0As_end;.s_lsect;.s_rsect;.s_get#0A
s_dot;.s_eof#0A#0Ah1#3D0;.h2;.h3;.h4............//.
.Selectors#0Abt_name#3D0;.bt_left;.bt_right;.bt_fil
e#0A#0Ac_backspace.#3D..8........//.Character.const
ants#0Ac_tab.......#3D..9#0Ac_newline...#3D.10#0Ac_
newpage...#3D.12#0Ac_return....#3D.13#0Ac_escape...
.#3D.27#0Ac_space.....#3D.32#0A#0Anametablesize.#3D
.541#0Aworksize......#3D.40000#0Astoresize.....#3D.
5000#0A#0ARTF8#3D1#0AGB2312#0A}#0A.#0AGLOBAL.{#0A//
.Variables.for.scanforsection().etc#0Agetstreams:ug
;.charv;.token;.wordnode;.ch#0Adecval;.hdrs#0Abigen
der#0Askiptag;.lineno;.nametable#0Atreep;.treevec;.
sourcestream#0Ascanerror;.sectionseen#0A#0A//.Globa
l.variables#0Acurrentfile;.storevec;.storevp#0Asect
ions;.stacksize;.gvecsize#0Adefaultencoding#0Aencod
ing#0A}#0A.#0A#0ALET.start().#3D.VALOF#0A{.LET.inpu
tstream,.outputstream.#3D.?,.?#0A..AND.work.#3D.?#0A
..AND.fileseen,.runok.#3D.0,1#0A..LET.argv.#3D.VEC.
100#0A..LET.version.#3D.VEC.5#0A#0A..UNLESS.rdargs(
",,,,,,,,,,,TO/A/K,STKSIZE/K,GLOBSIZE/K",.argv,.100
).DO.{#0A....writes("Bad.arguments*n")#0A....RESULT
IS.20#0A..}#0A#0A..outputstream.:#3D.findoutput(arg
v.!.11)#0A..IF.outputstream.#3D.0.DO.{#0A....writef
("Cannot.open.file.%s*n",.argv.!.11)#0A....RESULTIS
.20#0A..}#0A#0A//.default.allocations.for.user.prog
ram...#0A..stacksize.:#3D.10000#0A..IF.argv!12.DO.{
#0A....stacksize.:#3D.str2numb(argv!12)#0A....IF.st
acksize.<.10000.DO.stacksize.:#3D.10000#0A..}#0A#0A
..gvecsize.:#3D.1000#0A..IF.argv!13.DO.{#0A....gvec
size.:#3D.str2numb(argv!13)#0A....IF.gvecsize.<.500
.DO.gvecsize.:#3D.500#0A..}#0A#0A..hdrs.:#3D."BCPLH
DRS"#0A..bigender.:#3D.(!"AAA".&.255).#3D.'A'.//.#3D
TRUE.if.running.on.a.bigender#0A#0A..writef("MakeIn
it.version.%s*n",.getversion(version))#0A#0A//.Allo
cate.working.memory.for.scanning.the.files#0A..work
.:#3D.getvec(worksize)#0A..UNLESS.work.DO#0A..{.wri
tes("Insufficient.memory*n")#0A....RESULTIS.20#0A..
}#0A#0A//.Allocate.storage.for.information.found#0A
..storevec.:#3D.getvec(storesize)#0A..UNLESS.storev
ec.DO.{#0A....writes("Insufficient.memory(store)*n"
)#0A....RESULTIS.20#0A..}#0A#0A..storevp.:#3D.store
vec+storesize#0A#0A//.Initialise.the.storage.and.ad
d.a.universal.entry#0A..sections.:#3D.0#0A..records
ection("BLIB",."(run-time.library)")#0A..recordsect
ion("DLIB",."(system.dependent.library)")#0A#0A..FO
R.i.#3D.0.TO.10.DO#0A..{#0A....//.Scan.the.input-fi
le.for.filenames#2E.Pass.each.name.found.to#0A..../
/.scanforsection().to.extract.any.SECTION."#2E#2E#2E
".entries.found,.#0A....//.which.are.stored.in.stor
evec,.anchored.at.global.sections#2E#0A....LET.file
.#3D.argv!i#0A....UNLESS.file.LOOP#0A....fileseen.:
#3D.fileseen.+.1#0A....scanforsection(file,.work)#0A
....IF.scanerror.>.0.DO.runok.:#3D.0#0A..}#0A#0A//.
output.the.new.file#0A..IF.fileseen.&.runok.DO.{#0A
....LET.op.#3D.output()#0A....selectoutput(outputst
ream)#0A....writeinitfile()#0A....UNLESS.outputstre
am#3Dop.DO.endwrite()#0A....selectoutput(op)#0A..}#0A
#0A..UNLESS.fileseen.DO.writes("Error.-.no.file(s).
seen*n")#0A#0A..freevec(work)#0A..freevec(storevec)
#0A#0A..RESULTIS.fileseen.&.runok.->.0,.10.#0A}#0A#0A
//.Extract.version-number.from.Revision.string#0AAN
D.getversion(v).#3D.VALOF.{#0A..LET.version.#3D."$R
evision:.1#2E9.$".//.updated.by.RCS#0A..AND.len,.s,
.d.#3D.0,.1,.1#0A#0A..len.:#3D.version%0#0A..UNTIL.
('0'.<#3D.version%s.<#3D.'9').|.s.#3D.len.DO.s.:#3D
.s.+.1#0A..UNTIL.version%s.#3D.'.'.|.s.#3D.len.DO.{
#0A....v%d.:#3D.version%s#0A....s.:#3D.s.+.1;.d.:#3D
.d.+.1#0A..}#0A..v%0.:#3D.d-1#0A..RESULTIS.v#0A}#0A
#0A//.Scan.file.for.SECTION."#2E#2E#2E#2E".entries,
.using.workspace.for#0A//.working.memory#2E#0AAND.s
canforsection(file,.workspace).BE.{#0A..treevec.:#3D
.workspace#0A..treep.:#3D.treevec.+.worksize#0A#0A.
.sourcestream.:#3D.findinput(file)#0A..IF.sourcestr
eam#3D0.DO.{.#0A....writef("Trouble.with.file.%s*n"
,.file)#0A....scanerror.:#3D.1#0A....RETURN#0A..}#0A
#0A..currentfile.:#3D.newstring(file)#0A..selectinp
ut(sourcestream)#0A..scanerror.:#3D.0#0A..sectionse
en.:#3D.0#0A..lineno.:#3D.1#0A..rch()#0A..getstream
s.:#3D.0#0A..charv......:#3D.newvec(256/bytesperwor
d).....#0A..nametable..:#3D.newvec(nametablesize).#0A
..FOR.i.#3D.0.TO.nametablesize.DO.nametable!i.:#3D.
0#0A..skiptag.:#3D.0#0A..declsyswords()#0A#0A..UNTI
L.(ch#3Dendstreamch.&.getstreams#3D0).|.scanerror.D
O.{.#0A....lex()#0A....IF.token.#3D.s_section.{#0A.
.....lex()#0A......IF.token.#3D.s_string.DO.{#0A...
.....recordsection(charv,.currentfile)#0A........se
ctionseen.:#3D.1#0A......}#0A....}#0A..}#0A#0A..end
read()#0A..UNLESS.sectionseen.DO.{#0A....writef("No
.Section.seen.in.file.%s*n",.currentfile)#0A....sca
nerror.:#3D.1#0A..}#0A..RETURN#0A}#0A#0A//.Record.a
.section-entry.in.store,.using.a.binary-tree.struct
ure,.so.that#0A//.eventual.output.is.in.ascending.a
lphabetic.order.of.section.name#2E#0A//.Duplicate.s
ection-names.are.errors.and.are.reported.as.such#2E
#0AAND.recordsection(s,.f).BE.{#0A..LET.p.#3D.@sect
ions#0A..LET.node.#3D.!p#0A#0A..UNTIL.node#3D0.DO.{
#0A....LET.cmp.#3D.cmpstr(s,.node!bt_name)#0A....IF
.cmp.#3D.0.DO.{#0A......writef("Duplicate.section.%
s.in.%s.and.%s*n",.s,.f,.node!bt_file)#0A......scan
error.:#3D.scanerror+1#0A......RETURN#0A....}#0A...
.#0A....p.:#3D.node.+.(cmp.<.0.->.bt_left,.bt_right
)#0A....node.:#3D.!p#0A..}#0A#0A..node.:#3D.newstor
evec(bt_file)#0A..node!bt_name.:#3D.newstring(s)#0A
..node!bt_left,.node!bt_right.:#3D.0,.0#0A..node!bt
_file.:#3D.f#0A..!p.:#3D.node#0A}#0A#0A//.Compare.t
wo.strings,.ignoring.case#0AAND.cmpstr(s1,.s2).#3D.
VALOF#0A{.LET.len1,.len2.#3D.s1%0,.s2%0#0A..FOR.i.#3D
.1.TO.len1.DO#0A..{.LET.ch1,.ch2.#3D.s1%i,.s2%i#0A.
...IF.i>len2..RESULTIS.1#0A....IF.'a'<#3Dch1<#3D'z'
.DO.ch1:#3Dch1-'a'+'A'#0A....IF.'a'<#3Dch2<#3D'z'.D
O.ch2:#3Dch2-'a'+'A'#0A....IF.ch1>ch2.RESULTIS.1#0A
....IF.ch1<ch2.RESULTIS.-1#0A..}#0A..IF.len1<len2.R
ESULTIS.-1#0A..RESULTIS.0#0A}#0A#0A//.Allocate.stor
age.for.section.and.file.names#0AAND.newstorevec(n)
.#3D.VALOF.{#0A..storevp.:#3D.storevp.-.n.-.1#0A..I
F.storevp.<#3D.storevec.DO.{#0A....writes("Out.of.s
tore.space*n")#0A....stop(20)#0A..}#0A#0A..RESULTIS
.storevp#0A}#0A#0A//.Allocate.space.for.a.copy.of.s
tring.s.in.the.store#0AAND.newstring(s).#3D.VALOF.{
#0A..LET.size.#3D.1.+.s%0./.bytesperword#0A..LET.st
r.#3D.newstorevec(size)#0A..FOR.i.#3D.0.TO.s%0#0A..
.str%i.:#3D.s%i#0A#0A..RESULTIS.str#0A}#0A#0A//.Wri
te.the.initialisation.file,.using.the.section-names
.found#2E#0AAND.writeinitfile().BE.{#0A..LET.versio
n.#3D.VEC.5#0A..writef("/**.Initialisation.file.wri
tten.by.MakeInit.version.%s..**/*n",#0A........getv
ersion(version))#0A..writes("#23include.*"bcpl#2Eh*
"*n")#0A..writef("*nint.stackupb#3D%n;*n",.stacksiz
e)#0A..writef("*nint.gvecupb#3D%n;*n",..gvecsize)#0A
..writes("*n/**.BCPL.sections..**/*n")#0A..//.List.
references.to.other.modules#0A..listsects(sections,
."extern.%s(BCPLWORD.**g);.*t/**.file.%s..**/*n")#0A
..newline()#0A..//.List.initsections().functions#0A
..writes("void.initsections(BCPLWORD.**g).{*n")#0A.
.listsects(sections,.".......%s(g);.*t/**.file.%s..
**/*n")#0A..writes("*n.......return;*n}*n")#0A}#0A#0A
//.List.store.entries.in.order.(binary.tree.in-orde
r.traverse),.using#0A//.the.passed.writef.format.fo
r.section-name.and.file-name#0AAND.listsects(p,.fmt
).BE.{#0A...UNLESS.p.#3D.0.DO.{#0A.....listsects(p!
bt_left,.fmt)#0A.....writef(fmt,.p!bt_name,.p!bt_fi
le)#0A.....listsects(p!bt_right,.fmt)#0A...}#0A}#0A
#0A//.lex().returns.the.next.relevant.symbol.from.t
he.current.input-stream,.in#0A//.globals.token.and.
charv#2E.This.routine.and.those.it.uses.have.been.e
xtracted#0A//.from.the.compiler.(bcpl#2Eb).and.simp
lified.for.this.purpose#2E#0AAND.lex().BE#0A{#0A..{
.SWITCHON.ch.INTO#0A#0A....{.DEFAULT:#0A...........
.{.LET.badch.#3D.ch#0A..............ch.:#3D.'*s'#0A
..............synerr("Illegal.character.%x2",.badch
)#0A............}#0A#0A......CASE.'*p':#0A......CAS
E.'*n':.lineno.:#3D.lineno.+.1#0A#0A......CASE.'*c'
:#0A......CASE.'*t':#0A......CASE.'*s':#0A.........
.......rch().REPEATWHILE.ch#3D'*s'#0A..............
..LOOP#0A#0A......CASE.'0':CASE.'1':CASE.'2':CASE.'
3':CASE.'4':#0A......CASE.'5':CASE.'6':CASE.'7':CAS
E.'8':CASE.'9':#0A......CASE.'_':#0A...............
.rch();.LOOP#0A.#0A......CASE.'a':CASE.'b':CASE.'c'
:CASE.'d':CASE.'e':#0A......CASE.'f':CASE.'g':CASE.
'h':CASE.'i':CASE.'j':#0A......CASE.'k':CASE.'l':CA
SE.'m':CASE.'n':CASE.'o':#0A......CASE.'p':CASE.'q'
:CASE.'r':CASE.'s':CASE.'t':#0A......CASE.'u':CASE.
'v':CASE.'w':CASE.'x':CASE.'y':#0A......CASE.'z':#0A
......CASE.'A':CASE.'B':CASE.'C':CASE.'D':CASE.'E':
#0A......CASE.'F':CASE.'G':CASE.'H':CASE.'I':CASE.'
J':#0A......CASE.'K':CASE.'L':CASE.'M':CASE.'N':CAS
E.'O':#0A......CASE.'P':CASE.'Q':CASE.'R':CASE.'S':
CASE.'T':#0A......CASE.'U':CASE.'V':CASE.'W':CASE.'
X':CASE.'Y':#0A......CASE.'Z':#0A...............tok
en.:#3D.lookupword(rdtag(ch))#0A...............IF.t
oken#3Ds_get.DO.{.performget();.LOOP..}#0A.........
......RETURN#0A.#0A......CASE.'$':#0A..............
.rch()#0A...............IF.ch#3D'$'.|.ch#3D'<'.|.ch
#3D'>'.DO#0A...............{.LET.k.#3D.ch#0A.......
..........token.:#3D.lookupword(rdtag('<'))#0A.....
............//.token.#3D.s_true.............if.the.
tag.is.set#0A.................//......#3D.s_false.o
r.s_name..otherwise#0A.#0A.................//.$>tag
...marks.the.end.of.a.conditional#0A...............
..//.........skipping.section#0A.................IF
.k#3D'>'.DO#0A.................{.IF.skiptag#3Dwordn
ode.DO#0A......................skiptag.:#3D.0...//.
Matching.$>tag.found#0A...................LOOP#0A..
...............}#0A.#0A.................UNLESS.skip
tag#3D0.LOOP#0A#0A.................//.Only.process.
$<tag.and.$$tag.if.not.skipping#0A.#0A.............
....//.$$tag..complements.the.value.of.a.tag#0A....
.............IF.k#3D'$'.DO#0A.................{.h1!
wordnode.:#3D.token#3Ds_true.->.s_false,.s_true#0A.
..................LOOP#0A.................}#0A.#0A.
................//.$<tag#0A.................IF.toke
n#3Ds_true.LOOP......//.Don't.skip.if.set#0A#0A....
.............//.tag.is.false.so.skip.until.matching
.$>tag.or.EOF#0A.................skiptag.:#3D.wordn
ode#0A.................UNTIL.skiptag#3D0.|.token#3D
s_end.DO.lex()#0A.................skiptag.:#3D.0#0A
.................LOOP#0A..............}#0A.#0A.....
.........UNLESS.ch#3D'('.|.ch#3D')'.DO.synerr("'$'.
out.of.context")#0A..............token.:#3D.ch#3D'(
'.->.s_lsect,.s_rsect#0A..............lookupword(rd
tag('$'))#0A..............LOOP.//RETURN#0A.#0A.....
.CASE.'/':#0A...............rch()#0A...............
IF.ch#3D'\'.DO.{.token.:#3D.s_logand;.BREAK.}#0A...
............IF.ch#3D'/'.DO#0A...............{.rch()
.REPEATUNTIL.ch#3D'*n'.|.ch#3Dendstreamch#0A.......
..........LOOP#0A...............}#0A.#0A...........
....IF.ch#3D'**'.DO#0A...............{.LET.depth.#3D
.1#0A#0A.................{.rch()#0A................
...IF.ch#3D'**'.DO#0A...................{.rch().REP
EATWHILE.ch#3D'**'#0A.....................IF.ch#3D'
/'.DO.{..depth.:#3D.depth-1;.LOOP.}#0A.............
......}#0A...................IF.ch#3D'/'.DO#0A.....
..............{.rch()#0A.....................IF.ch#3D
'**'.DO.{..depth.:#3D.depth+1;.LOOP.}#0A...........
........}#0A...................IF.ch#3D'*n'.DO.line
no.:#3D.lineno+1#0A...................IF.ch#3Dendst
reamch.DO.synerr("Missing.'**/'")#0A...............
..}.REPEATUNTIL.depth#3D0#0A#0A.................rch
()#0A.................LOOP#0A...............}#0A#0A
...............token.:#3D.s_div#0A...............LO
OP#0A#0A......CASE.'#23':#0A...............token.:#3D
.s_number#0A...............rch()#0A...............I
F.'0'<#3Dch<#3D'7'....DO.{........readnumber(8,..10
0);.LOOP..}#0A...............IF.ch#3D'b'.|.ch#3D'B'
.DO.{.rch();.readnumber(2,..100);.LOOP..}#0A.......
........IF.ch#3D'o'.|.ch#3D'O'.DO.{.rch();.readnumb
er(8,..100);.LOOP..}#0A...............IF.ch#3D'x'.|
.ch#3D'X'.DO.{.rch();.readnumber(16,.100);.LOOP..}#0A
...............LOOP#0A.#0A......CASE.'#2E':.token.:
#3D.s_dot;.......BREAK#0A#0A......CASE.'{':.CASE.'}
':.#0A......CASE.'[':.CASE.'(':.CASE.']':.CASE.')':
.CASE.'?':.#0A......CASE.'+':.CASE.',':.CASE.';':.C
ASE.'@':.CASE.'&':.#0A......CASE.'|':.CASE.'#3D':.C
ASE.'!':.CASE.'%':.CASE.'**':#0A......CASE.'~':.CAS
E.'\':.CASE.'<':.CASE.'>':..CASE.'-':#0A......CASE.
':':.#0A................rch()#0A................LOO
P#0A#0A......CASE.'"':#0A...........{.LET.len.#3D.0
#0A.............rch()#0A.............encoding.:#3D.
defaultencoding.//.encoding.for.*#23.escapes#0A#0A.
............UNTIL.ch#3D'"'.DO#0A.............{.LET.
code.#3D.rdstrch()#0A...............TEST.result2#0A
...............THEN.{.//.A..*#23.code.found#2E#0A..
....................//.Convert.it.to.UTF8.or.GB2312
.format#2E#0A......................TEST.encoding#3D
GB2312#0A......................THEN.{.//.Convert.to
.GB2312.sequence#0A.............................IF.
code>#23x7F.DO#0A.............................{.LET
.hi.#3D.code../..100.+.160#0A......................
.........LET.lo.#3D.code.MOD.100.+.160#0A..........
.....................IF.len>#3D254.DO.synerr("Bad.s
tring.constant")#0A...............................T
EST.bigender#0A...............................THEN.
{.charv%(len+1).:#3D.hi.#0A........................
..............charv%(len+2).:#3D.lo#0A.............
.......................}#0A........................
.......ELSE.{.charv%(len+1).:#3D.lo.#0A............
..........................charv%(len+2).:#3D.hi#0A.
...................................}#0A............
...................len.:#3D.len.+.2#0A.............
..................LOOP#0A..........................
...}#0A.............................IF.len>#3D255.D
O.synerr("Bad.string.constant")#0A.................
............charv%(len+1).:#3D.code.//.Ordinary.ASC
II.char#0A.............................len.:#3D.len
.+.1#0A.............................LOOP#0A........
...................}#0A......................ELSE.{
.//.Convert.to.UTF8.sequence#0A....................
.........IF.code<#3D#23x7F.DO#0A...................
..........{.IF.len>#3D255.DO.synerr("Bad.string.con
stant")#0A...............................charv%(len
+1).:#3D.code...//.0xxxxxxx#0A.....................
..........len.:#3D.len.+.1#0A......................
.........LOOP#0A.............................}#0A..
...........................IF.code<#3D#23x7FF.DO#0A
.............................{.IF.len>#3D254.DO.syn
err("Bad.string.constant")#0A......................
.........charv%(len+1).:#3D.#23b1100_0000+(code>>6)
..//.110xxxxx#0A...............................char
v%(len+2).:#3D.#23x80+(.code....&#23x3F)..//.10xxxx
xx#0A...............................len.:#3D.len.+.
2#0A...............................LOOP#0A.........
....................}#0A...........................
..IF.code<#3D#23xFFFF.DO#0A........................
.....{.IF.len>#3D253.DO.synerr("Bad.string.constant
")#0A...............................charv%(len+1).:
#3D.#23b1110_0000+(code>>12).//.1110xxxx#0A........
.......................charv%(len+2).:#3D.#23x80+((
code>>6)&#23x3F)..//.10xxxxxx#0A...................
............charv%(len+3).:#3D.#23x80+(.code....&#23
x3F)..//.10xxxxxx#0A...............................
len.:#3D.len.+.3#0A...............................L
OOP#0A.............................}#0A............
.................IF.code<#3D#23x1F_FFFF.DO#0A......
.......................{.IF.len>#3D252.DO.synerr("B
ad.string.constant")#0A............................
...charv%(len+1).:#3D.#23b1111_0000+(code>>18).//.1
1110xxx#0A...............................charv%(len
+2).:#3D.#23x80+((code>>12)&#23x3F).//.10xxxxxx#0A.
..............................charv%(len+3).:#3D.#23
x80+((code>>.6)&#23x3F).//.10xxxxxx#0A.............
..................charv%(len+4).:#3D.#23x80+(.code.
....&#23x3F).//.10xxxxxx#0A........................
.......len.:#3D.len.+.4#0A.........................
......LOOP#0A.............................}#0A.....
........................IF.code<#3D#23x3FF_FFFF.DO#0A
.............................{.IF.len>#3D251.DO.syn
err("Bad.string.constant")#0A......................
.........charv%(len+1).:#3D.#23b1111_1000+(code>>24
).//.111110xx#0A...............................char
v%(len+2).:#3D.#23x80+((code>>18)&#23x3F).//.10xxxx
xx#0A...............................charv%(len+3).:
#3D.#23x80+((code>>12)&#23x3F).//.10xxxxxx#0A......
.........................charv%(len+4).:#3D.#23x80+
((code>>.6)&#23x3F).//.10xxxxxx#0A.................
..............charv%(len+5).:#3D.#23x80+(.code.....
&#23x3F).//.10xxxxxx#0A............................
...len.:#3D.len.+.5#0A.............................
..LOOP#0A.............................}#0A.........
....................IF.code<#3D#23x7FFF_FFFF.DO#0A.
............................{.IF.len>#3D250.DO.syne
rr("Bad.string.constant")#0A.......................
........charv%(len+1).:#3D.#23b1111_1100+(code>>30)
.//.1111110x#0A...............................charv
%(len+2).:#3D.#23x80+((code>>24)&#23x3F).//.10xxxxx
x#0A...............................charv%(len+3).:#3D
.#23x80+((code>>18)&#23x3F).//.10xxxxxx#0A.........
......................charv%(len+4).:#3D.#23x80+((c
ode>>12)&#23x3F).//.10xxxxxx#0A....................
...........charv%(len+5).:#3D.#23x80+((code>>.6)&#23
x3F).//.10xxxxxx#0A...............................c
harv%(len+6).:#3D.#23x80+(.code.....&#23x3F).//.10x
xxxxx#0A...............................len.:#3D.len
.+.6#0A...............................LOOP#0A......
.......................}#0A........................
.....synerr("Bad.Unicode.character")#0A............
...............}#0A....................}#0A........
.......ELSE.{.//.Not.a.Unicode.character#0A........
..............IF.len#3D255.DO.synerr("Bad.string.co
nstant")#0A......................len.:#3D.len.+.1#0A
......................charv%len.:#3D.code#0A.......
.............}#0A.............}#0A.#0A.............
charv%0.:#3D.len#0A.............token.:#3D.s_string
#0A.............BREAK#0A..........}#0A..#0A......CA
SE.'*'':#0A..............rch()#0A..............enco
ding.:#3D.defaultencoding#0A..............decval.:#3D
.rdstrch()#0A..............token.:#3D.s_number#0A..
............UNLESS.ch#3D'*''.DO.synerr("Bad.charact
er.constant")#0A..............BREAK#0A#0A.......CAS
E.endstreamch:#0A..............IF.getstreams.DO#0A.
.............{.//.Return.from.a.'GET'.stream#0A....
............LET.p.#3D.getstreams#0A................
endread()#0A................ch...........:#3D.h4!ge
tstreams#0A................lineno.......:#3D.h3!get
streams#0A................sourcestream.:#3D.h2!gets
treams#0A................getstreams...:#3D.h1!getst
reams#0A................freevec(p).//.Free.the.GET.
node#0A................selectinput(sourcestream)#0A
................LOOP#0A..............}#0A..........
....//.endstreamch.#3D>.EOF.only.at.outermost.GET.l
evel.#0A..............token.:#3D.s_eof#0A..........
....RETURN#0A....}#0A..}.REPEAT#0A.#0A..rch()#0A}#0A
#0A//.Access.and.maintain.a.symbol-table.for.lex()#0A
AND.lookupword(word).#3D.VALOF#0A{.LET.len,.i.#3D.w
ord%0,.0#0A..LET.hashval.#3D.19609.//.This.and.3139
7.are.primes#2E#0A..FOR.i.#3D.0.TO.len.DO.hashval.:
#3D.(hashval.NEQV.word%i).*.31397#0A..hashval.:#3D.
(hashval>>1).REM.nametablesize#0A#0A..wordnode.:#3D
.nametable!hashval#0A.#0A..UNTIL.wordnode#3D0.|.i>l
en.TEST.(@h3!wordnode)%i#3Dword%i#0A...............
............THEN.i.:#3D.i+1#0A.....................
......ELSE.wordnode,.i.:#3D.h2!wordnode,.0#0A.#0A..
IF.wordnode#3D0.DO#0A..{.wordnode.:#3D.newvec(len/b
ytesperword+3)#0A....h1!wordnode,.h2!wordnode.:#3D.
s_name,.nametable!hashval#0A....FOR.i.#3D.0.TO.len.
DO.(@h3!wordnode)%i.:#3D.word%i#0A....nametable!has
hval.:#3D.wordnode#0A..}#0A.#0A..RESULTIS.h1!wordno
de#0A}#0A.#0A//.Symbol-table.initialisation#0AAND.d
sw(word,.sym).BE.{.lookupword(word);.h1!wordnode.:#3D
.sym..}#0A.#0AAND.declsyswords().BE#0A{.dsw("GET",.
s_get)#0A..dsw("NEEDS",.s_needs)#0A..dsw("SECTION",
.s_section)#0A..dsw("$",.0)#0A}.#0A.#0A//.lex().sup
port-routines#0AAND.rch().BE.{#0A....ch:#3D.rdch()#0A
}#0A.#0AAND.rdtag(ch1).#3D.VALOF#0A{.LET.len.#3D.1#0A
..charv%1.:#3D.ch1#0A.#0A..{.rch()#0A....UNLESS.'a'
<#3Dch<#3D'z'.|.'A'<#3Dch<#3D'Z'.|#0A...........'0'
<#3Dch<#3D'9'.|.ch#3D'#2E'.|.ch#3D'_'.BREAK#0A....l
en.:#3D.len+1#0A....charv%len.:#3D.ch#0A..}.REPEAT#0A
.#0A..charv%0.:#3D.len#0A..RESULTIS.charv#0A}#0A.#0A
AND.catstr(s1,.s2).#3D.VALOF#0A//.Concatenate.strin
gs.s1.and.s2.leaving.the.result.in.s1#2E#0A//.s1.is
.assumed.to.be.able.to.hold.a.string.of.length.255#2E
#0A//.The.resulting.string.is.truncated.to.length.2
55,.if.necessary#2E.#0A{.LET.len.#3D.s1%0#0A..LET.n
.#3D.len#0A..FOR.i.#3D.1.TO.s2%0.DO#0A..{.n.:#3D.n+
1#0A....IF.n>255.BREAK#0A....s1%n.:#3D.s2%i#0A..}#0A
..s1%0.:#3D.n#0A}.#0A.#0AAND.performget().BE#0A{.LE
T.stream.#3D.?#0A..LET.len.#3D.0#0A..lex()#0A..UNLE
SS.token#3Ds_string.DO.synerr("Bad.GET.directive")#0A
..len.:#3D.charv%0#0A#0A..//.Append.#2Eh.to.the.GET
.filename.does.not.end.in.#2Eh.or.#2Eb#0A..UNLESS.l
en>#3D2.&.charv%(len-1)#3D'#2E'.&.#0A.........(char
v%len#3D'h'.|.charv%len#3D'b').DO#0A..{.len.:#3D.le
n+2#0A....charv%0,.charv%(len-1),.charv%len.:#3D.le
n,.'#2E',.'h'#0A..}#0A#0A..FOR.i.#3D.1.TO.charv%0.I
F.charv%i#3D':'.DO.charv%i.:#3D.'/'#0A#0A..//.First
.look.in.the.current.directory#0A..//writef("Search
ing.for.*"%s*".in.the.current.directory*n",.charv)#0A
..stream.:#3D.findinput(charv)#0A#0A..//.Then.try.t
he.headers.directories#0A..//UNLESS.stream.DO.write
f("Searching.for.*"%s*".in.%s*n",.charv,.hdrs)#0A..
UNLESS.stream.DO.stream.:#3D.pathfindinput(charv,.h
drs)#0A#0A..//.Finally.prepend.g/.and.lookup.in.the
.system.root.directory#0A..UNLESS.stream.DO#0A..{.L
ET.filename.#3D.VEC.256/bytesperword#0A....filename
%0.:#3D.0#0A....catstr(filename,."g/")#0A....catstr
(filename,.charv)#0A....//writef("Searching.for.*"%
s*".in.%s*n",.filename,.rootnode!rtn_rootvar)#0A...
.stream.:#3D.pathfindinput(filename,.rootnode!rtn_r
ootvar)#0A..}#0A#0A..UNLESS.stream.DO#0A..{.synerr(
"Unable.to.find.GET.file.%s",.charv)#0A....RETURN#0A
..}#0A#0A..{.LET.len.#3D.charv%0#0A....LET.node.#3D
.getvec(4.+.len/bytesperword)#0A....LET.str.#3D.@no
de!4#0A#0A....UNLESS.node.DO.synerr("getvec.failure
.in.performget")#0A#0A....FOR.i.#3D.0.TO.len.DO.str
%i.:#3D.charv%i#0A//....sourcefileno.:#3D.sourcefil
eno+1#0A//....sourcenamev!sourcefileno.:#3D.str#0A.
...node!0,.node!1,.node!2,.node!3.:#3D.getstreams,.
sourcestream,.lineno,.ch#0A....getstreams.:#3D.node
#0A..}#0A#0A..sourcestream.:#3D.stream#0A..selectin
put(sourcestream)#0A..lineno.:#3D.1#0A..rch()#0A}#0A
.#0AAND.readnumber(radix,.digs).#3D.VALOF#0A//.Read
.a.binary,.octal,.decimal.or.hexadecimal.unsigned.n
umber#0A//.with.between.1.and.digs.digits#2E.Underl
ines.are.allowed#2E#0A//.This.function.is.used.for.
numerical.constants.and.numerical#0A//.escapes.in.s
tring.and.character.constants#2E#0A{.LET.i,.res.#3D
.0,.0#0A.#0A..{.UNLESS.ch#3D'_'.DO.//.ignore.underl
ines#0A....{.LET.d.#3D.value(ch)#0A......IF.d>#3Dra
dix.BREAK#0A......i.:#3D.i+1.......//.Increment.cou
nt.of.digits#0A......res.:#3D.radix*res.+.d#0A....}
#0A....rch()#0A..}.REPEATWHILE.i<digs#0A#0A..UNLESS
.i.DO.synerr("Bad.number")#0A..RESULTIS.res#0A}#0A.
#0AAND.value(ch).#3D.'0'<#3Dch<#3D'9'.->.ch-'0',#0A
................'A'<#3Dch<#3D'F'.->.ch-'A'+10,#0A..
..............'a'<#3Dch<#3D'f'.->.ch-'a'+10,#0A....
............100#0A.#0AAND.rdstrch().#3D.VALOF#0A{./
/.Return.the.integer.code.for.the.next.string.chara
cter#0A..//.Set.result2#3DTRUE.if.*#23.character.co
de.was.found,.otherwise.FALSE#0A..LET.k.#3D.ch#0A#0A
..IF.k#3D'*n'.|.k#3D'*p'.DO#0A..{.lineno.:#3D.linen
o+1#0A....synerr("Unescaped.newline.character")#0A.
.}#0A.#0A..IF.k#3D'**'.DO#0A..{.rch()#0A....k.:#3D.
ch#0A....IF.'a'<#3Dk<#3D'z'.DO.k.:#3D.k.+.'A'.-.'a'
#0A....SWITCHON.k.INTO#0A....{.CASE.'*n':#0A......C
ASE.'*c':#0A......CASE.'*p':#0A......CASE.'*s':#0A.
.....CASE.'*t':.WHILE.ch#3D'*n'.|.ch#3D'*c'.|.ch#3D
'*p'.|.ch#3D'*s'.|.ch#3D'*t'.DO#0A.................
{.IF.ch#3D'*n'.DO.lineno.:#3D.lineno+1#0A..........
.........rch()#0A.................}#0A.............
....IF.ch#3D'**'.DO.{.rch();.LOOP..}#0A#0A......DEF
AULT:...synerr("Bad.string.or.character.constant,.c
h#3D%n",.ch)#0A.........#0A......CASE.'**':#0A.....
.CASE.'*'':#0A......CASE.'"':....................EN
DCASE#0A.........#0A......CASE.'T':..k.:#3D.c_tab;.
......ENDCASE#0A......CASE.'S':..k.:#3D.c_space;...
..ENDCASE#0A......CASE.'N':..k.:#3D.c_newline;...EN
DCASE#0A......CASE.'E':..k.:#3D.c_escape;....ENDCAS
E#0A......CASE.'B':..k.:#3D.c_backspace;.ENDCASE#0A
......CASE.'P':..k.:#3D.c_newpage;...ENDCASE#0A....
..CASE.'C':..k.:#3D.c_return;....ENDCASE#0A........
.#0A......CASE.'X':..//.*xhh..--.A.character.escape
.in.hexadecimal#0A.................rch()#0A........
.........k.:#3D.readnumber(16,2)#0A................
.result2.:#3D.FALSE#0A.................RESULTIS.k#0A
#0A......CASE.'#23':..//.*#23u...set.UTF8.mode#0A..
...............//.*#23g...set.GB2312.mode#0A.......
..........//.In.UTF8.mode#0A.................//....
.*#23hhhh.or.*#23#23hhhhhhhh..--.a.Unicode.characte
r#0A.................//.In.GB2312#0A...............
..//.....*#23dddd.................--.A.GB2312.code#0A
...............{.LET.digs.#3D.4#0A.................
rch()#0A.................IF.ch#3D'u'.|.ch#3D'U'.DO.
{.encoding.:#3D.UTF8;...rch();.LOOP.}#0A...........
......IF.ch#3D'g'.|.ch#3D'G'.DO.{.encoding.:#3D.GB2
312;.rch();.LOOP.}#0A.................TEST.encoding
#3DGB2312#0A.................THEN.{.#0A............
............k.:#3D.readnumber(10,.digs)#0A//sawrite
f("rdstrch:.GB2312:.%i4*n",.k)#0A..................
....}#0A.................ELSE.{.IF.ch#3D'#23'.DO.{.
rch();.digs.:#3D.8.}#0A........................k.:#3D
.readnumber(16,.digs)#0A//sawritef("rdstrch:.Unicod
e:.%x4*n",.k)#0A......................}#0A.........
........result2.:#3D.TRUE#0A.................RESULT
IS.k#0A...............}#0A#0A......CASE.'0':CASE.'1
':CASE.'2':CASE.'3':CASE.'4':#0A......CASE.'5':CASE
.'6':CASE.'7':#0A.................//.*ooo.--.A.char
acter.escape.in.octal.#0A.................k.:#3D.re
adnumber(8,3)#0A.................IF.k>255.DO.#0A...
....................synerr("Bad.string.or.character
.constant")#0A.................result2.:#3D.FALSE#0A
.................RESULTIS.k#0A....}#0A..}#0A...#0A.
.rch()#0A..result2.:#3D.FALSE#0A..RESULTIS.k#0A}.RE
PEAT#0A#0AAND.newvec(n).#3D.VALOF#0A{.treep.:#3D.tr
eep.-.n.-.1;#0A..IF.treep<#3Dtreevec.DO#0A.....syne
rr("More.workspace.needed")#0A#0A..RESULTIS.treep#0A
}#0A#0AAND.list4(x,.y,.z,.t).#3D.VALOF#0A{.LET.p.#3D
.newvec(3)#0A..p!0,.p!1,.p!2,.p!3.:#3D.x,.y,.z,.t#0A
..RESULTIS.p#0A}#0A.#0AAND.synerr(mess,.a,.b).BE.{#0A
..writef("*nError.near.line.%n:..",.lineno)#0A..wri
tef(mess,.a,.b)#0A..//writef(".in.file.%s*n",.curre
ntfile)#0A..newline()#0A..scanerror.:#3D.1#0A}#0A

######cintcode/com/cmpltest.b#
SECTION."cmpltest"#0A#0A//GET."libhdr"#0A#0AGLOBAL.
$(.start:1;.sys:3.$)#0A#0A//.THIS.IS.A.UNIVERSAL.CO
DE-GENERATOR.TEST.PROGRAM#0A//.WRITTEN.BY.M#2E.RICH
ARDS.ORIGINALLY.TO.TEST.THE#0A//.CII.10070.CODE-GEN
ERATOR#2E#0A#0A//.The.version.includes.tests.for.th
e.BCPL.Cintcode.compiler#0A//.and.the.version.using
.the.compact.internal.assembly.language#0A//.ie.it.
will.test.all.patterns.generated.by.cvsial386,.for.
instance#2E#0A#0A//.The.ONLY.free.variable.of.this.
program.is:.sys..(or.wrch)#0A#0AGLOBAL.$(.f:200;.g:
401;.h:602#0A..........testno:203;.failcount:204#0A
..........v:205;.testcount:206;.quiet:207;.t:208#0A
..........bitsperword:210;.msb:211;.allones:212..$)
#0A#0ASTATIC.$(.a#3D10;.b#3D11;.c#3D12;.w#3D0..$)#0A
#0AMANIFEST.$(.k0#3D0;.k1#3D1;.k2#3D2..$)#0A#0ALET.
wrc(ch).BE.sys(11,ch)...//wrch(ch)#0A#0AAND.wrs(s).
BE#0A..FOR.i.#3D.1.TO.s%0.DO.wrc(s%i)#0A#0AAND.nl()
.BE.wrc('*n')#0A#0AAND.wrd(n,.d).BE.//wrx(n,8)#0A//
/*#0A$(.LET.t.#3D.VEC.30#0A...AND.i,.k.#3D.0,.-n#0A
...IF.n<0.DO.d,.k.:#3D.d-1,.n#0A...t!i,.i,.k.:#3D.-
(k.REM.10),.i+1,.k/10.REPEATUNTIL.k#3D0#0A...FOR.j.
#3D.i+1.TO.d.DO.wrc('*s')#0A...IF.n<0.DO.wrc('-')#0A
...FOR.j.#3D.i-1.TO.0.BY.-1.DO.wrc(t!j+'0')#0A$)#0A
//*/#0AAND.wrn(n).BE.wrd(n,.0)#0A#0AAND.wrx(n,.d).B
E#0A$(.IF.d>1.DO.wrx(n>>4,.d-1)#0A...wrc((n&15)!TAB
LE.'0','1','2','3','4','5','6','7',#0A.............
.......'8','9','A','B','C','D','E','F'.)#0A$)#0A#0A
LET.t(x,.y).#3D.VALOF#0A...$(.testcount.:#3D.testco
unt.+.1#0A......wrd(testno,.3)#0A......wrc('.')#0A.
.....wrd(x,.21)#0A......wrc('.')#0A......TEST.x#3Dy
#0A.........THEN.wrs("OK")#0A.........ELSE.$(.wrs("
FAILED,.it.should.be.")#0A.................wrd(y,.2
1)#0A.................failcount.:#3D.failcount.+.1.
.$)#0A......nl()#0A......testno.:#3D.testno.+.1#0A.
.....RESULTIS.y..$)#0A#0A#0ALET.t1(a,b,c,d,e,f,g).#3D
.t(a+b+c+d+e+f,.g)#0A#0ALET.start(parm).#3D.VALOF#0A
$(..LET.v1.#3D.VEC.200#0A....AND.v2.#3D.VEC.200#0A.
...wrs("*nCgtester.on.a.")#0A....bitsperword,.msb,.
allones.:#3D.1,.1,.1#0A....UNTIL.(msb<<1)#3D0.DO#0A
......bitsperword,.msb,.allones.:#3D.bitsperword+1,
.msb<<1,.allones<<1.|.1#0A...#0A...wrd(bitsperword,
.0)#0A...wrs(".bit.implementation.of.BCPL*n*n")#0A.
...#0A....tester(0,.1,.2,.v1,.v2)#0A#0A//{.LET.n.#3D
.1...//.special.test.for.the.<<.and.>>.operators#0A
//..FOR.i.#3D.-5.TO.80.DO.writef("%i4.%xP*n",.i,.1<
<i)#0A//..FOR.i.#3D.-5.TO.80.DO.writef("%i4.%xP*n",
.i,.msb>>i)#0A//}#0A....#0A....RESULTIS.0#0A$)#0A#0A
#0AAND.tester(x,.y,.z,.v1,.v2).BE#0A$(.LET.n0,.n1,.
n2,.n3,.n4.#3D.0,.1,.2,.3,.4#0A...LET.n5,.n6,.n7,.n
8,.n9.#3D.5,.6,.7,.8,.9#0A...LET.oct1775.#3D.#23177
5#0A#0A//..wrs("*NCgtester.entered*N")#0A#0A//..FIR
ST.INITIALIZE.CERTAIN.VARIABLES#0A#0A....f,.g,.h.:#3D
.100,.101,.102#0A....testno,.testcount,.failcount.:
#3D.0,.0,.0#0A....v,.w.:#3D.v1,.v2#0A#0A....FOR.i.#3D
.0.TO.200.DO.v!i,.w!i.:#3D.1000+i,.10000+i#0A#0A#0A
....quiet.:#3D.FALSE#0A#0A//..TEST.SIMPLE.VARIABLES
.AND.EXPRESSIONS#0A#0A....testno.:#3D.1#0A#0A....t(
a+b+c,.33)........//.1#0A....t(f+g+h,.303)#0A....t(
x+y+z,.3)#0A#0A....t(123+321-400,.44)..//.4#0A....t
(x#3D0,.TRUE)#0A....t(y#3D0,.FALSE)#0A....t(!(@y+x)
,.1)#0A....t(!(@b+x),.11)#0A....t(!(@g+x),.101)#0A#0A
....x,.a,.f.:#3D.5,.15,.105#0A....t(x,.5)..........
..//.10#0A....t(a,.15)#0A....t(f,.105)#0A#0A....v!1
,.v!2.:#3D.1234,.5678#0A....t(v!1,.1234).......//.1
3#0A....t(v!z,.5678)#0A#0A....t(x*a,.75).........//
..15#0A....t(1*x+2*y+3*z+f*4,433)#0A....t(x*a+a*x,.
150)#0A#0A....t(100/(a-a+2),.50).//..18#0A....t(a/x
,.3)#0A....t(a/-x,.-3)#0A....t((-a)/x,.-3)#0A....t(
(-a)/(-x),.3)#0A....t((a+a)/a,.2)#0A....t((a*x)/(x*
a),.1)#0A....t((a+b)*(x+y)*123/(6*123),.26)#0A#0A..
..t(n7.REM.2,.1)......//..26#0A....t(f.REM.100,.5)#0A
....t(a.REM.x,.0)#0A#0A....t(-f,.-105).......//..29
#0A#0A....f.:#3D.105#0A....t(f.#3D.105,.TRUE)...//.
30#0A....t(f~#3D.105,.FALSE)#0A....t(f.<.105,.FALSE
)#0A....t(f>#3D.105,.TRUE)#0A....t(f.>.105,.FALSE)#0A
....t(f<#3D.105,.TRUE)#0A#0A....f.:#3D.104#0A....t(
f.#3D.105,.FALSE)..//.36#0A....t(f~#3D.105,.TRUE)#0A
....t(f.<.105,.TRUE)#0A....t(f>#3D.105,.FALSE)#0A..
..t(f.>.105,.FALSE)#0A....t(f<#3D.105,.TRUE)#0A#0A.
...f.:#3D.0#0A....t(f.#3D.0,.TRUE)....//.42#0A....t
(f~#3D.0,.FALSE)#0A....t(f.<.0,.FALSE)#0A....t(f>#3D
.0,.TRUE)#0A....t(f.>.0,.FALSE)#0A....t(f<#3D.0,.TR
UE)#0A#0A....f.:#3D.1#0A....t(f.#3D.0,.FALSE)...//.
48#0A....t(f~#3D.0,.TRUE)#0A....t(f.<.0,.FALSE)#0A.
...t(f>#3D.0,.TRUE)#0A....t(f.>.0,.TRUE)#0A....t(f<
#3D.0,.FALSE)#0A#0A....testno.:#3D.60#0A#0A....t(oc
t1775<<3,.#2317750)..//.60#0A....t(oct1775>>3,.#231
77)#0A....t(oct1775<<z+1,.#2317750)#0A....t(oct1775
>>z+1,.#23177)#0A#0A..{.LET.b1100.#3D.#23b1100#0A..
..LET.b1010.#3D.#23b1010#0A....LET.yes,.no.#3D.TRUE
,.FALSE#0A#0A....testno.:#3D.70#0A#0A....t(b1100&#23
B1010,.#23B1000)....//..70#0A....t(b1100.|.#23B1010
,.#23B1110)#0A....t((b1100.EQV...#23B1010).&.#23B11
111,.#23B11001)#0A....t(b1100.NEQV..#23B1010,.#23B0
110)#0A#0A....t(NOT.yes,.no).........//.74#0A....t(
NOT.no,.yes)#0A....t(NOT(b1100.EQV.-b1010),.b1100.N
EQV.-b1010)#0A..}#0A....testno.:#3D.80#0A....f.:#3D
.105#0A....t(-f,.-105)...............//.80#0A#0A...
.t(!v,.1000)...............//.81#0A....t(v!0,.1000)
#0A....t(v!1,.1234)#0A....t(v!(!v-998),.5678)#0A#0A
....testno.:#3D.90#0A#0A....t(!w,.10000)...........
...//.90#0A....t(w!0,.10000)#0A....t(0!w,.10000)#0A
....t(1!w,.10001)#0A....t(w!1,.10001)#0A....t(!(w+2
00),.10200)#0A#0A....a.:#3D.TRUE#0A....b.:#3D.FALSE
#0A#0A....IF.a.DO.x.:#3D.16#0A....t(x,.16).........
.........//.96#0A....x.:#3D.16#0A#0A....IF.b.DO.x.:
#3D.15#0A....t(x,.16)..................//.97#0A....
x.:#3D.15#0A#0A....$(.LET.w.#3D.VEC.20#0A.......a.:
#3D.l1#0A.......GOTO.a#0A....l2:.wrs("GOTO.ERROR*N"
)#0A........failcount.:#3D.failcount+1..$)#0A#0Al1:
.a.:#3D.VALOF.RESULTIS.11#0A....t(a,.11)...........
.......//.98#0A#0A....testno.:#3D.100..//.TEST.SIMU
LATED.STACK.ROUTINES#0A#0A....$(.LET.v1.#3D.VEC.1#0A
.......v1!0,.v1!1.:#3D.-1,.-2#0A.......$(.LET.v2.#3D
.VEC.10#0A..........FOR.i.#3D.0.TO.10.DO.v2!i.:#3D.
-i#0A..........t(v2!5,.-5)..$).......//..101#0A....
...t(v1!1,.-2)..$)..........//..102#0A#0A....x.:#3D
.x.+.t(x,15,.t(f,.105),.t(a,.11)).-.15...//.103-105
#0A....t(x,.15)....................................
.//.106#0A#0A....x.:#3D.x+1#0A....t(x,.16)...//.107
#0A....x.:#3D.x-1#0A....t(x,.15)...//.108#0A....x.:
#3D.x+7#0A....t(x,22)....//.109#0A....x.:#3D.x-22#0A
....t(x,.0)....//.110#0A....x.:#3D.x+15#0A....t(x,.
15)...//.111#0A....x.:#3D.x.+.f#0A....t(x,.120)..//
.112#0A....x.:#3D.1#0A#0A....testno.:#3D.130#0A....
f.:#3D.105#0A....t(f.#3D.105.->.1,.2,.1)...//.130#0A
....t(f~#3D.105.->.1,.2,.2)#0A....t(f.<.105.->.1,.2
,.2)#0A....t(f>#3D.105.->.1,.2,.1)#0A....t(f.>.105.
->.1,.2,.2)#0A....t(f<#3D.105.->.1,.2,.1)#0A#0A....
f.:#3D.104#0A....t(f.#3D.105.->.1,.2,.2)..//.136#0A
....t(f~#3D.105.->.1,.2,.1)#0A....t(f.<.105.->.1,.2
,.1)#0A....t(f>#3D.105.->.1,.2,.2)#0A....t(f.>.105.
->.1,.2,.2)#0A....t(f<#3D.105.->.1,.2,.1)#0A#0A....
f.:#3D.0#0A....t(f.#3D.0.->.1,.2,.1)....//.142#0A..
..t(f~#3D.0.->.1,.2,.2)#0A....t(f.<.0.->.1,.2,.2)#0A
....t(f>#3D.0.->.1,.2,.1)#0A....t(f.>.0.->.1,.2,.2)
#0A....t(f<#3D.0.->.1,.2,.1)#0A#0A....f.:#3D.1#0A..
..t(f.#3D.0.->.1,.2,.2)...//.148#0A....t(f~#3D.0.->
.1,.2,.1)#0A....t(f.<.0.->.1,.2,.2)#0A....t(f>#3D.0
.->.1,.2,.1)#0A....t(f.>.0.->.1,.2,.1)#0A....t(f<#3D
.0.->.1,.2,.2)#0A#0A....testno.:#3D.200..//.TEST.SW
ITCHON.COMMANDS#0A#0A$(sw.LET.s1,.s1f.#3D.0,.0#0A..
...AND.s2,.s2f.#3D.0,.0#0A.....AND.s3,.s3f.#3D.0,.0
#0A.....FOR.i.#3D.-200.TO.200.DO#0A.....$(.LET.x.#3D
.7#0A........SWITCHON.i.INTO#0A.........$(.DEFAULT:
.s1.:#3D.s1+1000;.ENDCASE#0A............CASE.-1000:
.s1f.:#3D.s1f.+.i;.ENDCASE#0A............CASE.-200:
.s1.:#3D.s1.+.1#0A............CASE.-190:.s1.:#3D.s1
.+.1#0A............CASE.-180:.s1.:#3D.s1.+.1#0A....
........CASE...-5:.s1.:#3D.s1.+.1#0A............CAS
E....0:.s1.:#3D.s1.+.1#0A............CASE.-145:.s1.
:#3D.s1.+.1#0A............CASE....7:.s1.:#3D.s1.+.1
#0A............CASE....8:.s1.:#3D.s1.+.1#0A........
....CASE..200:.s1.:#3D.s1.+.1#0A............CASE..1
90:.s1.:#3D.s1.+.1#0A............CASE..100:.s1.:#3D
.s1.+.1#0A............CASE...90:.s1.:#3D.s1.+.1#0A.
...........CASE..199:.s1.:#3D.s1.+.1#0A............
CASE...95:.s1.:#3D.s1.+.1#0A............CASE...76:.
s1.:#3D.s1.+.1#0A............CASE...88:.s1.:#3D.s1.
+.1#0A............CASE...99:.s1.:#3D.s1.+.1#0A.....
.......CASE..-98:.s1.:#3D.s1.+.1#0A............CASE
...11:.s1.:#3D.s1.+.1#0A............CASE...12:.s1.:
#3D.s1.+.1#0A............CASE...13:.s1.:#3D.s1.+.1#0A
............CASE...41:.s1.:#3D.s1.+.1#0A...........
.CASE...91:.s1.:#3D.s1.+.1#0A............CASE...92:
.s1.:#3D.s1.+.1#0A............CASE...71:.s1.:#3D.s1
.+.1#0A............CASE...73:.s1.:#3D.s1.+.1#0A....
........CASE...74:.s1.:#3D.s1.+.1#0A............CAS
E...81:.s1.:#3D.s1.+.1#0A............CASE...82:.s1.
:#3D.s1.+.1#0A............CASE...61:.s1.:#3D.s1.+.1
#0A............CASE.-171:.s1.:#3D.s1.+.1#0A........
....CASE.-162:.s1.:#3D.s1.+.1..$)#0A#0A........SWIT
CHON.i+10000.INTO#0A.........$(.DEFAULT:.s2.:#3D.s2
+1000;.ENDCASE#0A............CASE.10020:.s2.:#3D.s2
.+.1#0A............CASE.10021:.s2.:#3D.s2.+.1#0A...
.........CASE.10022:.s2.:#3D.s2.+.1#0A............C
ASE.10023:.s2.:#3D.s2.+.1#0A............CASE.10024:
.s2.:#3D.s2.+.1#0A............CASE.10025:.s2.:#3D.s
2.+.1#0A............CASE.10026:.s2.:#3D.s2.+.1#0A..
..........CASE.10027:.s2.:#3D.s2.+.1#0A............
CASE.10028:.s2.:#3D.s2.+.1#0A............CASE.10029
:.s2.:#3D.s2.+.1#0A............CASE.10010:.s2.:#3D.
s2.+.1#0A............CASE.10011:.s2.:#3D.s2.+.1#0A.
...........CASE.10012:.s2.:#3D.s2.+.1#0A...........
.CASE.10013:.s2.:#3D.s2.+.1#0A............CASE.1001
4:.s2.:#3D.s2.+.1#0A............CASE.10015:.s2.:#3D
.s2.+.1..$)#0A#0A........SWITCHON.i*100.INTO#0A....
.....$(.DEFAULT:.s3.:#3D.s3+1000;.ENDCASE#0A.......
.....CASE.-100000:.s3f.:#3D.s3f.+.i;.ENDCASE#0A....
........CASE.-20000:.s3.:#3D.s3.+.1#0A............C
ASE.-19000:.s3.:#3D.s3.+.1#0A............CASE.-1800
0:.s3.:#3D.s3.+.1#0A............CASE...-500:.s3.:#3D
.s3.+.1#0A............CASE....000:.s3.:#3D.s3.+.1#0A
............CASE.-14500:.s3.:#3D.s3.+.1#0A.........
...CASE....700:.s3.:#3D.s3.+.1#0A............CASE..
..800:.s3.:#3D.s3.+.1#0A............CASE..20000:.s3
.:#3D.s3.+.1#0A............CASE..19000:.s3.:#3D.s3.
+.1#0A............CASE..10000:.s3.:#3D.s3.+.1#0A...
.........CASE...9000:.s3.:#3D.s3.+.1#0A............
CASE..19900:.s3.:#3D.s3.+.1#0A............CASE...95
00:.s3.:#3D.s3.+.1#0A............CASE...7600:.s3.:#3D
.s3.+.1#0A............CASE...8800:.s3.:#3D.s3.+.1#0A
............CASE...9900:.s3.:#3D.s3.+.1#0A.........
...CASE..-9800:.s3.:#3D.s3.+.1#0A............CASE..
.1100:.s3.:#3D.s3.+.1#0A............CASE...1200:.s3
.:#3D.s3.+.1#0A............CASE...1300:.s3.:#3D.s3.
+.1#0A............CASE...4100:.s3.:#3D.s3.+.1#0A...
.........CASE...9100:.s3.:#3D.s3.+.1#0A............
CASE...9200:.s3.:#3D.s3.+.1#0A............CASE...71
00:.s3.:#3D.s3.+.1#0A............CASE...7300:.s3.:#3D
.s3.+.1#0A............CASE...7400:.s3.:#3D.s3.+.1#0A
............CASE...8100:.s3.:#3D.s3.+.1#0A.........
...CASE...8200:.s3.:#3D.s3.+.1#0A............CASE..
.6100:.s3.:#3D.s3.+.1#0A............CASE.-17100:.s3
.:#3D.s3.+.1#0A............CASE.-16200:.s3.:#3D.s3.
+.1..$)#0A#0A.....$)#0A.....t(s1f,.0)..............
..........................//.200#0A.....t(s2f,.0)..
......................................//.201#0A....
.t(s3f,.0)......................................../
/.202#0A.....t(s1,.(401-32)*1000.+.32*(32+1)/2)..//
369528.....//.203#0A.....t(s2,.(401-16)*1000.+.16*(
16+1)/2)..//385136.....//.204#0A.....t(s3,.(401-32)
*1000.+.32*(32+1)/2)..//369528.....//.205#0A$)sw#0A
#0A....testno.:#3D.250..//.TEST.FUNCTION.CALLING#0A
#0A......t1(1,2,3,4,5,6,.21)#0A......t1(t(1,1),.t(2
,2),.t(3,3),.t(4,4),.t(5,5),.t(6,6),#0A.........t(2
1,21))#0A......t1(VALOF.RESULTIS.1,#0A.........VALO
F.RESULTIS.2,#0A.........VALOF.RESULTIS.3,#0A......
...VALOF.RESULTIS.4,#0A.........VALOF.RESULTIS.5,#0A
.........VALOF.RESULTIS.6,#0A.........21)#0A......t
1(VALOF.RESULTIS.1,#0A.........t(2,2),#0A.........V
ALOF.RESULTIS.3,#0A.........t(4,4),#0A.........VALO
F.RESULTIS.5,#0A.........t(6,6),#0A.........21)#0A.
....t1(.1,.t(2,2),.VALOF.RESULTIS.3,#0A.........4,.
t(5,5),.VALOF.RESULTIS.6,#0A.........21)#0A.....t1(
!v,v!0,v!200,!w,w!0,w!200,.2*1000+1200+2*10000+1020
0)#0A.....(t1+(x+x)/x-2)(1,1,1,1,1,1,6)#0A#0A.....t
estno.:#3D.300..//.TEST.EXPRESSION.OPERATORS#0A#0A.
....f.:#3D.105#0A.....t((2+3)+f+6,116)#0A.....t(f+2
+3+6,116)#0A.....t(6+3+2+f,.116)#0A.....t(f-104,.1)
#0A.....t((x+2)#3D(x+2)->99,98,.99)#0A.....t(f<f+1-
>21,22,.21)#0A.....t(f>f+1->31,32,.32)#0A.....t(f<#3D
105->41,42,.41)#0A.....t(f>#3D105->51,52,.51)#0A#0A
....testno.:#3D.400..//.TEST.REGISTER.ALLOCATION.ET
C#2E#0A#0A....x.:#3D.0#0A....y.:#3D.1#0A....z.:#3D.
2#0A....t(x,.0)#0A....t(y,.1)#0A....t(z,.2)#0A....f
,g,h.:#3D.101,102,103#0A....a,b,c.:#3D.11,12,13#0A.
...t(x+1,1)#0A....t(f+1,.102)#0A....t(a+1,.12)#0A..
..t(!(@a*2/2+f-101),11)#0A....a.:#3D.@f#0A....t(!a,
.101)#0A....b.:#3D.@g#0A....a.:#3D.@b#0A....t(!!a,.
102)#0A....w!0.:#3D.@w!1#0A....w!1.:#3D.@h#0A....t(
z*y+(w!0)!0!0-2,.103)#0A....t(z*y+w!1!0-2,.103)#0A.
...t(t(123,123),t(123,123))#0A#0A....testno.:#3D.50
0.//.test.16.and.32..bit.cintcode.operands#0A#0A...
.x.:#3D.100#0A....t(x*x,.10000)...............//.LH
#0A....t(x*x*x*x,.100000000).......//.LW#0A....t(x*
x+10000,.20000).........//.AH#0A....t(x*x+100000000
,.100010000).//.AW#0A....t(x*x-10000,.0)...........
..//.SH#0A....t(x*x-100000000,.-99990000).//.AW#0A#0A
....testno.:#3D.600#0A#0A....locals(103,104,105,106
,107,108,109,110,111,112,113,114,115,116,117)#0A#0A
#0A....testno.:#3D.700#0A#0A....a.:#3D.1#0A....b.:#3D
.msb#0A....c.:#3D..allones#0A....t(a<<0,.1)#0A....t
(a<<1,.2)#0A....t(a<<2,.4)#0A....t(a<<bitsperword-1
,.msb)#0A....t(a<<bitsperword,.....0)#0A....t(a<<bi
tsperword+1,...0)#0A#0A....t(a>>0,.1)#0A....t(b>>bi
tsperword-1,.1)#0A....t(c>>bitsperword-1,.1)#0A....
t(b>>bitsperword,...0)#0A....t(c>>bitsperword,...0)
#0A#0A....testno.:#3D.800#0A....a,.b,.c.:#3D.20,.-3
0,.0#0A....t(ABS.a,.20)#0A....t(ABS.b,.30)#0A....t(
ABS.c,.0)#0A#0A....v!0.:#3D.1001#0A....t(v!0,.1001)
#0A....v!1.:#3D.1002#0A....t(v!1,.1002)#0A....v!2.:
#3D.1003#0A....t(v!2,.1003)#0A....v!3.:#3D.1004#0A.
...t(v!3,.1004)#0A....v!4.:#3D.1005#0A....t(v!4,.10
05)#0A#0A....w!0.:#3D.2001#0A....t(w!0,.2001)#0A...
.w!1.:#3D.2002#0A....t(w!1,.2002)#0A....w!2.:#3D.20
03#0A....t(w!2,.2003)#0A....w!3.:#3D.2004#0A....t(w
!3,.2004)#0A....w!4.:#3D.2005#0A....t(w!4,.2005)#0A
#0A....w%0.:#3D.21#0A....t(w%0,.21)#0A....w%1.:#3D.
22#0A....t(w%1,.22)#0A....w%2.:#3D.23#0A....t(w%2,.
23)#0A....w%3.:#3D.3#0A....t(w%3,.3).//.compiles.xp
byt.instruction#0A#0A....a.:#3D.10#0A....b.:#3D.a<<
5#0A....w%4.:#3D.a..//.compiles.a.btc.instruction#0A
....t(w%4,.10)#0A#0A....a,.b,.g.:#3D.100,101,300#0A
....a.:#3D.a+1#0A....t(a,.101)#0A....a.:#3D.a+b#0A.
...t(a,.202)#0A....g.:#3D.g+b#0A....t(g,.401)#0A#0A
....g.:#3D.8#0A....b.:#3D.3#0A....a.:#3D.g.REM.b#0A
....t(a,.2)#0A#0A....g.:#3D.20#0A....b.:#3D.12#0A..
..a.:#3D.g.-.b#0A....t(a,.8)#0A#0A....testno.:#3D.8
50#0A#0A....//.Test.Unicode.character.and.string.es
capes#0A....//.assuming.the.compiler.has.UTF8.as.th
e.default.encoding#2E#0A....t('*#231234',.#23x1234)
#0A....t("*#231234"%0,.3)................//.0001.00
10.0011.0100#0A....t("*#231234"%1,.#23b1110_0001)..
....//.0001#0A....t("*#231234"%2,.#23b10_001000)...
...//......0010.00#0A....t("*#231234"%3,.#23b10_110
100)......//.............11.0100#0A#0A....t('*#23#23
1234_5678',.#23x1234_5678)#0A....t("*#23#231234_567
8"%0,.6)..........//.0001.0010.0011.0100.0101.0110.
0111.1000#0A....t("*#23#231234_5678"%1,.#23b1111110
_0)//..0#0A....t("*#23#231234_5678"%2,.#23b10_01001
0)//...01.0010#0A....t("*#23#231234_5678"%3,.#23b10
_001101)//...........0011.01#0A....t("*#23#231234_5
678"%4,.#23b10_000101)//..................00.0101#0A
....t("*#23#231234_5678"%5,.#23b10_011001)//.......
...................0110.01#0A....t("*#23#231234_567
8"%6,.#23b10_111000)//.............................
....11.1000#0A#0A....//.Test.GB2312.character.and.s
tring.escapes#0A....//.assuming.the.compiler.has.UT
F8.as.the.default.encoding#2E#0A....t('*#23g*#23456
6',.4566)#0A....t("*#23g*#234566"%0,.2).....//.row.
45..col.66..#3D.character.'foreign'#0A....t("*#23g*
#234566"%1,.#23xE2)..//.#23xE2.#3D.66.+.160#0A....t
("*#23g*#234566"%2,.#23xCD)..//.#23xCD.#3D.45.+.160
#0A#0A....nl()#0A....wrn(testcount)#0A....wrs(".TES
TS.COMPLETED,.")#0A....wrn(failcount)#0A....wrs(".F
AILURE(S)*N")#0A$)#0A#0A#0A#0AAND.locals(p3,p4,p5,p
6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17).BE#0A$(
.t(p3,.103)#0A...t(p4,.104)#0A...t(p5,.105)#0A...t(
p6,.106)#0A...t(p7,.107)#0A...t(p8,.108)#0A...t(p9,
.109)#0A...t(p10,110)#0A...t(p11,111)#0A...t(p12,11
2)#0A...t(p13,113)#0A...t(p14,114)#0A...t(p15,115)#0A
...t(p16,116)#0A...t(p17,117)#0A#0A$)#0A

######+#
