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

  1. /* convbase.c */
  2. /**********************************************************************
  3. *    File Name     : convbase.c
  4. *    Function      : use second bc pipe for conversion between radices
  5. *    Author        : Istvan Mohos, 1987
  6. ***********************************************************************/
  7.  
  8. #include "defs.h"
  9. #include "toktab.h"
  10. #define INTERMAP
  11. #include "maps.h"
  12. #undef INTERMAP
  13.  
  14. char *
  15. substivar(found, token, ib)
  16. char *token;
  17. int found, ib;
  18.     static char res[PIPEMAX];
  19.     static struct stk_cell *sr = &Stk[0];
  20.     static char *fid = "substivar";
  21.     char *ret = res;
  22.     int tokval;
  23.  
  24.     _TR
  25.     if (found == -1) {
  26.         if (token == ZERO) {
  27.             TR_
  28.             return(ZERO);
  29.         }
  30.         tokval = lookup(token);
  31.     }
  32.     else
  33.         tokval = found;
  34.  
  35.     switch(tokval) {
  36.         case H_:
  37.         case I_:
  38.         case J_:
  39.         case K_:
  40.         case L_:
  41.         case M_:
  42.         case N_:
  43.         case O_:
  44.         case P_:
  45.         case Q_:
  46.         case R_:
  47.         case S_:
  48.         case T_:
  49.         case U_:
  50.         case V_:
  51.         case W_:
  52.             onereg(*token - 'g');
  53.             conv_bc(Onebuf, res, 1, ib);
  54.             break;
  55.  
  56. case PI: conv_bc("3.1415926535897932384626433832795028841971693993751",
  57.                     res, 10, ib); break;
  58. case ASTRO:     conv_bc("149504200", res, 10, ib); break;
  59.                     /* km */
  60. case AMASS:     conv_bc(".00000000000000000000000165975",
  61.                     res, 10, ib); break; /* grams */
  62. case AVOGADRO:  conv_bc("602502000000000000000000",
  63.                     res, 10, ib); break; /* per g mole */
  64. case BOLTZMANN: conv_bc(".000000000000000138040", res, 10, ib); break;
  65.                     /* erg/Kelvin */
  66. case ECHARGE:   conv_bc(".000000000160202", res, 10, ib); break;
  67.                     /* esu */
  68. case CHROMA:    conv_bc("1.0594631", res, 10, ib); break;
  69. case EMASS:     conv_bc(".000000000000000000000000000910820",
  70.                     res, 10, ib); break; /* grams */
  71. case EULER:     conv_bc(".577216", res, 10, ib); break;
  72. case FARADAY:   conv_bc("96521900", res, 10, ib); break;
  73.                     /* C/kmole */
  74. case G_:        conv_bc("9.80665", res, 10, ib); break;
  75.                     /* m/s2 */
  76. case GAS:       conv_bc("83169600", res, 10, ib); break;
  77.                     /* erg/g mole Kelvin */
  78. case GRAVITY:   conv_bc(".00000000006673", res, 10, ib); break;
  79.                     /* N m2/kg2 */
  80. case HEAT:      conv_bc("4.1855", res, 10, ib); break;
  81.                     /* J/cal */
  82. case LIGHT:     conv_bc("299792.50", res, 10, ib); break;
  83.                     /* km/sec */
  84. case LIGHTYEAR: conv_bc("9460530000000", res, 10, ib); break;
  85.                     /* km */
  86. case MOONMASS:  conv_bc("73430000000000000000000", res, 10, ib); break;
  87.                     /* kg */
  88. case SUNMASS:   conv_bc("1987000000000000000000000000000",
  89.                     res, 10, ib); break; /* kg */
  90. case EARTHMASS: conv_bc("5976500000000000000000000",
  91.                     res, 10, ib); break; /* kg */
  92. case NATURAL:   conv_bc("2.7182818284590452353602874713526",
  93.                     res, 10, ib); break;
  94. case NMASS:     conv_bc(".00000000000000000000000167465",
  95.                     res, 10, ib); break; /* grams */
  96. case PARSEC:    conv_bc("30837450000000", res, 10, ib); break;
  97.                     /* km */
  98. case PARALLAX:  conv_bc("8.794", res, 10, ib); break;
  99.                     /* " */
  100. case PLANCK:    conv_bc(".00000000000000000000000000662491",
  101.                     res, 10, ib); break; /* erg sec */
  102. case PMASS:     conv_bc(".00000000000000000000000167235",
  103.                     res, 10, ib); break; /* grams */
  104. case MOONRAD:   conv_bc("1738000", res, 10, ib); break;
  105.                     /* meters */
  106. case SUNRAD:    conv_bc("696500000", res, 10, ib); break;
  107.                     /* meters */
  108. case EARTHRAD:  conv_bc("6378388", res, 10, ib); break;
  109.                     /* meters */
  110. case RYDBERG:   conv_bc("10973732.8", res, 10, ib); break;
  111.                     /* per meter */
  112. case SOUND:     conv_bc("340.505", res, 10, ib); break;
  113.                     /* meters/sec: 331.4 + (.607 * Celsius) */
  114. case STEFAN:    conv_bc(".000000056693", res, 10, ib); break;
  115.                     /* J/m2 Kelvin4 sec */
  116. case TOMOON:    conv_bc("384400", res, 10, ib); break;
  117.                     /* km */
  118. case TOSUN:     conv_bc("149500000", res, 10, ib); break;
  119.                     /* km */
  120. case WIEN:      conv_bc(".289778", res, 10, ib); break;
  121.                     /* cm Kelvin */
  122.  
  123. case MILLI:     conv_bc(".001", res, 10, ib); break;
  124. case MICRO:     conv_bc(".000001", res, 10, ib); break;
  125. case NANO:      conv_bc(".000000001", res, 10, ib); break;
  126. case PICO:      conv_bc(".000000000001", res, 10, ib); break;
  127. case FEMTO:     conv_bc(".000000000000001", res, 10, ib); break;
  128. case ATTO:      conv_bc(".000000000000000001", res, 10, ib); break;
  129. case KILO:      conv_bc("1000", res, 10, ib); break;
  130. case MEGA:      conv_bc("1000000", res, 10, ib); break;
  131. case GIGA:      conv_bc("1000000000", res, 10, ib); break;
  132. case TERA:      conv_bc("1000000000000", res, 10, ib); break;
  133. case PETA:      conv_bc("1000000000000000", res, 10, ib); break;
  134. case EXA:       conv_bc("1000000000000000000", res, 10, ib); break;
  135.  
  136.         case X_LOWER:
  137.         case X_UPPER:
  138.             sprintf(res, "%s", sixteen[Ibase]);
  139.             break;
  140.  
  141.         case BACKSLASH:
  142.             conv_bc(sr->cell, res, 1, ib);
  143.             break;
  144.  
  145.         case NOTINLIST:    /* presumably a digit string */
  146.             upcase(token);
  147.             ret = token;
  148.             break;
  149.  
  150.         default: /* token in list, but is not variable or constant */
  151.             ret = Convbuf;   /* just to warn the caller */
  152.             break;
  153.     }
  154.     TR_
  155.     return(ret);
  156. }
  157.  
  158. /* translate frombuf number string in frombase radix,
  159.    to string in tobuf in tobase radix.
  160.  
  161.    If frombase and tobase are identical no conversion is done;
  162.    buffer is simply copied.
  163.    Otherwise, conv_pipe's ibase is set to the frombase radix,
  164.    conv_pipe's obase is set to tobase, and the frombuf
  165.    string is executed through conv_pipe.
  166.  
  167.    If frombase is 0, Lastob is taken as frombase.
  168.    If frombase is -1, Ibase is taken as frombase.
  169.    If frombase is 1, frombase is deduced from the first character
  170.        of frombuf in stack string format.
  171.  
  172.    If tobuf is ZERO, result goes to Convbuf.  Else tobuf must
  173.    be at least PIPEMAX long.
  174. */
  175.  
  176. conv_bc(frombuf, tobuf, frombase, tobase)
  177. char *frombuf, *tobuf;
  178. int frombase, tobase;
  179. {
  180.     int value, maxchars;
  181.     int charcount = 0;
  182.     register char *bptr, *toasc_p;
  183.     static char *fid = "conv_bc";
  184.  
  185.     _TR
  186.     bptr = frombuf;
  187.     if (tobase == 0)
  188.         tobase = Ibase;
  189.     maxchars = strlen(frombuf);
  190.     if (tobuf == ZERO)
  191.         tobuf = Convbuf;
  192.  
  193.     switch (frombase) {
  194.         case 1:
  195.             charcount = 1;
  196.             value = *bptr & 127; /* ascii value of passed radix label */
  197.             for (toasc_p = Base_str + 16;; toasc_p--) {
  198.                 if (*toasc_p == value) {
  199.                     frombase = toasc_p - Base_str;
  200.                     break;
  201.                 }
  202.             }
  203.             while ((*++bptr & 127) == ' ') /* get to digit string */
  204.                 ++charcount;
  205.             break;
  206.  
  207.         case -1:
  208.             frombase = Ibase;
  209.             break;
  210.  
  211.         case 0:
  212.             frombase = Lastob;
  213.             break;
  214.  
  215.         default:
  216.             break;
  217.  
  218.     }
  219.  
  220.     if (frombase == tobase) {
  221.         toasc_p = tobuf;
  222.         while(charcount++ < maxchars)
  223.             if ((*bptr & 127) != ' ')
  224.                 *toasc_p++ = *bptr++ & 127;
  225.             else
  226.                 ++bptr;
  227.         *toasc_p = '\0';
  228.     }
  229.     else {
  230.         sprintf(Mop, "ibase=A;obase=%d;ibase=%d\n", tobase, frombase);
  231.         toasc_p = &Mop[strlen(Mop)];
  232.         while(charcount++ < maxchars)
  233.             *toasc_p++ = *bptr++ & 127;
  234.         *toasc_p++ = '\n';
  235.         *toasc_p = '\0';
  236.         if (write (B_write[1], Mop, strlen(Mop)) == -1)
  237.             fatal("wait_conv_pipe write");
  238.         wait_conv_pipe(tobuf);
  239.     }
  240.     TR_
  241. }
  242.  
  243.