home *** CD-ROM | disk | FTP | other *** search
/ Garbo / Garbo.cdr / pc / source / termcap.zoo / termcap.3 < prev    next >
Text File  |  1990-04-04  |  50KB  |  2,401 lines

  1. #!/bin/sh
  2. # this is part.03 (part 3 of tinfo)
  3. # do not concatenate these parts, unpack them in order with /bin/sh
  4. # file gettinfo.c continued
  5. #
  6. touch 2>&1 | fgrep '[-amc]' > /tmp/s3_touch$$
  7. if [ -s /tmp/s3_touch$$ ]
  8. then
  9.     TOUCH=can
  10. else
  11.     TOUCH=cannot
  12. fi
  13. rm -f /tmp/s3_touch$$
  14. CurArch=3
  15. if test ! -r s3_seq_.tmp
  16. then echo "Please unpack part 1 first!"
  17.      exit 1; fi
  18. ( read Scheck
  19.   case "$Scheck" in
  20.   "$CurArch") exit 0 ;;
  21.   *)
  22.        echo "Please unpack part $Scheck next!"
  23.        exit 1 ;;
  24.   esac
  25. ) < s3_seq_.tmp || exit 1
  26. echo "x - Continuing file gettinfo.c"
  27. sed 's/^X//' << 'SHAR_EOF' >> gettinfo.c
  28. X        *dp = '\0';
  29. X        if ((ct->name_all = _addstr(entry)) == NULL)
  30. X            return 1;
  31. X        while(dp > entry && *--dp != '|');
  32. X        ct->name_long = ct->name_all + (dp - entry) + 1;
  33. X    }
  34. X
  35. X     while(*sp != '\0') {
  36. X        while(*sp == ',')
  37. X            sp++;
  38. X        while(isspace(*sp))
  39. X            sp++;
  40. X        if (*sp == ',')
  41. X            continue;
  42. X        if (*sp == '\0')
  43. X            break;
  44. X        dp = name;
  45. X        while (*sp != ',' && *sp != '#' && *sp != '=' && !isspace(*sp) && *sp != '\0')
  46. X            *dp++ = *sp++;
  47. X        *dp = '\0';
  48. X#ifdef DEBUG
  49. X        printf(" %s", name);
  50. X#endif
  51. X        switch(*sp) {
  52. X        case '=':
  53. X#ifdef DEBUG
  54. X            putchar('$');
  55. X#endif
  56. X            dp = entry;
  57. X            sp++;
  58. X            match = (char ***) bsearch((anyptr) &p2p2c,
  59. X                           (anyptr) _sstrnames,
  60. X                           NUM_OF_STRS, sizeof(p2p2c),
  61. X                           _compar);
  62. X            if (match != NULL) {
  63. X                i = *match - strnames;
  64. X                flag = _strflags[i];
  65. X            } else {
  66. X                match = (char ***) bsearch((anyptr) &p2p2c,
  67. X                               (anyptr) _sstrfnames,
  68. X                               NUM_OF_STRS,
  69. X                               sizeof(p2p2c),
  70. X                               _compar);
  71. X                if (match != NULL) {
  72. X                    i = *match - strfnames;
  73. X                    flag = _strflags[i];
  74. X                } else
  75. X                    flag = 'K';
  76. X            }
  77. X            while(*sp != '\0' && *sp != ',') {
  78. X                switch(*sp) {
  79. X                case '%':
  80. X                    *dp++ = *sp++;
  81. X                    if (*sp == '^' && flag == 'G')
  82. X                        *dp++ = *sp++;
  83. X                    break;
  84. X                case '\\':
  85. X                    switch(*++sp) {
  86. X                    case 'e':
  87. X                    case 'E': *dp++ = '\033'; break;
  88. X                    case 'l': *dp++ = '\012'; break;
  89. X                    case 'n': *dp++ = '\n'; break;
  90. X                    case 'r': *dp++ = '\r'; break;
  91. X                    case 't': *dp++ = '\t'; break;
  92. X                    case 'b': *dp++ = '\b'; break;
  93. X                    case 'f': *dp++ = '\f'; break;
  94. X                    case 's': *dp++ = ' '; break;
  95. X
  96. X                    case '^': 
  97. X                    case '\\':
  98. X                    case ',':
  99. X                    case ':':
  100. X                        *dp++ = *sp; break;
  101. X
  102. X                    case '0':
  103. X                        if (!isdigit(*(sp + 1))) {
  104. X                            *dp++ = '\200';
  105. X                            break;
  106. X                        }
  107. X                        /* FALLTHROUGH */
  108. X                    case '1':
  109. X                    case '2':
  110. X                    case '3':
  111. X                    case '4':
  112. X                    case '5':
  113. X                    case '6':
  114. X                    case '7':
  115. X                        c = *sp - '0';
  116. X                        if (isdigit(sp[1]))
  117. X                            c = c * 8 + (*++sp-'0');
  118. X                        if (isdigit(sp[1]))
  119. X                            c = c * 8 + (*++sp-'0');
  120. X                        switch((char)c) {
  121. X                        case 0:
  122. X                            if (flag == 'K') 
  123. X                                *dp++ = '\200';
  124. X                            else {
  125. X                                *dp++ = '\\';
  126. X                                *dp++ = '0';
  127. X                                *dp++ = '0';
  128. X                                *dp++ = '0';
  129. X                            }
  130. X                            break;
  131. X                        case '$':
  132. X                        case '\'':
  133. X                        case '\\':
  134. X                            if (flag != 'K')
  135. X                                *dp++ = '\\';
  136. X                            /* FALLTHROUGH */
  137. X                        default:
  138. X                            if (flag == 'G'
  139. X                                && c == '%')
  140. X                                *dp++ = '\\';
  141. X                            *dp++ = c;
  142. X                            break;
  143. X                        }
  144. X                        break;
  145. X                    default:
  146. X                        *dp++ = '\\';
  147. X                        *dp++ = *sp;
  148. X                        break;
  149. X                    }
  150. X                    sp++;
  151. X                    break;
  152. X                case '^':
  153. X                    if (*++sp >= 'A' && *sp <= '_') {
  154. X                        *dp++ = *sp++ - '@';
  155. X                    } else if (*sp >= 'a' && *sp <= 'z') {
  156. X                        *dp++ = *sp++ - 'a' + 1;
  157. X                    } else if (*sp == '@') {
  158. X                        if (flag == 'K')
  159. X                            *dp++ = '\200';
  160. X                        else {
  161. X                            *dp++ = '\\';
  162. X                            *dp++ = '0';
  163. X                            *dp++ = '0';
  164. X                            *dp++ = '0';
  165. X                        }
  166. X                        sp++;
  167. X                    } else 
  168. X                        *dp++ = '^';
  169. X                    break;
  170. X                default:
  171. X                    *dp++ = *sp++;
  172. X                    break;
  173. X                }
  174. X            }
  175. X            *dp++ = '\0';
  176. X            if (strcmp(name, "use") == 0) {
  177. X                if (_getother(entry, path, ct))
  178. X                    return 1;
  179. X                break;
  180. X            }
  181. X            if (match == NULL)
  182. X                break;
  183. X            if (ct->strs[i] != (char *) -1)
  184. X                break;
  185. X            if ((ct->strs[i] = _addstr(entry)) == NULL)
  186. X                return 1;
  187. X            break;    
  188. X        case '#':
  189. X#ifdef DEBUG
  190. X            putchar('#');
  191. X#endif
  192. X#if 0
  193. X            i = atoi(++sp);
  194. X#else
  195. X            sp++;
  196. X            if (*sp == '0') {
  197. X                sp++;
  198. X                if (*sp == 'x' || *sp == 'X') {
  199. X                    sp++;
  200. X                    base = 16;
  201. X                } else
  202. X                    base = 8;
  203. X            } else
  204. X                base = 10;
  205. X            i = 0;
  206. X            while(1) {
  207. X                if (isdigit(*sp))
  208. X                    i = i * base + *sp - '0';
  209. X                else if (base == 16 && isxdigit(*sp))
  210. X                    i = i * base + tolower(*sp) - 'a' + 10;
  211. X                else
  212. X                    break;
  213. X                sp++;
  214. X            }
  215. X#endif
  216. X            while(*sp != '\0' && *sp++ != ',');
  217. X            match = (char ***) bsearch((anyptr) &p2p2c,
  218. X                           (anyptr) _snumnames,
  219. X                           NUM_OF_NUMS, sizeof(p2p2c),
  220. X                           _compar);
  221. X            if (match != NULL) {
  222. X                if (ct->nums[*match - numnames] != -2)
  223. X                    break;
  224. X                ct->nums[*match - numnames] = i;
  225. X            } else {
  226. X                match = (char ***) bsearch((anyptr) &p2p2c,
  227. X                               (anyptr) _snumfnames,
  228. X                               NUM_OF_NUMS,
  229. X                               sizeof(p2p2c),
  230. X                               _compar);
  231. X                if (match != NULL) {
  232. X                    if (ct->nums[*match - numfnames] != -2)
  233. X                        break;
  234. X                    ct->nums[*match - numfnames] = i;
  235. X                }
  236. X            }
  237. X            break;
  238. X        default:
  239. X            while(*sp != '\0' && *sp++ != ',');
  240. X            if (*(dp - 1) == '@') {
  241. X#ifdef DEBUG
  242. X                putchar('@');
  243. X#endif
  244. X                *(dp - 1) = '\0';
  245. X                match = (char ***) bsearch((anyptr) &p2p2c,
  246. X                               (anyptr) _sboolnames,
  247. X                               NUM_OF_BOOLS,
  248. X                               sizeof(p2p2c),
  249. X                               _compar);
  250. X                if (match != NULL) {
  251. X#ifdef DEBUG
  252. X                    putchar('!');
  253. X#endif
  254. X                    ct->bools[*match - boolnames] = 0;
  255. X                    break;
  256. X                }
  257. X                match = (char ***) bsearch((anyptr) &p2p2c,
  258. X                               (anyptr) _snumnames,
  259. X                               NUM_OF_NUMS,
  260. X                               sizeof(p2p2c),
  261. X                               _compar);
  262. X                if (match != NULL) {
  263. X#ifdef DEBUG
  264. X                    putchar('#');
  265. X#endif
  266. X                    ct->nums[*match - numnames] = -1;
  267. X                    break;
  268. X                }
  269. X                match = (char ***) bsearch((anyptr) &p2p2c,
  270. X                               (anyptr) _sstrnames,
  271. X                               NUM_OF_STRS,
  272. X                               sizeof(p2p2c),
  273. X                               _compar);
  274. X                if (match != NULL) {
  275. X#ifdef DEBUG
  276. X                    putchar('$');
  277. X#endif
  278. X                    ct->strs[*match - strnames] = NULL;
  279. X                    break;
  280. X                }
  281. X                match = (char ***) bsearch((anyptr) &p2p2c,
  282. X                               (anyptr)_sboolfnames,
  283. X                               NUM_OF_BOOLS,
  284. X                               sizeof(p2p2c),
  285. X                               _compar);
  286. X                if (match != NULL) {
  287. X#ifdef DEBUG
  288. X                    putchar('!');
  289. X#endif
  290. X                    ct->bools[*match - boolfnames] = 0;
  291. X                    break;
  292. X                }
  293. X                match = (char ***) bsearch((anyptr) &p2p2c,
  294. X                               (anyptr) _snumfnames,
  295. X                               NUM_OF_NUMS,
  296. X                               sizeof(p2p2c),
  297. X                               _compar);
  298. X                if (match != NULL) {
  299. X#ifdef DEBUG
  300. X                    putchar('#');
  301. X#endif
  302. X                    ct->nums[*match - numfnames] = -1;
  303. X                    break;
  304. X                }
  305. X                match = (char ***) bsearch((anyptr) &p2p2c,
  306. X                               (anyptr) _sstrfnames,
  307. X                               NUM_OF_STRS,
  308. X                               sizeof(p2p2c),
  309. X                               _compar);
  310. X                if (match != NULL) {
  311. X#ifdef DEBUG
  312. X                    putchar('$');
  313. X#endif
  314. X                    ct->strs[*match - strfnames] = NULL;
  315. X                    break;
  316. X                }
  317. X                break;
  318. X            }
  319. X#ifdef DEBUG
  320. X            putchar('!');
  321. X#endif
  322. X            match = (char ***) bsearch((anyptr) &p2p2c,
  323. X                           (anyptr) _sboolnames,
  324. X                           NUM_OF_BOOLS, sizeof(p2p2c),
  325. X                           _compar);
  326. X            if (match != NULL)
  327. X                i = *match - boolnames;
  328. X            else {
  329. X                match = (char ***) bsearch((anyptr) &p2p2c,
  330. X                                   (anyptr)_sboolfnames,
  331. X                                   NUM_OF_BOOLS,
  332. X                                   sizeof(p2p2c),
  333. X                                   _compar);
  334. X                if (match == NULL)
  335. X                    break;
  336. X                i = *match - boolfnames;
  337. X            }
  338. X            if (ct->bools[i] != -1)
  339. X                break;
  340. X            ct->bools[i] = 1;
  341. X            break;
  342. X        }
  343. X    }
  344. X    return 0;
  345. X}
  346. SHAR_EOF
  347. echo "File gettinfo.c is complete"
  348. chmod 0644 gettinfo.c || echo "restore of gettinfo.c fails"
  349. case $TOUCH in
  350. can)
  351.     touch -am 0402044690 gettinfo.c
  352.     ;;
  353. esac
  354. set `wc -c gettinfo.c`;Wc_c=$1
  355. case "$Wc_c" in
  356. "7453") ;;
  357. *) echo original size 7453, current size $Wc_c ;;
  358. esac
  359. # ============= getother.c ==============
  360. echo "x - extracting getother.c (Text)"
  361. sed 's/^X//' << 'SHAR_EOF' > getother.c &&
  362. X/*
  363. X * getother.c
  364. X *
  365. X * By Ross Ridge
  366. X * Public Domain
  367. X * 90/03/22 03:43:40
  368. X *
  369. X */
  370. X
  371. X#include "defs.h"
  372. X#include "term.h"
  373. X
  374. X#ifdef USE_SCCS_IDS
  375. Xstatic char SCCSid[] = "@(#) getother.c 1.1";
  376. X#endif
  377. Xint _getother(name, path, ct)
  378. Xchar *name;
  379. Xstruct term_path *path;
  380. XTERMINAL *ct; {
  381. X    static int depth = 0;
  382. X    int r;
  383. X    char buf[MAX_BUF];
  384. X
  385. X    if (depth >= MAX_DEPTH)
  386. X        return 1;        /* infinite loop */
  387. X
  388. X#ifdef DEBUG
  389. X    printf("\ngetother: %s\n", name);
  390. X#endif
  391. X
  392. X    switch(_findterm(name, path, buf)) {
  393. X    case -3:
  394. X        return 1;
  395. X    case 1:
  396. X        depth++;
  397. X        r = _gettcap(buf, ct, path);
  398. X        break;
  399. X    case 2:
  400. X        depth++;
  401. X        r = _gettinfo(buf, ct, path);
  402. X        break;
  403. X    default:
  404. X        return 0;
  405. X    }
  406. X    depth--;
  407. X    return r;
  408. X}
  409. SHAR_EOF
  410. chmod 0644 getother.c || echo "restore of getother.c fails"
  411. case $TOUCH in
  412. can)
  413.     touch -am 0402044690 getother.c
  414.     ;;
  415. esac
  416. set `wc -c getother.c`;Wc_c=$1
  417. case "$Wc_c" in
  418. "671") ;;
  419. *) echo original size 671, current size $Wc_c ;;
  420. esac
  421. # ============= addstr.c ==============
  422. echo "x - extracting addstr.c (Text)"
  423. sed 's/^X//' << 'SHAR_EOF' > addstr.c &&
  424. X/*
  425. X * addstr.c
  426. X *
  427. X * By Ross Ridge
  428. X * Public Domain
  429. X * 90/03/22 03:43:41
  430. X *
  431. X */
  432. X
  433. X#include "defs.h"
  434. X#include "term.h"
  435. X
  436. X#include <ctype.h>
  437. X
  438. X#ifdef USE_SCCS_IDS
  439. Xstatic char SCCSid[] = "@(#) addstr.c 1.1";
  440. X#endif
  441. X/*
  442. X * I think this routine could be improved, as it is now it searches a
  443. X * linked list of strbufs for one that has enough room left for the
  444. X * string. The only thing else I can think of doing would be to 
  445. X * expand a buffer by realloc and then fix the string pointers if it
  446. X * moves.
  447. X */
  448. X
  449. Xstatic struct strbuf *strbuf = NULL;
  450. X   
  451. Xstruct strbuf *_endstr() {
  452. X    register struct strbuf *p;
  453. X    p = strbuf;
  454. X    strbuf = NULL;
  455. X    return p;
  456. X}
  457. X
  458. Xchar *_addstr(s)
  459. Xregister char *s; {
  460. X    register struct strbuf *p;
  461. X    register int l;
  462. X
  463. X    if (s == NULL) {
  464. X        strbuf = NULL;
  465. X        return NULL;
  466. X    }
  467. X
  468. X    if (strbuf == NULL) {
  469. X        strbuf = (struct strbuf *) malloc(sizeof(struct strbuf));
  470. X        if (strbuf == NULL)
  471. X            return NULL;
  472. X        strbuf->len = 0;
  473. X        strbuf->next = NULL;
  474. X    }
  475. X    l = strlen(s) + 1;
  476. X    if (l > MAX_CHUNK)
  477. X        return NULL;
  478. X    p = strbuf;
  479. X    while (l + p->len > MAX_CHUNK) {
  480. X        if (p->next == NULL) {
  481. X            p->next = (struct strbuf *)
  482. X                    malloc(sizeof(struct strbuf));
  483. X            p = p->next;
  484. X            if (p == NULL)
  485. X                return NULL;
  486. X            p->len = 0;
  487. X            p->next = NULL;
  488. X            break;
  489. X        }
  490. X        p = p->next;
  491. X    }
  492. X    s = strcpy(p->buf + p->len, s);
  493. X    p->len += l;
  494. X    return s;
  495. X}
  496. X
  497. Xvoid _del_strs(p)
  498. XTERMINAL *p; {
  499. X    struct strbuf *q;
  500. X    /* I don't care how stupid it looks */
  501. X
  502. X    q = p->strbuf;
  503. X    while(q != NULL) {
  504. X        p->strbuf = q->next; 
  505. X        free((anyptr) q);
  506. X        q = p->strbuf;
  507. X    }
  508. X}
  509. SHAR_EOF
  510. chmod 0644 addstr.c || echo "restore of addstr.c fails"
  511. case $TOUCH in
  512. can)
  513.     touch -am 0402044690 addstr.c
  514.     ;;
  515. esac
  516. set `wc -c addstr.c`;Wc_c=$1
  517. case "$Wc_c" in
  518. "1508") ;;
  519. *) echo original size 1508, current size $Wc_c ;;
  520. esac
  521. # ============= mktermhead.c ==============
  522. echo "x - extracting mktermhead.c (Text)"
  523. sed 's/^X//' << 'SHAR_EOF' > mktermhead.c &&
  524. X/*
  525. X * mktermhead.c
  526. X *
  527. X * By Ross Ridge
  528. X * Public Domain 
  529. X * 90/03/22 03:43:41
  530. X *
  531. X * mktermhead [-n caps] file
  532. X *
  533. X * generates term.head
  534. X *
  535. X */
  536. X
  537. X#define NOTLIB
  538. X#include "defs.h"
  539. X
  540. Xstatic char SCCSid[] = "@(#) mktermhead.c 1.1";
  541. X
  542. X#define DEFAULT_CAPS    1000
  543. X
  544. Xstruct caplist *list;
  545. Xchar *prg_name;
  546. X
  547. Xint main(argc, argv)
  548. Xint argc;
  549. Xchar **argv; {
  550. X    FILE *f;
  551. X    int caps = DEFAULT_CAPS;
  552. X    int n;
  553. X    register int i;
  554. X    int nb, ns, nn;
  555. X
  556. X    prg_name = prg_name;
  557. X
  558. X    if (argc > 2 && argv[1][0] == '-' && argv[1][1] == 'n') {
  559. X        caps = atoi(argv[2]);
  560. X        argv += 2;
  561. X        argc -= 2;
  562. X    }
  563. X
  564. X    if (argc == 1) {
  565. X        f = stdin;
  566. X    } else if (argc == 2) {
  567. X        f = fopen(argv[1], "r");
  568. X        if (f == NULL) {
  569. X            fprintf(stderr, "%s: can't open '%s'\n", prg_name,
  570. X                argv[1]);
  571. X            return 1;
  572. X        }
  573. X    } else {
  574. X        fprintf(stderr, "%s: too many arguments\n", prg_name);
  575. X        fprintf(stderr, "usage: %s [-n caps] [file]\n", prg_name);
  576. X        return 1;
  577. X    }
  578. X
  579. X    list = (struct caplist *) malloc(caps * sizeof(struct caplist));
  580. X    if (list == NULL) {
  581. X        fprintf(stderr, "%s: malloc failed.\n", prg_name);
  582. X        return 1;
  583. X    }
  584. X
  585. X    n = readcaps(f, list, caps);
  586. X    if (n > caps) {
  587. X        fprintf(stderr, "%s: too many caps, use -n.\n", prg_name);
  588. X        return 1;
  589. X    }
  590. X    if (n == 0) {
  591. X        fprintf(stderr, "%s: no caps in file.\n", prg_name);
  592. X        return 1;
  593. X    }
  594. X    if (n == -1) {
  595. X        fprintf(stderr, "%s: bad caps line.\n", prg_name);
  596. X        return 1;
  597. X    }
  598. X    if (n == -2) {
  599. X        fprintf(stderr, "%s: unexpected EOF.\n", prg_name);
  600. X        return 1;
  601. X    }
  602. X
  603. X    puts("/*");
  604. X    puts(" * term.h ");
  605. X    puts(" *");
  606. X    puts(" * This file was generated automatically.");
  607. X    puts(" *");
  608. X    puts(" */");
  609. X    putchar('\n');
  610. X    puts("#ifndef _TERM_H_");
  611. X    puts("#define _TERM_H_");
  612. X    putchar('\n');
  613. X    nb = 0;
  614. X    for (i = 0; i < n; i++) {
  615. X        if (list[i].type == '!') {
  616. X            printf("#define %-*s (_CUR_TERM.bools[%d])\n",
  617. X                   MAX_VARNAME, list[i].var, nb);
  618. X            nb++;
  619. X        }
  620. X    }
  621. X
  622. X    nn = 0;
  623. X    for (i = 0; i < n; i++) {
  624. X        if (list[i].type == '#') {
  625. X            printf("#define %-*s (_CUR_TERM.nums[%d])\n",
  626. X                   MAX_VARNAME, list[i].var, nn);
  627. X            nn++;
  628. X        }
  629. X    }
  630. X
  631. X    ns = 0;
  632. X    for (i = 0; i < n; i++) {
  633. X        if (list[i].type == '$') {
  634. X            printf("#define %-*s (_CUR_TERM.strs[%d])\n",
  635. X                   MAX_VARNAME, list[i].var, ns);
  636. X            ns++;
  637. X        }
  638. X    }
  639. X
  640. X    putchar('\n');
  641. X
  642. X    printf ("#define NUM_OF_BOOLS\t%d\n", nb);
  643. X    printf ("#define NUM_OF_NUMS\t%d\n", nn);
  644. X    printf ("#define NUM_OF_STRS\t%d\n", ns);
  645. X
  646. X    putchar('\n');
  647. X    puts("#ifndef OVERIDE");
  648. X    puts("#undef USE_SGTTY");
  649. X#ifdef USE_SGTTY
  650. X    puts("#define USE_SGTTY");
  651. X#endif
  652. X    puts("#undef USE_TERMIO");
  653. X#ifdef USE_TERMIO
  654. X    puts("#define USE_TERMIO");
  655. X#endif
  656. X    puts("#undef USE_SMALLMEM");
  657. X#ifdef USE_SMALLMEM
  658. X    puts("#define USE_SMALLMEM");
  659. X#endif
  660. X#if 0
  661. X    puts("#undef USE_PROTOTYPES");
  662. X#ifdef USE_PROTOTYPES
  663. X    puts("#define USE_PROTOTYPES");
  664. X#endif
  665. X#endif
  666. X    puts("#undef USE_WINSZ");
  667. X#ifdef USE_WINSZ
  668. X    puts("#define USE_WINSZ");
  669. X#endif
  670. X    puts("#undef MAX_CHUNK");
  671. X    printf("#define MAX_CHUNK %d\n", MAX_CHUNK);
  672. X    puts("#endif /* OVERRIDE */");
  673. X    putchar('\n');
  674. X
  675. X    return 0;
  676. X}
  677. SHAR_EOF
  678. chmod 0644 mktermhead.c || echo "restore of mktermhead.c fails"
  679. case $TOUCH in
  680. can)
  681.     touch -am 0402044690 mktermhead.c
  682.     ;;
  683. esac
  684. set `wc -c mktermhead.c`;Wc_c=$1
  685. case "$Wc_c" in
  686. "2908") ;;
  687. *) echo original size 2908, current size $Wc_c ;;
  688. esac
  689. # ============= mkcaplist.c ==============
  690. echo "x - extracting mkcaplist.c (Text)"
  691. sed 's/^X//' << 'SHAR_EOF' > mkcaplist.c &&
  692. X/*
  693. X * mkcaplist.c
  694. X *
  695. X * By Ross Ridge
  696. X * Public Domain
  697. X * 90/03/22 03:43:42
  698. X *
  699. X * mkcaplist [-n caps] [file]
  700. X *
  701. X * makes caplist.c from the cap_list file
  702. X *
  703. X */
  704. X
  705. X#define NOTLIB
  706. X#include "defs.h"
  707. X
  708. Xstatic char SCCSid[] = "@(#) mkcaplist.c 1.1";
  709. X
  710. X#define DEFAULT_CAPS    1000
  711. X
  712. Xstruct caplist *list;
  713. X
  714. Xint main(argc, argv)
  715. Xint argc;
  716. Xchar **argv; {
  717. X    FILE *f;
  718. X    int caps = DEFAULT_CAPS;
  719. X    int n;
  720. X    register int i;
  721. X
  722. X    if (argc > 2 && argv[1][0] == '-' && argv[1][1] == 'n') {
  723. X        caps = atoi(argv[2]);
  724. X        argv += 2;
  725. X        argc -= 2;
  726. X    }
  727. X
  728. X    if (argc == 1) {
  729. X        f = stdin;
  730. X    } else if (argc == 2) {
  731. X        f = fopen(argv[1], "r");
  732. X        if (f == NULL) {
  733. X            fprintf(stderr, "%s: can't open '%s'\n", argv[0],
  734. X                argv[1]);
  735. X            return 1;
  736. X        }
  737. X    } else {
  738. X        fprintf(stderr, "%s: too many arguments\n", argv[0]);
  739. X        fprintf(stderr, "usage: %s [-n caps] [file]\n", argv[0]);
  740. X        return 1;
  741. X    }
  742. X
  743. X    list = (struct caplist *) malloc(caps * sizeof(struct caplist));
  744. X    if (list == NULL) {
  745. X        fprintf(stderr, "%s: malloc failed.\n", argv[0]);
  746. X        return 1;
  747. X    }
  748. X
  749. X    n = readcaps(f, list, caps);
  750. X    if (n > caps) {
  751. X        fprintf(stderr, "%s: too many caps, use -n.\n", argv[0]);
  752. X        return 1;
  753. X    }
  754. X    if (n == 0) {
  755. X        fprintf(stderr, "%s: no caps in file.\n", argv[0]);
  756. X        return 1;
  757. X    }
  758. X    if (n == -1) {
  759. X        fprintf(stderr, "%s: bad caps line.\n", argv[0]);
  760. X        return 1;
  761. X    }
  762. X    if (n == -2) {
  763. X        fprintf(stderr, "%s: unexpected EOF.\n", argv[0]);
  764. X        return 1;
  765. X    }
  766. X
  767. X    puts("/*");
  768. X    puts(" * caplist.c ");
  769. X    puts(" *");
  770. X    puts(" * This file was generated automatically.");
  771. X    puts(" *");
  772. X    puts(" */");
  773. X    putchar('\n');
  774. X
  775. X    puts("char *boolnames[] = {");
  776. X    for (i = 0; i < n; i++)
  777. X        if (list[i].type == '!')
  778. X            printf("\t\"%s\",\n", list[i].tinfo);
  779. X    puts("\t(char *)0");
  780. X    puts("};");
  781. X    putchar('\n');
  782. X
  783. X    puts("char *boolcodes[] = {");
  784. X    for (i = 0; i < n; i++)
  785. X        if (list[i].type == '!')
  786. X            printf("\t\"%s\",\n", list[i].tcap);
  787. X    puts("\t(char *)0");
  788. X    puts("};");
  789. X    putchar('\n');
  790. X
  791. X    puts("char *boolfnames[] = {");
  792. X    for (i = 0; i < n; i++)
  793. X        if (list[i].type == '!')
  794. X            printf("\t\"%s\",\n", list[i].var);
  795. X    puts("\t(char *)0");
  796. X    puts("};");
  797. X    putchar('\n');
  798. X
  799. X    puts("char *numnames[] = {");
  800. X    for (i = 0; i < n; i++)
  801. X        if (list[i].type == '#')
  802. X            printf("\t\"%s\",\n", list[i].tinfo);
  803. X    puts("\t(char *)0");
  804. X    puts("};");
  805. X    putchar('\n');
  806. X
  807. X    puts("char *numcodes[] = {");
  808. X    for (i = 0; i < n; i++)
  809. X        if (list[i].type == '#')
  810. X            printf("\t\"%s\",\n", list[i].tcap);
  811. X    puts("\t(char *)0");
  812. X    puts("};");
  813. X    putchar('\n');
  814. X
  815. X    puts("char *numfnames[] = {");
  816. X    for (i = 0; i < n; i++)
  817. X        if (list[i].type == '#')
  818. X            printf("\t\"%s\",\n", list[i].var);
  819. X    puts("\t(char *)0");
  820. X    puts("};");
  821. X    putchar('\n');
  822. X
  823. X    puts("char *strnames[] = {");
  824. X    for (i = 0; i < n; i++)
  825. X        if (list[i].type == '$')
  826. X            printf("\t\"%s\",\n", list[i].tinfo);
  827. X    puts("\t(char *)0");
  828. X    puts("};");
  829. X    putchar('\n');
  830. X
  831. X    puts("char *strcodes[] = {");
  832. X    for (i = 0; i < n; i++)
  833. X        if (list[i].type == '$')
  834. X            printf("\t\"%s\",\n", list[i].tcap);
  835. X    puts("\t(char *)0");
  836. X    puts("};");
  837. X    putchar('\n');
  838. X
  839. X    puts("char *strfnames[] = {");
  840. X    for (i = 0; i < n; i++)
  841. X        if (list[i].type == '$')
  842. X            printf("\t\"%s\",\n", list[i].var);
  843. X    puts("\t(char *)0");
  844. X    puts("};");
  845. X    putchar('\n');
  846. X
  847. X    puts("char _strflags[] = {");
  848. X    for (i = 0; i < n; i++)
  849. X        if (list[i].type == '$')
  850. X            printf("\t'%c',\n", list[i].flag);
  851. X    puts("\t'\\0'");
  852. X    puts("};");
  853. X    putchar('\n');
  854. X
  855. X    return 0;
  856. X}
  857. SHAR_EOF
  858. chmod 0644 mkcaplist.c || echo "restore of mkcaplist.c fails"
  859. case $TOUCH in
  860. can)
  861.     touch -am 0402044690 mkcaplist.c
  862.     ;;
  863. esac
  864. set `wc -c mkcaplist.c`;Wc_c=$1
  865. case "$Wc_c" in
  866. "3281") ;;
  867. *) echo original size 3281, current size $Wc_c ;;
  868. esac
  869. # ============= mkcapsort.c ==============
  870. echo "x - extracting mkcapsort.c (Text)"
  871. sed 's/^X//' << 'SHAR_EOF' > mkcapsort.c &&
  872. X/*
  873. X * mkcapsort.c
  874. X *
  875. X * By Ross Ridge
  876. X * Public Domain
  877. X * 90/03/22 03:43:42
  878. X *
  879. X * mkcapsort
  880. X *
  881. X * make the sorted lists of pointers to strins
  882. X *
  883. X */
  884. X
  885. X#define NOTLIB
  886. X#include "defs.h"
  887. X#include "term.h"
  888. X
  889. Xstatic char SCCSid[] = "@(#) mkcapsort.c 1.1";
  890. X
  891. Xchar **sboolnames[NUM_OF_BOOLS], **sboolcodes[NUM_OF_BOOLS], **sboolfnames[NUM_OF_BOOLS];
  892. Xchar **snumnames[NUM_OF_NUMS], **snumcodes[NUM_OF_NUMS], **snumfnames[NUM_OF_NUMS];
  893. Xchar **sstrnames[NUM_OF_STRS], **sstrcodes[NUM_OF_STRS], **sstrfnames[NUM_OF_STRS];
  894. X
  895. X#ifndef USE_STDLIB
  896. Xvoid qsort();
  897. X#endif
  898. X
  899. Xint main() {
  900. X    register int i;
  901. X    
  902. X    i = NUM_OF_BOOLS;
  903. X    while(i) {
  904. X        i--;
  905. X        sboolnames[i] = &boolnames[i];
  906. X        sboolcodes[i] = &boolcodes[i];
  907. X        sboolfnames[i] = &boolfnames[i];
  908. X    }
  909. X    
  910. X    i = NUM_OF_NUMS;
  911. X    while(i) {
  912. X        i--;
  913. X        snumnames[i] = &numnames[i];
  914. X        snumcodes[i] = &numcodes[i];
  915. X        snumfnames[i] = &numfnames[i];
  916. X    }
  917. X
  918. X    i = NUM_OF_STRS;
  919. X    while(i) {
  920. X        i--;
  921. X        sstrnames[i] = &strnames[i];
  922. X        sstrcodes[i] = &strcodes[i];
  923. X        sstrfnames[i] = &strfnames[i];
  924. X    }
  925. X
  926. X    qsort((anyptr) sboolnames, NUM_OF_BOOLS, sizeof(*sboolnames), _compar);
  927. X    qsort((anyptr) sboolcodes, NUM_OF_BOOLS, sizeof(*sboolcodes), _compar);
  928. X    qsort((anyptr) sboolfnames, NUM_OF_BOOLS, sizeof(*sboolfnames),_compar);
  929. X    qsort((anyptr) snumnames, NUM_OF_NUMS, sizeof(*snumnames), _compar);
  930. X    qsort((anyptr) snumcodes, NUM_OF_NUMS, sizeof(*snumcodes), _compar);
  931. X    qsort((anyptr) snumfnames, NUM_OF_NUMS, sizeof(*snumfnames), _compar);
  932. X    qsort((anyptr) sstrnames, NUM_OF_STRS, sizeof(*sstrnames), _compar);
  933. X    qsort((anyptr) sstrcodes, NUM_OF_STRS, sizeof(*sstrcodes), _compar);
  934. X    qsort((anyptr) sstrfnames, NUM_OF_STRS, sizeof(*sstrfnames), _compar);
  935. X
  936. X    printf("/*\n");
  937. X    printf(" * capsort.c\n");
  938. X    printf(" *\n");
  939. X    printf(" * This file was generated automatically.\n");
  940. X    printf(" *\n");
  941. X    printf(" */\n\n");
  942. X
  943. X    puts("extern char *boolnames[], *boolcodes[], *boolfnames[];");
  944. X    puts("extern char *numnames[], *numcodes[], *numfnames[];");
  945. X    puts("extern char *strnames[], *strcodes[], *strfnames[];");
  946. X    putchar('\n');
  947. X
  948. X    printf("char **_sboolnames[] = {\n");
  949. X    for(i = 0; i < NUM_OF_BOOLS; i++)
  950. X        printf("\tboolnames + %d,\n", sboolnames[i] - boolnames);
  951. X    printf("    (char **) 0\n");
  952. X    printf("};\n\n");
  953. X
  954. X    printf("char **_sboolcodes[] = {\n");
  955. X    for(i = 0; i < NUM_OF_BOOLS; i++)
  956. X        printf("\tboolcodes + %d,\n", sboolcodes[i] - boolcodes);
  957. X    printf("    (char **) 0\n");
  958. X    printf("};\n\n");
  959. X
  960. X    printf("char **_sboolfnames[] = {\n");
  961. X    for(i = 0; i < NUM_OF_BOOLS; i++)
  962. X        printf("\tboolfnames + %d,\n", sboolfnames[i] - boolfnames);
  963. X    printf("    (char **) 0\n");
  964. X    printf("};\n\n");
  965. X
  966. X    printf("char **_snumnames[] = {\n");
  967. X    for(i = 0; i < NUM_OF_NUMS; i++)
  968. X        printf("\tnumnames + %d,\n", snumnames[i] - numnames);
  969. X    printf("    (char **) 0\n");
  970. X    printf("};\n\n");
  971. X
  972. X    printf("char **_snumcodes[] = {\n");
  973. X    for(i = 0; i < NUM_OF_NUMS; i++)
  974. X        printf("\tnumcodes + %d,\n", snumcodes[i] - numcodes);
  975. X    printf("    (char **) 0\n");
  976. X    printf("};\n\n");
  977. X
  978. X    printf("char **_snumfnames[] = {\n");
  979. X    for(i = 0; i < NUM_OF_NUMS; i++)
  980. X        printf("\tnumfnames + %d,\n", snumfnames[i] - numfnames);
  981. X    printf("    (char **) 0\n");
  982. X    printf("};\n\n");
  983. X
  984. X    printf("char **_sstrnames[] = {\n");
  985. X    for(i = 0; i < NUM_OF_STRS; i++)
  986. X        printf("\tstrnames + %d,\n", sstrnames[i] - strnames);
  987. X    printf("    (char **) 0\n");
  988. X    printf("};\n\n");
  989. X
  990. X    printf("char **_sstrcodes[] = {\n");
  991. X    for(i = 0; i < NUM_OF_STRS; i++) 
  992. X        printf("\tstrcodes + %d,\n", sstrcodes[i] - strcodes);
  993. X    printf("    (char **) 0\n");
  994. X    printf("};\n\n");
  995. X
  996. X    printf("char **_sstrfnames[] = {\n");
  997. X    for(i = 0; i < NUM_OF_STRS; i++)
  998. X        printf("\tstrfnames + %d,\n", sstrfnames[i] - strfnames);
  999. X    printf("    (char **) 0\n");
  1000. X    printf("};\n\n");
  1001. X
  1002. X    return 0;
  1003. X}
  1004. SHAR_EOF
  1005. chmod 0644 mkcapsort.c || echo "restore of mkcapsort.c fails"
  1006. case $TOUCH in
  1007. can)
  1008.     touch -am 0402044690 mkcapsort.c
  1009.     ;;
  1010. esac
  1011. set `wc -c mkcapsort.c`;Wc_c=$1
  1012. case "$Wc_c" in
  1013. "3629") ;;
  1014. *) echo original size 3629, current size $Wc_c ;;
  1015. esac
  1016. # ============= readcaps.c ==============
  1017. echo "x - extracting readcaps.c (Text)"
  1018. sed 's/^X//' << 'SHAR_EOF' > readcaps.c &&
  1019. X/*
  1020. X * readcaps.c
  1021. X *
  1022. X * By Ross Ridge
  1023. X * Public Domain
  1024. X * 90/03/22 03:43:43
  1025. X *
  1026. X * Read in the cap_list file
  1027. X *
  1028. X */
  1029. X
  1030. X#define NOTLIB
  1031. X#include "defs.h"
  1032. X
  1033. X#include <ctype.h>
  1034. X
  1035. X#ifdef USE_SCCS_IDS
  1036. Xstatic char SCCSid[] = "@(#) readcaps.c 1.1";
  1037. X#endif
  1038. X#ifdef __GNUC__
  1039. X__inline__
  1040. X#endif
  1041. Xstatic int skipline(f)
  1042. Xregister FILE *f; {
  1043. X    register int c;
  1044. X
  1045. X    do {
  1046. X        c = getc(f);
  1047. X        if (c == EOF)
  1048. X            return EOF;
  1049. X#ifdef TEST
  1050. X        putchar(c);
  1051. X#endif
  1052. X    } while (c != '\n');
  1053. X
  1054. X    return 0;
  1055. X}
  1056. X
  1057. X#ifdef __GNUC__
  1058. X__inline__
  1059. X#endif
  1060. Xstatic int getfield(f, s, len)
  1061. Xregister FILE *f;
  1062. Xregister char *s;
  1063. Xint len; {
  1064. X    register int c;
  1065. X    int i;
  1066. X#ifdef TEST
  1067. X    char *start = s;
  1068. X#endif
  1069. X
  1070. X    do {
  1071. X        c = getc(f);
  1072. X        if (c == EOF)
  1073. X            return EOF;
  1074. X    } while (c != '\n' && isspace(c));
  1075. X    if (c == '\n')
  1076. X        return 0;
  1077. X
  1078. X    i = 0;
  1079. X    while(!isspace(c)) {
  1080. X        if (i++ < len)
  1081. X            *s++ = c;
  1082. X        c = getc(f);
  1083. X        if (c == EOF)
  1084. X            return EOF;
  1085. X            
  1086. X    }
  1087. X    *s = '\0';
  1088. X#ifdef TEST
  1089. X    printf(" %s", start);
  1090. X#endif
  1091. X    return c;
  1092. X}
  1093. X
  1094. Xint readcaps(f, buf, max)
  1095. XFILE *f;
  1096. Xregister struct caplist *buf;
  1097. Xint max; {
  1098. X    int type;
  1099. X    register int count;
  1100. X    int c;
  1101. X    static char dummy;
  1102. X
  1103. X    count = 0;
  1104. X    type = getc(f);
  1105. X    while(type != EOF) {
  1106. X        if (type == '$' || type == '!' || type == '#') {
  1107. X            if (count >= max)
  1108. X                return count + 1;
  1109. X#ifdef TEST
  1110. X            putchar(type);
  1111. X#endif
  1112. X            buf[count].type = type;
  1113. X
  1114. X            if (type == '$') {
  1115. X                c = getc(f);
  1116. X                if (c == EOF)
  1117. X                    break;
  1118. X                if (c == 'G')
  1119. X                    buf[count].flag = 'G';
  1120. X                else if (c == 'K')
  1121. X                    buf[count].flag = 'K';
  1122. X                else
  1123. X                    buf[count].flag = ' ';
  1124. X            }
  1125. X    
  1126. X            c = getfield(f, buf[count].var, MAX_VARNAME);
  1127. X            if (c == EOF || c == '\n' || c == 0)
  1128. X                return -1;
  1129. X            c = getfield(f, buf[count].tinfo, MAX_TINFONAME);
  1130. X            if (c == EOF || c == '\n' || c == 0)
  1131. X                return -1;
  1132. X            c = getfield(f, buf[count].tcap, MAX_TCAPNAME);
  1133. X            if (c == EOF || c == 0)
  1134. X                return -1;
  1135. X            if (c != '\n')
  1136. X                if (getfield(f, &dummy, 1) != 0)
  1137. X                    return -1;
  1138. X            count++;
  1139. X#ifdef TEST
  1140. X            putchar('\n');
  1141. X#endif
  1142. X        } else {
  1143. X#ifdef TEST
  1144. X            putchar(type);
  1145. X#endif
  1146. X            if (type != '\n' && skipline(f) == EOF)
  1147. X                return -1;
  1148. X        }
  1149. X        type = getc(f);
  1150. X    }
  1151. X    return count;
  1152. X}
  1153. X
  1154. X#ifdef TEST
  1155. Xstruct caplist list[1000];
  1156. X
  1157. Xint main() {
  1158. X    int ret;
  1159. X
  1160. X    ret = readcaps(stdin, list, 1000);
  1161. X    printf("ret = %d\n", ret);
  1162. X    return 0;
  1163. X}
  1164. X#endif
  1165. SHAR_EOF
  1166. chmod 0644 readcaps.c || echo "restore of readcaps.c fails"
  1167. case $TOUCH in
  1168. can)
  1169.     touch -am 0402044690 readcaps.c
  1170.     ;;
  1171. esac
  1172. set `wc -c readcaps.c`;Wc_c=$1
  1173. case "$Wc_c" in
  1174. "2211") ;;
  1175. *) echo original size 2211, current size $Wc_c ;;
  1176. esac
  1177. # ============= tcapvars.c ==============
  1178. echo "x - extracting tcapvars.c (Text)"
  1179. sed 's/^X//' << 'SHAR_EOF' > tcapvars.c &&
  1180. X/*
  1181. X * tcapvars.c
  1182. X *
  1183. X * By Ross Ridge
  1184. X * Public Domain
  1185. X * 90/03/22 03:43:43
  1186. X *
  1187. X */
  1188. X
  1189. X#include "defs.h"
  1190. X#include "term.h"
  1191. X
  1192. X#ifdef USE_SCCS_IDS
  1193. Xstatic char SCCSid[] = "@(#) tcapvars.c 1.1";
  1194. X#endif
  1195. X
  1196. Xchar PC;
  1197. Xint ospeed;
  1198. Xchar *UP, *BC;
  1199. X
  1200. Xvoid _figure_termcap() {
  1201. X#if defined(USE_SGTTY) || defined(USE_TERMIO)
  1202. X#ifdef USE_SMALLMEM
  1203. X    extern unsigned short _baud_tbl[];
  1204. X#else
  1205. X    extern long _baud_tbl[];
  1206. X#endif
  1207. X    cur_term->padch = PC;
  1208. X    cur_term->baudrate = _baud_tbl[ospeed];
  1209. X#endif
  1210. X}
  1211. SHAR_EOF
  1212. chmod 0644 tcapvars.c || echo "restore of tcapvars.c fails"
  1213. case $TOUCH in
  1214. can)
  1215.     touch -am 0402044690 tcapvars.c
  1216.     ;;
  1217. esac
  1218. set `wc -c tcapvars.c`;Wc_c=$1
  1219. case "$Wc_c" in
  1220. "470") ;;
  1221. *) echo original size 470, current size $Wc_c ;;
  1222. esac
  1223. # ============= mkbinorder.c ==============
  1224. echo "x - extracting mkbinorder.c (Text)"
  1225. sed 's/^X//' << 'SHAR_EOF' > mkbinorder.c &&
  1226. X/*
  1227. X * mkbinorder.c
  1228. X *
  1229. X * By Ross Ridge
  1230. X * Public Domain
  1231. X * 90/03/22 03:43:43
  1232. X *
  1233. X */
  1234. X
  1235. X#define NOTLIB
  1236. X#include "defs.h"
  1237. X#include "term.h"
  1238. X
  1239. Xstatic char SCCSid[] = "@(#) mkbinorder.c 1.1";
  1240. X
  1241. Xextern *_sboolnames[], **_snumnames[], **_sstrnames[];
  1242. X
  1243. Xchar cap[MAX_TINFONAME + 1];
  1244. Xchar *p2c = cap;
  1245. Xchar **p2p2c = &p2c;
  1246. X
  1247. Xmain(argc, argv)
  1248. Xint argc;
  1249. Xchar **argv; {
  1250. X    int r;
  1251. X    char ***match;
  1252. X    FILE *f;
  1253. X
  1254. X    if (argc == 1)
  1255. X        f = stdin;
  1256. X    else if (argc == 2) {
  1257. X        f = fopen(argv[1], "r");
  1258. X        if (f == NULL) {
  1259. X            fprintf(stderr, "can't open %s\n", argv[1]);
  1260. X            exit(1);
  1261. X        }
  1262. X    } else {
  1263. X        fprintf(stderr, "argument count\n");
  1264. X        exit(1);
  1265. X    }
  1266. X
  1267. X    do {
  1268. X        r = fscanf(f, "%s", cap);
  1269. X    } while(r == 1 && strcmp(cap, "!") != 0);
  1270. X    if (r != 1) {
  1271. X        fprintf(stderr, "expected '!'\n");
  1272. X        exit(1);
  1273. X    }
  1274. X
  1275. X    puts("/*");
  1276. X    puts(" * binorder.c");
  1277. X    puts(" *");
  1278. X    puts(" * This file was generated automatically");
  1279. X    puts(" *");
  1280. X    puts(" */\n");
  1281. X
  1282. X    puts("int _boolorder[] = {");
  1283. X
  1284. X    while(1) {
  1285. X        r = fscanf(f, "%s", cap);
  1286. X        if (r != 1) {
  1287. X            fprintf(stderr, "unexpected EOF\n");
  1288. X            exit(1);
  1289. X        }
  1290. X        if (strcmp(cap, "#") == 0)
  1291. X            break;
  1292. X        match = bsearch((anyptr)&p2p2c, (anyptr)_sboolnames,
  1293. X                NUM_OF_BOOLS, sizeof(p2p2c), _compar);
  1294. X        if (match == NULL) {
  1295. X            fprintf(stderr, "unknown bool name '%s'\n", cap);
  1296. X            continue;
  1297. X        }
  1298. X        printf("\t%d,\n", *match - boolnames);
  1299. X    }
  1300. X    puts("\t-1");
  1301. X    puts("};\n");
  1302. X
  1303. X    puts("int _numorder[] = {");
  1304. X
  1305. X    while(1) {
  1306. X        r = fscanf(f, "%s", cap);
  1307. X        if (r != 1) {
  1308. X            fprintf(stderr, "unexpected EOF\n");
  1309. X            exit(1);
  1310. X        }
  1311. X        if (strcmp(cap, "$") == 0)
  1312. X            break;
  1313. X        match = bsearch((anyptr)&p2p2c, (anyptr)_snumnames,
  1314. X                NUM_OF_NUMS, sizeof(p2p2c), _compar);
  1315. X        if (match == NULL) {
  1316. X            fprintf(stderr, "unknown num name '%s'\n", cap);
  1317. X            continue;
  1318. X        }
  1319. X        printf("\t%d,\n", *match - numnames);
  1320. X    }
  1321. X    puts("\t-1");
  1322. X    puts("};\n");
  1323. X
  1324. X    puts("int _strorder[] = {");
  1325. X
  1326. X    while(1) {
  1327. X        r = fscanf(f, "%s", cap);
  1328. X        if (r != 1)
  1329. X            break;
  1330. X        match = bsearch((anyptr)&p2p2c, (anyptr)_sstrnames,
  1331. X                NUM_OF_STRS, sizeof(p2p2c), _compar);
  1332. X        if (match == NULL) {
  1333. X            fprintf(stderr, "unknown str name '%s'\n", cap);
  1334. X            continue;
  1335. X        }
  1336. X        printf("\t%d,\n", *match - strnames);
  1337. X    }
  1338. X    puts("\t-1");
  1339. X    puts("};\n");
  1340. X
  1341. X    return 0;
  1342. X}
  1343. SHAR_EOF
  1344. chmod 0644 mkbinorder.c || echo "restore of mkbinorder.c fails"
  1345. case $TOUCH in
  1346. can)
  1347.     touch -am 0402044690 mkbinorder.c
  1348.     ;;
  1349. esac
  1350. set `wc -c mkbinorder.c`;Wc_c=$1
  1351. case "$Wc_c" in
  1352. "2151") ;;
  1353. *) echo original size 2151, current size $Wc_c ;;
  1354. esac
  1355. # ============= gettbin.c ==============
  1356. echo "x - extracting gettbin.c (Text)"
  1357. sed 's/^X//' << 'SHAR_EOF' > gettbin.c &&
  1358. X/*
  1359. X * gettbin.c
  1360. X *
  1361. X * By Ross Ridge
  1362. X * Public Domain
  1363. X * 90/03/23 03:50:54
  1364. X *
  1365. X * Get a terminfo binary entry
  1366. X *
  1367. X */
  1368. X
  1369. X#include "defs.h"
  1370. X#include "term.h"
  1371. X
  1372. X#ifdef USE_SCCS_IDS
  1373. Xstatic char SCCSid[] = "@(#) gettbin.c 1.2";
  1374. X#endif
  1375. Xextern int _boolorder[], _numorder[], _strorder[];
  1376. X
  1377. X#ifdef TRUE_BYTE_ORDERING 
  1378. X/* 8 bit char, 16 bit short, lsb first, twos complement */
  1379. X#define convshort(s) (*(short *)(s))
  1380. X#else
  1381. X#ifdef TWOS_COPLEMENT 
  1382. X/* 8 bit char, 16 bit short, lsb last, twos complement */
  1383. X#define convshort(s) ((short)(((s[0] & 0377) << 8) | (s[1] & 0377)))
  1384. X#else
  1385. X/* anything else... */
  1386. Xstatic short convshort(s)
  1387. Xchar *s; {
  1388. X    register int a,b;
  1389. X
  1390. X    a = (int) s[0] & 0377;
  1391. X    b = (int) s[1] & 0377;
  1392. X
  1393. X    if (a == 0377 && b == 0377)
  1394. X        return -1;
  1395. X    if (a == 0376 && b == 0377)
  1396. X        return -2;
  1397. X
  1398. X    return a + b * 256;
  1399. X}
  1400. X#endif
  1401. X#endif
  1402. X
  1403. Xint _gettbin(buf, cur)
  1404. Xchar *buf;
  1405. XTERMINAL *cur; {
  1406. X    register char *s;
  1407. X    int i;
  1408. X    int sz_names, sz_bools, sz_nums, sz_offs, sz_strs;
  1409. X    int n_bools, n_nums, n_strs;
  1410. X    char *strtbl;
  1411. X
  1412. X    buf[MAX_BUF] = '\0';
  1413. X    s = buf;
  1414. X
  1415. X    if (convshort(s) != 0432)
  1416. X        return 1;
  1417. X    sz_names = convshort(s + 2);
  1418. X    sz_bools = convshort(s + 4);
  1419. X    n_nums = convshort(s + 6);
  1420. X    n_strs = convshort(s + 8);
  1421. X    sz_strs = convshort(s + 10);
  1422. X
  1423. X    n_bools = sz_bools;
  1424. X    sz_nums = n_nums * 2;
  1425. X    sz_offs = n_strs * 2;
  1426. X
  1427. X    if ((sz_names + sz_bools) & 1)
  1428. X        sz_bools++;
  1429. X
  1430. X    if (12 + sz_names + sz_bools + sz_nums + sz_offs + sz_strs > MAX_BUF)
  1431. X        return 1;
  1432. X
  1433. X    s += 12;
  1434. X    if ((cur->name_all = _addstr(s)) == NULL)
  1435. X        return 1;
  1436. X    s += sz_names;
  1437. X    while(--s >= buf + 12) {
  1438. X        if (*s == '|') {
  1439. X            if ((cur->name_long = _addstr(s + 1)) == NULL)
  1440. X                return 1;
  1441. X            break;
  1442. X        }
  1443. X    }
  1444. X
  1445. X    s = buf + 12 + sz_names;
  1446. X    for(i = 0; i < n_bools && _boolorder[i] != -1; i++, s++) {
  1447. X        if (cur->bools[_boolorder[i]] == -1 && *s == 1)
  1448. X            cur->bools[_boolorder[i]] = 1;
  1449. X    }
  1450. X
  1451. X    s = buf + 12 + sz_names + sz_bools;
  1452. X    for(i = 0; i < n_nums && _numorder[i] != -1; i++, s += 2) {
  1453. X        if (convshort(s) == -2) 
  1454. X            cur->nums[_numorder[i]] = -1;
  1455. X        else if (cur->nums[_numorder[i]] == -2 && convshort(s) != -1)
  1456. X            cur->nums[_numorder[i]] = convshort(s);
  1457. X    }
  1458. X
  1459. X    s = buf + 12 + sz_names + sz_bools + sz_nums;
  1460. X    strtbl = s + sz_offs;
  1461. X    for(i = 0; i < n_strs && _strorder[i] != -1; i++, s += 2) {
  1462. X        if (convshort(s) == -2)
  1463. X            cur->strs[_strorder[i]] = NULL;
  1464. X        else if (cur->strs[_strorder[i]] == (char *) -1
  1465. X             && convshort(s) != -1) {
  1466. X#ifdef DEBUG
  1467. X            printf("$%s ", strnames[_strorder[i]]);
  1468. X#endif
  1469. X            if ((cur->strs[_strorder[i]]
  1470. X                 = _addstr(strtbl + convshort(s))) == NULL)
  1471. X                return 1;
  1472. X        } 
  1473. X    }
  1474. X
  1475. X    return 0;
  1476. X}
  1477. SHAR_EOF
  1478. chmod 0644 gettbin.c || echo "restore of gettbin.c fails"
  1479. case $TOUCH in
  1480. can)
  1481.     touch -am 0402044690 gettbin.c
  1482.     ;;
  1483. esac
  1484. set `wc -c gettbin.c`;Wc_c=$1
  1485. case "$Wc_c" in
  1486. "2512") ;;
  1487. *) echo original size 2512, current size $Wc_c ;;
  1488. esac
  1489. # ============= quit.c ==============
  1490. echo "x - extracting quit.c (Text)"
  1491. sed 's/^X//' << 'SHAR_EOF' > quit.c &&
  1492. X/*
  1493. X * quit.c
  1494. X *
  1495. X * By Ross Ridge
  1496. X * Public Domain
  1497. X * 90/03/31 10:16:29
  1498. X *
  1499. X * quit with a diagnostic message printed on stderr
  1500. X *
  1501. X */
  1502. X
  1503. X#define NOTLIB
  1504. X#include "defs.h"
  1505. X
  1506. X#ifdef USE_SCCS_IDS
  1507. Xstatic char SCCSid[] = "@(#) quit.c 1.3";
  1508. X#endif
  1509. Xchar *prg_name;
  1510. X
  1511. X#if defined(USE_PROTOTYPES) && !defined(lint)
  1512. Xvoid (*cleanup)(int);
  1513. X#else
  1514. Xvoid (*cleanup)();
  1515. X#endif
  1516. X
  1517. X#ifdef USE_STDARG
  1518. X#ifdef USE_PROTOTYPES
  1519. Xvoid quit(int e, char *fmt, ...)
  1520. X#else
  1521. Xvoid quit(e, fmt)
  1522. Xint e;
  1523. Xchar *fmt;
  1524. X#endif
  1525. X#else
  1526. Xvoid quit(va_alist)
  1527. Xva_dcl
  1528. X#endif
  1529. X{
  1530. X#ifndef USE_STDARG
  1531. X    int e;
  1532. X    char *fmt;
  1533. X#endif
  1534. X    va_list ap;
  1535. X
  1536. X#ifdef USE_STDARG
  1537. X    ap = va_start(ap, fmt);
  1538. X#else
  1539. X    ap = va_start(ap);
  1540. X    e = va_arg(ap, int);
  1541. X    fmt = va_arg(ap, char *);
  1542. X#endif
  1543. X
  1544. X    (*cleanup)(e);
  1545. X
  1546. X    if (e != 0)
  1547. X        fprintf(stderr, "%s: ", prg_name);
  1548. X#ifdef USE_DOPRNT
  1549. X    _doprnt(fmt, ap, stderr);
  1550. X#else
  1551. X    vfprintf(stderr, fmt, ap);
  1552. X#endif
  1553. X    putc('\n', stderr);
  1554. X    if (e > 0 && e < sys_nerr) {
  1555. X        fprintf(stderr, "%d - %s\n", e, sys_errlist[e]);
  1556. X    }
  1557. X    fflush(stderr);
  1558. X    exit(e);
  1559. X}
  1560. SHAR_EOF
  1561. chmod 0644 quit.c || echo "restore of quit.c fails"
  1562. case $TOUCH in
  1563. can)
  1564.     touch -am 0402044690 quit.c
  1565.     ;;
  1566. esac
  1567. set `wc -c quit.c`;Wc_c=$1
  1568. case "$Wc_c" in
  1569. "992") ;;
  1570. *) echo original size 992, current size $Wc_c ;;
  1571. esac
  1572. # ============= ttest.c ==============
  1573. echo "x - extracting ttest.c (Text)"
  1574. sed 's/^X//' << 'SHAR_EOF' > ttest.c &&
  1575. X/*
  1576. X * ttest.c
  1577. X *
  1578. X * By Ross Ridge
  1579. X * Public Domain
  1580. X * 90/03/22 03:43:45
  1581. X *
  1582. X */
  1583. X#define NOTLIB
  1584. X#include "defs.h"
  1585. X#include "term.h"
  1586. X
  1587. Xstatic char SCCSid[] = "@(#) ttest.c 1.1";
  1588. X
  1589. Xint cup(x,y)
  1590. Xint x, y; {
  1591. X    if (columns < 2 || lines < 2)
  1592. X        return -1;
  1593. X    if (cursor_address != NULL) 
  1594. X        putp(tparm(cursor_address, y, x));
  1595. X    else if (cursor_home != NULL && cursor_down != NULL
  1596. X         && cursor_right != NULL) {
  1597. X        putp(cursor_home);
  1598. X        if (parm_down_cursor != NULL)
  1599. X            putp(tparm(parm_down_cursor, y));
  1600. X        else
  1601. X            for(; y > 0; y--)
  1602. X                putp(cursor_down);
  1603. X        if (parm_right_cursor != NULL)
  1604. X            putp(tparm(parm_right_cursor, y));
  1605. X        else
  1606. X            for(; y > 0; y--)
  1607. X                putp(cursor_right);
  1608. X    } else if (cursor_to_ll != NULL && cursor_up != NULL
  1609. X           && cursor_right != NULL) {
  1610. X        putp(cursor_to_ll);
  1611. X        if (parm_up_cursor != NULL)
  1612. X            putp(tparm(parm_up_cursor, y));
  1613. X        else
  1614. X            for(y++; y < columns ; y++)
  1615. X                putp(cursor_up);
  1616. X        if (parm_right_cursor != NULL)
  1617. X            putp(tparm(parm_right_cursor, y));
  1618. X        else
  1619. X            for(; y > 0; y--)
  1620. X                putp(cursor_right);
  1621. X    } else
  1622. X        return 1;
  1623. X    return 0;
  1624. X}
  1625. X
  1626. Xint clear() {
  1627. X    int r;
  1628. X    if (clear_screen != NULL)
  1629. X        putp(clear_screen);
  1630. X    else if (clr_eos != NULL) {
  1631. X        r = cup(0,0);
  1632. X        if (r != 0)
  1633. X            return r;
  1634. X        putp(clr_eos);
  1635. X    } else
  1636. X        return -2;
  1637. X    return 0;
  1638. X}
  1639. X
  1640. Xvoid nl() {
  1641. X    if (newline != NULL) 
  1642. X        putp(newline);
  1643. X    else if (carriage_return != NULL && cursor_down != NULL) {
  1644. X        putp(cursor_down);
  1645. X        putp(carriage_return);
  1646. X    } else 
  1647. X        quit(-1, "can't do a newline");
  1648. X    return;
  1649. X}
  1650. X
  1651. Xvoid putln(s)
  1652. Xchar *s; {
  1653. X    int i;
  1654. X
  1655. X    if (columns < 2 || auto_right_margin)
  1656. X        fputs(s, stdout);
  1657. X    else {
  1658. X        i = 0;
  1659. X        while(*s) {
  1660. X            putchar(*s);
  1661. X            s++;
  1662. X            if (++i == columns) {
  1663. X                nl();
  1664. X                i = 0;
  1665. X            }
  1666. X        }
  1667. X    }
  1668. X    nl();
  1669. X}
  1670. X
  1671. Xvoid anykey() {
  1672. X    fputs("-- press any key --", stdout);
  1673. X    fflush(stdout);
  1674. X    getchar();
  1675. X    nl();
  1676. X}
  1677. X
  1678. Xvoid do_cleanup(e)
  1679. Xint e; {
  1680. X    fflush(stdout);
  1681. X    fflush(stderr);
  1682. X    reset_shell_mode();
  1683. X    fprintf(stderr, "\n");
  1684. X}
  1685. X
  1686. X#ifdef USE_SGTTY
  1687. Xstruct sgttyb new_tty;
  1688. X#else
  1689. Xstruct termio new_tty;
  1690. X#endif
  1691. X
  1692. Xmain(argc, argv)
  1693. Xint argc;
  1694. Xchar **argv; {
  1695. X    int r;
  1696. X    register int i;
  1697. X
  1698. X    prg_name = argv[0];
  1699. X    cleanup = do_cleanup;
  1700. X
  1701. X    if (argc == 1)
  1702. X        setupterm(NULL, 1, (int *) 0);
  1703. X    else if (argc == 2)
  1704. X        setupterm(argv[1], 1, (int *) 0);
  1705. X    else {
  1706. X        fprintf(stderr, "usage: %s [terminal]\n", argv[0]);
  1707. X        return 1;
  1708. X    }
  1709. X    fflush(stderr);
  1710. X    fflush(stdout);
  1711. X#ifdef USE_SGTTY
  1712. X    ioctl(1, TIOCGETP, &new_tty);
  1713. X    new_tty.sg_flags &= ~(CRMOD | ECHO | XTABS);
  1714. X#ifdef CBREAK
  1715. X    new_tty.sg_flags |= CBREAK;
  1716. X#else
  1717. X    new_tty.sg_flags |= RAW;
  1718. X#endif
  1719. X    ioctl(1, TIOCSETP, &new_tty);
  1720. X#endif
  1721. X#ifdef USE_TERMIO
  1722. X    ioctl(1, TCGETA, &new_tty);
  1723. X    new_tty.c_lflag &= ~(ICANON | ECHO);
  1724. X    new_tty.c_oflag &= ~(OPOST);
  1725. X    new_tty.c_cc[VMIN] = 1;
  1726. X    new_tty.c_cc[VTIME] = 1;
  1727. X    ioctl(1, TCSETA, &new_tty);
  1728. X#endif
  1729. X    def_prog_mode();
  1730. X    
  1731. X    clear();
  1732. X    printf("columns = %d", columns);
  1733. X    nl();
  1734. X    printf("lines = %d", lines);
  1735. X    if (columns < 2)
  1736. X        quit(-1, "columns must be > 1");
  1737. X    nl();
  1738. X    anykey();
  1739. X    nl();
  1740. X    if (auto_right_margin) {
  1741. X        putln("auto_right_margin = TRUE");
  1742. X        nl();
  1743. X        for(i = 0; i < columns; i++)
  1744. X            putchar('1');
  1745. X        for(i = 0; i < columns / 2; i++)
  1746. X            putchar('2');
  1747. X        nl();
  1748. X    } else {
  1749. X        putln("auto_right_margin = FALSE");
  1750. X        nl();
  1751. X        for(i = 0; i < columns + columns / 2; i++)
  1752. X            putchar('1');
  1753. X        nl();
  1754. X        for(i = 0; i < columns / 2; i++)
  1755. X            putchar('2');
  1756. X        nl();
  1757. X    }
  1758. X    nl();
  1759. X    putln("***a line of 1's followed by a line of 2's");
  1760. X    nl();
  1761. X    anykey();
  1762. X    nl();
  1763. X
  1764. X    if (over_strike) {
  1765. X        putln("over_strike = TRUE");
  1766. X        if (cursor_left != NULL) {
  1767. X            for(i = 0; i < columns / 4 + 1; i++) {
  1768. X                putchar('/');
  1769. X                putp(cursor_left);
  1770. X                putchar('\\');
  1771. X            }
  1772. X        } else if (carriage_return != NULL) {
  1773. X            for(i = 0; i < columns / 4 + 1; i++) 
  1774. X                putchar('/');
  1775. X            putp(carriage_return);
  1776. X            for(i = 0; i < columns / 4 + 1; i++) 
  1777. X                putchar('\\');
  1778. X        }
  1779. X        nl();
  1780. X        nl();
  1781. X        putln("*** X's made from \\'s overstriking /'s");
  1782. X        nl();
  1783. X        anykey();
  1784. X        nl();
  1785. X    }
  1786. X
  1787. X    if (cup(0,0) == 0) {
  1788. X        clear();
  1789. X        putln("cup test");
  1790. X        for(i = 1; i < columns; i++)
  1791. X            putp(tparm(cursor_address, 0, i));
  1792. X        for(i = 0; i < lines; i++)
  1793. X            putp(tparm(cursor_address, i, columns - 1));
  1794. X        for(i = columns; i--;)
  1795. X            putp(tparm(cursor_address, lines - 1, i));
  1796. X        for(i = lines; i--;)
  1797. X            putp(tparm(cursor_address, i, 0));
  1798. X        nl();
  1799. X        anykey();
  1800. X    }
  1801. X    clear();
  1802. X    reset_shell_mode();
  1803. X    
  1804. X    return (1);
  1805. X}
  1806. SHAR_EOF
  1807. chmod 0644 ttest.c || echo "restore of ttest.c fails"
  1808. case $TOUCH in
  1809. can)
  1810.     touch -am 0402044690 ttest.c
  1811.     ;;
  1812. esac
  1813. set `wc -c ttest.c`;Wc_c=$1
  1814. case "$Wc_c" in
  1815. "4213") ;;
  1816. *) echo original size 4213, current size $Wc_c ;;
  1817. esac
  1818. # ============= caps.c ==============
  1819. echo "x - extracting caps.c (Text)"
  1820. sed 's/^X//' << 'SHAR_EOF' > caps.c &&
  1821. X/*
  1822. X * caps.c
  1823. X * 
  1824. X * By Ross Ridge
  1825. X * Public Domain
  1826. X * 90/03/22 03:43:45
  1827. X *
  1828. X * caps [-c | -t] [term]
  1829. X *
  1830. X * -c        use termcap names instead of terminfo variable names
  1831. X * -t        use terminfo capnames instead of variables names
  1832. X * term     name of terminal to use
  1833. X *
  1834. X * prints out all the capabilities given the specified terminal. If no
  1835. X * terminal is given, it is taken from the environment variable TERM.
  1836. X *
  1837. X */
  1838. X
  1839. X#define NOTLIB
  1840. X#include "defs.h"
  1841. X#include "term.h"
  1842. X
  1843. Xstatic char SCCSid[] = "@(#) caps.c 1.1";
  1844. X
  1845. X/* output a string in a human readable format */
  1846. Xvoid putstr(s)
  1847. Xchar *s; {
  1848. X    while(*s != '\0') {
  1849. X        switch(*s) {
  1850. X        case '\n': printf("\\n"); break;
  1851. X        case '\b': printf("\\b"); break;
  1852. X        case '\t': printf("\\t"); break;
  1853. X        case '\r': printf("\\r"); break;
  1854. X        case '\f': printf("\\f"); break;
  1855. X        case ' ': printf("\\s"); break;
  1856. X        case '\177': printf("^?"); break;
  1857. X        case '\200': printf("\\0"); break;
  1858. X        default:
  1859. X            if (*s > 0 && *s < 32)
  1860. X                printf("^%c", *s + 64);
  1861. X            else if (*s < 0 || *s > 127)
  1862. X                printf("\\%03o", *s & 0xff);
  1863. X            else
  1864. X                putchar(*s);
  1865. X            break;
  1866. X        }
  1867. X        s++;
  1868. X    }
  1869. X}
  1870. X
  1871. Xvoid do_cleanup(e)
  1872. Xint e; {
  1873. X    fprintf(stderr, "usage: %s [-c | -t ] [terminal]\n", prg_name);
  1874. X    return;
  1875. X}
  1876. X
  1877. Xint main(argc, argv)
  1878. Xint argc;
  1879. Xchar **argv; {
  1880. X    int names = 0;
  1881. X    register int i;
  1882. X    int flag, num;
  1883. X    char *str;
  1884. X
  1885. X    prg_name = argv[0];
  1886. X    cleanup = do_cleanup;
  1887. X
  1888. X    if (argc > 3)
  1889. X        quit(-1, "argument count");
  1890. X
  1891. X    if (argc == 1)
  1892. X        setupterm(NULL, 2, (int *) 0);
  1893. X    else if (argc == 2)
  1894. X        setupterm(argv[1], 2, (int *) 0);
  1895. X    else {
  1896. X        if (argv[1][0] != '-')
  1897. X            quit(-1, "bad switch");
  1898. X        if (argv[1][1] == 'c')
  1899. X            names = 2;
  1900. X        else if (argv[1][1] == 't')
  1901. X            names = 1;
  1902. X        else
  1903. X            quit(-1, "unknown switch '%c'", argv[1][1]);
  1904. X        setupterm(argv[2], 2, (int *) 0);
  1905. X
  1906. X    }
  1907. X
  1908. X    fflush(stderr);
  1909. X    fflush(stdout);
  1910. X    printf("\n");
  1911. X#ifdef _CUR_TERM
  1912. X    printf("%s: %s\n", cur_term->name, cur_term->name_all);
  1913. X    printf("pad: %d xon: %d termcap: %d\n",
  1914. X            cur_term->pad, cur_term->xon, cur_term->termcap);
  1915. X    printf("true_columns: %d true_lines: %d baudrate: %d\n",
  1916. X        cur_term->true_columns, cur_term->true_lines,
  1917. X        cur_term->baudrate);
  1918. X    printf("\n");
  1919. X#endif
  1920. X
  1921. X    printf("Booleans:\n");
  1922. X    for(i = 0; boolnames[i] != NULL; i++) {
  1923. X#ifdef _CUR_TERM
  1924. X        flag = cur_term->bools[i];
  1925. X#else
  1926. X        flag = tigetflag(boolnames[i]);
  1927. X#endif
  1928. X        if (flag != -1 && flag != 0) {
  1929. X            switch(names) {
  1930. X            case 0:
  1931. X                printf("  %s\n", boolfnames[i]);
  1932. X                break;
  1933. X            case 1:
  1934. X                printf("  %s\n", boolnames[i]);
  1935. X                break;
  1936. X            case 2:
  1937. X                printf("  %s\n", boolcodes[i]);
  1938. X                break;
  1939. X            }
  1940. X        }
  1941. X    }
  1942. X
  1943. X    printf("\nNumerics:\n");
  1944. X    for(i = 0; numnames[i] != NULL; i++) {
  1945. X        num = tigetnum(numnames[i]);
  1946. X        if (num != -2 && num != -1) {
  1947. X            switch(names) {
  1948. X            case 0:
  1949. X                printf("  %-32s: %d\n", numfnames[i], num);
  1950. X                break;
  1951. X            case 1:
  1952. X                printf("  %-5s: %d\n", numnames[i], num);
  1953. X                break;
  1954. X            case 2:
  1955. X                printf("  %-2s: %d\n", numcodes[i], num);
  1956. X                break;
  1957. X            }
  1958. X        }
  1959. X    }
  1960. X    printf("\nStrings:\n");
  1961. X    for(i = 0; strnames[i] != NULL; i++) {
  1962. X        str = tigetstr(strnames[i]);
  1963. X        if (str != (char *) -1 && str != (char *) 0) {
  1964. X            switch(names) {
  1965. X            case 0:
  1966. X                printf("  %-32s: ", strfnames[i]);
  1967. X                break;
  1968. X            case 1:
  1969. X                printf("  %-5s: ", strnames[i]);
  1970. X                break;
  1971. X            case 2:
  1972. X                printf("  %-2s: ", strcodes[i]);
  1973. X                break;
  1974. X            }
  1975. X            putstr(str);
  1976. X            putchar('\n');
  1977. X        }
  1978. X    }
  1979. X    return 0;
  1980. X}
  1981. SHAR_EOF
  1982. chmod 0644 caps.c || echo "restore of caps.c fails"
  1983. case $TOUCH in
  1984. can)
  1985.     touch -am 0402044690 caps.c
  1986.     ;;
  1987. esac
  1988. set `wc -c caps.c`;Wc_c=$1
  1989. case "$Wc_c" in
  1990. "3264") ;;
  1991. *) echo original size 3264, current size $Wc_c ;;
  1992. esac
  1993. # ============= conv.c ==============
  1994. echo "x - extracting conv.c (Text)"
  1995. sed 's/^X//' << 'SHAR_EOF' > conv.c &&
  1996. X/*
  1997. X * conv.c
  1998. X *
  1999. X * Ross Ridge 
  2000. X * Public Domain
  2001. X * 90/03/31 08:48:56
  2002. X *
  2003. X * conv [-b] [-c [-OUGd]] [-i] [-B [-D dir]] [-I] [-k] [-t term] [file]
  2004. X *
  2005. X * -c        convert from termcap
  2006. X * -i        convert from terminfo source
  2007. X * -b        convert from terminfo binary
  2008. X * -B        convert to terminfo binary
  2009. X * -I        convert to terminfo source
  2010. X *
  2011. X * The following switches are available when converting from termcap:
  2012. X * -d        don't supply any defaults for missing capabilities
  2013. X * -O        include obsolete termcap capabilities
  2014. X * -G        include GNU capabilities
  2015. X * -U        include UW capabilities
  2016. X *
  2017. X * -k        keep comments
  2018. X * -D dir    directory to put terminfo binaries in
  2019. X *
  2020. X * -t term    name of terminal to translate
  2021. X * file        filename of termcap/terminfo database to use 
  2022. X *
  2023. X * If a file is specifed and no terminal is given the entire file we be
  2024. X * translated.
  2025. X * If no terminal and no file is specified then the terminal name will be
  2026. X * taken from the environment varible TERM.
  2027. X * Unless compiling to a terminfo binary, output is to stdout.
  2028. X *
  2029. X */
  2030. X
  2031. X#define NOTLIB
  2032. X#include "defs.h"
  2033. X#define SINGLE
  2034. X#include "term.h"
  2035. X
  2036. X#include <ctype.h>
  2037. X#include <fcntl.h>
  2038. X#include <sys/stat.h>
  2039. X
  2040. X#ifndef lint
  2041. Xstatic char SCCSid[] = "@(#) conv.c 1.4";
  2042. X#endif
  2043. X
  2044. Xextern int errno;
  2045. X
  2046. X/* the right margin of the output */
  2047. X#define LINELEN 76
  2048. X
  2049. Xstruct term_path *path;    /* returned from _buildpath */
  2050. X
  2051. XTERMINAL _term_buf;
  2052. Xchar buf[MAX_BUF+1];    /* buffer for the termcap entry */
  2053. X
  2054. Xint noOT = 1;        /* -O */
  2055. Xint noGNU = 1;        /* -G */
  2056. Xint noUW = 1;        /* -W */
  2057. Xint dodefault = 1;    /* -d */
  2058. Xint keepcomments = 0;    /* -k */
  2059. Xint compile = 0;    /* -B */
  2060. Xint from_tcap = 0;    /* -c */
  2061. Xint from_tinfo = 0;    /* -i */
  2062. Xint from_tbin = 0;    /* -b */
  2063. Xchar *directory = NULL; /* -D */
  2064. X
  2065. Xint continued = 0;
  2066. Xint termcap = 1;
  2067. X
  2068. Xint lineno = 0;        /* current line number */
  2069. X
  2070. X/* print the first part of a warning message */
  2071. Xvoid warn() {
  2072. X    if (lineno == 0)
  2073. X        fprintf(stderr, "warning: ");
  2074. X    else
  2075. X        fprintf(stderr, "(%s)%d: warning: ",
  2076. X            _term_buf.name_long, lineno);
  2077. X}
  2078. X
  2079. X/* output a string indenting at the beginning of a line, and wraping
  2080. X * at the right margin. 
  2081. X */
  2082. Xvoid putstr(s)
  2083. Xchar *s; {
  2084. X    static pos = 0;
  2085. X    int l;
  2086. X
  2087. X    if (s == NULL) {
  2088. X        if (pos != 0) {
  2089. X            pos = 0;
  2090. X            putchar('\n');
  2091. X        }
  2092. X        return;
  2093. X    }
  2094. X    
  2095. X    if (termcap && noOT && *s == 'O')
  2096. X        return;
  2097. X    if (termcap && noGNU && *s == 'G')
  2098. X        return;
  2099. X    if (termcap && noUW && *s == 'U')
  2100. X        return;
  2101. X
  2102. X    l = strlen(s) + 2;
  2103. X
  2104. X    if (l + pos > LINELEN && pos != 0) {
  2105. X        putchar('\n');
  2106. X        pos = 0;
  2107. X    }
  2108. X
  2109. X    if (pos == 0) {
  2110. X        putchar('\t');
  2111. X        pos = 8;
  2112. X    } else
  2113. X        putchar(' ');
  2114. X
  2115. X    printf("%s,", s);
  2116. X
  2117. X    pos += l;
  2118. X}
  2119. X
  2120. X#ifndef MAX_PUSHED
  2121. X/* maximum # of parameter that can be pushed onto the stack */
  2122. X#define MAX_PUSHED 16
  2123. X#endif
  2124. X
  2125. Xint stack[MAX_PUSHED];    /* the stack */
  2126. Xint stackptr;        /* the next empty place on the stack */
  2127. Xint onstack;        /* the top of stack */
  2128. Xint seenm;        /* seen a %m */
  2129. Xint seenn;        /* seen a %n */
  2130. Xint seenr;        /* seen a %r */
  2131. Xint param;        /* current parameter */
  2132. Xchar *dp;        /* pointer to the end of the converted string */
  2133. X
  2134. X/* push onstack on to the stack */
  2135. Xvoid push() {
  2136. X    if (stackptr > MAX_PUSHED) {
  2137. X        warn();
  2138. X        fprintf(stderr, "string to complex to covert\n");
  2139. X    } else
  2140. X        stack[stackptr++] = onstack;
  2141. X}
  2142. X
  2143. X/* pop the top of the stack into onstack */
  2144. Xvoid pop() {
  2145. X    if (stackptr == 0) 
  2146. X        if (onstack == 0) {
  2147. X            warn();
  2148. X            fprintf(stderr, "I'm confused\n");
  2149. X        } else
  2150. X            onstack = 0;
  2151. X    else
  2152. X        onstack = stack[--stackptr];
  2153. X    param++;
  2154. X}
  2155. X
  2156. X/* convert a character to a terminfo push */
  2157. Xstatic int cvtchar(sp)
  2158. Xregister char *sp; {
  2159. X    char c;
  2160. X    int l;
  2161. X
  2162. X    switch(*sp) {
  2163. X    case '\\':
  2164. X        switch(*++sp) {
  2165. X        case '\'':
  2166. X        case '$':
  2167. X        case '\\':
  2168. X        case '%':
  2169. X            c = *sp;
  2170. X            l = 2;
  2171. X            break;
  2172. X        case '\0':
  2173. X            c = '\\';
  2174. X            l = 1;
  2175. X            break;
  2176. X        case '0':
  2177. X            if (sp[1] == '0' && sp[2] == '0') {
  2178. X                c = '\0';
  2179. X                l = 4;
  2180. X            } else {
  2181. X                c = '\200'; /* '\0' ???? */
  2182. X                l = 2;
  2183. X            }
  2184. X            break;
  2185. X        default:
  2186. X            c = *sp;
  2187. X            l = 2;
  2188. X            break;
  2189. X        }
  2190. X        break;
  2191. X    default:
  2192. X        c = *sp;
  2193. X        l = 1;
  2194. X    }
  2195. X    c &= 0177;
  2196. X    if (isgraph(c) && c != ',' && c != '\'' && c != '\\' && c != ':') {
  2197. X        *dp++ = '%'; *dp++ = '\''; *dp++ = c; *dp++ = '\'';
  2198. X    } else {
  2199. X        *dp++ = '%'; *dp++ = '{';
  2200. X        if (c > 99)
  2201. X            *dp++ = c / 100 + '0';
  2202. X        if (c > 9)
  2203. X            *dp++ = (c / 10) % 10 + '0';
  2204. X        *dp++ = c % 10 + '0';
  2205. X        *dp++ = '}';
  2206. X    }
  2207. X    return l;
  2208. X}
  2209. X
  2210. X/* push n copies of param on the terminfo stack if not already there */
  2211. Xvoid getparm(parm, n)
  2212. Xint parm;
  2213. Xint n; {
  2214. X    if (seenr)  {
  2215. X        if (parm == 1)
  2216. X            parm = 2;
  2217. X        else if (parm == 2)
  2218. X            parm = 1;
  2219. X    }
  2220. X    if (onstack == parm) {
  2221. X        if (n > 1) {
  2222. X            warn();
  2223. X            fprintf(stderr, "string may not be optimal");
  2224. X            *dp++ = '%'; *dp++ = 'P'; *dp++ = 'a';
  2225. X            while(n--) {
  2226. X                *dp++ = '%'; *dp++ = 'g'; *dp++ = 'a';
  2227. X            }
  2228. X        }
  2229. X        return;
  2230. X    }
  2231. X    if (onstack != 0)
  2232. X        push();
  2233. X
  2234. X    onstack = parm;
  2235. X    
  2236. X    while(n--) {        /* %p0 */
  2237. X        *dp++ = '%'; *dp++ = 'p'; *dp++ = '0' + parm;
  2238. X    }
  2239. X
  2240. X    if (seenn && parm < 3) { /* %{96}%^ */
  2241. X        *dp++ = '%'; *dp++ = '{'; *dp++ = '9'; *dp++ = '6'; *dp++ = '}';
  2242. X        *dp++ = '%'; *dp++ = '^';
  2243. X    }
  2244. X    
  2245. X    if (seenm && parm < 3) { /* %{127}%^ */
  2246. X        *dp++ = '%'; *dp++ = '{'; *dp++ = '1'; *dp++ = '2'; *dp++ = '7';
  2247. X        *dp++ = '}'; *dp++ = '%'; *dp++ = '^';
  2248. X    }
  2249. X}
  2250. X
  2251. X/* convert a string to terminfo format */
  2252. Xchar *convstr(s, i)
  2253. Xregister char *s;
  2254. Xint i; {
  2255. X    static char line[MAX_LINE];
  2256. X    register char *cap;
  2257. X    int nocode = 0;
  2258. X
  2259. X    stackptr = 0;
  2260. X    onstack = 0;
  2261. X    seenm = 0;
  2262. X    seenn = 0;
  2263. X    seenr = 0;
  2264. X    param = 1;
  2265. X
  2266. X    dp = line;
  2267. X    cap = strnames[i];
  2268. X#if 0
  2269. X    if (cap[0] == 'k'
  2270. X        || ((cap[0] == 'i' || cap[0] == 'r') && cap[1] == 's'
  2271. X        && (cap[2] == '1' || cap[2] == '2' || cap[2] == '3')))
  2272. X    /* if (k.* || [ir]s[123]) */
  2273. X        nocode = 1;
  2274. X#else
  2275. X    if (_strflags[i] != 'G')
  2276. X        nocode = 1;
  2277. X#endif
  2278. X    if (!nocode) {
  2279. X        char *d = s;
  2280. X        while(*s != '\0') {
  2281. X            if (s[0] == '\\' && s[1] != '\0')
  2282. X                s++;
  2283. X            else if (s[0] == '%' && s[1] != '\0') {
  2284. X                if (s[1] == 'p') {
  2285. X                    if (termcap) {
  2286. X                        warn();
  2287. X                        fprintf(stderr,
  2288. X"string '%s' already in terminfo format\n", strcodes[i]);
  2289. X                        nocode = 1;
  2290. X                        break;
  2291. X                    } else
  2292. X                        nocode = 1;
  2293. X                }
  2294. X                s++;
  2295. X            }
  2296. X            s++;
  2297. X        }
  2298. X        if (!nocode && !termcap) {
  2299. X            warn();
  2300. X            fprintf(stderr,
  2301. X"string '%s' not in terminfo format, converting...\n", cap);
  2302. X        }
  2303. X        s = d;
  2304. X    }
  2305. X    while(*s != '\0') {
  2306. X        switch(*s) {
  2307. X        case '%':
  2308. X            s++;
  2309. X            if (nocode) {
  2310. X                *dp++ = '%';
  2311. X                break;
  2312. X            }
  2313. X            switch(*s++) {
  2314. X            case '%': *dp++ = '%'; break;
  2315. X            case 'r':
  2316. X                if (seenr++ == 1) {
  2317. X                    warn();
  2318. X                    fprintf(stderr, "seen %%r twice\n");
  2319. X                }
  2320. X                break;
  2321. X            case 'm':
  2322. X                if (seenm++ == 1) {
  2323. X                    warn();
  2324. X                    fprintf(stderr, "seen %%m twice\n");
  2325. X                }
  2326. X                break;
  2327. X            case 'n':
  2328. X                if (seenn++ == 1) {
  2329. X                    warn();
  2330. X                    fprintf(stderr, "seen %%n twice\n");
  2331. X                }
  2332. X                break;
  2333. X            case 'i': *dp++ = '%'; *dp++ = 'i'; break;
  2334. X            case '6': 
  2335. X            case 'B':
  2336. X                getparm(param, 2);
  2337. X                /* %{6}%*%+ */
  2338. X                *dp++ = '%'; *dp++ = '{'; *dp++ = '6';
  2339. X                *dp++ = '}'; *dp++ = '%'; *dp++ = '*';
  2340. X                *dp++ = '%'; *dp++ = '+';
  2341. X                break;
  2342. X            case '8':
  2343. X            case 'D':
  2344. X                getparm(param, 2);
  2345. X                /* %{2}%*%- */
  2346. X                *dp++ = '%'; *dp++ = '{'; *dp++ = '2';
  2347. X                *dp++ = '}'; *dp++ = '%'; *dp++ = '*';
  2348. X                *dp++ = '%'; *dp++ = '-';
  2349. X                break;
  2350. X            case '>':
  2351. X                getparm(param, 2);
  2352. X                /* %?%{x}%>%t%{y}%+%; */
  2353. X                *dp++ = '%'; *dp++ = '?'; 
  2354. X                s += cvtchar(s);
  2355. X                *dp++ = '%'; *dp++ = '>';
  2356. X                *dp++ = '%'; *dp++ = 't';
  2357. X                s += cvtchar(s);
  2358. X                *dp++ = '%'; *dp++ = '+';
  2359. X                *dp++ = '%'; *dp++ = ';';
  2360. X                break;
  2361. X            case 'a':
  2362. X                if ((*s == '=' || *s == '+' || *s == '-'
  2363. X                     || *s == '*' || *s == '/')
  2364. X                    && (s[1] == 'p' || s[1] == 'c')
  2365. X                        && s[2] != '\0') {
  2366. X                    int l;
  2367. X                    l = 2;
  2368. X                    if (*s != '=')
  2369. X                        getparm(param, 1);
  2370. X                    if (s[1] == 'p') {
  2371. X                        getparm(param + s[2] - '@', 1);
  2372. X                        if (param != onstack) {
  2373. X                            pop();
  2374. X                            param--;
  2375. X                        }
  2376. X                        l++;
  2377. X                    } else
  2378. X                        l += cvtchar(s + 2);
  2379. X                    switch(*s) {
  2380. X                    case '+':
  2381. X                        *dp++ = '%'; *dp++ = '+';
  2382. X                        break;
  2383. X                    case '-':
  2384. X                        *dp++ = '%'; *dp++ = '-';
  2385. X                        break;
  2386. X                    case '*':
  2387. X                        *dp++ = '%'; *dp++ = '*';
  2388. SHAR_EOF
  2389. echo "End of tinfo part 3"
  2390. echo "File conv.c is continued in part 4"
  2391. echo "4" > s3_seq_.tmp
  2392. exit 0
  2393. -- 
  2394. Ross Ridge                                 //
  2395. "The Great HTMU"                            [oo]
  2396. ross@contact.uucp                            -()-
  2397. ross@watcsc.waterloo.edu                         //
  2398.  
  2399.  
  2400.