home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / misc / volume32 / ecu / part19 < prev    next >
Encoding:
Text File  |  1992-09-13  |  57.0 KB  |  2,615 lines

  1. Newsgroups: comp.sources.misc
  2. From: wht@n4hgf.Mt-Park.GA.US (Warren Tucker)
  3. Subject:  v32i054:  ecu - ECU Asynchronous Communications v3.20, Part19/40
  4. Message-ID: <1992Sep13.153820.5799@sparky.imd.sterling.com>
  5. X-Md4-Signature: 34b83be9cbc3ddc1c5153db8340cb9d5
  6. Date: Sun, 13 Sep 1992 15:38:20 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: wht@n4hgf.Mt-Park.GA.US (Warren Tucker)
  10. Posting-number: Volume 32, Issue 54
  11. Archive-name: ecu/part19
  12. Environment: SCO,XENIX,ISC,SUNOS,SYSVR4,HDB,Curses
  13. Supersedes: ecu: Volume 21, Issue 53-89
  14.  
  15. ---- Cut Here and feed the following to sh ----
  16. #!/bin/sh
  17. # this is ecu320.19 (part 19 of ecu320)
  18. # do not concatenate these parts, unpack them in order with /bin/sh
  19. # file pcmd.c continued
  20. #
  21. if test ! -r _shar_seq_.tmp; then
  22.     echo 'Please unpack part 1 first!'
  23.     exit 1
  24. fi
  25. (read Scheck
  26.  if test "$Scheck" != 19; then
  27.     echo Please unpack part "$Scheck" next!
  28.     exit 1
  29.  else
  30.     exit 0
  31.  fi
  32. ) < _shar_seq_.tmp || exit 1
  33. if test ! -f _shar_wnt_.tmp; then
  34.     echo 'x - still skipping pcmd.c'
  35. else
  36. echo 'x - continuing file pcmd.c'
  37. sed 's/^X//' << 'SHAR_EOF' >> 'pcmd.c' &&
  38. X            interval = hzmsec;        /* SCO nap bug */
  39. X        if(proctrace && (interval > 100))    /* short naps hurt by pprintf */
  40. X            pprintf("nap %ld msec\n",interval);
  41. X        if(Nap(interval) == -1)        /* EINTR is the only error returned ... */
  42. X        {                            /* but check anyway */
  43. X            if(errno == EINTR)
  44. X                erc = eCONINT;
  45. X        }
  46. X    }
  47. X    return(erc);
  48. X}    /* end of pcmd_nap */
  49. X
  50. X/*+-------------------------------------------------------------------------
  51. X    pcmd_nice(param)
  52. X--------------------------------------------------------------------------*/
  53. Xint
  54. Xpcmd_nice(param)
  55. XESD *param;
  56. X{
  57. Xlong new_nice;
  58. Xint erc;
  59. Xint old_nice;
  60. Xint nice();
  61. X
  62. X    if(shm->Liofd < 0)
  63. X        return(eNoLineAttached);
  64. X
  65. X    if(erc = gint(param,&new_nice))
  66. X        return(erc);
  67. X    if((new_nice < 0) || (new_nice > 39))
  68. X    {
  69. X        pprintf("warning: invalid nice %ld ignored (valid range 0-39)\n",
  70. X            new_nice);
  71. X        return(0);
  72. X    }
  73. X
  74. X    old_nice = nice(0) + 20;
  75. X    nice(-old_nice + (int)new_nice);
  76. X
  77. X    if(proctrace)
  78. X        pprintf("nice desired %u, set to %u\n",(uint)new_nice,nice(0) + 20);
  79. X    return(0);
  80. X
  81. X}    /* end of pcmd_nice */
  82. X
  83. X/*+-------------------------------------------------------------------------
  84. X    pcmd_parity(param)
  85. Xparity [e | o | n]
  86. Xparity ['e' | 'o' | 'n']
  87. X--------------------------------------------------------------------------*/
  88. Xint
  89. Xpcmd_parity(param)
  90. XESD *param;
  91. X{
  92. Xint erc;
  93. Xint new_parity = 0;
  94. XESD *tesd;
  95. Xchar s64[64];
  96. X
  97. X    if(erc = skip_cmd_break(param))
  98. X        return(erc);
  99. X    if(!(tesd = esdalloc(64)))
  100. X        return(eNoMemory);
  101. X    if(!gstr(param,tesd,0))
  102. X        new_parity = to_lower(*tesd->pb);
  103. X    else if(!get_alpha_zstr(param,s64,sizeof(s64)))
  104. X        new_parity = to_lower(s64[0]);
  105. X    else
  106. X    {
  107. X        erc = eSyntaxError;
  108. X        goto RETURN;
  109. X    }
  110. X    esdfree(tesd);
  111. X
  112. X    switch(new_parity)
  113. X    {
  114. X        case 'n':
  115. X            new_parity = 0;
  116. X        case 'e':
  117. X        case 'o':
  118. X            shm->Lparity = new_parity;
  119. X            if(shm->Liofd < 0)
  120. X                lset_parity(1);
  121. X            break;
  122. X        default:
  123. X            erc = eBadParameter;
  124. X    }
  125. X    if(proctrace && !erc)
  126. X    {
  127. X        pprintf("parity set to %s\n",
  128. X            (shm->Lparity) ? ((shm->Lparity == 'e') ? "even" : "odd")
  129. X                           : "none");
  130. X    }
  131. X
  132. XRETURN:
  133. X    esdfree(tesd);
  134. X    return(erc);
  135. X
  136. X}    /* end of pcmd_parity */
  137. X
  138. X/*+-------------------------------------------------------------------------
  139. X    pcmd_prompt(param)
  140. X--------------------------------------------------------------------------*/
  141. Xint
  142. Xpcmd_prompt(param)
  143. XESD *param;
  144. X{
  145. Xextern ESD *icmd_prompt;
  146. X
  147. X    return(gstr(param,icmd_prompt,0));
  148. X}    /* end of pcmd_prompt */
  149. X
  150. X/*+-------------------------------------------------------------------------
  151. X    pcmd_ptrace(param)
  152. X--------------------------------------------------------------------------*/
  153. Xint
  154. Xpcmd_ptrace(param)
  155. XESD *param;
  156. X{
  157. Xchar s8[8];
  158. X
  159. X    if(get_alpha_zstr(param,s8,sizeof(s8)))
  160. X        return(eSyntaxError);
  161. X    if(isdigit(s8[0]))
  162. X        proctrace = atoi(s8);
  163. X    if(!strcmp(s8,"on"))
  164. X        proctrace = 1;
  165. X    else if(!strcmp(s8,"off"))
  166. X        proctrace = 0;
  167. X    else
  168. X        return(eSyntaxError);
  169. X    return(0);
  170. X}    /* end of pcmd_ptrace */
  171. X
  172. X/*+-------------------------------------------------------------------------
  173. X    pcmd_rname(param) - set remote name
  174. X--------------------------------------------------------------------------*/
  175. Xint
  176. Xpcmd_rname(param)
  177. XESD *param;
  178. X{
  179. Xint erc;
  180. XESD *rname;
  181. X
  182. X    if(shm->Liofd < 0)
  183. X        return(eNoLineAttached);
  184. X    if(!shm->Lconnected)
  185. X    {
  186. X        pputs("Not connected\n");
  187. X        return(eFATAL_ALREADY);
  188. X    }
  189. X
  190. X    if((rname = esdalloc(sizeof(shm->Lrname) - 1)) == (ESD *)0)
  191. X        return(eNoMemory);
  192. X
  193. X    if(!(erc = gstr(param,rname,0)))
  194. X    {
  195. X        strcpy(shm->Lrname,rname->pb);
  196. X        if(proctrace)
  197. X            pprintf("rname set to '%s'\n",rname->pb);
  198. X    }
  199. X    esdfree(rname);
  200. X    return(erc);
  201. X
  202. X}    /* end of pcmd_rname */
  203. X
  204. X/*+-------------------------------------------------------------------------
  205. X    pcmd_send(param)
  206. Xsend [-n] <str>
  207. X-n do not send trailing CR
  208. X-v turn on proctrace for just this statement
  209. X-p## pace characters ## msec apart
  210. X--------------------------------------------------------------------------*/
  211. Xint
  212. Xpcmd_send(param)
  213. XESD *param;
  214. X{
  215. Xint erc;
  216. Xchar *cptr;
  217. XESD *buf;
  218. Xchar switches[32];
  219. Xint send_cr;
  220. Xint tell_it;
  221. Xlong pace_msec = 0L;
  222. X
  223. X    if(shm->Liofd < 0)
  224. X        return(eNoLineAttached);
  225. X
  226. X    if((buf = esdalloc(256)) == (ESD *)0)
  227. X        return(eNoMemory);
  228. X
  229. X    get_switches(param,switches,sizeof(switches));
  230. X    send_cr = !strchr(switches,'n');
  231. X    tell_it = !!strchr(switches,'v');
  232. X    if(cptr = strchr(switches,'p'))
  233. X        sscanf(cptr + 1,"%ld",&pace_msec);
  234. X
  235. X    if(erc = gstr(param,buf,1))
  236. X    {
  237. X        esdfree(buf);
  238. X        return(erc);
  239. X    }
  240. X
  241. X    if(proctrace || tell_it)
  242. X    {
  243. X        hex_dump(buf->pb,buf->cb,
  244. X            (send_cr) ? "send with CR" : "send w/o CR",1);
  245. X    }
  246. X
  247. X    if(pace_msec)
  248. X        lputs_paced(pace_msec,buf->pb);
  249. X    else
  250. X        lputs(buf->pb);
  251. X
  252. X    if(send_cr)
  253. X        lputc(CRET);
  254. X    if(pace_msec)
  255. X        Nap(pace_msec);
  256. X
  257. X    esdfree(buf);
  258. X    return(erc);
  259. X}    /* end of pcmd_send */
  260. X
  261. X/*+-------------------------------------------------------------------------
  262. X    pcmd_set(param)
  263. X--------------------------------------------------------------------------*/
  264. Xint
  265. Xpcmd_set(param)
  266. XESD *param;
  267. X{
  268. Xint erc;
  269. Xint itmp;
  270. Xulong varnum;
  271. Xuint varmax;
  272. Xchar vartype;
  273. Xchar varstr[16];
  274. Xint show_status;
  275. Xlong *ivptr;
  276. XESD *svptr;
  277. Xchar *cptr;
  278. Xchar *make_char_graphic();
  279. X
  280. X    if(erc = skip_cmd_break(param))
  281. X        return(erc);
  282. X
  283. X    do {
  284. X
  285. X        /* $ is optional */
  286. X        if((erc = skip_cmd_char(param,'$')) && (erc != eSyntaxError))
  287. X            return(erc);
  288. X
  289. X        /* get variable type */
  290. X        if(get_cmd_char(param,&vartype))
  291. X            return(eSyntaxError);
  292. X
  293. X        /* validate variable type */
  294. X        vartype = to_lower(vartype);
  295. X        switch(vartype)
  296. X        {
  297. X            case 'i':
  298. X                varmax = IVQUAN;
  299. X                break;
  300. X            case 's':
  301. X                varmax = SVQUAN;
  302. X                break;
  303. X            default:
  304. X                return(eIllegalVarType);
  305. X        }
  306. X
  307. X        if(!get_numeric_value(param,&varnum))
  308. X            goto TEST_VARNUM;
  309. X        else if(*(param->pb + param->index) == '[')
  310. X        {
  311. X            if(erc = get_subscript(param,&varnum))
  312. X                return(erc);
  313. XTEST_VARNUM:
  314. X            if((int)varnum >= varmax)
  315. X                return(eIllegalVarNumber);
  316. X            switch(vartype)
  317. X            {
  318. X                case 'i':
  319. X                    ivptr = &iv[(int)varnum];
  320. X                    break;
  321. X                default:
  322. X                    svptr = sv[(int)varnum];
  323. X            }
  324. X        }
  325. X        else if(get_alphanum_zstr(param,varstr,sizeof(varstr)))
  326. X            return(eInvalidVarName);
  327. X        else
  328. X        {
  329. X            varnum = NAMED_VARIABLE_FLAG;
  330. X            switch(vartype)
  331. X            {
  332. X                case 'i':
  333. X                    erc = find_mkvi(varstr,&ivptr,1);
  334. X                    break;
  335. X                default:
  336. X                    erc = find_mkvs(varstr,&svptr,1);
  337. X            }
  338. X            if(erc)
  339. X                return(erc);
  340. X        }
  341. X            
  342. X        show_status = 1;
  343. X        if(!skip_cmd_char(param,'='))    /* assignment */
  344. X        {
  345. X            switch(vartype)
  346. X            {
  347. X                case 'i':
  348. X                    if(erc = gint(param,ivptr))
  349. X                        return(erc);
  350. X                    break;
  351. X                default:
  352. X                    if(erc = gstr(param,svptr,1))
  353. X                        return(erc);
  354. X                    break;
  355. X            }
  356. X            if(!proctrace)
  357. X                show_status = 0;
  358. X        }
  359. X        if(show_status)
  360. X        {
  361. X            switch(vartype)
  362. X            {
  363. X                case 'i':
  364. X                    if(varnum != NAMED_VARIABLE_FLAG)
  365. X                        pprintf("$i%02ld = %7ld (0x%08lx,0%03lo",varnum,
  366. X                            *ivptr,*ivptr,*ivptr);
  367. X                    else
  368. X                        pprintf("$i%s = %ld (0x%08lx,0%03lo",varstr,
  369. X                            *ivptr,*ivptr,*ivptr);
  370. X                    if((*ivptr >= 0) && (*ivptr <= 255))
  371. X                        pprintf(",'%s'",make_char_graphic((char)*ivptr,1));
  372. X                    pputs(")\n");
  373. X                    break;
  374. X                default:
  375. X                    if(varnum != NAMED_VARIABLE_FLAG)
  376. X                        pprintf("$s%02ld = '",varnum);
  377. X                    else
  378. X                        pprintf("$s%s = '",varstr);
  379. X                    itmp = svptr->cb;
  380. X                    cptr = svptr->pb;
  381. X                    while(itmp--)
  382. X                        pputs(make_char_graphic(*cptr++,0));
  383. X                    pputs("'\n");
  384. X                    break;
  385. X            }
  386. X        }
  387. X    } while(!skip_comma(param));
  388. X
  389. X    if(!end_of_cmd(param))
  390. X        return(eSyntaxError);
  391. X
  392. X    return(0);
  393. X}    /* end of pcmd_set */
  394. X
  395. X/*+-------------------------------------------------------------------------
  396. X    pcmd_system(param)
  397. X
  398. Xsystem [-l] 'cmd'
  399. X-l makes comm line stdin/stdout
  400. X-s keeps all fds the same
  401. X
  402. Xreturns $i0 set to exit status of program or 0x100 if interrupted
  403. X--------------------------------------------------------------------------*/
  404. Xint
  405. Xpcmd_system(param)
  406. XESD *param;
  407. X{
  408. Xint erc;
  409. XESD *cmd;
  410. Xextern int last_child_wait_status;
  411. Xchar switches[8];
  412. X
  413. X    if((cmd = esdalloc(256)) == (ESD *)0)
  414. X        return(eNoMemory);
  415. X
  416. X    get_switches(param,switches,sizeof(switches));
  417. X
  418. X/* a hack */
  419. X    *cmd->pb++ = (strchr(switches,'s')) ? '>' : 
  420. X        ((strchr(switches,'l')) ? '$' : '!');
  421. X
  422. X    cmd->maxcb--;
  423. X
  424. X    if(erc = gstr(param,cmd,1))
  425. X    {
  426. X        cmd->pb--;        /* be nice */
  427. X        cmd->maxcb++;    /* or surely this will haunt us one day */
  428. X        esdfree(cmd);
  429. X        return(erc);
  430. X    }
  431. X
  432. X/* rehack */
  433. X    cmd->pb--;
  434. X    cmd->cb++;
  435. X    cmd->maxcb++;
  436. X
  437. X    if(proctrace)
  438. X    {
  439. X        pputs(cmd->pb + 1);
  440. X        pputs("\n");
  441. X    }
  442. X
  443. X    last_child_wait_status = 0xFF00;
  444. X    shell(cmd->pb);
  445. X    iv[0] = (last_child_wait_status & 0xFF)
  446. X            ? 0x100L : (long)last_child_wait_status >> 8;
  447. X    if(proctrace)
  448. X        pprintf("$i0 = %ld, (%s)\n",iv[0],
  449. X            (iv[0] == 0x100L) ? "interrupted" : "program exit status");
  450. X
  451. X    esdfree(cmd);
  452. X    return(0);
  453. X}    /* end of pcmd_system */
  454. X
  455. X/*+-------------------------------------------------------------------------
  456. X    get_big_endian_16(ptr)
  457. X--------------------------------------------------------------------------*/
  458. Xushort
  459. Xget_big_endian_16(ptr)
  460. Xregister uchar *ptr;
  461. X{
  462. Xregister ushort uint16 = ((ushort)ptr[0] << 8) | ptr[1];
  463. X    return(uint16);
  464. X}    /* end of get_big_endian_16 */
  465. X/*+-------------------------------------------------------------------------
  466. X    get_big_endian_32(ptr)
  467. X--------------------------------------------------------------------------*/
  468. Xulong
  469. Xget_big_endian_32(ptr)
  470. Xregister uchar *ptr;
  471. X{
  472. Xregister ulong uint32 = ((ulong)*ptr++) << 24;
  473. X    uint32 |= ((ulong)*ptr++) << 16;
  474. X    uint32 |= ((ulong)*ptr++) <<  8;
  475. X    uint32 |=  (ulong)*ptr++;
  476. X    return(uint32);
  477. X}    /* end of get_big_endian_32 */
  478. X
  479. X/*+-------------------------------------------------------------------------
  480. X    pcmd_getf(param) - get friend memory
  481. X
  482. Xgetf -x <int-var-spec> <offset>
  483. Xwhere: -x ==
  484. X   -b byte
  485. X   -w word (little-endian)
  486. X   -W word (big-endian)
  487. X   -l 32-bits (little-endian)
  488. X   -L 32-bits (big-endian)
  489. X--------------------------------------------------------------------------*/
  490. Xint
  491. Xpcmd_getf(param)
  492. XESD *param;
  493. X{
  494. Xint erc;
  495. Xchar switches[8];
  496. Xlong *piv;
  497. Xlong offset;
  498. Xint size;
  499. Xint big_endian;
  500. X
  501. X    if(erc = get_switches(param,switches,sizeof(switches)))
  502. X        return(erc);
  503. X    if((strlen(switches) != 2) || !strchr("bwWlL",switches[1]))
  504. X    {
  505. X        pputs("invalid switch\n");
  506. X        return(eFATAL_ALREADY);
  507. X    }
  508. X    size = to_lower(switches[1]);
  509. X    big_endian = isupper(switches[1]);
  510. X
  511. X/*
  512. X    if(!get_svptr(param,&psv))
  513. X        return(eNotImplemented);
  514. X    else
  515. X*/
  516. X    if(!strncmp(param->pb + param->index,"$i",2))
  517. X        param->index += 2;
  518. X    if(erc = get_ivptr(param,&piv,1))
  519. X        return(erc);
  520. X
  521. X    if(erc = gint(param,&offset))
  522. X        return(erc);
  523. X
  524. X    if(proctrace)
  525. X        pprintf("getf %s offset=0x%lx",switches,offset);
  526. X
  527. X    switch(size)
  528. X    {
  529. X        case 'b':
  530. X            if(offset > ((long)sizeof(shm->friend_space) - 1))
  531. X                goto OFFSET_TOO_LARGE;
  532. X            *piv = *(((uchar *)shm->friend_space) + (int)offset) & 0xFF;
  533. X            break;
  534. X        case 'w':
  535. X            if(offset > ((long)sizeof(shm->friend_space) - 2))
  536. X                goto OFFSET_TOO_LARGE;
  537. X            if(big_endian)
  538. X                *piv = get_big_endian_16((uchar *)shm->friend_space +
  539. X                        (int)offset);
  540. X            else
  541. X                *piv = *(((ushort *)shm->friend_space) + (int)offset) & 0xFFFF;
  542. X            break;
  543. X        case 'l':
  544. X            if(offset > ((long)sizeof(shm->friend_space) - 4))
  545. X                goto OFFSET_TOO_LARGE;
  546. X            if(big_endian)
  547. X            {
  548. X                *piv = get_big_endian_32((uchar *)shm->friend_space +
  549. X                        (int)offset);
  550. X            }
  551. X            else
  552. X                *piv = *((long *)((char *)shm->friend_space + (int)offset));
  553. X            break;
  554. X    }
  555. X
  556. X    if(proctrace)
  557. X        pprintf(" value=%ld (%08lx)\n",*piv,*piv);
  558. X    return(0);
  559. X
  560. XOFFSET_TOO_LARGE:
  561. X    if(proctrace)
  562. X        pputs("\n");
  563. X    pprintf("offset 0x%02lx too large for -%c (0x%02x bytes available)\n",
  564. X        offset,switches[1],sizeof(shm->friend_space));
  565. X    return(eFATAL_ALREADY);
  566. X
  567. X}    /* end of pcmd_getf */
  568. X
  569. X/*+-------------------------------------------------------------------------
  570. X    pcmd_putf(param)
  571. X--------------------------------------------------------------------------*/
  572. X/*ARGSUSED*/
  573. Xint
  574. Xpcmd_putf(param)
  575. XESD *param;
  576. X{
  577. X    return(eNotImplemented);
  578. X}    /* end of pcmd_putf */
  579. X
  580. X/*+-------------------------------------------------------------------------
  581. X    pcmd_xon(param)
  582. X--------------------------------------------------------------------------*/
  583. Xint
  584. Xpcmd_xon(param)
  585. XESD *param;
  586. X{
  587. Xint erc;
  588. Xchar new_xonxoff[8];
  589. Xchar *xon_status();
  590. X
  591. X    if(shm->Liofd < 0)
  592. X        return(eNoLineAttached);
  593. X
  594. X    if(erc = get_alpha_zstr(param,new_xonxoff,sizeof(new_xonxoff)))
  595. X        return(erc);
  596. X
  597. X    if(set_xon_xoff_by_arg(new_xonxoff))
  598. X        return(eBadParameter);
  599. X
  600. X    if(proctrace)
  601. X        pprintf("xon/xoff flow control set to %s\n",xon_status());
  602. X
  603. X    return(erc);
  604. X
  605. X}    /* end of pcmd_xon */
  606. X
  607. X/*+-------------------------------------------------------------------------
  608. X    pcmd_rtscts(param)
  609. X--------------------------------------------------------------------------*/
  610. Xint
  611. Xpcmd_rtscts(param)
  612. XESD *param;
  613. X{
  614. Xint erc;
  615. Xchar new_rtscts[8];
  616. X
  617. X    if(shm->Liofd < 0)
  618. X        return(eNoLineAttached);
  619. X
  620. X    if(erc = get_alphanum_zstr(param,new_rtscts,sizeof(new_rtscts)))
  621. X        return(erc);
  622. X
  623. X#if defined(HW_FLOW_CONTROL) /* see ecu.h */
  624. X    lRTSCTS_control(yes_or_no(new_rtscts));
  625. X
  626. X    if(proctrace)
  627. X        display_hw_flow_config();
  628. X#else
  629. X    if(proctrace)
  630. X        pprintf("hardware flow control not available .... rtscts ignored\n");
  631. X#endif /* RTSFLOW */
  632. X
  633. X    return(erc);
  634. X}    /* end of pcmd_rtscts */
  635. X
  636. X/*+-------------------------------------------------------------------------
  637. X    pcmd_setline(param) - _rc.ep setline command
  638. X
  639. XThis command can be used to set the initial line in _rc.ep
  640. X--------------------------------------------------------------------------*/
  641. Xint
  642. Xpcmd_setline(param)
  643. XESD *param;
  644. X{
  645. Xint erc;
  646. XESD *tesd;
  647. X
  648. X    if(rc_ep_has_run)
  649. X    {
  650. X        pprintf("command legal only in _rc.ep\n");
  651. X        return(eFATAL_ALREADY);
  652. X    }
  653. X
  654. X    if(!(tesd = esdalloc(sizeof(shm->Lline))))
  655. X        return(eNoMemory);
  656. X    if(erc = gstr(param,tesd,0))
  657. X        goto RETURN;
  658. X    shm->Lline[0] = 0;
  659. X    if(strncmp(tesd->pb,"/dev/",5))
  660. X        strcat(shm->Lline,"/dev/");
  661. X    strncat(shm->Lline,tesd->pb,sizeof(shm->Lline) - strlen(shm->Lline));
  662. X    shm->Lline[sizeof(shm->Lline) - 1] = 0;
  663. X    if(proctrace)
  664. X        pprintf("line set to %s\n",shm->Lline);
  665. X
  666. XRETURN:
  667. X    esdfree(tesd);
  668. X    return(erc);
  669. X}    /* end of pcmd_setline */
  670. X
  671. X/* vi: set tabstop=4 shiftwidth=4: */
  672. X/* end of pcmd.c */
  673. SHAR_EOF
  674. echo 'File pcmd.c is complete' &&
  675. chmod 0644 pcmd.c ||
  676. echo 'restore of pcmd.c failed'
  677. Wc_c="`wc -c < 'pcmd.c'`"
  678. test 31521 -eq "$Wc_c" ||
  679.     echo 'pcmd.c: original size 31521, current size' "$Wc_c"
  680. rm -f _shar_wnt_.tmp
  681. fi
  682. # ============= pcmdfile.c ==============
  683. if test -f 'pcmdfile.c' -a X"$1" != X"-c"; then
  684.     echo 'x - skipping pcmdfile.c (File already exists)'
  685.     rm -f _shar_wnt_.tmp
  686. else
  687. > _shar_wnt_.tmp
  688. echo 'x - extracting pcmdfile.c (Text)'
  689. sed 's/^X//' << 'SHAR_EOF' > 'pcmdfile.c' &&
  690. X/*+-------------------------------------------------------------------------
  691. X    pcmdfile.c - ecu file-related procedure commands
  692. X    wht@n4hgf.Mt-Park.GA.US
  693. X
  694. X  Defined functions:
  695. X    _file_not_open(filenum)
  696. X    _gfilenum(param,filenum)
  697. X    _param_to_stat(param,pstat_rtnd)
  698. X    ifunc_fatime(param,pvalue)
  699. X    ifunc_fmode(param,pvalue)
  700. X    ifunc_fmtime(param,pvalue)
  701. X    ifunc_fsize(param,pvalue)
  702. X    ifunc_ftell(param,pvalue)
  703. X    ifunc_ischr(param,pvalue)
  704. X    ifunc_isdir(param,pvalue)
  705. X    ifunc_isreg(param,pvalue)
  706. X    pcmd_fchmod(param)
  707. X    pcmd_fclose(param)
  708. X    pcmd_fdel(param)
  709. X    pcmd_fgetc(param)
  710. X    pcmd_fgets(param)
  711. X    pcmd_fopen(param)
  712. X    pcmd_fputc(param)
  713. X    pcmd_fputs(param)
  714. X    pcmd_fread(param)
  715. X    pcmd_fseek(param)
  716. X    pcmd_fwrite(param)
  717. X    pcmd_mkdir(param)
  718. X    pcmd_pclose(param)
  719. X    pcmd_popen(param)
  720. X    proc_file_reset()
  721. X    str_to_filemode(modestr,filemode)
  722. X
  723. X--------------------------------------------------------------------------*/
  724. X/*+:EDITS:*/
  725. X/*:09-10-1992-14:00-wht@n4hgf-ECU release 3.20 */
  726. X/*:08-22-1992-15:39-wht@n4hgf-ECU release 3.20 BETA */
  727. X/*:07-03-1992-12:48-wht@n4hgf-why not let fchmod set any bits? */
  728. X/*:07-25-1991-12:59-wht@n4hgf-ECU release 3.10 */
  729. X/*:06-27-1991-13:45-wht@n4hgf-$i0 wasn't always plugged on failures */
  730. X/*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
  731. X
  732. X#include "ecu.h"
  733. X#include "ecukey.h"
  734. X#include "ecuerror.h"
  735. X#include "esd.h"
  736. X#include "var.h"
  737. X#include "proc.h"
  738. X
  739. X#if !defined(S_IRUSR)
  740. X#define    S_IRUSR    00400        /* read permission: owner */
  741. X#define    S_IWUSR    00200        /* write permission: owner */
  742. X#define    S_IXUSR    00100        /* execute permission: owner */
  743. X#define    S_IRWXG    00070        /* read, write, execute: group */
  744. X#define    S_IRGRP    00040        /* read permission: group */
  745. X#define    S_IWGRP    00020        /* write permission: group */
  746. X#define    S_IXGRP    00010        /* execute permission: group */
  747. X#define    S_IRWXO    00007        /* read, write, execute: other */
  748. X#define    S_IROTH    00004        /* read permission: other */
  749. X#define    S_IWOTH    00002        /* write permission: other */
  750. X#define    S_IXOTH    00001        /* execute permission: other */
  751. X#endif
  752. X
  753. Xextern PCB *pcb_stack[];
  754. X
  755. X#define FILE_MAX    5
  756. X
  757. Xtypedef struct pfile_struct
  758. X{
  759. X    FILE *f;    /* file pointer */
  760. X    ESD *n;        /* file name */
  761. X} PFILE;
  762. X
  763. XPFILE pfile[FILE_MAX];
  764. X
  765. Xchar fwrite_error_fmt[] = "file %d write error (not open for write?)\n";
  766. X
  767. X/*+-------------------------------------------------------------------------
  768. X    proc_file_reset()
  769. X--------------------------------------------------------------------------*/
  770. Xvoid
  771. Xproc_file_reset()
  772. X{
  773. Xregister itmp;
  774. X
  775. X    for(itmp = 0; itmp < FILE_MAX; itmp++)
  776. X    {
  777. X        if(pfile[itmp].f)
  778. X        {
  779. X            fclose(pfile[itmp].f);
  780. X            pfile[itmp].f = (FILE *)0;
  781. X            esdfree(pfile[itmp].n);
  782. X        }
  783. X    }
  784. X}    /* end of proc_file_reset */
  785. X
  786. X/*+-------------------------------------------------------------------------
  787. X    _file_not_open(filenum)
  788. X--------------------------------------------------------------------------*/
  789. Xint
  790. X_file_not_open(filenum)
  791. Xint filenum;
  792. X{
  793. X    pprintf("file %d not open\n",filenum);
  794. X    return(eFATAL_ALREADY);
  795. X}    /* end of _file_not_open */
  796. X
  797. X/*+-------------------------------------------------------------------------
  798. X    _gfilenum(param,filenum)
  799. X--------------------------------------------------------------------------*/
  800. Xint
  801. X_gfilenum(param,filenum)
  802. XESD *param;
  803. Xint *filenum;
  804. X{
  805. Xint erc;
  806. Xulong lvarnum;
  807. Xint old_index;
  808. X
  809. X    skip_cmd_break(param);
  810. X    old_index = param->old_index;
  811. X    if(erc = gint(param,&lvarnum))
  812. X        return(erc);
  813. X    if(lvarnum > FILE_MAX)
  814. X        return(eBadFileNumber);
  815. X    *filenum = (int)lvarnum;
  816. X    param->old_index = old_index;
  817. X    return(0);
  818. X}    /* end of _gfilenum */
  819. X
  820. X/*+-------------------------------------------------------------------------
  821. X    str_to_filemode(modestr,filemode) - "rwxrwxrwx" to mode integer
  822. X--------------------------------------------------------------------------*/
  823. Xstr_to_filemode(modestr,filemode)
  824. Xchar *modestr;
  825. Xlong *filemode;
  826. X{
  827. Xregister i;
  828. Xregister mode = 0;
  829. Xint erc = 0;
  830. X
  831. X    if(strlen(modestr) != 9)
  832. X    {
  833. X        pprintf("bad length: '%s'\n",modestr);
  834. X        return(eFATAL_ALREADY);
  835. X    }
  836. X
  837. X    for(i=0; i < 9; i++)
  838. X    {
  839. X        switch(modestr[i])
  840. X        {
  841. X
  842. X        case 'r':
  843. X            if(i == 0)
  844. X                mode |= S_IRUSR;
  845. X            else if(i == 3)
  846. X                mode |= S_IRGRP;
  847. X            else if(i == 6)
  848. X                mode |= S_IROTH;
  849. X            else
  850. X                erc = eSyntaxError;
  851. X            break;
  852. X
  853. X
  854. X        case 'w':
  855. X            if(i == 1)
  856. X                mode |= S_IWUSR;
  857. X            else if(i == 4)
  858. X                mode |= S_IWGRP;
  859. X            else if(i == 7)
  860. X                mode |= S_IWOTH;
  861. X            else
  862. X                erc = eSyntaxError;
  863. X            break;
  864. X
  865. X
  866. X        case 'x':
  867. X            if(i == 2)
  868. X                mode |= S_IXUSR;
  869. X            else if(i == 5)
  870. X                mode |= S_IXGRP;
  871. X            else if(i == 8)
  872. X                mode |= S_IXOTH;
  873. X            else
  874. X                erc = eSyntaxError;
  875. X            break;
  876. X
  877. X
  878. X        case 's':
  879. X            if(i == 2)
  880. X            {
  881. X                mode |= S_ISUID;
  882. X                mode |= S_IXUSR;
  883. X            }
  884. X            else if(i == 5)
  885. X            {
  886. X                mode |= S_ISGID;
  887. X                mode |= S_IXGRP;
  888. X            }
  889. X            else if(i == 7)
  890. X            {
  891. X                mode |= S_ISGID;
  892. X                mode |= S_IXGRP;
  893. X            }
  894. X            else
  895. X                erc = eSyntaxError;
  896. X            break;
  897. X
  898. X
  899. X        case 't':
  900. X#if defined(FULL_FEATURE_CHMODE)
  901. X            if(i == 8)
  902. X            {
  903. X                mode |= S_ISVTX;
  904. X                mode |= S_IXOTH;
  905. X            }
  906. X            else
  907. X                erc = eSyntaxError;
  908. X#else
  909. X            pputs("set sticky bit not allowed\n");
  910. X            erc = eFATAL_ALREADY;
  911. X#endif /* defined(FULL_FEATURE_CHMODE) */
  912. X            break;
  913. X        case 'l':
  914. X            if(i == 5)
  915. X            {
  916. X                mode |= S_ISGID;
  917. X                mode &= ~S_IXGRP;
  918. X            }
  919. X            else
  920. X                erc = eSyntaxError;
  921. X            break;
  922. X        case '-':
  923. X            break;
  924. X        default:
  925. X            erc = eSyntaxError;
  926. X        }    /* end switch */
  927. X
  928. X        if(erc)
  929. X            break;
  930. X
  931. X    }        /* end for */
  932. X
  933. X    if(erc)
  934. X    {
  935. X        if(erc != eFATAL_ALREADY)
  936. X            pputs("invalid mode specifier\n");
  937. X        pputs(modestr);
  938. X        while(i--)
  939. X            pputc(' ');
  940. X        pputs("^\n");
  941. X        
  942. X    }
  943. X    else
  944. X        *filemode = (long)mode;
  945. X
  946. X    return(erc);
  947. X
  948. X}    /* end of str_to_filemode */
  949. X
  950. X/*+-------------------------------------------------------------------------
  951. X    pcmd_fgetc(param)
  952. X
  953. Xfgetc <filenum-int> [$][i<varspec> | $s<varspec>]
  954. Xint variable receives 0 if EOF
  955. Xstr var receives null str on eof
  956. X--------------------------------------------------------------------------*/
  957. Xint
  958. Xpcmd_fgetc(param)
  959. XESD *param;
  960. X{
  961. Xint erc;
  962. Xint filenum;
  963. Xint vartype;
  964. Xint inchar;
  965. XESD *svptr;
  966. Xlong *ivptr;
  967. X
  968. X    if(!proc_level)
  969. X        return(eNotExecutingProc);
  970. X
  971. X    if(erc = _gfilenum(param,&filenum))
  972. X        return(erc);
  973. X
  974. X    if(!pfile[filenum].f)
  975. X        return(_file_not_open(filenum));
  976. X
  977. X    skip_cmd_char(param,'$');
  978. X    if((param->index >= param->cb) ||
  979. X        ( ((vartype = to_lower(*(param->pb + param->index))) != 'i') &&
  980. X            (vartype != 's')))
  981. X        return(eIllegalVarType);
  982. X    param->index++;
  983. X    switch(vartype)
  984. X    {
  985. X        case 'i':
  986. X            erc = get_ivptr(param,&ivptr,1);
  987. X            break;
  988. X        default:
  989. X            erc = get_svptr(param,&svptr,1);
  990. X            break;
  991. X    }
  992. X    if(erc)
  993. X        return(erc);
  994. X
  995. X    if((inchar = fgetc(pfile[filenum].f)) == EOF)
  996. X    {
  997. X        if(proctrace)
  998. X            pputs("fgetc EOF\n");
  999. X        if(vartype == 'i')
  1000. X            *ivptr = -1;
  1001. X        else
  1002. X            esdzero(svptr);
  1003. X    }
  1004. X    else if(vartype == 'i')
  1005. X        *ivptr = inchar;
  1006. X    else
  1007. X    {
  1008. X        *svptr->pb = inchar;
  1009. X        svptr->cb = 1;
  1010. X    }
  1011. X
  1012. X    if(proctrace)
  1013. X    {
  1014. X        pputs("fgetc set ");
  1015. X        pputs((vartype == 'i') ? "int" : "str");
  1016. X        pprintf(" var = %lu (0x%02x)\n",inchar,inchar);
  1017. X    }
  1018. X    return(0);
  1019. X
  1020. X}    /* end of pcmd_fgetc */
  1021. X
  1022. X/*+-------------------------------------------------------------------------
  1023. X    pcmd_fread(param)
  1024. X--------------------------------------------------------------------------*/
  1025. X/*ARGSUSED*/
  1026. Xint
  1027. Xpcmd_fread(param)
  1028. XESD *param;
  1029. X{
  1030. X    return(eNotImplemented);
  1031. X}    /* end of pcmd_fread */
  1032. X
  1033. X/*+-------------------------------------------------------------------------
  1034. X    pcmd_fgets(param)
  1035. Xfgetc <filenum-int> [$][s]<varspec>
  1036. X--------------------------------------------------------------------------*/
  1037. Xint
  1038. Xpcmd_fgets(param)
  1039. XESD *param;
  1040. X{
  1041. Xint erc;
  1042. Xint filenum;
  1043. Xchar ctmp;
  1044. XESD *svptr;
  1045. X
  1046. X    if(!proc_level)
  1047. X        return(eNotExecutingProc);
  1048. X
  1049. X    if(erc = _gfilenum(param,&filenum))
  1050. X        return(erc);
  1051. X
  1052. X    if(!pfile[filenum].f)
  1053. X        return(_file_not_open(filenum));
  1054. X
  1055. X    skip_cmd_char(param,'$');
  1056. X    if(erc = get_cmd_char(param,&ctmp))
  1057. X        return(erc);
  1058. X    if(to_lower(ctmp) != 's')
  1059. X        return(eIllegalVarType);
  1060. X    if(erc = get_svptr(param,&svptr,1))
  1061. X        return(erc);
  1062. X    *svptr->pb = 0;
  1063. X    svptr->cb = 0;
  1064. X    if(!(iv[0] = !fgets(svptr->pb,svptr->maxcb + 1,pfile[filenum].f)))
  1065. X    {
  1066. X        svptr->cb = strlen(svptr->pb);
  1067. X        if(*(svptr->pb + svptr->cb - 1) == NL)
  1068. X        {
  1069. X            svptr->cb--;
  1070. X            esd_null_terminate(svptr);
  1071. X        }
  1072. X    }
  1073. X    if(proctrace)
  1074. X        pprintf("fgets set str var = '%s'\n",svptr->pb);
  1075. X    return(0);
  1076. X
  1077. X}    /* end of pcmd_fgets */
  1078. X
  1079. X/*+-------------------------------------------------------------------------
  1080. X    pcmd_fclose(param)
  1081. Xfclose <filenum-int>
  1082. X--------------------------------------------------------------------------*/
  1083. Xint
  1084. Xpcmd_fclose(param)
  1085. XESD *param;
  1086. X{
  1087. Xint erc;
  1088. Xint filenum;
  1089. X
  1090. X    if(!proc_level)
  1091. X        return(eNotExecutingProc);
  1092. X
  1093. X    if(erc = _gfilenum(param,&filenum))
  1094. X        return(erc);
  1095. X
  1096. X    if(pfile[filenum].f)
  1097. X    {
  1098. X        fclose(pfile[filenum].f);
  1099. X        pfile[filenum].f = (FILE *)0;
  1100. X        esdfree(pfile[filenum].n);
  1101. X    }
  1102. X
  1103. X    return(0);
  1104. X
  1105. X}    /* end of pcmd_fclose */
  1106. X
  1107. X/*+-------------------------------------------------------------------------
  1108. X    pcmd_fputc(param)
  1109. Xfputc <file-num> <int>
  1110. Xfputc <file-num> <str>
  1111. X--------------------------------------------------------------------------*/
  1112. Xint
  1113. Xpcmd_fputc(param)
  1114. XESD *param;
  1115. X{
  1116. Xint erc;
  1117. Xint filenum;
  1118. XESD *buf = (ESD *)0;
  1119. Xchar outchar = 0;
  1120. Xlong outlong;
  1121. X
  1122. X    if(!proc_level)
  1123. X        return(eNotExecutingProc);
  1124. X
  1125. X    if(erc = _gfilenum(param,&filenum))
  1126. X        return(erc);
  1127. X
  1128. X    if(!pfile[filenum].f)
  1129. X        return(_file_not_open(filenum));
  1130. X
  1131. X    if(!gint(param,&outlong))
  1132. X        outchar = (char)outlong;
  1133. X    else
  1134. X    {
  1135. X        if((buf = esdalloc(64)) == (ESD *)0)
  1136. X            return(eNoMemory);
  1137. X        if(erc = gstr(param,buf,1))
  1138. X            goto RETURN;
  1139. X        if(!buf->cb)
  1140. X        {
  1141. X            pputs("cannot fputc: zero length string\n");
  1142. X            erc = eFATAL_ALREADY;
  1143. X            goto RETURN;
  1144. X        }
  1145. X        outchar = *buf->pb;
  1146. X    }
  1147. X
  1148. X    if(fputc(outchar,pfile[filenum].f) < 0)
  1149. X    {
  1150. X        pprintf(fwrite_error_fmt,filenum);
  1151. X        erc = eFATAL_ALREADY;
  1152. X    }
  1153. X
  1154. XRETURN:
  1155. X    if(buf)
  1156. X        esdfree(buf);
  1157. X    return(erc);
  1158. X}    /* end of pcmd_fputc */
  1159. X
  1160. X/*+-------------------------------------------------------------------------
  1161. X    pcmd_fopen(param)
  1162. X
  1163. Xfopen [-<fopen_switches>] <filenum-int> <filename-str>
  1164. Xsets $i0 with result
  1165. X--------------------------------------------------------------------------*/
  1166. Xint
  1167. Xpcmd_fopen(param)
  1168. XESD *param;
  1169. X{
  1170. Xint erc;
  1171. Xint filenum;
  1172. XESD *fname = (ESD *)0;
  1173. Xchar switches[8];
  1174. X
  1175. X    if(!proc_level)
  1176. X        return(eNotExecutingProc);
  1177. X
  1178. X    if(get_switches(param,switches,sizeof(switches)))
  1179. X    {
  1180. X        strcpy(switches,"-r");
  1181. X        if(proctrace)
  1182. X        {
  1183. X            pputs("Warning: fopen defaulting to read\n");
  1184. X            show_error_position(pcb_stack[proc_level - 1]);
  1185. X        }
  1186. X    }
  1187. X
  1188. X    if(erc = _gfilenum(param,&filenum))
  1189. X        return(erc);
  1190. X
  1191. X    if(pfile[filenum].f)
  1192. X    {
  1193. X        pprintf("file %d already open\n",filenum);
  1194. X        return(eFATAL_ALREADY);
  1195. X    }
  1196. X
  1197. X    if((fname = esdalloc(256)) == (ESD *)0)
  1198. X        return(eNoMemory);
  1199. X
  1200. X    if(erc = gstr(param,fname,1))
  1201. X        goto RETURN;
  1202. X
  1203. X    iv[0] = 0;
  1204. X    if(pfile[filenum].f = fopen(fname->pb,switches + 1))
  1205. X    {
  1206. X        iv[0] = (long)errno;
  1207. X        if(proctrace)
  1208. X        {
  1209. X            pprintf("'%s'",fname->pb);
  1210. X            pperror(" ");
  1211. X        }
  1212. X    }
  1213. X    else if(proctrace)
  1214. X        pprintf("opened '%s' as file %d\n",fname->pb,filenum);
  1215. X
  1216. X    if(!erc)
  1217. X        pfile[filenum].n = fname;
  1218. X
  1219. XRETURN:
  1220. X    if(erc)
  1221. X        esdfree(fname);
  1222. X    return(erc);
  1223. X}    /* end of pcmd_fopen */
  1224. X
  1225. X/*+-------------------------------------------------------------------------
  1226. X    pcmd_fputs(param)
  1227. Xfputs [-n] <filenum-int> <str>
  1228. X-n do not output newline after <str>
  1229. X<filenum-int> file number for operation
  1230. X<str> string to write to file
  1231. X--------------------------------------------------------------------------*/
  1232. Xint
  1233. Xpcmd_fputs(param)
  1234. XESD *param;
  1235. X{
  1236. Xint erc;
  1237. Xint filenum;
  1238. XESD *buf = (ESD *)0;
  1239. Xchar switches[8];
  1240. X
  1241. X    if(!proc_level)
  1242. X        return(eNotExecutingProc);
  1243. X
  1244. X    get_switches(param,switches,sizeof(switches));
  1245. X
  1246. X    if(erc = _gfilenum(param,&filenum))
  1247. X        return(erc);
  1248. X
  1249. X    if(!pfile[filenum].f)
  1250. X        return(_file_not_open(filenum));
  1251. X
  1252. X    if((buf = esdalloc(256)) == (ESD *)0)
  1253. X        return(eNoMemory);
  1254. X
  1255. X    if(erc = gstr(param,buf,1))
  1256. X        goto RETURN;
  1257. X
  1258. X    if(!fputs(buf->pb,pfile[filenum].f) && strlen(buf->pb))
  1259. X    {
  1260. X        pprintf(fwrite_error_fmt,filenum);
  1261. X        erc = eFATAL_ALREADY;
  1262. X        goto RETURN;
  1263. X    }
  1264. X
  1265. X    if(!strchr(switches,'n'))
  1266. X        fputc(NL,pfile[filenum].f);
  1267. X
  1268. XRETURN:
  1269. X    esdfree(buf);
  1270. X    return(erc);
  1271. X}    /* end of pcmd_fputs */
  1272. X
  1273. X/*+-------------------------------------------------------------------------
  1274. X    pcmd_fwrite(param)
  1275. Xfwrite <filenum-int> <str>
  1276. X--------------------------------------------------------------------------*/
  1277. X/*ARGSUSED*/
  1278. Xint
  1279. Xpcmd_fwrite(param)
  1280. XESD *param;
  1281. X{
  1282. X    return(eNotImplemented);
  1283. X#ifdef USE_FWRITE
  1284. Xint erc;
  1285. Xint filenum;
  1286. XESD *buf = (ESD *)0;
  1287. X
  1288. X    if(!proc_level)
  1289. X        return(eNotExecutingProc);
  1290. X
  1291. X    if(erc = _gfilenum(param,&filenum))
  1292. X        return(erc);
  1293. X
  1294. X    if(!pfile[filenum].f)
  1295. X        return(_file_not_open(filenum));
  1296. X
  1297. X    if((buf = esdalloc(256)) == (ESD *)0)
  1298. X        return(eNoMemory);
  1299. X
  1300. X    if(erc = gstr(param,buf,1))
  1301. X        goto RETURN;
  1302. X
  1303. X    if(!fputs(buf->pb,pfile[filenum].f) && strlen(buf->pb))
  1304. X    {
  1305. X        pprintf(fwrite_error_fmt,filenum);
  1306. X        erc = eFATAL_ALREADY;
  1307. X    }
  1308. X
  1309. XRETURN:
  1310. X    esdfree(buf);
  1311. X    return(erc);
  1312. X#endif
  1313. X}    /* end of pcmd_fwrite */
  1314. X
  1315. X/*+-------------------------------------------------------------------------
  1316. X    pcmd_fchmod(param)
  1317. X
  1318. Xfchmod <mode-str> | <mode-int> <filenum-int> | <filename-str>
  1319. X$i0 = 0 if successful, else errno
  1320. X--------------------------------------------------------------------------*/
  1321. Xint
  1322. Xpcmd_fchmod(param)
  1323. XESD *param;
  1324. X{
  1325. X    int erc;
  1326. X    int filenum;
  1327. X    ESD *fname = (ESD *)0;
  1328. X    ESD *mode = (ESD *)0;
  1329. X    long new_mode;
  1330. X    char *path = "??";;
  1331. X
  1332. X    if((fname = esdalloc(256)) == (ESD *)0)
  1333. X        return(eNoMemory);
  1334. X
  1335. X    if((mode = esdalloc(64)) == (ESD *)0)
  1336. X    {
  1337. X        esdfree(fname);
  1338. X        return(eNoMemory);
  1339. X    }
  1340. X
  1341. X    if(erc = skip_cmd_break(param))
  1342. X        goto RETURN;
  1343. X    else if(!gstr(param,mode,0))
  1344. X    {
  1345. X        if(erc = str_to_filemode(mode->pb,&new_mode))
  1346. X            goto RETURN;
  1347. X    }
  1348. X    else if(erc = gint(param,&new_mode))
  1349. X    {
  1350. X        erc = eBadParameter;
  1351. X        goto RETURN;
  1352. X    }
  1353. X
  1354. X    if(erc = skip_cmd_break(param))
  1355. X        goto RETURN;
  1356. X    else if(!gstr(param,fname,1))
  1357. X    {
  1358. X        path = fname->pb;
  1359. X        if(iv[0] = (long)(chmod(path,(unsigned short)new_mode)))
  1360. X        {
  1361. X            iv[0] = (long)errno;
  1362. X            if(proctrace)
  1363. X                pperror(path);
  1364. X        }
  1365. X    }
  1366. X    else if(!_gfilenum(param,&filenum))
  1367. X    {
  1368. X        if(!pfile[filenum].f)
  1369. X        {
  1370. X            erc = (_file_not_open(filenum));
  1371. X            iv[0] = EBADF;
  1372. X        }
  1373. X        else if(iv[0] = (long)chmod(pfile[filenum].n->pb,
  1374. X            (unsigned short)new_mode))
  1375. X        {
  1376. X            iv[0] = (long)errno;
  1377. X            if(proctrace)
  1378. X            {
  1379. X                sprintf(fname->pb,"file %d",filenum);
  1380. X                pperror(fname->pb);
  1381. X            }
  1382. X        }
  1383. X        if(!iv[0])
  1384. X            path = pfile[filenum].n->pb;
  1385. X    }
  1386. X    else
  1387. X        erc = eBadParameter;
  1388. X
  1389. X    if(proctrace && !erc && !iv[0])
  1390. X        pprintf("'%s' mode set to %o\n",path,(int)new_mode);
  1391. X
  1392. XRETURN:
  1393. X    esdfree(mode);
  1394. X    esdfree(fname);
  1395. X
  1396. X    return(erc);
  1397. X
  1398. X}    /* end of pcmd_fchmod */
  1399. X
  1400. X/*+-------------------------------------------------------------------------
  1401. X    pcmd_fdel(param)
  1402. X
  1403. Xfdel <filename-str>
  1404. X$i0 = 0 if successful, else errno
  1405. X--------------------------------------------------------------------------*/
  1406. Xint
  1407. Xpcmd_fdel(param)
  1408. XESD *param;
  1409. X{
  1410. Xint erc;
  1411. XESD *fname = (ESD *)0;
  1412. X
  1413. X    if((fname = esdalloc(256)) == (ESD *)0)
  1414. X        return(eNoMemory);
  1415. X
  1416. X    if(erc = gstr(param,fname,1))
  1417. X        goto RETURN;
  1418. X
  1419. X    if(iv[0] = (long)unlink(fname->pb))
  1420. X        iv[0] = (long)errno;
  1421. X
  1422. X    if(proctrace)
  1423. X    {
  1424. X        if(iv[0])
  1425. X            pperror(fname->pb);
  1426. X        else
  1427. X            pprintf("'%s' deleted\n",fname->pb);
  1428. X    }
  1429. X
  1430. XRETURN:
  1431. X    esdfree(fname);
  1432. X    return(erc);
  1433. X}    /* end of pcmd_fdel */
  1434. X
  1435. X/*+-------------------------------------------------------------------------
  1436. X    pcmd_fseek(param)
  1437. Xfseek <filenum-int> <filepos-int>
  1438. Xsets $i0 with result
  1439. X--------------------------------------------------------------------------*/
  1440. Xint
  1441. Xpcmd_fseek(param)
  1442. XESD *param;
  1443. X{
  1444. Xint erc;
  1445. Xint filenum;
  1446. Xlong seekpos;
  1447. X
  1448. X    if(!proc_level)
  1449. X        return(eNotExecutingProc);
  1450. X    if(erc = _gfilenum(param,&filenum))
  1451. X        return(erc);
  1452. X    if(!pfile[filenum].f)
  1453. X        return(_file_not_open(filenum));
  1454. X    if(erc = gint(param,&seekpos))
  1455. X        return(erc);
  1456. X
  1457. X    iv[0] = 0;
  1458. X    if(fseek(pfile[filenum].f,seekpos,0) < 0)
  1459. X    {
  1460. X        iv[0] = (long)errno;
  1461. X        if(proctrace)
  1462. X        {
  1463. X            pprintf("file %d ",filenum);
  1464. X            pperror("seekerror");
  1465. X        }
  1466. X    }
  1467. X    else if(proctrace)
  1468. X        pprintf("file %d set to position %ld\n",filenum,seekpos);
  1469. X
  1470. X    return(erc);
  1471. X
  1472. X}    /* end of pcmd_fseek */
  1473. X
  1474. X/*+-------------------------------------------------------------------------
  1475. X    pcmd_mkdir(param)
  1476. X
  1477. Xmkdir <filename-str>
  1478. X$i0 = 0 if successful, else errno
  1479. X--------------------------------------------------------------------------*/
  1480. Xint
  1481. Xpcmd_mkdir(param)
  1482. XESD *param;
  1483. X{
  1484. Xint erc;
  1485. XESD *fname = (ESD *)0;
  1486. X
  1487. X    if((fname = esdalloc(256)) == (ESD *)0)
  1488. X        return(eNoMemory);
  1489. X
  1490. X    if(erc = gstr(param,fname,1))
  1491. X        goto RETURN;
  1492. X
  1493. X    if(iv[0] = (long)mkdir(fname->pb,0755))
  1494. X        iv[0] = (long)errno;
  1495. X
  1496. X    if(proctrace)
  1497. X    {
  1498. X        if(iv[0])
  1499. X            pperror(fname->pb);
  1500. X        else
  1501. X            pprintf("'%s' deleted\n",fname->pb);
  1502. X    }
  1503. X
  1504. XRETURN:
  1505. X    esdfree(fname);
  1506. X    return(erc);
  1507. X}    /* end of pcmd_mkdir */
  1508. X
  1509. X/*+-------------------------------------------------------------------------
  1510. X    pcmd_pclose(param)
  1511. Xpclose <filenum-int>
  1512. X--------------------------------------------------------------------------*/
  1513. Xint
  1514. Xpcmd_pclose(param)
  1515. XESD *param;
  1516. X{
  1517. Xint erc;
  1518. Xint filenum;
  1519. X
  1520. X    if(!proc_level)
  1521. X        return(eNotExecutingProc);
  1522. X
  1523. X    if(erc = _gfilenum(param,&filenum))
  1524. X        return(erc);
  1525. X
  1526. X    if(pfile[filenum].f)
  1527. X    {
  1528. X        pclose(pfile[filenum].f);
  1529. X        pfile[filenum].f = (FILE *)0;
  1530. X        esdfree(pfile[filenum].n);
  1531. X    }
  1532. X
  1533. X    return(0);
  1534. X
  1535. X}    /* end of pcmd_pclose */
  1536. X
  1537. X/*+-------------------------------------------------------------------------
  1538. X    pcmd_popen(param)
  1539. X
  1540. Xpopen [-<popen_switches>] <filenum-int> <filename-str>
  1541. Xsets $i0 with result
  1542. X--------------------------------------------------------------------------*/
  1543. Xint
  1544. Xpcmd_popen(param)
  1545. XESD *param;
  1546. X{
  1547. Xint erc;
  1548. Xint filenum;
  1549. XESD *fname = (ESD *)0;
  1550. Xchar switches[8];
  1551. X#if !defined(M_UNIX)
  1552. XFILE *popen();
  1553. X#endif
  1554. X
  1555. X    if(!proc_level)
  1556. X        return(eNotExecutingProc);
  1557. X
  1558. X    if(get_switches(param,switches,sizeof(switches)))
  1559. X    {
  1560. X        strcpy(switches,"-r");
  1561. X        if(proctrace)
  1562. X        {
  1563. X            pputs("Warning: popen defaulting to read\n");
  1564. X            show_error_position(pcb_stack[proc_level - 1]);
  1565. X        }
  1566. X    }
  1567. X
  1568. X    if(erc = _gfilenum(param,&filenum))
  1569. X        return(erc);
  1570. X
  1571. X    if(pfile[filenum].f)
  1572. X    {
  1573. X        pprintf("file %d already open\n",filenum);
  1574. X        return(eFATAL_ALREADY);
  1575. X    }
  1576. X
  1577. X    if((fname = esdalloc(256)) == (ESD *)0)
  1578. X        return(eNoMemory);
  1579. X
  1580. X    if(erc = gstr(param,fname,1))
  1581. X        goto RETURN;
  1582. X
  1583. X    iv[0] = 0;
  1584. X    if(pfile[filenum].f = popen(fname->pb,switches + 1))
  1585. X    {
  1586. X        iv[0] = (long)errno;
  1587. X        if(proctrace)
  1588. X        {
  1589. X            pprintf("'%s'",fname->pb);
  1590. X            pperror(" ");
  1591. X        }
  1592. X    }
  1593. X    else if(proctrace)
  1594. X        pprintf("opened '%s' as file %d\n",fname->pb,filenum);
  1595. X
  1596. X    if(!erc)
  1597. X        pfile[filenum].n = fname;
  1598. X
  1599. XRETURN:
  1600. X    if(erc)
  1601. X        esdfree(fname);
  1602. X    return(erc);
  1603. X}    /* end of pcmd_popen */
  1604. X
  1605. X/*+-------------------------------------------------------------------------
  1606. X    ifunc_ftell(param,pvalue)
  1607. X%ftell(<filenum-int>)
  1608. X--------------------------------------------------------------------------*/
  1609. Xint
  1610. Xifunc_ftell(param,pvalue)
  1611. XESD *param;
  1612. Xlong *pvalue;
  1613. X{
  1614. Xint erc;
  1615. Xint filenum;
  1616. Xlong ftell();
  1617. X
  1618. X    if(!proc_level)
  1619. X        return(eNotExecutingProc);
  1620. X    if(erc = skip_paren(param,1))
  1621. X        return(erc);
  1622. X    if(erc = _gfilenum(param,&filenum))
  1623. X        return(erc);
  1624. X    if(!pfile[filenum].f)
  1625. X        return(_file_not_open(filenum));
  1626. X    if(erc = skip_paren(param,0))
  1627. X        return(erc);
  1628. X
  1629. X    *pvalue = ftell(pfile[filenum].f);
  1630. X    return(0);
  1631. X}    /* end of ifunc_ftell */
  1632. X
  1633. X/*+-------------------------------------------------------------------------
  1634. X    _param_to_stat(param,pstat_rtnd)
  1635. X--------------------------------------------------------------------------*/
  1636. Xint
  1637. X_param_to_stat(param,pstat_rtnd)
  1638. XESD *param;
  1639. Xstruct stat **pstat_rtnd;
  1640. X{
  1641. Xint erc;
  1642. Xint filenum;
  1643. Xstatic struct stat fst;
  1644. Xstruct stat *pstat = &fst;
  1645. XESD *fname;
  1646. X
  1647. X    errno = 0;
  1648. X
  1649. X    if(erc = skip_paren(param,1))
  1650. X        return(erc);
  1651. X
  1652. X    if((fname = esdalloc(256)) == (ESD *)0)
  1653. X        return(eNoMemory);
  1654. X
  1655. X    if(!gstr(param,fname,1))
  1656. X    {
  1657. X        if(stat(fname->pb,pstat))
  1658. X            pstat = (struct stat *)0;
  1659. X    }
  1660. X    else if(param->index = param->old_index,!_gfilenum(param,&filenum))
  1661. X    {
  1662. X        if(!pfile[filenum].f)
  1663. X        {
  1664. X            esdfree(fname);
  1665. X            return(_file_not_open(filenum));
  1666. X        }
  1667. X        if(stat(pfile[filenum].n->pb,pstat))
  1668. X            pstat = (struct stat *)0;
  1669. X    }
  1670. X    else
  1671. X        erc = eBadParameter;
  1672. X
  1673. X    esdfree(fname);
  1674. X
  1675. X    if(erc)
  1676. X        return(erc);
  1677. X
  1678. X    if(erc = skip_paren(param,0))
  1679. X        return(erc);
  1680. X
  1681. X    *pstat_rtnd = pstat;
  1682. X    if(proctrace && !pstat)
  1683. X        pperror("stat");
  1684. X    return(0);
  1685. X
  1686. X}    /* end of _param_to_stat */
  1687. X
  1688. X/*+-------------------------------------------------------------------------
  1689. X    ifunc_fsize(param,pvalue)
  1690. X%fsize(<filenum-int>)
  1691. X%fsize('filename')
  1692. X--------------------------------------------------------------------------*/
  1693. Xint
  1694. Xifunc_fsize(param,pvalue)
  1695. XESD *param;
  1696. Xlong *pvalue;
  1697. X{
  1698. Xregister erc;
  1699. Xstruct stat *pstat;
  1700. X
  1701. X    if(erc = _param_to_stat(param,&pstat))
  1702. X        return(erc);
  1703. X    if(!pstat)
  1704. X        *pvalue = -1;
  1705. X    else
  1706. X        *pvalue = pstat->st_size;
  1707. X    return(0);
  1708. X}    /* end of ifunc_fsize */
  1709. X
  1710. X/*+-------------------------------------------------------------------------
  1711. X    ifunc_fatime(param,pvalue)
  1712. X%fatime(<filenum-int>)
  1713. X%fatime('filename')
  1714. X--------------------------------------------------------------------------*/
  1715. Xint
  1716. Xifunc_fatime(param,pvalue)
  1717. XESD *param;
  1718. Xlong *pvalue;
  1719. X{
  1720. Xregister erc;
  1721. Xstruct stat *pstat;
  1722. X
  1723. X    if(erc = _param_to_stat(param,&pstat))
  1724. X        return(erc);
  1725. X    if(!pstat)
  1726. X        *pvalue = -1;
  1727. X    else
  1728. X        *pvalue = pstat->st_atime;
  1729. X    return(0);
  1730. X}    /* end of ifunc_fatime */
  1731. X
  1732. X/*+-------------------------------------------------------------------------
  1733. X    ifunc_fmtime(param,pvalue)
  1734. X%fmtime(<filenum-int>)
  1735. X%fmtime('filename')
  1736. X--------------------------------------------------------------------------*/
  1737. Xint
  1738. Xifunc_fmtime(param,pvalue)
  1739. XESD *param;
  1740. Xlong *pvalue;
  1741. X{
  1742. Xregister erc;
  1743. Xstruct stat *pstat;
  1744. X
  1745. X    if(erc = _param_to_stat(param,&pstat))
  1746. X        return(erc);
  1747. X    if(!pstat)
  1748. X        *pvalue = -1;
  1749. X    else
  1750. X        *pvalue = pstat->st_mtime;
  1751. X    return(0);
  1752. X}    /* end of ifunc_fmtime */
  1753. X
  1754. X/*+-------------------------------------------------------------------------
  1755. X    ifunc_fmode(param,pvalue)
  1756. X%fmode(<filenum-int>)
  1757. X%fmode('filename')
  1758. X--------------------------------------------------------------------------*/
  1759. Xint
  1760. Xifunc_fmode(param,pvalue)
  1761. XESD *param;
  1762. Xlong *pvalue;
  1763. X{
  1764. Xregister erc;
  1765. Xstruct stat *pstat;
  1766. X
  1767. X    if(erc = _param_to_stat(param,&pstat))
  1768. X        return(erc);
  1769. X    if(!pstat)
  1770. X        *pvalue = -1;
  1771. X    else
  1772. X        *pvalue = (long)pstat->st_mode;
  1773. X    return(0);
  1774. X}    /* end of ifunc_fmode */
  1775. X
  1776. X/*+-------------------------------------------------------------------------
  1777. X    ifunc_isreg(param,pvalue)
  1778. X%isreg(<filenum-int>)
  1779. X%isreg('filename')
  1780. X--------------------------------------------------------------------------*/
  1781. Xint
  1782. Xifunc_isreg(param,pvalue)
  1783. XESD *param;
  1784. Xlong *pvalue;
  1785. X{
  1786. Xregister erc;
  1787. X
  1788. X    if(erc = ifunc_fmode(param,pvalue))
  1789. X        return(erc);
  1790. X    if(*pvalue != -1)
  1791. X        *pvalue = ((*pvalue & S_IFMT) == S_IFREG);
  1792. X    return(0);
  1793. X}    /* end of ifunc_isreg */
  1794. X
  1795. X/*+-------------------------------------------------------------------------
  1796. X    ifunc_isdir(param,pvalue)
  1797. X%isdir(<filenum-int>)
  1798. X%isdir('filename')
  1799. X--------------------------------------------------------------------------*/
  1800. Xint
  1801. Xifunc_isdir(param,pvalue)
  1802. XESD *param;
  1803. Xlong *pvalue;
  1804. X{
  1805. Xregister erc;
  1806. X
  1807. X    if(erc = ifunc_fmode(param,pvalue))
  1808. X        return(erc);
  1809. X    if(*pvalue != -1)
  1810. X        *pvalue = ((*pvalue & S_IFMT) == S_IFDIR);
  1811. X    return(0);
  1812. X}    /* end of ifunc_isdir */
  1813. X
  1814. X/*+-------------------------------------------------------------------------
  1815. X    ifunc_ischr(param,pvalue)
  1816. X%ischr(<filenum-int>)
  1817. X%ischr('filename')
  1818. X--------------------------------------------------------------------------*/
  1819. Xint
  1820. Xifunc_ischr(param,pvalue)
  1821. XESD *param;
  1822. Xlong *pvalue;
  1823. X{
  1824. Xregister erc;
  1825. X
  1826. X    if(erc = ifunc_fmode(param,pvalue))
  1827. X        return(erc);
  1828. X    if(*pvalue != -1)
  1829. X        *pvalue = ((*pvalue & S_IFMT) == S_IFCHR);
  1830. X    return(0);
  1831. X}    /* end of ifunc_ischr */
  1832. X
  1833. X/* vi: set tabstop=4 shiftwidth=4: */
  1834. X/* end of pcmdfile.c */
  1835. SHAR_EOF
  1836. chmod 0644 pcmdfile.c ||
  1837. echo 'restore of pcmdfile.c failed'
  1838. Wc_c="`wc -c < 'pcmdfile.c'`"
  1839. test 22996 -eq "$Wc_c" ||
  1840.     echo 'pcmdfile.c: original size 22996, current size' "$Wc_c"
  1841. rm -f _shar_wnt_.tmp
  1842. fi
  1843. # ============= pcmdif.c ==============
  1844. if test -f 'pcmdif.c' -a X"$1" != X"-c"; then
  1845.     echo 'x - skipping pcmdif.c (File already exists)'
  1846.     rm -f _shar_wnt_.tmp
  1847. else
  1848. > _shar_wnt_.tmp
  1849. echo 'x - extracting pcmdif.c (Text)'
  1850. sed 's/^X//' << 'SHAR_EOF' > 'pcmdif.c' &&
  1851. X/*+-------------------------------------------------------------------------
  1852. X    pcmdif.c - ecu if procedure commands
  1853. X    wht@n4hgf.Mt-Park.GA.US
  1854. X
  1855. X    IFI $i0 rel-op $i1 cmd
  1856. X    IFS $s0 rel-op $s1 cmd
  1857. X    IFLT, IFLE, IFZ, IFNZ, IFGE, IFGT $i0
  1858. X
  1859. X    where rel-op is "=", "==", "!=", "<>", ">", "<", ">=", "=<"
  1860. X
  1861. X  Defined functions:
  1862. X    _cmd_ifrel_common(param,relop)
  1863. X    _if_common(param,truth)
  1864. X    get_logicop(param,op_returned)
  1865. X    get_relop(param,op_returned)
  1866. X    get_truth_int(param,truth)
  1867. X    get_truth_str(param,truth)
  1868. X    pcmd_else(param)
  1869. X    pcmd_ifge(param)
  1870. X    pcmd_ifgt(param)
  1871. X    pcmd_ifi(param)
  1872. X    pcmd_ifle(param)
  1873. X    pcmd_iflt(param)
  1874. X    pcmd_ifnz(param)
  1875. X    pcmd_ifs(param)
  1876. X    pcmd_ifz(param)
  1877. X    test_truth_int(int1,relop,int2)
  1878. X
  1879. X--------------------------------------------------------------------------*/
  1880. X/*+:EDITS:*/
  1881. X/*:09-10-1992-14:00-wht@n4hgf-ECU release 3.20 */
  1882. X/*:08-22-1992-15:39-wht@n4hgf-ECU release 3.20 BETA */
  1883. X/*:07-25-1991-12:59-wht@n4hgf-ECU release 3.10 */
  1884. X/*:08-26-1990-22:23-wht@n4hgf-fix zero-relative if commands */
  1885. X/*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
  1886. X
  1887. X#include <ctype.h>
  1888. X#include "ecu.h"
  1889. X#include "ecuerror.h"
  1890. X#include "esd.h"
  1891. X#include "var.h"
  1892. X#include "proc.h"
  1893. X#include "relop.h"
  1894. X
  1895. Xextern PCB *pcb_stack[];
  1896. Xextern int proctrace;
  1897. X
  1898. X#define MAX_IF 40    /* damn enough */
  1899. Xuchar if_level = 0;
  1900. Xuchar truth_already[MAX_IF];
  1901. X
  1902. X/*+-------------------------------------------------------------------------
  1903. X    get_relop(param,&op_returned)
  1904. X--------------------------------------------------------------------------*/
  1905. Xint
  1906. Xget_relop(param,op_returned)
  1907. XESD *param;
  1908. Xint *op_returned;
  1909. X{
  1910. X    if(end_of_cmd(param))
  1911. X        return(eInvalidRelOp);
  1912. X
  1913. X    switch(param->pb[param->index++]) /* index decremented in default */
  1914. X    {
  1915. X    case '=':
  1916. X        if((param->cb != param->index) && (param->pb[param->index] == '='))
  1917. X            param->index++;
  1918. X        *op_returned = OP_EQ;
  1919. X        return(0);
  1920. X
  1921. X    case '!':
  1922. X        if(param->cb == param->index)
  1923. X            return(eInvalidRelOp);
  1924. X        switch(param->pb[param->index])
  1925. X        {
  1926. X        case '=':
  1927. X            param->index++;
  1928. X            *op_returned = OP_NE;
  1929. X            return(0);
  1930. X        default:
  1931. X            return(eInvalidRelOp);
  1932. X        }
  1933. X
  1934. X    case '<':
  1935. X        if(param->cb == param->index)
  1936. X        {
  1937. X            *op_returned = OP_LT;
  1938. X            return(0);
  1939. X        }
  1940. X        switch(param->pb[param->index])
  1941. X        {
  1942. X        case '>':
  1943. X            param->index++;
  1944. X            *op_returned = OP_NE;
  1945. X            return(0);
  1946. X        case '=':
  1947. X            param->index++;
  1948. X            *op_returned = OP_LE;
  1949. X            return(0);
  1950. X        default:
  1951. X            *op_returned = OP_LT;
  1952. X            return(0);
  1953. X        }
  1954. X
  1955. X    case '>':
  1956. X        if(param->cb == param->index)
  1957. X        {
  1958. X            *op_returned = OP_LT;
  1959. X            return(0);
  1960. X        }
  1961. X        switch(param->pb[param->index])
  1962. X        {
  1963. X        case '=':
  1964. X            param->index++;
  1965. X            *op_returned = OP_GE;
  1966. X            return(0);
  1967. X        default:
  1968. X            *op_returned = OP_GT;
  1969. X            return(0);
  1970. X        }
  1971. X    default:
  1972. X        param->index--;
  1973. X    }
  1974. X    return(eInvalidRelOp);
  1975. X}   /* end of get_relop */
  1976. X
  1977. X/*+-------------------------------------------------------------------------
  1978. X    get_logicop(param,op_returned)
  1979. X--------------------------------------------------------------------------*/
  1980. Xint
  1981. Xget_logicop(param,op_returned)
  1982. XESD *param;
  1983. Xint *op_returned;
  1984. X{
  1985. Xregister erc;
  1986. Xregister char *cptr;
  1987. X
  1988. X    if(erc = skip_cmd_break(param))
  1989. X        return(eInvalidLogicOp);
  1990. X
  1991. X    if((param->cb - param->index) < 2)
  1992. X        return(eInvalidLogicOp);
  1993. X
  1994. X    cptr = param->pb + param->index;
  1995. X    erc = eInvalidLogicOp;
  1996. X    if(!strncmp(cptr,"&&",2))
  1997. X    {
  1998. X        *op_returned = OP_AND;
  1999. X        erc = 0;
  2000. X    }
  2001. X    else if(!strncmp(cptr,"||",2))
  2002. X    {
  2003. X        *op_returned = OP_OR;
  2004. X        erc = 0;
  2005. X    }
  2006. X    if(!erc)
  2007. X        param->index += 2;
  2008. X    return(erc);
  2009. X
  2010. X}    /* end of get_logicop */
  2011. X
  2012. X/*+-------------------------------------------------------------------------
  2013. X    test_truth_int(int1,relop,int2)
  2014. X--------------------------------------------------------------------------*/
  2015. Xint
  2016. Xtest_truth_int(int1,relop,int2)
  2017. Xlong int1;
  2018. Xint relop;
  2019. Xlong int2;
  2020. X{
  2021. Xregister truth = 0;
  2022. X
  2023. X    switch(relop)
  2024. X    {
  2025. X    case OP_EQ:
  2026. X        truth = (int1 == int2);
  2027. X        break;
  2028. X    case OP_NE:
  2029. X        truth = (int1 != int2);
  2030. X        break;
  2031. X    case OP_GT:
  2032. X        truth = (int1 > int2);
  2033. X        break;
  2034. X    case OP_LT:
  2035. X        truth = (int1 < int2);
  2036. X        break;
  2037. X    case OP_GE:
  2038. X        truth = (int1 >= int2);
  2039. X        break;
  2040. X    case OP_LE:
  2041. X        truth = (int1 <= int2);
  2042. X        break;
  2043. X    }
  2044. X    return(truth);
  2045. X
  2046. X}    /* end of test_truth_int */
  2047. X
  2048. X/*+-------------------------------------------------------------------------
  2049. X    get_truth_int(param,truth)
  2050. X--------------------------------------------------------------------------*/
  2051. Xint
  2052. Xget_truth_int(param,truth)
  2053. XESD *param;
  2054. Xint *truth;
  2055. X{
  2056. Xregister erc;
  2057. Xlong int1;
  2058. Xlong int2;
  2059. Xint operator;
  2060. Xint truth2;
  2061. X
  2062. X    if(erc = gint(param,&int1))
  2063. X        return(erc);
  2064. X    if(erc = get_relop(param,&operator))
  2065. X        return(erc);
  2066. X    if(erc = gint(param,&int2))
  2067. X        return(erc);
  2068. X    *truth = test_truth_int(int1,operator,int2);
  2069. X
  2070. X    while(!get_logicop(param,&operator))
  2071. X    {
  2072. X        if(erc = get_truth_int(param,&truth2))
  2073. X            return(erc);
  2074. X        switch(operator)
  2075. X        {
  2076. X            case OP_AND:
  2077. X                *truth &= truth2;
  2078. X                break;
  2079. X
  2080. X            case OP_OR:
  2081. X                *truth |= truth2;
  2082. X                break;
  2083. X        }
  2084. X    }
  2085. X    return(0);
  2086. X
  2087. X}    /* end of get_truth_int */
  2088. X
  2089. X/*+-------------------------------------------------------------------------
  2090. X    get_truth_str(param,truth)
  2091. X--------------------------------------------------------------------------*/
  2092. Xint
  2093. Xget_truth_str(param,truth)
  2094. XESD *param;
  2095. Xint *truth;
  2096. X{
  2097. Xregister erc;
  2098. XESD *tesd1 = (ESD *)0;
  2099. XESD *tesd2 = (ESD *)0;
  2100. Xint operator;
  2101. Xint strcmp_result;
  2102. Xint truth2;
  2103. X
  2104. X    if(!(tesd1 = esdalloc(256)) || !(tesd2 = esdalloc(256)))
  2105. X    {
  2106. X        erc = eNoMemory;
  2107. X        goto RETURN;
  2108. X    }    
  2109. X
  2110. X    if(erc = gstr(param,tesd1,1))
  2111. X        goto RETURN;
  2112. X    if(erc = get_relop(param,&operator))
  2113. X        goto RETURN;
  2114. X    if(erc = gstr(param,tesd2,1))
  2115. X        goto RETURN;
  2116. X
  2117. X    strcmp_result = strcmp(tesd1->pb,tesd2->pb);
  2118. X
  2119. X    switch(operator)
  2120. X    {
  2121. X        case OP_EQ:
  2122. X            *truth = (strcmp_result == 0);
  2123. X            break;
  2124. X        case OP_NE:
  2125. X            *truth = (strcmp_result != 0);
  2126. X            break;
  2127. X        case OP_GT:
  2128. X            *truth = (strcmp_result > 0);
  2129. X            break;
  2130. X        case OP_LT:
  2131. X            *truth = (strcmp_result < 0);
  2132. X            break;
  2133. X        case OP_GE:
  2134. X            *truth = (strcmp_result >= 0);
  2135. X            break;
  2136. X        case OP_LE:
  2137. X            *truth = (strcmp_result <= 0);
  2138. X            break;
  2139. X        default:
  2140. X            return(eInvalidStrOp);
  2141. X    }
  2142. X
  2143. X    while(!get_logicop(param,&operator))
  2144. X    {
  2145. X        if(erc = get_truth_str(param,&truth2))
  2146. X            return(erc);
  2147. X        switch(operator)
  2148. X        {
  2149. X            case OP_AND:
  2150. X                *truth &= truth2;
  2151. X                break;
  2152. X
  2153. X            case OP_OR:
  2154. X                *truth |= truth2;
  2155. X                break;
  2156. X        }
  2157. X    }
  2158. X
  2159. X    erc = 0;
  2160. X
  2161. XRETURN:
  2162. X    if(tesd1)
  2163. X        esdfree(tesd1);
  2164. X    if(tesd2)
  2165. X        esdfree(tesd2);
  2166. X    return(erc);
  2167. X
  2168. X}   /* end of get_truth_str */
  2169. X
  2170. X/*+-------------------------------------------------------------------------
  2171. X    _if_common(param,truth)
  2172. X--------------------------------------------------------------------------*/
  2173. Xint
  2174. X_if_common(param,truth)
  2175. XESD *param;
  2176. Xint truth;
  2177. X{
  2178. Xregister erc = 0;
  2179. Xchar s80[80];
  2180. XPCB *pcb;
  2181. XESD *else_line;
  2182. Xint label_on_else_line;
  2183. Xint truth2;
  2184. Xint save_index;
  2185. Xlong int1;
  2186. X
  2187. X    if(proctrace > 1)
  2188. X    {
  2189. X        pprintf("if condition %s",(truth) ? "TRUE: " : "FALSE\n");
  2190. X        if(truth)
  2191. X        {
  2192. X            skip_cmd_break(param);
  2193. X            pputs(param->pb + param->index);
  2194. X            pputc('\n');
  2195. X        }
  2196. X    }
  2197. X
  2198. X    truth_already[if_level] = truth;
  2199. X
  2200. X/* if end of command, execute frame else conditionally execute rest of esd */
  2201. X    s80[0] = 0;
  2202. X    if(end_of_cmd(param))
  2203. X        erc = execute_frame(truth);
  2204. X    else if(truth)
  2205. X        erc = execute_esd(param);
  2206. X    else
  2207. X        param->index = param->cb;
  2208. X
  2209. X    if(erc)
  2210. X        return(erc);
  2211. X
  2212. X/* check for else statement */
  2213. X    pcb = pcb_stack[proc_level - 1];
  2214. X    if(!pcb->current->next)        /* if no next line, no "else" */
  2215. X        return(0);
  2216. X
  2217. X    else_line = pcb->current->next->text;
  2218. X    else_line->index = else_line->old_index = 0;
  2219. X    if(label_on_else_line = (*else_line->pb != 0x20))
  2220. X    {    /* strip label */
  2221. X        if(get_alphanum_zstr(else_line,s80,sizeof(s80)))
  2222. X            return(eInvalidLabel);
  2223. X    }
  2224. X    if(get_alphanum_zstr(else_line,s80,sizeof(s80)))
  2225. X        return(0);        /* not "else" */
  2226. X    if(strcmp(s80,"else"))
  2227. X        return(0);        /* not "else" */
  2228. X    if(label_on_else_line)
  2229. X    {
  2230. X        else_line->old_index = 0;
  2231. X        pputs("label not allowed on else statement\n");
  2232. X        return(eFATAL_ALREADY);
  2233. X    }
  2234. X
  2235. X/* we have an "else" condition */
  2236. X    truth = !truth;
  2237. X    pcb->current = pcb->current->next;
  2238. X
  2239. X    trace_proc_cmd(pcb);
  2240. X
  2241. X    if(end_of_cmd(else_line))
  2242. X        erc = execute_frame(truth);
  2243. X    else
  2244. X    {
  2245. X        save_index = else_line->old_index = else_line->index;
  2246. X        s80[0] = 0;
  2247. X        if((*(else_line->pb + else_line->index) != '$') &&
  2248. X            get_alpha_zstr(else_line,s80,sizeof(s80)))
  2249. X        {
  2250. X            pputs("illegal command after 'else'\n");
  2251. X            return(eFATAL_ALREADY);
  2252. X        }
  2253. X        if(!strcmp(s80,"ifi"))
  2254. X        {
  2255. X            if(erc = get_truth_int(else_line,&truth2))
  2256. X                return(erc);
  2257. X            erc = _if_common(else_line,!truth_already[if_level] & truth2);
  2258. X            truth_already[if_level] |= truth2;
  2259. X        }
  2260. X        else if(!strcmp(s80,"ifs"))
  2261. X        {
  2262. X            if(erc = get_truth_str(else_line,&truth2))
  2263. X                return(erc);
  2264. X            erc = _if_common(else_line,!truth_already[if_level] & truth2);
  2265. X            truth_already[if_level] |= truth2;
  2266. X        }
  2267. X        else if(!strcmp(s80,"ifz"))
  2268. X        {
  2269. X            if(erc = gint(else_line,&int1))
  2270. X                return(erc);
  2271. X            truth2 = test_truth_int(int1,OP_EQ,0L);
  2272. X            erc = _if_common(else_line,!truth_already[if_level] & truth2);
  2273. X            truth_already[if_level] |= truth2;
  2274. X        }
  2275. X        else if(!strcmp(s80,"ifnz"))
  2276. X        {
  2277. X            if(erc = gint(else_line,&int1))
  2278. X                return(erc);
  2279. X            truth2 = test_truth_int(int1,OP_NE,0L);
  2280. X            erc = _if_common(else_line,!truth_already[if_level] & truth2);
  2281. X            truth_already[if_level] |= truth2;
  2282. X        }
  2283. X        else if(!strcmp(s80,"iflt"))
  2284. X        {
  2285. X            if(erc = gint(else_line,&int1))
  2286. X                return(erc);
  2287. X            truth2 = test_truth_int(int1,OP_LT,0L);
  2288. X            erc = _if_common(else_line,!truth_already[if_level] & truth2);
  2289. X            truth_already[if_level] |= truth2;
  2290. X        }
  2291. X        else if(!strcmp(s80,"ifle"))
  2292. X        {
  2293. X            if(erc = gint(else_line,&int1))
  2294. X                return(erc);
  2295. X            truth2 = test_truth_int(int1,OP_LE,0L);
  2296. X            erc = _if_common(else_line,!truth_already[if_level] & truth2);
  2297. X            truth_already[if_level] |= truth2;
  2298. X        }
  2299. X        else if(!strcmp(s80,"ifgt"))
  2300. X        {
  2301. X            if(erc = gint(else_line,&int1))
  2302. X                return(erc);
  2303. X            truth2 = test_truth_int(int1,OP_GT,0L);
  2304. X            erc = _if_common(else_line,!truth_already[if_level] & truth2);
  2305. X            truth_already[if_level] |= truth2;
  2306. X        }
  2307. X        else if(!strcmp(s80,"ifge"))
  2308. X        {
  2309. X            if(erc = gint(else_line,&int1))
  2310. X                return(erc);
  2311. X            truth2 = test_truth_int(int1,OP_GE,0L);
  2312. X            erc = _if_common(else_line,!truth_already[if_level] & truth2);
  2313. X            truth_already[if_level] |= truth2;
  2314. X        }
  2315. X        else if(!strncmp(s80,"while",5))
  2316. X        {
  2317. X            pputs("'while' command not allowed as 'else' conditional\n");
  2318. X            return(eFATAL_ALREADY);
  2319. X        }
  2320. X        else
  2321. X        {
  2322. X            else_line->index = save_index;
  2323. X            if(truth)
  2324. X                erc = execute_esd(else_line);
  2325. X        }
  2326. X    }
  2327. X
  2328. X    return(erc);
  2329. X}    /* end of _if_common */
  2330. X
  2331. X/*+-------------------------------------------------------------------------
  2332. X    pcmd_ifi(param)
  2333. X--------------------------------------------------------------------------*/
  2334. Xint
  2335. Xpcmd_ifi(param)
  2336. XESD *param;
  2337. X{
  2338. Xregister erc;
  2339. Xint truth;
  2340. X
  2341. X    if(!proc_level)
  2342. X        return(eNotExecutingProc);
  2343. X
  2344. X    if(if_level == MAX_IF)
  2345. X    {
  2346. X        pputs("if statements nested too deeply\n");
  2347. X        return(eFATAL_ALREADY);
  2348. X    }
  2349. X    if_level++;
  2350. X    truth_already[if_level] = 0;
  2351. X
  2352. X    if(!(erc = get_truth_int(param,&truth)))
  2353. X        erc = _if_common(param,truth);
  2354. X    if_level--;
  2355. X    return(erc);
  2356. X
  2357. X}   /* end of pcmd_ifi */
  2358. X
  2359. X/*+-------------------------------------------------------------------------
  2360. X    _cmd_ifrel_common(param,relop)
  2361. X--------------------------------------------------------------------------*/
  2362. Xint
  2363. X_cmd_ifrel_common(param,relop)
  2364. XESD *param;
  2365. Xint relop;
  2366. X{
  2367. Xregister erc;
  2368. Xint truth;
  2369. Xlong int1;
  2370. X
  2371. X    if(!proc_level)
  2372. X        return(eNotExecutingProc);
  2373. X
  2374. X    if(if_level == MAX_IF)
  2375. X    {
  2376. X        pputs("if statements nested too deeply\n");
  2377. X        return(eFATAL_ALREADY);
  2378. X    }
  2379. X    if_level++;
  2380. X    truth_already[if_level] = 0;
  2381. X
  2382. X    if(erc = gint(param,&int1))
  2383. X        return(erc);
  2384. X    truth = test_truth_int(int1,relop,0L);
  2385. X    erc = _if_common(param,truth);
  2386. X    if_level--;
  2387. X    return(erc);
  2388. X
  2389. X}    /* end of _cmd_ifrel_common */
  2390. X
  2391. X/*+-------------------------------------------------------------------------
  2392. X    pcmd_ifz(param)
  2393. X--------------------------------------------------------------------------*/
  2394. Xint
  2395. Xpcmd_ifz(param)
  2396. XESD *param;
  2397. X{
  2398. X    return(_cmd_ifrel_common(param,OP_EQ));
  2399. X}    /* end of pcmd_ifz */
  2400. X
  2401. X/*+-------------------------------------------------------------------------
  2402. X    pcmd_ifnz(param)
  2403. X--------------------------------------------------------------------------*/
  2404. Xint
  2405. Xpcmd_ifnz(param)
  2406. XESD *param;
  2407. X{
  2408. X    return(_cmd_ifrel_common(param,OP_NE));
  2409. X}    /* end of pcmd_ifnz */
  2410. X
  2411. X/*+-------------------------------------------------------------------------
  2412. X    pcmd_ifle(param)
  2413. X--------------------------------------------------------------------------*/
  2414. Xint
  2415. Xpcmd_ifle(param)
  2416. XESD *param;
  2417. X{
  2418. X    return(_cmd_ifrel_common(param,OP_LE));
  2419. X}    /* end of pcmd_ifle */
  2420. X
  2421. X/*+-------------------------------------------------------------------------
  2422. X    pcmd_ifge(param)
  2423. X--------------------------------------------------------------------------*/
  2424. Xint
  2425. Xpcmd_ifge(param)
  2426. XESD *param;
  2427. X{
  2428. X    return(_cmd_ifrel_common(param,OP_GE));
  2429. X}    /* end of pcmd_ifge */
  2430. X
  2431. X/*+-------------------------------------------------------------------------
  2432. X    pcmd_iflt(param)
  2433. X--------------------------------------------------------------------------*/
  2434. Xint
  2435. Xpcmd_iflt(param)
  2436. XESD *param;
  2437. X{
  2438. X    return(_cmd_ifrel_common(param,OP_LT));
  2439. X}    /* end of pcmd_iflt */
  2440. X
  2441. X/*+-------------------------------------------------------------------------
  2442. X    pcmd_ifgt(param)
  2443. X--------------------------------------------------------------------------*/
  2444. Xint
  2445. Xpcmd_ifgt(param)
  2446. XESD *param;
  2447. X{
  2448. X    return(_cmd_ifrel_common(param,OP_GT));
  2449. X}    /* end of pcmd_ifgt */
  2450. X
  2451. X/*+-------------------------------------------------------------------------
  2452. X    pcmd_ifs(param)
  2453. X--------------------------------------------------------------------------*/
  2454. Xint
  2455. Xpcmd_ifs(param)
  2456. XESD *param;
  2457. X{
  2458. Xregister erc;
  2459. Xint truth;
  2460. X
  2461. X    if(!proc_level)
  2462. X        return(eNotExecutingProc);
  2463. X
  2464. X    if(if_level == MAX_IF)
  2465. X    {
  2466. X        pputs("if statements nested too deeply\n");
  2467. X        return(eFATAL_ALREADY);
  2468. X    }
  2469. X    if_level++;
  2470. X    truth_already[if_level] = 0;
  2471. X
  2472. X    if(!(erc = get_truth_str(param,&truth)))
  2473. X        erc = _if_common(param,truth);
  2474. X    if_level--;
  2475. X    return(erc);
  2476. X
  2477. X}   /* end of pcmd_ifs */
  2478. X
  2479. X/*+-------------------------------------------------------------------------
  2480. X    pcmd_else(param)
  2481. X--------------------------------------------------------------------------*/
  2482. X/*ARGSUSED*/
  2483. Xint
  2484. Xpcmd_else(param)
  2485. XESD *param;
  2486. X{
  2487. X    return(eElseCommand);
  2488. X}    /* end of pcmd_else */
  2489. X
  2490. X/* vi: set tabstop=4 shiftwidth=4: */
  2491. X/* end of pcmdif.c */
  2492. SHAR_EOF
  2493. chmod 0644 pcmdif.c ||
  2494. echo 'restore of pcmdif.c failed'
  2495. Wc_c="`wc -c < 'pcmdif.c'`"
  2496. test 13936 -eq "$Wc_c" ||
  2497.     echo 'pcmdif.c: original size 13936, current size' "$Wc_c"
  2498. rm -f _shar_wnt_.tmp
  2499. fi
  2500. # ============= pcmdtty.c ==============
  2501. if test -f 'pcmdtty.c' -a X"$1" != X"-c"; then
  2502.     echo 'x - skipping pcmdtty.c (File already exists)'
  2503.     rm -f _shar_wnt_.tmp
  2504. else
  2505. > _shar_wnt_.tmp
  2506. echo 'x - extracting pcmdtty.c (Text)'
  2507. sed 's/^X//' << 'SHAR_EOF' > 'pcmdtty.c' &&
  2508. X/*+-------------------------------------------------------------------------
  2509. X    pcmdtty.c - tty (console) related procedure commands
  2510. X    wht@n4hgf.Mt-Park.GA.US
  2511. X
  2512. X  Defined functions:
  2513. X    ifunc_colors(pvalue)
  2514. X    pcmd_cls(param)
  2515. X    pcmd_color(param)
  2516. X    pcmd_cursor(param)
  2517. X    pcmd_delline(param)
  2518. X    pcmd_eeol(param)
  2519. X    pcmd_fkey(param)
  2520. X    pcmd_fkmap(param)
  2521. X    pcmd_home(param)
  2522. X    pcmd_icolor(param)
  2523. X    pcmd_insline(param)
  2524. X    pcmd_scrdump(param)
  2525. X    pcmd_vidcolor(param)
  2526. X    pcmd_vidnorm(param)
  2527. X    pcmd_vidrev(param)
  2528. X
  2529. X--------------------------------------------------------------------------*/
  2530. X/*+:EDITS:*/
  2531. X/*:09-10-1992-14:00-wht@n4hgf-ECU release 3.20 */
  2532. X/*:08-30-1992-23:15-wht@n4hgf-add fkmap */
  2533. X/*:08-22-1992-15:39-wht@n4hgf-ECU release 3.20 BETA */
  2534. X/*:07-25-1991-12:59-wht@n4hgf-ECU release 3.10 */
  2535. X/*:05-21-1991-00:45-wht@n4hgf-added -3 error code to keyset_read */
  2536. X/*:01-23-1991-01:58-wht@n4hgf-illegal color name make hi_white on hi_white */
  2537. X/*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
  2538. X
  2539. X#include "ecu.h"
  2540. X#include "ecuerror.h"
  2541. X#include "esd.h"
  2542. X#include "ecutty.h"
  2543. X#include "esd.h"
  2544. X#include "proc.h"
  2545. X
  2546. Xextern int proctrace;
  2547. Xextern ulong colors_current;
  2548. X
  2549. X/*+-------------------------------------------------------------------------
  2550. X    pcmd_color(param)
  2551. X
  2552. XUsage:   color [-r] [argument] [argument]
  2553. XOptions:
  2554. X   color color      Set foreground and background normal video colors
  2555. X   -r color color   Set foreground & background reverse video colors
  2556. X
  2557. XColor names
  2558. X   blue      magenta      brown      black
  2559. X   lt_blue   lt_magenta   yellow     gray
  2560. X   cyan      white        green      red
  2561. X   lt_cyan   hi_white     lt_green   lt_red
  2562. X
  2563. X--------------------------------------------------------------------------*/
  2564. Xpcmd_color(param)
  2565. XESD *param;
  2566. X{
  2567. X    register erc;
  2568. X    char switches[8];
  2569. X    int normal;
  2570. X    char s32[32];
  2571. X    ulong foreground;
  2572. X    ulong background;
  2573. X
  2574. X    get_switches(param,switches,sizeof(switches));
  2575. X    if(!strlen(switches))
  2576. X        normal = 1;
  2577. X    else if(switches[1] == 'r')
  2578. X        normal = 0;        /* reverse */
  2579. X    else
  2580. X    {
  2581. X        pputs("unrecognized switch\n");
  2582. X        return(eFATAL_ALREADY);
  2583. X    }
  2584. X
  2585. X    if((erc = get_alpha_zstr(param,s32,sizeof(s32))) ||
  2586. X            ((int)(foreground = color_name_to_num(s32)) < 0))
  2587. X        goto ERROR;
  2588. X
  2589. X    if(erc = get_alpha_zstr(param,s32,sizeof(s32)))
  2590. X    {
  2591. X        if(!end_of_cmd(param))
  2592. X            goto ERROR;
  2593. X        background = 0;
  2594. X    }
  2595. X    else if((int)(background = color_name_to_num(s32)) < 0)
  2596. X        goto ERROR;
  2597. X
  2598. X    if(normal)
  2599. X    {
  2600. X        colors_current &= 0xFFFF0000;
  2601. X        colors_current |= (foreground << 8) | background;
  2602. SHAR_EOF
  2603. true || echo 'restore of pcmdtty.c failed'
  2604. fi
  2605. echo 'End of ecu320 part 19'
  2606. echo 'File pcmdtty.c is continued in part 20'
  2607. echo 20 > _shar_seq_.tmp
  2608. exit 0
  2609.  
  2610. exit 0 # Just in case...
  2611.