home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume21 / p2c / part06 < prev    next >
Encoding:
Internet Message Format  |  1990-04-05  |  52.0 KB

  1. Subject:  v21i051:  Pascal to C translator, Part06/32
  2. Newsgroups: comp.sources.unix
  3. Approved: rsalz@uunet.UU.NET
  4. X-Checksum-Snefru: 04b4551b c038cd24 96e47e88 44c46fad
  5.  
  6. Submitted-by: Dave Gillespie <daveg@csvax.caltech.edu>
  7. Posting-number: Volume 21, Issue 51
  8. Archive-name: p2c/part06
  9.  
  10. #! /bin/sh
  11. # This is a shell archive.  Remove anything before this line, then unpack
  12. # it by saving it into a file and typing "sh file".  To overwrite existing
  13. # files, type "sh file -c".  You can also feed this as standard input via
  14. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  15. # will see the following message at the end:
  16. #        "End of archive 6 (of 32)."
  17. # Contents:  HP/import/sysdevs.imp src/makeproto.c src/p2clib.c
  18. # Wrapped by rsalz@litchi.bbn.com on Mon Mar 26 14:29:30 1990
  19. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  20. if test -f 'HP/import/sysdevs.imp' -a "${1}" != "-c" ; then 
  21.   echo shar: Will not clobber existing file \"'HP/import/sysdevs.imp'\"
  22. else
  23. echo shar: Extracting \"'HP/import/sysdevs.imp'\" \(15631 characters\)
  24. sed "s/^X//" >'HP/import/sysdevs.imp' <<'END_OF_FILE'
  25. X
  26. X
  27. X{IncludeFrom=sysdevs <p2c/sysdevs.h>}
  28. X
  29. X
  30. X{*VarStrings=1} {*ExportSymbol=}
  31. X
  32. X
  33. XMODULE SYSDEVS;
  34. X
  35. X$SEARCH 'INITLOAD'$ 
  36. X
  37. XIMPORT SYSGLOBALS;
  38. XEXPORT
  39. X {* DUMMY DECLARATIONS **********************************}
  40. X TYPE
  41. X   KBDHOOKTYPE  = PROCEDURE(VAR STATBYTE,DATABYTE: BYTE;
  42. X                            VAR DOIT: BOOLEAN);
  43. X   OUT2TYPE     = PROCEDURE(VALUE1,VALUE2: BYTE);
  44. X   REQUEST1TYPE = PROCEDURE(CMD: BYTE; VAR VALUE: BYTE);
  45. X   BOOLPROC     = PROCEDURE(B:BOOLEAN);
  46. X   
  47. X{* CRT *************************************************}
  48. X{***** THIS SECTION HAS HARD OFFSET REFERENCES *********}
  49. X{      IN MODULES CRTB (ASSY FILE GASSM)                }
  50. XTYPE
  51. X  CRTWORD = RECORD CASE INTEGER OF
  52. X            1:(HIGHLIGHTBYTE,CHARACTER: CHAR);
  53. X            2:(WHOLEWORD: SHORTINT);
  54. X            END;
  55. X  CRTLLOPS =(CLLPUT,CLLSHIFTL,CLLSHIFTR,CLLCLEAR,CLLDISPLAY,PUTSTATUS);
  56. X  CRTLLTYPE=PROCEDURE(OP:CRTLLOPS; ANYVAR POSITION:INTEGER; C:CHAR);
  57. X  DBCRTOPS =(DBINFO,DBEXCG,DBGOTOXY,DBPUT,DBINIT,DBCLEAR,DBCLINE,DBSCROLLUP,
  58. X             DBSCROLLDN,DBSCROLLL,DBSCROLLR,DBHIGHL);
  59. X  DBCINFO  = RECORD
  60. X               SAVEAREA : WINDOWP;
  61. X               SAVESIZE : INTEGER;
  62. X               DCURSORADDR : INTEGER;
  63. X               XMIN,XMAX,YMIN,YMAX : SHORTINT;
  64. X               CURSX,CURSY         : SHORTINT;
  65. X               C : CHAR;
  66. X               AREAISDBCRT : BOOLEAN;
  67. X               CHARISMAPPED: BOOLEAN; { 3/25/85 }
  68. X               DEBUGHIGHLIGHT: SHORTINT;  { 3/25/85 }
  69. X             END;
  70. X  DBCRTTYPE=PROCEDURE(OP:DBCRTOPS; VAR DBCRT:DBCINFO);
  71. X  
  72. X  crtconsttype = packed array [0..11] of byte;
  73. X  
  74. X  crtfrec = packed record
  75. X               nobreak,stupid,slowterm,hasxycrt,
  76. X               haslccrt{built in crt},hasclock,
  77. X               canupscroll,candownscroll      :    boolean;
  78. X             end;
  79. X                           
  80. X  b9 = packed array[0..8] of boolean;
  81. X  b14= packed array[0..13] of boolean;
  82. X  crtcrec = packed record                               (* CRT CONTROL CHARS *)
  83. X               rlf,ndfs,eraseeol,
  84. X               eraseeos,home,
  85. X               escape             : char;
  86. X               backspace          : char;
  87. X               fillcount          : 0..255;
  88. X               clearscreen,
  89. X               clearline          : char;
  90. X               prefixed           : b9
  91. X            end;
  92. X                                  
  93. X  crtirec = packed record                          (* CRT INFO & INPUT CHARS *)
  94. X               width,height      : shortint;
  95. X               crtmemaddr,crtcontroladdr,
  96. X               keybufferaddr,progstateinfoaddr:integer;
  97. X               keybuffersize: shortint;
  98. X               crtcon            : crtconsttype;
  99. X               right,left,down,up: char;
  100. X               badch,chardel,stop,
  101. X               break,flush,eof   : char;
  102. X               altmode,linedel   : char;
  103. X               backspace,
  104. X               etx,prefix        : char;
  105. X               prefixed          : b14 ;
  106. X               cursormask        : integer;
  107. X               spare             : integer;
  108. X            end;
  109. X
  110. X  environ = record
  111. X              miscinfo: crtfrec;
  112. X              crttype: integer;
  113. X              crtctrl: crtcrec;
  114. X              crtinfo: crtirec;
  115. X            end; 
  116. X
  117. X  environptr    = ^environ; 
  118. X  
  119. X  crtkinds = (NOCRT, ALPHATYPE, BITMAPTYPE, SPECIALCRT1, SPECIALCRT2);
  120. X  
  121. XVAR
  122. X  SYSCOM: ENVIRONPTR;
  123. X  ALPHASTATE['ALPHAFLAG']       : BOOLEAN;
  124. X  GRAPHICSTATE['GRAPHICSFLAG']  : BOOLEAN;
  125. X  CRTIOHOOK             : AMTYPE;
  126. X  TOGGLEALPHAHOOK       : PROCEDURE;
  127. X  TOGGLEGRAPHICSHOOK    : PROCEDURE;
  128. X  DUMPALPHAHOOK         : PROCEDURE;
  129. X  DUMPGRAPHICSHOOK      : PROCEDURE;
  130. X  UPDATECURSORHOOK      : PROCEDURE;
  131. X  CRTINITHOOK           : PROCEDURE;
  132. X  CRTLLHOOK             : CRTLLTYPE;
  133. X  DBCRTHOOK             : DBCRTTYPE;
  134. X  XPOS                  : SHORTINT; { CURSOR X POSITION }
  135. X  YPOS                  : SHORTINT; { CURSOR Y POSITION }
  136. X  CURRENTCRT            : CRTKINDS; { ACTIVE ALPHA DRIVER TYPE }
  137. X  BITMAPADDR            : INTEGER;  { ADDRESS OF BITMAP CONTROL SPACE }
  138. X  FRAMEADDR             : INTEGER;  { ADDRESS OF BITMAP FRAME BUFFER }
  139. X  REPLREGCOPY           : SHORTINT; { REGISTER COPIES FOR BITMAP DISPLAY }
  140. X  WINDOWREGCOPY         : SHORTINT; { MUST BE IN GLOBALS BECAUSE REGISTERS }
  141. X  WRITEREGCOPY          : SHORTINT; { ARE NOT READABLE -- MAY BE UNDEFINED }
  142. X {* KEYBOARD *******************************************}
  143. X CONST
  144. X   KBD_ENABLE     = 0; KBD_DISABLE    = 1;
  145. X   SET_AUTO_DELAY = 2; SET_AUTO_REPEAT= 3;
  146. X   GET_AUTO_DELAY = 4; GET_AUTO_REPEAT= 5;
  147. X   SET_KBDTYPE    = 6; SET_KBDLANG    = 7;
  148. X TYPE
  149. X   STRING80PTR = ^STRING80;
  150. X   KEYBOARDTYPE = (NOKBD,LARGEKBD,SMALLKBD,ITFKBD,SPECIALKBD1,SPECIALKBD2);
  151. X   LANGTYPE = (NO_KBD,FINISH_KBD,BELGIAN_KBD,CDN_ENG_KBD,CDN_FR_KBD,
  152. X               NORWEGIAN_KBD,DANISH_KBD,DUTCH_KBD,SWISS_GR_KBD,SWISS_FR_KBD,
  153. X               SPANISH_EUR_KBD,SPANISH_LATIN_KBD,UK_KBD,ITALIAN_KBD,
  154. X               FRENCH_KBD,GERMAN_KBD,SWEDISH_KBD,SPANISH_KBD,
  155. X               KATAKANA_KBD,US_KBD,ROMAN8_KBD,NS1_KBD,NS2_KBD,NS3_KBD,
  156. X               SWISS_GR_B_KBD,SWISS_FR_B_KBD {ADDED FOR 3.1--SFB-5/22/85} );
  157. X   MENUTYPE = (M_NONE,M_SYSNORM,M_SYSSHIFT,M_U1,M_U2,M_U3,M_U4);
  158. X VAR
  159. X   KBDREQHOOK   : REQUEST1TYPE;
  160. X   KBDIOHOOK    : AMTYPE;
  161. X   KBDISRHOOK   : KBDHOOKTYPE;
  162. X   KBDPOLLHOOK  : BOOLPROC;
  163. X   KBDTYPE      : KEYBOARDTYPE;
  164. X   KBDCONFIG    : BYTE;         { KEYBOARD CONFIGURATION JUMPER }
  165. X   KBDLANG      : LANGTYPE;
  166. X   SYSMENU      : STRING80PTR;
  167. X   SYSMENUSHIFT : STRING80PTR;
  168. X   MENUSTATE    : MENUTYPE;
  169. X
  170. X{* ENABLE / DISABLE ************************************}
  171. X CONST
  172. X   KBDMASK=1;RESETMASK=2;TIMERMASK=4;PSIMASK=8;FHIMASK=16;
  173. X VAR
  174. X   MASKOPSHOOK : OUT2TYPE; { ENABLE, DISABLE }
  175. X
  176. X{* BEEPER **********************************************}
  177. X VAR
  178. X   BEEPERHOOK: OUT2TYPE;
  179. X   BFREQUENCY, BDURATION: BYTE;
  180. X
  181. X{* RPG *************************************************}
  182. X CONST
  183. X   RPG_ENABLE   = 0; RPG_DISABLE = 1;
  184. X   SET_RPG_RATE = 2; GET_RPG_RATE =3;
  185. X VAR
  186. X   RPGREQHOOK: REQUEST1TYPE;
  187. X   RPGISRHOOK: KBDHOOKTYPE;
  188. X   
  189. X{* BATTERY *********************************************}
  190. XTYPE
  191. X  BATCMDTYPE = PROCEDURE(CMD: BYTE; NUMDATA: INTEGER;
  192. X                         B1, B2, B3, B4, B5: BYTE); 
  193. X  BATREADTYPE= PROCEDURE(VAR DATA: BYTE);
  194. XVAR
  195. X  BATTERYPRESENT[-563]: BOOLEAN;
  196. X  BATCMDHOOK : BATCMDTYPE;
  197. X  BATREADHOOK: BATREADTYPE;
  198. X
  199. X{* CLOCK ***********************************************}
  200. XTYPE
  201. X  RTCTIME = PACKED RECORD 
  202. X               PACKEDTIME,PACKEDDATE:INTEGER;
  203. X            END;
  204. X  CLOCKFUNC = (CGETDATE,CGETTIME,CSETDATE,CSETTIME);
  205. X  CLOCKOP   = (CGET,CSET,CUPDATE);      {CUPDATE ADDED FOR BOBCAT 4/11/85 SFB}
  206. X  CLOCKDATA = RECORD
  207. X                CASE BOOLEAN OF
  208. X                TRUE :(TIMETYPE:TIMEREC);
  209. X                FALSE:(DATETYPE:DATEREC);
  210. X              END;
  211. X  CLOCKREQTYPE = PROCEDURE(CMD:CLOCKFUNC; ANYVAR DATA:CLOCKDATA);
  212. X  CLOCKIOTYPE  = PROCEDURE(CMD:CLOCKOP  ; VAR DATA:RTCTIME);
  213. XVAR
  214. X  CLOCKREQHOOK : CLOCKREQTYPE;  { CLOCK MODULE INTERFACE }
  215. X  CLOCKIOHOOK  : CLOCKIOTYPE;   { CARD DRIVER INTERFACE }
  216. X
  217. X{* TIMER ***********************************************}
  218. XTYPE
  219. X  TIMERTYPES = (CYCLICT,PERIODICT,DELAYT,DELAY7T,MATCHT);
  220. X  TIMEROPTYPE = (SETT,READT,GETTINFO);
  221. X  TIMERDATA = RECORD
  222. X               CASE INTEGER OF
  223. X               0: (COUNT: INTEGER);
  224. X               1: (MATCH: TIMEREC);
  225. X               2: (RESOLUTION,RANGE:INTEGER);
  226. X               END;
  227. X  TIMERIOTYPE = PROCEDURE(TIMER: TIMERTYPES;OP: TIMEROPTYPE;VAR TD: TIMERDATA);
  228. XVAR 
  229. X  TIMERIOHOOK  : TIMERIOTYPE; 
  230. X  TIMERISRHOOK : KBDHOOKTYPE;
  231. X
  232. X
  233. X{* KEYBUFFER *******************************************}
  234. XCONST
  235. X  KMAXBUFSIZE = 255;
  236. XTYPE
  237. X
  238. X  KOPTYPE = (KGETCHAR,KAPPEND,KNONADVANCE,KCLEAR,KDISPLAY,
  239. X             KGETLAST,KPUTFIRST);
  240. X  KBUFTYPE= PACKED ARRAY[0..KMAXBUFSIZE] OF CHAR;
  241. X  KBUFPTR = ^KBUFTYPE;
  242. X  KBUFRECPTR = ^KBUFREC;
  243. X  KBUFREC = RECORD
  244. X              ECHO: BOOLEAN;
  245. X              NON_CHAR: CHAR;
  246. X              MAXSIZE,SIZE,INP,OUTP: INTEGER;
  247. X              BUFFER: KBUFPTR;
  248. X            END;
  249. X  
  250. XVAR
  251. X  KEYBUFFER : KBUFRECPTR;
  252. X  KBDWAITHOOK: PROCEDURE;
  253. X  KBDRELEASEHOOK: PROCEDURE;
  254. X  STATUSLINE: PACKED ARRAY[0..7] OF CHAR;
  255. X  {0  s or f = STEP/FLASH IN PROGRESS (WAITING FOR TRAP #0)}
  256. X  {1..5  last executed/current line number }
  257. X  {6  S=SYSTEM  U=USER  DEFINITION FOR ITF SOFT KEYS}
  258. X  {   BLANK FOR NON ITF KEYBOARDS }
  259. X  {7  RUNLIGHT }
  260. X
  261. X{* KEY TRANSLATION SERVICES ********************************}
  262. XTYPE
  263. X  KEYTRANSTYPE =(KPASSTHRU,KSHIFT_EXTC,KPASS_EXTC);
  264. X  KEYTYPE = (ALPHA_KEY,NONADV_KEY,SPECIAL_KEY,IGNORED_KEY,NONA_ALPHA_KEY);
  265. X  { ADDED NONA_ALPHA_KEY 5/9/84 RQ/SFB }
  266. X  
  267. X  LANGCOMREC = RECORD
  268. X                 STATUS : BYTE;
  269. X                 DATA   : BYTE;
  270. X                 KEY    : CHAR;
  271. X                 RESULT : KEYTYPE;
  272. X                 SHIFT,CONTROL,EXTENSION: BOOLEAN;
  273. X               END;
  274. X  LANGKEYREC = RECORD
  275. X                 NO_CAPSLOCK: BOOLEAN;
  276. X                 NO_SHIFT   : BOOLEAN;
  277. X                 NO_CONTROL : BOOLEAN;
  278. X                 NO_EXTENSION : BOOLEAN;
  279. X                 KEYCLASS   : KEYTYPE;
  280. X                 KEYS : ARRAY[BOOLEAN] OF CHAR;
  281. X               END;
  282. X  LANGRECORD= RECORD
  283. X                CAN_NONADV: BOOLEAN;
  284. X                LANGCODE  : LANGTYPE;
  285. X                SEMANTICS : PROCEDURE;
  286. X                KEYTABLE  : ARRAY[0..127] OF LANGKEYREC;
  287. X              END;
  288. X  LANGPTR   = ^LANGRECORD;
  289. XVAR
  290. X  LANGCOM   : LANGCOMREC;
  291. X  LANGTABLE : ARRAY[0..1] OF LANGPTR;
  292. X  LANGINDEX : 0..1;
  293. X  KBDTRANSHOOK : KBDHOOKTYPE;
  294. X  TRANSMODE : KEYTRANSTYPE;
  295. X  KBDSYSMODE, KBDALTLOCK, KBDCAPSLOCK : BOOLEAN;
  296. X  
  297. X{* HPHIL ***********************************************}
  298. X{MOVED INTO SYSDEVS 4/6/84 SFB}
  299. Xconst
  300. X  le_configured = hex('80');
  301. X  le_error      = hex('81');
  302. X  le_timeout    = hex('82');
  303. X  le_loopdown   = hex('84');
  304. X  
  305. X  lmaxdevices   = 7;
  306. X  
  307. Xtype
  308. X  loopdvrop   = (datastarting,dataended,resetdevice,uninitdevice);
  309. X                 {UNINIT ADDED 4/8/85 SFB}
  310. X  loopdvrproc = procedure(op:loopdvrop);
  311. X  
  312. X  {HPHILOP DEFINED AS NEW TYPE 4/6/84 SFB}
  313. X  HPHILOP      = (RAWSHIFTOP,NORMSHIFTOP,CHECKLOOPOP,CONFIGUREOP,LCOMMANDOP);
  314. X  {5 PROCEDURES HOOKED AS TYPE HPHILCMDPROC 4/6/84 SFB}
  315. X  HPHILCMDPROC = PROCEDURE(OP : HPHILOP);
  316. X  
  317. X  
  318. X  descriprec = packed record    { DEVICE DESCRIBE RECORD }
  319. X                 case boolean of
  320. X                 true :(id       : byte;
  321. X                        twosets  : boolean;
  322. X                        abscoords: boolean;
  323. X                        size16   : boolean;
  324. X                        hasprompts:boolean;
  325. X                      { reserved : 0..3;        {DELETED 3/25/85 SFB}
  326. X                        ext_desc : boolean;     {3/27/85 SFB}
  327. X                        security : boolean;     {3/26/85 SFB}
  328. X                        numaxes  : 0..3;
  329. X                        counts   : shortint;
  330. X                        maxcountx: shortint;
  331. X                        maxcounty: shortint;
  332. X                        maxcountz: shortint;
  333. X                        promptack: boolean;     {ADDED 3/15/85 SFB}
  334. X                        nprompts : 0..7;
  335. X                        proximity: boolean;     {ADDED 3/15/85 SFB}
  336. X                        nbuttons : 0..7);
  337. X                 false:(darray : array[1..11] of char);
  338. X               end;
  339. X  
  340. X  devicerec = record
  341. X                devstate : integer;
  342. X                descrip : descriprec;
  343. X                opsproc  : loopdvrproc;
  344. X                dataproc : kbdhooktype;
  345. X              end;
  346. X  
  347. X  loopdvrptr = ^loopdriverrec;
  348. X  loopdriverrec = record
  349. X                    lowid,highid,daddr : byte;
  350. X                    opsproc  : loopdvrproc;
  351. X                    dataproc : kbdhooktype;
  352. X                    next     : loopdvrptr;
  353. X                  end;
  354. X  
  355. X  LOOPCONTROLREC = RECORD                   {REDEFINED AS RECORD - 4/6/84 SFB}
  356. X        rawmode : boolean;
  357. X        loopdevices : array[1..lmaxdevices] of devicerec;
  358. X        loopdevice : 1..lmaxdevices;
  359. X        loopcmd    : byte;    { last loop command sent }
  360. X        loopdata   : byte;    { data bye in / out }
  361. X        looperror  : boolean; { error occured on last operation }
  362. X        loopinconfig:boolean; { now doing reconfigure }
  363. X        loopcmddone: boolean; { last sent command is done }
  364. X        loopisok   : boolean; { loop is configured }
  365. X        loopdevreading: boolean; { reading poll data }  { 3.0 BUG #39 3/17/84 }
  366. X  END;
  367. X  
  368. X  CONST                         {NEW TO END OF HPHIL_COMM_REC TYPE 3/26/85 SFB}
  369. X  
  370. X  
  371. X  {DRIVER TYPES}
  372. X  NODRIVER   =  0;
  373. X  ABSLOCATOR =  1;        {range 1..15 reserved for DGL}
  374. X  
  375. X  {CODETYPES FROM POLLBLOCK (OR OTHER HPHIL OPCODE)}
  376. X  NOCODES       = 0;
  377. X  ASCIICODES    = 1;
  378. X  SET1CODES     = 2;
  379. X  SET2CODES     = 3;
  380. X  
  381. X  TYPE
  382. X  
  383. X  HPHIL_COMM_REC_PTR_TYPE = ^hphil_comm_rec_type;  {3/25/85 SFB}
  384. X  
  385. X  HPHIL_COMM_REC_TYPE = RECORD CASE BOOLEAN OF              {3/25/85 SFB}
  386. X   TRUE :
  387. X         (dvr_type        : shortint;
  388. X          dev_addr        : 0..7;
  389. X          latch,                  {stop updating data after button press/event}
  390. X          active,                 {capture data in ISR}
  391. X          reading         : boolean;  {dvr_comm_rec busy, delay update from ISR}
  392. X          devices         : byte; {bit/loopaddress that driver should service
  393. X                                   put 0 where driver should NOT service device
  394. X                                   with this dvr_comm_rec !}
  395. X          update          : procedure(recptr : hphil_comm_rec_ptr_type);
  396. X                                  {call update to flush delayed poll data update}
  397. X          link            : hphil_comm_rec_ptr_type;  {next comm record}
  398. X          extend          : integer; {for extensibility use as pointer/datarec}
  399. X          
  400. X          xloc,                   {HPHIL intrinsic data types from poll/command}
  401. X          yloc,
  402. X          zloc            : shortint;
  403. X          codetype        : shortint;     {describes content of codes}
  404. X          ncodes          : shortint;
  405. X          codes           : packed array [1..16] of char 
  406. X                               {extensible for variant} );
  407. X   FALSE:
  408. X         (barray          : array[0..53] of char);
  409. X  END;
  410. X
  411. Xvar
  412. X   
  413. X  loopdriverlist : loopdvrptr;
  414. X  LOOPCONTROL    : ^LOOPCONTROLREC;     {4/6/84 SFB}
  415. X  HPHILCMDHOOK   : HPHILCMDPROC;        {4/6/84 SFB}
  416. X  
  417. X  HPHIL_DATA_LINK : hphil_comm_rec_ptr_type;  {3/13/85 SFB}
  418. X
  419. X{-----------------------------------------------------------------------------}
  420. XPROCEDURE SYSDEV_INIT;
  421. X{* BEEPER **********************************************}
  422. XPROCEDURE BEEP;
  423. XPROCEDURE BEEPER(FREQUENCY,DURATION:BYTE);
  424. X{* RPG *************************************************}
  425. XPROCEDURE SETRPGRATE(RATE : BYTE);
  426. X{* KEYBOARD ********************************************}
  427. XPROCEDURE KBDSETUP(CMD,VALUE:BYTE);
  428. XPROCEDURE KBDIO(FP: FIBP; REQUEST: AMREQUESTTYPE;
  429. X                ANYVAR BUFFER: WINDOW; BUFSIZE,POSITION: INTEGER);
  430. Xprocedure lockedaction(a: action); 
  431. X{* CRT *************************************************}
  432. XPROCEDURE CRTIO(FP: FIBP; REQUEST: AMREQUESTTYPE;
  433. X                ANYVAR BUFFER: WINDOW; BUFSIZE,POSITION: INTEGER);
  434. XPROCEDURE DUMMYCRTLL(OP:CRTLLOPS; ANYVAR POSITION:INTEGER; C:CHAR);
  435. X{* BATTERY *********************************************}
  436. XPROCEDURE BATCOMMAND(CMD:BYTE; NUMDATA:INTEGER; B1, B2, B3, B4, B5: BYTE); 
  437. XFUNCTION  BATBYTERECEIVED:BYTE;
  438. X{* CLOCK ***********************************************}
  439. Xfunction  sysclock: integer;   {centiseconds from midnight} 
  440. Xprocedure sysdate (var thedate: daterec); 
  441. Xprocedure systime (var thetime: timerec); 
  442. Xprocedure setsysdate ( thedate: daterec); 
  443. Xprocedure setsystime ( thetime: timerec); 
  444. X{* KEYBUFFER *******************************************}
  445. XPROCEDURE KEYBUFOPS(OP:KOPTYPE; VAR C: CHAR);
  446. X{* STATUSLINE ******************************************}
  447. XPROCEDURE SETSTATUS(N:INTEGER; C:CHAR);
  448. XFUNCTION  RUNLIGHT:CHAR;
  449. XPROCEDURE SETRUNLIGHT(C:CHAR);
  450. X
  451. X
  452. Xend.
  453. X
  454. X
  455. END_OF_FILE
  456. if test 15631 -ne `wc -c <'HP/import/sysdevs.imp'`; then
  457.     echo shar: \"'HP/import/sysdevs.imp'\" unpacked with wrong size!
  458. fi
  459. # end of 'HP/import/sysdevs.imp'
  460. fi
  461. if test -f 'src/makeproto.c' -a "${1}" != "-c" ; then 
  462.   echo shar: Will not clobber existing file \"'src/makeproto.c'\"
  463. else
  464. echo shar: Extracting \"'src/makeproto.c'\" \(16377 characters\)
  465. sed "s/^X//" >'src/makeproto.c' <<'END_OF_FILE'
  466. X
  467. X/* "makeproto"  Copyright 1989  Dave Gillespie */
  468. X
  469. X
  470. X/* Program to scan old-style source files and make prototypes */
  471. X
  472. X
  473. X
  474. X#include <stdio.h>
  475. X#include <ctype.h>
  476. X#include <time.h>
  477. X
  478. X#ifdef FILE       /* a #define in BSD, a typedef in SYSV (hp-ux, at least) */
  479. X# ifndef BSD
  480. X#  define BSD 1
  481. X# endif
  482. X#endif
  483. X
  484. X#ifdef BSD
  485. X# include <strings.h>
  486. X#else
  487. X# include <string.h>
  488. X#endif
  489. X
  490. X
  491. X
  492. X#define isidchar(x)    (isalnum(x) || (x) == '_')
  493. X
  494. X#define dprintf        if (!debug) ; else printf
  495. X
  496. X#define MAXARGS        16
  497. X
  498. X
  499. X
  500. Xint verbose, debug, incomment;
  501. X
  502. X
  503. Xstruct warnstruct {
  504. X    char *bad, *good;
  505. X} warntypes[] = {
  506. X    { "char",             "int" },
  507. X    { "signed char",      "int" },
  508. X    { "unsigned char",    "int" },
  509. X    { "short",            "int" },
  510. X    { "signed short",     "int" },
  511. X    { "unsigned short",   "int" },
  512. X    { "boolean",          "int" },
  513. X    { "Boolean",          "int" },
  514. X    { "float",            "double" },
  515. X    { NULL, NULL }
  516. X} ;
  517. X
  518. X
  519. X
  520. Xint readline(buf, inf)
  521. Xchar *buf;
  522. XFILE *inf;
  523. X{
  524. X    char *cp, *cp2;
  525. X    int spflag;
  526. X
  527. X    for (;;) {
  528. X        if (fgets(buf, 1000, inf)) {
  529. X            cp = buf;
  530. X            cp2 = buf;
  531. X            spflag = 0;
  532. X            while (*cp) {
  533. X                if (incomment) {
  534. X                    if (cp[0] == '*' && cp[1] == '/') {
  535. X                        incomment = 0;
  536. X                        cp += 2;
  537. X                    } else
  538. X                        cp++;
  539. X                    spflag = 1;
  540. X                } else {
  541. X                    if (cp[0] == '/' && cp[1] == '*') {
  542. X                        incomment = 1;
  543. X                        cp += 2;
  544. X                    } else if (isspace(*cp)) {
  545. X                        spflag = 1;
  546. X                        cp++;
  547. X                    } else {
  548. X                        if (spflag)
  549. X                            *cp2++ = ' ';
  550. X                        *cp2++ = *cp++;
  551. X                        spflag = 0;
  552. X                    }
  553. X                }
  554. X            }
  555. X            *cp2 = 0;
  556. X            if (!*buf)
  557. X                continue;
  558. X            if (verbose)
  559. X                printf("\217%s\210\n", buf);
  560. X            return 1;
  561. X        } else
  562. X            strcpy(buf, "\001");
  563. X            return 0;
  564. X    }
  565. X}
  566. X
  567. X
  568. X
  569. X
  570. Xint strbeginsword(s1, s2)
  571. Xregister char *s1, *s2;
  572. X{
  573. X    while (*s2 && *s1 == *s2)
  574. X        s1++, s2++;
  575. X    return (!*s2 && !isidchar(*s1));
  576. X}
  577. X
  578. X
  579. X
  580. X
  581. Xvoid usage()
  582. X{
  583. X    fprintf(stderr, "usage:  makeproto [options] [infile ...] [-o outfile]]\n");
  584. X    fprintf(stderr, "           -tnnn   Tab to nnn after type name [default 15]\n");
  585. X    fprintf(stderr, "           -annn   Tab to nnn before arguments [default 30]\n");
  586. X    fprintf(stderr, "           -s0     Omit functions declared static\n");
  587. X    fprintf(stderr, "           -s1     Omit functions not declared static\n");
  588. X    fprintf(stderr, "           -x      Add \"extern\" keyword (-X => \"Extern\")\n");
  589. X    fprintf(stderr, "           -n      Include argument names in prototypes\n");
  590. X    fprintf(stderr, "           -m      Use PP/PV macro notation\n");
  591. X    exit(1);
  592. X}
  593. X
  594. X
  595. X
  596. X
  597. X#define bounce(msg)   do {  if (verbose) printf("Bounced: %s\n", msg); if (stupid) goto Lbounce;  } while (0)
  598. X
  599. X
  600. X
  601. X
  602. X
  603. Xmain(argc, argv)
  604. Xint argc;
  605. Xchar **argv;
  606. X{
  607. X    FILE *inf, *outf;
  608. X    char outfname[256];
  609. X    char buf[1000], ifdefname[256];
  610. X    char ftype[256], fname[80], dtype[256], decl[256], dname[80], temp[256];
  611. X    char argdecls[MAXARGS][256], argnames[MAXARGS][80];
  612. X    char *cp, *cp2, *cp3;
  613. X    int i, j, pos, len, thistab, numstars, whichf, nargs, incomment, errors = 0;
  614. X    long li;
  615. X    int typetab = 15, argtab = 30, width = 80, usenames = 0, usemacros = 0;
  616. X    int useextern = 0, staticness = -1, hasheader = 0, useifdefs = 0;
  617. X    int stupid = 1, firstdecl;
  618. X
  619. X    errors = 0;
  620. X    verbose = 0;
  621. X    debug = 0;
  622. X    *outfname = 0;
  623. X    while (argc > 1 && argv[1][0] == '-') {
  624. X        if (argv[1][1] == 't') {
  625. X            typetab = atoi(argv[1] + 2);
  626. X        } else if (argv[1][1] == 'a') {
  627. X            argtab = atoi(argv[1] + 2);
  628. X        } else if (argv[1][1] == 'w') {
  629. X            width = atoi(argv[1] + 2);
  630. X        } else if (argv[1][1] == 's') {
  631. X            staticness = atoi(argv[1] + 2);
  632. X        } else if (argv[1][1] == 'v') {
  633. X            verbose = 1;
  634. X        } else if (argv[1][1] == 'D') {
  635. X            debug = 1;
  636. X        } else if (argv[1][1] == 'x') {
  637. X            useextern = 1;
  638. X        } else if (argv[1][1] == 'X') {
  639. X            useextern = 2;
  640. X        } else if (argv[1][1] == 'n') {
  641. X            usenames = 1;
  642. X        } else if (argv[1][1] == 'm') {
  643. X            usemacros = 1;
  644. X        } else if (argv[1][1] == 'h') {
  645. X            hasheader = 1;
  646. X        } else if (argv[1][1] == 'i') {
  647. X            useifdefs = 1;
  648. X        } else if (argv[1][1] == 'o' && argc > 2) {
  649. X            strcpy(outfname, argv[2]);
  650. X            argc--, argv++;
  651. X        } else {
  652. X            usage();
  653. X        }
  654. X        argc--, argv++;
  655. X    }
  656. X    if (argc > 2 && !strcmp(argv[argc-2], "-o")) {
  657. X        strcpy(outfname, argv[argc-1]);
  658. X        argc -= 2;
  659. X    }
  660. X    if (*outfname) {
  661. X        outf = fopen(outfname, "w");
  662. X        if (!outf) {
  663. X            perror(outfname);
  664. X            exit(1);
  665. X        }
  666. X    } else
  667. X        outf = stdout;
  668. X    if (hasheader) {
  669. X        time(&li);
  670. X        cp = ctime(&li);
  671. X        cp[24] = 0;
  672. X        fprintf(outf, "\n/* Declarations created by \"makeproto\" on %s */\n", cp);
  673. X        fprintf(outf, "\n\n");
  674. X    }
  675. X    incomment = 0;
  676. X    for (whichf = 1; whichf < argc + (argc < 2); whichf++) {
  677. X        if (whichf >= argc || !strcmp(argv[whichf], "-")) {
  678. X            inf = stdin;
  679. X        } else {
  680. X            inf = fopen(argv[whichf], "r");
  681. X            if (!inf) {
  682. X                perror(argv[whichf]);
  683. X                fprintf(outf, "\n/* Unable to open file %s */\n", argv[whichf]);
  684. X                errors++;
  685. X                continue;
  686. X            }
  687. X        }
  688. X        firstdecl = 1;
  689. X        while (readline(buf, inf)) {
  690. X            if (!isidchar(*buf))
  691. X                continue;
  692. X            cp = buf;
  693. X            cp2 = ftype;
  694. X            numstars = 0;
  695. X            while (isspace(*cp) || isidchar(*cp))
  696. X                *cp2++ = *cp++;
  697. X            if (*cp == '*') {
  698. X                while (*cp == '*' || isspace(*cp)) {
  699. X                    if (*cp == '*')
  700. X                        numstars++;
  701. X                    cp++;
  702. X                }
  703. X            } else {
  704. X                while (cp > buf && isspace(cp[-1])) cp--, cp2--;
  705. X                while (cp > buf && isidchar(cp[-1])) cp--, cp2--;
  706. X            }
  707. X            while (cp2 > ftype && isspace(cp2[-1])) cp2--;
  708. X            *cp2 = 0;
  709. X            if (!*ftype)
  710. X                strcpy(ftype, "int");
  711. X            dprintf("numstars is %d\n", numstars);   /***/
  712. X            dprintf("ftype is %s\n", ftype);     /***/
  713. X            dprintf("cp after ftype is %s\n", cp);     /***/
  714. X            if (strbeginsword(ftype, "static") || strbeginsword(ftype, "Static")) {
  715. X                if (staticness == 0)
  716. X                    bounce("Function is static");
  717. X            } else {
  718. X                if (staticness == 1)
  719. X                    bounce("Function is not static");
  720. X                if (useextern &&
  721. X                     !strbeginsword(ftype, "extern") && !strbeginsword(ftype, "Extern")) {
  722. X                    sprintf(temp, useextern == 2 ? "Extern %s" : "extern %s", ftype);
  723. X                    strcpy(ftype, temp);
  724. X                }
  725. X            }
  726. X            while (isspace(*cp)) cp++;
  727. X            if (!*cp) {
  728. X                readline(buf, inf);
  729. X                cp = buf;
  730. X            }
  731. X            dprintf("cp before fname is %s\n", cp);     /***/
  732. X            if (!isidchar(*cp))
  733. X                bounce("No function name");
  734. X            cp2 = fname;
  735. X            while (isidchar(*cp))
  736. X                *cp2++= *cp++;
  737. X            *cp2 = 0;
  738. X            dprintf("fname is %s\n", fname);     /***/
  739. X            dprintf("cp after fname is %s\n", cp);     /***/
  740. X            while (isspace(*cp)) cp++;
  741. X            if (*cp++ != '(')
  742. X                bounce("No function '('");
  743. X            nargs = 0;
  744. X            if (!*cp) {
  745. X                readline(buf, inf);
  746. X                cp = buf;
  747. X            }
  748. X            while (isspace(*cp)) cp++;
  749. X            while (*cp != ')') {
  750. X                if (!isidchar(*cp))
  751. X                    bounce("Missing argument name");
  752. X                if (nargs >= MAXARGS)
  753. X                    bounce("Too many arguments");
  754. X                cp2 = argnames[nargs];
  755. X                argdecls[nargs][0] = 0;
  756. X                nargs++;
  757. X                while (isidchar(*cp))
  758. X                    *cp2++ = *cp++;
  759. X                *cp2 = 0;
  760. X                dprintf("Argument %d is named %s\n", nargs-1, argnames[nargs-1]);    /***/
  761. X                while (isspace(*cp)) cp++;
  762. X                if (*cp == ',') {
  763. X                    cp++;
  764. X                    if (!*cp) {
  765. X                        readline(buf, inf);
  766. X                        cp = buf;
  767. X                    }
  768. X                    while (isspace(*cp)) cp++;
  769. X                } else if (*cp != ')')
  770. X                    bounce("Missing function ')'");
  771. X            }
  772. X            if (cp[1])
  773. X                bounce("Characters after function ')'");
  774. X            readline(buf, inf);
  775. X            cp = buf;
  776. X            for (;;) {
  777. X                while (isspace(*cp)) cp++;
  778. X                if (isidchar(*cp)) {
  779. X                    cp2 = dtype;
  780. X                    if (strbeginsword(cp, "register")) {
  781. X                        cp += 8;
  782. X                        while (isspace(*cp)) cp++;
  783. X                    }
  784. X                    while (isspace(*cp) || isidchar(*cp))
  785. X                        *cp2++ = *cp++;
  786. X                    if (*cp == ',' || *cp == ';' || *cp == '[') {
  787. X                        while (cp2 > dtype && isspace(cp2[-1])) cp--, cp2--;
  788. X                        while (cp2 > dtype && isidchar(cp2[-1])) cp--, cp2--;
  789. X                    } else if (*cp != '(' && *cp != '*')
  790. X                        bounce("Strange character in arg decl");
  791. X                    while (cp2 > dtype && isspace(cp2[-1])) cp2--;
  792. X                    *cp2 = 0;
  793. X                    if (!*dtype)
  794. X                        bounce("Empty argument type");
  795. X                    for (;;) {
  796. X                        cp2 = decl;
  797. X                        cp3 = dname;
  798. X                        while (*cp == '*' || *cp == '(' || isspace(*cp))
  799. X                            *cp2++ = *cp++;
  800. X                        if (!isidchar(*cp))
  801. X                            bounce("Missing arg decl name");
  802. X                        while (isidchar(*cp)) {
  803. X                            if (usenames)
  804. X                                *cp2++ = *cp;
  805. X                            *cp3++ = *cp++;
  806. X                        }
  807. X                        if (!usenames) {
  808. X                            while (cp2 > decl && isspace(cp2[-1])) cp2--;
  809. X                            while (isspace(*cp)) cp++;
  810. X                        }
  811. X                        i = 0;
  812. X                        while (*cp && *cp != ';' && (*cp != ',' || i > 0)) {
  813. X                            if (*cp == '(' || *cp == '[') i++;
  814. X                            if (*cp == ')' || *cp == ']') i--;
  815. X                            *cp2++ = *cp++;
  816. X                        }
  817. X                        *cp2 = 0;
  818. X                        *cp3 = 0;
  819. X                        dprintf("Argument %s is %s\n", dname, decl);     /***/
  820. X                        if (i > 0)
  821. X                            bounce("Unbalanced parens in arg decl");
  822. X                        if (!*cp)
  823. X                            bounce("Missing ';' or ',' in arg decl");
  824. X                        for (i = 0; i < nargs && strcmp(argnames[i], dname); i++) ;
  825. X                        if (i >= nargs)
  826. X                            bounce("Arg decl name not in argument list");
  827. X                        if (*decl)
  828. X                            sprintf(argdecls[i], "%s %s", dtype, decl);
  829. X                        else
  830. X                            strcpy(argdecls[i], dtype);
  831. X                        if (*cp == ',') {
  832. X                            cp++;
  833. X                            if (!*cp) {
  834. X                                readline(buf, inf);
  835. X                                cp = buf;
  836. X                            }
  837. X                            while (isspace(*cp)) cp++;
  838. X                        } else
  839. X                            break;
  840. X                    }
  841. X                    cp++;
  842. X                    if (!*cp) {
  843. X                        readline(buf, inf);
  844. X                        cp = buf;
  845. X                    }
  846. X                } else
  847. X                    break;
  848. X            }
  849. X            if (*cp != '{')
  850. X                bounce("Missing function '{'");
  851. X            if (firstdecl) {
  852. X                firstdecl = 0;
  853. X                if (argc > 2)
  854. X                    fprintf(outf, "\n/* Declarations from %s */\n", argv[whichf]);
  855. X                if (useifdefs && inf != stdin) {
  856. X                    strcpy(ifdefname, argv[whichf]);
  857. X            cp = ifdefname;
  858. X            for (cp2 = ifdefname; *cp2; ) {
  859. X            if (*cp2++ == '/')
  860. X                cp = cp2;
  861. X            }
  862. X                    for (cp2 = ifdefname; *cp; cp++, cp2++) {
  863. X                if (islower(*cp))
  864. X                *cp2 = toupper(*cp);
  865. X                        else if (isalnum(*cp))
  866. X                            *cp2 = *cp;
  867. X                        else
  868. X                            *cp2 = '_';
  869. X                    }
  870. X                    fprintf(outf, "#ifdef PROTO_%s\n", ifdefname);
  871. X                }
  872. X            }
  873. X            for (i = 0; i < nargs; i++) {
  874. X                if (!argdecls[i][0])
  875. X                    sprintf(argdecls[i], "int %s", argnames[i]);
  876. X                for (j = 0; warntypes[j].bad &&
  877. X                            !strbeginsword(argdecls[i], warntypes[j].bad); j++) ;
  878. X                if (warntypes[j].bad) {
  879. X                    cp = argdecls[i];
  880. X                    while (isspace(*cp) || isidchar(*cp)) cp++;
  881. X                    if (!*cp) {     /* not, e.g., "char *" */
  882. X                        sprintf(temp, "%s%s", warntypes[j].good,
  883. X                                              argdecls[i] + strlen(warntypes[j].bad));
  884. X                        strcpy(argdecls[i], temp);
  885. X                        fprintf(stderr, "Warning: Argument %s of %s has type %s\n",
  886. X                                        argnames[i], fname, warntypes[j]);
  887. X                    }
  888. X                }
  889. X            }
  890. X            if (verbose && outf != stdout)
  891. X                printf("Found declaration for %s\n", fname);
  892. X            fprintf(outf, "%s", ftype);
  893. X            pos = strlen(ftype) + numstars;
  894. X            do {
  895. X                putc(' ', outf);
  896. X                pos++;
  897. X            } while (pos < typetab);
  898. X            for (i = 1; i <= numstars; i++)
  899. X                putc('*', outf);
  900. X            fprintf(outf, "%s", fname);
  901. X            pos += strlen(fname);
  902. X            do {
  903. X                putc(' ', outf);
  904. X                pos++;
  905. X            } while (pos < argtab);
  906. X            if (nargs == 0) {
  907. X                if (usemacros)
  908. X                    fprintf(outf, "PV();");
  909. X                else
  910. X                    fprintf(outf, "(void);");
  911. X            } else {
  912. X                if (usemacros)
  913. X                    fprintf(outf, "PP( ("), pos += 5;
  914. X                else
  915. X                    fprintf(outf, "("), pos++;
  916. X                thistab = pos;
  917. X                for (i = 0; i < nargs; i++) {
  918. X                    len = strlen(argdecls[i]);
  919. X                    if (i > 0) {
  920. X                        putc(',', outf);
  921. X                        pos++;
  922. X                        if (pos > thistab && pos + len >= width) {
  923. X                            putc('\n', outf);
  924. X                            for (j = 1; j <= thistab; j++)
  925. X                                putc(' ', outf);
  926. X                            pos = thistab;
  927. X                        } else {
  928. X                            putc(' ', outf);
  929. X                            pos++;
  930. X                        }
  931. X                    }
  932. X                    fprintf(outf, "%s", argdecls[i]);
  933. X                    pos += len;
  934. X                }
  935. X                if (usemacros)
  936. X                    fprintf(outf, ") );");
  937. X                else
  938. X                    fprintf(outf, ");");
  939. X            }
  940. X            putc('\n', outf);
  941. XLbounce: ;
  942. X        }
  943. X        if (inf != stdin) {
  944. X            if (useifdefs && !firstdecl)
  945. X                fprintf(outf, "#endif /*PROTO_%s*/\n", ifdefname);
  946. X            fclose(inf);
  947. X        }
  948. X    }
  949. X    if (hasheader) {
  950. X        fprintf(outf, "\n\n/* End. */\n\n");
  951. X    }
  952. X    if (outf != stdout)
  953. X        fclose(outf);
  954. X    if (errors)
  955. X        exit(1);
  956. X    else
  957. X        exit(0);
  958. X}
  959. X
  960. X
  961. X
  962. X/* End. */
  963. X
  964. X
  965. X
  966. END_OF_FILE
  967. if test 16377 -ne `wc -c <'src/makeproto.c'`; then
  968.     echo shar: \"'src/makeproto.c'\" unpacked with wrong size!
  969. fi
  970. # end of 'src/makeproto.c'
  971. fi
  972. if test -f 'src/p2clib.c' -a "${1}" != "-c" ; then 
  973.   echo shar: Will not clobber existing file \"'src/p2clib.c'\"
  974. else
  975. echo shar: Extracting \"'src/p2clib.c'\" \(16729 characters\)
  976. sed "s/^X//" >'src/p2clib.c' <<'END_OF_FILE'
  977. X
  978. X/* Run-time library for use with "p2c", the Pascal to C translator */
  979. X
  980. X/* "p2c"  Copyright (C) 1989 Dave Gillespie.
  981. X * This file may be copied, modified, etc. in any way.  It is not restricted
  982. X * by the licence agreement accompanying p2c itself.
  983. X */
  984. X
  985. X
  986. X
  987. X#include "p2c.h"
  988. X
  989. X
  990. X/* #define LACK_LABS     */   /* Define these if necessary */
  991. X/* #define LACK_MEMMOVE  */
  992. X
  993. X
  994. X#ifndef NO_TIME
  995. X# include <time.h>
  996. X#endif
  997. X
  998. X
  999. X#define Isspace(c)  isspace(c)      /* or "((c) == ' ')" if preferred */
  1000. X
  1001. X
  1002. X
  1003. X
  1004. Xint P_argc;
  1005. Xchar **P_argv;
  1006. X
  1007. Xshort P_escapecode;
  1008. Xint P_ioresult;
  1009. X
  1010. Xlong EXCP_LINE;    /* Used by Pascal workstation system */
  1011. X
  1012. XAnyptr __MallocTemp__;
  1013. X
  1014. X__p2c_jmp_buf *__top_jb;
  1015. X
  1016. X
  1017. X
  1018. X
  1019. Xvoid PASCAL_MAIN(argc, argv)
  1020. Xint argc;
  1021. Xchar **argv;
  1022. X{
  1023. X    P_argc = argc;
  1024. X    P_argv = argv;
  1025. X    __top_jb = NULL;
  1026. X
  1027. X#ifdef LOCAL_INIT
  1028. X    LOCAL_INIT();
  1029. X#endif
  1030. X}
  1031. X
  1032. X
  1033. X
  1034. X
  1035. X
  1036. X/* In case your system lacks these... */
  1037. X
  1038. X#ifdef LACK_LABS
  1039. Xlong labs(x)
  1040. Xlong x;
  1041. X{
  1042. X    return((x > 0) ? x : -x);
  1043. X}
  1044. X#endif
  1045. X
  1046. X
  1047. X#ifdef LACK_MEMMOVE
  1048. XAnyptr memmove(d, s, n)
  1049. XAnyptr d, s;
  1050. Xregister long n;
  1051. X{
  1052. X    if (d < s || d - s >= n) {
  1053. X    memcpy(d, s, n);
  1054. X    return d;
  1055. X    } else if (n > 0) {
  1056. X    register char *dd = d + n, *ss = s + n;
  1057. X    while (--n >= 0)
  1058. X        *--dd = *--ss;
  1059. X    }
  1060. X    return d;
  1061. X}
  1062. X#endif
  1063. X
  1064. X
  1065. Xint my_toupper(c)
  1066. Xint c;
  1067. X{
  1068. X    if (islower(c))
  1069. X    return _toupper(c);
  1070. X    else
  1071. X    return c;
  1072. X}
  1073. X
  1074. X
  1075. Xint my_tolower(c)
  1076. Xint c;
  1077. X{
  1078. X    if (isupper(c))
  1079. X    return _tolower(c);
  1080. X    else
  1081. X    return c;
  1082. X}
  1083. X
  1084. X
  1085. X
  1086. X
  1087. Xlong ipow(a, b)
  1088. Xlong a, b;
  1089. X{
  1090. X    long v;
  1091. X
  1092. X    if (a == 0 || a == 1)
  1093. X    return a;
  1094. X    if (a == -1)
  1095. X    return (b & 1) ? -1 : 1;
  1096. X    if (b < 0)
  1097. X    return 0;
  1098. X    if (a == 2)
  1099. X    return 1 << b;
  1100. X    v = (b & 1) ? a : 1;
  1101. X    while ((b >>= 1) > 0) {
  1102. X    a *= a;
  1103. X    if (b & 1)
  1104. X        v *= a;
  1105. X    }
  1106. X    return v;
  1107. X}
  1108. X
  1109. X
  1110. X
  1111. X
  1112. X/* Common string functions: */
  1113. X
  1114. X/* Store in "ret" the substring of length "len" starting from "pos" (1-based).
  1115. X   Store a shorter or null string if out-of-range.  Return "ret". */
  1116. X
  1117. Xchar *strsub(ret, s, pos, len)
  1118. Xregister char *ret, *s;
  1119. Xregister int pos, len;
  1120. X{
  1121. X    register char *s2;
  1122. X
  1123. X    if (--pos < 0 || len <= 0) {
  1124. X        *ret = 0;
  1125. X        return ret;
  1126. X    }
  1127. X    while (pos > 0) {
  1128. X        if (!*s++) {
  1129. X            *ret = 0;
  1130. X            return ret;
  1131. X        }
  1132. X        pos--;
  1133. X    }
  1134. X    s2 = ret;
  1135. X    while (--len >= 0) {
  1136. X        if (!(*s2++ = *s++))
  1137. X            return ret;
  1138. X    }
  1139. X    *s2 = 0;
  1140. X    return ret;
  1141. X}
  1142. X
  1143. X
  1144. X/* Return the index of the first occurrence of "pat" as a substring of "s",
  1145. X   starting at index "pos" (1-based).  Result is 1-based, 0 if not found. */
  1146. X
  1147. Xint strpos2(s, pat, pos)
  1148. Xchar *s;
  1149. Xregister char *pat;
  1150. Xregister int pos;
  1151. X{
  1152. X    register char *cp, ch;
  1153. X    register int slen;
  1154. X
  1155. X    if (--pos < 0)
  1156. X        return 0;
  1157. X    slen = strlen(s) - pos;
  1158. X    cp = s + pos;
  1159. X    if (!(ch = *pat++))
  1160. X        return 0;
  1161. X    pos = strlen(pat);
  1162. X    slen -= pos;
  1163. X    while (--slen >= 0) {
  1164. X        if (*cp++ == ch && !strncmp(cp, pat, pos))
  1165. X            return cp - s;
  1166. X    }
  1167. X    return 0;
  1168. X}
  1169. X
  1170. X
  1171. X/* Case-insensitive version of strcmp. */
  1172. X
  1173. Xint strcicmp(s1, s2)
  1174. Xregister char *s1, *s2;
  1175. X{
  1176. X    register unsigned char c1, c2;
  1177. X
  1178. X    while (*s1) {
  1179. X    if (*s1++ != *s2++) {
  1180. X        if (!s2[-1])
  1181. X        return 1;
  1182. X        c1 = toupper(s1[-1]);
  1183. X        c2 = toupper(s2[-1]);
  1184. X        if (c1 != c2)
  1185. X        return c1 - c2;
  1186. X    }
  1187. X    }
  1188. X    if (*s2)
  1189. X    return -1;
  1190. X    return 0;
  1191. X}
  1192. X
  1193. X
  1194. X
  1195. X
  1196. X/* HP and Turbo Pascal string functions: */
  1197. X
  1198. X/* Trim blanks at left end of string. */
  1199. X
  1200. Xchar *strltrim(s)
  1201. Xregister char *s;
  1202. X{
  1203. X    while (Isspace(*s++)) ;
  1204. X    return s - 1;
  1205. X}
  1206. X
  1207. X
  1208. X/* Trim blanks at right end of string. */
  1209. X
  1210. Xchar *strrtrim(s)
  1211. Xregister char *s;
  1212. X{
  1213. X    register char *s2 = s;
  1214. X
  1215. X    while (*++s2) ;
  1216. X    while (s2 > s && Isspace(*--s2))
  1217. X        *s2 = 0;
  1218. X    return s;
  1219. X}
  1220. X
  1221. X
  1222. X/* Store in "ret" "num" copies of string "s".  Return "ret". */
  1223. X
  1224. Xchar *strrpt(ret, s, num)
  1225. Xchar *ret;
  1226. Xregister char *s;
  1227. Xregister int num;
  1228. X{
  1229. X    register char *s2 = ret;
  1230. X    register char *s1;
  1231. X
  1232. X    while (--num >= 0) {
  1233. X        s1 = s;
  1234. X        while ((*s2++ = *s1++)) ;
  1235. X        s2--;
  1236. X    }
  1237. X    return ret;
  1238. X}
  1239. X
  1240. X
  1241. X/* Store in "ret" string "s" with enough pad chars added to reach "size". */
  1242. X
  1243. Xchar *strpad(ret, s, padchar, num)
  1244. Xchar *ret;
  1245. Xregister char *s;
  1246. Xregister int padchar, num;
  1247. X{
  1248. X    register char *d = ret;
  1249. X
  1250. X    if (s == d) {
  1251. X    while (*d++) ;
  1252. X    } else {
  1253. X    while ((*d++ = *s++)) ;
  1254. X    }
  1255. X    num -= (--d - ret);
  1256. X    while (--num >= 0)
  1257. X    *d++ = padchar;
  1258. X    *d = 0;
  1259. X    return ret;
  1260. X}
  1261. X
  1262. X
  1263. X/* Copy the substring of length "len" from index "spos" of "s" (1-based)
  1264. X   to index "dpos" of "d", lengthening "d" if necessary.  Length and
  1265. X   indices must be in-range. */
  1266. X
  1267. Xvoid strmove(len, s, spos, d, dpos)
  1268. Xregister char *s, *d;
  1269. Xregister int len, spos, dpos;
  1270. X{
  1271. X    s += spos - 1;
  1272. X    d += dpos - 1;
  1273. X    while (*d && --len >= 0)
  1274. X    *d++ = *s++;
  1275. X    if (len > 0) {
  1276. X    while (--len >= 0)
  1277. X        *d++ = *s++;
  1278. X    *d = 0;
  1279. X    }
  1280. X}
  1281. X
  1282. X
  1283. X/* Delete the substring of length "len" at index "pos" from "s".
  1284. X   Delete less if out-of-range. */
  1285. X
  1286. Xvoid strdelete(s, pos, len)
  1287. Xregister char *s;
  1288. Xregister int pos, len;
  1289. X{
  1290. X    register int slen;
  1291. X
  1292. X    if (--pos < 0)
  1293. X        return;
  1294. X    slen = strlen(s) - pos;
  1295. X    if (slen <= 0)
  1296. X        return;
  1297. X    s += pos;
  1298. X    if (slen <= len) {
  1299. X        *s = 0;
  1300. X        return;
  1301. X    }
  1302. X    while ((*s = s[len])) s++;
  1303. X}
  1304. X
  1305. X
  1306. X/* Insert string "src" at index "pos" of "dst". */
  1307. X
  1308. Xvoid strinsert(src, dst, pos)
  1309. Xregister char *src, *dst;
  1310. Xregister int pos;
  1311. X{
  1312. X    register int slen, dlen;
  1313. X
  1314. X    if (--pos < 0)
  1315. X        return;
  1316. X    dlen = strlen(dst);
  1317. X    dst += dlen;
  1318. X    dlen -= pos;
  1319. X    if (dlen <= 0) {
  1320. X        strcpy(dst, src);
  1321. X        return;
  1322. X    }
  1323. X    slen = strlen(src);
  1324. X    do {
  1325. X        dst[slen] = *dst;
  1326. X        --dst;
  1327. X    } while (--dlen >= 0);
  1328. X    dst++;
  1329. X    while (--slen >= 0)
  1330. X        *dst++ = *src++;
  1331. X}
  1332. X
  1333. X
  1334. X
  1335. X
  1336. X/* File functions */
  1337. X
  1338. X/* Peek at next character of input stream; return EOF at end-of-file. */
  1339. X
  1340. Xint P_peek(f)
  1341. XFILE *f;
  1342. X{
  1343. X    int ch;
  1344. X
  1345. X    ch = getc(f);
  1346. X    if (ch == EOF)
  1347. X    return EOF;
  1348. X    ungetc(ch, f);
  1349. X    return (ch == '\n') ? ' ' : ch;
  1350. X}
  1351. X
  1352. X
  1353. X/* Check if at end of file, using Pascal "eof" semantics.  End-of-file for
  1354. X   stdin is broken; remove the special case for it to be broken in a
  1355. X   different way. */
  1356. X
  1357. Xint P_eof(f)
  1358. XFILE *f;
  1359. X{
  1360. X    register int ch;
  1361. X
  1362. X    if (feof(f))
  1363. X    return 1;
  1364. X    if (f == stdin)
  1365. X    return 0;    /* not safe to look-ahead on the keyboard! */
  1366. X    ch = getc(f);
  1367. X    if (ch == EOF)
  1368. X    return 1;
  1369. X    ungetc(ch, f);
  1370. X    return 0;
  1371. X}
  1372. X
  1373. X
  1374. X/* Check if at end of line (or end of entire file). */
  1375. X
  1376. Xint P_eoln(f)
  1377. XFILE *f;
  1378. X{
  1379. X    register int ch;
  1380. X
  1381. X    ch = getc(f);
  1382. X    if (ch == EOF)
  1383. X        return 1;
  1384. X    ungetc(ch, f);
  1385. X    return (ch == '\n');
  1386. X}
  1387. X
  1388. X
  1389. X/* Read a packed array of characters from a file. */
  1390. X
  1391. XVoid P_readpaoc(f, s, len)
  1392. XFILE *f;
  1393. Xchar *s;
  1394. Xint len;
  1395. X{
  1396. X    int ch;
  1397. X
  1398. X    for (;;) {
  1399. X    if (len <= 0)
  1400. X        return;
  1401. X    ch = getc(f);
  1402. X    if (ch == EOF || ch == '\n')
  1403. X        break;
  1404. X    *s++ = ch;
  1405. X    --len;
  1406. X    }
  1407. X    while (--len >= 0)
  1408. X    *s++ = ' ';
  1409. X    if (ch != EOF)
  1410. X    ungetc(ch, f);
  1411. X}
  1412. X
  1413. XVoid P_readlnpaoc(f, s, len)
  1414. XFILE *f;
  1415. Xchar *s;
  1416. Xint len;
  1417. X{
  1418. X    int ch;
  1419. X
  1420. X    for (;;) {
  1421. X    ch = getc(f);
  1422. X    if (ch == EOF || ch == '\n')
  1423. X        break;
  1424. X    if (len > 0) {
  1425. X        *s++ = ch;
  1426. X        --len;
  1427. X    }
  1428. X    }
  1429. X    while (--len >= 0)
  1430. X    *s++ = ' ';
  1431. X}
  1432. X
  1433. X
  1434. X/* Compute maximum legal "seek" index in file (0-based). */
  1435. X
  1436. Xlong P_maxpos(f)
  1437. XFILE *f;
  1438. X{
  1439. X    long savepos = ftell(f);
  1440. X    long val;
  1441. X
  1442. X    if (fseek(f, 0L, SEEK_END))
  1443. X        return -1;
  1444. X    val = ftell(f);
  1445. X    if (fseek(f, savepos, SEEK_SET))
  1446. X        return -1;
  1447. X    return val;
  1448. X}
  1449. X
  1450. X
  1451. X/* Use packed array of char for a file name. */
  1452. X
  1453. Xchar *P_trimname(fn, len)
  1454. Xregister char *fn;
  1455. Xregister int len;
  1456. X{
  1457. X    static char fnbuf[256];
  1458. X    register char *cp = fnbuf;
  1459. X    
  1460. X    while (--len >= 0 && *fn && !isspace(*fn))
  1461. X    *cp++ = *fn++;
  1462. X    return fnbuf;
  1463. X}
  1464. X
  1465. X
  1466. X
  1467. X
  1468. X/* Pascal's "memavail" doesn't make much sense in Unix with virtual memory.
  1469. X   We fix memory size as 10Meg as a reasonable compromise. */
  1470. X
  1471. Xlong memavail()
  1472. X{
  1473. X    return 10000000;            /* worry about this later! */
  1474. X}
  1475. X
  1476. Xlong maxavail()
  1477. X{
  1478. X    return memavail();
  1479. X}
  1480. X
  1481. X
  1482. X
  1483. X
  1484. X/* Sets are stored as an array of longs.  S[0] is the size of the set;
  1485. X   S[N] is the N'th 32-bit chunk of the set.  S[0] equals the maximum
  1486. X   I such that S[I] is nonzero.  S[0] is zero for an empty set.  Within
  1487. X   each long, bits are packed from lsb to msb.  The first bit of the
  1488. X   set is the element with ordinal value 0.  (Thus, for a "set of 5..99",
  1489. X   the lowest five bits of the first long are unused and always zero.) */
  1490. X
  1491. X/* (Sets with 32 or fewer elements are normally stored as plain longs.) */
  1492. X
  1493. Xlong *P_setunion(d, s1, s2)         /* d := s1 + s2 */
  1494. Xregister long *d, *s1, *s2;
  1495. X{
  1496. X    long *dbase = d++;
  1497. X    register int sz1 = *s1++, sz2 = *s2++;
  1498. X    while (sz1 > 0 && sz2 > 0) {
  1499. X        *d++ = *s1++ | *s2++;
  1500. X    sz1--, sz2--;
  1501. X    }
  1502. X    while (--sz1 >= 0)
  1503. X    *d++ = *s1++;
  1504. X    while (--sz2 >= 0)
  1505. X    *d++ = *s2++;
  1506. X    *dbase = d - dbase - 1;
  1507. X    return dbase;
  1508. X}
  1509. X
  1510. X
  1511. Xlong *P_setint(d, s1, s2)           /* d := s1 * s2 */
  1512. Xregister long *d, *s1, *s2;
  1513. X{
  1514. X    long *dbase = d++;
  1515. X    register int sz1 = *s1++, sz2 = *s2++;
  1516. X    while (--sz1 >= 0 && --sz2 >= 0)
  1517. X        *d++ = *s1++ & *s2++;
  1518. X    while (--d > dbase && !*d) ;
  1519. X    *dbase = d - dbase;
  1520. X    return dbase;
  1521. X}
  1522. X
  1523. X
  1524. Xlong *P_setdiff(d, s1, s2)          /* d := s1 - s2 */
  1525. Xregister long *d, *s1, *s2;
  1526. X{
  1527. X    long *dbase = d++;
  1528. X    register int sz1 = *s1++, sz2 = *s2++;
  1529. X    while (--sz1 >= 0 && --sz2 >= 0)
  1530. X        *d++ = *s1++ & ~*s2++;
  1531. X    if (sz1 >= 0) {
  1532. X        while (sz1-- >= 0)
  1533. X            *d++ = *s1++;
  1534. X    }
  1535. X    while (--d > dbase && !*d) ;
  1536. X    *dbase = d - dbase;
  1537. X    return dbase;
  1538. X}
  1539. X
  1540. X
  1541. Xlong *P_setxor(d, s1, s2)         /* d := s1 / s2 */
  1542. Xregister long *d, *s1, *s2;
  1543. X{
  1544. X    long *dbase = d++;
  1545. X    register int sz1 = *s1++, sz2 = *s2++;
  1546. X    while (sz1 > 0 && sz2 > 0) {
  1547. X        *d++ = *s1++ ^ *s2++;
  1548. X    sz1--, sz2--;
  1549. X    }
  1550. X    while (--sz1 >= 0)
  1551. X    *d++ = *s1++;
  1552. X    while (--sz2 >= 0)
  1553. X    *d++ = *s2++;
  1554. X    *dbase = d - dbase - 1;
  1555. X    return dbase;
  1556. X}
  1557. X
  1558. X
  1559. Xint P_inset(val, s)                 /* val IN s */
  1560. Xregister unsigned val;
  1561. Xregister long *s;
  1562. X{
  1563. X    register int bit;
  1564. X    bit = val % SETBITS;
  1565. X    val /= SETBITS;
  1566. X    if (val < *s++ && ((1<<bit) & s[val]))
  1567. X    return 1;
  1568. X    return 0;
  1569. X}
  1570. X
  1571. X
  1572. Xlong *P_addset(s, val)              /* s := s + [val] */
  1573. Xregister long *s;
  1574. Xregister unsigned val;
  1575. X{
  1576. X    register long *sbase = s;
  1577. X    register int bit, size;
  1578. X    bit = val % SETBITS;
  1579. X    val /= SETBITS;
  1580. X    size = *s;
  1581. X    if (++val > size) {
  1582. X        s += size;
  1583. X        while (val > size)
  1584. X            *++s = 0, size++;
  1585. X        *sbase = size;
  1586. X    } else
  1587. X        s += val;
  1588. X    *s |= 1<<bit;
  1589. X    return sbase;
  1590. X}
  1591. X
  1592. X
  1593. Xlong *P_addsetr(s, v1, v2)              /* s := s + [v1..v2] */
  1594. Xregister long *s;
  1595. Xregister unsigned v1, v2;
  1596. X{
  1597. X    register long *sbase = s;
  1598. X    register int b1, b2, size;
  1599. X    if (v1 > v2)
  1600. X    return sbase;
  1601. X    b1 = v1 % SETBITS;
  1602. X    v1 /= SETBITS;
  1603. X    b2 = v2 % SETBITS;
  1604. X    v2 /= SETBITS;
  1605. X    size = *s;
  1606. X    v1++;
  1607. X    if (++v2 > size) {
  1608. X        while (v2 > size)
  1609. X            s[++size] = 0;
  1610. X        s[v2] = 0;
  1611. X        *s = v2;
  1612. X    }
  1613. X    s += v1;
  1614. X    if (v1 == v2) {
  1615. X        *s |= (~((-2)<<(b2-b1))) << b1;
  1616. X    } else {
  1617. X        *s++ |= (-1) << b1;
  1618. X        while (++v1 < v2)
  1619. X            *s++ = -1;
  1620. X        *s |= ~((-2) << b2);
  1621. X    }
  1622. X    return sbase;
  1623. X}
  1624. X
  1625. X
  1626. Xlong *P_remset(s, val)              /* s := s - [val] */
  1627. Xregister long *s;
  1628. Xregister unsigned val;
  1629. X{
  1630. X    register int bit;
  1631. X    bit = val % SETBITS;
  1632. X    val /= SETBITS;
  1633. X    if (++val <= *s)
  1634. X    s[val] &= ~(1<<bit);
  1635. X    return s;
  1636. X}
  1637. X
  1638. X
  1639. Xint P_setequal(s1, s2)              /* s1 = s2 */
  1640. Xregister long *s1, *s2;
  1641. X{
  1642. X    register int size = *s1++;
  1643. X    if (*s2++ != size)
  1644. X        return 0;
  1645. X    while (--size >= 0) {
  1646. X        if (*s1++ != *s2++)
  1647. X            return 0;
  1648. X    }
  1649. X    return 1;
  1650. X}
  1651. X
  1652. X
  1653. Xint P_subset(s1, s2)                /* s1 <= s2 */
  1654. Xregister long *s1, *s2;
  1655. X{
  1656. X    register int sz1 = *s1++, sz2 = *s2++;
  1657. X    if (sz1 > sz2)
  1658. X        return 0;
  1659. X    while (--sz1 >= 0) {
  1660. X        if (*s1++ & ~*s2++)
  1661. X            return 0;
  1662. X    }
  1663. X    return 1;
  1664. X}
  1665. X
  1666. X
  1667. Xlong *P_setcpy(d, s)                /* d := s */
  1668. Xregister long *d, *s;
  1669. X{
  1670. X    register long *save_d = d;
  1671. X
  1672. X#ifdef SETCPY_MEMCPY
  1673. X    memcpy(d, s, (*s + 1) * sizeof(long));
  1674. X#else
  1675. X    register int i = *s + 1;
  1676. X    while (--i >= 0)
  1677. X        *d++ = *s++;
  1678. X#endif
  1679. X    return save_d;
  1680. X}
  1681. X
  1682. X
  1683. X/* s is a "smallset", i.e., a 32-bit or less set stored
  1684. X   directly in a long. */
  1685. X
  1686. Xlong *P_expset(d, s)                /* d := s */
  1687. Xregister long *d;
  1688. Xlong s;
  1689. X{
  1690. X    if ((d[1] = s))
  1691. X        *d = 1;
  1692. X    else
  1693. X        *d = 0;
  1694. X    return d;
  1695. X}
  1696. X
  1697. X
  1698. Xlong P_packset(s)                   /* convert s to a small-set */
  1699. Xregister long *s;
  1700. X{
  1701. X    if (*s++)
  1702. X        return *s;
  1703. X    else
  1704. X        return 0;
  1705. X}
  1706. X
  1707. X
  1708. X
  1709. X
  1710. X
  1711. X/* Oregon Software Pascal extensions, courtesy of William Bader */
  1712. X
  1713. Xint P_getcmdline(l, h, line)
  1714. Xint l, h;
  1715. XChar *line;
  1716. X{
  1717. X    int i, len;
  1718. X    char *s;
  1719. X    
  1720. X    h = h - l + 1;
  1721. X    len = 0;
  1722. X    for(i = 1; i < P_argc; i++) {
  1723. X    s = P_argv[i];
  1724. X    while (*s) {
  1725. X        if (len >= h) return len;
  1726. X        line[len++] = *s++;
  1727. X    }
  1728. X    if (len >= h) return len;
  1729. X    line[len++] = ' ';
  1730. X    }
  1731. X    return len;
  1732. X}
  1733. X
  1734. XVoid TimeStamp(Day, Month, Year, Hour, Min, Sec)
  1735. Xint *Day, *Month, *Year, *Hour, *Min, *Sec;
  1736. X{
  1737. X#ifndef NO_TIME
  1738. X    struct tm *tm;
  1739. X    long clock;
  1740. X
  1741. X    time(&clock);
  1742. X    tm = localtime(&clock);
  1743. X    *Day = tm->tm_mday;
  1744. X    *Month = tm->tm_mon + 1;        /* Jan = 0 */
  1745. X    *Year = tm->tm_year;
  1746. X    if (*Year < 1900)
  1747. X    *Year += 1900;     /* year since 1900 */
  1748. X    *Hour = tm->tm_hour;
  1749. X    *Min = tm->tm_min;
  1750. X    *Sec = tm->tm_sec;
  1751. X#endif
  1752. X}
  1753. X
  1754. X
  1755. X
  1756. X
  1757. X/* SUN Berkeley Pascal extensions */
  1758. X
  1759. XVoid P_sun_argv(s, len, n)
  1760. Xregister char *s;
  1761. Xregister int len, n;
  1762. X{
  1763. X    register char *cp;
  1764. X
  1765. X    if ((unsigned)n < P_argc)
  1766. X    cp = P_argv[n];
  1767. X    else
  1768. X    cp = "";
  1769. X    while (*cp && --len >= 0)
  1770. X    *s++ = *cp++;
  1771. X    while (--len >= 0)
  1772. X    *s++ = ' ';
  1773. X}
  1774. X
  1775. X
  1776. X
  1777. X
  1778. Xint _OutMem()
  1779. X{
  1780. X    return _Escape(-2);
  1781. X}
  1782. X
  1783. Xint _CaseCheck()
  1784. X{
  1785. X    return _Escape(-9);
  1786. X}
  1787. X
  1788. Xint _NilCheck()
  1789. X{
  1790. X    return _Escape(-3);
  1791. X}
  1792. X
  1793. X
  1794. X
  1795. X
  1796. X
  1797. X/* The following is suitable for the HP Pascal operating system.
  1798. X   It might want to be revised when emulating another system. */
  1799. X
  1800. Xchar *_ShowEscape(buf, code, ior, prefix)
  1801. Xchar *buf, *prefix;
  1802. Xint code, ior;
  1803. X{
  1804. X    char *bufp;
  1805. X
  1806. X    if (prefix && *prefix) {
  1807. X        strcpy(buf, prefix);
  1808. X    strcat(buf, ": ");
  1809. X        bufp = buf + strlen(buf);
  1810. X    } else {
  1811. X        bufp = buf;
  1812. X    }
  1813. X    if (code == -10) {
  1814. X        sprintf(bufp, "Pascal system I/O error %d", ior);
  1815. X        switch (ior) {
  1816. X            case 3:
  1817. X                strcat(buf, " (illegal I/O request)");
  1818. X                break;
  1819. X            case 7:
  1820. X                strcat(buf, " (bad file name)");
  1821. X                break;
  1822. X            case FileNotFound:   /*10*/
  1823. X                strcat(buf, " (file not found)");
  1824. X                break;
  1825. X            case FileNotOpen:    /*13*/
  1826. X                strcat(buf, " (file not open)");
  1827. X                break;
  1828. X            case BadInputFormat: /*14*/
  1829. X                strcat(buf, " (bad input format)");
  1830. X                break;
  1831. X            case 24:
  1832. X                strcat(buf, " (not open for reading)");
  1833. X                break;
  1834. X            case 25:
  1835. X                strcat(buf, " (not open for writing)");
  1836. X                break;
  1837. X            case 26:
  1838. X                strcat(buf, " (not open for direct access)");
  1839. X                break;
  1840. X            case 28:
  1841. X                strcat(buf, " (string subscript out of range)");
  1842. X                break;
  1843. X            case EndOfFile:      /*30*/
  1844. X                strcat(buf, " (end-of-file)");
  1845. X                break;
  1846. X            case FileWriteError: /*38*/
  1847. X        strcat(buf, " (file write error)");
  1848. X        break;
  1849. X        }
  1850. X    } else {
  1851. X        sprintf(bufp, "Pascal system error %d", code);
  1852. X        switch (code) {
  1853. X            case -2:
  1854. X                strcat(buf, " (out of memory)");
  1855. X                break;
  1856. X            case -3:
  1857. X                strcat(buf, " (reference to NIL pointer)");
  1858. X                break;
  1859. X            case -4:
  1860. X                strcat(buf, " (integer overflow)");
  1861. X                break;
  1862. X            case -5:
  1863. X                strcat(buf, " (divide by zero)");
  1864. X                break;
  1865. X            case -6:
  1866. X                strcat(buf, " (real math overflow)");
  1867. X                break;
  1868. X            case -8:
  1869. X                strcat(buf, " (value range error)");
  1870. X                break;
  1871. X            case -9:
  1872. X                strcat(buf, " (CASE value range error)");
  1873. X                break;
  1874. X            case -12:
  1875. X                strcat(buf, " (bus error)");
  1876. X                break;
  1877. X            case -20:
  1878. X                strcat(buf, " (stopped by user)");
  1879. X                break;
  1880. X        }
  1881. X    }
  1882. X    return buf;
  1883. X}
  1884. X
  1885. X
  1886. Xint _Escape(code)
  1887. Xint code;
  1888. X{
  1889. X    char buf[100];
  1890. X
  1891. X    P_escapecode = code;
  1892. X    if (__top_jb) {
  1893. X    __p2c_jmp_buf *jb = __top_jb;
  1894. X    __top_jb = jb->next;
  1895. X    longjmp(jb->jbuf, 1);
  1896. X    }
  1897. X    if (code == 0)
  1898. X        exit(0);
  1899. X    if (code == -1)
  1900. X        exit(1);
  1901. X    fprintf(stderr, "%s\n", _ShowEscape(buf, P_escapecode, P_ioresult, ""));
  1902. X    exit(1);
  1903. X}
  1904. X
  1905. Xint _EscIO(code)
  1906. Xint code;
  1907. X{
  1908. X    P_ioresult = code;
  1909. X    return _Escape(-10);
  1910. X}
  1911. X
  1912. X
  1913. X
  1914. X
  1915. X/* End. */
  1916. X
  1917. X
  1918. X
  1919. END_OF_FILE
  1920. if test 16729 -ne `wc -c <'src/p2clib.c'`; then
  1921.     echo shar: \"'src/p2clib.c'\" unpacked with wrong size!
  1922. fi
  1923. # end of 'src/p2clib.c'
  1924. fi
  1925. echo shar: End of archive 6 \(of 32\).
  1926. cp /dev/null ark6isdone
  1927. MISSING=""
  1928. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 ; do
  1929.     if test ! -f ark${I}isdone ; then
  1930.     MISSING="${MISSING} ${I}"
  1931.     fi
  1932. done
  1933. if test "${MISSING}" = "" ; then
  1934.     echo You have unpacked all 32 archives.
  1935.     echo "Now see PACKNOTES and the README"
  1936.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1937. else
  1938.     echo You still need to unpack the following archives:
  1939.     echo "        " ${MISSING}
  1940. fi
  1941. ##  End of shell archive.
  1942. exit 0
  1943.