home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume14 / vplot / part16 < prev    next >
Text File  |  1988-03-31  |  46KB  |  1,796 lines

  1. Subject:  v14i021:  Device-independant graphics system, with drivers
  2. Newsgroups: comp.sources.unix
  3. Sender: sources
  4. Approved: rsalz@uunet.UU.NET
  5.  
  6. Submitted-by: Joe Dellinger <joe@hanauma.STANFORD.EDU>
  7. Posting-number: Volume 14, Issue 21
  8. Archive-name: vplot/part16
  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 16 (of 24)."
  17. # Wrapped by rsalz@fig.bbn.com on Fri Mar 25 11:47:26 1988
  18. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  19. if test -f 'Vplot_Kernel/filters/include/vplotfonts/makefont.c' -a "${1}" != "-c" ; then 
  20.   echo shar: Will not clobber existing file \"'Vplot_Kernel/filters/include/vplotfonts/makefont.c'\"
  21. else
  22. echo shar: Extracting \"'Vplot_Kernel/filters/include/vplotfonts/makefont.c'\" \(13926 characters\)
  23. sed "s/^X//" >'Vplot_Kernel/filters/include/vplotfonts/makefont.c' <<'END_OF_FILE'
  24. X/*
  25. X * Copyright 1987 the Board of Trustees of the Leland Stanford Junior
  26. X * University. Official permission to use this software is included in
  27. X * the documentation. It authorizes you to use this file for any
  28. X * non-commercial purpose, provided that this copyright notice is not
  29. X * removed and that any modifications made to this file are commented
  30. X * and dated in the style of my example below.
  31. X */
  32. X
  33. X/*
  34. X *
  35. X *  source file:   ./filters/include/vplotfonts/makefont.c
  36. X *
  37. X * Joe Dellinger (SEP), June 11 1987
  38. X *    Inserted this sample edit history entry.
  39. X *    Please log any further modifications made to this file:
  40. X * Joe Dellinger Oct 18 1987
  41. X *    Made arrays allocated dynamically
  42. X */
  43. X
  44. X/*
  45. X * This program converts easily understandable "Vplot font" files into
  46. X * an "include" form which is suitable for being included into gentext.c,
  47. X * and also simultaneously into a binary ("bin") form that can be loaded at
  48. X * runtime by gentext.c. (The Makefile in this directory shows how the
  49. X * several resulting files must be combined.)
  50. X *
  51. X * makefont font_name < Vplot_font > Vplot_font.include
  52. X *
  53. X * If no font_name is given, it will be called "XXXXX".
  54. X *
  55. X * A "Vplot font" file has the following form:
  56. X * Line 1:   start  end
  57. X * These are the ASCII values of the beginning and ending characters
  58. X * which will be in this font.
  59. X * (Beginning and ending as in lowest and highest numbered in the ASCII
  60. X * collating sequence... it is OK to not have every character in that interval)
  61. X * Line 2: letter line space
  62. X * Space between letters, space between lines, width of a space.
  63. X * Line 3: top cap half base bottom
  64. X * Vertical coordinates for "top" (Top of highest normal character in font,
  65. X * typically), "cap" (Top of typical capital letter), "half" (What you align
  66. X * on for vertical centering), "base" (Bottom of most letters, except those
  67. X * with descenders), "bottom" (Bottom of lowest normal descender)
  68. X * N Lines: Lig val1 val2 val3 ...
  69. X * The first number is the integer ascii value of a glyph which is a ligature
  70. X * of the ascii characters with value val1, val2, ... (up to 6)
  71. X * A blank line signifies the end of the ligatures.
  72. X * Start of a character line: e left right char symb
  73. X * 'e' is simply the Vplot character for "erase", and is fixed.
  74. X * "char" tells what ASCII code to assign this glyph to... (need be in no
  75. X * particular order!) If "char" is outside the normal ASCII range it can also
  76. X * be represented \num , where num is the "ASCII" number of the glyph. num
  77. X * is NOT restricted to be less than 256! These characters can be accessed
  78. X * via the \vnum command of gentext.
  79. X * left, right, give the left and right half-widths
  80. X * of the character (it is assumed that all characters are centered at
  81. X * coordinate zero left and right), symb gives the vertical coordinate for
  82. X * centering if this character is used as a symbol. If "left", "right",
  83. X * or "symb" are unknown, these may be replaced instead by "5555" and
  84. X * this program will calculate them for you. (Also leftright=0 set inside
  85. X * this program will force such calculation of all left and right widths,
  86. X * as will symbol=0 force such calculation of all vertical centering
  87. X * coordinates. Instead of 5555, "symb" can also simply be omitted.)
  88. X * Move line: m xcoordinate ycoordinate
  89. X * Start of actual glyph coordinates... you must always start with a move.
  90. X * Coordinates must be LESS THAN 64 in absolute value.
  91. X * Draw line: d xcoordinate ycoordinate
  92. X * Typically the next line will be a draw.
  93. X * Start polygon line: A npts
  94. X * It is also possible to put in a polygon.
  95. X * Polygon line: tab xcoordinate ycoordinate
  96. X * there should be following a Start Polygon line npts lines of coordinates,
  97. X * each beginning with a tab or a space.
  98. X * Continue in this way until the next 'e' signals the start of the next
  99. X * character.
  100. X *
  101. X * Files in this format may be viewed using plas:
  102. X * plas < Vplot_font | ?pen xcenter=0 ycenter=0 scale=150 ...
  103. X *
  104. X * Refer to the pen.vplot_font file given here as an example.
  105. X *
  106. X * - Joe Dellinger, Stanford University Dept of Earth Science
  107. X */
  108. X
  109. X#include <stdio.h>
  110. X#include "../params.h"
  111. extern char    *malloc ();
  112. X
  113. X#define EOCBIT 0x8000    /* END OF CHARACTER MARK OR POLYGON BIT */
  114. X#define DRAWBIT 0x4000    /* DRAW BIT */
  115. X#define XBIT 0x0040
  116. X#define YBIT 0x2000
  117. X#define UNDEFINED    -1
  118. X
  119. X/* Too big a number to be a possible width or height, which is bounded by 64 */
  120. X#define MAGIC        5555
  121. X#define MAX_LENGTH    10000    /* Max number of lines in input Vplot file */
  122. X#define MAX_FONT    32768    /* Max number of symbols in a font */
  123. X#define MAX_STRING    10    /* Max length of char number */
  124. X
  125. int             length[7] =
  126. X{
  127. X 0, 0, 0, 0, 0, 0, 0
  128. X};
  129. int             length2[7] =
  130. X{
  131. X 0, 0, 0, 0, 0, 0, 0
  132. X};
  133. X
  134. main (argc, argv)
  135. X    int             argc;
  136. X    char          **argv;
  137. X{
  138. char           *mde, *cp;
  139. int            *x, *y, *z, *xp, *yp, *zp;
  140. char           *ch, *chp;
  141. int            *addr;
  142. int             addr_index;
  143. int             xout, xmax, xmin, ymin, ymax, nc = 0;
  144. int            *lwidth, *rwidth;
  145. int            *symb;
  146. int             pad, leftright, symbol;
  147. char            string[133];
  148. int             start, end;
  149. int             first = 1;
  150. int             letter, line, space, top, cap, half, base, bottom;
  151. int             left, right, vsymb, count;
  152. char            name[100];
  153. int             i, j, iaddr;
  154. int             fd;
  155. unsigned short  ushort;
  156. short           sshort;
  157. int             integer;
  158. int             lengtht;
  159. int             lig[7];
  160. X
  161. X    mde = (char *) malloc (MAX_LENGTH * sizeof (char));
  162. X    x = (int *) malloc (MAX_LENGTH * sizeof (int));
  163. X    y = (int *) malloc (MAX_LENGTH * sizeof (int));
  164. X    z = (int *) malloc (MAX_LENGTH * sizeof (int));
  165. X    ch = (char *) malloc (MAX_LENGTH * MAX_STRING * sizeof (char));
  166. X    addr = (int *) malloc (MAX_FONT * sizeof (int));
  167. X    lwidth = (int *) malloc (MAX_FONT * sizeof (int));
  168. X    rwidth = (int *) malloc (MAX_FONT * sizeof (int));
  169. X    symb = (int *) malloc (MAX_FONT * sizeof (int));
  170. X
  171. X    for (i = 0; i < MAX_FONT; i++)
  172. X    {
  173. X    addr[i] = UNDEFINED;
  174. X    lwidth[i] = UNDEFINED;
  175. X    rwidth[i] = UNDEFINED;
  176. X    }
  177. X    for (i = 0; i < MAX_LENGTH; i++)
  178. X    {
  179. X    x[i] = MAGIC;
  180. X    y[i] = MAGIC;
  181. X    z[i] = MAGIC;
  182. X    }
  183. X
  184. X    xp = x;
  185. X    yp = y;
  186. X    zp = z;
  187. X    cp = mde;
  188. X    chp = ch;
  189. X
  190. X/*
  191. X * Change these next 3 lines in order to add padding or to always ignore
  192. X * the given width and height information
  193. X */
  194. X    pad = 0;
  195. X    leftright = 1;
  196. X    symbol = 1;
  197. X
  198. X
  199. X    if (argc == 1)
  200. X    {
  201. X    strcpy (name, "XXXXX");
  202. X    }
  203. X    else
  204. X    {
  205. X    strcpy (name, argv[1]);
  206. X    }
  207. X    strcat (name, "_");
  208. X
  209. X    gets (string);
  210. X    sscanf (string, "%d %d", &start, &end);
  211. X    gets (string);
  212. X    sscanf (string, "%d %d %d", &letter, &line, &space);
  213. X    space -= 2 * letter;
  214. X    gets (string);
  215. X    sscanf (string, "%d %d %d %d %d", &top, &cap, &half, &base, &bottom);
  216. X
  217. X    sprintf (string, "%slig", name);
  218. X    fd = creat (string, 0777);
  219. X    printf ("int %slig[] =\n{\n", name);
  220. X
  221. X    while (1)
  222. X    {
  223. X    gets (string);
  224. X/* At most 6 characters in a ligature! */
  225. X    lig[0] = 0;
  226. X    i = sscanf (string, "%d %d %d %d %d %d %d",
  227. X         lig, lig + 1, lig + 2, lig + 3, lig + 4, lig + 5, lig + 6);
  228. X    if (i <= 1)
  229. X    {
  230. X        printf ("%d,  ", 0);
  231. X        integer = 0;
  232. X        write (fd, (char *) &integer, sizeof (int));
  233. X        length[6] += sizeof (int);
  234. X
  235. X        printf ("\n};\n\n");
  236. X        close (fd);
  237. X        break;
  238. X    }
  239. X    else
  240. X    {
  241. X        printf ("%d,  ", i - 1);
  242. X        integer = i - 1;
  243. X        write (fd, (char *) &integer, sizeof (int));
  244. X        length[6] += sizeof (int);
  245. X
  246. X        printf ("%d, ", lig[0]);
  247. X        integer = lig[0];
  248. X        write (fd, (char *) &integer, sizeof (int));
  249. X        length[6] += sizeof (int);
  250. X
  251. X        for (j = 1; j < i; j++)
  252. X        {
  253. X        printf ("%d,", lig[j]);
  254. X        integer = lig[j];
  255. X        write (fd, (char *) &integer, sizeof (int));
  256. X        length[6] += sizeof (int);
  257. X        }
  258. X        printf ("\n");
  259. X    }
  260. X    }
  261. X
  262. X    while (gets (string))
  263. X    {
  264. X    *chp = '\0';
  265. X    *(chp + 1) = '\0';
  266. X    *(chp + 2) = '\0';
  267. X    sscanf (string, "%c %d %d %s %d", cp++, xp++, yp++, chp, zp++);
  268. X    chp += MAX_STRING;
  269. X    nc++;
  270. X    }
  271. X    *cp = 'e';
  272. X    *chp = '\0';
  273. X    nc++;
  274. X
  275. X    printf ("unsigned short %svec[] =\n{\n", name);
  276. X    sprintf (string, "%ssvec", name);
  277. X    fd = creat (string, 0777);
  278. X
  279. X    for (i = 0, iaddr = 0; i < nc; ++i)
  280. X    {
  281. X    switch (mde[i])
  282. X    {
  283. X    case ('e'):
  284. X        /* Things to do when ending a character */
  285. X        if (!first)
  286. X        {
  287. X        xout = EOCBIT;
  288. X        if (!leftright || left == MAGIC || right == MAGIC)
  289. X        {
  290. X            lwidth[addr_index] = -xmin + pad / 2.;
  291. X            rwidth[addr_index] = xmax + pad / 2.;
  292. X        }
  293. X        else
  294. X        {
  295. X            lwidth[addr_index] = left;
  296. X            rwidth[addr_index] = right;
  297. X        }
  298. X        if (!symbol || vsymb == MAGIC)
  299. X        {
  300. X            symb[addr_index] = (ymax + ymin) / 2;
  301. X        }
  302. X        else
  303. X        {
  304. X            symb[addr_index] = vsymb;
  305. X        }
  306. X        }
  307. X        else
  308. X        first = 0;
  309. X
  310. X        /* Things to do when beginning a character */
  311. X        if (ch[i * MAX_STRING + 0] != '\0')
  312. X        {
  313. X        count = 0;
  314. X        ymax = -10000;
  315. X        ymin = 10000;
  316. X        xmax = -10000;
  317. X        xmin = 10000;
  318. X        if (ch[i * MAX_STRING + 0] != '\\' || ch[i * MAX_STRING + 1] == '\0')
  319. X        {
  320. X            addr_index = ch[i * MAX_STRING + 0];
  321. X        }
  322. X        else
  323. X        {
  324. X            sscanf (&ch[i * MAX_STRING + 0], "\\%d ", &addr_index);
  325. X        }
  326. X        if (addr_index < start || addr_index > end)
  327. X        {
  328. X            fprintf (stderr, "Character value %d out of promised range %d to %d!\n", addr_index, start, end);
  329. X            exit (1);
  330. X        }
  331. X        addr_index -= start;
  332. X        addr[addr_index] = iaddr;
  333. X        left = x[i];
  334. X        right = y[i];
  335. X        vsymb = z[i];
  336. X        }
  337. X        break;
  338. X    case 'A':
  339. X        count = x[i];
  340. X        if (count < 3)
  341. X        {
  342. X        fprintf (stderr, "Polygon must have more than 2 vertices!\n");
  343. X        exit (2);
  344. X        }
  345. X        /* Don't increment iaddr, no output */
  346. X        continue;
  347. X        break;
  348. X    case '\t':
  349. X        mde[i] = ' ';
  350. X    case ' ':
  351. X        count--;
  352. X    case ('d'):
  353. X    case ('m'):
  354. X        xout = x[i] < 0 ? -(x[i]) : x[i];
  355. X        if (x[i] < 0)
  356. X        xout |= XBIT;
  357. X        xout |= ((y[i] < 0 ? -(y[i]) : y[i]) << 7);
  358. X        if (y[i] < 0)
  359. X        xout |= YBIT;
  360. X        if (mde[i] == 'd')
  361. X        xout |= DRAWBIT;
  362. X        else
  363. X        if (mde[i] == ' ')
  364. X        {
  365. X        xout |= DRAWBIT;
  366. X        if (count > 0)
  367. X            xout |= EOCBIT;
  368. X        }
  369. X
  370. X        xmax = x[i] < xmax ? xmax : x[i];
  371. X        xmin = x[i] > xmin ? xmin : x[i];
  372. X        ymax = y[i] < ymax ? ymax : y[i];
  373. X        ymin = y[i] > ymin ? ymin : y[i];
  374. X        break;
  375. X    default:
  376. X        /* ignore this line */
  377. X        continue;
  378. X        break;
  379. X    }
  380. X
  381. X    /*
  382. X     * Only increment pointer for those things which output something,
  383. X     * and also the first time. 
  384. X     */
  385. X    iaddr++;
  386. X    if (i > 0)
  387. X    {
  388. X        printf ("%d,", xout);
  389. X        ushort = xout;
  390. X        write (fd, (char *) &ushort, sizeof (unsigned short));
  391. X        length[5] += sizeof (unsigned short);
  392. X        if (xout == EOCBIT)
  393. X        printf ("\n");
  394. X    }
  395. X    }                /* end for loop  */
  396. X    close (fd);
  397. X
  398. X/*
  399. X * Check info
  400. X */
  401. X    sprintf (string, "%scheck", name);
  402. X    fd = creat (string, 0777);
  403. X    write (fd, (char *) "Vplot Binary fonT  \n", 20);
  404. X    integer = FONTCHECK;
  405. X    write (fd, (char *) &integer, sizeof (int));
  406. X    close (fd);
  407. X
  408. X/*
  409. X * Now write out all the Binary information.
  410. X * We will write out each different sort of thing into a different
  411. X * file, and then use "cat" to put them all together.
  412. X * Keep track of how long each piece is as we write it out
  413. X * so that we construct the "table of contents" to the concatenated file.
  414. X */
  415. X
  416. X    sprintf (string, "%saddr", name);
  417. X    fd = creat (string, 0777);
  418. X
  419. X    printf ("};\n\n\nint %saddr[] =\n{\n", name);
  420. X    for (i = 0; i <= end - start; ++i)
  421. X    {
  422. X    printf ("%d,", addr[i]);
  423. X    integer = addr[i];
  424. X    write (fd, (char *) &integer, sizeof (int));
  425. X    length[1] += sizeof (int);
  426. X    }
  427. X    close (fd);
  428. X
  429. X    sprintf (string, "%swidthl", name);
  430. X    fd = creat (string, 0777);
  431. X
  432. X    printf ("\n};\n\n\nshort %swidthl[] =\n{\n", name);
  433. X    for (i = 0; i <= end - start; ++i)
  434. X    {
  435. X    printf ("%d,", lwidth[i]);
  436. X    sshort = lwidth[i];
  437. X    write (fd, (char *) &sshort, sizeof (short));
  438. X    length[2] += sizeof (short);
  439. X    }
  440. X    close (fd);
  441. X
  442. X    sprintf (string, "%swidthr", name);
  443. X    fd = creat (string, 0777);
  444. X
  445. X    printf ("\n};\n\n\nshort %swidthr[] =\n{\n", name);
  446. X    for (i = 0; i <= end - start; ++i)
  447. X    {
  448. X    printf ("%d,", rwidth[i]);
  449. X    sshort = rwidth[i];
  450. X    write (fd, (char *) &sshort, sizeof (short));
  451. X    length[3] += sizeof (short);
  452. X    }
  453. X    close (fd);
  454. X
  455. X    sprintf (string, "%ssymbol", name);
  456. X    fd = creat (string, 0777);
  457. X
  458. X    printf ("\n};\n\n\nshort %ssymbol[] =\n{\n", name);
  459. X    for (i = 0; i <= end - start; ++i)
  460. X    {
  461. X    printf ("%d,", symb[i]);
  462. X    sshort = symb[i];
  463. X    write (fd, (char *) &sshort, sizeof (short));
  464. X    length[4] += sizeof (short);
  465. X    }
  466. X    close (fd);
  467. X
  468. X    printf ("\n};\n\n\n");
  469. X
  470. X    printf ("short %sdim[] = {%d, %d, %d, %d, %d, %d, %d, %d, %d, %d};\n",
  471. X       name, bottom, base, half, cap, top, letter, line, space, start, end);
  472. X    sprintf (string, "%sdim", name);
  473. X    fd = creat (string, 0777);
  474. X    sshort = bottom;
  475. X    write (fd, (char *) &sshort, sizeof (short));
  476. X    sshort = base;
  477. X    write (fd, (char *) &sshort, sizeof (short));
  478. X    sshort = half;
  479. X    write (fd, (char *) &sshort, sizeof (short));
  480. X    sshort = cap;
  481. X    write (fd, (char *) &sshort, sizeof (short));
  482. X    sshort = top;
  483. X    write (fd, (char *) &sshort, sizeof (short));
  484. X    sshort = letter;
  485. X    write (fd, (char *) &sshort, sizeof (short));
  486. X    sshort = line;
  487. X    write (fd, (char *) &sshort, sizeof (short));
  488. X    sshort = space;
  489. X    write (fd, (char *) &sshort, sizeof (short));
  490. X    sshort = start;
  491. X    write (fd, (char *) &sshort, sizeof (short));
  492. X    sshort = end;
  493. X    write (fd, (char *) &sshort, sizeof (short));
  494. X    length[0] += 10 * sizeof (short);
  495. X    close (fd);
  496. X
  497. X/*
  498. X * Length is an array which says how long each piece is;
  499. X * Length2 says at what offset each begins.
  500. X * Lengtht gives the total length of the whole file (not including the
  501. X * table of contents itself, which goes at the beginning and is of
  502. X * fixed length).
  503. X */
  504. X
  505. X    lengtht = length[0];
  506. X    for (i = 1; i < 7; i++)
  507. X    {
  508. X    length2[i] = length2[i - 1] + length[i - 1];
  509. X    lengtht += length[i];
  510. X    }
  511. X
  512. X    sprintf (string, "%sheader", name);
  513. X    fd = creat (string, 0777);
  514. X    write (fd, (char *) &lengtht, sizeof (int));
  515. X    write (fd, (char *) length2, 7 * sizeof (int));
  516. X    close (fd);
  517. X}
  518. END_OF_FILE
  519. if test 13926 -ne `wc -c <'Vplot_Kernel/filters/include/vplotfonts/makefont.c'`; then
  520.     echo shar: \"'Vplot_Kernel/filters/include/vplotfonts/makefont.c'\" unpacked with wrong size!
  521. fi
  522. # end of 'Vplot_Kernel/filters/include/vplotfonts/makefont.c'
  523. fi
  524. if test -f 'Vplot_Kernel/filters/loclib/getpar_scan.c' -a "${1}" != "-c" ; then 
  525.   echo shar: Will not clobber existing file \"'Vplot_Kernel/filters/loclib/getpar_scan.c'\"
  526. else
  527. echo shar: Extracting \"'Vplot_Kernel/filters/loclib/getpar_scan.c'\" \(14981 characters\)
  528. sed "s/^X//" >'Vplot_Kernel/filters/loclib/getpar_scan.c' <<'END_OF_FILE'
  529. X# include "stdio.h"
  530. X# define U(x) x
  531. X# define NLSTATE yyprevious=YYNEWLINE
  532. X# define BEGIN yybgin = yysvec + 1 +
  533. X# define INITIAL 0
  534. X# define YYLERR yysvec
  535. X# define YYSTATE (yyestate-yysvec-1)
  536. X# define YYOPTIM 1
  537. X# define YYLMAX 200
  538. X# define output(c) putc(c,yyout)
  539. X# define input() (((yytchar=yysptr>yysbuf?U(*--yysptr):getc(yyin))==10?(yylineno++,yytchar):yytchar)==EOF?0:yytchar)
  540. X# define unput(c) {yytchar= (c);if(yytchar=='\n')yylineno--;*yysptr++=yytchar;}
  541. X# define yymore() (yymorfg=1)
  542. X# define ECHO fprintf(yyout, "%s",yytext)
  543. X# define REJECT { nstr = yyreject(); goto yyfussy;}
  544. int yyleng; extern char yytext[];
  545. int yymorfg;
  546. extern char *yysptr, yysbuf[];
  547. int yytchar;
  548. FILE *yyin ={stdin}, *yyout ={stdout};
  549. extern int yylineno;
  550. struct yysvf { 
  551. X    struct yywork *yystoff;
  552. X    struct yysvf *yyother;
  553. X    int *yystops;};
  554. struct yysvf *yyestate;
  555. extern struct yysvf yysvec[], *yybgin;
  556. X/* lexical scanning for fast getpar */
  557. X/* Revised 3-8-86 stew  Added time stamp to enable older method of handling
  558. X *            multiple tags.  Moved par= intiialization to
  559. X *            separate routine to avoid code duplication.
  560. X */
  561. X#include <ctype.h>
  562. X#include "fastpar.h"
  563. X#undef input
  564. X#define input() ((int) *(input_stack[input_depth]++))
  565. X#undef unput
  566. X/* The redundant  =(c) insures side effects of expressions occur */
  567. X#define unput(c) (*(--(input_stack[input_depth]))=(c))
  568. X#define yywrap() getpar_pop_input()
  569. X#define yylex() getpar_lexscan()
  570. X#define yylook() getpar_yylook()
  571. X
  572. X#define MAX_INPUT_DEPTH 10
  573. static int input_depth = -1;
  574. static char *input_stack[MAX_INPUT_DEPTH];
  575. static char *dealloc_stack[MAX_INPUT_DEPTH];
  576. X
  577. static struct {
  578. X    char *tag;  int tlen;
  579. X    char *val;  int vlen;
  580. X       } yy;
  581. X
  582. X
  583. static int  SMALLBLOCK = 4096;
  584. static char
  585. X*suballoc (size)
  586. int size;
  587. X{
  588. X    static char *myblock = (char *) NULL; static int bytesleft = 0;
  589. X    char *ptr; extern char *alloc();
  590. X
  591. X    if(size > SMALLBLOCK) return(alloc(size));
  592. X    else
  593. X      { 
  594. X        if(bytesleft < size)
  595. X           {
  596. X            myblock = alloc (SMALLBLOCK);
  597. X        bytesleft = SMALLBLOCK - size;
  598. X           }
  599. X       else
  600. X           {
  601. X        bytesleft -= size;
  602. X           }
  603. X       ptr = myblock;
  604. X       myblock += size;
  605. X       return(ptr);
  606. X      }
  607. X}
  608. X
  609. static int  prime[10] = {31,29,23,19,17,13,11,7,5,3};
  610. int getpar_hash(array,len)
  611. register char *array;
  612. register int len;
  613. X{
  614. X  register int hash;
  615. X  register int i;
  616. X  if(len >10) len=10;
  617. X  hash=0;
  618. X  for(i=0; i<len; i++)
  619. X    hash += array[i]*prime[i];
  620. X  return(hash);
  621. X}
  622. X
  623. X/* workhorse to decode par files; shell already parses command line */
  624. getpar_scan(queue,qlen)
  625. register hash_item **queue;
  626. register int qlen;
  627. X{
  628. X extern int yylex();
  629. X
  630. X while(yylex()) {
  631. X    getpar_hash_store(queue,qlen,yy.tag,yy.val,yy.tlen,yy.vlen);
  632. X    if(yy.tlen == 3 && 0 == bcmp(yy.tag,"par",3))
  633. X        getpar_stack_par(yy.val);
  634. X    }
  635. X}
  636. X
  637. X/* read parfile into core and put buffer on scan input stack */
  638. getpar_stack_par(val)
  639. char *val;
  640. X{
  641. X register char *buffer;
  642. X register int fd, len;
  643. X extern int file(), fsize();
  644. X extern char *alloc();
  645. X
  646. X    fd = file(val,0);
  647. X    len = fsize(fd);
  648. X    buffer=alloc(len+3);
  649. X    buffer[0]='\n';
  650. X    read(fd,buffer+1,len);
  651. X    buffer[len+1]='\n';
  652. X    buffer[len+2]='\0';
  653. X    getpar_push_input(buffer,1);
  654. X    close(fd);
  655. X}
  656. X
  657. X /* return 1 if match; 0 otherwise */
  658. X#define getpar_hash_compare(next1,tag1,tlen1)  \
  659. X ((next1)->tlen == (tlen1) && 0 == bcmp((next1)->tag,tag1,tlen1))
  660. X
  661. getpar_hash_store(q,qlen,tag,val,tlen,vlen)
  662. hash_item **q;
  663. register char *tag, *val;
  664. register int tlen;
  665. int qlen, vlen;
  666. X{
  667. X register hash_item *hold, *next;
  668. X static int storetime = 0;
  669. X
  670. X hold=(hash_item *) (q+getpar_hash(tag,tlen)%qlen);
  671. X next=hold->next;
  672. X
  673. X while(next != ((hash_item *) NULL)) {
  674. X    if(getpar_hash_compare(next,tag,tlen) ) {
  675. X        next->val = val; next->vlen = vlen;
  676. X        next->timestamp = storetime++; return;
  677. X        }
  678. X    hold = next; next = next->next;
  679. X    }
  680. X
  681. X hold->next = next = (hash_item *) suballoc(sizeof(hash_item));
  682. X next->next = (hash_item *) NULL;
  683. X next->tlen = tlen;
  684. X next->tag = tag;
  685. X next->vlen = vlen;
  686. X next->val = val;
  687. X next->timestamp = storetime++;
  688. X}
  689. X
  690. hash_item *getpar_hash_lookup(q,qlen,tag,tlen)
  691. register hash_item **q;
  692. register char *tag;
  693. register int tlen;
  694. register int qlen;
  695. X{
  696. X register hash_item *next;
  697. X
  698. X next = *(q + getpar_hash(tag,tlen)%qlen);
  699. X
  700. X while(next != ((hash_item *) NULL) ) {
  701. X    if(getpar_hash_compare(next,tag,tlen)) break;
  702. X    next = next->next;
  703. X    }
  704. X return(next);
  705. X}
  706. X
  707. X# define FOUNDTAG 2
  708. X# define YYNEWLINE 10
  709. yylex(){
  710. int nstr; extern int yyprevious;
  711. while((nstr = yylook()) >= 0)
  712. yyfussy: switch(nstr){
  713. case 0:
  714. if(yywrap()) return(0); break;
  715. case 1:
  716. X    {
  717. X             yy.vlen = yyleng-2; yy.val=suballoc(yy.vlen+1);
  718. X             yy.vlen = massage(yytext+1,yy.val,yy.vlen,yytext[0]);
  719. X             yy.val[yy.vlen]='\0'; BEGIN 0; return(FOUNDTAG);
  720. X             }
  721. break;
  722. case 2:
  723. X    {
  724. X             yy.vlen = yyleng-2; yy.val=suballoc(yy.vlen+1);
  725. X             yy.vlen = massage(yytext+1,yy.val,yy.vlen,yytext[0]);
  726. X             yy.val[yy.vlen]='\0'; BEGIN 0; return(FOUNDTAG);
  727. X             }
  728. break;
  729. case 3:
  730. X{
  731. X                 yy.vlen=yyleng; yy.val=suballoc(yy.vlen+1);
  732. X                  bcopy(yytext,yy.val,yy.vlen+1); BEGIN 0;
  733. X                 return(FOUNDTAG);
  734. X                 }
  735. break;
  736. case 4:
  737. X{
  738. X             yy.tlen=yyleng-1; yy.tag=suballoc(yy.tlen+1);
  739. X             bcopy(yytext,yy.tag,yy.tlen);
  740. X             yy.tag[yy.tlen]='\0'; BEGIN FOUNDTAG;
  741. X             }
  742. break;
  743. case 5:
  744. X{
  745. X             yy.tlen=yyleng-2; yy.tag=suballoc(yy.tlen+1);
  746. X             bcopy(yytext+1,yy.tag,yy.tlen);
  747. X             yy.tag[yy.tlen]='\0'; BEGIN FOUNDTAG;
  748. X             }
  749. break;
  750. case 6:
  751. X/* skip comment lines */;
  752. break;
  753. case 7:
  754. case 8:
  755. X;
  756. break;
  757. case -1:
  758. break;
  759. default:
  760. fprintf(yyout,"bad switch yylook %d",nstr);
  761. X} return(0); }
  762. X/* end of yylex */
  763. X    getpar_push_input(buffer,dealloc)
  764. X    register char *buffer;
  765. X    register int dealloc;
  766. X    {
  767. X      if(input_depth++ == MAX_INPUT_DEPTH)
  768. X        err("too many nested par files\n");
  769. X      input_stack[input_depth] = buffer;
  770. X      if(dealloc) dealloc_stack[input_depth] = buffer;
  771. X      else dealloc_stack[input_depth] = (char *) NULL;
  772. X    }
  773. X
  774. X    int
  775. X    yywrap()
  776. X    {
  777. X      if(((char *) NULL) != dealloc_stack[input_depth]) {
  778. X        free(dealloc_stack[input_depth]);
  779. X        dealloc_stack[input_depth] = (char *) NULL;
  780. X        }
  781. X      input_stack[input_depth--] = (char *) NULL;
  782. X      if(input_depth < 0) return(1);
  783. X      return(0);
  784. X    }
  785. X
  786. X    static int
  787. X    massage(string,out,len,quote)
  788. X    register char *string, *out;
  789. X    register int len, quote;
  790. X    {
  791. X     register int i,j;
  792. X    
  793. X    for(i=0,j=0; i<len-1; j++) {
  794. X        out[j]=string[i++];
  795. X        if(out[j]==quote) /* compress doubled quotes */
  796. X            if(string[i]==quote) i++;
  797. X        }
  798. X    if(i<len) out[j++] = string[i];
  799. X    return(j);
  800. X    }
  801. int yyvstop[] ={
  802. X0,
  803. X
  804. X7,
  805. X0,
  806. X
  807. X7,
  808. X0,
  809. X
  810. X8,
  811. X0,
  812. X
  813. X6,
  814. X7,
  815. X0,
  816. X
  817. X7,
  818. X0,
  819. X
  820. X3,
  821. X7,
  822. X0,
  823. X
  824. X3,
  825. X7,
  826. X0,
  827. X
  828. X3,
  829. X8,
  830. X0,
  831. X
  832. X7,
  833. X0,
  834. X
  835. X7,
  836. X0,
  837. X
  838. X3,
  839. X6,
  840. X7,
  841. X0,
  842. X
  843. X3,
  844. X7,
  845. X0,
  846. X
  847. X6,
  848. X0,
  849. X
  850. X-4,
  851. X0,
  852. X
  853. X3,
  854. X0,
  855. X
  856. X3,
  857. X0,
  858. X
  859. X2,
  860. X0,
  861. X
  862. X2,
  863. X0,
  864. X
  865. X1,
  866. X0,
  867. X
  868. X1,
  869. X0,
  870. X
  871. X3,
  872. X6,
  873. X0,
  874. X
  875. X3,
  876. X0,
  877. X
  878. X3,
  879. X-4,
  880. X0,
  881. X
  882. X-5,
  883. X0,
  884. X
  885. X4,
  886. X0,
  887. X
  888. X3,
  889. X-5,
  890. X0,
  891. X
  892. X3,
  893. X4,
  894. X0,
  895. X
  896. X5,
  897. X0,
  898. X
  899. X3,
  900. X5,
  901. X0,
  902. X0};
  903. X# define YYTYPE char
  904. struct yywork { YYTYPE verify, advance; } yycrank[] ={
  905. X0,0,    0,0,    1,5,    0,0,    
  906. X0,0,    3,10,    0,0,    0,0,    
  907. X0,0,    0,0,    1,6,    1,7,    
  908. X0,0,    3,11,    3,12,    18,0,    
  909. X12,0,    12,0,    0,0,    21,0,    
  910. X21,0,    0,0,    0,0,    0,0,    
  911. X0,0,    0,0,    0,0,    35,0,    
  912. X35,0,    0,0,    37,0,    37,0,    
  913. X0,0,    0,0,    0,0,    1,5,    
  914. X0,0,    2,8,    3,13,    12,0,    
  915. X1,5,    4,15,    21,0,    3,14,    
  916. X25,23,    28,26,    1,5,    11,0,    
  917. X11,0,    3,10,    35,0,    0,0,    
  918. X17,17,    37,0,    0,0,    17,17,    
  919. X17,17,    17,17,    17,17,    17,17,    
  920. X17,17,    17,17,    17,17,    17,17,    
  921. X17,17,    0,0,    1,5,    2,9,    
  922. X17,32,    3,10,    11,0,    4,16,    
  923. X6,17,    6,17,    6,17,    6,17,    
  924. X6,17,    6,17,    6,17,    6,17,    
  925. X6,17,    6,17,    6,17,    6,17,    
  926. X6,17,    6,17,    6,17,    6,17,    
  927. X6,17,    6,17,    6,17,    6,17,    
  928. X6,17,    6,17,    6,17,    6,17,    
  929. X6,17,    6,17,    0,0,    0,0,    
  930. X0,0,    0,0,    17,17,    11,22,    
  931. X6,17,    6,17,    6,17,    6,17,    
  932. X6,17,    6,17,    6,17,    6,17,    
  933. X6,17,    6,17,    6,17,    6,17,    
  934. X6,17,    6,17,    6,17,    6,17,    
  935. X6,17,    6,17,    6,17,    6,17,    
  936. X6,17,    6,17,    6,17,    6,17,    
  937. X6,17,    6,17,    8,18,    0,0,    
  938. X0,0,    0,0,    0,0,    0,0,    
  939. X16,0,    16,0,    8,18,    8,0,    
  940. X0,0,    0,0,    0,0,    0,0,    
  941. X0,0,    0,0,    0,0,    0,0,    
  942. X0,0,    0,0,    0,0,    0,0,    
  943. X0,0,    0,0,    0,0,    0,0,    
  944. X0,0,    0,0,    0,0,    16,0,    
  945. X0,0,    0,0,    0,0,    8,18,    
  946. X0,0,    0,0,    0,0,    0,0,    
  947. X8,18,    0,0,    0,0,    0,0,    
  948. X16,30,    0,0,    8,18,    9,19,    
  949. X0,0,    0,0,    9,19,    9,19,    
  950. X9,19,    9,19,    9,19,    9,19,    
  951. X9,19,    9,19,    9,19,    9,19,    
  952. X16,31,    0,0,    0,0,    9,20,    
  953. X16,30,    0,0,    8,18,    9,19,    
  954. X9,19,    9,19,    9,19,    9,19,    
  955. X9,19,    9,19,    9,19,    9,19,    
  956. X9,19,    9,19,    9,19,    9,19,    
  957. X9,19,    9,19,    9,19,    9,19,    
  958. X9,19,    9,19,    9,19,    9,19,    
  959. X9,19,    9,19,    9,19,    9,19,    
  960. X9,19,    0,0,    0,0,    0,0,    
  961. X0,0,    9,19,    0,0,    9,19,    
  962. X9,19,    9,19,    9,19,    9,19,    
  963. X9,19,    9,19,    9,19,    9,19,    
  964. X9,19,    9,19,    9,19,    9,19,    
  965. X9,19,    9,19,    9,19,    9,19,    
  966. X9,19,    9,19,    9,19,    9,19,    
  967. X9,19,    9,19,    9,19,    9,19,    
  968. X9,19,    10,21,    0,0,    13,23,    
  969. X0,0,    14,26,    22,0,    22,0,    
  970. X0,0,    10,0,    10,0,    13,23,    
  971. X13,24,    14,26,    14,27,    15,29,    
  972. X0,0,    0,0,    0,0,    20,33,    
  973. X0,0,    0,0,    29,29,    0,0,    
  974. X15,0,    0,0,    0,0,    20,0,    
  975. X20,0,    22,0,    0,0,    29,0,    
  976. X10,0,    0,0,    10,21,    0,0,    
  977. X13,25,    0,0,    14,26,    10,21,    
  978. X0,0,    13,23,    22,22,    14,28,    
  979. X0,0,    10,21,    0,0,    13,23,    
  980. X15,29,    14,26,    20,0,    0,0,    
  981. X20,33,    15,29,    0,0,    29,29,    
  982. X0,0,    20,33,    22,34,    15,29,    
  983. X29,29,    0,0,    22,22,    20,33,    
  984. X31,35,    10,21,    29,29,    13,23,    
  985. X0,0,    14,26,    30,0,    30,0,    
  986. X31,0,    31,0,    0,0,    0,0,    
  987. X32,36,    0,0,    0,0,    15,29,    
  988. X34,37,    0,0,    0,0,    20,33,    
  989. X32,0,    32,0,    29,29,    0,0,    
  990. X34,0,    34,0,    0,0,    0,0,    
  991. X0,0,    30,0,    0,0,    31,0,    
  992. X0,0,    31,35,    0,0,    0,0,    
  993. X0,0,    0,0,    31,35,    0,0,    
  994. X0,0,    0,0,    30,30,    32,0,    
  995. X31,35,    32,36,    0,0,    34,0,    
  996. X0,0,    34,37,    32,36,    0,0,    
  997. X0,0,    0,0,    34,37,    0,0,    
  998. X32,36,    0,0,    30,31,    0,0,    
  999. X34,37,    0,0,    30,30,    0,0,    
  1000. X31,35,    0,0,    0,0,    0,0,    
  1001. X0,0,    0,0,    0,0,    0,0,    
  1002. X0,0,    0,0,    0,0,    0,0,    
  1003. X32,36,    0,0,    0,0,    0,0,    
  1004. X34,37,    0,0,    0,0,    0,0,    
  1005. X0,0};
  1006. struct yysvf yysvec[] ={
  1007. X0,    0,    0,
  1008. yycrank+-1,    0,        0,    
  1009. yycrank+-2,    yysvec+1,    0,    
  1010. yycrank+-4,    0,        0,    
  1011. yycrank+-6,    yysvec+3,    0,    
  1012. yycrank+0,    0,        yyvstop+1,
  1013. yycrank+7,    0,        yyvstop+3,
  1014. yycrank+0,    0,        yyvstop+5,
  1015. yycrank+-129,    0,        yyvstop+7,
  1016. yycrank+130,    0,        yyvstop+10,
  1017. yycrank+-252,    0,        yyvstop+12,
  1018. yycrank+-38,    yysvec+10,    yyvstop+15,
  1019. yycrank+-7,    yysvec+10,    yyvstop+18,
  1020. yycrank+-254,    0,        yyvstop+21,
  1021. yycrank+-256,    0,        yyvstop+23,
  1022. yycrank+-266,    yysvec+8,    yyvstop+25,
  1023. yycrank+-127,    yysvec+10,    yyvstop+29,
  1024. yycrank+7,    yysvec+6,    0,    
  1025. yycrank+-5,    yysvec+8,    yyvstop+32,
  1026. yycrank+0,    yysvec+9,    0,    
  1027. yycrank+-270,    0,        yyvstop+34,
  1028. yycrank+-10,    yysvec+10,    yyvstop+36,
  1029. yycrank+-249,    yysvec+10,    yyvstop+38,
  1030. yycrank+0,    yysvec+13,    0,    
  1031. yycrank+0,    0,        yyvstop+40,
  1032. yycrank+10,    0,        yyvstop+42,
  1033. yycrank+0,    yysvec+14,    0,    
  1034. yycrank+0,    0,        yyvstop+44,
  1035. yycrank+6,    0,        yyvstop+46,
  1036. yycrank+-273,    yysvec+8,    yyvstop+48,
  1037. yycrank+-313,    yysvec+10,    yyvstop+51,
  1038. yycrank+-315,    0,        yyvstop+53,
  1039. yycrank+-327,    0,        yyvstop+56,
  1040. yycrank+0,    0,        yyvstop+58,
  1041. yycrank+-331,    0,        yyvstop+60,
  1042. yycrank+-18,    yysvec+10,    yyvstop+63,
  1043. yycrank+0,    0,        yyvstop+66,
  1044. yycrank+-21,    yysvec+10,    yyvstop+68,
  1045. X0,    0,    0};
  1046. struct yywork *yytop = yycrank+396;
  1047. struct yysvf *yybgin = yysvec+1;
  1048. char yymatch[] ={
  1049. X00  ,01  ,01  ,01  ,01  ,01  ,01  ,01  ,
  1050. X01  ,011 ,012 ,01  ,01  ,01  ,01  ,01  ,
  1051. X01  ,01  ,01  ,01  ,01  ,01  ,01  ,01  ,
  1052. X01  ,01  ,01  ,01  ,01  ,01  ,01  ,01  ,
  1053. X011 ,01  ,'"' ,01  ,01  ,01  ,01  ,047 ,
  1054. X01  ,01  ,01  ,01  ,01  ,'-' ,01  ,01  ,
  1055. X'-' ,'-' ,'-' ,'-' ,'-' ,'-' ,'-' ,'-' ,
  1056. X'-' ,'-' ,01  ,01  ,01  ,01  ,01  ,01  ,
  1057. X01  ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,
  1058. X'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,
  1059. X'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,
  1060. X'A' ,'A' ,'A' ,01  ,01  ,01  ,01  ,'-' ,
  1061. X01  ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,
  1062. X'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,
  1063. X'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,
  1064. X'A' ,'A' ,'A' ,01  ,01  ,01  ,01  ,01  ,
  1065. X0};
  1066. char yyextra[] ={
  1067. X0,0,0,0,1,1,0,0,
  1068. X0,0,0,0,0,0,0,0,
  1069. X0};
  1070. X/*    ncform    4.1    83/08/11    */
  1071. X
  1072. int yylineno =1;
  1073. X# define YYU(x) x
  1074. X# define NLSTATE yyprevious=YYNEWLINE
  1075. char yytext[YYLMAX];
  1076. struct yysvf *yylstate [YYLMAX], **yylsp, **yyolsp;
  1077. char yysbuf[YYLMAX];
  1078. char *yysptr = yysbuf;
  1079. int *yyfnd;
  1080. extern struct yysvf *yyestate;
  1081. int yyprevious = YYNEWLINE;
  1082. yylook(){
  1083. X    register struct yysvf *yystate, **lsp;
  1084. X    register struct yywork *yyt;
  1085. X    struct yysvf *yyz;
  1086. X    int yych;
  1087. X    struct yywork *yyr;
  1088. X# ifdef LEXDEBUG
  1089. X    int debug;
  1090. X# endif
  1091. X    char *yylastch;
  1092. X    /* start off machines */
  1093. X# ifdef LEXDEBUG
  1094. X    debug = 0;
  1095. X# endif
  1096. X    if (!yymorfg)
  1097. X        yylastch = yytext;
  1098. X    else {
  1099. X        yymorfg=0;
  1100. X        yylastch = yytext+yyleng;
  1101. X        }
  1102. X    for(;;){
  1103. X        lsp = yylstate;
  1104. X        yyestate = yystate = yybgin;
  1105. X        if (yyprevious==YYNEWLINE) yystate++;
  1106. X        for (;;){
  1107. X# ifdef LEXDEBUG
  1108. X            if(debug)fprintf(yyout,"state %d\n",yystate-yysvec-1);
  1109. X# endif
  1110. X            yyt = yystate->yystoff;
  1111. X            if(yyt == yycrank){        /* may not be any transitions */
  1112. X                yyz = yystate->yyother;
  1113. X                if(yyz == 0)break;
  1114. X                if(yyz->yystoff == yycrank)break;
  1115. X                }
  1116. X            *yylastch++ = yych = input();
  1117. X        tryagain:
  1118. X# ifdef LEXDEBUG
  1119. X            if(debug){
  1120. X                fprintf(yyout,"char ");
  1121. X                allprint(yych);
  1122. X                putchar('\n');
  1123. X                }
  1124. X# endif
  1125. X            yyr = yyt;
  1126. X            if ( (int)yyt > (int)yycrank){
  1127. X                yyt = yyr + yych;
  1128. X                if (yyt <= yytop && yyt->verify+yysvec == yystate){
  1129. X                    if(yyt->advance+yysvec == YYLERR)    /* error transitions */
  1130. X                        {unput(*--yylastch);break;}
  1131. X                    *lsp++ = yystate = yyt->advance+yysvec;
  1132. X                    goto contin;
  1133. X                    }
  1134. X                }
  1135. X# ifdef YYOPTIM
  1136. X            else if((int)yyt < (int)yycrank) {        /* r < yycrank */
  1137. X                yyt = yyr = yycrank+(yycrank-yyt);
  1138. X# ifdef LEXDEBUG
  1139. X                if(debug)fprintf(yyout,"compressed state\n");
  1140. X# endif
  1141. X                yyt = yyt + yych;
  1142. X                if(yyt <= yytop && yyt->verify+yysvec == yystate){
  1143. X                    if(yyt->advance+yysvec == YYLERR)    /* error transitions */
  1144. X                        {unput(*--yylastch);break;}
  1145. X                    *lsp++ = yystate = yyt->advance+yysvec;
  1146. X                    goto contin;
  1147. X                    }
  1148. X                yyt = yyr + YYU(yymatch[yych]);
  1149. X# ifdef LEXDEBUG
  1150. X                if(debug){
  1151. X                    fprintf(yyout,"try fall back character ");
  1152. X                    allprint(YYU(yymatch[yych]));
  1153. X                    putchar('\n');
  1154. X                    }
  1155. X# endif
  1156. X                if(yyt <= yytop && yyt->verify+yysvec == yystate){
  1157. X                    if(yyt->advance+yysvec == YYLERR)    /* error transition */
  1158. X                        {unput(*--yylastch);break;}
  1159. X                    *lsp++ = yystate = yyt->advance+yysvec;
  1160. X                    goto contin;
  1161. X                    }
  1162. X                }
  1163. X            if ((yystate = yystate->yyother) && (yyt= yystate->yystoff) != yycrank){
  1164. X# ifdef LEXDEBUG
  1165. X                if(debug)fprintf(yyout,"fall back to state %d\n",yystate-yysvec-1);
  1166. X# endif
  1167. X                goto tryagain;
  1168. X                }
  1169. X# endif
  1170. X            else
  1171. X                {unput(*--yylastch);break;}
  1172. X        contin:
  1173. X# ifdef LEXDEBUG
  1174. X            if(debug){
  1175. X                fprintf(yyout,"state %d char ",yystate-yysvec-1);
  1176. X                allprint(yych);
  1177. X                putchar('\n');
  1178. X                }
  1179. X# endif
  1180. X            ;
  1181. X            }
  1182. X# ifdef LEXDEBUG
  1183. X        if(debug){
  1184. X            fprintf(yyout,"stopped at %d with ",*(lsp-1)-yysvec-1);
  1185. X            allprint(yych);
  1186. X            putchar('\n');
  1187. X            }
  1188. X# endif
  1189. X        while (lsp-- > yylstate){
  1190. X            *yylastch-- = 0;
  1191. X            if (*lsp != 0 && (yyfnd= (*lsp)->yystops) && *yyfnd > 0){
  1192. X                yyolsp = lsp;
  1193. X                if(yyextra[*yyfnd]){        /* must backup */
  1194. X                    while(yyback((*lsp)->yystops,-*yyfnd) != 1 && lsp > yylstate){
  1195. X                        lsp--;
  1196. X                        unput(*yylastch--);
  1197. X                        }
  1198. X                    }
  1199. X                yyprevious = YYU(*yylastch);
  1200. X                yylsp = lsp;
  1201. X                yyleng = yylastch-yytext+1;
  1202. X                yytext[yyleng] = 0;
  1203. X# ifdef LEXDEBUG
  1204. X                if(debug){
  1205. X                    fprintf(yyout,"\nmatch ");
  1206. X                    sprint(yytext);
  1207. X                    fprintf(yyout," action %d\n",*yyfnd);
  1208. X                    }
  1209. X# endif
  1210. X                return(*yyfnd++);
  1211. X                }
  1212. X            unput(*yylastch);
  1213. X            }
  1214. X        if (yytext[0] == 0  /* && feof(yyin) */)
  1215. X            {
  1216. X            yysptr=yysbuf;
  1217. X            return(0);
  1218. X            }
  1219. X        yyprevious = yytext[0] = input();
  1220. X        if (yyprevious>0)
  1221. X            output(yyprevious);
  1222. X        yylastch=yytext;
  1223. X# ifdef LEXDEBUG
  1224. X        if(debug)putchar('\n');
  1225. X# endif
  1226. X        }
  1227. X    }
  1228. yyback(p, m)
  1229. X    int *p;
  1230. X{
  1231. if (p==0) return(0);
  1232. while (*p)
  1233. X    {
  1234. X    if (*p++ == m)
  1235. X        return(1);
  1236. X    }
  1237. return(0);
  1238. X}
  1239. X    /* the following are only used in the lex library */
  1240. yyinput(){
  1241. X    return(input());
  1242. X    }
  1243. yyoutput(c)
  1244. X  int c; {
  1245. X    output(c);
  1246. X    }
  1247. yyunput(c)
  1248. X   int c; {
  1249. X    unput(c);
  1250. X    }
  1251. END_OF_FILE
  1252. if test 14981 -ne `wc -c <'Vplot_Kernel/filters/loclib/getpar_scan.c'`; then
  1253.     echo shar: \"'Vplot_Kernel/filters/loclib/getpar_scan.c'\" unpacked with wrong size!
  1254. fi
  1255. # end of 'Vplot_Kernel/filters/loclib/getpar_scan.c'
  1256. fi
  1257. if test -f 'Vplot_Kernel/filters/main_vplot.c' -a "${1}" != "-c" ; then 
  1258.   echo shar: Will not clobber existing file \"'Vplot_Kernel/filters/main_vplot.c'\"
  1259. else
  1260. echo shar: Extracting \"'Vplot_Kernel/filters/main_vplot.c'\" \(12441 characters\)
  1261. sed "s/^X//" >'Vplot_Kernel/filters/main_vplot.c' <<'END_OF_FILE'
  1262. X/*
  1263. X * Copyright 1987 the Board of Trustees of the Leland Stanford Junior
  1264. X * University. Official permission to use this software is included in
  1265. X * the documentation. It authorizes you to use this file for any
  1266. X * non-commercial purpose, provided that this copyright notice is not
  1267. X * removed and that any modifications made to this file are commented
  1268. X * and dated in the style of my example below.
  1269. X */
  1270. X
  1271. X/*
  1272. X *
  1273. X *  source file:   ./filters/main_vplot.c
  1274. X *
  1275. X * Joe Dellinger (SEP), June 11 1987
  1276. X *    Inserted this sample edit history entry.
  1277. X *    Please log any further modifications made to this file:
  1278. X */
  1279. X
  1280. X/*
  1281. X * generic pen -  VPLOT filter for whatever
  1282. X * Keyword: graphics vplot pen
  1283. X */
  1284. X
  1285. X/*
  1286. X *  Edit History
  1287. X *
  1288. X *  "Pen" written 1979 for a PDP-11, Rob Clayton
  1289. X *  Eventually modified into "tekpen" by Glenn Kroeger early 1984
  1290. X *  Made device independent and extensively modified into "screenpen"
  1291. X *  by Joe Dellinger 1984 through 1985
  1292. X *  Reworked to be more GKS-like by Glenn and Michel Debiche, 1985
  1293. X *  Cleaned up, Joe 1986
  1294. X *  Added 'wstype' variable so one program can support multiple
  1295. X *        terminal types        -- Chuck Karish, Nov 1986
  1296. X *  Raster capability added -- Joe and Steve Cole 1987
  1297. X *  Cleaned up and documented for public release, Joe Dellinger 1987
  1298. X *  Whew!
  1299. X *
  1300. X *  Changed system("stty ...") calls to ioctls.  The system() calls
  1301. X *  are hanging for jon under 6.0.  Added sigblock() to cleanup
  1302. X *  error handler to avoid exit() problems.  Also shut down output
  1303. X *  translations to tty graphics terminals.  Stewart A. Levin  6-23-87
  1304. X *
  1305. X *  Shut down output translations with LLITOUT now that I've gotten
  1306. X *  the magic incantation that makes it stick on buggy BSD systems.
  1307. X *  Stewart A. Levin  7-5-87
  1308. X *
  1309. X *  Made "scale" a global so dovplot could use it.
  1310. X *  Joe Dellinger Oct 18 1987
  1311. X *
  1312. X *  Gather up all the incoming plot files, and then have "genreader"
  1313. X *  process them all. This allows someone to make a vplot-editor that
  1314. X *  can re-order plot files, repeat them, etc, etc. Added "buffer_input"
  1315. X *  and "allow_pipe" as part of this.
  1316. X *  Joe Dellinger Dec 16 1987
  1317. X *
  1318. X *  Added "hclose_done" to SEPlib version.
  1319. X *  Joe Dellinger Dec 19 1987
  1320. X *
  1321. X *  Added "reset_parameters" to frontend and dovplot
  1322. X *  Joe Dellinger Jan 8 1988
  1323. X *
  1324. X *  Added group_name, group_number, pltname
  1325. X *  Joe Dellinger Jan 20 1988
  1326. X *
  1327. X *  Inverted window should mean that everything gets clipped.
  1328. X *  Make it possible to override standard defaults for SEP.
  1329. X *  Joe Dellinger Feb 12 1988
  1330. X *
  1331. X *  Just use getpar, not getpar_.
  1332. X *  Joe Dellinger Feb 16 1988
  1333. X *
  1334. X *  Split "frontend.c" into 3 files,
  1335. X *  main_vplot, init_vplot, and proc_vplot.
  1336. X *  This so that other programs can use vplot and still keep their own
  1337. X *  mains.
  1338. X *  Joe Dellinger Feb 18 1988
  1339. X */
  1340. X
  1341. X#ifdef SEP
  1342. extern void     sepwhere ();
  1343. extern char     sepoutwhere[];
  1344. extern char     sepheadwhere[];
  1345. X
  1346. X#define        OUT    sepoutwhere
  1347. X#define        HEAD    sepheadwhere
  1348. X#define        SOURCE  "\014Joe Dellinger, Stanford Exploration Project\014"
  1349. X#include    <sep.main>
  1350. X#define        GETPAR    fetch
  1351. X
  1352. X#else SEP
  1353. X#include    <stdio.h>
  1354. X#include    <math.h>
  1355. X#define        GETPAR    getpar
  1356. X#endif SEP
  1357. X
  1358. X
  1359. X#include    <sys/ioctl.h>
  1360. X#include    <sys/types.h>
  1361. X#include    <sys/stat.h>
  1362. X#include    <sgtty.h>
  1363. X#include    <ctype.h>
  1364. X#include    <strings.h>
  1365. X#include    <signal.h>
  1366. X
  1367. X#include    <vplot.h>
  1368. X
  1369. X#include    "./include/params.h"    /* for machine dependencies */
  1370. X#include    "./include/enum.h"
  1371. X#include    "./include/err.h"
  1372. X#include    "./include/attrcom.h"
  1373. X#include    "./include/intcom.h"
  1374. X#include    "./include/mesgcom.h"
  1375. X#include    "./include/erasecom.h"
  1376. X#include    "./include/closestat.h"
  1377. X#include    "./include/pat.h"
  1378. X#include    "./include/vertex.h"
  1379. X#include    "./include/round.h"
  1380. X#include    "./include/extern.h"
  1381. X
  1382. X
  1383. X/*
  1384. X * signal catching
  1385. X */
  1386. int             cleanup ();
  1387. int             sigvec ();
  1388. int             signum[] =
  1389. X{
  1390. X SIGHUP, SIGINT, SIGQUIT, SIGIOT, SIGEMT, SIGPIPE, SIGTERM, SIGXCPU, SIGXFSZ
  1391. X};
  1392. X#define NOSIG (sizeof (signum)/sizeof (int))    /* number of signals caught */
  1393. struct sigvec   errhandler =
  1394. X{
  1395. X cleanup, 0, 0
  1396. X};
  1397. struct sigvec   ignored =
  1398. X{
  1399. X SIG_IGN, 0, 0
  1400. X};
  1401. struct sigvec   oldvec;
  1402. X
  1403. extern struct sgttyb tty_clean_state;    /* external for utilities */
  1404. extern int      tty_clean_local_mode;
  1405. extern int      allow_pipe;
  1406. extern char     callname[];
  1407. extern int      nplots;
  1408. extern int      allowecho;
  1409. X
  1410. X/*
  1411. X * file and terminal control variables
  1412. X */
  1413. extern int      genmessage ();
  1414. extern int      (*message) ();
  1415. extern FILE    *pltout;
  1416. X
  1417. FILE           *fopen ();
  1418. FILE           *fdopen ();
  1419. X
  1420. extern FILE    *pltinarray[MAXIN];
  1421. extern char     pltinname[MAXIN][MAXFLEN + 1];
  1422. extern int      infileno;
  1423. extern int      pltoutfd;
  1424. X
  1425. X/*
  1426. X * This routine is responsible for finding the input files,
  1427. X * setting up the input and output, and calling init_vplot
  1428. X * and proc_vplot. You can link to vplot without using this
  1429. X * routine, and so have your own main. See vplothacker.doc to
  1430. X * learn how to do this. (Especially you, Jon!)
  1431. X */
  1432. X
  1433. X#ifdef SEP
  1434. int             xxargc;
  1435. char          **xxargv;
  1436. char            scrap[MAXFLEN + 1];
  1437. int             hclose_done = NO;
  1438. int             fake_header = NO;
  1439. MAIN ()
  1440. X
  1441. X#else SEP
  1442. int             xargc;
  1443. char          **xargv;    /* for getpar */
  1444. main (argc, argv)
  1445. X    int             argc;
  1446. X    char           *argv[];
  1447. X#endif SEP
  1448. X{
  1449. X#ifndef SEP
  1450. int             in_isatty, num_vplot, docflag;
  1451. char            instring[MAXFLEN + 1];
  1452. X#endif SEP
  1453. X
  1454. char           *cptr;
  1455. char           *stringptr;
  1456. int             ii;
  1457. FILE           *temp;
  1458. char            string[MAXFLEN + 1];
  1459. X
  1460. X
  1461. X    nulldev ();            /* Just to make sure it gets loaded */
  1462. X
  1463. X#ifndef SEP
  1464. X    if (stringptr = rindex (argv[0], '/'))
  1465. X    strncpy (callname, ++stringptr, 24);
  1466. X    else
  1467. X    strncpy (callname, argv[0], 24);
  1468. X#else SEP
  1469. X    if (stringptr = rindex (xargv[0], '/'))
  1470. X    strncpy (callname, ++stringptr, 24);
  1471. X    else
  1472. X    strncpy (callname, xargv[0], 24);
  1473. X#endif SEP
  1474. X
  1475. X#ifdef SEP
  1476. X    pltout = outstream;
  1477. X    if (redout ())
  1478. X    {
  1479. X    getch ("head", "s", scrap);
  1480. X    if (strcmp (scrap, "/dev/null") == 0 &&
  1481. X        strcmp (sepheadwhere, "/dev/null") == 0)
  1482. X    {
  1483. X        fake_header = YES;
  1484. X        getch ("out", "s", scrap);
  1485. X        if (strcmp (scrap, "stdout") != 0)
  1486. X        {
  1487. X        /*
  1488. X         * They probably want the header output into the redirected
  1489. X         * output. (SEP only) 
  1490. X         */
  1491. X        headstream = stdout;
  1492. X        headfd = fileno (headstream);
  1493. X        Puthead ("Fake header for special device-dependent data only.\n");
  1494. X        Puthead ("To get input history passed along, over-ride default with head = stdout\n");
  1495. X        /*
  1496. X         * If the output is going into a file, then put this
  1497. X         * information into the header file. 
  1498. X         */
  1499. X        if (strcmp (scrap, "/dev/tty") != 0)
  1500. X        {
  1501. X            fullnm (scrap, MAXFLEN + 1);
  1502. X            Puthead ("\tin=%s\n", scrap);
  1503. X        }
  1504. X        else
  1505. X        {
  1506. X            Puthead ("\tin= nowhere\n");
  1507. X            Puthead ("\t(Sorry, the data went to the terminal; it's gone now!)\n");
  1508. X        }
  1509. X
  1510. X        /*
  1511. X         * Have to use my own puthead routine. Standard ones such as
  1512. X         * putch, etc, don't work with this. They remember where the
  1513. X         * header used to be. Puthead does this, checking for
  1514. X         * headstream not null. This is so this will work without
  1515. X         * sep, as well. 
  1516. X         */
  1517. X        }
  1518. X    }
  1519. X    }
  1520. X
  1521. X    if (!fake_header)
  1522. X    {
  1523. X    Puthead ("\tn3 = unknown\n\t(Sorry, SEPlib requires the header be closed now)\n");
  1524. X    hclose ();
  1525. X    hclose_done = YES;
  1526. X    }
  1527. X#else SEP
  1528. X
  1529. X    /*
  1530. X     * If no arguments, and not in a pipeline, self document "wstype="
  1531. X     * doesn't count as an argument for our purposes 
  1532. X     */
  1533. X    in_isatty = isatty ((int) (fileno (stdin)));
  1534. X    xargc = argc;
  1535. X    xargv = argv;
  1536. X    docflag = 0;
  1537. X    if (argc == 1)
  1538. X    docflag = 1;
  1539. X    if ((argc == 2) && !strncmp ("wstype=", argv[1], 7))
  1540. X    docflag = 1;
  1541. X    getpar ("selfdoc", "1", &docflag);
  1542. X    if (in_isatty && docflag)
  1543. X    {
  1544. X    for (ii = 0; ii < doclength; ii++)
  1545. X        printf ("%s\n", documentation[ii]);
  1546. X    exit (0);
  1547. X    }
  1548. X
  1549. X    pltout = stdout;
  1550. X#endif SEP
  1551. X
  1552. X    /*
  1553. X     * This getpar for signal is only included for debugging purposes. By
  1554. X     * using a signal option, one can stop any signals from being caught. 
  1555. X     */
  1556. X    if (getpar ("signal", "s", string) == 0)
  1557. X    {
  1558. X    for (ii = 0; ii < NOSIG; ++ii)
  1559. X    {
  1560. X        if (-1 == sigvec (signum[ii], &ignored, &oldvec))
  1561. X        {
  1562. X        ERR (FATAL, name, "Bad sigvec call!");
  1563. X        }
  1564. X        if (oldvec.sv_handler == ignored.sv_handler)
  1565. X        (void) sigvec (signum[ii], &oldvec, (struct sigvec *) NULL);
  1566. X        else
  1567. X        (void) sigvec (signum[ii], &errhandler, (struct sigvec *) NULL);
  1568. X    }
  1569. X    }
  1570. X
  1571. X/*
  1572. X ****************************************************************************
  1573. X * Set all global variables, open the device.
  1574. X ****************************************************************************
  1575. X */
  1576. X    init_vplot ();
  1577. X
  1578. X/*
  1579. X ****************************************************************************
  1580. X * Start processing input files
  1581. X ****************************************************************************
  1582. X */
  1583. X
  1584. X#ifdef SEP
  1585. X    if (instream != NULL)
  1586. X    {
  1587. X    if (!allow_pipe && isapipe (fileno (instream)))
  1588. X    {
  1589. X        ERR (WARN, name, "cannot use pipes with this device");
  1590. X    }
  1591. X    else
  1592. X    {
  1593. X        if (infileno >= MAXIN)
  1594. X        {
  1595. X        ERR (FATAL, name, "too many input files (%d max)", MAXIN);
  1596. X        }
  1597. X        strcpy (pltinname[infileno], "Pipe");
  1598. X        pltinarray[infileno] = instream;
  1599. X        infileno++;
  1600. X    }
  1601. X    }
  1602. X    else
  1603. X    ERR (WARN, name, "cannot read input pipe");
  1604. X
  1605. X    xxargc = xargc;
  1606. X    xxargv = xargv;
  1607. X
  1608. X    for (xxargc--, xxargv++; xxargc; xxargc--, xxargv++)
  1609. X    {
  1610. X    cptr = *xxargv;
  1611. X    while (*cptr)
  1612. X    {
  1613. X        if (*cptr == '=')
  1614. X        break;
  1615. X        cptr++;
  1616. X    }
  1617. X    if (*cptr)
  1618. X        continue;
  1619. X    /* Ignore dummy arguments */
  1620. X    if (strcmp (*xxargv, "dummy") == 0)
  1621. X        continue;
  1622. X    if ((temp = fopen (*xxargv, "r")) == NULL)
  1623. X    {
  1624. X        ERR (WARN, name, "cannot open header file %s", *xxargv);
  1625. X        continue;
  1626. X    }
  1627. X    fclose (temp);
  1628. X    if (getch2 ("in", "s", string, *xxargv))
  1629. X    {
  1630. X        if ((temp = fopen (string, "r")) != NULL)
  1631. X        {
  1632. X        Puthead ("   +  %s --> in = %s\n", *xxargv, string);
  1633. X        if (infileno >= MAXIN)
  1634. X        {
  1635. X            ERR (FATAL, name, "too many input files (%d max)", MAXIN);
  1636. X        }
  1637. X        strcpy (pltinname[infileno], string);
  1638. X        pltinarray[infileno] = temp;
  1639. X        infileno++;
  1640. X        }
  1641. X        else
  1642. X        {
  1643. X        ERR (WARN, name, "cannot open input file %s", string);
  1644. X        }
  1645. X    }
  1646. X    }
  1647. X
  1648. X#else SEP
  1649. X    /*
  1650. X     * first process pipe input 
  1651. X     */
  1652. X    if (!in_isatty)
  1653. X    {
  1654. X    if (!allow_pipe)
  1655. X    {
  1656. X        ERR (WARN, name, "cannot use pipes with this device");
  1657. X    }
  1658. X    else
  1659. X    {
  1660. X        if (infileno >= MAXIN)
  1661. X        {
  1662. X        ERR (FATAL, name, "too many input files (%d max)", MAXIN);
  1663. X        }
  1664. X        strcpy (pltinname[infileno], "stdin");
  1665. X        pltinarray[infileno] = stdin;
  1666. X        infileno++;
  1667. X    }
  1668. X    }
  1669. X
  1670. X    /*
  1671. X     * next process in= inputfiles If they set num_vplot, also look for in1=
  1672. X     * in2= etc 
  1673. X     */
  1674. X
  1675. X    num_vplot = 0;
  1676. X    getpar ("numvplot", "d", &num_vplot);
  1677. X
  1678. X    for (ii = 0; ii <= num_vplot; ii++)
  1679. X    {
  1680. X    if (ii == 0)
  1681. X        strcpy (instring, "in");
  1682. X    else
  1683. X        sprintf (instring, "in%d", ii);
  1684. X
  1685. X    if (getpar (instring, "s", string))
  1686. X    {
  1687. X        if ((temp = fopen (string, "r")) != NULL)
  1688. X        {
  1689. X        if (infileno >= MAXIN)
  1690. X        {
  1691. X            ERR (FATAL, name, "too many input files (%d max)", MAXIN);
  1692. X        }
  1693. X        strcpy (pltinname[infileno], string);
  1694. X        pltinarray[infileno] = temp;
  1695. X        infileno++;
  1696. X        }
  1697. X        else
  1698. X        {
  1699. X        ERR (WARN, name, "cannot open %s", string);
  1700. X        }
  1701. X    }
  1702. X    }
  1703. X
  1704. X    /*
  1705. X     * finally process input line for non-getpar arguments and assume they
  1706. X     * are also input files 
  1707. X     */
  1708. X    for (argc--, argv++; argc; argc--, argv++)
  1709. X    {
  1710. X    cptr = *argv;
  1711. X    while (*cptr)
  1712. X    {
  1713. X        if (*cptr == '=')
  1714. X        break;
  1715. X        cptr++;
  1716. X    }
  1717. X    if (*cptr)
  1718. X        continue;
  1719. X    cptr = *argv;
  1720. X    if ((temp = fopen (cptr, "r")) != NULL)
  1721. X    {
  1722. X        if (infileno >= MAXIN)
  1723. X        {
  1724. X        ERR (FATAL, name, "too many input files (%d max)", MAXIN);
  1725. X        }
  1726. X        strcpy (pltinname[infileno], cptr);
  1727. X        pltinarray[infileno] = temp;
  1728. X        infileno++;
  1729. X    }
  1730. X    else
  1731. X    {
  1732. X        ERR (WARN, name, "cannot open %s", cptr);
  1733. X    }
  1734. X    }
  1735. X#endif SEP
  1736. X
  1737. X/*
  1738. X ****************************************************************************
  1739. X * Go do the plots
  1740. X ****************************************************************************
  1741. X */
  1742. X    proc_vplot ();
  1743. X
  1744. X#ifdef SEP
  1745. X    if (!hclose_done)
  1746. X    {
  1747. X    Puthead ("\tn3=%d\n", nplots);
  1748. X    hclose ();
  1749. X    hclose_done = YES;
  1750. X    }
  1751. X#endif SEP
  1752. X
  1753. X    exit (0);
  1754. X}
  1755. X
  1756. cleanup ()
  1757. X{
  1758. X    sigblock (~(SIGKILL | SIGSTOP | SIGCONT));
  1759. X    dev.close (CLOSE_INTERRUPT);
  1760. X    message (MESG_ON);
  1761. X    ERR (COMMENT, name, "Interrupted out.");
  1762. X    dev.close (CLOSE_DONE);
  1763. X    /*
  1764. X     * Let them see what they are doing again 
  1765. X     */
  1766. X    if (!allowecho)
  1767. X    {
  1768. X    ioctl (pltoutfd, TIOCLSET, (char *) (&tty_clean_local_mode));
  1769. X    ioctl (pltoutfd, TIOCSETN, (char *) (&tty_clean_state));
  1770. X    }
  1771. X    exit (0);
  1772. X}
  1773. END_OF_FILE
  1774. if test 12441 -ne `wc -c <'Vplot_Kernel/filters/main_vplot.c'`; then
  1775.     echo shar: \"'Vplot_Kernel/filters/main_vplot.c'\" unpacked with wrong size!
  1776. fi
  1777. # end of 'Vplot_Kernel/filters/main_vplot.c'
  1778. fi
  1779. echo shar: End of archive 16 \(of 24\).
  1780. cp /dev/null ark16isdone
  1781. MISSING=""
  1782. 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 ; do
  1783.     if test ! -f ark${I}isdone ; then
  1784.     MISSING="${MISSING} ${I}"
  1785.     fi
  1786. done
  1787. if test "${MISSING}" = "" ; then
  1788.     echo You have unpacked all 24 archives.
  1789.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1790. else
  1791.     echo You still need to unpack the following archives:
  1792.     echo "        " ${MISSING}
  1793. fi
  1794. ##  End of shell archive.
  1795. exit 0
  1796.