home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume42 / ecu / part22 < prev    next >
Encoding:
Internet Message Format  |  1994-05-24  |  64.6 KB

  1. From: wht@n4hgf.atl.ga.us (Warren Tucker)
  2. Newsgroups: comp.sources.misc
  3. Subject: v42i120:  ecu - ECU Asynchronous Communications v3.30, Part22/37
  4. Date: 24 May 1994 09:07:08 -0500
  5. Organization: Sterling Software
  6. Sender: kent@sparky.sterling.com
  7. Approved: kent@sparky.sterling.com
  8. Message-ID: <2rt1mc$d3d@sparky.sterling.com>
  9. X-Md4-Signature: 658d76d361330e3dbef71950a3397a45
  10.  
  11. Submitted-by: wht@n4hgf.atl.ga.us (Warren Tucker)
  12. Posting-number: Volume 42, Issue 120
  13. Archive-name: ecu/part22
  14. Environment: SCO,SCOXENIX,MOTOROLA,HP-UX,LINUX,NetBSD,SUNOS,SYSVR4,SOLARIS2
  15. Supersedes: ecu: Volume 32, Issue 36-75
  16.  
  17. #! /bin/sh
  18. # This is a shell archive.  Remove anything before this line, then feed it
  19. # into a shell via "sh file" or similar.  To overwrite existing files,
  20. # type "sh file -c".
  21. # Contents:  ecu330/ecugrabbag.c ecu330/ecusetup.c ecu330/esdutil.c
  22. #   ecu330/pc_scr.h
  23. # Wrapped by kent@sparky on Mon May 23 13:40:57 1994
  24. PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
  25. echo If this archive is complete, you will see the following message:
  26. echo '          "shar: End of archive 22 (of 37)."'
  27. if test -f 'ecu330/ecugrabbag.c' -a "${1}" != "-c" ; then 
  28.   echo shar: Will not clobber existing file \"'ecu330/ecugrabbag.c'\"
  29. else
  30.   echo shar: Extracting \"'ecu330/ecugrabbag.c'\" \(19978 characters\)
  31.   sed "s/^X//" >'ecu330/ecugrabbag.c' <<'END_OF_FILE'
  32. X/*+-----------------------------------------------------------------
  33. X    ecugrabbag.c -- very machine/OS dependent functions
  34. X    wht@n4hgf.atl.ga.us
  35. X
  36. X  Defined functions:
  37. X    bell_alarm(xbell_type)
  38. X    bell_notify(xbell_type)
  39. X    bell_notify_text(bn)
  40. X    kbd_escape(xkey)
  41. X    morse_bell(xbell_type,count)
  42. X    parse_bell_notify_argument(strarg)
  43. X    rename(from,to)
  44. X    send_bell_fd(fd,count,nap_msec)
  45. X    send_get_response(narg,arg)
  46. X    set_bell_fd(fd,pitch,duration)
  47. X    set_default_escape_prompt()
  48. X    show_escape_prompt()
  49. X    signal_name_text(sig)
  50. X    xbell(type,count)
  51. X    xbell_fd(fd,type,count)
  52. X    xterm_title(text,code)
  53. X
  54. X  This module is a grab bag for historical reasons.  Needs reorg.
  55. X
  56. X  Like so many Americans, she was trying to construct a life that
  57. X  made sense from things she found in gift shops.  -- Kurt
  58. X  Vonnegut, Jr.
  59. X
  60. X------------------------------------------------------------------*/
  61. X/*+:EDITS:*/
  62. X/*:05-04-1994-04:38-wht@n4hgf-ECU release 3.30 */
  63. X/*:11-12-1993-11:00-wht@n4hgf-Linux changes by bob@vancouver.zadall.com */
  64. X/*:08-07-1993-21:16-wht@n4hgf-entering history mgr from col > 1 caused glitch */
  65. X/*:01-01-1993-12:52-wht@n4hgf-add procedure binding for function keys */
  66. X/*:12-20-1992-12:37-wht@n4hgf-WHT experiment with attributes */
  67. X/*:09-10-1992-13:58-wht@n4hgf-ECU release 3.20 */
  68. X/*:08-22-1992-15:38-wht@n4hgf-ECU release 3.20 BETA */
  69. X/*:04-09-1992-05:47-wht@n4hgf-cleanup new "bn" argument parsing */
  70. X/*:02-16-1992-01:41-wht@n4hgf-turn off xterm_title */
  71. X/*:12-13-1991-17:14-wht@n4hgf-add bell_notify_text */
  72. X/*:12-13-1991-17:14-wht@n4hgf-add parse_bell_notify_argument */
  73. X/*:09-03-1991-18:23-wht@n4hgf-sigint rearrangement in send_get_response */
  74. X/*:08-28-1991-14:07-wht@n4hgf2-SVR4 cleanup by aega84!lh */
  75. X/*:08-13-1991-15:28-wht@n4hgf-more problems with history manager */
  76. X/*:07-25-1991-12:57-wht@n4hgf-ECU release 3.10 */
  77. X/*:07-17-1991-07:04-wht@n4hgf-avoid SCO UNIX nap bug */
  78. X/*:07-14-1991-18:18-wht@n4hgf-new ttygets functions */
  79. X/*:06-29-1991-15:42-wht@n4hgf-if WHT and xterm, play with title bar */
  80. X/*:06-04-1991-13:19-wht@n4hgf-WHT version always gets morse for bells */
  81. X/*:05-07-1991-06:10-wht@n4hgf-subtle changes in send_and_get_response */
  82. X/*:03-18-1991-22:31-wht@n4hgf-ISC 2.2 has rename() */
  83. X/*:01-16-1991-23:54-wht@n4hgf-if WHT, bell_notify always available */
  84. X/*:01-09-1991-22:31-wht@n4hgf-ISC port */
  85. X/*:12-04-1990-03:55-wht@n4hgf-bell_notify only if on multiscreen */
  86. X/*:09-19-1990-19:36-wht@n4hgf-ecu_log_event now gets pid for log from caller */
  87. X/*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
  88. X
  89. X#include "ecu.h"
  90. X#include "ecukey.h"
  91. X#include "ecufkey.h"
  92. X#include "ecuxkey.h"
  93. X#include "ecutty.h"
  94. X#include "ecufork.h"
  95. X#include "esd.h"
  96. X
  97. X#if defined(MORSE)
  98. X/* the space between # and include prevents make depend from seeing this */
  99. X#include <local/morse_dvr.h>
  100. X#endif
  101. X
  102. Xchar *get_ttyname();
  103. X
  104. Xextern char curr_dir[];         /* current working key defns */
  105. Xextern KDE keyset_table[];
  106. Xextern char keyset_name[];
  107. X
  108. XESD *icmd_prompt;             /* interactive command prompt */
  109. Xint icmd_prompt_len;
  110. X
  111. X/*+-------------------------------------------------------------------------
  112. X    show_escape_prompt()
  113. Xreturns number of character positions written to screen
  114. X--------------------------------------------------------------------------*/
  115. Xint
  116. Xshow_escape_prompt()
  117. X{
  118. X    char prompt_last;
  119. X
  120. X    prompt_last = 'd';         /* dummy */
  121. X    if (icmd_prompt->cb)
  122. X        prompt_last = *(icmd_prompt->pb + icmd_prompt->cb - 1);
  123. X
  124. X    icmd_prompt_len = 0;
  125. X    shmx_make_rcvr_sleep(1);
  126. X    if (!(colors_current & 0xFFFF0000L) || !(colors_current & 0xFFFFL))
  127. X        setcolor(colors_normal);
  128. X    else
  129. X        setcolor(colors_current);
  130. X#ifdef WHT
  131. X    tcap_bold_on();
  132. X    tcap_underscore_on();
  133. X#else
  134. X    tcap_stand_out();
  135. X#endif
  136. X    if (icmd_prompt->cb)
  137. X    {
  138. X        ff(se, " %s", icmd_prompt->pb);
  139. X        icmd_prompt_len += icmd_prompt->cb + 1;
  140. X    }
  141. X    if (isalnum(prompt_last))
  142. X    {
  143. X        fputs(" %", se);
  144. X        icmd_prompt_len += 2;
  145. X    }
  146. X#ifdef WHT
  147. X    tcap_bold_off();
  148. X    tcap_underscore_off();
  149. X#else
  150. X    tcap_stand_end();
  151. X#endif
  152. X    fputc(' ', se);
  153. X    icmd_prompt_len++;
  154. X    return (icmd_prompt_len);
  155. X
  156. X}                             /* end of show_escape_prompt */
  157. X
  158. X/*+-------------------------------------------------------------------------
  159. X    set_default_escape_prompt()
  160. X--------------------------------------------------------------------------*/
  161. Xvoid
  162. Xset_default_escape_prompt()
  163. X{
  164. X    register char *cptr;
  165. X    char *getenv();
  166. X
  167. X    if ((cptr = getenv("ECUPROMPT")) != (char *)0)
  168. X    {
  169. X        strncpy(icmd_prompt->pb, cptr, icmd_prompt->maxcb);
  170. X        *(icmd_prompt->pb + icmd_prompt->maxcb - 1) = 0;
  171. X        icmd_prompt->cb = strlen(icmd_prompt->pb);
  172. X        esd_null_terminate(icmd_prompt);
  173. X    }
  174. X
  175. X}                             /* end of set_default_escape_prompt */
  176. X
  177. X/*+-------------------------------------------------------------------------
  178. X    kbd_escape() -- xmtr got extended key -- process it
  179. Xreturns(1)
  180. X--------------------------------------------------------------------------*/
  181. Xkbd_escape(xkey)
  182. Xuchar xkey;
  183. X{
  184. X    register itmp;
  185. X    int ttygets_flags = TG_XDELIM;
  186. X    uchar delim;
  187. X    int strpos;
  188. X    int old_ttymode = get_ttymode();
  189. X    register backspace_count;
  190. X    register KDE *tkde;
  191. X    uchar icmd_buf[128];
  192. X
  193. X    if ((xkey >= XF_ALTA) && (xkey <= XF_ALTZ))
  194. X    {
  195. X        char alt_key_proc_name[8];
  196. X        char *arg = alt_key_proc_name;
  197. X        int narg = 1;
  198. X        int restart_rcvr = need_rcvr_restart();
  199. X
  200. X        kill_rcvr_process(SIGUSR1);
  201. X        sprintf(alt_key_proc_name, "alt_%c", xkey - XF_ALTA + 'a');
  202. X        ttymode(2);
  203. X        ttyflush(0);
  204. X        if (do_proc(narg, &arg))
  205. X            ring_bell();
  206. X        sigint = 0;
  207. X        proc_file_reset();
  208. X        ttymode(old_ttymode);
  209. X        if (restart_rcvr)
  210. X            start_rcvr_process(0);
  211. X        return (1);
  212. X    }
  213. X
  214. X    switch (xkey)
  215. X    {
  216. X        case XFhome:         /* home key pressed ? */
  217. X            icmd_buf[0] = 0;
  218. X            backspace_count = show_escape_prompt();
  219. X            strpos = 0;
  220. X            icmd_buf[0] = 0;
  221. X          GET_ICMD:
  222. X            ttygets(icmd_buf, sizeof(icmd_buf), ttygets_flags, &delim, &strpos);
  223. X            switch (delim)
  224. X            {
  225. X                case XFhome:
  226. X                case XFpgup:
  227. X                case XFcurup:
  228. X                    itmp = strlen((char *)icmd_buf);
  229. X                    while (itmp--)
  230. X                        ff(se, "\b \b");
  231. X                    if (icmd_history_manager(delim, icmd_buf, sizeof(icmd_buf)))
  232. X                    {
  233. X                        ring_bell();
  234. X                        ttygets_flags |= 4;
  235. X                        goto GET_ICMD;
  236. X                    }
  237. X                    break;
  238. X                case ESC:
  239. X                case NL:
  240. X                    break;
  241. X                default:
  242. X                    ring_bell();
  243. X                    itmp = strlen((char *)icmd_buf);
  244. X                    while (itmp--)
  245. X                        ff(se, "\b \b");
  246. X                    ttygets_flags |= 4;
  247. X                    goto GET_ICMD;
  248. X            }
  249. X            if ((delim == ESC) || !icmd_buf[0])
  250. X            {
  251. X                while (backspace_count--)
  252. X                    ff(se, "\b \b");
  253. X                break;
  254. X            }
  255. X            if (icmd(icmd_buf))
  256. X                termecu(TERMECU_OK);
  257. X            break;
  258. X
  259. X        default:
  260. X            if ((itmp = xf_to_ikde(xkey)) < 0)
  261. X            {
  262. X                ring_bell();
  263. X                break;
  264. X            }
  265. X            tkde = &keyset_table[itmp];
  266. X            if ((itmp = tkde->count) > 0)
  267. X            {
  268. X                register char *cptr = tkde->str;
  269. X
  270. X                while (itmp--)
  271. X                    lputc(*cptr++);
  272. X            }
  273. X            else if (tkde->count < 0)
  274. X            {
  275. X                switch (tkde->count)
  276. X                {
  277. X                    case KACT_LOCAL_SHELL:
  278. X                        fputs("\r\n", se);
  279. X                        tcap_stand_out();
  280. X                        ff(se, " local shell in %s ", curr_dir);
  281. X                        tcap_stand_end();
  282. X                        ff(se, "\r\n");
  283. X                        shell("!");
  284. X                        break;
  285. X                    case KACT_REDISPLAY:
  286. X                        redisplay_rcvr_screen();
  287. X                        break;
  288. X                    case KACT_PROC:
  289. X                        {
  290. X#define ARG_MAX_QUAN 32
  291. X                            char *arg[ARG_MAX_QUAN];
  292. X                            int narg;
  293. X
  294. X                            build_arg_array(tkde->str, arg, ARG_MAX_QUAN, &narg);
  295. X                            kill_rcvr_process(SIGUSR1);
  296. X                            ttymode(2);
  297. X                            do_proc(narg, arg);
  298. X                            proc_file_reset();
  299. X                            ttymode(1);
  300. X                            sigint = 0;
  301. X                        }
  302. X                        break;
  303. X                }
  304. X            }
  305. X            else
  306. X                ring_bell();
  307. X            break;
  308. X    }
  309. X    return (1);
  310. X}                             /* end of kbd_escape */
  311. X
  312. X/*+-------------------------------------------------------------------------
  313. X    set_bell_fd(fd,pitch,duration)
  314. XExample: 1B 5B 3D 34 30 30 30 3B 31 42 | .[=4000;1B
  315. X--------------------------------------------------------------------------*/
  316. Xvoid
  317. Xset_bell_fd(fd, pitch, duration)
  318. Xint fd;
  319. Xint pitch;
  320. Xint duration;
  321. X{
  322. X#if defined(M_SYSV)
  323. X    char bell_cmd[32];
  324. X
  325. X    if (!tty_is_multiscreen)
  326. X        return;
  327. X
  328. X    sprintf(bell_cmd, "\033[=%d;%dB", pitch, duration);
  329. X    write(fd, bell_cmd, strlen(bell_cmd));
  330. X#endif
  331. X}                             /* end of set_bell_fd */
  332. X
  333. X/*+-------------------------------------------------------------------------
  334. X    send_bell_fd(fd,count,nap_msec)
  335. X--------------------------------------------------------------------------*/
  336. Xvoid
  337. Xsend_bell_fd(fd, count, nap_msec)
  338. Xregister fd;
  339. Xregister count;
  340. Xregister nap_msec;
  341. X{
  342. X    static char bellch = 0x07;
  343. X
  344. X    if (count)
  345. X    {
  346. X        while (count--)
  347. X        {
  348. X            write(fd, &bellch, 1);
  349. X            Nap((long)nap_msec);
  350. X        }
  351. X    }
  352. X}                             /* end of send_bell_fd */
  353. X
  354. X/*+-------------------------------------------------------------------------
  355. X    xbell_fd(fd,type,count)
  356. X--------------------------------------------------------------------------*/
  357. Xvoid
  358. Xxbell_fd(fd, type, count)
  359. Xregister fd;
  360. Xregister type;
  361. Xregister count;
  362. X{
  363. X#if defined(M_SYSV)
  364. X    register itmp;
  365. X
  366. X    if (!tty_is_multiscreen)
  367. X    {
  368. X        ring_bell();
  369. X        return;
  370. X    }
  371. X
  372. X    if (count)
  373. X    {
  374. X        while (count--)
  375. X        {
  376. X            switch (type)
  377. X            {
  378. X                case XBELL_DONE:    /* octaves */
  379. X                    set_bell_fd(fd, 1000, 1);
  380. X                    send_bell_fd(fd, 1, 100);
  381. X                    set_bell_fd(fd, 2000, 1);
  382. X                    send_bell_fd(fd, 1, 100);
  383. X                    set_bell_fd(fd, 4000, 1);
  384. X                    send_bell_fd(fd, 1, 100);
  385. X                    break;
  386. X                case XBELL_ATTENTION:    /* morse .-.-.- ATTENTION */
  387. X                    for (itmp = 0; itmp < 3; itmp++)
  388. X                    {
  389. X                        set_bell_fd(fd, 2000, 1);
  390. X                        send_bell_fd(fd, 1, 140);
  391. X                        set_bell_fd(fd, 2000, 3);
  392. X                        send_bell_fd(fd, 1, 340);
  393. X                    }
  394. X                    break;
  395. X                case XBELL_C:    /* morse -.-. C */
  396. X                    for (itmp = 0; itmp < 2; itmp++)
  397. X                    {
  398. X                        set_bell_fd(fd, 2000, 3);
  399. X                        send_bell_fd(fd, 1, 320);
  400. X                        set_bell_fd(fd, 2000, 1);
  401. X                        send_bell_fd(fd, 1, 120);
  402. X                    }
  403. X                    break;
  404. X                case XBELL_3T:    /* 3 morse T's */
  405. X                    set_bell_fd(fd, 2000, 3);
  406. X                    send_bell_fd(fd, 3, 460);
  407. X                    break;
  408. X                default:
  409. X                    set_bell_fd(fd, 2000, 4);
  410. X                    send_bell_fd(fd, 1, 100);
  411. X                    break;
  412. X            }
  413. X        }
  414. X    }
  415. X
  416. X    set_bell_fd(fd, 4000, 1);
  417. X#endif
  418. X}                             /* end of xbell_fd */
  419. X
  420. X/*+-------------------------------------------------------------------------
  421. X    morse_bell(xbell_type,count)
  422. X--------------------------------------------------------------------------*/
  423. X#if defined(MORSE)
  424. Xmorse_bell(xbell_type, count)
  425. Xint xbell_type;
  426. Xint count;
  427. X{
  428. X    register morse_fd;
  429. X    int morse_frequency = 800;
  430. X    char morse_char;
  431. X    static int morse_ticks = 0;
  432. X
  433. X#if !defined(WHT)
  434. X    if (!tty_is_multiscreen)
  435. X    {
  436. X        ring_bell();
  437. X        return (0);
  438. X    }
  439. X#endif
  440. X
  441. X    if (!morse_ticks)
  442. X        morse_ticks = hz / 25;
  443. X
  444. X    if ((morse_fd = open("/dev/morse", O_WRONLY, 0)) < 0)
  445. X        return (-1);
  446. X
  447. X    ioctl(morse_fd, MORSE_SET_SPEED, &morse_ticks);
  448. X    ioctl(morse_fd, MORSE_SET_FREQUENCY, &morse_frequency);
  449. X    switch (xbell_type)
  450. X    {
  451. X        case XBELL_DONE:
  452. X            morse_char = 'd';
  453. X/*
  454. X            morse_frequency = 400;
  455. X            ioctl(morse_fd,MORSE_SET_FREQUENCY,&morse_frequency);
  456. X*/
  457. X            break;
  458. X        case XBELL_ATTENTION:
  459. X            morse_char = '.';
  460. X            break;
  461. X        case XBELL_C:
  462. X            morse_char = 'c';
  463. X            break;
  464. X        case XBELL_3T:
  465. X            morse_char = 'o';
  466. X            break;
  467. X        default:
  468. X            morse_char = BT;
  469. X            break;
  470. X    }
  471. X    while (count--)
  472. X        write(morse_fd, &morse_char, 1);
  473. X    close(morse_fd);
  474. X    return (0);
  475. X}                             /* end of morse_bell */
  476. X#endif
  477. X
  478. X/*+-------------------------------------------------------------------------
  479. X    xbell(type,count)
  480. X--------------------------------------------------------------------------*/
  481. Xvoid
  482. Xxbell(type, count)
  483. Xint type;
  484. Xint count;
  485. X{
  486. X#if defined(WHT) && defined(MORSE)
  487. X    if (morse_bell(type, count))
  488. X        ring_bell();
  489. X#else
  490. X#if defined(WHT) && defined(AUDIO)
  491. X    void audio_notify();
  492. X
  493. X    audio_notify(type);
  494. X#else
  495. X    if (!tty_is_multiscreen)
  496. X    {
  497. X        ring_bell();
  498. X        return;
  499. X    }
  500. X
  501. X#if defined(MORSE)
  502. X    if (morse_bell(type, count))
  503. X#endif
  504. X        xbell_fd(1, type, count);
  505. X#endif /* WHT && AUDIO */
  506. X#endif /* WHT && MORSE */
  507. X
  508. X}                             /* end of xbell */
  509. X
  510. X/*+-------------------------------------------------------------------------
  511. X    bell_alarm(xbell_type)
  512. X  ring bell on multiscreens; if morse driver included, use it instead
  513. X--------------------------------------------------------------------------*/
  514. Xint
  515. Xbell_alarm(xbell_type)
  516. Xint xbell_type;
  517. X{
  518. X#if defined(M_SYSV)
  519. X    register notify_fd;
  520. X    register fork_pid;
  521. X    static long notify_time = 0L;
  522. X    char *get_ttyname();
  523. X    char devname[64];
  524. X    int devnum;
  525. X    int ttnum;
  526. X
  527. X#if !(defined(WHT) && defined(MORSE))
  528. X    if (!tty_is_multiscreen)
  529. X    {
  530. X        ring_bell();
  531. X        return (1);
  532. X    }
  533. X#endif
  534. X
  535. X    ttnum = atoi(get_ttyname() + 8);
  536. X
  537. X/* if happened less than 15 secs ago, forget it */
  538. X    if ((time((long *)0) - notify_time) < 15L)
  539. X        return (0);
  540. X
  541. X    notify_time = time((long *)0);
  542. X
  543. X#if defined(MORSE)
  544. X    if (morse_bell(xbell_type, 1))
  545. X    {
  546. X#endif
  547. X        if ((fork_pid = smart_fork()) != 0)
  548. X        {
  549. X#if defined(FORK_DEBUG)
  550. X            sprintf(devname, "DEBUG bell notify pid %d", fork_pid);
  551. X            ecu_log_event(getpid(), devname);    /* bell notify */
  552. X#endif
  553. X            return (fork_pid > 0);
  554. X        }
  555. X
  556. X        for (devnum = 1; devnum < 13; devnum++)
  557. X        {
  558. X            if (devnum == ttnum)    /* don't bell notify ecu's tty */
  559. X                continue;
  560. X            sprintf(devname, "/dev/tty%02d", devnum);
  561. X            if ((notify_fd = open(devname, O_WRONLY, 0)) >= 0)
  562. X            {
  563. X                xbell_fd(notify_fd, xbell_type, 1);
  564. X                close(notify_fd);
  565. X            }
  566. X        }
  567. X
  568. X        _exit(0);             /* end of child tine (of the fork, naturally) */
  569. X#if defined(MORSE)
  570. X    }
  571. X    /* NOTREACHED */
  572. X#endif
  573. X#else /* not SCO (M_SYSV) */
  574. X    ring_bell();
  575. X#endif
  576. X    return (1);
  577. X}                             /* end of bell_alarm */
  578. X
  579. X/*+-------------------------------------------------------------------------
  580. X    bell_notify(xbell_type)
  581. X--------------------------------------------------------------------------*/
  582. Xvoid
  583. Xbell_notify(xbell_type)
  584. Xint xbell_type;
  585. X{
  586. X#if defined(M_SYSV)
  587. X    if (
  588. X#if !defined(WHT) && !defined(PTY_BELL_NOTIFY)
  589. X        tty_is_multiscreen &&
  590. X#endif
  591. X        shm->bell_notify_state)
  592. X    {
  593. X        bell_alarm(xbell_type);
  594. X    }
  595. X#endif
  596. X}                             /* end of bell_notify */
  597. X
  598. X/*+-------------------------------------------------------------------------
  599. X    parse_bell_notify_argument(strarg) - parse "bell notify" argument
  600. X
  601. X  Returns 0,1,2 according to parsing rules
  602. X          -1 on error
  603. X--------------------------------------------------------------------------*/
  604. Xint
  605. Xparse_bell_notify_argument(strarg)
  606. Xchar *strarg;
  607. X{
  608. X    static STR_CLASSIFY sc[] =
  609. X    {
  610. X        {"off", 3, 0},
  611. X        {"on", 2, 1},
  612. X        {"alert", 1, 2},
  613. X        {(char *)0, 0, -1},
  614. X    };
  615. X    int itmp;
  616. X
  617. X    if (isdigit(*strarg))
  618. X    {
  619. X        if (((itmp = atoi(strarg)) >= 0) && (itmp < 3))
  620. X            return (itmp);
  621. X        return (-1);
  622. X    }
  623. X
  624. X    return (str_classify(sc, strarg));
  625. X
  626. X}                             /* end of parse_bell_notify_argument */
  627. X
  628. X/*+-------------------------------------------------------------------------
  629. X    bell_notify_text(bn) - text for bell notify status
  630. X--------------------------------------------------------------------------*/
  631. Xchar *
  632. Xbell_notify_text(bn)
  633. Xint bn;
  634. X{
  635. X    char *cptr = "?";
  636. X
  637. X    switch (bn)
  638. X    {
  639. X        case 0:
  640. X            cptr = "OFF";
  641. X            break;
  642. X        case 1:
  643. X            cptr = "ON";
  644. X            break;
  645. X        case 2:
  646. X            cptr = "ON+ALERT";
  647. X            break;
  648. X        default:
  649. X            cptr = "???";
  650. X            break;
  651. X    }
  652. X    return (cptr);
  653. X}                             /* end of bell_notify_text */
  654. X
  655. X/*+-------------------------------------------------------------------------
  656. X    signal_name_text(sig)
  657. X--------------------------------------------------------------------------*/
  658. Xchar *
  659. Xsignal_name_text(sig)
  660. Xint sig;
  661. X{
  662. X    register char *cptr;
  663. X    static char sigunknown[20];
  664. X
  665. X    sig &= 0x7F;
  666. X    switch (sig)
  667. X    {
  668. X        case SIGHUP:
  669. X            cptr = "SIGHUP";
  670. X            break;
  671. X        case SIGINT:
  672. X            cptr = "SIGINT";
  673. X            break;
  674. X        case SIGQUIT:
  675. X            cptr = "SIGQUIT";
  676. X            break;
  677. X        case SIGILL:
  678. X            cptr = "SIGILL";
  679. X            break;
  680. X        case SIGTRAP:
  681. X            cptr = "SIGTRAP";
  682. X            break;
  683. X#ifdef SIGIOT
  684. X        case SIGIOT:
  685. X            cptr = "SIGIOT";
  686. X            break;
  687. X#endif
  688. X#ifdef SIGEMT
  689. X        case SIGEMT:
  690. X            cptr = "SIGEMT";
  691. X            break;
  692. X#endif
  693. X        case SIGFPE:
  694. X            cptr = "SIGFPE";
  695. X            break;
  696. X        case SIGKILL:
  697. X            cptr = "SIGKILL";
  698. X            break;
  699. X#if    defined(SIGBUS)
  700. X        case SIGBUS:
  701. X            cptr = "SIGBUS";
  702. X            break;
  703. X#endif
  704. X        case SIGSEGV:
  705. X            cptr = "SIGSEGV";
  706. X            break;
  707. X#if    defined(SIGSYS)
  708. X        case SIGSYS:
  709. X            cptr = "SIGSYS";
  710. X            break;
  711. X#endif
  712. X        case SIGPIPE:
  713. X            cptr = "SIGPIPE";
  714. X            break;
  715. X        case SIGALRM:
  716. X            cptr = "SIGALRM";
  717. X            break;
  718. X        case SIGTERM:
  719. X            cptr = "SIGTERM";
  720. X            break;
  721. X        case SIGUSR1:
  722. X            cptr = "SIGUSR1";
  723. X            break;
  724. X        case SIGUSR2:
  725. X            cptr = "SIGUSR2";
  726. X            break;
  727. X        case SIGCLD:
  728. X            cptr = "SIGCLD";
  729. X            break;
  730. X#if    defined(SIGPWR)
  731. X        case SIGPWR:
  732. X            cptr = "SIGPWR";
  733. X            break;
  734. X#endif
  735. X#if    defined(SIGSTOP)
  736. X        case SIGSTOP:
  737. X            cptr = "SIGSTOP";
  738. X            break;
  739. X#endif
  740. X#if    defined(SIGTSOP)
  741. X        case SIGTSTP:
  742. X            cptr = "SIGTSTP";
  743. X            break;
  744. X#endif
  745. X#if    defined(SIGCONT)
  746. X        case SIGCONT:
  747. X            cptr = "SIGCONT";
  748. X            break;
  749. X#endif
  750. X#if    defined(SIGTTIN)
  751. X        case SIGTTIN:
  752. X            cptr = "SIGTTIN";
  753. X            break;
  754. X#endif
  755. X#if    defined(SIGTTOU)
  756. X        case SIGTTOU:
  757. X            cptr = "SIGTTOU";
  758. X            break;
  759. X#endif
  760. X        default:
  761. X            sprintf(sigunknown, "SIGNAL %u", sig);
  762. X            return (sigunknown);
  763. X    }
  764. X    return (cptr);
  765. X
  766. X}                             /* end of signal_name_text */
  767. X
  768. X/*+-------------------------------------------------------------------------
  769. X    rename(from,to)
  770. X--------------------------------------------------------------------------*/
  771. X#if defined(M_XENIX) && !defined(BUILDING_LINT_ARGS)
  772. Xint
  773. Xrename(from, to)
  774. Xchar *from;
  775. Xchar *to;
  776. X{
  777. X    struct stat ss;
  778. X    int save_errno;
  779. X    extern int errno;
  780. X
  781. X    if (!stat(to, &ss))         /* if to exists, flunk */
  782. X    {
  783. X        errno = EEXIST;         /* fake "file exists" error */
  784. X        return (-1);
  785. X    }
  786. X
  787. X    if (link(from, to))         /* if cannot link, flunk */
  788. X        return (-1);
  789. X
  790. X    if (unlink(from))         /* if cannot unlink, flunk */
  791. X    {
  792. X        save_errno = errno;
  793. X        unlink(to);
  794. X        errno = save_errno;
  795. X        return (-1);
  796. X    }
  797. X
  798. X    return (0);
  799. X
  800. X}                             /* end of rename */
  801. X#endif
  802. X
  803. X/*+-------------------------------------------------------------------------
  804. X    send_get_response(narg,arg) - send a string, get and log response
  805. X--------------------------------------------------------------------------*/
  806. X/*ARGSUSED*/
  807. Xvoid
  808. Xsend_get_response(narg, arg)
  809. Xint narg;
  810. Xchar **arg;
  811. X{
  812. X    int itmp;
  813. X    int mode;
  814. X    LRWT lr;
  815. X    char buf[1024];
  816. X    FILE *fplog;
  817. X    char *fname = "./ecu.sgr.log";
  818. X    int restart_rcvr = need_rcvr_restart();
  819. X
  820. X    if (narg < 3)
  821. X    {
  822. X        fputs("   usage: sgr <mode> <cmd>\r\n", se);
  823. X        fputs("mode = 0 for sanitized response, 1 == raw\r\n", se);
  824. X        fputs("cmd = 'Send' string (see 'expresp' proc cmd in manual)\r\n", se);
  825. X        return;
  826. X    }
  827. X
  828. X    /*
  829. X     * don't want receiver stealing our response
  830. X     */
  831. X    kill_rcvr_process(SIGUSR1);
  832. X
  833. X    /*
  834. X     * set up for capturing response
  835. X     */
  836. X    mode = atoi(arg[1]) & 0x0F;;
  837. X#ifdef WHT
  838. X    lr.to1 = 30 * 1000L;
  839. X#else
  840. X    lr.to1 = 10 * 1000L;
  841. X#endif
  842. X    lr.to2 = 5 * 1000L;
  843. X    lr.raw_flag = 0x80 + mode;    /* allow interrupts */
  844. X    lr.buffer = buf;
  845. X    lr.bufsize = sizeof(buf);
  846. X    lr.delim = (char *)0;
  847. X    lr.echo_flag = 0;
  848. X
  849. X    /*
  850. X     * stimulus/response
  851. X     */
  852. X    ff(se, "  ... wait ... ");
  853. X    respond(arg[2]);
  854. X    if (!sigint)
  855. X    {
  856. X        lgets_timeout(&lr);
  857. X        if (sigint)
  858. X            goto INTERRUPTED;
  859. X        ff(se, "done\r\n");
  860. X
  861. X        /*
  862. X         * log response if possible and display on screen
  863. X         */
  864. X        if (fplog = fopen(fname, "a"))
  865. X        {
  866. X            itmp = strlen(arg[2]);
  867. X            hex_dump_fp(fplog, arg[2], itmp, "Stimulus", (itmp <= 16));
  868. X            hex_dump_fp(fplog, buf, lr.count, "Response", (lr.count <= 16));
  869. X            fputs("\n", fplog);
  870. X            fclose(fplog);
  871. X            ff(se, "Dialog dump appended to '%s'\r\n", fname);
  872. X        }
  873. X        itmp = strlen(arg[2]);
  874. X        hex_dump_fp(fplog, arg[2], itmp, "Stimulus", (itmp <= 16));
  875. X        hex_dump(buf, lr.count, "Response", (lr.count <= 16));
  876. X    }
  877. X    else
  878. X    {
  879. X      INTERRUPTED:
  880. X        sigint = 0;
  881. X        ff(se, "interrupted\r\n");
  882. X    }
  883. X
  884. X    if (restart_rcvr)
  885. X        start_rcvr_process(0);
  886. X}                             /* end of send_get_response */
  887. X
  888. X/*+-------------------------------------------------------------------------
  889. X    xterm_title(text,code) - experimental - watch this space
  890. X--------------------------------------------------------------------------*/
  891. X#if defined(WHT2) || defined(XTERM_FRIEND)
  892. Xvoid
  893. Xxterm_title(text, code)
  894. Xchar *text;
  895. Xint code;
  896. X{
  897. X    static char *term = (char *)0;
  898. X    static char usrname[L_cuserid] = "";
  899. X    char *getenv();
  900. X    char *cuserid();
  901. X    static char xtstr1[82] = "";
  902. X
  903. X    if (!term)
  904. X        term = getenv("TERM");
  905. X    if (!term)
  906. X    {
  907. X        term = "";
  908. X        return;
  909. X    }
  910. X    if (ulcmpb(term, "xterm") >= 0)
  911. X        return;
  912. X
  913. X    if (!usrname[0])
  914. X        (void)cuserid(usrname);
  915. X
  916. X    switch (code)
  917. X    {
  918. X        case 0:
  919. X        case 1:
  920. X            xtstr1[0] = 0;
  921. X            if (code == 1)
  922. X                strcpy(xtstr1, "ECU: ");
  923. X            strcat(xtstr1, text);
  924. X            if (usrname[0])
  925. X                sprintf(xtstr1 + strlen(xtstr1), " (%s)", usrname);
  926. X        case 2:
  927. X            fputs("\033]0;", se);
  928. X            fputs(xtstr1, se);
  929. X            fputc(7, se);
  930. X            break;
  931. X    }
  932. X}                             /* end of xterm_title */
  933. X#endif
  934. X
  935. X/* end of ecugrabbag.c */
  936. X/* vi: set tabstop=4 shiftwidth=4: */
  937. END_OF_FILE
  938.   if test 19978 -ne `wc -c <'ecu330/ecugrabbag.c'`; then
  939.     echo shar: \"'ecu330/ecugrabbag.c'\" unpacked with wrong size!
  940.   fi
  941.   # end of 'ecu330/ecugrabbag.c'
  942. fi
  943. if test -f 'ecu330/ecusetup.c' -a "${1}" != "-c" ; then 
  944.   echo shar: Will not clobber existing file \"'ecu330/ecusetup.c'\"
  945. else
  946.   echo shar: Extracting \"'ecu330/ecusetup.c'\" \(18406 characters\)
  947.   sed "s/^X//" >'ecu330/ecusetup.c' <<'END_OF_FILE'
  948. X/*+-------------------------------------------------------------------------
  949. X    ecusetup.c -- ecu visual "argv"
  950. X    wht@n4hgf.atl.ga.us
  951. X
  952. X  0000000000111111111122222222223333333333444444444455555555556666
  953. X  0123456789012345678901234567890123456789012345678901234567890123
  954. X00.--[ ecu rev ]-------------------------------------------------.
  955. X01|                                                              |
  956. X02|  Destination   .......................................       |
  957. X03|    Telephone     ....................                        |
  958. X04|    Description   ........................................    |
  959. X05|                                                              |
  960. X06|  tty: /dev/........   (opened)                               |
  961. X07|                                                              |
  962. X08|  duplex: .  baud: .....  parity: . (data bits .)             |
  963. X09|  add NL to transmitted CR: .                                 |
  964. X10|  add NL to received CR:    .                                 |
  965. X11|                                                              |
  966. X12|                                                              |
  967. X13|   TAB:next ^B:prev END:proceed ^D:phone dir  ESC:quit ecu    |
  968. X14`--------------------------------------------------------------'
  969. X
  970. X  Defined functions:
  971. X    setup_display_baud()
  972. X    setup_display_name()
  973. X    setup_display_screen(write_lits)
  974. X    setup_display_single_char()
  975. X    setup_display_tty()
  976. X    setup_line_open()
  977. X    setup_screen(argv_logical)
  978. X    setw_bot_msg(msg)
  979. X    setw_err_msg(msg)
  980. X    setw_get_single(nondelim_list)
  981. X    setw_msg(msg,y,fillch,last_msglen)
  982. X
  983. X  All readers cannot be leaders, but all leaders must be readers.
  984. X  - Harry Truman
  985. X
  986. X--------------------------------------------------------------------------*/
  987. X/*+:EDITS:*/
  988. X/*:05-04-1994-04:39-wht@n4hgf-ECU release 3.30 */
  989. X/*:12-02-1993-14:34-wht@n4hgf-line lock retries from 8 to 20 */
  990. X/*:11-12-1993-11:00-wht@n4hgf-Linux changes by bob@vancouver.zadall.com */
  991. X/*:05-29-1993-20:21-wht@n4hgf-change linst_err_text to LINST_text */
  992. X/*:04-12-1993-12:16-wht@n4hgf-if delim == ^D, do not parse input */
  993. X/*:09-10-1992-13:58-wht@n4hgf-ECU release 3.20 */
  994. X/*:09-05-1992-14:49-wht@n4hgf-parity field was one to the left of proper pos */
  995. X/*:08-22-1992-15:38-wht@n4hgf-ECU release 3.20 BETA */
  996. X/*:04-28-1992-01:34-wht@n4hgf-default tty in tty prompt had slash */
  997. X/*:04-24-1992-21:59-wht@n4hgf-more SCO tty name normalizing */
  998. X/*:08-28-1991-14:07-wht@n4hgf2-SVR4 cleanup by aega84!lh */
  999. X/*:08-25-1991-14:39-wht@n4hgf-SVR4 port thanks to aega84!lh */
  1000. X/*:08-12-1991-00:58-wht@n4hgf-ISC tty names */
  1001. X/*:07-25-1991-12:56-wht@n4hgf-ECU release 3.10 */
  1002. X/*:07-17-1991-07:04-wht@n4hgf-avoid SCO UNIX nap bug */
  1003. X/*:06-05-1991-18:07-wht@n4hgf-rework */
  1004. X/*:04-27-1991-01:52-wht@n4hgf-overhaul revision numbers */
  1005. X/*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
  1006. X
  1007. X#include "ecucurses.h"
  1008. X
  1009. X#define STDIO_H_INCLUDED
  1010. X#define OMIT_TERMIO_REFERENCES
  1011. X#include "ecu.h"
  1012. X#include "ecukey.h"
  1013. X#include "ecuxkey.h"
  1014. X#include "ecupde.h"
  1015. X#include "pc_scr.h"
  1016. X
  1017. XPDE *logical_telno_to_pde();
  1018. X
  1019. X#define SETW_LINES    15
  1020. X#define SETW_COLS    64
  1021. X#define SETW_TLY    1
  1022. X#define SETW_TLX    ((80 - SETW_COLS) / 2)
  1023. X
  1024. X#define NAME_Y        2
  1025. X#define NAME_X        17
  1026. X#define NAME_LEN    DESTREF_LEN
  1027. X#define NAME_LX        3
  1028. X
  1029. X#define PHNUM_Y        3
  1030. X#define PHNUM_X        19
  1031. X#define PHNUM_LEN    DESTREF_LEN
  1032. X#define PHNUM_LX    5
  1033. X
  1034. X#define DESCR_Y        4
  1035. X#define DESCR_X        19
  1036. X#define DESCR_LEN    PDE_DESCR_LEN
  1037. X#define DESCR_LX    5
  1038. X
  1039. X#define TTY_Y        6
  1040. X#define TTY_X        13
  1041. X#define TTY_LEN        8
  1042. X#define TTY_LX        3
  1043. X
  1044. X#define TTYOPN_LY    6
  1045. X#define TTYOPN_LX    24
  1046. X
  1047. X#define DPX_Y        8
  1048. X#define DPX_X        11
  1049. X#define DPX_LX        3
  1050. X
  1051. X#define BAUD_Y        8
  1052. X#define BAUD_X        20
  1053. X#define BAUD_LEN    5
  1054. X#define BAUD_LX        14
  1055. X
  1056. X#define PAR_Y        8
  1057. X#define PAR_X        35
  1058. X#define PAR_LX        27
  1059. X
  1060. X#define DB_Y        8
  1061. X#define DB_X        48
  1062. X#define DB_LX        37
  1063. X#define DB_LX2        49
  1064. X
  1065. X#define XADDNL_Y    9
  1066. X#define XADDNL_X    29
  1067. X#define XADDNL_LX    3
  1068. X
  1069. X#define RADDNL_Y    10
  1070. X#define RADDNL_X    29
  1071. X#define RADDNL_LX    3
  1072. X
  1073. Xextern char *revstr;         /* ecunumrev.c */
  1074. Xextern char errmsg[];
  1075. X
  1076. XWINDOW *setw;
  1077. X
  1078. X#define SETW_MSG_LEFTX 2
  1079. X#define SETW_MSG_MAXLEN    (SETW_COLS - SETW_MSG_LEFTX - 8)
  1080. X#define SETW_MSG_BOT_Y  (SETW_LINES - 1)
  1081. X#define SETW_MSG_ERR_Y  (SETW_LINES - 3)
  1082. X
  1083. X#ifdef LINUX
  1084. Xtypedef chtype CHTYPE;
  1085. X
  1086. X#else
  1087. Xtypedef char CHTYPE;
  1088. X
  1089. X#endif
  1090. X
  1091. X/*+-------------------------------------------------------------------------
  1092. X    setw_msg(msg,y,fillch)
  1093. X--------------------------------------------------------------------------*/
  1094. Xvoid
  1095. Xsetw_msg(msg, y, fillch, last_msglen)
  1096. Xchar *msg;
  1097. Xint y;
  1098. XCHTYPE fillch;
  1099. Xint *last_msglen;
  1100. X{
  1101. X    register itmp;
  1102. X    register itmp2;
  1103. X    char msg2[80];
  1104. X
  1105. X    if (!*last_msglen && !strlen(msg))
  1106. X        return;
  1107. X
  1108. X    wmove(setw, y, SETW_MSG_LEFTX);
  1109. X
  1110. X    if ((itmp = strlen(msg)) == 0)
  1111. X    {
  1112. X        itmp2 = *last_msglen + 2;
  1113. X#if defined(SVR4)
  1114. X        whline(setw, (unsigned long)(fillch & 0x00ff), itmp2);
  1115. X#else
  1116. X#if defined(LINUX)
  1117. X        whline(setw, fillch, itmp2);
  1118. X#else
  1119. X        for (itmp = 0; itmp < itmp2; itmp++)
  1120. X            waddch(setw, fillch & 0xFF);
  1121. X#endif
  1122. X#endif
  1123. X        *last_msglen = 0;
  1124. X    }
  1125. X    else
  1126. X    {
  1127. X        waddch(setw, ' ');
  1128. X        if (itmp > SETW_MSG_MAXLEN)
  1129. X        {
  1130. X            strncpy(msg2, msg, SETW_MSG_MAXLEN);
  1131. X            msg2[SETW_MSG_MAXLEN + 1] = 0;
  1132. X            waddstr(setw, msg2);
  1133. X            itmp = strlen(msg2);
  1134. X        }
  1135. X        else
  1136. X        {
  1137. X            waddstr(setw, msg);
  1138. X            itmp = strlen(msg);
  1139. X        }
  1140. X        waddch(setw, ' ');
  1141. X        if ((itmp2 = *last_msglen - itmp) > 0)
  1142. X        {
  1143. X#if defined(SVR4)
  1144. X            whline(setw, (unsigned long)(fillch & 0x00ff), itmp2);
  1145. X#else
  1146. X#if defined(LINUX)
  1147. X            whline(setw, fillch, itmp2);
  1148. X#else
  1149. X            while (itmp2--)
  1150. X                waddch(setw, fillch & 0xFF);
  1151. X#endif
  1152. X#endif
  1153. X        }
  1154. X        *last_msglen = itmp; /* remember last message length */
  1155. X    }
  1156. X    wrefresh(setw);
  1157. X}                             /* end of setw_msg */
  1158. X
  1159. X/*+-------------------------------------------------------------------------
  1160. X    setw_bot_msg(msg)
  1161. X--------------------------------------------------------------------------*/
  1162. Xvoid
  1163. Xsetw_bot_msg(msg)
  1164. Xchar *msg;
  1165. X{
  1166. X    static int last_msglen = 0;
  1167. X
  1168. X    setw_msg(msg, SETW_MSG_BOT_Y, sHR, &last_msglen);
  1169. X}                             /* end of setw_bot_msg */
  1170. X
  1171. X/*+-------------------------------------------------------------------------
  1172. X    setw_err_msg(msg)
  1173. X--------------------------------------------------------------------------*/
  1174. Xvoid
  1175. Xsetw_err_msg(msg)
  1176. Xchar *msg;
  1177. X{
  1178. X    static int last_msglen = 0;
  1179. X
  1180. X    setw_msg(msg, SETW_MSG_ERR_Y, ' ', &last_msglen);
  1181. X}                             /* end of setw_err_msg */
  1182. X
  1183. X/*+-------------------------------------------------------------------------
  1184. X    setup_display_name()
  1185. X--------------------------------------------------------------------------*/
  1186. Xvoid
  1187. Xsetup_display_name()
  1188. X{
  1189. X    clear_area(setw, NAME_Y, NAME_X, NAME_LEN);
  1190. X    waddstr(setw, shm->Llogical);
  1191. X
  1192. X#if 0
  1193. X    if (!shm->Llogical[0] && (shm->Liofd < 0))
  1194. X    {
  1195. X        clear_area(setw, PHNUM_Y, PHNUM_X, PHNUM_LEN);
  1196. X        clear_area(setw, DESCR_Y, DESCR_X, DESCR_LEN);
  1197. X        return;
  1198. X    }
  1199. X#endif
  1200. X
  1201. X    wmove(setw, PHNUM_Y, PHNUM_LX);
  1202. X    if (shm->Ltelno[0])
  1203. X        waddstr(setw, "Telephone");
  1204. X    else
  1205. X        waddstr(setw, "         ");
  1206. X    clear_area(setw, PHNUM_Y, PHNUM_X, PHNUM_LEN);
  1207. X#if 0
  1208. X    if (!shm->Ltelno[0])
  1209. X    {
  1210. X        if (!isdigit(shm->Llogical[0]) && find_procedure(shm->Llogical))
  1211. X            waddstr(setw, "<procedure connect>");
  1212. X        else
  1213. X            waddstr(setw, "<direct connect>");
  1214. X    }
  1215. X    else
  1216. X#endif
  1217. X        waddstr(setw, shm->Ltelno);
  1218. X
  1219. X    wmove(setw, DESCR_Y, DESCR_LX);
  1220. X    if (shm->Ldescr[0])
  1221. X        waddstr(setw, "Description");
  1222. X    else
  1223. X        waddstr(setw, "           ");
  1224. X    clear_area(setw, DESCR_Y, DESCR_X, DESCR_LEN);
  1225. X    waddstr(setw, shm->Ldescr);
  1226. X
  1227. X}                             /* end of setup_display_name */
  1228. X
  1229. X/*+-------------------------------------------------------------------------
  1230. X    setup_display_tty()
  1231. X     00000000
  1232. X     01234567
  1233. X/dev/........
  1234. X--------------------------------------------------------------------------*/
  1235. Xvoid
  1236. Xsetup_display_tty()
  1237. X{
  1238. X    char s[TTY_LEN + 1];
  1239. X
  1240. X    strncpy(s, shm->Lline + 5, TTY_LEN);
  1241. X    s[TTY_LEN] = 0;
  1242. X    clear_area(setw, TTY_Y, TTY_X, TTY_LEN);
  1243. X    waddstr(setw, s);
  1244. X    wmove(setw, TTYOPN_LY, TTYOPN_LX);
  1245. X    if (shm->Liofd >= 0)
  1246. X        waddstr(setw, "(opened)");
  1247. X    else
  1248. X        waddstr(setw, "        ");
  1249. X    wrefresh(setw);
  1250. X
  1251. X}                             /* end of setup_display_tty */
  1252. X
  1253. X/*+-------------------------------------------------------------------------
  1254. X    setup_display_single_char()
  1255. X--------------------------------------------------------------------------*/
  1256. Xvoid
  1257. Xsetup_display_single_char()
  1258. X{
  1259. X    wmove(setw, DPX_Y, DPX_X);
  1260. X    waddch(setw, (shm->Lfull_duplex) ? 'F' : 'E');
  1261. X    wmove(setw, PAR_Y, PAR_X);
  1262. X    waddch(setw, (shm->Lparity) ? to_upper(shm->Lparity) : 'N');
  1263. X    wmove(setw, DB_Y, DB_X);
  1264. X    waddch(setw, (shm->Lparity) ? '7' : '8');
  1265. X    wmove(setw, XADDNL_Y, XADDNL_X);
  1266. X    waddch(setw, (shm->Ladd_nl_outgoing) ? 'Y' : 'N');
  1267. X    wmove(setw, RADDNL_Y, RADDNL_X);
  1268. X    waddch(setw, (shm->Ladd_nl_incoming) ? 'Y' : 'N');
  1269. X
  1270. X}                             /* end of setup_display_single_char */
  1271. X
  1272. X/*+-------------------------------------------------------------------------
  1273. X    setup_display_baud()
  1274. X--------------------------------------------------------------------------*/
  1275. Xvoid
  1276. Xsetup_display_baud()
  1277. X{
  1278. X    char s8[8];
  1279. X
  1280. X    clear_area(setw, BAUD_Y, BAUD_X, BAUD_LEN);
  1281. X    sprintf(s8, "%u", shm->Lbaud);
  1282. X    waddstr(setw, s8);
  1283. X
  1284. X}                             /* end of setup_display_baud */
  1285. X
  1286. X/*+-------------------------------------------------------------------------
  1287. X    setup_display_screen(write_lits)
  1288. X--------------------------------------------------------------------------*/
  1289. Xvoid
  1290. Xsetup_display_screen(write_lits)
  1291. Xint write_lits;
  1292. X{
  1293. X
  1294. X    if (write_lits)
  1295. X    {
  1296. X        wmove(setw, NAME_Y, NAME_LX);
  1297. X        waddstr(setw, "Destination");
  1298. X        wmove(setw, TTY_Y, TTY_LX);
  1299. X        waddstr(setw, "tty: /dev/");
  1300. X        wmove(setw, DPX_Y, DPX_LX);
  1301. X        waddstr(setw, "duplex:");
  1302. X        wmove(setw, BAUD_Y, BAUD_LX);
  1303. X        waddstr(setw, "baud:");
  1304. X        wmove(setw, PAR_Y, PAR_LX);
  1305. X        waddstr(setw, "parity:");
  1306. X        wmove(setw, DB_Y, DB_LX);
  1307. X        waddstr(setw, "(data bits");
  1308. X        wmove(setw, DB_Y, DB_LX2);
  1309. X        waddch(setw, ')');
  1310. X        wmove(setw, XADDNL_Y, XADDNL_LX);
  1311. X        waddstr(setw, "add NL to transmitted CR:");
  1312. X        wmove(setw, RADDNL_Y, RADDNL_LX);
  1313. X        waddstr(setw, "add NL to received CR:");
  1314. X        wmove(setw, SETW_LINES - 2, 1);
  1315. X        wstandout(setw);
  1316. X        waddstr(setw,         /* kludge -- must change if setw width does */
  1317. X            "   TAB:next ^B:prev END:proceed ^D:phone dir  ESC:quit ecu    ");
  1318. X        wstandend(setw);
  1319. X    }
  1320. X    setup_display_name();
  1321. X    setup_display_tty();
  1322. X    setup_display_single_char();
  1323. X    setup_display_baud();
  1324. X    wrefresh(setw);
  1325. X}                             /* end of setup_display_screen */
  1326. X
  1327. X/*+-------------------------------------------------------------------------
  1328. X    setup_line_open()
  1329. X--------------------------------------------------------------------------*/
  1330. Xint
  1331. Xsetup_line_open()
  1332. X{
  1333. X    int itmp;
  1334. X    int retries = 20;
  1335. X    char *LINST_text();
  1336. X    char *cptr;
  1337. X    char msg[80];
  1338. X    long wait_msec;
  1339. X    int displayed_single_char_exit = 0;
  1340. X
  1341. X    while (itmp = lopen())
  1342. X    {
  1343. X        if (retries)
  1344. X        {
  1345. X            if ((itmp != LINST_ENABLED_IN_USE) &&
  1346. X                (itmp != LINST_DIALOUT_IN_USE) && (itmp < 0))
  1347. X            {
  1348. X                goto FAIL;
  1349. X            }
  1350. X            cptr = LINST_text(itmp);
  1351. X            sprintf(msg, "%s - waiting %d sec", cptr, retries);
  1352. X            cptr = msg;
  1353. X            if (!displayed_single_char_exit)
  1354. X            {
  1355. X                setw_bot_msg("Press any key to skip retries");
  1356. X                displayed_single_char_exit = 1;
  1357. X            }
  1358. X        }
  1359. X        else
  1360. X        {
  1361. X          FAIL:
  1362. X            retries = 0;
  1363. X            cptr = LINST_text(itmp);
  1364. X            ring_bell();
  1365. X        }
  1366. X        setw_err_msg(cptr);
  1367. X        if (!retries--)
  1368. X            break;
  1369. X        wait_msec = 1000L;
  1370. X        while (wait_msec > 0)
  1371. X        {
  1372. X            if (ttyrdchk())
  1373. X            {
  1374. X                (void)ttygetc(1);
  1375. X                goto FAIL;
  1376. X            }
  1377. X            wait_msec -= Nap(100L);
  1378. X        }
  1379. X        setw_err_msg("");
  1380. X    }
  1381. X
  1382. X#ifdef SHARE_DEBUG
  1383. X    {
  1384. X        char s256[256];
  1385. X
  1386. X        sprintf(s256, "SETUP-OPENED line=%s fd=%d", shm->Lline, shm->Liofd);
  1387. X        ecu_log_event((int)xmtr_pid, s256);
  1388. X    }
  1389. X#endif
  1390. X
  1391. X    setup_display_tty();
  1392. X    lopen_error_reset();     /* clear static error area */
  1393. X    return (itmp);
  1394. X
  1395. X}                             /* end of setup_line_open */
  1396. X
  1397. X/*+-------------------------------------------------------------------------
  1398. X    setw_get_single(nondelim_list)
  1399. Xassumes cursor is already positioned
  1400. X--------------------------------------------------------------------------*/
  1401. Xuint
  1402. Xsetw_get_single(nondelim_list)
  1403. Xregister char *nondelim_list;
  1404. X{
  1405. X    register uint itmp;
  1406. X    static uchar setw_nondelim_list[] =
  1407. X    {
  1408. X        CRET, NL, CTL_B, CTL_D, TAB, ESC, CTL_L, CTL_R, XFend, XFcurup, XFcurdn
  1409. X    };
  1410. X
  1411. X    itmp = winget_single(setw, nondelim_list, setw_nondelim_list);
  1412. X    if ((itmp & 0xFF) == CRET)
  1413. X        itmp = NL | 0x1000;
  1414. X    return (itmp);
  1415. X}                             /* end of setw_get_single */
  1416. X
  1417. X/*+-------------------------------------------------------------------------
  1418. X    setup_screen(argv_logical)
  1419. X--------------------------------------------------------------------------*/
  1420. Xvoid
  1421. Xsetup_screen(argv_logical)
  1422. Xchar *argv_logical;
  1423. X{
  1424. X    register itmp;
  1425. X    register input_state = 0;
  1426. X    char s128[128];
  1427. X    char *cptr;
  1428. X    char logical[NAME_LEN + 1];
  1429. X    int done = 0;
  1430. X    uint baud;
  1431. X    uchar delim;             /* important to be unsigned to avoid sign
  1432. X                              * extension */
  1433. X    PDE *tpde;
  1434. X    WINDOW *window_create();
  1435. X    static uchar use_input_delim[] =
  1436. X    {TAB, NL, XFcurdn, XFcurup, XFend, CTL_D, 0};
  1437. X
  1438. X    windows_start();
  1439. X    sprintf(s128, "ecu %s", revstr);
  1440. X    setw = window_create(s128, -3, SETW_TLY, SETW_TLX, SETW_LINES, SETW_COLS);
  1441. X    shm->Llogical[0] = 0;
  1442. X    logical[0] = 0;
  1443. X    setup_display_screen(1);
  1444. X
  1445. X#ifdef TURNKEY
  1446. X    if (!argv_logical)
  1447. X    {
  1448. X        done = 1;
  1449. X        delim = CTL_D;
  1450. X    }
  1451. X#endif /* TURNKEY */
  1452. X
  1453. X  REENTER_INPUT_LOOP:
  1454. X    while (!done)
  1455. X    {
  1456. X        wrefresh(setw);
  1457. X        switch (input_state)
  1458. X        {
  1459. X            case 0:
  1460. X                if (argv_logical)
  1461. X                {
  1462. X                    itmp = 0;/* 'ecu -' means dont dial */
  1463. X                    if (strcmp(argv_logical, "-"))    /* if not "-" */
  1464. X                    {
  1465. X                        strncpy(s128, argv_logical, NAME_LEN + 1);
  1466. X                        s128[NAME_LEN + 1] = 0;
  1467. X                        itmp = strlen(s128);
  1468. X                    }
  1469. X                    argv_logical = (char *)0;
  1470. X                    delim = XFend;
  1471. X                }
  1472. X                else
  1473. X                {
  1474. X                    if (logical[0])
  1475. X                        strcpy(s128, logical);
  1476. X                    setw_bot_msg(
  1477. X                        "logical phone directory entry, phone number or empty");
  1478. X                    itmp = wingets(setw, NAME_Y, NAME_X, s128,
  1479. X                        NAME_LEN + 1, &delim,
  1480. X                        (logical[0] != 0), (int *)0);
  1481. X                    setw_err_msg("");
  1482. X                }
  1483. X                if (delim == CTL_D)    /* do not process if going to
  1484. X                                     * directory */
  1485. X                    break;
  1486. X                if (strchr((char *)use_input_delim, (uchar) delim))
  1487. X                {
  1488. X                    strcpy(logical, s128);
  1489. X                    if ((tpde = logical_telno_to_pde(logical)) &&
  1490. X                        !copy_pde_to_Lvariables(tpde, 1))
  1491. X                    {
  1492. X                        strcpy(logical, tpde->logical);
  1493. X                        setup_display_screen(0);
  1494. X                        break;
  1495. X                    }
  1496. X                    else
  1497. X                    {
  1498. X                        setw_err_msg(errmsg);
  1499. X                        setup_display_screen(0);
  1500. X                        ring_bell();
  1501. X                        argv_logical = (char *)0;
  1502. X                        continue;
  1503. X                    }
  1504. X                }
  1505. X                setup_display_name();
  1506. X                break;
  1507. X
  1508. X            case 1:
  1509. X                cptr = strrchr(DEFAULT_TTY, '/');
  1510. X                if (!cptr)     /* cover unlikely bug */
  1511. X                    cptr = "/ttya";
  1512. X                cptr++;
  1513. X                sprintf(s128, "comm line: i.e., %s", cptr);
  1514. X                setw_bot_msg(s128);
  1515. X                setup_display_tty();
  1516. X                strcpy(s128, "/dev/");
  1517. X                strcpy(s128, &shm->Lline[5]);
  1518. X                itmp = wingets(setw, TTY_Y, TTY_X, s128, TTY_LEN + 1, &delim,
  1519. X                    1, (int *)0);
  1520. X                setw_err_msg("");
  1521. X                if (delim == CTL_D)    /* do not process if going to
  1522. X                                     * directory */
  1523. X                    break;
  1524. X                if (strchr((char *)use_input_delim, (uchar) delim))
  1525. X                {
  1526. X                    strcpy(shm->Lline, "/dev/");
  1527. X                    strcpy(&shm->Lline[5], s128);
  1528. X                }
  1529. X                setup_display_tty();
  1530. X                break;
  1531. X
  1532. X            case 2:
  1533. X                setw_bot_msg("duplex F:full H:half");
  1534. X                wmove(setw, DPX_Y, DPX_X);
  1535. X                wrefresh(setw);
  1536. X                delim = NL;
  1537. X                switch (itmp = setw_get_single("fh"))
  1538. X                {
  1539. X                    case 0:
  1540. X                    case 1:
  1541. X                        shm->Lfull_duplex = itmp;
  1542. X                        break;
  1543. X                    default:
  1544. X                        delim = itmp & 0xFF;
  1545. X                        break;
  1546. X                }
  1547. X                break;
  1548. X
  1549. X            case 3:         /* baud */
  1550. X                setw_bot_msg(
  1551. X                    "rates: 110,300,600,1200,2400,41280,9600,19200,38400");
  1552. X              CASE_3:
  1553. X                sprintf(s128, "%u", shm->Lbaud);
  1554. X                itmp = wingets(setw, BAUD_Y, BAUD_X, s128, BAUD_LEN + 1, &delim,
  1555. X                    1, (int *)0);
  1556. X                if (delim == CTL_D)    /* do not process if going to
  1557. X                                     * directory */
  1558. X                    break;
  1559. X                if (strchr((char *)use_input_delim, (uchar) delim))
  1560. X                {
  1561. X                    if (valid_baud_rate(baud = atoi(s128)) < 0)
  1562. X                    {
  1563. X                        setup_display_baud();
  1564. X                        ring_bell();
  1565. X                        goto CASE_3;
  1566. X                    }
  1567. X                    shm->Lbaud = baud;
  1568. X                }
  1569. X                setup_display_baud();
  1570. X                break;
  1571. X
  1572. X            case 4:
  1573. X                setw_bot_msg("parity: N:none E:even O:odd");
  1574. X                wmove(setw, PAR_Y, PAR_X);
  1575. X                wrefresh(setw);
  1576. X                delim = NL;
  1577. X                switch (itmp = setw_get_single("neo"))
  1578. X                {
  1579. X                    case 0:
  1580. X                        shm->Lparity = 0;
  1581. X                        break;
  1582. X                    case 1:
  1583. X                        shm->Lparity = 'e';
  1584. X                        break;
  1585. X                    case 2:
  1586. X                        shm->Lparity = 'o';
  1587. X                        break;
  1588. X                    default:
  1589. X                        delim = itmp & 0xFF;
  1590. X                        break;
  1591. X                }
  1592. X                wmove(setw, DB_Y, DB_X);
  1593. X                waddch(setw, (shm->Lparity) ? '7' : '8');
  1594. X                break;
  1595. X
  1596. X            case 5:
  1597. X                setw_bot_msg("");
  1598. X                wmove(setw, XADDNL_Y, XADDNL_X);
  1599. X                wrefresh(setw);
  1600. X                delim = NL;
  1601. X                switch (itmp = setw_get_single("ny"))
  1602. X                {
  1603. X                    case 0:
  1604. X                    case 1:
  1605. X                        shm->Ladd_nl_outgoing = itmp;
  1606. X                        break;
  1607. X                    default:
  1608. X                        delim = itmp & 0xFF;
  1609. X                }
  1610. X                break;
  1611. X
  1612. X            case 6:
  1613. X                setw_bot_msg("");
  1614. X                wmove(setw, RADDNL_Y, RADDNL_X);
  1615. X                wrefresh(setw);
  1616. X                delim = NL;
  1617. X                switch (itmp = setw_get_single("ny"))
  1618. X                {
  1619. X                    case 0:
  1620. X                    case 1:
  1621. X                        shm->Ladd_nl_incoming = itmp;
  1622. X                        break;
  1623. X                    default:
  1624. X                        delim = itmp & 0xFF;
  1625. X                        break;
  1626. X                }
  1627. X                break;
  1628. X        }
  1629. X
  1630. X        if (argv_logical && (delim != CTL_D))
  1631. X            break;
  1632. X
  1633. X        switch (delim)
  1634. X        {
  1635. X            case XFcurup:
  1636. X            case CTL_B:
  1637. X                if (input_state)
  1638. X                    input_state--;
  1639. X                else
  1640. X                    input_state = 6;
  1641. X                break;
  1642. X
  1643. X            case XFcurdn:
  1644. X            case TAB:
  1645. X            case NL:
  1646. X                input_state++;
  1647. X                input_state %= 7;
  1648. X                break;
  1649. X
  1650. X            case ESC:
  1651. X                if (shm->Liofd >= 0)
  1652. X                    lclose();
  1653. X                setw_bot_msg("");
  1654. X                setup_display_tty();
  1655. X                termecu(0);
  1656. X                break;
  1657. X
  1658. X            case CTL_L:
  1659. X            case CTL_R:
  1660. X                tcap_clear_screen();
  1661. X                touchwin(stdscr);
  1662. X                wrefresh(stdscr);
  1663. X                setup_display_screen(1);
  1664. X                touchwin(setw);
  1665. X                wrefresh(setw);
  1666. X                break;
  1667. X
  1668. X            case XFend:
  1669. X            case CTL_D:
  1670. X                done = 1;
  1671. X                break;
  1672. X        }
  1673. X    }
  1674. X
  1675. X    if (shm->Liofd < 0)
  1676. X    {
  1677. X        wmove(setw, TTY_Y, TTY_X);
  1678. X        wrefresh(setw);
  1679. X        if (setup_line_open())
  1680. X        {
  1681. X            done = 0;
  1682. X            input_state = 1;
  1683. X            argv_logical = (char *)0;
  1684. X            goto REENTER_INPUT_LOOP;
  1685. X        }
  1686. X    }
  1687. X
  1688. X    wmove(setw, SETW_LINES - 2, 1);
  1689. X    wstandout(setw);
  1690. X    waddstr(setw,             /* kludge -- must change if setw width does */
  1691. X        "------- Press HOME then 'help' for further assistance --------");
  1692. X    wstandend(setw);
  1693. X    setw_bot_msg("");
  1694. X    wrefresh(setw);
  1695. X    delwin(setw);
  1696. X    windows_end(0);
  1697. X    ttymode(1);
  1698. X    tcap_cursor(SETW_TLY + SETW_LINES + 2, 0);
  1699. X    rcvr_pid = -2;
  1700. X    if (delim == CTL_D)
  1701. X        phdir_manager();
  1702. X    else if (logical[0])
  1703. X    {
  1704. X        tpde = logical_telno_to_pde(logical);    /* error return not likely
  1705. X                                                 * now */
  1706. X        pde_dial(tpde);
  1707. X    }
  1708. X    else
  1709. X        start_rcvr_process(1);
  1710. X
  1711. X#ifdef SHARE_DEBUG
  1712. X    {
  1713. X        char s256[256];
  1714. X
  1715. X        sprintf(s256, "SETUP-DONE line=%s fd=%d", shm->Lline, shm->Liofd);
  1716. X        ecu_log_event((int)xmtr_pid, s256);
  1717. X    }
  1718. X#endif
  1719. X
  1720. X}                             /* end of setup_screen */
  1721. X
  1722. X/* vi: set tabstop=4 shiftwidth=4: */
  1723. END_OF_FILE
  1724.   if test 18406 -ne `wc -c <'ecu330/ecusetup.c'`; then
  1725.     echo shar: \"'ecu330/ecusetup.c'\" unpacked with wrong size!
  1726.   fi
  1727.   # end of 'ecu330/ecusetup.c'
  1728. fi
  1729. if test -f 'ecu330/esdutil.c' -a "${1}" != "-c" ; then 
  1730.   echo shar: Will not clobber existing file \"'ecu330/esdutil.c'\"
  1731. else
  1732.   echo shar: Extracting \"'ecu330/esdutil.c'\" \(20092 characters\)
  1733.   sed "s/^X//" >'ecu330/esdutil.c' <<'END_OF_FILE'
  1734. X/*+----------------------------------------------------------------
  1735. X    esdutil.c - ecu extended string descriptor manipulation
  1736. X    wht@n4hgf.atl.ga.us
  1737. X
  1738. X  Defined functions:
  1739. X    end_of_cmd(tesd)
  1740. X    esd_null_terminate(tesd)
  1741. X    esd_strip_trail_break(ztext)
  1742. X    esdalloc(maxcb)
  1743. X    esdcat(dest,suffix,realloc_ok)
  1744. X    esdfgets(tesd,fileptr)
  1745. X    esdfputs(tesd,fileptr,index_flag,nl_flag)
  1746. X    esdfree(tesd)
  1747. X    esdinit(tesd,cptr,maxcb)
  1748. X    esdrealloc(tesd,maxcb)
  1749. X    esdshow(tesd,title)
  1750. X    esdstrcat(tesd,zstr)
  1751. X    esdstrindex(esd1,esd2,index1_flag,index2_flag)
  1752. X    esdzero(tesd)
  1753. X    get_alpha_zstr(tesd,strbuf,strbuf_maxcb)
  1754. X    get_alphanum_zstr(tesd,strbuf,strbuf_maxcb)
  1755. X    get_cmd_char(tesd,pchar)
  1756. X    get_numeric_value(tesd,value)
  1757. X    get_numeric_zstr(tesd,strbuf,strbuf_maxcb)
  1758. X    get_switches(tesd,switches,switches_max)
  1759. X    get_word_zstr(tesd,strbuf,strbuf_maxcb)
  1760. X    keyword_lookup(ktable,keywd)
  1761. X    skip_cmd_break(tesd)
  1762. X    skip_cmd_char(tesd,skipchar)
  1763. X    skip_colon(tesd)
  1764. X    skip_comma(tesd)
  1765. X    skip_paren(tesd,fLeft)
  1766. X    strindex(str1,str2)
  1767. X
  1768. X  This is old code; give me a break
  1769. X
  1770. X-----------------------------------------------------------------*/
  1771. X/*+:EDITS:*/
  1772. X/*:05-04-1994-04:39-wht@n4hgf-ECU release 3.30 */
  1773. X/*:12-19-1992-16:30-wht@n4hgf-rectification of names in keyword_lookup */
  1774. X/*:09-10-1992-13:59-wht@n4hgf-ECU release 3.20 */
  1775. X/*:08-22-1992-15:38-wht@n4hgf-ECU release 3.20 BETA */
  1776. X/*:03-20-1992-06:26-wht@n4hgf-esdstrcat will grow an esd */
  1777. X/*:08-25-1991-23:20-root@n4hgf2-get_switches could overflow result string */
  1778. X/*:07-25-1991-12:57-wht@n4hgf-ECU release 3.10 */
  1779. X/*:05-02-1991-04:12-wht@n4hgf-how did esdrealloc ever work? */
  1780. X/*:04-23-1991-04:33-wht@n4hgf-function name reorganization */
  1781. X/*:04-23-1991-04:33-wht@n4hgf-add esdcat */
  1782. X/*:01-31-1991-14:49-wht@n4hgf-rework esdrealloc for speed */
  1783. X/*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
  1784. X
  1785. X#include "ecu.h"
  1786. X#include "ecuerror.h"
  1787. X#include "esd.h"
  1788. X
  1789. Xextern int errno;
  1790. X
  1791. X/*+-------------------------------------------------------------------------
  1792. X    esd_null_terminate(&esd)
  1793. X    puts null at 'cb' position of string (standard esd always
  1794. X    has one more byte in buffer than maxcb says)
  1795. X--------------------------------------------------------------------------*/
  1796. Xvoid
  1797. Xesd_null_terminate(tesd)
  1798. Xregister ESD *tesd;
  1799. X{
  1800. X    tesd->pb[tesd->cb] = 0;
  1801. X}                             /* end of esd_null_terminate */
  1802. X
  1803. X/*+-----------------------------------------------------------------------
  1804. X    esdzero(tesd)  zero an esd
  1805. X------------------------------------------------------------------------*/
  1806. Xvoid
  1807. Xesdzero(tesd)
  1808. Xregister ESD *tesd;
  1809. X{
  1810. X    tesd->cb = 0;             /* current count == 0 */
  1811. X    tesd->index = 0;         /* parse index to first position */
  1812. X    tesd->old_index = 0;     /* parse index to first position */
  1813. X    *tesd->pb = 0;             /* start with null terminated string */
  1814. X
  1815. X}                             /* end of esdzero */
  1816. X
  1817. X/*+-----------------------------------------------------------------------
  1818. X    esdinit(tesd,cptr,maxcb)  init an esd
  1819. X------------------------------------------------------------------------*/
  1820. Xvoid
  1821. Xesdinit(tesd, cptr, maxcb)
  1822. Xregister ESD *tesd;
  1823. Xchar *cptr;
  1824. Xregister maxcb;
  1825. X{
  1826. X    tesd->pb = cptr;         /* pointer to string */
  1827. X    tesd->maxcb = maxcb;     /* max characters in buffer */
  1828. X    esdzero(tesd);
  1829. X
  1830. X}                             /* end of esdinit */
  1831. X
  1832. X/*+-----------------------------------------------------------------------
  1833. X    esdptr = esdalloc(maxcb)    allocate an esd and buffer
  1834. X------------------------------------------------------------------------*/
  1835. XESD *
  1836. Xesdalloc(maxcb)
  1837. Xregister maxcb;                 /* desired maxcb */
  1838. X{
  1839. X    register ESD *tesd;
  1840. X    register actual_cb;
  1841. X
  1842. X    /* we get an extra character to ensure room for null past maxcb */
  1843. X    actual_cb = maxcb + 1;
  1844. X    if (actual_cb & 1)         /* even allocation */
  1845. X        ++actual_cb;
  1846. X
  1847. X    if (!(tesd = (ESD *) malloc(sizeof(ESD))))
  1848. X        return ((ESD *) 0);     /* return NULL if failure */
  1849. X
  1850. X    if (!(tesd->pb = malloc(actual_cb)))
  1851. X    {
  1852. X        free((char *)tesd);
  1853. X        return ((ESD *) 0);     /* return NULL if failure */
  1854. X    }
  1855. X
  1856. X    esdinit(tesd, tesd->pb, maxcb);
  1857. X    return (tesd);
  1858. X
  1859. X}                             /* end of esdalloc */
  1860. X
  1861. X/*+-----------------------------------------------------------------------
  1862. X    esdptr = esdrealloc(maxcb)    - realloc an esd buffer
  1863. X
  1864. Xmay only be used to enlarge an esd buffer
  1865. Xthis used to use realloc(), which did a lot of unnecessary copying
  1866. Xalso no more abnormal program termination on memory failure
  1867. X------------------------------------------------------------------------*/
  1868. Xint
  1869. Xesdrealloc(tesd, maxcb)
  1870. XESD *tesd;
  1871. Xregister maxcb;                 /* desired maxcb */
  1872. X{
  1873. X    register actual_cb;
  1874. X    char *newpb;
  1875. X
  1876. X    if (!tesd || (tesd->maxcb > maxcb))
  1877. X        return (eInternalLogicError);
  1878. X
  1879. X    /* enforce our limit */
  1880. X    if (maxcb > ESD_MAXSZ)
  1881. X        return (eBufferTooSmall);
  1882. X
  1883. X    /* we get an extra character to ensure room for null past maxcb */
  1884. X    actual_cb = maxcb + 1;
  1885. X    if (actual_cb & 1)         /* even allocation */
  1886. X        ++actual_cb;
  1887. X
  1888. X    if (!(newpb = malloc(actual_cb)))
  1889. X        return (eNoMemory);
  1890. X
  1891. X    if (tesd->cb)
  1892. X        memcpy(newpb, tesd->pb, tesd->cb);
  1893. X
  1894. X    free(tesd->pb);
  1895. X    tesd->pb = newpb;
  1896. X    tesd->maxcb = actual_cb;
  1897. X    esd_null_terminate(tesd);
  1898. X    return (0);
  1899. X
  1900. X}                             /* end of esdrealloc */
  1901. X
  1902. X/*+-----------------------------------------------------------------------
  1903. X    esdfree(esdptr)
  1904. X------------------------------------------------------------------------*/
  1905. Xvoid
  1906. Xesdfree(tesd)
  1907. Xregister ESD *tesd;
  1908. X{
  1909. X    if (tesd && tesd->pb)
  1910. X    {
  1911. X        free(tesd->pb);
  1912. X        free((char *)tesd);
  1913. X    }
  1914. X    else
  1915. X    {
  1916. X        errno = ENOMEM;
  1917. X        ff(se, "\r\n\r\nFREE_ESD FAILED. FATAL ERROR. SORRY.\r\n");
  1918. X        termecu(TERMECU_XMTR_FATAL_ERROR);
  1919. X    }
  1920. X}
  1921. X
  1922. X/*+-------------------------------------------------------------------------
  1923. X    esdcat(dest,suffix,realloc_ok) - "strcat" for ESDs
  1924. X
  1925. X  Append 'suffix' contents to 'dest'
  1926. X  if realloc_ok true, expand 'dest' as necessary
  1927. X
  1928. X  Returns: 0 - success
  1929. X           eNoMemory
  1930. X           eBufferTooSmall
  1931. X--------------------------------------------------------------------------*/
  1932. Xint
  1933. Xesdcat(dest, suffix, realloc_ok)
  1934. XESD *dest;
  1935. XESD *suffix;
  1936. Xint realloc_ok;
  1937. X{
  1938. X    int erc = 0;
  1939. X    int new_maxcb = dest->cb + suffix->cb;
  1940. X
  1941. X    if (dest->maxcb < new_maxcb)
  1942. X    {
  1943. X        if (!realloc_ok)
  1944. X            return (eBufferTooSmall);
  1945. X        if (erc = esdrealloc(dest, new_maxcb))
  1946. X            return (erc);
  1947. X    }
  1948. X
  1949. X    memcpy(dest->pb + dest->cb, suffix->pb, suffix->cb + 1);    /* catch null too */
  1950. X    dest->cb += suffix->cb;
  1951. X
  1952. X    return (0);
  1953. X
  1954. X}                             /* end of esdcat */
  1955. X
  1956. X/*+-------------------------------------------------------------------------
  1957. X    esdstrcat(tesd,zstr) - "strcat" for ESDs
  1958. X
  1959. Xsimilar to esdcat(), but with automatic esd growth
  1960. X--------------------------------------------------------------------------*/
  1961. Xint
  1962. Xesdstrcat(tesd, zstr)
  1963. XESD *tesd;
  1964. Xchar *zstr;
  1965. X{
  1966. X    register zstrlen = strlen(zstr);
  1967. X    register erc = 0;
  1968. X
  1969. X    if (zstrlen > (tesd->maxcb - tesd->cb))
  1970. X    {
  1971. X        if (erc = esdrealloc(tesd, tesd->cb + zstrlen))
  1972. X            return (erc);
  1973. X    }
  1974. X
  1975. X    if (zstrlen)
  1976. X    {
  1977. X        strncpy(tesd->pb + tesd->cb, zstr, zstrlen);
  1978. X        tesd->cb += zstrlen;
  1979. X        esd_null_terminate(tesd);
  1980. X    }
  1981. X
  1982. X    return (erc);
  1983. X
  1984. X}                             /* end of esdstrcat */
  1985. X
  1986. X/*+-------------------------------------------------------------------------
  1987. X    esdshow(tesd,title)
  1988. X--------------------------------------------------------------------------*/
  1989. Xvoid
  1990. Xesdshow(tesd, title)
  1991. XESD *tesd;
  1992. Xchar *title;
  1993. X{
  1994. X    register itmp;
  1995. X
  1996. X    if (title && *title)
  1997. X    {
  1998. X        pputs(title);
  1999. X        pputs("\n");
  2000. X    }
  2001. X    esd_null_terminate(tesd);
  2002. X    pputs(tesd->pb);
  2003. X    pputs("\n");
  2004. X    for (itmp = 0; itmp <= tesd->cb; itmp++)
  2005. X    {
  2006. X        if (itmp == tesd->old_index)
  2007. X            pputc('^');
  2008. X        else if (itmp == tesd->index)
  2009. X            pputc('^');
  2010. X        else
  2011. X            pputc(' ');
  2012. X        if ((itmp > tesd->old_index) && (itmp > tesd->index))
  2013. X            break;
  2014. X    }
  2015. X#if 0
  2016. X    pprintf(" o%d i%d c%d\n", tesd->old_index, tesd->index, tesd->cb);
  2017. X#else
  2018. X    pputs("\n");
  2019. X#endif
  2020. X
  2021. X}                             /* end of esdshow */
  2022. X
  2023. X/*+----------------------------------------------------------------
  2024. X    strindex:  string index function
  2025. X
  2026. X  Returns position of 'str2' in 'str1' if found
  2027. X  If 'str2' is null, then 0 is returned (null matches anything)
  2028. X  Returns -1 if not found
  2029. X-----------------------------------------------------------------*/
  2030. Xint
  2031. Xstrindex(str1, str2)
  2032. Xchar *str1;                     /* the (target) string to search */
  2033. Xchar *str2;                     /* the (comparand) string to search for */
  2034. X{
  2035. X    register istr1 = 0;
  2036. X    register lstr2 = strlen(str2);
  2037. X    register char *mstr = str1;    /* the (target) string to search */
  2038. X
  2039. X    if (*str2 == 0)             /* null string matches anything */
  2040. X        return (0);
  2041. X
  2042. X    while (*mstr)
  2043. X    {
  2044. X        if (*mstr == *str2)
  2045. X        {                     /* we have a first char match... does rest of
  2046. X                              * string match? */
  2047. X            if (!strncmp(mstr, str2, lstr2))
  2048. X                return (istr1);    /* if so, return match position */
  2049. X        }
  2050. X        mstr++;
  2051. X        istr1++;
  2052. X    }
  2053. X
  2054. X    return (-1);             /* if we exhaust target string, flunk */
  2055. X
  2056. X}                             /* end of strindex */
  2057. X
  2058. X/*+-------------------------------------------------------------------------
  2059. X    esdstrindex(esd1,esd2,index1_flag,index2_flag)
  2060. X
  2061. X  Call strindex with esd1->pb and esd2->pb.
  2062. X  If index1_flag != 0, esd1->pb + esd1->index passed
  2063. X  If index2_flag != 0, esd2->pb + esd2->index passed
  2064. X--------------------------------------------------------------------------*/
  2065. Xesdstrindex(esd1, esd2, index1_flag, index2_flag)
  2066. Xregister ESD *esd1;
  2067. Xregister ESD *esd2;
  2068. Xregister index1_flag;
  2069. Xregister index2_flag;
  2070. X{
  2071. X    return (strindex((index1_flag) ? esd1->pb : esd1->pb + esd1->index,
  2072. X            (index2_flag) ? esd2->pb : esd2->pb + esd2->index));
  2073. X
  2074. X}                             /* end of esdstrindex */
  2075. X
  2076. X/*+----------------------------------------------------------------
  2077. X    keyword_lookup(ktable,keywd)
  2078. X
  2079. X  Lookup string in keyword_table struct array
  2080. X  Returns table->key_token if 'keywd' found in
  2081. X  'table', else -1
  2082. X
  2083. X  Beware substrings.  "type","typedef" will both match "type"
  2084. X  This procedure fell in here and it too late to move it.
  2085. X-----------------------------------------------------------------*/
  2086. Xkeyword_lookup(ktable, keywd)
  2087. Xregister KEYTAB *ktable;
  2088. Xregister char *keywd;
  2089. X{
  2090. X/* register plen = strlen(keywd); */
  2091. X
  2092. X    while (ktable->key_word)
  2093. X    {
  2094. X/*        if(!strncmp(ktable->key_word,keywd,plen)) */
  2095. X        if (!strcmp(ktable->key_word, keywd))
  2096. X            return (ktable->key_token);
  2097. X        ++ktable;
  2098. X    }                         /* end of while */
  2099. X
  2100. X    return (-1);             /* search failed */
  2101. X
  2102. X}                             /* end of keyword_lookup */
  2103. X
  2104. X/*+----------------------------------------------------------------
  2105. X    skip_cmd_break(tesd)
  2106. X
  2107. X  Finds next non-break
  2108. X
  2109. X  'tesd' is an esd with valid 'index' field
  2110. X  Returns  0             index field points to non-break character
  2111. X           eNoParameter  end of command found
  2112. X-----------------------------------------------------------------*/
  2113. Xint
  2114. Xskip_cmd_break(tesd)
  2115. Xregister ESD *tesd;
  2116. X{
  2117. X    register cb = tesd->cb;
  2118. X    register idx = tesd->index;
  2119. X    register char *pb = tesd->pb;
  2120. X
  2121. X    while (idx < cb)
  2122. X    {
  2123. X        if (!isspace(*(pb + idx)))
  2124. X            break;
  2125. X        idx++;
  2126. X    }
  2127. X    tesd->old_index = tesd->index = idx;
  2128. X    if (idx >= cb)
  2129. X        return (eNoParameter);
  2130. X    return (0);
  2131. X
  2132. X}                             /* end of skip_cmd_break */
  2133. X
  2134. X/*+-------------------------------------------------------------------------
  2135. X    end_of_cmd(tesd) - return 1 if at end of command
  2136. X--------------------------------------------------------------------------*/
  2137. Xint
  2138. Xend_of_cmd(tesd)
  2139. Xregister ESD *tesd;
  2140. X{
  2141. X    if (skip_cmd_break(tesd) || (*(tesd->pb + tesd->index) == ';') ||
  2142. X        (*(tesd->pb + tesd->index) == '#'))
  2143. X        return (1);
  2144. X    return (0);
  2145. X}                             /* end of end_of_cmd */
  2146. X
  2147. X/*+-------------------------------------------------------------------------
  2148. X    erc = skip_cmd_char(tesd,skipchar)
  2149. X--------------------------------------------------------------------------*/
  2150. Xint
  2151. Xskip_cmd_char(tesd, skipchar)
  2152. Xregister ESD *tesd;
  2153. Xregister char skipchar;
  2154. X{
  2155. X    int erc;
  2156. X
  2157. X    if (erc = skip_cmd_break(tesd))
  2158. X        return (erc);
  2159. X
  2160. X    if (tesd->pb[tesd->index] == skipchar)
  2161. X    {
  2162. X        ++tesd->index;
  2163. X        return (0);
  2164. X    }
  2165. X
  2166. X    return (eSyntaxError);
  2167. X
  2168. X}                             /* end of skip_cmd_char */
  2169. X
  2170. X/*+-------------------------------------------------------------------------
  2171. X    erc = skip_colon(tesd)
  2172. X--------------------------------------------------------------------------*/
  2173. Xint
  2174. Xskip_colon(tesd)
  2175. Xregister ESD *tesd;
  2176. X{
  2177. X    register erc;
  2178. X
  2179. X    if (erc = skip_cmd_break(tesd))
  2180. X        return (erc);
  2181. X
  2182. X    if (tesd->pb[tesd->index] == ':')
  2183. X    {
  2184. X        ++tesd->index;
  2185. X        return (0);
  2186. X    }
  2187. X
  2188. X    return (eCommaExpected);
  2189. X
  2190. X}                             /* end of skip_colon */
  2191. X
  2192. X/*+-------------------------------------------------------------------------
  2193. X    erc = skip_comma(tesd)
  2194. X--------------------------------------------------------------------------*/
  2195. Xint
  2196. Xskip_comma(tesd)
  2197. Xregister ESD *tesd;
  2198. X{
  2199. X    register erc;
  2200. X
  2201. X    if (erc = skip_cmd_break(tesd))
  2202. X        return (erc);
  2203. X
  2204. X    if (tesd->pb[tesd->index] == ',')
  2205. X    {
  2206. X        ++tesd->index;
  2207. X        return (0);
  2208. X    }
  2209. X
  2210. X    return (eCommaExpected);
  2211. X
  2212. X}                             /* end of skip_comma */
  2213. X
  2214. X/*+-------------------------------------------------------------------------
  2215. X    erc = skip_paren(fparam,LEFT or RIGHT)
  2216. X--------------------------------------------------------------------------*/
  2217. Xint
  2218. Xskip_paren(tesd, fLeft)
  2219. Xregister ESD *tesd;
  2220. Xint fLeft;
  2221. X{
  2222. X    register erc;
  2223. X    register char search = (fLeft) ? '(' : ')';
  2224. X
  2225. X    if (erc = skip_cmd_break(tesd))
  2226. X        return (erc);
  2227. X
  2228. X    if (tesd->pb[tesd->index] == search)
  2229. X    {
  2230. X        tesd->index++;
  2231. X        return (0);
  2232. X    }
  2233. X    return ((fLeft) ? eMissingLeftParen : eMissingRightParen);
  2234. X
  2235. X}                             /* end of skip_paren */
  2236. X
  2237. X/*+-------------------------------------------------------------------------
  2238. X    get_cmd_char(tesd,pchar)
  2239. X--------------------------------------------------------------------------*/
  2240. Xint
  2241. Xget_cmd_char(tesd, pchar)
  2242. Xregister ESD *tesd;
  2243. Xchar *pchar;
  2244. X{
  2245. X    int erc;
  2246. X
  2247. X    if (erc = skip_cmd_break(tesd))
  2248. X        return (erc);
  2249. X    *pchar = tesd->pb[tesd->index++];
  2250. X    return (0);
  2251. X
  2252. X}                             /* end of get_cmd_char */
  2253. X
  2254. X/*+----------------------------------------------------------------
  2255. X    get_alpha_zstr(&esd,&strbuf,strbuf_maxcb)
  2256. X
  2257. X  places next alphabetic string token [A-Za-z_] into
  2258. X  the null-terminated 'strbuf' string.  returns 0 or -1
  2259. X  or skip_cmd_break error codes
  2260. X-----------------------------------------------------------------*/
  2261. Xint
  2262. Xget_alpha_zstr(tesd, strbuf, strbuf_maxcb)
  2263. XESD *tesd;
  2264. Xregister char *strbuf;
  2265. Xint strbuf_maxcb;
  2266. X{
  2267. X    register izstr;
  2268. X    register schar;
  2269. X    register char *pb = tesd->pb;
  2270. X
  2271. X    if (izstr = skip_cmd_break(tesd))
  2272. X        return (izstr);
  2273. X    izstr = 0;
  2274. X    while ((izstr < strbuf_maxcb - 1) && (tesd->index < tesd->cb))
  2275. X    {
  2276. X        schar = pb[tesd->index];
  2277. X        if ((!isalpha(schar)) && (schar != '_'))
  2278. X            break;
  2279. X        strbuf[izstr++] = schar;
  2280. X        tesd->index++;
  2281. X    }
  2282. X
  2283. X    strbuf[izstr] = 0;
  2284. X    return (izstr ? 0 : eBadParameter);
  2285. X
  2286. X}                             /* end of get_alpha_zstr */
  2287. X
  2288. X/*+----------------------------------------------------------------
  2289. X    get_alphanum_zstr(&esd,&strbuf,strbuf_maxcb)
  2290. X
  2291. X  places next alphanumeric string token [A-Za-z0-9_]
  2292. X  into the null-terminated 'strbuf' string.  returns 0
  2293. X  or -1 or skip_cmd_break error codes
  2294. X-----------------------------------------------------------------*/
  2295. Xint
  2296. Xget_alphanum_zstr(tesd, strbuf, strbuf_maxcb)
  2297. Xregister ESD *tesd;
  2298. Xregister char *strbuf;
  2299. Xint strbuf_maxcb;
  2300. X{
  2301. X    int izstr = 0;
  2302. X    int schar;
  2303. X    register cb = tesd->cb;
  2304. X    register idx;
  2305. X
  2306. X    if (izstr = skip_cmd_break(tesd))
  2307. X        return (izstr);
  2308. X
  2309. X    idx = tesd->index;
  2310. X    while ((izstr < strbuf_maxcb - 1) && (idx < cb))
  2311. X    {
  2312. X        schar = tesd->pb[idx++];
  2313. X        if (isalnum(schar) || (schar == '_'))
  2314. X            strbuf[izstr++] = schar;
  2315. X        else
  2316. X        {
  2317. X            --idx;
  2318. X            break;
  2319. X        }
  2320. X    }
  2321. X
  2322. X    tesd->index = idx;
  2323. X    strbuf[izstr] = 0;
  2324. X    return (izstr ? 0 : eBadParameter);
  2325. X
  2326. X}                             /* end of get_alphanum_zstr */
  2327. X
  2328. X/*+----------------------------------------------------------------
  2329. X    get_numeric_zstr(&esd,&strbuf,strbuf_maxcb)
  2330. X    gets next numeric string token places it
  2331. X    into the null-terminated 'strbuf' string.  returns 0 or -1
  2332. X    or skip_cmd_break error codes
  2333. X-----------------------------------------------------------------*/
  2334. Xint
  2335. Xget_numeric_zstr(tesd, strbuf, strbuf_maxcb)
  2336. Xregister ESD *tesd;
  2337. Xregister char *strbuf;
  2338. Xregister strbuf_maxcb;
  2339. X{
  2340. X    register izstr;
  2341. X    register schar;
  2342. X
  2343. X    if (izstr = skip_cmd_break(tesd))
  2344. X        return (izstr);
  2345. X
  2346. X    while ((izstr < strbuf_maxcb - 1) && (tesd->index < tesd->cb))
  2347. X    {
  2348. X        schar = tesd->pb[tesd->index++];
  2349. X        if (isdigit(schar))
  2350. X            strbuf[izstr++] = schar;
  2351. X        else
  2352. X        {
  2353. X            --tesd->index;
  2354. X            break;
  2355. X        }
  2356. X    }
  2357. X
  2358. X    strbuf[izstr] = 0;
  2359. X    return (izstr ? 0 : eBadParameter);
  2360. X
  2361. X}                             /* end of get_numeric_zstr */
  2362. X
  2363. X/*+-----------------------------------------------------------------------
  2364. X    get_numeric_value(tesd,&long_var)
  2365. X------------------------------------------------------------------------*/
  2366. Xget_numeric_value(tesd, value)
  2367. Xregister ESD *tesd;
  2368. Xregister long *value;
  2369. X{
  2370. X    register erc;
  2371. X    char buf[32];
  2372. X
  2373. X    if (erc = get_numeric_zstr(tesd, buf, sizeof(buf)))
  2374. X        return (erc);
  2375. X    sscanf(buf, "%ld", value);
  2376. X    return (0);
  2377. X
  2378. X}                             /* end of get_numeric_value */
  2379. X
  2380. X/*+----------------------------------------------------------------
  2381. X    get_word_zstr(&esd,&strbuf,strbuf_maxcb)
  2382. X
  2383. X  gets next word (continuous string of characters without spaces
  2384. X  or tabs) returns 0 or -1 or skip_cmd_break error codes
  2385. X-----------------------------------------------------------------*/
  2386. Xint
  2387. Xget_word_zstr(tesd, strbuf, strbuf_maxcb)
  2388. Xregister ESD *tesd;
  2389. Xregister char *strbuf;
  2390. Xregister strbuf_maxcb;
  2391. X{
  2392. X    register izstr;
  2393. X    register schar;
  2394. X
  2395. X    if (izstr = skip_cmd_break(tesd))
  2396. X        return (izstr);
  2397. X
  2398. X    strbuf_maxcb--;
  2399. X    while ((izstr < strbuf_maxcb) && (tesd->index < tesd->cb))
  2400. X    {
  2401. X        schar = tesd->pb[tesd->index++];
  2402. X        if ((schar > 0x20) && (schar <= 0x7e))
  2403. X            strbuf[izstr++] = schar;
  2404. X        else
  2405. X        {
  2406. X            --tesd->index;
  2407. X            break;
  2408. X        }
  2409. X    }
  2410. X
  2411. X    strbuf[izstr] = 0;
  2412. X    return (izstr ? 0 : eBadParameter);
  2413. X
  2414. X}                             /* end of get_word_zstr */
  2415. X
  2416. X/*+-------------------------------------------------------------------------
  2417. X    esd_strip_trail_break(tesd)
  2418. X--------------------------------------------------------------------------*/
  2419. Xvoid
  2420. Xesd_strip_trail_break(ztext)
  2421. Xregister ESD *ztext;
  2422. X{
  2423. X    while (ztext->cb &&
  2424. X        ((ztext->pb[ztext->cb - 1] == 0x20) || (ztext->pb[ztext->cb - 1] == 0x20)))
  2425. X    {
  2426. X        ztext->cb--;
  2427. X    }
  2428. X}                             /* end of esd_strip_trail_break */
  2429. X
  2430. X/*+-------------------------------------------------------------------------
  2431. X    esdfgets(&esd,fileptr)
  2432. X
  2433. X  stdio read from FILE *fileptr into esd
  2434. X  returns tesd->cb set up not including trailing nl, tesd->index == 0
  2435. X--------------------------------------------------------------------------*/
  2436. Xint
  2437. Xesdfgets(tesd, fileptr)
  2438. Xregister ESD *tesd;
  2439. Xregister FILE *fileptr;
  2440. X{
  2441. X    register char *cptr;
  2442. X
  2443. X    tesd->cb = 0;
  2444. X    if (!fgets(tesd->pb, tesd->maxcb + 1, fileptr))
  2445. X        return (eEOF);
  2446. X    if (!(cptr = strchr(tesd->pb, 0x0A)))
  2447. X        return (eBufferTooSmall);
  2448. X    tesd->cb = (int)(cptr - tesd->pb);
  2449. X    esd_null_terminate(tesd);
  2450. X    tesd->index = 0;
  2451. X    tesd->old_index = 0;
  2452. X    return (0);
  2453. X
  2454. X}                             /* end of esdfgets */
  2455. X
  2456. X/*+-------------------------------------------------------------------------
  2457. X    esdfputs(&esd,fileptr,index_flag,nl_flag)
  2458. X
  2459. X  write esd contents to stdio FILE *fileptr
  2460. X  if index_flag is true, write from tesd->index thru end of esd
  2461. X  otherwise, from start of esd
  2462. X  if nl_flag is true, append nl to write, else just esd contents
  2463. X--------------------------------------------------------------------------*/
  2464. Xint
  2465. Xesdfputs(tesd, fileptr, index_flag, nl_flag)
  2466. Xregister ESD *tesd;
  2467. XFILE *fileptr;
  2468. Xint index_flag;
  2469. Xint nl_flag;
  2470. X{
  2471. X    register char *cptr;
  2472. X    register write_length;
  2473. X
  2474. X    if (index_flag)
  2475. X    {
  2476. X        cptr = &tesd->pb[tesd->index];
  2477. X        write_length = tesd->cb - tesd->index;
  2478. X    }
  2479. X    else
  2480. X    {
  2481. X        cptr = tesd->pb;
  2482. X        write_length = tesd->cb;
  2483. X    }
  2484. X
  2485. X    if (write_length)
  2486. X        fwrite(cptr, write_length, 1, fileptr);
  2487. X
  2488. X    if (nl_flag)
  2489. X        fputc(0x0A, fileptr);
  2490. X
  2491. X    return (0);
  2492. X}                             /* end of esdfputs */
  2493. X
  2494. X/*+-------------------------------------------------------------------------
  2495. X    get_switches(tesd,switches,switches_max)
  2496. X--------------------------------------------------------------------------*/
  2497. Xint
  2498. Xget_switches(tesd, switches, switches_max)
  2499. XESD *tesd;
  2500. Xchar *switches;
  2501. Xint switches_max;
  2502. X{
  2503. X    register erc;
  2504. X    register idx;
  2505. X    register char *pb = tesd->pb;
  2506. X    int cb = tesd->cb;
  2507. X    char schar;
  2508. X
  2509. X    *switches = 0;
  2510. X
  2511. X    if (erc = skip_cmd_break(tesd))
  2512. X        return (erc);
  2513. X
  2514. X    idx = tesd->index;
  2515. X    if (*(pb + idx) != '-')
  2516. X        return (eNoSwitches);
  2517. X
  2518. X    if (switches_max < 3)
  2519. X        return (eSwitchesTooLong);
  2520. X
  2521. X    switches_max--;             /* for trailing null */
  2522. X    *switches++ = '-';
  2523. X    switches_max--;
  2524. X    idx++;
  2525. X    while (idx < cb)
  2526. X    {
  2527. X        schar = *(pb + idx++);
  2528. X        if (switches_max > 0)
  2529. X            *switches++ = schar;
  2530. X        switches_max--;
  2531. X        if (isspace(schar))
  2532. X            break;
  2533. X    }
  2534. X
  2535. X    tesd->index = idx;
  2536. X    *switches = 0;
  2537. X    return ((switches_max < 0) ? eSwitchesTooLong : 0);
  2538. X
  2539. X}                             /* end of get_switches() */
  2540. X
  2541. X/* vi: set tabstop=4 shiftwidth=4: */
  2542. X/* end of esdutil.c */
  2543. END_OF_FILE
  2544.   if test 20092 -ne `wc -c <'ecu330/esdutil.c'`; then
  2545.     echo shar: \"'ecu330/esdutil.c'\" unpacked with wrong size!
  2546.   fi
  2547.   # end of 'ecu330/esdutil.c'
  2548. fi
  2549. if test -f 'ecu330/pc_scr.h' -a "${1}" != "-c" ; then 
  2550.   echo shar: Will not clobber existing file \"'ecu330/pc_scr.h'\"
  2551. else
  2552.   echo shar: Extracting \"'ecu330/pc_scr.h'\" \(1856 characters\)
  2553.   sed "s/^X//" >'ecu330/pc_scr.h' <<'END_OF_FILE'
  2554. X/*+-------------------------------------------------------------------------
  2555. X    pc_scr.h - PC/AT screen definitions
  2556. X    wht@n4hgf.atl.ga.us
  2557. X--------------------------------------------------------------------------*/
  2558. X/*+:EDITS:*/
  2559. X/*:05-04-1994-04:39-wht@n4hgf-ECU release 3.30 */
  2560. X/*:11-12-1993-11:00-wht@n4hgf-Linux changes by bob@vancouver.zadall.com */
  2561. X/*:09-10-1992-14:00-wht@n4hgf-ECU release 3.20 */
  2562. X/*:08-22-1992-15:39-wht@n4hgf-ECU release 3.20 BETA */
  2563. X/*:03-27-1992-16:21-wht@n4hgf-re-include protection for all .h files */
  2564. X/*:07-25-1991-12:58-wht@n4hgf-ECU release 3.10 */
  2565. X/*:12-04-1990-02:48-wht@n4hgf-for nonansi terminals provide either ruling set */
  2566. X/*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
  2567. X
  2568. X#ifndef _pc_scr_h
  2569. X#define _pc_scr_h
  2570. X
  2571. X/*
  2572. X * AT ROM ruling characters
  2573. X */
  2574. X#define at_TL        0xDA     /* top left single rule */
  2575. X#define at_TR        0xBF     /* top right single rule */
  2576. X#define at_BL        0xC0     /* bottom left single rule */
  2577. X#define at_BR        0xD9     /* bottom right single rule */
  2578. X#define at_LT        0xC3     /* left hand T */
  2579. X#define at_RT        0xB4     /* right hand T */
  2580. X#define at_VR        0xB3     /* vertical rule */
  2581. X#define at_HR        0xC4     /* horizontal rule */
  2582. X/*
  2583. X * non-ANSI equivalents
  2584. X */
  2585. X#define vanilla_TL        '.'
  2586. X#define vanilla_TR        '.'
  2587. X#define vanilla_BL        '`'
  2588. X#define vanilla_BR        '\''
  2589. X#define vanilla_LT        '+'
  2590. X#define vanilla_RT        '+'
  2591. X#define vanilla_VR        '|'
  2592. X#define vanilla_HR        '-'
  2593. X
  2594. X#ifdef LINUX
  2595. Xextern chtype sTL;
  2596. Xextern chtype sTR;
  2597. Xextern chtype sBL;
  2598. Xextern chtype sBR;
  2599. Xextern chtype sLT;
  2600. Xextern chtype sRT;
  2601. Xextern chtype sVR;
  2602. Xextern chtype sHR;
  2603. X
  2604. X#else
  2605. Xextern unsigned char sTL;
  2606. Xextern unsigned char sTR;
  2607. Xextern unsigned char sBL;
  2608. Xextern unsigned char sBR;
  2609. Xextern unsigned char sLT;
  2610. Xextern unsigned char sRT;
  2611. Xextern unsigned char sVR;
  2612. Xextern unsigned char sHR;
  2613. X
  2614. X#endif
  2615. X
  2616. X#endif /* _pc_scr_h */
  2617. X
  2618. X/* vi: set tabstop=4 shiftwidth=4: */
  2619. X/* end of pc_scr.h */
  2620. END_OF_FILE
  2621.   if test 1856 -ne `wc -c <'ecu330/pc_scr.h'`; then
  2622.     echo shar: \"'ecu330/pc_scr.h'\" unpacked with wrong size!
  2623.   fi
  2624.   # end of 'ecu330/pc_scr.h'
  2625. fi
  2626. echo shar: End of archive 22 \(of 37\).
  2627. cp /dev/null ark22isdone
  2628. MISSING=""
  2629. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 ; do
  2630.     if test ! -f ark${I}isdone ; then
  2631.     MISSING="${MISSING} ${I}"
  2632.     fi
  2633. done
  2634. if test "${MISSING}" = "" ; then
  2635.     echo You have unpacked all 37 archives.
  2636.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  2637. else
  2638.     echo You still must unpack the following archives:
  2639.     echo "        " ${MISSING}
  2640. fi
  2641. exit 0
  2642. exit 0 # Just in case...
  2643.