proj home

Files   Classes   Functions   Hierarchy  

rpnfunc.cpp

Go to the documentation of this file.
00001 #include <rpnfunc.h>
00002 
00003 #include <algorithm>
00004 #include <iostream>
00005 #include <deque>
00006 #include <vector>
00007 #include <string>
00008 #include <sstream>
00009 using namespace std;
00010 
00011 #include <rpn.h>
00012 #include <pathstuff.h>
00013 
00014 #ifndef NDEBUG
00015 // Toggle Debug.
00016 #define DEBUG_RPNFUNC_H
00017 #endif
00018 
00019 
00020 // Implementation
00021 // ------------------------------------------------------------
00022 //
00023 
00024 
00025 void rpnprogset::visit(deque<rpnbase*>& ds,rpninteger& n)
00026 {
00027   if (ds.size()<2)
00028     return;
00029 
00030   rpnbase* x0 = ds.front();
00031   ds.pop_front();
00032   rpnbase* x1 = ds.front();
00033   bool restore(true);
00034   if (x1->isprogram())
00035   {
00036     rpnprogram * p = (rpnprogram*)x1;
00037     if ((n.num>=0)&&(n.num<4))
00038     { 
00039       restore=false;
00040       p->state = n.num;
00041       x0->dec();
00042     }
00043   }
00044 
00045   if (restore)
00046     ds.push_front(x0);
00047 }
00048 
00049 
00050 void rpnprogset::visit(deque<rpnbase*>& ds,rpnprogram& p)
00051 {
00052   new rpninteger(ds,p.state);
00053 }
00054 
00055 
00056 rpnprogset::rpnprogset
00057 (
00058   deque<rpnbase*>& ds, 
00059   bool const evaluate
00060 )
00061 {
00062   if (evaluate)
00063     eval(ds);
00064   else
00065     ds.push_front(this);
00066 }
00067 
00068 rpnbase* rpnprogset::copy() const
00069 {
00070   return new rpnprogset(); 
00071 }
00072 
00073 void rpnprogset::eval( deque<rpnbase*>& ds )
00074 {
00075   if (!ds.empty())
00076     ds[0]->accept(ds,*this);
00077 
00078   dec();
00079 }
00080 
00081 
00082 
00083 
00084 
00085 
00086 
00087 
00088 
00089 rpnpush::rpnpush(deque<rpnbase*>& ds, bool const evaluate)
00090 {
00091   if (evaluate)
00092     eval(ds);
00093   else
00094     ds.push_front(this);
00095 }
00096 
00097 rpnbase* rpnpush::copy() const
00098 {
00099   return new rpnpush(); 
00100 }
00101 
00102 void rpnpush::eval( deque<rpnbase*>& ds )
00103 {
00104   if (!ds.empty())
00105   {
00106     rpnprogramstackstate().ds2.push_front(ds.front());
00107     ds.pop_front();
00108   }
00109 
00110   dec();
00111 }
00112 
00113 
00114 rpnpop::rpnpop(deque<rpnbase*>& ds, bool const evaluate)
00115 {
00116   if (evaluate)
00117     eval(ds);
00118   else
00119     ds.push_front(this);
00120 }
00121 
00122 rpnbase* rpnpop::copy() const
00123 {
00124   return new rpnpop(); 
00125 }
00126 
00127 void rpnpop::eval( deque<rpnbase*>& ds )
00128 {
00129 //cout << "rpnpop::eval" << endl;
00130   if (!rpnprogramstackstate().ds2.empty())
00131   {
00132     ds.push_front( rpnprogramstackstate().ds2.front() );
00133     rpnprogramstackstate().ds2.pop_front();
00134   }
00135 
00136   dec();
00137 }
00138 
00139 
00140 rpnpushn::rpnpushn(deque<rpnbase*>& ds, bool const evaluate)
00141 {
00142   if (evaluate)
00143     eval(ds);
00144   else
00145     ds.push_front(this);
00146 }
00147 
00148 rpnbase* rpnpushn::copy() const
00149 {
00150   return new rpnpushn(); 
00151 }
00152 
00153 void rpnpushn::eval( deque<rpnbase*>& ds )
00154 {
00155   if (!ds.empty())
00156     ds[0]->accept(ds,*this);
00157 
00158   dec();
00159 }
00160 
00161 void rpnpushn::visit(deque<rpnbase*>& ds,rpninteger& k)
00162 {
00163   if (k.num<0)
00164     return;
00165 
00166   unsigned int n = (unsigned int)(k.num);
00167 
00168   if (ds.size()<=n)
00169     return;
00170 
00171   rpnbase* x0 = ds.front();
00172   ds.pop_front();
00173 
00174   if (n==0)
00175     return;
00176 
00177   for (unsigned int i=0, imax=k.num; i<imax; ++i)
00178   {
00179     rpnprogramstackstate().ds2.push_front(ds.front());
00180     ds.pop_front();
00181   }
00182 
00183   x0->dec();
00184 }
00185 
00186 
00187 rpnpopn::rpnpopn(deque<rpnbase*>& ds, bool const evaluate)
00188 {
00189   if (evaluate)
00190     eval(ds);
00191   else
00192     ds.push_front(this);
00193 }
00194 
00195 rpnbase* rpnpopn::copy() const
00196 {
00197   return new rpnpopn(); 
00198 }
00199 
00200 void rpnpopn::eval( deque<rpnbase*>& ds )
00201 {
00202   if (!ds.empty())
00203     ds[0]->accept(ds,*this);
00204 
00205   dec();
00206 }
00207 
00208 void rpnpopn::visit(deque<rpnbase*>& ds,rpninteger& k)
00209 {
00210   if (k.num<0)
00211     return;
00212 
00213   unsigned int n = (unsigned int)(k.num);
00214 
00215   if (rpnprogramstackstate().ds2.size()<n)
00216     return;
00217 
00218   rpnbase* x0 = ds.front();
00219   ds.pop_front();
00220 
00221   if (n==0)
00222     return;
00223 
00224   for (unsigned int i=0, imax=n; i<imax; ++i)
00225   {
00226     ds.push_front( rpnprogramstackstate().ds2.front() );
00227     rpnprogramstackstate().ds2.pop_front();
00228   }
00229 
00230   x0->dec();
00231 }
00232 
00233 
00234 dssize2::dssize2(deque<rpnbase*>& ds, bool const evaluate)
00235 {
00236   if (evaluate)
00237     eval(ds);
00238   else
00239     ds.push_front(this);
00240 }
00241 
00242 rpnbase* dssize2::copy() const
00243 {
00244   return new dssize2();
00245 }
00246 
00247 void dssize2::eval( deque<rpnbase*>& ds )
00248 {
00249   new rpninteger(ds,rpnprogramstackstate().ds2.size());
00250 
00251   dec();
00252 }
00253 
00254 
00255 rpneval::rpneval(deque<rpnbase*>& ds, bool const evaluate)
00256 {
00257   if (evaluate)
00258     eval(ds);
00259   else
00260     ds.push_front(this);
00261 }
00262 
00263 rpnbase* rpneval::copy() const
00264 {
00265   return new rpneval(); 
00266 }
00267 
00268 void rpneval::eval( deque<rpnbase*>& ds )
00269 {
00270   if (!ds.empty())
00271   {
00272     rpnbase* x0 = ds.front();
00273     ds.pop_front();
00274     x0->eval(ds);
00275   }
00276 
00277   dec();
00278 }
00279 
00280 
00281 rpnclear::rpnclear(deque<rpnbase*>& ds, bool const evaluate)
00282 {
00283   if (evaluate)
00284     eval(ds);
00285   else
00286     ds.push_front(this);
00287 }
00288 
00289 rpnbase* rpnclear::copy() const
00290 {
00291   return new rpnclear(); 
00292 }
00293 
00294 void rpnclear::eval( deque<rpnbase*>& ds )
00295 {
00296   if (!ds.empty())
00297   {
00298     for (unsigned int i=0, imax=ds.size(); i<imax; ++i)
00299       ds[i]->dec();
00300 
00301     ds.clear();
00302   }
00303 
00304   dec();
00305 }
00306 
00307 
00308 rpnclearvar::rpnclearvar(deque<rpnbase*>& ds, bool const evaluate)
00309 {
00310   if (evaluate)
00311     eval(ds);
00312   else
00313     ds.push_front(this);
00314 }
00315 
00316 rpnbase* rpnclearvar::copy() const
00317 {
00318   return new rpnclearvar(); 
00319 }
00320 
00321 void rpnclearvar::eval( deque<rpnbase*>& ds )
00322 {
00323   deque<rpnvar*>& var = rpnprogramstackstate().vs();
00324   if (!var.empty())
00325   {
00326     for (unsigned int i=0, imax=var.size(); i<imax; ++i)
00327       var[i]->dec();
00328 
00329     var.clear();
00330   }
00331 
00332   dec();
00333 }
00334 
00335 
00336 rpnclearboth::rpnclearboth(deque<rpnbase*>& ds, bool const evaluate)
00337 {
00338   if (evaluate)
00339     eval(ds);
00340   else
00341     ds.push_front(this);
00342 }
00343 
00344 rpnbase* rpnclearboth::copy() const
00345 {
00346   return new rpnclearboth(); 
00347 }
00348 
00349 void rpnclearboth::eval( deque<rpnbase*>& ds )
00350 {
00351   if (!ds.empty())
00352   {
00353     for (unsigned int i=0, imax=ds.size(); i<imax; ++i)
00354       ds[i]->dec();
00355 
00356     ds.clear();
00357   }
00358 
00359   deque<rpnvar*>& var = rpnprogramstackstate().vs();
00360   if (!var.empty())
00361   {
00362     for (unsigned int i=0, imax=var.size(); i<imax; ++i)
00363       var[i]->dec();
00364 
00365     var.clear();
00366   }
00367 
00368   dec();
00369 }
00370 
00371 
00372 rpndup::rpndup(deque<rpnbase*>& ds, bool const evaluate)
00373 {
00374   if (evaluate)
00375     eval(ds);
00376   else
00377     ds.push_front(this);
00378 }
00379 
00380 rpnbase* rpndup::copy() const
00381 {
00382   return new rpndup(); 
00383 }
00384 
00385 void rpndup::eval( deque<rpnbase*>& ds )
00386 {
00387   if (!ds.empty())
00388     ds.push_front( ds[0]->copy() );
00389 
00390   dec();
00391 }
00392 
00393 
00394 rpndupn::rpndupn(deque<rpnbase*>& ds, bool const evaluate)
00395 {
00396   if (evaluate)
00397     eval(ds);
00398   else
00399     ds.push_front(this);
00400 }
00401 
00402 rpnbase* rpndupn::copy() const
00403 {
00404   return new rpndupn(); 
00405 }
00406 
00407 void rpndupn::eval( deque<rpnbase*>& ds )
00408 {
00409   if (!ds.empty())
00410     ds[0]->accept(ds,*this);
00411 
00412   dec();
00413 }
00414 
00415 void rpndupn::visit(deque<rpnbase*>& ds,rpninteger& n)
00416 {
00417   rpnbase* x0 = ds.front();
00418   ds.pop_front();
00419 
00420   unsigned int const k(n.num);
00421   x0->dec();
00422 
00423   if (n.num<=0)
00424     return;
00425 
00426   if (ds.size()<k)
00427     return;
00428 
00429   for (unsigned int i=0; i<k; ++i)
00430     ds.push_front( ds[k-1]->copy() );
00431 
00432 }
00433 
00434 
00435 dssize::dssize(deque<rpnbase*>& ds, bool const evaluate)
00436 {
00437   if (evaluate)
00438     eval(ds);
00439   else
00440     ds.push_front(this);
00441 }
00442 
00443 rpnbase* dssize::copy() const
00444 {
00445   return new dssize();
00446 }
00447 
00448 void dssize::eval( deque<rpnbase*>& ds )
00449 {
00450   new rpninteger(ds,ds.size());
00451 
00452   dec();
00453 }
00454 
00455 
00456 rev::rev(deque<rpnbase*>& ds, bool const evaluate)
00457 {
00458   if (evaluate)
00459     eval(ds);
00460   else
00461     ds.push_front(this);
00462 }
00463 
00464 rpnbase* rev::copy() const
00465 {
00466   return new rev();
00467 }
00468 
00469 void rev::eval( deque<rpnbase*>& ds )
00470 {
00471   reverse(ds.begin(),ds.end());
00472 
00473   dec();
00474 }
00475 
00476 
00477 rot::rot(deque<rpnbase*>& ds, bool const evaluate)
00478 {
00479   if (evaluate)
00480     eval(ds);
00481   else
00482     ds.push_front(this);
00483 }
00484 
00485 rpnbase* rot::copy() const
00486 {
00487   return new rot();
00488 }
00489 
00490 void rot::eval( deque<rpnbase*>& ds )
00491 {
00492   if (ds.size()>2)
00493     rotate(ds.begin(),ds.begin()+1,ds.begin()+3);
00494 
00495   dec();
00496 }
00497 
00498 
00499 rotn::rotn(deque<rpnbase*>& ds, bool const evaluate)
00500 {
00501   if (evaluate)
00502     eval(ds);
00503   else
00504     ds.push_front(this);
00505 }
00506 
00507 rpnbase* rotn::copy() const
00508 {
00509   return new rotn();
00510 }
00511 
00512 void rotn::eval( deque<rpnbase*>& ds )
00513 {
00514   if (!ds.empty())
00515     ds[0]->accept(ds,*this);
00516 
00517   dec();
00518 }
00519 
00520 void rotn::visit(deque<rpnbase*>& ds,rpninteger& k)
00521 {
00522   if (k.num==0) //no rotation
00523     return;
00524 
00525   rpnbase* x0 = ds.front();
00526   ds.pop_front();
00527   rpnbase* x1 = ds.front();
00528   ds.pop_front();
00529 
00530   if (x1->isinteger())
00531   {
00532     int n = ((rpninteger*)x1)->num;
00533 
00534     // Valid state to rotate data. 
00535     if ((n>0)&&(ds.size()>=(unsigned int)n))
00536     {
00537 //       STL defines rotation in a minimalistic sense - a positive
00538 //       integer mapping an element maps it back to the start.
00539 //       While this is mathematical, for operational use a +ve and
00540 //       -ve direction is easier. +k rotates it k times, -k is in 
00541 //       the other direction.   
00542 
00543       unsigned int k2 = (n-k.num)%n;
00544       rotate(ds.begin(),ds.begin()+k2,ds.begin()+n);
00545 
00546       x0->dec();
00547       x1->dec();
00548 
00549       return;
00550         
00551     }
00552   }
00553 
00554   // Error: restore the stack. 
00555   ds.push_front(x1);
00556   ds.push_front(x0);
00557 }
00558 
00559 rpnswap::rpnswap(deque<rpnbase*>& ds, bool const evaluate)
00560 {
00561   if (evaluate)
00562     eval(ds);
00563   else
00564     ds.push_front(this);
00565 }
00566 
00567 rpnbase* rpnswap::copy() const
00568 {
00569   return new rpnswap();
00570 }
00571 
00572 void rpnswap::eval( deque<rpnbase*>& ds )
00573 {
00574   if (ds.size()>1)
00575   {
00576     rpnbase* p = ds[0];
00577     ds[0] = ds[1];
00578     ds[1] = p;
00579   }
00580 
00581   dec();
00582 }
00583 
00584 
00585 rpnswap2::rpnswap2(deque<rpnbase*>& ds, bool const evaluate)
00586 {
00587   if (evaluate)
00588     eval(ds);
00589   else
00590     ds.push_front(this);
00591 }
00592 
00593 rpnbase* rpnswap2::copy() const
00594 {
00595   return new rpnswap2();
00596 }
00597 
00598 void rpnswap2::eval( deque<rpnbase*>& ds )
00599 {
00600   if (ds.size()>1)
00601   {
00602     rpnbase* p = ds[0];
00603     ds[0] = ds[1];
00604     ds[1] = p;
00605   }
00606 
00607   dec();
00608 }
00609 
00610 
00611 
00612 dropi::dropi(deque<rpnbase*>& ds, bool const evaluate)
00613 {
00614   if (evaluate)
00615     eval(ds);
00616   else
00617     ds.push_front(this);
00618 }
00619 
00620 rpnbase* dropi::copy() const
00621 {
00622   return new dropi();
00623 }
00624 
00625 void dropi::eval( deque<rpnbase*>& ds )
00626 {
00627   if(!ds.empty())
00628     ds[0]->accept(ds,*this);
00629 
00630   dec();
00631 }
00632 
00633 void dropi::visit(deque<rpnbase*>& ds,rpninteger& n)
00634 {
00635   if (n.num<0)
00636     return;
00637 
00638   unsigned int const k = n.num;
00639   if (ds.size()>(k+1))
00640   {
00641     rpnbase* x0 = ds.front();
00642     ds.pop_front();
00643 
00644     ds.erase(ds.begin()+k);
00645     x0->dec();
00646   } 
00647 }
00648 
00649 
00650 drop::drop(deque<rpnbase*>& ds, bool const evaluate)
00651 {
00652   if (evaluate)
00653     eval(ds);
00654   else
00655     ds.push_front(this);
00656 }
00657 
00658 rpnbase* drop::copy() const
00659 {
00660   return new drop();
00661 }
00662 
00663 void drop::eval( deque<rpnbase*>& ds )
00664 {
00665   if (!ds.empty())
00666   {
00667     rpnbase* x0 = ds.front();
00668     ds.pop_front();
00669     x0->dec();
00670   }
00671 
00672   dec();
00673 }
00674 
00675 dropsymb::dropsymb(deque<rpnbase*>& ds, bool const evaluate)
00676 {
00677   if (evaluate)
00678     eval(ds);
00679   else
00680     ds.push_front(this);
00681 }
00682 
00683 
00684 dropn::dropn(deque<rpnbase*>& ds, bool const evaluate)
00685 {
00686   if (evaluate)
00687     eval(ds);
00688   else
00689     ds.push_front(this);
00690 }
00691 
00692 rpnbase* dropn::copy() const
00693 {
00694   return new dropn();
00695 }
00696 
00697 void dropn::eval( deque<rpnbase*>& ds )
00698 {
00699   if(!ds.empty())
00700     ds[0]->accept(ds,*this);
00701 
00702   dec();
00703 }
00704 
00705 void dropn::visit(deque<rpnbase*>& ds,rpninteger& n)
00706 {
00707   if (n.num<0)
00708     return;
00709 
00710   unsigned int val = n.num;
00711   if (ds.size()>val)
00712   {
00713     rpnbase* x0 = ds.front();
00714     ds.pop_front();
00715 
00716     ds.erase(ds.begin(),ds.begin()+val);
00717     x0->dec();
00718   } 
00719 }
00720 
00721 
00722 ifthen::ifthen(deque<rpnbase*>& ds, bool const evaluate)
00723 {
00724   if (evaluate)
00725     eval(ds);
00726   else
00727     ds.push_front(this);
00728 }
00729 
00730 rpnbase* ifthen::copy() const
00731 {
00732   return new ifthen();
00733 }
00734 
00735 void ifthen::eval( deque<rpnbase*>& ds )
00736 {
00737   if( ds.size()>1)
00738     ds[1]->accept(ds,*this);
00739   
00740   dec();
00741 }
00742 
00743 void ifthen::visit(deque<rpnbase*>& ds,rpnreal& n)
00744 {
00745 
00746   rpnbase* x0 = ds.front();
00747   ds.pop_front();
00748   // x1 is a pointer to n 
00749   rpnbase* x1 = ds.front();
00750   ds.pop_front();
00751 
00752   if (n.num != 0)
00753   {
00754     x1->dec();
00755     x0->eval(ds);
00756   }
00757   else
00758   {
00759     x1->dec();
00760     x0->dec();
00761   }
00762 }
00763 
00764 void ifthen::visit(deque<rpnbase*>& ds,rpninteger& n)
00765 {
00766 
00767   rpnbase* x0 = ds.front();
00768   ds.pop_front();
00769   // x1 is a pointer to n 
00770   rpnbase* x1 = ds.front();
00771   ds.pop_front();
00772 
00773   if (n.num != 0)
00774   {
00775     x1->dec();
00776     x0->eval(ds);
00777   }
00778   else
00779   {
00780     x1->dec();
00781     x0->dec();
00782   }
00783 }
00784 
00785 
00786 thenif::thenif(deque<rpnbase*>& ds, bool const evaluate)
00787 {
00788   if (evaluate)
00789     eval(ds);
00790   else
00791     ds.push_front(this);
00792 }
00793 
00794 rpnbase* thenif::copy() const
00795 {
00796   return new thenif();
00797 }
00798 
00799 void thenif::eval( deque<rpnbase*>& ds )
00800 {
00801   if( ds.size()>1)
00802     ds[0]->accept(ds,*this);
00803   
00804   dec();
00805 }
00806 
00807 void thenif::visit(deque<rpnbase*>& ds,rpnreal& n)
00808 {
00809   rpnbase* x0 = ds.front();
00810   ds.pop_front();
00811   // x0 is a pointer to n 
00812   rpnbase* x1 = ds.front();
00813   ds.pop_front();
00814 
00815   if (n.num != 0)
00816     x1->eval(ds);
00817   else
00818     x1->dec();
00819 
00820   x0->dec();
00821 }
00822 
00823 void thenif::visit(deque<rpnbase*>& ds,rpninteger& n)
00824 {
00825   rpnbase* x0 = ds.front();
00826   ds.pop_front();
00827   // x0 is a pointer to n 
00828   rpnbase* x1 = ds.front();
00829   ds.pop_front();
00830 
00831   if (n.num != 0)
00832     x1->eval(ds);
00833   else
00834     x1->dec();
00835 
00836   x0->dec();
00837 }
00838 
00839 
00840 ifthenelse::ifthenelse(deque<rpnbase*>& ds, bool const evaluate)
00841 {
00842   if (evaluate)
00843     eval(ds);
00844   else
00845     ds.push_front(this);
00846 }
00847 
00848 rpnbase* ifthenelse::copy() const
00849 {
00850   return new ifthenelse();
00851 }
00852 
00853 void ifthenelse::eval( deque<rpnbase*>& ds )
00854 {
00855   if( ds.size()>2)
00856     ds[2]->accept(ds,*this);
00857 
00858   dec();
00859 }
00860 
00861 void ifthenelse::visit(deque<rpnbase*>& ds,rpnreal& n)
00862 {
00863   rpnbase* x0 = ds.front();
00864   ds.pop_front();
00865   rpnbase* x1 = ds.front();
00866   ds.pop_front();
00867   rpnbase* x2 = ds.front();
00868   ds.pop_front();
00869 
00870   if (n.num != 0)
00871   {
00872     x2->dec();
00873     x0->dec();
00874     x1->eval(ds);
00875   }
00876   else
00877   {
00878     x2->dec();
00879     x1->dec();
00880     x0->eval(ds);
00881   }
00882 }
00883 
00884 void ifthenelse::visit(deque<rpnbase*>& ds,rpninteger& n)
00885 {
00886   rpnbase* x0 = ds.front();
00887   ds.pop_front();
00888   rpnbase* x1 = ds.front();
00889   ds.pop_front();
00890   rpnbase* x2 = ds.front();
00891   ds.pop_front();
00892 
00893   if (n.num != 0)
00894   {
00895     x2->dec();
00896     x0->dec();
00897     x1->eval(ds);
00898   }
00899   else
00900   {
00901     x2->dec();
00902     x1->dec();
00903     x0->eval(ds);
00904   }
00905 }
00906 
00907 
00908 thenelseif::thenelseif(deque<rpnbase*>& ds, bool const evaluate)
00909 {
00910   if (evaluate)
00911     eval(ds);
00912   else
00913     ds.push_front(this);
00914 }
00915 
00916 rpnbase* thenelseif::copy() const
00917 {
00918   return new thenelseif();
00919 }
00920 
00921 void thenelseif::eval( deque<rpnbase*>& ds )
00922 {
00923   if( ds.size()>2)
00924     ds[0]->accept(ds,*this);
00925 
00926   dec();
00927 }
00928 
00929 void thenelseif::visit(deque<rpnbase*>& ds,rpnreal& n)
00930 {
00931   rpnbase* x0 = ds.front();
00932   ds.pop_front();
00933   rpnbase* x1 = ds.front();
00934   ds.pop_front();
00935   rpnbase* x2 = ds.front();
00936   ds.pop_front();
00937 
00938   if (n.num != 0)
00939   {
00940     x1->dec();
00941     x2->eval(ds);
00942   }
00943   else
00944   {
00945     x2->dec();
00946     x1->eval(ds);
00947   }
00948   x0->dec();
00949 }
00950 
00951 void thenelseif::visit(deque<rpnbase*>& ds,rpninteger& n)
00952 {
00953   rpnbase* x0 = ds.front();
00954   ds.pop_front();
00955   rpnbase* x1 = ds.front();
00956   ds.pop_front();
00957   rpnbase* x2 = ds.front();
00958   ds.pop_front();
00959 
00960   if (n.num != 0)
00961   {
00962     x1->dec();
00963     x2->eval(ds);
00964   }
00965   else
00966   {
00967     x2->dec();
00968     x1->eval(ds);
00969   }
00970   x0->dec();
00971 }
00972 
00973 
00974 rpnnot::rpnnot(deque<rpnbase*>& ds, bool const evaluate)
00975 {
00976   if (evaluate)
00977     eval(ds);
00978   else
00979     ds.push_front(this);
00980 }
00981 
00982 rpnbase* rpnnot::copy() const
00983 {
00984   return new rpnnot();
00985 }
00986 
00987 void rpnnot::eval( deque<rpnbase*>& ds )
00988 {
00989   if(!ds.empty())
00990     ds[0]->accept(ds,*this);
00991 
00992   dec();
00993 }
00994 
00995 void rpnnot::visit(deque<rpnbase*>& ds,rpnreal& n)
00996 {
00997   if (n.num==0)
00998     n.num = 1;
00999   else
01000     n.num = 0;
01001 }
01002 
01003 void rpnnot::visit(deque<rpnbase*>& ds,rpninteger& n)
01004 {
01005   if (n.num==0)
01006     n.num = 1;
01007   else
01008     n.num = 0;
01009 }
01010 
01011 
01012 rpnneg::rpnneg(deque<rpnbase*>& ds, bool const evaluate)
01013 {
01014   if (evaluate)
01015     eval(ds);
01016   else
01017     ds.push_front(this);
01018 }
01019 
01020 rpnbase* rpnneg::copy() const
01021 {
01022   return new rpnneg();
01023 }
01024 
01025 void rpnneg::eval( deque<rpnbase*>& ds )
01026 {
01027   if(!ds.empty())
01028     ds[0]->accept(ds,*this);
01029 
01030   dec();
01031 }
01032 
01033 void rpnneg::visit(deque<rpnbase*>& ds,rpnreal& n)
01034 {
01035   n.num *= -1;
01036 }
01037 
01038 void rpnneg::visit(deque<rpnbase*>& ds,rpninteger& n)
01039 {
01040   n.num *= -1;
01041 }
01042 
01043 void rpnneg::visit(deque<rpnbase*>& ds,rpncomplex& n)
01044 {
01045   n.num *= -1;
01046 }
01047 
01048 
01049 var::var(deque<rpnbase*>& ds, bool const evaluate)
01050 {
01051   if (evaluate)
01052     eval(ds);
01053   else
01054     ds.push_front(this);
01055 }
01056 
01057 rpnbase* var::copy() const
01058 {
01059   return new var();
01060 }
01061 
01062 void var::eval( deque<rpnbase*>& ds )
01063 {
01064   if (ds.size()>1)
01065     ds[0]->accept(ds,*this);
01066 
01067   dec();
01068 }
01069 
01070 void var::visit(deque<rpnbase*>& ds,rpnstring& s)
01071 {
01072   rpnbase* x0 = ds.front();
01073   ds.pop_front();
01074   rpnbase* x1 = ds.front();
01075   ds.pop_front();
01076   
01077   rpnprogramstackstate().add(x1,s.str);
01078   x0->dec();
01079 }
01080 
01081 
01082 vardel::vardel(deque<rpnbase*>& ds, bool const evaluate)
01083 {
01084   if (evaluate)
01085     eval(ds);
01086   else
01087     ds.push_front(this);
01088 }
01089 
01090 rpnbase* vardel::copy() const
01091 {
01092   return new vardel();
01093 }
01094 
01095 void vardel::eval( deque<rpnbase*>& ds )
01096 {
01097   if (!ds.empty())
01098     ds[0]->accept(ds,*this);
01099 
01100   dec();
01101 }
01102 
01103 void vardel::visit(deque<rpnbase*>& ds,rpnstring& s)
01104 {
01105   rpnbase* x0 = ds.front();
01106   ds.pop_front();
01107   
01108   rpnprogramstackstate().erase(s.str);
01109 
01110   x0->dec();
01111 }
01112 
01113 
01114 vareval::vareval(deque<rpnbase*>& ds, bool const evaluate)
01115 {
01116   if (evaluate)
01117     eval(ds);
01118   else
01119     ds.push_front(this);
01120 }
01121 
01122 rpnbase* vareval::copy() const
01123 {
01124   return new vareval();
01125 }
01126 
01127 void vareval::eval( deque<rpnbase*>& ds )
01128 {
01129   if (!ds.empty())
01130     ds[0]->accept(ds,*this);
01131 
01132   dec();
01133 }
01134 
01135 void vareval::visit(deque<rpnbase*>& ds,rpnstring& s)
01136 {
01137   rpnbase* x0 = ds.front();
01138   ds.pop_front();
01139   
01140   rpnprogramstackstate().evaluate(ds,s.str);
01141 
01142   x0->dec();
01143 }
01144 
01145 void vareval::visit(deque<rpnbase*>& ds,rpninteger& n)
01146 {
01147   rpnbase* x0 = ds.front();
01148   ds.pop_front();
01149 
01150   if (n.num>=0)
01151   {
01152     unsigned int const n2 = (unsigned int)(n.num); 
01153     if (n2<ds.size())
01154     {
01155       rpnbase * x = ds[n.num]->copy();
01156       x->eval(ds);
01157     }
01158   }
01159 
01160   x0->dec();
01161 }
01162 
01163 
01164 
01165 void vareval::visit(deque<rpnbase*>& ds,rpnprogram& p)
01166 {
01167   rpnbase* x0 = ds.front();
01168   ds.pop_front();
01169 
01170   x0->eval(ds);
01171 }
01172 
01173 
01174 varpushd::varpushd(deque<rpnbase*>& ds, bool const evaluate)
01175 {
01176   if (evaluate)
01177     eval(ds);
01178   else
01179     ds.push_front(this);
01180 }
01181 
01182 rpnbase* varpushd::copy() const
01183 {
01184   return new varpushd();
01185 }
01186 
01187 void varpushd::eval( deque<rpnbase*>& ds )
01188 {
01189   if (!ds.empty())
01190     ds[0]->accept(ds,*this);
01191 
01192   dec();
01193 }
01194 
01195 void varpushd::visit(deque<rpnbase*>& ds,rpnstring& s)
01196 {
01197   rpnbase* x0 = ds.front();
01198   ds.pop_front();
01199 
01200   bool found(false);
01201   rpnprogram* p;
01202   vector<string> v;
01203   pathstuff().convert(v,s.str);
01204 
01205 //for (unsigned int i=0; i<v.size(); ++i)
01206 //{
01207 //  cout << "*" << v[i] << "*" << endl;
01208 //}
01209 
01210   pathstuff().findpath(found,p,v); 
01211 
01212 //cout << "varpushd::visit(ds," << s.str << ")" << endl;
01213 //cout << "  found=" << found << endl;
01214 
01215   if (found)
01216   {
01217     rpnprogramstackstate().push(p);
01218     x0->dec();
01219   }
01220   else
01221     ds.push_front(x0); // Restore the stack. 
01222 }
01223 
01224 void varpushd::visit(deque<rpnbase*>& ds,rpnprogram& p)
01225 {
01226   rpnprogramstackstate().push(&p);
01227 }
01228 
01229 
01230 varpopd::varpopd(deque<rpnbase*>& ds, bool const evaluate)
01231 {
01232   if (evaluate)
01233     eval(ds);
01234   else
01235     ds.push_front(this);
01236 }
01237 
01238 rpnbase* varpopd::copy() const
01239 {
01240   return new varpopd();
01241 }
01242 
01243 void varpopd::eval( deque<rpnbase*>& ds )
01244 {
01245   rpnprogramstackstate().pop();
01246 
01247   dec();
01248 }
01249 
01250 
01251 depthd::depthd(deque<rpnbase*>& ds, bool const evaluate)
01252 {
01253   if (evaluate)
01254     eval(ds);
01255   else
01256     ds.push_front(this);
01257 }
01258 
01259 rpnbase* depthd::copy() const
01260 {
01261   return new depthd();
01262 }
01263 
01264 void depthd::eval( deque<rpnbase*>& ds )
01265 {
01266   new rpninteger
01267   (
01268     ds,
01269     rpnprogramstackstate().ps->size() 
01270   );
01271 
01272   dec();
01273 }
01274 
01275 
01276 varls::varls(deque<rpnbase*>& ds, bool const evaluate)
01277 {
01278   if (evaluate)
01279     eval(ds);
01280   else
01281     ds.push_front(this);
01282 }
01283 
01284 rpnbase* varls::copy() const
01285 {
01286   return new varls();
01287 }
01288 
01289 void varls::eval( deque<rpnbase*>& ds )
01290 {
01291   deque<rpnvar*>& v = rpnprogramstackstate().vs();
01292   if (!v.empty())
01293   {
01294     cout << "{ " << endl;
01295     for (unsigned int i=0, imax=v.size(); i<imax; ++i)
01296     {
01297       cout << "  " <<  v[i]->varname << "=";
01298       cout << v[i]->x << endl; 
01299     }
01300     cout << "}" << endl;
01301   }
01302 
01303   dec();
01304 }
01305 
01306 
01307 vartree::vartree(deque<rpnbase*>& ds, bool const evaluate)
01308 {
01309   if (evaluate)
01310     eval(ds);
01311   else
01312     ds.push_front(this);
01313 }
01314 
01315 rpnbase* vartree::copy() const
01316 {
01317   return new vartree();
01318 }
01319 
01320 void vartree::draw(rpnprogram* p, unsigned int const depth)
01321 {
01322   if(p->variables.empty())
01323     return;
01324 
01325   string space;
01326   for (unsigned int i=0; i<depth; ++i)
01327     space += "  ";
01328 
01329   for (unsigned int i=0, imax=p->variables.size(); i<imax; ++i)
01330   {
01331     if (p->variables[i]->x->isprogram())
01332     {
01333       cout << space << p->variables[i]->varname << endl;
01334       draw((rpnprogram*)(p->variables[i]->x),depth+1);
01335     }
01336   }
01337 }
01338 
01339 void vartree::eval( deque<rpnbase*>& ds )
01340 {
01341   cout << "." << endl;
01342   draw(rpnprogramstackstate().ps->front(),1);
01343 
01344   dec();
01345 }
01346 
01347 
01348 varpwd::varpwd(deque<rpnbase*>& ds, bool const evaluate)
01349 {
01350   if (evaluate)
01351     eval(ds);
01352   else
01353     ds.push_front(this);
01354 }
01355 
01356 rpnbase* varpwd::copy() const
01357 {
01358   return new varpwd();
01359 }
01360 
01361 void varpwd::eval( deque<rpnbase*>& ds )
01362 {
01363   string path;
01364   bool found(false);
01365   
01366 //  rpnprogramstackstate().findprogram(
01367 //    found,path,rpnprogramstackstate().ps->front() );
01368 
01369   deque<rpnprogram*> & ps( * rpnprogramstackstate().ps );
01370   for ( unsigned int i=0; (i<ps.size())&&(!found); ++i )
01371   {
01372     rpnprogramstackstate().findprogram(
01373       found,path,ps[i] );
01374   }
01375 
01376   if (!found)
01377     path = "";
01378 
01379   new rpnstring(ds,path);
01380 
01381   dec();
01382 }
01383 
01384 
01385 pathtoggle::pathtoggle(deque<rpnbase*>& ds, bool const evaluate)
01386 {
01387   if (evaluate)
01388     eval(ds);
01389   else
01390     ds.push_front(this);
01391 }
01392 
01393 rpnbase* pathtoggle::copy() const
01394 {
01395   return new pathtoggle();
01396 }
01397 
01398 void pathtoggle::eval( deque<rpnbase*>& ds )
01399 {
01400   if (!ds.empty())
01401     ds[0]->accept(ds,*this);
01402 
01403   dec();
01404 }
01405 
01406 void pathtoggle::visit(deque<rpnbase*>& ds,rpnstring& path)
01407 {
01408   rpnbase* x0 = ds.front();
01409   ds.pop_front();
01410 
01411   if (path.str.empty())
01412   {
01413     x0->dec();
01414     return;
01415   }
01416   
01417   rpnprogram* p = new rpnprogram();
01418 
01419   vector<string> v;
01420   pathstuff().convert(v,path.str);
01421   pathstuff().convert(*p,v);
01422 
01423   ds.push_front(p);
01424 
01425   x0->dec();
01426 }
01427 
01428 void pathtoggle::visit(deque<rpnbase*>& ds,rpnprogram& path)
01429 {
01430   rpnbase* x0 = ds.front();
01431 
01432   rpnstring* s = new rpnstring();
01433 
01434   vector<string> v;
01435   pathstuff().convert(v,path);
01436   pathstuff().convert(s->str,v);
01437 
01438   ds.pop_front();
01439 
01440   ds.push_front(s);
01441 
01442   x0->dec();
01443 }
01444 
01445 
01446 varinc::varinc(deque<rpnbase*>& ds, bool const evaluate)
01447 {
01448   if (evaluate)
01449     eval(ds);
01450   else
01451     ds.push_front(this);
01452 }
01453 
01454 rpnbase* varinc::copy() const
01455 {
01456   return new varinc();
01457 }
01458 
01459 void varinc::eval( deque<rpnbase*>& ds )
01460 {
01461   if (!ds.empty())
01462     ds[0]->accept(ds,*this);
01463 
01464   dec();
01465 }
01466 
01467 
01468 void varinc::visit(deque<rpnbase*>& ds,rpninteger& n)
01469 {
01470   n.num += 1;
01471 }
01472 
01473 void varinc::visit(deque<rpnbase*>& ds,rpnreal& n)
01474 {
01475   n.num += 1;
01476 }
01477 
01478 void varinc::visit(deque<rpnbase*>& ds,rpnstring& s)
01479 {
01480   rpnbase* x0 = ds.front();
01481   ds.pop_front();
01482   
01483   bool res;
01484   unsigned int i,k;
01485   rpnvar* x;
01486 
01487   rpnprogramstackstate().find(res,i,k,x,s.str);
01488   if (res)
01489   {
01490     bool foundtype(false);
01491 
01492     rpnbase* w = x->x;
01493     if (w->isinteger())
01494     {
01495       ((rpninteger*)w)->num += 1;
01496       foundtype=true;
01497     }
01498     else
01499     if (w->isreal())
01500     {
01501       ((rpnreal*)w)->num += 1;
01502       foundtype=true;
01503     }
01504 
01505     if (foundtype)
01506     {
01507       w->inc();
01508       ds.push_front(w);
01509     }
01510   }
01511 
01512   x0->dec();
01513 }
01514 
01515 vardec::vardec(deque<rpnbase*>& ds, bool const evaluate)
01516 {
01517   if (evaluate)
01518     eval(ds);
01519   else
01520     ds.push_front(this);
01521 }
01522 
01523 rpnbase* vardec::copy() const
01524 {
01525   return new vardec();
01526 }
01527 
01528 void vardec::eval( deque<rpnbase*>& ds )
01529 {
01530   if (!ds.empty())
01531     ds[0]->accept(ds,*this);
01532 
01533   dec();
01534 }
01535 
01536 void vardec::visit(deque<rpnbase*>& ds,rpninteger& n)
01537 {
01538   n.num -= 1;
01539 }
01540 
01541 void vardec::visit(deque<rpnbase*>& ds,rpnreal& n)
01542 {
01543   n.num -= 1;
01544 }
01545 
01546 void vardec::visit(deque<rpnbase*>& ds,rpnstring& s)
01547 {
01548   rpnbase* x0 = ds.front();
01549   ds.pop_front();
01550 
01551   bool res;
01552   unsigned int i,k;
01553   rpnvar* x;
01554 
01555   rpnprogramstackstate().find(res,i,k,x,s.str);
01556   if (res)
01557   {
01558     bool foundtype(false);
01559 
01560     rpnbase* w = x->x;
01561     if (w->isinteger())
01562     {
01563       ((rpninteger*)w)->num -= 1;
01564       foundtype=true;
01565     }
01566     else
01567     if (w->isreal())
01568     {
01569       ((rpnreal*)w)->num -= 1;
01570       foundtype=true;
01571     }
01572 
01573     if (foundtype)
01574     {
01575       w->inc();
01576       ds.push_front(w);
01577     }
01578   }
01579 
01580   x0->dec();
01581 }
01582 
01583 
01584 
01585 
01586 varexists::varexists(deque<rpnbase*>& ds, bool const evaluate)
01587 {
01588   if (evaluate)
01589     eval(ds);
01590   else
01591     ds.push_front(this);
01592 }
01593 
01594 rpnbase* varexists::copy() const
01595 {
01596   return new varexists();
01597 }
01598 
01599 void varexists::eval( deque<rpnbase*>& ds )
01600 {
01601   if (!ds.empty())
01602     ds[0]->accept(ds,*this);
01603 
01604   dec();
01605 }
01606 
01607 void varexists::visit(deque<rpnbase*>& ds,rpnstring& s)
01608 {
01609   bool res;
01610   rpnprogramstackstate().exists(res,s.str);
01611   new rpninteger(ds,res);
01612 }
01613 
01614 
01615 varreplace::varreplace(deque<rpnbase*>& ds, bool const evaluate)
01616 {
01617   if (evaluate)
01618     eval(ds);
01619   else
01620     ds.push_front(this);
01621 }
01622 
01623 rpnbase* varreplace::copy() const
01624 {
01625   return new varreplace();
01626 }
01627 
01628 void varreplace::eval( deque<rpnbase*>& ds )
01629 {
01630   if (ds.size()>1)
01631     ds[0]->accept(ds,*this);
01632 
01633   dec();
01634 }
01635 
01636 void varreplace::visit(deque<rpnbase*>& ds,rpnstring& s)
01637 {
01638   rpnbase* x0 = ds.front();
01639   ds.pop_front();
01640   rpnbase* x1 = ds.front();
01641   ds.pop_front();
01642   
01643   rpnprogramstackstate().replace(x1,s.str);
01644 
01645   x0->dec();
01646 }
01647 
01648 void varreplace::visit(deque<rpnbase*>& ds,rpninteger& k)
01649 {
01650   if (ds.size()<=3)
01651     return;
01652 
01653   rpnbase* x0 = ds.front();
01654   ds.pop_front();
01655   rpnbase* x1 = ds.front();
01656   ds.pop_front();
01657 
01658   bool restore(false);
01659 
01660   int const sz = ds.size();
01661 
01662   int a;
01663   int b = k.num;
01664   if (! x1->isinteger() )
01665     restore=true;
01666   else
01667   {
01668     a = ((rpninteger*)x1)->num;
01669     if ( (a<0) || (b<0) || (a>=sz) || (b>=sz) || (a==b) )
01670       restore=true;
01671   }
01672 
01673   if (restore)
01674   {
01675     ds.push_front(x1);
01676     ds.push_front(x0);
01677     return;
01678   }
01679 
01680   x0->dec();
01681   x1->dec();
01682 
01683   ds[a]->dec();
01684   ds[a]=ds[b];
01685   ds[b]->inc();
01686 }
01687 
01688 
01689 varrecall::varrecall(deque<rpnbase*>& ds, bool const evaluate)
01690 {
01691   if (evaluate)
01692     eval(ds);
01693   else
01694     ds.push_front(this);
01695 }
01696 
01697 rpnbase* varrecall::copy() const
01698 {
01699   return new varrecall();
01700 }
01701 
01702 void varrecall::eval( deque<rpnbase*>& ds )
01703 {
01704   if (!ds.empty())
01705     ds[0]->accept(ds,*this);
01706 
01707   dec();
01708 }
01709 
01710 void varrecall::visit(deque<rpnbase*>& ds,rpnstring& s)
01711 {
01712   rpnbase* x0 = ds.front();
01713   ds.pop_front();
01714   
01715   rpnprogramstackstate().recall(ds,s.str);
01716 
01717   x0->dec();
01718 }
01719 
01720 void varrecall::visit(deque<rpnbase*>& ds,rpninteger& n)
01721 {
01722   rpnbase* x0 = ds.front();
01723   ds.pop_front();
01724 
01725   if (n.num>=0)
01726   {
01727     unsigned int const n2 = (unsigned int)(n.num); 
01728     if (n2<ds.size())
01729       ds.push_front( ds[n.num]->copy() );
01730   }
01731 
01732   x0->dec();
01733 }
01734 
01735 
01736 rpnadd::rpnadd(deque<rpnbase*>& ds, bool const evaluate)
01737 {
01738   if (evaluate)
01739     eval(ds);
01740   else
01741     ds.push_front(this);
01742 }
01743 
01744 rpnbase* rpnadd::copy() const
01745 {
01746   return new rpnadd();
01747 }
01748 
01749 void rpnadd::eval( deque<rpnbase*>& ds )
01750 {
01751   if (ds.size()>1)
01752     ds[0]->accept(ds,*this);
01753 
01754   dec();
01755 }
01756 
01757 void rpnadd::visit(deque<rpnbase*>& ds,rpncomplex& n)
01758 {
01759   rpnbase* x0 = ds.front();
01760   ds.pop_front();
01761 
01762   rpnbase* x1 = ds.front();
01763   if (x1->iscomplex())
01764   {
01765     ((rpncomplex*)(x1))->num += n.num;
01766     x0->dec();
01767     return;
01768   }
01769   else if (x1->isreal())
01770   {
01771     ds.pop_front();
01772     ds.push_front(x0);
01773     n.num += ((rpnreal*)x1)->num;
01774     x1->dec();
01775     return;
01776   }
01777   else if (x1->isinteger())
01778   {
01779     ds.pop_front();
01780     ds.push_front(x0);
01781     n.num += ((rpninteger*)x1)->num;
01782     x1->dec();
01783     return;
01784   }
01785 
01786   //Restor the stack.
01787   ds.push_front(x0);
01788 }
01789 
01790 void rpnadd::visit(deque<rpnbase*>& ds,rpnreal& n)
01791 {
01792   rpnbase* x0 = ds.front();
01793   ds.pop_front();
01794 
01795   rpnbase* x1 = ds.front();
01796   if (x1->isreal())
01797   {
01798     ((rpnreal*)(x1))->num += n.num;
01799     x0->dec();
01800     return;
01801   }
01802   else if (x1->iscomplex())
01803   {
01804     ((rpncomplex*)(x1))->num += n.num;
01805     x0->dec();
01806     return;
01807   }
01808   else if (x1->isinteger())
01809   {
01810     ds.pop_front();
01811     n.num += ((rpninteger*)x1)->num;
01812     ds.push_front(x0);
01813     x1->dec();
01814     return;
01815   }
01816 
01817   // Restore the stack.
01818   ds.push_front(x0);
01819 }
01820 
01821 void rpnadd::visit(deque<rpnbase*>& ds,rpninteger& n)
01822 {
01823   rpninteger* x0 = (rpninteger*)(ds.front());
01824   ds.pop_front();
01825 
01826   rpnbase* x1 = ds.front();
01827   if (x1->isinteger())
01828   {
01829     ((rpninteger*)(x1))->num += n.num;
01830     x0->dec(); 
01831     return;
01832   }
01833   else if (x1->isreal())
01834   {
01835     ((rpnreal*)(x1))->num += n.num;
01836     x0->dec();
01837     return;
01838   }
01839   else if (x1->iscomplex())
01840   {
01841     ((rpncomplex*)(x1))->num += n.num;
01842     x0->dec();
01843     return;
01844   }
01845 
01846   // Restor the stack.
01847   ds.push_front(x0);
01848 }
01849 
01850 
01851 rpnmultiply::rpnmultiply(deque<rpnbase*>& ds, bool const evaluate)
01852 {
01853   if (evaluate)
01854     eval(ds);
01855   else
01856     ds.push_front(this);
01857 }
01858 
01859 rpnbase* rpnmultiply::copy() const
01860 {
01861   return new rpnmultiply();
01862 }
01863 
01864 void rpnmultiply::eval( deque<rpnbase*>& ds )
01865 {
01866   if (ds.size()>1)
01867     ds[0]->accept(ds,*this);
01868 
01869   dec();
01870 }
01871 
01872 void rpnmultiply::visit(deque<rpnbase*>& ds,rpnreal& n)
01873 {
01874   rpnbase* x0 = ds.front();
01875   ds.pop_front();
01876 
01877   rpnbase* x1 = ds.front();
01878   if (x1->isreal())
01879   {
01880     ((rpnreal*)(x1))->num *= n.num;
01881     x0->dec();
01882     return;
01883   }
01884   else if (x1->iscomplex())
01885   {
01886     ((rpncomplex*)(x1))->num *= n.num;
01887     x0->dec();
01888     return;
01889   }
01890   else if (x1->isinteger())
01891   {
01892     ds.pop_front();
01893     n.num *= ((rpninteger*)x1)->num;
01894     ds.push_front(x0);
01895     x1->dec();
01896     return;
01897   }
01898 
01899   // Restore the stack.
01900   ds.push_front(x0);
01901 }
01902 
01903 void rpnmultiply::visit(deque<rpnbase*>& ds,rpninteger& n)
01904 {
01905   rpninteger* x0 = (rpninteger*)(ds.front());
01906   ds.pop_front();
01907 
01908   rpnbase* x1 = ds.front();
01909   if (x1->isinteger())
01910   {
01911     ((rpninteger*)(x1))->num *= n.num;
01912     x0->dec(); 
01913     return;
01914   }
01915   else if (x1->isreal())
01916   {
01917     ((rpnreal*)(x1))->num *= n.num;
01918     x0->dec();
01919     return;
01920   }
01921   else if (x1->iscomplex())
01922   {
01923     ((rpncomplex*)(x1))->num *= n.num;
01924     x0->dec();
01925     return;
01926   }
01927 
01928   // Restor the stack.
01929   ds.push_front(x0);
01930 }
01931 
01932 void rpnmultiply::visit(deque<rpnbase*>& ds,rpncomplex& n)
01933 {
01934   rpnbase* x0 = ds.front();
01935   ds.pop_front();
01936 
01937   rpnbase* x1 = ds.front();
01938   if (x1->iscomplex())
01939   {
01940     ((rpncomplex*)(x1))->num *= n.num;
01941     x0->dec();
01942     return;
01943   }
01944   else if (x1->isreal())
01945   {
01946     ds.pop_front();
01947     ds.push_front(x0);
01948     n.num *= ((rpnreal*)x1)->num;
01949     x1->dec();
01950     return;
01951   }
01952   else if (x1->isinteger())
01953   {
01954     ds.pop_front();
01955     ds.push_front(x0);
01956     n.num *= ((rpninteger*)x1)->num;
01957     x1->dec();
01958     return;
01959   }
01960 
01961   //Restor the stack.
01962   ds.push_front(x0);
01963 }
01964 
01965 
01966 
01967 rpnlessthan::rpnlessthan(deque<rpnbase*>& ds, bool const evaluate)
01968 {
01969   if (evaluate)
01970     eval(ds);
01971   else
01972     ds.push_front(this);
01973 }
01974 
01975 rpnbase* rpnlessthan::copy() const
01976 {
01977   return new rpnlessthan();
01978 }
01979 
01980 void rpnlessthan::eval( deque<rpnbase*>& ds )
01981 {
01982   if (ds.size()>1)
01983     ds[0]->accept(ds,*this);
01984 
01985   dec();
01986 }
01987 
01988 void rpnlessthan::visit(deque<rpnbase*>& ds,rpnreal& n)
01989 {
01990   rpnbase* x0 = ds.front();
01991   ds.pop_front();
01992   rpnbase* x1 = ds.front();
01993   ds.pop_front();
01994 
01995   if ( x1->isinteger())
01996   {
01997     new rpninteger(ds, ((rpninteger*)x1)->num < n.num );
01998   }
01999   else
02000   if (x1->isreal())
02001   {
02002     new rpninteger(ds, ((rpnreal*)x1)->num < n.num );
02003   }
02004 
02005   x0->dec();
02006   x1->dec();
02007 }
02008 
02009 void rpnlessthan::visit(deque<rpnbase*>& ds,rpninteger& n)
02010 {
02011   rpnbase* x0 = ds.front();
02012   ds.pop_front();
02013   rpnbase* x1 = ds.front();
02014   ds.pop_front();
02015 
02016   if ( x1->isreal())
02017   {
02018     new rpninteger(ds, ((rpnreal*)x1)->num < n.num );
02019   }
02020   else
02021   if ( x1->isinteger())
02022   {
02023     new rpninteger(ds, ((rpninteger*)x1)->num < n.num );
02024   }
02025 
02026   x0->dec();
02027   x1->dec();
02028 }
02029 
02030 
02031 rpnlessthanequal::rpnlessthanequal(deque<rpnbase*>& ds, bool const evaluate)
02032 {
02033   if (evaluate)
02034     eval(ds);
02035   else
02036     ds.push_front(this);
02037 }
02038 
02039 rpnbase* rpnlessthanequal::copy() const
02040 {
02041   return new rpnlessthanequal();
02042 }
02043 
02044 void rpnlessthanequal::eval( deque<rpnbase*>& ds )
02045 {
02046   if (ds.size()>1)
02047     ds[0]->accept(ds,*this);
02048 
02049   dec();
02050 }
02051 
02052 void rpnlessthanequal::visit(deque<rpnbase*>& ds,rpnreal& n)
02053 {
02054   rpnbase* x0 = ds.front();
02055   ds.pop_front();
02056   rpnbase* x1 = ds.front();
02057   ds.pop_front();
02058 
02059   if ( x1->isinteger())
02060   {
02061     new rpninteger(ds, ((rpninteger*)x1)->num <= n.num );
02062   }
02063   else
02064   if (x1->isreal())
02065   {
02066     new rpninteger(ds, ((rpnreal*)x1)->num <= n.num );
02067   }
02068 
02069   x0->dec();
02070   x1->dec();
02071 }
02072 
02073 void rpnlessthanequal::visit(deque<rpnbase*>& ds,rpninteger& n)
02074 {
02075   rpnbase* x0 = ds.front();
02076   ds.pop_front();
02077   rpnbase* x1 = ds.front();
02078   ds.pop_front();
02079 
02080   if ( x1->isreal())
02081   {
02082     new rpninteger(ds, ((rpnreal*)x1)->num <= n.num );
02083   }
02084   else
02085   if ( x1->isinteger())
02086   {
02087     new rpninteger(ds, ((rpninteger*)x1)->num <= n.num );
02088   }
02089 
02090   x0->dec();
02091   x1->dec();
02092 }
02093 
02094 
02095 rpngreaterthanequal::rpngreaterthanequal(deque<rpnbase*>& ds, bool const evaluate)
02096 {
02097   if (evaluate)
02098     eval(ds);
02099   else
02100     ds.push_front(this);
02101 }
02102 
02103 rpnbase* rpngreaterthanequal::copy() const
02104 {
02105   return new rpngreaterthanequal();
02106 }
02107 
02108 void rpngreaterthanequal::eval( deque<rpnbase*>& ds )
02109 {
02110   if (ds.size()>1)
02111     ds[0]->accept(ds,*this);
02112 
02113   dec();
02114 }
02115 
02116 void rpngreaterthanequal::visit(deque<rpnbase*>& ds,rpnreal& n)
02117 {
02118   rpnbase* x0 = ds.front();
02119   ds.pop_front();
02120   rpnbase* x1 = ds.front();
02121   ds.pop_front();
02122 
02123   if ( x1->isinteger())
02124   {
02125     new rpninteger(ds, ((rpninteger*)x1)->num >= n.num );
02126   }
02127   else
02128   if (x1->isreal())
02129   {
02130     new rpninteger(ds, ((rpnreal*)x1)->num >= n.num );
02131   }
02132 
02133   x0->dec();
02134   x1->dec();
02135 }
02136 
02137 void rpngreaterthanequal::visit(deque<rpnbase*>& ds,rpninteger& n)
02138 {
02139   rpnbase* x0 = ds.front();
02140   ds.pop_front();
02141   rpnbase* x1 = ds.front();
02142   ds.pop_front();
02143 
02144   if ( x1->isreal())
02145   {
02146     new rpninteger(ds, ((rpnreal*)x1)->num >= n.num );
02147   }
02148   else
02149   if ( x1->isinteger())
02150   {
02151     new rpninteger(ds, ((rpninteger*)x1)->num >= n.num );
02152   }
02153 
02154   x0->dec();
02155   x1->dec();
02156 }
02157 
02158 
02159 rpngreaterthan::rpngreaterthan(deque<rpnbase*>& ds, bool const evaluate)
02160 {
02161   if (evaluate)
02162     eval(ds);
02163   else
02164     ds.push_front(this);
02165 }
02166 
02167 rpnbase* rpngreaterthan::copy() const
02168 {
02169   return new rpngreaterthan();
02170 }
02171 
02172 void rpngreaterthan::eval( deque<rpnbase*>& ds )
02173 {
02174   if (ds.size()>1)
02175     ds[0]->accept(ds,*this);
02176 
02177   dec();
02178 }
02179 
02180 void rpngreaterthan::visit(deque<rpnbase*>& ds,rpnreal& n)
02181 {
02182   rpnbase* x0 = ds.front();
02183   ds.pop_front();
02184   rpnbase* x1 = ds.front();
02185   ds.pop_front();
02186 
02187   if ( x1->isinteger())
02188   {
02189     new rpninteger(ds, ((rpninteger*)x1)->num > n.num );
02190   }
02191   else
02192   if (x1->isreal())
02193   {
02194     new rpninteger(ds, ((rpnreal*)x1)->num > n.num );
02195   }
02196 
02197   x0->dec();
02198   x1->dec();
02199 }
02200 
02201 void rpngreaterthan::visit(deque<rpnbase*>& ds,rpninteger& n)
02202 {
02203   rpnbase* x0 = ds.front();
02204   ds.pop_front();
02205   rpnbase* x1 = ds.front();
02206   ds.pop_front();
02207 
02208   if ( x1->isreal())
02209   {
02210     new rpninteger(ds, ((rpnreal*)x1)->num > n.num );
02211   }
02212   else
02213   if ( x1->isinteger())
02214   {
02215     new rpninteger(ds, ((rpninteger*)x1)->num > n.num );
02216   }
02217 
02218   x0->dec();
02219   x1->dec();
02220 }
02221 
02222 
02223 rpnequal::rpnequal(deque<rpnbase*>& ds, bool const evaluate)
02224 {
02225   if (evaluate)
02226     eval(ds);
02227   else
02228     ds.push_front(this);
02229 }
02230 
02231 rpnbase* rpnequal::copy() const
02232 {
02233   return new rpnequal();
02234 }
02235 
02236 void rpnequal::eval( deque<rpnbase*>& ds )
02237 {
02238   if (ds.size()>1)
02239     ds[0]->accept(ds,*this);
02240 
02241   dec();
02242 }
02243 
02244 void rpnequal::visit(deque<rpnbase*>& ds,rpnreal& n)
02245 {
02246   rpnbase* x0 = ds.front();
02247   ds.pop_front();
02248   rpnbase* x1 = ds.front();
02249   ds.pop_front();
02250 
02251   if ( x1->isinteger())
02252   {
02253     new rpninteger(ds, ((rpninteger*)x1)->num == n.num );
02254   }
02255   else
02256   if (x1->isreal())
02257   {
02258     new rpninteger(ds, ((rpnreal*)x1)->num == n.num );
02259   }
02260 
02261   x0->dec();
02262   x1->dec();
02263 }
02264 
02265 void rpnequal::visit(deque<rpnbase*>& ds,rpninteger& n)
02266 {
02267   rpnbase* x0 = ds.front();
02268   ds.pop_front();
02269   rpnbase* x1 = ds.front();
02270   ds.pop_front();
02271 
02272   if ( x1->isreal())
02273   {
02274     new rpninteger(ds, ((rpnreal*)x1)->num == n.num );
02275   }
02276   else
02277   if ( x1->isinteger())
02278   {
02279     new rpninteger(ds, ((rpninteger*)x1)->num == n.num );
02280   }
02281 
02282   x0->dec();
02283   x1->dec();
02284 }
02285 
02286 
02287 rpnfor::rpnfor(deque<rpnbase*>& ds, bool const evaluate)
02288 {
02289   if (evaluate)
02290     eval(ds);
02291   else
02292     ds.push_front(this);
02293 }
02294 
02295 rpnbase* rpnfor::copy() const
02296 {
02297   return new rpnfor();
02298 }
02299 
02300 void rpnfor::eval( deque<rpnbase*>& ds )
02301 {
02302   if (ds.size()>1)
02303     ds[0]->accept(ds,*this);
02304 
02305   dec();
02306 }
02307 
02308 
02309 /*
02310 
02311 Weird for loop crap
02312 
02313 
02314 
02315   if ( x1->isprogram())
02316   {
02317 
02318     bool flag;
02319     rpnbase* x3;
02320 
02321     for ( ; flag; )
02322     {
02323       x0->copy()->eval(ds);
02324       x1->copy()->eval(ds);
02325       x3 = ds.front();
02326       ds.pop_front();
02327       if (x3->isinteger())
02328       {
02329         flag=((rpninteger*)x3)->num;
02330         x3->dec();
02331       }
02332       else
02333       {
02334         new rpnstring(ds,"error in for: test needs to return integer.");
02335         break;
02336       }
02337     }   
02338 
02339 
02340 
02341 
02342 */
02343 
02344 
02345 
02346 
02347 
02348 
02349 void rpnfor::visit(deque<rpnbase*>& ds,rpnprogram& n)
02350 {
02351   rpnbase* x0 = ds.front();  // body 
02352   ds.pop_front();
02353   rpnbase* x1 = ds.front();  // test 
02354   ds.pop_front();
02355 
02356 //cout << "Entering rpnfor" << endl;
02357 
02358   if ( x1->isprogram())
02359   {
02360 
02361     bool flag(0);
02362     rpnbase* x3;
02363 
02364     x1->copy()->eval(ds);
02365     x3 = ds.front();
02366     ds.pop_front();
02367     if (x3->isinteger())
02368     {
02369       flag=((rpninteger*)x3)->num;
02370       x3->dec();
02371     }
02372     else
02373     {
02374       new rpnstring(ds,"error in for: test needs to return integer.");
02375     }
02376 
02377 //
02378 //  MAGIC NUMBER
02379 //  MAGIC NUMBER
02380 //  MAGIC NUMBER
02381 //
02382 //  Limit for loop computation. 
02383     long unsigned int loopcounter(100000);
02384 
02385     
02386     for ( ; flag; )
02387     {
02388       x0->copy()->eval(ds);
02389 
02390       x1->copy()->eval(ds);
02391       x3 = ds.front();
02392       ds.pop_front();
02393       if (x3->isinteger())
02394       {
02395         flag=((rpninteger*)x3)->num;
02396 //cout << "num=" << ((rpninteger*)x3)->num << "  ";
02397 //cout << "flag=" << flag << endl;
02398         x3->dec();
02399       }
02400       else
02401       {
02402         new rpnstring(ds,"error in for: test needs to return integer.");
02403         break;
02404       }
02405 
02406       --loopcounter;
02407       if (loopcounter==0)
02408       {
02409         new rpnstring(ds,"error:  for in infinite loop.");
02410 
02411         flag=false;
02412         break;
02413       }
02414     }   
02415  
02416   }
02417   else 
02418   { // Restore the stack and exit. 
02419     ds.push_front(x1);
02420     ds.push_front(x0);
02421     return;
02422   }
02423 
02424   x0->dec();
02425   x1->dec();
02426 
02427 }
02428 
02429 
02430 
02431 
02432 rpnforn::rpnforn(deque<rpnbase*>& ds, bool const evaluate)
02433 {
02434   if (evaluate)
02435     eval(ds);
02436   else
02437     ds.push_front(this);
02438 }
02439 
02440 rpnbase* rpnforn::copy() const
02441 {
02442   return new rpnforn();
02443 }
02444 
02445 void rpnforn::eval( deque<rpnbase*>& ds )
02446 {
02447   if (ds.size()>1)
02448     ds[0]->accept(ds,*this);
02449 
02450   dec();
02451 }
02452 
02453 void rpnforn::visit(deque<rpnbase*>& ds,rpninteger& n)
02454 {
02455   rpnbase* x0 = ds.front();
02456   ds.pop_front();
02457   rpnbase* x1 = ds.front();
02458   ds.pop_front();
02459 
02460   long int num = n.num;
02461   if (num<=0)
02462     return;
02463 
02464   if ( ! x1->isprogram() )
02465   {
02466     ds.push_front(x1);
02467     ds.push_front(x0);
02468 
02469     return;
02470   }
02471 
02472   for (long int i=0; i<num; ++i)
02473   {
02474     new rpninteger(ds,i); 
02475     x1->copy()->eval(ds);
02476   }
02477 
02478   x0->dec();
02479   x1->dec();
02480 }
02481 
02482 void rpnforn::visit(deque<rpnbase*>& ds,rpnprogram& n)
02483 {
02484   rpnbase* x0 = ds.front();  // body
02485   ds.pop_front();
02486   rpnbase* x1 = ds.front();  // test
02487   ds.pop_front();
02488 
02489   if ( ! x1->isinteger() )
02490   {
02491     ds.push_front(x1);
02492     ds.push_front(x0);
02493 
02494     return;
02495   }
02496 
02497   long int num = ((rpninteger*)x1)->num;
02498   if (num<=0)
02499   {
02500     ds.push_front(x1);
02501     ds.push_front(x0);
02502 
02503     return;
02504   }
02505 
02506   for (long int i=0; i<num; ++i)
02507   {
02508     new rpninteger(ds,i); 
02509     x1->copy()->eval(ds);
02510   }
02511 
02512   x0->dec();
02513   x1->dec();
02514 }
02515 
02516 
02517 
02518 
02519 
02520 prognew::prognew(deque<rpnbase*>& ds, bool const evaluate)
02521 {
02522   if (evaluate)
02523     eval(ds);
02524   else
02525     ds.push_front(this);
02526 }
02527 
02528 rpnbase* prognew::copy() const
02529 {
02530   return new prognew();
02531 }
02532 
02533 void prognew::eval( deque<rpnbase*>& ds )
02534 {
02535   if(!ds.empty())
02536     ds[0]->accept(ds,*this);
02537 
02538   dec();
02539 }
02540 
02541 void prognew::visit(deque<rpnbase*>& ds,rpninteger& n)
02542 {
02543   rpnbase* x0 = ds.front();  
02544   ds.pop_front();
02545 
02546   if ( (n.num<0) || ((unsigned int) n.num > ds.size()) )
02547   {
02548     ds.push_front(x0);
02549     return;
02550   }
02551 
02552   rpnprogram* xp = new rpnprogram();
02553 
02554   if (n.num != 0)
02555   {
02556     for (unsigned int i=0, imax=n.num; i<imax; ++i)
02557     {
02558       xp->v.push_front(ds.front());
02559       ds.pop_front();
02560     }
02561   }
02562 
02563   ds.push_front(xp);
02564 
02565   x0->dec();
02566 }
02567 
02568 
02569 progdecompose::progdecompose(deque<rpnbase*>& ds, bool const evaluate)
02570 {
02571   if (evaluate)
02572     eval(ds);
02573   else
02574     ds.push_front(this);
02575 }
02576 
02577 rpnbase* progdecompose::copy() const
02578 {
02579   return new progdecompose();
02580 }
02581 
02582 void progdecompose::eval( deque<rpnbase*>& ds )
02583 {
02584   if(!ds.empty())
02585     ds[0]->accept(ds,*this);
02586 
02587   dec();
02588 }
02589 
02590 void progdecompose::visit(deque<rpnbase*>& ds,rpnprogram& p)
02591 {
02592   rpnbase* x0 = ds.front();  
02593   ds.pop_front();
02594 
02595   unsigned int n = p.v.size();
02596 
02597   if (n>0)
02598   {
02599     for (unsigned int i=0; i<n; ++i)
02600     {
02601       ds.push_front( p.v.front() );
02602       p.v.pop_front();
02603     }
02604   }
02605 
02606   new rpninteger(ds,n);
02607 
02608   x0->dec();
02609 }
02610 
02611 
02612 
02613 
02614 
02615 
02616 progrev::progrev(deque<rpnbase*>& ds, bool const evaluate)
02617 {
02618   if (evaluate)
02619     eval(ds);
02620   else
02621     ds.push_front(this);
02622 }
02623 
02624 rpnbase* progrev::copy() const
02625 {
02626   return new progrev();
02627 }
02628 
02629 void progrev::eval( deque<rpnbase*>& ds )
02630 {
02631   if(!ds.empty())
02632     ds[0]->accept(ds,*this);
02633 
02634   dec();
02635 }
02636 
02637 void progrev::visit(deque<rpnbase*>& ds,rpnprogram& pr)
02638 {
02639   reverse(pr.v.begin(),pr.v.end());
02640 }
02641 
02642 
02643 rpnsubtract::rpnsubtract(deque<rpnbase*>& ds, bool const evaluate)
02644 {
02645   if (evaluate)
02646     eval(ds);
02647   else
02648     ds.push_front(this);
02649 }
02650 
02651 rpnbase* rpnsubtract::copy() const
02652 {
02653   return new rpnsubtract();
02654 }
02655 
02656 void rpnsubtract::eval( deque<rpnbase*>& ds )
02657 {
02658   if (ds.size()>1)
02659     ds[0]->accept(ds,*this);
02660 
02661   dec();
02662 }
02663 
02664 void rpnsubtract::visit(deque<rpnbase*>& ds,rpncomplex& n)
02665 {
02666   rpnbase* x0 = ds.front();
02667   ds.pop_front();
02668   rpnbase* x1 = ds.front();
02669   ds.pop_front();
02670 
02671   if (x1->iscomplex())
02672   {
02673     ((rpncomplex*)x1)->num -= n.num;
02674     ds.push_front(x1);
02675     x0->dec();
02676     return;
02677   }
02678   else
02679   if (x1->isreal())
02680   {
02681     n.num *= -1;
02682     n.num += ((rpnreal*)x1)->num;
02683     ds.push_front(x0);
02684     x1->dec();
02685     return;
02686   }
02687   else
02688   if (x1->isinteger())
02689   {
02690     n.num *= -1;
02691     n.num += ((rpninteger*)x1)->num;
02692     ds.push_front(x0);
02693     x1->dec();
02694     return;
02695   }
02696 
02697   // Error so restore stack 
02698   ds.push_front(x1);
02699   ds.push_front(x0);
02700 }
02701 
02702 void rpnsubtract::visit(deque<rpnbase*>& ds,rpnreal& n)
02703 {
02704   rpnbase* x0 = ds.front();
02705   ds.pop_front();
02706   rpnbase* x1 = ds.front();
02707   ds.pop_front();
02708 
02709   if (x1->isreal())
02710   {
02711     ((rpnreal*)x1)->num -= n.num;
02712     ds.push_front(x1);
02713     x0->dec();
02714     return;
02715   }
02716   else
02717   if (x1->iscomplex())
02718   {
02719     ((rpncomplex*)x1)->num -= n.num;
02720     ds.push_front(x1);
02721     x0->dec();
02722     return;
02723   }
02724   else
02725   if ( x1->isinteger())
02726   {
02727     n.num *= -1;
02728     n.num += ((rpninteger*)x1)->num;
02729     ds.push_front(x0);
02730     x1->dec();
02731     return;
02732   }
02733 
02734   // Error so restore stack 
02735   ds.push_front(x1);
02736   ds.push_front(x0);
02737 }
02738 
02739 void rpnsubtract::visit(deque<rpnbase*>& ds,rpninteger& n)
02740 {
02741   rpnbase* x0 = ds.front();
02742   ds.pop_front();
02743   rpnbase* x1 = ds.front();
02744 
02745   if ( x1->isreal() )
02746   {
02747     ((rpnreal*)x1)->num -= n.num;
02748     x0->dec();
02749     return;
02750   }
02751   else
02752   if ( x1->isinteger() )
02753   {
02754     ((rpninteger*)x1)->num -= n.num;
02755     x0->dec();
02756     return;
02757   }
02758   else
02759   if ( x1->iscomplex() )
02760   {
02761     ((rpncomplex*)x1)->num -= n.num;
02762     x0->dec();
02763     return;
02764   }
02765 
02766   // Restore the stack. 
02767   ds.push_front(x0);
02768 }
02769 
02770 
02771 rpndivide::rpndivide(deque<rpnbase*>& ds, bool const evaluate)
02772 {
02773   if (evaluate)
02774     eval(ds);
02775   else
02776     ds.push_front(this);
02777 }
02778 
02779 rpnbase* rpndivide::copy() const
02780 {
02781   return new rpndivide();
02782 }
02783 
02784 void rpndivide::eval( deque<rpnbase*>& ds )
02785 {
02786   if (ds.size()>1)
02787     ds[0]->accept(ds,*this);
02788 
02789   dec();
02790 }
02791 
02792 void rpndivide::visit(deque<rpnbase*>& ds,rpnreal& n)
02793 {
02794   rpnbase* x0 = ds.front();
02795   ds.pop_front();
02796   rpnbase* x1 = ds.front();
02797   ds.pop_front();
02798 
02799   if (x1->isreal())
02800   {
02801     ((rpnreal*)x1)->num /= n.num;
02802     ds.push_front(x1);
02803     x0->dec();
02804     return;
02805   }
02806   else
02807   if (x1->iscomplex())
02808   {
02809     ((rpncomplex*)x1)->num /= n.num;
02810     ds.push_front(x1);
02811     x0->dec();
02812     return;
02813   }
02814   else
02815   if ( x1->isinteger())
02816   {
02817     new rpnreal(ds,((rpninteger*)x1)->num / n.num);
02818     x0->dec();
02819     x1->dec();
02820     return;
02821   }
02822 
02823   // Error so restore stack 
02824   ds.push_front(x1);
02825   ds.push_front(x0);
02826 }
02827 
02828 void rpndivide::visit(deque<rpnbase*>& ds,rpninteger& n)
02829 {
02830   rpnbase* x0 = ds.front();
02831   ds.pop_front();
02832   rpnbase* x1 = ds.front();
02833 
02834   if ( x1->isinteger() )
02835   {
02836     if ( ((rpninteger*)x1)->num % n.num == 0 )
02837     {
02838       ((rpninteger*)x1)->num /= n.num;
02839       x0->dec();
02840       return;
02841     }
02842     else
02843     {
02844       long double w = ((rpninteger*)x1)->num;
02845       ds.pop_front();
02846       new rpnreal(ds,w/n.num);
02847       
02848       x0->dec();
02849       x1->dec();
02850       return;
02851     }
02852   }
02853   else
02854   if ( x1->isreal())
02855   {
02856     ((rpnreal*)x1)->num /= n.num;
02857     x0->dec();
02858     return;
02859   }
02860   else
02861   if ( x1->iscomplex())
02862   {
02863     ((rpncomplex*)x1)->num /= n.num;
02864     x0->dec();
02865     return;
02866   }
02867 
02868   // Restore the stack. 
02869   ds.push_front(x0);
02870 }
02871 
02872 void rpndivide::visit(deque<rpnbase*>& ds,rpncomplex& n)
02873 {
02874   rpnbase* x0 = ds.front();
02875   ds.pop_front();
02876   rpnbase* x1 = ds.front();
02877 
02878   if ( x1->iscomplex())
02879   {
02880     ((rpncomplex*)x1)->num /= n.num;
02881     x0->dec();
02882     return;
02883   }
02884   else
02885   if ( x1->isreal())
02886   {
02887     n.num = ((rpnreal*)x1)->num / n.num;
02888     ds.pop_front();
02889     ds.push_front(x0);
02890     x1->dec();
02891     return;
02892   }
02893   else
02894   if ( x1->isinteger())
02895   {
02896     
02897     n.num = complex<long double>(1.0,0.0) / n.num;
02898     n.num *= ((rpninteger*)x1)->num;
02899     ds.pop_front();
02900     ds.push_front(x0);
02901     x1->dec();
02902     return;
02903   }
02904  
02905   // Restore the stack. 
02906   ds.push_front(x0);
02907 }
02908 
02909   
02910 
02911 
02912 
02913 
02914 isrpnstring::isrpnstring(deque<rpnbase*>& ds, bool const evaluate)
02915 {
02916   if (evaluate)
02917     eval(ds);
02918   else
02919     ds.push_front(this);
02920 }
02921 
02922 rpnbase* isrpnstring::copy() const
02923 {
02924   return new isrpnstring();
02925 }
02926 
02927 void isrpnstring::eval( deque<rpnbase*>& ds )
02928 {
02929   if(ds.empty())
02930     return;
02931 
02932   ds[0]->accept(ds,*this);
02933 
02934   rpninteger* res = new rpninteger();
02935   res->num = 0;
02936 
02937   if( ds[0]->isstring() )
02938     res->num = 1;
02939 
02940   ds.push_front(res);
02941 
02942   dec();
02943 }
02944 
02945 
02946 isrpninteger::isrpninteger(deque<rpnbase*>& ds, bool const evaluate)
02947 {
02948   if (evaluate)
02949     eval(ds);
02950   else
02951     ds.push_front(this);
02952 }
02953 
02954 rpnbase* isrpninteger::copy() const
02955 {
02956   return new isrpninteger();
02957 }
02958 
02959 void isrpninteger::eval( deque<rpnbase*>& ds )
02960 {
02961   if(ds.empty())
02962     return;
02963 
02964   ds[0]->accept(ds,*this);
02965 
02966   rpninteger* res = new rpninteger();
02967   res->num = 0;
02968 
02969   if( ds[0]->isinteger() )
02970     res->num = 1;
02971 
02972   ds.push_front(res);
02973 
02974   dec();
02975 }
02976 
02977 
02978 isrpnreal::isrpnreal(deque<rpnbase*>& ds, bool const evaluate)
02979 {
02980   if (evaluate)
02981     eval(ds);
02982   else
02983     ds.push_front(this);
02984 }
02985 
02986 rpnbase* isrpnreal::copy() const
02987 {
02988   return new isrpnreal();
02989 }
02990 
02991 void isrpnreal::eval( deque<rpnbase*>& ds )
02992 {
02993   if(ds.empty())
02994     return;
02995 
02996   ds[0]->accept(ds,*this);
02997 
02998   rpninteger* res = new rpninteger();
02999   res->num = 0;
03000 
03001   if( ds[0]->isreal() )
03002     res->num = 1;
03003 
03004   ds.push_front(res);
03005 
03006   dec();
03007 }
03008 
03009 
03010 
03011 
03012 isrpncomplex::isrpncomplex(deque<rpnbase*>& ds, bool const evaluate)
03013 {
03014   if (evaluate)
03015     eval(ds);
03016   else
03017     ds.push_front(this);
03018 }
03019 
03020 rpnbase* isrpncomplex::copy() const
03021 {
03022   return new isrpncomplex();
03023 }
03024 
03025 void isrpncomplex::eval( deque<rpnbase*>& ds )
03026 {
03027   if(ds.empty())
03028     return;
03029 
03030   ds[0]->accept(ds,*this);
03031 
03032   rpninteger* res = new rpninteger();
03033   res->num = 0;
03034 
03035   if( ds[0]->iscomplex() )
03036     res->num = 1;
03037 
03038   ds.push_front(res);
03039 
03040   dec();
03041 }
03042 
03043 
03044 
03045 
03046 
03047 isrpnprogram::isrpnprogram(deque<rpnbase*>& ds, bool const evaluate)
03048 {
03049   if (evaluate)
03050     eval(ds);
03051   else
03052     ds.push_front(this);
03053 }
03054 
03055 rpnbase* isrpnprogram::copy() const
03056 {
03057   return new isrpnprogram();
03058 }
03059 
03060 void isrpnprogram::eval( deque<rpnbase*>& ds )
03061 {
03062   if(ds.empty())
03063     return;
03064 
03065   ds[0]->accept(ds,*this);
03066 
03067   rpninteger* res = new rpninteger();
03068   res->num = 0;
03069 
03070   if( ds[0]->isprogram() )
03071     res->num = 1;
03072 
03073   ds.push_front(res);
03074 
03075   dec();
03076 }
03077 
03078 
03079 
03080 
03081 
03082 pathcd::pathcd(deque<rpnbase*>& ds, bool const evaluate)
03083 {
03084   if (evaluate)
03085     eval(ds);
03086   else
03087     ds.push_front(this);
03088 }
03089 
03090 rpnbase* pathcd::copy() const
03091 {
03092   return new pathcd();
03093 }
03094 
03095 void pathcd::eval( deque<rpnbase*>& ds )
03096 {
03097   if (!ds.empty())
03098     ds[0]->accept(ds,*this);
03099 
03100   dec();
03101 }
03102 
03103 void pathcd::visit(deque<rpnbase*>& ds,rpnstring& s)
03104 {
03105   rpnbase* x0 = ds.front();
03106   ds.pop_front();
03107 
03108   bool found;
03109   deque<rpnprogram*> programlist;
03110   vector<string> v;
03111   pathstuff().convert(v,s.str);
03112 
03113   pathstuff().findpath(found,programlist,v); 
03114 
03115   if (found)
03116   {  
03117     rpnprogramstackstate().ps->clear();
03118     if (!programlist.empty())
03119     {
03120       for (unsigned int i=0, imax=programlist.size(); i<imax; ++i)
03121         rpnprogramstackstate().push(programlist[i]);
03122     }
03123 
03124     x0->dec();
03125   }
03126   else
03127     ds.push_front(x0); // Restore the stack. 
03128 }
03129 
03130 void pathcd::visit(deque<rpnbase*>& ds,rpnprogram& p)
03131 {
03132   rpnprogramstackstate().push(&p);
03133 }
03134 
03135 
03136 pathquery::pathquery(deque<rpnbase*>& ds, bool const evaluate)
03137 {
03138   if (evaluate)
03139     eval(ds);
03140   else
03141     ds.push_front(this);
03142 }
03143 
03144 rpnbase* pathquery::copy() const
03145 {
03146   return new pathquery();
03147 }
03148 
03149 void pathquery::eval( deque<rpnbase*>& ds )
03150 {
03151   if (!ds.empty())
03152     ds[0]->accept(ds,*this);
03153 
03154   dec();
03155 }
03156 
03157 void pathquery::visit(deque<rpnbase*>& ds,rpnstring& s)
03158 {
03159   bool found;
03160   rpnprogram* p;
03161   vector<string> v;
03162   pathstuff().convert(v,s.str);
03163 
03164   pathstuff().findpath(found,p,v); 
03165 
03166   rpninteger* x = new rpninteger();
03167   x->num = 0;
03168 
03169   if (found)
03170     x->num = 1;
03171 
03172   ds.push_front(x);
03173 }
03174 
03175 
03176 varmv::varmv(deque<rpnbase*>& ds, bool const evaluate)
03177 {
03178   if (evaluate)
03179     eval(ds);
03180   else
03181     ds.push_front(this);
03182 }
03183 
03184 rpnbase* varmv::copy() const
03185 {
03186   return new varmv();
03187 }
03188 
03189 void varmv::eval( deque<rpnbase*>& ds )
03190 {
03191   if (!ds.empty())
03192     ds[0]->accept(ds,*this);
03193 
03194   dec();
03195 }
03196 
03197 void varmv::visit(deque<rpnbase*>& ds,rpnstring& varname)
03198 {
03199   if (ds.size()<2)
03200     return;
03201   
03202   if (!ds[1]->isstring())
03203     return;
03204 
03205   deque<rpnvar*>& vs = rpnprogramstackstate().vs();
03206   if (vs.empty())
03207     return;
03208 
03209   rpnbase* x0 = ds.front();
03210   ds.pop_front();
03211   rpnbase* x1 = ds.front();
03212   ds.pop_front();
03213 
03214   string nm(varname.str);
03215   bool found = false;
03216   unsigned int index;
03217   for (unsigned int i=0, imax=vs.size(); i<imax; ++i)
03218   {
03219     if (vs[i]->varname==nm)
03220     {
03221       found = true;
03222       index = i;
03223       i = imax;
03224     }
03225   }
03226 
03227   if (!found)
03228   {
03229     ds.push_front(x1);
03230     ds.push_front(x0);
03231     return;
03232   }
03233 
03234   rpnstring* s = (rpnstring*)x1;
03235 
03236   rpnprogram* p;
03237   vector<string> v;
03238   pathstuff().convert(v,s->str);
03239 
03240   pathstuff().findpath(found,p,v);
03241   
03242   if (!found)
03243   {
03244     ds.push_front(x1);
03245     ds.push_front(x0);
03246 
03247     return;
03248   }
03249 
03250   p->variables.push_back( vs[index] );
03251   vs.erase(vs.begin()+index);
03252 
03253   x0->dec();
03254   x1->dec();
03255 }
03256 
03257 
03258 rpncp::rpncp(deque<rpnbase*>& ds, bool const evaluate)
03259 {
03260   if (evaluate)
03261     eval(ds);
03262   else
03263     ds.push_front(this);
03264 }
03265 
03266 rpnbase* rpncp::copy() const
03267 {
03268   return new rpncp();
03269 }
03270 
03271 void rpncp::eval( deque<rpnbase*>& ds )
03272 {
03273   if (!ds.empty())
03274     ds[0]->accept(ds,*this);
03275 
03276   dec();
03277 }
03278 
03279 void rpncp::visit(deque<rpnbase*>& ds,rpnstring& varname)
03280 {
03281   if (ds.size()<2)
03282     return;
03283   
03284   if (!ds[1]->isstring())
03285     return;
03286 
03287   deque<rpnvar*>& vs = rpnprogramstackstate().vs();
03288   if (vs.empty())
03289     return;
03290 
03291   rpnbase* x0 = ds.front();
03292   ds.pop_front();
03293   rpnbase* x1 = ds.front();
03294   ds.pop_front();
03295 
03296   string nm(varname.str);
03297   bool found = false;
03298   unsigned int index;
03299   for (unsigned int i=0, imax=vs.size(); i<imax; ++i)
03300   {
03301     if (vs[i]->varname==nm)
03302     {
03303       found = true;
03304       index = i;
03305       i = imax;
03306     }
03307   }
03308 
03309   if (!found)
03310   {
03311     ds.push_front(x1);
03312     ds.push_front(x0);
03313     return;
03314   }
03315 
03316   rpnstring* s = (rpnstring*)x1;
03317 
03318   rpnprogram* p;
03319   vector<string> v;
03320   pathstuff().convert(v,s->str);
03321 
03322   pathstuff().findpath(found,p,v);
03323   
03324   if (!found)
03325   {
03326     ds.push_front(x1);
03327     ds.push_front(x0);
03328 
03329     return;
03330   }
03331 
03332   p->variables.push_back( (rpnvar*)(vs[index]->copy()) );
03333 
03334   x0->dec();
03335   x1->dec();
03336 }
03337 
03338 
03339 rpninsert::rpninsert(deque<rpnbase*>& ds, bool const evaluate)
03340 {
03341   if (evaluate)
03342     eval(ds);
03343   else
03344     ds.push_front(this);
03345 }
03346 
03347 rpnbase* rpninsert::copy() const
03348 {
03349   return new rpninsert(); 
03350 }
03351 
03352 void rpninsert::eval( deque<rpnbase*>& ds )
03353 {
03354   if (!ds.empty())
03355     ds[0]->accept(ds,*this);
03356 
03357   dec();
03358 }
03359 
03360 void rpninsert::visit(deque<rpnbase*>& ds,rpninteger& n)
03361 {
03362   if (ds.size()<2)
03363     return;
03364 
03365   if (n.num<0)
03366     return;
03367 
03368   unsigned int k = (unsigned int)(n.num);
03369 
03370   if (k+2>ds.size())
03371     return;
03372 
03373   rpnbase* x0 = ds.front();
03374   ds.pop_front();
03375   rpnbase* x1 = ds.front();
03376   ds.pop_front();
03377  
03378   ds.insert(ds.begin()+k,x1);
03379 
03380   x0->dec();
03381 }
03382 
03383 
03384 rpnerase::rpnerase(deque<rpnbase*>& ds, bool const evaluate)
03385 {
03386   if (evaluate)
03387     eval(ds);
03388   else
03389     ds.push_front(this);
03390 }
03391 
03392 rpnbase* rpnerase::copy() const
03393 {
03394   return new rpnerase(); 
03395 }
03396 
03397 void rpnerase::eval( deque<rpnbase*>& ds )
03398 {
03399   if (!ds.empty())
03400     ds[0]->accept(ds,*this);
03401 
03402   dec();
03403 }
03404 
03405 void rpnerase::visit(deque<rpnbase*>& ds,rpninteger& n)
03406 {
03407   if (ds.size()<2)
03408     return;
03409 
03410   if (n.num<0)
03411     return;
03412 
03413   unsigned int k = (unsigned int)(n.num);
03414 
03415   if (k+1>=ds.size())
03416     return;
03417 
03418   rpnbase* x0 = ds.front();
03419   ds.pop_front();
03420  
03421   deque<rpnbase*>::iterator i = ds.begin()+k;
03422   (*i)->dec();
03423   ds.erase(i);
03424 
03425   x0->dec();
03426 }
03427 
03428 
03429 rpnpointermake::rpnpointermake(deque<rpnbase*>& ds, bool const evaluate)
03430 {
03431   if (evaluate)
03432     eval(ds);
03433   else
03434     ds.push_front(this);
03435 }
03436 
03437 rpnbase* rpnpointermake::copy() const
03438 {
03439   return new rpnpointermake(); 
03440 }
03441 
03442 void rpnpointermake::eval( deque<rpnbase*>& ds )
03443 {
03444   if (!ds.empty())
03445     ds[0]->accept(ds,*this);
03446 
03447   dec();
03448 }
03449 
03450 void rpnpointermake::visit(deque<rpnbase*>& ds,rpninteger& n)
03451 {
03452   if (ds.size()<=2)
03453     return;
03454 
03455   if (n.num<0)
03456     return;
03457 
03458   unsigned int k = (unsigned int)(n.num);
03459 
03460   if (k+1>ds.size())
03461     return;
03462 
03463   rpnbase* x0 = ds.front();
03464   ds.pop_front();
03465   x0->dec();
03466  
03467   rpnbase* xk = ds[k];
03468   xk->inc();
03469   ds.push_front( xk );
03470 }
03471 
03472 void rpnpointermake::visit(deque<rpnbase*>& ds,rpnstring& s)
03473 {
03474   rpnbase* x0 = ds.front();
03475   ds.pop_front();
03476   
03477   rpnprogramstackstate().recallpointer(ds,s.str);
03478 
03479   x0->dec();
03480 }
03481 
03482 
03483 rpnvectormake::rpnvectormake(deque<rpnbase*>& ds, bool const evaluate)
03484 {
03485   if (evaluate)
03486     eval(ds);
03487   else
03488     ds.push_front(this);
03489 }
03490 
03491 rpnbase* rpnvectormake::copy() const
03492 {
03493   return new rpnvectormake(); 
03494 }
03495 
03496 void rpnvectormake::eval( deque<rpnbase*>& ds )
03497 {
03498   if (!ds.empty())
03499     ds[0]->accept(ds,*this);
03500 
03501   dec();
03502 }
03503 
03504 void rpnvectormake::visit(deque<rpnbase*>& ds,rpninteger& n)
03505 {
03506   if (ds.size()<=2)
03507     return;
03508 
03509   if (n.num<0)
03510     return;
03511 
03512   unsigned int k = (unsigned int)(n.num);
03513   if (k+1>=ds.size())
03514     return;
03515 
03516   rpnbase* x0 = ds.front();
03517   ds.pop_front();
03518   x0->dec();
03519  
03520   rpnbase* xk = new rpnvector(k);
03521   ds.push_front( xk );
03522 }
03523 
03524 void rpnvectormake::visit(deque<rpnbase*>& ds,rpnstring& s)
03525 {
03526   if (ds.size()<=3)
03527     return;
03528 
03529   rpnbase* x1 = ds[1];
03530   if (!x1->isinteger())
03531     return;
03532 
03533   int n = ((rpninteger*)x1)->num;
03534   if ( n<0 )
03535     return;
03536 
03537   unsigned int k = (unsigned int)n;
03538   if (k+2>=ds.size())
03539     return;
03540 
03541   rpnbase* x0 = ds.front();
03542   ds.pop_front();
03543   ds.pop_front();
03544 
03545   new rpnvar
03546   ( 
03547     *(rpnprogramstackstate().ps->front()),
03548     new rpnvector(k),
03549     s.str
03550   );
03551 
03552   x0->dec();
03553   x1->dec();
03554 }
03555 
03556 
03557 
03558 rpnvectorpointermake::rpnvectorpointermake
03559   (deque<rpnbase*>& ds, bool const evaluate)
03560 {
03561   if (evaluate)
03562     eval(ds);
03563   else
03564     ds.push_front(this);
03565 }
03566 
03567 rpnbase* rpnvectorpointermake::copy() const
03568 {
03569   return new rpnvectorpointermake(); 
03570 }
03571 
03572 void rpnvectorpointermake::eval( deque<rpnbase*>& ds )
03573 {
03574   if (!ds.empty())
03575     ds[0]->accept(ds,*this);
03576 
03577   dec();
03578 }
03579 
03580 void rpnvectorpointermake::visit(deque<rpnbase*>& ds,rpnvector& v)
03581 {
03582   if (ds.size()<=2)
03583     return;
03584 
03585   rpnbase* x0 = ds.front();
03586   rpnbase* x1 = ds[1];
03587 
03588   if (!x1->isinteger())
03589     return;
03590 
03591   long int n = ((rpninteger*)x1)->num;
03592 
03593   ds.pop_front();
03594   ds.pop_front();
03595 
03596 
03597   int n2 = v.index();
03598   n += n2;
03599 
03600   if ( (n<0) || !(n<(int)ds.size()) )
03601   {
03602     ds.push_front(x1);
03603     ds.push_front(x0);
03604     return;
03605   }
03606 
03607   x0->dec();
03608   x1->dec();
03609 
03610   rpnbase* w = ds[n];
03611   w->inc();
03612   ds.push_front(w);
03613 }
03614 
03615 
03616 
03617 void rpnvectorpointermake::visit(deque<rpnbase*>& ds,rpninteger& k)
03618 {
03619   if (ds.size()<=2)
03620     return;
03621 
03622   rpnbase* x0 = ds.front();
03623   rpnbase* x1 = ds[1];
03624 
03625   if (!x1->isvector())
03626     return;
03627 
03628 //  int n = ((rpninteger*)x1)->num;
03629 
03630   long int n(k.num);
03631 
03632   ds.pop_front();
03633   ds.pop_front();
03634 
03635 
03636   int n2 = ((rpnvector*)x1)->index();
03637   n += n2;
03638 
03639 
03640   if ( (n<0) || !(n<(int)ds.size()) )
03641   {
03642     ds.push_front(x1);
03643     ds.push_front(x0);
03644     return;
03645   }
03646 
03647   x0->dec();
03648   x1->dec();
03649 
03650   rpnbase* w = ds[n];
03651   w->inc();
03652   ds.push_front(w);
03653 }
03654 
03655 
03656 
03657 void rpnvectorpointermake::visit(deque<rpnbase*>& ds,rpnstring& s)
03658 {
03659   if (ds.size()<=2)
03660     return;
03661 
03662   rpnbase* x0 = ds.front();
03663   rpnbase* x1 = ds[1];
03664 
03665   if (!x1->isinteger())
03666     return;
03667 
03668   int n = ((rpninteger*)x1)->num;
03669 
03670   unsigned int sz0 = ds.size();
03671   rpnprogramstackstate().recallpointer(ds,s.str);
03672   unsigned int sz1 = ds.size();
03673   if (sz0==sz1)
03674     return;
03675 
03676   rpnbase* x2 = ds.front();
03677 
03678   if( ! x2->isvector() )
03679   {
03680     x2->dec();
03681     ds.pop_front();
03682     return;
03683   }
03684 
03685   rpnvector& v = *((rpnvector*)x2);
03686 
03687   ds.pop_front();
03688   ds.pop_front();
03689   ds.pop_front();
03690 
03691   int n2 = v.index();
03692   x2->dec();
03693   n += n2;
03694 
03695   if ( (n<0) || !(n<(int)ds.size()) )
03696   {
03697     ds.push_front(x1);
03698     ds.push_front(x0);
03699     return;
03700   }
03701 
03702   x0->dec();
03703   x1->dec();
03704 
03705   rpnbase* w = ds[n];
03706   w->inc();
03707   ds.push_front(w);
03708 }
03709 
03710 
03711 pstream::pstream(deque<rpnbase*>& ds, bool const evaluate)
03712 {
03713   if (evaluate)
03714     eval(ds);
03715   else
03716     ds.push_front(this);
03717 }
03718 
03719 rpnbase* pstream::copy() const
03720 {
03721   return new pstream(); 
03722 }
03723 
03724 void pstream::eval( deque<rpnbase*>& ds )
03725 {
03726   if (!ds.empty())
03727     ds[0]->accept(ds,*this);
03728 
03729   dec();
03730 }
03731 
03732 
03733 void pstream::visit(deque<rpnbase*>& ds,rpnprogram& p0)
03734 {
03735   if (ds.size()<2)
03736     return;
03737 
03738   rpnbase* x1 = ds[1];
03739   if (! x1->isprogram() )
03740     return;
03741 
03742   rpnprogram& p1 = *( (rpnprogram*) x1 );
03743 
03744   rpnprogram& p = * new rpnprogram(ds);
03745 
03746   rpnprogramstackstate().push(&p);
03747 
03748   if (!p1.v.empty())
03749   {
03750     rpnbase* w;
03751     for (unsigned int i=0, imax = p1.v.size(); i<imax; ++i)
03752     {
03753       w = p1.v[i];
03754       w->inc();
03755       p.v.push_front(w);
03756 
03757 cout << "*";
03758 p0.print(cout);
03759 cout << endl;
03760 
03761       p0.inc();
03762       p0.eval( p.v );
03763     }
03764   }
03765 
03766   if (!p.v.empty())
03767     reverse(p.v.begin(),p.v.end());
03768 
03769   rpnprogramstackstate().pop();
03770 }
03771 
03772 
03773 rpnintegerhex::rpnintegerhex(deque<rpnbase*>& ds, bool const evaluate)
03774 {
03775   if (evaluate)
03776     eval(ds);
03777   else
03778     ds.push_front(this);
03779 }
03780 
03781 rpnbase* rpnintegerhex::copy() const
03782 {
03783   return new rpnintegerhex(); 
03784 }
03785 
03786 void rpnintegerhex::eval( deque<rpnbase*>& ds )
03787 {
03788   rpninteger::displaybase=16;
03789 
03790   dec();
03791 }
03792 
03793 
03794 
03795 
03796 rpnintegeroct::rpnintegeroct(deque<rpnbase*>& ds, bool const evaluate)
03797 {
03798   if (evaluate)
03799     eval(ds);
03800   else
03801     ds.push_front(this);
03802 }
03803 
03804 rpnbase* rpnintegeroct::copy() const
03805 {
03806   return new rpnintegeroct(); 
03807 }
03808 
03809 void rpnintegeroct::eval( deque<rpnbase*>& ds )
03810 {
03811   rpninteger::displaybase=8;
03812 
03813   dec();
03814 }
03815 
03816 
03817 
03818 rpnintegerdec::rpnintegerdec(deque<rpnbase*>& ds, bool const evaluate)
03819 {
03820   if (evaluate)
03821     eval(ds);
03822   else
03823     ds.push_front(this);
03824 }
03825 
03826 rpnbase* rpnintegerdec::copy() const
03827 {
03828   return new rpnintegerdec(); 
03829 }
03830 
03831 void rpnintegerdec::eval( deque<rpnbase*>& ds )
03832 {
03833   rpninteger::displaybase=10;
03834 
03835   dec();
03836 }
03837 
03838 
03839 
03840 
03841 rpnintegerbin::rpnintegerbin(deque<rpnbase*>& ds, bool const evaluate)
03842 {
03843   if (evaluate)
03844     eval(ds);
03845   else
03846     ds.push_front(this);
03847 }
03848 
03849 rpnbase* rpnintegerbin::copy() const
03850 {
03851   return new rpnintegerbin(); 
03852 }
03853 
03854 void rpnintegerbin::eval( deque<rpnbase*>& ds )
03855 {
03856   rpninteger::displaybase=2;
03857 
03858   dec();
03859 }
03860 
03861 
03862 rpnbitnot::rpnbitnot(deque<rpnbase*>& ds, bool const evaluate)
03863 {
03864   if (evaluate)
03865     eval(ds);
03866   else
03867     ds.push_front(this);
03868 }
03869 
03870 rpnbase* rpnbitnot::copy() const
03871 {
03872   return new rpnbitnot();
03873 }
03874 
03875 void rpnbitnot::eval( deque<rpnbase*>& ds )
03876 {
03877   if (!ds.empty())
03878     ds[0]->accept(ds,*this);
03879 
03880   dec();
03881 }
03882 
03883 void rpnbitnot::visit(deque<rpnbase*>& ds,rpninteger& n)
03884 {
03885   n.num = ~n.num;
03886 }
03887 
03888 
03889 rpnbitxor::rpnbitxor(deque<rpnbase*>& ds, bool const evaluate)
03890 {
03891   if (evaluate)
03892     eval(ds);
03893   else
03894     ds.push_front(this);
03895 }
03896 
03897 rpnbase* rpnbitxor::copy() const
03898 {
03899   return new rpnbitxor();
03900 }
03901 
03902 void rpnbitxor::eval( deque<rpnbase*>& ds )
03903 {
03904   if (ds.size()>1)
03905     ds[0]->accept(ds,*this);
03906 
03907   dec();
03908 }
03909 
03910 void rpnbitxor::visit(deque<rpnbase*>& ds,rpninteger& n)
03911 {
03912   rpnbase* x0 = ds.front();
03913   rpnbase* x1 = ds[1];
03914 
03915   if (!x1->isinteger())
03916     return;
03917 
03918   ds.pop_front();
03919 
03920   ((rpninteger*)x1)->num ^= n.num;
03921   
03922   x0->dec();
03923 }
03924 
03925 
03926 rpnbitand::rpnbitand(deque<rpnbase*>& ds, bool const evaluate)
03927 {
03928   if (evaluate)
03929     eval(ds);
03930   else
03931     ds.push_front(this);
03932 }
03933 
03934 rpnbase* rpnbitand::copy() const
03935 {
03936   return new rpnbitand();
03937 }
03938 
03939 void rpnbitand::eval( deque<rpnbase*>& ds )
03940 {
03941   if (ds.size()>1)
03942     ds[0]->accept(ds,*this);
03943 
03944   dec();
03945 }
03946 
03947 void rpnbitand::visit(deque<rpnbase*>& ds,rpninteger& n)
03948 {
03949   rpnbase* x0 = ds.front();
03950   rpnbase* x1 = ds[1];
03951 
03952   if (!x1->isinteger())
03953     return;
03954 
03955   ds.pop_front();
03956 
03957   ((rpninteger*)x1)->num &= n.num;
03958   
03959   x0->dec();
03960 }
03961 
03962 
03963 rpnbitor::rpnbitor(deque<rpnbase*>& ds, bool const evaluate)
03964 {
03965   if (evaluate)
03966     eval(ds);
03967   else
03968     ds.push_front(this);
03969 }
03970 
03971 rpnbase* rpnbitor::copy() const
03972 {
03973   return new rpnbitor();
03974 }
03975 
03976 void rpnbitor::eval( deque<rpnbase*>& ds )
03977 {
03978   if (ds.size()>1)
03979     ds[0]->accept(ds,*this);
03980 
03981   dec();
03982 }
03983 
03984 void rpnbitor::visit(deque<rpnbase*>& ds,rpninteger& n)
03985 {
03986   rpnbase* x0 = ds.front();
03987   rpnbase* x1 = ds[1];
03988 
03989   if (!x1->isinteger())
03990     return;
03991 
03992   ds.pop_front();
03993 
03994   ((rpninteger*)x1)->num |= n.num;
03995   
03996   x0->dec();
03997 }
03998 
03999 
04000 
04001 rpnbitshiftleft::rpnbitshiftleft(deque<rpnbase*>& ds, bool const evaluate)
04002 {
04003   if (evaluate)
04004     eval(ds);
04005   else
04006     ds.push_front(this);
04007 }
04008 
04009 rpnbase* rpnbitshiftleft::copy() const
04010 {
04011   return new rpnbitshiftleft();
04012 }
04013 
04014 void rpnbitshiftleft::eval( deque<rpnbase*>& ds )
04015 {
04016   if (ds.size()>1)
04017     ds[0]->accept(ds,*this);
04018 
04019   dec();
04020 }
04021 
04022 void rpnbitshiftleft::visit(deque<rpnbase*>& ds,rpninteger& n)
04023 {
04024   rpnbase* x0 = ds.front();
04025   rpnbase* x1 = ds[1];
04026 
04027   if (!x1->isinteger())
04028     return;
04029 
04030   ds.pop_front();
04031 
04032   ((rpninteger*)x1)->num = (((rpninteger*)x1)->num << n.num);
04033   
04034   x0->dec();
04035 }
04036 
04037 
04038 
04039 
04040 
04041 rpnbitshiftright::rpnbitshiftright(deque<rpnbase*>& ds, bool const evaluate)
04042 {
04043   if (evaluate)
04044     eval(ds);
04045   else
04046     ds.push_front(this);
04047 }
04048 
04049 rpnbase* rpnbitshiftright::copy() const
04050 {
04051   return new rpnbitshiftright();
04052 }
04053 
04054 void rpnbitshiftright::eval( deque<rpnbase*>& ds )
04055 {
04056   if (ds.size()>1)
04057     ds[0]->accept(ds,*this);
04058 
04059   dec();
04060 }
04061 
04062 void rpnbitshiftright::visit(deque<rpnbase*>& ds,rpninteger& n)
04063 {
04064   rpnbase* x0 = ds.front();
04065   rpnbase* x1 = ds[1];
04066 
04067   if (!x1->isinteger())
04068     return;
04069 
04070   ds.pop_front();
04071 
04072   ((rpninteger*)x1)->num = (((rpninteger*)x1)->num >> n.num);
04073   
04074   x0->dec();
04075 }
04076 
04077 
04078 rpnintegerconvert::rpnintegerconvert(deque<rpnbase*>& ds, bool const evaluate)
04079 {
04080   if (evaluate)
04081     eval(ds);
04082   else
04083     ds.push_front(this);
04084 }
04085 
04086 rpnbase* rpnintegerconvert::copy() const
04087 {
04088   return new rpnintegerconvert();
04089 }
04090 
04091 void rpnintegerconvert::eval( deque<rpnbase*>& ds )
04092 {
04093   if(!ds.empty())
04094     ds[0]->accept(ds,*this);
04095 
04096   dec();
04097 }
04098 
04099 void rpnintegerconvert::visit(deque<rpnbase*>& ds,rpnreal& n)
04100 {
04101   rpnbase* x0 = ds.front();
04102   ds.pop_front();
04103 
04104   long int num = (long int)(n.num);
04105 
04106   new rpninteger(ds,num);
04107 
04108   x0->dec();
04109 }
04110 
04111 
04112 void rpnintegerconvert::visit(deque<rpnbase*>& ds,rpnstring & s)
04113 {
04114   rpnbase* x0 = ds.front();
04115   ds.pop_front();
04116 
04117   long int n;
04118   stringstream ss(s.str.c_str());
04119   ss >> n;
04120   new rpninteger(ds,n);
04121 
04122   x0->dec();
04123 }
04124 rpnstringconvert::rpnstringconvert(deque<rpnbase*>& ds, bool const evaluate)
04125 {
04126   if (evaluate)
04127     eval(ds);
04128   else
04129     ds.push_front(this);
04130 }
04131 
04132 rpnbase* rpnstringconvert::copy() const
04133 {
04134   return new rpnstringconvert();
04135 }
04136 
04137 void rpnstringconvert::eval( deque<rpnbase*>& ds )
04138 {
04139   if(!ds.empty())
04140     ds[0]->accept(ds,*this);
04141 
04142   dec();
04143 }
04144 
04145 void rpnstringconvert::visit(deque<rpnbase*>& ds,rpninteger & n)
04146 {
04147   rpnbase* x0 = ds.front();
04148   ds.pop_front();
04149 
04150   stringstream ss;
04151   ss << n.num;
04152 
04153   new rpnstring(ds,ss.str());
04154 
04155   x0->dec();
04156 }
04157 
04158 void rpnstringconvert::visit(deque<rpnbase*>& ds,rpnreal & n)
04159 {
04160   rpnbase* x0 = ds.front();
04161   ds.pop_front();
04162 
04163   stringstream ss;
04164   ss << n.num;
04165 
04166   new rpnstring(ds,ss.str());
04167 
04168   x0->dec();
04169 }
04170 
04171 
04172 rpnfactorial::rpnfactorial(deque<rpnbase*>& ds, bool const evaluate)
04173 {
04174   if (evaluate)
04175     eval(ds);
04176   else
04177     ds.push_front(this);
04178 }
04179 
04180 rpnbase* rpnfactorial::copy() const
04181 {
04182   return new rpnfactorial();
04183 }
04184 
04185 void rpnfactorial::eval( deque<rpnbase*>& ds )
04186 {
04187   if(!ds.empty())
04188     ds[0]->accept(ds,*this);
04189 
04190   dec();
04191 }
04192 
04193 void rpnfactorial::visit(deque<rpnbase*>& ds,rpninteger & n)
04194 {
04195   if (n.num<0)
04196     return;
04197 
04198   long int num(1);
04199   for (long int i=1; i<=n.num; ++i)
04200     num *= i;
04201 
04202   n.num = num;
04203 }
04204 
04205 
04206 rpnmod::rpnmod(deque<rpnbase*>& ds, bool const evaluate)
04207 {
04208   if (evaluate)
04209     eval(ds);
04210   else
04211     ds.push_front(this);
04212 }
04213 
04214 rpnbase* rpnmod::copy() const
04215 {
04216   return new rpnmod();
04217 }
04218 
04219 void rpnmod::eval( deque<rpnbase*>& ds )
04220 {
04221   if(ds.size()>1)
04222     ds[0]->accept(ds,*this);
04223 
04224   dec();
04225 }
04226 
04227 void rpnmod::visit(deque<rpnbase*>& ds,rpninteger & n)
04228 {
04229   if (!ds[1]->isinteger())
04230     return;
04231   if (n.num<1)
04232     return;
04233 
04234   rpnbase* x0 = ds.front();
04235   ds.pop_front();
04236 
04237   rpninteger* x1 = (rpninteger *)(ds.front());
04238   x1->num %= n.num;
04239 
04240   x0->dec();
04241 }
04242 
04243 
04244 rpnascii::rpnascii(deque<rpnbase*>& ds, bool const evaluate)
04245 {
04246   if (evaluate)
04247     eval(ds);
04248   else
04249     ds.push_front(this);
04250 }
04251 
04252 rpnbase* rpnascii::copy() const
04253 {
04254   return new rpnascii();
04255 }
04256 
04257 void rpnascii::eval( deque<rpnbase*>& ds )
04258 {
04259   if(!ds.empty())
04260     ds[0]->accept(ds,*this);
04261 
04262   dec();
04263 }
04264 
04265 void rpnascii::visit(deque<rpnbase*>& ds,rpninteger & n)
04266 {
04267   rpnbase* x0 = ds.front();
04268   ds.pop_front();
04269 
04270   char ch = (char)(n.num);
04271   string s; s+= ch;
04272   
04273   new rpnstring(ds,s);
04274 
04275   x0->dec();
04276 }
04277 
04278 void rpnascii::visit(deque<rpnbase*>& ds,rpnstring& s)
04279 {
04280   if (s.str.empty())
04281     return;
04282 
04283   rpnbase* x0 = ds.front();
04284   ds.pop_front();
04285 
04286   long int num = s.str[0];
04287   
04288   new rpninteger(ds,num);
04289 
04290   x0->dec();
04291 }
04292 
04293 
04294 rpngcd::rpngcd(deque<rpnbase*>& ds, bool const evaluate)
04295 {
04296   if (evaluate)
04297     eval(ds);
04298   else
04299     ds.push_front(this);
04300 }
04301 
04302 rpnbase* rpngcd::copy() const
04303 {
04304   return new rpngcd();
04305 }
04306 
04307 void rpngcd::eval( deque<rpnbase*>& ds )
04308 {
04309   if(ds.size()>1)
04310     ds[0]->accept(ds,*this);
04311 
04312   dec();
04313 }
04314 
04315 void rpngcd::visit(deque<rpnbase*>& ds,rpninteger & n)
04316 {
04317   if (!ds[1]->isinteger())
04318     return;
04319   if (n.num<1)
04320     return;
04321 
04322   rpnbase* x0 = ds.front();
04323   ds.pop_front();
04324 
04325   rpninteger* x1 = (rpninteger *)(ds.front());
04326 
04327   long int a = x1->num;
04328   if (a<1)
04329   {
04330     ds.push_front(x0);
04331     return;
04332   }
04333 
04334   long int b = n.num;
04335 
04336   if (a<b)
04337   {
04338     long int c = a;
04339     a = b;
04340     b = c;
04341   }
04342 
04343   if (a!=b)
04344   {
04345     for (long int c=a%b;c!=0;)
04346     {
04347       a = b;
04348       b = c;
04349       c = a%b;
04350     }
04351 
04352   }
04353   
04354   x1->num = b;
04355 
04356   x0->dec();
04357 }
04358 
04359 
04360 
04361 
04362 

Generated on Fri Mar 4 00:49:31 2011 for Chelton Evans Source by  doxygen 1.5.8