home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume26 / beav / part08 < prev    next >
Text File  |  1991-11-21  |  55KB  |  2,265 lines

  1. Newsgroups: comp.sources.misc
  2. From: pvr@wang.com (Peter Reilley)
  3. Subject:  v26i044:  beav - Binary file editor and viewer, v1.32, Part08/09
  4. Message-ID: <1991Nov21.230409.1976@sparky.imd.sterling.com>
  5. X-Md4-Signature: 4a80cf651476b320c1125fc0e57063c4
  6. Date: Thu, 21 Nov 1991 23:04:09 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: pvr@wang.com (Peter Reilley)
  10. Posting-number: Volume 26, Issue 44
  11. Archive-name: beav/part08
  12. Environment: UNIX, AIX, MS-DOS, AMIGA
  13. Supersedes: beav: Volume 22, Issue 10-18
  14.  
  15. #! /bin/sh
  16. # into a shell via "sh file" or similar.  To overwrite existing files,
  17. # type "sh file -c".
  18. # The tool that generated this appeared in the comp.sources.unix newsgroup;
  19. # send mail to comp-sources-unix@uunet.uu.net if you want that tool.
  20. # Contents:  ebcdic.c echo.c format.c kbd.c prototyp.h region.c tcap.c
  21. #   tty.c wangpc.c word.c
  22. # Wrapped by kent@sparky on Thu Nov 21 16:47:02 1991
  23. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  24. echo If this archive is complete, you will see the following message:
  25. echo '          "shar: End of archive 8 (of 9)."'
  26. if test -f 'ebcdic.c' -a "${1}" != "-c" ; then 
  27.   echo shar: Will not clobber existing file \"'ebcdic.c'\"
  28. else
  29.   echo shar: Extracting \"'ebcdic.c'\" \(2453 characters\)
  30.   sed "s/^X//" >'ebcdic.c' <<'END_OF_FILE'
  31. X
  32. X#include    "def.h"
  33. X
  34. Xextern    char    ERR_ebcdic[];
  35. X
  36. X/* Function definitions */
  37. X
  38. X/* This table defines the translation from EBCDIC code to ASCII. */
  39. X
  40. Xchar    ebcdic_table[] =
  41. X{
  42. X    0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,/* 00-07 */
  43. X    0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,/* 08-0F */
  44. X    0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,/* 10-17 */
  45. X    0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,/* 18-1F */
  46. X    0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,/* 20-27 */
  47. X    0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,/* 28-2F */
  48. X    0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,/* 30-37 */
  49. X    0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,/* 38-3F */
  50. X    0x20, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,/* 40-47 */
  51. X    0x2E, 0x2E, 0x2E, 0x2E, 0x3C, 0x28, 0x2B, 0x2E,/* 48-4F */
  52. X    0x26, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,/* 50-57 */
  53. X    0x2E, 0x2E, 0x21, 0x24, 0x2A, 0x29, 0x3B, 0x5E,/* 58-5F */
  54. X    0x2D, 0x2F, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,/* 60-67 */
  55. X    0x2E, 0x2E, 0x7C, 0x2E, 0x25, 0x5F, 0x3E, 0x3F,/* 68-6F */
  56. X    0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x27, 0x2E, 0x2E,/* 70-77 */
  57. X    0x2E, 0x60, 0x3A, 0x23, 0x40, 0x2C, 0x3D, 0x22,/* 78-7F */
  58. X    0x2E, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,/* 80-87 */
  59. X    0x68, 0x69, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,/* 88-8F */
  60. X    0x2E, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70,/* 90-97 */
  61. X    0x71, 0x72, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,/* 98-9F */
  62. X    0x2E, 0x7E, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,/* A0-A7 */
  63. X    0x79, 0x7A, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,/* A8-AF */
  64. X    0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,/* B0-B7 */
  65. X    0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,/* B8-BF */
  66. X    0x7B, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,/* C0-C7 */
  67. X    0x48, 0x49, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,/* C8-CF */
  68. X    0x7D, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50,/* D0-D7 */
  69. X    0x51, 0x52, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,/* D8-DF */
  70. X    0x5C, 0x2E, 0X53, 0x54, 0x55, 0x56, 0x57, 0x58,/* E0-E7 */
  71. X    0x59, 0x5A, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,/* E8-EF */
  72. X    0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,/* F0-F7 */
  73. X    0x38, 0x39, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E/* F8-FF */
  74. X};
  75. X
  76. X/* convert a ASCII character to an EBCDIC character */
  77. Xchar    to_ebcdic (ch)
  78. X
  79. Xchar    ch;
  80. X{
  81. X    int     cnt;
  82. X    char    buf[NCOL], buf1[NCOL];
  83. X
  84. X    for (cnt = 0; cnt < sizeof (ebcdic_table); cnt++)
  85. X    {
  86. X        if (ch == ebcdic_table[cnt])
  87. X            return (cnt);
  88. X    }
  89. X    sprintf (buf1, ERR_ebcdic, R_BYTE_FMT(curwp));
  90. X    sprintf (buf, buf1, ch);
  91. X    writ_echo(buf);
  92. X    return (0);
  93. X}
  94. END_OF_FILE
  95.   if test 2453 -ne `wc -c <'ebcdic.c'`; then
  96.     echo shar: \"'ebcdic.c'\" unpacked with wrong size!
  97.   fi
  98.   # end of 'ebcdic.c'
  99. fi
  100. if test -f 'echo.c' -a "${1}" != "-c" ; then 
  101.   echo shar: Will not clobber existing file \"'echo.c'\"
  102. else
  103.   echo shar: Extracting \"'echo.c'\" \(7152 characters\)
  104.   sed "s/^X//" >'echo.c' <<'END_OF_FILE'
  105. X/*
  106. X*       Echo line reading and writing.
  107. X* Common routines for reading
  108. X* and writing characters in the echo line area
  109. X* of the display screen. Used by the entire
  110. X* known universe.
  111. X*/
  112. X#include    "def.h"
  113. X
  114. Xvoid    eerase ();
  115. Xchar    ereply ();
  116. Xchar    eread ();
  117. Xvoid    eformat ();
  118. Xvoid    eputi ();
  119. Xvoid    eputs ();
  120. Xvoid    eputc ();
  121. X
  122. X
  123. Xextern    char    MSG_null[];
  124. Xextern    char    MSG_y_n[];
  125. Xextern    char    MSG_hex_dig[];
  126. Xextern    char    MSG_hit_key[];
  127. X
  128. Xint     epresf = FALSE;         /* Stuff in echo line flag. */
  129. X
  130. X/*
  131. X* Erase the echo line.
  132. X*/
  133. Xvoid eerase ()
  134. X{
  135. X    writ_echo (MSG_null);  /* clear the echo line */
  136. X    epresf = FALSE;
  137. X}
  138. X
  139. X
  140. X/*
  141. X* Ask "yes" or "no" question.
  142. X* Return ABORT if the user answers the question
  143. X* with the abort ("^G") character. Return FALSE
  144. X* for "no" and TRUE for "yes". No formatting
  145. X* services are available.
  146. X*/
  147. Xchar    eyesno (sp)
  148. Xchar   *sp;
  149. X{
  150. X
  151. X    register char   s;
  152. X    char    buf[NCOL];
  153. X
  154. X    for (;;)
  155. X    {
  156. X
  157. X        s = ereply (MSG_y_n, buf, sizeof (buf), sp);
  158. X        if (s == ABORT)
  159. X            return (ABORT);
  160. X        if (s != FALSE)
  161. X        {
  162. X
  163. X            if (buf[0] == 'y' || buf[0] == 'Y')
  164. X                return (TRUE);
  165. X            if (buf[0] == 'n' || buf[0] == 'N')
  166. X                return (FALSE);
  167. X        }
  168. X
  169. X    }
  170. X
  171. X}
  172. X
  173. X
  174. X/*
  175. X* Write out a prompt, and read back a
  176. X* reply. The prompt is now written out with full "eprintf"
  177. X* formatting, although the arguments are in a rather strange
  178. X* place. This is always a new message, there is no auto
  179. X* completion, and the return is echoed as such.
  180. X*/
  181. X/* VARARGS3 */
  182. Xchar    ereply (fp, buf, nbuf, arg)
  183. Xchar   *fp;
  184. Xchar   *buf;
  185. Xint     nbuf;
  186. Xchar   *arg;
  187. X{
  188. X    return (eread (fp, buf, nbuf, EFNEW | EFCR, arg));
  189. X}
  190. X
  191. X
  192. X/*
  193. X* This is the general "read input from the
  194. X* echo line" routine. The basic idea is that the prompt
  195. X* string "prompt" is written to the echo line, and a one
  196. X* line reply is read back into the supplied "buf" (with
  197. X* maximum length "len"). The "flag" contains EFNEW (a
  198. X* new prompt), an EFAUTO (autocomplete), or EFCR (echo
  199. X* the carriage return as CR).
  200. X*/
  201. Xchar    eread (fp, buf, nbuf, flag, ap)
  202. Xchar   *fp;
  203. Xchar   *buf;
  204. Xchar   *ap;
  205. X{
  206. X
  207. X    register int    cpos;
  208. X    register    SYMBOL * sp1;
  209. X    register    SYMBOL * sp2;
  210. X    register int    i;
  211. X    register int    c;
  212. X    register int    h;
  213. X    register int    nhits;
  214. X    register int    nxtra;
  215. X    register int    bxtra;
  216. X
  217. X    int     quote_flag;
  218. X
  219. X    quote_flag = 0;
  220. X    cpos = 0;
  221. X    if (kbdmop != NULL)
  222. X    {
  223. X        /* In a macro.      */
  224. X        while ((c = *kbdmop++) != '\0')
  225. X            buf[cpos++] = c;
  226. X        buf[cpos] = '\0';
  227. X        goto done;
  228. X    }
  229. X
  230. X    if ((flag & EFNEW) != 0 || ttrow != nrow - 1)
  231. X    {
  232. X
  233. X        ttcolor (CTEXT);
  234. X        ttmove (nrow - 1, 0);
  235. X        epresf = TRUE;
  236. X    }
  237. X    else
  238. X        eputc (' ');
  239. X    eformat (fp, ap);
  240. X    tteeol ();
  241. X    ttflush ();
  242. X    for (;;)
  243. X    {
  244. X        c = getkey ();
  245. X        if (c == ' ' && (flag & EFAUTO) != 0)
  246. X        {
  247. X            nhits = 0;
  248. X            nxtra = HUGE;
  249. X            for (h = 0; h < NSHASH; ++h)
  250. X            {
  251. X                sp1 = symbol[h];
  252. X                while (sp1 != NULL)
  253. X                {
  254. X                    for (i = 0; i < cpos; ++i)
  255. X                    {
  256. X                        if (buf[i] != sp1 -> s_name[i])
  257. X                            break;
  258. X                    }
  259. X
  260. X                    if (i == cpos)
  261. X                    {
  262. X                        if (nhits == 0)
  263. X                            sp2 = sp1;
  264. X                        ++nhits;
  265. X                        bxtra = getxtra (sp1, sp2, cpos);
  266. X                        if (bxtra < nxtra)
  267. X                            nxtra = bxtra;
  268. X                    }
  269. X
  270. X                    sp1 = sp1 -> s_symp;
  271. X                }
  272. X            }
  273. X
  274. X            if (nhits == 0)     /* No completion.   */
  275. X                continue;
  276. X            for (i = 0; i < nxtra && cpos < nbuf - 1; ++i)
  277. X            {
  278. X                c = sp2 -> s_name[cpos];
  279. X                buf[cpos++] = c;
  280. X                eputc (c);
  281. X            }
  282. X
  283. X            ttflush ();
  284. X            if (nhits != 1)     /* Fake a CR if there   */
  285. X                continue;       /* is 1 choice.     */
  286. X            c = (KCTRL | 'M');
  287. X        }
  288. X        if (quote_flag)
  289. X        {
  290. X            c = c & 0x1f;
  291. X            quote_flag = 0;
  292. X        }
  293. X
  294. X
  295. X        switch (c)
  296. X        {
  297. X        case (KCTRL | 'Q'):
  298. X            quote_flag = 1;
  299. X            break;
  300. X        case (KCTRL | 'M'): /* Return, done.    */
  301. X            buf[cpos] = '\0';
  302. X            if (kbdmip != NULL)
  303. X            {
  304. X                if (kbdmip + cpos + 1 > &kbdm[NKBDM - 3])
  305. X                {
  306. X                    (void) ctrlg (FALSE, 0, KRANDOM);
  307. X                    ttflush ();
  308. X                    return (ABORT);
  309. X                }
  310. X
  311. X                for (i = 0; i < cpos; ++i)
  312. X                    *kbdmip++ = buf[i];
  313. X                *kbdmip++ = '\0';
  314. X            }
  315. X
  316. X            if ((flag & EFCR) != 0)
  317. X            {
  318. X                ttputc (0x0D);
  319. X                ttflush ();
  320. X            }
  321. X
  322. X            goto done;
  323. X
  324. X        case (KCTRL | 'G'): /* Bell, abort.     */
  325. X            eputc (0x07);
  326. X            (void) ctrlg (FALSE, 0, KRANDOM);
  327. X            ttflush ();
  328. X            return (ABORT);
  329. X
  330. X        case 0x7F:          /* Rubout, erase.   */
  331. X        case (KCTRL | 'H'): /* Backspace, erase.    */
  332. X            if (cpos != 0)
  333. X            {
  334. X                ttputc ('\b');
  335. X                ttputc (' ');
  336. X                ttputc ('\b');
  337. X                --ttcol;
  338. X                if (ISCTRL (buf[--cpos]) != FALSE)
  339. X                {
  340. X                    ttputc ('\b');
  341. X                    ttputc (' ');
  342. X                    ttputc ('\b');
  343. X                    --ttcol;
  344. X                }
  345. X
  346. X                ttflush ();
  347. X            }
  348. X            break;
  349. X
  350. X        case (KCTRL | 'U'): /* C-U, kill line.  */
  351. X            while (cpos != 0)
  352. X            {
  353. X                ttputc ('\b');
  354. X                ttputc (' ');
  355. X                ttputc ('\b');
  356. X                --ttcol;
  357. X                if (ISCTRL (buf[--cpos]) != FALSE)
  358. X                {
  359. X                    ttputc ('\b');
  360. X                    ttputc (' ');
  361. X                    ttputc ('\b');
  362. X                    --ttcol;
  363. X                }
  364. X
  365. X            }
  366. X
  367. X            ttflush ();
  368. X            break;
  369. X
  370. X        default:            /* All the rest.    */
  371. X            if ((cpos < nbuf - 1) && ((c & ~KCHAR) == 0))
  372. X            {
  373. X                buf[cpos++] = c;
  374. X                eputc (c);
  375. X                ttflush ();
  376. X            }
  377. X        }                   /* End switch */
  378. X
  379. X    }
  380. X
  381. Xdone:
  382. X    if (buf[0] == '\0')
  383. X        return (FALSE);
  384. X    return (TRUE);
  385. X}
  386. X
  387. X
  388. X/*
  389. X* The "sp1" and "sp2" point to extended command
  390. X* symbol table entries. The "cpos" is a horizontal position
  391. X* in the name. Return the longest block of characters that can
  392. X* be autocompleted at this point. Sometimes the two symbols
  393. X* are the same, but this is normal.
  394. X*/
  395. Xint     getxtra (sp1, sp2, cpos)
  396. XSYMBOL * sp1;
  397. XSYMBOL * sp2;
  398. X{
  399. X
  400. X    register int    i;
  401. X
  402. X    i = cpos;
  403. X    for (;;)
  404. X    {
  405. X
  406. X        if (sp1 -> s_name[i] != sp2 -> s_name[i])
  407. X            break;
  408. X        if (sp1 -> s_name[i] == '\0')
  409. X            break;
  410. X        ++i;
  411. X    }
  412. X
  413. X    return (i - cpos);
  414. X}
  415. X
  416. X/*
  417. X* Printf style formatting. This is
  418. X* called by both "eprintf" and "ereply", to provide
  419. X* formatting services to their clients. The move to the
  420. X* start of the echo line, and the erase to the end of
  421. X* the echo line, is done by the caller.
  422. X*/
  423. Xvoid eformat (fp, ap)
  424. Xchar  *fp;
  425. Xchar  *ap;
  426. X{
  427. X
  428. X    register int    c;
  429. X
  430. X    while ((c = *fp++) != '\0')
  431. X    {
  432. X
  433. X        if (c != '%')
  434. X            eputc (c);
  435. X        else
  436. X        {
  437. X
  438. X            c = *fp++;
  439. X            switch (c)
  440. X            {
  441. X
  442. X            case 'd':
  443. X                eputi (*(int *) ap, 10);
  444. X                ap += sizeof (int);
  445. X                break;
  446. X
  447. X            case 'x':       /* krw */
  448. X                eputi (*(int *) ap, 16);
  449. X                ap += sizeof (int);
  450. X                break;
  451. X
  452. X            case 'o':
  453. X                eputi (*(int *) ap, 8);
  454. X                ap += sizeof (int);
  455. X                break;
  456. X
  457. X            case 's':
  458. X                eputs (ap);
  459. X                ap += sizeof (char *);
  460. X                break;
  461. X
  462. X            default:
  463. X                eputc (c);
  464. X            }
  465. X
  466. X        }
  467. X
  468. X    }
  469. X
  470. X}
  471. X
  472. X
  473. X/*
  474. X* Put integer, in radix "r".
  475. X*/
  476. Xvoid eputi (i, r)
  477. Xint    i;
  478. Xint    r;
  479. X{
  480. X    static char *convert =
  481. X    {
  482. X        MSG_hex_dig
  483. X    };
  484. X
  485. X
  486. X    register int    q;
  487. X
  488. X    if ((q = i / r) != 0)
  489. X        eputi (q, r);
  490. X    eputc (convert[i % r]);
  491. X
  492. X}
  493. X
  494. X
  495. X/*
  496. X* Put string.
  497. X*/
  498. Xvoid eputs (s)
  499. Xchar  *s;
  500. X{
  501. X    register int    c;
  502. X
  503. X    while ((c = *s++) != '\0')
  504. X        eputc (c);
  505. X}
  506. X
  507. X
  508. X/*
  509. X* Put character. Watch for
  510. X* control characters, and for the line
  511. X* getting too long.
  512. X*/
  513. Xvoid eputc (c)
  514. Xint    c;
  515. X{
  516. X
  517. X    if (ttcol < ncol)
  518. X    {
  519. X
  520. X        if (ISCTRL (c) != FALSE)
  521. X        {
  522. X
  523. X            eputc ('^');
  524. X            c ^= 0x40;
  525. X        }
  526. X
  527. X        ttputc (c);
  528. X        ++ttcol;
  529. X    }
  530. X
  531. X}
  532. X/*
  533. X *   Print warning message and wait for the user to hit a key.
  534. X */
  535. Xvoid    err_echo (buf)
  536. Xchar    *buf;
  537. X{
  538. X    char   ch[NCOL * 2];
  539. X
  540. X    strcpy (ch, buf);
  541. X    strcat (ch, MSG_hit_key);
  542. X    writ_echo (ch);
  543. X    ttbeep ();
  544. X    while (ttgetc () != CTL_G);
  545. X    {
  546. X        ttbeep ();
  547. X        ttflush ();
  548. X    }
  549. X}
  550. END_OF_FILE
  551.   if test 7152 -ne `wc -c <'echo.c'`; then
  552.     echo shar: \"'echo.c'\" unpacked with wrong size!
  553.   fi
  554.   # end of 'echo.c'
  555. fi
  556. if test -f 'format.c' -a "${1}" != "-c" ; then 
  557.   echo shar: Will not clobber existing file \"'format.c'\"
  558. else
  559.   echo shar: Extracting \"'format.c'\" \(8612 characters\)
  560.   sed "s/^X//" >'format.c' <<'END_OF_FILE'
  561. X/*
  562. X* The module devines the format of the screen display.
  563. X*/
  564. X
  565. X#include    "def.h"
  566. X
  567. X
  568. Xextern    char    hex_str[];
  569. Xextern    char    hex_l_str[];
  570. Xextern    char    octal_str[];
  571. Xextern    char    octal_l_str[];
  572. Xextern    char    decimal_str[];
  573. Xextern    char    decimal_l_str[];
  574. Xextern    char    char_str[];
  575. X
  576. X
  577. X/* These structures contain the format for the displayed line */
  578. X
  579. X
  580. X#define FC 13
  581. X#define FS 0
  582. X
  583. Xuchar    ascii_s_posn[] =
  584. X{
  585. X    FS+0, FS+1, FS+2, FS+3, FS+4, FS+5, FS+6, FS+7, FS+8, FS+9,
  586. X        FS+10, FS+11, FS+12, FS+13, FS+14, FS+15, FS+16, FS+17, FS+18, FS+19,
  587. X        FS+20, FS+21, FS+22, FS+23, FS+24, FS+25, FS+26, FS+27, FS+28, FS+29,
  588. X        FS+30, FS+31, FS+32, FS+33, FS+34, FS+35, FS+36, FS+37, FS+38, FS+39,
  589. X        FS+40, FS+41, FS+42, FS+43, FS+44, FS+45, FS+46, FS+47, FS+48, FS+49,
  590. X        FS+50, FS+51, FS+52, FS+53, FS+54, FS+55, FS+56, FS+57, FS+58, FS+59,
  591. X        FS+60, FS+61, FS+62, FS+63, FS+64, FS+65, FS+66, FS+67, FS+68, FS+69,
  592. X        FS+70, FS+71, FS+72, FS+73, FS+74, FS+75, FS+76, FS+77, FS+78, FS+79,
  593. X};
  594. X
  595. XROW_FMT text_fmt =
  596. X{
  597. X    TEXT, BYTES, 128, 128, 128, 1, 1, FALSE, char_str, hex_l_str, hex_str,
  598. X        ascii_s_posn, 0};
  599. X
  600. XROW_FMT ascii_fmt =
  601. X{
  602. X    ASCII, BYTES, 64, 64, 64, 1, 1, FALSE, char_str, hex_l_str, hex_str,
  603. X        &ascii_s_posn[FC], 0};
  604. X
  605. XROW_FMT ascii_s_fmt =
  606. X{
  607. X    ASCII, BYTES, 32, 32, 1, 1, 1, FALSE,  char_str, hex_l_str, hex_str,
  608. X        ascii_s_posn, 0};
  609. X
  610. XROW_FMT ebcdic_fmt =
  611. X{
  612. X    EBCDIC, BYTES, 64, 64, 64, 1, 1, FALSE, char_str, hex_l_str, hex_str,
  613. X        &ascii_s_posn[FC], 0};
  614. X
  615. XROW_FMT ebcdic_s_fmt =
  616. X{
  617. X    EBCDIC, BYTES, 32, 32, 1, 1, 1, FALSE, char_str, hex_l_str, hex_str,
  618. X        ascii_s_posn, 0};
  619. X
  620. Xuchar    octal_8_posn[] =
  621. X{
  622. X    FC, FC + 4, FC + 8, FC + 12, FC + 16, FC + 20,
  623. X        FC + 24, FC + 28, FC + 33, FC + 37, FC + 41,
  624. X        FC + 45, FC + 49, FC + 53, FC + 57, FC + 61
  625. X};
  626. X
  627. XROW_FMT octal_8_fmt =
  628. X{
  629. X    OCTAL, BYTES, 16, 16, 16, 1, 3, TRUE, octal_str, octal_l_str, octal_str,
  630. X        octal_8_posn, 0};
  631. X
  632. Xuchar    octal_s_8_posn[] =
  633. X{
  634. X    FS, FS + 4, FS + 8, FS + 12, FS + 16, FS + 20,
  635. X        FS + 24, FS + 28, FS + 32, FS + 36, FS + 40,
  636. X        FS + 44, FS + 48, FS + 52, FS + 56, FS + 60,
  637. X        FS + 64, FS + 68, FS + 72, FS + 76, FS + 80
  638. X};
  639. XROW_FMT octal_s_8_fmt =
  640. X{
  641. X    OCTAL, BYTES, 8, 8, 1, 1, 3, TRUE, octal_str, octal_l_str, octal_str,
  642. X        octal_s_8_posn, 0};
  643. X
  644. Xuchar    octal_16_posn[] =
  645. X{
  646. X    FC, FC + 7, FC + 14, FC + 21, FC + 29, FC + 36, FC + 43, FC + 50
  647. X};
  648. X
  649. XROW_FMT octal_16_fmt =
  650. X{
  651. X    OCTAL, WORDS, 8, 16, 16, 2, 6, TRUE, octal_str, octal_l_str, octal_str,
  652. X        octal_16_posn, 0};
  653. X
  654. Xuchar    octal_s_16_posn[] =
  655. X{
  656. X    FS, FS + 7, FS + 14, FS + 21, FS + 28, FS + 35,
  657. X        FS + 42, FS + 49, FS + 56, FS + 63, FS + 70, FS + 77
  658. X};
  659. XROW_FMT octal_s_16_fmt =
  660. X{
  661. X    OCTAL, WORDS, 4, 8, 2, 2, 6, TRUE, octal_str, octal_l_str, octal_str,
  662. X        octal_s_16_posn, 0};
  663. X
  664. Xuchar    octal_32_posn[] =
  665. X{
  666. X    FC, FC + 12, FC + 25, FC + 37
  667. X};
  668. X
  669. XROW_FMT octal_32_fmt =
  670. X{
  671. X    OCTAL, DWORDS, 4, 16, 16, 4, 11, TRUE, octal_l_str, octal_l_str, octal_str,
  672. X        octal_32_posn, 0};
  673. X
  674. Xuchar    octal_s_32_posn[] =
  675. X{
  676. X    FS, FS + 12, FS + 24, FS + 36, FS + 48, FS + 60, FS + 72
  677. X};
  678. XROW_FMT octal_s_32_fmt =
  679. X{
  680. X    OCTAL, DWORDS, 2, 8, 4, 4, 11, TRUE, octal_l_str, octal_l_str, octal_str,
  681. X        octal_s_32_posn, };
  682. X
  683. XROW_FMT decimal_8_fmt =
  684. X{
  685. X    DECIMAL, BYTES, 16, 16, 16, 1, 3, TRUE, decimal_str, decimal_l_str, decimal_str,
  686. X        octal_8_posn, 0};
  687. X
  688. XROW_FMT decimal_s_8_fmt =
  689. X{
  690. X    DECIMAL, BYTES, 8, 8, 1, 1, 3, TRUE, decimal_str, decimal_l_str, decimal_str,
  691. X        octal_s_8_posn, 0};
  692. X
  693. Xuchar    decimal_16_posn[] =
  694. X{
  695. X    FC, FC + 6, FC + 12, FC + 18, FC + 25,
  696. X        FC + 31, FC + 37, FC + 43
  697. X};
  698. X
  699. XROW_FMT decimal_16_fmt =
  700. X{
  701. X    DECIMAL, WORDS, 8, 16, 16, 2, 5, TRUE, decimal_str, decimal_l_str, decimal_str,
  702. X        decimal_16_posn, 0};
  703. X
  704. Xuchar    decimal_s_16_posn[] =
  705. X{
  706. X    FS, FS + 6, FS + 12, FS + 18, FS + 24,
  707. X        FS + 30, FS + 36, FS + 42, FS + 48,
  708. X        FS + 54, FS + 60, FS + 66, FS + 72, FS + 78
  709. X};
  710. XROW_FMT decimal_s_16_fmt =
  711. X{
  712. X    DECIMAL, WORDS, 4, 8, 2, 2, 5, TRUE, decimal_str, decimal_l_str, decimal_str,
  713. X        decimal_s_16_posn, 0};
  714. X
  715. Xuchar    decimal_32_posn[] =
  716. X{
  717. X    FC, FC + 11, FC + 23, FC + 34
  718. X};
  719. X
  720. XROW_FMT decimal_32_fmt =
  721. X{
  722. X    DECIMAL, DWORDS, 4, 16, 16, 4, 10, TRUE, decimal_l_str, decimal_l_str, decimal_str,
  723. X        decimal_32_posn, 0};
  724. X
  725. Xuchar    decimal_s_32_posn[] =
  726. X{
  727. X    FS, FS + 11, FS + 22, FS + 33, FS + 44, FS + 55, FS + 66, FS + 77
  728. X};
  729. XROW_FMT decimal_s_32_fmt =
  730. X{
  731. X    DECIMAL, DWORDS, 4, 16, 4, 4, 10, TRUE, decimal_l_str, decimal_l_str, decimal_str,
  732. X        decimal_s_32_posn, 0};
  733. X
  734. Xuchar    hex_8_posn[] =
  735. X{
  736. X    FC, FC + 3, FC + 6, FC + 9, FC + 12, FC + 15,
  737. X        FC + 18, FC + 21, FC + 25, FC + 28, FC + 31,
  738. X        FC + 34, FC + 37, FC + 40, FC + 43, FC + 46,
  739. X        FC + 50, FC + 51, FC + 52, FC + 53, FC + 54,
  740. X        FC + 55, FC + 56, FC + 57, FC + 58, FC + 59,
  741. X        FC + 60, FC + 61, FC + 62, FC + 63, FC + 64,
  742. X        FC + 65
  743. X};
  744. X
  745. XROW_FMT hex_8_fmt =
  746. X{
  747. X    HEX, BYTES, 16, 16, 16, 1, 2, TRUE, hex_str, hex_l_str, hex_str,
  748. X        hex_8_posn, 0};
  749. X
  750. X
  751. Xuchar    hex_s_8_posn[] =
  752. X{
  753. X    FS, FS + 3, FS + 6, FS + 9, FS + 12, FS + 15,
  754. X        FS + 18, FS + 21, FS + 24, FS + 27, FS + 30,
  755. X        FS + 33, FS + 36, FS + 39, FS + 42, FS + 45,
  756. X        FS + 48, FS + 51, FS + 54, FS + 57, FS + 60,
  757. X        FS + 63, FS + 66, FS + 69, FS + 72, FS + 75,
  758. X        FS + 78, FS + 80, FS + 80, FS + 80, FS + 80,
  759. X        FS + 80
  760. X};
  761. XROW_FMT hex_s_8_fmt =
  762. X{
  763. X    HEX, BYTES, 8, 8, 1, 1, 2, TRUE, hex_str, hex_l_str, hex_str,
  764. X        hex_s_8_posn, 0};
  765. X
  766. Xuchar    hex_16_posn[] =
  767. X{
  768. X    FC, FC + 5, FC + 10, FC + 15, FC + 21, FC + 26, FC + 31, FC + 36
  769. X};
  770. X
  771. XROW_FMT hex_16_fmt =
  772. X{
  773. X    HEX, WORDS, 8, 16, 16, 2, 4, TRUE, hex_str, hex_l_str, hex_str,
  774. X        hex_16_posn, 0};
  775. X
  776. Xuchar    hex_s_16_posn[] =
  777. X{
  778. X    FS, FS + 5, FS + 10, FS + 15, FS + 20, FS + 25,
  779. X        FS + 30, FS + 35, FS + 40, FS + 45, FS + 50,
  780. X        FS + 55, FS + 60, FS + 65, FS + 70, FS + 75
  781. X};
  782. XROW_FMT hex_s_16_fmt =
  783. X{
  784. X    HEX, WORDS, 8, 16, 2, 2, 4, TRUE, hex_str, hex_l_str, hex_str,
  785. X        hex_s_16_posn, 0};
  786. X
  787. Xuchar    hex_32_posn[] =
  788. X{
  789. X    FC, FC + 9, FC + 19, FC + 28
  790. X};
  791. X
  792. XROW_FMT hex_32_fmt =
  793. X{
  794. X    HEX, DWORDS, 4, 16, 16, 4, 8, TRUE, hex_l_str, hex_l_str, hex_str,
  795. X        hex_32_posn, 0};
  796. X
  797. Xuchar    hex_s_32_posn[] =
  798. X{
  799. X    FS, FS + 9, FS + 18, FS + 27, FS + 36, FS + 45, FS + 54, FS + 63, FS + 72
  800. X};
  801. XROW_FMT hex_s_32_fmt =
  802. X{
  803. X    HEX, DWORDS, 4, 16, 4, 4, 8, TRUE, hex_l_str, hex_l_str, hex_str,
  804. X        hex_s_32_posn, 0};
  805. X
  806. XROW_FMT binary_8_fmt =
  807. X{
  808. X    BINARY, BYTES, 4, 4, 4, 1, 8, FALSE, hex_str, hex_l_str, hex_str,
  809. X        hex_32_posn, 0};  /* use the hex position array */
  810. X
  811. XROW_FMT binary_s_8_fmt =
  812. X{
  813. X    BINARY, BYTES, 4, 4, 1, 1, 8, FALSE, hex_str, hex_l_str, hex_str,
  814. X        hex_s_32_posn, 0};  /* use the hex position array */
  815. X
  816. Xuchar    binary_16_posn[] =
  817. X{
  818. X    FC, FC + 17, FC + 34, FC + 51
  819. X};
  820. X
  821. XROW_FMT binary_16_fmt =
  822. X{
  823. X    BINARY, WORDS, 4, 8, 8, 2, 16, FALSE, hex_str, hex_l_str, hex_str,
  824. X        binary_16_posn, 0};
  825. X
  826. Xuchar    binary_s_16_posn[] =
  827. X{
  828. X    FS, FS + 17, FS + 34, FS + 51, FS + 68
  829. X};
  830. XROW_FMT binary_s_16_fmt =
  831. X{
  832. X    BINARY, WORDS, 2, 4, 2, 2, 16, FALSE, hex_str, hex_l_str, hex_str,
  833. X        binary_s_16_posn, 0};
  834. X
  835. Xuchar    binary_32_posn[] =
  836. X{
  837. X    FC, FC + 33
  838. X};
  839. X
  840. XROW_FMT binary_32_fmt =
  841. X{
  842. X    BINARY, DWORDS, 2, 8, 8, 4, 32, FALSE, hex_l_str, hex_l_str, hex_str,
  843. X        binary_32_posn, 0};
  844. X
  845. Xuchar    binary_s_32_posn[] =
  846. X{
  847. X    FS, FS + 33
  848. X};
  849. XROW_FMT binary_s_32_fmt =
  850. X{
  851. X    BINARY, DWORDS, 1, 4, 4, 4, 32, FALSE, hex_l_str, hex_l_str, hex_str,
  852. X        binary_s_32_posn, 0};
  853. X
  854. X/* I must do this because C does not allow forward initialization of
  855. X    structures */
  856. Xvoid    init_fmt()
  857. X{
  858. X    text_fmt.r_srch_fmt = &text_fmt;
  859. X    ascii_fmt.r_srch_fmt = &ascii_s_fmt;
  860. X    ascii_s_fmt.r_srch_fmt = &ascii_fmt;
  861. X    ebcdic_fmt.r_srch_fmt = &ebcdic_s_fmt;
  862. X    ebcdic_s_fmt.r_srch_fmt = &ebcdic_fmt;
  863. X    octal_8_fmt.r_srch_fmt = &octal_s_8_fmt;
  864. X    octal_s_8_fmt.r_srch_fmt = &octal_8_fmt;
  865. X    octal_16_fmt.r_srch_fmt = &octal_s_16_fmt;
  866. X    octal_s_16_fmt.r_srch_fmt = &octal_16_fmt;
  867. X    octal_32_fmt.r_srch_fmt = &octal_s_32_fmt;
  868. X    octal_s_32_fmt.r_srch_fmt = &octal_32_fmt;
  869. X    decimal_8_fmt.r_srch_fmt = &decimal_s_8_fmt;
  870. X    decimal_s_8_fmt.r_srch_fmt = &decimal_8_fmt;
  871. X    decimal_16_fmt.r_srch_fmt = &decimal_s_16_fmt;
  872. X    decimal_s_16_fmt.r_srch_fmt = &decimal_16_fmt;
  873. X    decimal_32_fmt.r_srch_fmt = &decimal_s_32_fmt;
  874. X    decimal_s_32_fmt.r_srch_fmt = &decimal_32_fmt;
  875. X    hex_8_fmt.r_srch_fmt = &hex_s_8_fmt;
  876. X    hex_s_8_fmt.r_srch_fmt = &hex_8_fmt;
  877. X    hex_16_fmt.r_srch_fmt = &hex_s_16_fmt;
  878. X    hex_s_16_fmt.r_srch_fmt = &hex_16_fmt;
  879. X    hex_32_fmt.r_srch_fmt = &hex_s_32_fmt;
  880. X    hex_s_32_fmt.r_srch_fmt = &hex_32_fmt;
  881. X    binary_8_fmt.r_srch_fmt = &binary_s_8_fmt;
  882. X    binary_s_8_fmt.r_srch_fmt = &binary_8_fmt;
  883. X    binary_16_fmt.r_srch_fmt = &binary_s_16_fmt;
  884. X    binary_s_16_fmt.r_srch_fmt = &binary_16_fmt;
  885. X    binary_32_fmt.r_srch_fmt = &binary_s_32_fmt;
  886. X    binary_s_32_fmt.r_srch_fmt = &binary_32_fmt;
  887. X}
  888. END_OF_FILE
  889.   if test 8612 -ne `wc -c <'format.c'`; then
  890.     echo shar: \"'format.c'\" unpacked with wrong size!
  891.   fi
  892.   # end of 'format.c'
  893. fi
  894. if test -f 'kbd.c' -a "${1}" != "-c" ; then 
  895.   echo shar: Will not clobber existing file \"'kbd.c'\"
  896. else
  897.   echo shar: Extracting \"'kbd.c'\" \(3870 characters\)
  898.   sed "s/^X//" >'kbd.c' <<'END_OF_FILE'
  899. X/*                      KBD.C
  900. X*       Terminal independent keyboard handling.
  901. X*/
  902. X#include    "def.h"
  903. X
  904. Xchar    *keystrings ();
  905. X
  906. Xextern    char    MSG_tab[];
  907. Xextern    char    MSG_esc[];
  908. Xextern    char    MSG_ctl_x[];
  909. Xextern    char    MSG_ctl[];
  910. Xextern    char    MSG_fn[];
  911. Xextern    char    MSG_ret[];
  912. Xextern    char    MSG_bksp[];
  913. Xextern    char    MSG_space[];
  914. Xextern    char    MSG_rubout[];
  915. X
  916. X
  917. X/*
  918. X* Read in a key, doing the terminal
  919. X* independent prefix handling. The terminal specific
  920. X* "getkbd" routine gets the first swing, and may return
  921. X* one of the special codes used by the special keys
  922. X* on the keyboard. The "getkbd" routine returns the
  923. X* C0 controls as received; this routine moves them to
  924. X* the right spot in 11 bit code.
  925. X*/
  926. Xint     getkey ()
  927. X{
  928. X
  929. X    register int    c;
  930. X    c = getkbd ();
  931. X    if (c == METACH)            /* M-           */
  932. X    {
  933. X        c = KMETA | getctl ();
  934. X#ifdef VT100KEY
  935. X        if ((c & KCHAR) == '[')
  936. X            c = KMETA | KCTRL | KCTLX | getctl ();    /* flag VT100 sequence */
  937. X#endif
  938. X    }
  939. X    else if (c == CTRLCH)        /* C-           */
  940. X        c = KCTRL | getctl ();
  941. X    else if (c == CTMECH)    /* C-M-         */
  942. X        c = KCTRL | KMETA | getctl ();
  943. X    else if (c >= 0x00 && c <= 0x1F)/* Relocate control.    */
  944. X        c = KCTRL | (c + '@');
  945. X
  946. X    if (c == (KCTRL | 'X'))     /* C-X          */
  947. X        c = KCTLX | getctl ();
  948. X    return (c);
  949. X}
  950. X
  951. X
  952. X/*
  953. X* Used above.
  954. X*/
  955. Xint     getctl ()
  956. X{
  957. X
  958. X    register int    c;
  959. X
  960. X#if 1
  961. X    c = getkbd ();
  962. X    if (c == METACH)            /* M-           */
  963. X        c = KMETA | getctl ();
  964. X    else
  965. X        if (c == CTRLCH)        /* C-           */
  966. X            c = KCTRL | getctl ();
  967. X        else
  968. X            if (c == CTMECH)    /* C-M-         */
  969. X                c = KCTRL | KMETA | getctl ();
  970. X            else
  971. X                if (c >= 0x00 && c <= 0x1F)/* Relocate control.    */
  972. X                    c = KCTRL | (c + '@');
  973. X#else
  974. X    c = getkey ();              /* Note recursion   */
  975. X    if (ISLOWER (c & 0xFF))
  976. X        c = (c & ~0xFF) | TOUPPER (c & 0xFF);
  977. X    if (c >= 0x00 && c <= 0x1F) /* Relocate control.    */
  978. X        c = KCTRL | (c + '@');
  979. X#endif
  980. X    if (ISLOWER (c & 0xFF))
  981. X        c = (c & ~0xFF) | TOUPPER (c & 0xFF);
  982. X    return (c);
  983. X}
  984. X
  985. X
  986. X/*
  987. X* Transform a key code into a name,
  988. X* using a table for the special keys and combination
  989. X* of some hard code and some general processing for
  990. X* the rest. None of this code is terminal specific any
  991. X* more. This makes adding keys easier.
  992. X*/
  993. Xvoid keyname (cp, k)
  994. Xregister char  *cp;
  995. Xregister int    k;
  996. X{
  997. X    register char  *np;
  998. X    char    nbuf[3];
  999. X
  1000. X    static char hex[] =
  1001. X    {
  1002. X        '0', '1', '2', '3',
  1003. X        '4', '5', '6', '7',
  1004. X        '8', '9', 'A', 'B',
  1005. X        'C', 'D', 'E', 'F'
  1006. X    };
  1007. X    *cp = 0;    /* terminate previous string */
  1008. X#ifdef VT100KEY
  1009. X    if ((k & (KMETA | KCTRL | KCTLX)) == (int)(KMETA | KCTRL | KCTLX))
  1010. X    {
  1011. X        sprintf (&cp[strlen (cp)], MSG_fn);
  1012. X        sprintf (&cp[strlen (cp)], "%c", k & KCHAR);
  1013. X        return;
  1014. X    }
  1015. X#endif
  1016. X    if (k & 0x80)
  1017. X    {
  1018. X        if ((np = keystrings (k)) != NULL)
  1019. X        {
  1020. X            if ((k & KMETA) != 0)
  1021. X                sprintf (&cp[strlen (cp)], MSG_esc);
  1022. X
  1023. X            strcat (cp, np);
  1024. X        }
  1025. X        else
  1026. X            cp[strlen (cp)] = 0;    /* null string */
  1027. X        return;
  1028. X    }
  1029. X
  1030. X    if ((k & KCTLX) != 0)
  1031. X    {
  1032. X        /* Ctl-X prefix.      */
  1033. X        sprintf (&cp[strlen (cp)], MSG_ctl_x);
  1034. X        k &= ~KCTLX;
  1035. X    }
  1036. X
  1037. X    if ((k & KMETA) != 0)
  1038. X    {
  1039. X        /* Add Esc- mark.     */
  1040. X        sprintf (&cp[strlen (cp)], MSG_esc);
  1041. X        k &= ~KMETA;
  1042. X    }
  1043. X
  1044. X    if (k == (KCTRL | 'I'))/* Some specials.   */
  1045. X        np = MSG_tab;
  1046. X    else
  1047. X    {
  1048. X        if (k == (KCTRL | 'M'))
  1049. X            np = MSG_ret;
  1050. X        else if (k == (KCTRL | 'H'))
  1051. X            np = MSG_bksp;
  1052. X        else if (k == ' ')
  1053. X            np = MSG_space;
  1054. X        else if (k == 0x7F)
  1055. X            np = MSG_rubout;
  1056. X        else
  1057. X        {
  1058. X            if ((k & KCTRL) != 0)
  1059. X            {
  1060. X                /* Add Ctl- mark.     */
  1061. X                sprintf (&cp[strlen (cp)], MSG_ctl);
  1062. X            }
  1063. X            np = &nbuf[0];
  1064. X            if (((k & KCHAR) >= 0x20 && (k & KCHAR) <= 0x7E)
  1065. X                || ((k & KCHAR) >= 0xA0 && (k & KCHAR) <= 0xFE))
  1066. X            {
  1067. X                nbuf[0] = k & KCHAR;/* Graphic.     */
  1068. X                nbuf[1] = 0;
  1069. X            }
  1070. X            else
  1071. X            {
  1072. X                /* Non graphic.     */
  1073. X                nbuf[0] = hex[(k >> 4) & 0x0F];
  1074. X                nbuf[1] = hex[k & 0x0F];
  1075. X                nbuf[2] = 0;
  1076. X            }
  1077. X        }
  1078. X    }
  1079. X    strcat (cp, np);
  1080. X}
  1081. X
  1082. END_OF_FILE
  1083.   if test 3870 -ne `wc -c <'kbd.c'`; then
  1084.     echo shar: \"'kbd.c'\" unpacked with wrong size!
  1085.   fi
  1086.   # end of 'kbd.c'
  1087. fi
  1088. if test -f 'prototyp.h' -a "${1}" != "-c" ; then 
  1089.   echo shar: Will not clobber existing file \"'prototyp.h'\"
  1090. else
  1091.   echo shar: Extracting \"'prototyp.h'\" \(8685 characters\)
  1092.   sed "s/^X//" >'prototyp.h' <<'END_OF_FILE'
  1093. Xextern  char *flook(char *fname,int hflag);
  1094. Xextern  char *keystrings(int key);
  1095. Xextern  char addline(char *text);
  1096. Xextern  char anycb(void );
  1097. Xextern  char asciimode(void );
  1098. Xextern  char autosave(void );
  1099. Xextern  char backchar(int f,int n,int k);
  1100. Xextern  char backdel(int f,int n,int k);
  1101. Xextern  char backline(int f,int n,int k);
  1102. Xextern  char backpage(int f,int n,int k);
  1103. Xextern  char backsearch(void );
  1104. Xextern  char backsrch(void );
  1105. Xextern  char backunit(int f,int n,int k);
  1106. Xextern  char bclear(struct BUFFER *bp);
  1107. Xextern  char binarymode(void );
  1108. Xextern  char bindtokey(void );
  1109. Xextern  char buffername(void );
  1110. Xextern  char bufsizlock(void );
  1111. Xextern  char b_append_c(struct BUFFER *buf_p,unsigned char ch);
  1112. Xextern  char compare(void );
  1113. Xextern  char copyregion(int f,int n,int k);
  1114. Xextern  char ctlxe(int f,int n,int k);
  1115. Xextern  char ctlxlp(int f,int n,int k);
  1116. Xextern  char ctlxrp(int f,int n,int k);
  1117. Xextern  char ctrlg(int f,int n,int k);
  1118. Xextern  char decimalmode(void );
  1119. Xextern  char dec_chr_ok(char *char_buf,char *max_str,char chr,char pos);
  1120. Xextern  char delbunit(int f,int n,int k);
  1121. Xextern  char delfunit(int f,int n,int k);
  1122. Xextern  char delwind(void );
  1123. Xextern  char dispshift(int f,int n,int k);
  1124. Xextern  char dispsize1(void );
  1125. Xextern  char dispsize2(void );
  1126. Xextern  char dispsize4(void );
  1127. Xextern  char dispswapbyte(int f,int n,int k);
  1128. Xextern  char ebcdicmode(void );
  1129. Xextern  char enlargewind(int f,int n,int k);
  1130. Xextern  char eread(char *fp,char *buf,int nbuf,int flag,char *ap);
  1131. Xextern  char ereply(char *fp,char *buf,int nbuf,char *arg);
  1132. Xextern  char execute(int c,int f,int n);
  1133. Xextern  char extend(int f,int n,int k);
  1134. Xextern  char eyesno(char *sp);
  1135. Xextern  char fbackupfile(char *fname);
  1136. Xextern  char ffclose(void );
  1137. Xextern  char ffgetline(char *buf,unsigned int nbuf,unsigned int *rbuf);
  1138. Xextern  char ffputline(char *buf,int nbuf);
  1139. Xextern  char ffropen(char *fn);
  1140. Xextern  char ffwopen(char *fn,unsigned short mode);
  1141. Xextern  char fileinsert(void );
  1142. Xextern  char filename(void );
  1143. Xextern  char fileread(void );
  1144. Xextern  char filesave(void );
  1145. Xextern  char filevisit(void );
  1146. Xextern  char filewrite(void );
  1147. Xextern  char file_visit(int f,int n,int k);
  1148. Xextern  char fill_out(void );
  1149. Xextern  char flushnquit(int f,int n,int k);
  1150. Xextern  char flush_all(void );
  1151. Xextern  char forwchar(int f,int n,int k);
  1152. Xextern  char forwdel(int f,int n,int k);
  1153. Xextern  char forwline(int f,int n,int k);
  1154. Xextern  char forwpage(int f,int n,int k);
  1155. Xextern  char forwsearch(void );
  1156. Xextern  char forwsrch(void );
  1157. Xextern  char forwunit(int f,int n,int k);
  1158. Xextern  char getregion(struct reg *rp);
  1159. Xextern  char getscreenstate(void );
  1160. Xextern  char gotobob(void );
  1161. Xextern  char gotoeob(void );
  1162. Xextern  char gotoline(int f,int n,int k);
  1163. Xextern  char help(void );
  1164. Xextern  char hexmode(void );
  1165. Xextern  char insertunit(int f,int n,int k);
  1166. Xextern  char insert_toggle(void );
  1167. Xextern  char killablebufs(struct BUFFER *bp);
  1168. Xextern  char killbuffer(void );
  1169. Xextern  char killregion(int f,int n,int k);
  1170. Xextern  char ldelete(unsigned long n_bytes,int kflag);
  1171. Xextern  char linkwind(void );
  1172. Xextern  char linsert(int n,unsigned char c);
  1173. Xextern  char listbuffers(void );
  1174. Xextern  char load_extend(void );
  1175. Xextern  char load_file(char *fname,unsigned long start,unsigned long end);
  1176. Xextern  char lrepl_str(int plen,struct LINE *rstr,struct LINE *mstr);
  1177. Xextern  char makelist(void );
  1178. Xextern  char move_ptr(struct WINDOW *wp,long len,char dot,char fix,char rel);
  1179. Xextern  char mvdnwind(int f,int n,int k);
  1180. Xextern  char mvupwind(int f,int n,int k);
  1181. Xextern  char nextwind(void );
  1182. Xextern  char next_buf(void );
  1183. Xextern  char n_way_combine(int f,int n,int k);
  1184. Xextern  char n_way_split(int f,int n,int k);
  1185. Xextern  char octalmode(void );
  1186. Xextern  char onebuf(struct BUFFER *bp);
  1187. Xextern  char onlywind(void );
  1188. Xextern  char parse_f_name(char *fn,unsigned long *start,unsigned long *end);
  1189. Xextern  char pickone(void );
  1190. Xextern  char popblist(void );
  1191. Xextern  char prevwind(void );
  1192. Xextern  char prev_buf(void );
  1193. Xextern  char print(void );
  1194. Xextern  char queryrepl(int f,int n,int k);
  1195. Xextern  char quit(int f,int n,int k);
  1196. Xextern  char quote(int f,int n,int k);
  1197. Xextern  char readin(char *fname,unsigned long start,unsigned long end);
  1198. Xextern  char readpattern(void );
  1199. Xextern  char recall(void );
  1200. Xextern  char refresh(void );
  1201. Xextern  char replaceit(void );
  1202. Xextern  char reposition(void );
  1203. Xextern  char save_region(int f,int n,int k);
  1204. Xextern  char searchagain(void );
  1205. Xextern  char selfinsert(int f,int n,int k);
  1206. Xextern  char setmark(void );
  1207. Xextern  char showcpos(int f,int n,int k);
  1208. Xextern  char showsavebuf(void );
  1209. Xextern  char showversion(int f,int n,int k);
  1210. Xextern  char shrinkwind(int f,int n,int k);
  1211. Xextern  char spawncli(int f,int n,int k);
  1212. Xextern  char splitwind(void );
  1213. Xextern  char swapmark(void );
  1214. Xextern  char to_ebcdic(char ch);
  1215. Xextern  char twiddle(void );
  1216. Xextern  char usebuffer(void );
  1217. Xextern  char use_buffer(void );
  1218. Xextern  char viewfile(void );
  1219. Xextern  char vtputd(struct WINDOW *wp,int row);
  1220. Xextern  char wallchart(int f,int n,int k);
  1221. Xextern  char wind_on_dot(struct WINDOW *wp);
  1222. Xextern  char writeout(char *fn,unsigned long start,unsigned long end,unsigned short mode);
  1223. Xextern  char yank(int f,int n,int k);
  1224. Xextern  char yank_buffer(void );
  1225. Xextern  char _killbuffer(char *bufn);
  1226. Xextern  char _usebuffer(char *bufn);
  1227. Xextern  char _yankbuffer(char *bufn);
  1228. Xextern  int find_keyval(char *name);
  1229. Xextern  int getctl(void );
  1230. Xextern  int getkbd(void );
  1231. Xextern  int getkey(void );
  1232. Xextern  int getsysconfig(union REGS *outregs,struct SREGS *segregs);
  1233. Xextern  int getxtra(struct SYMBOL *sp1,struct SYMBOL *sp2,int cpos);
  1234. Xextern  int symhash(char *cp);
  1235. Xextern  int ttgetc(void );
  1236. Xextern  int ttkeyready(void );
  1237. Xextern  struct BUFFER *bcreate(char *bname);
  1238. Xextern  struct BUFFER *bfind(char *bname,int cflag);
  1239. Xextern  struct LINE *lalloc(int size);
  1240. Xextern  struct LINE *l_break_in_two(struct LINE *lp,unsigned int lo,unsigned int extra);
  1241. Xextern  struct SYMBOL *symlookup(char *cp);
  1242. Xextern  struct WINDOW *wpopup(void );
  1243. Xextern  unsigned int fill_buf(struct WINDOW *wp,struct LINE *lin,unsigned int lin_off,char *w_buff,unsigned int cnt);
  1244. Xextern  unsigned int get_curcol(struct WINDOW *wp);
  1245. Xextern  unsigned int get_currow(struct WINDOW *wp);
  1246. Xextern  unsigned long ffseek(unsigned long posn);
  1247. Xextern  unsigned long file_len(void );
  1248. Xextern  unsigned long get_long(unsigned char *w_buf);
  1249. Xextern  unsigned short get_int(unsigned char *w_buf);
  1250. Xextern  unsigned short get_save_char(void );
  1251. Xextern  void adjustcase(char *fn);
  1252. Xextern  void asciiparm(int n);
  1253. Xextern  void bad_key(int key);
  1254. Xextern  void bin_to_text(char *bin_buf,char *txt_buf,unsigned int len,struct ROW_FMT *fmt_ptr);
  1255. Xextern  void b_append_l(struct BUFFER *buf_p,struct LINE *lp);
  1256. Xextern  void check_extend(char *sfname);
  1257. Xextern  void edinit(char *bname);
  1258. Xextern  void eerase(void );
  1259. Xextern  void eformat(char *fp,char *ap);
  1260. Xextern  void eputc(int c);
  1261. Xextern  void eputi(int i,int r);
  1262. Xextern  void eputs(char *s);
  1263. Xextern  void err_echo(char *buf);
  1264. Xextern  void funky_name(char *bname,int n);
  1265. Xextern  void is_wang(void );
  1266. Xextern  void keyadd(int new,char (*funcp)(),char *name,int modify);
  1267. Xextern  void keydup(int new,char *name);
  1268. Xextern  void keymapinit(void );
  1269. Xextern  void keyname(char *cp,int k);
  1270. Xextern  void lchange(int flag);
  1271. Xextern  void lfree(struct LINE *lp);
  1272. Xextern  void lreplace(int n,char c);
  1273. Xextern  void l_fix_up(struct LINE *line);
  1274. Xextern  void main(int argc,char * *argv);
  1275. Xextern  void makename(char *bname,char *fname);
  1276. Xextern  void mem_line(int row,struct vid *vvp);
  1277. Xextern  void modeline(struct WINDOW *wp);
  1278. Xextern  void next_pat(void );
  1279. Xextern  void putline(int row,int startcol,int stringsize,char *string);
  1280. Xextern  void save_buf_home(void );
  1281. Xextern  void save_buf_init(void );
  1282. Xextern  void set_crt_type(void );
  1283. Xextern  void set_mode_vars(void );
  1284. Xextern  void sort_buf(struct BUFFER *b_ptr,int cnt);
  1285. Xextern  void ttbeep(void );
  1286. Xextern  void ttclose(void );
  1287. Xextern  void ttcolor(int color);
  1288. Xextern  void ttcooked(void );
  1289. Xextern  void tteeol(void );
  1290. Xextern  void tteeop(void );
  1291. Xextern  void ttflush(void );
  1292. Xextern  void ttinit(void );
  1293. Xextern  void ttmove(int row,int col);
  1294. Xextern  void ttnowindow(void );
  1295. Xextern  void ttopen(void );
  1296. Xextern  void ttputc(int c);
  1297. Xextern  void ttraw(void );
  1298. Xextern  void tttidy(void );
  1299. Xextern  void ttykeymapinit(void );
  1300. Xextern  void ucopy(struct vid *vvp,struct vid *pvp);
  1301. Xextern  void uline(int row,struct vid *vvp,struct vid *pvp);
  1302. Xextern  void ungetkey(int k);
  1303. Xextern  void update(void );
  1304. Xextern  void vteeol(void );
  1305. Xextern  void vtinit(void );
  1306. Xextern  void vtmove(int row,int col);
  1307. Xextern  void vtputc(char c);
  1308. Xextern  void vttidy(void );
  1309. Xextern  void wind_on_dot_all(void );
  1310. Xextern  void writ_echo(char *buf);
  1311. Xextern  void _lowercase(char *s);
  1312. END_OF_FILE
  1313.   if test 8685 -ne `wc -c <'prototyp.h'`; then
  1314.     echo shar: \"'prototyp.h'\" unpacked with wrong size!
  1315.   fi
  1316.   # end of 'prototyp.h'
  1317. fi
  1318. if test -f 'region.c' -a "${1}" != "-c" ; then 
  1319.   echo shar: Will not clobber existing file \"'region.c'\"
  1320. else
  1321.   echo shar: Extracting \"'region.c'\" \(4265 characters\)
  1322.   sed "s/^X//" >'region.c' <<'END_OF_FILE'
  1323. X/*
  1324. X*       Region based commands.
  1325. X* The routines in this file
  1326. X* deal with the region, that magic space
  1327. X* between "." and mark. Some functions are
  1328. X* commands. Some functions are just for
  1329. X* internal use.
  1330. X*/
  1331. X#include    "def.h"
  1332. X
  1333. Xbool getregion ();
  1334. X
  1335. Xextern    char    MSG_sv_in_b[];
  1336. Xextern    char    MSG_sav_slf[];
  1337. Xextern    char    MSG_no_mark[];
  1338. Xextern    char    MSG_procing[];
  1339. X
  1340. Xextern    BUFFER  sav_buf;
  1341. X
  1342. X/*
  1343. X* Kill the region. Ask "getregion"
  1344. X* to figure out the bounds of the region.
  1345. X* Move "." to the start, and kill the characters.
  1346. X*/
  1347. Xchar    killregion (f, n, k)
  1348. X{
  1349. X    register char   s;
  1350. X    REGION region;
  1351. X    int     error;
  1352. X
  1353. X    if ((s = getregion (®ion)) != TRUE)
  1354. X        return (s);
  1355. X    if ((lastflag & CFKILL) == 0)/* This is a kill type  */
  1356. X        bclear (&sav_buf);
  1357. X    thisflag |= CFKILL;         /* kill buffer stuff.   */
  1358. X    curwp -> w_dotp = region.r_linep;
  1359. X    curwp -> w_doto = region.r_offset;
  1360. X    error = ldelete (region.r_size, TRUE);
  1361. X    lchange (WFHARD);
  1362. X    /* cause the save buffer display to be updated if needed */
  1363. X    if (sav_buf.b_nwnd != 0)
  1364. X        showsavebuf ();
  1365. X    writ_echo (okmsg);
  1366. X    return (error);
  1367. X}
  1368. X
  1369. X
  1370. X/*
  1371. X* Copy all of the characters in the
  1372. X* region to the kill buffer. Don't move dot
  1373. X* at all. This is a bit like a kill region followed
  1374. X* by a yank.
  1375. X*/
  1376. Xchar    copyregion (f, n, k)
  1377. X{
  1378. X    register    LINE * linep;
  1379. X    register int    loffs, j;
  1380. X    register char   s;
  1381. X    REGION region;
  1382. X    char        buf[NCOL], buf1[NCOL];
  1383. X
  1384. X    j = 0;
  1385. X    if ((s = getregion (®ion)) != TRUE)
  1386. X        return (s);
  1387. X    if ((lastflag & CFKILL) == 0)/* Kill type command.   */
  1388. X        bclear (&sav_buf);
  1389. X    thisflag |= CFKILL;
  1390. X    linep = region.r_linep;     /* Current line.    */
  1391. X    loffs = region.r_offset;    /* Current offset.  */
  1392. X    while (region.r_size--)
  1393. X    {
  1394. X        if ((s = b_append_c (&sav_buf, lgetc (linep, loffs))) != TRUE)
  1395. X            return (s);
  1396. X        ++loffs;
  1397. X        if ((j++ & 0x2ff) == 0)
  1398. X        {
  1399. X            sprintf (buf1, MSG_procing, R_POS_FMT(curwp));
  1400. X            sprintf (buf, buf1, DOT_POS (curwp));
  1401. X            writ_echo (buf);
  1402. X            /* check if we should quit */
  1403. X            if (ttkeyready ())
  1404. X            {
  1405. X                wind_on_dot_all();
  1406. X                if (ttgetc () == '*')
  1407. X                    return (FALSE);
  1408. X            }
  1409. X        }
  1410. X    }
  1411. X    /* cause the save buffer display to be updated if needed */
  1412. X    if (sav_buf.b_nwnd != 0)
  1413. X        showsavebuf ();
  1414. X    /* update buffer display */
  1415. X    if ((blistp -> b_nwnd != 0) &&
  1416. X        (blistp -> b_type == BTLIST))
  1417. X        listbuffers ();
  1418. X    writ_echo (okmsg);
  1419. X    return (TRUE);
  1420. X}
  1421. X
  1422. X/*
  1423. X* This routine figures out the bound of the region
  1424. X* in the current window, and stores the results into the fields
  1425. X* of the REGION structure. Dot and mark are usually close together,
  1426. X* but I don't know the order. The size is kept in a long. At the
  1427. X* end, after the size is figured out, it is assigned to the size
  1428. X* field of the region structure. If this assignment loses any bits,
  1429. X* then we print an error. This is "type independent" overflow
  1430. X* checking. All of the callers of this routine should be ready to
  1431. X* get an ABORT status, because I might add a "if regions is big,
  1432. X* ask before clobberring" flag.
  1433. X*/
  1434. Xbool getregion (rp)
  1435. Xregister    REGION * rp;
  1436. X{
  1437. X    if (curwp -> w_markp == NULL)
  1438. X    {
  1439. X        writ_echo (MSG_no_mark);
  1440. X        return (FALSE);
  1441. X    }
  1442. X
  1443. X    if (DOT_POS(curwp) < MARK_POS(curwp))
  1444. X    {
  1445. X        rp -> r_linep = curwp -> w_dotp;
  1446. X        rp -> r_offset = curwp -> w_doto;
  1447. X        rp -> r_size = MARK_POS(curwp) - DOT_POS(curwp);
  1448. X    }
  1449. X    else
  1450. X    {
  1451. X        rp -> r_linep = curwp -> w_markp;
  1452. X        rp -> r_offset = curwp -> w_marko;
  1453. X        rp -> r_size = DOT_POS(curwp) - MARK_POS(curwp);
  1454. X    }
  1455. X    return (TRUE);
  1456. X}
  1457. X
  1458. X/* save some region in a buffer
  1459. X* (use _usebuffer to handle non-existent buffers)
  1460. X* 
  1461. X* hack as it uses kill buffer to transfer stuff (quick and dirty!)
  1462. X* and doesn't do clever things at all with dot in destination buffer!
  1463. X*/
  1464. Xchar    save_region (f, n, k)
  1465. X{
  1466. X    char    bufn[NBUFN];
  1467. X    char    oldbufn[NBUFN];
  1468. X    register char   s;
  1469. X
  1470. X    if ((s = ereply (MSG_sv_in_b, bufn, NBUFN, NULL)) != TRUE)
  1471. X        return (s);
  1472. X
  1473. X    if (strcmp (bufn, curbp -> b_bname) == 0)
  1474. X    {
  1475. X        writ_echo (MSG_sav_slf);
  1476. X        return (FALSE);
  1477. X    }
  1478. X
  1479. X    /* save this name for ughly reversal */
  1480. X    strcpy (oldbufn, curbp -> b_bname);
  1481. X
  1482. X    /* copy stuff using killbuffer as work space -  hack !! * than move it to
  1483. X    named place using yank - Quick AND Dirty */
  1484. X    copyregion (f, n, k);
  1485. X    _usebuffer (bufn);
  1486. X    curbp -> b_type = BTSAVE;   /* mark as a saved buffer */
  1487. X
  1488. X    yank (f, n, k);
  1489. X    _usebuffer (oldbufn);
  1490. X    writ_echo (okmsg);
  1491. X    return (TRUE);
  1492. X}
  1493. X
  1494. X
  1495. END_OF_FILE
  1496.   if test 4265 -ne `wc -c <'region.c'`; then
  1497.     echo shar: \"'region.c'\" unpacked with wrong size!
  1498.   fi
  1499.   # end of 'region.c'
  1500. fi
  1501. if test -f 'tcap.c' -a "${1}" != "-c" ; then 
  1502.   echo shar: Will not clobber existing file \"'tcap.c'\"
  1503. else
  1504.   echo shar: Extracting \"'tcap.c'\" \(2839 characters\)
  1505.   sed "s/^X//" >'tcap.c' <<'END_OF_FILE'
  1506. X/*    tcap:    Unix V5, V7 and BS4.2 Termcap video driver
  1507. X        for beav
  1508. X*/
  1509. X
  1510. X#include "def.h"
  1511. X
  1512. X#ifdef UNIX
  1513. X
  1514. X#define    MARGIN    8
  1515. X#define    SCRSIZ    64
  1516. X#define    NPAUSE    10            /* # times thru update to pause */
  1517. X#define BEL     0x07
  1518. X#define ESC     0x1B
  1519. X
  1520. Xextern char     *tgoto();
  1521. X
  1522. X#ifdef NOPROTO
  1523. Xextern int      ttputc();
  1524. Xvoid    putpad();
  1525. X#endif
  1526. X
  1527. X#ifdef    COLOR
  1528. Xextern int        tcapfcol();
  1529. Xextern int        tcapbcol();
  1530. X#endif
  1531. X
  1532. X#define TCAPSLEN 315
  1533. Xchar tcapbuf[TCAPSLEN];
  1534. Xchar *UP, PC, *CM, *CE, *CL, *SO, *SE;
  1535. X
  1536. X#ifdef BSD
  1537. X#include <sys/ioctl.h>
  1538. Xstruct ttysize ttysize;
  1539. X#endif /* BSD */
  1540. X#ifdef ULTRIX
  1541. Xstruct ttysize ttysize;
  1542. X#endif
  1543. X
  1544. Xvoid    putpad(str)
  1545. Xchar    *str;
  1546. X{
  1547. X    tputs(str, 1, ttputc);
  1548. X}
  1549. X
  1550. Xvoid    tcapopen()
  1551. X{
  1552. X    char *getenv();
  1553. X    char *t, *p, *tgetstr();
  1554. X    char tcbuf[1024];
  1555. X    char *tv_stype;
  1556. X    char err_str[NCOL];
  1557. X#ifdef ULTRIX
  1558. X    struct winsize ttysize;
  1559. X#endif
  1560. X
  1561. X    if ((tv_stype = getenv("TERM")) == NULL)
  1562. X    {
  1563. X        puts("Environment variable TERM not defined!\r");
  1564. X        ttclose();
  1565. X        exit(1);
  1566. X    }
  1567. X
  1568. X    if ((tgetent(tcbuf, tv_stype)) != 1)
  1569. X    {
  1570. X        sprintf(err_str, "Unknown terminal type %s!\r", tv_stype);
  1571. X        puts(err_str);
  1572. X        ttclose();    /* fix in 1.13 */
  1573. X        exit(1);
  1574. X    }
  1575. X
  1576. X
  1577. X#ifdef BSD 
  1578. X#ifdef ULTRIX
  1579. X    if (ioctl(0, TIOCGWINSZ, &ttysize) == 0
  1580. X        && ttysize.ws_row > 0) {
  1581. X        nrow = ttysize.ws_row;
  1582. X    } else
  1583. X#else
  1584. X        if (ioctl(0, TIOCGSIZE, &ttysize) == 0
  1585. X            && ttysize.ts_lines > 0) {
  1586. X            nrow = ttysize.ts_lines;
  1587. X        }
  1588. X        else
  1589. X#endif /* ULTRIX */
  1590. X#endif /* BSD */
  1591. X            if ((nrow=(short)tgetnum("li")-1) == -1){
  1592. X                puts("termcap entry incomplete (lines)\r");
  1593. X                ttclose();    /* fix in 1.13 */
  1594. X                exit(1);
  1595. X            }
  1596. X    printf ("nrow %d, ncol %d\n", nrow, ncol);
  1597. X    /* don't allow to specify a larger number of rows than we can handle 1.13 */
  1598. X    if (nrow > NROW)
  1599. X        nrow = NROW;
  1600. X
  1601. X    if ((ncol=(short)tgetnum("co")) == -1){
  1602. X        puts("Termcap entry incomplete (columns)\r");
  1603. X        ttclose();    /* fix in 1.13 */
  1604. X        exit(1);
  1605. X    }
  1606. X    /* don't allow to specify a larger number of cols than we can handle 1.13 */
  1607. X    if (ncol > NCOL)
  1608. X        ncol = NCOL;
  1609. X
  1610. X    p = tcapbuf;
  1611. X    t = tgetstr("pc", &p);
  1612. X    if(t)
  1613. X        PC = *t;
  1614. X
  1615. X    CL = tgetstr("cl", &p);
  1616. X    CM = tgetstr("cm", &p);
  1617. X    CE = tgetstr("ce", &p);
  1618. X    UP = tgetstr("up", &p);
  1619. X    SE = tgetstr("se", &p);
  1620. X    SO = tgetstr("so", &p);
  1621. X
  1622. X    if(CL == NULL || CM == NULL || UP == NULL)
  1623. X    {
  1624. X        puts("Incomplete termcap entry\r");
  1625. X        ttclose();    /* fix in 1.13 */
  1626. X        exit(1);
  1627. X    }
  1628. X
  1629. X    if (p >= &tcapbuf[TCAPSLEN])
  1630. X    {
  1631. X        puts("Terminal description too big!\r");
  1632. X        ttclose();    /* fix in 1.13 */
  1633. X        exit(1);
  1634. X    }
  1635. X}
  1636. X
  1637. Xvoid    tcapmove(row, col)
  1638. Xregister int row, col;
  1639. X{
  1640. X    putpad(tgoto(CM, col, row));
  1641. X}
  1642. X
  1643. Xvoid    tcapeeol()
  1644. X{
  1645. X    putpad(CE);
  1646. X}
  1647. X
  1648. Xvoid    tcapeeop()
  1649. X{
  1650. X    putpad(CL);
  1651. X}
  1652. X
  1653. Xvoid    tcaprev(state)        /* change reverse video status */
  1654. Xint state;        /* FALSE = normal video, TRUE = reverse video */
  1655. X
  1656. X{
  1657. X    if (state) {
  1658. X        if (SO != NULL)
  1659. X            putpad(SO);
  1660. X    } else
  1661. X        if (SE != NULL)
  1662. X            putpad(SE);
  1663. X}
  1664. X
  1665. Xvoid    putnpad(str, n)
  1666. Xchar    *str;
  1667. X{
  1668. X    tputs(str, n, ttputc);
  1669. X}
  1670. X
  1671. X#endif
  1672. END_OF_FILE
  1673.   if test 2839 -ne `wc -c <'tcap.c'`; then
  1674.     echo shar: \"'tcap.c'\" unpacked with wrong size!
  1675.   fi
  1676.   # end of 'tcap.c'
  1677. fi
  1678. if test -f 'tty.c' -a "${1}" != "-c" ; then 
  1679.   echo shar: Will not clobber existing file \"'tty.c'\"
  1680. else
  1681.   echo shar: Extracting \"'tty.c'\" \(4528 characters\)
  1682.   sed "s/^X//" >'tty.c' <<'END_OF_FILE'
  1683. X/*
  1684. X*    Wang PC terminal display        TTY.C
  1685. X*
  1686. X*/
  1687. X#include        "def.h"
  1688. X
  1689. Xvoid    ttinit ();
  1690. Xvoid    tttidy ();
  1691. Xvoid    ttmove ();
  1692. Xvoid    tteeol ();
  1693. Xvoid    tteeop ();
  1694. Xvoid    ttbeep ();
  1695. Xvoid    asciiparm ();
  1696. Xvoid    ttnowindow ();    /* stub */
  1697. Xvoid    ttcolor ();
  1698. Xextern void tcapopen ();
  1699. Xextern void tcapmove ();
  1700. X
  1701. X#ifdef MSDOS
  1702. X#include    "dos.h"
  1703. Xextern  bool    ibm_pc, mem_map;
  1704. X#endif
  1705. X#define BEL     0x07            /* BEL character.               */
  1706. X#define ESC     0x1B            /* ESC character.               */
  1707. X
  1708. Xextern int  ttrow;
  1709. Xextern int  ttcol;
  1710. Xextern int  tttop;
  1711. Xextern int  ttbot;
  1712. Xextern int  tthue;
  1713. X
  1714. Xint     tceeol = 3;             /* Costs.                       */
  1715. Xint     rowb = NROW;
  1716. X
  1717. X/*
  1718. X* Initialize the terminal when the editor
  1719. X* gets started up.
  1720. X*/
  1721. Xvoid    ttinit ()
  1722. X{
  1723. X#ifdef MSDOS
  1724. X    ttraw ();
  1725. X#endif
  1726. X#ifdef UNIX 
  1727. X    tcapopen();
  1728. X#endif
  1729. X}
  1730. X
  1731. X/*
  1732. X* Clean up the terminal, in anticipation of
  1733. X* a return to the command interpreter.
  1734. X*/
  1735. Xvoid    tttidy ()
  1736. X{
  1737. X#ifdef MSDOS
  1738. X    ttcooked ();
  1739. X#endif
  1740. X}
  1741. X
  1742. X/*
  1743. X* Move the cursor to the specified
  1744. X* origin 0 row and column position. Try to
  1745. X* optimize out extra moves; redisplay may
  1746. X* have left the cursor in the right
  1747. X* location last time!
  1748. X*/
  1749. Xvoid    ttmove (row, col)
  1750. X{
  1751. X#ifdef MSDOS
  1752. X    union   REGS    regs;
  1753. X
  1754. X    /* Move in both axes */
  1755. X    if (ibm_pc)
  1756. X    {
  1757. X        regs.h.ah = 2;
  1758. X        regs.h.dh = (char)row;
  1759. X        regs.h.dl = (char)col;
  1760. X        regs.h.bh = 0;
  1761. X        int86 (0x10, ®s, ®s); /* set cursor position */
  1762. X    }
  1763. X    else
  1764. X#endif
  1765. X#ifdef UNIX
  1766. X        tcapmove(row, col);
  1767. X#endif
  1768. X#ifdef ANSI
  1769. X    {
  1770. X        ttputc (ESC);
  1771. X        ttputc ('[');
  1772. X        asciiparm (row + 1);
  1773. X        ttputc (';');
  1774. X        asciiparm (col + 1);
  1775. X        ttputc ('H');
  1776. X    }
  1777. X#endif
  1778. X    ttrow = row;
  1779. X    ttcol = col;
  1780. X}
  1781. X
  1782. X/*
  1783. X* Erase to end of line.
  1784. X*/
  1785. Xvoid    tteeol ()
  1786. X{
  1787. X    char    col, row, i;
  1788. X#ifdef MSDOS
  1789. X    union   REGS    regs;
  1790. X
  1791. X    if (ibm_pc)
  1792. X    {
  1793. X        regs.h.ah = 3;
  1794. X        regs.h.bh = 0;
  1795. X        int86 (0x10, ®s, ®s); /* get cursor position */
  1796. X        col = regs.h.dl;
  1797. X        row = regs.h.dh;
  1798. X        for (i = col ; i < (NCOL - 1); i++)
  1799. X        {
  1800. X            regs.h.ah = 0x0e;
  1801. X            regs.h.bl = 0;
  1802. X            regs.h.bh = 0;
  1803. X            regs.h.al = ' ';
  1804. X            int86 (0x10, ®s, ®s); /* set cursor position */
  1805. X        }
  1806. X        /* put cursor back to original position */
  1807. X        regs.h.ah = 2;
  1808. X        regs.h.bh = 0;
  1809. X        regs.h.dl = col;
  1810. X        regs.h.dh = row;
  1811. X        int86 (0x10, ®s, ®s); /* get cursor position */
  1812. X    }
  1813. X    else
  1814. X#endif
  1815. X#ifdef ANSI
  1816. X        {
  1817. X            ttputc (ESC);
  1818. X            ttputc ('[');
  1819. X#ifdef MSDOS
  1820. X            if (ibm_pc)
  1821. X                ttputc ('0');    /* this is necessary in IBM PC's */
  1822. X#endif
  1823. X            ttputc ('K');
  1824. X        }
  1825. X#endif
  1826. X#ifdef UNIX
  1827. X    tcapeeol();
  1828. X#endif
  1829. X}
  1830. X
  1831. X/*
  1832. X* Erase to end of page.
  1833. X* only ever used when cursor is at 0,0, so IBM screen erase
  1834. X* is same as eop
  1835. X*/
  1836. Xvoid    tteeop ()
  1837. X{
  1838. X#ifdef MSDOS
  1839. X    union   REGS    regs;
  1840. X    char    i, j;
  1841. X
  1842. X    if (ibm_pc)
  1843. X    {
  1844. X        for (j = 0 ; j < nrow; j++)
  1845. X        {
  1846. X            for (i = 0 ; i < NCOL; i++)
  1847. X            {
  1848. X                regs.h.ah = 0x0e;
  1849. X                regs.h.bl = 0;
  1850. X                regs.h.bh = 0;
  1851. X                regs.h.al = ' ';
  1852. X                int86 (0x10, ®s, ®s); /* set cursor position */
  1853. X            }
  1854. X        }
  1855. X    }
  1856. X    else
  1857. X#endif
  1858. X#ifdef    ANSI
  1859. X        {
  1860. X            ttcolor (CTEXT);
  1861. X            ttputc (ESC);
  1862. X            ttputc ('[');
  1863. X#ifdef MSDOS
  1864. X            if (ibm_pc)
  1865. X                ttputc ('0');
  1866. X            else
  1867. X#endif
  1868. X                ttputc ('2');
  1869. X            ttputc ('J');
  1870. X        }
  1871. X#endif
  1872. X#ifdef UNIX
  1873. X    tcapeeop();
  1874. X#endif
  1875. X}
  1876. X
  1877. X/*
  1878. X* Make a noise.
  1879. X*/
  1880. Xvoid    ttbeep ()
  1881. X{
  1882. X    ttputc (BEL);
  1883. X    ttflush ();
  1884. X}
  1885. X
  1886. X/*
  1887. X* Convert a number to decimal
  1888. X* ascii, and write it out. Used to
  1889. X* deal with numeric arguments.
  1890. X*/
  1891. Xvoid    asciiparm (n)
  1892. Xregister int    n;
  1893. X{
  1894. X    register int    q;
  1895. X
  1896. X    q = n / 10;
  1897. X    if (q != 0)
  1898. X        asciiparm (q);
  1899. X    ttputc ((n % 10) + '0');
  1900. X}
  1901. X
  1902. X/*
  1903. X* Switch to full screen scroll. This is
  1904. X* used by "spawn.c" just before is suspends the
  1905. X* editor, and by "display.c" when it is getting ready
  1906. X* to exit.  This is a no-op.
  1907. X*/
  1908. Xvoid    ttnowindow (){
  1909. X}
  1910. X
  1911. X/*
  1912. X* Set the current writing color to the
  1913. X* specified color. Watch for color changes that are
  1914. X* not going to do anything (the color is already right)
  1915. X* and don't send anything to the display.
  1916. X*/
  1917. Xvoid    ttcolor (color)
  1918. Xregister int    color;
  1919. X{
  1920. X#ifdef MSDOS
  1921. X    if (mem_map)
  1922. X    {
  1923. X        tthue = color;          /* Save the color.      */
  1924. X        return;
  1925. X    }
  1926. X#endif
  1927. X#ifdef UNIX
  1928. X    if (color == CTEXT)
  1929. X        tcaprev (FALSE);
  1930. X    else    
  1931. X        tcaprev (TRUE);
  1932. X    tthue = color;          /* Save the color.      */
  1933. X#endif
  1934. X#ifdef ANSI
  1935. X    if (color != tthue)
  1936. X    {
  1937. X        if (color == CTEXT)
  1938. X        {                   /* Normal video.        */
  1939. X            ttputc (ESC);
  1940. X            ttputc ('[');
  1941. X            ttputc ('0');
  1942. X            ttputc ('m');
  1943. X        }
  1944. X        else
  1945. X            if (color == CMODE)
  1946. X            {               /* Reverse video.       */
  1947. X                ttputc (ESC);
  1948. X                ttputc ('[');
  1949. X                ttputc ('7');
  1950. X                ttputc ('m');
  1951. X            }
  1952. X        tthue = color;          /* Save the color.      */
  1953. X    }
  1954. X#endif
  1955. X}
  1956. END_OF_FILE
  1957.   if test 4528 -ne `wc -c <'tty.c'`; then
  1958.     echo shar: \"'tty.c'\" unpacked with wrong size!
  1959.   fi
  1960.   # end of 'tty.c'
  1961. fi
  1962. if test -f 'wangpc.c' -a "${1}" != "-c" ; then 
  1963.   echo shar: Will not clobber existing file \"'wangpc.c'\"
  1964. else
  1965.   echo shar: Extracting \"'wangpc.c'\" \(3001 characters\)
  1966.   sed "s/^X//" >'wangpc.c' <<'END_OF_FILE'
  1967. X#include "def.h"
  1968. X#if MSDOS
  1969. X#include "dos.h"
  1970. X
  1971. Xtypedef struct SCREENINFO
  1972. X{
  1973. X    unsigned char   state;
  1974. X    unsigned char   scanoff;
  1975. X    unsigned short  bufseg;
  1976. X    unsigned char   colors;
  1977. X    unsigned char   row;
  1978. X    unsigned char   col;
  1979. X    unsigned char   attr;
  1980. X    unsigned char   auxmod;
  1981. X    unsigned char   auxmod2;
  1982. X} SCREENINFO;
  1983. X
  1984. Xtypedef struct SYSCONFIG
  1985. X{
  1986. X    unsigned short  version;
  1987. X    unsigned short  memsize;
  1988. X    unsigned short  reserved[2];
  1989. X    unsigned short  screen_count;
  1990. X    unsigned short  screens[4];
  1991. X} SYSCONFIG;
  1992. X
  1993. X#define SENDCHAR 6
  1994. X#define SENDLINE 0x0d
  1995. X#define BIOS 0x88
  1996. X#define GETSYSCON 1
  1997. X
  1998. Xbool    wang_pc = FALSE;
  1999. Xbool    ibm_pc = FALSE;
  2000. Xbool    mem_map = FALSE;
  2001. X
  2002. Xvoid    is_wang ()
  2003. X{
  2004. X    union REGS inregs, outregs;
  2005. X    struct SREGS    segregs;
  2006. X    unsigned char *memptr;
  2007. X    unsigned char    c;
  2008. X    int     i;
  2009. X    static  char wang_id[] = {
  2010. X        "WANG"                        };
  2011. X    static  char ret_str[6];
  2012. X    char    *chr_ptr;
  2013. X
  2014. X    chr_ptr = ret_str;
  2015. X    /* test for Wang PC */
  2016. X    memptr = (unsigned char *)0xFC003FC2L;
  2017. X    wang_pc = TRUE;
  2018. X    for (i=0;(i<4 && wang_pc);i++)
  2019. X    {
  2020. X        if(*memptr != wang_id[i])
  2021. X            wang_pc = FALSE;
  2022. X        memptr++;
  2023. X    }
  2024. X
  2025. X    if (wang_pc)
  2026. X    {
  2027. X        mem_map = TRUE;
  2028. X        ret_str[0] = 0xFF;      /* set to known value */
  2029. X        mem_map = TRUE;
  2030. X        inregs.h.al = 0x02;
  2031. X        inregs.h.ah = 0x44;
  2032. X        inregs.x.bx = 0;
  2033. X        inregs.x.cx = 1;
  2034. X        inregs.x.dx = FP_OFF (chr_ptr);
  2035. X        segregs.ds = FP_SEG (chr_ptr);
  2036. X
  2037. X        int86x (0x21, &inregs, &outregs, &segregs);
  2038. X        if (ret_str[0] == 0x11)
  2039. X        {
  2040. X            ibm_pc = TRUE;
  2041. X            return;
  2042. X        }
  2043. X        ibm_pc = FALSE;
  2044. X        return;
  2045. X    }
  2046. X
  2047. X    /* Must be an IBM or clone */
  2048. X    memptr = (unsigned char *)0xF000FFFEL;
  2049. X    c = *memptr;
  2050. X    switch(c)
  2051. X    {
  2052. X    case 0xFC:  /* IBM AT or clone */
  2053. X    case 0xFD:  /* IBM PC Jr */
  2054. X    case 0xFE:  /* IBM XT or clone */
  2055. X    case 0xFF:  /* IBM PC or clone */
  2056. X        mem_map = TRUE;
  2057. X        ibm_pc = TRUE;
  2058. X        return;
  2059. X    }
  2060. X}
  2061. X
  2062. Xint     getsysconfig (outregs, segregs)
  2063. Xunion REGS * outregs;
  2064. Xstruct SREGS   *segregs;
  2065. X{
  2066. X    union REGS inregs;
  2067. X
  2068. X    inregs.h.al = GETSYSCON;
  2069. X
  2070. X    int86x (BIOS, &inregs, outregs, segregs);
  2071. X}
  2072. X
  2073. Xchar    getscreenstate ()
  2074. X{
  2075. X    struct SREGS    segregs;
  2076. X    union REGS outregs;
  2077. X
  2078. X    struct SYSCONFIG   *config;
  2079. X    struct SCREENINFO  *screeninfo;
  2080. X    unsigned short *shortptr;
  2081. X    unsigned int    screen_count;
  2082. X
  2083. X    getsysconfig (&outregs, &segregs);
  2084. X
  2085. X    /* set pointer to force register info into a long pointer. */
  2086. X    shortptr = (unsigned short *) & config;
  2087. X
  2088. X    /* Offset is first, it comes back in BX */
  2089. X    *shortptr = (unsigned short) outregs.x.bx;
  2090. X    shortptr++;
  2091. X
  2092. X    /* segment is in ES */
  2093. X    *shortptr = (unsigned short) segregs.es;
  2094. X
  2095. X    /* Now, the config pointer should be set to the config table. */
  2096. X    /*  printf("Version = %04x \n",config->version);
  2097. X    printf("Memsize = %04x \n",config->memsize);
  2098. X    printf("Screens = %04x \n",config->screen_count);
  2099. X*/
  2100. X    screen_count = config -> screen_count;
  2101. X    while (screen_count)
  2102. X    {
  2103. X        shortptr = (unsigned short *) & screeninfo;
  2104. X        *shortptr = (unsigned short) config -> screens[screen_count - 1];
  2105. X        shortptr++;
  2106. X        *shortptr = (unsigned short) segregs.es;
  2107. X        if (screeninfo -> state & 0x80)
  2108. X            break;
  2109. X        screen_count--;
  2110. X    }
  2111. X    return (screeninfo -> state);
  2112. X}
  2113. X#endif
  2114. END_OF_FILE
  2115.   if test 3001 -ne `wc -c <'wangpc.c'`; then
  2116.     echo shar: \"'wangpc.c'\" unpacked with wrong size!
  2117.   fi
  2118.   # end of 'wangpc.c'
  2119. fi
  2120. if test -f 'word.c' -a "${1}" != "-c" ; then 
  2121.   echo shar: Will not clobber existing file \"'word.c'\"
  2122. else
  2123.   echo shar: Extracting \"'word.c'\" \(2711 characters\)
  2124.   sed "s/^X//" >'word.c' <<'END_OF_FILE'
  2125. X/*
  2126. X*       Word mode commands.
  2127. X* The routines in this file
  2128. X* implement commands that work unit at
  2129. X* a time. There are all sorts of unit mode
  2130. X* commands. If I do any sentence and/or paragraph
  2131. X* mode commands, they are likely to be put in
  2132. X* this file.
  2133. X*/
  2134. X#include    "def.h"
  2135. X
  2136. Xextern  BUFFER    sav_buf;
  2137. Xchar    forwunit ();
  2138. X
  2139. X/*
  2140. X* Move the cursor backward by
  2141. X* "n" units. All of the details of motion
  2142. X* are performed by the "backchar" and "forwchar"
  2143. X* routines. Error if you try to move beyond
  2144. X* the buffers.
  2145. X*/
  2146. Xchar    backunit (f, n, k)
  2147. X{
  2148. X    char    ret;
  2149. X
  2150. X    if (n < 0)
  2151. X        return (forwunit (f, -n, KRANDOM));
  2152. X
  2153. X    curwp -> w_unit_offset = 0;
  2154. X    while (n--)
  2155. X    {
  2156. X        ret = move_ptr (curwp, -(long)R_B_PER_U(curwp), TRUE, TRUE, TRUE);
  2157. X    }
  2158. X    wind_on_dot (curwp);
  2159. X    curwp -> w_flag |= WFMODE;  /* update mode line */
  2160. X    return (ret);
  2161. X}
  2162. X
  2163. X
  2164. X/*
  2165. X* Move the cursor forward by
  2166. X* the specified number of units. All of the
  2167. X* motion is done by "forwchar". Error if you
  2168. X* try and move beyond the buffer's end.
  2169. X*/
  2170. Xchar    forwunit (f, n, k)
  2171. X{
  2172. X
  2173. X    if      (n < 0)
  2174. X        return (backunit (f, -n, KRANDOM));
  2175. X
  2176. X    curwp -> w_unit_offset = 0;
  2177. X    while (n--)
  2178. X    {
  2179. X        move_ptr (curwp, (long)R_B_PER_U(curwp), TRUE, TRUE, TRUE);
  2180. X    }
  2181. X    wind_on_dot (curwp);
  2182. X    curwp -> w_flag |= WFMODE;  /* update mode line */
  2183. X    return (TRUE);
  2184. X}
  2185. X
  2186. X
  2187. X/*
  2188. X* Kill forward by "n" units. The rules for final
  2189. X* status are now different. It is not considered an error
  2190. X* to delete fewer units than you asked. This lets you say
  2191. X* "kill lots of units" and have the command stop in a reasonable
  2192. X* way when it hits the end of the buffer.
  2193. X*/
  2194. Xbool delfunit (f, n, k)
  2195. X{
  2196. X    if (n < 0)
  2197. X        return (FALSE);
  2198. X    if ((lastflag & CFKILL) == 0)/* Purge kill buffer.   */
  2199. X        bclear (&sav_buf);
  2200. X    thisflag |= CFKILL;
  2201. X    while (n--)
  2202. X    {
  2203. X        ldelete ((A32)(R_B_PER_U(curwp)), TRUE);
  2204. X    }
  2205. X    curwp -> w_flag |= WFHARD;
  2206. X    curwp -> w_unit_offset = 0;
  2207. X    return (TRUE);
  2208. X}
  2209. X
  2210. X
  2211. X/*
  2212. X* Kill backwards by "n" units. The rules
  2213. X* for success and failure are now different, to prevent
  2214. X* strange behavior at the start of the buffer. The command
  2215. X* only fails if something goes wrong with the actual delete
  2216. X* of the characters. It is successful even if no characters
  2217. X* are deleted, or if you say delete 5 units, and there are
  2218. X* only 4 units left. I considered making the first call
  2219. X* to "backchar" special, but decided that that would just
  2220. X* be wierd. Normally this is bound to "M-Rubout" and
  2221. X* to "M-Backspace".
  2222. X*/
  2223. Xbool delbunit (f, n, k)
  2224. X{
  2225. X    int size;
  2226. X
  2227. X    if (n < 0)
  2228. X        return (FALSE);
  2229. X    if ((lastflag & CFKILL) == 0)/* Purge kill buffer.   */
  2230. X        bclear (&sav_buf);
  2231. X    thisflag |= CFKILL;
  2232. X    size = R_B_PER_U(curwp);
  2233. X    while (n--)
  2234. X    {
  2235. X        if (move_ptr (curwp, -((long)size), TRUE, TRUE, TRUE))
  2236. X            ldelete ((A32)size, TRUE);
  2237. X    }
  2238. X    curwp -> w_flag |= WFHARD;
  2239. X    return (TRUE);
  2240. X}
  2241. X
  2242. END_OF_FILE
  2243.   if test 2711 -ne `wc -c <'word.c'`; then
  2244.     echo shar: \"'word.c'\" unpacked with wrong size!
  2245.   fi
  2246.   # end of 'word.c'
  2247. fi
  2248. echo shar: End of archive 8 \(of 9\).
  2249. cp /dev/null ark8isdone
  2250. MISSING=""
  2251. for I in 1 2 3 4 5 6 7 8 9 ; do
  2252.     if test ! -f ark${I}isdone ; then
  2253.     MISSING="${MISSING} ${I}"
  2254.     fi
  2255. done
  2256. if test "${MISSING}" = "" ; then
  2257.     echo You have unpacked all 9 archives.
  2258.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  2259. else
  2260.     echo You still must unpack the following archives:
  2261.     echo "        " ${MISSING}
  2262. fi
  2263. exit 0
  2264. exit 0 # Just in case...
  2265.