home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Source Code 1994 March
/
Source_Code_CD-ROM_Walnut_Creek_March_1994.iso
/
compsrcs
/
games
/
vmsnet
/
ldb
/
part09
< prev
next >
Wrap
Internet Message Format
|
1993-04-07
|
49KB
Path: uunet!caen!sol.ctr.columbia.edu!howland.reston.ans.net!usc!news.service.uci.edu!unogate!mvb.saic.com!dayton.saic.com!dayvd.dayton.saic.com!ake
From: ake@dayvd.dayton.saic.com (Earle Ake)
Newsgroups: vmsnet.sources.games
Subject: ldb - Long Distance Backgammon [09/16]
Date: 8 Apr 93 10:58:16 EST
Organization: Science Applications Intl Corp - Dayton, OH
Lines: 1361
Message-ID: <1993Apr8.105816.1@dayvd.dayton.saic.com>
NNTP-Posting-Host: dayvd.dayton.saic.com
Xref: uunet vmsnet.sources.games:670
-+-+-+-+-+-+-+-+ START OF PART 9 -+-+-+-+-+-+-+-+
X`09`09`09continue;`09`09/*`20keep`20looking`20*/
X`09`09FeOnMenuItem(m,c);`09`09/*`20highlight`20selection`20*/
X`09`09return(c);
X`09`09`7D
X`09FeMessage("Invalid`20command.");
X`09`7D
X`7D
X
X
X/*----------------------------------------------------------------------
X`20*`09FeMessage`20--`20print`20a`20highlighted`20message`20on`20bottom`20line
V
X`20*
X`20*`20This`20function`20prints`20a`20string`20in`20reverse`20video`20on`20lin
Ve`2023.
X`20*`20The`20message`20length`20is`20restricted`20to`2062`20characters`20to
V`20avoid
X`20*`20running`20into`20the`20menu`20box.`20`20If`20NULL`20is`20passed`20as
V`20a`20message,
X`20*`20the`20message`20line`20is`20cleared.
X`20*----------------------------------------------------------------------
X`20*/
X
XFeMessage(s)
Xchar`20*s;
X`7B
Xchar`20c`20=`200;
X
Xmvaddstr(23,0,BLANKS(62));`09`09/*`20clear`20message`20line`20*/
Xif`20(s`20!=`20NULL)`20`7B`09`09/*`20if`20we`20have`20a`20message`20to`20print
V`20*/
X`09if`20(strlen(s)`20>`2062)`20`7B`09/*`20check`20that`20it's`20not`20too`20lo
Vng`20*/
X`09`09c`20=`20s`5B62`5D;`09/*`20save`20char`20at`20this`20position`20*/
X`09`09s`5B62`5D`20=`20'`5C0';`09/*`20and`20end`20the`20string`20*/
X`09`09`7D
X`09move(23,0);
X`09PReverseText();
X`09addstr(s);`09`09/*`20print`20the`20message`20*/
X`09PEndReverse();
X`09if`20(c`20!=`20'`5C0')`09`09/*`20if`20we`20shortened`20it,`20restore`20it
V`20*/
X`09`09s`5B62`5D`20=`20c;
X`09`7D
Xrefresh();
X`7D
X
X
X/*----------------------------------------------------------------------
X`20*`09FeStatusLine`20--`20draw`20string`20on`20status`20line
X`20*
X`20*`20This`20function`20puts`20a`20string`20on`20line`2018`20in`20reverse`20v
Video.`20`20It`20is
X`20*`20used`20to`20display`20blots`20hit,`20double`20offers,`20etc.
X`20*----------------------------------------------------------------------
X`20*/
X
XFeStatusLine(s)
Xchar`20*s;
X`7B
Xchar`20c`20=`200;
Xint`20l;
X
Xmvaddstr(18,10,BLANKS(50));`09/*`20clear`20status`20line`20*/
Xif`20(s`20!=`20NULL)`20`7B`09`09/*`20if`20we`20have`20a`20message`20to`20print
V`20*/
X`09if`20(`20(l`20=`20strlen(s))`20>`2050)`20`7B`09/*`20check`20that`20it's`20n
Vot`20too`20long`20*/
X`09`09c`20=`20s`5B50`5D;`09/*`20save`20char`20at`20this`20position`20*/
X`09`09s`5B50`5D`20=`20'`5C0';`09/*`20and`20end`20the`20string`20*/
X`09`09l`20=`2050;
X`09`09`7D
X`09move(18,(50`20-`20l)/2`20+`2010);
X`09PReverseText();
X`09addstr(s);`09`09/*`20print`20the`20message`20*/
X`09PEndReverse();
X`09if`20(c`20!=`20'`5C0')`09`09/*`20if`20we`20shortened`20it,`20restore`20it
V`20*/
X`09`09s`5B50`5D`20=`20c;
X`09`7D
Xrefresh();
X`7D
X
X
X/*----------------------------------------------------------------------
X`20*`09FeDrawCube`20--`20draw`20doubling`20cube
X`20*
X`20*`20This`20function`20draws`20the`20doubling`20cube.`20`20The`20cube`20is
V`20displayed`20beside
X`20*`20the`20inner`20table`20of`20the`20player`20who`20owns`20it`20(i.e.`20the
V`20one`20who`20didn't
X`20*`20double`20last).`20`20If`20neither`20player`20has`20doubled,`20the`20cub
Ve`20is`20drawn
X`20*`20in`20the`20middle`20of`20the`20board.
X`20*----------------------------------------------------------------------
X`20*/
X
XFeDrawCube(g)
Xstruct`20game`20*g;
X`7B
Xint`20r,`20c;
Xchar`20buf`5B8`5D;
X
Xmvaddstr(3,0,"`20`20`20`20");`09`09/*`20clear`20all`20cube`20locations`20*/
Xmvaddstr(10,0,"`20`20`20`20");
Xmvaddstr(17,0,"`20`20`20`20");
Xif`20(g->gameval`20==`20(1`20<<`20g->adcnt))`09/*`20nobody`20has`20doubled`20*
V/
X`09r`20=`2010;`09`09`09/*`20cube`20is`20in`20the`20middle`20of`20the`20board
V`20*/
Xelse`20`7B`09`09`09/*`20assume`20I`20didn't`20double`20last,`20mydir`20is`20up
V,`20*/
X`09r`20=`200;`09`09/*`20and`20board`20is`20not`20inverted`20*/
X`09if`20(g->flags`20`26`20F_IDOUBLED)`09/*`20if`20I`20did`20double`20last`20*/
V
X`09`09r`20=`201`20-`20r;`09`09/*`20switch`20rows`20*/
X`09if`20(g->mydir`20<`200)`09`09/*`20if`20my`20direction`20is`20down`20*/
X`09`09r`20=`201`20-`20r;`09`09/*`20switch`20rows`20*/
X`09if`20(g->flags`20`26`20F_INVERT)`09/*`20if`20board`20is`20inverted`20*/
X`09`09r`20=`201`20-`20r;`09`09/*`20switch`20rows`20*/
X`09r`20=`20r`20?`2017`20:`203;`09`09`09/*`20which`20row`20am`20I`20left`20with
V?`20*/
X`09`7D
X
Xsprintf(buf,"%d",g->gameval);`09`09/*`20generate`20the`20game`20value`20*/
Xif`20(`20(c`20=`204`20-`20strlen(buf))`20<`200)`20`7B`09/*`20doubled`20past
V`204`20digits?`20*/
X`09strcpy(buf,"****");`09`09/*`20we`20are`20out`20of`20columns`20*/
X`09c`20=`200;
X`09`7D
Xmove(r,c);
XPReverseText();
Xmvaddstr(r,c,buf);`09`09/*`20go`20there`20and`20draw`20game`20value`20*/
XPEndReverse();
X`7D
X
X
X/*----------------------------------------------------------------------
X`20*`09PDrawComment`20--`20print`20a`20comment`20stored`20in`20a`20game
X`20*
X`20*`20This`20function`20takes`20a`20pointer`20to`20a`20game`20and`20draws`20t
Vhe`20comment
X`20*`20strings`20to`20the`20screen.`20`20If`20"who"`20is`20WHO_ME,`20the`20"my
Vcmt"`20strings
X`20*`20are`20drawn`20on`20lines`2019`20and`2020.`20`20Otherwise,`20the`20"opcm
Vt"`20strings
X`20*`20are`20drawn`20on`20lines`2021`20and`2022.`20`20Any`20unused`20space`20o
Vn`20these`20lines
X`20*`20is`20cleared.
X`20*----------------------------------------------------------------------
X`20*/
X
XPRIVATE`20PDrawComment(who,g)
Xint`20who;
Xstruct`20game`20*g;
X`7B
Xint`20line;
Xchar`20*s1,`20*s2;
X
Xline`20=`20(who`20==`20WHO_OPP)`20?`2021`20:`2019;
Xs1`20=`20(who`20==`20WHO_OPP)`20?`20g->opcmt`20:`20g->mycmt;
Xs2`20=`20(who`20==`20WHO_OPP)`20?`20g->opcmt2`20:`20g->mycmt2;
Xmvaddstr(line,6,BLANKS(56));
Xmvaddstr(line+1,6,BLANKS(56));
Xif`20(s1`20!=`20NULL)`20`7B
X`09if`20(strlen(s1)`20>`2056)
X`09`09s1`5B56`5D`20=`20'`5C0';
X`09mvaddstr(line,6,s1);
X`09`7D
Xif`20(s2`20!=`20NULL)`20`7B
X`09if`20(strlen(s2)`20>`2056)
X`09`09s2`5B56`5D`20=`20'`5C0';
X`09mvaddstr(line+1,6,s2);
X`09`7D
X`7D
X
X
X/*----------------------------------------------------------------------
X`20*`09PReverseText`20--`20go`20into`20reverse`20video`20mode
X`20*
X`20*`20This`20function`20goes`20into`20what`20is`20hopefully`20reverse`20video
V.`20`20It
X`20*`20uses`20the`20standout()`20call`20from`20curses,`20which`20actually`20on
Vly
X`20*`20does`20whatever`20:so`20is`20set`20to`20in`20termcap`20(or`20the`20equi
Vvalent
X`20*`20in`20terminfo).`20`20This`20is`20not`20necessarily`20reverse,`20but`20t
Vhe
X`20*`20only`20way`20to`20be`20sure`20of`20getting`20reverse`20(setattr)`20is
V`20not
X`20*`20portable.`20`20For`20VMS,`20the`20standout`20call`20uses`20bold`20rathe
Vr`20than
X`20*`20reverse,`20so`20we`20use`20setattr.
X`20*----------------------------------------------------------------------
X`20*/
X
XPRIVATE`20PReverseText()
X`7B
X
X#ifdef`20VMS
Xsetattr(_REVERSE);
X#else
Xstandout();
X#endif
X`7D
X
X
X/*----------------------------------------------------------------------
X`20*`09PEndReverse`20--`20go`20back`20to`20normal`20text
X`20*
X`20*`20This`20function`20reverses`20PReverseText,`20going`20back`20to`20unhigh
Vlighted`20text.
X`20*----------------------------------------------------------------------
X`20*/
X
XPRIVATE`20PEndReverse()
X`7B
X
X#ifdef`20VMS
Xclrattr(_REVERSE);
X#else
Xstandend();
X#endif
X`7D
X
X
X/*----------------------------------------------------------------------
X`20*`09FeOnMenuItem`20--`20highlight`20a`20menu`20item
X`20*
X`20*`20This`20function`20highlights`20a`20menu`20item.`20`20This`20is`20used
V`20to`20show`20the`20menu
X`20*`20selection`20that`20was`20picked.`20`20It`20stays`20highlighted`20until
V`20FeOffMenuItem
X`20*`20is`20called`20or`20a`20new`20menu`20is`20displayed.
X`20*----------------------------------------------------------------------
X`20*/
X
XFeOnMenuItem(m,p)
Xchar`20*m`5B`5D;
Xchar`20p;
X`7B
Xint`20i;
X
Xfor`20(i`20=`200;`20m`5Bi`5D`20`26`26`20(i`20<`205);`20i++)`20`7B
X`09if`20(*m`5Bi`5D`20==`20p)`20`7B
X`09`09move(19+i,63);
X`09`09clrtoeol();
X`09`09move(19+i,64);
X`09`09PReverseText();
X`09`09addstr(m`5Bi`5D);
X`09`09PEndReverse();
X`09`09`7D
X`09`7D
Xrefresh();
X`7D
X
X
X/*----------------------------------------------------------------------
X`20*`09FeOffMenuItem`20--`20unhighlight`20a`20menu`20item
X`20*
X`20*`20This`20function`20un-highlights`20a`20menu`20item.`20`20This`20is`20use
Vd`20when`20another
X`20*`20pick`20is`20going`20to`20be`20made`20from`20the`20same`20menu.
X`20*----------------------------------------------------------------------
X`20*/
X
XFeOffMenuItem(m,p)
Xchar`20*m`5B`5D;
Xchar`20p;
X`7B
Xint`20i;
X
Xfor`20(i`20=`200;`20m`5Bi`5D`20`26`26`20(i`20<`205);`20i++)`20`7B
X`09if`20(*m`5Bi`5D`20==`20p)`20`7B
X`09`09move(19+i,63);
X`09`09clrtoeol();
X`09`09move(19+i,64);
X`09`09addstr(m`5Bi`5D);
X`09`09`7D
X`09`7D
Xrefresh();
X`7D
X
X
X/*----------------------------------------------------------------------
X`20*`09FeDumpScreen`20--`20copy`20screen`20image`20to`20a`20file
X`20*
X`20*`20This`20function`20reads`20all`20characters`20off`20the`20screen`20and
V`20copies
X`20*`20them`20to`20a`20file.`20`20It`20uses`20the`20inch()`20function`20from
V`20the`20curses
X`20*`20library`20to`20read`20the`20screen.`20`20It`20returns`201`20for`20succe
Vss,`200`20for`20failure.
X`20*----------------------------------------------------------------------
X`20*/
X
XFeDumpScreen(fn)
Xchar`20*fn;
X`7B
XFILE`20*fp;
Xint`20x,`20y;
X
Xif`20(`20(fp`20=`20fopen(fn,"w"))`20==`20NULL)
X`09return(0);
Xfor`20(y`20=`200;`20y`20<`2024;`20y++)`20`7B
X`09for`20(x`20=`200;`20x`20<`2080;`20x++)`20`7B
X`09`09move(y,x);
X`09`09putc(inch(),fp);
X`09`09`7D
X`09putc('`5Cn',fp);
X`09`7D
Xfclose(fp);
X`7D
X
X
X/*----------------------------------------------------------------------
X`20*`09FeYesNo`20--`20see`20if`20user`20knows`20what`20he's`20doing
X`20*
X`20*`20This`20function`20displays`20a`20message`20and`20waits`20for`20a`20sing
Vle`20character
X`20*`20from`20the`20user.`20`20If`20it`20is`20Y`20or`20y,`201`20is`20returned,
V`20otherwise
X`20*`200`20is`20returned.
X`20*----------------------------------------------------------------------
X`20*/
XFeYesNo(msg)
Xchar`20*msg;
X`7B
Xchar`20c;
X
Xif`20(msg`20==`20NULL)
X`09msg`20=`20"Are`20you`20sure?`20`5Byn`5D";
XFeMessage(msg);
Xc`20=`20PGetChr(0,0);
XFeMessage(NULL);
Xreturn(`20(c`20==`20'y')`20`7C`7C`20(c`20==`20'Y')`20);
X`7D
$ call unpack FE_CURSES.C;1 1900969471 ""
$!
$ create 'f'
X/*`09flist_none.c`09`094/24/91
X`20*
X`20*`20Copyright`201991`20`20Perry`20R.`20Ross
X`20*
X`20*`20Permission`20to`20use,`20copy,`20modify,`20and`20distribute`20this`20so
Vftware`20and`20its
X`20*`20documentation`20without`20fee`20is`20hereby`20granted,`20subject`20to
V`20the`20restrictions
X`20*`20detailed`20in`20the`20README`20file,`20which`20is`20included`20here`20b
Vy`20reference.
X`20*`20Any`20other`20use`20requires`20written`20permission`20from`20the`20auth
Vor.`20`20This`20software
X`20*`20is`20distributed`20"as`20is"`20without`20any`20warranty,`20including
V`20any`20implied
X`20*`20warranties`20of`20merchantability`20or`20fitness`20for`20a`20particular
V`20purpose.
X`20*`20The`20author`20shall`20not`20be`20liable`20for`20any`20damages`20result
Ving`20from`20the
X`20*`20use`20of`20this`20software.`20`20By`20using`20this`20software,`20the
V`20user`20agrees
X`20*`20to`20these`20terms.
X`20*/
X
X#include`20"ldb.h"
X
X
X/*----------------------------------------------------------------------
X`20*`09filelist`20--`20generate`20a`20list`20of`20all`20matching`20files.
X`20*
X`20*`20This`20is`20a`20dummy`20function`20that`20can`20be`20used`20to`20disabl
Ve`20filename
X`20*`20matching.`20`20It`20just`20copies`20the`20pattern`20into`20a`201-elemen
Vt`20list
X`20*`20and`20returns`20it.`20`20This`20can`20be`20used`20if`20flist_unix`20doe
Vs`20not`20work,
X`20*`20or`20if`20filename`20matching`20is`20not`20desired.
X`20*----------------------------------------------------------------------
X`20*/
X
Xstruct`20flist`20*filelist(ptn)
Xchar`20*ptn;
X`7B
Xstruct`20flist`20*cur;
X
Xif`20(`20(cur`20=`20(struct`20flist`20*)`20calloc(sizeof(struct`20flist),1))
V`20==`20NULL)
X`09fatal("Out`20of`20memory!");
Xcur->name`20=`20save(ptn);
Xreturn(cur);
X`7D
$ call unpack FLIST_NONE.C;1 2135181073 ""
$!
$ create 'f'
X/*`09flist_unix.c`09`094/24/91
X`20*
X`20*`20Copyright`201991`20`20Perry`20R.`20Ross
X`20*
X`20*`20Permission`20to`20use,`20copy,`20modify,`20and`20distribute`20this`20so
Vftware`20and`20its
X`20*`20documentation`20without`20fee`20is`20hereby`20granted,`20subject`20to
V`20the`20restrictions
X`20*`20detailed`20in`20the`20README`20file,`20which`20is`20included`20here`20b
Vy`20reference.
X`20*`20Any`20other`20use`20requires`20written`20permission`20from`20the`20auth
Vor.`20`20This`20software
X`20*`20is`20distributed`20"as`20is"`20without`20any`20warranty,`20including
V`20any`20implied
X`20*`20warranties`20of`20merchantability`20or`20fitness`20for`20a`20particular
V`20purpose.
X`20*`20The`20author`20shall`20not`20be`20liable`20for`20any`20damages`20result
Ving`20from`20the
X`20*`20use`20of`20this`20software.`20`20By`20using`20this`20software,`20the
V`20user`20agrees
X`20*`20to`20these`20terms.
X`20*/
X
X/*`20This`20file`20uses`20the`20"regex-glob"`20routines,`20written`20by`20John
V`20Kercheval,`20and
X`20*`20posted`20to`20comp.sources.misc.`20`20The`20code`20appears`20at`20the
V`20end`20of`20this
X`20*`20file`20with`20all`20original`20comments.
X`20*/
X
X#include`20"ldb.h"
X
X
X/*----------------------------------------------------------------------
X`20*`09filelist`20--`20generate`20a`20list`20of`20all`20matching`20files.
X`20*
X`20*`20This`20function`20generates`20a`20list`20of`20all`20files`20that`20matc
Vh`20a`20pattern.
X`20*`20Each`20file`20is`20stored`20in`20an`20instance`20of`20struct`20flist,
V`20which`20just
X`20*`20links`20the`20names`20in`20a`20linked`20list.`20`20A`20pointer`20to`20t
Vhe`20beginning`20of
X`20*`20the`20list`20is`20returned.`20`20It`20is`20the`20callers`20responsibili
Vty`20to`20free
X`20*`20the`20list`20when`20it`20is`20no`20longer`20needed.
X`20*
X`20*`20This`20function`20will`20only`20recognize`20wildcards`20in`20file`20nam
Ves,`20NOT
X`20*`20the`20directories`20leading`20up`20to`20them.`20`20For`20example,`20nut
Vs/ldb*.txt`20is
X`20*`20fine,`20but`20*ts/ldb*.txt`20is`20not.
X`20*
X`20*`20This`20function`20uses`20the`20"new"`20directory`20routines`20(i.e.`20o
Vpendir,
X`20*`20readdir,`20et.`20al).`20`20If`20these`20are`20not`20on`20your`20system,
V`20you`20should
X`20*`20have`20defined`20NEED_READDIR`20in`20your`20Makefile.
X`20*----------------------------------------------------------------------
X`20*/
X
Xstruct`20flist`20*filelist(ptn)
Xchar`20*ptn;
X`7B
Xstruct`20flist`20*head,`20*tail,`20*cur;
XDIR`20*dp;
Xchar`20*s;
Xchar`20*dn,`20*pn;
Xstruct`20direct`20*p;
X
Xhead`20=`20NULL;
Xif`20(is_pattern(ptn)`20==`200)`20`7B`09/*`20no`20wildcards,`20just`20a`20file
V`20name`20*/
X`09if`20(`20(cur`20=`20(struct`20flist`20*)`20calloc(sizeof(struct`20flist),1)
V)`20==`20NULL)
X`09`09fatal("Out`20of`20memory!");
X`09head`20=`20cur;
X`09tail`20=`20cur;
X`09cur->name`20=`20save(ptn);
X`09return(cur);
X`09`7D
Xif`20(`20(s`20=`20strrchr(ptn,'/'))`20!=`20NULL)`20`7B`09/*`20strip`20off`20di
Vrectory`20name`20*/
X`09*s`20=`20'`5C0';
X`09dn`20=`20save(ptn);`09`09/*`20dir`20=`20everything`20before`20last`20/`20
V`20*/
X`09pn`20=`20save(s+1);`09`09/*`20pattern`20=`20everything`20after`20last`20/
V`20`20*/
X`09*s`20=`20'/';
X`09`7D
Xelse`20`7B
X`09dn`20=`20save(".");
X`09pn`20=`20save(ptn);
X`09`7D
Xif`20(`20(dp`20=`20opendir(dn))`20==`20NULL)`20`7B
X`09free(dn);
X`09free(pn);
X`09return(NULL);
X`09`7D
Xwhile`20(`20(p`20=`20readdir(dp))`20!=`20NULL)`20`7B
X`09if`20(`20(strcmp(p->d_name,".")`20==`200)`20`7C`7C`20(strcmp(p->d_name,".."
V)`20==`200)`20)
X`09`09continue;
X`09if`20(match(pn,p->d_name)`20==`200)
X`09`09continue;
X`09if`20(`20(cur`20=`20(struct`20flist`20*)`20calloc(sizeof(struct`20flist),1)
V)`20==`20NULL)
X`09`09fatal("Out`20of`20memory!");
X`09if`20(head`20==`20NULL)`20`7B
X`09`09head`20=`20cur;
X`09`09tail`20=`20cur;
X`09`09`7D
X`09else`20`7B
X`09`09tail->next`20=`20cur;
X`09`09tail`20=`20cur;
X`09`09`7D
X`09if`20(strcmp(dn,".")`20==`200)`09/*`20file`20in`20current`20dir`20*/
X`09`09cur->name`20=`20save(p->d_name);`09/*`20just`20save`20name`20*/
X`09else`20`7B`09`09`09`09/*`20include`20directory`20name`20*/
X`09`09cur->name`20=`20(char`20*)`20malloc(strlen(dn)+strlen(p->d_name)+2);
X`09`09if`20(cur->name`20==`20NULL)
X`09`09`09fatal("Out`20of`20memory!");
X`09`09sprintf(cur->name,"%s/%s",dn,p->d_name);
X`09`09`7D
X`09`7D
Xclosedir(dp);
Xfree(dn);
Xfree(pn);
Xreturn(head);
X`7D
X
X
X/*`20regex-glob`20code`20follows:`20(de-ansified`20by`20P.`20Ross`20--`20sorry
V)`20*/
X
X/*
X`20EPSHeader
X
X`20`20`20File:`20match.c
X`20`20`20Author:`20J.`20Kercheval
X`20`20`20Created:`20Sat,`2001/05/1991`20`2022:21:49
X*/
X/*
X`20EPSRevision`20History
X
X`20`20`20J.`20Kercheval`20`20Wed,`2002/20/1991`20`2022:29:01`20`20Released`20t
Vo`20Public`20Domain
X*/
X
X/*
X`20`20`20Wildcard`20Pattern`20Matching
X*/
X
X
X/*`20#include`20"match.h"`20--`20match.h`20included`20here`20for`20simplicity
V`20`20P.`20Ross`20*/
X
X/*
X`20EPSHeader
X
X`20`20`20File:`20match.h
X`20`20`20Author:`20J.`20Kercheval
X`20`20`20Created:`20Sat,`2001/05/1991`20`2022:27:18
X*/
X/*
X`20EPSRevision`20History
X
X`20`20`20J.`20Kercheval`20`20Wed,`2002/20/1991`20`2022:28:37`20`20Released`20t
Vo`20Public`20Domain
X*/
X
X/*
X`20`20`20Wildcard`20Pattern`20Matching
X*/
X
X#ifndef`20BOOLEAN
X#`20define`20BOOLEAN`20int
X#undef`20TRUE
X#undef`20FALSE
X#`20define`20TRUE`201
X#`20define`20FALSE`200
X#endif
X
X/*----------------------------------------------------------------------------
V
X*
X*`20`20Match`20the`20pattern`20PATTERN`20against`20the`20string`20TEXT;
X*`20`20return`20TRUE`20if`20it`20matches,`20FALSE`20otherwise.
X*
X*`20`20A`20match`20means`20the`20entire`20string`20TEXT`20is`20used`20up`20in
V`20matching.
X*
X*`20`20In`20the`20pattern`20string:
X*`20`20`20`20`20`20`20`60*'`20matches`20any`20sequence`20of`20characters
X*`20`20`20`20`20`20`20`60?'`20matches`20any`20character
X*`20`20`20`20`20`20`20`5BSET`5D`20matches`20any`20character`20in`20the`20speci
Vfied`20set,
X*`20`20`20`20`20`20`20`5B!SET`5D`20or`20`5B`5ESET`5D`20matches`20any`20charact
Ver`20not`20in`20the`20specified`20set.
X*
X*`20`20Note:`20the`20standard`20regex`20character`20'+'`20(one`20or`20more)
V`20should`20by
X*`20`20`20`20`20`20`20`20simulated`20by`20using`20"?*"`20which`20is`20equivela
Vnt`20here.
X*
X*`20`20A`20set`20is`20composed`20of`20characters`20or`20ranges;`20a`20range
V`20looks`20like
X*`20`20character`20hyphen`20character`20(as`20in`200-9`20or`20A-Z).
X*`20`20`5B0-9a-zA-Z_`5D`20is`20the`20set`20of`20characters`20allowed`20in`20C
V`20identifiers.
X*`20`20Any`20other`20character`20in`20the`20pattern`20must`20be`20matched`20ex
Vactly.
X*
X*`20`20To`20suppress`20the`20special`20syntactic`20significance`20of`20any`20o
Vf`20`60`5B`5D*?!`5E-`5C',
X*`20`20and`20match`20the`20character`20exactly,`20precede`20it`20with`20a`20
V`60`5C'.
X*
X----------------------------------------------------------------------------*/
V
X
XBOOLEAN`20match`20(`20/*`20char`20*pattern,`20char`20*text`20*/`20);
X
X/*----------------------------------------------------------------------------
V
X*
X*`20Return`20TRUE`20if`20PATTERN`20has`20any`20special`20wildcard`20characters
V
X*
X----------------------------------------------------------------------------*/
V
X
XBOOLEAN`20is_pattern`20(`20/*`20char`20*pattern`20*/`20);
X
X/*`20--`20end`20of`20match.h`20`20P.`20Ross`20--`20*/
X
X#define`20ABORT`202`20`20`20`20`20/*`20end`20of`20search`20indicator`20*/
X
XBOOLEAN`20regex_match_after_star`20(`20/*`20char`20*pattern,`20char`20*text
V`20*/`20);
X
X/*----------------------------------------------------------------------------
V
X*
X*`20Return`20TRUE`20if`20PATTERN`20has`20any`20special`20wildcard`20characters
V
X*
X----------------------------------------------------------------------------*/
V
X
XBOOLEAN`20is_pattern`20(p)
Xchar`20*p;
X`7B
X`20`20`20`20while`20(`20*p`20)`20`7B
X`20`20`20`20`20`20`20`20switch`20(`20*p++`20)`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20case`20'?':
X`20`20`20`20`20`20`20`20`20`20`20`20case`20'*':
X`20`20`20`20`20`20`20`20`20`20`20`20case`20'`5B':
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return`20TRUE;
X`20`20`20`20`20`20`20`20`20`20`20`20case`20'`5C`5C':
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20if`20(`20!*p++`20)`20return
V`20FALSE;
X`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`7D
X`20`20`20`20return`20FALSE;
X`7D
X
X
X/*----------------------------------------------------------------------------
V
X*
X*`20`20Match`20the`20pattern`20PATTERN`20against`20the`20string`20TEXT;
X*`20`20return`20TRUE`20if`20it`20matches,`20FALSE`20otherwise.
X*
X*`20`20A`20match`20means`20the`20entire`20string`20TEXT`20is`20used`20up`20in
V`20matching.
X*
X*`20`20In`20the`20pattern`20string:
X*`20`20`20`20`20`20`20`60*'`20matches`20any`20sequence`20of`20characters
X*`20`20`20`20`20`20`20`60?'`20matches`20any`20character
X*`20`20`20`20`20`20`20`5BSET`5D`20matches`20any`20character`20in`20the`20speci
Vfied`20set,
X*`20`20`20`20`20`20`20`5B!SET`5D`20or`20`5B`5ESET`5D`20matches`20any`20charact
Ver`20not`20in`20the`20specified`20set.
X*
X*`20`20Note:`20the`20standard`20regex`20character`20'+'`20(one`20or`20more)
V`20should`20by
X*`20`20`20`20`20`20`20`20simulated`20by`20using`20"?*"`20which`20is`20equivela
Vnt`20here.
X*
X*`20`20A`20set`20is`20composed`20of`20characters`20or`20ranges;`20a`20range
V`20looks`20like
X*`20`20character`20hyphen`20character`20(as`20in`200-9`20or`20A-Z).
X*`20`20`5B0-9a-zA-Z_`5D`20is`20the`20set`20of`20characters`20allowed`20in`20C
V`20identifiers.
X*`20`20Any`20other`20character`20in`20the`20pattern`20must`20be`20matched`20ex
Vactly.
X*
X*`20`20To`20suppress`20the`20special`20syntactic`20significance`20of`20any`20o
Vf`20`60`5B`5D*?!`5E-`5C',
X*`20`20and`20match`20the`20character`20exactly,`20precede`20it`20with`20a`20
V`60`5C'.
X*
X----------------------------------------------------------------------------*/
V
X
XBOOLEAN`20regex_match`20(p,`20t)
Xregister`20char`20*p;
Xregister`20char`20*t;
X`7B
X`20`20`20`20register`20char`20range_start,`20range_end;`20`20/*`20start`20and
V`20end`20in`20range`20*/
X
X`20`20`20`20BOOLEAN`20invert;`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20is
V`20this`20`5B..`5D`20or`20`5B!..`5D`20*/
X`20`20`20`20BOOLEAN`20member_match;`20`20`20`20`20`20`20/*`20have`20I`20matche
Vd`20the`20`5B..`5D`20construct?`20*/
X`20`20`20`20BOOLEAN`20loop;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20s
Vhould`20I`20terminate?`20*/
X
X`20`20`20`20for`20(`20;`20*p;`20p++,`20t++`20)`20`7B
X
X`20`20`20`20`20`20`20`20/*`20if`20this`20is`20the`20end`20of`20the`20text`20th
Ven`20this`20is`20the`20end`20of`20the`20match`20*/
X`20`20`20`20`20`20`20`20if`20(!*t)`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20return`20(`20*p`20==`20'*'`20`26`26`20*++p
V`20==`20'`5C0'`20)`20?`20TRUE`20:`20ABORT;
X`20`20`20`20`20`20`20`20`7D
X
X`20`20`20`20`20`20`20`20/*`20determine`20and`20react`20to`20pattern`20type`20*
V/
X`20`20`20`20`20`20`20`20switch`20(`20*p`20)`20`7B
X
X`20`20`20`20`20`20`20`20`20`20`20`20/*`20single`20any`20character`20match`20*/
V
X`20`20`20`20`20`20`20`20`20`20`20`20case`20'?':
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20break;
X
X`20`20`20`20`20`20`20`20`20`20`20`20/*`20multiple`20any`20character`20match
V`20*/
X`20`20`20`20`20`20`20`20`20`20`20`20case`20'*':
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return`20regex_match_after_sta
Vr`20(p,`20t);
X
X`20`20`20`20`20`20`20`20`20`20`20`20/*`20`5B..`5D`20construct,`20single`20memb
Ver/exclusion`20character`20match`20*/
X`20`20`20`20`20`20`20`20`20`20`20`20case`20'`5B':`20`7B
X
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20move`20to`20beginning`20o
Vf`20range`20*/
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20p++;
X
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20check`20if`20this`20is
V`20a`20member`20match`20or`20exclusion`20match`20*/
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20invert`20=`20FALSE;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20if`20(`20*p`20==`20'!'`20`7C
V`7C`20*p`20==`20'`5E')`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20invert`20=`20TRUE;
V
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20p++;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D
X
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20if`20closing`20bracket
V`20here`20or`20at`20range`20start`20then`20we`20have`20a
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20malformed`20pattern
V`20*/
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20if`20(`20*p`20==`20'`5D'`20)
V`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return`20ABORT;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D
X
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20member_match`20=`20FALSE;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20loop`20=`20TRUE;
X
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20while`20(`20loop`20)`20`7B
X
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20if`20end`20of
V`20construct`20then`20loop`20is`20done`20*/
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20if`20(*p`20==`20'
V`5D')`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20loop
V`20=`20FALSE;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20contin
Vue;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D
X
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20matching`20a
V`20'!',`20'`5E',`20'-',`20'`5C'`20or`20a`20'`5D'`20*/
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20if`20(`20*p`20==
V`20'`5C`5C'`20)`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20range_
Vstart`20=`20range_end`20=`20*++p;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20else`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20range_
Vstart`20=`20range_end`20=`20*p;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D
X
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20if`20end`20of
V`20pattern`20then`20bad`20pattern`20(Missing`20'`5D')`20*/
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20if`20(!range_start
V)
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return
V`20ABORT;
X
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20move`20to`20n
Vext`20pattern`20char`20*/
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20p++;
X
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20check`20for
V`20range`20bar`20*/
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20if`20(*p`20==`20'-
V')`20`7B
X
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20g
Vet`20the`20range`20end`20*/
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20range_
Vend`20=`20*++p;
X
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20s
Vpecial`20character`20range`20end`20*/
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20if`20(
Vrange_end`20==`20'`5C`5C')
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20
V`20`20`20range_end`20=`20*++p;
X
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20i
Vf`20end`20of`20pattern`20or`20construct`20then`20bad`20pattern`20*/
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20if`20(
Vrange_end`20==`20'`5C0'`20`7C`7C`20range_end`20==`20'`5D')
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20
V`20`20`20return`20ABORT;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D
X
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20if`20the`20te
Vxt`20character`20is`20in`20range`20then`20match`20found.
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20make`20su
Vre`20the`20range`20letters`20have`20the`20proper
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20relations
Vhip`20to`20one`20another`20before`20comparison`20*/
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20if`20(`20range_sta
Vrt`20<`20range_end`20`20)`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20if`20(
V*t`20>=`20range_start`20`26`26`20*t`20<=`20range_end)`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20
V`20`20`20member_match`20=`20TRUE;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20
V`20`20`20loop`20=`20FALSE;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20else`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20if`20(
V*t`20>=`20range_end`20`26`26`20*t`20<=`20range_start)`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20
V`20`20`20member_match`20=`20TRUE;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20
V`20`20`20loop`20=`20FALSE;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D
X
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20if`20there`20was`20a`20ma
Vtch`20in`20an`20exclusion`20set`20then`20no`20match`20*/
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20if`20there`20was`20no`20m
Vatch`20in`20a`20member`20set`20then`20no`20match`20*/
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20if`20((invert`20`26`26`20membe
Vr_match)`20`7C`7C
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20!(invert`20`7C`7C`20m
Vember_match))
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return`20FALSE;
X
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20if`20this`20is`20not`20an
V`20exclusion`20then`20skip`20the`20rest`20of`20the`20`5B...`5D
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20construct`20that
V`20already`20matched.`20*/
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20if`20(member_match)`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20while`20(*p`20!=
V`20'`5D')`20`7B
X
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20b
Vad`20pattern`20(Missing`20'`5D')`20*/
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20if`20(
V!*p)
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20
V`20`20`20return`20ABORT;
X
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20s
Vkip`20exact`20match`20*/
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20if`20(
V*p`20==`20'`5C`5C')`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20
V`20`20`20p++;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D
X
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20m
Vove`20to`20next`20pattern`20char`20*/
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20p++;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D
X
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20break;
X`20`20`20`20`20`20`20`20`20`20`20`20`7D
X
X`20`20`20`20`20`20`20`20`20`20`20`20/*`20next`20character`20is`20quoted`20and
V`20must`20match`20exactly`20*/
X`20`20`20`20`20`20`20`20`20`20`20`20case`20'`5C`5C':
X
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20move`20pattern`20pointer
V`20to`20quoted`20char`20and`20fall`20through`20*/
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20p++;
X
X`20`20`20`20`20`20`20`20`20`20`20`20/*`20must`20match`20this`20character`20exa
Vctly`20*/
X`20`20`20`20`20`20`20`20`20`20`20`20default:
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20if`20(*p`20!=`20*t)
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return`20FALSE;
X`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`7D
X
X`20`20`20`20/*`20if`20end`20of`20text`20not`20reached`20then`20the`20pattern
V`20fails`20*/
X`20`20`20`20return`20!*t;
X`7D
X
X
X/*----------------------------------------------------------------------------
V
X*
X*`20recursively`20call`20regex_match`20with`20final`20segment`20of`20PATTERN
V`20and`20of`20TEXT.
X*
X----------------------------------------------------------------------------*/
V
X
XBOOLEAN`20regex_match_after_star`20(p,`20t)
Xregister`20char`20*p;
Xregister`20char`20*t;
X`7B
X`20`20`20`20register`20BOOLEAN`20match;
X`20`20`20`20register`20nextp;
X
X`20`20`20`20/*`20pass`20over`20existing`20?`20and`20*`20in`20pattern`20*/
X`20`20`20`20while`20(`20*p`20==`20'?'`20`7C`7C`20*p`20==`20'*'`20)`20`7B
X
X`20`20`20`20`20`20`20`20/*`20take`20one`20char`20for`20each`20?`20*/
X`20`20`20`20`20`20`20`20if`20(`20*p`20==`20'?'`20)`20`7B
X
X`20`20`20`20`20`20`20`20`20`20`20`20/*`20if`20end`20of`20text`20then`20no`20ma
Vtch`20*/
X`20`20`20`20`20`20`20`20`20`20`20`20if`20(`20!*t++`20)`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return`20ABORT;
X`20`20`20`20`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`20`20`20`20`7D
X
X`20`20`20`20`20`20`20`20/*`20move`20to`20next`20char`20in`20pattern`20*/
X`20`20`20`20`20`20`20`20p++;
X`20`20`20`20`7D
X
X`20`20`20`20/*`20if`20end`20of`20pattern`20we`20have`20matched`20regardless
V`20of`20text`20left`20*/
X`20`20`20`20if`20(`20!*p`20)`20`7B
X`20`20`20`20`20`20`20`20return`20TRUE;
X`20`20`20`20`7D
X
X`20`20`20`20/*`20get`20the`20next`20character`20to`20match`20which`20must`20be
V`20a`20literal`20or`20'`5B'`20*/
X`20`20`20`20nextp`20=`20*p;
X`20`20`20`20if`20(`20nextp`20==`20'`5C`5C'`20)
X`20`20`20`20`20`20`20`20nextp`20=`20p`5B1`5D;
X
X`20`20`20`20/*`20Continue`20until`20we`20run`20out`20of`20text`20or`20definite
V`20result`20seen`20*/
X`20`20`20`20match`20=`20FALSE;
X`20`20`20`20while`20(`20match`20==`20FALSE`20)`20`7B
X
X`20`20`20`20`20`20`20`20/*`20a`20precondition`20for`20matching`20is`20that`20t
Vhe`20next`20character
X`20`20`20`20`20`20`20`20`20`20`20in`20the`20pattern`20match`20the`20next`20cha
Vracter`20in`20the`20text`20or`20that
X`20`20`20`20`20`20`20`20`20`20`20the`20next`20pattern`20is`20the`20beginning
V`20of`20a`20range.`20`20Increment`20text
X`20`20`20`20`20`20`20`20`20`20`20pointer`20as`20we`20go`20here`20*/
X`20`20`20`20`20`20`20`20if`20(`20*p`20==`20*t`20`7C`7C`20nextp`20==`20'`5B'
V`20)`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20match`20=`20regex_match(p,`20t);
X`20`20`20`20`20`20`20`20`7D
X
X`20`20`20`20`20`20`20`20/*`20if`20the`20end`20of`20text`20is`20reached`20then
V`20no`20match`20*/
X`20`20`20`20`20`20`20`20if`20(`20!*t++`20)`20match`20=`20ABORT;
X`20`20`20`20`7D
X
X`20`20`20`20/*`20return`20result`20*/
X`20`20`20`20return`20match;
X`7D
X
X/*----------------------------------------------------------------------------
V
X*
X*`20This`20is`20a`20shell`20to`20regex_match`20to`20return`20only`20a`20true
V`20BOOLEAN`20value
X*
X----------------------------------------------------------------------------*/
V
X
XBOOLEAN`20match(p,`20t)
Xchar`20*p;
Xchar`20*t;
X`7B
X`20`20`20`20return`20(`20regex_match(p,t)`20==`20TRUE`20)`20?`20TRUE`20:`20FAL
VSE;
X`7D
$ call unpack FLIST_UNIX.C;1 1711290471 ""
$!
$ create 'f'
X/*`09flist_vms.c`09`094/24/92
X`20*
X`20*`20Copyright`201992`20`20Earle`20Ake`20and`20Perry`20Ross
X`20*
X`20*`20Permission`20to`20use,`20copy,`20modify,`20and`20distribute`20this`20so
Vftware`20and`20its
X`20*`20documentation`20without`20fee`20is`20hereby`20granted,`20subject`20to
V`20the`20restrictions
X`20*`20detailed`20in`20the`20README`20file,`20which`20is`20included`20here`20b
Vy`20reference.
X`20*`20Any`20other`20use`20requires`20written`20permission`20from`20the`20auth
Vor.`20`20This`20software
X`20*`20is`20distributed`20"as`20is"`20without`20any`20warranty,`20including
V`20any`20implied
X`20*`20warranties`20of`20merchantability`20or`20fitness`20for`20a`20particular
V`20purpose.
X`20*`20The`20author`20shall`20not`20be`20liable`20for`20any`20damages`20result
Ving`20from`20the
X`20*`20use`20of`20this`20software.`20`20By`20using`20this`20software,`20the
V`20user`20agrees
X`20*`20to`20these`20terms.
X`20*/
X
X#include`20"ldb.h"
X
X
X/*----------------------------------------------------------------------
X`20*`09filelist`20--`20generate`20a`20list`20of`20all`20matching`20files.
X`20*
X`20*`20This`20function`20generates`20a`20list`20of`20all`20files`20that`20matc
Vh`20a`20pattern.
X`20*`20Each`20file`20is`20stored`20in`20an`20instance`20of`20struct`20flist,
V`20which`20just
X`20*`20links`20the`20names`20in`20a`20linked`20list.`20`20A`20pointer`20to`20t
Vhe`20beginning`20of
X`20*`20the`20list`20is`20returned.`20`20It`20is`20the`20callers`20responsibili
Vty`20to`20free
X`20*`20the`20list`20when`20it`20is`20no`20longer`20needed.
X`20*----------------------------------------------------------------------
X`20*/
X
Xstruct`20flist`20*filelist(ptn)
Xchar`20*ptn;
X`7B
Xchar`20nextfile`5B257`5D;
Xint`20context`20=`200;
Xstruct`20flist`20*head,`20*tail,`20*cur;
X
Xhead`20=`20NULL;
Xwhile`20(1)`20`7B
X`09if`20(scan_files(ptn,`26nextfile,`26context)`20==`200)
X`09`09return(head);
X`09if`20(`20(cur`20=`20(struct`20flist`20*)`20calloc(sizeof(struct`20flist),1)
V)`20==`20NULL)
X`09`09fatal("Out`20of`20memory!");
X`09if`20(head`20==`20NULL)`20`7B
X`09`09head`20=`20cur;
X`09`09tail`20=`20cur;
X`09`09`7D
X`09else`20`7B
X`09`09tail->next`20=`20cur;
X`09`09tail`20=`20cur;
X`09`09`7D
X`09cur->name`20=`20save(nextfile);
X`09`7D
X`7D
X
X
X/*----------------------------------------------------------------------
X`20*`09scan_files`20--`20find`20the`20next`20file`20matching`20a`20pattern
X`20*
X`20*`20This`20function`20finds`20the`20next`20(or`20first)`20file`20matching
V`20a`20given
X`20*`20pattern.`20`20The`20pattern`20is`20interpreted`20in`20the`20same`20way
V`20as`20DCL.
X`20*`20If`20the`20pattern`20does`20not`20specify`20a`20version`20number,`20';*
V'`20is
X`20*`20the`20default.`20`20scan_files`20returns`201`20if`20a`20file`20was`20fo
Vund,
X`20*`200`20if`20there`20are`20no`20more`20matching`20files.
X`20*----------------------------------------------------------------------
X`20*/
X
Xint`20scan_files(itm_files,nextfile,context)
X`09char`20*itm_files,`20*nextfile;
X`09int`20*context;
X`7B
X`09char`20*def_spec`20=`20";*";
X`09int`20status;
X`09unsigned`20key`5B2`5D;
X`09char`20fnam`5B257`5D,`20*s;
X`09static`20struct`20RAB`20itmrab;
X`09static`20struct`20dsc$descriptor`20itm_dsc,`20defspec_dsc;
X`09$DESCRIPTOR(fnam_dsc,fnam);
X
X`09if`20(*context`20==`200)`20`7B
X`09`09itm_dsc.dsc$w_length`20=`20strlen(itm_files);
X`09`09itm_dsc.dsc$b_dtype`20=`20DSC$K_DTYPE_T;
X`09`09itm_dsc.dsc$b_class`20=`20DSC$K_CLASS_S;
X`09`09itm_dsc.dsc$a_pointer`20=`20itm_files;
X
X`09`09defspec_dsc.dsc$w_length`20=`20strlen(def_spec);
X`09`09defspec_dsc.dsc$b_dtype`20=`20DSC$K_DTYPE_T;
X`09`09defspec_dsc.dsc$b_class`20=`20DSC$K_CLASS_S;
X`09`09defspec_dsc.dsc$a_pointer`20=`20def_spec;
X
X`09`09itmrab.rab$l_kbf`20=`20(char`20*)`20key;
X`09`09itmrab.rab$b_krf`20=`200;
X`09`09itmrab.rab$b_ksz`20=`208;
X`09`09itmrab.rab$l_rop`20=`20RAB$M_RRL`20`7C`20RAB$M_NLK`20;
X`09`09itmrab.rab$b_rac`20=`20RAB$C_KEY;
X`09`7D
X
X`09if`20((status`20=`20lib$find_file(`26itm_dsc,`26fnam_dsc,context,
X`09`09`26defspec_dsc,0,0,0))`20`26`201)`20`7B
X
X`09`09fnam`5B256`5D`20=`20'`5C0';
X
X`09`09if`20(s`20=`20strchr(fnam,'`20'))`20*s`20=`20'`5C0';
X`09`09strcpy(nextfile,`26fnam);
X`09`09return`201;
X`09`09`7D
X`09else`20`7B
X`09`09lib$find_file_end(context);
X`09`7D
X`09return`200;
X`7D
$ call unpack FLIST_VMS.C;1 573836067 ""
$!
$ create 'f'
X/*`09game.c`09`098/3/91
X`20*
X`20*`20Copyright`201991`20`20Perry`20R.`20Ross
X`20*
X`20*`20Permission`20to`20use,`20copy,`20modify,`20and`20distribute`20this`20so
Vftware`20and`20its
X`20*`20documentation`20without`20fee`20is`20hereby`20granted,`20subject`20to
V`20the`20restrictions
X`20*`20detailed`20in`20the`20README`20file,`20which`20is`20included`20here`20b
Vy`20reference.
X`20*`20Any`20other`20use`20requires`20written`20permission`20from`20the`20auth
Vor.`20`20This`20software
X`20*`20is`20distributed`20"as`20is"`20without`20any`20warranty,`20including
V`20any`20implied
X`20*`20warranties`20of`20merchantability`20or`20fitness`20for`20a`20particular
V`20purpose.
X`20*`20The`20author`20shall`20not`20be`20liable`20for`20any`20damages`20result
Ving`20from`20the
X`20*`20use`20of`20this`20software.`20`20By`20using`20this`20software,`20the
V`20user`20agrees
X`20*`20to`20these`20terms.
X`20*/
X
X#include`20"ldb.h"
X
X/*----------------------------------------------------------------------
X`20*`09startgame`20--`20start`20a`20game
X`20*
X`20*`20This`20function`20is`20called`20in`20response`20to`20the`20-start`20com
Vmand`20line
X`20*`20option`20to`20start`20a`20game`20with`20another`20user.`20`20It`20alloc
Vates`20a`20game
X`20*`20record`20and`20fills`20it`20in,`20then`20sends`20a`20START`20packet`20t
Vo`20the`20opponent.
X`20*`20The`20arguments`20are:
X`20*`09The`20email`20address`20of`20the`20opponent
X`20*`09The`20direction`20I`20want`20to`20play
X`20*`09The`20color`20I`20want`20to`20play
X`20*`09The`20color`20I`20want`20the`20opponent`20to`20play
X`20*`09The`20F_JACOBY/F_CRAWFORD/F_EUROPE/F_INVERT/F_PERM`20flags,`20if`20desi
Vred.
X`20*`09The`20match`20value`20(number`20of`20points`20to`20play`20to)
X`20*`09The`20time`20to`20use`20as`20the`20start`20time`20of`20the`20game`20(0
V`20=`20current`20time)
X`20*----------------------------------------------------------------------
X`20*/
X
Xstruct`20game`20*startgame(addr,d,mc,oc,flgs,mch,stime)
Xchar`20*addr;`09`09`09/*`20path`20to`20opponent`20*/
Xint`20d;`09`09`09`09/*`20my`20direction`20*/
Xchar`20mc,`20oc;`09`09`09/*`20my`20color,`20opponent's`20color`20*/
Xint`20flgs;`09`09`09/*`20flags`20(F_*)`20*/
Xint`20mch;`09`09`09/*`20match`20score`20*/
Xlong`20stime;`09`09`09/*`20start`20time`20(0`20=`20current`20time)`20*/
X`7B
Xstruct`20game`20*g;
Xchar`20c1,`20c2,`20*newid;
Xstruct`20people`20*ppl;
X
Xnewid`20=`20makeid();`09`09/*`20give`20it`20a`20unique`20id`20*/
Xg`20=`20addgame();`09`09`09/*`20allocate`20new`20game`20*/
Xg->gameid`20=`20newid;`09`09/*`20store`20new`20id`20*/
Xif`20(rc.debug`20`26`20DB_GSTART)`20`7B
X`09message("DB-startgame:`5Ctstarted`20game`20%s`5Cn",newid);
X`09message("`5Ct`5Ctwith`20%s`20flags=%04x`20match=%d`5Cn",addr,flgs,mch);
X`09`7D
Xif`20(`20(ppl`20=`20findppl(addr,P_ADDR`7CP_ALIAS))`20!=`20NULL)`20`7B`09/*
V`20we`20know`20this`20guy`20*/
X`09g->opaddr`20=`20save(ppl->addr);`09/*`20copy`20out`20people`20info`20*/
X`09g->opname`20=`20save(ppl->name);
X`09g->myaddr`20=`20save(ppl->myaddr);
X`09g->ppl`20=`20ppl;
X`09`7D
Xelse`20`7B`09`09`09`09`09/*`20new`20opponent`20*/
X`09g->opaddr`20=`20save(addr);`09`09/*`20save`20his`20address`20*/
X`09g->opname`20=`20NULL;`09`09/*`20don't`20know`20his`20name`20yet`20*/
X`09g->myaddr`20=`20save(rc.myaddr);`09/*`20store`20my`20return`20address`20*/
X`09newppl(g);`09`09`09/*`20make`20up`20a`20people`20record`20*/
X`09`7D
Xg->mycolor`20=`20mc;`09`09/*`20set`20starting`20colors`20*/
Xg->opcolor`20=`20oc;
Xg->mydir`20=`20d;`09`09`09/*`20set`20starting`20directions`20*/
Xg->opdir`20=`20REV(d);
Xg->gameval`20=`201;`09`09`09/*`20no`20doubles`20yet`20*/
Xg->adcnt`20=`200;`09`09`09/*`20no`20autodoubles`20yet`20*/
Xg->admax`20=`20rc.autodouble;`09/*`20max`20allowed`20autodoubles`20*/
Xg->flags`20=`20flgs`20`26`20(F_JACOBY`7CF_CRAWFORD`7CF_PERM`7CF_EUROPE`7CF_INV
VERT);
Xg->state`20=`20ST_OPSTART;`09`09/*`20need`20to`20send`20first`20roll`20*/
Xg->seq`20=`201;`09`09`09/*`20start`20with`20sequence`20number`20=`201`20*/
Xg->notify`20=`20notify;`09`09/*`20copy`20notify`20address`20(if`20any)`20*/
Xif`20(d`20>`200)`20`7B
X`09c1`20=`20mc;`09/*`20upbound`20color`20is`20mine`20*/
X`09c2`20=`20oc;`09/*`20downbound`20color`20is`20opponent's`20*/
X`09`7D
Xelse`20`7B
X`09c1`20=`20oc;`09/*`20upbound`20color`20is`20opponent's`20*/
X`09c2`20=`20mc;`09/*`20downbound`20color`20is`20mine`20*/
X`09`7D
Xclearmvs(g->mvs);
Xclearmvs(g->opmvs);
Xnewboard(g->opbd,c1,c2);`09/*`20set`20up`20boards`20for`20new`20game`20*/
Xnewboard(g->mybd,c1,c2);
Xnewboard(g->board,c1,c2);
Xg->mtotal`20=`20mch;
Xg->mvs`5B0`5D.roll`20=`20Rolldie();`09/*`20roll`20an`20initial`20die`20*/
Xif`20(stime`20==`200L)
X`09g->starttime`20=`20time(`20(long`20*)`200);
Xelse
X`09g->starttime`20=`20stime;`09/*`20hack`20to`20detect`20duplicate`20remotesta
Vrt`20pkts`20*/
Xg->lastacc`20=`20g->starttime;
Xsendpkt(g,START);`09`09/*`20send`20the`20start`20message`20*/
Xreturn(g);`09`09`09/*`20and`20return`20pointer`20to`20new`20game`20*/
X`7D
X
X
X/*----------------------------------------------------------------------
X`20*`09makeid`20--`20create`20a`20unique`20game`20identifier.
X`20*
X`20*`20This`20function`20creates`20a`20string`20that`20is`20guaranteed`20uniqu
Ve`20among`20all
X`20*`20ldb`20games`20worldwide,`20provided`20that`20email`20addresses`20are
V`20unique.
X`20*`20This`20should`20be`20a`20good`20assumption,`20since`20if`20there`20is
V`20a`20duplicate,
X`20*`20the`20users`20with`20the`20duplicate`20id's`20will`20have`20a`20great
V`20deal`20of`20difficulty
X`20*`20getting`20mail`20delivered,`20and`20therefore`20won't`20be`20able`20to
V`20play`20ldb`20anyway.
X`20*`20To`20make`20id's`20created`20by`20the`20same`20user`20unique,`20the`20t
Vime`20is
X`20*`20appended`20to`20the`20mail`20address;`20to`20make`20sure`20the`20time
V`20is`20unique`20when
X`20*`20the`20user`20creates`20more`20than`201`20game`20per`20second,`20the`20g
Vames`20list`20is`20searched
X`20*`20for`20a`20new`20id`20before`20it`20is`20returned`20and,`20if`20it`20is
V`20found,`20we`20sleep`20for
X`20*`201`20second`20and`20try`20again.
X`20*----------------------------------------------------------------------
X`20*/
X
Xchar`20*makeid()
X`7B
Xchar`20*n;
X
Xif`20(`20(n`20=`20calloc(strlen(rc.myaddr)+10,1))`20==`20NULL)
X`09fatal("ERROR:`20Out`20of`20memory!");
Xdo`20`7B
X`09sprintf(n,"%s`7C%08x",rc.myaddr,time((long`20*)0));
X`09if`20(findgame(n)`20==`20NULL)
X`09`09return(n);
X`09sleep(1);
X`09`7D`20while`20(1);
X`7D
X
X
X/*---------------------------------------------------------------------------
X`20*`09addgame`20--`20allocate`20a`20game`20struct`20and`20link`20it`20into
V`20the`20game`20list
X`20*
X`20*`20This`20function`20allocates`20a`20game`20structure`20and`20links`20it
V`20into`20the
X`20*`20doubly-linked`20game`20list.`20`20The`20head`20of`20this`20list`20is
V`20ghead,`20and`20the
X`20*`20tail`20is`20gtail.
X`20*
X`20*`20NOTE:`20the`20memory-zeroing`20feature`20of`20calloc`20is`20depended
V`20on`20to
X`20*`09`20initialize`20the`20allocated`20game`20struct.
X`20*--------------------------------------------------------------------------
V-
X`20*/
X
Xstruct`20game`20*addgame()
X`7B
Xstruct`20game`20*g;
X
Xif`20(`20(g`20=`20(struct`20game`20*)calloc(sizeof(struct`20game),1))`20==`20N
VULL)
X`09fatal("Out`20of`20memory!");
Xg->next`20=`20NULL;
Xif`20(gtail`20==`20NULL)`20`7B`09`09/*`20this`20is`20the`20first`20game`20in
V`20the`20list`20*/
X`09ghead`20=`20g;
X`09gtail`20=`20g;
X`09g->prev`20=`20NULL;
X`09`7D
Xelse`20`7B
X`09g->prev`20=`20gtail;`09/*`20link`20onto`20end`20of`20list`20*/
X`09gtail->next`20=`20g;
X`09gtail`20=`20g;
X`09`7D
Xreturn(g);
X`7D
X
X
X/*----------------------------------------------------------------------
X`20*`09deletegame`20--`20delete`20a`20game`20from`20the`20game`20list
X`20*
X`20*`20This`20function`20removes`20a`20game`20from`20the`20game`20list`20by
V`20linking`20around
X`20*`20it,`20then`20frees`20the`20memory`20associated`20with`20the`20game`20st
Vructure.
X`20*----------------------------------------------------------------------
X`20*/
X
Xdeletegame(g)
Xstruct`20game`20*g;
X`7B
X
Xif`20(g`20==`20ghead)`20`7B`09`09/*`20deleting`20first`20game`20in`20list`20*/
V
X`09ghead`20=`20g->next;`09/*`20move`20head`20pointer`20to`20next`20game`20*/
X`09if`20(ghead`20==`20NULL)`09/*`20we`20just`20deleted`20the`20last`20game`20*
V/
X`09`09gtail`20=`20NULL;`09/*`20set`20both`20ptrs`20to`20NULL`20*/
X`09else
X`09`09ghead->prev`20=`20NULL;`09/*`20first`20in`20list`20has`20no`20prev`20*/
X`09`7D
Xelse`20if`20(g`20==`20gtail)`20`7B`09`09/*`20deleting`20last`20game`20in`20lis
Vt`20*/
+-+-+-+-+-+-+-+- END OF PART 9 +-+-+-+-+-+-+-+-