home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume21 / ecu / part13 < prev    next >
Text File  |  1991-08-05  |  55KB  |  2,363 lines

  1. Newsgroups: comp.sources.misc
  2. From: Warren Tucker <wht@n4hgf.Mt-Park.GA.US>
  3. Subject:  v21i065:  ecu - ECU async comm package rev 3.10, Part13/37
  4. Message-ID: <1991Aug4.015803.8904@sparky.IMD.Sterling.COM>
  5. X-Md4-Signature: cf7e0efdf5e487b3b9c63e4ca9af2145
  6. Date: Sun, 4 Aug 1991 01:58:03 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: Warren Tucker <wht@n4hgf.Mt-Park.GA.US>
  10. Posting-number: Volume 21, Issue 65
  11. Archive-name: ecu/part13
  12. Environment: SCO, XENIX, ISC
  13. Supersedes: ecu3: Volume 16, Issue 25-59
  14.  
  15. ---- Cut Here and feed the following to sh ----
  16. #!/bin/sh
  17. # this is ecu310.13 (part 13 of ecu310)
  18. # do not concatenate these parts, unpack them in order with /bin/sh
  19. # file expresp.c continued
  20. #
  21. if touch 2>&1 | fgrep 'amc' > /dev/null
  22.  then TOUCH=touch
  23.  else TOUCH=true
  24. fi
  25. if test ! -r _shar_seq_.tmp; then
  26.     echo 'Please unpack part 1 first!'
  27.     exit 1
  28. fi
  29. (read Scheck
  30.  if test "$Scheck" != 13; then
  31.     echo Please unpack part "$Scheck" next!
  32.     exit 1
  33.  else
  34.     exit 0
  35.  fi
  36. ) < _shar_seq_.tmp || exit 1
  37. if test ! -f _shar_wnt_.tmp; then
  38.     echo 'x - still skipping expresp.c'
  39. else
  40. echo 'x - continuing file expresp.c'
  41. sed 's/^X//' << 'SHAR_EOF' >> 'expresp.c' &&
  42. X    expresp.c - HDB expect/respond per SCO Devices file
  43. X    wht@n4hgf.Mt-Park.GA.US
  44. X
  45. X Meaning of some of the escape characters:
  46. X \p - pause (approximately 1/4-1/2 second delay)
  47. X \d - delay (2 seconds)
  48. X \D - phone number/token
  49. X \T - phone number with Dialcodes and character translation
  50. X \N - null byte
  51. X \K - insert a BREAK
  52. X \E - turn on echo checking (for slow devices)
  53. X \e - turn off echo checking
  54. X \r - carriage return
  55. X \c - no new-line
  56. X \n - send new-line
  57. X \nnn - send octal number
  58. X \m### - sleep ### (decimal) milliseconds (non-standard)
  59. X Speed - Hayes-specific speed-adaptive connect handler
  60. X
  61. X  Defined functions:
  62. X    pcmd_expresp(param)
  63. X    execute_expresp(expresp_script)
  64. X    expect(str)
  65. X    respond(str)
  66. X
  67. X--------------------------------------------------------------------------*/
  68. X/*+:EDITS:*/
  69. X/*:07-25-1991-12:57-wht@n4hgf-ECU release 3.10 */
  70. X/*:07-17-1991-07:04-wht@n4hgf-avoid SCO UNIX nap bug */
  71. X/*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
  72. X
  73. X#include "ecu.h"
  74. X#include "ecuerror.h"
  75. X#include "esd.h"
  76. X#include "var.h"
  77. X#include "proc.h"
  78. X
  79. X
  80. X#define MAX_FIELDS    50    /* max fields in a chat script */
  81. X#define MAX_EXPRESP    511    /* max length of a chat script */
  82. X#define MAX_EXPECT    63    /* max length of expect string */
  83. X#define DEFAULT_TIMEOUT_MSECS (10*1000L)
  84. X
  85. X#define ERDEBUG(verb,str,arg) if(expresp_verbosity >= verb) \
  86. X    pprintf(str,arg);
  87. X
  88. Xlong atol();
  89. X
  90. Xextern int proctrace;
  91. Xextern int sigint;
  92. X
  93. Xint expresp_verbosity = 0;
  94. Xulong expect_timeout_msecs = DEFAULT_TIMEOUT_MSECS;
  95. Xint expresp_echo_check = 0;
  96. X
  97. Xchar last_Speed_result[32];
  98. X
  99. X/*+-------------------------------------------------------------------------
  100. X    expect(str) - expect (read) string from remote
  101. Xreturn code on failure, 0 on success
  102. X--------------------------------------------------------------------------*/
  103. Xint
  104. Xexpect(str)
  105. Xchar *str;
  106. X{
  107. X    register char *cptr;
  108. X    char parsebuf[MAX_EXPECT + 1];
  109. X    int remaining = MAX_EXPECT;
  110. X    int erc;
  111. X    int old_ttymode = get_ttymode();
  112. X    register char *parsed = parsebuf;
  113. X    char s4[4];
  114. X    int itmp;
  115. X    long atol();
  116. X
  117. X    if(old_ttymode != 2)
  118. X        ttymode(2);
  119. X
  120. X    if(!strncmp(str,"~t[",3) || !strncmp(str,"~m[",3))
  121. X    {
  122. X        expect_timeout_msecs = atol(str + 3);
  123. X        if(*(str + 1) == 't')
  124. X            expect_timeout_msecs *= 1000L;
  125. X        str += 3;
  126. X        ERDEBUG(2,"expect timeout = %lu msec\n",expect_timeout_msecs);
  127. X        if(cptr = strchr(str,']'))
  128. X        {
  129. X            str = cptr + 1;
  130. X            ERDEBUG(3,"expect: %s\n",str);
  131. X        }
  132. X        else
  133. X        {
  134. X            erc = eExpectRespondFail;
  135. X            goto RESTORE_TTYMODE_AND_RETURN_ERC;
  136. X        }
  137. X    }
  138. X    ERDEBUG(2,"expect: <<%s>>\n",str);
  139. X    if(!strlen(str) || !strcmp(str,"\"\""))
  140. X        goto GOT_EXPECTED;
  141. X
  142. X    if(!strcmp(str,"Speed"))
  143. X    {
  144. X        LRWT lr;
  145. X        long ms_start;
  146. X        long ms_now;
  147. X        struct timeb now_timeb;
  148. X        ftime(&now_timeb);
  149. X        ms_start = (now_timeb.time * 1000) + now_timeb.millitm;
  150. X        do {
  151. X            last_Speed_result[0] = 0;
  152. X            lr.to1 = 90 * 100L;
  153. X            lr.to2 = 120L;
  154. X            /* allow interrupts + cooked read */
  155. X            lr.raw_flag = 0x80;
  156. X            lr.buffer = last_Speed_result;
  157. X            lr.bufsize = sizeof(last_Speed_result);
  158. X            lr.delim = "\n";
  159. X            lr.echo = 0;
  160. X            lgets_timeout(&lr);
  161. X            ftime(&now_timeb);
  162. X            ms_now = (now_timeb.time * 1000) + now_timeb.millitm;
  163. X        } while(!sigint && !lr.count && ((ms_now - ms_start) < 90*1000L));
  164. X
  165. X        if(sigint || strncmp(lr.buffer,"CONNECT",7))
  166. X            goto DID_NOT_GET_EXPECTED;
  167. X        else
  168. X            goto GOT_EXPECTED;
  169. X    }
  170. X
  171. X    cptr = str;
  172. X    while(remaining)
  173. X    {
  174. X        if(*cptr == '\\')
  175. X        {
  176. X            if(!*(++cptr))    /* if no character after escape, ... */
  177. X            {
  178. X                ERDEBUG(2," error: str ended with '\\'\n",0);
  179. X                goto DID_NOT_GET_EXPECTED;
  180. X            }
  181. X
  182. X            if(isdigit(*cptr))    /* handle \ooo */
  183. X            {
  184. X                strncpy(s4,cptr,3);
  185. X                s4[3] = 0;
  186. X                sscanf(s4,"%o",&itmp);
  187. X                cptr += strspn(s4,"01234567");
  188. X                *parsed++ = (char)itmp;
  189. X                remaining--;
  190. X                continue;
  191. X            }
  192. X
  193. X            switch(*cptr)
  194. X            {
  195. X            case 'n':
  196. X                *parsed++ = 0x0A;
  197. X                remaining--;
  198. X                break;
  199. X            case 'r':
  200. X                *parsed++ = 0x0D;
  201. X                remaining--;
  202. X                break;
  203. X            default:
  204. X                ERDEBUG(2," meaningless here: \\%c\n",*cptr);
  205. X                break;
  206. X            }
  207. X            cptr++;
  208. X        }
  209. X        else
  210. X        {
  211. X            *parsed++ = *cptr++;
  212. X            remaining--;
  213. X        }
  214. X    }
  215. X    *parsed = 0;
  216. X
  217. X    if(remaining)
  218. X        ERDEBUG(1," expect string too long\n",0);
  219. X
  220. X    if(expresp_verbosity >= 3)
  221. X        hex_dump(parsebuf,strlen(parsebuf),"expecting",1);
  222. X
  223. X    if(llookfor(parsebuf,expect_timeout_msecs,
  224. X        (expresp_verbosity < 3) ? expresp_verbosity : 0))
  225. X    {
  226. XGOT_EXPECTED:
  227. X        ERDEBUG(2,"[EXPECT SUCCEEDED]\n",0);
  228. X        erc = 0;
  229. X        goto RESTORE_TTYMODE_AND_RETURN_ERC;
  230. X        
  231. X    }
  232. X
  233. XDID_NOT_GET_EXPECTED:
  234. X    ERDEBUG(2,"[EXPECT FAILED%s]\n",(sigint) ? " (interrupted)" : "");
  235. X    if(sigint)
  236. X    {
  237. X        sigint = 0;
  238. X        erc = eCONINT;
  239. X    }
  240. X    else
  241. X        erc = eExpectRespondFail;
  242. X    goto RESTORE_TTYMODE_AND_RETURN_ERC;
  243. X
  244. XRESTORE_TTYMODE_AND_RETURN_ERC:
  245. X    if(old_ttymode != 2)
  246. X        ttymode(old_ttymode);
  247. X    return(erc);
  248. X
  249. X}    /* end of expect */
  250. X
  251. X/*+-------------------------------------------------------------------------
  252. X    respond(str) - send to remote
  253. X--------------------------------------------------------------------------*/
  254. Xvoid
  255. Xrespond(str)
  256. Xregister char *str;
  257. X{
  258. Xint itmp;
  259. Xlong ltmp;
  260. Xchar s4[4];
  261. Xint send_no_cr = 0;
  262. X
  263. X    ERDEBUG(2,"respond: <<%s>>\n",str);
  264. X    while(*str)
  265. X    {
  266. X        if(*str == '\\')
  267. X        {
  268. X            /* handle \nnn - send octal number */
  269. X            if(isdigit(*++str))    /* handle \ooo */
  270. X            {
  271. X                strncpy(s4,str,3);
  272. X                s4[3] = 0;
  273. X                sscanf(s4,"%o",&itmp);
  274. X                str += strspn(s4,"01234567") - 1;    /* -1 cause str++ later */
  275. X                lputc((char)itmp);
  276. X            }
  277. X            else switch(*str)
  278. X            {
  279. X                case 'p':  /* pause (approximately 1/4-1/2 second delay) */
  280. X                    ldraino(0);    /* wait for output to drain */
  281. X                    nap(400L);
  282. X                    break;
  283. X                case 'm':  /* nap a while (non-standard) */
  284. X                    ltmp = atol(str + 1);
  285. X                    str += strspn(str + 1,"0123456789");
  286. X                    ldraino(0);    /* wait for output to drain */
  287. X                    nap(ltmp);
  288. X                    break;
  289. X                case 'd':  /* delay (2 seconds) */
  290. X                    ldraino(0);    /* wait for output to drain */
  291. X                    nap(2000L);
  292. X                    break;
  293. X                case 'D':  /* phone number/token */
  294. X                    if(expresp_echo_check)
  295. X                        lputs_paced(40,shm->Ltelno);    /* fake it */
  296. X                    else
  297. X                        lputs(shm->Ltelno);
  298. X                    break;
  299. X                case 'T':  /* phnum with Dialcodes and char translation */
  300. X                    if(expresp_echo_check)
  301. X                        lputs_paced(40,shm->Ltelno);    /* fake it */
  302. X                    else
  303. X                        lputs(shm->Ltelno);
  304. X                    break;
  305. X                case 'N':  /* null byte */
  306. X                    lputc(0);
  307. X                    break;
  308. X                case 'K':  /* insert a BREAK */
  309. X                    lbreak();
  310. X                    break;
  311. X                case 'E':  /* turn on echo checking (for slow devices) */
  312. X                    expresp_echo_check = 1;
  313. X                    break;
  314. X                case 'e':  /* turn off echo checking */
  315. X                    expresp_echo_check = 0;
  316. X                    break;
  317. X                case 'r':  /* carriage return */
  318. X                    lputc(0x0D);
  319. X                    break;
  320. X                case 'c':  /* no new-line */
  321. X                    send_no_cr = 1;
  322. X                    break;
  323. X                case 'n':  /* send new-line */
  324. X                    lputc(0x0D);
  325. X                    break;
  326. X            }
  327. X
  328. X        }
  329. X        else
  330. X            lputc(*str);
  331. X
  332. X
  333. X        if(expresp_echo_check)
  334. X        {
  335. X            ldraino(1);        /* wait for output to drain, then flush input */
  336. X            nap(40L);        /* fake it */
  337. X        }
  338. X        str++;
  339. X    }
  340. X
  341. X    if(!send_no_cr)
  342. X        lputc(0x0D);
  343. X}    /* end of respond */
  344. X
  345. X/*+-------------------------------------------------------------------------
  346. X    execute_expresp(expresp_script)
  347. X
  348. Xreturn 0 on success, else error code
  349. X--------------------------------------------------------------------------*/
  350. Xint
  351. Xexecute_expresp(expresp_script)
  352. Xchar *expresp_script;
  353. X{
  354. Xchar *fields[MAX_FIELDS + 1];
  355. Xint ifields;
  356. Xint nfields;
  357. Xint erc;
  358. Xchar expresp_copy[MAX_EXPRESP + 1];
  359. Xchar *expect_this;
  360. Xchar *send_on_fail;
  361. X
  362. X#define EXPECT_STATE (!(ifields & 1))    /* even numbered fields are expect */
  363. X    expresp_echo_check = 0;
  364. X    last_Speed_result[0] = 0;
  365. X
  366. X    strncpy(expresp_copy,expresp_script,sizeof(expresp_copy));
  367. X    build_arg_array(expresp_copy,fields,MAX_FIELDS,&nfields);
  368. X    if(!nfields)    /* if no script, assume success */
  369. X    {
  370. X        ERDEBUG(2,"[EMPTY SCRIPT - EXPECT/RESPOND SUCCEEDED]\n",0);
  371. X        return(0);
  372. X    }
  373. X
  374. X    for(ifields = 0; ifields < nfields; ifields++)
  375. X    {
  376. X        if(sigint)
  377. X            break;
  378. X        if(EXPECT_STATE)
  379. X        {
  380. X            expect_this = fields[ifields];
  381. X            while(1)    /* until break or return(-1) */
  382. X            {
  383. X                if(send_on_fail = strchr(expect_this,'-'))
  384. X                    *send_on_fail++ = 0;
  385. X                if(!(erc = expect(expect_this)))
  386. X                    break;
  387. X                if((erc != eExpectRespondFail) || !send_on_fail)
  388. X                {
  389. X                    ERDEBUG(2,"[EXPECT/RESPOND FAILED]\n",0);
  390. X                    return(eExpectRespondFail);
  391. X                }
  392. X                if(expect_this = strchr(send_on_fail,'-'))
  393. X                    *expect_this++ = 0;
  394. X                if(sigint)
  395. X                    break;
  396. X                respond(send_on_fail);
  397. X            }
  398. X        }
  399. X        else
  400. X            respond(fields[ifields]);
  401. X    }
  402. X    if(sigint)
  403. X    {
  404. X        sigint = 0;
  405. X        ERDEBUG(2,"[CONSOLE INTERRUPT]\n",0);
  406. X        return(eCONINT);
  407. X    }
  408. X    ERDEBUG(2,"[EXPECT/RESPOND SUCCEEDED]\n",0);
  409. X    return(0);
  410. X
  411. X}    /* end of execute_expresp */
  412. X
  413. X/*+-------------------------------------------------------------------------
  414. X    pcmd_expresp(param)
  415. Xexpresp [-v[v...]] <exp-resp-str> [<timeout_msecs>]
  416. X--------------------------------------------------------------------------*/
  417. Xint
  418. Xpcmd_expresp(param)
  419. XESD *param;
  420. X{
  421. Xint erc;
  422. Xint itmp;
  423. Xchar *cptr;
  424. XESD *tesd;
  425. Xchar switches[8];
  426. X
  427. X    if((tesd = esdalloc(MAX_EXPRESP + 1)) == (ESD *)0)
  428. X        return(eNoMemory);
  429. X
  430. X    get_switches(param,switches,sizeof(switches));
  431. X
  432. X    if(erc = gstr(param,tesd,0))
  433. X    {
  434. X        esdfree(tesd);
  435. X        return(erc);
  436. X    }
  437. X
  438. X    expect_timeout_msecs = DEFAULT_TIMEOUT_MSECS;
  439. X    expresp_verbosity = (!!strchr(switches,'v')) || proctrace;
  440. X    if(expresp_verbosity)
  441. X    {
  442. X        cptr = switches,itmp = 0;
  443. X        while(*cptr)
  444. X            itmp += (*cptr++ == 'v');
  445. X        if(itmp > 1)
  446. X            expresp_verbosity = itmp;
  447. X    }
  448. X        
  449. X    if(erc = gint(param,&expect_timeout_msecs))
  450. X    {
  451. X        /* if something there non-integer */
  452. X        if(!end_of_cmd(param))
  453. X        {
  454. X            erc = eSyntaxError;
  455. X            goto RETURN;
  456. X        }
  457. X    }
  458. X
  459. X    erc = execute_expresp(tesd->pb);
  460. X
  461. XRETURN:
  462. X    esdfree(tesd);
  463. X    iv[0] = !!erc;
  464. X    if(erc == eExpectRespondFail)
  465. X        erc = 0;
  466. X    return(erc);
  467. X
  468. X}    /* end of pcmd_expresp */
  469. X
  470. X/* vi: set tabstop=4 shiftwidth=4: */
  471. X/* end of expresp.c */
  472. SHAR_EOF
  473. echo 'File expresp.c is complete' &&
  474. $TOUCH -am 0725125791 'expresp.c' &&
  475. chmod 0644 expresp.c ||
  476. echo 'restore of expresp.c failed'
  477. Wc_c="`wc -c < 'expresp.c'`"
  478. test 9680 -eq "$Wc_c" ||
  479.     echo 'expresp.c: original size 9680, current size' "$Wc_c"
  480. rm -f _shar_wnt_.tmp
  481. fi
  482. # ============= fasiintf.c ==============
  483. if test -f 'fasiintf.c' -a X"$1" != X"-c"; then
  484.     echo 'x - skipping fasiintf.c (File already exists)'
  485.     rm -f _shar_wnt_.tmp
  486. else
  487. > _shar_wnt_.tmp
  488. echo 'x - extracting fasiintf.c (Text)'
  489. sed 's/^X//' << 'SHAR_EOF' > 'fasiintf.c' &&
  490. X/*+-------------------------------------------------------------------------
  491. X    fasiintf.c - FAS/i interface
  492. X    wht@n4hgf.Mt-Park.GA.US
  493. X
  494. X  Defined functions:
  495. X    display_fasi(fip)
  496. X    fasi_breaks_detected()
  497. X    fasi_line_errors()
  498. X    fasi_msr()
  499. X    fasi_rings_detected()
  500. X    icmd_fasi(narg,arg)
  501. X    ier_text(ier)
  502. X    lcr_text(lcr)
  503. X    mcr_text(mcr)
  504. X    msr_text(msr)
  505. X    pcmd_fasi(param)
  506. X
  507. X--------------------------------------------------------------------------*/
  508. X/*+:EDITS:*/
  509. X/*:07-25-1991-12:57-wht@n4hgf-ECU release 3.10 */
  510. X/*:04-29-1991-18:52-wht@n4hgf-FAS/i 2.08.0 official release */
  511. X/*:12-24-1990-00:51-wht-creation */
  512. X
  513. X#include "ecu.h"
  514. X
  515. X#if    defined(FASI)
  516. X#include "ecuerror.h"
  517. X#include "esd.h"
  518. X#if defined(NULL)
  519. X#undef NULL
  520. X#endif
  521. X# include <local/fas.h>
  522. X
  523. Xextern int proctrace;
  524. X
  525. X/*+-------------------------------------------------------------------------
  526. X    msr_text(msr)
  527. X--------------------------------------------------------------------------*/
  528. Xchar *
  529. Xmsr_text(msr)
  530. Xuchar msr;
  531. X{
  532. Xstatic char txt[50];
  533. X
  534. X    txt[0] = '*';
  535. X    txt[1] = 0;
  536. X    if(!msr)
  537. X    {
  538. X        strcat(txt,"NULL*");
  539. X        return(txt);
  540. X    }
  541. X    if(msr & MS_CTS_DELTA) strcat(txt,"dCTS*");
  542. X    if(msr & MS_DSR_DELTA) strcat(txt,"dDSR*");
  543. X    if(msr & MS_RING_TEDGE) strcat(txt,"dRI*");
  544. X    if(msr & MS_DCD_DELTA) strcat(txt,"dDCD*");
  545. X    if(msr & MS_CTS_PRESENT) strcat(txt,"CTS*");
  546. X    if(msr & MS_DSR_PRESENT) strcat(txt,"DSR*");
  547. X    if(msr & MS_RING_PRESENT) strcat(txt,"RING*");
  548. X    if(msr & MS_DCD_PRESENT) strcat(txt,"DCD*");
  549. X    return(txt);
  550. X
  551. X}    /* end of msr_text */
  552. X
  553. X/*+-------------------------------------------------------------------------
  554. X    mcr_text(mcr)
  555. X--------------------------------------------------------------------------*/
  556. Xchar *
  557. Xmcr_text(mcr)
  558. Xuchar mcr;
  559. X{
  560. Xstatic char txt[32];
  561. X
  562. X    txt[0] = '*';
  563. X    txt[1] = 0;
  564. X    if(!mcr)
  565. X    {
  566. X        strcat(txt,"NULL*");
  567. X        return(txt);
  568. X    }
  569. X    if(mcr & MC_SET_DTR) strcat(txt,"DTR*");
  570. X    if(mcr & MC_SET_RTS) strcat(txt,"RTS*");
  571. X    if(mcr & MC_SET_OUT1) strcat(txt,"OUT1*");
  572. X    if(mcr & MC_SET_OUT2) strcat(txt,"OUT2*");
  573. X    if(mcr & MC_SET_LOOPBACK) strcat(txt,"LOOPBACK*");
  574. X    return(txt);
  575. X
  576. X}    /* end of mcr_text */
  577. X
  578. X/*+-------------------------------------------------------------------------
  579. X    lcr_text(lcr)
  580. X--------------------------------------------------------------------------*/
  581. Xchar *
  582. Xlcr_text(lcr)
  583. Xuchar lcr;
  584. X{
  585. Xstatic char txt[64];
  586. X
  587. X    sprintf(txt,"*%ddb*",(lcr & LC_WORDLEN_MASK) + 5);
  588. X    strcat(txt,(lcr & LC_STOPBITS_LONG) ? "2" : "1");
  589. X    strcat(txt,"sb*");
  590. X    if(lcr & LC_ENABLE_PARITY)
  591. X    {
  592. X        strcat(txt,"PARITY*");
  593. X        if(lcr & LC_STICK_PARITY)
  594. X            strcat(txt,(lcr & LC_EVEN_PARITY) ? "MARK*" : "SPACE*");
  595. X        else
  596. X            strcat(txt,(lcr & LC_EVEN_PARITY) ? "EVEN*" : "ODD*" );
  597. X    }
  598. X    else
  599. X        strcat(txt,"NOPAR*");
  600. X    if(lcr & LC_SET_BREAK_LEVEL)
  601. X        strcat(txt,"SETBREAK*");
  602. X    if(lcr & LC_ENABLE_DIVISOR)
  603. X        strcat(txt,"ENABDIV*");
  604. X    return(txt);
  605. X
  606. X}    /* end of lcr_text */
  607. X
  608. X/*+-------------------------------------------------------------------------
  609. X    ier_text(ier)
  610. X--------------------------------------------------------------------------*/
  611. Xchar *
  612. Xier_text(ier)
  613. Xuchar ier;
  614. X{
  615. Xstatic char txt[32];
  616. X
  617. X    txt[0] = '*';
  618. X    txt[1] = 0;
  619. X    if(!ier)
  620. X    {
  621. X        strcat(txt,"NULL*");
  622. X        return(txt);
  623. X    }
  624. X    if(ier & IE_RECV_DATA_AVAILABLE) strcat(txt,"RDAV*");
  625. X    if(ier & IE_XMIT_HOLDING_BUFFER_EMPTY) strcat(txt,"TBMT*");
  626. X    if(ier & IE_LINE_STATUS) strcat(txt,"LS*");
  627. X    if(ier & IE_MODEM_STATUS) strcat(txt,"MS*");
  628. X    return(txt);
  629. X
  630. X}    /* end of ier_text */
  631. X
  632. X/*+-------------------------------------------------------------------------
  633. X    display_fasi(fip)
  634. X--------------------------------------------------------------------------*/
  635. Xvoid
  636. Xdisplay_fasi(fip)
  637. Xstruct fas_info *fip;
  638. X{
  639. X
  640. X    pprintf("base address: %04x irq=%u ",fip->port_0.addr,fip->vec);
  641. X    pputs("device is ");
  642. X    if(fip->device_flags.s & DF_DEVICE_IS_NS16550A)
  643. X        pputs("16550\n");
  644. X    else if(fip->device_flags.s & DF_DEVICE_IS_I82510)
  645. X        pputs("82510\n");
  646. X    else
  647. X        pputs("16450\n");
  648. X    pprintf("MSR=%s   ",msr_text(fip->msr));
  649. X    pprintf("MCR=%s\n",mcr_text(fip->mcr));
  650. X    pprintf("LCR=%s   ",lcr_text(fip->lcr));
  651. X    pprintf("IER=%s\n",ier_text(fip->ier));
  652. X    pprintf("recv ring cnt=%u  ",fip->recv_ring_cnt);
  653. X    pprintf("xmit ring cnt=%u  ",fip->xmit_ring_cnt);
  654. X    pprintf("xmit fifo size=%u\n",fip->xmit_fifo_size);
  655. X    pprintf("characters received    =%12lu\n",fip->characters_received);
  656. X    pprintf("characters transmitted =%12lu\n",fip->characters_transmitted);
  657. X    pprintf("modem status events    =%12lu\n",fip->modem_status_events);
  658. X    pprintf("overrun errors=%lu  ",fip->overrun_errors);
  659. X    pprintf("framing errors=%lu  ",fip->framing_errors);
  660. X    pprintf("parity errors=%lu\n",fip->parity_errors);
  661. X    pprintf("rings detected=%lu  ",fip->rings_detected);
  662. X    pprintf("breaks detected=%lu\n",fip->breaks_detected);
  663. X    pprintf("xmtr flow off XON/XOFF=%lu  RTS/CTS=%lu\n",
  664. X        fip->xmtr_sw_flow_count,fip->xmtr_hw_flow_count);
  665. X    pprintf("rcvr flow off XON/XOFF=%lu  RTS/CTS=%lu\n",
  666. X        fip->rcvr_sw_flow_count,fip->rcvr_hw_flow_count);
  667. X
  668. X}    /* end of display_fasi */
  669. X
  670. X/*+-------------------------------------------------------------------------
  671. X    fasi_msr() - return modem status register contents
  672. X--------------------------------------------------------------------------*/
  673. Xuchar
  674. Xfasi_msr()
  675. X{
  676. Xulong ltmp;
  677. X
  678. X    return((uchar)ioctl(shm->Liofd,FASIC_MCR,(char *)<mp));
  679. X    return(ltmp);
  680. X}    /* end of fasi_msr */
  681. X
  682. X/*+-------------------------------------------------------------------------
  683. X    fasi_line_errors() - return UART error count
  684. X--------------------------------------------------------------------------*/
  685. Xulong
  686. Xfasi_line_errors()
  687. X{
  688. Xstruct fas_info finfo,*fip = &finfo;
  689. X
  690. X    if((ioctl(shm->Liofd,FASIC_SIP,(char *)fip)) < 0)
  691. X        return(0);
  692. X    return(fip->parity_errors + fip->framing_errors + fip->overrun_errors);
  693. X
  694. X}    /* end of fasi_line_errors */
  695. X
  696. X/*+-------------------------------------------------------------------------
  697. X    fasi_rings_detected() - return number of RI trailing edges
  698. X--------------------------------------------------------------------------*/
  699. Xulong
  700. Xfasi_rings_detected()
  701. X{
  702. Xstruct fas_info finfo,*fip = &finfo;
  703. X
  704. X    if((ioctl(shm->Liofd,FASIC_SIP,(char *)fip)) < 0)
  705. X        return(0);
  706. X    return(fip->rings_detected);
  707. X
  708. X}    /* end of fasi_rings_detected */
  709. X
  710. X/*+-------------------------------------------------------------------------
  711. X    fasi_breaks_detected() - return number of BREAKs detected
  712. X--------------------------------------------------------------------------*/
  713. Xulong
  714. Xfasi_breaks_detected()
  715. X{
  716. Xstruct fas_info finfo,*fip = &finfo;
  717. X
  718. X    if((ioctl(shm->Liofd,FASIC_SIP,(char *)fip)) < 0)
  719. X        return(0);
  720. X    return(fip->breaks_detected);
  721. X
  722. X}    /* end of fasi_breaks_detected */
  723. X
  724. X/*+-------------------------------------------------------------------------
  725. X    pcmd_fasi(param)
  726. Xfasi [-switches] <str-cmd>>
  727. X
  728. Xwhere <str-cmd> is 'd[isplay]'
  729. X                or 'r[eset]'
  730. X
  731. Xfasi 'd'
  732. Xfasi 'r'
  733. X--------------------------------------------------------------------------*/
  734. Xint
  735. Xpcmd_fasi(param)
  736. XESD *param;
  737. X{
  738. Xint erc;
  739. Xchar switches[8];
  740. XESD *tesd = (ESD *)0;
  741. Xstruct fas_info finfo,*fip = &finfo;
  742. Xchar ident_str[128];
  743. X
  744. X    get_switches(param,switches,sizeof(switches));
  745. X    if(!(tesd = esdalloc(64)))
  746. X        return(eNoMemory);
  747. X    if(!(erc = gstr(param,tesd,1)))
  748. X    {
  749. X        skip_cmd_break(tesd);
  750. X        switch(to_lower(*(tesd->pb + tesd->index)))
  751. X        {
  752. X            case 'd':    /* display */
  753. X                if((ioctl(shm->Liofd,FASIC_SIP,(char *)fip)) < 0)
  754. X                {
  755. X                    pperror("ioctl FASIC_SIP");
  756. X                    erc = eFATAL_ALREADY;
  757. X                }
  758. X                else
  759. X                    display_fasi(fip);
  760. X                if((ioctl(shm->Liofd,FASIC_DVR_IDENT,ident_str)) < 0)
  761. X                {
  762. X                    pperror("ioctl FASIC_DVR_IDENT");
  763. X                    erc = eFATAL_ALREADY;
  764. X                }
  765. X                else
  766. X                    pprintf("driver:  '%s'\n",ident_str);
  767. X                if((ioctl(shm->Liofd,FASIC_SPACE_IDENT,ident_str)) < 0)
  768. X                {
  769. X                    pperror("ioctl FASIC_SPACE_IDENT");
  770. X                    erc = eFATAL_ALREADY;
  771. X                }
  772. X                else
  773. X                    pprintf("space.c: '%s'\n",ident_str);
  774. X                break;
  775. X
  776. X            case 'r':    /* reset */
  777. X                if((ioctl(shm->Liofd,FASIC_RESET_STAT,(char *)0)) < 0)
  778. X                {
  779. X                    pperror("ioctl FASIC_RESET_STAT");
  780. X                    erc = eFATAL_ALREADY;
  781. X                }
  782. X                else if(proctrace)
  783. X                    pputs("statistics reset\n");
  784. X                break;
  785. X
  786. X            default:
  787. X                pputs("invalid subcommand '");
  788. X                pputs(tesd->pb);
  789. X                pputs("'\n");
  790. X                erc = eFATAL_ALREADY;
  791. X                break;
  792. X        }
  793. X    }
  794. X
  795. X    if(tesd)
  796. X        esdfree(tesd);
  797. X    return(erc);
  798. X
  799. X}    /* end of pcmd_fasi */
  800. X
  801. X/*+-------------------------------------------------------------------------
  802. X    icmd_fasi(narg,arg)
  803. X--------------------------------------------------------------------------*/
  804. Xvoid
  805. Xicmd_fasi(narg,arg)
  806. Xint narg;
  807. Xchar **arg;
  808. X{
  809. Xstruct fas_info finfo,*fip = &finfo;
  810. Xchar ident_str[128];
  811. X
  812. X    if((narg > 1) && (to_lower(*arg[1]) == 'r'))
  813. X    {
  814. X        if((ioctl(shm->Liofd,FASIC_RESET_STAT,(char *)0)) < 0)
  815. X        {
  816. X            pperror("   ioctl FASIC_RESET_STAT");
  817. X            return;
  818. X        }
  819. X        ff(se,"  fasi statistics reset\r\n");
  820. X    }
  821. X    else
  822. X    {
  823. X        if((ioctl(shm->Liofd,FASIC_SIP,(char *)fip)) < 0)
  824. X        {
  825. X            pperror("   ioctl FASIC_SIP");
  826. X            return;
  827. X        }
  828. X        ff(se,"\r\n");
  829. X        display_fasi(fip);
  830. X        if((ioctl(shm->Liofd,FASIC_DVR_IDENT,ident_str)) < 0)
  831. X            pperror("ioctl FASIC_DVR_IDENT");
  832. X        else
  833. X            pprintf("driver:  '%s'\n",ident_str);
  834. X        if((ioctl(shm->Liofd,FASIC_SPACE_IDENT,ident_str)) < 0)
  835. X            pperror("ioctl FASIC_SPACE_IDENT");
  836. X        else
  837. X            pprintf("space.c: '%s'\n",ident_str);
  838. X    }
  839. X
  840. X}    /* end of icmd_fasi */
  841. X
  842. X#endif /* FASI */
  843. X
  844. X/* vi: set tabstop=4 shiftwidth=4: */
  845. X/* end of fasiintf.c */
  846. SHAR_EOF
  847. $TOUCH -am 0725125791 'fasiintf.c' &&
  848. chmod 0644 fasiintf.c ||
  849. echo 'restore of fasiintf.c failed'
  850. Wc_c="`wc -c < 'fasiintf.c'`"
  851. test 9136 -eq "$Wc_c" ||
  852.     echo 'fasiintf.c: original size 9136, current size' "$Wc_c"
  853. rm -f _shar_wnt_.tmp
  854. fi
  855. # ============= feval.c ==============
  856. if test -f 'feval.c' -a X"$1" != X"-c"; then
  857.     echo 'x - skipping feval.c (File already exists)'
  858.     rm -f _shar_wnt_.tmp
  859. else
  860. > _shar_wnt_.tmp
  861. echo 'x - extracting feval.c (Text)'
  862. sed 's/^X//' << 'SHAR_EOF' > 'feval.c' &&
  863. X/*+-------------------------------------------------------------------------
  864. X    feval.c - integer and string function evaluation
  865. X    wht@n4hgf.Mt-Park.GA.US
  866. X
  867. X    feval_int(param,&int_returned) where 'int' here means long ECU $i int
  868. X    feval_str(param,&esd_to_be_plugged)
  869. X
  870. X  These routines are called with param.index as follows:
  871. X
  872. X         !nnnnn       nnn is name of function
  873. X          ^
  874. X          |
  875. X
  876. X  Defined functions:
  877. X    feval_int(param,value)
  878. X    feval_str(param,result_esd)
  879. X    strfunc_left(param,scratch_esd,result_esd)
  880. X    strfunc_right(param,scratch_esd,result_esd)
  881. X
  882. X--------------------------------------------------------------------------*/
  883. X/*+:EDITS:*/
  884. X/*:07-25-1991-12:58-wht@n4hgf-ECU release 3.10 */
  885. X/*:07-14-1991-18:18-wht@n4hgf-new ttygets functions */
  886. X/*:06-29-1991-16:33-wht@n4hgf-use cuserid() instead of getlogin() */
  887. X/*:03-16-1991-15:23-wht@n4hgf-add %nice */
  888. X/*:01-31-1991-16:10-wht@n4hgf-was freeing tesd1 twice in feval_str */
  889. X/*:12-24-1990-04:31-wht@n4hgf-experimental fasi driver functions */
  890. X/*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
  891. X
  892. X#include "ecu.h"
  893. X#include "ecuerror.h"
  894. X#include "esd.h"
  895. X#include "proc.h"
  896. X#include "var.h"
  897. X#include "ecutty.h"
  898. X
  899. X#if defined(FASI)
  900. Xchar *msr_text();
  901. X#endif
  902. X
  903. X#define FIargc           1
  904. X#define FIbaud           2
  905. X#define FIcolors         3
  906. X#define FIconn           4
  907. X#define FIcsec           5
  908. X#define FIctoi           6
  909. X#define FIcurx           7
  910. X#define FIcury           8
  911. X#define FIfatime         9
  912. X#define FIfmode         10
  913. X#define FIfmtime        11
  914. X#define FIfsize         12
  915. X#define FIftell         13
  916. X#define FIinstr         14
  917. X#define FIisalnum       15
  918. X#define FIisalpha       16
  919. X#define FIisascii       17
  920. X#define FIischr         18
  921. X#define FIiscntrl       19
  922. X#define FIisdigit       20
  923. X#define FIisdir         21
  924. X#define FIisgraph       22
  925. X#define FIislower       23
  926. X#define FIisprint       24
  927. X#define FIispunct       25
  928. X#define FIisreg         26
  929. X#define FIisspace       27
  930. X#define FIisupper       28
  931. X#define FIisxdigit      29
  932. X#define FIlen           30
  933. X#define FIlgetc         31
  934. X#define FImatch         32
  935. X#define FImhack         33
  936. X#define FIpid           34
  937. X#define FIrchr          35
  938. X#define FIrchrc         36
  939. X#define FIshmid         37
  940. X#define FIstoi          38
  941. X#define FIxchr          39
  942. X#define FIxchrc         40
  943. X#define FIesecs         41
  944. X#define FIlines         42
  945. X#define FIcols          43
  946. X#define FIrinstr        44
  947. X#define FIfasi          45
  948. X#if defined(FASI)
  949. X#define FImsr           46
  950. X#define FIlnerr         47
  951. X#define FIridet         49
  952. X#define FIbrdet         50
  953. X#endif
  954. X#define FInice          51
  955. X#define FIuid           52
  956. X#define FIgid           53
  957. X
  958. XKEYTAB feval_int_tbl[] =
  959. X{
  960. X    {"argc",FIargc},
  961. X    {"baud",FIbaud},
  962. X#if defined(FASI)
  963. X    {"brdet",FIbrdet},
  964. X#endif
  965. X    {"colors",FIcolors},
  966. X    {"cols",FIcols},
  967. X    {"conn",FIconn},
  968. X    {"csec",FIcsec},
  969. X    {"ctoi",FIctoi},
  970. X    {"curx",FIcurx},
  971. X    {"cury",FIcury},
  972. X    {"esecs",FIesecs},
  973. X    {"fasi",FIfasi},
  974. X    {"fatime",FIfatime},
  975. X    {"fmode",FIfmode},
  976. X    {"fmtime",FIfmtime},
  977. X    {"fsize",FIfsize},
  978. X    {"ftell",FIftell},
  979. X    {"gid",FIgid},
  980. X    {"instr",FIinstr},
  981. X    {"isalnum",FIisalnum},
  982. X    {"isalpha",FIisalpha},
  983. X    {"isalpha",FIisalpha},
  984. X    {"isascii",FIisascii},
  985. X    {"ischr",FIischr},
  986. X    {"iscntrl",FIiscntrl},
  987. X    {"isdigit",FIisdigit},
  988. X    {"isdir",FIisdir},
  989. X    {"isgraph",FIisgraph},
  990. X    {"islower",FIislower},
  991. X    {"isprint",FIisprint},
  992. X    {"ispunct",FIispunct},
  993. X    {"isreg",FIisreg},
  994. X    {"isspace",FIisspace},
  995. X    {"isupper",FIisupper},
  996. X    {"isxdigit",FIisxdigit},
  997. X    {"len",FIlen},
  998. X#if defined(FASI)
  999. X    {"lnerr",FIlnerr},
  1000. X#endif
  1001. X    {"lgetc",FIlgetc},
  1002. X    {"lines",FIlines},
  1003. X    {"match",FImatch},
  1004. X    {"mhack",FImhack},
  1005. X#if defined(FASI)
  1006. X    {"msr",FImsr},
  1007. X#endif
  1008. X    {"nice",FInice},
  1009. X    {"pid",FIpid},
  1010. X    {"rchr",FIrchr},
  1011. X    {"rchrc",FIrchrc},
  1012. X#if defined(FASI)
  1013. X    {"ridet",FIridet},
  1014. X#endif
  1015. X    {"rinstr",FIrinstr},
  1016. X    {"shmid",FIshmid},
  1017. X    {"stoi",FIstoi},
  1018. X    {"uid",FIuid},
  1019. X    {"xchr",FIxchr},
  1020. X    {"xchrc",FIxchrc},
  1021. X    {(char *)0,0}
  1022. X};
  1023. X
  1024. X#define FSargv           1
  1025. X#define FScgetc          2
  1026. X#define FScgets          3
  1027. X#define FSchr            4
  1028. X#define FSdate           5
  1029. X#define FSdatez          6
  1030. X#define FSday            7
  1031. X#define FSdayz           8
  1032. X#define FSdir            9
  1033. X#define FSedate         10
  1034. X#define FSenvvar        11
  1035. X#define FSerrstr        12
  1036. X#define FSetime         13
  1037. X#define FSfmodestr      14
  1038. X#define FSitos          15
  1039. X#define FSleft          16
  1040. X#define FSline          17
  1041. X#define FSlogname       18
  1042. X#define FSmid           19
  1043. X#define FSmonth         20
  1044. X#define FSmonthz        21
  1045. X#define FSrdesc         22
  1046. X#define FSright         23
  1047. X#define FSrname         24
  1048. X#define FSrtel          25
  1049. X#define FSscreen        26
  1050. X#define FStime          27
  1051. X#define FStimes         28
  1052. X#define FStimez         29
  1053. X#define FStimezs        30
  1054. X#define FStty           31
  1055. X#define FSbasename      32
  1056. X#define FSdirpart       33
  1057. X#define FSfilepart      34
  1058. X#if defined(FASI)
  1059. X#define FSmsrtext       35
  1060. X#endif
  1061. X
  1062. XKEYTAB feval_str_tbl[] =
  1063. X{
  1064. X    {"argv",FSargv},
  1065. X    {"basename",FSbasename},
  1066. X    {"cgetc",FScgetc},
  1067. X    {"cgets",FScgets},
  1068. X    {"chr",FSchr},
  1069. X    {"date",FSdate},
  1070. X    {"datez",FSdatez},
  1071. X    {"day",FSday},
  1072. X    {"dir",FSdir},
  1073. X    {"dirpart",FSdirpart},
  1074. X    {"edate",FSedate},
  1075. X    {"envvar",FSenvvar},
  1076. X    {"errstr",FSerrstr},
  1077. X    {"etime",FSetime},
  1078. X    {"filepart",FSfilepart},
  1079. X    {"fmodestr",FSfmodestr},
  1080. X    {"itos",FSitos},
  1081. X    {"left",FSleft},
  1082. X    {"line",FSline},
  1083. X    {"logname",FSlogname},
  1084. X    {"mid",FSmid},
  1085. X    {"month",FSmonth},
  1086. X#if defined(FASI)
  1087. X    {"msrtext",FSmsrtext},
  1088. X#endif
  1089. X    {"rdesc",FSrdesc},
  1090. X    {"right",FSright},
  1091. X    {"rname",FSrname},
  1092. X    {"rtelno",FSrtel},
  1093. X    {"screen",FSscreen},
  1094. X    {"time",FStime},
  1095. X    {"times",FStimes},
  1096. X    {"timez",FStimez},
  1097. X    {"timezs",FStimezs},
  1098. X    {"tty",FStty},
  1099. X    {(char *)0,0}
  1100. X};
  1101. X
  1102. Xextern char curr_dir[];
  1103. Xextern int proctrace;
  1104. Xextern PCB *pcb_stack[];
  1105. Xextern int proc_level;
  1106. Xextern char *sys_errlist[];
  1107. Xextern int sys_nerr;
  1108. Xextern struct timeb starting_timeb;
  1109. Xextern uint tcap_LINES;
  1110. Xextern uint tcap_COLS;
  1111. X
  1112. Xextern int shm_shmid;
  1113. X
  1114. Xchar *day_of_week_list = "SunMonTueWedThuFriSat";
  1115. Xchar *month_name_list = "JanFebMarAprMayJunJulAugSepOctNovDec";
  1116. X
  1117. X/*+-------------------------------------------------------------------------
  1118. X    erc = feval_int(param,&int_returned);
  1119. XFunctions (parameter types are expressed by the usage of variables)
  1120. X--------------------------------------------------------------------------*/
  1121. Xfeval_int(param,value)
  1122. XESD *param;
  1123. Xlong *value;
  1124. X{
  1125. Xregister erc;
  1126. Xregister keyword_token;
  1127. Xint index_save;
  1128. XESD *tesd1 = (ESD *)0;
  1129. XESD *tesd2 = (ESD *)0;
  1130. Xulong int1;
  1131. Xchar s32[32];
  1132. Xstruct timeb now_timeb;
  1133. Xint nice();
  1134. X
  1135. X    index_save = param->index;
  1136. X
  1137. X    if(erc = get_alphanum_zstr(param,s32,sizeof(s32)))
  1138. X    {
  1139. X        erc = eInvalidFunction;
  1140. X        goto RETURN;
  1141. X    }
  1142. X
  1143. X    keyword_token = keyword_lookup(feval_int_tbl,s32);
  1144. X    switch(keyword_token)
  1145. X    {
  1146. X/* LEN($S0)         length of $S0 */
  1147. X    case FIlen:
  1148. X        if(!(tesd1 = esdalloc(256)))
  1149. X        {
  1150. X            erc = eNoMemory;
  1151. X            goto RETURN;
  1152. X        }
  1153. X        if(erc = skip_paren(param,1))
  1154. X            goto RETURN;
  1155. X        if(erc = gstr(param,tesd1,1))
  1156. X            goto RETURN;
  1157. X        if(erc = skip_paren(param,0))
  1158. X            goto RETURN;
  1159. X        *value = (long)tesd1->cb;
  1160. X        break;
  1161. X
  1162. X/* INSTR($I0,$I1)   index of first occurrence of $I1 in $I0, -1 if none */
  1163. X    case FIinstr:
  1164. X        if(!(tesd1 = esdalloc(256)))
  1165. X        {
  1166. X            erc = eNoMemory;
  1167. X            goto RETURN;
  1168. X        }
  1169. X        if(!(tesd2 = esdalloc(256)))
  1170. X        {
  1171. X            erc = eNoMemory;
  1172. X            goto RETURN;
  1173. X        }
  1174. X        if(erc = skip_paren(param,1))
  1175. X            goto RETURN;
  1176. X        if(erc = gstr(param,tesd1,1))
  1177. X            goto RETURN;
  1178. X        if(erc = skip_comma(param))
  1179. X            goto RETURN;
  1180. X        if(erc = gstr(param,tesd2,1))
  1181. X            goto RETURN;
  1182. X        if(erc = skip_paren(param,0))
  1183. X            goto RETURN;
  1184. X
  1185. X        *value = (long)ulindex(tesd1->pb,tesd2->pb);
  1186. X        break;
  1187. X
  1188. X/* RINSTR($I0,$I1)   index of last occurrence of $I1 in $I0, -1 if none */
  1189. X    case FIrinstr:
  1190. X        if(!(tesd1 = esdalloc(256)))
  1191. X        {
  1192. X            erc = eNoMemory;
  1193. X            goto RETURN;
  1194. X        }
  1195. X        if(!(tesd2 = esdalloc(256)))
  1196. X        {
  1197. X            erc = eNoMemory;
  1198. X            goto RETURN;
  1199. X        }
  1200. X        if(erc = skip_paren(param,1))
  1201. X            goto RETURN;
  1202. X        if(erc = gstr(param,tesd1,1))
  1203. X            goto RETURN;
  1204. X        if(erc = skip_comma(param))
  1205. X            goto RETURN;
  1206. X        if(erc = gstr(param,tesd2,1))
  1207. X            goto RETURN;
  1208. X        if(erc = skip_paren(param,0))
  1209. X            goto RETURN;
  1210. X
  1211. X        *value = (long)ulrindex(tesd1->pb,tesd2->pb);
  1212. X        break;
  1213. X
  1214. X    case FImatch:
  1215. X        if(!(tesd1 = esdalloc(256)))
  1216. X        {
  1217. X            erc = eNoMemory;
  1218. X            goto RETURN;
  1219. X        }
  1220. X        if(!(tesd2 = esdalloc(256)))
  1221. X        {
  1222. X            erc = eNoMemory;
  1223. X            goto RETURN;
  1224. X        }
  1225. X        if(erc = skip_paren(param,1))
  1226. X            goto RETURN;
  1227. X        if(erc = gstr(param,tesd1,1))
  1228. X            goto RETURN;
  1229. X        if(erc = skip_comma(param))
  1230. X            goto RETURN;
  1231. X        if(erc = gstr(param,tesd2,1))
  1232. X            goto RETURN;
  1233. X        if(erc = skip_paren(param,0))
  1234. X            goto RETURN;
  1235. X
  1236. X        erc = regexp_operation(tesd1->pb,tesd2->pb,value);
  1237. X        break;
  1238. X
  1239. X    case FImhack:
  1240. X        ftime(&now_timeb);
  1241. X        *value = ((now_timeb.time - starting_timeb.time) * 1000) +
  1242. X                (now_timeb.millitm - starting_timeb.millitm);
  1243. X        erc = 0;
  1244. X        break;
  1245. X
  1246. X    case FIesecs:
  1247. X        ftime(&now_timeb);
  1248. X        *value = now_timeb.time;
  1249. X        erc = 0;
  1250. X        break;
  1251. X
  1252. X    case FIargc:
  1253. X        if(!proc_level)
  1254. X        {
  1255. X            pputs("not executing procedure\n");
  1256. X            erc = eFATAL_ALREADY;
  1257. X            break;
  1258. X        }
  1259. X        *value = (long)pcb_stack[proc_level - 1]->argc;
  1260. X        break;
  1261. X
  1262. X    case FIcolors:
  1263. X        if(erc = ifunc_colors(value))
  1264. X            goto RETURN;
  1265. X        break;
  1266. X
  1267. X    case FIftell:
  1268. X        if(erc = ifunc_ftell(param,value))
  1269. X            goto RETURN;
  1270. X        break;
  1271. X
  1272. X    case FIfmode:
  1273. X        if(erc = ifunc_fmode(param,value))
  1274. X            goto RETURN;
  1275. X        break;
  1276. X
  1277. X    case FIfsize:
  1278. X        if(erc = ifunc_fsize(param,value))
  1279. X            goto RETURN;
  1280. X        break;
  1281. X
  1282. X    case FIfmtime:
  1283. X        if(erc = ifunc_fmtime(param,value))
  1284. X            goto RETURN;
  1285. X        break;
  1286. X
  1287. X    case FIfatime:
  1288. X        if(erc = ifunc_fatime(param,value))
  1289. X            goto RETURN;
  1290. X        break;
  1291. X
  1292. X    case FIischr:
  1293. X        if(erc = ifunc_ischr(param,value))
  1294. X            goto RETURN;
  1295. X        break;
  1296. X
  1297. X    case FIisdir:
  1298. X        if(erc = ifunc_isdir(param,value))
  1299. X            goto RETURN;
  1300. X        break;
  1301. X
  1302. X    case FIisreg:
  1303. X        if(erc = ifunc_isreg(param,value))
  1304. X            goto RETURN;
  1305. X        break;
  1306. X
  1307. X    case FIbaud:
  1308. X        *value = (long)shm->Lbaud;
  1309. X        erc = 0;
  1310. X        break;
  1311. X
  1312. X    case FIpid:
  1313. X        *value = (long)getpid();
  1314. X        erc = 0;
  1315. X        break;
  1316. X
  1317. X    case FIcsec:
  1318. X        *value = (shm->Lmodem_off_hook) ? shm->Loff_hook_time : -1;
  1319. X        erc = 0;
  1320. X        break;
  1321. X
  1322. X    case FIconn:
  1323. X        *value = (long)(shm->Lmodem_off_hook) ? (long)shm->Liofd : 0;
  1324. X        erc = 0;
  1325. X        break;
  1326. X
  1327. X    case FIxchr:
  1328. X        *value = shm->xmit_chars;
  1329. X        erc = 0;
  1330. X        break;
  1331. X
  1332. X    case FIxchrc:
  1333. X        *value = shm->xmit_chars_this_connect;
  1334. X        erc = 0;
  1335. X        break;
  1336. X
  1337. X    case FIrchr:
  1338. X        shmx_rc_report(value,&int1);
  1339. X        break;
  1340. X
  1341. X    case FIrchrc:
  1342. X        shmx_rc_report(&int1,value);
  1343. X        erc = 0;
  1344. X        break;
  1345. X
  1346. X/* LGETC($I0) get char from line, waiting for $I0 msec
  1347. Xreturns  character read or -1 if none read in time */
  1348. X    case FIlgetc:
  1349. X        if(erc = skip_paren(param,1))
  1350. X            goto RETURN;
  1351. X        if(erc = gint(param,&int1))
  1352. X            goto RETURN;
  1353. X        if(erc = skip_paren(param,0))
  1354. X            goto RETURN;
  1355. X        *value = (long)lgetc_timeout(int1);
  1356. X        break;
  1357. X
  1358. X    case FIctoi:
  1359. X        if(!(tesd1 = esdalloc(256)))
  1360. X        {
  1361. X            erc = eNoMemory;
  1362. X            goto RETURN;
  1363. X        }
  1364. X        if(erc = skip_paren(param,1))
  1365. X            goto RETURN;
  1366. X        if(erc = gstr(param,tesd1,1))
  1367. X            goto RETURN;
  1368. X        if(erc = skip_paren(param,0))
  1369. X            goto RETURN;
  1370. X        if(tesd1->cb == 0)
  1371. X            *value = -1;
  1372. X        else
  1373. X            *value = (long)((unsigned)0xFF & (unsigned)tesd1->pb[0]);
  1374. X        break;
  1375. X
  1376. X    case FIstoi:
  1377. X        if(!(tesd1 = esdalloc(256)))
  1378. X        {
  1379. X            erc = eNoMemory;
  1380. X            goto RETURN;
  1381. X        }
  1382. X        if(erc = skip_paren(param,1))
  1383. X            goto RETURN;
  1384. X        if(erc = gstr(param,tesd1,1))
  1385. X            goto RETURN;
  1386. X        if(erc = skip_paren(param,0))
  1387. X            goto RETURN;
  1388. X
  1389. X        tesd1->index = 0;
  1390. X        skip_cmd_break(tesd1);
  1391. X        *value = 0;
  1392. X        gint_constant(tesd1,value);
  1393. X        break;
  1394. X
  1395. X    case FIcurx:
  1396. X        *value = (long)shm->cursor_x;
  1397. X        break;
  1398. X
  1399. X    case FIcury:
  1400. X        *value = (long)shm->cursor_y;
  1401. X        break;
  1402. X
  1403. X    case FIshmid:
  1404. X        *value = (long)shm_shmid;
  1405. X        break;
  1406. X
  1407. X    case FIisalpha:
  1408. X    case FIisupper:
  1409. X    case FIislower:
  1410. X    case FIisdigit:
  1411. X    case FIisxdigit:
  1412. X    case FIisspace:
  1413. X    case FIispunct:
  1414. X    case FIisalnum:
  1415. X    case FIisprint:
  1416. X    case FIisgraph:
  1417. X    case FIiscntrl:
  1418. X    case FIisascii:
  1419. X        if(!(tesd1 = esdalloc(256)))
  1420. X        {
  1421. X            erc = eNoMemory;
  1422. X            goto RETURN;
  1423. X        }
  1424. X        if(erc = skip_paren(param,1))
  1425. X            goto RETURN;
  1426. X        if(erc = gstr(param,tesd1,1))
  1427. X            goto RETURN;
  1428. X        if(erc = skip_paren(param,0))
  1429. X            goto RETURN;
  1430. X        if(!tesd1->cb)
  1431. X        {
  1432. X            *value = 0;
  1433. X            goto RETURN;
  1434. X        }
  1435. X        switch(keyword_token)
  1436. X        {
  1437. X            case FIisalpha:
  1438. X                *value = !!isalpha(*tesd1->pb);
  1439. X                break;
  1440. X            case FIisupper:
  1441. X                *value = !!isupper(*tesd1->pb);
  1442. X                break;
  1443. X            case FIislower:
  1444. X                *value = !!islower(*tesd1->pb);
  1445. X                break;
  1446. X            case FIisdigit:
  1447. X                *value = !!isdigit(*tesd1->pb);
  1448. X                break;
  1449. X            case FIisxdigit:
  1450. X                *value = !!isxdigit(*tesd1->pb);
  1451. X                break;
  1452. X            case FIisspace:
  1453. X                *value = !!isspace(*tesd1->pb);
  1454. X                break;
  1455. X            case FIispunct:
  1456. X                *value = !!ispunct(*tesd1->pb);
  1457. X                break;
  1458. X            case FIisalnum:
  1459. X                *value = !!isalnum(*tesd1->pb);
  1460. X                break;
  1461. X            case FIisprint:
  1462. X                *value = !!isprint(*tesd1->pb);
  1463. X                break;
  1464. X            case FIisgraph:
  1465. X                *value = !!isgraph(*tesd1->pb);
  1466. X                break;
  1467. X            case FIiscntrl:
  1468. X                *value = !!iscntrl(*tesd1->pb);
  1469. X                break;
  1470. X            case FIisascii:
  1471. X                *value = !!isascii(*tesd1->pb);
  1472. X                break;
  1473. X        }
  1474. X        break;
  1475. X
  1476. X    case FIlines:
  1477. X        *value = (long)tcap_LINES;
  1478. X        break;
  1479. X
  1480. X    case FIcols:
  1481. X        *value = (long)tcap_COLS;
  1482. X        break;
  1483. X
  1484. X#if defined(FASI)
  1485. X    case FIfasi:
  1486. X        *value = 1;
  1487. X        break;
  1488. X    case FImsr:
  1489. X        *value = (long)fasi_msr();
  1490. X        break;
  1491. X    case FIlnerr:
  1492. X        *value = (long)fasi_line_errors();
  1493. X        break;
  1494. X    case FIridet:
  1495. X        *value = (long)fasi_rings_detected();
  1496. X        break;
  1497. X    case FIbrdet:
  1498. X        *value = (long)fasi_breaks_detected();
  1499. X        break;
  1500. X#else
  1501. X    case FIfasi:
  1502. X        *value = 0;
  1503. X        break;
  1504. X#endif
  1505. X
  1506. X    case FInice:
  1507. X        *value = (long)nice() + 20;
  1508. X        erc = 0;
  1509. X        break;
  1510. X
  1511. X    case FIuid:
  1512. X        *value = (long)getuid();
  1513. X        erc = 0;
  1514. X        break;
  1515. X
  1516. X    case FIgid:
  1517. X        *value = (long)getgid();
  1518. X        erc = 0;
  1519. X        break;
  1520. X
  1521. X    default:
  1522. X        erc = eInvalidFunction;
  1523. X    }   /* end of keyword lookup erc switch statement */
  1524. X
  1525. XRETURN:
  1526. X    if(tesd1)
  1527. X        esdfree(tesd1);
  1528. X    if(tesd2)
  1529. X        esdfree(tesd2);
  1530. X    return(erc);
  1531. X
  1532. X}   /* end of feval_int() */
  1533. X
  1534. X/*+------------------------------------------------------------------
  1535. X    strfunc_left(param,&scratch_esd,&result_esd)
  1536. X-------------------------------------------------------------------*/
  1537. Xint
  1538. Xstrfunc_left(param,scratch_esd,result_esd)
  1539. XESD *param;
  1540. XESD *scratch_esd;
  1541. XESD *result_esd;
  1542. X{
  1543. Xregister erc;
  1544. Xint itmp;
  1545. Xlong ltmp;
  1546. X
  1547. X    if(erc = skip_paren(param,1))
  1548. X        return(erc);
  1549. X    if(erc = gstr(param,scratch_esd,1))
  1550. X        return(erc);
  1551. X    if(erc = skip_comma(param))
  1552. X        return(erc);
  1553. X    if(erc = gint(param,<mp))
  1554. X        return(erc);
  1555. X    itmp = (int)ltmp;
  1556. X    if(itmp < 0)
  1557. X        return(eBadParameter);
  1558. X    if(erc = skip_paren(param,0))
  1559. X        return(erc);
  1560. X    /* take min of param and .cb */
  1561. X    itmp = (itmp < scratch_esd->cb) ? itmp : scratch_esd->cb;
  1562. X    if(itmp > (result_esd->maxcb - result_esd->cb) )
  1563. X        return(eBufferTooSmall);
  1564. X    memcpy(&result_esd->pb[result_esd->cb],
  1565. X        scratch_esd->pb,itmp);
  1566. X    result_esd->cb += itmp;
  1567. X    return(erc);
  1568. X}   /* end of strfunc_left() */
  1569. X
  1570. X/*+-------------------------------------------------------------------------
  1571. X    erc = strfunc_right(param,&scratch_esd,&result_esd)
  1572. X--------------------------------------------------------------------------*/
  1573. Xint
  1574. Xstrfunc_right(param,scratch_esd,result_esd)
  1575. XESD *param;
  1576. XESD *scratch_esd;
  1577. XESD *result_esd;
  1578. X{
  1579. Xregister erc;
  1580. Xint itmp;
  1581. Xlong ltmp;
  1582. X
  1583. X    if(erc = skip_paren(param,1))
  1584. X        return(erc);
  1585. X    if(erc = gstr(param,scratch_esd,1))
  1586. X        return(erc);
  1587. X    if(erc = skip_comma(param))
  1588. X        return(erc);
  1589. X    if(erc = gint(param,<mp))
  1590. X        return(erc);
  1591. X    itmp = (int)ltmp;
  1592. X    if(itmp < 0)
  1593. X        return(eBadParameter);
  1594. X    if(erc = skip_paren(param,0))
  1595. X        return(erc);
  1596. X
  1597. X/* take min of param and .cb */
  1598. X    itmp = (itmp < scratch_esd->cb) ? itmp : scratch_esd->cb;
  1599. X    if(itmp > (result_esd->maxcb - result_esd->cb) )
  1600. X        return(eBufferTooSmall);
  1601. X    memcpy(&result_esd->pb[result_esd->cb],
  1602. X        &scratch_esd->pb[scratch_esd->cb - itmp],itmp);
  1603. X    result_esd->cb += itmp;
  1604. X    return(0);
  1605. X
  1606. X}   /* end of strfunc_right() */
  1607. X
  1608. X/*+-------------------------------------------------------------------------
  1609. X    erc = feval_str(param,&esd_to_be_plugged);
  1610. X    results are APPENDED to 'result_esd'
  1611. X--------------------------------------------------------------------------*/
  1612. Xfeval_str(param,result_esd)
  1613. XESD *param;
  1614. XESD *result_esd;
  1615. X{
  1616. Xregister erc;
  1617. Xregister itmp;
  1618. Xint int1,int2;
  1619. Xchar s32[32];
  1620. Xchar *cptr;
  1621. Xlong ltmp;
  1622. Xlong ltmp2;
  1623. Xlong ltmp3;
  1624. XESD *tesd1;
  1625. XESD *tesd2 = (ESD *)0;
  1626. Xchar *get_ttyname();
  1627. Xchar *getenv();
  1628. Xchar *cuserid();
  1629. Xchar *get_elapsed_time();
  1630. Xchar *mode_map();
  1631. X
  1632. X    if(!(tesd1 = esdalloc(128)))
  1633. X        return(eNoMemory);
  1634. X
  1635. X    if(erc = get_alphanum_zstr(param,s32,sizeof(s32)-1))
  1636. X    {
  1637. X        esdfree(tesd1);
  1638. X        return(eInvalidFunction);
  1639. X    }
  1640. X
  1641. X    erc = 0;
  1642. X    itmp=keyword_lookup(feval_str_tbl,s32);
  1643. X    switch(itmp)
  1644. X    {
  1645. X/* LEFT($S0,$I0)   return leftmost $I0 characters of $S0 */
  1646. X    case FSleft:
  1647. X        erc = strfunc_left(param,tesd1,result_esd);
  1648. X        break;
  1649. X
  1650. X/* RIGHT($S0,$I0)   return rightmost $I0 characters of $S0 */
  1651. X    case FSright:
  1652. X        erc = strfunc_right(param,tesd1,result_esd);
  1653. X        break;
  1654. X
  1655. X/* MID($S0,$I0,$I1)   return middle $I1 chars of $S0 starting at $I0 */
  1656. X    case FSmid:
  1657. X        if(erc = skip_paren(param,1))
  1658. X            break;
  1659. X        if(erc = gstr(param,tesd1,1))
  1660. X            break;
  1661. X        if(erc = skip_comma(param))
  1662. X            break;
  1663. X        if(erc = gint(param,<mp))
  1664. X            break;
  1665. X        int1 = (int)ltmp;
  1666. X        if(int1 < 0)
  1667. X        {
  1668. X            erc = eBadParameter;
  1669. X            break;
  1670. X        }
  1671. X        if(erc = skip_cmd_break(param))
  1672. X            break;
  1673. X        if(param->pb[param->index] == ')') /* if we find a ')' instead of ... */
  1674. X        {                                  /* 2nd int param, default to max */
  1675. X            ++param->index;
  1676. X            int2 = 256;
  1677. X        }
  1678. X        else
  1679. X        {
  1680. X            if(erc = skip_comma(param))
  1681. X                break;
  1682. X            if(erc = gint(param,<mp))
  1683. X                break;
  1684. X            int2 = (int)ltmp;
  1685. X            if(int2 < 0)
  1686. X            {
  1687. X                erc = eBadParameter;
  1688. X                break;
  1689. X            }
  1690. X            if(erc = skip_paren(param,0))
  1691. X                break;
  1692. X        }
  1693. X
  1694. X        if(int1 >= tesd1->cb) /* if initial index past end of string */
  1695. X            break;
  1696. X        itmp = tesd1->cb - int1;
  1697. X        itmp = (int2 < itmp) ? int2 : itmp;
  1698. X        cptr = tesd1->pb + int1;
  1699. X        goto CPTR_ITMP_COMMON;
  1700. X
  1701. X/* ARGV($I0) */
  1702. X    case FSargv:
  1703. X        if(!proc_level)
  1704. X        {
  1705. X            pputs("not executing procedure\n");
  1706. X            erc = eFATAL_ALREADY;
  1707. X            break;
  1708. X        }
  1709. X        if(erc = skip_paren(param,1))
  1710. X            break;
  1711. X        if(erc = gint(param,<mp))
  1712. X            break;
  1713. X        if(erc = skip_paren(param,0))
  1714. X            break;
  1715. X        itmp = (long)pcb_stack[proc_level - 1]->argc; /* arg count */
  1716. X        if((int)ltmp > itmp - 1)
  1717. X        {
  1718. X            if(proctrace)
  1719. X            {
  1720. X                pprintf("WARNING: %%argc=%d, %%argv(%ld) null\n",
  1721. X                    itmp,ltmp);
  1722. X            }
  1723. X            break;
  1724. X        }
  1725. X        cptr = (pcb_stack[proc_level - 1])->argv[(int)ltmp];
  1726. X        itmp = strlen(cptr);
  1727. X        goto CPTR_ITMP_COMMON;
  1728. X
  1729. X    case FSdir:
  1730. X        cptr = curr_dir;
  1731. X        itmp = strlen(curr_dir);
  1732. X        goto CPTR_ITMP_COMMON;
  1733. X
  1734. X    case FSetime:
  1735. X        if(erc = skip_paren(param,1))
  1736. X            break;
  1737. X        if(erc = gint(param,<mp))
  1738. X            break;
  1739. X        if(erc = skip_paren(param,0))
  1740. X            break;
  1741. X        cptr = get_elapsed_time(ltmp);
  1742. X        itmp = strlen(cptr);
  1743. X        goto CPTR_ITMP_COMMON;
  1744. X
  1745. X    case FSerrstr:
  1746. X        if(erc = skip_paren(param,1))
  1747. X            break;
  1748. X        if(erc = gint(param,<mp))
  1749. X            break;
  1750. X        if(erc = skip_paren(param,0))
  1751. X            break;
  1752. X        if((int)ltmp >= sys_nerr)
  1753. X        {
  1754. X            sprintf(s32,"error %d",(int)ltmp);
  1755. X            cptr = s32;
  1756. X        }
  1757. X        else
  1758. X            cptr = sys_errlist[(int)ltmp];
  1759. X        itmp = strlen(cptr);
  1760. X        goto CPTR_ITMP_COMMON;
  1761. X
  1762. X    case FSenvvar:
  1763. X        if(erc = skip_paren(param,1))
  1764. X            break;
  1765. X        if(erc = gstr(param,tesd1,1))
  1766. X            break;
  1767. X        if(erc = skip_paren(param,0))
  1768. X            break;
  1769. X        if(!(cptr = getenv(tesd1->pb)))
  1770. X            break;
  1771. X        itmp = strlen(cptr);
  1772. X        goto CPTR_ITMP_COMMON;
  1773. X
  1774. X    case FSlogname:
  1775. X        if(!(cptr = cuserid((char *)0)))
  1776. X            break;
  1777. X        itmp = strlen(cptr);
  1778. X        goto CPTR_ITMP_COMMON;
  1779. X
  1780. X    case FSfmodestr:
  1781. X        if(erc = skip_paren(param,1))
  1782. X            break;
  1783. X        if(erc = gint(param,<mp))
  1784. X            break;
  1785. X        if(erc = skip_paren(param,0))
  1786. X            break;
  1787. X        cptr = mode_map((ushort)ltmp,(char *)0);
  1788. X        itmp = strlen(cptr);
  1789. X        goto CPTR_ITMP_COMMON;
  1790. X
  1791. X    case FStty:
  1792. X        cptr = get_ttyname();
  1793. X        itmp = strlen(cptr);
  1794. X        goto CPTR_ITMP_COMMON;
  1795. X
  1796. X    case FSrname:
  1797. X        if(!shm->Lmodem_off_hook)
  1798. X            break;
  1799. X        cptr = shm->Lrname;
  1800. X        itmp = strlen(shm->Lrname);
  1801. X        goto CPTR_ITMP_COMMON;
  1802. X
  1803. X    case FSrdesc:
  1804. X        if(!shm->Lmodem_off_hook)
  1805. X            break;
  1806. X        cptr = shm->Ldescr;
  1807. X        itmp = strlen(shm->Ldescr);
  1808. X        goto CPTR_ITMP_COMMON;
  1809. X
  1810. X    case FSrtel:
  1811. X        if(!shm->Lmodem_off_hook)
  1812. X            break;
  1813. X        cptr = shm->Ltelno;
  1814. X        itmp = strlen(shm->Ltelno);
  1815. X        goto CPTR_ITMP_COMMON;
  1816. X
  1817. X    case FSline:
  1818. X        if(shm->Liofd < 0)
  1819. X            break;
  1820. X        cptr = shm->Lline;
  1821. X        itmp = strlen(shm->Lline);
  1822. X        goto CPTR_ITMP_COMMON;
  1823. X
  1824. X    case FSmonth:
  1825. X    case FSmonthz:
  1826. X        cptr = &month_name_list[(get_month(itmp == FSmonthz) - 1) * 3];
  1827. X        itmp = 3;
  1828. X        goto CPTR_ITMP_COMMON;
  1829. X
  1830. X    case FSday:
  1831. X    case FSdayz:
  1832. X        cptr = &day_of_week_list[get_day(itmp == FSdayz) * 3];
  1833. X        itmp = 3;
  1834. X        goto CPTR_ITMP_COMMON;
  1835. X
  1836. X    case FSscreen:
  1837. X        if(erc = skip_paren(param,1))
  1838. X            break;
  1839. X        if(erc = gint(param,<mp))        /* y */
  1840. X            break;
  1841. X        if(ltmp > 42)
  1842. X        {
  1843. X            erc = eBadParameter;
  1844. X            break;
  1845. X        }
  1846. X        if(erc = skip_comma(param))
  1847. X            break;
  1848. X        if(erc = gint(param,<mp2))    /* x */
  1849. X            break;
  1850. X        if(ltmp2 > 79)
  1851. X        {
  1852. X            erc = eBadParameter;
  1853. X            break;
  1854. X        }
  1855. X        if(erc = skip_comma(param))
  1856. X            break;
  1857. X        if(erc = gint(param,<mp3))    /* len */
  1858. X            break;
  1859. X        if(erc = skip_paren(param,0))
  1860. X            break;
  1861. X
  1862. X        int1 = ((int)ltmp * 80) + (int)ltmp2;    /* screen position */
  1863. X        itmp = (int)ltmp3;                        /* length */
  1864. X        int2 = sizeof(shm->screen) - int1;        /* size from y,x to end */
  1865. X        if(itmp > int2)
  1866. X            itmp = int2;
  1867. X        cptr = ((char *)shm->screen) + int1;
  1868. X        goto CPTR_ITMP_COMMON;
  1869. X
  1870. X    case FSbasename:
  1871. X        if(!(tesd2 = esdalloc(32)))
  1872. X            return(eNoMemory);
  1873. X        if(erc = skip_paren(param,1))
  1874. X            break;
  1875. X        if(erc = gstr(param,tesd1,1))
  1876. X            break;
  1877. X        if(erc = skip_comma(param))
  1878. X            break;
  1879. X        if(erc = gstr(param,tesd2,1))
  1880. X            break;
  1881. X        if(erc = skip_paren(param,0))
  1882. X            break;
  1883. X        cptr = tesd1->pb;
  1884. X        itmp = tesd1->cb;
  1885. X        if((tesd1->cb >= tesd2->cb) &&
  1886. X            !strcmp(cptr + tesd1->cb - tesd2->cb,tesd2->pb))
  1887. X        {
  1888. X            itmp -= tesd2->cb;
  1889. X        }
  1890. X        goto CPTR_ITMP_COMMON;
  1891. X
  1892. X    case FSdirpart:
  1893. X        if(erc = skip_paren(param,1))
  1894. X            break;
  1895. X        if(erc = gstr(param,tesd1,1))
  1896. X            break;
  1897. X        if(erc = skip_paren(param,0))
  1898. X            break;
  1899. X        if(cptr = strrchr(tesd1->pb,'/'))
  1900. X            itmp = cptr - tesd1->pb;
  1901. X        else
  1902. X            itmp = tesd1->cb;
  1903. X        cptr = tesd1->pb;
  1904. X        goto CPTR_ITMP_COMMON;
  1905. X
  1906. X    case FSfilepart:
  1907. X        if(erc = skip_paren(param,1))
  1908. X            break;
  1909. X        if(erc = gstr(param,tesd1,1))
  1910. X            break;
  1911. X        if(erc = skip_paren(param,0))
  1912. X            break;
  1913. X        if(cptr = strrchr(tesd1->pb,'/'))
  1914. X            itmp = strlen(++cptr);
  1915. X        else
  1916. X        {
  1917. X            cptr = tesd1->pb;
  1918. X            itmp = tesd1->cb;
  1919. X        }
  1920. X        goto CPTR_ITMP_COMMON;
  1921. X
  1922. X#if defined(FASI)
  1923. X    case FSmsrtext:
  1924. X        cptr = msr_text(fasi_msr());
  1925. X        itmp = strlen(cptr);
  1926. X        goto CPTR_ITMP_COMMON;
  1927. X#endif
  1928. X
  1929. XCPTR_ITMP_COMMON:
  1930. X        if( itmp > (result_esd->maxcb - result_esd->cb))
  1931. X        {
  1932. X            erc = eBufferTooSmall;
  1933. X            break;
  1934. X        }
  1935. X        memcpy(&result_esd->pb[result_esd->cb],cptr,itmp);
  1936. X        result_esd->cb += itmp;
  1937. X        break;
  1938. X
  1939. X    case FSedate:
  1940. X        if(erc = skip_paren(param,1))
  1941. X            break;
  1942. X        if(erc = gint(param,<mp))
  1943. X            break;
  1944. X        if(erc = skip_paren(param,0))
  1945. X            break;
  1946. X        if(19 > (result_esd->maxcb - result_esd->cb))
  1947. X        {
  1948. X            erc = eBufferTooSmall;
  1949. X            break;
  1950. X        }
  1951. X        epoch_secs_to_str(ltmp,3,&result_esd->pb[result_esd->cb]);
  1952. X        result_esd->cb += 19;
  1953. X        break;
  1954. X
  1955. X    case FStime:
  1956. X        if(5 > (result_esd->maxcb - result_esd->cb))
  1957. X        {
  1958. X            erc = eBufferTooSmall;
  1959. X            break;
  1960. X        }
  1961. X        get_tod(0,&result_esd->pb[result_esd->cb]);
  1962. X        result_esd->cb += 5;
  1963. X        break;
  1964. X
  1965. X    case FStimes:
  1966. X        if(8 > (result_esd->maxcb - result_esd->cb))
  1967. X        {
  1968. X            erc = eBufferTooSmall;
  1969. X            break;
  1970. X        }
  1971. X        get_tod(1,&result_esd->pb[result_esd->cb]);
  1972. X        result_esd->cb += 8;
  1973. X        break;
  1974. X
  1975. X    case FStimez:
  1976. X        if(5 > (result_esd->maxcb - result_esd->cb))
  1977. X        {
  1978. X            erc = eBufferTooSmall;
  1979. X            break;
  1980. X        }
  1981. X        get_tod(6,&result_esd->pb[result_esd->cb]);
  1982. X        result_esd->cb += 5;
  1983. X        break;
  1984. X
  1985. X    case FStimezs:
  1986. X        if(8 > (result_esd->maxcb - result_esd->cb))
  1987. X        {
  1988. X            erc = eBufferTooSmall;
  1989. X            break;
  1990. X        }
  1991. X        get_tod(7,&result_esd->pb[result_esd->cb]);
  1992. X        result_esd->cb += 8;
  1993. X        break;
  1994. X
  1995. X    case FSdate:
  1996. X        if(10 > (result_esd->maxcb - result_esd->cb))
  1997. X        {
  1998. X            erc = eBufferTooSmall;
  1999. X            break;
  2000. X        }
  2001. X        get_tod(5,&result_esd->pb[result_esd->cb]);
  2002. X        result_esd->cb += 10;
  2003. X        break;
  2004. X
  2005. X    case FSdatez:
  2006. X        if(10 > (result_esd->maxcb - result_esd->cb))
  2007. X        {
  2008. X            erc = eBufferTooSmall;
  2009. X            break;
  2010. X        }
  2011. X        get_tod(8,&result_esd->pb[result_esd->cb]);
  2012. X        result_esd->cb += 10;
  2013. X        break;
  2014. X
  2015. X    case FScgets:
  2016. X        erc = ttygets_esd(result_esd,TG_CRLF,1);
  2017. X        break;
  2018. X
  2019. X    case FScgetc:
  2020. X        if(result_esd->cb == result_esd->maxcb)
  2021. X        {
  2022. X            erc = eBufferTooSmall;
  2023. X            break;
  2024. X        }
  2025. X        result_esd->pb[result_esd->cb] = ttygetc(0);
  2026. X        result_esd->cb++;
  2027. X        break;
  2028. X
  2029. X    case FSchr:
  2030. X        if(erc = skip_paren(param,1))
  2031. X            break;
  2032. X        if(erc = gint(param,<mp))
  2033. X            break;
  2034. X        if(!ltmp)
  2035. X        {
  2036. X            pputs("cannot use %chr(0)\n");
  2037. X            return(eFATAL_ALREADY);
  2038. X        }
  2039. X        if(erc = skip_paren(param,0))
  2040. X            break;
  2041. X        if(result_esd->cb == result_esd->maxcb )
  2042. X        {
  2043. X            erc = eBufferTooSmall;
  2044. X            break;
  2045. X        }
  2046. X        result_esd->pb[result_esd->cb] = (char)ltmp;
  2047. X        result_esd->cb++;
  2048. X        break;
  2049. X
  2050. X    case FSitos:
  2051. X        if(erc = skip_paren(param,1))
  2052. X            break;
  2053. X        if(erc = gint(param,<mp))
  2054. X            break;
  2055. X        s32[0] = 0;
  2056. X        if(!skip_comma(param))
  2057. X        {
  2058. X            if(erc = get_numeric_zstr(param,s32 + 1,sizeof(s32) - 4))
  2059. X                strcpy(s32 + 1,"1");
  2060. X            if(((itmp = atoi(s32 + 1)) < 0) ||
  2061. X                (itmp > (result_esd->maxcb - result_esd->cb)))
  2062. X            {
  2063. X                erc = eBufferTooSmall;
  2064. X                break;
  2065. X            }
  2066. X            s32[0] = '%';
  2067. X            if(ulindex(param->pb + param->index,"x") == 0)
  2068. X            {
  2069. X                param->index++;
  2070. X                strcat(s32,"lx");
  2071. X            }
  2072. X            else if(ulindex(param->pb + param->index,"o") == 0)
  2073. X            {
  2074. X                param->index++;
  2075. X                strcat(s32,"lo");
  2076. X            }
  2077. X            else if(ulindex(param->pb + param->index,"d") == 0)
  2078. X            {
  2079. X                param->index++;
  2080. X                strcat(s32,"ld");
  2081. X            }
  2082. X            else if(erc)
  2083. X                break;
  2084. X            else
  2085. X                strcat(s32,"ld");
  2086. X        }
  2087. X        if(erc = skip_paren(param,0))
  2088. X            break;
  2089. X        sprintf(tesd1->pb,s32[0] ? s32 : "%ld",ltmp);
  2090. X        tesd1->cb = strlen(tesd1->pb);
  2091. X        if(result_esd->maxcb - result_esd->cb < tesd1->cb)
  2092. X        {
  2093. X            erc = eBufferTooSmall;
  2094. X            break;
  2095. X        }
  2096. X        strcpy(&result_esd->pb[result_esd->cb],tesd1->pb);
  2097. X        result_esd->cb += tesd1->cb;
  2098. X        break;
  2099. X
  2100. X
  2101. X    default:
  2102. X        erc = eInvalidFunction;
  2103. X        break;
  2104. X    }   /* end of keyword lookup erc switch statement */
  2105. X
  2106. X    esd_null_terminate(result_esd);
  2107. X    esdfree(tesd1);
  2108. X    if(tesd2)
  2109. X        esdfree(tesd2);
  2110. X    return(erc);
  2111. X
  2112. X}   /* end of feval_str() */
  2113. X
  2114. X/* vi: set tabstop=4 shiftwidth=4: */
  2115. X/* end of feval.c */
  2116. SHAR_EOF
  2117. $TOUCH -am 0725125891 'feval.c' &&
  2118. chmod 0644 feval.c ||
  2119. echo 'restore of feval.c failed'
  2120. Wc_c="`wc -c < 'feval.c'`"
  2121. test 25528 -eq "$Wc_c" ||
  2122.     echo 'feval.c: original size 25528, current size' "$Wc_c"
  2123. rm -f _shar_wnt_.tmp
  2124. fi
  2125. # ============= feval.h ==============
  2126. if test -f 'feval.h' -a X"$1" != X"-c"; then
  2127.     echo 'x - skipping feval.h (File already exists)'
  2128.     rm -f _shar_wnt_.tmp
  2129. else
  2130. > _shar_wnt_.tmp
  2131. echo 'x - extracting feval.h (Text)'
  2132. sed 's/^X//' << 'SHAR_EOF' > 'feval.h' &&
  2133. X/*+-------------------------------------------------------------------------
  2134. X    feval.h
  2135. X    wht@n4hgf.Mt-Park.GA.US
  2136. X--------------------------------------------------------------------------*/
  2137. X/*+:EDITS:*/
  2138. X/*:07-25-1991-12:58-wht@n4hgf-ECU release 3.10 */
  2139. X/*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
  2140. X
  2141. X#define FIinstr        1
  2142. X#define FIlen        2
  2143. X#define FIstoi        3
  2144. X#define FIctoi        4
  2145. X#define FIbaud        5
  2146. X#define FIconn        6
  2147. X#define FIcsec        7
  2148. X#define FIpid        8
  2149. X#define FIrchr        9
  2150. X#define FIrchrc        10
  2151. X#define FIxchr        11
  2152. X#define FIxchrc        12
  2153. X#define FIlgetc        13
  2154. X#define FIargc        14
  2155. X#define FIftell        15
  2156. X#define FIfmode        16
  2157. X#define FIisdir        17
  2158. X#define FIisreg        18
  2159. X#define FIischr        19
  2160. X#define FIfatime    20
  2161. X#define FIfmtime    21
  2162. X#define FIfsize        22
  2163. X#define FIcolors    23
  2164. X
  2165. X
  2166. XKEYTAB feval_int_tbl[] =
  2167. X{
  2168. X    {"argc",FIargc},
  2169. X    {"baud",FIbaud},
  2170. X    {"colors",FIcolors},
  2171. X    {"conn",FIconn},
  2172. X    {"csec",FIcsec},
  2173. X    {"ctoi",FIctoi},
  2174. X    {"fatime",FIfatime},
  2175. X    {"fmode",FIfmode},
  2176. X    {"fmtime",FIfmtime},
  2177. X    {"fsize",FIfsize},
  2178. X    {"ftell",FIftell},
  2179. X    {"instr",FIinstr},
  2180. X    {"ischr",FIischr},
  2181. X    {"isdir",FIisdir},
  2182. X    {"isreg",FIisreg},
  2183. X    {"len",FIlen},
  2184. X    {"lgetc",FIlgetc},
  2185. X    {"pid",FIpid},
  2186. X    {"rchr",FIrchr},
  2187. X    {"rchrc",FIrchrc},
  2188. X    {"stoi",FIstoi},
  2189. X    {"xchr",FIxchr},
  2190. X    {"xchrc",FIxchrc},
  2191. X    {(char *)0,0}
  2192. X};
  2193. X
  2194. X#define FSleft        2
  2195. X#define FSright        3
  2196. X#define FSmid        4
  2197. X#define FSdate        5
  2198. X#define FSmonth        6
  2199. X#define FSday        7
  2200. X#define FScgets        9
  2201. X#define FScgetc        10
  2202. X#define FSitos        11
  2203. X#define FSchr        12
  2204. X#define FSdir        13
  2205. X#define FStty        14
  2206. X#define FSrdesc        15
  2207. X#define FSrname        16
  2208. X#define FSline        17
  2209. X#define FSrtel        18
  2210. X#define FSargv        19
  2211. X#define FStime        20
  2212. X#define FStimes        21
  2213. X#define FSedate        22
  2214. X#define FSetime        23
  2215. X#define FSgetenv    24
  2216. X#define FSgetlogin    25
  2217. X
  2218. X
  2219. XKEYTAB feval_str_tbl[] =
  2220. X{
  2221. X    {"argv",FSargv},
  2222. X    {"cgetc",FScgetc},
  2223. X    {"cgets",FScgets},
  2224. X    {"chr",FSchr},
  2225. X    {"date",FSdate},
  2226. X    {"day",FSday},
  2227. X    {"dir",FSdir},
  2228. X    {"edate",FSedate},
  2229. X    {"etime",FSetime},
  2230. X    {"getenv",FSgetenv},
  2231. X    {"getlogin",FSgetlogin},
  2232. X    {"itos",FSitos},
  2233. X    {"left",FSleft},
  2234. X    {"line",FSline},
  2235. X    {"mid",FSmid},
  2236. X    {"month",FSmonth},
  2237. X    {"rdesc",FSrdesc},
  2238. X    {"right",FSright},
  2239. X    {"rname",FSrname},
  2240. X    {"rtelno",FSrtel},
  2241. X    {"time",FStime},
  2242. X    {"times",FStimes},
  2243. X    {"tty",FStty},
  2244. X    {(char *)0,0}
  2245. X};
  2246. X
  2247. X/* vi: set tabstop=4 shiftwidth=4: */
  2248. X/* end of feval.h */
  2249. SHAR_EOF
  2250. $TOUCH -am 0725125891 'feval.h' &&
  2251. chmod 0644 feval.h ||
  2252. echo 'restore of feval.h failed'
  2253. Wc_c="`wc -c < 'feval.h'`"
  2254. test 2226 -eq "$Wc_c" ||
  2255.     echo 'feval.h: original size 2226, current size' "$Wc_c"
  2256. rm -f _shar_wnt_.tmp
  2257. fi
  2258. # ============= gint.c ==============
  2259. if test -f 'gint.c' -a X"$1" != X"-c"; then
  2260.     echo 'x - skipping gint.c (File already exists)'
  2261.     rm -f _shar_wnt_.tmp
  2262. else
  2263. > _shar_wnt_.tmp
  2264. echo 'x - extracting gint.c (Text)'
  2265. sed 's/^X//' << 'SHAR_EOF' > 'gint.c' &&
  2266. X/*+-------------------------------------------------------------------------
  2267. X    gint.c - ecu get integer parameter functions
  2268. X    wht@n4hgf.Mt-Park.GA.US
  2269. X
  2270. X  Defined functions:
  2271. X    gcol_range(param,col1,col2)
  2272. X    gint(param,int_returned)
  2273. X    gint_base(param,value)
  2274. X    gint_constant(param,value)
  2275. X    gintop(param,intop)
  2276. X
  2277. X--------------------------------------------------------------------------*/
  2278. X/*+:EDITS:*/
  2279. X/*:07-25-1991-12:58-wht@n4hgf-ECU release 3.10 */
  2280. X/*:01-31-1991-16:50-wht@n4hgf-reinstate octal with 0o prefix */
  2281. X/*:01-09-1991-22:31-wht@n4hgf-ISC port */
  2282. X/*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
  2283. X
  2284. X#include "ecu.h"
  2285. X#include "ecuerror.h"
  2286. X#include "esd.h"
  2287. X#include "var.h"
  2288. X
  2289. X#define OP_ADD      1
  2290. X#define OP_SUB      2
  2291. X#define OP_MUL      3
  2292. X#define OP_DIV      4
  2293. X#define OP_XOR      5
  2294. X#define OP_MOD      6
  2295. X#define OP_OR       7
  2296. X#define OP_AND      8
  2297. X
  2298. X#define BASE_DEC    1
  2299. X#define BASE_OCT    2
  2300. X#define BASE_HEX      3
  2301. X
  2302. X
  2303. X/*+-------------------------------------------------------------------------
  2304. X    gint_constant(param,int_returned) - evaluate integer constant
  2305. X--------------------------------------------------------------------------*/
  2306. Xint
  2307. Xgint_constant(param,value)
  2308. XESD *param;
  2309. Xlong *value;
  2310. X{
  2311. Xregister itmp;
  2312. Xint base = BASE_DEC;
  2313. Xint erc;
  2314. Xlong new_value;
  2315. X
  2316. X    if(erc = skip_cmd_break(param))
  2317. X        return(erc);
  2318. X    esd_null_terminate(param);
  2319. X
  2320. X/* get integer from string */
  2321. X    if((!strncmp(param->pb + param->index,"0x",2)) ||
  2322. X        (!strncmp(param->pb + param->index,"0X",2)))
  2323. X    {
  2324. X        base = BASE_HEX;
  2325. X        param->index += 2;
  2326. X    }
  2327. X    else if((!strncmp(param->pb + param->index,"0o",2)) ||
  2328. X        (!strncmp(param->pb + param->index,"0O",2)))
  2329. X    {
  2330. X        base = BASE_OCT;
  2331. X        param->index += 2;
  2332. X    }
  2333. X
  2334. X    param->old_index = param->index;
  2335. X    switch(base)
  2336. X    {
  2337. X    case BASE_HEX:
  2338. X        sscanf(param->pb + param->index,"%lx",&new_value);
  2339. X        itmp = param->index + strspn(param->pb + param->index,
  2340. X            "0123456789ABCDEFabcdef");
  2341. X        erc = eInvalidHexNumber;
  2342. X        break;
  2343. X    case BASE_DEC:
  2344. X        sscanf(param->pb + param->index,"%ld",&new_value);
  2345. X        itmp = param->index + strspn(param->pb + param->index,"0123456789");
  2346. SHAR_EOF
  2347. true || echo 'restore of gint.c failed'
  2348. fi
  2349. echo 'End of ecu310 part 13'
  2350. echo 'File gint.c is continued in part 14'
  2351. echo 14 > _shar_seq_.tmp
  2352. exit 0
  2353. --------------------------------------------------------------------
  2354. Warren Tucker, TuckerWare emory!n4hgf!wht or wht@n4hgf.Mt-Park.GA.US
  2355. Hacker Extraordinaire  d' async PADs,  pods,  proteins and protocols
  2356.  
  2357. exit 0 # Just in case...
  2358. -- 
  2359. Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
  2360. Sterling Software, IMD           UUCP:     uunet!sparky!kent
  2361. Phone:    (402) 291-8300         FAX:      (402) 291-4362
  2362. Please send comp.sources.misc-related mail to kent@uunet.uu.net.
  2363.