home *** CD-ROM | disk | FTP | other *** search
/ Chip 2003 November / Chip_2003-11_cd1.bin / software / dave / dqsd.exe / calculate.js < prev    next >
Text File  |  2002-12-14  |  5KB  |  222 lines

  1. // offline calculator
  2. function calculate(expr)
  3. {
  4.   if (expr.match(/=ERR$/))
  5.     return;
  6.  
  7.   try
  8.   {
  9.     with(Math)
  10.     {
  11.       var answer = eval(expr);
  12.       if (typeof(answer) == "number")
  13.       {
  14.         // for the sake of pretty decimal numbers,
  15.         // round numbers that are very close to a ten-millionth
  16.         if (abs(answer) >= 0.001 &&
  17.             abs(round(answer * 1e+7) - answer * 1e+7) < 0.001)
  18.           answer = round(answer * 1e+7)/1e+7;
  19.       }
  20.       setSearchWindowText(answer, true);
  21.     }
  22.   }
  23.   catch (exception)
  24.   {
  25.     setSearchWindowText(expr + "=ERR=", true);
  26.   }
  27.  
  28.   savevars();
  29. }
  30.  
  31. // based log functions
  32. function log10(n) { return ln(n)/ln10; }
  33. function log2(n) { return ln(n)/ln2; }
  34.  
  35. // hex conversion for use in calculator
  36. function hex(i)
  37. {
  38.   hexChars = "0123456789abcdef";
  39.   var h = "";
  40.   var n = 256;
  41.  
  42.   while (i < 0)
  43.   {
  44.      if (i + n / 16 > 0) { i += n; break; }
  45.      n = n * n;
  46.   }
  47.  
  48.   while (i > 0)
  49.   {
  50.      h = hexChars.charAt(i % 16) + h;
  51.      i = Math.floor(i / 16);
  52.   }
  53.  
  54.   if (h == "")
  55.      h = "0";
  56.  
  57.   return "0x" + h;
  58. }
  59.  
  60. // octal conversion for use in calculator
  61. function oct(i)
  62. {
  63.   octChars = "01234567";
  64.   var h = "";
  65.   var n = 512;
  66.  
  67.   while (i < 0)
  68.   {
  69.      if (i + n / 8 > 0) { i += n; break; }
  70.      n = n * n;
  71.   }
  72.  
  73.   while (i > 0)
  74.   {
  75.      h = octChars.charAt(i % 8) + h;
  76.      i = Math.floor(i / 8);
  77.   }
  78.  
  79.   if (h == "")
  80.      h = "0";
  81.  
  82.   return "0" + h;
  83. }
  84.  
  85. // binary conversion for use in calculator
  86. function bin(i)
  87. {
  88.   binChars = "01";
  89.   var h = "";
  90.   var n = 16;
  91.  
  92.   while (i < 0)
  93.   {
  94.      if (i + n / 2 > 0) { i += n; break; }
  95.      n = n * n;
  96.   }
  97.  
  98.   while (i > 0)
  99.   {
  100.      h = binChars.charAt(i % 2) + h;
  101.      i = Math.floor(i / 2);
  102.   }
  103.  
  104.   if (h == "")
  105.      h = "0";
  106.  
  107.   return h;
  108. }
  109.  
  110.  
  111. // detect numeric math expressions to execute right away
  112. function mathexp(t)
  113. {
  114.   // chop out variables
  115.   var noconst = t.replace(/\b(PI|E|LOG2E|LOG10E|LN2|LN10|SQRT2|SQRT1_2|pi)\b/g, "_");
  116.   // experiment: also allow "longvarname="
  117.   var noconst = noconst.replace(/^[a-zA-Z_]+\s*=/, "a=");
  118.   // it's only an expression if it ends with a digit, paren, or variable
  119.   if (!noconst.match(/\b[a-z]$|[_\d\)]$/)) return false;
  120.   // chop out function names
  121.   var nofunc = noconst.replace(/\b(ln|log10|log2|hex|oct|bin|abs|acos|asin|atan|atan2|ceil|cos|exp|floor|log|max|min|pow|random|round|sin|sqrt|tan)\(/g, "(");
  122.   // it's only an expression if it begins with a digit, paren, or variable - or a minus
  123.   if (!nofunc.match(/^[a-z_]\b|^[x\d\-\.\(]/)) return false;
  124.   // detect numbers
  125.   var nonum = nofunc.replace(/\b(\d+(\.\d*)?)([eE][+-]?\d+)?\b/g, "1");
  126.   var nonum = nonum.replace(/(\.\d+)([eE][+-]?\d+)?\b/g, "1");
  127.   // remove spsaces
  128.   var nospace = nonum.replace(/\s/g, "");
  129.   // only operators and recognized things are allowed
  130.   if (!nospace.match(/^[1_a-z\*\-\+\/\(\),=]+$/)) return false;
  131.   // constants cannot touch
  132.   if (nospace.match(/[1_a-z\)][1_a-z\(]/)) return false;
  133.   // operators cannot touch
  134.   if (nospace.match(/[\*\-\+\/][\*\+\/=]/)) return false;
  135.   // parens must match
  136.   var paren = 0;
  137.   var eq = 0;
  138.   var i;
  139.   for (i = nospace.length - 1; i >= 0; i--)
  140.   {
  141.     var ch = nospace.charAt(i);
  142.     if (eq == 1)
  143.     {
  144.       if (ch < 'a' || ch > 'z') return false;
  145.     }
  146.     else
  147.     {
  148.       if (ch >= 'a' && ch <= 'z' && eval("typeof " + ch) == "undefined") return false;
  149.     }
  150.     if (ch == '=') { eq++; }
  151.     if (ch == ')') { paren++; }
  152.     if (ch == '(') { paren--; }
  153.     if (paren < 0) return false;
  154.     if (eq > 1) return false;
  155.   }
  156.  
  157.   // looks like an expression: we can calc it
  158.   calculate(t);
  159.   return true;
  160. }
  161.  
  162.  
  163. function savevars()
  164. {
  165.   var savetext = "";
  166.   for (var ii = 'a'.charCodeAt(0); ii <= 'z'.charCodeAt(0); ii++)
  167.   {
  168.     var varname = String.fromCharCode(ii);
  169.     var vartype = eval("typeof " + varname);
  170.     if (vartype == "number" || vartype == "string")
  171.     {
  172.        savetext += varname + "\t" + vartype + "\t" + escape(eval(varname)) + "\r\n";
  173.     }
  174.   }
  175.   for (var ii = 'A'.charCodeAt(0); ii <= 'Z'.charCodeAt(0); ii++)
  176.   {
  177.     var varname = String.fromCharCode(ii);
  178.     var vartype = eval("typeof " + varname);
  179.     if (vartype == "number" || vartype == "string")
  180.     {
  181.        savetext += varname + "\t" + vartype + "\t" + escape(eval(varname)) + "\r\n";
  182.     }
  183.   }
  184.   writeFile("calcmem", savetext);
  185. }
  186.  
  187. function loadvars()
  188. {
  189.   var values = readTabDelimitedFile("calcmem")
  190.   for (var ii = 0; ii < values.length; ii++)
  191.   {
  192.     var value = values[ii];
  193.     if (value.length == 3)
  194.     {
  195.       if (value[1] == "number")
  196.       {
  197.         eval(value[0] + " = " + unescape(value[2]));
  198.       }
  199.       else if (value[1] == "string")
  200.       {
  201.         var strval = unescape(value[2]);
  202.         eval(value[0] + " = strval");
  203.       }
  204.     }
  205.   }
  206. }
  207.  
  208. loadvars();
  209.  
  210. // constants for use in calculator
  211. pi = Math.PI;
  212. ln10 = Math.LN10;
  213. ln2 = Math.LN2;
  214. log10e = Math.LOG10E;
  215. log2e = Math.LOG2E;
  216. sqrt1_2 = Math.SQRT1_2;
  217. sqrt2 = Math.SQRT2;
  218. ln = Math.log;
  219. e = Math.exp(1);
  220.  
  221.  
  222.