home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / WordProcessors / FWARexx1.lha / FWMacros / FinalWrapper1.4.rexx < prev    next >
Encoding:
OS/2 REXX Batch file  |  1994-06-15  |  15.7 KB  |  521 lines

  1. /* $VER: FinalWrapper 1.4 (18.05.94) by NDY's */
  2.  
  3. /* Main [1.4] */
  4. OPTIONS RESULTS
  5. SIGNAL ON ERROR
  6. SIGNAL ON SYNTAX
  7. initerr=init()
  8. ADDRESS VALUE port
  9. CALL locale
  10. CALL chosenobjs
  11. CALL options
  12. CALL pointnoval
  13. IF txt>0 THEN
  14.   CALL textblock
  15. ELSE
  16.   CALL bodytext
  17. CALL initwrap
  18. CALL wrap
  19. CALL group
  20. CALL bye
  21.  
  22. PROC init: /* Initialization [1.4] */
  23.   /* Vars needed by "bye" / "ERROR" */
  24.   errtext='"%t" "(#%n) in line %l" "" "Ok" "" ""'
  25.   objs=0
  26.   deci=""
  27.   et=""
  28.   lib=0
  29.   /* Started by Final Writer? */
  30.   port=ADDRESS()
  31.   portok=Left(port,7)="FINALW."
  32.   IF ~portok THEN
  33.     DO i=1 TO 10 UNTIL portok
  34.       port="FINALW."||i
  35.       portok=Show("p",port)
  36.     END
  37.   IF ~portok THEN RETURN 13
  38.   /* Open library */
  39.   library="rexxmathlib.library"
  40.   lib=Show("l",library)
  41.   IF ~lib THEN lib=AddLib(library,0,-30,0)
  42.   IF ~lib THEN RETURN 14
  43.   clip="FWrapper.def"
  44.   default=GetClip(clip)
  45. RETURN 0
  46. PROC locale: /* Language specific strings [1.4] */
  47.   test=0  /* test 1/2/3/4/6/10/20/100/200 WITH new languages, 0 = no test */
  48.   lang=getlanguage()
  49.   info='FinalWrapper 1.4 by NDY''s'
  50.   /* IF default='' THEN default='(put your defaults here and uncomment this line)' */
  51.   IF lang="deutsch" THEN /* German */
  52.     DO
  53.       errtext='"FinalWrapper-Fehler:" "%t" "in Zeile %l (Fehlernummer %n)" "Ok" "" ""'
  54.       noselect='"FinalWrapper-Fehler:" "Zuerst einen Textblock oder einen" "Textausschnitt und ein Oval wählen!" "Ok" "" ""'
  55.       input='"%i" "Sektorgrösse eingeben (? für Hilfe)" "%d"'
  56.       help.0='"Syntax (alle Argumente optional, | trennt Alternativen):" "n|±n|±|An|A±n|A± D±|D= R±|R=|R±n|Rn G± Sn|S±n|S± @±n H±n J±|J= O± ?" "A: Sektorgrösse (0 bis 360), - Text umdrehen. Voreinst.: 360. A± = A±360"'
  57.       help.1='"Rotieren: Voreinstellung: +0. R+ entspricht R+90, R- R-90" "R+n / R-n dreht jedes Zeichen um weitere n Grad (0 bis 180)" "Rn setzt die Drehung aller Zeichen auf n, R= gleich der des Textblocks"'
  58.       help.2='"D (Löschen): Voreinst.: Nur Oval wird gelöscht. D+ auch" "der Textblock wird gelöscht. D- weder Oval noch" "Textblock gelöscht. D= Oval wird kopiert und gelöscht"'
  59.       help.3='"Gruppierung: Voreinst.: Oval nicht mitgruppieren" "G+ Oval zum Objekt hinzugruppieren" "G- Oval unsichtbar hinzugruppieren"'
  60.       help.4='"Startpunkt: Voreinstellung: 0" "S+n/S-n: Anfang um n Grad gegen/mit Uhrzeigersinn" "verschieben. Sn: Start beim Winkel n. S± = S±90"'
  61.       help.5='"@ (Spirale): Voreinst.: 0.  @n erzeugt eine Spirale mit ei-" "nem inneren Radius von n% des äusseren. @-n funktio-" "niert analog, jedoch beginnt die Spirale im Innern"'
  62.       help.6='"Höhe: Voreinst.: Wert von @, wenn angegeben," "sonst 0. Hn funktioniert wie @n, betrifft aber" "die Grösse der Zeichen statt des Radius"'
  63.       help.7='"J (Anpassen): Voreinst.: Nichts anpassen." "J- Zeichenbreite anpassen, J+ auch Höhe anpassen" "J= Sektor an Zeichenbreite anpassen"'
  64.       help.8='"Optionen speichern: Voreinst.: Nicht speichern" "O+ alle Optionen speichern" "O- alle ausser O- speichern und Abbruch"'
  65.       helpbutton='"Letzte Seite" "Zurück" "Nächste Seite"'
  66.       helppages=9
  67.       fwerrtext.10='Befehl gescheitert'
  68.       fwerrtext.20='Ungültige Argumente'
  69.       fwerrtext.100='Befehl unbekannt'
  70.       fwerrtext.200='Kann fwarexx.library nicht öffnen'
  71.       nolib='"FinalWrapper-Fehler:" "Konnte ''%y'' nicht öffnen!" "" "Ok" "" ""'
  72.       nofw='FinalWrapper-Fehler: Final Writer nicht gefunden!'
  73.     END
  74.   ELSE /* Default: English */
  75.     DO
  76.       errtext='"FinalWrapper failed:" "%t" "in line %l (errornumber %n)" "Ok" "" ""'
  77.       noselect='"FinalWrapper failed:" "Select an oval and a textblock or" "some text before calling FinalWrapper!" "Ok" "" ""'
  78.       input='"%i" "Enter sector size (? for help)" "%d"'
  79.       help.0='"Syntax (all arguments are optional, | separates alternatives):" "n|±n|±|An|A±n|A± D±|D= R±|R=|R±n|Rn G± Sn|S±n|S± @±n H±n J±|J= O± ?" "Angle: Sectorsize (0 to 360), - flips the text. Default: 360. A± = A±360"'
  80.       help.1='"Rotate: Default: +0. R+ is equal to R+90, R- to R-90" "R+n / R-n rotates each letter for another n degrees (0 to 180)" "Rn sets rotation of all letters to n, R= equal to the textblock''s"'
  81.       help.2='"Delete: Default: Only oval deleted. D+ deletes" "the textblock as well. D- prevents the oval from" "being deleted. D= copies oval before deleting it"'
  82.       help.3='"Group: Default: Don''t group." "G+ group oval to object" "G- make oval invisible and group it"'
  83.       help.4='"Starting point: Default: 0" "S+n moves the start n degree anticlockwise," "S-n clockwise. Sn: start at angle n. S± = S±90."'
  84.       help.5='"@ (spiral): Default: 0. @n creates a spiral with an inner" "radius of n% of the outer one. @-n works equal" "exept that the spiral now starts at the inside"'
  85.       help.6='"Height: Default: Value from @ if given, else 0" "Hn works as @n, but it affects the height of" "the characters, not the radius"'
  86.       help.7='"J (Adjust): Default: Don''t adjust." "J- adjusts width, J+ also height of characters" "J= adjusts the sector size to the character width"'
  87.       help.8='"Save options: Default: Don''t save" "O+ save all options" "O- save all options exept O- and cancel"'
  88.       helpbutton='"Previous" "Back" "Next"'
  89.       helppages=9
  90.       fwerrtext.10='Instruction failed'
  91.       fwerrtext.20='Invalid arguments'
  92.       fwerrtext.100='Unknown instruction'
  93.       fwerrtext.200='Couldn''t open fwarexx.library'
  94.       nolib='"FinalWrapper failed:" "Couldn''t open ''%y''" "" "Ok" "" ""'
  95.       nofw='FinalWrapper failed: Final Writer not found!'
  96.     END
  97.   input=replacepat(input,"%i",info)
  98.   IF test=4 | initerr=13 THEN
  99.     DO
  100.       SAY nofw
  101.       CALL bye(13)
  102.     END
  103.   IF test=1 | initerr=14 THEN
  104.     DO
  105.       ShowMessage 1 1 replacepat(nolib,"%y",library)
  106.       CALL bye(14)
  107.     END
  108.   IF test>5 THEN
  109.     DO
  110.       RC=test
  111.       IF test=6 THEN SIGNAL SYNTAX
  112.       SIGNAL ERROR
  113.     END
  114. RETURN
  115. PROC chosenobjs: /* Selected objects [1.4] */
  116.   /* Selected objects */
  117.   txt=0
  118.   oval=0
  119.   len=0
  120.   FirstObject "SELECTED"
  121.   o=RESULT
  122.   IF o~=0 THEN
  123.     DO
  124.       cnt=0
  125.       DO UNTIL o=0
  126.         obj.cnt=o
  127.         NextObject o "SELECTED"
  128.         o=RESULT
  129.         cnt=cnt+1
  130.       END
  131.       /* Search oval and textblock */
  132.       DO i=0 TO cnt-1 WHILE oval=0 | txt=0
  133.         GetObjectType obj.i
  134.         IF RESULT=7 THEN txt=obj.i
  135.         IF RESULT=6 THEN oval=obj.i
  136.       END
  137.       /* Selected text */
  138.       IF txt=0 THEN
  139.         DO
  140.           Status "PARAPOS"
  141.           pos=RESULT
  142.           IF Words(pos)=4 THEN
  143.             DO
  144.               Extract
  145.               text=RESULT
  146.               MoveToPara Word(pos,1) Word(pos,2)
  147.               len=Length(text)
  148.             END
  149.           ELSE
  150.             DO
  151.               IF Word(pos,2)~=0 THEN MoveToPara Word(pos,1) 0
  152.               Status "PARACHARS"
  153.               len=RESULT
  154.               text=""
  155.             END
  156.         END
  157.     END
  158.   IF (txt=0 & len=0 | oval=0 | test=2) & test~=3 THEN
  159.     DO
  160.       ShowMessage 1 1 noselect
  161.       CALL bye(5)
  162.     END
  163. RETURN
  164. PROC options: /* Input [1.4] */
  165.   about=0
  166.   DO UNTIL about=-1 & test~=3
  167.     RequestText replacepat(input,"%d",default)
  168.     /* Help */
  169.     IF Pos("?",RESULT)>0 | test=3 THEN
  170.       DO
  171.         default=replacepat(RESULT,"?","")
  172.         about=0
  173.         DO UNTIL RESULT=2
  174.           ShowMessage 2 0 help.about helpbutton
  175.           about=(about+RESULT-2+helppages)//helppages
  176.         END
  177.       END
  178.     ELSE
  179.       about=-1
  180.   END
  181.   RESULT=replacepat(RESULT,",",".")
  182.   PARSE UPPER VAR RESULT "A" ssize " ","D" del " ","R" rrot " ","G" grp " ","S" start " ","@" rdim " ","H" hdim " ","O" opt " ","J" adjust " "
  183.   IF opt="-" THEN 
  184.     DO
  185.       CALL SetClip(clip,Trim(replacepat(Upper(RESULT),"O-","")))
  186.       CALL bye(0)
  187.     END
  188.   IF opt="+" THEN CALL SetClip(clip,Upper(RESULT))
  189.   IF ssize="" THEN PARSE UPPER VAR RESULT ssize " "
  190.   /* Verify and set defaults (x||"0": ± -> ±0) */
  191.   IF ssize="+" | ssize="-" THEN ssize=ssize||"360"
  192.   IF ~Datatype(ssize,"N") | ssize="" THEN ssize=360
  193.   IF ssize=0 THEN ssize=0.01 /* no division by zero */
  194.   IF ~Datatype(rrot||"0","N") & rrot~="=" THEN rrot=""
  195.   IF grp~="+" & grp~="-" THEN grp=""
  196.   IF start="+" | start="-" THEN start=start||"90"
  197.   IF ~Datatype(start,"N") | start="" THEN start="+0"
  198.   absstart=0
  199.   IF Verify(Left(start,1),"+-","m")=0 THEN
  200.     DO
  201.       absstart=1
  202.       start=Max(Min(start,360),0)
  203.     END
  204.   ELSE
  205.     start=Max(Min(start,180),-180)
  206.   IF del~="+" & del~="-" & del~="=" THEN del=""
  207.   IF ~Datatype(hdim,"N") THEN hdim=""
  208.   IF ~Datatype(rdim,"N") THEN rdim=""
  209.   IF rdim="" THEN
  210.     ssize=Max(Min(ssize,360),-360)
  211.   ELSE
  212.     rdim=Max(Min(rdim,100),-100)
  213.   IF rdim=0 THEN rdim=0.01
  214.   IF ~Datatype(hdim,"N") THEN hdim=""
  215.   IF hdim="" THEN
  216.     hdim=rdim
  217.   ELSE
  218.     hdim=Max(Min(hdim,100),-100)
  219.   IF hdim=0 THEN hdim=0.01
  220.   IF adjust~="+" & adjust~="-" & adjust~="=" THEN adjust=""
  221.   /* Relative rotation */
  222.   drot=0
  223.   IF Verify(Left(rrot,1),"+-","m")>0 THEN
  224.     DO
  225.       IF Length(rrot)=1 THEN
  226.         drot=rrot||"90"
  227.       ELSE
  228.         drot=Max(Min(rrot,180),-180)
  229.       rrot=""
  230.     END
  231.   ELSE
  232.     IF rrot~="" & rrot~="=" THEN rrot=Max(Min(rrot,360),-360)
  233. RETURN
  234. PROC pointnoval: /* Decimal point & process oval [1.3] */
  235.   /* Use decimal point */
  236.   GetDocItemPrefs "DECIMAL"
  237.   deci=RESULT
  238.   DocItemPrefs "DECIMAL PERIOD"
  239.   /* Examine oval */
  240.   GetObjectRotation oval
  241.   orot=RESULT
  242.   IF orot~=0 THEN SetObjectRotation oval 0
  243.   GetObjectCoords oval
  244.   PARSE VAR RESULT page x y rx ry
  245.   rx=rx/2
  246.   ry=ry/2
  247.   xm=x+rx
  248.   ym=y+ry
  249.   /* Use oval's text flow settings */
  250.   GetObjectParams oval "TEXTFLOW FLOWDIST"
  251.   flow=Word(RESULT,1)
  252.   IF Left(flow,5)="Right" THEN
  253.     flow="Right"
  254.   ELSE
  255.     IF Left(flow,4)="Left" THEN flow="Left"
  256.   fld=Word(RESULT,2)
  257.   TextBlockPrefs "TEXTFLOW" flow "FLOWDIST" fld
  258.   IF del="=" THEN
  259.     DO
  260.       SelectObject oval
  261.       Copy
  262.     END
  263.   IF del~="-" & grp="" THEN DeleteObject oval
  264. RETURN
  265. PROC textblock: /*  Process textblock [1.4] */
  266.   /* Examine textblock */
  267.   GetTextBlockText txt
  268.   text=RESULT
  269.   text=rembad(text)
  270.   len=Length(text)
  271.   GetObjectTypeSpecs txt "SIZE LEADING WIDTH OBLIQUE POSITION CASE STYLE COLOR FONT"
  272.   PARSE VAR RESULT size lead wid obl pos case st col font
  273.   TextBlockTypePrefs "SIZE" size "LEADING" lead "WIDTH" wid "OBLIQUE" obl "POSITION" pos "CASE" case "STYLE" st "COLOR" col "FONT" font
  274.   GetObjectCoords txt
  275.   txtw=Word(RESULT,4)
  276.   h=Word(RESULT,5)
  277.   /* Get rotation */
  278.   IF rrot="=" THEN
  279.     DO
  280.       GetObjectRotation txt
  281.       rrot=RESULT
  282.     END
  283.   IF del="+" THEN DeleteObject txt
  284. RETURN
  285. PROC bodytext: /* Process selected text [1.4] */
  286.   IF rrot="=" THEN rrot=0
  287.   txtw=0
  288.   /* Remove CR at the end */
  289.   IF C2X(Right(text,1))="0A" THEN
  290.     DO
  291.       len=len-1
  292.       text=Left(text,len)
  293.     END
  294.   text=rembad(text)
  295.   /* Create textobjects */
  296.   DO i=1 TO len
  297.     IF text>"" THEN
  298.       x=SubStr(text,i,1)
  299.     ELSE
  300.       DO
  301.         Extract
  302.         x=RESULT
  303.       END
  304.     Cursor "RIGHT"
  305.     specs=gettexttypespecs()
  306.     TextBlockTypePrefs specs
  307.     IF Verify(x,'";= ',"M")  THEN x='"'||x||'"'
  308.     DrawTextBlock page xm ym x
  309.     /* Save size & number */
  310.     objs=objs+1
  311.     GetObjectCoords 0
  312.     PARSE VAR RESULT x x x objw.objs objh.objs
  313.     txtw=txtw+objw.objs
  314.     CurrentObject
  315.     obj.objs=RESULT
  316.   END
  317. RETURN
  318. PROC initwrap: /* Init wrapping [1.4] */
  319.   PI=3.141593
  320.   smin=0.1 /* Minimal size */
  321.   sizerad=ssize/180*PI
  322.   angstep=sizerad/txtw
  323.   IF absstart THEN
  324.     angstart=start/180*PI
  325.   ELSE
  326.     angstart=(ssize-360+start*2)/360*PI
  327.   adone=angstart
  328.   flip=Sign(ssize)
  329.   ssize=ssize<0
  330.   fr=0
  331.   IF rdim="" THEN
  332.     qr=1
  333.   ELSE
  334.     DO
  335.       fr=(1-Abs(rdim)/100)/sizerad*Sign(rdim)
  336.       IF rdim<0 THEN
  337.         fr0=Abs(rdim)/100
  338.       ELSE
  339.         fr0=1
  340.     END
  341.   IF hdim="" THEN
  342.     qh=1
  343.   ELSE
  344.     DO
  345.       fh=(1-Abs(hdim)/100)/sizerad*Sign(hdim)
  346.       IF hdim<0 THEN
  347.         fh0=Abs(hdim)/100
  348.       ELSE
  349.         fh0=1
  350.     END
  351.   wdone=0
  352.   o=0
  353.   nr=0
  354. RETURN
  355. PROC wrap: /* Wrap it! [1.4] */
  356.   DO n=1 TO len
  357.     char=SubStr(text,n,1)
  358.     IF txt>0 THEN
  359.       DO
  360.         /* Draw and get size */
  361.         IF Verify(char,'";= ',"M")  THEN char='"'||char||'"'
  362.         DrawTextBlock page xm ym char
  363.         GetObjectCoords 0
  364.         cw=Word(RESULT,4)
  365.         ch=h
  366.         CurrentObject
  367.         objs=objs+1
  368.         obj.objs=RESULT
  369.       END
  370.     ELSE
  371.       DO
  372.         /* Number and size saved before */
  373.         nr=nr+1
  374.         cw=objw.nr
  375.         ch=objh.nr
  376.         o=obj.nr
  377.       END
  378.     f=angstart-angstep*(wdone+cw/2)
  379.     wdone=wdone+cw
  380.     /* Adjusting */
  381.     IF adjust="=" THEN
  382.       DO
  383.         asize=cw/radius(adone,rx,ry,fr)
  384.         f=adone-asize/2*flip
  385.         adone=adone-asize*flip
  386.       END
  387.     ELSE
  388.       IF adjust~="" THEN
  389.         DO
  390.           carc=radius(f,rx,ry,fr)*angstep*cw
  391.           IF adjust="+" THEN ch=ch/cw*carc
  392.           cw=carc
  393.         END
  394.     /* Spirals */
  395.     IF rdim~="" THEN qr=fr0+fr*(f-angstart)
  396.     IF hdim~="" THEN
  397.       DO
  398.         qh=fh0+fh*(f-angstart)
  399.         ch=Max(ch*qh,smin)
  400.         cw=Max(cw*qh,smin)
  401.       END
  402.     x=rx*Sin(f)*qr-cw/2
  403.     y=ry*Cos(f)*qr-ch/2
  404.     /* Rotation */
  405.     IF rrot="" THEN
  406.       rot=720-Trunc(Atan(ry/rx*Tan(f))/PI*180)+180*((Cos(f)>0)+ssize)+drot
  407.       /* Circles only: rot=Trunc(ssize*180+180-f/PI*180)+drot */
  408.     ELSE
  409.       rot=rrot
  410.     /* Centre char on the oval */
  411.     SetObjectCoords o page x+xm y+ym cw ch
  412.     SetObjectRotation o rot//360
  413.   END
  414. RETURN
  415. PROC group: /* Group objects [1.4] */
  416.   /* Hide oval */
  417.   IF grp="-" THEN
  418.     DO
  419.       SelectObject oval
  420.       SetObjectParams oval "LINEWT NONE FILL TRANSPARENT"
  421.     END
  422.   /* Rotate oval back */
  423.   IF orot~=0 & del="-" & grp="" THEN SetObjectRotation oval orot
  424.   /* Group chars */
  425.   SelectObject
  426.   DO n=1 TO objs
  427.     SelectObject obj.n "MULTIPLE"
  428.   END
  429.   IF grp~="" THEN SelectObject oval "MULTIPLE"
  430.   Group
  431.   objs=0
  432.   IF orot~=0 THEN SetObjectRotation 0 orot
  433.   Redraw
  434. RETURN
  435. PROC bye: /* CALL bye(returnvalue)  You MUST use this instead of EXIT! [1.4] */
  436.   PARSE ARG errnr
  437.   /* Restore decimal delimitter */
  438.   IF deci~="" THEN DocItemPrefs "DECIMAL" deci
  439.   IF lib=1 THEN CALL RemLib(library)
  440.   IF objs~=0 THEN
  441.     DO
  442.       SelectObject
  443.       DO n=1 TO objs
  444.         SelectObject obj.n "MULTIPLE"
  445.       END
  446.       Group
  447.       DeleteObject
  448.     END
  449.   EXIT errnr
  450. RETURN
  451. PROC SYNTAX: /* SYNTAX & ERROR handling [1.3] */
  452.   et=ErrorText(RC)
  453. ERROR:
  454.   line=SIGL
  455.   nr=RC
  456.   IF et="" THEN et=fwerrtext.nr
  457.   IF nr>5 THEN ShowMessage 1 1 replacepat(replacepat(replacepat(errtext,"%n",nr),"%l",line),"%t",et)
  458.   CALL bye(nr)
  459. RETURN
  460. PROC rembad: PROCEDURE /* newstr=rembad(str) [1.1] */
  461.   /* Replace unprintable characters by spaces */
  462.   PARSE ARG t
  463.   bad=XRange("00"x,"1F"x)||XRange("7F"x,"9F"x)
  464.   i=Verify(t,bad,"m")
  465.   l=Length(t)
  466.   DO WHILE i>0
  467.     t=Left(t,i-1) Right(t,l-i)
  468.     i=Verify(t,bad,"m")
  469.   END
  470. RETURN t
  471. PROC replacepat: PROCEDURE /* newstr=replacepat(str,pat,replc) [1.2] */
  472.   /* Replace all occurences of a pattern in a string by another one */
  473.   PARSE ARG str,pat,replc
  474.   p=Pos(pat,str)
  475.   DO WHILE p>0
  476.     str=Left(str,p-1)||replc||SubStr(str,p+Length(pat))
  477.     p=Pos(pat,str)
  478.   END
  479. RETURN str
  480. PROC getlanguage: PROCEDURE /* language=getlanguage() [1.3] */
  481.   /* Get preferred language */
  482.   ok=Open(prefs,"ENV:Locale","R")
  483.   IF ok THEN
  484.     DO
  485.       language=ReadLn(prefs)
  486.       CALL Close(prefs)
  487.     END
  488. RETURN language
  489. PROC gettexttypespecs: PROCEDURE /*  specs=gettexttypespecs() [1.3] */
  490.   Status "FONTSIZE"
  491.   p="SIZE" RESULT
  492.   Status "FONTLEADING"
  493.   p=p "LEADING" RESULT
  494.   Status "FONTWIDTH"
  495.   p=p "WIDTH" RESULT
  496.   Status "FONTOBLIQUE"
  497.   p=p "OBLIQUE" RESULT
  498.   Status "FONTPOSITION"
  499.   p=p "POSITION" RESULT
  500.   Status "FONTCASE"
  501.   p=p "CASE" RESULT
  502.   Status "FONTSTYLE"
  503.   p=p "STYLE" RESULT
  504.   Status "FONTCOLOR"
  505.   p=p "COLOR" RESULT
  506.   Status "FONTNAME"
  507.   p=p "FONT" RESULT
  508. RETURN p
  509. PROC radius: PROCEDURE /* rad=radius(angle,rx,ry,v) [1.4] */
  510.   ARG a,rx,ry,v
  511.   rx=rx*Cos(a)
  512.   ry=ry*Sin(a)
  513.   r=(1-a*v)*Sqrt(rx*rx+ry*ry)
  514. RETURN r
  515. PROC dump: PROCEDURE /* CALL dump(var[,infostr]) [1.3] */
  516.   /* Dump a variable, %v in infostring determines it's place (debug-only) */
  517.   PARSE ARG v,info
  518.   IF info="" THEN info="%v"
  519.   ShowMessage 1 1 '"'||replacepat(info,"%v",v)||'" "" "" "Ok" "" ""'
  520. RETURN
  521.