home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 3 / Meeting_Pearls_III.iso / Pearls / texmf / inputs / latex / contrib / other / fp.lha / fp / fp-upn.sty < prev    next >
Text File  |  1995-04-03  |  7KB  |  224 lines

  1. \NeedsTeXFormat{LaTeX2e}
  2. \ProvidesPackage{fp-upn}[1995/04/03]
  3.  
  4. %version information
  5. \def\FP@upnversion{2.1b}
  6. \message{%
  7.   `UPN Fixed Point Calculator',%
  8.   \space\space\space\space%
  9.   Version \FP@upnversion%
  10.   \space(C) Michael Mehlich%
  11.   \space\space\space\space\space\space\space%
  12.   \space\space\space\space\space\space%
  13. }
  14.  
  15. %resolve dependencies
  16. \RequirePackage{fp}
  17. \RequirePackage{defpattern}
  18.  
  19. %%%public area (macros which may be used)%%%
  20. \def\FPupn#1#2{\FP@@@upn{#1}{#2}} % #1 := eval(#2)
  21.  
  22. %%%private fp-area (don't use these macros)%%%
  23.  
  24. %routines for stack manipulation
  25.  
  26. \edef\FP@stack{()}
  27.  
  28. \defpattern\FP@@@putstack[(#2)#3]{\edef\FP@stack{(#3,#2)}}
  29. \defpattern\FP@@@putstack[()#2]{\edef\FP@stack{(#2)}}
  30. \def\FP@@putstack(#1)#2{\FP@@@putstack[(#1)#2]}
  31. \def\FP@putstack#1{\expandafter\FP@@putstack\FP@stack{#1}}
  32.  
  33. \defpattern\FP@@@getstack[(#2)#3]{\edef\FP@stack{()}\edef#2{#3}}
  34. \defpattern\FP@@@getstack[(#2)#3,#4]{\edef\FP@stack{(#4)}\edef#2{#3}}
  35. \defpattern\FP@@@getstack[(#2)]{\FP@errmessage{UPN stack is empty}}
  36. \def\FP@@getstack(#1)#2{\FP@@@getstack[(#2)#1]}
  37. \def\FP@getstack#1{\expandafter\FP@@getstack\FP@stack{#1}}
  38.  
  39. %local debug macro
  40. \def\FP@upn@debug#1{\FP@debug{upn: #1}}
  41. \def\FP@upnc@debug#1{\FP@upn@debug{calculating \string"#1\string"}}
  42.  
  43. %call fp-functions with parameters from stack
  44. \def\FP@const#1{%
  45.   \FP@upnc@debug{constant #1}
  46.   \expandafter\FP@putstack\csname FP#1\endcsname%
  47. }
  48. \def\FP@nullop#1{%
  49.   \FP@upnc@debug{#1()}%
  50.   \csname FP#1\endcsname\FP@valc%
  51.   \FP@putstack\FP@valc%
  52. }
  53. \def\FP@monop#1{%
  54.   \FP@getstack\FP@vala%
  55.   \FP@upnc@debug{#1(\FP@vala)}%
  56.   \csname FP#1\endcsname\FP@valc\FP@vala%
  57.   \FP@putstack\FP@valc%
  58. }
  59. \def\FP@monopb#1{%
  60.   \FP@getstack\FP@vala%
  61.   \FP@upnc@debug{#1(\FP@vala)}%
  62.   \csname FP#1\endcsname\FP@valc\FP@vald\FP@vala%
  63.   \FP@putstack\FP@vald\FP@putstack\FP@valc%
  64. }
  65. \def\FP@binop#1{%
  66.   \FP@getstack\FP@vala\FP@getstack\FP@valb%
  67.   \FP@upnc@debug{\FP@vala\space #1 \FP@valb}%
  68.   \csname FP#1\endcsname\FP@valc\FP@vala\FP@valb%
  69.   \FP@putstack\FP@valc%
  70. }
  71. \def\FP@binopv#1{%
  72.   \FP@getstack\FP@vala\FP@getstack\FP@valb%
  73.   \FP@upnc@debug{\FP@valb\space #1 \FP@vala}%
  74.   \csname FP#1\endcsname\FP@valc\FP@valb\FP@vala%
  75.   \FP@putstack\FP@valc%
  76. }
  77. \def\FP@binopb#1{%
  78.   \FP@getstack\FP@vala\FP@getstack\FP@valb%
  79.   \FP@upnc@debug{#1(\FP@valb:\FP@vala)}%
  80.   \csname FP#1\endcsname\FP@valc\FP@valb\FP@vala%
  81.   \FP@putstack\FP@valc%
  82. }
  83. \def\FP@binopc#1{%
  84.   \FP@getstack\FP@vala\FP@getstack\FP@valb%
  85.   \FP@upnc@debug{\FP@valb-th #1 of \FP@vala}%
  86.   \csname FP#1\endcsname\FP@valc\FP@vala\FP@valb%
  87.   \FP@putstack\FP@valc%
  88. }
  89. \def\FP@binopd#1{%
  90.   \FP@getstack\FP@vala\FP@getstack\FP@valb%
  91.   \FP@upnc@debug{#1(\FP@vala, \FP@valb)}%
  92.   \csname FP#1\endcsname\FP@valc\FP@vala\FP@valb%
  93.   \FP@putstack\FP@valc%
  94. }
  95.  
  96. %the calculation loop
  97.  
  98. %put value to stack
  99. \def\FP@put#1\@upnend{%
  100.   \FP@upnc@debug{constant #1}%
  101.   \FP@putstack{#1}%
  102. }
  103.  
  104. \defpattern\FP@upn[#2#3]{%
  105.   \ifx#2\@undefined%
  106.     \expandafter\expandafter\expandafter\FP@put\csname #2#3\endcsname\@upnend%
  107.   \else\ifcat\noexpand#2\relax%
  108.     \expandafter\FP@put#2#3\@upnend%
  109.   \else\ifcat#22\relax%
  110.     \expandafter\FP@put#2#3\@upnend%
  111.   \else%
  112.     \expandafter\expandafter\expandafter\FP@put\csname #2#3\endcsname\@upnend%
  113.   \fi\fi\fi%
  114. }
  115.  
  116. %binary functions from fp-basic
  117. \defpattern\FP@upn[+]{\FP@binop{add}}
  118. \defpattern\FP@upn[add]{\FP@binopv{add}}
  119. \defpattern\FP@upn[-]{\FP@binop{sub}}
  120. \defpattern\FP@upn[sub]{\FP@binopv{sub}}
  121. \defpattern\FP@upn[*]{\FP@binop{mul}}
  122. \defpattern\FP@upn[mul]{\FP@binopv{mul}}
  123. \defpattern\FP@upn[/]{\FP@binop{div}}
  124. \defpattern\FP@upn[div]{\FP@binopv{div}}
  125.  
  126. %unary functions from fp-basic
  127. \defpattern\FP@upn[abs]{\FP@monop{abs}}
  128. \defpattern\FP@upn[neg]{\FP@monop{neg}}
  129. \defpattern\FP@upn[sgn]{\FP@monop{sgn}}
  130.  
  131. %binary functions from fp-addons
  132. \defpattern\FP@upn[min]{\FP@binopd{min}}
  133. \defpattern\FP@upn[max]{\FP@binopd{max}}
  134.  
  135. %functions from fp-snap
  136. \defpattern\FP@upn[round]{\FP@binopb{round}}
  137. \defpattern\FP@upn[trunc]{\FP@binopb{trunc}}
  138. \defpattern\FP@upn[clip]{\FP@monop{clip}}
  139.  
  140. %functions from fp-exp
  141. \defpattern\FP@upn[e]{\FP@const{e}}
  142. \defpattern\FP@upn[exp]{\FP@monop{exp}}
  143. \defpattern\FP@upn[ln]{\FP@monop{ln}}
  144. \defpattern\FP@upn[pow]{\FP@binopc{pow}}
  145. \defpattern\FP@upn[root]{\FP@binopc{root}}
  146.  
  147. %functions from fp-random
  148. \defpattern\FP@upn[seed]{%
  149.   \FP@getstack\FP@vala\FPseed=\FP@vala%
  150. }
  151. \defpattern\FP@upn[random]{\FP@nullop{random}}
  152.  
  153. %functions from fp-trigo
  154. \defpattern\FP@upn[pi]{\FP@const{pi}}
  155. \defpattern\FP@upn[sin]{\FP@monop{sin}}
  156. \defpattern\FP@upn[cos]{\FP@monop{cos}}
  157. \defpattern\FP@upn[sincos]{\FP@monopb{sincos}}
  158. \defpattern\FP@upn[tan]{\FP@monop{tan}}
  159. \defpattern\FP@upn[cot]{\FP@monop{cot}}
  160. \defpattern\FP@upn[tancot]{\FP@monopb{tancot}}
  161. \defpattern\FP@upn[arcsin]{\FP@monop{arcsin}}
  162. \defpattern\FP@upn[arccos]{\FP@monop{arccos}}
  163. \defpattern\FP@upn[arcsincos]{\FP@monopb{arcsincos}}
  164. \defpattern\FP@upn[arctan]{\FP@monop{arctan}}
  165. \defpattern\FP@upn[arccot]{\FP@monop{arccot}}
  166. \defpattern\FP@upn[arctancot]{\FP@monopb{arctancot}}
  167.  
  168. %stack manipulators
  169. \defpattern\FP@upn[pop]{%
  170.   \FP@getstack\FP@vala%
  171.   \FP@upn@debug{removing top number \string"\FP@vala\string"}%
  172. }
  173. \defpattern\FP@upn[swap]{%
  174.   \FP@getstack\FP@vala\FP@getstack\FP@valb%
  175.   \FP@upn@debug{exchanging top numbers \string"\FP@vala\string" and \string"\FP@valb\string"}%
  176.   \FP@putstack\FP@vala\FP@putstack\FP@valb%
  177. \defpattern\FP@upn[copy]{%
  178.   \FP@getstack\FP@vala%
  179.   \FP@upn@debug{duplicating top number \string"\FP@vala\string"}%
  180.   \FP@putstack\FP@vala\FP@putstack\FP@vala%
  181. }
  182.  
  183. %left-to-right loop 
  184. \defpattern\FP@upn[#2 #3]{\FP@upn[#2]\FP@upn[#3]}
  185. \defpattern\FP@upn[#2 ]{\FP@upn[#2]}
  186. \defpattern\FP@upn[ #2]{\FP@upn[#2]}
  187.  
  188. %get result from stacks with one value only
  189. \defpattern\FP@@upn@result[(#2)#3]{\edef#2{#3}}
  190. \defpattern\FP@@upn@result[(#2)]{\FP@errmessage{UPN stack is empty}\edef#2{0}}
  191. \defpattern\FP@@upn@result[(#2)#3,#4]{\FP@errmessage{Evaluation results in multiple values}\edef#2{#3}}
  192. \def\FP@upn@result(#1)#2{\FP@@upn@result[(#2)#1]}
  193.  
  194. %save result of upn-expression to macro
  195. \def\FP@saveval[#1#2]{%
  196.   \ifx#1\@undefined%
  197.     \let#1\FP@tmp%
  198.   \else\ifcat\noexpand#1\relax%
  199.     \let#1\FP@tmp%
  200.   \else%
  201.     \expandafter\let\csname #1#2\endcsname\FP@tmp%
  202.   \fi\fi%
  203. }
  204.  
  205. %the main routine
  206. \def\FP@@upn#1#2{%
  207.   \bgroup%
  208.     \FP@upn@debug{+++ computing upn-expression \string"#2\string"}%
  209.     \edef\FP@tmp{[#2]}%
  210.     \expandafter\FP@upn\FP@tmp%
  211.     \FP@upn@debug{+++ result of upn-expression is \string"\FP@stack\string"}%
  212.     \expandafter\FP@upn@result\FP@stack\FP@tmp%
  213.     \global\let\FP@tmp\FP@tmp%
  214.   \egroup%
  215.   \FP@saveval[#1]%
  216. }
  217.  
  218. \def\FP@@@upn#1#2{%
  219.   \FP@beginmessage{UPN}%
  220.   \FP@@upn{#1}{#2}%
  221.   \FP@endmessage{}%
  222. }
  223.