home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #20 / NN_1992_20.iso / spool / comp / sources / misc / 3946 < prev    next >
Encoding:
Text File  |  1992-09-13  |  57.2 KB  |  2,621 lines

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