home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume9 / popi / part02 < 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: v09i048: popi, The Digital Darkroom, Part02/09
  4. Message-ID: <2782@basser.oz>
  5. Date: 12 Dec 89 23:45:02 GMT
  6. Approved: john@cs.su.oz.AU (John Mackin - comp.sources.misc)
  7.  
  8. Posting-number: Volume 9, Issue 48
  9. Submitted-by: Rich Burridge <richb@sunaus.sun.oz.AU>
  10. Archive-name: popi/part02
  11.  
  12. ---- Cut Here and unpack ----
  13. #!/bin/sh
  14. # this is part 2 of a multipart archive
  15. # do not concatenate these parts, unpack them in order with /bin/sh
  16. # file expr.c continued
  17. #
  18. CurArch=2
  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 expr.c"
  29. sed 's/^X//' << 'Funky_Stuff' >> expr.c
  30. Xstatic
  31. X#endif    /* __MSC__ */
  32. Xvoid
  33. Xexpr()
  34. X{
  35. X    extern int    prs;
  36. X    int        remem1,
  37. X        remem2;
  38. X
  39. X    DEBUG((Debug, "expr() lat='%c'\n", lat));
  40. X    DEBUG((Debug, "levels of precedence: %d\n", PREC_LEVELS));
  41. X
  42. X    level(PREC_LEVELS - 1);
  43. X
  44. X    if (lat == '?')
  45. X    {
  46. X    lex();
  47. X    emit('?');
  48. X    remem1 = prs;
  49. X    emit(0);
  50. X    expr();
  51. X    expect(':');
  52. X    emit(':');
  53. X    remem2 = prs;
  54. X    emit(0);
  55. X    parsed[remem1] = prs-1;
  56. X    expr();
  57. X    parsed[remem2] = prs-1;
  58. X    }
  59. X}
  60. X
  61. X
  62. Xvoid
  63. Xexpect(t)
  64. Xint t;
  65. X{
  66. X    DEBUG((Debug, "expect('%c')\n", t));
  67. X
  68. X    if (lat == t)
  69. X    lex();
  70. X    else
  71. X    {
  72. X    if (t < 127)
  73. X        SPRINTF(ErrBuf, "expected token '%c' (%d)", t, t);
  74. X    else
  75. X        SPRINTF(ErrBuf, "expected token (%d)", t);
  76. X    error(ERR_PARSE);
  77. X    }
  78. X}
  79. X
  80. X/*
  81. X * Transform    =    NEW '[' index ']' '=' expr
  82. X *        |    NEW '=' expr
  83. X *        |    expr
  84. X */
  85. Xvoid
  86. Xtransform()
  87. X{
  88. X    extern int prs;
  89. X
  90. X    DEBUG((Debug, "transform() lat='%c'\n", lat));
  91. X
  92. X    prs = 0 ;     /* initial length of parse string */
  93. X    if (lat != NEW)
  94. X    {
  95. X    expr();
  96. X    emit('@');
  97. X    }
  98. X    else
  99. X    {
  100. X    lex();
  101. X    if (lat == '[')
  102. X    {
  103. X        fileref(CURNEW, CLVAL);
  104. X        expect('=');
  105. X        expr();
  106. X        emit('=');
  107. X    }
  108. X    else
  109. X    {
  110. X        expect('=');
  111. X        expr();
  112. X        emit('@');
  113. X    }
  114. X    }
  115. X    if (lat != '\n')
  116. X    {
  117. X    SPRINTF(ErrBuf,
  118. X        "syntax error - expected operator or end of expression");
  119. X    error(ERR_PARSE);
  120. X    }
  121. X    assert(lat == '\n');
  122. X}
  123. Funky_Stuff
  124. echo "File expr.c is complete"
  125. chmod 0444 expr.c || echo "restore of expr.c fails"
  126. set `wc -c expr.c`;Sum=$1
  127. if test "$Sum" != "8806"
  128. then echo original size 8806, current size $Sum;fi
  129. echo "x - extracting ibmpc.c (Text)"
  130. sed 's/^X//' << 'Funky_Stuff' > ibmpc.c &&
  131. X/*LINTLIBRARY*/
  132. X#ifndef    lint
  133. Xstatic char sccsid[] = "@(#)ibmpc.c 1.4 89/12/12" ;
  134. X#endif
  135. X
  136. X/*  Popi device driver for a PC using one of:
  137. X *    Borland Turbo C
  138. X *    Microsoft C
  139. X *    MIX Power C
  140. X *  Written by Stephen Frede, Softway Pty Ltd.
  141. X *
  142. X *  Popi was originally written by Gerard J. Holzmann - AT&T Bell Labs.
  143. X *  This version is based on the code in his Prentice Hall book,
  144. X *  "Beyond Photography - the digital darkroom," ISBN 0-13-074410-7,
  145. X *  which is copyright (c) 1988 by Bell Telephone Laboratories, Inc. 
  146. X *
  147. X *  Permission is given to distribute these extensions, as long as these
  148. X *  introductory messages are not removed, and no monies are exchanged.
  149. X *
  150. X *  No responsibility is taken for any errors or inaccuracies inherent
  151. X *  either to the comments or the code of this program, but if reported
  152. X *  (see README file) then an attempt will be made to fix them.
  153. X */
  154. X
  155. X/*
  156. X *  There is still some work to be done here:
  157. X *    + vid_detect() needs to be written.
  158. X *    + HGC code needs to be fixed properly.
  159. X *    + other standard modes need to be added.
  160. X *    + Dithering or something needs to be added for EGA (sim to CGA).
  161. X *    + Handle image allocation properly with far pointers
  162. X *        where appropriate (ie unavoidable).
  163. X */
  164. X
  165. X#if defined(__STDC__) && defined(__TURBOC__)
  166. X/* The user has (with commendable intentions) used the Turbo C
  167. X * ANSI compatibility flag. Unfortunately, we need the nonstandard
  168. X * extensions to include <graphics.h> and use far pointers.
  169. X */
  170. X#include "Unfortunately, can't use ANSI compatibility flag."
  171. X#endif    /* __STDC__ && __TURBOC__ */
  172. X
  173. X#include "popi.h"
  174. X
  175. X/* I don't know what token Power C defines to distinguish itself.
  176. X * But it does define a max() macro in stdlib.h include file.
  177. X * Hopefully no other vendor is silly enough to do this, so we
  178. X * can use that to distinguish Power C.
  179. X */
  180. X#if    defined(__STDC__) && defined(max)
  181. X#define    __POWERC__    1
  182. X#endif    /* __STDC__ && max */
  183. X
  184. X/* We assume that the compiler has these files header files. */
  185. X#include <dos.h>
  186. X#include <conio.h>
  187. X
  188. X/* We only use the __TURBOC__ token to test for graphics related
  189. X * features from here on, so if we have an old version with no
  190. X * graphics support, just pretend we are a generic compiler.
  191. X */
  192. X#if defined(__TURBOC__)
  193. X# if __TURBOC__ < 0x0200
  194. X#  undef    __TURBOC__
  195. X# endif    /* __TURBOC__ < 0x0200 */
  196. X#endif    /* __TURBOC__ */
  197. X
  198. X#if __TURBOC__ || __POWERC__
  199. X# include <graphics.h>
  200. X#endif /* __TURBOC__ || __POWERC__ */
  201. X
  202. X#if    __MSC__
  203. X#include <graph.h>
  204. X#endif    /* __MSC__ */
  205. X
  206. X
  207. X#if    defined(__TURBOC__)
  208. X# ifndef    BGIPATH
  209. X#  define    STRBGIPATH    ""
  210. X# else
  211. X#  define    STR(x)    #x
  212. X#  define    STRBGIPATH    STR(BGIPATH)
  213. X# endif    /* BGIPATH */
  214. X#endif /* __TURBOC__ */
  215. X
  216. X#ifndef MK_FP
  217. X#define MK_FP(segment,offset)    ((void far *) \
  218. X               (((unsigned long)(segment) << 16) | (unsigned)(offset)))
  219. X#endif    /* MK_FP */
  220. X
  221. X/*  There are ten exportable routines used by the popi program.
  222. X *
  223. X *  These are:
  224. X *
  225. X *  disp_init(argc, argv)    - called from main at the start.
  226. X *  disp_finish()        - called from main prior to exit.
  227. X *  disp_imgstart()        - called prior to drawing an image.
  228. X *  disp_imgend()        - called after drawing an image.
  229. X *  disp_putline(line, y)    - to draw an image scanline.
  230. X *  disp_getchar()        - to get the next character typed.
  231. X *  disp_ungetc(c)        - put back the last character typed.
  232. X *  disp_prompt()        - display popi prompt and clear input buffer.
  233. X *  disp_error(errtype,pos)    - display error message.
  234. X *  disp_percentdone(n)        - display percentage value of conversion.
  235. X */
  236. X
  237. X/*
  238. X *    Bios function call definitions
  239. X */
  240. X
  241. X#define    BIOS_VIDFN        0x10    /* Video functions */
  242. X#define VID_PALETTE        0x10    /* palette access function */
  243. X#define PAL_SETPAL        0x00    /* update single palette register */
  244. X#define PAL_SETPALBLOCK        0x02    /* update all palette registers */
  245. X#define PAL_GETPALBLOCK        0x09    /* read all palette registers */
  246. X#define PAL_GETDACBLOCK        0x17    /* read current VGA DAC values */
  247. X#define PAL_SETDACBLOCK        0x12    /* set new VGA DAC values */
  248. X
  249. X/*
  250. X *    Arguments to the vid_vgapalette and vid_setpalette functions
  251. X */
  252. X#define    PAL_SAVE        0    /* Save existing values */
  253. X#define    PAL_RESTORE        1    /* Restore saved values */
  254. X#define    PAL_SETGREY        2    /* Set greyscale mapping */
  255. X#define    PAL_SETLIN        3    /* Set 1:1 mapping (vid_setpalette) */
  256. X
  257. X/* Bios Addresses */
  258. X#define SEG_VIDBIOS        0x0040    /* Segment of video BIOS addresses */
  259. X#define BIOSADDR_MODE        0x0049    /* Current BIOS video mode number */
  260. X#define BIOSADDR_CRTCPORT    0x0063    /* Port Address of CRTC */
  261. X
  262. X/* Fixed port addresses */
  263. X#define    HGC_SWITCH    0x03BF
  264. X
  265. X
  266. X/* Prototypes for local functions */
  267. Xvoid    vid_vgapalette P((int));
  268. Xvoid    vid_setpalette P((int));
  269. Xvoid    vid_setmode P((unsigned char));
  270. Xvoid    vid_sethgc P((void));
  271. Xvoid    vid_setpixel P((int, int, pixel_t));
  272. Xunsigned char    vid_detect P((void));
  273. X
  274. X    /* Array containing threshold values for dithering. */
  275. Xpixel_t thresh[BITSPERPIXEL][BITSPERPIXEL] =
  276. X{
  277. X    {    0, 128,     32, 160,   8, 136,  40, 168, },
  278. X    { 192,  64,    224,  96, 200,    72, 232, 104, },
  279. X    {  48, 176,     16, 144,  56, 184,  24, 152, },
  280. X    { 240, 112,    208,  80, 248, 120, 216,  88, },
  281. X    {  12, 140,     44, 172,   4, 132,  36, 164, },
  282. X    { 204,  76,    236, 108, 196,    68, 228, 100, },
  283. X    {  60, 188,     28, 156,  52, 180,  20, 148, },
  284. X    { 252, 124,    220,  92, 244, 116, 212,  84, },
  285. X};
  286. X
  287. Xstruct VidDriver
  288. X{
  289. X    unsigned char    bios_mode;    /* Bios mode no. */
  290. X    unsigned int    xsize,        /* Pixels/scanline */
  291. X                ysize;        /* Scanlines/image */
  292. X    /* Segment to which screen buffer is mapped */
  293. X    unsigned int    ScreenMem;
  294. X    unsigned int    interlace,    /* no. lines interlaced */
  295. X                interlace_offset; /* memory offset for interlace */
  296. X    unsigned char    PixelsPerByte;
  297. X};
  298. X
  299. Xstatic struct VidDriver    VidDrivers[] =
  300. X{
  301. X#define VID_VGA    0
  302. X    {
  303. X        0x13, 320, 200, 0xA000, 1, 0, 1,
  304. X    },
  305. X#define VID_EGA    1
  306. X    {
  307. X        0x10, 640, 350, 0xA000, 2, 0x2000, 8,
  308. X    },
  309. X#define VID_CGA    2
  310. X    {
  311. X        0x06, 640, 200, 0xB800, 2, 0x2000, 8,
  312. X    },
  313. X#define VID_STD    2    /* Last standard adapter */
  314. X/* From here on, adapters have no bios support. The bios
  315. X * number will be stored in the appropriate place in the video
  316. X * bios data area (this is useful eg if a mouse is being used,
  317. X * so it gets the graphics cursor correct).
  318. X */
  319. X#define VID_HGC    3
  320. X    {
  321. X        0x06, 720, 348, 0xB000, 4, 0x2000, 8,
  322. X    },
  323. X};
  324. X#define    VID_NONE    -1    /* Unknown video adapter */
  325. X/* When VidAdapter is VID_LIB, use compile-time dependant
  326. X * library routines. For example, the Turbo C graphics library
  327. X * allows custom drivers to be added for nonstandard adapters.
  328. X */
  329. X#define    VID_LIB        -2
  330. X
  331. Xstatic struct VidDriver
  332. X    *VidDriver = 0;
  333. X
  334. Xstatic int
  335. X    VidAdapter = VID_NONE,
  336. X    vid_xbytes,
  337. X    vid_xoff_bytes,
  338. X    vid_yoff;
  339. X#if __TURBOC__
  340. Xstatic int
  341. X    tc_driver,
  342. X    tc_mode,
  343. X    tc_error;
  344. X#endif    /* __TURBOC__ */
  345. X
  346. Xstatic unsigned char far
  347. X    *ScreenMem;
  348. X/* Pointer to current mode in Bios video display data area */
  349. Xstatic char far
  350. X    *VidModeBiosAddr = MK_FP(SEG_VIDBIOS, BIOSADDR_MODE);
  351. X/* Pointer to CRTC register port number in Bios dideo display area */
  352. Xstatic short far
  353. X    *CrtcPortBiosAddr = MK_FP(SEG_VIDBIOS, BIOSADDR_CRTCPORT);
  354. Xstatic char
  355. X    VidInitMode;
  356. X
  357. X/*
  358. X *    Routine to map VGA palette registers (256 colour mode)
  359. X *    to and from a greyscale display.
  360. X */
  361. X#define BITSPERBYTE        8
  362. X#define BITSPERVGACOLOUR    6
  363. X                /* no. VGA DAC registers */
  364. X#define SIZE_DACS        256
  365. X                /* no. distinct greyscale values */
  366. X#define NUM_GREY        (1 << BITSPERVGACOLOUR)
  367. X                /* no. palette registers that map
  368. X                 * to the same greyscale value */
  369. X#define GREY_SAME        (SIZE_DACS / NUM_GREY)
  370. X                /* no. underlying colours on vga */
  371. X#define PRIMARY_COLOURS        3
  372. X
  373. Xstatic void
  374. Xvid_vgapalette(action)
  375. Xint    action;
  376. X{
  377. X    union REGS            regs;
  378. X    struct SREGS        sreg;
  379. X    static unsigned char    SaveDacs[SIZE_DACS * PRIMARY_COLOURS],
  380. X                    *GreyDacs = 0;
  381. X
  382. X    switch(action)
  383. X    {
  384. X        case PAL_SAVE:
  385. X        /* Save existing palette */
  386. X        regs.h.ah = VID_PALETTE;
  387. X        regs.h.al = PAL_GETPALBLOCK;
  388. X        regs.x.bx = 0;        /* first palette register */
  389. X        regs.x.cx = SIZE_DACS;    /* read all palette registers */
  390. X        segread(&sreg);
  391. X        sreg.es = sreg.ds;
  392. X        regs.x.dx = (unsigned int) SaveDacs;
  393. X        int86x(BIOS_VIDFN, ®s, ®s, &sreg);
  394. X        break;
  395. X
  396. X    case PAL_RESTORE:
  397. X        /* restore saved palette */
  398. X        regs.h.ah = VID_PALETTE;
  399. X        regs.h.al = PAL_SETDACBLOCK;
  400. X        regs.x.bx = 0;        /* first palette register */
  401. X        regs.x.cx = SIZE_DACS;    /* read all palette registers */
  402. X        segread(&sreg);
  403. X        sreg.es = sreg.ds;
  404. X        regs.x.dx = (unsigned int) SaveDacs;
  405. X        int86x(BIOS_VIDFN, ®s, ®s, &sreg);
  406. X        break;
  407. X
  408. X    case PAL_SETGREY:
  409. X        /* set palette to greyscale */
  410. X        if (GreyDacs == 0)
  411. X        {
  412. X        unsigned char    *p,
  413. X                c;
  414. X
  415. X            if ((GreyDacs = malloc(SIZE_DACS*PRIMARY_COLOURS))
  416. X            == 0)
  417. X        {
  418. X            sprintf(ErrBuf, "Dacs allocation failed");
  419. X            error(ERR_SYS);
  420. X            return;
  421. X        }
  422. X        for (p = GreyDacs, c = 0; c < NUM_GREY; ++c)
  423. X        {
  424. X            int        i;
  425. X
  426. X            for (i = 0; i < PRIMARY_COLOURS * GREY_SAME; ++i)
  427. X            *p++ = c;
  428. X        }
  429. X        }
  430. X        regs.h.ah = VID_PALETTE;
  431. X        regs.h.al = PAL_SETDACBLOCK;
  432. X        regs.x.bx = 0;        /* first palette register */
  433. X        regs.x.cx = SIZE_DACS;    /* read all palette registers */
  434. X        segread(&sreg);
  435. X        sreg.es = sreg.ds;
  436. X        regs.x.dx = (unsigned int) GreyDacs;
  437. X        int86x(BIOS_VIDFN, ®s, ®s, &sreg);
  438. X        break;
  439. X    }
  440. X}
  441. X
  442. X/*
  443. X *    Routine to map 16 palette registers.
  444. X */
  445. X
  446. X#define SIZE_PALETTE        17    /* 16 + overscan */
  447. X
  448. Xstatic void
  449. Xvid_setpalette(action)
  450. Xint    action;
  451. X{
  452. X    union REGS            regs;
  453. X    struct SREGS        sreg;
  454. X    static unsigned char    SavePalette[SIZE_PALETTE],
  455. X                    *GreyPalette = 0;
  456. X    unsigned char        palette;
  457. X
  458. X    switch (action)
  459. X    {
  460. X        case PAL_SAVE:
  461. X        /* Save existing palette */
  462. X        regs.h.ah = VID_PALETTE;
  463. X        regs.h.al = PAL_GETPALBLOCK;
  464. X        segread(&sreg);
  465. X        sreg.es = sreg.ds;
  466. X        regs.x.dx = (unsigned int) SavePalette;
  467. X        int86x(BIOS_VIDFN, ®s, ®s, &sreg);
  468. X        break;
  469. X
  470. X    case PAL_RESTORE:
  471. X        /* restore saved palette */
  472. X        regs.h.ah = VID_PALETTE;
  473. X        regs.h.al = PAL_SETPALBLOCK;
  474. X        segread(&sreg);
  475. X        sreg.es = sreg.ds;
  476. X        regs.x.dx = (unsigned int) SavePalette;
  477. X        int86x(BIOS_VIDFN, ®s, ®s, &sreg);
  478. X        break;
  479. X
  480. X    case PAL_SETGREY:
  481. X        /* set palette to greyscale */
  482. X        if (GreyPalette == 0)
  483. X        {
  484. X        if ((GreyPalette = (unsigned char *) malloc(SIZE_PALETTE)) == 0)
  485. X        {
  486. X            sprintf(ErrBuf, "Palette allocation failed");
  487. X            error(ERR_SYS);
  488. X            return;
  489. X        }
  490. X        GreyPalette[0] = 000;
  491. X        GreyPalette[1] = 070;
  492. X        GreyPalette[2] = 007;
  493. X        GreyPalette[3] = 077;
  494. X        GreyPalette[SIZE_PALETTE-1] = SavePalette[SIZE_PALETTE-1];
  495. X        }
  496. X        regs.h.ah = VID_PALETTE;
  497. X        regs.h.al = PAL_SETPALBLOCK;
  498. X        segread(&sreg);
  499. X        sreg.es = sreg.ds;
  500. X        regs.x.dx = (unsigned int) GreyPalette;
  501. X        int86x(BIOS_VIDFN, ®s, ®s, &sreg);
  502. X        break;
  503. X
  504. X    case PAL_SETLIN:
  505. X        for (palette = 0; palette < SIZE_PALETTE; ++palette)
  506. X        {
  507. X        union REGS regs;
  508. X
  509. X        regs.h.ah = VID_PALETTE;
  510. X        regs.h.al = PAL_SETPAL;
  511. X        regs.h.bh = palette;
  512. X        regs.h.bl = palette;
  513. X        int86(BIOS_VIDFN, ®s, ®s);
  514. X        }
  515. X        break;
  516. X    }
  517. X}
  518. X
  519. Xstatic void
  520. Xvid_setmode(mode)
  521. Xunsigned char    mode;
  522. X{
  523. X    union REGS    regs;
  524. X
  525. X    regs.h.ah = 0;
  526. X    regs.h.al = mode;
  527. X    int86(0x10, ®s, ®s);
  528. X}
  529. X
  530. Xstatic void
  531. Xvid_setpixel(x, y, value)
  532. Xint x, y;
  533. Xpixel_t value;
  534. X{
  535. X    union REGS    regs;
  536. X
  537. X    regs.h.al = value;
  538. X    regs.h.ah = 0x0C;
  539. X    regs.h.bh = 0;
  540. X    regs.x.cx = (unsigned) x;
  541. X    regs.x.dx = (unsigned) y;
  542. X    int86(0x10, ®s, ®s);
  543. X}
  544. X
  545. X/*
  546. X *    Detect installed graphics hardware.
  547. X */
  548. Xstatic unsigned char
  549. Xvid_detect()
  550. X{
  551. X    /* Yes, well, when I get a chance I'll do this.
  552. X     * Wait for the next release.
  553. X     */
  554. X    return VID_NONE;
  555. X}
  556. X
  557. X/*ARGSUSED*/
  558. Xvoid
  559. Xdisp_init(argc,argv)        /* called from main at the start. */
  560. Xint argc;
  561. Xchar *argv[];
  562. X{
  563. X   /* Some compilers (eg Power C) don't get the initialisation right,
  564. X    * so repeat it here.
  565. X    */
  566. X    VidModeBiosAddr = MK_FP(SEG_VIDBIOS, BIOSADDR_MODE);
  567. X    CrtcPortBiosAddr = MK_FP(SEG_VIDBIOS, BIOSADDR_CRTCPORT);
  568. X    VidInitMode = *VidModeBiosAddr;
  569. X
  570. X    VidAdapter = vid_detect();
  571. X
  572. X#if    __TURBOC__
  573. X    tc_driver = DETECT;
  574. X    detectgraph(&tc_driver, &tc_mode);
  575. X
  576. X    switch (tc_driver)
  577. X    {
  578. X    case VGA:
  579. X        VidAdapter = VID_VGA;
  580. X        break;
  581. X
  582. X    case EGA:
  583. X    case EGA64:
  584. X        VidAdapter = VID_EGA;
  585. X        break;
  586. X
  587. X    case CGA:
  588. X        VidAdapter = VID_CGA;
  589. X        break;
  590. X
  591. X    default:
  592. X        initgraph(&tc_driver, &tc_mode, STRBGIPATH);
  593. X        tc_error = graphresult();
  594. X        if (tc_error < 0)
  595. X        {
  596. X        sprintf(ErrBuf, "initgraph error (%s)",
  597. X            grapherrormsg(tc_error));
  598. X        error(ERR_WARN);
  599. X        VidAdapter = VID_NONE;
  600. X        return;
  601. X        }
  602. X        else
  603. X        VidAdapter = VID_LIB;
  604. X    }
  605. X#endif    /* __TURBOC__ */
  606. X
  607. X#if    __MSC__
  608. X    if (_setvideomode(_VRES2COLOR))
  609. X        VidAdapter = VID_VGA;
  610. X    else if (_setvideomode(_ERESNOCOLOR))
  611. X        VidAdapter = VID_EGA;
  612. X    else if (_setvideomode(_HRESBW))
  613. X        ;
  614. X    else
  615. X    VidAdapter = VID_NONE;
  616. X#endif    /* __MSC__ */
  617. X
  618. X#if    __POWERC__
  619. X    if (setvmode(17) == 17)
  620. X        VidAdapter = VID_VGA;
  621. X    else if (setvmode(15) == 15)
  622. X        VidAdapter = VID_EGA;
  623. X    else if (setvmode(6) == 6)
  624. X        VidAdapter = VID_CGA;
  625. X    else if (setvmode(99) == 99)
  626. X        VidAdapter = VID_HGC;
  627. X#endif    /* __POWERC__ */
  628. X
  629. X    /* This is also a last minute addition that needs to
  630. X     * be cleaned up - again, next release.
  631. X     */
  632. X    for (++argv; *argv; ++argv)
  633. X    {
  634. X    char    *card;
  635. X
  636. X    if (**argv == '-')
  637. X        switch ((*argv)[1])
  638. X        {
  639. X        case 'c':    /* card */
  640. X            card = *argv + 2;
  641. X            if (strcmp(card, "vga") == 0)
  642. X                VidAdapter = VID_VGA;
  643. X            else if (strcmp(card, "ega") == 0)
  644. X                VidAdapter = VID_EGA;
  645. X            else if (strcmp(card, "cga") == 0)
  646. X                VidAdapter = VID_CGA;
  647. X            else if (strcmp(card, "hgc") == 0)
  648. X                VidAdapter = VID_HGC;
  649. X            else if (strcmp(card, "lib") == 0)
  650. X                VidAdapter = VID_LIB;
  651. X        }
  652. X    }
  653. X
  654. X    if (VidAdapter == VID_NONE)
  655. X    {
  656. X    vid_setmode(VidInitMode);
  657. X    sprintf(ErrBuf,    "No graphics hardware detected");
  658. X    error(ERR_WARN);
  659. X    return;
  660. X    }
  661. X
  662. X    switch (VidAdapter)
  663. X    {
  664. X    case VID_LIB:
  665. X        return;
  666. X
  667. X    case VID_VGA:
  668. X        vid_setpalette(PAL_SAVE);
  669. X        vid_setpalette(PAL_SETLIN);/**/
  670. X        vid_vgapalette(PAL_SAVE);
  671. X            break;
  672. X
  673. X    case VID_EGA:
  674. X        vid_setpalette(PAL_SAVE);
  675. X        break;
  676. X
  677. X    case VID_CGA:
  678. X        break;
  679. X    }
  680. X
  681. X    vid_setmode(VidInitMode);
  682. X
  683. X    VidDriver = &VidDrivers[VidAdapter];
  684. X    if (Xsize > VidDriver->xsize)
  685. X    Xsize = VidDriver->xsize;
  686. X    if (Ysize > VidDriver->ysize)
  687. X    Ysize = VidDriver->ysize;
  688. X    vid_xbytes = VidDriver->xsize / VidDriver->PixelsPerByte;
  689. X    vid_yoff = (VidDriver->ysize - Ysize) / 2;
  690. X    vid_xoff_bytes =
  691. X        ((VidDriver->xsize - Xsize) / 2) / VidDriver->PixelsPerByte;
  692. X    ScreenMem = MK_FP(VidDriver->ScreenMem, 0);
  693. X}
  694. X
  695. Xvoid
  696. Xdisp_finish()            /* called from main prior to exit. */
  697. X{
  698. X#if    __TURBOC__
  699. X    if (VidAdapter == VID_LIB)
  700. X    closegraph();
  701. X#endif    /* __TURBOC__ */
  702. X}
  703. X
  704. X/*
  705. X *    Set up Hercules Graphics Card 720 * 348 graphics mode
  706. X */
  707. Xstatic void
  708. Xvid_sethgc()
  709. X{
  710. X    unsigned short    ModeControl = 0x03b8;
  711. X    unsigned short    CrtcAddress = 0x03b4;
  712. X    unsigned short    CrtcData = CrtcAddress + 1;
  713. X
  714. X    outportb(HGC_SWITCH, 0x01);        /* allow graphics mode */
  715. X    outportb(ModeControl, 0x00);    /* Video disabled during setup */
  716. X
  717. X    /* Horizontal total: 54 "characters" (at 16 pixels/char) */
  718. X    outportb(CrtcAddress, 0x00);
  719. X    outportb(CrtcData, 0x35);
  720. X    /* Horizontal displayed: 45 "characters" */
  721. X    outportb(CrtcAddress, 0x01);
  722. X    outportb(CrtcData, 0x2d);
  723. X    /* Horizontal sync position: at 45th character */
  724. X    outportb(CrtcAddress, 0x02);
  725. X    outportb(CrtcData, 0x2e);
  726. X    /* Horizontal sync width: 7 character clocks */
  727. X    outportb(CrtcAddress, 0x03);
  728. X    outportb(CrtcData, 0x07);
  729. X    /* Vertical total: 94 "characters" (at 4 scanlines/char) */
  730. X    outportb(CrtcAddress, 0x04);
  731. X    outportb(CrtcData, 0x5b);
  732. X    /* Vertical adjust: 2 scanlines */
  733. X    outportb(CrtcAddress, 0x05);
  734. X    outportb(CrtcData, 0x02);
  735. X    /* Vertical displayed: 87 "character" rows */
  736. X    outportb(CrtcAddress, 0x06);
  737. X    outportb(CrtcData, 0x57);
  738. X    /* Vertical sync position: after 87th char row */
  739. X    outportb(CrtcAddress, 0x07);
  740. X    outportb(CrtcData, 0x57);
  741. X    /* Max scan line: 4 lines/char */
  742. X    outportb(CrtcAddress, 0x09);
  743. X    outportb(CrtcData, 0x03);
  744. X
  745. X    *VidModeBiosAddr = 6;    /* Microsoft mouse: HGC using CRT page 0 */
  746. X
  747. X    outportb(ModeControl, 0x0a);    /* Video enabled, Graphics mode */
  748. X}
  749. X
  750. Xvoid
  751. Xdisp_imgstart()            /* called prior to drawing an image. */
  752. X{
  753. X    if (VidAdapter == VID_NONE)
  754. X    return;
  755. X
  756. X    if (VidAdapter == VID_LIB)
  757. X    {
  758. X#if __TURBOC__
  759. X    setgraphmode(tc_mode);
  760. X#endif    /* __TURBOC__ */
  761. X    return;
  762. X    }
  763. X
  764. X    if (VidAdapter <= VID_STD)
  765. X    vid_setmode(VidDriver->bios_mode);
  766. X    else
  767. X    *VidModeBiosAddr = VidDriver->bios_mode;    /* fake it */
  768. X
  769. X    switch (VidAdapter)
  770. X    {
  771. X    case VID_VGA:
  772. X        vid_vgapalette(PAL_SETGREY);
  773. X        break;
  774. X
  775. X    case VID_EGA:
  776. X        vid_setpalette(PAL_SETGREY);
  777. X        break;
  778. X
  779. X    case VID_HGC:
  780. X        vid_sethgc();
  781. X        break;
  782. X    }
  783. X}
  784. X
  785. Xvoid
  786. Xdisp_imgend()            /* called after drawing an image. */
  787. X{
  788. X    (void) getch();
  789. X
  790. X    switch (VidAdapter)
  791. X    {
  792. X    case VID_VGA:
  793. X        vid_vgapalette(PAL_RESTORE);
  794. X        vid_setpalette(PAL_RESTORE);
  795. X        break;
  796. X
  797. X    case VID_EGA:
  798. X        vid_setpalette(PAL_RESTORE);
  799. X        break;
  800. X    }
  801. X
  802. X    vid_setmode(VidInitMode);
  803. X}
  804. X
  805. Xvoid
  806. Xdisp_putline(line, y)        /* called to draw image scanline y. */
  807. Xpixel_t *line;
  808. Xint y;
  809. X{
  810. X    register int        x;
  811. X    register unsigned char far    *p;
  812. X
  813. X    if (VidAdapter == VID_NONE)
  814. X    return;
  815. X
  816. X    if (VidAdapter == VID_LIB)
  817. X    {
  818. X    for (x = 0; x < Xsize; ++x)
  819. X    {
  820. X        pixel_t    val;
  821. X
  822. X        val = *line++ < thresh[y % BITSPERPIXEL][x % BITSPERPIXEL] ?
  823. X            (pixel_t) 0 : (pixel_t) 1;
  824. X#if __TURBOC__
  825. X        putpixel(x, y, val);
  826. X#endif    /* __TURBOC__ */
  827. X#if __MSC__
  828. X        _setcolor(val);
  829. X        _setpixel(x, y);
  830. X#endif    /* __MSC__ */
  831. X#if __POWERC__
  832. X        pen_color(val);
  833. X        setpixel(x, y);
  834. X#endif    /* __POWERC__ */
  835. X    }
  836. X    return;
  837. X    }
  838. X
  839. X    p = &ScreenMem[
  840. X            (
  841. X                ((y + vid_yoff) % VidDriver->interlace)
  842. X                *
  843. X                VidDriver->interlace_offset
  844. X            )
  845. X            +
  846. X            (y + vid_yoff) / VidDriver->interlace * vid_xbytes
  847. X            /*
  848. X            +
  849. X            vid_xoff_bytes
  850. X            */
  851. X        ];
  852. X
  853. X    switch (VidAdapter)
  854. X    {
  855. X    case VID_VGA:
  856. X        for (x = 0; x < Xsize; ++x)
  857. X        *p++ = *line++;
  858. X        break;
  859. X
  860. X    case VID_EGA:
  861. X        /* 4 grey levels isn't enough - need to do dithering as well,
  862. X         * or perhaps fake it with some colours.
  863. X         */
  864. X        for (x = 0; x < Xsize; ++x)
  865. X        vid_setpixel(x, y, *line++ / 64);
  866. X        break;
  867. X
  868. X    case VID_CGA:
  869. X        for (x = 0; x < Xsize;)
  870. X        {
  871. X        register unsigned char    t;
  872. X        register unsigned char    val;
  873. X        register unsigned char    byte;
  874. X        register int        pixel;
  875. X
  876. X        byte = 0;
  877. X        for (pixel = 8; pixel > 0; ++x)
  878. X        {
  879. X            t = thresh[y % BITSPERPIXEL][x % BITSPERPIXEL];
  880. X            val = *line++;
  881. X            byte |= (val > t * 2 / 3 ? 1 : 0) << --pixel;
  882. X            byte |= (val > (t * 2 + Zsize) / 3 ? 1 : 0) << --pixel;
  883. X        }
  884. X        *p++ = byte;
  885. X        }
  886. X        break;
  887. X
  888. X    case VID_HGC:
  889. X        for (x = 0; x < Xsize;)
  890. X        {
  891. X        register char    t;
  892. X        register unsigned char    byte;
  893. X        register int        pixel;
  894. X
  895. X        byte = 0;
  896. X        for (pixel = 8; pixel > 0; ++x)
  897. X        {
  898. X            t = *line++ < thresh[y % BITSPERPIXEL][x % BITSPERPIXEL] ?
  899. X            (pixel_t) 0 : (pixel_t) 1;
  900. X            byte |= t << --pixel;
  901. X        }
  902. X        *p++ = byte;
  903. X        }
  904. X        break;
  905. X    }
  906. X}
  907. X
  908. Xint
  909. Xdisp_getchar()            /* get next user typed character. */
  910. X{
  911. X    return(getchar());
  912. X}
  913. X
  914. X
  915. X/*ARGSUSED*/
  916. Xvoid
  917. Xdisp_ungetc(c)            /* put back the last character typed. */
  918. Xint c;
  919. X{
  920. X    UNGETC(c, stdin);
  921. X}
  922. X
  923. Xint
  924. Xdisp_prompt()            /* display popi prompt. */
  925. X{
  926. X    char    *prompt = "-> ";
  927. X
  928. X    PRINTF(prompt);
  929. X    return sizeof prompt - 1;
  930. X}
  931. X
  932. Xvoid
  933. Xdisp_error(errtype, pos)    /* display error message. */
  934. Xint    errtype,
  935. X    pos;
  936. X{
  937. X    extern int    errno;
  938. X    extern char    *sys_errlist[];
  939. X
  940. X    if (errtype    & ERR_PARSE)
  941. X    {
  942. X    int    i;
  943. X
  944. X    for (i=1; i < pos; ++i)
  945. X        PUTC('-', stderr);
  946. X    PUTC('^', stderr);
  947. X    PUTC('\n', stderr);
  948. X    }
  949. X
  950. X    FPRINTF(stderr, "%s\n", ErrBuf);
  951. X    /* we assume errno hasn't been reset by the    preceding output */
  952. X    if (errtype    & ERR_SYS)
  953. X    FPRINTF(stderr,    "\t(%s)\n", sys_errlist[errno]);
  954. X}
  955. X
  956. Xvoid
  957. Xdisp_percentdone(percent)
  958. Xint    percent;
  959. X{
  960. X    static int    lastpercent = 100;
  961. X
  962. X    if (!Verbose)
  963. X    return;
  964. X    if (percent    == 100)
  965. X    {
  966. X    printf("\r    \n");
  967. X    return;
  968. X    }
  969. X    if (percent    != lastpercent)
  970. X    {
  971. X    printf("\r%2d%%    ", percent);
  972. X    fflush(stdout);
  973. X    lastpercent = percent;
  974. X    }
  975. X}
  976. Funky_Stuff
  977. chmod 0444 ibmpc.c || echo "restore of ibmpc.c fails"
  978. set `wc -c ibmpc.c`;Sum=$1
  979. if test "$Sum" != "20056"
  980. then echo original size 20056, current size $Sum;fi
  981. echo "x - extracting io.c (Text)"
  982. sed 's/^X//' << 'Funky_Stuff' > io.c &&
  983. X/*  @(#)io.c 1.8 89/12/11
  984. X *
  985. X *  File handling routines used by the popi program.
  986. X *
  987. X *  Popi was originally written by Gerard J. Holzmann - AT&T Bell Labs.
  988. X *  This version is based on the code in his Prentice Hall book,
  989. X *  "Beyond Photography - the digital darkroom," ISBN 0-13-074410-7,
  990. X *  which is copyright (c) 1988 by Bell Telephone Laboratories, Inc. 
  991. X *
  992. X *  Permission is given to distribute these extensions, as long as these
  993. X *  introductory messages are not removed, and no monies are exchanged.
  994. X *
  995. X *  No responsibility is taken for any errors or inaccuracies inherent
  996. X *  either to the comments or the code of this program, but if reported
  997. X *  (see README file) then an attempt will be made to fix them.
  998. X */
  999. X
  1000. X
  1001. X#include <stdio.h>
  1002. X#include <errno.h>
  1003. X#include <ctype.h>
  1004. X#include "popi.h"
  1005. X
  1006. X#if unix || AMIGA
  1007. X#define RMODE    "r"
  1008. X#define WMODE    "w"
  1009. X#else    /* ! (unix || AMIGA) */
  1010. X#define RMODE    "rb"
  1011. X#define WMODE    "wb"
  1012. X#endif    /* unix || AMIGA */
  1013. X
  1014. Xint        nsrc = 2;
  1015. Xstatic int    IsPopen = 0;
  1016. X
  1017. Xpixel_t **
  1018. XImgAlloc()
  1019. X{
  1020. X    int            y;
  1021. X    pixel_t        **p;
  1022. X
  1023. X    noerr = 1;
  1024. X    if ((p = (pixel_t **) LINT_CAST(Emalloc((unsigned)Xsize * sizeof(pixel_t *)))) == 0)
  1025. X    return (pixel_t **) 0;
  1026. X
  1027. X    for (y = 0; y < Ysize; ++y)
  1028. X    p[y] = (pixel_t *) Emalloc((unsigned)Xsize * sizeof (pixel_t));
  1029. X
  1030. X    if (noerr == 0)
  1031. X    {
  1032. X    /* Run out of memory; free what we have allocated */
  1033. X    for (y = 0; y < Ysize; ++y)
  1034. X    {
  1035. X        if (p[y])
  1036. X        free((char *) p[y]);
  1037. X    }
  1038. X    return (pixel_t **) 0;
  1039. X    }
  1040. X
  1041. X    return p;
  1042. X}
  1043. X
  1044. Xvoid
  1045. XImgFree(img)
  1046. Xstruct SRC    *img;
  1047. X{
  1048. X    int            y;
  1049. X    pixel_t        **p;
  1050. X
  1051. X    free(img->str);
  1052. X    img->str = (char *) 0;
  1053. X
  1054. X    p = img->pix;
  1055. X
  1056. X    for (y = 0; y < Ysize; ++y)
  1057. X    free((char *) (*p++));
  1058. X
  1059. X    free((char *) img->pix);
  1060. X    img->pix = (pixel_t **) 0;
  1061. X}
  1062. X
  1063. Xvoid
  1064. XEfclose(stream)
  1065. XFILE    *stream;
  1066. X{
  1067. X#if    unix
  1068. X    if (IsPopen)
  1069. X    PCLOSE(stream);
  1070. X    else
  1071. X#endif    /* unix */
  1072. X    FCLOSE(stream);
  1073. X}
  1074. X
  1075. XFILE *
  1076. XEfopenR(filename)
  1077. Xchar *filename;
  1078. X{
  1079. X    FILE    *istr;
  1080. X#if unix
  1081. X    FILE    *popen();
  1082. X#endif /* unix */
  1083. X
  1084. X    DEBUG((Debug, "EfopenR(%s)\n", filename));
  1085. X    IsPopen = 0;
  1086. X    if ((istr = fopen(filename, RMODE)) != NULL)
  1087. X    return istr;
  1088. X
  1089. X#if    unix
  1090. X    if (errno == ENOENT)
  1091. X    {
  1092. X    char buf[512];
  1093. X
  1094. X    /* first see if the compressed file exists and is readable */
  1095. X    SPRINTF(buf, "%s.Z", filename);
  1096. X    if ((istr = fopen(buf, "r")) != NULL)
  1097. X    {
  1098. X        /* OK - it's there */
  1099. X        FCLOSE(istr);
  1100. X        SPRINTF(buf, "zcat %s", filename);
  1101. X        DEBUG((Debug, "popen(%s)\n", buf));
  1102. X        if ((istr = popen(buf, "r")) != NULL)
  1103. X        {
  1104. X        IsPopen = 1;
  1105. X        return istr;
  1106. X        }
  1107. X    }
  1108. X    }
  1109. X#endif    /* unix */
  1110. X
  1111. X    SPRINTF(ErrBuf, "Can't read file '%s'", filename);
  1112. X    error(ERR_SYS);
  1113. X    return NULL;
  1114. X}
  1115. X
  1116. XFILE *
  1117. XEfopenW(filename)
  1118. Xchar    *filename;
  1119. X{
  1120. X    FILE    *ostr;
  1121. X    FILE    *popen();
  1122. X
  1123. X    DEBUG((Debug, "EfopenW(%s)\n", filename));
  1124. X    IsPopen = 0;
  1125. X
  1126. X#if    unix
  1127. X    if (*filename == '|')
  1128. X    {
  1129. X    ++filename;
  1130. X
  1131. X    if ((ostr = popen(filename, "w")) == NULL)
  1132. X    {
  1133. X        SPRINTF(ErrBuf, "Can't run command '%s'", filename);
  1134. X        error(ERR_SYS);
  1135. X    }
  1136. X    return ostr;
  1137. X    }
  1138. X#endif    /* unix */
  1139. X
  1140. X    if ((ostr = fopen(filename, WMODE)) == NULL)
  1141. X    {
  1142. X    SPRINTF(ErrBuf, "Can't write file '%s'", filename);
  1143. X    error(ERR_SYS);
  1144. X    }
  1145. X    return ostr;
  1146. X}
  1147. X
  1148. X
  1149. Xvoid
  1150. Xgetpix(filename, imgname)
  1151. Xchar    *filename;            /* file name */
  1152. Xchar    *imgname;            /* image name */
  1153. X{
  1154. X    FILE    *fd;
  1155. X    int        y,
  1156. X        c;
  1157. X    struct SRC    *img = (struct SRC *) 0;    /* work buffer */
  1158. X    char    *p,
  1159. X        *rem;
  1160. X
  1161. X    if ((fd = EfopenR(filename)) == NULL)
  1162. X        return;
  1163. X
  1164. X    if (imgname == 0 || *imgname == '\0')
  1165. X    {
  1166. X    imgname = filename;
  1167. X
  1168. X    /*
  1169. X     * Use the basename of the filename for the image name.
  1170. X     * If this results in a non-valid image name, they'll
  1171. X     * just have to use the $n equivalent. It's not our
  1172. X     * business to go transforming names.
  1173. X     */
  1174. X
  1175. X    /* find last '/' in string */
  1176. X    for (p = rem = imgname; *p; ++p)
  1177. X        if (*p == '/' && p[1] != '\0')
  1178. X        rem = p + 1;
  1179. X
  1180. X    imgname = rem;
  1181. X    }
  1182. X
  1183. X    /* See if the named image already exists */
  1184. X    for (c = 0; c < nsrc; c++)
  1185. X    if (src[c].str && strcmp(src[c].str, imgname) == 0)
  1186. X    {
  1187. X        img = &src[c];
  1188. X        break;
  1189. X    }
  1190. X
  1191. X    if (img == (struct SRC *) 0)
  1192. X    {
  1193. X    /* Allocate a new image */
  1194. X        img = &src[nsrc++];
  1195. X
  1196. X    if
  1197. X    (
  1198. X        (img->pix = ImgAlloc()) == 0
  1199. X        ||
  1200. X        (img->str = (char *) Emalloc((unsigned int) (strlen(imgname)+1))) == 0
  1201. X    )
  1202. X        return;
  1203. X
  1204. X    STRCPY(img->str, imgname);
  1205. X    }
  1206. X
  1207. X    /* Read in the image */
  1208. X    for (y = 0; y < Ysize; y++)
  1209. X    {
  1210. X    long    total = 0;
  1211. X    int    count;
  1212. X
  1213. X    if ((count = fread((char *) img->pix[y], 1, Xsize, fd)) <= 0)
  1214. X    {
  1215. X        if (ferror(fd))
  1216. X        {
  1217. X        SPRINTF(ErrBuf,
  1218. X            "File '%s' read error (read %ld of %ld bytes)",
  1219. X            filename, total, (long)Xsize * Ysize);
  1220. X        error(ERR_SYS);
  1221. X        FCLOSE(fd);
  1222. X        return;
  1223. X        }
  1224. X
  1225. X        SPRINTF(ErrBuf,
  1226. X        "File '%s' insufficient data (read %ld of %ld bytes)",
  1227. X        filename, total, Xsize * Ysize);
  1228. X        error(0);
  1229. X        return;
  1230. X    }
  1231. X
  1232. X    total += count;
  1233. X    }
  1234. X
  1235. X
  1236. X    Efclose(fd);
  1237. X}
  1238. X
  1239. Xvoid
  1240. Xputpix(into, str)
  1241. Xstruct SRC *into ;       /* work buffer */
  1242. Xchar *str ;              /* file name */
  1243. X{
  1244. X    FILE *fd;
  1245. X    int i;
  1246. X
  1247. X    if ((fd = EfopenW(str)) == NULL)
  1248. X    return;
  1249. X
  1250. X    for (i = 0; i < Ysize; i++)
  1251. X    FWRITE((char *) into->pix[i], 1, Xsize, fd);
  1252. X
  1253. X    Efclose(fd);
  1254. X}
  1255. X
  1256. X
  1257. Xvoid
  1258. Xshowfiles()
  1259. X{
  1260. X    int n;
  1261. X
  1262. X    for (n = 2; n < nsrc; n++)
  1263. X    if(src[n].str)
  1264. X    {
  1265. X        PRINTF("$%d = %s\n", n - 1, src[n].str);
  1266. X        if (LogStr)
  1267. X        FPRINTF(LogStr, "$%d = %s\n", n - 1, src[n].str);
  1268. X    }
  1269. X}
  1270. Funky_Stuff
  1271. chmod 0444 io.c || echo "restore of io.c fails"
  1272. set `wc -c io.c`;Sum=$1
  1273. if test "$Sum" != "5312"
  1274. then echo original size 5312, current size $Sum;fi
  1275. echo "x - extracting kerterm.c (Text)"
  1276. sed 's/^X//' << 'Funky_Stuff' > kerterm.c &&
  1277. X/*LINTLIBRARY*/
  1278. X
  1279. X/*  @(#)kerterm.c 1.2 89/12/11
  1280. X *
  1281. X *  Popi graphics driver for kermit TERM windows.
  1282. X *  written by Frank Crawford - Q.H.Tours.
  1283. X *
  1284. X *  Popi was originally written by Gerard J. Holzmann - AT&T Bell Labs.
  1285. X *  This version is based on the code in his Prentice Hall book,
  1286. X *  "Beyond Photography - the digital darkroom," ISBN 0-13-074410-7,
  1287. X *  which is copyright (c) 1988 by Bell Telephone Laboratories, Inc. 
  1288. X *
  1289. X *  Permission is given to distribute these extensions, as long as these
  1290. X *  introductory messages are not removed, and no monies are exchanged.
  1291. X *
  1292. X *  No responsibility is taken for any errors or inaccuracies inherent
  1293. X *  either to the comments or the code of this program, but if reported
  1294. X *  (see README file) then an attempt will be made to fix them.
  1295. X */
  1296. X
  1297. X
  1298. X#include <stdio.h>
  1299. X#include <signal.h>
  1300. X#include <sys/types.h>
  1301. X#include "popi.h"
  1302. X
  1303. X#define  KER_MAX_X  1023    /* Maximum Kermit X value */
  1304. X#define  KER_MAX_Y  779     /* Maximum Kermit Y value */
  1305. X#define  PC_MAX_X   640     /* Number of PC X value (EGA Card) */
  1306. X#define  PC_MAX_Y   350     /* Number of PC Y value (EGA Card) */
  1307. X#define  MAX_GREY   2       /* Max. Greyscale value (Black, Low-int, Hi-int) */
  1308. X
  1309. Xint thresh[MAX_GREY][BITSPERPIXEL][BITSPERPIXEL] =
  1310. X{
  1311. X    {        /* Array containing threshold values for low value. */
  1312. X      {   0,  64,  16,  80,   4,  68,  20,  84, },
  1313. X      {  96,  32, 112,  48, 100,  36, 116,  52, },
  1314. X      {  24,  88,   8,  72,  28,  92,  12,  76, },
  1315. X      { 120,  56, 104,  40, 124,  60, 108,  44, },
  1316. X      {   6,  70,  22,  86,   2,  66,  18,  82, },
  1317. X      { 102,  38, 118,  54,  98,  34, 114,  50, },
  1318. X      {  30,  94,  14,  78,  26,  90,  10,  74, },
  1319. X      { 126,  62, 110,  46, 122,  58, 106,  42, },
  1320. X    },
  1321. X    {        /* Array containing threshold values for high value. */
  1322. X      { 128, 192, 144, 208, 132, 196, 148, 212, },
  1323. X      { 224, 160, 240, 176, 228, 164, 244, 180, },
  1324. X      { 152, 216, 136, 200, 156, 220, 140, 204, },
  1325. X      { 248, 184, 232, 168, 252, 188, 236, 172, },
  1326. X      { 134, 198, 150, 214, 130, 194, 146, 210, },
  1327. X      { 230, 166, 246, 182, 226, 162, 242, 178, },
  1328. X      { 158, 222, 142, 206, 154, 218, 138, 202, },
  1329. X      { 254, 190, 238, 174, 250, 186, 234, 170, },
  1330. X    },
  1331. X};
  1332. X
  1333. X/*  There are ten exportable routines used by the popi program.
  1334. X *
  1335. X *  These are:
  1336. X *
  1337. X *  disp_init(argc, argv)    - called from main at the start.
  1338. X *  disp_finish()            - called from main prior to exit.
  1339. X *  disp_imgstart()          - called prior to drawing an image.
  1340. X *  disp_imgend()            - called after drawing an image.
  1341. X *  disp_putline(line, y)    - to draw an image scanline.
  1342. X *  disp_getchar()           - to get the next character typed.
  1343. X *  disp_ungetc(c)           - put back the last character typed.
  1344. X *  disp_prompt()            - display popi prompt and clear input buffer.
  1345. X *  disp_error(errtype)      - display error message.
  1346. X *  disp_percentdone(n)      - display percentage value of conversion.
  1347. X */
  1348. X
  1349. X/*ARGSUSED*/
  1350. Xvoid
  1351. Xdisp_init(argc,argv)
  1352. Xint argc;
  1353. Xchar *argv[];
  1354. X{
  1355. X}
  1356. X
  1357. Xvoid
  1358. Xdisp_finish()
  1359. X{
  1360. X}
  1361. X
  1362. Xvoid
  1363. Xdisp_intr(signal)
  1364. Xint signal;
  1365. X{
  1366. X    disp_imgend();
  1367. X    exit(signal);
  1368. X}
  1369. X
  1370. Xvoid
  1371. Xdisp_imgstart()
  1372. X{
  1373. X    (void) signal(SIGINT, disp_intr);
  1374. X    putchar('\033');
  1375. X    putchar('\f');
  1376. X}
  1377. X
  1378. Xvoid
  1379. Xdisp_imgend()
  1380. X{
  1381. X    char ch;
  1382. X
  1383. X    putchar('\033');
  1384. X    putchar('[');
  1385. X    putchar('0');
  1386. X    putchar('m');
  1387. X    PRINTF("\037\n\n\007Hit return when ready:");
  1388. X    fflush(stdout);
  1389. X    while (read(1, &ch, 1) == 1 && ch != '\n')    /* Because of inconsistent use */
  1390. X    ;
  1391. X    putchar('\033');
  1392. X    putchar('[');
  1393. X    putchar('?');
  1394. X    putchar('3');
  1395. X    putchar('8');
  1396. X    putchar('l');
  1397. X    fflush(stdout);
  1398. X    (void) signal(SIGINT, SIG_DFL);
  1399. X}
  1400. X
  1401. Xstatic void
  1402. Xcoord(x, y, repeat)
  1403. Xint x, y;
  1404. Xint repeat;
  1405. X{
  1406. X    /*
  1407. X     * This function goes to a lot of effort to optimes the number of
  1408. X     * characters sent down the line.
  1409. X     */
  1410. X    int hi_x, lo_x, hi_y, lo_y;
  1411. X    static int sav_x = -1, sav_y = -1;
  1412. X
  1413. X    y = KER_MAX_Y - y;    /* To invert picture */
  1414. X    hi_x = (x / 32);
  1415. X    lo_x = (x % 32);
  1416. X    hi_y = (y / 32);
  1417. X    lo_y = (y % 32);
  1418. X    if (!repeat || y != sav_y)
  1419. X    {
  1420. X    putchar(hi_y + 0x20);
  1421. X    putchar(lo_y + 0x60);
  1422. X    putchar(hi_x + 0x20);
  1423. X    }
  1424. X    else if (hi_x != (sav_x / 32))
  1425. X    {
  1426. X    putchar(lo_y + 0x60);
  1427. X    putchar(hi_x + 0x20);
  1428. X    }
  1429. X    putchar(lo_x + 0x40);
  1430. X    sav_x = x;
  1431. X    sav_y = y;
  1432. X}
  1433. X
  1434. Xvoid
  1435. Xdisp_putline(line,y)                     /* Output scanline y. */
  1436. Xpixel_t *line;
  1437. Xint y;
  1438. X{
  1439. X    int x;
  1440. X    int real_x, real_y;
  1441. X    int repeat, level;
  1442. X    static old_level = 0;
  1443. X
  1444. X    repeat = 0;
  1445. X    /*
  1446. X     * Calculate the real pixel location to handle the grey-scale threshold
  1447. X     * values.
  1448. X     */
  1449. X    real_y = (y * PC_MAX_Y) / (KER_MAX_Y + 1);
  1450. X    putchar('\034');
  1451. X    for (x = 0; x < Xsize; x++, line++)
  1452. X    {
  1453. X      /* See above */
  1454. X      real_x = (x * PC_MAX_X) / (KER_MAX_X + 1);
  1455. X      for (level = 0; level < MAX_GREY; level++)
  1456. X          if (*line < thresh[level][real_y % BITSPERPIXEL][real_x % BITSPERPIXEL])
  1457. X              break;
  1458. X    if (level != old_level)
  1459. X    {
  1460. X        if (level != 0)
  1461. X        {
  1462. X        putchar('\033');
  1463. X        putchar('[');
  1464. X        putchar((level == 1) ? '0' : '1');
  1465. X        putchar('m');
  1466. X        }
  1467. X        old_level = level;
  1468. X    }
  1469. X    if (level != 0)
  1470. X        coord(x, y, repeat++);
  1471. X    }
  1472. X    putchar('\n');
  1473. X}
  1474. X
  1475. X
  1476. Xdisp_getchar()          /* Get next user typed character. */
  1477. X{
  1478. X    return(getchar());
  1479. X}
  1480. X
  1481. X
  1482. Xvoid
  1483. Xdisp_ungetc(c)         /* Put back the last character typed. */
  1484. Xchar c ;
  1485. X{
  1486. X    UNGETC(c, stdin);
  1487. X}
  1488. X
  1489. X
  1490. X
  1491. Xdisp_prompt()         /* Display popi prompt and clear input line. */
  1492. X{
  1493. X    PRINTF("-> ");
  1494. X    return 3;
  1495. X}
  1496. X
  1497. X
  1498. Xvoid
  1499. Xdisp_error(errtype, pos)         /* Display error message. */
  1500. Xint errtype, pos ;
  1501. X{
  1502. X    extern int  errno;
  1503. X    extern char *sys_errlist[];
  1504. X
  1505. X    if (errtype & ERR_PARSE)
  1506. X    {
  1507. X        int     i;
  1508. X        for (i=1; i < pos; ++i)
  1509. X            PUTC('-', stderr);
  1510. X        PUTC('^', stderr);
  1511. X        PUTC('\n', stderr);
  1512. X    }
  1513. X    FPRINTF(stderr, "%s\n", ErrBuf);
  1514. X    /* we assume errno hasn't been reset by the preceding output */
  1515. X    if (errtype & ERR_SYS)
  1516. X        FPRINTF(stderr, "\t(%s)\n", sys_errlist[errno]);
  1517. X}
  1518. X
  1519. Xvoid
  1520. Xdisp_percentdone(percent)
  1521. Xint    percent;
  1522. X{
  1523. X    static int    lastpercent = 100;
  1524. X
  1525. X    if (!Verbose)
  1526. X    return;
  1527. X    if (percent == 100)
  1528. X    {
  1529. X    printf("\r    \n");
  1530. X    return;
  1531. X    }
  1532. X    if (percent != lastpercent && percent % 5 == 0)
  1533. X    {
  1534. X    printf("\r%2d%% ", percent);
  1535. X    fflush(stdout);
  1536. X    lastpercent = percent;
  1537. X    }
  1538. X}
  1539. Funky_Stuff
  1540. chmod 0444 kerterm.c || echo "restore of kerterm.c fails"
  1541. set `wc -c kerterm.c`;Sum=$1
  1542. if test "$Sum" != "6329"
  1543. then echo original size 6329, current size $Sum;fi
  1544. echo "x - extracting main.c (Text)"
  1545. sed 's/^X//' << 'Funky_Stuff' > main.c &&
  1546. X/*  @(#)main.c 1.11 89/12/12
  1547. X *
  1548. X *  Main routine and declarations used by the popi program.
  1549. X *
  1550. X *  Popi was originally written by Gerard J. Holzmann - AT&T Bell Labs.
  1551. X *  This version is based on the code in his Prentice Hall book,
  1552. X *  "Beyond Photography - the digital darkroom," ISBN 0-13-074410-7,
  1553. X *  which is copyright (c) 1988 by Bell Telephone Laboratories, Inc. 
  1554. X *
  1555. X *  Permission is given to distribute these extensions, as long as these
  1556. X *  introductory messages are not removed, and no monies are exchanged.
  1557. X *
  1558. X *  No responsibility is taken for any errors or inaccuracies inherent
  1559. X *  either to the comments or the code of this program, but if reported
  1560. X *  (see README file) then an attempt will be made to fix them.
  1561. X */
  1562. X
  1563. X
  1564. X#include <stdio.h>
  1565. X#include <ctype.h>
  1566. X#include "popi.h"
  1567. X#include "patchlevel.h"
  1568. X
  1569. X/* prototypes for local functions */
  1570. X
  1571. Xbool    do_parse P((void));
  1572. Xvoid    get_options P((char **));
  1573. Xvoid    Usage P((int));
  1574. Xint    main P((int, char **));
  1575. X
  1576. Xstruct SRC
  1577. X    src[MAXIMG];        /* array of images */
  1578. Xshort    CUROLD = 0;        /* index of "old" image */
  1579. Xshort    CURNEW = 1;        /* index of "new" image */
  1580. Xint    noerr = 1;
  1581. Xint    lexval;            /* value of numerical token */
  1582. Xint    Xsize = DEF_X,        /* image width */
  1583. X    Ysize = DEF_Y,        /* image height */
  1584. X    Zsize = DEF_ZSIZE;    /* no. brightness levels */
  1585. Xpixel_t    Zmax = DEF_ZSIZE - 1;    /* max brightness level */
  1586. Xchar    text[512];        /* value of string token */
  1587. Xchar    *ProgName,        /* program name (for err messages) */
  1588. X        *LogFile = "popi.log";  /* Name of log file */
  1589. XFILE    *Debug = NULL,        /* debugging output stream */
  1590. X        *LogStr = NULL;         /* logging output stream */
  1591. Xint    disp_active = 1,    /* so we can turn off the display */
  1592. X    Truncate = 0,        /* Truncate assignments instead of wrapping. */
  1593. X    Verbose = 0;        /* be chatty */
  1594. Xchar    geometry[MAXLINE];    /* X11 geometry information. */
  1595. Xchar    x11_display[MAXLINE];    /* X11 display information. */
  1596. Xint    iconic = 0;        /* Set if the window is in an iconic state. */
  1597. X
  1598. X#if       SEQPAR
  1599. Xint     ncpus = 1;              /* default is single-tasking */
  1600. X#endif /* SEQPAR */
  1601. X
  1602. Xstatic char *UsageMsg[] =
  1603. X{
  1604. X    "valid options:",
  1605. X    "\t-xWidth\t\tspecify image width (number pixels)",
  1606. X    "\t-yHeight\tspecify image height (number scanlines)",
  1607. X    "\t-a[+-]\t\tturn auto-display on or off",
  1608. X    "\t-r[+-]\t\tturn range checking on or off",
  1609. X    (char *) 0
  1610. X};
  1611. X
  1612. Xvoid
  1613. XPrStrs(msg)
  1614. Xchar    *msg[];
  1615. X{
  1616. X    char    **p;
  1617. X
  1618. X    p = msg;
  1619. X    for (p = msg; *p; ++p)
  1620. X    FPRINTF(stderr, "%s\n", *p);
  1621. X}
  1622. X
  1623. Xstatic void
  1624. XUsage(status)
  1625. Xint    status;
  1626. X{
  1627. X    FPRINTF(stderr, "Usage: %s [options] [image-files]\n", ProgName);
  1628. X    PrStrs(UsageMsg);
  1629. X    /* Also need a driver-specific usage message appended */
  1630. X    exit(status);
  1631. X}
  1632. X
  1633. Xvoid
  1634. Xversion()
  1635. X{
  1636. X    FPRINTF(stderr, "%s: version 2.1.%1d\n", ProgName, PATCHLEVEL);
  1637. X}
  1638. X
  1639. Xstatic void
  1640. Xget_options(argv)           /* read command line options. */
  1641. Xchar *argv[];
  1642. X{
  1643. X    for (ProgName = *argv++; *argv && **argv == '-'; ++argv)
  1644. X    {
  1645. X        switch (*++*argv)
  1646. X        {
  1647. X            case 'x':
  1648. X                Xsize = atoi(++*argv);
  1649. X                break;
  1650. X
  1651. X            case 'y':
  1652. X                Ysize = atoi(++*argv);
  1653. X                break;
  1654. X
  1655. X            case 'z':
  1656. X                Zsize = atoi(++*argv);
  1657. X                Zmax = (pixel_t) (Zsize - 1);
  1658. X                break;
  1659. X
  1660. X            case 'D':
  1661. X                if (*++*argv)
  1662. X                {
  1663. X                    if ((Debug = fopen(*argv, "w")) == NULL)
  1664. X                    {
  1665. X                        SPRINTF(ErrBuf,
  1666. X                            "Can't open debug file '%s' - using stderr",
  1667. X                            *argv);
  1668. X                        error(ERR_SYS);
  1669. X                        Debug = stderr;
  1670. X                    }
  1671. X                }    
  1672. X                else
  1673. X                    Debug = stderr;
  1674. X                setbuf(Debug, NULL);  /**/
  1675. X                break;
  1676. X
  1677. X            case 'l':   /* log all commands */
  1678. X              if (*++*argv)
  1679. X                  LogFile = *argv;
  1680. X              OpenLog();
  1681. X              break;
  1682. X
  1683. X            case 'p':   /* No. cpus to use in parallel */
  1684. X              /* Still recognise the option on other machines,
  1685. X               * so scripts can use this option portably.
  1686. X               */
  1687. X
  1688. X#if       SEQPAR
  1689. X              if (*++*argv)
  1690. X              {
  1691. X                  ncpus = atoi(*argv);
  1692. X                  if (ncpus >= cpus_online())
  1693. X                      ncpus = cpus_online() - 1;
  1694. X                  if (ncpus < 0)
  1695. X                      ncpus = 0;
  1696. X              }
  1697. X              else
  1698. X                  ncpus = cpus_online() - 1;
  1699. X#endif /* SEQPAR */
  1700. X
  1701. X              break;
  1702. X
  1703. X            case 'd':   /* x11 display information. */
  1704. X        ++argv;
  1705. X        STRCPY(x11_display,*argv);
  1706. X        break;
  1707. X
  1708. X        case 'g':   /* x11 geometry information. */
  1709. X        ++argv;
  1710. X        STRCPY(geometry,*argv);
  1711. X        break;
  1712. X
  1713. X        case 'i':   /* start window iconically. */
  1714. X        iconic = 1;
  1715. X        break;
  1716. X
  1717. X        case 'r':   /* range checking */
  1718. X                if (*++*argv == '-')
  1719. X                    RangeCheck = 0;
  1720. X                else
  1721. X                    RangeCheck = 1;
  1722. X                break;
  1723. X
  1724. X            case 'a':   /* auto-display */
  1725. X                if (*++*argv == '+')
  1726. X                    disp_active = 1;
  1727. X                else
  1728. X                    disp_active = 0;
  1729. X                break;
  1730. X
  1731. X        case 'v':    /* verbose */
  1732. X        if (*++*argv == '-')
  1733. X            Verbose = 0;
  1734. X        else
  1735. X            ++Verbose;
  1736. X        break;
  1737. X
  1738. X            case 'V':   /* print version number. */
  1739. X        version();
  1740. X        exit(0);
  1741. X        break;
  1742. X
  1743. X        case '?':    /* Print usage message */
  1744. X            Usage(0);
  1745. X        /* NOTREACHED */
  1746. X
  1747. X        /* Note: no error on default because drivers may
  1748. X         * interpret other options.
  1749. X         */
  1750. X        default:
  1751. X        --*argv;    /* reset for disp_init() */
  1752. X        }
  1753. X    }
  1754. X
  1755. X    src[CUROLD].pix = ImgAlloc();
  1756. X    src[CUROLD].str = "old";
  1757. X    src[CURNEW].pix = ImgAlloc();
  1758. X    src[CURNEW].str = "new";
  1759. X
  1760. X    for (; *argv; ++argv)
  1761. X        getpix(*argv, (char *) 0);
  1762. X}
  1763. X
  1764. X
  1765. X/*
  1766. X * Parse    = # special
  1767. X *        | '?'                help
  1768. X *        | 'q'                quit
  1769. X */
  1770. Xstatic bool
  1771. Xdo_parse()
  1772. X{
  1773. X    extern int lat ;     /* look ahead token */
  1774. X
  1775. X    /* display popi prompt and clear input line. Returns length of popi prompt. */
  1776. X    CharPos = disp_prompt();
  1777. X
  1778. X    if (LogStr)
  1779. X    {
  1780. X    FPRINTF(LogStr, "-> ");
  1781. X    FFLUSH(LogStr);
  1782. X    }
  1783. X
  1784. X    lex();
  1785. X
  1786. X    switch (lat)
  1787. X    {
  1788. X    case '#':
  1789. X        special();
  1790. X        break;
  1791. X
  1792. X    case '?':
  1793. X        help();
  1794. X        Skip();
  1795. X        break;
  1796. X
  1797. X    case 'q':
  1798. X        return FALSE;
  1799. X
  1800. X    case '\n':
  1801. X        break;
  1802. X
  1803. X    default:
  1804. X        transform();
  1805. X        if (noerr)
  1806. X        run();
  1807. X        break;
  1808. X    }
  1809. X    assert(lat == '\n');
  1810. X    return TRUE;
  1811. X}
  1812. X
  1813. X
  1814. X/*
  1815. X *    We deliberately don't exit on error here.
  1816. X *    The user may have some picture that has taken ages to develop.
  1817. X *    If we run out of memory, they have a chance to save the
  1818. X *    image and exit themselves, which they should do as soon
  1819. X *    as possible.
  1820. X */
  1821. X
  1822. Xchar *
  1823. XEmalloc(n)
  1824. Xunsigned int n;
  1825. X{
  1826. X    char    *try;
  1827. X    static unsigned long
  1828. X        TotalAllocated = 0L;
  1829. X
  1830. X    if ((try = malloc(n)) == NULL)
  1831. X    {
  1832. X    SPRINTF(ErrBuf,
  1833. X        "Allocate %u bytes failed (total malloc=%lx)",
  1834. X        n, TotalAllocated);
  1835. X    error(ERR_SYS);
  1836. X    }
  1837. X    TotalAllocated += n;
  1838. X    return try;
  1839. X}
  1840. X
  1841. Xmain(argc,argv)
  1842. Xint argc;
  1843. Xchar **argv;
  1844. X{
  1845. X    get_options(argv) ;          /* read the command line options. */
  1846. X    disp_init(argc, argv);
  1847. X
  1848. X#if       SEQPAR
  1849. X    m_set_procs(ncpus);
  1850. X#endif /* SEQPAR */
  1851. X
  1852. X    do
  1853. X    noerr = TRUE;
  1854. X    while (do_parse());
  1855. X
  1856. X    disp_finish();
  1857. X
  1858. X    /* Some compilers don't get the exit status right when
  1859. X     * you return from main()
  1860. X     */
  1861. X    exit(0);
  1862. X    return 0;    /* shut up warning messages from some compilers */
  1863. X}
  1864. Funky_Stuff
  1865. chmod 0444 main.c || echo "restore of main.c fails"
  1866. set `wc -c main.c`;Sum=$1
  1867. if test "$Sum" != "7419"
  1868. then echo original size 7419, current size $Sum;fi
  1869. echo "x - extracting mgr.c (Text)"
  1870. sed 's/^X//' << 'Funky_Stuff' > mgr.c &&
  1871. X/*LINTLIBRARY*/
  1872. X
  1873. X/*  @(#)mgr.c 1.8 89/12/11
  1874. X *
  1875. X *  MGR dependent graphics routines used by popi.
  1876. X *  written by Rich Burridge - Sun Microsystems.
  1877. X *
  1878. X *  Popi was originally written by Gerard J. Holzmann - AT&T Bell Labs.
  1879. X *  This version is based on the code in his Prentice Hall book,
  1880. X *  "Beyond Photography - the digital darkroom," ISBN 0-13-074410-7,
  1881. X *  which is copyright (c) 1988 by Bell Telephone Laboratories, Inc. 
  1882. X *
  1883. X *  Permission is given to distribute these extensions, as long as these
  1884. X *  introductory messages are not removed, and no monies are exchanged.
  1885. X *
  1886. X *  No responsibility is taken for any errors or inaccuracies inherent
  1887. X *  either to the comments or the code of this program, but if reported
  1888. X *  (see README file) then an attempt will be made to fix them.
  1889. X */
  1890. X
  1891. X#include "dump.h"
  1892. X#include "term.h"
  1893. X#include "popi.h"
  1894. X#include "graphics.h"
  1895. X#include <signal.h>
  1896. X#include <sys/types.h>
  1897. X#include <sys/time.h>
  1898. X
  1899. X#define  B_FONT       1    /* Font descriptors. */
  1900. X#define  N_FONT       2
  1901. X
  1902. X#define  ICONIC       0    /* States that the popi display can be in. */
  1903. X#define  OPEN         1
  1904. X
  1905. X#define  PR_ICON      1    /* Descriptor for closed icon image. */
  1906. X#define  PR_SCAN      2    /* Descriptor for current popi scan line. */
  1907. X
  1908. X#define  BOLD_FONT    "cour7x14b"
  1909. X#define  NORMAL_FONT  "cour7x14r"
  1910. X
  1911. X#define  ICONHEIGHT   64   /* Height of the popi icon. */
  1912. X#define  ICONWIDTH    64   /* Width of the popi icon. */
  1913. X
  1914. Xchar fontname[MAXLINE] ;   /* Full pathname of each font. */
  1915. X
  1916. Xint local_mode;            /* Used by load_icon for correct line mode. */
  1917. Xint mgr_infd ;             /* MGR input connection file descriptor. */
  1918. Xint mgr_outfd ;            /* MGR output connection file descriptor. */
  1919. X
  1920. Xshort icon_image[] = {
  1921. X#include "popi.icon"
  1922. X} ;
  1923. X
  1924. X#ifdef NO_43SELECT
  1925. Xint fullmask ;             /* Full mask of file descriptors to check on. */
  1926. Xint readmask ;             /* Readmask used in select call. */
  1927. X#else
  1928. Xfd_set fullmask ;          /* Full mask of file descriptors to check on. */
  1929. Xfd_set readmask ;          /* Readmask used in select call. */
  1930. X#endif /* NO_43SELECT */
  1931. X
  1932. X
  1933. XSIGRET
  1934. Xclean(code)
  1935. Xint code ;
  1936. X{
  1937. X  m_bitdestroy(1) ;
  1938. X  m_pop() ;
  1939. X  m_ttyreset() ;
  1940. X  m_clear() ;
  1941. X  exit(code) ;
  1942. X}
  1943. X
  1944. X
  1945. Xcleanup()                   /* Cleanup before exiting. */
  1946. X{
  1947. X  clean(0) ;
  1948. X}
  1949. X
  1950. X
  1951. Xclose_frame()
  1952. X{
  1953. X  reshape(ICONIC) ;
  1954. X  m_clearmode(M_ACTIVATE) ;
  1955. X  iconic = 1 ;
  1956. X}
  1957. X
  1958. X
  1959. Xdraw_scanline(line, y)       /* Display image scanline on the screen. */
  1960. Xunsigned char *line ;
  1961. Xint y ;
  1962. X{
  1963. X  int fd, size ;
  1964. X
  1965. X  halftone(line, y) ;
  1966. X
  1967. X  IOCTL(mgr_outfd, TIOCLGET, &local_mode) ;
  1968. X  local_mode |= LLITOUT ;
  1969. X  IOCTL(mgr_outfd, TIOCLSET, &local_mode) ;
  1970. X
  1971. X  size = (Xsize / 8) + 1 ;
  1972. X  m_bitldto(Xsize, 1, 0, 0, PR_SCAN, size) ;
  1973. X  m_flush() ;
  1974. X  WRITE(mgr_outfd, mptr, size) ;
  1975. X
  1976. X  local_mode &= ~LLITOUT ;
  1977. X  IOCTL(mgr_outfd, TIOCLSET, &local_mode) ;
  1978. X
  1979. X  m_bitcopyto(0, y+100, Xsize, 1, 0, 0, 0, PR_SCAN) ;
  1980. X}
  1981. X
  1982. X
  1983. Xdrawarea(x, y, width, height, op)
  1984. Xint x, y, width, height ;
  1985. Xenum op_type op ;
  1986. X{
  1987. X  m_func(ops[(int) op]) ;
  1988. Funky_Stuff
  1989. echo "End of part 2"
  1990. echo "File mgr.c is continued in part 3"
  1991. echo "3" > s2_seq_.tmp
  1992. exit 0
  1993.  
  1994.