home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS - Coast to Coast / simteldosarchivecoasttocoast2.iso / awk / awk320sr.zip / AWKMATH.C < prev    next >
C/C++ Source or Header  |  1991-04-25  |  3KB  |  118 lines

  1. /*
  2.  * Awk math operations
  3.  *
  4.  * Copyright (C) 1988, 1989, 1990, 1991 by Rob Duff
  5.  * All rights reserved
  6.  */
  7.  
  8. #include <math.h>
  9. #include "awkfstr.h"
  10. #include "awk.h"
  11.  
  12. /*
  13.  * Perform arithmetic calculations
  14.  */
  15. void arithmetic(int op, ITEM *a, ITEM *b, ITEM *c)
  16. {
  17.     double  ad, bd;
  18.  
  19.     c->sclass = ACTUAL;
  20.     c->stype = S_DOUBLE;
  21.     bd = todouble(b);
  22.     ad = todouble(a);
  23.     switch(op) {
  24.     case C_MUL: c->svalue.dval = (ad * bd); break;
  25.     case C_DIV: c->svalue.dval = (ad / bd); break;
  26.     case C_MOD: c->svalue.dval = fmod(ad, bd); break;
  27.     case C_SUB: c->svalue.dval = (ad - bd); break;
  28.     case C_ADD: c->svalue.dval = (ad + bd); break;
  29.     case C_POW: c->svalue.dval = pow(ad, bd); break;
  30.     default:  c->svalue.dval = 0;
  31.     }
  32.     c->sstr = nullstr;
  33. }
  34.  
  35. /*
  36.  * compare numbers and strings
  37.  */
  38. void compare(int op, ITEM *a, ITEM *b, ITEM *c)
  39. {
  40.     int     sc;
  41.     double  ad, bd;
  42.     FSTR    as, bs;
  43.  
  44.     c->sclass = ACTUAL;
  45.     c->stype = S_SHORT;
  46.     if (a->stype <= S_NUMBER && b->stype <= S_NUMBER) {
  47.         bd = todouble(b);
  48.         ad = todouble(a);
  49.         switch(op) {
  50.         case C_EQ: c->svalue.ival = (ad == bd); break;
  51.         case C_NE: c->svalue.ival = (ad != bd); break;
  52.         case C_LT: c->svalue.ival = (ad <  bd); break;
  53.         case C_GT: c->svalue.ival = (ad >  bd); break;
  54.         case C_LE: c->svalue.ival = (ad <= bd); break;
  55.         case C_GE: c->svalue.ival = (ad >= bd); break;
  56.         default: c->svalue.ival = 0;
  57.         }
  58.     }
  59.     else {
  60.         as = onestring(a);
  61.         bs = tostring(b);
  62.         sc = fstrcmp(as+1, bs+1);
  63.         switch (op) {
  64.         case C_EQ: c->svalue.ival = (sc == 0); break;
  65.         case C_NE: c->svalue.ival = (sc != 0); break;
  66.         case C_LT: c->svalue.ival = (sc <  0); break;
  67.         case C_GT: c->svalue.ival = (sc >  0); break;
  68.         case C_LE: c->svalue.ival = (sc <= 0); break;
  69.         case C_GE: c->svalue.ival = (sc >= 0); break;
  70.         default: c->svalue.ival = 0;
  71.         }
  72.     }
  73.     c->sstr = nullstr;
  74. }
  75.  
  76. /*
  77.  * double single argument function
  78.  */
  79. void dfunc1(int op, ITEM *a, ITEM *c)
  80. {
  81.     double  ad;
  82.  
  83.     c->sclass = ACTUAL;
  84.     c->stype = S_DOUBLE;
  85.     ad = todouble(a);
  86.     switch (op) {
  87.     case C_NUM:   c->svalue.dval = ad; break;
  88.     case C_NEG:   c->svalue.dval = -ad; break;
  89.     case C_COS:   c->svalue.dval = cos(ad); break;
  90.     case C_EXP:   c->svalue.dval = exp(ad); break;
  91.     case C_LOG:   c->svalue.dval = log(ad); break;
  92.     case C_SIN:   c->svalue.dval = sin(ad); break;
  93.     case C_SQRT:  c->svalue.dval = sqrt(ad); break;
  94.     default:    c->svalue.dval = 0;
  95.     }
  96.     c->sstr = nullstr;
  97. }
  98.  
  99. /*
  100.  * double double argument function
  101.  */
  102. void dfunc2(int op, ITEM *a, ITEM *b, ITEM *c)
  103. {
  104.     double  ad, bd;
  105.  
  106.     c->sclass = ACTUAL;
  107.     c->stype = S_DOUBLE;
  108.     ad = todouble(a);
  109.     bd = todouble(b);
  110.     switch (op) {
  111.     case C_ATAN2: c->svalue.dval = atan2(ad, bd); break;
  112.     case C_POW:   c->svalue.dval = pow(ad, bd); break;
  113.     default:    c->svalue.dval = 0;
  114.     }
  115.     c->sstr = nullstr;
  116. }
  117.  
  118.