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

  1. /* total.c */
  2. /**********************************************************************
  3. *    File Name     : total.c
  4. *    Function      : pac checkbook balancer (totalizer)
  5. *    Author        : Istvan Mohos, 1987
  6. ***********************************************************************/
  7.  
  8. #include "defs.h"
  9. #define TOTALMAP
  10. #include "maps.h"
  11. #undef TOTALMAP
  12.  
  13. static double Su[FITCONV - 2];
  14. static double Total;
  15.  
  16. total()
  17. {
  18.     int pyp, pxp;
  19.     char curr_l[CONVMAX + 1];
  20.     register int ri, rj;
  21.     static int f_id = 0;
  22.     int where, ck, copy;
  23.     static char *fid = "total";
  24.     
  25.     _TR
  26.     CYX;
  27.     Tqlev = TALYREQ;
  28.     if (Clockstat == DISA)
  29.         Titlq[TALYREQ] = Sb[TALYREQ];
  30.     else
  31.         Titlq[TALYREQ] = Cb[TALYREQ];
  32.     Basq[TALYREQ] = Bb[TALYREQ];
  33.     standout();
  34.     for (ri = FITCONV - 2, rj = 115; --ri >= 0; rj--)
  35.         mvaddch(UTOP + ri, RBOUND, rj);
  36.     mvaddch(TOP + FITCONV, RBOUND, 't');
  37.     standend();
  38.     clear_wline(TOP+FITCONV-1, CONVLEFT, RBOUND-2, 0, 1);
  39.     show_items();
  40.     show_total(0);
  41.     update();
  42.  
  43.     while(1) {
  44.     
  45.         where = UTOP + f_id;
  46.         if (Su[f_id] == 0.)
  47.             clear_wline(where, CONVLEFT, RBOUND-2, 0, 1);
  48.     
  49.  
  50.         ck = ledit(curr_l, tot_map, where, CONVLEFT, RBOUND-2, 0, 1, 1);
  51.     
  52.         if (!*curr_l)
  53.             strcpy(curr_l, "0.0");
  54.  
  55.         switch(ck) {
  56.             case 6:  /* wants to write file */
  57.             case 16:
  58.                 if (Totcopy == ENA || Totcopy == AP) {
  59.                     show_total(1);
  60.                     Totcopy = DISA;
  61.                     close(Tc);
  62.                     Tc = -1;
  63.                 }
  64.                 else {
  65.                     show_total(0);
  66.                     (ck == 6) ? (Totcopy = ENA) : (Totcopy = AP);
  67.                 }
  68.                 hard(1);
  69.                 break;
  70.  
  71.             case 0:  /* normal return, did read line */
  72.                 show_line(f_id, curr_l);
  73.                 if (++f_id > FITCONV -3) {
  74.                     show_total(1);
  75.                     f_id = 1;
  76.                     for (ri = FITCONV - 2; --ri > 0; Su[ri] = 0.);
  77.                     Su[0] = Total;
  78.                     show_items();
  79.                 }
  80.                 show_total(0);
  81.                 break;
  82.  
  83.             case 'T':
  84.                 show_line(f_id, curr_l);
  85.                 show_total(1);
  86.                 break;
  87.  
  88.             case 1:
  89.                 show_line(f_id, curr_l);
  90.                 show_total(ck);
  91.                 PYX;
  92.                 Basq[TALYREQ] = ZERO;
  93.                 update();
  94.                 pfresh();
  95.                 TR_
  96.                 return;
  97.  
  98.             case 3:   /* control-c, clear entire window */
  99.                 f_id = 0;
  100.                 for (ri = FITCONV - 2; --ri >= 0; Su[ri] = 0.);
  101.                 show_items();
  102.                 show_total(0);
  103.                 break;
  104.  
  105.             default:
  106.                 if (ck > 64 && ck < 84) {   /* A through S */
  107.                     show_line(f_id, curr_l);
  108.                     show_total(0);
  109.                     f_id = ck - 'A';
  110.                 }
  111.                 else {
  112.                     if ((copy = ck - 97) < FITCONV - 2) /* a to s */
  113.                         sprintf(curr_l, "%*.*f", CONVMAX, Precision,
  114.                             Su[copy]);
  115.                     else /* t */
  116.                         sprintf(curr_l, "%*.*f", CONVMAX, Precision,
  117.                             Total);
  118.                     show_line(f_id, curr_l);
  119.                     if (++f_id > FITCONV -3) {
  120.                         show_total(1);
  121.                         f_id = 1;
  122.                         for (ri = FITCONV - 2; --ri > 0; Su[ri] = 0.);
  123.                         Su[0] = Total;
  124.                         show_items();
  125.                     }
  126.                     show_total(0);
  127.                 }
  128.                 break;
  129.         }
  130.     }
  131. }
  132.  
  133. show_total(transfer)
  134. int transfer;
  135. {
  136.     char floatbuf[WINLINE];
  137.     char hardbuf[WINLINE];
  138.     register char *fb = floatbuf;
  139.     register int rx;
  140.     register int ri;
  141.     struct  stk_cell *sr;
  142.     static char *fid = "show_total";
  143.     
  144.     _TR
  145.     Total = 0.;
  146.     for (ri = FITCONV - 2; --ri >= 0; Total += Su[ri]);
  147.     sprintf(fb, "%*.*f", CONVMAX, Precision, Total);
  148.     if ((ri = strlen(floatbuf)) <= CONVMAX) {
  149.         *(fb = floatbuf + ri++) = '.';
  150.         *++fb = 0;
  151.     }
  152.     for (fb = floatbuf + ri; --fb >= floatbuf;)
  153.         if (*fb == '.')
  154.             break;
  155.     if (fb < floatbuf)  {
  156.         Total = 0.;
  157.         sprintf(floatbuf, "%*.*f", CONVMAX, Precision, Total);
  158.     }
  159.     *((fb = floatbuf) + CONVMAX) = 0;
  160.     mvaddstr(TOP + FITCONV, CONVLEFT, fb);
  161.     if (transfer) {
  162.         if (Tc != -1) {
  163.             if (Hf != FXTER) {
  164.                 if ((write(Tc, "\n", 1)) != 1)
  165.                     fatal("total write");
  166.                 for (ri = UTOP; ri < UTOP + FITCONV - 2; ri++) {
  167.                     fb = hardbuf;
  168.                     *fb++ = ri + 'a' - UTOP;
  169.                     *fb++ = ' ';
  170.                     *fb++ = ' ';
  171.                     *fb++ = ' ';
  172.                     for (rx = CONVLEFT; rx < RBOUND -1; rx++)
  173.                         *fb++ = stdscr->_y[ri][rx] & 127;
  174.                     *fb = '\n';
  175.                     if ((write(Tc, hardbuf, 4+CONVMAX+1))
  176.                         != 4+CONVMAX+1)
  177.                         fatal("total 2 write");
  178.                 }
  179.                 if ((write(Tc,"    -----------------\nt   ", 26)) != 26)
  180.                     fatal("total 3 write");
  181.                 if ((write(Tc, floatbuf, CONVMAX)) != CONVMAX)
  182.                     fatal("total 4 write");
  183.                 if ((write(Tc, "\n\n", 2)) != 2)
  184.                     fatal("total 5 write");
  185.             }
  186.             else {
  187.                 if ((write(Tc, floatbuf, CONVMAX)) != CONVMAX)
  188.                     fatal("total 6 write");
  189.                 if ((write(Tc, "\n", 1)) != 1)
  190.                     fatal("total 7 write");
  191.             }
  192.         }
  193.         if (Stack == ENA)
  194.             pushstack(1);
  195.         /* strip trailing zeros */
  196.         for (fb = floatbuf + strlen(floatbuf); --fb >= floatbuf;)
  197.             if (*fb == '.')
  198.                 break;
  199.         if (fb >= floatbuf) {
  200.             for (fb += strlen(fb); *--fb == '0'; *fb = 0);
  201.             if (*fb == '.')
  202.                 *fb = 0;
  203.         }
  204.         /* strip preceding spaces */
  205.         for (fb = floatbuf; *fb == ' '; fb++);
  206.  
  207.         sr = find(1);
  208.         sprintf(sr->cell, "%c %-*.*s", *(Base_str + 10),
  209.             STACKMAX-2, STACKMAX-2, fb);
  210.         show_stack();
  211.     }
  212.     TR_
  213. }
  214.  
  215. show_line(f_id, buf)
  216. int f_id;
  217. char *buf;
  218. {
  219.     char floatbuf[WINLINE];
  220.     char transbuf[WINLINE];
  221.     register char *fb;
  222.     register char *T = transbuf;
  223.     char *secp;
  224.     double thisval;
  225.     double first = 0., second;
  226.     int where, ri, oper = 0;
  227.     static char *fid = "show_line";
  228.     
  229.     _TR
  230.     where = UTOP + f_id;
  231.  
  232.     /* strip embedded spaces */
  233.     fb = buf;
  234.     while (*fb) {
  235.         switch(*fb) {
  236.             case ' ':
  237.                 break;
  238.             case '*':
  239.             case '@':
  240.                 *T++ = 0;
  241.                 secp = T;
  242.                 oper = 1;
  243.                 break;
  244.             case '+':
  245.                 *T++ = 0;
  246.                 secp = T;
  247.                 oper = 2;
  248.                 break;
  249.             default:
  250.                 *T++ = *fb;
  251.                 break;
  252.         }
  253.         fb++;
  254.     }
  255.     *T = 0;
  256.     switch(oper) {
  257.         case 0:
  258.         default:
  259.             thisval = atof(transbuf);
  260.             break;
  261.         case 1:
  262.             if (*transbuf) 
  263.                 thisval = first = atof(transbuf);
  264.             if (*secp) {
  265.                 second = atof(secp);
  266.                 thisval = first * second;
  267.             }
  268.             break;
  269.         case 2:
  270.             if (*transbuf) 
  271.                 thisval = first = atof(transbuf);
  272.             if (*secp) {
  273.                 second = atof(secp);
  274.                 if (second != 0.)
  275.                     thisval = first + second;
  276.             }
  277.             break;
  278.     }
  279.     Su[f_id] = thisval;
  280.     sprintf(floatbuf, "%*.*f", CONVMAX, Precision, thisval);
  281.     if ((ri = strlen(floatbuf)) <= CONVMAX) {
  282.         *(fb = floatbuf + ri++) = '.';
  283.         *++fb = 0;
  284.     }
  285.     for (fb = floatbuf + ri; --fb >= floatbuf;)
  286.         if (*fb == '.')
  287.             break;
  288.     if (fb < floatbuf)  {
  289.         Su[f_id] = 0.;
  290.         sprintf(floatbuf, "%*.*f", CONVMAX, Precision, Su[f_id]);
  291.     }
  292.     *((fb = floatbuf) + CONVMAX) = 0;
  293.     mvaddstr(where, CONVLEFT, floatbuf);
  294.     TR_
  295. }
  296.  
  297. show_items()
  298. {
  299.     char floatbuf[WINLINE];
  300.     char *fb = floatbuf;
  301.     register int ri;
  302.     static char *fid = "show_items";
  303.  
  304.     _TR
  305.     for (ri = FITCONV - 2; --ri >= 0;) {
  306.         sprintf(fb, "%*.*f", CONVMAX, Precision, Su[ri]);
  307.         *(fb + CONVMAX) = 0;
  308.         mvaddstr(UTOP + ri, CONVLEFT, fb);
  309.     }
  310.     TR_
  311. }
  312.