home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume9 / popi / part05 < prev    next >
Internet Message Format  |  1991-03-08  |  48KB

  1. From: richb@sunaus.sun.oz.AU (Rich Burridge)
  2. Newsgroups: comp.sources.misc
  3. Subject: v09i051: popi, The Digital Darkroom, Part05/09
  4. Message-ID: <2785@basser.oz>
  5. Date: 12 Dec 89 23:47:32 GMT
  6. Approved: john@cs.su.oz.AU (John Mackin - comp.sources.misc)
  7.  
  8. Posting-number: Volume 9, Issue 51
  9. Submitted-by: Rich Burridge <richb@sunaus.sun.oz.AU>
  10. Archive-name: popi/part05
  11.  
  12. ---- Cut Here and unpack ----
  13. #!/bin/sh
  14. # this is part 5 of a multipart archive
  15. # do not concatenate these parts, unpack them in order with /bin/sh
  16. # file special.c continued
  17. #
  18. CurArch=5
  19. if test ! -r s2_seq_.tmp
  20. then echo "Please unpack part 1 first!"
  21.      exit 1; fi
  22. ( read Scheck
  23.   if test "$Scheck" != $CurArch
  24.   then echo "Please unpack part $Scheck next!"
  25.        exit 1;
  26.   else exit 0; fi
  27. ) < s2_seq_.tmp || exit 1
  28. echo "x - Continuing file special.c"
  29. sed 's/^X//' << 'Funky_Stuff' >> special.c
  30. X    { "write",        writeimg },
  31. X    { "genps",        genps },
  32. X    { "genepson",    genepson },
  33. X    { "list",        list },
  34. X    { "display",    displayimg },
  35. X    { "debug",        debug },
  36. X    { "version",    version },
  37. X    { "verbose",    verbose },
  38. X    { "truncate",    trunc },
  39. X    { "undo",        undo },
  40. X    { "help",        help },
  41. X    { "free",        freeimg },
  42. X    { "logfile",    dolog },
  43. X    { (char *) 0,    (void (*) P((void)) ) 0 }
  44. X};
  45. X
  46. Xvoid
  47. Xspecial()
  48. X{
  49. X    struct SpecialOp    *sp;
  50. X
  51. X    DEBUG((Debug, "special\n"));
  52. X    lex();
  53. X    if (! (lat == NAME || isalpha(lat)))
  54. X    {
  55. X    SPRINTF(ErrBuf, "Expected name of special operation");
  56. X    error(ERR_PARSE);
  57. X    return;
  58. X    }
  59. X
  60. X    sp = SpecialOps;
  61. X    for (sp = SpecialOps; sp->name && strcmp(text, sp->name) != 0; ++sp)
  62. X        ;
  63. X
  64. X    if (! sp->name)
  65. X    {
  66. X    SPRINTF(ErrBuf,
  67. X        "Special operation '%s' unrecognised",
  68. X        text);
  69. X    error(ERR_PARSE);
  70. X    return;
  71. X    }
  72. X
  73. X    DEBUG((Debug, "calling func '%s'\n", sp->name));
  74. X    (*(sp->func))();
  75. X
  76. X    if (lat != '\n')
  77. X    lex();
  78. X
  79. X    if (lat != '\n')
  80. X    {
  81. X    SPRINTF(ErrBuf, "Tokens after special command ignored");
  82. X    error(ERR_WARN);
  83. X    }
  84. X
  85. X    assert(lat == '\n');
  86. X}
  87. Funky_Stuff
  88. echo "File special.c is complete"
  89. chmod 0444 special.c || echo "restore of special.c fails"
  90. set `wc -c special.c`;Sum=$1
  91. if test "$Sum" != "18870"
  92. then echo original size 18870, current size $Sum;fi
  93. echo "x - extracting graphics.c (Text)"
  94. sed 's/^X//' << 'Funky_Stuff' > graphics.c &&
  95. X
  96. X/*  @(#)graphics.c 1.10 89/12/11
  97. X *
  98. X *  Independent graphics routines associated with the popi program.
  99. X *
  100. X *  Popi was originally written by Gerard J. Holzmann - AT&T Bell Labs.
  101. X *  This version is based on the code in his Prentice Hall book,
  102. X *  "Beyond Photography - the digital darkroom," ISBN 0-13-074410-7,
  103. X *  which is copyright (c) 1988 by Bell Telephone Laboratories, Inc. 
  104. X *
  105. X *  Permission is given to distribute these extensions, as long as these
  106. X *  introductory messages are not removed, and no monies are exchanged.
  107. X *
  108. X *  No responsibility is taken for any errors or inaccuracies inherent
  109. X *  either to the comments or the code of this program, but if reported
  110. X *  (see README file) then an attempt will be made to fix them.
  111. X */
  112. X
  113. X#include "popi.h"
  114. X#include "graphics.h"
  115. X
  116. X#define  RES  8
  117. X
  118. Xchar nextline[MAXLINE] ;          /* Next input line to be parsed. */
  119. X
  120. Xunsigned char *mptr ;     /* Pointer to scanline data. */
  121. X
  122. Xint errpos = -1 ;         /* Character position error occured at. */
  123. Xint iscolor ;             /* Set if this is a color screen. */
  124. Xint ix = 0 ;              /* Initial X position of the icon. */
  125. Xint iy = 0 ;              /* Initial Y position of the icon. */
  126. Xint nfont_width ;         /* Width of normal font characters. */
  127. Xint ops[MAXOPS] ;         /* Rasterop functions. */
  128. Xint posspec = 0 ;         /* Set if -g option is present (for X11) */
  129. Xint started = 0 ;         /* Set if we've drawn the percent dialog box. */
  130. Xint tptr = 0 ;            /* Input buffer pointer. */
  131. Xint wx = 0 ;              /* Initial X position of the open window. */
  132. Xint wy = 0 ;              /* Initial Y position of the open window. */
  133. X
  134. Xint thresh[RES][RES] = {        /* Array containing threshold values. */
  135. X  {   0, 128,  32, 160,   8, 136,  40, 168, },
  136. X  { 192,  64, 224,  96, 200,  72, 232, 104, },
  137. X  {  48, 176,  16, 144,  56, 184,  24, 152, },
  138. X  { 240, 112, 208,  80, 248, 120, 216,  88, },
  139. X  {  12, 140,  44, 172,   4, 132,  36, 164, },
  140. X  { 204,  76, 236, 108, 196,  68, 228, 100, },
  141. X  {  60, 188,  28, 156,  52, 180,  20, 148, },
  142. X  { 252, 124, 220,  92, 244, 116, 212,  84, },
  143. X} ;
  144. X
  145. Xextern int  errno ;
  146. Xextern char *sys_errlist[] ;
  147. X
  148. X
  149. X/*  There are ten exportable routines used by the popi program.
  150. X *
  151. X *  These are:
  152. X *
  153. X *  disp_init(argc, argv)    - called from main at the start.
  154. X *  disp_finish()            - called from main prior to exit.
  155. X *  disp_imgstart()          - called prior to drawing an image.
  156. X *  disp_imgend()            - called after drawing an image.
  157. X *  disp_putline(line, y)    - to draw an image scanline.
  158. X *  disp_getchar()           - to get the next character typed.
  159. X *  disp_ungetc(c)           - put back the last character typed.
  160. X *  disp_prompt()            - display popi prompt and clear input buffer.
  161. X *  disp_error(errtype, pos) - display error message.
  162. X *  disp_percentdone(n)      - display percentage value of conversion.
  163. X */
  164. X
  165. X
  166. Xvoid
  167. Xdisp_init(argc, argv)        /* Called from main at the start. */
  168. Xint argc ;
  169. Xchar *argv[] ;
  170. X{
  171. X  if (init_ws_type())        /* Determine window system type. */
  172. X    {
  173. X      FPRINTF(stderr, "Error initialising window system.\n") ;
  174. X      exit(1) ;
  175. X    }
  176. X  init_fonts() ;             /* Open required fonts. */
  177. X  make_items(argc, argv) ;   /* Create icon, frame, canvas etc.. */
  178. X  paint_canvas() ;           /* Draw dialog boxes. */
  179. X  start_tool() ;
  180. X}
  181. X
  182. X
  183. Xvoid
  184. Xdisp_finish()                /* Called from main prior to exit. */
  185. X{
  186. X  cleanup() ;
  187. X}
  188. X
  189. X
  190. Xvoid
  191. Xdisp_imgstart()              /* Called prior to drawing an image. */
  192. X{
  193. X}
  194. X
  195. X
  196. Xvoid
  197. Xdisp_imgend()                /* Called after drawing an image. */
  198. X{
  199. X}
  200. X
  201. X
  202. Xvoid
  203. Xdisp_putline(line, y)        /* Draw an image scanline. */
  204. Xunsigned char *line ;
  205. Xint y ;
  206. X{
  207. X  draw_scanline(line, y) ;
  208. X}
  209. X
  210. X
  211. Xdisp_getchar()       /* Get next user typed character. */
  212. X{
  213. X  char c ;
  214. X  int finished = 0 ;
  215. X  if (tptr >= strlen(nextline))
  216. X    {
  217. X      while (!finished)
  218. X        {
  219. X          get_next_char(&c) ;              /* Get next character typed. */
  220. X          if (c == '\0') continue ;
  221. X          if (errpos != -1)
  222. X            {
  223. X              drawarea(BOXX+100+errpos*nfont_width, BOXY+BOXH-9,
  224. X                       nfont_width, 4, GCLR) ;
  225. X              drawarea(BOXX+91, BOXY+51, BOXW-102, BOXH-22, GCLR) ;
  226. X              errpos = -1 ;
  227. X            }
  228. X          if (c == BACKSPACE || c == DEL)
  229. X            nextline[strlen(nextline)-1] = '\0' ;
  230. X          else if (c == RETURN || c == LINEFEED)
  231. X            {
  232. X              set_cursor(BUSY_CUR) ;       /* We will now get busy! */
  233. X              c = '\n' ;
  234. X              STRNCAT(nextline, &c, 1) ;
  235. X              finished = 1 ;
  236. X            }
  237. X          else if (c >= 32) STRNCAT(nextline, &c, 1) ;
  238. X          drawarea(BOXX+91, BOXY+11, BOXW-102, BOXH-22, GCLR) ;
  239. X          put_text(BOXX, BOXY, BOXW, BOXH, nextline, 1) ;
  240. X        }
  241. X      tptr = 0 ;
  242. X    }    
  243. X  return(nextline[tptr++]) ;
  244. X}
  245. X
  246. X
  247. X/*ARGSUSED*/
  248. Xvoid
  249. Xdisp_ungetc(c)       /* Put back the last character typed. */
  250. Xchar c ;
  251. X{
  252. X  tptr-- ;
  253. X}
  254. X
  255. X
  256. Xdisp_prompt()        /* Display popi prompt and clear input line. */
  257. X{
  258. X  set_cursor(NORMAL_CUR) ;
  259. X  if (errpos == -1) drawarea(BOXX+91, BOXY+11, BOXW-102, BOXH-22, GCLR) ;
  260. X  STRCPY(nextline, "") ;
  261. X  tptr = 0 ;
  262. X  return 0 ;
  263. X}
  264. X
  265. X
  266. Xvoid
  267. Xdisp_error(errtype, pos)    /* Display error message. */
  268. Xint errtype ;
  269. Xint pos ;
  270. X{
  271. X  errpos = pos ;
  272. X  if (errtype & ERR_PARSE)
  273. X    drawarea(BOXX+100+errpos*nfont_width, BOXY+BOXH-9,
  274. X             nfont_width, 4, GSET) ;
  275. X
  276. X  put_text(BOXX, BOXY+40, BOXW, BOXH, ErrBuf, 0) ;
  277. X
  278. X/*  We assume errno hasn't been reset by the preceding output */
  279. X
  280. X  if (errtype & ERR_SYS)
  281. X    {
  282. X      sleep(2) ;
  283. X      SPRINTF(ErrBuf, "\t(%s)\n", sys_errlist[errno]) ;
  284. X      drawarea(BOXX+91, BOXY+51, BOXW-102, BOXH-22, GCLR) ;
  285. X      put_text(BOXX, BOXY+40, BOXW, BOXH, ErrBuf, 0) ;
  286. X    }
  287. X}
  288. X
  289. X/* These are other independent graphics routines used by popi. */
  290. X
  291. Xdraw_frame(x, y, width, height)
  292. Xint x, y, width, height ;
  293. X{
  294. X  drawarea(x,   y,   width,    height,    GSET) ;
  295. X  drawarea(x+1, y+1, width-2,  height-2,  GCLR) ;
  296. X  drawarea(x+3, y+3, width-6,  height-6,  GSET) ;
  297. X  drawarea(x+5, y+5, width-10, height-10, GCLR) ;
  298. X}
  299. X
  300. X
  301. X/*  Display a text box of given width and height with top left corner at
  302. X *  the given x,y location, displaying a title and the given text value.
  303. X */
  304. X
  305. Xdraw_textbox(x, y, w, h, title, str, showcur)
  306. Xint x, y, w, h, showcur ;
  307. Xchar *title, *str ;
  308. X{
  309. X  draw_frame(x, y, w, h) ;
  310. X  drawtext(x+10, y+h-15, BFONT, title) ;
  311. X  draw_rect(x+90, y+10, x+w-10, y+h-10) ;
  312. X  put_text(x, y, w, h, str, showcur) ;
  313. X}
  314. X
  315. X
  316. Xdraw_rect(x1, y1, x2, y2)
  317. Xint x1, y1, x2, y2 ;
  318. X{
  319. X  drawline(x1, y1, x2, y1) ;
  320. X  drawline(x1, y1, x1, y2) ;
  321. X  drawline(x2, y1, x2, y2) ;
  322. X  drawline(x1, y2, x2, y2) ;
  323. X}
  324. X
  325. X
  326. Xhalftone(line, y)                   /* Halftone 8bit scanline image. */
  327. Xunsigned char *line ;
  328. Xint y ;
  329. X{
  330. X  int x ;
  331. X
  332. X  for (x = 0; x < Xsize; x++)
  333. X    if (line[x] < thresh[y % RES][x % RES])
  334. X      mptr[x / 8] |= (1 << (7 - (x % 8))) ;        /* Set pixel black. */
  335. X    else mptr[x / 8] &= ~(1 << (7 - (x % 8))) ;    /* Set pixel white. */
  336. X}
  337. X
  338. X
  339. X/*  Paint the contents of the popi canvas. This consists of first clearing
  340. X *  the whole canvas, then drawing a line to distinguish between the image
  341. X *  drawing area and the command feedback area. Two text boxes are then
  342. X *  drawn, one for user input and the other to shown any error messages.
  343. X */
  344. X
  345. Xpaint_canvas()
  346. X{
  347. X  drawarea(0, 0, TWIDTH, THEIGHT, GCLR) ;
  348. X  drawline(0, 99, TWIDTH, 99) ;
  349. X  draw_textbox(BOXX, BOXY, BOXW, BOXH, "Command:", nextline, 1) ;
  350. X  draw_textbox(BOXX, BOXY+40, BOXW, BOXH, "Error:", "", 0) ;
  351. X}
  352. X
  353. X
  354. X/*  With the screen based window systems, display the character string
  355. X *  str at the given x,y location. The width of the dialog box is given,
  356. X *  so that if the text exceeds the displayable area, it is scrolled to
  357. X *  the left. A soft cursor in the form of a vertical line is shown if
  358. X *  so requested.
  359. X */
  360. X
  361. Xput_text(x, y, w, h, str, showcur)
  362. Xint x, y, w, h ;
  363. Xchar *str ;
  364. X{
  365. X  char dummy[MAXLINE] ;
  366. X  int limit, nochars ;
  367. X
  368. X  limit = ((w - 100) / nfont_width) - 1 ;
  369. X  nochars = (strlen(str) <= limit) ? strlen(str) : limit ;
  370. X  STRNCPY(dummy, &str[strlen(str) - nochars], nochars) ;
  371. X
  372. X  dummy[nochars] = '\0' ;
  373. X  drawtext(x+100, y+h-17, NFONT, dummy) ;
  374. X  if (showcur)
  375. X    drawline(x+100+strlen(dummy)*nfont_width, y+15,
  376. X             x+100+strlen(dummy)*nfont_width, y+h-15) ;
  377. X}
  378. X
  379. X
  380. X/*  Show the percentage of the image converted as a graphical slider using
  381. X *  the error dialog box. If the percentage is zero, then we are just starting,
  382. X *  so the box is relabeled (to % done:). If the percentage is 100, then we
  383. X *  are just finishing, and the box is relabel back (to Error:), and cleared.
  384. X *  Otherwise we show an intermediate percentage value.
  385. X */
  386. X
  387. Xvoid
  388. Xdisp_percentdone(percent)
  389. Xint percent ;
  390. X{
  391. X  if (!percent)
  392. X    {
  393. X      if (!started)
  394. X        draw_textbox(BOXX, BOXY+40, BOXW, BOXH, "% done:", "", 0) ;
  395. X      started = 1 ;
  396. X    }
  397. X  else if (percent == 100)
  398. X    {
  399. X      if (started)
  400. X        draw_textbox(BOXX, BOXY+40, BOXW, BOXH, "Error:", "", 0) ;
  401. X      started = 0 ;
  402. X    }
  403. X  else
  404. X    drawarea(BOXX+91, BOXY+51,
  405. X             (int) ((double) (BOXW-102) / 100 * percent), BOXH-20, GSET) ;
  406. X}
  407. Funky_Stuff
  408. chmod 0444 graphics.c || echo "restore of graphics.c fails"
  409. set `wc -c graphics.c`;Sum=$1
  410. if test "$Sum" != "9099"
  411. then echo original size 9099, current size $Sum;fi
  412. echo "x - extracting lex.c (Text)"
  413. sed 's/^X//' << 'Funky_Stuff' > lex.c &&
  414. X/*  @(#)lex.c 1.9 89/12/11
  415. X *
  416. X *  Lexical routines used by the popi program.
  417. X *
  418. X *  Popi was originally written by Gerard J. Holzmann - AT&T Bell Labs.
  419. X *  This version is based on the code in his Prentice Hall book,
  420. X *  "Beyond Photography - the digital darkroom," ISBN 0-13-074410-7,
  421. X *  which is copyright (c) 1988 by Bell Telephone Laboratories, Inc. 
  422. X *
  423. X *  Permission is given to distribute these extensions, as long as these
  424. X *  introductory messages are not removed, and no monies are exchanged.
  425. X *
  426. X *  No responsibility is taken for any errors or inaccuracies inherent
  427. X *  either to the comments or the code of this program, but if reported
  428. X *  (see README file) then an attempt will be made to fix them.
  429. X */
  430. X
  431. X#include <stdio.h>
  432. X#include <ctype.h>
  433. X#include <math.h>
  434. X#include "popi.h"
  435. X
  436. X/* prototypes for local functions */
  437. Xint    Getch P((void));
  438. Xint    getnumber P((int));
  439. Xint    getstring P((int));
  440. Xint    follow P((int, int, int));
  441. X
  442. Xint    CharPos = 0,    /* Current character pos on input line */
  443. X    OldPos = 0,    /* previous character pos on input line */
  444. X    TokPos = 0;    /* position of the beginning of the current token */
  445. Xchar    ErrBuf[256];
  446. Xdouble    lexfract;
  447. Xdouble    hypot();
  448. X
  449. Xstatic int
  450. XGetch()
  451. X{
  452. X    int    c;
  453. X
  454. X    c = disp_getchar();
  455. X
  456. X    OldPos = CharPos;
  457. X
  458. X    if (c == '\t')
  459. X    CharPos = (CharPos - 1) % 8 + 8;
  460. X    else if (c == '\n')
  461. X    CharPos = 0;
  462. X    else
  463. X    ++CharPos;
  464. X
  465. X    DEBUG((Debug, "Getch() => '%c'\n", c));
  466. X
  467. X    if (LogStr)
  468. X    PUTC(c, LogStr);
  469. X
  470. X    return c;
  471. X}
  472. X
  473. X/* Skip to the end of the line */
  474. Xvoid
  475. XSkip()
  476. X{
  477. X    while (lat != '\n' && lat != EOF)
  478. X    lat = Getch();
  479. X    lat = '\n';
  480. X}
  481. X
  482. Xvoid
  483. Xerror(errtype)
  484. Xint    errtype;
  485. X{
  486. X    DEBUG((Debug, "error: type %d, pos %d msg '%s'\n", errtype, TokPos, ErrBuf));
  487. X    if (!noerr)            /* Already printed a message */
  488. X    return;
  489. X    disp_error(errtype, TokPos);
  490. X    Skip();
  491. X    noerr = FALSE;        /* an error has occurred */
  492. X
  493. X    if (LogStr)
  494. X    FPRINTF(LogStr, "Error: %s\n", ErrBuf);
  495. X}
  496. X
  497. Xstatic int
  498. Xgetnumber(first)
  499. Xint first;
  500. X{
  501. X    int c;
  502. X
  503. X    lexval = first - '0';
  504. X    lexfract = 0.0;
  505. X    while (isdigit(c = Getch()))
  506. X    lexval = 10 * lexval + c - '0';
  507. X
  508. X    /* Some of the special routines use floating values */
  509. X    if (c == '.')
  510. X    {
  511. X    double div = 10.0;
  512. X
  513. X    while (isdigit(c = Getch()))
  514. X    {
  515. X        lexfract += (c - '0') / div;
  516. X        div *= 10.0;
  517. X    }
  518. X    }
  519. X    pushback(c);
  520. X    return VALUE;
  521. X}
  522. X
  523. Xstatic int
  524. Xgetstring(first)
  525. Xint first;
  526. X{
  527. X    int        c = first;
  528. X    char    *str = text;
  529. X
  530. X    do
  531. X    {
  532. X        *str++ = (char) c;
  533. X        c = Getch();
  534. X    }
  535. X    while (isalpha(c) || c == '_' || isdigit(c));
  536. X    *str = '\0';
  537. X    pushback(c);
  538. X
  539. X    if (strcmp(text, "new") == 0)        return NEW;
  540. X    else if (strcmp(text, "sin") == 0)        return SIN;
  541. X    else if (strcmp(text, "cos") == 0)        return COS;
  542. X    else if (strcmp(text, "atan") == 0)        return ATAN;
  543. X    else if (strcmp(text, "hypot") == 0)    return HYPOT;
  544. X    else if (strcmp(text, "abs") == 0)        return ABS;
  545. X    else if (strcmp(text, "log") == 0)        return LOG;
  546. X    else if (strcmp(text, "sqrt") == 0)        return SQRT;
  547. X    else if (strcmp(text, "rand") == 0)        return RAND;
  548. X
  549. X    for (c = 0; c < nsrc; c++)
  550. X    if (src[c].str && strcmp(src[c].str, text) == 0)
  551. X    {
  552. X        lexval = c - 1;
  553. X        return INAME;
  554. X    }
  555. X
  556. X    if (strlen(text) > 1)
  557. X    return NAME;
  558. X    return first;
  559. X}
  560. X
  561. Xstatic int
  562. Xfollow(tok, ifyes, ifno)
  563. Xint tok, ifyes, ifno;
  564. X{
  565. X    int c;
  566. X
  567. X    if ((c = Getch()) == tok)
  568. X    return ifyes;
  569. X    pushback(c);
  570. X    return ifno;
  571. X}
  572. X
  573. X/*
  574. X *    Set the global lookahead token "lat".
  575. X */
  576. Xvoid
  577. Xlex()
  578. X{
  579. X    DEBUG((Debug, "lex():\n"));
  580. X
  581. X    do        /* ignore white space */
  582. X    lat = Getch();
  583. X    while (lat == ' ' || lat == '\t');
  584. X
  585. X    TokPos = CharPos;
  586. X
  587. X    if (isdigit(lat))
  588. X    lat = getnumber(lat);
  589. X    else if (isalpha(lat) || lat == '_')
  590. X    lat = getstring(lat);
  591. X
  592. X    switch (lat)
  593. X    {
  594. X    case EOF:
  595. X        lat = 'q';
  596. X        break;
  597. X
  598. X    case '*':
  599. X        lat = follow('*', POW, lat);
  600. X        break;
  601. X
  602. X        case '>':
  603. X        lat = follow('=', GE, lat);
  604. X            lat = follow('>', RSHIFT, lat);
  605. X            break;
  606. X
  607. X        case '<':
  608. X        lat = follow('=', LE, lat);
  609. X            lat = follow('<', LSHIFT, lat);
  610. X            break;
  611. X
  612. X        case '!':
  613. X            lat = follow('=', NE, lat);
  614. X            break;
  615. X
  616. X        case '=':
  617. X        lat = follow('=', EQ, lat);
  618. X            break;
  619. X
  620. X        case '|':
  621. X        lat = follow('|', OR, lat);
  622. X            break;
  623. X
  624. X        case '&':
  625. X        lat = follow('&', AND, lat);
  626. X            break;
  627. X
  628. X        case 'Z':
  629. X        lat = VALUE;
  630. X            lexval = Zmax;
  631. X            break;
  632. X
  633. X        case 'Y':
  634. X        lat = VALUE;
  635. X            lexval = Ysize - 1;
  636. X            break;
  637. X
  638. X        case 'X':
  639. X        lat = VALUE;
  640. X            lexval = Xsize - 1;
  641. X            break;
  642. X
  643. X        case 'R':
  644. X        lat = VALUE;
  645. X            lexval = (int) hypot(Xsize / 2.0, Ysize / 2.0);
  646. X            break;
  647. X
  648. X        case 'A':
  649. X        lat = VALUE;
  650. X            lexval = 360;
  651. X            break;
  652. X
  653. X    case '"':
  654. X        {
  655. X        char    *str;
  656. X            
  657. X        str = text;
  658. X        while ((lat = Getch()) != EOF && lat != '\n' && lat != '"')
  659. X            *str++ = (char) lat;
  660. X        *str = '\0';
  661. X        if (lat != '"')
  662. X        {
  663. X            SPRINTF(ErrBuf, "Expected matching '\"'");
  664. X            error(ERR_PARSE);
  665. X            return;
  666. X        }
  667. X        }
  668. X        lat = FNAME;
  669. X        break;
  670. X
  671. X    case ';':    /* comment to end of line */
  672. X        Skip();
  673. X        lat = '\n';
  674. X        break;
  675. X
  676. X        default:
  677. X        break;
  678. X    }
  679. X
  680. X    if (Debug)
  681. X    {
  682. X    if (lat < 127 && isprint(lat))
  683. X        DEBUG((Debug, "lex() => '%c' (%d)\n", lat, lat));
  684. X    else
  685. X        DEBUG((Debug, "lex() => (%d)\n", lat));
  686. X    }
  687. X}
  688. X
  689. Xvoid
  690. Xpushback(c)
  691. Xint c;
  692. X{
  693. X    DEBUG((Debug, "pushback('%c')\n", c));
  694. X    disp_ungetc(c);
  695. X    CharPos = OldPos;
  696. X}
  697. Funky_Stuff
  698. chmod 0444 lex.c || echo "restore of lex.c fails"
  699. set `wc -c lex.c`;Sum=$1
  700. if test "$Sum" != "5493"
  701. then echo original size 5493, current size $Sum;fi
  702. echo "x - extracting sunview.c (Text)"
  703. sed 's/^X//' << 'Funky_Stuff' > sunview.c &&
  704. X/*LINTLIBRARY*/
  705. X
  706. X/*  @(#)sunview.c 1.10 89/12/11
  707. X *
  708. X *  SunView dependent graphics routines used by popi.
  709. X *  written by Rich Burridge - Sun Microsystems.
  710. X *
  711. X *  Popi was originally written by Gerard J. Holzmann - AT&T Bell Labs.
  712. X *  This version is based on the code in his Prentice Hall book,
  713. X *  "Beyond Photography - the digital darkroom," ISBN 0-13-074410-7,
  714. X *  which is copyright (c) 1988 by Bell Telephone Laboratories, Inc. 
  715. X *
  716. X *  Permission is given to distribute these extensions, as long as these
  717. X *  introductory messages are not removed, and no monies are exchanged.
  718. X *
  719. X *  No responsibility is taken for any errors or inaccuracies inherent
  720. X *  either to the comments or the code of this program, but if reported
  721. X *  (see README file) then an attempt will be made to fix them.
  722. X */
  723. X
  724. X#include "popi.h"
  725. X#include "graphics.h"
  726. X#include <suntool/sunview.h>
  727. X#include <suntool/canvas.h>
  728. X
  729. X#define  ICON_SET                       (void) icon_set
  730. X#define  NOTIFY_DISPATCH                (void) notify_dispatch
  731. X#define  NOTIFY_DO_DISPATCH             (void) notify_do_dispatch
  732. X#define  NOTIFY_INTERPOSE_DESTROY_FUNC  (void) notify_interpose_destroy_func
  733. X#define  PR_GETCOLORMAP                 (void) pr_getcolormap
  734. X#define  PW_PUTCOLORMAP                 (void) pw_putcolormap
  735. X#define  PW_ROP                         (void) pw_rop
  736. X#define  PW_SETCMSNAME                  (void) pw_setcmsname
  737. X#define  PW_TEXT                        (void) pw_text
  738. X#define  PW_VECTOR                      (void) pw_vector
  739. X#define  PW_WRITEBACKGROUND             (void) pw_writebackground
  740. X#define  WINDOW_DONE                    (void) window_done
  741. X#define  WINDOW_SET                     (void) window_set
  742. X
  743. X#define  BOLD_FONT      "/usr/lib/fonts/fixedwidthfonts/screen.b.14"
  744. X#define  NORMAL_FONT    "/usr/lib/fonts/fixedwidthfonts/screen.r.14"
  745. X
  746. XCanvas canvas ;
  747. XCursor busy_cursor, main_cursor ;
  748. XEvent event ;
  749. XFrame frame ;
  750. XIcon popi_icon ;
  751. XNotify_value destroy_proc() ;
  752. XPixfont *font, *nfont, *bfont ;
  753. XPixrect *pr ;                       /* Offscreen image area. */
  754. XPixwin *cpw ;
  755. X
  756. Xshort busy_cursor_array[] = {
  757. X#include <images/hglass.cursor>
  758. X} ;
  759. Xmpr_static(busy_cursor_pr, 16, 16, 1, busy_cursor_array) ;
  760. X
  761. Xunsigned short icon_image[] = {
  762. X#include "popi.icon"
  763. X} ;
  764. Xmpr_static(icon_pr, 64, 64, 1, icon_image) ;
  765. X
  766. Xint blocking ;       /* Set if in event blocking mode. */
  767. Xint gotevent ;       /* Set if we have an event to handle. */
  768. Xint nonblocking ;    /* Set if in event non-blocking mode. */
  769. Xint oktoshow ;       /* Set just before window is displayed. */
  770. X
  771. X
  772. X/*ARGSUSED*/
  773. Xvoid
  774. Xcanvas_proc(canvas, e)
  775. XCanvas canvas ;
  776. XEvent *e ;
  777. X{
  778. X  if (!oktoshow) return ;
  779. X  event = *e ;
  780. X  gotevent = 1 ;
  781. X  if (blocking) notify_stop() ;
  782. X}
  783. X
  784. X
  785. Xcleanup()            /* Null routine for the SunView version. */
  786. X{
  787. X}
  788. X
  789. X
  790. X/*ARGSUSED*/
  791. XNotify_value
  792. Xdestroy_proc(client, status)
  793. XNotify_client client ;
  794. XDestroy_status status ;
  795. X{
  796. X  exit(0) ;
  797. X}
  798. X
  799. X
  800. Xdraw_scanline(line, y)       /* Display image scanline on the screen. */
  801. Xunsigned char *line ;
  802. Xint y ;
  803. X{
  804. X  int i ;
  805. X
  806. X  mptr = (unsigned char *) ((struct mpr_data *) pr->pr_data)->md_image ;
  807. X  if (iscolor)
  808. X    for (i = 0; i < Xsize; i++) mptr[i] = 255 - line[i] ;
  809. X  else halftone(line, y) ;
  810. X  PW_ROP(cpw, 0, y+100, Xsize, 1, PIX_SRC, pr, 0, 0) ;
  811. X}
  812. X
  813. X
  814. Xdrawarea(x, y, width, height, op)
  815. Xint x, y, width, height ;
  816. Xenum op_type op ;
  817. X{
  818. X  PW_WRITEBACKGROUND(cpw, x, y, width, height, ops[(int) op]) ;
  819. X}
  820. X
  821. X
  822. Xdrawline(x1, y1, x2, y2)
  823. Xint x1, y1, x2, y2 ;
  824. X{
  825. X  PW_VECTOR(cpw, x1, y1, x2, y2, PIX_SET, 0) ;
  826. X}
  827. X
  828. X
  829. Xdrawtext(x, y, fontno, str)
  830. Xenum font_type fontno ;
  831. Xint x, y ;
  832. Xchar *str ;
  833. X{
  834. X  if (fontno == NFONT) font = nfont ;
  835. X  else if (fontno == BFONT) font = bfont ;
  836. X  PW_TEXT(cpw, x, y, PIX_SRC, font, str) ;
  837. X}
  838. X
  839. X
  840. XPixfont *
  841. Xget_font(name)
  842. Xchar *name ;
  843. X{
  844. X  Pixfont *font ;
  845. X
  846. X  font = pf_open(name) ;
  847. X  if (font == NULL) font = pf_default() ;
  848. X  if (font == NULL)
  849. X    {
  850. X      perror("couldn't get the default font.") ;
  851. X      exit(1) ;
  852. X    }
  853. X  return font ;
  854. X}
  855. X
  856. X
  857. Xget_event()       /* Get the next SunView event. */
  858. X{
  859. X  if (!gotevent) notify_start() ;  /* This blocks until notify_stop. */
  860. X  gotevent = 0 ;
  861. X}
  862. X
  863. X
  864. Xget_next_char(c)      /* Process events, and return when character typed. */
  865. Xchar *c ;
  866. X{
  867. X  for (;;)
  868. X    {
  869. X      get_event() ;
  870. X      if (event_is_ascii(&event))            /* Keyboard character? */
  871. X        {
  872. X          *c = event_id(&event) ;
  873. X          return ;
  874. X        }
  875. X      else window_default_event_proc(canvas, &event, (char *) 0) ;
  876. X    }
  877. X}
  878. X
  879. X
  880. Xinit_fonts()
  881. X{
  882. X  bfont = get_font(BOLD_FONT) ;
  883. X  nfont = get_font(NORMAL_FONT) ;
  884. X  nfont_width = nfont->pf_defaultsize.x ;
  885. X}
  886. X
  887. X
  888. Xinit_ws_type()
  889. X{
  890. X  if (getenv("WINDOW_PARENT") == NULL)
  891. X    {
  892. X      FPRINTF(stderr,"%s: Not a native SunView window\n", ProgName) ;
  893. X      return -1 ;
  894. X    }
  895. X  ops[(int) GCLR] = PIX_CLR ;
  896. X  ops[(int) GSET] = PIX_SET ;
  897. X  oktoshow = 0 ;        /* Kludge to correctly handle repaints. */
  898. X  blocking = 1 ;
  899. X  return 0 ;
  900. X}
  901. X
  902. X
  903. Xload_colors()    /* Create and load popi color map. */
  904. X{
  905. X  int i ;
  906. X  char cmsname[MAXLINE] ;
  907. X  u_char red[CMAPLEN], green[CMAPLEN], blue[CMAPLEN] ;
  908. X
  909. X  iscolor = (cpw->pw_pixrect->pr_depth == 8) ? 1 : 0 ;
  910. X
  911. X  if (iscolor)
  912. X    {
  913. X      for (i = 0; i < CMAPLEN; i++)
  914. X        red[i] = green[i] = blue[i] = 255 - i ;
  915. X
  916. X      SPRINTF(cmsname, "popi%10ld", getpid()) ;
  917. X      PW_SETCMSNAME(cpw, cmsname) ;
  918. X      PW_PUTCOLORMAP(cpw, 0, CMAPLEN, red, green, blue) ;
  919. X
  920. X      pr = mem_create(Xsize, 1, 8) ;
  921. X    }
  922. X  else pr = mem_create(Xsize, 1, 1) ;
  923. X}
  924. X
  925. X
  926. Xmake_items(argc, argv)       /* Create icon, frame, canvas etc.. */
  927. Xint argc ;
  928. Xchar *argv[] ;
  929. X{
  930. X  popi_icon = icon_create(ICON_IMAGE, &icon_pr, 0) ;
  931. X  frame = window_create((Window) 0, FRAME,
  932. X                        FRAME_ICON,       popi_icon,
  933. X                        FRAME_SHOW_LABEL, FALSE,
  934. X                        FRAME_NO_CONFIRM, TRUE,
  935. X                        FRAME_ARGS,       argc, argv,
  936. X                        0) ;
  937. X  canvas = window_create(frame, CANVAS,
  938. X                         WIN_WIDTH,      TWIDTH,
  939. X                         WIN_HEIGHT,     THEIGHT,
  940. X                         WIN_EVENT_PROC, canvas_proc,
  941. X                         0) ;
  942. X  WINDOW_SET(canvas, WIN_CONSUME_KBD_EVENTS, WIN_ASCII_EVENTS,
  943. X                     WIN_LEFT_KEYS, WIN_TOP_KEYS, WIN_RIGHT_KEYS,
  944. X                     WIN_UP_EVENTS, 0, 0) ;
  945. X  WINDOW_SET(canvas, WIN_IGNORE_PICK_EVENT, LOC_MOVE, 0) ;
  946. X  cpw = canvas_pixwin(canvas) ;
  947. X
  948. X  main_cursor = window_get(canvas, WIN_CURSOR) ;
  949. X  busy_cursor = cursor_create(CURSOR_IMAGE, &busy_cursor_pr, 0) ;
  950. X  load_colors() ;            /* Load the popi grayscale colormap. */
  951. X}
  952. X
  953. X
  954. Xset_cursor(type)
  955. Xenum cur_type type ;
  956. X{
  957. X  switch (type)
  958. X    {
  959. X      case BUSY_CUR   : WINDOW_SET(canvas, WIN_CURSOR, busy_cursor, 0) ;
  960. X                        break ;
  961. X      case NORMAL_CUR : WINDOW_SET(canvas, WIN_CURSOR, main_cursor, 0) ;
  962. X    }
  963. X}
  964. X
  965. X
  966. Xstart_tool()
  967. X{
  968. X  window_fit(frame) ;
  969. X  NOTIFY_INTERPOSE_DESTROY_FUNC(frame, destroy_proc) ;
  970. X  oktoshow = 1 ;
  971. X  WINDOW_SET(frame, WIN_SHOW, TRUE, 0) ;
  972. X  NOTIFY_DISPATCH() ;      /* Make the window appear. */
  973. X  NOTIFY_DO_DISPATCH() ;
  974. X}
  975. Funky_Stuff
  976. chmod 0444 sunview.c || echo "restore of sunview.c fails"
  977. set `wc -c sunview.c`;Sum=$1
  978. if test "$Sum" != "7006"
  979. then echo original size 7006, current size $Sum;fi
  980. echo "x - extracting x11.c (Text)"
  981. sed 's/^X//' << 'Funky_Stuff' > x11.c &&
  982. X/*LINTLIBRARY*/
  983. X
  984. X/*  @(#)x11.c 1.9 89/12/11
  985. X *
  986. X *  X11 dependent graphics routines used by popi.
  987. X *  written by Rich Burridge - Sun Microsystems.
  988. X *
  989. X *  Popi was originally written by Gerard J. Holzmann - AT&T Bell Labs.
  990. X *  This version is based on the code in his Prentice Hall book,
  991. X *  "Beyond Photography - the digital darkroom," ISBN 0-13-074410-7,
  992. X *  which is copyright (c) 1988 by Bell Telephone Laboratories, Inc. 
  993. X *
  994. X *  Permission is given to distribute these extensions, as long as these
  995. X *  introductory messages are not removed, and no monies are exchanged.
  996. X *
  997. X *  No responsibility is taken for any errors or inaccuracies inherent
  998. X *  either to the comments or the code of this program, but if reported
  999. X *  (see README file) then an attempt will be made to fix them.
  1000. X */
  1001. X
  1002. X#include "popi.h"
  1003. X#include "graphics.h"
  1004. X#include <X11/Xlib.h>
  1005. X#include <X11/Xutil.h>
  1006. X#include <X11/cursorfont.h>
  1007. X#include <X11/keysym.h>
  1008. X
  1009. X#define  BOLD_FONT    "helvetica-bold-14"
  1010. X#define  DEFFONT      "fixed"
  1011. X#define  NORMAL_FONT  "8x13"
  1012. X
  1013. X#define  POPI_BORDER_WIDTH  2
  1014. X
  1015. X#define  FRAME_MASK  (KeyPressMask | KeyReleaseMask | ExposureMask)
  1016. X
  1017. Xshort icon_image[] = {
  1018. X#include "popi.icon"
  1019. X} ;
  1020. X
  1021. XAtom protocol_atom, kill_atom ;
  1022. XCursor busy_cursor, main_cursor ;
  1023. XDisplay *dpy ;
  1024. XGC gc, pix_gc ;
  1025. XPixmap mpr, popi_icon, load_icon() ;
  1026. XVisual *visual ;
  1027. XWindow frame, frame_icon ;
  1028. XXColor current_col ;
  1029. XXEvent event ;
  1030. XXFontStruct *bfont, *font, *nfont ;
  1031. XXGCValues gc_val ;
  1032. XXSetWindowAttributes attributes ;
  1033. XXSizeHints size ;
  1034. XXVisualInfo vinfo ;
  1035. XXWMHints wm_hints ;
  1036. X
  1037. Xunsigned long gc_mask ;
  1038. Xint screen ;
  1039. Xunsigned int scr_depth ;
  1040. Xunsigned long backgnd, foregnd ;
  1041. Xunsigned long palette[CMAPLEN] ;
  1042. X
  1043. X/*  256-byte table for quickly reversing the bits in an unsigned 8-bit char,
  1044. X *  used to convert between MSBFirst and LSBFirst image formats.
  1045. X */
  1046. X
  1047. Xchar revtable[256] = {
  1048. X        0, -128,   64,  -64,   32,  -96,   96,  -32,
  1049. X       16, -112,   80,  -48,   48,  -80,  112,  -16,
  1050. X        8, -120,   72,  -56,   40,  -88,  104,  -24,
  1051. X       24, -104,   88,  -40,   56,  -72,  120,   -8,
  1052. X        4, -124,   68,  -60,   36,  -92,  100,  -28,
  1053. X       20, -108,   84,  -44,   52,  -76,  116,  -12,
  1054. X       12, -116,   76,  -52,   44,  -84,  108,  -20,
  1055. X       28, -100,   92,  -36,   60,  -68,  124,   -4,
  1056. X        2, -126,   66,  -62,   34,  -94,   98,  -30,
  1057. X       18, -110,   82,  -46,   50,  -78,  114,  -14,
  1058. X       10, -118,   74,  -54,   42,  -86,  106,  -22,
  1059. X       26, -102,   90,  -38,   58,  -70,  122,   -6,
  1060. X        6, -122,   70,  -58,   38,  -90,  102,  -26,
  1061. X       22, -106,   86,  -42,   54,  -74,  118,  -10,
  1062. X       14, -114,   78,  -50,   46,  -82,  110,  -18,
  1063. X       30,  -98,   94,  -34,   62,  -66,  126,   -2,
  1064. X        1, -127,   65,  -63,   33,  -95,   97,  -31,
  1065. X       17, -111,   81,  -47,   49,  -79,  113,  -15,
  1066. X        9, -119,   73,  -55,   41,  -87,  105,  -23,
  1067. X       25, -103,   89,  -39,   57,  -71,  121,   -7,
  1068. X        5, -123,   69,  -59,   37,  -91,  101,  -27,
  1069. X       21, -107,   85,  -43,   53,  -75,  117,  -11,
  1070. X       13, -115,   77,  -51,   45,  -83,  109,  -19,
  1071. X       29,  -99,   93,  -35,   61,  -67,  125,   -3,
  1072. X        3, -125,   67,  -61,   35,  -93,   99,  -29,
  1073. X       19, -109,   83,  -45,   51,  -77,  115,  -13,
  1074. X       11, -117,   75,  -53,   43,  -85,  107,  -21,
  1075. X       27, -101,   91,  -37,   59,  -69,  123,   -5,
  1076. X        7, -121,   71,  -57,   39,  -89,  103,  -25,
  1077. X       23, -105,   87,  -41,   55,  -73,  119,   -9,
  1078. X       15, -113,   79,  -49,   47,  -81,  111,  -17,
  1079. X       31,  -97,   95,  -33,   63,  -65,  127,   -1,
  1080. X} ;
  1081. X
  1082. Xcleanup()                   /* Null routine for the X11 version. */
  1083. X{
  1084. X}
  1085. X
  1086. X
  1087. X/*  This routine needs to be dramatically improved. It should be possible
  1088. X *  to avoid copying the data to a separate buffer and creating a pixmap,
  1089. X *  and send it direct to the popi frame.
  1090. X */
  1091. X
  1092. Xdraw_scanline(line, y)      /* Display image scanline on the screen. */
  1093. Xunsigned char *line ;
  1094. Xint y ;
  1095. X{
  1096. X  XImage *image ;
  1097. X  int i ;
  1098. X
  1099. X  if (iscolor)
  1100. X    {
  1101. X      mptr = (unsigned char *) Emalloc(Xsize) ;
  1102. X      for (i = 0; i < Xsize; i++) mptr[i] = palette[255 - line[i]] ;
  1103. X      image = XCreateImage(dpy, DefaultVisual(dpy, screen),
  1104. X                           scr_depth, ZPixmap, 0, mptr, Xsize, 1, 8, Xsize) ;
  1105. X      mpr = XCreatePixmap(dpy, RootWindow(dpy, screen),
  1106. X                          (unsigned) image->width,
  1107. X                          (unsigned) image->height, scr_depth) ;
  1108. X      XPutImage(dpy, mpr, pix_gc, image, 0, 0, 0, 0,
  1109. X                (unsigned) image->width, (unsigned) image->height) ;
  1110. X      XDestroyImage(image) ;
  1111. X    }
  1112. X  else
  1113. X    {
  1114. X      mptr = (unsigned char *) Emalloc((Xsize / 8) + 1) ;
  1115. X      halftone(line, y) ;
  1116. X      for (i = 0; i < (Xsize / 8) + 1; i++) mptr[i] = revtable[mptr[i]] ;
  1117. X      mpr = XCreatePixmapFromBitmapData(dpy, RootWindow(dpy, screen), mptr,
  1118. X                                        Xsize, 1, foregnd, backgnd, scr_depth) ;      free(mptr) ;
  1119. X    }
  1120. X  XCopyArea(dpy, mpr, frame, gc, 0, 0, Xsize, 1, 0, y+100) ;
  1121. X  XFreePixmap(dpy, mpr) ;
  1122. X}
  1123. X
  1124. X
  1125. Xdrawarea(x, y, width, height, op)
  1126. Xint x, y, width, height ;
  1127. Xenum op_type op ;
  1128. X{
  1129. X  gc_val.function = ops[(int) op] ;
  1130. X  XChangeGC(dpy, gc, GCFunction, &gc_val) ;
  1131. X  XFillRectangle(dpy, frame, gc, x, y,
  1132. X                 (unsigned int) width, (unsigned int) height) ;
  1133. X  XSync(dpy, 0) ;
  1134. X}
  1135. X
  1136. X
  1137. Xdrawline(x1, y1, x2, y2)
  1138. Xint x1, y1, x2, y2 ;
  1139. X{
  1140. X  gc_val.foreground = foregnd ;
  1141. X  gc_val.function = GXcopy ;
  1142. X  XChangeGC(dpy, gc, GCForeground | GCFunction, &gc_val) ;
  1143. X  XDrawLine(dpy, frame, gc, x1, y1, x2, y2) ;
  1144. X}
  1145. X
  1146. X
  1147. Xdrawtext(x, y, fontno, str)
  1148. Xenum font_type fontno ;
  1149. Xint x, y ;
  1150. Xchar *str ;
  1151. X{
  1152. X       if (fontno == NFONT) font = nfont ;
  1153. X  else if (fontno == BFONT) font = bfont ;
  1154. X  gc_val.font = font->fid ;
  1155. X  gc_val.function = GXcopy ;
  1156. X  XChangeGC(dpy, gc, GCFont | GCFunction, &gc_val) ;
  1157. X  XDrawString(dpy, frame, gc, x, y, str, strlen(str)) ;
  1158. X}
  1159. X
  1160. X
  1161. XXFontStruct *
  1162. Xget_font(name)
  1163. Xchar *name ;
  1164. X{
  1165. X  XFontStruct *font ;
  1166. X
  1167. X  if (!(font = XLoadQueryFont(dpy, name)))
  1168. X    if (!(font = XLoadQueryFont(dpy, DEFFONT)))
  1169. X      {
  1170. X        perror("couldn't get the default font.") ;
  1171. X        exit(1) ;
  1172. X      }
  1173. X  return(font) ;
  1174. X}
  1175. X
  1176. X
  1177. Xget_next_char(c)
  1178. Xchar *c ;
  1179. X{
  1180. X  XClientMessageEvent *ev ;
  1181. X  XKeyPressedEvent *key_event ;
  1182. X  KeySym keysym ;
  1183. X  char chs[2] ;
  1184. X
  1185. X  for (;;)
  1186. X    {
  1187. X      if (!XCheckMaskEvent(dpy, ExposureMask, &event))
  1188. X        XNextEvent(dpy, &event) ;
  1189. X
  1190. X      switch (event.type)
  1191. X        {
  1192. X          case ClientMessage    : /* Catch ICCCM kill from WM. */
  1193. X
  1194. X                                  ev = (XClientMessageEvent *) &event ;
  1195. X                                  if (ev->message_type == protocol_atom &&
  1196. X                                      ev->data.l[0] == kill_atom)
  1197. X                                    exit(0) ;
  1198. X                                  break ;
  1199. X
  1200. X          case Expose           : process_expose(&event) ;
  1201. X                                  break ;
  1202. X
  1203. X          case KeyPress         : key_event = (XKeyPressedEvent *) &event ;
  1204. X                                  (void) XLookupString(key_event, chs, 1,
  1205. X                                                       &keysym,
  1206. X                                                       (XComposeStatus *) NULL) ;
  1207. X                                  if (keysym == XK_Shift_L ||
  1208. X                                      keysym == XK_Shift_R) break ;
  1209. X                                  *c = chs[0] ;
  1210. X                                  return ;
  1211. X       }
  1212. X    }
  1213. X/*NOTREACHED*/
  1214. X}
  1215. X
  1216. X
  1217. Xinit_fonts()
  1218. X{
  1219. X  bfont = get_font(BOLD_FONT) ;
  1220. X  nfont = get_font(NORMAL_FONT) ;
  1221. X  nfont_width = 8 ;
  1222. X}
  1223. X
  1224. X
  1225. Xinit_ws_type()
  1226. X{
  1227. X  if ((dpy = XOpenDisplay(x11_display)) == NULL)
  1228. X    {
  1229. X      FPRINTF(stderr,"%s: Couldn't open display %s\n", ProgName,
  1230. X              (getenv ("DISPLAY") ? getenv("DISPLAY") : x11_display)) ;
  1231. X      exit(1) ;
  1232. X    }
  1233. X
  1234. X  screen = DefaultScreen(dpy) ;
  1235. X
  1236. X  if (!geometry)
  1237. X    STRCPY(geometry, XGetDefault(dpy, ProgName, "Geometry")) ;
  1238. X
  1239. X  foregnd = BlackPixel(dpy, screen) ;
  1240. X  backgnd = WhitePixel(dpy, screen) ;
  1241. X  scr_depth = DefaultDepth(dpy, screen) ;
  1242. X
  1243. X  ops[(int) GCLR] = GXclear ;
  1244. X  ops[(int) GSET] = GXset ;
  1245. X  return 0 ;
  1246. X}
  1247. X
  1248. X
  1249. X/*ARGSUSED*/
  1250. Xstatic Bool
  1251. Xis_exposed(dpy, ev, window)   /* Return True if window is being exposed */
  1252. XDisplay *dpy ;
  1253. XXEvent *ev ;
  1254. Xchar *window ;
  1255. X{
  1256. X  if (ev->type == Expose && *((Window *) window) == ev->xkey.window)
  1257. X    return True ;
  1258. X  return False ;
  1259. X}
  1260. X
  1261. X
  1262. Xload_colors()    /* Create and load popi color map. */
  1263. X{
  1264. X  u_char red[CMAPLEN], green[CMAPLEN], blue[CMAPLEN] ;
  1265. X  int i, numcolors ;
  1266. X
  1267. X  iscolor = 0 ;
  1268. X  if (DisplayCells(dpy, screen) > 2)
  1269. X    {
  1270. X      iscolor = 1 ;
  1271. X      numcolors = 0 ;
  1272. X      for (i = 0; i < CMAPLEN; i++)
  1273. X        {
  1274. X          current_col.flags = DoRed | DoGreen | DoBlue ;
  1275. X          current_col.red = current_col.green =
  1276. X          current_col.blue = (unsigned short) ((255 - i) << 8) ;
  1277. X          if (XAllocColor(dpy, DefaultColormap(dpy, screen), ¤t_col) == True)
  1278. X            palette[numcolors++] = current_col.pixel ;
  1279. X        }
  1280. X      if (numcolors < 2)
  1281. X        {
  1282. X          FPRINTF(stderr, "%s: cannot allocate colors.\n", ProgName) ;
  1283. X          exit(1) ;
  1284. X        }
  1285. X    }
  1286. X}
  1287. X
  1288. X
  1289. XPixmap
  1290. Xload_icon(sbuf)
  1291. Xshort sbuf[] ;
  1292. X{
  1293. X  char cbuf[512] ;
  1294. X  int i ;
  1295. X
  1296. X  for (i = 0; i < 256; i++)
  1297. X    {
  1298. X      cbuf[i*2+0] = revtable[(sbuf[i] >> 8) & 0xFF] ;
  1299. X      cbuf[i*2+1] = revtable[sbuf[i] & 0xFF] ;
  1300. X    }
  1301. X  return(XCreatePixmapFromBitmapData(dpy, RootWindow(dpy, screen), cbuf,
  1302. X                                     64, 64, foregnd, backgnd, scr_depth)) ;
  1303. X}
  1304. X
  1305. X
  1306. Xmake_items(argc, argv)       /* Create icon, frame, canvas etc.. */
  1307. Xint argc ;
  1308. Xchar *argv[] ;
  1309. X{
  1310. X  unsigned int h, w ;       /* Window dimensions. */
  1311. X  int flags ;
  1312. X  int x, y ;                /* Window position. */
  1313. X
  1314. X  load_colors() ;
  1315. X  popi_icon = load_icon(icon_image) ;
  1316. X
  1317. X  size.flags = PMinSize | PMaxSize | PPosition | PSize ;
  1318. X  size.x = 0 ;
  1319. X  size.y = 0 ;
  1320. X  size.max_width = size.min_width = size.width = TWIDTH ;
  1321. X  size.max_height = size.min_height = size.height = THEIGHT ;
  1322. X
  1323. X  if (strlen(geometry))
  1324. X    {
  1325. X      flags = XParseGeometry(geometry, &x, &y, &w, &h) ;
  1326. X      if (XValue & flags)
  1327. X        {
  1328. X          if (XNegative & flags)
  1329. X            x = DisplayWidth(dpy, screen) + x - size.width ;
  1330. X            size.flags |= USPosition ;
  1331. X            size.x = x ;
  1332. X        }
  1333. X      if (YValue & flags)
  1334. X        {
  1335. X          if (YNegative & flags)
  1336. X            y = DisplayHeight(dpy, screen) + y - size.height ;
  1337. X            size.flags |= USPosition ;
  1338. X            size.y = y ;
  1339. X        }
  1340. X    }
  1341. X
  1342. X  frame = XCreateSimpleWindow(dpy, RootWindow(dpy, screen),
  1343. X                              size.x, size.y, size.width, size.height,
  1344. X                              POPI_BORDER_WIDTH, foregnd, backgnd) ;
  1345. X
  1346. X  protocol_atom = XInternAtom(dpy, "WM_PROTOCOLS", False) ;
  1347. X  kill_atom = XInternAtom(dpy, "WM_DELETE_WINDOW", False) ;
  1348. X
  1349. X  XSetStandardProperties(dpy, frame, "popi", NULL, popi_icon,
  1350. X                         argv, argc, &size) ;
  1351. X
  1352. X  wm_hints.icon_x = ix ;
  1353. X  wm_hints.icon_y = iy ;
  1354. X  wm_hints.input = True ;
  1355. X  wm_hints.icon_pixmap = popi_icon ;
  1356. X  wm_hints.flags = IconPositionHint | InputHint | IconPixmapHint ;
  1357. X  if (iconic)
  1358. X    {
  1359. X      wm_hints.initial_state = IconicState ;
  1360. X      wm_hints.flags |= StateHint ;
  1361. X    }
  1362. X  XSetWMHints(dpy, frame, &wm_hints) ;
  1363. X
  1364. X  gc_mask = GCFont | GCForeground | GCBackground | GCGraphicsExposures ;
  1365. X  gc_val.font = nfont->fid ;
  1366. X  gc_val.foreground = foregnd ;
  1367. X  gc_val.background = backgnd ;
  1368. X  gc_val.graphics_exposures = False ;
  1369. X  gc = XCreateGC(dpy, RootWindow(dpy, screen), gc_mask, &gc_val) ;
  1370. X  XSetFunction(dpy, gc, GXcopy) ;
  1371. X  pix_gc = DefaultGC(dpy, screen) ;
  1372. X
  1373. X  main_cursor = XCreateFontCursor(dpy, XC_top_left_arrow) ;
  1374. X  busy_cursor = XCreateFontCursor(dpy, XC_coffee_mug) ;
  1375. X}
  1376. X
  1377. X
  1378. Xprocess_expose(event)
  1379. XXExposeEvent *event ;
  1380. X{
  1381. X  int doframe ;
  1382. X
  1383. X  doframe = 0 ;
  1384. X  do
  1385. X    {
  1386. X      if (event->count == 0)
  1387. X        if (event->window == frame) doframe++ ;
  1388. X    }    
  1389. X  while (XCheckMaskEvent(dpy, ExposureMask, event)) ;
  1390. X
  1391. X  if (doframe) paint_canvas() ;
  1392. X}
  1393. X
  1394. X
  1395. Xset_cursor(type)
  1396. Xenum cur_type type ;
  1397. X{
  1398. X  switch (type)
  1399. X    {
  1400. X      case BUSY_CUR   : XDefineCursor(dpy, frame, busy_cursor) ;
  1401. X                        break ;
  1402. X      case NORMAL_CUR : XDefineCursor(dpy, frame, main_cursor) ;
  1403. X    }
  1404. X}
  1405. X
  1406. X
  1407. Xstart_tool()
  1408. X{
  1409. X  XSelectInput(dpy, frame, FRAME_MASK) ;
  1410. X  XMapWindow(dpy, frame) ;
  1411. X}
  1412. Funky_Stuff
  1413. chmod 0444 x11.c || echo "restore of x11.c fails"
  1414. set `wc -c x11.c`;Sum=$1
  1415. if test "$Sum" != "12178"
  1416. then echo original size 12178, current size $Sum;fi
  1417. echo "x - extracting xview.c (Text)"
  1418. sed 's/^X//' << 'Funky_Stuff' > xview.c &&
  1419. X/*LINTLIBRARY*/
  1420. X
  1421. X/*  @(#)xview.c 1.8 89/12/11
  1422. X *
  1423. X *  XView dependent graphics routines used by popi.
  1424. X *  written by Rich Burridge - Sun Microsystems.
  1425. X *
  1426. X *  Popi was originally written by Gerard J. Holzmann - AT&T Bell Labs.
  1427. X *  This version is based on the code in his Prentice Hall book,
  1428. X *  "Beyond Photography - the digital darkroom," ISBN 0-13-074410-7,
  1429. X *  which is copyright (c) 1988 by Bell Telephone Laboratories, Inc. 
  1430. X *
  1431. X *  Permission is given to distribute these extensions, as long as these
  1432. X *  introductory messages are not removed, and no monies are exchanged.
  1433. X *
  1434. X *  No responsibility is taken for any errors or inaccuracies inherent
  1435. X *  either to the comments or the code of this program, but if reported
  1436. X *  (see README file) then an attempt will be made to fix them.
  1437. X */
  1438. X
  1439. X#include "popi.h"
  1440. X#include "graphics.h"
  1441. X#include <xview/xview.h>
  1442. X#include <xview/canvas.h>
  1443. X#include <xview/cms.h>
  1444. X#include <xview/cursor.h>
  1445. X#include <X11/Xlib.h>
  1446. X
  1447. X#define  NOTIFY_DISPATCH                (void) notify_dispatch
  1448. X#define  NOTIFY_INTERPOSE_DESTROY_FUNC  (void) notify_interpose_destroy_func
  1449. X#define  PW_WRITEBACKGROUND             (void) pw_writebackground
  1450. X#define  WINDOW_DONE                    (void) window_done
  1451. X#define  XV_SET                         (void) xv_set
  1452. X
  1453. X#define  BOLD_FONT      "/usr/lib/fonts/fixedwidthfonts/screen.b.14"
  1454. X#define  NORMAL_FONT    "/usr/lib/fonts/fixedwidthfonts/screen.r.14"
  1455. X
  1456. Xvoid repaint_canvas() ;
  1457. X
  1458. XCanvas canvas ;
  1459. XCanvas_paint_window cpw ;
  1460. XDisplay *dpy ;
  1461. XEvent event ;
  1462. XFrame frame ;
  1463. XIcon popi_icon ;
  1464. XNotify_value destroy_proc() ;
  1465. XPixfont *bfont, *font, *nfont, *xv_pf_default(), *xv_pf_open() ;
  1466. XPixrect *pr, *xv_mem_create() ;                /* Offscreen image area. */
  1467. XXv_cmsdata cms_data ;
  1468. XXv_Cursor busy_cursor, main_cursor ;
  1469. X
  1470. Xunsigned short busy_cursor_array[] = {
  1471. X#include <images/hglass.cursor>
  1472. X} ;
  1473. Xmpr_static(busy_cursor_pr, 16, 16, 1, busy_cursor_array) ;
  1474. X
  1475. Xunsigned short icon_image[] = {
  1476. X#include "popi.icon"
  1477. X} ;
  1478. Xmpr_static(icon_pr, 64, 64, 1, icon_image) ;
  1479. X
  1480. Xint blocking ;       /* Set if in event blocking mode. */
  1481. Xint gotevent ;       /* Set if we have an event to handle. */
  1482. Xint nonblocking ;    /* Set if in event non-blocking mode. */
  1483. Xint oktoshow ;       /* Set just before window is displayed. */
  1484. Xint win_depth ;      /* Depth in pixels of this display. */
  1485. X
  1486. X
  1487. X/*ARGSUSED*/
  1488. Xvoid
  1489. Xcanvas_proc(canvas, e, arg)
  1490. XCanvas canvas ;
  1491. XEvent *e ;
  1492. Xcaddr_t arg ;
  1493. X{
  1494. X  if (!oktoshow) return ;
  1495. X  event = *e ;
  1496. X  gotevent = 1 ;
  1497. X  if (blocking) (void) notify_stop() ;
  1498. X}
  1499. X
  1500. X
  1501. Xcleanup()            /* Null routine for the XView version. */
  1502. X{
  1503. X}
  1504. X
  1505. X
  1506. X/*ARGSUSED*/
  1507. XNotify_value
  1508. Xdestroy_proc(client, status)
  1509. XNotify_client client ;
  1510. XDestroy_status status ;
  1511. X{
  1512. X  exit(0) ;
  1513. X}
  1514. X
  1515. X
  1516. Xdraw_scanline(line, y)       /* Display image scanline on the screen. */
  1517. Xunsigned char *line ;
  1518. Xint y ;
  1519. X{
  1520. X  int i ;
  1521. X
  1522. X  mptr = (unsigned char *) ((struct mpr_data *) pr->pr_data)->md_image ;
  1523. X  if (iscolor)
  1524. X    for (i = 0; i < Xsize; i++) mptr[i] = 255 - line[i] ;
  1525. X  else halftone(line, y) ;
  1526. X  (void) pw_rop(cpw, 0, y+100, Xsize, 1, PIX_SRC, pr, 0, 0) ;
  1527. X}
  1528. X
  1529. X
  1530. Xdrawarea(x, y, width, height, op)
  1531. Xint x, y, width, height ;
  1532. Xenum op_type op ;
  1533. X{
  1534. X  PW_WRITEBACKGROUND(cpw, x, y, width, height, ops[(int) op]) ;
  1535. X  XSync(dpy, 0) ;
  1536. X}
  1537. X
  1538. X
  1539. Xdrawline(x1, y1, x2, y2)
  1540. Xint x1, y1, x2, y2 ;
  1541. X{
  1542. X  (void) pw_vector(cpw, x1, y1, x2, y2, PIX_SET, 0) ;
  1543. X}
  1544. X
  1545. X
  1546. Xdrawtext(x, y, fontno, str)
  1547. Xenum font_type fontno ;
  1548. Xint x, y ;
  1549. Xchar *str ;
  1550. X{
  1551. X  if (fontno == NFONT) font = nfont ;
  1552. X  else if (fontno == BFONT) font = bfont ;
  1553. X  (void) pw_text(cpw, x, y, PIX_SRC, font, str) ;
  1554. X}
  1555. X
  1556. X
  1557. XPixfont *
  1558. Xget_font(name)
  1559. Xchar *name ;
  1560. X{
  1561. X  Pixfont *font ;
  1562. X
  1563. X  font = xv_pf_open(name) ;
  1564. X  if (font == NULL) font = xv_pf_default() ;
  1565. X  if (font == NULL)
  1566. X    {
  1567. X      perror("couldn't get the default font.") ;
  1568. X      exit(1) ;
  1569. X    }
  1570. X  return font ;
  1571. X}
  1572. X
  1573. X
  1574. Xget_event()       /* Get the next XView event. */
  1575. X{
  1576. X  if (!gotevent)
  1577. X    {
  1578. X      XSync(dpy, 0) ;
  1579. X      notify_start() ;     /* This blocks until notify_stop. */
  1580. X    }
  1581. X  gotevent = 0 ;
  1582. X}
  1583. X
  1584. X
  1585. Xget_next_char(c)      /* Process events, and return when character typed. */
  1586. Xchar *c ;
  1587. X{
  1588. X  for (;;)
  1589. X    {
  1590. X      get_event() ;
  1591. X      if (event_is_ascii(&event) && event_is_up(&event))  /* Keyboard char? */
  1592. X        {
  1593. X          *c = event_id(&event) ;
  1594. X          return ;
  1595. X        }
  1596. X      else if (event_id(&event) == WIN_REPAINT) paint_canvas() ;
  1597. X    }
  1598. X}
  1599. X
  1600. X
  1601. Xinit_fonts()
  1602. X{
  1603. X  bfont = get_font(BOLD_FONT) ;
  1604. X  nfont = get_font(NORMAL_FONT) ;
  1605. X  nfont_width = nfont->pf_defaultsize.x ;
  1606. X}
  1607. X
  1608. X
  1609. Xinit_ws_type()
  1610. X{
  1611. X  ops[(int) GCLR] = PIX_CLR ;
  1612. X  ops[(int) GSET] = PIX_SET ;
  1613. X  oktoshow = 0 ;       /* Kludge to correctly handle repaints. */
  1614. X  blocking = 1 ;
  1615. X  return 0 ;
  1616. X}
  1617. X
  1618. X
  1619. Xmake_items(argc, argv)       /* Create icon, frame, canvas etc.. */
  1620. Xint argc ;
  1621. Xchar *argv[] ;
  1622. X{
  1623. X  int i ;
  1624. X  char cmsname[MAXLINE] ;
  1625. X  u_char red[CMAPLEN], green[CMAPLEN], blue[CMAPLEN] ;
  1626. X
  1627. X  xv_init(XV_INIT_ARGS, argc, argv, 0);
  1628. X  popi_icon = xv_create(0, ICON,
  1629. X                        ICON_IMAGE, &icon_pr,
  1630. X                        0) ;
  1631. X  frame = xv_create(0, FRAME,
  1632. X                    FRAME_ICON,       popi_icon,
  1633. X                    FRAME_SHOW_LABEL, FALSE,
  1634. X                    FRAME_NO_CONFIRM, TRUE,
  1635. X                    XV_HEIGHT,        THEIGHT,
  1636. X                    XV_WIDTH,         TWIDTH,
  1637. X                    0) ;
  1638. X  iscolor = ((win_depth = (int) xv_get(frame, WIN_DEPTH)) > 1) ? 1 : 0 ;
  1639. X
  1640. X  pr = xv_mem_create(Xsize, 1, win_depth) ;
  1641. X
  1642. X  SPRINTF(cmsname, "popi%10ld", getpid()) ;
  1643. X  for (i = 0; i < CMAPLEN; i++)
  1644. X    red[i] = green[i] = blue[i] = 255 - i ;
  1645. X
  1646. X  cms_data.type = XV_DYNAMIC_CMS ;
  1647. X  cms_data.size = 256 ;
  1648. X  cms_data.rgb_count = 256 ;
  1649. X  cms_data.index = 0 ;
  1650. X  cms_data.red = red ;
  1651. X  cms_data.green = green ;
  1652. X  cms_data.blue = blue ;
  1653. X
  1654. X  canvas = xv_create(frame, CANVAS,
  1655. X                     OPENWIN_AUTO_CLEAR,       FALSE,
  1656. X                     CANVAS_RETAINED,          TRUE,
  1657. X                     XV_WIDTH,                 TWIDTH,
  1658. X                     XV_HEIGHT,                THEIGHT,
  1659. X                     CANVAS_PAINTWINDOW_ATTRS,
  1660. X                         WIN_DYNAMIC_VISUAL,   TRUE,
  1661. X                         WIN_CONSUME_EVENTS,
  1662. X                           WIN_ASCII_EVENTS,
  1663. X                           WIN_LEFT_KEYS, WIN_TOP_KEYS, WIN_RIGHT_KEYS,
  1664. X                           0,
  1665. X                         WIN_IGNORE_EVENTS,
  1666. X                           LOC_MOVE, LOC_DRAG,
  1667. X                           0,
  1668. X                         WIN_EVENT_PROC, canvas_proc,
  1669. X                         0,
  1670. X                     0) ;
  1671. X  cpw = canvas_paint_window(canvas) ;
  1672. X  XV_SET(/**canvas_pixwin(canvas),**/cpw,
  1673. X           WIN_CMS_NAME, cmsname,
  1674. X           WIN_CMS_DATA,  &cms_data,
  1675. X         0) ;
  1676. X  dpy = (Display *) xv_get(cpw, XV_DISPLAY) ;
  1677. X
  1678. X  main_cursor = xv_get(canvas, WIN_CURSOR) ;
  1679. X  busy_cursor = xv_create(NULL, CURSOR,
  1680. X                          CURSOR_IMAGE, &busy_cursor_pr,
  1681. X                          0) ;
  1682. X}
  1683. X
  1684. X
  1685. Xset_cursor(type)
  1686. Xenum cur_type type ;
  1687. X{
  1688. X  switch (type)
  1689. X    {
  1690. X      case BUSY_CUR   : XV_SET(canvas, WIN_CURSOR, busy_cursor, 0) ;
  1691. X                        break ;
  1692. X      case NORMAL_CUR : XV_SET(canvas, WIN_CURSOR, main_cursor, 0) ;
  1693. X    }
  1694. X  XSync(dpy, 0) ;
  1695. X}
  1696. X
  1697. X
  1698. Xstart_tool()
  1699. X{
  1700. X  window_fit(frame) ;
  1701. X  NOTIFY_INTERPOSE_DESTROY_FUNC(frame, destroy_proc) ;
  1702. X  XV_SET(frame, WIN_SHOW, TRUE, 0) ;
  1703. X  oktoshow = 1 ;
  1704. X  (void) xv_set(xv_default_server, SERVER_SYNC_AND_PROCESS_EVENTS) ;
  1705. X  NOTIFY_DISPATCH() ;
  1706. X}
  1707. Funky_Stuff
  1708. chmod 0444 xview.c || echo "restore of xview.c fails"
  1709. set `wc -c xview.c`;Sum=$1
  1710. if test "$Sum" != "7343"
  1711. then echo original size 7343, current size $Sum;fi
  1712. echo "x - extracting popi.msc (Text)"
  1713. sed 's/^X//' << 'Funky_Stuff' > popi.msc &&
  1714. X#
  1715. X# Program: Popi
  1716. X#
  1717. X# Make file for Microsoft braindamaged make.
  1718. X# In the Quick C environment, select
  1719. X#    File/Set Program List
  1720. X# and set to the name of this file (popi.qcl).
  1721. X# From the command line, use "make popi.qcl"
  1722. X# Quick C has fought hard against generating correct code,
  1723. X# but I believe the current version doesn't trigger any of
  1724. X# its many bugs. Do not enable run-time pointer checking or
  1725. X# it will wrongly complain about some valid pointer assignments.
  1726. X# Also, do not enable optimisation as incorrect code will be
  1727. X# generated in a loop inside run.c.
  1728. X#
  1729. X
  1730. XCC    = qcl
  1731. X
  1732. X.c.obj:
  1733. X    $(CC) -c -W3 -AS $*.c
  1734. X
  1735. Xmain.obj : main.c
  1736. X
  1737. Xexpr.obj : expr.c
  1738. X
  1739. Xio.obj : io.c
  1740. X
  1741. Xlex.obj : lex.c
  1742. X
  1743. Xpolar.obj : polar.c
  1744. X
  1745. Xrun.obj : run.c
  1746. X
  1747. Xspecial.obj : special.c
  1748. X
  1749. Xibmpc.obj : ibmpc.c
  1750. X
  1751. XPopi.exe : expr.obj ibmpc.obj io.obj lex.obj main.obj polar.obj run.obj  \
  1752. X        special.obj 
  1753. X    del Popi.lnk
  1754. X    echo expr.obj+ >>Popi.lnk
  1755. X    echo ibmpc.obj+ >>Popi.lnk
  1756. X    echo io.obj+ >>Popi.lnk
  1757. X    echo lex.obj+ >>Popi.lnk
  1758. X    echo main.obj+ >>Popi.lnk
  1759. X    echo polar.obj+ >>Popi.lnk
  1760. X    echo run.obj+ >>Popi.lnk
  1761. X    echo special.obj  >>Popi.lnk
  1762. X    echo Popi.exe >>Popi.lnk
  1763. X    echo Popi.map >>Popi.lnk
  1764. X    link @Popi.lnk /NOI $(LDFLAGS);
  1765. Funky_Stuff
  1766. chmod 0444 popi.msc || echo "restore of popi.msc fails"
  1767. set `wc -c popi.msc`;Sum=$1
  1768. if test "$Sum" != "1163"
  1769. then echo original size 1163, current size $Sum;fi
  1770. echo "x - extracting dmr.Z (Binary)"
  1771. sed 's/^X//' << 'Funky_Stuff' > s2_temp_.tmp &&
  1772. Xbegin 600 dmr.Z
  1773. Funky_Stuff
  1774. echo "End of part 5"
  1775. echo "File dmr.Z is continued in part 6"
  1776. echo "6" > s2_seq_.tmp
  1777. exit 0
  1778.  
  1779.