home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / library / dos / math / pac / pac.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-06-05  |  6.3 KB  |  228 lines

  1. /* pac.c */
  2. /**********************************************************************
  3. *    File Name     : pac.c
  4. *    Object        : pac - 32 digit panel calculator
  5. *    Compile       : makefile, use -DREALUNIX for sysV
  6. *    Author        : Istvan Mohos, 1987
  7. *    Version 1.0   : target completion date Aug 1987
  8. *    Version 1.1   : sysV port, bug-fixes, tuning: Feb 1988
  9. *    Version 1.2   : various excellent signal/attribute changes from
  10. *                  :   uunet!auspex!guy (Guy Harris), Jul 19 1989
  11. *                  : Xenix286 flags by rex!mgse!marks (Mark Seiffert)
  12. ***********************************************************************/
  13.  
  14. #define MAIN
  15. #include "defs.h"
  16. #undef MAIN
  17. #define PACMAP
  18. #include "maps.h"
  19. #undef PACMAP
  20.  
  21. extern char *version;
  22.  
  23. main()
  24. {
  25.  
  26.     char calbuf[LINEMAX];
  27.     register char *uwcp;
  28.     register int ri;
  29.     int rj, wlen;
  30.     int rc, intact = 0;
  31.  
  32. #ifdef DEBUG
  33.     if ((Dfp = fopen("debugfile", "w")) == NULL)
  34.         go_away("can't write debugfile", 1);
  35. #endif
  36.  
  37.     Titlq[0] = Sb[0];
  38.     Basq[0] = Bb[0];
  39.     pipes();
  40.     initscr();
  41.  
  42. /*  
  43. even though I always strip off the eigth bit of fgetc, it may be a
  44. good idea to set terminal parity to Space */
  45.     raw();
  46.     crmode();
  47.     noecho();
  48.     if (signal(SIGHUP, SIG_IGN) == SIG_DFL)
  49.         signal(SIGHUP, go_away);
  50.     if (signal(SIGINT, SIG_IGN) == SIG_DFL)
  51.         signal(SIGINT, go_away);
  52.     if (signal(SIGTERM, SIG_IGN) == SIG_DFL)
  53.         signal(SIGTERM, go_away);
  54.     if (signal(SIGQUIT, SIG_IGN) == SIG_DFL)
  55.         signal(SIGQUIT, go_away);
  56.  
  57.     Context = TRUE;   /* go_away() instead of exit() on error */
  58.     onlay();    /* don't need to "update()" */
  59.  
  60.     if ((Home = getenv("HOME")) == ZERO)
  61.         Rcerr = TRUE;
  62.     else {
  63.         strcpy(Rcfile, Home);
  64.         strcat(Rcfile, "/.pacrc");
  65.     }
  66.     if (!Rcerr) {
  67.         if ((Rcfd = open(Rcfile, 0))  == -1)
  68.             Rcerr = TRUE;
  69.         else {
  70.             read_rc();
  71.             close(Rcfd);
  72.         }
  73.     }
  74.     if (Rcerr) {
  75.         setup_uconv();
  76.         fill_stack(ZERO);
  77.     }
  78.  
  79.     if (Autotime == ENA) {
  80.         Clockstat = ENA;
  81.         cdate();
  82.     }
  83.     Oldib = Ibase;
  84.     Oldob = Obase;
  85.     show_stack();
  86.     show_uconv();
  87.     show_loan(0);
  88.  
  89. /* window print field width:
  90. 123456789 123456789 123456789 123456789 1234
  91. */
  92.     sprintf(Mop, "\
  93. pac version: 1.2                            \
  94. last remake: %-*.*s\
  95. author: istvan mohos  0;ib a;pr %d;ob %c;ib %c",
  96.         31,31,version,
  97.         Precision, Base_str[Oldob], Base_str[Oldib]);
  98.  
  99.     strcpy(Uwin_copy, Mop);
  100.     uwcp = Uwin_copy + strlen(Mop);  /* pad with spaces at end */
  101.     wlen = (UBOT - UTOP) * (URIGHT+1 - ULEFT) - (uwcp - Uwin_copy);
  102.     for (ri = wlen; --ri >= 0; *uwcp++ = ' ');
  103.     *uwcp = '\0';
  104.  
  105.     interpret(Mop);
  106.     move(CY=UTOP, CX=ULEFT);
  107.     Painted = TRUE;   /* from now on, Mainbuf may be pushed on Stack */
  108.  
  109.     while (TRUE) {
  110.         if (Clockstat == DISA)
  111.             Titlq[Tqlev] = Sb[Tqlev];
  112.         else
  113.             Titlq[Tqlev] = Cb[Tqlev];
  114.  
  115.         if (O_conv == FALSE) {
  116.             Basq[CONVREQ] = ZERO;
  117.             update();
  118.         }
  119.  
  120.         /* ledit starts with pfresh() */
  121.         rc = ledit(calbuf,cal_map,0,ULEFT,URIGHT,0,0,intact);
  122.         intact = 1;
  123.  
  124.         switch(rc) {
  125.  
  126.         default:
  127.             break;
  128.  
  129. #ifdef DESIGN
  130.         case 21 :                /* ^U */
  131.             write_scr("rawscreen", 1);
  132.             break;
  133.         case 25 :                /* ^Y */
  134.             write_scr("pacscreen", 0);
  135.             break;
  136. #endif
  137.  
  138.         case 1:                  /* ^A: ascii char to dec, hex, oct */
  139.         case 4:                  /* ^D: 3 decimal digits to ... */
  140.         case 15:                 /* ^O: 3 octal digits to ... */
  141.         case 24:                 /* ^X: 2 hex digits to ... */
  142.             byte_conv(rc);
  143.             break;
  144.  
  145.         case 11 :
  146.             if (Clockstat == DISA) { 
  147.                 Clockstat = ENA;
  148.                 cdate();
  149.             }
  150.             else {
  151.                 Clockstat = DISA;
  152.                 clockoff();
  153.                 update();
  154.                 pfresh();
  155.             }
  156.             break;                /* ^Klock  */
  157.  
  158.         case 6 :                  /* write to hardcopy */
  159.         case 16 :
  160.             if (Hardcopy == ENA || Hardcopy == AP) {
  161.                 Hardcopy = DISA;
  162.                 close(Hc);
  163.                 Hc = -1;
  164.             }
  165.             else
  166.                 (rc == 6) ? (Hardcopy = ENA) : (Hardcopy = AP);
  167.             hard(0);
  168.             break;
  169.  
  170.         case 12 :
  171.             show_loan(1);
  172.             break;                /* ^L show_loan */
  173.  
  174.         case 7:                   /* ^Globals */
  175.             if (Statopts)
  176.                 show_stat();
  177.             else
  178.                 show_param();
  179.             break;
  180.  
  181.         case 14:                  /* ^N add new conversion */
  182.             newconv();
  183.             break;
  184.  
  185.         case 20:                  /* ^Total */
  186.             total();
  187.             break;
  188.  
  189.         case 61:                  /* '=' redo previous window */
  190.             for (uwcp = Uwin_copy, rj = UTOP; rj <= UBOT; rj++)
  191.                 for (ri = ULEFT; ri <= URIGHT; ri++)
  192.                     mvaddch(rj, ri, *uwcp++);
  193.             move(CY=UTOP, CX=ULEFT);
  194.             pfresh();
  195.             break;
  196.  
  197.         case 0:
  198.             intact = 0;
  199.             if (*calbuf == '#') {
  200.                 if ( Hc != -1 && Hf != FXTER) {
  201.                     for (uwcp=calbuf+strlen(calbuf); --uwcp > calbuf;)
  202.                         if (*uwcp > 32)
  203.                             break;
  204.                     *++uwcp = '\n';
  205.                     *++uwcp = '\0';
  206.                     ri = strlen(calbuf);
  207.                     if (write(Hc, calbuf, ri) != ri)
  208.                         fatal("comment write");
  209.                 }
  210.                 break;
  211.             }
  212.             Oldib = Ibase;
  213.             Oldob = Obase;
  214.             strcpy(Uwin_copy, calbuf);
  215.             interpret(calbuf);
  216.             if (Staybase == DISA) {
  217.                 Obase = Oldob;
  218.                 Ibase = Oldib;
  219.                 sprintf(Mop, "ibase=A;obase=%d;ibase=%d\n",
  220.                     Obase, Ibase);
  221.                 addto_controlbuf(Mop);
  222.                 show_result(0);
  223.             }
  224.             break;
  225.         }
  226.     }
  227. }
  228.