home *** CD-ROM | disk | FTP | other *** search
/ Garbo / Garbo.cdr / pc / source / pac.lzh / pac.5 < prev   
Encoding:
Text File  |  1990-08-12  |  41.0 KB  |  1,657 lines

  1. #!/bin/sh
  2. # This is part 05 of a multipart archive
  3. if touch 2>&1 | fgrep '[-amc]' > /dev/null
  4.  then TOUCH=touch
  5.  else TOUCH=true
  6. fi
  7. # ============= pac.c ==============
  8. echo "x - extracting pac.c (Text)"
  9. sed 's/^X//' << 'SHAR_EOF' > pac.c &&
  10. X/* pac.c */
  11. X/**********************************************************************
  12. X*    File Name     : pac.c
  13. X*    Object        : pac - 32 digit panel calculator
  14. X*    Compile       : makefile, use -DREALUNIX for sysV
  15. X*    Author        : Istvan Mohos, 1987
  16. X*    Version 1.0   : target completion date Aug 1987
  17. X*    Version 1.1   : sysV port, bug-fixes, tuning: Feb 1988
  18. X*    Version 1.2   : various excellent signal/attribute changes from
  19. X*                  :   uunet!auspex!guy (Guy Harris), Jul 19 1989
  20. X*                  : Xenix286 flags by rex!mgse!marks (Mark Seiffert)
  21. X***********************************************************************/
  22. X
  23. X#define MAIN
  24. X#include "defs.h"
  25. X#undef MAIN
  26. X#define PACMAP
  27. X#include "maps.h"
  28. X#undef PACMAP
  29. X
  30. Xextern char *version;
  31. X
  32. Xmain()
  33. X{
  34. X
  35. X    char calbuf[LINEMAX];
  36. X    register char *uwcp;
  37. X    register int ri;
  38. X    int rj, wlen;
  39. X    int rc, intact = 0;
  40. X
  41. X#ifdef DEBUG
  42. X    if ((Dfp = fopen("debugfile", "w")) == NULL)
  43. X        go_away("can't write debugfile", 1);
  44. X#endif
  45. X
  46. X    Titlq[0] = Sb[0];
  47. X    Basq[0] = Bb[0];
  48. X    pipes();
  49. X    initscr();
  50. X
  51. X/*  
  52. Xeven though I always strip off the eigth bit of fgetc, it may be a
  53. Xgood idea to set terminal parity to Space */
  54. X    raw();
  55. X    crmode();
  56. X    noecho();
  57. X    if (signal(SIGHUP, SIG_IGN) == SIG_DFL)
  58. X        signal(SIGHUP, go_away);
  59. X    if (signal(SIGINT, SIG_IGN) == SIG_DFL)
  60. X        signal(SIGINT, go_away);
  61. X    if (signal(SIGTERM, SIG_IGN) == SIG_DFL)
  62. X        signal(SIGTERM, go_away);
  63. X    if (signal(SIGQUIT, SIG_IGN) == SIG_DFL)
  64. X        signal(SIGQUIT, go_away);
  65. X
  66. X    Context = TRUE;   /* go_away() instead of exit() on error */
  67. X    onlay();    /* don't need to "update()" */
  68. X
  69. X    if ((Home = getenv("HOME")) == ZERO)
  70. X        Rcerr = TRUE;
  71. X    else {
  72. X        strcpy(Rcfile, Home);
  73. X        strcat(Rcfile, "/.pacrc");
  74. X    }
  75. X    if (!Rcerr) {
  76. X        if ((Rcfd = open(Rcfile, 0))  == -1)
  77. X            Rcerr = TRUE;
  78. X        else {
  79. X            read_rc();
  80. X            close(Rcfd);
  81. X        }
  82. X    }
  83. X    if (Rcerr) {
  84. X        setup_uconv();
  85. X        fill_stack(ZERO);
  86. X    }
  87. X
  88. X    if (Autotime == ENA) {
  89. X        Clockstat = ENA;
  90. X        cdate();
  91. X    }
  92. X    Oldib = Ibase;
  93. X    Oldob = Obase;
  94. X    show_stack();
  95. X    show_uconv();
  96. X    show_loan(0);
  97. X
  98. X/* window print field width:
  99. X123456789 123456789 123456789 123456789 1234
  100. X*/
  101. X    sprintf(Mop, "\
  102. Xpac version: 1.2                            \
  103. Xlast remake: %-*.*s\
  104. Xauthor: istvan mohos  0;ib a;pr %d;ob %c;ib %c",
  105. X        31,31,version,
  106. X        Precision, Base_str[Oldob], Base_str[Oldib]);
  107. X
  108. X    strcpy(Uwin_copy, Mop);
  109. X    uwcp = Uwin_copy + strlen(Mop);  /* pad with spaces at end */
  110. X    wlen = (UBOT - UTOP) * (URIGHT+1 - ULEFT) - (uwcp - Uwin_copy);
  111. X    for (ri = wlen; --ri >= 0; *uwcp++ = ' ');
  112. X    *uwcp = '\0';
  113. X
  114. X    interpret(Mop);
  115. X    move(CY=UTOP, CX=ULEFT);
  116. X    Painted = TRUE;   /* from now on, Mainbuf may be pushed on Stack */
  117. X
  118. X    while (TRUE) {
  119. X        if (Clockstat == DISA)
  120. X            Titlq[Tqlev] = Sb[Tqlev];
  121. X        else
  122. X            Titlq[Tqlev] = Cb[Tqlev];
  123. X
  124. X        if (O_conv == FALSE) {
  125. X            Basq[CONVREQ] = ZERO;
  126. X            update();
  127. X        }
  128. X
  129. X        /* ledit starts with pfresh() */
  130. X        rc = ledit(calbuf,cal_map,0,ULEFT,URIGHT,0,0,intact);
  131. X        intact = 1;
  132. X
  133. X        switch(rc) {
  134. X
  135. X        default:
  136. X            break;
  137. X
  138. X#ifdef DESIGN
  139. X        case 21 :                /* ^U */
  140. X            write_scr("rawscreen", 1);
  141. X            break;
  142. X        case 25 :                /* ^Y */
  143. X            write_scr("pacscreen", 0);
  144. X            break;
  145. X#endif
  146. X
  147. X        case 1:                  /* ^A: ascii char to dec, hex, oct */
  148. X        case 4:                  /* ^D: 3 decimal digits to ... */
  149. X        case 15:                 /* ^O: 3 octal digits to ... */
  150. X        case 24:                 /* ^X: 2 hex digits to ... */
  151. X            byte_conv(rc);
  152. X            break;
  153. X
  154. X        case 11 :
  155. X            if (Clockstat == DISA) { 
  156. X                Clockstat = ENA;
  157. X                cdate();
  158. X            }
  159. X            else {
  160. X                Clockstat = DISA;
  161. X                clockoff();
  162. X                update();
  163. X                pfresh();
  164. X            }
  165. X            break;                /* ^Klock  */
  166. X
  167. X        case 6 :                  /* write to hardcopy */
  168. X        case 16 :
  169. X            if (Hardcopy == ENA || Hardcopy == AP) {
  170. X                Hardcopy = DISA;
  171. X                close(Hc);
  172. X                Hc = -1;
  173. X            }
  174. X            else
  175. X                (rc == 6) ? (Hardcopy = ENA) : (Hardcopy = AP);
  176. X            hard(0);
  177. X            break;
  178. X
  179. X        case 12 :
  180. X            show_loan(1);
  181. X            break;                /* ^L show_loan */
  182. X
  183. X        case 7:                   /* ^Globals */
  184. X            if (Statopts)
  185. X                show_stat();
  186. X            else
  187. X                show_param();
  188. X            break;
  189. X
  190. X        case 14:                  /* ^N add new conversion */
  191. X            newconv();
  192. X            break;
  193. X
  194. X        case 20:                  /* ^Total */
  195. X            total();
  196. X            break;
  197. X
  198. X        case 61:                  /* '=' redo previous window */
  199. X            for (uwcp = Uwin_copy, rj = UTOP; rj <= UBOT; rj++)
  200. X                for (ri = ULEFT; ri <= URIGHT; ri++)
  201. X                    mvaddch(rj, ri, *uwcp++);
  202. X            move(CY=UTOP, CX=ULEFT);
  203. X            pfresh();
  204. X            break;
  205. X
  206. X        case 0:
  207. X            intact = 0;
  208. X            if (*calbuf == '#') {
  209. X                if ( Hc != -1 && Hf != FXTER) {
  210. X                    for (uwcp=calbuf+strlen(calbuf); --uwcp > calbuf;)
  211. X                        if (*uwcp > 32)
  212. X                            break;
  213. X                    *++uwcp = '\n';
  214. X                    *++uwcp = '\0';
  215. X                    ri = strlen(calbuf);
  216. X                    if (write(Hc, calbuf, ri) != ri)
  217. X                        fatal("comment write");
  218. X                }
  219. X                break;
  220. X            }
  221. X            Oldib = Ibase;
  222. X            Oldob = Obase;
  223. X            strcpy(Uwin_copy, calbuf);
  224. X            interpret(calbuf);
  225. X            if (Staybase == DISA) {
  226. X                Obase = Oldob;
  227. X                Ibase = Oldib;
  228. X                sprintf(Mop, "ibase=A;obase=%d;ibase=%d\n",
  229. X                    Obase, Ibase);
  230. X                addto_controlbuf(Mop);
  231. X                show_result(0);
  232. X            }
  233. X            break;
  234. X        }
  235. X    }
  236. X}
  237. SHAR_EOF
  238. $TOUCH -am 0221163890 pac.c &&
  239. chmod 0644 pac.c ||
  240. echo "restore of pac.c failed"
  241. set `wc -c pac.c`;Wc_c=$1
  242. if test "$Wc_c" != "6229"; then
  243.     echo original size 6229, current size $Wc_c
  244. fi
  245. # ============= pactok.c ==============
  246. echo "x - extracting pactok.c (Text)"
  247. sed 's/^X//' << 'SHAR_EOF' > pactok.c &&
  248. X/* pactok.c */
  249. X/**********************************************************************
  250. X*    File Name     : pactok.c
  251. X*    Function      : pac calculator token recognizer
  252. X*    Author        : Istvan Mohos, 1987
  253. X***********************************************************************/
  254. X
  255. X#include "defs.h"
  256. X#define PACTOK
  257. X#include "toktab.h"
  258. X#undef PACTOK
  259. X
  260. Xfill_spreadbuf(buffer)
  261. Xchar *buffer;
  262. X{
  263. X    register char *bp = buffer;
  264. X    register char *spr = Spreadbuf;
  265. X    register char prev_c = '\0';
  266. X    int first = 0;
  267. X    static char *fid = "fill_spreadbuf";
  268. X
  269. X    _TR
  270. X    if (*bp == 42 || *bp == 43 || *bp == 45 || *bp == 47 || *bp == 94) {
  271. X        *spr++ = '\\';
  272. X        *spr++ = ' ';
  273. X    }
  274. X    while(*bp) {
  275. X        if ((ispunct(*bp)    && *bp != '.'    && *bp != '_')   ||
  276. X            (ispunct(prev_c) && prev_c != '.' && prev_c != '_'))
  277. X            *spr++ = ' ';   /* insert an extra space for pactok */
  278. X
  279. X        if (*bp == ';')
  280. X            first = 1;
  281. X        else if (first) {
  282. X            if (*bp == 42 || *bp == 43 || *bp == 45 ||
  283. X                *bp == 47 || *bp == 94) {
  284. X                *spr++ = '\\';
  285. X                *spr++ = ' ';
  286. X                first = 0;
  287. X            }
  288. X            else if (!isspace(*bp))
  289. X                first = 0;
  290. X        }
  291. X
  292. X        *spr++ = *bp;
  293. X        prev_c = *bp++;
  294. X    }
  295. X    *spr = '\0';
  296. X    if (Hc != -1) {
  297. X        *Tmpbuf = '\0';
  298. X        if (Hf == FVER) {
  299. X            strcpy(Tmpbuf,
  300. X"--------------------------------------------");
  301. X            spr = Tmpbuf + strlen(Tmpbuf);
  302. X            if (Ibase != 10) {
  303. X                sprintf(spr, " [ibase: %d]", Ibase);
  304. X                spr = Tmpbuf + strlen(Tmpbuf);
  305. X            }
  306. X            if (Obase != 10) {
  307. X                sprintf(spr, " [obase: %d]", Obase);
  308. X                spr = Tmpbuf + strlen(Tmpbuf);
  309. X            }
  310. X            strcat(Tmpbuf, "\n");
  311. X        }
  312. X        else if (Hf == FTER)
  313. X            strcpy(Tmpbuf, "===\n");
  314. X    }
  315. X    TR_
  316. X}
  317. X
  318. Xplace_pointers()
  319. X{
  320. X    register int ri, rj;
  321. X    register char *cp;
  322. X    int thisnum;
  323. X    int prevnum;
  324. X    static char *fid = "place_pointers";
  325. X
  326. X    _TR
  327. X    Tokp[0] = Mainbuf;
  328. X    /* take space and comma, unrecognized tokens (digits) will be
  329. X       automatically concatenated in Ubuf.
  330. X       This permits user formatted input. */
  331. X
  332. X    if ((Tokp[1] = pactok(Spreadbuf, " ,")) == ZERO)
  333. X        strcpy(Spreadbuf, "\\");
  334. X    else {
  335. X        for (cp=Tokp[1], prevnum=1; *cp; cp++) {
  336. X            if (! (isdigit(*cp) || (*cp == '.') ||
  337. X                   (*cp >= 'a' && *cp <= 'f') ||
  338. X                   (*cp >= 'A' && *cp <= 'F'))  ) {
  339. X                prevnum = 0;
  340. X                break;
  341. X            }
  342. X        }
  343. X        ri = 1;
  344. X        while ((Tokp[++ri] = pactok(ZERO, " ,")) != ZERO) {
  345. X            for (cp=Tokp[ri], thisnum=1; *cp; cp++) {
  346. X                if (! (isdigit(*cp) || (*cp == '.') ||
  347. X                       (*cp >= 'a' && *cp <= 'f') ||
  348. X                       (*cp >= 'A' && *cp <= 'F'))  ) {
  349. X                    thisnum = prevnum = 0;
  350. X                    break;
  351. X                }
  352. X            }
  353. X            if (thisnum && prevnum) {
  354. X                strcat(Tokp[ri-1], Tokp[ri]);
  355. X                --ri;
  356. X            }
  357. X            if (thisnum)
  358. X                prevnum = 1;
  359. X        }
  360. X        Last = Tokp[ri];       /*  == ZERO */
  361. X    }
  362. X
  363. X    if (Hc != -1) {
  364. X        if (Hf != FXTER) {
  365. X            for (rj = 1; rj < ri;) {
  366. X                strcat(Tmpbuf, Tokp[rj++]);
  367. X                strcat(Tmpbuf, " ");
  368. X            }
  369. X            strcat(Tmpbuf, "\n");
  370. X            rj = strlen(Tmpbuf);
  371. X            if (write(Hc, Tmpbuf, rj) != rj)
  372. X                fatal("hardcopy format write");
  373. X        }
  374. X    }
  375. X    TR_
  376. X    return(ri); /* # of non-ZERO tokens, including Tokp[0] = Mainbuf */
  377. X}
  378. X
  379. Xlookup(c_ptr)
  380. Xchar *c_ptr;
  381. X{
  382. X    int inlist_val;
  383. X    static char *fid = "lookup";
  384. X
  385. X    _TR
  386. X        if ((inlist_val = spacefill(c_ptr, WORDSIZE)) != -1)
  387. X            inlist_val = mybsearch(Tokbuf, toklist, LISTSIZE);
  388. X    TR_
  389. X    return(inlist_val);
  390. X}
  391. X
  392. Xchar *
  393. Xpactok(s1, s2)
  394. Xchar *s1, *s2;
  395. X{
  396. X    register i;
  397. X    char *separator[128];
  398. X    int sepcount, tok_flag;
  399. X    static char *tokenp = ZERO, *parser = ZERO;
  400. X    static char *fid = "pactok";
  401. X
  402. X    _TR
  403. X    if ((sepcount = strlen(s2)) == 0) {
  404. X        TR_
  405. X        return(ZERO);
  406. X    }
  407. X    if (s1 != ZERO)
  408. X        tokenp = parser = s1;
  409. X    for (i = sepcount; --i >= 0; separator[i] = s2 + i);
  410. X
  411. X    /* move parser, tokenp to first non-separator character */
  412. X    while (*parser != '\0') {
  413. X        int sep_flag = 0;
  414. X        for (i = sepcount; --i >= 0;)
  415. X            if (*separator[i] == *parser) {
  416. X                ++parser;
  417. X                sep_flag = 1;
  418. X                break;
  419. X            }
  420. X        if (!sep_flag)
  421. X            break;
  422. X    }
  423. X    tokenp = parser;
  424. X    tok_flag = 0;
  425. X
  426. X    /* move parser to first separator after token, replace value with '\0' */
  427. X    while (*parser != '\0') {
  428. X        int sep_flag = 0;
  429. X        for (i = sepcount; --i >= 0;)
  430. X            if (*separator[i] == *parser) {
  431. X                *parser++ = '\0';
  432. X                sep_flag = 1;
  433. X                break;
  434. X            }
  435. X        if (sep_flag)
  436. X            break;
  437. X        ++parser;
  438. X        tok_flag = 1;
  439. X    }
  440. X
  441. X    if (tok_flag) {
  442. X        TR_
  443. X        return(tokenp);
  444. X    }
  445. X    TR_
  446. X    return(ZERO);
  447. X}
  448. X
  449. Xmybsearch (comparee, wordlist, listsize)
  450. Xchar *comparee;
  451. Xchar *wordlist[];
  452. X{
  453. X    register    m, mid, lo, hi;
  454. X    static char *fid = "mybsearch";
  455. X
  456. X    _TR
  457. X    lo = 0, hi = listsize -1;
  458. X    while (lo <= hi) {
  459. X        mid = (lo + hi) >> 1;
  460. X        if ((m = strcmp(comparee, wordlist[mid])) < 0)
  461. X            hi = mid -1;
  462. X        else if (m > 0)
  463. X            lo = mid +1;
  464. X        else {
  465. X            TR_
  466. X            return(mid);
  467. X        }
  468. X    }
  469. X    TR_
  470. X    return (-1);
  471. X}
  472. SHAR_EOF
  473. $TOUCH -am 0221163890 pactok.c &&
  474. chmod 0644 pactok.c ||
  475. echo "restore of pactok.c failed"
  476. set `wc -c pactok.c`;Wc_c=$1
  477. if test "$Wc_c" != "5676"; then
  478.     echo original size 5676, current size $Wc_c
  479. fi
  480. # ============= pipes.c ==============
  481. echo "x - extracting pipes.c (Text)"
  482. sed 's/^X//' << 'SHAR_EOF' > pipes.c &&
  483. X/* pipes.c */
  484. X/**********************************************************************
  485. X*    File Name     : pipes.c
  486. X*    Function      : make A and B pipes to bc
  487. X*    Author        : Istvan Mohos, 1987
  488. X***********************************************************************/
  489. X
  490. X#include "defs.h"
  491. X
  492. Xpipes()
  493. X{
  494. X    char tmp[LINEMAX]; /* PLUS6300 needs this --- beats me why */
  495. X    /* setup main bc function */
  496. X    if (pipe(A_write) == -1 || pipe(A_read) == -1)
  497. X        fatal("main pipe setup");
  498. X    switch (A_ret = fork()) {
  499. X    case -1:
  500. X        fatal("main fork");
  501. X    case  0:
  502. X        if (close(0) == -1 || close(1) == -1)
  503. X            fatal("main close1");
  504. X        if (dup(A_write[0]) != 0)
  505. X            fatal("main dup0");
  506. X        if (dup(A_read[1]) != 1)
  507. X            fatal("main dup1");
  508. X        if (close(A_write[0]) == -1 || close(A_read[0]) == -1 ||
  509. X            close(A_write[1]) == -1 || close(A_read[1]) == -1)
  510. X            fatal("main close2");
  511. X        execlp("/usr/bin/bc", "bc", "-l", 0);
  512. X    }
  513. X    if (close(A_write[0]) == -1 || close(A_read[1]) == -1)
  514. X        fatal("main close3");
  515. X
  516. X    /* setup converter bc function */
  517. X    if (pipe(B_write) == -1 || pipe(B_read) == -1)
  518. X        fatal("conv pipe setup");
  519. X    switch (A_ret = fork()) {
  520. X    case -1:
  521. X        fatal("conv fork");
  522. X    case  0:
  523. X        if (close(0) == -1 || close(1) == -1)
  524. X            fatal("conv close1");
  525. X        if (dup(B_write[0]) != 0)
  526. X            fatal("conv dup0");
  527. X        if (dup(B_read[1]) != 1)
  528. X            fatal("conv dup1");
  529. X        if (close(B_write[0]) == -1 || close(B_read[0]) == -1 ||
  530. X            close(B_write[1]) == -1 || close(B_read[1]) == -1)
  531. X            fatal("conv close2");
  532. X        execlp("/usr/bin/bc", "bc", 0);
  533. X    }
  534. X    if (close(B_write[0]) == -1 || close(B_read[1]) == -1)
  535. X        fatal("conv close3");
  536. X}
  537. X
  538. SHAR_EOF
  539. $TOUCH -am 0221163890 pipes.c &&
  540. chmod 0644 pipes.c ||
  541. echo "restore of pipes.c failed"
  542. set `wc -c pipes.c`;Wc_c=$1
  543. if test "$Wc_c" != "1805"; then
  544.     echo original size 1805, current size $Wc_c
  545. fi
  546. # ============= stack.c ==============
  547. echo "x - extracting stack.c (Text)"
  548. sed 's/^X//' << 'SHAR_EOF' > stack.c &&
  549. X/* stack.c */
  550. X/**********************************************************************
  551. X*    File Name     : stack.c
  552. X*    Function      : user stack
  553. X*    Author        : Istvan Mohos, 1987
  554. X***********************************************************************/
  555. X
  556. X#include "defs.h"
  557. X
  558. Xlinkup()
  559. X{
  560. X    register struct stk_cell *sr;
  561. X    register int ri;
  562. X    static char *fid = "linkup";
  563. X
  564. X    _TR
  565. X    sr = &Stk[0];
  566. X    for(ri = STACKDEEP+1; --ri; sr++)  /* leave last one dangling */
  567. X        sr->link = sr+1;
  568. X    TR_
  569. X}
  570. X
  571. Xfill_stack(from)
  572. Xchar *from;
  573. X{
  574. X    register struct stk_cell *sr;
  575. X    register char *rc = from;
  576. X    register int ri;
  577. X    static char *fid = "fill_stack";
  578. X
  579. X    _TR
  580. X    linkup();
  581. X
  582. X    sr = &Stk[0];                /* accumulator */
  583. X    if (from == ZERO) {
  584. X        strcpy(sr->cell, Emptycell+2); /* no base char */
  585. X        ++sr;
  586. X        for (ri = STACKDEEP; --ri >= 0; sr++)
  587. X            strcpy(sr->cell, Emptycell);
  588. X    }
  589. X    else {
  590. X        *(rc + STACKMAX) = 0;
  591. X        strcpy(sr->cell, Emptycell+2);  /* no base char in accum */
  592. X        ++sr;
  593. X        for (ri = STACKDEEP; --ri >= 0; sr++) {
  594. X            *(rc + STACKMAX) = 0;
  595. X            strcpy(sr->cell, rc);
  596. X            rc += STACKMAX + 1;
  597. X        }
  598. X    }
  599. X    TR_
  600. X}
  601. X
  602. Xshow_stack()
  603. X{
  604. X    register struct stk_cell *sr;
  605. X    register int ri;
  606. X    static char *fid = "show_stack";
  607. X
  608. X    _TR
  609. X    sr = Stk[0].link;                /* skip accumulator */
  610. X    for (ri = STACKTOP; ri <= STACKBOT; ri++) {
  611. X        move(ri, STACKLEFT);
  612. X        printw("%s", sr->cell);
  613. X        sr = sr->link;
  614. X    }
  615. X    standout();
  616. X    for (ri = STACKTOP; ri <= STACKBOT; ri++) {
  617. X        mvaddch(ri, LBOUND, 'h' + ri - STACKTOP);
  618. X    }
  619. X    standend();
  620. X    TR_
  621. X}
  622. X
  623. Xstruct stk_cell *
  624. Xfind(stkpos)
  625. Xint stkpos;    /* accumulator = 0, h = 1 */
  626. X{
  627. X    register struct stk_cell *sr;
  628. X    register int ri;
  629. X    static char *fid = "find";
  630. X
  631. X    _TR
  632. X    sr = &Stk[0];
  633. X    for (ri = stkpos; --ri >= 0; sr = sr->link);
  634. X    TR_
  635. X    return(sr);
  636. X}
  637. X
  638. Xsave_stack(to, revstrip)
  639. Xchar *to;
  640. Xint revstrip;
  641. X{
  642. X    register struct stk_cell *sr;
  643. X    register char *rc = to;
  644. X    register int ri;
  645. X    static char *fid = "save_stack";
  646. X
  647. X    _TR
  648. X    sr = Stk[0].link;                /* skip accumulator */
  649. X    for (ri = STACKDEEP; --ri >= 0; sr = sr->link) {
  650. X        strcpy(rc, sr->cell);
  651. X        rc += STACKMAX;
  652. X        if (revstrip) {
  653. X            while(*--rc == ' ');
  654. X            ++rc;
  655. X        }
  656. X        *rc++ = '\n';
  657. X    }
  658. X    *rc = '\0';
  659. X    TR_
  660. X}
  661. X
  662. Xpopstack(stkpos)
  663. Xint stkpos;    /* h = 1 */
  664. X{
  665. X    register struct stk_cell *sr, *br;
  666. X    static char *fid = "popstack";
  667. X
  668. X    _TR
  669. X    sr = find(stkpos - 1);
  670. X    br = sr->link;
  671. X    sr->link = br->link;
  672. X    sr = find(STACKDEEP - 1);  /* one is already unlinked */
  673. X    sr->link = br;
  674. X    strcpy(br->cell, Emptycell);
  675. X    show_stack();
  676. X    TR_
  677. X}
  678. X
  679. Xclearstack(stkpos)
  680. Xint stkpos;
  681. X{
  682. X    register struct stk_cell *sr;
  683. X    static char *fid = "clearstack";
  684. X
  685. X    _TR
  686. X    if (stkpos == 0) {
  687. X        linkup();
  688. X        fill_stack(ZERO);
  689. X    }
  690. X    else {
  691. X        sr = find(stkpos);
  692. X        strcpy(sr->cell, Emptycell);
  693. X    }
  694. X    show_stack();
  695. X    TR_
  696. X}
  697. X
  698. Xpushstack(stkpos)
  699. Xint stkpos;
  700. X{
  701. X    register struct stk_cell *sr, *br, *tr;
  702. X    static char *fid = "pushstack";
  703. X
  704. X    _TR
  705. X    sr = find(stkpos - 1);
  706. X    tr = find(STACKDEEP);
  707. X    br = sr->link;
  708. X    sr->link = tr;
  709. X    tr->link = br;
  710. X    show_stack();
  711. X    TR_
  712. X}
  713. X
  714. Xonereg(stkpos)
  715. Xint stkpos;
  716. X{
  717. X    register struct stk_cell *sr;
  718. X    static char *fid = "onereg";
  719. X
  720. X    _TR
  721. X    sr = find(stkpos);
  722. X    strcpy(Onebuf, sr->cell);
  723. X    TR_
  724. X}
  725. X
  726. Xstack_reg(stkpos, source)
  727. Xint stkpos, source;
  728. X{
  729. X    register struct stk_cell *sr, *br;
  730. X    static char *fid = "stack_reg";
  731. X
  732. X    _TR
  733. X    sr = find(stkpos);
  734. X    br = find(source);
  735. X    strcpy(sr->cell, br->cell);
  736. X    show_stack();
  737. X    TR_
  738. X}
  739. X
  740. SHAR_EOF
  741. $TOUCH -am 0221163890 stack.c &&
  742. chmod 0644 stack.c ||
  743. echo "restore of stack.c failed"
  744. set `wc -c stack.c`;Wc_c=$1
  745. if test "$Wc_c" != "3746"; then
  746.     echo original size 3746, current size $Wc_c
  747. fi
  748. # ============= system.c ==============
  749. echo "x - extracting system.c (Text)"
  750. sed 's/^X//' << 'SHAR_EOF' > system.c &&
  751. X/* system.c */
  752. X/**********************************************************************
  753. X*    File Name     : system.c
  754. X*    Function      : clean up prior to pac exit, pipe readers
  755. X*    Author        : Istvan Mohos, 1987
  756. X***********************************************************************/
  757. X
  758. X#include "defs.h"
  759. X
  760. Xgo_away(message, die)
  761. Xchar *message;
  762. Xint die;
  763. X{
  764. X    static char *fid = "go_away";
  765. X    int tput_ok = 1;
  766. X
  767. X    _TR
  768. X    signal(SIGINT, SIG_IGN);
  769. X    signal(SIGHUP, SIG_IGN);
  770. X    signal(SIGTERM, SIG_IGN);
  771. X    signal(SIGQUIT, SIG_IGN);
  772. X
  773. X    if (Context != INIT) {
  774. X        write_rc();
  775. X        clockoff();
  776. X        Clockstat = DISA;
  777. X
  778. X        if (message != ZERO && *message == 'I') {
  779. X            standend();
  780. X            mvaddch(LINES-1, 0, ' ');
  781. X            clear();
  782. X            pfresh();
  783. X            mvcur(0, COLS-1, LINES-1, 0);
  784. X            endwin();
  785. X        }
  786. X        else {
  787. X            standend();
  788. X            mvaddch(LINES-1, 0, ' ');
  789. X            pfresh();
  790. X            mvcur(0, COLS-1, LINES-1, 0);
  791. X            endwin();
  792. X            fprintf(stderr, "\n");
  793. X        }
  794. X    }
  795. X
  796. X    if (die)
  797. X        fprintf(stderr, "%s\n", ierbuf);
  798. X    TR_
  799. X    exit(die);
  800. X}
  801. X
  802. Xfatal(msg) /* kill pipes, print error messages and go_away */
  803. Xchar *msg;
  804. X{
  805. X    extern int errno, sys_nerr;
  806. X    extern char *sys_errlist[];
  807. X
  808. X    if (A_ret)
  809. X        kill(A_ret, SIGTERM), A_ret = 0;
  810. X    if (B_ret)
  811. X        kill(B_ret, SIGTERM), B_ret = 0;
  812. X    go_away(ierbuf, ierror(msg, 1));
  813. X}
  814. X
  815. Xint
  816. Xwait_main_pipe() /* empty main pipe to prevent deadlock */
  817. X          /* null delimited Mainbuf string may get PIPEMAX long */
  818. X{
  819. X    register ri;
  820. X    register char *accp1, *accp2;
  821. X    int done, totalread;
  822. X    static char *fid = "wait_main_pipe";
  823. X
  824. X    _TR
  825. X    accp1 = Mainbuf;
  826. X    done = FALSE;
  827. X    totalread = 0;
  828. X    while (!done) {
  829. X        switch
  830. X           (Nread = read(A_read[0], accp1, PIPEMAX)) {
  831. X        case -1:
  832. X            fatal("wait main read");
  833. X        case  0:
  834. X            fatal("main bc: mysterious end of file");
  835. X        default:
  836. X            if ((totalread += Nread) >= PIPEMAX - 80)
  837. X                     fatal("main pipe overflow");
  838. X            accp2 = accp1;
  839. X            for (ri = Nread; --ri >= 0;) {
  840. X                if(*accp2 == '\n' && *(accp2 -1) != '\\') {
  841. X                    *(accp2) = '\0';
  842. X                    --totalread;
  843. X                    done = TRUE;
  844. X                    break;
  845. X                }
  846. X                ++accp2;
  847. X            }
  848. X            if (!done)
  849. X                accp1 = accp2;
  850. X            break;
  851. X        }
  852. X    }
  853. X    TR_
  854. X}
  855. X
  856. X/* empty conv pipe into buf, to prevent deadlock.
  857. X   if  non-ZERO, buf size must not be less than PIPEMAX.
  858. X   if ZERO, Convbuf is used.  Null byte added at end of buf
  859. X*/
  860. Xwait_conv_pipe(buf)
  861. Xchar *buf;
  862. X{
  863. X    register ri;
  864. X    register char *convp1, *convp2;
  865. X    int done, totalread;
  866. X    static char *fid = "wait_conv_pipe";
  867. X
  868. X    _TR
  869. X    if (buf == ZERO)
  870. X        convp1 = Convbuf;
  871. X    else
  872. X        convp1 = buf;
  873. X    done = FALSE;
  874. X    totalread = 0;
  875. X    while (!done) {
  876. X        switch
  877. X           (Convread = read(B_read[0], convp1, PIPEMAX)) {
  878. X        case -1:
  879. X            fatal("wait conv read");
  880. X        case  0:
  881. X            fatal("conv: mysterious end of file");
  882. X        default:
  883. X            if ((totalread += Convread) >= PIPEMAX - 80)
  884. X                     fatal("conv pipe overflow");
  885. X            convp2 = convp1;
  886. X            for (ri = Convread; --ri >= 0;) {
  887. X                if(*convp2 == '\n' && *(convp2 -1) != '\\') {
  888. X                    *(convp2) = '\0';
  889. X                    --totalread;
  890. X                    done = TRUE;
  891. X                    break;
  892. X                }
  893. X                ++convp2;
  894. X            }
  895. X            if (!done)
  896. X                convp1 = convp2;
  897. X            break;
  898. X        }
  899. X    }
  900. X    TR_
  901. X}
  902. SHAR_EOF
  903. $TOUCH -am 0221163890 system.c &&
  904. chmod 0644 system.c ||
  905. echo "restore of system.c failed"
  906. set `wc -c system.c`;Wc_c=$1
  907. if test "$Wc_c" != "3735"; then
  908.     echo original size 3735, current size $Wc_c
  909. fi
  910. # ============= time.c ==============
  911. echo "x - extracting time.c (Text)"
  912. sed 's/^X//' << 'SHAR_EOF' > time.c &&
  913. X/* time.c */
  914. X/**********************************************************************
  915. X*    File Name     : time.c
  916. X*    Author        : Istvan Mohos, 1987
  917. X***********************************************************************/
  918. X
  919. X
  920. X#ifdef pyr
  921. X#include <sys/time.h>
  922. X#else
  923. X#include <time.h>
  924. X#endif
  925. X
  926. X#ifndef LOCALTEST
  927. X#include "defs.h"
  928. X#else
  929. Xunsigned alarm();
  930. Xint cdate();        /* signal has to know */
  931. X#include <stdio.h>
  932. X#include <signal.h>
  933. Xchar *Thisyear;
  934. Xmain()
  935. X{
  936. X    year();
  937. X    printf("%s<<\n", Thisyear);
  938. X    printf("%d", whichmonth("MAY"));
  939. X    cdate();
  940. X    for (;;);
  941. X}
  942. X#endif
  943. X
  944. X#ifndef BADSIG
  945. X#define BADSIG        (int (*)())-1
  946. X#endif
  947. X
  948. Xcdate()
  949. X{
  950. X    long clock;
  951. X    int hour;
  952. X    register char *d;
  953. X    char ptr[30];
  954. X    int savy, savx, se;
  955. X    static char *fid = "cdate";
  956. X
  957. X    _TR
  958. X    clock = time((long *) 0);    /* seconds since 1970 */
  959. X    d = ctime(&clock);
  960. X    strcpy(ptr, d);
  961. X
  962. X    d = ptr + 8;
  963. X    if (*d == ' ') {
  964. X        *d = *(d+1);
  965. X        *++d = ' ';
  966. X    }
  967. X    d = ptr + 11;
  968. X    if (*d == '0')
  969. X        *d = ' ';
  970. X    if ((hour = atoi(d)) > 11) {    /* PM */
  971. X        if (hour > 12)
  972. X            sprintf(d, "%2d", hour -12);
  973. X        d+=2;
  974. X        *d = ':';
  975. X        d+=3;
  976. X        *d++ = '.';
  977. X    }
  978. X    else {
  979. X        d = ptr + 16;
  980. X        *d++ = ' ';
  981. X    }
  982. X    *d = '\0';  /* delete :seconds, year, newline */
  983. X
  984. X#ifdef LOCALTEST
  985. X    printf("    01234567890123456789012\n>>>>%s<<<<\n", ptr);
  986. X    alarm(10);
  987. X    if (signal(SIGALRM, cdate) == BADSIG)
  988. X         exit(1);
  989. X#else
  990. X    getyx(stdscr, savy, savx);
  991. X
  992. X#ifdef sun
  993. X    se = !((stdscr->_y[stdscr->_cury][stdscr->_curx] & 128));
  994. X#else
  995. X    se = (stdscr->_y[stdscr->_cury][stdscr->_curx] < 128);
  996. X#endif
  997. X    if (se)
  998. X        standout();
  999. X    mvaddstr(TOP,  CONVLEFT, ptr);
  1000. X    if (se)
  1001. X        standend();
  1002. X    move(savy, savx);
  1003. X    refresh();
  1004. X    alarm(10);
  1005. X    if (signal(SIGALRM, cdate) == BADSIG)
  1006. X         fatal("clock signal");
  1007. X    TR_
  1008. X}
  1009. X
  1010. Xclockoff()
  1011. X{
  1012. X    static char *fid = "clockoff";
  1013. X
  1014. X    _TR
  1015. X    alarm(0);
  1016. X    if (signal(SIGALRM, SIG_DFL) == BADSIG)
  1017. X         fatal("clock signal at off");
  1018. X    TR_
  1019. X}
  1020. X
  1021. Xpfresh()
  1022. X{
  1023. X    static char *fid = "pfresh";
  1024. X    _TR
  1025. X    if (Clockstat == DISA)
  1026. X        refresh();
  1027. X    else {
  1028. X        clockoff();
  1029. X        refresh();
  1030. X        cdate();
  1031. X    }
  1032. X#endif
  1033. X
  1034. X    TR_
  1035. X}
  1036. X
  1037. Xyear()
  1038. X{
  1039. X    long clock;
  1040. X    static char ptr[30];
  1041. X    static char *fid = "year";
  1042. X
  1043. X    _TR
  1044. X    clock = time((long *) 0);
  1045. X    strcpy(ptr, ctime(&clock));
  1046. X
  1047. X    Thisyear = ptr + 20;
  1048. X    *(ptr + 24) = '\0'; /* kill newline */
  1049. X    TR_
  1050. X}
  1051. X
  1052. Xwhichmonth(ptr)
  1053. Xchar *ptr;
  1054. X{
  1055. X    register int hv = 0;
  1056. X    register char *hp;
  1057. X
  1058. X    static char hashbuf[] = {
  1059. X      12, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0,
  1060. X       3, 0, 0, 4, 0, 0,10, 5, 9, 0, 0, 7, 0, 6, 0, 0, 0, 0, 0,11, };
  1061. X    static char *fid = "whichmonth";
  1062. X
  1063. X    _TR
  1064. X    hp = ptr;
  1065. X    if (hp == ZERO) {
  1066. X        TR_
  1067. X        return(0);
  1068. X    }
  1069. X    if (isalpha(*hp)) {
  1070. X        hv += (*hp++ & 95);
  1071. X        if (*hp) {
  1072. X            hv += (*hp++ & 95);
  1073. X            if (*hp)
  1074. X                hv += (*hp & 95);
  1075. X        }
  1076. X        hv -= 204;
  1077. X        if (hv < 0 || hv > 39) {
  1078. X            TR_
  1079. X            return(0);
  1080. X    }
  1081. X        return(hashbuf[hv]);
  1082. X    }
  1083. X    if ((hv = atoi(hp)) > 12 || hv < 1) {
  1084. X        TR_
  1085. X        return(0);
  1086. X    }
  1087. X    TR_
  1088. X    return(hv);
  1089. X}
  1090. SHAR_EOF
  1091. $TOUCH -am 0221173890 time.c &&
  1092. chmod 0644 time.c ||
  1093. echo "restore of time.c failed"
  1094. set `wc -c time.c`;Wc_c=$1
  1095. if test "$Wc_c" != "3249"; then
  1096.     echo original size 3249, current size $Wc_c
  1097. fi
  1098. # ============= total.c ==============
  1099. echo "x - extracting total.c (Text)"
  1100. sed 's/^X//' << 'SHAR_EOF' > total.c &&
  1101. X/* total.c */
  1102. X/**********************************************************************
  1103. X*    File Name     : total.c
  1104. X*    Function      : pac checkbook balancer (totalizer)
  1105. X*    Author        : Istvan Mohos, 1987
  1106. X***********************************************************************/
  1107. X
  1108. X#include "defs.h"
  1109. X#define TOTALMAP
  1110. X#include "maps.h"
  1111. X#undef TOTALMAP
  1112. X
  1113. Xstatic double Su[FITCONV - 2];
  1114. Xstatic double Total;
  1115. X
  1116. Xtotal()
  1117. X{
  1118. X    int pyp, pxp;
  1119. X    char curr_l[CONVMAX + 1];
  1120. X    register int ri, rj;
  1121. X    static int f_id = 0;
  1122. X    int where, ck, copy;
  1123. X    static char *fid = "total";
  1124. X    
  1125. X    _TR
  1126. X    CYX;
  1127. X    Tqlev = TALYREQ;
  1128. X    if (Clockstat == DISA)
  1129. X        Titlq[TALYREQ] = Sb[TALYREQ];
  1130. X    else
  1131. X        Titlq[TALYREQ] = Cb[TALYREQ];
  1132. X    Basq[TALYREQ] = Bb[TALYREQ];
  1133. X    standout();
  1134. X    for (ri = FITCONV - 2, rj = 115; --ri >= 0; rj--)
  1135. X        mvaddch(UTOP + ri, RBOUND, rj);
  1136. X    mvaddch(TOP + FITCONV, RBOUND, 't');
  1137. X    standend();
  1138. X    clear_wline(TOP+FITCONV-1, CONVLEFT, RBOUND-2, 0, 1);
  1139. X    show_items();
  1140. X    show_total(0);
  1141. X    update();
  1142. X    while(1) {
  1143. X    
  1144. X        where = UTOP + f_id;
  1145. X        if (Su[f_id] == 0.)
  1146. X            clear_wline(where, CONVLEFT, RBOUND-2, 0, 1);
  1147. X    
  1148. X
  1149. X        ck = ledit(curr_l, tot_map, where, CONVLEFT, RBOUND-2, 0, 1, 1);
  1150. X    
  1151. X        if (!*curr_l)
  1152. X            strcpy(curr_l, "0.0");
  1153. X
  1154. X        switch(ck) {
  1155. X            case 6:  /* wants to write file */
  1156. X            case 16:
  1157. X                if (Totcopy == ENA || Totcopy == AP) {
  1158. X                    show_total(1);
  1159. X                    Totcopy = DISA;
  1160. X                    close(Tc);
  1161. X                    Tc = -1;
  1162. X                }
  1163. X                else {
  1164. X                    show_total(0);
  1165. X                    (ck == 6) ? (Totcopy = ENA) : (Totcopy = AP);
  1166. X                }
  1167. X                hard(1);
  1168. X                break;
  1169. X
  1170. X            case 0:  /* normal return, did read line */
  1171. X                show_line(f_id, curr_l);
  1172. X                if (++f_id > FITCONV -3) {
  1173. X                    show_total(1);
  1174. X                    f_id = 1;
  1175. X                    for (ri = FITCONV - 2; --ri > 0; Su[ri] = 0.);
  1176. X                    Su[0] = Total;
  1177. X                    show_items();
  1178. X                }
  1179. X                show_total(0);
  1180. X                break;
  1181. X
  1182. X            case 'T':
  1183. X                show_line(f_id, curr_l);
  1184. X                show_total(1);
  1185. X                break;
  1186. X
  1187. X            case 1:
  1188. X                show_line(f_id, curr_l);
  1189. X                show_total(ck);
  1190. X                PYX;
  1191. X                Basq[TALYREQ] = ZERO;
  1192. X                update();
  1193. X                pfresh();
  1194. X                TR_
  1195. X                return;
  1196. X
  1197. X            case 3:   /* control-c, clear entire window */
  1198. X                f_id = 0;
  1199. X                for (ri = FITCONV - 2; --ri >= 0; Su[ri] = 0.);
  1200. X                show_items();
  1201. X                show_total(0);
  1202. X                break;
  1203. X
  1204. X            default:
  1205. X                if (ck > 64 && ck < 84) {   /* A through S */
  1206. X                    show_line(f_id, curr_l);
  1207. X                    show_total(0);
  1208. X                    f_id = ck - 'A';
  1209. X                }
  1210. X                else {
  1211. X                    if ((copy = ck - 97) < FITCONV - 2) /* a to s */
  1212. X                        sprintf(curr_l, "%*.*f", CONVMAX, Precision,
  1213. X                            Su[copy]);
  1214. X                    else /* t */
  1215. X                        sprintf(curr_l, "%*.*f", CONVMAX, Precision,
  1216. X                            Total);
  1217. X                    show_line(f_id, curr_l);
  1218. X                    if (++f_id > FITCONV -3) {
  1219. X                        show_total(1);
  1220. X                        f_id = 1;
  1221. X                        for (ri = FITCONV - 2; --ri > 0; Su[ri] = 0.);
  1222. X                        Su[0] = Total;
  1223. X                        show_items();
  1224. X                    }
  1225. X                    show_total(0);
  1226. X                }
  1227. X                break;
  1228. X        }
  1229. X    }
  1230. X}
  1231. X
  1232. Xshow_total(transfer)
  1233. Xint transfer;
  1234. X{
  1235. X    char floatbuf[WINLINE];
  1236. X    char hardbuf[WINLINE];
  1237. X    register char *fb = floatbuf;
  1238. X    register int rx;
  1239. X    register int ri;
  1240. X    struct  stk_cell *sr;
  1241. X    static char *fid = "show_total";
  1242. X    
  1243. X    _TR
  1244. X    Total = 0.;
  1245. X    for (ri = FITCONV - 2; --ri >= 0; Total += Su[ri]);
  1246. X    sprintf(fb, "%*.*f", CONVMAX, Precision, Total);
  1247. X    if ((ri = strlen(floatbuf)) <= CONVMAX) {
  1248. X        *(fb = floatbuf + ri++) = '.';
  1249. X        *++fb = 0;
  1250. X    }
  1251. X    for (fb = floatbuf + ri; --fb >= floatbuf;)
  1252. X        if (*fb == '.')
  1253. X            break;
  1254. X    if (fb < floatbuf)  {
  1255. X        Total = 0.;
  1256. X        sprintf(floatbuf, "%*.*f", CONVMAX, Precision, Total);
  1257. X    }
  1258. X    *((fb = floatbuf) + CONVMAX) = 0;
  1259. X    mvaddstr(TOP + FITCONV, CONVLEFT, fb);
  1260. X    if (transfer) {
  1261. X        if (Tc != -1) {
  1262. X            if (Hf != FXTER) {
  1263. X                if ((write(Tc, "\n", 1)) != 1)
  1264. X                    fatal("total write");
  1265. X                for (ri = UTOP; ri < UTOP + FITCONV - 2; ri++) {
  1266. X                    fb = hardbuf;
  1267. X                    *fb++ = ri + 'a' - UTOP;
  1268. X                    *fb++ = ' ';
  1269. X                    *fb++ = ' ';
  1270. X                    *fb++ = ' ';
  1271. X                    for (rx = CONVLEFT; rx < RBOUND -1; rx++)
  1272. X                        *fb++ = stdscr->_y[ri][rx] & 127;
  1273. X                    *fb = '\n';
  1274. X                    if ((write(Tc, hardbuf, 4+CONVMAX+1))
  1275. X                        != 4+CONVMAX+1)
  1276. X                        fatal("total 2 write");
  1277. X                }
  1278. X                if ((write(Tc,"    -----------------\nt   ", 26)) != 26)
  1279. X                    fatal("total 3 write");
  1280. X                if ((write(Tc, floatbuf, CONVMAX)) != CONVMAX)
  1281. X                    fatal("total 4 write");
  1282. X                if ((write(Tc, "\n\n", 2)) != 2)
  1283. X                    fatal("total 5 write");
  1284. X            }
  1285. X            else {
  1286. X                if ((write(Tc, floatbuf, CONVMAX)) != CONVMAX)
  1287. X                    fatal("total 6 write");
  1288. X                if ((write(Tc, "\n", 1)) != 1)
  1289. X                    fatal("total 7 write");
  1290. X            }
  1291. X        }
  1292. X        if (Stack == ENA)
  1293. X            pushstack(1);
  1294. X        /* strip trailing zeros */
  1295. X        for (fb = floatbuf + strlen(floatbuf); --fb >= floatbuf;)
  1296. X            if (*fb == '.')
  1297. X                break;
  1298. X        if (fb >= floatbuf) {
  1299. X            for (fb += strlen(fb); *--fb == '0'; *fb = 0);
  1300. X            if (*fb == '.')
  1301. X                *fb = 0;
  1302. X        }
  1303. X        /* strip preceding spaces */
  1304. X        for (fb = floatbuf; *fb == ' '; fb++);
  1305. X
  1306. X        sr = find(1);
  1307. X        sprintf(sr->cell, "%c %-*.*s", *(Base_str + 10),
  1308. X            STACKMAX-2, STACKMAX-2, fb);
  1309. X        show_stack();
  1310. X    }
  1311. X    TR_
  1312. X}
  1313. X
  1314. Xshow_line(f_id, buf)
  1315. Xint f_id;
  1316. Xchar *buf;
  1317. X{
  1318. X    char floatbuf[WINLINE];
  1319. X    char transbuf[WINLINE];
  1320. X    register char *fb;
  1321. X    register char *T = transbuf;
  1322. X    char *secp;
  1323. X    double thisval;
  1324. X    double first = 0., second;
  1325. X    int where, ri, oper = 0;
  1326. X    static char *fid = "show_line";
  1327. X    
  1328. X    _TR
  1329. X    where = UTOP + f_id;
  1330. X
  1331. X    /* strip embedded spaces */
  1332. X    fb = buf;
  1333. X    while (*fb) {
  1334. X        switch(*fb) {
  1335. X            case ' ':
  1336. X                break;
  1337. X            case '*':
  1338. X            case '@':
  1339. X                *T++ = 0;
  1340. X                secp = T;
  1341. X                oper = 1;
  1342. X                break;
  1343. X            case '+':
  1344. X                *T++ = 0;
  1345. X                secp = T;
  1346. X                oper = 2;
  1347. X                break;
  1348. X            default:
  1349. X                *T++ = *fb;
  1350. X                break;
  1351. X        }
  1352. X        fb++;
  1353. X    }
  1354. X    *T = 0;
  1355. X    switch(oper) {
  1356. X        case 0:
  1357. X        default:
  1358. X            thisval = atof(transbuf);
  1359. X            break;
  1360. X        case 1:
  1361. X            if (*transbuf) 
  1362. X                thisval = first = atof(transbuf);
  1363. X            if (*secp) {
  1364. X                second = atof(secp);
  1365. X                thisval = first * second;
  1366. X            }
  1367. X            break;
  1368. X        case 2:
  1369. X            if (*transbuf) 
  1370. X                thisval = first = atof(transbuf);
  1371. X            if (*secp) {
  1372. X                second = atof(secp);
  1373. X                if (second != 0.)
  1374. X                    thisval = first + second;
  1375. X            }
  1376. X            break;
  1377. X    }
  1378. X    Su[f_id] = thisval;
  1379. X    sprintf(floatbuf, "%*.*f", CONVMAX, Precision, thisval);
  1380. X    if ((ri = strlen(floatbuf)) <= CONVMAX) {
  1381. X        *(fb = floatbuf + ri++) = '.';
  1382. X        *++fb = 0;
  1383. X    }
  1384. X    for (fb = floatbuf + ri; --fb >= floatbuf;)
  1385. X        if (*fb == '.')
  1386. X            break;
  1387. X    if (fb < floatbuf)  {
  1388. X        Su[f_id] = 0.;
  1389. X        sprintf(floatbuf, "%*.*f", CONVMAX, Precision, Su[f_id]);
  1390. X    }
  1391. X    *((fb = floatbuf) + CONVMAX) = 0;
  1392. X    mvaddstr(where, CONVLEFT, floatbuf);
  1393. X    TR_
  1394. X}
  1395. X
  1396. Xshow_items()
  1397. X{
  1398. X    char floatbuf[WINLINE];
  1399. X    char *fb = floatbuf;
  1400. X    register int ri;
  1401. X    static char *fid = "show_items";
  1402. X
  1403. X    _TR
  1404. X    for (ri = FITCONV - 2; --ri >= 0;) {
  1405. X        sprintf(fb, "%*.*f", CONVMAX, Precision, Su[ri]);
  1406. X        *(fb + CONVMAX) = 0;
  1407. X        mvaddstr(UTOP + ri, CONVLEFT, fb);
  1408. X    }
  1409. X    TR_
  1410. X}
  1411. SHAR_EOF
  1412. $TOUCH -am 0221163890 total.c &&
  1413. chmod 0644 total.c ||
  1414. echo "restore of total.c failed"
  1415. set `wc -c total.c`;Wc_c=$1
  1416. if test "$Wc_c" != "8736"; then
  1417.     echo original size 8736, current size $Wc_c
  1418. fi
  1419. # ============= version.c ==============
  1420. echo "x - extracting version.c (Text)"
  1421. sed 's/^X//' << 'SHAR_EOF' > version.c &&
  1422. Xchar *version = "Wed Feb 21 16:39:20 EST 1990";
  1423. SHAR_EOF
  1424. $TOUCH -am 0221163990 version.c &&
  1425. chmod 0644 version.c ||
  1426. echo "restore of version.c failed"
  1427. set `wc -c version.c`;Wc_c=$1
  1428. if test "$Wc_c" != "48"; then
  1429.     echo original size 48, current size $Wc_c
  1430. fi
  1431. # ============= work.c ==============
  1432. echo "x - extracting work.c (Text)"
  1433. sed 's/^X//' << 'SHAR_EOF' > work.c &&
  1434. X/* work.c */
  1435. X/**********************************************************************
  1436. X*    File Name     : work.c
  1437. X*    Function      : general pac subroutines
  1438. X*    Author        : Istvan Mohos, 1987
  1439. X***********************************************************************/
  1440. X
  1441. X#include "defs.h"
  1442. X
  1443. Xclear_accwin()
  1444. X{
  1445. X    static char *fid = "clear_accwin";
  1446. X
  1447. X    _TR
  1448. X    mvaddstr(ACCUM,ULEFT,Sp44);
  1449. X    TR_
  1450. X}
  1451. X
  1452. X/* pointer should sit on a null byte, as given by things like
  1453. X   "buf + sizeof(buf)", fill backwards with spaces
  1454. X   including the next null byte found. */
  1455. Xrev_clear(ptr)
  1456. Xchar *ptr;
  1457. X{
  1458. X    register char *rp;
  1459. X    static char *fid = "rev_clear";
  1460. X
  1461. X    _TR
  1462. X    for (rp = ptr;;)
  1463. X        if (*--rp == '\0') {
  1464. X            *rp = ' ';
  1465. X             break;
  1466. X        }
  1467. X        else
  1468. X             *rp = ' ';
  1469. X    TR_
  1470. X}
  1471. X
  1472. Xclear_wline(ver, lbound, rbound, video, lines)
  1473. Xint ver, lbound, rbound, video, lines;
  1474. X{
  1475. X    register ri, rj;
  1476. X    static char *fid = "clear_wline";
  1477. X
  1478. X    _TR
  1479. X    if (!lines)
  1480. X        lines = 1;
  1481. X    if (video)
  1482. X        standout();
  1483. X    for (rj = ver+lines; --rj >= ver;) {
  1484. X        move(rj, lbound);
  1485. X        for (ri = rbound - lbound + 1; --ri >= 0; addch(' '));
  1486. X    }
  1487. X    if (video)
  1488. X        standend();
  1489. X    move(CY,CX);
  1490. X    TR_
  1491. X}
  1492. X
  1493. X/* spacefills string to max: digit characters, appends '\0'; in Tokbuf.
  1494. X   returns -1 if string is longer than digit */
  1495. X
  1496. Xspacefill(string, digits)
  1497. Xchar *string;
  1498. Xint digits;
  1499. X{
  1500. X    register char *reg_c;
  1501. X    register char r_count;
  1502. X    static char *fid = "spacefill";
  1503. X
  1504. X    _TR
  1505. X    if ((r_count = strlen(string)) > digits) {
  1506. X        TR_
  1507. X        return(-1);
  1508. X    }
  1509. X    strcpy(Tokbuf, string);
  1510. X    reg_c = &Tokbuf[r_count];
  1511. X    while(r_count < digits ) {
  1512. X        *reg_c++ = ' ';
  1513. X        ++r_count;
  1514. X    }
  1515. X    Tokbuf[digits] = '\0';
  1516. X    TR_
  1517. X    return(0);
  1518. X}
  1519. X
  1520. Xaddto_controlbuf(c_ptr)
  1521. Xchar *c_ptr;
  1522. X{
  1523. X    static char *fid = "addto_controlbuf";
  1524. X
  1525. X    _TR
  1526. X    strcat(Controlbuf, "\\\n"); /* prevent oversize input string */
  1527. X    strcat(Controlbuf, c_ptr);
  1528. X    TR_
  1529. X}
  1530. X
  1531. Xaddto_ubuf(c_ptr)
  1532. Xchar *c_ptr;
  1533. X{
  1534. X    static char *fid = "addto_ubuf";
  1535. X
  1536. X    _TR
  1537. X    strcat(Ubuf, "\\\n"); /* prevent oversize input string */
  1538. X    strcat(Ubuf, c_ptr);
  1539. X    TR_
  1540. X}
  1541. X
  1542. Xupcase(char_p)
  1543. Xchar *char_p;
  1544. X{
  1545. X    register char *rcp = char_p;
  1546. X    static char *fid = "upcase";
  1547. X
  1548. X    _TR
  1549. X    do
  1550. X        if (isalpha(*rcp))
  1551. X            *rcp &= 95;
  1552. X    while (*rcp++ != '\0');
  1553. X    TR_
  1554. X}
  1555. X
  1556. Xpacinit()
  1557. X{
  1558. X    Format    = FORM_DFLT;
  1559. X    (Format == COMMA_) ? (Separator = ',') : (Separator = ' ');
  1560. X    Hf        = HF_DFLT;
  1561. X    Ibase     = IB_DFLT;
  1562. X    Oldib     = IB_DFLT;
  1563. X    Obase     = OB_DFLT;
  1564. X    Oldob     = OB_DFLT;
  1565. X    Lastob    = OB_DFLT;
  1566. X    Show      = SHOW_DFLT;
  1567. X    Justify   = JUS_DFLT;
  1568. X    Precision = PREC_DFLT;
  1569. X    Stack     = STACK_DFLT;
  1570. X    Staybase  = DISA;
  1571. X    Autoconv  = DISA;
  1572. X}
  1573. X
  1574. Xint
  1575. Xround(nump, endp)
  1576. Xchar *nump, *endp;
  1577. X{
  1578. X    register char *fr, *to, *dp;
  1579. X    int done = 0;
  1580. X    int dpfound = 0;
  1581. X
  1582. X    for (fr = nump, dp = endp; --dp >= fr;)
  1583. X        if (*dp == '.') {
  1584. X            dpfound = 1;
  1585. X            break;
  1586. X        }
  1587. X
  1588. X    if (!dpfound)
  1589. X        return(-1);
  1590. X
  1591. X    fr = endp - 1;
  1592. X    if (*fr < 53) { /* last digit less than 5 */
  1593. X        *fr = '\0';
  1594. X        return(0);
  1595. X    }
  1596. X
  1597. X    /* write new values in freed-up byte at right */
  1598. X    for (to = endp - 1, done = 0; --fr > dp;) {
  1599. X        if (*fr == '9')
  1600. X            *to-- = '0';
  1601. X        else {
  1602. X            *to-- = *fr + 1;
  1603. X            done = 1;
  1604. X            break;
  1605. X        }
  1606. X    }
  1607. X
  1608. X    if (done) { /* left-shift new values back 1 byte */
  1609. X        for (dp = endp -1; to <= dp;)
  1610. X            *fr++  = *++to;
  1611. X        *dp = '\0';
  1612. X        return(0);
  1613. X    }
  1614. X
  1615. X    *to-- = *fr; /* new decimal point */
  1616. X
  1617. X    for (dp = nump, done = 0; --fr >= dp;) {
  1618. X        if (*fr == '9')
  1619. X            *to-- = '0';
  1620. X        else {
  1621. X            if (*fr > 47 && *fr < 57) {
  1622. X                *to-- = *fr + 1;
  1623. X                done = 1;
  1624. X                break;
  1625. X            }
  1626. X            else {        /* fr got to the left of the first digit */
  1627. X                *to = '1';
  1628. X                return(1);
  1629. X            }
  1630. X        }
  1631. X    }
  1632. X
  1633. X    if (done) { /* left-shift new values back 1 byte */
  1634. X        for (++to, dp = endp -1; to <= dp;)
  1635. X            *fr++  = *to++;
  1636. X        *dp = '\0';
  1637. X        return(0);
  1638. X    }
  1639. X
  1640. X    *dp = '1';
  1641. X    return(1);
  1642. X
  1643. X}
  1644. X
  1645. SHAR_EOF
  1646. $TOUCH -am 0221163890 work.c &&
  1647. chmod 0644 work.c ||
  1648. echo "restore of work.c failed"
  1649. set `wc -c work.c`;Wc_c=$1
  1650. if test "$Wc_c" != "4228"; then
  1651.     echo original size 4228, current size $Wc_c
  1652. fi
  1653. exit 0
  1654.  
  1655.  
  1656.