home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume23 / lome / part06 < prev    next >
Internet Message Format  |  1991-01-08  |  49KB

  1. Path: j.cc.purdue.edu!mentor.cc.purdue.edu!purdue!bu.edu!rpi!julius.cs.uiuc.edu!wuarchive!uunet!papaya.bbn.com!rsalz
  2. From: rsalz@bbn.com (Rich Salz)
  3. Newsgroups: comp.sources.unix
  4. Subject: v23i056:  Line oriented macro processor, Part06/09
  5. Message-ID: <3031@litchi.bbn.com>
  6. Date: 29 Nov 90 17:43:56 GMT
  7. Organization: BBN Systems and Technologies, Cambridge MA
  8. Lines: 1894
  9. Approved: rsalz@uunet.UU.NET
  10.  
  11. Submitted-by: Darren New <new@ee.udel.edu>
  12. Posting-number: Volume 23, Issue 56
  13. Archive-name: lome/part06
  14.  
  15. #! /bin/sh
  16. # This is a shell archive.  Remove anything before this line, then unpack
  17. # it by saving it into a file and typing "sh file".  To overwrite existing
  18. # files, type "sh file -c".  You can also feed this as standard input via
  19. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  20. # will see the following message at the end:
  21. #        "End of archive 5 (of 9)."
  22. # Contents:  LOME/Comp1.c LOME/LOME8.c LOME/Rubin.mac PPL/PPLAmiga.c
  23. #   TFS/TFSAmiga.c
  24. # Wrapped by new@estelle.ee.udel.edu on Tue Aug 14 16:09:59 1990
  25. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  26. if test -f 'LOME/Comp1.c' -a "${1}" != "-c" ; then 
  27.   echo shar: Will not clobber existing file \"'LOME/Comp1.c'\"
  28. else
  29. echo shar: Extracting \"'LOME/Comp1.c'\" \(9022 characters\)
  30. sed "s/^X//" >'LOME/Comp1.c' <<'END_OF_FILE'
  31. X/*
  32. X * Comp1.c
  33. X * Macro Compiler code file
  34. X * Copyright 1988, 1990 Darren New.
  35. X * All rights reserved.
  36. X */
  37. X
  38. X#include "PPL.h"
  39. X#include "MacroIO.h"
  40. X
  41. X#define MacStream 1    /* stream where macros are stored */
  42. X#define PrgStream 2    /* stream where program to be expanded is stored */
  43. X#define ExpStream 3    /* stream where expansions written */
  44. X#define ErrStream 4    /* stream where errors written */
  45. X
  46. X#define BUFSIZE 15000
  47. X
  48. Xint AssertExit()
  49. X{
  50. X    MStopIO();
  51. X    PLExit(PLsev_bomb);
  52. X    return 0;
  53. X    }
  54. X
  55. Xint BombExit()
  56. X{
  57. X    return AssertExit();
  58. X    }
  59. X
  60. Xint FaultExit()
  61. X{
  62. X    return AssertExit();
  63. X    }
  64. X
  65. Xshort DoIt()
  66. X{
  67. X    int status;
  68. X    short buf[BUFSIZE];
  69. X    short zero, HeadParm, HeadEOL, BodyParm, BodyEOL;
  70. X    short param[10];
  71. X    int symgen = 100;
  72. X    int FirstToUse = 0;
  73. X    int NextToUse = FirstToUse;
  74. X    char inpline[BIGLINE];
  75. X
  76. X    /* DEBUG_SETDEFS("RAW:0/190/640/200/Debug window", "T:DBugOut"); */
  77. X    /* DEBUG_ENTER("DoIt", NULL); */
  78. X
  79. X    MStartIO(PLargcnt, PLarglist);
  80. X
  81. X    /* Read macro stream until a blank line is encountered */
  82. X    while (M_OK == (status = MGetBuff(MacStream)) && MGetChar() > 0)
  83. X    ;
  84. X
  85. X    /* Read program stream until a blank line is encountered */
  86. X    while (M_OK == (status = MGetBuff(PrgStream)) && MGetChar() > 0)
  87. X    ;
  88. X
  89. X    PLStatus(6, "Reading macros...");
  90. X
  91. X    /* Read special character line from macro stream */
  92. X    if (M_OK != MGetBuff(MacStream)) {
  93. X    PLStatus(1, "Read of special character line failed");
  94. X    MStopIO();
  95. X    /* DEBUG_RETURN(NULL); */
  96. X    PLExit(PLsev_badform);
  97. X    }
  98. X    zero = MGetChar();
  99. X    HeadParm = MGetChar();
  100. X    HeadEOL = MGetChar();
  101. X    BodyParm = MGetChar();
  102. X    BodyEOL = MGetChar();
  103. X    if (zero == 0 || HeadParm == 0 || HeadEOL == 0 ||
  104. X        BodyParm == 0 || BodyEOL == 0 || MGetChar() != 0) {
  105. X    PLStatus(1, "Special character line malformed");
  106. X    MStopIO();
  107. X    /* DEBUG_RETURN(NULL); */
  108. X    PLExit(PLsev_badform);
  109. X    }
  110. X    /* DEBUGF(5, "z=%d, HP=%d, HE=%d, BP=%d, BE=%d" C zero C HeadParm C
  111. X        HeadEOL C BodyParm C BodyEOL); */
  112. X
  113. X    /* read macros into buf[NextToUse]. Format:
  114. X    buf[k]     = start of next macro def line.
  115. X    buf[k+1] = number of symgens used or -1 if none used.
  116. X    buf[k+2] ... buf[k+n] =
  117. X        text of macro template, terminate by 0.
  118. X    buf[k+n+1] ... =
  119. X        lines of macro bodies, each terminated by 0.
  120. X        A PrgParm followed by two digits is replaced by a PrgParam
  121. X        followed by two integers.
  122. X    */
  123. X    while (M_OK == (status = MGetBuff(MacStream))) {
  124. X    int k, c;
  125. X    bool donebody;
  126. X    /* check for enuf room to store line */
  127. X    if (NextToUse + BIGLINE + 10 > BUFSIZE) {
  128. X        PLStatus(1, "Out of memory for macros");
  129. X        MStopIO();
  130. X        /* DEBUG_RETURN(NULL); */
  131. X        PLExit(PLsev_oores);
  132. X        }
  133. X    /* Read template */
  134. X    k = NextToUse;
  135. X    buf[++k] = -1;    /* adjusted when symgens found */
  136. X    while ((c = MGetChar()) != 0 && c != HeadEOL) {
  137. X        buf[++k] = c;
  138. X        }
  139. X    buf[++k] = 0;
  140. X    /* Read macro body */
  141. X    donebody = FALSE;
  142. X    while (! donebody && M_OK == (status = MGetBuff(MacStream))) {
  143. X        /* check for enuf room to store line */
  144. X        if (k + BIGLINE + 10 > BUFSIZE) {
  145. X        PLStatus(1, "Out of memory for macros");
  146. X        MStopIO();
  147. X        /* DEBUG_RETURN(NULL); */
  148. X        PLExit(PLsev_oores);
  149. X        }
  150. X        /* copy in body line */
  151. X        c = MGetChar();
  152. X        if (c == 0 || c == BodyEOL) {
  153. X        donebody = TRUE;
  154. X        }
  155. X        else {
  156. X        while (c != 0 && c != BodyEOL) {
  157. X            assert(-1 <= k && k < BUFSIZE);
  158. X            buf[++k] = c;
  159. X            if (c == BodyParm) {
  160. X            short parm, form;
  161. X            parm = MGetChar() - zero;
  162. X            form = MGetChar() - zero;
  163. X            if (parm == -zero || form == -zero) {
  164. X                PLStatus(1, "Unexpected EOL in macro body!");
  165. X                if (fault("Unexpected EOL in macro body!"))
  166. X                break;
  167. X                else
  168. X                bomb("Translation cancelled");
  169. X                }
  170. X            if (parm == 0 && buf[NextToUse + 1] < form)
  171. X                buf[NextToUse + 1] = form;
  172. X            buf[++k] = parm;
  173. X            buf[++k] = form;
  174. X            }
  175. X            c = MGetChar();
  176. X            }
  177. X        buf[++k] = 0;
  178. X        }
  179. X        }
  180. X    buf[NextToUse] = ++k;
  181. X    NextToUse = k;
  182. X    if (NextToUse + BIGLINE + 10 > BUFSIZE) {
  183. X        PLStatus(1, "Out of memory for macros");
  184. X        MStopIO();
  185. X        /* DEBUG_RETURN(NULL); */
  186. X        PLExit(PLsev_oores);
  187. X        }
  188. X    }
  189. X
  190. X    if (status != M_EOF) {
  191. X    PLStatus(1, "I/O Error reading macros");
  192. X    MStopIO();
  193. X    /* DEBUG_RETURN("Status=%d" C status); */
  194. X    PLExit(PLsev_badform);
  195. X    }
  196. X
  197. X/* DEBUGF(7, "NextToUse=%d" C NextToUse); */
  198. X/* for (status = 0; status < NextToUse; status++)
  199. XDEBUGF(8, "buf[%4d] = %4d = %c" C status C buf[status] C buf[status]); */
  200. X
  201. X    PLStatus(6, "Translating program...");
  202. X
  203. X    while (M_OK == (status = MGetBuff(PrgStream))) {
  204. X    int offset, machead;
  205. X    int paraminx = 0;   /* assigned to shut up GCC */
  206. X    bool found;
  207. X
  208. X    /* Read a line to be expanded */
  209. X    offset = 0;
  210. X    do {
  211. X        inpline[offset] = MGetChar();
  212. X        if (inpline[offset] == HeadEOL)
  213. X        inpline[offset] = 0;
  214. X        } while (inpline[offset++] != 0);
  215. X
  216. X    /* Search for matching template */
  217. X    machead = FirstToUse; found = FALSE;
  218. X    while (machead < NextToUse && ! found) {
  219. X        bool done;
  220. X        offset = 0; done = FALSE; paraminx = 1;
  221. X        while (!done) {
  222. X        if (buf[machead + 2 + offset] == HeadParm &&
  223. X                inpline[offset] != 0) {
  224. X            param[paraminx++] = inpline[offset++];
  225. X            }
  226. X        else if (inpline[offset] == buf[machead + 2 + offset]) {
  227. X            if (inpline[offset] == 0)
  228. X            done = found = TRUE;
  229. X            else
  230. X            offset += 1;
  231. X            }
  232. X        else if (inpline[offset] != buf[machead + 2 + offset]) {
  233. X            done = TRUE;
  234. X            }
  235. X        }
  236. X        if (! found)
  237. X        machead = buf[machead];
  238. X        }
  239. X
  240. X    /* Make sure line was found */
  241. X    if (! found) {
  242. X        MPutChar(0);         /* clear buffer */
  243. X        MPutChar(zero);      /* error zero - not matched */
  244. X        for (offset = 0; inpline[offset]; offset++)
  245. X        MPutChar(inpline[offset]);
  246. X        MPutChar(0);         /* terminate buffer */
  247. X        if (M_OK != MPutBuff(ErrStream) || M_OK != MPutBuff(ExpStream)) {
  248. X        PLStatus(1, "Error while writing error message");
  249. X        MStopIO();
  250. X        /* DEBUG_RETURN(NULL); */
  251. X        PLExit(PLsev_badform);
  252. X        }
  253. X        }
  254. X    else {
  255. X        /* Expand the line */
  256. X        offset += 1;        /* skip past HeadEOL */
  257. X        MPutChar(0);             /* clear output buffer */
  258. X        offset += machead + 2;  /* let offset point directly to body */
  259. X        while (offset < buf[machead]) {
  260. X        if (buf[offset] == 0) {     /* BodyEOL */
  261. X            MPutChar(0);     /* terminate buffer */
  262. X            if (M_OK != MPutBuff(ExpStream)) {
  263. X            PLStatus(1, "Error while writing expansion");
  264. X            MStopIO();
  265. X            /* DEBUG_RETURN(NULL); */
  266. X            PLExit(PLsev_badform);
  267. X            }
  268. X            offset += 1;
  269. X            }
  270. X        else if (buf[offset] == BodyParm) {
  271. X            int parm, form, convnum;
  272. X            parm = buf[offset + 1];
  273. X            form = buf[offset + 2];
  274. X            offset += 3;
  275. X            if (parm < 0 || paraminx <= parm) {
  276. X            MPutChar(0);         /* clear buffer */
  277. X            MPutChar(zero + 1); /* error 1 - bad param number */
  278. X            for (offset = 0; inpline[offset]; offset++)
  279. X                MPutChar(inpline[offset]);
  280. X            MPutChar(0);         /* terminate buffer */
  281. X            if (M_OK != MPutBuff(ErrStream) ||
  282. X                M_OK != MPutBuff(ExpStream)) {
  283. X                PLStatus(1, "Error while writing error message");
  284. X                MStopIO();
  285. X                /* DEBUG_RETURN(NULL); */
  286. X                PLExit(PLsev_badform);
  287. X                }
  288. X            offset = BUFSIZE;
  289. X            }
  290. X            if (parm == 0) {
  291. X            if (form < 0 || 9 < form) {
  292. X                MPutChar(0);         /* clear buffer */
  293. X                MPutChar(zero + 2); /* error 2 - bad digit */
  294. X                for (offset = 0; inpline[offset]; offset++)
  295. X                MPutChar(inpline[offset]);
  296. X                MPutChar(0);         /* terminate buffer */
  297. X                if (M_OK != MPutBuff(ErrStream) ||
  298. X                    M_OK != MPutBuff(ExpStream)) {
  299. X                PLStatus(1, "Error while writing error message");
  300. X                MStopIO();
  301. X                /* DEBUG_RETURN(NULL); */
  302. X                PLExit(PLsev_badform);
  303. X                }
  304. X                offset = BUFSIZE;
  305. X                }
  306. X            convnum = symgen + form;
  307. X            if (99 < convnum)
  308. X                MPutChar(((convnum / 100) % 10) + zero);
  309. X            if (9 < convnum)
  310. X                MPutChar(((convnum /  10) % 10) + zero);
  311. X            MPutChar((convnum % 10) + zero);
  312. X            }
  313. X            else {
  314. X            if (form == 0)
  315. X                MPutChar(param[parm]);
  316. X            else if (form == 1) {
  317. X                convnum = param[parm];
  318. X                if (99 < convnum)
  319. X                MPutChar(((convnum / 100) % 10) + zero);
  320. X                if (9 < convnum)
  321. X                MPutChar(((convnum /  10) % 10) + zero);
  322. X                MPutChar((convnum % 10) + zero);
  323. X                }
  324. X            else if (form == 2) {
  325. X                convnum = param[parm];
  326. X                MPutChar(((convnum / 100) % 10) + zero);
  327. X                MPutChar(((convnum /  10) % 10) + zero);
  328. X                MPutChar((convnum % 10) + zero);
  329. X                }
  330. X            else {
  331. X                MPutChar(0);         /* clear buffer */
  332. X                MPutChar(zero + 3); /* error 3 - bad conv */
  333. X                for (offset = 0; inpline[offset]; offset++)
  334. X                MPutChar(inpline[offset]);
  335. X                MPutChar(0);         /* terminate buffer */
  336. X                if (M_OK != MPutBuff(ErrStream) ||
  337. X                    M_OK != MPutBuff(ExpStream)) {
  338. X                PLStatus(1, "Error while writing error message");
  339. X                MStopIO();
  340. X                /* DEBUG_RETURN(NULL); */
  341. X                PLExit(PLsev_badform);
  342. X                }
  343. X                offset = BUFSIZE;
  344. X                }
  345. X            }
  346. X            }
  347. X        else {
  348. X            MPutChar(buf[offset++]);
  349. X            }
  350. X        }
  351. X
  352. X        /* expansion complete - bump symgen */
  353. X        symgen += 1 + buf[machead + 1];
  354. X        }
  355. X    }
  356. X
  357. X    MStopIO();
  358. X
  359. X    PLStatus(6, "Translation complete!");
  360. X
  361. X    /* DEBUG_RETURN(NULL); */
  362. X
  363. X    return 0;
  364. X    }
  365. X
  366. END_OF_FILE
  367. if test 9022 -ne `wc -c <'LOME/Comp1.c'`; then
  368.     echo shar: \"'LOME/Comp1.c'\" unpacked with wrong size!
  369. fi
  370. # end of 'LOME/Comp1.c'
  371. fi
  372. if test -f 'LOME/LOME8.c' -a "${1}" != "-c" ; then 
  373.   echo shar: Will not clobber existing file \"'LOME/LOME8.c'\"
  374. else
  375. echo shar: Extracting \"'LOME/LOME8.c'\" \(7966 characters\)
  376. sed "s/^X//" >'LOME/LOME8.c' <<'END_OF_FILE'
  377. X/*
  378. X * LOME8.c
  379. X * Line Oriented Macro Expander - DoMath()
  380. X * Copyright 1989 Darren New
  381. X *
  382. X */
  383. X
  384. X#include "LOME.h"
  385. X
  386. X#ifdef HIDPROTS
  387. XHIDDEN void ConvErr ARGS((str expr));
  388. XHIDDEN long ConvLetter ARGS((char ch));
  389. XHIDDEN void StrSubs ARGS((str r, int from, int to, str new));
  390. XHIDDEN bool GetToken ARGS((str r,int p,int* first,int* last));
  391. XHIDDEN bool GetParams ARGS((str r, int p, long * p1, long * p2, int * first));
  392. X#endif
  393. X
  394. XHIDDEN void ConvErr ARGS1(str,expr)
  395. X{
  396. X    char * t = "Intermediate expression causing error:";
  397. X
  398. X    Message("CONV");
  399. X
  400. X    MPutChar(0);
  401. X    while (*t) MPutChar(*t++);
  402. X    MPutChar(0);
  403. X    MPutBuff(outstream);
  404. X
  405. X    t = expr;
  406. X    while (*t) MPutChar(*t++);
  407. X    MPutChar(0);
  408. X    MPutBuff(outstream);
  409. X
  410. X    TraceBack();
  411. X    /* quitting = TRUE; */
  412. X    }
  413. X
  414. XHIDDEN long ConvLetter ARGS1(char,ch)
  415. X{
  416. X    long valch = -1L;
  417. X    if (0 <= ch - params[O_ZERO] &&
  418. X        ch - params[O_ZERO] <= 9)
  419. X    valch = ch - params[O_ZERO];
  420. X    else if (0 <= ch - params[O_LCA] &&
  421. X        ch - params[O_LCA] <= params[O_UCZ] - params[O_UCA] + 1)
  422. X    valch = 10 + ch - params[O_LCA];
  423. X    else if (0 <= ch - params[O_UCA] &&
  424. X        ch - params[O_UCA] <= params[O_UCZ] - params[O_UCA] + 1)
  425. X    valch = 10 + ch - params[O_UCA];
  426. X    return valch;
  427. X    }
  428. X
  429. XHIDDEN void StrSubs ARGS4(str,r,int,from,int,to,str,new)
  430. X{
  431. X    /* This replaces the section of 'r' from 'r[from]' up to but not
  432. X       including 'r[to]' with 'new' */
  433. X
  434. X    char newstr[BIGLINE];
  435. X
  436. X    assert(r != NULL);
  437. X    assert(new != NULL);
  438. X    assert(0 <= from);
  439. X    assert(0 <= to);
  440. X    assert(from <= strlen(r));
  441. X    assert(to <= strlen(r));
  442. X    assert(from <= to);
  443. X
  444. X    assert(strlen(r) - (to - from) + strlen(new) < BIGLINE);
  445. X
  446. X    strcpy(newstr, r);
  447. X    newstr[from] = EOS;
  448. X    strcat(newstr, new);
  449. X    strcat(newstr, &r[to]);
  450. X    strcpy(r, newstr);
  451. X    }
  452. X
  453. XHIDDEN bool GetToken ARGS4(str,r,int,p,int*,first,int*,last)
  454. X{
  455. X    /* This simply finds the token preceding r[p] and returns
  456. X       pointers to the first and one-past-the-last characters in
  457. X       *first and *last, respectively. returns TRUE if found, FALSE if not.
  458. X    */
  459. X
  460. X    assert(r != NULL);
  461. X    assert(first != NULL);
  462. X    assert(last != NULL);
  463. X    assert(0 <= p);
  464. X    assert(p < strlen(r));
  465. X
  466. X    if (p == 0)
  467. X    return FALSE;
  468. X
  469. X    p--;    /* back up to before operator */
  470. X
  471. X    while (0 <= p && r[p] == params[O_SPACE])
  472. X    p--;
  473. X
  474. X    *last = p + 1;
  475. X    if (*last == 0)
  476. X    return FALSE;
  477. X
  478. X    while (0 < p && r[p] != params[O_SPACE])
  479. X    p--;
  480. X
  481. X    *first = p + 1;
  482. X
  483. X    return TRUE;
  484. X    }
  485. X
  486. X
  487. X
  488. XHIDDEN bool GetParams ARGS5(str,r,int,p,long*,p1,long*,p2,int*,first)
  489. X{
  490. X    /* This finds the values of the immediately preceeding two
  491. X       tokens (as integers). It returns them in *p1 and *p2.
  492. X       It returns TRUE if both could be parsed as radix-10
  493. X       integers and FALSE if they could not be so parsed (or if
  494. X       there were not two tokens). It returns the index of the first
  495. X       character of the first token in *first (to allow the caller
  496. X       to replace the entire expression with the result).
  497. X       p must be the index of the operator within the string r.
  498. X    */
  499. X
  500. X    char * paramend;
  501. X    int endofparam;
  502. X    long val;
  503. X
  504. X    assert(p1 != NULL);
  505. X    assert(p2 != NULL);
  506. X    assert(r != NULL);
  507. X    assert(first != NULL);
  508. X    assert(0 <= p);
  509. X    assert(p < strlen(r));
  510. X
  511. X    if (p == 0)
  512. X    return FALSE;
  513. X
  514. X    p--;    /* back up to before operator */
  515. X
  516. X    while (0 <= p && r[p] == params[O_SPACE])
  517. X    p--;
  518. X    endofparam = p + 1;
  519. X    while (0 <= p && r[p] != params[O_SPACE])
  520. X    p--;
  521. X    if (p < 0)
  522. X    return FALSE;    /* second param at start of line */
  523. X    val = StrToIntErr(&r[p+1], ¶mend);
  524. X    if (paramend != &r[endofparam])
  525. X    return FALSE;
  526. X    *p2 = val;
  527. X
  528. X    while (0 <= p && r[p] == params[O_SPACE])
  529. X    p--;
  530. X    endofparam = p + 1;
  531. X    if (p < 0)
  532. X    return FALSE;    /* no first parameter found */
  533. X    while (0 <= p && r[p] != params[O_SPACE])
  534. X    p--;
  535. X    val = StrToIntErr(&r[p+1], ¶mend);
  536. X    if (paramend != &r[endofparam])
  537. X    return FALSE;
  538. X    *p1 = val;
  539. X
  540. X    *first = p+1;
  541. X
  542. X    return TRUE;
  543. X    }
  544. X
  545. X
  546. X
  547. Xvoid DoMath ARGS1(int,p /* the parameter number */)
  548. X{
  549. X    char r[BIGLINE+2];
  550. X    int i, j;
  551. X
  552. X    assert(0 < tstacksize);
  553. X    assert(0 <= p && p <= 9);
  554. X
  555. X    if (Sp[p] == NULL || *Sp[p] == 0) {
  556. X    return;
  557. X    }
  558. X
  559. X    assert(strlen(Sp[p]) < BIGLINE);
  560. X
  561. X    i = j = 0;
  562. X    r[i++] = ' ';
  563. X    while (Sp[p][j]) {
  564. X    if (Sp[p][j] != params[O_SPACE] || r[i-1] != params[O_SPACE])
  565. X        r[i++] = Sp[p][j];
  566. X    j++;
  567. X    }
  568. X    r[i] = EOS;
  569. X    while (0 < i && r[i-1] == params[O_SPACE])
  570. X    r[--i] = EOS;
  571. X
  572. X    loop {
  573. X    for (i = 0; i < strlen(r); i++) {
  574. X        if (    (
  575. X            r[i] == params[O_PLUS] ||
  576. X            r[i] == params[O_MINUS] ||
  577. X            r[i] == params[O_MULT]  ||
  578. X            r[i] == params[O_DIV]   ||
  579. X            r[i] == params[O_FETCH] ||
  580. X            r[i] == params[O_RADIX]
  581. X            ) &&
  582. X            (r[i+1] == EOS || r[i+1] == params[O_SPACE]) ) {
  583. X        break;
  584. X        }
  585. X        }
  586. X
  587. X    if (r[i] == EOS) {
  588. X        for (j = 1; r[j]; j++)
  589. X        ADDTOLINE(r[j]);
  590. X        ENDLINE();
  591. X        return;
  592. X        }
  593. X    else if (r[i] == params[O_PLUS] || r[i] == params[O_MINUS] ||
  594. X            r[i] == params[O_MULT] || r[i] == params[O_DIV]) {
  595. X        long p1, p2;
  596. X        long answer = 0;    /* assign to shut up GCC */
  597. X        int first;
  598. X        bool good;
  599. X        char strbuf[BIGLINE];
  600. X        good = GetParams(r, i, &p1, &p2, &first);
  601. X        if (!good) {
  602. X        ConvErr(r);
  603. X        return;
  604. X        }
  605. X        else {
  606. X        if (r[i] == params[O_PLUS])
  607. X            answer = p1 + p2;
  608. X
  609. X        if (r[i] == params[O_MINUS])
  610. X            answer = p1 - p2;
  611. X
  612. X        if (r[i] == params[O_MULT])
  613. X            answer = p1 * p2;
  614. X
  615. X        if (r[i] == params[O_DIV]) {
  616. X            if (p2 != 0)
  617. X            answer = p1 / p2;
  618. X            else {
  619. X            ConvErr(r);
  620. X            return;
  621. X            }
  622. X            }
  623. X
  624. X        IntToStr(answer, strbuf);
  625. X        StrSubs(r, first, i+1, strbuf);
  626. X        }
  627. X        }
  628. X    else if (r[i] == params[O_FETCH]) {
  629. X        int first, last;
  630. X        char varname[BIGLINE];
  631. X        char * varvalue;
  632. X        bool good;
  633. X        good = GetToken(r, i, &first, &last);
  634. X        if (!good) {
  635. X        ConvErr(r);
  636. X        return;
  637. X        }
  638. X        else {
  639. X        for (j = first; j < last; j++)
  640. X            varname[j-first] = r[j];
  641. X        varname[last-first] = EOS;
  642. X        varvalue = VarLookup(varname);
  643. X        if (varvalue == NULL) {
  644. X            ConvErr(r);
  645. X            return;
  646. X            }
  647. X        else {
  648. X            StrSubs(r, first, i+1, varvalue);
  649. X            }
  650. X        }
  651. X        }
  652. X    else if (r[i] == params[O_RADIX]) {
  653. X        int f1, l1, f2, l2, f3, l3;
  654. X        int j, k;
  655. X        long sign, val, valch, from, to;
  656. X        bool good;
  657. X        char newstr[BIGLINE];
  658. X        char revstr[BIGLINE];
  659. X
  660. X        good = GetToken(r, i, &f3, &l3);
  661. X        if (!good || f3 != l3 - 1) {
  662. X        ConvErr(r);
  663. X        return;
  664. X        }
  665. X
  666. X        good = GetToken(r, f3, &f2, &l2);
  667. X        if (!good || f2 != l2 - 1) {
  668. X        ConvErr(r);
  669. X        return;
  670. X        }
  671. X
  672. X        good = GetToken(r, f2, &f1, &l1);
  673. X        if (!good) {
  674. X        ConvErr(r);
  675. X        return;
  676. X        }
  677. X
  678. X        from = ConvLetter(r[f2]);
  679. X        if (from < 1) {
  680. X        ConvErr(r);
  681. X        return;
  682. X        }
  683. X
  684. X        to = ConvLetter(r[f3]);
  685. X        if (to < 1) {
  686. X        ConvErr(r);
  687. X        return;
  688. X        }
  689. X
  690. X        sign = 1L; val = 0L;
  691. X        for (j = f1; j < l1; j++) {
  692. X        if (r[j] == params[O_MINUS] && j == f1) {
  693. X            sign = -1L;
  694. X            valch = 0;
  695. X            continue;
  696. X            }
  697. X        else if (r[j] == params[O_PLUS] && j == f1) {
  698. X            sign = 1L;
  699. X            valch = 0;
  700. X            continue;
  701. X            }
  702. X        else {
  703. X            valch = ConvLetter(r[j]);
  704. X            if (valch < 0 || from < valch) {
  705. X            ConvErr(r);
  706. X            return;
  707. X            }
  708. X            val = val * (from + 1) + valch;
  709. X            }
  710. X        }
  711. X
  712. X        j = 0;
  713. X        if (sign < 0L) {
  714. X        newstr[0] = params[O_MINUS];
  715. X        newstr[j = 1] = EOS;
  716. X        }
  717. X
  718. X        if (val == 0) {
  719. X        newstr[0] = params[O_ZERO];
  720. X        newstr[j = 1] = EOS;
  721. X        }
  722. X        else {
  723. X        while (val != 0) {
  724. X            valch = val % (to + 1);
  725. X            val /= (to + 1);
  726. X            if (valch < 10)
  727. X            newstr[j++] = valch + params[O_ZERO];
  728. X            else
  729. X            newstr[j++] = valch - 10 + params[O_UCA];
  730. X            }
  731. X        }
  732. X        newstr[j] = EOS;
  733. X
  734. X        if (newstr[0] == params[O_MINUS]) {
  735. X        revstr[0] = newstr[0];
  736. X        for (k = 1, j--; 1 <= j; j--, k++)
  737. X            revstr[k] = newstr[j];
  738. X        }
  739. X        else {
  740. X        for (k = 0, j--; 0 <= j; j--, k++)
  741. X            revstr[k] = newstr[j];
  742. X        }
  743. X        revstr[k] = EOS;
  744. X
  745. X        StrSubs(r, f1, i + 1, revstr);
  746. X
  747. X        }
  748. X    else {
  749. X        bomb("You can't get there from here");
  750. X        }
  751. X    /* end of infinite loop */
  752. X    }
  753. X    }
  754. X
  755. END_OF_FILE
  756. if test 7966 -ne `wc -c <'LOME/LOME8.c'`; then
  757.     echo shar: \"'LOME/LOME8.c'\" unpacked with wrong size!
  758. fi
  759. # end of 'LOME/LOME8.c'
  760. fi
  761. if test -f 'LOME/Rubin.mac' -a "${1}" != "-c" ; then 
  762.   echo shar: Will not clobber existing file \"'LOME/Rubin.mac'\"
  763. else
  764. echo shar: Extracting \"'LOME/Rubin.mac'\" \(8668 characters\)
  765. sed "s/^X//" >'LOME/Rubin.mac' <<'END_OF_FILE'
  766. XFILE: Rubin&.mac
  767. XThe following message describes a fairly complex translation that is
  768. Xdesired by the sender. This file contains my solution, along with a
  769. Xdescription of how to use it. The basic operation is to recognise one
  770. Xcomponent of the assember-like line, handle it, and remove it. Very
  771. Xlittle complexity is present except for the large number of options,
  772. Xso only a small number of different substitutions are used and no file
  773. Xor control operations are needed.
  774. X--------------------------------------------------------------
  775. X>>From: Herman Rubin <cik@l.cc.purdue.edu>
  776. X>>To:    new@ee.udel.edu
  777. X>>Date:     Mon, 16 Jul 90 09:50:54 -0500
  778. X>>Subject:  Re: It looks like he's at it again!
  779. X>>>I still cannot figure it out.  Maybe if you can show me how to do one
  780. X>>>example, it might help.  The way I want to write the macro is
  781. X>>>
  782. X>>>    c{'z} ={tc} {-}{|}{ta}a{'x} OP{mod} {|}{tb}b{'y} {/\{~}w}
  783. X>>>
  784. X>>>with the usual convention that fields in braces are optional.  If knowing
  785. X>>>what the fields mean will help, I will provide this information.  It is
  786. X>>>desired to write this either as an assembler instruction or a s CALLQ8
  787. X>>>instruction to be inserted in a Fortran program.  The types of the
  788. X>>>a, b, and c are relevant.
  789. X>>
  790. X>>The code is for the CYBER 205/ETA 10.  I will illustrate the conversion
  791. X>>desired not to assembler, which I have not written, but to inserted
  792. X>>instructions in Fortran, which is very similar.  This does use symbolic
  793. X>>names mostly, with a few exceptions.    However, if I can manage this, I
  794. X>>should be able to manage the assembler as well.
  795. X>>
  796. X>>The format of the output instruction is (I will use small letters, although
  797. X>>Fortran normally uses capitals)
  798. X>>
  799. X>>    callq8 mnemonic(g,x,a,y,b,w,c)
  800. X>>
  801. X>>A field omitted is the same as that field being 0, but the commas must still
  802. X>>be there.  A vector is indicated by its descriptor, which is a full word
  803. X>>having the length and starting address.  A length 0 vector is useful, as
  804. X>>the offset can move before the start.  The type of the vector (linguistic)
  805. X>>is full or half, integer or float.  There are also bit vectors.  A scalar
  806. X>>also has the same type possibilities.  I may have some details wrong, but
  807. X>>they can easily be fixed up.    An offset value must be in a full word register.
  808. X>>Fortran normally has all its descriptors and variables in registers, but not
  809. X>>any of the vectors. The g field in this usage is given by a hex number, and
  810. X>>the various bits will be explained.
  811. X>>
  812. X>>The a, b, and c fields are either the descriptors (vector) or the locations
  813. X>>(scalar).  The x, y, and z fields, if present, are full-word registers.  The
  814. X>>w field, if present, is the address of the beginning of a bit vector.  If z
  815. X>>is present, c must be in an even numbered register and z in the next register.
  816. X>>Register 0 is unusable, and address 0 means not present.
  817. X>>
  818. X>>mnemonic refers to the operation and type.  Given the type of c and the
  819. X>>operation, this is translated normally (+ becomes add, etc.) except that
  820. X>>the default modification of the instruction for the type of c can be changed
  821. X>>by the mod field.  For example, for add the mod fields are u,l,n, and x.
  822. X>>For floats, n would be the default, and for integers, u.
  823. X>>
  824. X>>The bits of g are
  825. X>>
  826. X>>    80        half  tc can be used to override the default.
  827. X>>    40        complement the bit vector w (the ~)
  828. X>>    20        use z for an offset to c and w ('z present)
  829. X>>    10        a is scalar, not vector.  ta overrides the default
  830. X>>    08        b is scalar, not vector.  tb overrides the default
  831. X>>    04        the absolute value of a is taken (the | before a)
  832. X>>    02        negate a (the -).
  833. X>>    01        the absolute value of b is taken (the | before b)
  834. X>>
  835. X>>I hope this gives you a better idea of what I am trying to do.  It is
  836. X>>possible that if I can see how to do this, I might know how to handle
  837. X>>other cases.
  838. X--------------------------------------------------------------
  839. XSince distinguishing between legal FORTRAN and this assembler-like
  840. Xsyntax would be difficult, each assembler line must start with exactly
  841. Xone asterisk followed by one space. Lines that start with two
  842. Xasterisks are reserved for this use. This has the added benefit of
  843. Xmaking such programs illegal to the FORTRAN compiler before being run
  844. Xthrough LOME.
  845. X------
  846. XNote also that in Dr. Rubin's description, the "z" parameter is never
  847. Xpassed to the FORTRAN function, no explaination of how to distinguish
  848. Xhex addresses from variable names is given, and that results of the
  849. Xoperation depend on the type of variables. The first is solved by
  850. Xpassing "z" as the last argument. The second is "solved" by ignoring
  851. Xthe possibility of hex numbers as arguments. The last is impossible to
  852. Xsolve without either explicitly passing types as separate
  853. Xassembler-like statements or parsing some of the FORTRAN source and is
  854. Xhence ignored. This is, after all, tutorial.
  855. X
  856. X&@.@$0AaZFC`'()+-*/?!XXXX 000000000000
  857. X* @.    Match anything that starts with one star and a space
  858. X$ This just sets up the variables to their default values.
  859. X$ The arguments to the callq8 statement (g,x,y,w,z)
  860. X$ are initialized here and set as they are matched in later productions.
  861. X$ This is probably not the best way to do it, but it does illustrate
  862. X$ some points.
  863. XG@970@98$        set variable G to zero
  864. XX@970@98$        set variable X to zero
  865. XY@970@98$        set variable Y to zero
  866. XZ@970@98$        set variable Z to zero
  867. XW@970@98$        set variable W to zero
  868. XC      @00$        output the original line as a comment
  869. X**@00$            reparse the line without reinitializing
  870. X$$
  871. X***GenFormat(@,@,@).
  872. X$         0 1 2
  873. X$ This generates the instruction from the LOME variables stored
  874. X$ in G, X, Y, Z, W, and OP
  875. XOP@47G@57X@67Y@77Z@87W@97$    set up variable names
  876. X@53@57$     replace param 5 with contents of G
  877. X@52@57$     replace param 5 with contents of G evaluated as math
  878. X       CALLQ8 @43(@50,@63,@00,@73,@10,@93,@20,@83)
  879. X$ Z@F6$     Debugging dump if needed
  880. X$$
  881. X
  882. X**@ =@ @ @ @ /\~@.  see if ~w is present
  883. X$ 0  1 2 3 4    5
  884. XW@97@50@98$        set variable W to the contents of parameter five
  885. XG@97@93 64 +@98$    add 64 to G
  886. X**@00 =@10 @20 @30 @40$     resubmit
  887. X$$
  888. X**@ =@ @ @ @ /\@.   see if w is present
  889. X$ 0  1 2 3 4   5
  890. XW@97@50@98$        set variable W to the contents of parameter five
  891. X**@00 =@10 @20 @30 @40$     resubmit
  892. X$$
  893. X
  894. X**@ =@ -@ @ @.        see if "a" is negated
  895. X$ 0  1    2 3 4
  896. XG@97@93 2 +@98$     add 2 to G
  897. X**@00 =@10 @20 @30 @40$     resubmit
  898. X$$
  899. X**@ =@ |@ @ @.        see if "a" is abs'ed
  900. X$ 0  1    2 3 4
  901. XG@97@93 4 +@98$     add 2 to G
  902. X**@00 =@10 @20 @30 @40$     resubmit
  903. X$$
  904. X**@ =@ @ @ |@.        see if "b" is abs'ed
  905. X$ 0  1 2 3  4
  906. XG@97@93 1 +@98$     add 1 to G
  907. X**@00 =@10 @20 @30 @40$     resubmit
  908. X$$
  909. X
  910. X**@'@ =@ @ @ @.     see if z is present
  911. X$ 0 1  2 3 4 5
  912. XZ@97@10@98$        set variable Z to the contents of parameter one
  913. XG@97@93 32 +@98$    add 32 to G
  914. X**@00 =@20 @30 @40 @50$     resubmit
  915. X$$
  916. X**@ =@ @'@ @ @.     see if x is present
  917. X$ 0  1 2 3 4 5
  918. XX@97@30@98$        set variable X to the contents of parameter 3
  919. X**@00 =@10 @20 @40 @50$     resubmit
  920. X$$
  921. X**@ =@ @ @'@.       see if y is present
  922. X$ 0  1 2 3 4
  923. XY@97@40@98$        set variable Y to the contents of parameter 4
  924. X**@00 =@10 @20 @30$        resubmit
  925. X$$
  926. X
  927. X**@ =(half) @ @ @.  check if tc is half-length
  928. X$ 0        1 2 3
  929. X$  Since I can't really figure out what tc, ta, tb and mod are supposed
  930. X$  to mean, this is kind of a guess.
  931. XG@97@93 128 +@98$   add 128 to G
  932. X**@00 = @10 @20 @30 @40$     resubmit
  933. X$$
  934. X**@ =(full) @ @ @.  check if tc is full-length
  935. X$ 0        1 2 3
  936. X$  This is here for completeness.
  937. X**@00 = @10 @20 @30 @40$     resubmit
  938. X$$
  939. X
  940. X**@ = (scalar)@ @ @.    check if a should be scalar
  941. X$ 0          1 2 3
  942. XG@97@93 16 +@98$    add 16 to G
  943. X**@00 = @10 @20 @30$        resubmit
  944. X$$
  945. X**@ = (vector)@ @ @.    check if a should be vector
  946. X$ 0          1 2 3
  947. X$   This is here for completeness
  948. X**@00 = @10 @20 @30$        resubmit
  949. X$$
  950. X**@ = @ @ (scalar)@.    check if b should be scalar
  951. X$ 0   1 2      3
  952. XG@97@93 8 +@98$     add 8 to G
  953. X**@00 = @10 @20 @30$        resubmit
  954. X$$
  955. X**@ = @ @ (vector)@.    check if b should be scalar
  956. X$ 0   1 2      3
  957. X$  This is here for completeness
  958. X**@00 = @10 @20 @30$        resubmit
  959. X$$
  960. X
  961. X**@ = @ +@ @.        check for addition
  962. X$ 0   1  2 3
  963. XOP@97ADD@20@98$      store "ADD" and modifier in OP
  964. X***GenFormat(@00,@10,@30)$  output instruction
  965. X$$
  966. X**@ = @ -@ @.        check for subtraction
  967. X$ 0   1  2 3
  968. XOP@97SUB@20@98$      store "SUB" and modifier in OP
  969. X***GenFormat(@00,@10,@30)$  output instruction
  970. X$$
  971. X**@ = @ *@ @.        check for multiplication
  972. X$ 0   1  2 3
  973. XOP@97MULT@20@98$     store "MULT" and modifier in OP
  974. X***GenFormat(@00,@10,@30)$  output instruction
  975. X$$
  976. X**@ = @ /@ @.        check for division
  977. X$ 0   1  2 3
  978. XOP@97DIV@20@98$      store "DIV" and modifier in OP
  979. X***GenFormat(@00,@10,@30)$  output instruction
  980. X$$
  981. X
  982. X**@.            check if I didn't reformat something correctly
  983. XUnrecognised text: @00@C0
  984. X$$
  985. END_OF_FILE
  986. if test 8668 -ne `wc -c <'LOME/Rubin.mac'`; then
  987.     echo shar: \"'LOME/Rubin.mac'\" unpacked with wrong size!
  988. fi
  989. # end of 'LOME/Rubin.mac'
  990. fi
  991. if test -f 'PPL/PPLAmiga.c' -a "${1}" != "-c" ; then 
  992.   echo shar: Will not clobber existing file \"'PPL/PPLAmiga.c'\"
  993. else
  994. echo shar: Extracting \"'PPL/PPLAmiga.c'\" \(8753 characters\)
  995. sed "s/^X//" >'PPL/PPLAmiga.c' <<'END_OF_FILE'
  996. X/*
  997. X * PPLAmiga.c
  998. X * Portable Programmer's Library General Host Code
  999. X * Amiga version
  1000. X * Copyright 1988, 1990 Darren New.  All Rights Reserved.
  1001. X *
  1002. X * Started 19-Feb-88 DHN
  1003. X * LastMod 20-jul-90 DHN
  1004. X *
  1005. X */
  1006. X
  1007. X#include "PPL.h"
  1008. X
  1009. X#include "proto/dos.h"
  1010. X
  1011. X#define MAXARGC 20    /* max # args we are willing to remember */
  1012. X
  1013. X
  1014. XHIDDEN long memcount;
  1015. X
  1016. XHIDDEN long OutHand;    /* file hand for PLPutChar() */
  1017. XHIDDEN long InHand;    /* file hand for PLGetChar() */
  1018. X
  1019. Xvoid PLExit(severity)
  1020. X    short severity;
  1021. X{
  1022. X    /*
  1023. X    if (memcount != 0)
  1024. X    DEBUGF(1, "%ld blocks of allocated memory remain!" C memcount);
  1025. X    DEBUG_EXIT();
  1026. X    */
  1027. X
  1028. X    exit((int) severity);
  1029. X    }
  1030. X
  1031. Xptr PLAllocMem(size, flags)
  1032. X    long size;
  1033. X    int flags;
  1034. X{
  1035. X
  1036. X#ifdef CHECKALLOC
  1037. X
  1038. X    /* Note that this has some debugging stuff in it */
  1039. X        /**** OLD -- MUST BE CHECKED!! ****/
  1040. X    ptr retval;
  1041. X    inx i;
  1042. X    assert(size < BIGMEM);
  1043. X    retval = (ptr) malloc(size + sizeof(long) + sizeof(long) + (size & 1));
  1044. X    if (retval == NULL) {
  1045. X    if (flags & PLalloc_die) {
  1046. X        bomb("Out of Memory");
  1047. X        PLExit(PLsev_oores);
  1048. X        }
  1049. X    else
  1050. X        return retval;
  1051. X    }
  1052. X    else {
  1053. X    if (flags & PLalloc_zero)
  1054. X        for (i = size + 2 * sizeof(long) + (size & 1) - 1; 0 <= i; i--)
  1055. X        retval[i] = '\0';
  1056. X    memcount += 1;
  1057. X    (* (long *) retval) = 0xA5A55A5A;
  1058. X    (* (long *) (retval + sizeof(long) + size + (size & 1))) = 0x5A5AA5A5;
  1059. X    return retval + sizeof(long);
  1060. X    }
  1061. X
  1062. X#else
  1063. X
  1064. X    extern void * malloc(unsigned);
  1065. X    char * retval;
  1066. X    inx i;
  1067. X    assert(size < BIGMEM);
  1068. X    assert(size < 65530L);
  1069. X    assert(0 < size);
  1070. X    retval = malloc((unsigned) size);
  1071. X    if (retval == NULL) {
  1072. X    if (flags & PLalloc_die) {
  1073. X        bomb("Out of Memory");
  1074. X        PLExit(PLsev_oores);
  1075. X        }
  1076. X    else {
  1077. X        return NULL;
  1078. X        }
  1079. X    }
  1080. X    else {
  1081. X    if (flags & PLalloc_zero) {
  1082. X        for (i = 0; i < size; i++) {
  1083. X        retval[i] = '\0';
  1084. X        }
  1085. X        }
  1086. X    memcount += 1;
  1087. X    return (ptr) retval;
  1088. X    }
  1089. X
  1090. X#endif
  1091. X
  1092. X    }
  1093. X
  1094. X
  1095. Xvoid PLFreeMem(where)
  1096. X    ptr where;
  1097. X{
  1098. X
  1099. X#ifdef CHECKALLOC
  1100. X
  1101. X    /* note that this has some debugging stuff in it */
  1102. X    assert(where != NULL);
  1103. X    where -= sizeof(long);
  1104. X    if (* (long *) where == 0x19919119)
  1105. X    bomb("Freed memory twice!");
  1106. X    if (* (long *) where != 0xA5A55A5A)
  1107. X    bomb("Freed non-malloced memory!");
  1108. X    (* (long *) where) = 0x19919119;
  1109. X    free(where);
  1110. X    memcount -= 1;
  1111. X
  1112. X#else
  1113. X
  1114. X    extern void free(void *);
  1115. X    assert(where != NULL);
  1116. X    free(where);
  1117. X    memcount -= 1;
  1118. X
  1119. X#endif
  1120. X
  1121. X    }
  1122. X
  1123. Xstr PLStrDup(s)
  1124. X    str s;
  1125. X{
  1126. X    str t;
  1127. X    t = PLAllocMem(strlen(s)+1, PLalloc_die);
  1128. X    strcpy((char *) t, (char *) s);
  1129. X    return t;
  1130. X    }
  1131. X
  1132. Xvoid PLCopyMem(to, from, siz)
  1133. X    ptr to;
  1134. X    ptr from;
  1135. X    long siz;
  1136. X{
  1137. X    /* be lazy and use lattice function here */
  1138. X    extern void *memcpy(void *, void *, unsigned);
  1139. X    assert(0 < siz);
  1140. X    assert(siz < BIGMEM);
  1141. X    assert(NULL != to);
  1142. X    assert(NULL != from);
  1143. X    (void) memcpy((char *) to, (char *) from, (unsigned) siz);
  1144. X    }
  1145. X
  1146. Xvoid PLFillMem(where, siz, chr)
  1147. X    ptr where;
  1148. X    long siz;
  1149. X    char chr;
  1150. X{
  1151. X    char * whr = where;
  1152. X    assert(whr != NULL);
  1153. X    assert(0 < siz);
  1154. X    assert(siz < 32760);
  1155. X    assert(siz < BIGMEM);
  1156. X
  1157. X    /* setmem((char *) where, (unsigned) siz, chr); */
  1158. X
  1159. X    /* I don't trust Lattice at this point... */
  1160. X    while (0 < siz--)
  1161. X    *whr++ = chr;
  1162. X    }
  1163. X
  1164. Xptr PLFindMem(where, siz, chr)
  1165. X    ptr where;
  1166. X    long siz;
  1167. X    char chr;
  1168. X{
  1169. X    extern void *memchr(void *, int, unsigned);
  1170. X    assert(where != NULL);
  1171. X    assert(0 < siz);
  1172. X    assert(siz < BIGMEM);
  1173. X    return (ptr) memchr((char *) where, chr, (unsigned) siz);
  1174. X    }
  1175. X
  1176. X
  1177. X/* The error strings: */
  1178. XHIDDEN str PLerrstrs[] = {
  1179. X    /* 0*/  "No Error",
  1180. X    /* 1*/  "DOS error (retryable)",
  1181. X    /* 2*/  "DOS error (wait/retry)",
  1182. X    /* 3*/  "DOS error (please fix)",
  1183. X    /* 4*/  "DOS error (failure)",
  1184. X    /* 5*/  "Program fault",
  1185. X    /* 6*/  "End of data during input",
  1186. X    /* 7*/  "Out of resource during output",
  1187. X    /* 8*/  "Multiple errors occured without being cleared",
  1188. X    /* 9*/  "Item does not exist",
  1189. X    /*10*/  "Item already exists",
  1190. X    /*11*/  "You are not allowed to do that",
  1191. X    /*12*/  "That opperation is not supported here",
  1192. X    /*13*/  "Item is busy",
  1193. X    /*14*/  "Item name missing or incorrectly formed",
  1194. X    /*15*/  "Not Yet Implemented",
  1195. X    /*16*/  "Cannot be Implemented",
  1196. X    /*17*/  "Argument to internal function semantically invalid",
  1197. X    /*18*/  "Overflow error",
  1198. X    /*19*/  "Underflow error",
  1199. X    /*20*/  "User break or interrupted system call",
  1200. X    /*21*/  "Error number out of range",
  1201. X    NULL
  1202. X    };
  1203. X
  1204. XPLerr_enum PLerr;
  1205. X
  1206. XHIDDEN char * OSerrstrs[] = {
  1207. X    "103: insufficient free store",
  1208. X    "105: task table full",
  1209. X    "120: argument line invalid or too long",
  1210. X    "121: file is not an object module",
  1211. X    "122: invalid resident library during load",
  1212. X    "202: object in use",
  1213. X    "203: object already exists",
  1214. X    "204: directory not found",
  1215. X    "205: object not found",
  1216. X    "206: invalid window description",
  1217. X    "209: packet request type unknown",
  1218. X    "210: stream name component invalid",
  1219. X    "211: invalid object lock",
  1220. X    "212: object not of required type",
  1221. X    "213: disk not validated",
  1222. X    "214: disk write-protected",
  1223. X    "215: rename across devices attempted",
  1224. X    "216: directory not empty",
  1225. X    "218: device (or volume) not mounted",
  1226. X    "219: seek failure",
  1227. X    "220: comment too big",
  1228. X    "221: disk full",
  1229. X    "222: file is protected from deletion",
  1230. X    "223: file is write protected",
  1231. X    "224: file is read protected",
  1232. X    "225: not a valid DOS disk",
  1233. X    "226: no disk in drive",
  1234. X    "232: no more entries in directory",
  1235. X    NULL
  1236. X    };
  1237. X
  1238. Xint OSerr;
  1239. X
  1240. X/* The file and line of the last error (mainly for debugging) */
  1241. Xstr PLerr_file;
  1242. Xlong PLerr_line;
  1243. X
  1244. Xstr PLErrText()
  1245. X{
  1246. X    if ( PLerr < 0 || PLerr_last < PLerr )
  1247. X    PLerr = PLerr_last;
  1248. X    return PLerrstrs[PLerr];
  1249. X    }
  1250. X
  1251. Xstr PLOSErrText()
  1252. X{
  1253. X    inx i;
  1254. X    char t[4];
  1255. X    static char buf[64];
  1256. X
  1257. X    t[0] = (char) (OSerr / 100 % 10);
  1258. X    t[1] = (char) (OSerr /  10 % 10);
  1259. X    t[2] = (char) (OSerr /   1 % 10);
  1260. X    t[3] = EOS;
  1261. X    strcpy(buf, "Fault ");
  1262. X
  1263. X    for (i = 0; OSerrstrs[i] != NULL; i++)
  1264. X    if (t[0] == OSerrstrs[i][0] && t[1] == OSerrstrs[i][1] &&
  1265. X        t[2] == OSerrstrs[i][2])
  1266. X        break;
  1267. X
  1268. X    if (OSerrstrs[i] != NULL) {
  1269. X    strcat(buf, OSerrstrs[i]);
  1270. X    }
  1271. X    else {
  1272. X    strcat(buf, t);
  1273. X    }
  1274. X
  1275. X    return buf;
  1276. X    }
  1277. X
  1278. Xshort PLstatuslevel = 6;
  1279. X
  1280. Xvoid PLStatus(level, message)
  1281. X    short level;
  1282. X    str message;
  1283. X{
  1284. X    /* char lev = PLtodig(level); */
  1285. X    if (PLstatuslevel < level)
  1286. X    return;
  1287. X    if (PLcmdname && *PLcmdname) {
  1288. X    Write(Output(), PLcmdname, strlen(PLcmdname));
  1289. X    Write(Output(), ": ", 2);
  1290. X    }
  1291. X    /* Write(Output(), "(", 1);
  1292. X       Write(Output(), &lev, 1);
  1293. X       Write(Output(), ") ", 2);
  1294. X       */
  1295. X    Write(Output(), message, (long) strlen(message));
  1296. X    Write(Output(), "\n", 1);
  1297. X    }
  1298. X
  1299. Xvoid PLDelay(secs)
  1300. X    short secs;
  1301. X{
  1302. X    assert(0 <= secs);
  1303. X    if (secs != 0)
  1304. X    Delay((long) secs * 50L);
  1305. X    }
  1306. X
  1307. Xvoid PLBeep(how)
  1308. X    short how;
  1309. X{
  1310. X    /* for now, always just flash */
  1311. X    /* later, we will open the audio.device and so on... */
  1312. X
  1313. X    /* extern void DisplayBeep(void); */
  1314. X    /* DisplayBeep(); */
  1315. X    Write(Output(), "\007", 1L);
  1316. X    }
  1317. X
  1318. X/* get the next character from "standard input" */
  1319. X
  1320. Xshort PLGetChar()
  1321. X{
  1322. X    char ch;
  1323. X    int res;
  1324. X    if (InHand)
  1325. X    res = Read(InHand, &ch, 1);
  1326. X    else
  1327. X    res = -1;
  1328. X    if (res == 0)
  1329. X    return -1;
  1330. X    else if (res < 0)
  1331. X    return -2;
  1332. X    else
  1333. X    return (short) ch;
  1334. X    }
  1335. X
  1336. X/* This should send the indicated character to the "standard output". */
  1337. Xvoid PLPutChar(short ch)
  1338. X{
  1339. X    char chr = (char) ch;
  1340. X    if (OutHand)
  1341. X    Write(OutHand, &chr, 1);
  1342. X    }
  1343. X
  1344. Xvoid PLResetInput()
  1345. X{
  1346. X    InHand = Open("*", MODE_OLDFILE);
  1347. X    }
  1348. X
  1349. Xvoid PLResetOutput()
  1350. X{
  1351. X    OutHand = Open("*", MODE_OLDFILE);
  1352. X    }
  1353. X
  1354. X
  1355. X
  1356. X
  1357. X/* This gives the name of the command, if available.
  1358. X */
  1359. Xstr PLcmdname;
  1360. X
  1361. X/* This gives the host-syntax filename for the executable file,
  1362. X * if available.
  1363. X */
  1364. Xstr PLcmdfile;
  1365. X
  1366. X/* This tells how many command-line arguments there were, excluding
  1367. X * the command name.
  1368. X */
  1369. Xshort PLargcnt;
  1370. X
  1371. X/* This is the array of command-line argument strings.
  1372. X */
  1373. Xstr PLarglist[MAXARGC];
  1374. X
  1375. X/* These are the flags describing the command-line parameters.
  1376. X */
  1377. Xlong PLargflags;
  1378. X
  1379. X/* Here is the main() that sets all this up, calls DoIt() and exits.
  1380. X */
  1381. X
  1382. X#if HIDPROTS
  1383. Xvoid main ARGS((int argc, char * argv[]));
  1384. X#endif
  1385. X
  1386. Xvoid main(argc, argv)
  1387. X    int argc;
  1388. X    char * argv[];
  1389. X{
  1390. X    /* Eventually, we will want to init PLstatuslevel from an env var,
  1391. X       or something similar. */
  1392. X
  1393. X    OutHand = Output();
  1394. X    InHand = Input();
  1395. X
  1396. X    if (0 < argc) {
  1397. X    char * cp;
  1398. X    inx i;
  1399. X    cp = argv[0] + strlen(argv[0]) - 1;
  1400. X    while (argv[0] < cp && *cp != '/' && *cp != ':')
  1401. X        cp -= 1;
  1402. X    PLcmdname = cp;
  1403. X    PLargcnt = argc - 1;
  1404. X    for (i = 1; i < argc && i < MAXARGC; i++)
  1405. X        PLarglist[i-1] = argv[i];
  1406. X    }
  1407. X    PLExit(DoIt());
  1408. X    }
  1409. X
  1410. X
  1411. X/************* END OF FILE ***************/
  1412. X
  1413. X
  1414. X
  1415. END_OF_FILE
  1416. if test 8753 -ne `wc -c <'PPL/PPLAmiga.c'`; then
  1417.     echo shar: \"'PPL/PPLAmiga.c'\" unpacked with wrong size!
  1418. fi
  1419. # end of 'PPL/PPLAmiga.c'
  1420. fi
  1421. if test -f 'TFS/TFSAmiga.c' -a "${1}" != "-c" ; then 
  1422.   echo shar: Will not clobber existing file \"'TFS/TFSAmiga.c'\"
  1423. else
  1424. echo shar: Extracting \"'TFS/TFSAmiga.c'\" \(9122 characters\)
  1425. sed "s/^X//" >'TFS/TFSAmiga.c' <<'END_OF_FILE'
  1426. X/*
  1427. X * TFSAmiga.c
  1428. X * Portable Programmer's Library Text File Subsystem Code File
  1429. X * Copyright 1988 Darren New.  All Rights Reserved.
  1430. X *
  1431. X * Started: 26-Feb-88 DHN
  1432. X * LastMod: 04-dec-88 DHN
  1433. X *
  1434. X * Version One for Amiga -- Simple, just to get running
  1435. X *
  1436. X */
  1437. X
  1438. X#include "PPL.h"
  1439. X#include "TFS.h"
  1440. X
  1441. X#include "libraries/dos.h"
  1442. X#include "proto/dos.h"
  1443. X
  1444. X#define MAXTFS 15            /* max # TFSfiles open at once */
  1445. X
  1446. XHIDDEN struct {             /* one open file */
  1447. X    str name;
  1448. X    long fhand;
  1449. X    str modes;
  1450. X    } ftab[MAXTFS];
  1451. X
  1452. XHIDDEN bool TFShbi = FALSE;        /* has been init */
  1453. XHIDDEN short TFSfree;            /* number of free ftab entries */
  1454. X
  1455. XHIDDEN struct FileInfoBlock * fib;  /* cuts down allocation overhead */
  1456. X
  1457. X
  1458. X
  1459. X#define HND (handle - 1)            /* for convenience */
  1460. X
  1461. X
  1462. Xvoid TFSInit()
  1463. X{
  1464. X    inx i;
  1465. X    assert(TFShbi == FALSE);
  1466. X    TFShbi = TRUE;
  1467. X    for (i = 0; i < MAXTFS; i++)
  1468. X    ftab[i].name = ftab[i].modes = NULL;
  1469. X    /* fib = AllocMem(sizeof(struct FileInfoBlock), MEMF_PUBLIC);
  1470. X       if (fib == NULL) bomb("Out of Memory!"); */
  1471. X    fib = (struct FileInfoBlock *)
  1472. X        PLAllocMem(sizeof(struct FileInfoBlock), PLalloc_die);
  1473. X    assert((((long) fib) & 3) == 0);
  1474. X    TFSfree = MAXTFS;
  1475. X    PLErrClr();
  1476. X    }
  1477. X
  1478. Xbool TFSHasBeenInit()
  1479. X{
  1480. X    return TFShbi;
  1481. X    }
  1482. X
  1483. Xvoid TFSTerm()
  1484. X{
  1485. X    int i;
  1486. X    assert(TFShbi);
  1487. X    for (i = 0; i < MAXTFS; i++) {
  1488. X    if (ftab[i].modes != NULL) {
  1489. X        Close(ftab[i].fhand);
  1490. X        PLFreeMem(ftab[i].modes);
  1491. X        PLFreeMem(ftab[i].name);
  1492. X        }
  1493. X    }
  1494. X    PLFreeMem((ptr) fib);
  1495. X    TFSfree = 0;
  1496. X    TFShbi = FALSE;
  1497. X    PLErrClr();
  1498. X    }
  1499. X
  1500. X
  1501. XTFSfile TFSOpen(fname, mode)
  1502. X    str fname;
  1503. X    str mode;
  1504. X{
  1505. X
  1506. X    /**** NOTE THIS MUST BE CHANGED TO REMEMBER NAMES IN FULL LENGTH
  1507. X      OR RELATIVE TO A LOCK! ****/
  1508. X
  1509. X    BPTR flock;
  1510. X    BPTR fhand;
  1511. X    bool mL, mC, mT, mA, mR, mW, mP, mD;
  1512. X    long t; /* temp value */
  1513. X    inx i;
  1514. X
  1515. X#define setup(a,b) {a = (NULL != strchr(mode, b));}
  1516. X
  1517. X    assert(TFShbi);
  1518. X#if CHKARGS
  1519. X    if (fname == NULL || mode == NULL || *fname == EOS || *mode == EOS ||
  1520. X        BIGFNAME <= strlen(fname) ) {
  1521. X    PLErrSet(PLerr_badarg);
  1522. X    return 0;
  1523. X    }
  1524. X#endif
  1525. X
  1526. X    setup(mL, 'L'); setup(mC, 'C'); setup(mT, 'T');
  1527. X    setup(mA, 'A'); setup(mR, 'R'); setup(mW, 'W');
  1528. X    setup(mP, 'P'); setup(mD, 'D');
  1529. X
  1530. X#if CHKARGS
  1531. X    if ( (mR && mW) || (mP && !mR && !mC) || (mW && !mA && !mT) ||
  1532. X        (mA && mT) || (mA && !mW) || (mT && !mW) ) {
  1533. X    PLErrSet(PLerr_badarg);
  1534. X    return 0;
  1535. X    }
  1536. X#endif
  1537. X
  1538. X    if (TFSfree == 0 && ! mL) {
  1539. X    PLErrSet(PLerr_oores);
  1540. X    return 0;
  1541. X    }
  1542. X
  1543. X    flock = Lock(fname, mR ? ACCESS_READ : ACCESS_WRITE);
  1544. X    if (flock == 0 && !mC) {
  1545. X    OSerr = IoErr();
  1546. X    PLErrSet(PLerr_exist);
  1547. X    return 0;
  1548. X    }
  1549. X
  1550. X    if (flock != 0) {
  1551. X    /* file exists -- check it out */
  1552. X
  1553. X    if (0 == Examine(flock, fib)) {
  1554. X        OSerr = IoErr();
  1555. X        UnLock(flock);
  1556. X        PLErrSet(PLerr_opsysF);
  1557. X        return 0;
  1558. X        }
  1559. X
  1560. X    t = fib->fib_Protection;    /* bits indicate denied permisions */
  1561. X    if (    ((t & FIBF_READ) && mR) || ((t & FIBF_WRITE) && mW) ||
  1562. X        ((t & FIBF_DELETE) && mD) ) {
  1563. X        PLErrSet(PLerr_permit);
  1564. X        UnLock(flock);
  1565. X        return 0;
  1566. X        }
  1567. X
  1568. X    if ((mR || mW) && (fib->fib_DirEntryType > 0)) {
  1569. X        PLErrSet(PLerr_unsup);
  1570. X        UnLock(flock);
  1571. X        return 0;
  1572. X        }
  1573. X
  1574. X    UnLock(flock);
  1575. X    fhand = Open(fname, mT ? MODE_NEWFILE : MODE_OLDFILE);
  1576. X    if (fhand == 0) {
  1577. X        OSerr = IoErr();
  1578. X        PLErrSet(PLerr_opsysF);
  1579. X        return 0;
  1580. X        }
  1581. X    if (IsInteractive(fhand) && mP) {
  1582. X        Close(fhand);
  1583. X        PLErrSet(PLerr_unsup);
  1584. X        return 0;
  1585. X        }
  1586. X
  1587. X    if (mL) {
  1588. X        Close(fhand);
  1589. X        PLErrClr();
  1590. X        return 1;
  1591. X        }
  1592. X
  1593. X    for (i = 0; i < MAXTFS && ftab[i].modes; i++)
  1594. X        ;
  1595. X    assert(i < MAXTFS);
  1596. X    ftab[i].fhand = fhand;
  1597. X    ftab[i].modes = PLStrDup(mode);
  1598. X    ftab[i].name = PLStrDup(fname);
  1599. X
  1600. X    if (mA) Seek(fhand, 0, OFFSET_END);
  1601. X
  1602. X    return (TFSfile) (i + 1);
  1603. X    }
  1604. X    else {
  1605. X    /* file does not exist -- create it */
  1606. X
  1607. X    fhand = Open(fname, MODE_NEWFILE);
  1608. X    if (fhand == 0) {
  1609. X        OSerr = IoErr();
  1610. X        PLErrSet(PLerr_opsysU);
  1611. X        return 0;
  1612. X        }
  1613. X
  1614. X    if (mL) {
  1615. X        Close(fhand);
  1616. X        DeleteFile(fname);
  1617. X        PLErrClr();
  1618. X        return 1;
  1619. X        }
  1620. X
  1621. X    for (i = 0; i < MAXTFS && ftab[i].modes; i++)
  1622. X        ;
  1623. X    assert(i < MAXTFS);
  1624. X    ftab[i].fhand = fhand;
  1625. X    ftab[i].modes = PLStrDup(mode);
  1626. X    ftab[i].name = PLStrDup(fname);
  1627. X
  1628. X    return (TFSfile) (i + 1);
  1629. X    }
  1630. X    }
  1631. X
  1632. Xbool TFSClose(handle)
  1633. X    TFSfile handle;
  1634. X{
  1635. X    assert(TFShbi);
  1636. X#if CHKARGS
  1637. X    if (HND < 0 || MAXTFS <= HND || ftab[HND].modes == NULL) {
  1638. X    PLErrSet(PLerr_badarg);
  1639. X    return FALSE;
  1640. X    }
  1641. X#endif
  1642. X    assert(ftab[HND].fhand != NULL);
  1643. X    assert(ftab[HND].name  != NULL);
  1644. X    assert(ftab[HND].modes != NULL);
  1645. X
  1646. X    Close(ftab[HND].fhand);
  1647. X    PLFreeMem((ptr) ftab[HND].modes);
  1648. X    PLFreeMem((ptr) ftab[HND].name);
  1649. X    ftab[HND].name = ftab[HND].modes = NULL;
  1650. X    PLErrClr();
  1651. X    return TRUE;
  1652. X    }
  1653. X
  1654. Xbool TFSDestroy(handle)
  1655. X    TFSfile handle;
  1656. X{
  1657. X    char fn[BIGLINE];
  1658. X    bool flag;
  1659. X    int err;
  1660. X
  1661. X    assert(TFShbi);
  1662. X#if CHKARGS
  1663. X    if (HND < 0 || MAXTFS <= HND || ftab[HND].modes == NULL) {
  1664. X    PLErrSet(PLerr_badarg);
  1665. X    return FALSE;
  1666. X    }
  1667. X#endif
  1668. X    strcpy(fn, ftab[HND].name);
  1669. X    flag = (NULL != strchr(ftab[HND].modes, 'D'));
  1670. X
  1671. X    Close(ftab[HND].fhand);
  1672. X    PLFreeMem(ftab[HND].name);
  1673. X    PLFreeMem(ftab[HND].modes);
  1674. X    ftab[HND].modes = NULL;
  1675. X
  1676. X    if (flag) {
  1677. X    err = DeleteFile(fn);  /* permission checked during open */
  1678. X    if (err == 0) {
  1679. X        OSerr = IoErr();
  1680. X        PLErrSet(PLerr_opsysF);
  1681. X        return FALSE;
  1682. X        }
  1683. X    else {
  1684. X        PLErrClr();
  1685. X        return TRUE;
  1686. X        }
  1687. X    }
  1688. X    else {
  1689. X    PLErrSet(PLerr_badarg);
  1690. X    return FALSE;
  1691. X    }
  1692. X    }
  1693. X
  1694. X/*  @$@$
  1695. XTFSInfo()       - Determine file parameters. This may return various
  1696. Xparameters about the given file. The description of the information
  1697. Xreturned is given in the TFS.h file.
  1698. X*/
  1699. X
  1700. X
  1701. Xshort TFSRead(handle, buf)
  1702. X    TFSfile handle;
  1703. X    str buf;
  1704. X{
  1705. X    long prevseek;
  1706. X    long l;
  1707. X    inx i;
  1708. X    char c;
  1709. X
  1710. X    /* see TFSUnix.c for character-by-character version */
  1711. X
  1712. X    assert(TFShbi);
  1713. X    assert(buf != NULL);
  1714. X#if CHKARGS
  1715. X        /*
  1716. X        printf("handle=%d\n", handle);
  1717. X        printf("buf=%x\n", buf);
  1718. X        printf("HND=%d\n", HND);
  1719. X        printf("&ftab[HND]=%x\n", &ftab[HND]);
  1720. X        printf("&ftab[HND].modes=%x\n", &ftab[HND].modes);
  1721. X        printf("ftab[HND].modes=\"%s\"\n", ftab[HND].modes);
  1722. X        */
  1723. X    if (HND < 0 || MAXTFS <= HND || ftab[HND].modes == NULL) {
  1724. X    PLErrSet(PLerr_badarg);
  1725. X    buf[0] = EOS;
  1726. X    return S -1;
  1727. X    }
  1728. X    if (NULL == strchr(ftab[HND].modes, 'R')) {
  1729. X    PLErrSet(PLerr_badarg);
  1730. X    buf[0] = EOS;
  1731. X    return S -1;
  1732. X    }
  1733. X#endif
  1734. X
  1735. X    do {
  1736. X    prevseek = Seek(ftab[HND].fhand, 0, OFFSET_CURRENT);
  1737. X    } while (prevseek < 0 && fault("Could not seek text file!"));
  1738. X    if (prevseek < 0)
  1739. X    PLExit(PLsev_fault);
  1740. X    l = Read(ftab[HND].fhand, buf, BIGLINE);
  1741. X    if (l == -1) {
  1742. X    PLErrSet(PLerr_opsysF);
  1743. X    OSerr = IoErr();
  1744. X    buf[0] = EOS;
  1745. X    return S -1;
  1746. X    }
  1747. X    else if (l == 0) {
  1748. X    PLErrSet(PLerr_eod);
  1749. X    buf[0] = EOS;
  1750. X    return S -1;
  1751. X    }
  1752. X    else {
  1753. X    i = l;
  1754. X    while (i < BIGLINE)
  1755. X        buf[i++] = '\n';
  1756. X    for (i = 0; buf[i] != '\n' && i < BIGLINE; i++)
  1757. X        ;
  1758. X    if (buf[i] == '\n') {
  1759. X        buf[i] = EOS;
  1760. X        Seek(ftab[HND].fhand, prevseek + i + 1, OFFSET_BEGINNING);
  1761. X        while (0 < i && isspace(buf[i-1]))
  1762. X        buf[--i] = EOS;
  1763. X        assert(strlen(buf) < BIGLINE);
  1764. X        return (short) i;
  1765. X        }
  1766. X    else {
  1767. X        i = BIGLINE;
  1768. X        buf[BIGLINE-1] = EOS;
  1769. X        while (0 < i && isspace(buf[i-1]))
  1770. X        buf[--i] = EOS;
  1771. X        do {
  1772. X        l = Read(ftab[HND].fhand, &c, 1);
  1773. X        } while (l == 1 && c != '\n');
  1774. X        PLErrClr();
  1775. X        PLErrSet(PLerr_overflow);
  1776. X        assert(strlen(buf) < BIGLINE);
  1777. X        return (short) -1;
  1778. X        }
  1779. X    }
  1780. X    }
  1781. X
  1782. X
  1783. Xbool TFSWrite(handle, buf)
  1784. X    TFSfile handle;
  1785. X    str buf;
  1786. X{
  1787. X    int i;  /* must be able to handle negative numbers */
  1788. X
  1789. X    assert(buf != NULL);
  1790. X#if CHKARGS
  1791. X    if (HND < 0 || MAXTFS <= HND || ftab[HND].modes == NULL) {
  1792. X    PLErrSet(PLerr_badarg);
  1793. X    return FALSE;
  1794. X    }
  1795. X    if (NULL == strchr(ftab[HND].modes, 'W')) {
  1796. X    PLErrSet(PLerr_badarg);
  1797. X    return FALSE;
  1798. X    }
  1799. X#endif
  1800. X
  1801. X    i = strlen(buf);
  1802. X    while (0 < i && isspace(buf[i - 1]))
  1803. X    i -= 1;
  1804. X    if ( ( (0 < i) && (i != Write(ftab[HND].fhand, buf, i)) ) ||
  1805. X        1 != Write(ftab[HND].fhand, "\n", 1)) {
  1806. X    OSerr = IoErr();
  1807. X    PLErrSet(PLerr_opsysF);
  1808. X    return FALSE;
  1809. X    }
  1810. X    PLErrClr();
  1811. X    return TRUE;
  1812. X    }
  1813. X
  1814. Xlong TFSNote(handle)
  1815. X    TFSfile handle;
  1816. X{
  1817. X    long retval;
  1818. X#if CHKARGS
  1819. X    if (HND < 0 || MAXTFS <= HND || ftab[HND].modes == NULL) {
  1820. X    PLErrSet(PLerr_badarg);
  1821. X    return -1L;
  1822. X    }
  1823. X    if (NULL == strchr(ftab[HND].modes, 'P') ||
  1824. X        NULL == strchr(ftab[HND].modes, 'R')) {
  1825. X    PLErrSet(PLerr_badarg);
  1826. X    return -1L;
  1827. X    }
  1828. X#endif
  1829. X
  1830. X    retval = Seek(ftab[HND].fhand, 0, OFFSET_CURRENT );
  1831. X    if (retval == -1) {
  1832. X    OSerr = IoErr();
  1833. X    PLErrSet(PLerr_opsysF);
  1834. X    OSerr = IoErr();
  1835. X    return 0L;
  1836. X    }
  1837. X    else {
  1838. X    PLErrClr();
  1839. X    return retval + 1L;
  1840. X    }
  1841. X    }
  1842. X
  1843. Xbool TFSPoint(handle, pos)
  1844. X    TFSfile handle;
  1845. X    TFSnote pos;
  1846. X{
  1847. X    long newpos;
  1848. X#if CHKARGS
  1849. X    if (HND < 0 || MAXTFS <= HND || ftab[HND].modes == NULL) {
  1850. X    PLErrSet(PLerr_badarg);
  1851. X    return -1L;
  1852. X    }
  1853. X    if (pos <= 0L || NULL == strchr(ftab[HND].modes, 'P') ||
  1854. X        NULL == strchr(ftab[HND].modes, 'R')) {
  1855. X    PLErrSet(PLerr_badarg);
  1856. X    return -1L;
  1857. X    }
  1858. X#endif
  1859. X
  1860. X    newpos = Seek(ftab[HND].fhand, pos - 1L, OFFSET_BEGINNING );
  1861. X    if (newpos == -1L) {
  1862. X    OSerr = IoErr();
  1863. X    PLErrSet(PLerr_opsysF);
  1864. X    OSerr = IoErr();
  1865. X    return FALSE;
  1866. X    }
  1867. X    else {
  1868. X    PLErrClr();
  1869. X    return TRUE;
  1870. X    }
  1871. X    }
  1872. X
  1873. X
  1874. X
  1875. END_OF_FILE
  1876. if test 9122 -ne `wc -c <'TFS/TFSAmiga.c'`; then
  1877.     echo shar: \"'TFS/TFSAmiga.c'\" unpacked with wrong size!
  1878. fi
  1879. # end of 'TFS/TFSAmiga.c'
  1880. fi
  1881. echo shar: End of archive 5 \(of 9\).
  1882. cp /dev/null ark5isdone
  1883. MISSING=""
  1884. for I in 1 2 3 4 5 6 7 8 9 ; do
  1885.     if test ! -f ark${I}isdone ; then
  1886.     MISSING="${MISSING} ${I}"
  1887.     fi
  1888. done
  1889. if test "${MISSING}" = "" ; then
  1890.     echo You have unpacked all 9 archives.
  1891.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1892. else
  1893.     echo You still need to unpack the following archives:
  1894.     echo "        " ${MISSING}
  1895. fi
  1896. ##  End of shell archive.
  1897. exit 0
  1898. -- 
  1899. --- Darren New --- Grad Student --- CIS --- Univ. of Delaware ---
  1900.  
  1901. exit 0 # Just in case...
  1902. -- 
  1903. Please send comp.sources.unix-related mail to rsalz@uunet.uu.net.
  1904. Use a domain-based address or give alternate paths, or you may lose out.
  1905.