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 >
Internet Message Format  |  1993-04-07  |  49KB

  1. 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
  2. From: ake@dayvd.dayton.saic.com (Earle Ake)
  3. Newsgroups: vmsnet.sources.games
  4. Subject: ldb - Long Distance Backgammon [09/16]
  5. Date: 8 Apr 93 10:58:16 EST
  6. Organization: Science Applications Intl Corp - Dayton, OH
  7. Lines: 1361
  8. Message-ID: <1993Apr8.105816.1@dayvd.dayton.saic.com>
  9. NNTP-Posting-Host: dayvd.dayton.saic.com
  10. Xref: uunet vmsnet.sources.games:670
  11.  
  12. -+-+-+-+-+-+-+-+ START OF PART 9 -+-+-+-+-+-+-+-+
  13. X`09`09`09continue;`09`09/*`20keep`20looking`20*/
  14. X`09`09FeOnMenuItem(m,c);`09`09/*`20highlight`20selection`20*/
  15. X`09`09return(c);
  16. X`09`09`7D
  17. X`09FeMessage("Invalid`20command.");
  18. X`09`7D
  19. X`7D
  20. X
  21. X
  22. X/*----------------------------------------------------------------------
  23. X`20*`09FeMessage`20--`20print`20a`20highlighted`20message`20on`20bottom`20line
  24. V
  25. X`20*
  26. X`20*`20This`20function`20prints`20a`20string`20in`20reverse`20video`20on`20lin
  27. Ve`2023.
  28. X`20*`20The`20message`20length`20is`20restricted`20to`2062`20characters`20to
  29. V`20avoid
  30. X`20*`20running`20into`20the`20menu`20box.`20`20If`20NULL`20is`20passed`20as
  31. V`20a`20message,
  32. X`20*`20the`20message`20line`20is`20cleared.
  33. X`20*----------------------------------------------------------------------
  34. X`20*/
  35. X
  36. XFeMessage(s)
  37. Xchar`20*s;
  38. X`7B
  39. Xchar`20c`20=`200;
  40. X
  41. Xmvaddstr(23,0,BLANKS(62));`09`09/*`20clear`20message`20line`20*/
  42. Xif`20(s`20!=`20NULL)`20`7B`09`09/*`20if`20we`20have`20a`20message`20to`20print
  43. V`20*/
  44. X`09if`20(strlen(s)`20>`2062)`20`7B`09/*`20check`20that`20it's`20not`20too`20lo
  45. Vng`20*/
  46. X`09`09c`20=`20s`5B62`5D;`09/*`20save`20char`20at`20this`20position`20*/
  47. X`09`09s`5B62`5D`20=`20'`5C0';`09/*`20and`20end`20the`20string`20*/
  48. X`09`09`7D
  49. X`09move(23,0);
  50. X`09PReverseText();
  51. X`09addstr(s);`09`09/*`20print`20the`20message`20*/
  52. X`09PEndReverse();
  53. X`09if`20(c`20!=`20'`5C0')`09`09/*`20if`20we`20shortened`20it,`20restore`20it
  54. V`20*/
  55. X`09`09s`5B62`5D`20=`20c;
  56. X`09`7D
  57. Xrefresh();
  58. X`7D
  59. X
  60. X
  61. X/*----------------------------------------------------------------------
  62. X`20*`09FeStatusLine`20--`20draw`20string`20on`20status`20line
  63. X`20*
  64. X`20*`20This`20function`20puts`20a`20string`20on`20line`2018`20in`20reverse`20v
  65. Video.`20`20It`20is
  66. X`20*`20used`20to`20display`20blots`20hit,`20double`20offers,`20etc.
  67. X`20*----------------------------------------------------------------------
  68. X`20*/
  69. X
  70. XFeStatusLine(s)
  71. Xchar`20*s;
  72. X`7B
  73. Xchar`20c`20=`200;
  74. Xint`20l;
  75. X
  76. Xmvaddstr(18,10,BLANKS(50));`09/*`20clear`20status`20line`20*/
  77. Xif`20(s`20!=`20NULL)`20`7B`09`09/*`20if`20we`20have`20a`20message`20to`20print
  78. V`20*/
  79. X`09if`20(`20(l`20=`20strlen(s))`20>`2050)`20`7B`09/*`20check`20that`20it's`20n
  80. Vot`20too`20long`20*/
  81. X`09`09c`20=`20s`5B50`5D;`09/*`20save`20char`20at`20this`20position`20*/
  82. X`09`09s`5B50`5D`20=`20'`5C0';`09/*`20and`20end`20the`20string`20*/
  83. X`09`09l`20=`2050;
  84. X`09`09`7D
  85. X`09move(18,(50`20-`20l)/2`20+`2010);
  86. X`09PReverseText();
  87. X`09addstr(s);`09`09/*`20print`20the`20message`20*/
  88. X`09PEndReverse();
  89. X`09if`20(c`20!=`20'`5C0')`09`09/*`20if`20we`20shortened`20it,`20restore`20it
  90. V`20*/
  91. X`09`09s`5B50`5D`20=`20c;
  92. X`09`7D
  93. Xrefresh();
  94. X`7D
  95. X
  96. X
  97. X/*----------------------------------------------------------------------
  98. X`20*`09FeDrawCube`20--`20draw`20doubling`20cube
  99. X`20*
  100. X`20*`20This`20function`20draws`20the`20doubling`20cube.`20`20The`20cube`20is
  101. V`20displayed`20beside
  102. X`20*`20the`20inner`20table`20of`20the`20player`20who`20owns`20it`20(i.e.`20the
  103. V`20one`20who`20didn't
  104. X`20*`20double`20last).`20`20If`20neither`20player`20has`20doubled,`20the`20cub
  105. Ve`20is`20drawn
  106. X`20*`20in`20the`20middle`20of`20the`20board.
  107. X`20*----------------------------------------------------------------------
  108. X`20*/
  109. X
  110. XFeDrawCube(g)
  111. Xstruct`20game`20*g;
  112. X`7B
  113. Xint`20r,`20c;
  114. Xchar`20buf`5B8`5D;
  115. X
  116. Xmvaddstr(3,0,"`20`20`20`20");`09`09/*`20clear`20all`20cube`20locations`20*/
  117. Xmvaddstr(10,0,"`20`20`20`20");
  118. Xmvaddstr(17,0,"`20`20`20`20");
  119. Xif`20(g->gameval`20==`20(1`20<<`20g->adcnt))`09/*`20nobody`20has`20doubled`20*
  120. V/
  121. X`09r`20=`2010;`09`09`09/*`20cube`20is`20in`20the`20middle`20of`20the`20board
  122. V`20*/
  123. Xelse`20`7B`09`09`09/*`20assume`20I`20didn't`20double`20last,`20mydir`20is`20up
  124. V,`20*/
  125. X`09r`20=`200;`09`09/*`20and`20board`20is`20not`20inverted`20*/
  126. X`09if`20(g->flags`20`26`20F_IDOUBLED)`09/*`20if`20I`20did`20double`20last`20*/
  127. V
  128. X`09`09r`20=`201`20-`20r;`09`09/*`20switch`20rows`20*/
  129. X`09if`20(g->mydir`20<`200)`09`09/*`20if`20my`20direction`20is`20down`20*/
  130. X`09`09r`20=`201`20-`20r;`09`09/*`20switch`20rows`20*/
  131. X`09if`20(g->flags`20`26`20F_INVERT)`09/*`20if`20board`20is`20inverted`20*/
  132. X`09`09r`20=`201`20-`20r;`09`09/*`20switch`20rows`20*/
  133. X`09r`20=`20r`20?`2017`20:`203;`09`09`09/*`20which`20row`20am`20I`20left`20with
  134. V?`20*/
  135. X`09`7D
  136. X
  137. Xsprintf(buf,"%d",g->gameval);`09`09/*`20generate`20the`20game`20value`20*/
  138. Xif`20(`20(c`20=`204`20-`20strlen(buf))`20<`200)`20`7B`09/*`20doubled`20past
  139. V`204`20digits?`20*/
  140. X`09strcpy(buf,"****");`09`09/*`20we`20are`20out`20of`20columns`20*/
  141. X`09c`20=`200;
  142. X`09`7D
  143. Xmove(r,c);
  144. XPReverseText();
  145. Xmvaddstr(r,c,buf);`09`09/*`20go`20there`20and`20draw`20game`20value`20*/
  146. XPEndReverse();
  147. X`7D
  148. X
  149. X
  150. X/*----------------------------------------------------------------------
  151. X`20*`09PDrawComment`20--`20print`20a`20comment`20stored`20in`20a`20game
  152. X`20*
  153. X`20*`20This`20function`20takes`20a`20pointer`20to`20a`20game`20and`20draws`20t
  154. Vhe`20comment
  155. X`20*`20strings`20to`20the`20screen.`20`20If`20"who"`20is`20WHO_ME,`20the`20"my
  156. Vcmt"`20strings
  157. X`20*`20are`20drawn`20on`20lines`2019`20and`2020.`20`20Otherwise,`20the`20"opcm
  158. Vt"`20strings
  159. X`20*`20are`20drawn`20on`20lines`2021`20and`2022.`20`20Any`20unused`20space`20o
  160. Vn`20these`20lines
  161. X`20*`20is`20cleared.
  162. X`20*----------------------------------------------------------------------
  163. X`20*/
  164. X
  165. XPRIVATE`20PDrawComment(who,g)
  166. Xint`20who;
  167. Xstruct`20game`20*g;
  168. X`7B
  169. Xint`20line;
  170. Xchar`20*s1,`20*s2;
  171. X
  172. Xline`20=`20(who`20==`20WHO_OPP)`20?`2021`20:`2019;
  173. Xs1`20=`20(who`20==`20WHO_OPP)`20?`20g->opcmt`20:`20g->mycmt;
  174. Xs2`20=`20(who`20==`20WHO_OPP)`20?`20g->opcmt2`20:`20g->mycmt2;
  175. Xmvaddstr(line,6,BLANKS(56));
  176. Xmvaddstr(line+1,6,BLANKS(56));
  177. Xif`20(s1`20!=`20NULL)`20`7B
  178. X`09if`20(strlen(s1)`20>`2056)
  179. X`09`09s1`5B56`5D`20=`20'`5C0';
  180. X`09mvaddstr(line,6,s1);
  181. X`09`7D
  182. Xif`20(s2`20!=`20NULL)`20`7B
  183. X`09if`20(strlen(s2)`20>`2056)
  184. X`09`09s2`5B56`5D`20=`20'`5C0';
  185. X`09mvaddstr(line+1,6,s2);
  186. X`09`7D
  187. X`7D
  188. X
  189. X
  190. X/*----------------------------------------------------------------------
  191. X`20*`09PReverseText`20--`20go`20into`20reverse`20video`20mode
  192. X`20*
  193. X`20*`20This`20function`20goes`20into`20what`20is`20hopefully`20reverse`20video
  194. V.`20`20It
  195. X`20*`20uses`20the`20standout()`20call`20from`20curses,`20which`20actually`20on
  196. Vly
  197. X`20*`20does`20whatever`20:so`20is`20set`20to`20in`20termcap`20(or`20the`20equi
  198. Vvalent
  199. X`20*`20in`20terminfo).`20`20This`20is`20not`20necessarily`20reverse,`20but`20t
  200. Vhe
  201. X`20*`20only`20way`20to`20be`20sure`20of`20getting`20reverse`20(setattr)`20is
  202. V`20not
  203. X`20*`20portable.`20`20For`20VMS,`20the`20standout`20call`20uses`20bold`20rathe
  204. Vr`20than
  205. X`20*`20reverse,`20so`20we`20use`20setattr.
  206. X`20*----------------------------------------------------------------------
  207. X`20*/
  208. X
  209. XPRIVATE`20PReverseText()
  210. X`7B
  211. X
  212. X#ifdef`20VMS
  213. Xsetattr(_REVERSE);
  214. X#else
  215. Xstandout();
  216. X#endif
  217. X`7D
  218. X
  219. X
  220. X/*----------------------------------------------------------------------
  221. X`20*`09PEndReverse`20--`20go`20back`20to`20normal`20text
  222. X`20*
  223. X`20*`20This`20function`20reverses`20PReverseText,`20going`20back`20to`20unhigh
  224. Vlighted`20text.
  225. X`20*----------------------------------------------------------------------
  226. X`20*/
  227. X
  228. XPRIVATE`20PEndReverse()
  229. X`7B
  230. X
  231. X#ifdef`20VMS
  232. Xclrattr(_REVERSE);
  233. X#else
  234. Xstandend();
  235. X#endif
  236. X`7D
  237. X
  238. X
  239. X/*----------------------------------------------------------------------
  240. X`20*`09FeOnMenuItem`20--`20highlight`20a`20menu`20item
  241. X`20*
  242. X`20*`20This`20function`20highlights`20a`20menu`20item.`20`20This`20is`20used
  243. V`20to`20show`20the`20menu
  244. X`20*`20selection`20that`20was`20picked.`20`20It`20stays`20highlighted`20until
  245. V`20FeOffMenuItem
  246. X`20*`20is`20called`20or`20a`20new`20menu`20is`20displayed.
  247. X`20*----------------------------------------------------------------------
  248. X`20*/
  249. X
  250. XFeOnMenuItem(m,p)
  251. Xchar`20*m`5B`5D;
  252. Xchar`20p;
  253. X`7B
  254. Xint`20i;
  255. X
  256. Xfor`20(i`20=`200;`20m`5Bi`5D`20`26`26`20(i`20<`205);`20i++)`20`7B
  257. X`09if`20(*m`5Bi`5D`20==`20p)`20`7B
  258. X`09`09move(19+i,63);
  259. X`09`09clrtoeol();
  260. X`09`09move(19+i,64);
  261. X`09`09PReverseText();
  262. X`09`09addstr(m`5Bi`5D);
  263. X`09`09PEndReverse();
  264. X`09`09`7D
  265. X`09`7D
  266. Xrefresh();
  267. X`7D
  268. X
  269. X
  270. X/*----------------------------------------------------------------------
  271. X`20*`09FeOffMenuItem`20--`20unhighlight`20a`20menu`20item
  272. X`20*
  273. X`20*`20This`20function`20un-highlights`20a`20menu`20item.`20`20This`20is`20use
  274. Vd`20when`20another
  275. X`20*`20pick`20is`20going`20to`20be`20made`20from`20the`20same`20menu.
  276. X`20*----------------------------------------------------------------------
  277. X`20*/
  278. X
  279. XFeOffMenuItem(m,p)
  280. Xchar`20*m`5B`5D;
  281. Xchar`20p;
  282. X`7B
  283. Xint`20i;
  284. X
  285. Xfor`20(i`20=`200;`20m`5Bi`5D`20`26`26`20(i`20<`205);`20i++)`20`7B
  286. X`09if`20(*m`5Bi`5D`20==`20p)`20`7B
  287. X`09`09move(19+i,63);
  288. X`09`09clrtoeol();
  289. X`09`09move(19+i,64);
  290. X`09`09addstr(m`5Bi`5D);
  291. X`09`09`7D
  292. X`09`7D
  293. Xrefresh();
  294. X`7D
  295. X
  296. X
  297. X/*----------------------------------------------------------------------
  298. X`20*`09FeDumpScreen`20--`20copy`20screen`20image`20to`20a`20file
  299. X`20*
  300. X`20*`20This`20function`20reads`20all`20characters`20off`20the`20screen`20and
  301. V`20copies
  302. X`20*`20them`20to`20a`20file.`20`20It`20uses`20the`20inch()`20function`20from
  303. V`20the`20curses
  304. X`20*`20library`20to`20read`20the`20screen.`20`20It`20returns`201`20for`20succe
  305. Vss,`200`20for`20failure.
  306. X`20*----------------------------------------------------------------------
  307. X`20*/
  308. X
  309. XFeDumpScreen(fn)
  310. Xchar`20*fn;
  311. X`7B
  312. XFILE`20*fp;
  313. Xint`20x,`20y;
  314. X
  315. Xif`20(`20(fp`20=`20fopen(fn,"w"))`20==`20NULL)
  316. X`09return(0);
  317. Xfor`20(y`20=`200;`20y`20<`2024;`20y++)`20`7B
  318. X`09for`20(x`20=`200;`20x`20<`2080;`20x++)`20`7B
  319. X`09`09move(y,x);
  320. X`09`09putc(inch(),fp);
  321. X`09`09`7D
  322. X`09putc('`5Cn',fp);
  323. X`09`7D
  324. Xfclose(fp);
  325. X`7D
  326. X
  327. X
  328. X/*----------------------------------------------------------------------
  329. X`20*`09FeYesNo`20--`20see`20if`20user`20knows`20what`20he's`20doing
  330. X`20*
  331. X`20*`20This`20function`20displays`20a`20message`20and`20waits`20for`20a`20sing
  332. Vle`20character
  333. X`20*`20from`20the`20user.`20`20If`20it`20is`20Y`20or`20y,`201`20is`20returned,
  334. V`20otherwise
  335. X`20*`200`20is`20returned.
  336. X`20*----------------------------------------------------------------------
  337. X`20*/
  338. XFeYesNo(msg)
  339. Xchar`20*msg;
  340. X`7B
  341. Xchar`20c;
  342. X
  343. Xif`20(msg`20==`20NULL)
  344. X`09msg`20=`20"Are`20you`20sure?`20`5Byn`5D";
  345. XFeMessage(msg);
  346. Xc`20=`20PGetChr(0,0);
  347. XFeMessage(NULL);
  348. Xreturn(`20(c`20==`20'y')`20`7C`7C`20(c`20==`20'Y')`20);
  349. X`7D
  350. $ call unpack FE_CURSES.C;1 1900969471 ""
  351. $!
  352. $ create 'f'
  353. X/*`09flist_none.c`09`094/24/91
  354. X`20*
  355. X`20*`20Copyright`201991`20`20Perry`20R.`20Ross
  356. X`20*
  357. X`20*`20Permission`20to`20use,`20copy,`20modify,`20and`20distribute`20this`20so
  358. Vftware`20and`20its
  359. X`20*`20documentation`20without`20fee`20is`20hereby`20granted,`20subject`20to
  360. V`20the`20restrictions
  361. X`20*`20detailed`20in`20the`20README`20file,`20which`20is`20included`20here`20b
  362. Vy`20reference.
  363. X`20*`20Any`20other`20use`20requires`20written`20permission`20from`20the`20auth
  364. Vor.`20`20This`20software
  365. X`20*`20is`20distributed`20"as`20is"`20without`20any`20warranty,`20including
  366. V`20any`20implied
  367. X`20*`20warranties`20of`20merchantability`20or`20fitness`20for`20a`20particular
  368. V`20purpose.
  369. X`20*`20The`20author`20shall`20not`20be`20liable`20for`20any`20damages`20result
  370. Ving`20from`20the
  371. X`20*`20use`20of`20this`20software.`20`20By`20using`20this`20software,`20the
  372. V`20user`20agrees
  373. X`20*`20to`20these`20terms.
  374. X`20*/
  375. X
  376. X#include`20"ldb.h"
  377. X
  378. X
  379. X/*----------------------------------------------------------------------
  380. X`20*`09filelist`20--`20generate`20a`20list`20of`20all`20matching`20files.
  381. X`20*
  382. X`20*`20This`20is`20a`20dummy`20function`20that`20can`20be`20used`20to`20disabl
  383. Ve`20filename
  384. X`20*`20matching.`20`20It`20just`20copies`20the`20pattern`20into`20a`201-elemen
  385. Vt`20list
  386. X`20*`20and`20returns`20it.`20`20This`20can`20be`20used`20if`20flist_unix`20doe
  387. Vs`20not`20work,
  388. X`20*`20or`20if`20filename`20matching`20is`20not`20desired.
  389. X`20*----------------------------------------------------------------------
  390. X`20*/
  391. X
  392. Xstruct`20flist`20*filelist(ptn)
  393. Xchar`20*ptn;
  394. X`7B
  395. Xstruct`20flist`20*cur;
  396. X
  397. Xif`20(`20(cur`20=`20(struct`20flist`20*)`20calloc(sizeof(struct`20flist),1))
  398. V`20==`20NULL)
  399. X`09fatal("Out`20of`20memory!");
  400. Xcur->name`20=`20save(ptn);
  401. Xreturn(cur);
  402. X`7D
  403. $ call unpack FLIST_NONE.C;1 2135181073 ""
  404. $!
  405. $ create 'f'
  406. X/*`09flist_unix.c`09`094/24/91
  407. X`20*
  408. X`20*`20Copyright`201991`20`20Perry`20R.`20Ross
  409. X`20*
  410. X`20*`20Permission`20to`20use,`20copy,`20modify,`20and`20distribute`20this`20so
  411. Vftware`20and`20its
  412. X`20*`20documentation`20without`20fee`20is`20hereby`20granted,`20subject`20to
  413. V`20the`20restrictions
  414. X`20*`20detailed`20in`20the`20README`20file,`20which`20is`20included`20here`20b
  415. Vy`20reference.
  416. X`20*`20Any`20other`20use`20requires`20written`20permission`20from`20the`20auth
  417. Vor.`20`20This`20software
  418. X`20*`20is`20distributed`20"as`20is"`20without`20any`20warranty,`20including
  419. V`20any`20implied
  420. X`20*`20warranties`20of`20merchantability`20or`20fitness`20for`20a`20particular
  421. V`20purpose.
  422. X`20*`20The`20author`20shall`20not`20be`20liable`20for`20any`20damages`20result
  423. Ving`20from`20the
  424. X`20*`20use`20of`20this`20software.`20`20By`20using`20this`20software,`20the
  425. V`20user`20agrees
  426. X`20*`20to`20these`20terms.
  427. X`20*/
  428. X
  429. X/*`20This`20file`20uses`20the`20"regex-glob"`20routines,`20written`20by`20John
  430. V`20Kercheval,`20and
  431. X`20*`20posted`20to`20comp.sources.misc.`20`20The`20code`20appears`20at`20the
  432. V`20end`20of`20this
  433. X`20*`20file`20with`20all`20original`20comments.
  434. X`20*/
  435. X
  436. X#include`20"ldb.h"
  437. X
  438. X
  439. X/*----------------------------------------------------------------------
  440. X`20*`09filelist`20--`20generate`20a`20list`20of`20all`20matching`20files.
  441. X`20*
  442. X`20*`20This`20function`20generates`20a`20list`20of`20all`20files`20that`20matc
  443. Vh`20a`20pattern.
  444. X`20*`20Each`20file`20is`20stored`20in`20an`20instance`20of`20struct`20flist,
  445. V`20which`20just
  446. X`20*`20links`20the`20names`20in`20a`20linked`20list.`20`20A`20pointer`20to`20t
  447. Vhe`20beginning`20of
  448. X`20*`20the`20list`20is`20returned.`20`20It`20is`20the`20callers`20responsibili
  449. Vty`20to`20free
  450. X`20*`20the`20list`20when`20it`20is`20no`20longer`20needed.
  451. X`20*
  452. X`20*`20This`20function`20will`20only`20recognize`20wildcards`20in`20file`20nam
  453. Ves,`20NOT
  454. X`20*`20the`20directories`20leading`20up`20to`20them.`20`20For`20example,`20nut
  455. Vs/ldb*.txt`20is
  456. X`20*`20fine,`20but`20*ts/ldb*.txt`20is`20not.
  457. X`20*
  458. X`20*`20This`20function`20uses`20the`20"new"`20directory`20routines`20(i.e.`20o
  459. Vpendir,
  460. X`20*`20readdir,`20et.`20al).`20`20If`20these`20are`20not`20on`20your`20system,
  461. V`20you`20should
  462. X`20*`20have`20defined`20NEED_READDIR`20in`20your`20Makefile.
  463. X`20*----------------------------------------------------------------------
  464. X`20*/
  465. X
  466. Xstruct`20flist`20*filelist(ptn)
  467. Xchar`20*ptn;
  468. X`7B
  469. Xstruct`20flist`20*head,`20*tail,`20*cur;
  470. XDIR`20*dp;
  471. Xchar`20*s;
  472. Xchar`20*dn,`20*pn;
  473. Xstruct`20direct`20*p;
  474. X
  475. Xhead`20=`20NULL;
  476. Xif`20(is_pattern(ptn)`20==`200)`20`7B`09/*`20no`20wildcards,`20just`20a`20file
  477. V`20name`20*/
  478. X`09if`20(`20(cur`20=`20(struct`20flist`20*)`20calloc(sizeof(struct`20flist),1)
  479. V)`20==`20NULL)
  480. X`09`09fatal("Out`20of`20memory!");
  481. X`09head`20=`20cur;
  482. X`09tail`20=`20cur;
  483. X`09cur->name`20=`20save(ptn);
  484. X`09return(cur);
  485. X`09`7D
  486. Xif`20(`20(s`20=`20strrchr(ptn,'/'))`20!=`20NULL)`20`7B`09/*`20strip`20off`20di
  487. Vrectory`20name`20*/
  488. X`09*s`20=`20'`5C0';
  489. X`09dn`20=`20save(ptn);`09`09/*`20dir`20=`20everything`20before`20last`20/`20
  490. V`20*/
  491. X`09pn`20=`20save(s+1);`09`09/*`20pattern`20=`20everything`20after`20last`20/
  492. V`20`20*/
  493. X`09*s`20=`20'/';
  494. X`09`7D
  495. Xelse`20`7B
  496. X`09dn`20=`20save(".");
  497. X`09pn`20=`20save(ptn);
  498. X`09`7D
  499. Xif`20(`20(dp`20=`20opendir(dn))`20==`20NULL)`20`7B
  500. X`09free(dn);
  501. X`09free(pn);
  502. X`09return(NULL);
  503. X`09`7D
  504. Xwhile`20(`20(p`20=`20readdir(dp))`20!=`20NULL)`20`7B
  505. X`09if`20(`20(strcmp(p->d_name,".")`20==`200)`20`7C`7C`20(strcmp(p->d_name,".."
  506. V)`20==`200)`20)
  507. X`09`09continue;
  508. X`09if`20(match(pn,p->d_name)`20==`200)
  509. X`09`09continue;
  510. X`09if`20(`20(cur`20=`20(struct`20flist`20*)`20calloc(sizeof(struct`20flist),1)
  511. V)`20==`20NULL)
  512. X`09`09fatal("Out`20of`20memory!");
  513. X`09if`20(head`20==`20NULL)`20`7B
  514. X`09`09head`20=`20cur;
  515. X`09`09tail`20=`20cur;
  516. X`09`09`7D
  517. X`09else`20`7B
  518. X`09`09tail->next`20=`20cur;
  519. X`09`09tail`20=`20cur;
  520. X`09`09`7D
  521. X`09if`20(strcmp(dn,".")`20==`200)`09/*`20file`20in`20current`20dir`20*/
  522. X`09`09cur->name`20=`20save(p->d_name);`09/*`20just`20save`20name`20*/
  523. X`09else`20`7B`09`09`09`09/*`20include`20directory`20name`20*/
  524. X`09`09cur->name`20=`20(char`20*)`20malloc(strlen(dn)+strlen(p->d_name)+2);
  525. X`09`09if`20(cur->name`20==`20NULL)
  526. X`09`09`09fatal("Out`20of`20memory!");
  527. X`09`09sprintf(cur->name,"%s/%s",dn,p->d_name);
  528. X`09`09`7D
  529. X`09`7D
  530. Xclosedir(dp);
  531. Xfree(dn);
  532. Xfree(pn);
  533. Xreturn(head);
  534. X`7D
  535. X
  536. X
  537. X/*`20regex-glob`20code`20follows:`20(de-ansified`20by`20P.`20Ross`20--`20sorry
  538. V)`20*/
  539. X
  540. X/*
  541. X`20EPSHeader
  542. X
  543. X`20`20`20File:`20match.c
  544. X`20`20`20Author:`20J.`20Kercheval
  545. X`20`20`20Created:`20Sat,`2001/05/1991`20`2022:21:49
  546. X*/
  547. X/*
  548. X`20EPSRevision`20History
  549. X
  550. X`20`20`20J.`20Kercheval`20`20Wed,`2002/20/1991`20`2022:29:01`20`20Released`20t
  551. Vo`20Public`20Domain
  552. X*/
  553. X
  554. X/*
  555. X`20`20`20Wildcard`20Pattern`20Matching
  556. X*/
  557. X
  558. X
  559. X/*`20#include`20"match.h"`20--`20match.h`20included`20here`20for`20simplicity
  560. V`20`20P.`20Ross`20*/
  561. X
  562. X/*
  563. X`20EPSHeader
  564. X
  565. X`20`20`20File:`20match.h
  566. X`20`20`20Author:`20J.`20Kercheval
  567. X`20`20`20Created:`20Sat,`2001/05/1991`20`2022:27:18
  568. X*/
  569. X/*
  570. X`20EPSRevision`20History
  571. X
  572. X`20`20`20J.`20Kercheval`20`20Wed,`2002/20/1991`20`2022:28:37`20`20Released`20t
  573. Vo`20Public`20Domain
  574. X*/
  575. X
  576. X/*
  577. X`20`20`20Wildcard`20Pattern`20Matching
  578. X*/
  579. X
  580. X#ifndef`20BOOLEAN
  581. X#`20define`20BOOLEAN`20int
  582. X#undef`20TRUE
  583. X#undef`20FALSE
  584. X#`20define`20TRUE`201
  585. X#`20define`20FALSE`200
  586. X#endif
  587. X
  588. X/*----------------------------------------------------------------------------
  589. V
  590. X*
  591. X*`20`20Match`20the`20pattern`20PATTERN`20against`20the`20string`20TEXT;
  592. X*`20`20return`20TRUE`20if`20it`20matches,`20FALSE`20otherwise.
  593. X*
  594. X*`20`20A`20match`20means`20the`20entire`20string`20TEXT`20is`20used`20up`20in
  595. V`20matching.
  596. X*
  597. X*`20`20In`20the`20pattern`20string:
  598. X*`20`20`20`20`20`20`20`60*'`20matches`20any`20sequence`20of`20characters
  599. X*`20`20`20`20`20`20`20`60?'`20matches`20any`20character
  600. X*`20`20`20`20`20`20`20`5BSET`5D`20matches`20any`20character`20in`20the`20speci
  601. Vfied`20set,
  602. X*`20`20`20`20`20`20`20`5B!SET`5D`20or`20`5B`5ESET`5D`20matches`20any`20charact
  603. Ver`20not`20in`20the`20specified`20set.
  604. X*
  605. X*`20`20Note:`20the`20standard`20regex`20character`20'+'`20(one`20or`20more)
  606. V`20should`20by
  607. X*`20`20`20`20`20`20`20`20simulated`20by`20using`20"?*"`20which`20is`20equivela
  608. Vnt`20here.
  609. X*
  610. X*`20`20A`20set`20is`20composed`20of`20characters`20or`20ranges;`20a`20range
  611. V`20looks`20like
  612. X*`20`20character`20hyphen`20character`20(as`20in`200-9`20or`20A-Z).
  613. X*`20`20`5B0-9a-zA-Z_`5D`20is`20the`20set`20of`20characters`20allowed`20in`20C
  614. V`20identifiers.
  615. X*`20`20Any`20other`20character`20in`20the`20pattern`20must`20be`20matched`20ex
  616. Vactly.
  617. X*
  618. X*`20`20To`20suppress`20the`20special`20syntactic`20significance`20of`20any`20o
  619. Vf`20`60`5B`5D*?!`5E-`5C',
  620. X*`20`20and`20match`20the`20character`20exactly,`20precede`20it`20with`20a`20
  621. V`60`5C'.
  622. X*
  623. X----------------------------------------------------------------------------*/
  624. V
  625. X
  626. XBOOLEAN`20match`20(`20/*`20char`20*pattern,`20char`20*text`20*/`20);
  627. X
  628. X/*----------------------------------------------------------------------------
  629. V
  630. X*
  631. X*`20Return`20TRUE`20if`20PATTERN`20has`20any`20special`20wildcard`20characters
  632. V
  633. X*
  634. X----------------------------------------------------------------------------*/
  635. V
  636. X
  637. XBOOLEAN`20is_pattern`20(`20/*`20char`20*pattern`20*/`20);
  638. X
  639. X/*`20--`20end`20of`20match.h`20`20P.`20Ross`20--`20*/
  640. X
  641. X#define`20ABORT`202`20`20`20`20`20/*`20end`20of`20search`20indicator`20*/
  642. X
  643. XBOOLEAN`20regex_match_after_star`20(`20/*`20char`20*pattern,`20char`20*text
  644. V`20*/`20);
  645. X
  646. X/*----------------------------------------------------------------------------
  647. V
  648. X*
  649. X*`20Return`20TRUE`20if`20PATTERN`20has`20any`20special`20wildcard`20characters
  650. V
  651. X*
  652. X----------------------------------------------------------------------------*/
  653. V
  654. X
  655. XBOOLEAN`20is_pattern`20(p)
  656. Xchar`20*p;
  657. X`7B
  658. X`20`20`20`20while`20(`20*p`20)`20`7B
  659. X`20`20`20`20`20`20`20`20switch`20(`20*p++`20)`20`7B
  660. X`20`20`20`20`20`20`20`20`20`20`20`20case`20'?':
  661. X`20`20`20`20`20`20`20`20`20`20`20`20case`20'*':
  662. X`20`20`20`20`20`20`20`20`20`20`20`20case`20'`5B':
  663. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return`20TRUE;
  664. X`20`20`20`20`20`20`20`20`20`20`20`20case`20'`5C`5C':
  665. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20if`20(`20!*p++`20)`20return
  666. V`20FALSE;
  667. X`20`20`20`20`20`20`20`20`7D
  668. X`20`20`20`20`7D
  669. X`20`20`20`20return`20FALSE;
  670. X`7D
  671. X
  672. X
  673. X/*----------------------------------------------------------------------------
  674. V
  675. X*
  676. X*`20`20Match`20the`20pattern`20PATTERN`20against`20the`20string`20TEXT;
  677. X*`20`20return`20TRUE`20if`20it`20matches,`20FALSE`20otherwise.
  678. X*
  679. X*`20`20A`20match`20means`20the`20entire`20string`20TEXT`20is`20used`20up`20in
  680. V`20matching.
  681. X*
  682. X*`20`20In`20the`20pattern`20string:
  683. X*`20`20`20`20`20`20`20`60*'`20matches`20any`20sequence`20of`20characters
  684. X*`20`20`20`20`20`20`20`60?'`20matches`20any`20character
  685. X*`20`20`20`20`20`20`20`5BSET`5D`20matches`20any`20character`20in`20the`20speci
  686. Vfied`20set,
  687. X*`20`20`20`20`20`20`20`5B!SET`5D`20or`20`5B`5ESET`5D`20matches`20any`20charact
  688. Ver`20not`20in`20the`20specified`20set.
  689. X*
  690. X*`20`20Note:`20the`20standard`20regex`20character`20'+'`20(one`20or`20more)
  691. V`20should`20by
  692. X*`20`20`20`20`20`20`20`20simulated`20by`20using`20"?*"`20which`20is`20equivela
  693. Vnt`20here.
  694. X*
  695. X*`20`20A`20set`20is`20composed`20of`20characters`20or`20ranges;`20a`20range
  696. V`20looks`20like
  697. X*`20`20character`20hyphen`20character`20(as`20in`200-9`20or`20A-Z).
  698. X*`20`20`5B0-9a-zA-Z_`5D`20is`20the`20set`20of`20characters`20allowed`20in`20C
  699. V`20identifiers.
  700. X*`20`20Any`20other`20character`20in`20the`20pattern`20must`20be`20matched`20ex
  701. Vactly.
  702. X*
  703. X*`20`20To`20suppress`20the`20special`20syntactic`20significance`20of`20any`20o
  704. Vf`20`60`5B`5D*?!`5E-`5C',
  705. X*`20`20and`20match`20the`20character`20exactly,`20precede`20it`20with`20a`20
  706. V`60`5C'.
  707. X*
  708. X----------------------------------------------------------------------------*/
  709. V
  710. X
  711. XBOOLEAN`20regex_match`20(p,`20t)
  712. Xregister`20char`20*p;
  713. Xregister`20char`20*t;
  714. X`7B
  715. X`20`20`20`20register`20char`20range_start,`20range_end;`20`20/*`20start`20and
  716. V`20end`20in`20range`20*/
  717. X
  718. X`20`20`20`20BOOLEAN`20invert;`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20is
  719. V`20this`20`5B..`5D`20or`20`5B!..`5D`20*/
  720. X`20`20`20`20BOOLEAN`20member_match;`20`20`20`20`20`20`20/*`20have`20I`20matche
  721. Vd`20the`20`5B..`5D`20construct?`20*/
  722. X`20`20`20`20BOOLEAN`20loop;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20s
  723. Vhould`20I`20terminate?`20*/
  724. X
  725. X`20`20`20`20for`20(`20;`20*p;`20p++,`20t++`20)`20`7B
  726. X
  727. X`20`20`20`20`20`20`20`20/*`20if`20this`20is`20the`20end`20of`20the`20text`20th
  728. Ven`20this`20is`20the`20end`20of`20the`20match`20*/
  729. X`20`20`20`20`20`20`20`20if`20(!*t)`20`7B
  730. X`20`20`20`20`20`20`20`20`20`20`20`20return`20(`20*p`20==`20'*'`20`26`26`20*++p
  731. V`20==`20'`5C0'`20)`20?`20TRUE`20:`20ABORT;
  732. X`20`20`20`20`20`20`20`20`7D
  733. X
  734. X`20`20`20`20`20`20`20`20/*`20determine`20and`20react`20to`20pattern`20type`20*
  735. V/
  736. X`20`20`20`20`20`20`20`20switch`20(`20*p`20)`20`7B
  737. X
  738. X`20`20`20`20`20`20`20`20`20`20`20`20/*`20single`20any`20character`20match`20*/
  739. V
  740. X`20`20`20`20`20`20`20`20`20`20`20`20case`20'?':
  741. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20break;
  742. X
  743. X`20`20`20`20`20`20`20`20`20`20`20`20/*`20multiple`20any`20character`20match
  744. V`20*/
  745. X`20`20`20`20`20`20`20`20`20`20`20`20case`20'*':
  746. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return`20regex_match_after_sta
  747. Vr`20(p,`20t);
  748. X
  749. X`20`20`20`20`20`20`20`20`20`20`20`20/*`20`5B..`5D`20construct,`20single`20memb
  750. Ver/exclusion`20character`20match`20*/
  751. X`20`20`20`20`20`20`20`20`20`20`20`20case`20'`5B':`20`7B
  752. X
  753. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20move`20to`20beginning`20o
  754. Vf`20range`20*/
  755. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20p++;
  756. X
  757. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20check`20if`20this`20is
  758. V`20a`20member`20match`20or`20exclusion`20match`20*/
  759. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20invert`20=`20FALSE;
  760. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20if`20(`20*p`20==`20'!'`20`7C
  761. V`7C`20*p`20==`20'`5E')`20`7B
  762. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20invert`20=`20TRUE;
  763. V
  764. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20p++;
  765. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D
  766. X
  767. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20if`20closing`20bracket
  768. V`20here`20or`20at`20range`20start`20then`20we`20have`20a
  769. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20malformed`20pattern
  770. V`20*/
  771. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20if`20(`20*p`20==`20'`5D'`20)
  772. V`20`7B
  773. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return`20ABORT;
  774. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D
  775. X
  776. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20member_match`20=`20FALSE;
  777. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20loop`20=`20TRUE;
  778. X
  779. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20while`20(`20loop`20)`20`7B
  780. X
  781. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20if`20end`20of
  782. V`20construct`20then`20loop`20is`20done`20*/
  783. 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'
  784. V`5D')`20`7B
  785. 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
  786. V`20=`20FALSE;
  787. 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
  788. Vue;
  789. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D
  790. X
  791. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20matching`20a
  792. V`20'!',`20'`5E',`20'-',`20'`5C'`20or`20a`20'`5D'`20*/
  793. 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==
  794. V`20'`5C`5C'`20)`20`7B
  795. 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_
  796. Vstart`20=`20range_end`20=`20*++p;
  797. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D
  798. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20else`20`7B
  799. 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_
  800. Vstart`20=`20range_end`20=`20*p;
  801. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D
  802. X
  803. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20if`20end`20of
  804. V`20pattern`20then`20bad`20pattern`20(Missing`20'`5D')`20*/
  805. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20if`20(!range_start
  806. V)
  807. 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
  808. V`20ABORT;
  809. X
  810. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20move`20to`20n
  811. Vext`20pattern`20char`20*/
  812. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20p++;
  813. X
  814. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20check`20for
  815. V`20range`20bar`20*/
  816. 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'-
  817. V')`20`7B
  818. X
  819. 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
  820. Vet`20the`20range`20end`20*/
  821. 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_
  822. Vend`20=`20*++p;
  823. X
  824. 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
  825. Vpecial`20character`20range`20end`20*/
  826. 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(
  827. Vrange_end`20==`20'`5C`5C')
  828. 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
  829. V`20`20`20range_end`20=`20*++p;
  830. X
  831. 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
  832. Vf`20end`20of`20pattern`20or`20construct`20then`20bad`20pattern`20*/
  833. 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(
  834. Vrange_end`20==`20'`5C0'`20`7C`7C`20range_end`20==`20'`5D')
  835. 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
  836. V`20`20`20return`20ABORT;
  837. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D
  838. X
  839. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20if`20the`20te
  840. Vxt`20character`20is`20in`20range`20then`20match`20found.
  841. 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
  842. Vre`20the`20range`20letters`20have`20the`20proper
  843. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20relations
  844. Vhip`20to`20one`20another`20before`20comparison`20*/
  845. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20if`20(`20range_sta
  846. Vrt`20<`20range_end`20`20)`20`7B
  847. 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(
  848. V*t`20>=`20range_start`20`26`26`20*t`20<=`20range_end)`20`7B
  849. 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
  850. V`20`20`20member_match`20=`20TRUE;
  851. 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
  852. V`20`20`20loop`20=`20FALSE;
  853. 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
  854. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D
  855. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20else`20`7B
  856. 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(
  857. V*t`20>=`20range_end`20`26`26`20*t`20<=`20range_start)`20`7B
  858. 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
  859. V`20`20`20member_match`20=`20TRUE;
  860. 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
  861. V`20`20`20loop`20=`20FALSE;
  862. 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
  863. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D
  864. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D
  865. X
  866. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20if`20there`20was`20a`20ma
  867. Vtch`20in`20an`20exclusion`20set`20then`20no`20match`20*/
  868. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20if`20there`20was`20no`20m
  869. Vatch`20in`20a`20member`20set`20then`20no`20match`20*/
  870. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20if`20((invert`20`26`26`20membe
  871. Vr_match)`20`7C`7C
  872. 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
  873. Vember_match))
  874. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return`20FALSE;
  875. X
  876. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20if`20this`20is`20not`20an
  877. V`20exclusion`20then`20skip`20the`20rest`20of`20the`20`5B...`5D
  878. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20construct`20that
  879. V`20already`20matched.`20*/
  880. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20if`20(member_match)`20`7B
  881. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20while`20(*p`20!=
  882. V`20'`5D')`20`7B
  883. X
  884. 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
  885. Vad`20pattern`20(Missing`20'`5D')`20*/
  886. 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(
  887. V!*p)
  888. 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
  889. V`20`20`20return`20ABORT;
  890. X
  891. 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
  892. Vkip`20exact`20match`20*/
  893. 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(
  894. V*p`20==`20'`5C`5C')`20`7B
  895. 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
  896. V`20`20`20p++;
  897. 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
  898. X
  899. 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
  900. Vove`20to`20next`20pattern`20char`20*/
  901. 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++;
  902. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D
  903. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D
  904. X
  905. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20break;
  906. X`20`20`20`20`20`20`20`20`20`20`20`20`7D
  907. X
  908. X`20`20`20`20`20`20`20`20`20`20`20`20/*`20next`20character`20is`20quoted`20and
  909. V`20must`20match`20exactly`20*/
  910. X`20`20`20`20`20`20`20`20`20`20`20`20case`20'`5C`5C':
  911. X
  912. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20move`20pattern`20pointer
  913. V`20to`20quoted`20char`20and`20fall`20through`20*/
  914. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20p++;
  915. X
  916. X`20`20`20`20`20`20`20`20`20`20`20`20/*`20must`20match`20this`20character`20exa
  917. Vctly`20*/
  918. X`20`20`20`20`20`20`20`20`20`20`20`20default:
  919. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20if`20(*p`20!=`20*t)
  920. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return`20FALSE;
  921. X`20`20`20`20`20`20`20`20`7D
  922. X`20`20`20`20`7D
  923. X
  924. X`20`20`20`20/*`20if`20end`20of`20text`20not`20reached`20then`20the`20pattern
  925. V`20fails`20*/
  926. X`20`20`20`20return`20!*t;
  927. X`7D
  928. X
  929. X
  930. X/*----------------------------------------------------------------------------
  931. V
  932. X*
  933. X*`20recursively`20call`20regex_match`20with`20final`20segment`20of`20PATTERN
  934. V`20and`20of`20TEXT.
  935. X*
  936. X----------------------------------------------------------------------------*/
  937. V
  938. X
  939. XBOOLEAN`20regex_match_after_star`20(p,`20t)
  940. Xregister`20char`20*p;
  941. Xregister`20char`20*t;
  942. X`7B
  943. X`20`20`20`20register`20BOOLEAN`20match;
  944. X`20`20`20`20register`20nextp;
  945. X
  946. X`20`20`20`20/*`20pass`20over`20existing`20?`20and`20*`20in`20pattern`20*/
  947. X`20`20`20`20while`20(`20*p`20==`20'?'`20`7C`7C`20*p`20==`20'*'`20)`20`7B
  948. X
  949. X`20`20`20`20`20`20`20`20/*`20take`20one`20char`20for`20each`20?`20*/
  950. X`20`20`20`20`20`20`20`20if`20(`20*p`20==`20'?'`20)`20`7B
  951. X
  952. X`20`20`20`20`20`20`20`20`20`20`20`20/*`20if`20end`20of`20text`20then`20no`20ma
  953. Vtch`20*/
  954. X`20`20`20`20`20`20`20`20`20`20`20`20if`20(`20!*t++`20)`20`7B
  955. X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return`20ABORT;
  956. X`20`20`20`20`20`20`20`20`20`20`20`20`7D
  957. X`20`20`20`20`20`20`20`20`7D
  958. X
  959. X`20`20`20`20`20`20`20`20/*`20move`20to`20next`20char`20in`20pattern`20*/
  960. X`20`20`20`20`20`20`20`20p++;
  961. X`20`20`20`20`7D
  962. X
  963. X`20`20`20`20/*`20if`20end`20of`20pattern`20we`20have`20matched`20regardless
  964. V`20of`20text`20left`20*/
  965. X`20`20`20`20if`20(`20!*p`20)`20`7B
  966. X`20`20`20`20`20`20`20`20return`20TRUE;
  967. X`20`20`20`20`7D
  968. X
  969. X`20`20`20`20/*`20get`20the`20next`20character`20to`20match`20which`20must`20be
  970. V`20a`20literal`20or`20'`5B'`20*/
  971. X`20`20`20`20nextp`20=`20*p;
  972. X`20`20`20`20if`20(`20nextp`20==`20'`5C`5C'`20)
  973. X`20`20`20`20`20`20`20`20nextp`20=`20p`5B1`5D;
  974. X
  975. X`20`20`20`20/*`20Continue`20until`20we`20run`20out`20of`20text`20or`20definite
  976. V`20result`20seen`20*/
  977. X`20`20`20`20match`20=`20FALSE;
  978. X`20`20`20`20while`20(`20match`20==`20FALSE`20)`20`7B
  979. X
  980. X`20`20`20`20`20`20`20`20/*`20a`20precondition`20for`20matching`20is`20that`20t
  981. Vhe`20next`20character
  982. X`20`20`20`20`20`20`20`20`20`20`20in`20the`20pattern`20match`20the`20next`20cha
  983. Vracter`20in`20the`20text`20or`20that
  984. X`20`20`20`20`20`20`20`20`20`20`20the`20next`20pattern`20is`20the`20beginning
  985. V`20of`20a`20range.`20`20Increment`20text
  986. X`20`20`20`20`20`20`20`20`20`20`20pointer`20as`20we`20go`20here`20*/
  987. X`20`20`20`20`20`20`20`20if`20(`20*p`20==`20*t`20`7C`7C`20nextp`20==`20'`5B'
  988. V`20)`20`7B
  989. X`20`20`20`20`20`20`20`20`20`20`20`20match`20=`20regex_match(p,`20t);
  990. X`20`20`20`20`20`20`20`20`7D
  991. X
  992. X`20`20`20`20`20`20`20`20/*`20if`20the`20end`20of`20text`20is`20reached`20then
  993. V`20no`20match`20*/
  994. X`20`20`20`20`20`20`20`20if`20(`20!*t++`20)`20match`20=`20ABORT;
  995. X`20`20`20`20`7D
  996. X
  997. X`20`20`20`20/*`20return`20result`20*/
  998. X`20`20`20`20return`20match;
  999. X`7D
  1000. X
  1001. X/*----------------------------------------------------------------------------
  1002. V
  1003. X*
  1004. X*`20This`20is`20a`20shell`20to`20regex_match`20to`20return`20only`20a`20true
  1005. V`20BOOLEAN`20value
  1006. X*
  1007. X----------------------------------------------------------------------------*/
  1008. V
  1009. X
  1010. XBOOLEAN`20match(p,`20t)
  1011. Xchar`20*p;
  1012. Xchar`20*t;
  1013. X`7B
  1014. X`20`20`20`20return`20(`20regex_match(p,t)`20==`20TRUE`20)`20?`20TRUE`20:`20FAL
  1015. VSE;
  1016. X`7D
  1017. $ call unpack FLIST_UNIX.C;1 1711290471 ""
  1018. $!
  1019. $ create 'f'
  1020. X/*`09flist_vms.c`09`094/24/92
  1021. X`20*
  1022. X`20*`20Copyright`201992`20`20Earle`20Ake`20and`20Perry`20Ross
  1023. X`20*
  1024. X`20*`20Permission`20to`20use,`20copy,`20modify,`20and`20distribute`20this`20so
  1025. Vftware`20and`20its
  1026. X`20*`20documentation`20without`20fee`20is`20hereby`20granted,`20subject`20to
  1027. V`20the`20restrictions
  1028. X`20*`20detailed`20in`20the`20README`20file,`20which`20is`20included`20here`20b
  1029. Vy`20reference.
  1030. X`20*`20Any`20other`20use`20requires`20written`20permission`20from`20the`20auth
  1031. Vor.`20`20This`20software
  1032. X`20*`20is`20distributed`20"as`20is"`20without`20any`20warranty,`20including
  1033. V`20any`20implied
  1034. X`20*`20warranties`20of`20merchantability`20or`20fitness`20for`20a`20particular
  1035. V`20purpose.
  1036. X`20*`20The`20author`20shall`20not`20be`20liable`20for`20any`20damages`20result
  1037. Ving`20from`20the
  1038. X`20*`20use`20of`20this`20software.`20`20By`20using`20this`20software,`20the
  1039. V`20user`20agrees
  1040. X`20*`20to`20these`20terms.
  1041. X`20*/
  1042. X
  1043. X#include`20"ldb.h"
  1044. X
  1045. X
  1046. X/*----------------------------------------------------------------------
  1047. X`20*`09filelist`20--`20generate`20a`20list`20of`20all`20matching`20files.
  1048. X`20*
  1049. X`20*`20This`20function`20generates`20a`20list`20of`20all`20files`20that`20matc
  1050. Vh`20a`20pattern.
  1051. X`20*`20Each`20file`20is`20stored`20in`20an`20instance`20of`20struct`20flist,
  1052. V`20which`20just
  1053. X`20*`20links`20the`20names`20in`20a`20linked`20list.`20`20A`20pointer`20to`20t
  1054. Vhe`20beginning`20of
  1055. X`20*`20the`20list`20is`20returned.`20`20It`20is`20the`20callers`20responsibili
  1056. Vty`20to`20free
  1057. X`20*`20the`20list`20when`20it`20is`20no`20longer`20needed.
  1058. X`20*----------------------------------------------------------------------
  1059. X`20*/
  1060. X
  1061. Xstruct`20flist`20*filelist(ptn)
  1062. Xchar`20*ptn;
  1063. X`7B
  1064. Xchar`20nextfile`5B257`5D;
  1065. Xint`20context`20=`200;
  1066. Xstruct`20flist`20*head,`20*tail,`20*cur;
  1067. X
  1068. Xhead`20=`20NULL;
  1069. Xwhile`20(1)`20`7B
  1070. X`09if`20(scan_files(ptn,`26nextfile,`26context)`20==`200)
  1071. X`09`09return(head);
  1072. X`09if`20(`20(cur`20=`20(struct`20flist`20*)`20calloc(sizeof(struct`20flist),1)
  1073. V)`20==`20NULL)
  1074. X`09`09fatal("Out`20of`20memory!");
  1075. X`09if`20(head`20==`20NULL)`20`7B
  1076. X`09`09head`20=`20cur;
  1077. X`09`09tail`20=`20cur;
  1078. X`09`09`7D
  1079. X`09else`20`7B
  1080. X`09`09tail->next`20=`20cur;
  1081. X`09`09tail`20=`20cur;
  1082. X`09`09`7D
  1083. X`09cur->name`20=`20save(nextfile);
  1084. X`09`7D
  1085. X`7D
  1086. X
  1087. X
  1088. X/*----------------------------------------------------------------------
  1089. X`20*`09scan_files`20--`20find`20the`20next`20file`20matching`20a`20pattern
  1090. X`20*
  1091. X`20*`20This`20function`20finds`20the`20next`20(or`20first)`20file`20matching
  1092. V`20a`20given
  1093. X`20*`20pattern.`20`20The`20pattern`20is`20interpreted`20in`20the`20same`20way
  1094. V`20as`20DCL.
  1095. X`20*`20If`20the`20pattern`20does`20not`20specify`20a`20version`20number,`20';*
  1096. V'`20is
  1097. X`20*`20the`20default.`20`20scan_files`20returns`201`20if`20a`20file`20was`20fo
  1098. Vund,
  1099. X`20*`200`20if`20there`20are`20no`20more`20matching`20files.
  1100. X`20*----------------------------------------------------------------------
  1101. X`20*/
  1102. X
  1103. Xint`20scan_files(itm_files,nextfile,context)
  1104. X`09char`20*itm_files,`20*nextfile;
  1105. X`09int`20*context;
  1106. X`7B
  1107. X`09char`20*def_spec`20=`20";*";
  1108. X`09int`20status;
  1109. X`09unsigned`20key`5B2`5D;
  1110. X`09char`20fnam`5B257`5D,`20*s;
  1111. X`09static`20struct`20RAB`20itmrab;
  1112. X`09static`20struct`20dsc$descriptor`20itm_dsc,`20defspec_dsc;
  1113. X`09$DESCRIPTOR(fnam_dsc,fnam);
  1114. X
  1115. X`09if`20(*context`20==`200)`20`7B
  1116. X`09`09itm_dsc.dsc$w_length`20=`20strlen(itm_files);
  1117. X`09`09itm_dsc.dsc$b_dtype`20=`20DSC$K_DTYPE_T;
  1118. X`09`09itm_dsc.dsc$b_class`20=`20DSC$K_CLASS_S;
  1119. X`09`09itm_dsc.dsc$a_pointer`20=`20itm_files;
  1120. X
  1121. X`09`09defspec_dsc.dsc$w_length`20=`20strlen(def_spec);
  1122. X`09`09defspec_dsc.dsc$b_dtype`20=`20DSC$K_DTYPE_T;
  1123. X`09`09defspec_dsc.dsc$b_class`20=`20DSC$K_CLASS_S;
  1124. X`09`09defspec_dsc.dsc$a_pointer`20=`20def_spec;
  1125. X
  1126. X`09`09itmrab.rab$l_kbf`20=`20(char`20*)`20key;
  1127. X`09`09itmrab.rab$b_krf`20=`200;
  1128. X`09`09itmrab.rab$b_ksz`20=`208;
  1129. X`09`09itmrab.rab$l_rop`20=`20RAB$M_RRL`20`7C`20RAB$M_NLK`20;
  1130. X`09`09itmrab.rab$b_rac`20=`20RAB$C_KEY;
  1131. X`09`7D
  1132. X
  1133. X`09if`20((status`20=`20lib$find_file(`26itm_dsc,`26fnam_dsc,context,
  1134. X`09`09`26defspec_dsc,0,0,0))`20`26`201)`20`7B
  1135. X
  1136. X`09`09fnam`5B256`5D`20=`20'`5C0';
  1137. X
  1138. X`09`09if`20(s`20=`20strchr(fnam,'`20'))`20*s`20=`20'`5C0';
  1139. X`09`09strcpy(nextfile,`26fnam);
  1140. X`09`09return`201;
  1141. X`09`09`7D
  1142. X`09else`20`7B
  1143. X`09`09lib$find_file_end(context);
  1144. X`09`7D
  1145. X`09return`200;
  1146. X`7D
  1147. $ call unpack FLIST_VMS.C;1 573836067 ""
  1148. $!
  1149. $ create 'f'
  1150. X/*`09game.c`09`098/3/91
  1151. X`20*
  1152. X`20*`20Copyright`201991`20`20Perry`20R.`20Ross
  1153. X`20*
  1154. X`20*`20Permission`20to`20use,`20copy,`20modify,`20and`20distribute`20this`20so
  1155. Vftware`20and`20its
  1156. X`20*`20documentation`20without`20fee`20is`20hereby`20granted,`20subject`20to
  1157. V`20the`20restrictions
  1158. X`20*`20detailed`20in`20the`20README`20file,`20which`20is`20included`20here`20b
  1159. Vy`20reference.
  1160. X`20*`20Any`20other`20use`20requires`20written`20permission`20from`20the`20auth
  1161. Vor.`20`20This`20software
  1162. X`20*`20is`20distributed`20"as`20is"`20without`20any`20warranty,`20including
  1163. V`20any`20implied
  1164. X`20*`20warranties`20of`20merchantability`20or`20fitness`20for`20a`20particular
  1165. V`20purpose.
  1166. X`20*`20The`20author`20shall`20not`20be`20liable`20for`20any`20damages`20result
  1167. Ving`20from`20the
  1168. X`20*`20use`20of`20this`20software.`20`20By`20using`20this`20software,`20the
  1169. V`20user`20agrees
  1170. X`20*`20to`20these`20terms.
  1171. X`20*/
  1172. X
  1173. X#include`20"ldb.h"
  1174. X
  1175. X/*----------------------------------------------------------------------
  1176. X`20*`09startgame`20--`20start`20a`20game
  1177. X`20*
  1178. X`20*`20This`20function`20is`20called`20in`20response`20to`20the`20-start`20com
  1179. Vmand`20line
  1180. X`20*`20option`20to`20start`20a`20game`20with`20another`20user.`20`20It`20alloc
  1181. Vates`20a`20game
  1182. X`20*`20record`20and`20fills`20it`20in,`20then`20sends`20a`20START`20packet`20t
  1183. Vo`20the`20opponent.
  1184. X`20*`20The`20arguments`20are:
  1185. X`20*`09The`20email`20address`20of`20the`20opponent
  1186. X`20*`09The`20direction`20I`20want`20to`20play
  1187. X`20*`09The`20color`20I`20want`20to`20play
  1188. X`20*`09The`20color`20I`20want`20the`20opponent`20to`20play
  1189. X`20*`09The`20F_JACOBY/F_CRAWFORD/F_EUROPE/F_INVERT/F_PERM`20flags,`20if`20desi
  1190. Vred.
  1191. X`20*`09The`20match`20value`20(number`20of`20points`20to`20play`20to)
  1192. X`20*`09The`20time`20to`20use`20as`20the`20start`20time`20of`20the`20game`20(0
  1193. V`20=`20current`20time)
  1194. X`20*----------------------------------------------------------------------
  1195. X`20*/
  1196. X
  1197. Xstruct`20game`20*startgame(addr,d,mc,oc,flgs,mch,stime)
  1198. Xchar`20*addr;`09`09`09/*`20path`20to`20opponent`20*/
  1199. Xint`20d;`09`09`09`09/*`20my`20direction`20*/
  1200. Xchar`20mc,`20oc;`09`09`09/*`20my`20color,`20opponent's`20color`20*/
  1201. Xint`20flgs;`09`09`09/*`20flags`20(F_*)`20*/
  1202. Xint`20mch;`09`09`09/*`20match`20score`20*/
  1203. Xlong`20stime;`09`09`09/*`20start`20time`20(0`20=`20current`20time)`20*/
  1204. X`7B
  1205. Xstruct`20game`20*g;
  1206. Xchar`20c1,`20c2,`20*newid;
  1207. Xstruct`20people`20*ppl;
  1208. X
  1209. Xnewid`20=`20makeid();`09`09/*`20give`20it`20a`20unique`20id`20*/
  1210. Xg`20=`20addgame();`09`09`09/*`20allocate`20new`20game`20*/
  1211. Xg->gameid`20=`20newid;`09`09/*`20store`20new`20id`20*/
  1212. Xif`20(rc.debug`20`26`20DB_GSTART)`20`7B
  1213. X`09message("DB-startgame:`5Ctstarted`20game`20%s`5Cn",newid);
  1214. X`09message("`5Ct`5Ctwith`20%s`20flags=%04x`20match=%d`5Cn",addr,flgs,mch);
  1215. X`09`7D
  1216. Xif`20(`20(ppl`20=`20findppl(addr,P_ADDR`7CP_ALIAS))`20!=`20NULL)`20`7B`09/*
  1217. V`20we`20know`20this`20guy`20*/
  1218. X`09g->opaddr`20=`20save(ppl->addr);`09/*`20copy`20out`20people`20info`20*/
  1219. X`09g->opname`20=`20save(ppl->name);
  1220. X`09g->myaddr`20=`20save(ppl->myaddr);
  1221. X`09g->ppl`20=`20ppl;
  1222. X`09`7D
  1223. Xelse`20`7B`09`09`09`09`09/*`20new`20opponent`20*/
  1224. X`09g->opaddr`20=`20save(addr);`09`09/*`20save`20his`20address`20*/
  1225. X`09g->opname`20=`20NULL;`09`09/*`20don't`20know`20his`20name`20yet`20*/
  1226. X`09g->myaddr`20=`20save(rc.myaddr);`09/*`20store`20my`20return`20address`20*/
  1227. X`09newppl(g);`09`09`09/*`20make`20up`20a`20people`20record`20*/
  1228. X`09`7D
  1229. Xg->mycolor`20=`20mc;`09`09/*`20set`20starting`20colors`20*/
  1230. Xg->opcolor`20=`20oc;
  1231. Xg->mydir`20=`20d;`09`09`09/*`20set`20starting`20directions`20*/
  1232. Xg->opdir`20=`20REV(d);
  1233. Xg->gameval`20=`201;`09`09`09/*`20no`20doubles`20yet`20*/
  1234. Xg->adcnt`20=`200;`09`09`09/*`20no`20autodoubles`20yet`20*/
  1235. Xg->admax`20=`20rc.autodouble;`09/*`20max`20allowed`20autodoubles`20*/
  1236. Xg->flags`20=`20flgs`20`26`20(F_JACOBY`7CF_CRAWFORD`7CF_PERM`7CF_EUROPE`7CF_INV
  1237. VERT);
  1238. Xg->state`20=`20ST_OPSTART;`09`09/*`20need`20to`20send`20first`20roll`20*/
  1239. Xg->seq`20=`201;`09`09`09/*`20start`20with`20sequence`20number`20=`201`20*/
  1240. Xg->notify`20=`20notify;`09`09/*`20copy`20notify`20address`20(if`20any)`20*/
  1241. Xif`20(d`20>`200)`20`7B
  1242. X`09c1`20=`20mc;`09/*`20upbound`20color`20is`20mine`20*/
  1243. X`09c2`20=`20oc;`09/*`20downbound`20color`20is`20opponent's`20*/
  1244. X`09`7D
  1245. Xelse`20`7B
  1246. X`09c1`20=`20oc;`09/*`20upbound`20color`20is`20opponent's`20*/
  1247. X`09c2`20=`20mc;`09/*`20downbound`20color`20is`20mine`20*/
  1248. X`09`7D
  1249. Xclearmvs(g->mvs);
  1250. Xclearmvs(g->opmvs);
  1251. Xnewboard(g->opbd,c1,c2);`09/*`20set`20up`20boards`20for`20new`20game`20*/
  1252. Xnewboard(g->mybd,c1,c2);
  1253. Xnewboard(g->board,c1,c2);
  1254. Xg->mtotal`20=`20mch;
  1255. Xg->mvs`5B0`5D.roll`20=`20Rolldie();`09/*`20roll`20an`20initial`20die`20*/
  1256. Xif`20(stime`20==`200L)
  1257. X`09g->starttime`20=`20time(`20(long`20*)`200);
  1258. Xelse
  1259. X`09g->starttime`20=`20stime;`09/*`20hack`20to`20detect`20duplicate`20remotesta
  1260. Vrt`20pkts`20*/
  1261. Xg->lastacc`20=`20g->starttime;
  1262. Xsendpkt(g,START);`09`09/*`20send`20the`20start`20message`20*/
  1263. Xreturn(g);`09`09`09/*`20and`20return`20pointer`20to`20new`20game`20*/
  1264. X`7D
  1265. X
  1266. X
  1267. X/*----------------------------------------------------------------------
  1268. X`20*`09makeid`20--`20create`20a`20unique`20game`20identifier.
  1269. X`20*
  1270. X`20*`20This`20function`20creates`20a`20string`20that`20is`20guaranteed`20uniqu
  1271. Ve`20among`20all
  1272. X`20*`20ldb`20games`20worldwide,`20provided`20that`20email`20addresses`20are
  1273. V`20unique.
  1274. X`20*`20This`20should`20be`20a`20good`20assumption,`20since`20if`20there`20is
  1275. V`20a`20duplicate,
  1276. X`20*`20the`20users`20with`20the`20duplicate`20id's`20will`20have`20a`20great
  1277. V`20deal`20of`20difficulty
  1278. X`20*`20getting`20mail`20delivered,`20and`20therefore`20won't`20be`20able`20to
  1279. V`20play`20ldb`20anyway.
  1280. X`20*`20To`20make`20id's`20created`20by`20the`20same`20user`20unique,`20the`20t
  1281. Vime`20is
  1282. X`20*`20appended`20to`20the`20mail`20address;`20to`20make`20sure`20the`20time
  1283. V`20is`20unique`20when
  1284. X`20*`20the`20user`20creates`20more`20than`201`20game`20per`20second,`20the`20g
  1285. Vames`20list`20is`20searched
  1286. X`20*`20for`20a`20new`20id`20before`20it`20is`20returned`20and,`20if`20it`20is
  1287. V`20found,`20we`20sleep`20for
  1288. X`20*`201`20second`20and`20try`20again.
  1289. X`20*----------------------------------------------------------------------
  1290. X`20*/
  1291. X
  1292. Xchar`20*makeid()
  1293. X`7B
  1294. Xchar`20*n;
  1295. X
  1296. Xif`20(`20(n`20=`20calloc(strlen(rc.myaddr)+10,1))`20==`20NULL)
  1297. X`09fatal("ERROR:`20Out`20of`20memory!");
  1298. Xdo`20`7B
  1299. X`09sprintf(n,"%s`7C%08x",rc.myaddr,time((long`20*)0));
  1300. X`09if`20(findgame(n)`20==`20NULL)
  1301. X`09`09return(n);
  1302. X`09sleep(1);
  1303. X`09`7D`20while`20(1);
  1304. X`7D
  1305. X
  1306. X
  1307. X/*---------------------------------------------------------------------------
  1308. X`20*`09addgame`20--`20allocate`20a`20game`20struct`20and`20link`20it`20into
  1309. V`20the`20game`20list
  1310. X`20*
  1311. X`20*`20This`20function`20allocates`20a`20game`20structure`20and`20links`20it
  1312. V`20into`20the
  1313. X`20*`20doubly-linked`20game`20list.`20`20The`20head`20of`20this`20list`20is
  1314. V`20ghead,`20and`20the
  1315. X`20*`20tail`20is`20gtail.
  1316. X`20*
  1317. X`20*`20NOTE:`20the`20memory-zeroing`20feature`20of`20calloc`20is`20depended
  1318. V`20on`20to
  1319. X`20*`09`20initialize`20the`20allocated`20game`20struct.
  1320. X`20*--------------------------------------------------------------------------
  1321. V-
  1322. X`20*/
  1323. X
  1324. Xstruct`20game`20*addgame()
  1325. X`7B
  1326. Xstruct`20game`20*g;
  1327. X
  1328. Xif`20(`20(g`20=`20(struct`20game`20*)calloc(sizeof(struct`20game),1))`20==`20N
  1329. VULL)
  1330. X`09fatal("Out`20of`20memory!");
  1331. Xg->next`20=`20NULL;
  1332. Xif`20(gtail`20==`20NULL)`20`7B`09`09/*`20this`20is`20the`20first`20game`20in
  1333. V`20the`20list`20*/
  1334. X`09ghead`20=`20g;
  1335. X`09gtail`20=`20g;
  1336. X`09g->prev`20=`20NULL;
  1337. X`09`7D
  1338. Xelse`20`7B
  1339. X`09g->prev`20=`20gtail;`09/*`20link`20onto`20end`20of`20list`20*/
  1340. X`09gtail->next`20=`20g;
  1341. X`09gtail`20=`20g;
  1342. X`09`7D
  1343. Xreturn(g);
  1344. X`7D
  1345. X
  1346. X
  1347. X/*----------------------------------------------------------------------
  1348. X`20*`09deletegame`20--`20delete`20a`20game`20from`20the`20game`20list
  1349. X`20*
  1350. X`20*`20This`20function`20removes`20a`20game`20from`20the`20game`20list`20by
  1351. V`20linking`20around
  1352. X`20*`20it,`20then`20frees`20the`20memory`20associated`20with`20the`20game`20st
  1353. Vructure.
  1354. X`20*----------------------------------------------------------------------
  1355. X`20*/
  1356. X
  1357. Xdeletegame(g)
  1358. Xstruct`20game`20*g;
  1359. X`7B
  1360. X
  1361. Xif`20(g`20==`20ghead)`20`7B`09`09/*`20deleting`20first`20game`20in`20list`20*/
  1362. V
  1363. X`09ghead`20=`20g->next;`09/*`20move`20head`20pointer`20to`20next`20game`20*/
  1364. X`09if`20(ghead`20==`20NULL)`09/*`20we`20just`20deleted`20the`20last`20game`20*
  1365. V/
  1366. X`09`09gtail`20=`20NULL;`09/*`20set`20both`20ptrs`20to`20NULL`20*/
  1367. X`09else
  1368. X`09`09ghead->prev`20=`20NULL;`09/*`20first`20in`20list`20has`20no`20prev`20*/
  1369. X`09`7D
  1370. Xelse`20if`20(g`20==`20gtail)`20`7B`09`09/*`20deleting`20last`20game`20in`20lis
  1371. Vt`20*/
  1372. +-+-+-+-+-+-+-+-  END  OF PART 9 +-+-+-+-+-+-+-+-
  1373.