home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 3 / PDCD_3.iso / pocketbk / developmen / oplexamp / 3AEVAL.OPL next >
Text File  |  1994-04-19  |  2KB  |  68 lines

  1. rem Does translation first and runtime evaluation afterwards
  2. rem so that eg. a graphics program could translate expression once and
  3. rem for all
  4.  
  5. proc eval:
  6.   local ret%,catH%
  7.   local tObj%,tArgs%(4)     rem translator object and method args
  8.   local rObj%,rArgs%(20)    rem runtime object and method args
  9.   local errBuf$(64),srcBuf$(128),module$(64)
  10.   local dExpr$(100),expr$(101),res$(30)
  11.   local deg%,flags%
  12.  
  13.   ret%=findlib(catH%,"OPL.DYL")
  14.   if ret%<0
  15.     raise ret%
  16.   endif
  17.   tObj%=newObjH(catH%,1)  :rem Create translator object - class C_OPLT
  18.   if tObj%=0
  19.     raise -10 :rem out of memory
  20.   endif
  21.   rObj%=newObjH(catH%,2)  :rem Create runtime object - class C_OPLR
  22.   if rObj%=0
  23.     raise -10 :rem out of memory
  24.   endif
  25.  
  26.   rem Translator method arguments
  27.   tArgs%(1)=0         :rem Translate rather than locate error
  28.   tArgs%(2)=uadd(addr(expr$),1)
  29.   rem tArgs%(3) takes offset to error
  30.   rem tArgs%(4) takes address of QCode cell to be passed to runtime
  31.  
  32.   rem Runtime method arguments
  33.   rem module$="m:\eval.opo"+chr$(0) :rem no module if speed required
  34.   rArgs%(1)=0   rem default stack size - 2K
  35.   rArgs%(4)=uadd(addr(errBuf$),1)    :rem buffer for ZTS error message
  36.   rArgs%(5)=addr(srcBuf$)    :rem buffer for source module name on error
  37.   rArgs%(10)=addr(module$)   :rem lbc module name to load 
  38.  
  39.   rem rArgs%(2) takes error offset in QCode for textual error location
  40.   rem rArgs%(3) takes line number of start of proc that caused error
  41.   rem rArgs%(6)-rArgs%(9) take float result
  42.   
  43.   do
  44.     dinit "Test fast evaluate"
  45.     dEdit dExpr$,"Expression",20
  46.     dChoice deg%,"Mode","Radians,Degrees"
  47.     dText "Result",res$+" "
  48.     if dialog=0 :break :endif
  49.     expr$=dExpr$+chr$(0)
  50.     ret%=send(tObj%,1,tArgs%())  :rem O_OT_EXP method - translate expression
  51.     if ret%<0
  52.       res$=err$(ret%)
  53.     else
  54.       flags%=1 or (deg%-1)*$8000 rem Calculator mode and degrees if required
  55.       ret%=send(rObj%,1,#(flags%),#tArgs%(4),rArgs%()) rem O_OR_RUN method
  56.       if ret%<0
  57.         res$=err$(ret%)
  58.       else
  59.         res$=gen$(peekf(addr(rArgs%(6))),30)  rem peek the result
  60.       endif
  61.     endif
  62.     freeAlloc tArgs%(4)                       rem free the QCode cell
  63.   until 0
  64.   send(tObj%,0)   rem destroy translator object
  65.   send(rObj%,0)   rem destroy runtime object
  66. endp
  67.  
  68.