[comp.sources.amiga] v91i010: rxgen - call any library function from arexx, Part01/01

amiga-request@ab20.larc.nasa.gov (Amiga Sources/Binaries Moderator) (02/12/91)

Submitted-by: rouaix@margaux.inria.fr
Posting-number: Volume 91, Issue 010
Archive-name: rexx/rxgen/part01

RXGEN is an ARexx library designed for the hacker.
This library allows you to call any function of (almost) any amiga
library from a Arexx program.
I would say it is essentially useful under 2.0 to test some of
the new "high-level" features of the system. It also works under 1.3.
You can use the library to write small programs, when you don't want
to use your C-compiler ! Eventually, your program will get bigger and
bigger, and you'll find out that either you don't need your C-compiler,
or that Arexx is slow (heheh).
--Francois

#!/bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 1 (of 1)."
# Contents:  libs libs/rxgen.uu rexx rexx/FD2rxFD.rexx rexx/alert.rexx
#   rexx/db.rexx rexx/fd.rexx rexx/port.rexx rexx/wbfront.rexx
#   rexx/wbmaster.rexx rxgen.doc rxgen.readme
# Wrapped by tadguy@ab20 on Mon Feb 11 19:28:29 1991
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test ! -d 'libs' ; then
    echo shar: Creating directory \"'libs'\"
    mkdir 'libs'
fi
if test -f 'libs/rxgen.uu' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'libs/rxgen.uu'\"
else
echo shar: Extracting \"'libs/rxgen.uu'\" \(6963 characters\)
sed "s/^X//" >'libs/rxgen.uu' <<'END_OF_FILE'
Xbegin 700 rxgen.library
XM```#\P`````````"``````````$```1,````*0```^D```1,<`!.=4K\````G
XM!````6V``0D`````'@```"P```!.<GAG96XN;&EB<F%R>0!R>&=E;BYL:6)R6
XM87)Y(#$N,"`H,3<@07!R(#$Y.#DI#0H`````+````%X```!V````H@```,X`9
XM``#<````\@```3P```%`_____^````P)`,````H````>X```#@8`T```%``!^
XMT```%@``P```&````"P`````+PTJ0"M.`"(CS@```5(K2``F0_D```%:<")._
XMKOW8(\````%69P(@#2I?3G52;@`@"*X``P`J(`Y.=7``4VX`(&8,""X``P`JY
XM9P1A```$3G5(YR`&*DXL;0`B2FT`(&<```P([0`#`"IP`&`H)"T`)B!-3J[_>
XM!")Y```!5DZN_F)P`")-,"T`$)/`T&T`$DZN_RX@`DS?8`1.=7``3G59CR\/V
XM+PA.N0```;Y03R!?3G4``````````')E>'AS>7-L:6(N;&EB<F%R>0````!.L
XM5?_X2.<!`'#_*T#_^'X`#(<````$;"H@!W(,3KH/3B!`T?P````L+Q`O+0`(^
XM3KH/7%!/2H!F!BM'__A@!%*'8,X@+?_X3-\`@$Y=3G5.5?[L2.<@`$*M_O`@2
XM;0`(+R@`*&&<6$\K0/_X#(#_____9P``Q"!M``@B*``<`H$````/+T$`!'(,L
XM3KH.XB!`T?P````L)"\`!+2H``AL!G`18```IB`M__A.N@["($#1_````"PB<
XM:``$2&W^]"\M``A.D5!/*T#__$J`9G`@+?[T!(`````!;60,@`````1L7..`+
XM3OL(`F`.8!Q@+DYQ*VW^^/[P8$8O+?[X3KH-$%A/*T#^\&`V2'@`!$AM_OA.V
XMN@S,4$\K0/[P8")(;?[X3KH.C%A/+P!(;?[X3KH,L%!/*T#^\&`&<`$K0/_\3
XM(&T`#""M_O`@+?_\3-\`!$Y=3G5.5?_<<``K0/_H*T#_X"!M``@O*``L*T#_%
XMW"M`__!.N@P,6$\K0/_T4H`O/``!```O`$ZZ#8Q03R(M__0&@0```!`O/``!-
XM```O`2M`__A.N@UP4$\K0/_\2JW_^&<$2H!F"G(#*T'_W&```6X@;0`(+R@`F
XM+$AY````:"\`3KH-&D_O``P@;0`(2J@`,&<22&W_X"\H`#!.N@S:4$\K0/_PO
XM+RW_\"\M__Q.N@U:4$\K0/_L2H!G``$<+RW_]"!M``@O*``L+RW_^$ZZ"ZI/:
XM[P`,+RW_^$AY````="\M__Q.N@RX3^\`#$AX``1(;?_L+RW__"\M``A.N@D2R
XM3^\`$"M`_]Q*@&<.+RW_[$ZZ#.183V```,8O+?_X2'D```!\+RW__$ZZ#'1/=
XM[P`,2&W_Y"\M__PO+0`(3KH(>D_O``PK0/_<2H!G.B\M_^Q.N@RD6$\O+?_X,
XM2'D```!T+RW__$ZZ##A/[P`,2'@`!$AM_^@O+?_\+RT`"$ZZ"))/[P`08%A(M
XM;?_@+RW_Y$ZZ"^A03RM`_^A2K?_H+RW_Z$ZZ"R!83RM`_^0O`$ZZ"H183R\`C
XM+RW_Y"\M__PO+0`(3KH(3D_O`!!P`2!M``P@@"%M_^@`!&`&<!(K0/_<2JW_M
XM_&<6("W_]`:`````$"\`+RW__$ZZ"^A03TJM__AG$B`M__12@"\`+RW_^$ZZR
XM"]!03R`M_]Q.74YU3E7_X"!M``@O*``L3KH*"EA/*T#_]%*`+SP``0``+P!.&
XMN@N*4$\B+?_T!H$````0+SP``0``+P$K0/_X3KH+;E!/*T#__$JM__AG!$J`N
XM9@IP`RM`__!@``$(+RW_]"!M``@O*``L+RW_^$ZZ"?1/[P`,+RW_^$AY````#
XM?"\M__Q.N@L"3^\`#$AM_^@O+?_\+RT`"$ZZ!PA/[P`,2&W_["\M_^@K0/_PG
XM3KH*M%!/*T#_X$J`;@IR$BM!__!@``"B4ZW_X"\M_^!.N@G>6$\K0/_H+P!.1
XMN@E"6$\O`"\M_^@O+?_\+RT`"$ZZ!PQ/[P`0+RW_^$AY````="\M__Q.N@J$W
XM3^\`#$AM_^@O+?_\+RT`"$ZZ!HI/[P`,*T#_\$J`9CX@;?_H(!`O`"M`_^1.Z
XMN@JL6$]*K?_@9AA(>``$2&W_X"\M__PO+0`(3KH&JD_O`!!P`2!M``P@@"%M\
XM_^``!$JM__QG%B`M__0&@````!`O`"\M__Q.N@I,4$]*K?_X9Q(@+?_T4H`O3
XM`"\M__A.N@HT4$\@+?_P3EU.=4Y5__1(YP$`?@`@;0`(("@`'`*`````#U6`%
XMOH!L``"L(`<B!^6!2K`8-&<``(H@;0`,$!!(@%*M``P,0`!!9U`,0`!)9QX,Y
XM0`!39EX@!R('Y8$@;0`((FT`$"*P&#18K0`08&`@;0`06*T`$"`'(@?E@4AM1
XM__@B;0`(+S$8-"](``Q.N@D^4$\@;P`$((!@-"`'(@?E@2)M``@@<1@T(FT`K
XM$"*06*T`$&`:(&T`$$*06*T`$&`.4JT`#"!M`!!"D%BM`!!2AV``_T(@+0`,E
XM3-\`@$Y=3G5.5?^F0JW__"!M``@O*``L3KH'E%A/(&T`""\H`#`K0/^L3KH'N
XM@EA/(BW_K%*!+SP``0``+P$K0/^H3KH(_E!/(BW_J%*!+SP``0``+P$K0/^T4
XM3KH(YE!/(BW_K-*M_ZA>@2\\``$``"\!*T#_L$ZZ",I03RM`_[A*K?^T9PI**
XMK?^P9P1*@&8*<`,K0/_\8``!("\M_ZP@;0`(+R@`+"\M_[1.N@=*3^\`#"\M(
XM_Z@@;0`(+R@`,"\M_[!.N@<R3^\`#"\M_[1(>0```)`O+?^X3KH(0$_O``Q(N
XM;?_`+RW_N"\M``A.N@1&3^\`#"M`__Q*@&8``+PB;?_`(%$K2/_$L/P``&8*B
XM<!(K0/_\8```HB\M_[`O+?^T2'D```"8+RW_N$ZZ!^Y/[P`02&W_P"\M_[@OQ
XM+0`(3KH#]$_O``PK0/_\2H!F:B!M_\`[4/^F(`A4@$AM_\@O`"\M``@K0/^\K
XM80#]R$_O``P@0!(0*TC_O%*(*TC_O`P!`"!G"'`1*T#__&`L<`(@;0`,((`P2
XM+?^F2,!(;?_(+RW_O"\`+RW_Q$ZZ`EQ/[P`0(&T`#"%```1*K?^X9Q8@+?^L0
XMT*W_J%Z`+P`O+?^X3KH'BE!/2JW_M&<2("W_K%*`+P`O+?^T3KH'<E!/2JW_]
XML&<2("W_J%*`+P`O+?^P3KH'6E!/("W__$Y=3G5.5?^D0JW__"!M``@O*``LO
XM3KH%D%A/(&T`""\H`#`K0/_<3KH%?EA/(BW_W%*!+SP``0``+P$K0/_83KH&!
XM^E!/(BW_V%*!+SP``0``+P$K0/_D3KH&XE!/(BW_W-*M_]A>@2\\``$``"\!&
XM*T#_X$ZZ!L903RM`_^A*K?_D9PI*K?_@9P1*@&8*<`,K0/_\8``!%B\M_]P@\
XM;0`(+R@`+"\M_^1.N@5&3^\`#"\M_]@@;0`(+R@`,"\M_^!.N@4N3^\`#"!MP
XM``@O*``L2'D```"0+RW_Z$ZZ!CA/[P`,2&W_]"\M_^@O+0`(3KH"/D_O``PK[
XM0/_\2H!F``"N(&W_]"M0__@O+?_@+RW_Y$AY````F"\M_^A.N@7X3^\`$$AMI
XM__0O+?_H+RT`"$ZZ`?Y/[P`,*T#__$J`9FX@;?_T*U#_[%B(2&W_I"\(+RT`@
XM""M(__!A`/O43^\`#"!`$A`K2/_P4H@K2/_P#`$`(&<(<!(K0/_\8#)P`B!M9
XM``P@@"!M``@@*``<`H`````/5X!(;?^D+RW_["\`3KH!+D_O``P@;0`,(4``6
XM!$JM_^AG%B`M_]S0K?_87H`O`"\M_^A.N@604$]*K?_D9Q(@+?_<4H`O`"\M_
XM_^1.N@5X4$]*K?_@9Q(@+?_84H`O`"\M_^!.N@5@4$\@+?_\3EU.=4SO`P,`Y
XM!$CG/SY(>0``"WPL0-"!+P"?_````!!"@!`89P``$.6(*'P```O,*'0``$[46
XM3-\3`4YU3-]\_$YU8-PO60`$8-8O60`(8-`D66#,)EE@R"]9``Q@PBI98+X@M
XM&6"Z(!E@MB]9``!@L"(98*PD&6"H)AE@I"@98*`J&6"<+!E@F"X98)0```N"N
XM```+J@``"[````NT```+N```"[P```O````+Q```"\@```N$```+B@``"Y``E
XM``N4```+F```"YX```NB```+IDSO`P$`!$CG/SXN`%?(``@O,0``8/9.D-_''
XM3-]\_$YU(&\`!$CG("(D2"QY````!$/Z`@9P`$ZN_=@D`&<<(D!.KOYB<`"T.
XMJ@`89@XB*@`49P@@2BQ"3J[_6$J`3-]$!$YU3.\#```$80IF!B!O``P@B4YU0
XM2.<0/B1()DEAIF<P+&H`&"!J`!1.KO^4*$@@2V$``+AF'"1))`$@3"`"<@!.G
XMKO^X<`!0B4J!9P:3R6`"<`I*@$S??`A.=4SO`P``!$SO``,`#$CG/SY/[__T#
XM)$@F22I`)@%!^@!8(D]A``$D($IA`/]`9TPL:@`8<`D,@P``__]N0"!J`!1.!
XMKO^4*$@@2V$``$9F+B1))`$@3"`"3J[_OB@`($PB32`#80``EF<.($PB0"`$T
XM3J[_K'``8`9P`V`"<`H@3R\`80``YB`?3^\`#$S??/Q.=4CG,#!T`'8`3J[^3
XMX")(($QA6"1`9S9#Z@`(,"H`!"()#!D`+E?(__IF$,.)DHDF"B!,(`%A-"1`L
XM9Q)!Z@`(3J[_FK)J``1G!G0H8`)T`TJ"9PP@3")*848@3")#84`B2B(#(`),R
XMWPP,3G5(YX!`4(!2@$ZN_XY,WP(!9QXO"$*0,4``!!%\``(`!D(P"`A0B$ZNP
XM_O(@7Q%```<@"$YU(@EG%'`!P"D`!F8,,"D`!%"`4H!.KO^(3G4O"R9J`!0CP
XM2@``3.L``P#\2.L#``#\2.D``P`$)E].=2)H```B:0`43.@``P`$2.D``P#\&
XM3G5R97AX<WES;&EB+FQI8G)A<GD``#(\_U)@<#(\_JI@:C(\_Q!@9'*48&`RK
XM//\T8%HR//YH8%0R//]P8$XR//]\8$@R//]J8$(R//YZ8#PR//YT8#8R//YN8
XM8#`R//YB8"HR//Z`8"0R//],8!YRB&`:,CS_%F`4<II@$#(\_R)@"C(\_QQ@8
XM!#(\_UA,[P,```0@+P`,+PXL>0```59.MA``+%].=3(\_W9@X#(\_SI@VC(\S
XM_HQ@U#(\_IY@SC(\_J1@R#(\_T9@PC(\_T!@O#(\_D1@MC(\_P1@L#(\_OY@=
XMJC(\_OA@I#(\_O)@GC(\_NQ@F#(\_N!@DC(\_H9@C#(\_IA@AG*"8"`R//\H-
XM8!HR//]D8!0R//Y08`YRCF`*,CS_+F`$,CS^YB!O``0@+P`(8`#_8C(\_LA@C
XM$#(\_CY@"C(\_MI@!#(\_C@@+P`$8`#_1#)\_LY@$#)\_L)@"C)\_UY@!#)\'
XM_I(@;P`$3.\``P`(+PXL>0```59.MI``+%].=4SO`P,`!,&(PXDO#BQY```!!
XM5DZN_DHL7TYU3.\#`P`$P8C#B2\.+'D```%63J[^O"Q?3G5,[P,#``3!B,.)9
XM+PXL>0```59.KOZV+%].=4SO`P,`!,&(PXDO#BQY```!5DZN_K`L7TYU(&\`1
XM!#(\_M1A`/Z@(F\`""*!3G4@+P`$<J!A`/Z.(F\`""*(3G5(YP`Z)F\`%"!O[
XM`!A#[P`<1?H`$BQY````!$ZN_?9,WUP`3G46P$YU+PXL>0```5),[P`#``A.[
XMKO\Z+%].=0``+PXL>0```5(B;P`(("\`#$ZN_RXL7TYU+PXL>0```5(B;P`(C
XM3J[^8BQ?3G4O#BQY```!4B)O``@@+P`,3J[]V"Q?3G4@0B)#)``F`4A"2$/$=
XMP<;`P,'40TA"0D+0@B8))`A.=2!O``0B;P`($ABR&68(2@%F]G``3G5N!'#_G
XM3G5P`4YU(&\`!$H89OQ3B)'O``0@"$YU``````/L````,0```````!#(```0@
XMM```$)P``!"$```0)@``$`P```_R```/V```#[X```[@```,#```#`@```P$E
XM```,````"_P```OX```+]```"_````OL```+Z```"^0```O@```+W```"]@`>
XM``O4```+T```"\P```ML```+4````4@```$:````P@```+8```"L````F@``%
XM`(````!N````:@```&8```!B````7@```%H```!6````4@```!H````6````P
XM$@````H````&````#0````$```I6```*%@``"&````@.```%R@``!4P```06H
XM```#V@```Y8```,V```"(````@````&4`````````_(```/J````*4=%3D]0L
XM14Y,24(``$=%3D-,3U-%3$E"`$=%3D%#04Q,``!'14Y#0T%,3```````````!
XM`L`````"````#```!-0````!````&```!T8````"````(@``"4H````"````'
XM````````````)7,N;&EB<F%R>0``3$E"4RXE<P!,24)3+B5S+D]014Y#3U5.P
XM5````$Q)0E,N)7,`3$E"4RXE<RXE<P`````#[`````0`````````5````$@`)
XG```\````,`````0````!````4````$0````X````+`````````/R>
X``
Xend
Xsize 4944
END_OF_FILE
if test 6963 -ne `wc -c <'libs/rxgen.uu'`; then
    echo shar: \"'libs/rxgen.uu'\" unpacked with wrong size!
fi
# end of 'libs/rxgen.uu'
fi
if test ! -d 'rexx' ; then
    echo shar: Creating directory \"'rexx'\"
    mkdir 'rexx'
fi
if test -f 'rexx/FD2rxFD.rexx' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'rexx/FD2rxFD.rexx'\"
else
echo shar: Extracting \"'rexx/FD2rxFD.rexx'\" \(3828 characters\)
sed "s/^X//" >'rexx/FD2rxFD.rexx' <<'END_OF_FILE'
X/* This file is Copyright(C) 1990 Francois Rouaix and the Software Winery */
X/* This file must be distributed unmodified in the RXGEN package          */
X
X
X/* Transformation of _lib.fd files into .rxfd files */
X/* SYNTAX: fdtorxfd <library name>                  */
X/* Example: fdtorxfd exec                           */
X/* You will have to configure the variables         */
X/*    fddir   : directory of FD.FILES               */
X/*    rxfddir : directory where to put .rxfd files  */
X/* This program should take care of most of the     */
X/* irregularities in the CBM FD.FILES               */
X/* Register coding is                               */
X/*  D0 D1 D2 D3 D4 D5 D6 D7 A0 A1 A2 A3 A4 A5 A6 A7 */
X/*  01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E ** ** */
X/*   A6 is reserved for library base                */
X/*   A7 is SP (!)                                   */
X
Xparse arg libname
X
Xfddir   ="work:fd.files/"
Xrxfddir ="work:rxgen/rxfd/"
X
Xsuccess = open('infd',lib2fd(libname),'Read')
Xif ~success then do
X    say "I can't file FD file for" libname "in" fddir
X    exit 1
X    end
Xsuccess = open('outrxfd',lib2rxfd(libname),'Write')
Xif ~success then do
X    say "I can't open RXFD file for" libname "in" rxfddir
X    exit 1
X    end
Xoffset = 0
Xcall writeln('outrxfd',"LIBRARIES."||libname||" = '00 00 00 00'x")
Xcall writeln('outrxfd',"LIBRARIES."||libname||".OPENCOUNT = 0")
Xdo until eof('infd')
X    line = readln('infd')
X    select
X        when left(line,1) == '*' then nop  /* skip comment */
X        when left(line,6) == '##bias' then do
X            parse var line '##bias' offset
X            offset = strip(offset) /* should be ok for multiple bias */
X            end
X        when left(line,8) == '##public'  then nop
X        when left(line,9) == '##private' then nop
X        when left(line,6) == '##base' then nop
X        when left(line,5) == '##end' then leave
X        when length(line) == 0 then nop
X        otherwise do
X            firstopenpar=index(line,"(",1)
X            fname=substr(line,1,firstopenpar - 1)
X            call Writech('outrxfd',"LIBS."||libname||"."||fname||"=")
X            call Writech('outrxfd',"'"||d2x(65536 - offset)||"'x||")
X            offset = offset + 6
X            numpars = 0
X            regcoding = "'20"
X            secondopenpar=index(line,"(",firstopenpar + 1)
X            select /* are there any parameters ? */
X                when secondopenpar = 0 then nop
X                when substr(line,secondopenpar) = "()" then nop
X                otherwise do
X                    line = substr(line,secondopenpar)
X                    do until left(line,1) = ")"
X                        parse var line with 1 sep 2 regtype 3 regnum 4 line
X                        numpars = numpars + 1
X                        select
X                            when upper(regtype) = 'A' then regnum = regnum + 9
X                            when upper(regtype) = 'D' then regnum = regnum + 1
X                            otherwise do
X                                say "Bad reg definition"
X                                exit 5
X                                end
X                            end /* of select */
X                        regcoding = regcoding||"0"||d2x(regnum)
X                        end  /* of do line */
X                    end /* of otherwise*/
X                end /* of select */
X            if numpars ~= 0 then call writech('outrxfd',copies('?',numpars)||"||")
X            call writech('outrxfd',regcoding||"'x")
X            call writech('outrxfd','0A'x)
X            say fname
X            end /* of otherwise */
X        end /* of select */
X    end /* of do eof*/
Xcall close('infd')
Xcall close('outrxfd')
Xexit 0
X
Xlib2fd: procedure expose fddir
X    arg libname
X    return fddir||libname||"_LIB.FD"
X
Xlib2rxfd: procedure expose rxfddir
X    arg libname
X    return rxfddir||libname||".rxfd"
END_OF_FILE
if test 3828 -ne `wc -c <'rexx/FD2rxFD.rexx'`; then
    echo shar: \"'rexx/FD2rxFD.rexx'\" unpacked with wrong size!
fi
chmod +x 'rexx/FD2rxFD.rexx'
# end of 'rexx/FD2rxFD.rexx'
fi
if test -f 'rexx/alert.rexx' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'rexx/alert.rexx'\"
else
echo shar: Extracting \"'rexx/alert.rexx'\" \(554 characters\)
sed "s/^X//" >'rexx/alert.rexx' <<'END_OF_FILE'
X/* AREXX program */
XLIBS.intuition = '00 00 00 00'x
XLIBS.intuition.OPENCOUNT = 0
XLIBS.intuition.DisplayAlert='FFA6'x||ISI||'20010902'x
Xif ~show('L','rxgen.library') then call addlib('rxgen.library',0,-30,0)
X
X/* have fun with user defined alert   */
X/* this should appear GREEN under 2.0 */
X
XAlert=0
XAlertString1='0065 0A'x||"Yoho here is the Guru !"||'00'x
XAlertString2='0065 14'x||"Don't you laugh at me !"||'00'x
Xcall GenOpenLib("intuition",0)
Xcall GenACall("intuition","DisplayAlert",Alert,AlertString1 AlertString2,40)
Xcall GenCloseLib("intuition")
X
END_OF_FILE
if test 554 -ne `wc -c <'rexx/alert.rexx'`; then
    echo shar: \"'rexx/alert.rexx'\" unpacked with wrong size!
fi
chmod +x 'rexx/alert.rexx'
# end of 'rexx/alert.rexx'
fi
if test -f 'rexx/db.rexx' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'rexx/db.rexx'\"
else
echo shar: Extracting \"'rexx/db.rexx'\" \(325 characters\)
sed "s/^X//" >'rexx/db.rexx' <<'END_OF_FILE'
X/* AREXX program */
XLIBS.intuition = '00 00 00 00'x
XLIBS.intuition.OPENCOUNT = 0
XLIBS.intuition.DisplayBeep='FFA0'x||I||'2009'x
X
Xif ~show('L','rxgen.library') then call addlib('rxgen.library',0,-30,0)
X
X/* no fuss here */
Xcall GenOpenLib("intuition",0)
Xcall GenACall("intuition","DisplayBeep",0)
Xcall GenCloseLib("intuition")
END_OF_FILE
if test 325 -ne `wc -c <'rexx/db.rexx'`; then
    echo shar: \"'rexx/db.rexx'\" unpacked with wrong size!
fi
chmod +x 'rexx/db.rexx'
# end of 'rexx/db.rexx'
fi
if test -f 'rexx/fd.rexx' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'rexx/fd.rexx'\"
else
echo shar: Extracting \"'rexx/fd.rexx'\" \(5018 characters\)
sed "s/^X//" >'rexx/fd.rexx' <<'END_OF_FILE'
X/* This file is Copyright(C) 1990 Francois Rouaix and the Software Winery */
X/* This file must be distributed unmodified in the RXGEN package          */
X
X/* Fd.rexx
X    Syntax : FD INFO <functionname> [<libraryname>]
X    Example: FD INFO FindPort exec
X    Result : prints the description of the function (offset, registers)
X
X    Syntax : FD OFFS <offset> [<libraryname>]
X    Example: FD OFFS FF7A exec
X    Result : prints the description of the function
X
X    Syntax : FD LIBS
X    Result : prints the available libraries (described by an FD.FILE)
X*/
X
Xparse arg comselect others
X
Xdo while (words(getclip('FDDIR')) == 0)
X    say "Please enter the directory where the FD.FILES reside:"
X    say "Exemple:      Extras 1.3:FD1.3"
X    pull fddir
X    fddir = strip(fddir)
X    call setclip('FDDIR',fddir)
Xend
Xfddir=getclip('FDDIR')
Xfdfiles=showdir(fddir,'File')
Xcomselect = upper(comselect)
Xselect
X   when comselect=='INFO' then do
X            parse var others functionname libname
X            if length(libname) == 0
X                then call map('findin  '''functionname"',", fdfiles)
X            else call findin(functionname,strip(libname)||'_LIB.FD')
X            end
X    when comselect=='OFFS' then do
X        parse var others offs libname
X        select
X            when datatype(offs) == NUM then nop
X            when datatype(offs) == CHAR then offs=x2d(offs) - 65536
X            otherwise do
X                    say "Offset: -num (-30)"
X                    say "         hex (FFA0)"
X                    exit 0
X                end
X            end
X        if length(libname) == 0
X            then call map('getfunc ' offs ",", fdfiles)
X            else call getfunc(offs,strip(libname)||'_LIB.FD')
X        end
X    when comselect=='LIBS' then do
X        fdlibs = map('fname2libname', fdfiles)
X        say "Libraries:" fdlibs
X        end
X    otherwise
X        do
X            say "Syntax  :  FD INFO <functionname> [<libraryname>]"
X            say "           FD OFFS <offset> [<libraryname>]"
X            say "           FD LIBS"
X        end
X    end
X
Xexit 0
X
X/* this should be familiar to you ol' lispers */
Xmap: procedure expose fddir
X    if (words(arg(2)) == 0)
X        then return('')
X        else
X            parse value arg(2) with _car _cdr
X            interpret 'call' arg(1) '_car'
X            leftval = result
X           return( leftval  map(arg(1), _cdr))
X
Xfname2libname: procedure
X    arg _fname
X    parse upper var _fname _libname '_LIB.FD'
X    return _libname
X
Xfindin: procedure expose fddir
X    success = open('handle',fddir||'/'||arg(2),'Read')
X    found = 0
X    offset = 0
X    privateflag = 'public '
X    if success then do until (found | eof('handle'))
X        line = readln('handle')
X        select
X            when left(line,1) == '*' then nop
X            when left(line,6) == '##bias' then  do
X                parse var line '##bias' offset
X                offset = strip(offset)
X                end
X            when left(line,8) == '##public'  then privateflag = 'public '
X            when left(line,9) == '##private' then privateflag = 'private'
X            when left(line,5) == '##end' then do close('handle') ; return('') ; end
X            when left(line,6) == '##base' then nop
X            otherwise do
X                if upper(left(line,length(arg(1)))) == upper(arg(1))
X                    then found = 1
X                    else offset = offset + 6
X
X                end
X            end
X        end
X    else do
X        say "I don't find" arg(2) "in" fddir
X        return('')
X        end
X    call close('handle')
X    if found
X        then do
X            res=left(fname2libname(arg(2)),20) privateflag left('-'offset,4) d2x(65536 - offset) line
X            say res
X            return('')
X            end
X        else return('')
X
Xgetfunc: procedure expose fddir /* offs library */
X    success = open('handle',fddir||'/'||arg(2),'Read')
X    found = 0
X    offset = 0
X    privateflag = 'public '
X    if success then do until (found | eof('handle'))
X        line = readln('handle')
X        select
X            when left(line,1) == '*' then nop
X            when left(line,6) == '##bias' then  do
X                parse var line '##bias' offset
X                offset = strip(offset)
X                end
X            when left(line,8) == '##public'  then privateflag = 'public '
X            when left(line,9) == '##private' then privateflag = 'private'
X            when left(line,5) == '##end' then do close('handle') ; return('') ; end
X            when left(line,6) == '##base' then nop
X            otherwise do
X                if (offset == -arg(1))
X                    then found = 1
X                    else offset = offset + 6
X                end
X            end
X        end
X    else do
X        say "I don't find" arg(2) "in" fddir
X        return('')
X        end
X    call close('handle')
X    if found
X        then do
X            res=left(fname2libname(arg(2)),20) privateflag left('-'offset,4) d2x(65536 - offset) line
X            say res
X            return('')
X            end
X        else return('')
END_OF_FILE
if test 5018 -ne `wc -c <'rexx/fd.rexx'`; then
    echo shar: \"'rexx/fd.rexx'\" unpacked with wrong size!
fi
chmod +x 'rexx/fd.rexx'
# end of 'rexx/fd.rexx'
fi
if test -f 'rexx/port.rexx' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'rexx/port.rexx'\"
else
echo shar: Extracting \"'rexx/port.rexx'\" \(1615 characters\)
sed "s/^X//" >'rexx/port.rexx' <<'END_OF_FILE'
X/* AREXX Program */
X/* I let you find out how to get out of this program
X   easily.
X   Answer at the end of the file (may not be really clean...)
X*/
XLIBRARIES.exec = '00 00 00 00'x
XLIBRARIES.exec.OPENCOUNT = 0
XLIBS.exec.FindPort='FE7A'x||S||'200A'x
XLIBS.exec.AddPort='FE9E'x||A||'200A'x
XLIBS.exec.RemPort='FE98'x||A||'200A'x
XLIBS.exec.PutMsg='FE92'x||AA||'20090A'x
XLIBS.exec.GetMsg='FE8C'x||A||'2009'x
XLIBS.exec.ReplyMsg='FE86'x||A||'200A'x
XLIBS.exec.WaitPort='FE80'x||A||'2009'x
XLIBS.exec.AllocMem='FF3A'x||IA||'200102'x
XLIBS.exec.FreeMem='FF2E'x||AI||'200A01'x
XLIBS.exec.Wait='FEC2'x||A||'2001'x
X
X/* Note that we are going to mix AREXX support functions
X   and rxgen functions
X*/
XPORTNAME = 'TESTPORT'
Xcall GenOpenLib("exec",0)
Xmyport = GenACall("exec","FindPort",PORTNAME)
Xif myport = NULL() then do
X    theport = OPENPORT(PORTNAME)
X    myport = GenACall("exec","FindPort",PORTNAME)
X    sigbitraw = import(OFFSET(myport,15),1)
X    sigbit = c2d(sigbitraw)
X    say "Signal Bit:" sigbit
X    if myport = NULL() then do
X                                say "Can't create port"
X                                exit 1
X                            end
X    else do 10
X            msg = GenACall("exec","Wait",bitset(NULL(),sigbit))
X            say "Wait returned"
X            do msgloop=0
X                msg = GenACall("exec","GetMsg",myport)
X                if msg = null() then leave msgloop
X                call GenACall("exec","ReplyMsg",msg)
X            end
X         end
X    end
Xcall GenCloseLib("exec")
Xcall CLOSEPORT(PORTNAME)
X
X/* did you find out ? */
X/* here you are:
X   rx "do forever; address TESTPORT; end"
X*/
END_OF_FILE
if test 1615 -ne `wc -c <'rexx/port.rexx'`; then
    echo shar: \"'rexx/port.rexx'\" unpacked with wrong size!
fi
chmod +x 'rexx/port.rexx'
# end of 'rexx/port.rexx'
fi
if test -f 'rexx/wbfront.rexx' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'rexx/wbfront.rexx'\"
else
echo shar: Extracting \"'rexx/wbfront.rexx'\" \(322 characters\)
sed "s/^X//" >'rexx/wbfront.rexx' <<'END_OF_FILE'
X/* AREXX program */
XLIBS.intuition = '00 00 00 00'x
XLIBS.intuition.OPENCOUNT = 0
XLIBS.intuition.WBenchToBack='FEB0'x||'20'x
XLIBS.intuition.WBenchToFront='FEAA'x||'20'x
X
X/* can you write a shorter program for that ? */
Xcall GenOpenLib("intuition",0)
Xcall GenACall("intuition","WBenchToFront")
Xcall GenCloseLib("intuition")
END_OF_FILE
if test 322 -ne `wc -c <'rexx/wbfront.rexx'`; then
    echo shar: \"'rexx/wbfront.rexx'\" unpacked with wrong size!
fi
chmod +x 'rexx/wbfront.rexx'
# end of 'rexx/wbfront.rexx'
fi
if test -f 'rexx/wbmaster.rexx' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'rexx/wbmaster.rexx'\"
else
echo shar: Extracting \"'rexx/wbmaster.rexx'\" \(9869 characters\)
sed "s/^X//" >'rexx/wbmaster.rexx' <<'END_OF_FILE'
X/* This file is Copyright(C) 1990 Francois Rouaix and the Software Winery */
X/* This file must be distributed unmodified in the RXGEN package          */
X
X/* An attempt at using the new features of the 2.0 Workbench library
X   Warning, look for comments /* WSHELL */ and /* CLI */ to fix the program
X   By default, the script in the distribution is configured for CLI, as
X   WShell is not yet distributed with 2.0 ;-)
X
X    WSH> WBMASTER -INIT
X    WSH> WBMASTER <MENUNAME> <RXCLAUSE>
X     ....
X    Quit with menu
X
X    CLI> rx WBMASTER -INIT
X    CLI> rx WBMASTER <MENUNAME> <RXCLAUSE>
X     ....
X    Quit with menu
X
X    The -INIT call will init a "server process", which is called -RUN.
X    -RUN will add a QUIT item in the Workbench Tools menu.
X    The other kind of call will add an item of name <MENUNAME>. When you
X    activate this item, the <RXCLAUSE> will be INTERPRETed by the
X    server process.
X
XExample:
X    rx wbmaster -INIT
X    rx wbmaster Editor address command 'new:c/az'
X    rx wbmaster Shell  address command 'newshell'
X
XWARNING: despite some efforts, there are still problems
X    1) if the rxclause (executed when activating a menu) raises
X        an error, then you're lost. Try WBMASTER -QUIT to free
X        the ressources. However, don't try -QUIT option if -RUN is alive
X    2) you can't remove a menu item individually
X       but you can patch the action of a menu item by hacking directly
X       the clip value WBACTIONi (see source)
X    3) you'll have to figure out what king of actions may be taken !
X        Easy ones: ADDRESS COMMAND 'cli-detaching-command'
X        Easy ones: ADDRESS COMMAND 'run cli-permanent-command'
X            use the quotes to avoid syntax errors...
X        Try to interpret your clause with rx "INTERPRET <clause>"
X            to check before installing as a menu action
X        Tricky ones: parameterised actions, using Arexx clipboard as globals
X        Hacks: dynamic modification of the server Arexx program ....
X    4) I've not really checked if all memory/ressources are freed
X        if everything goes wrong
X    Remember this is just a hack !
X*/
X
Xarg COM PAR
X
X/* exec library */
XLIBRARIES.exec = '00 00 00 00'x
XLIBRARIES.exec.OPENCOUNT = 0
XLIBS.exec.FindPort='FE7A'x||S||'200A'x
XLIBS.exec.AddPort='FE9E'x||A||'200A'x
XLIBS.exec.RemPort='FE98'x||A||'200A'x
XLIBS.exec.PutMsg='FE92'x||AA||'20090A'x
XLIBS.exec.GetMsg='FE8C'x||A||'2009'x
XLIBS.exec.ReplyMsg='FE86'x||A||'200A'x
XLIBS.exec.WaitPort='FE80'x||A||'2009'x
XLIBS.exec.Wait='FEC2'x||A||'2001'x
XLIBS.exec.CreateMsgPort='FD66'x||'20'x
XLIBS.exec.DeleteMsgPort='FD60'x||A||'2009'x
XLIBS.exec.AllocMem='FF3A'x||IA||'200102'x
XLIBS.exec.FreeMem='FF2E'x||AI||'200A01'x
X
X/* workbench library */
XLIBRARIES.workbench = '00 00 00 00'x
XLIBRARIES.workbench.OPENCOUNT = 0
XLIBS.workbench.AddAppMenuItem='FFB8'x||IAAA||'200102090A'x
XLIBS.workbench.RemoveAppMenuItem='FFB2'x||A||'2009'x
X
XPORTNAME='WB-AREXX'
XPORTLEN = 9
X
Xselect
X    when upper(arg(1)) = '-INIT' then do
X/* this is some kind CLI-detach hack for ARexx scripts */
X/* note the the MsgPort MUST be created by the task who is going
X    to receive the signals (that's because CreateMsgPort initializes
X    the port structure according to the caller's task)
X   Therefore we reload ourselves asynchronously (ickk) without doing anything
X*/
X        call GenOpenLib("exec",36)
X        myport = GenACall("exec","FindPort",PORTNAME)
X        if myport = NULL() then
X                /* ADDRESS command 'run rx WBMASTER -RUN' /* this gives IO */ */
X                ADDRESS AREXX 'WBMASTER -RUN'
X        else say "WBMASTER already up and running"
X        call GenCloseLib("exec")
X        end /* end of -INIT */
X
X    when upper(arg(1)) = '-RUN' then do
X        /* we shouldn't quit but by user control             */
X        /* it does not seem to make a difference, but why ?  */
X        signal off syntax
X        signal off error
X        call GenOpenLib("exec",36)
X        myport = GenACall("exec","FindPort",PORTNAME)
X        if myport = NULL() then do
X            myport = GenACall("exec","CreateMsgPort")
X            if myport = NULL() then do
X                                        say "Can't create port"
X                                        exit 1
X                                    end
X            else do
X            /* we MUST initialize the name and priority (RTFM) */
X                copystr = GenACall("exec","AllocMem",PORTLEN,'0001 0001'x)
X                call export(copystr,PORTNAME,PORTLEN)
X                call export(OFFSET(myport,10),copystr,4)
X                call export(OFFSET(myport,9),NULL(),1)
X                call GenACall("exec","AddPort",myport)
X                say "Port " PORTNAME " created"
X                sigbitraw = import(OFFSET(myport,15),1)
X                sigbit = c2d(sigbitraw)
X                say "Signal Bit:" sigbit
X                call setclip('WBINDEX',-1)
X                /* setting quit item: magic ! */
X                /* we add an item with no action, but it MUST be the first */
X                /* there is a special case for this in the server process  */
X                /* 'WBMASTER ' QUIT   /* for use with WSHELL ONLY */ */
X                address command 'rx WBMASTER QUIT'  /* for use with CLI */
X                end
X            end
X        else do
X            say "WBMASTER already up and running"
X            exit 1
X            end
X        do quitloop=0
X            msg = GenACall("exec","Wait",bitset(NULL(),sigbit))
X            do msgloop=0
X                msg = GenACall("exec","GetMsg",myport)
X                if msg = null() then leave msgloop
X                am_Type     =  c2x(IMPORT(OFFSET(msg,20),2))
X                am_UserData =  c2x(IMPORT(OFFSET(msg,22),4))
X                am_ID       =  c2d(IMPORT(OFFSET(msg,26),4))
X                am_NumArgs  =  c2d(IMPORT(OFFSET(msg,30),4))
X                call GenACall("exec","ReplyMsg",msg)
X                /* I don't know exactly where the output will go...
X                  at least if the trace console is open, output will go there
X                  in beta versions of 2.0, there used to be gurus, now with
X                  2.01, everything runs fine
X                */
X                say "Type:" am_Type  "UserData:" am_UserData "Id:" am_ID "NumArgs:" am_NumArgs
X                if am_ID = 0 then leave quitloop
X                action = getclip('WBACTION'||am_ID)
X                say "Interpreting" action
X                INTERPRET action  /* whoaaaaahhh */
X            end  /* of msgloop */
X        end /* of quit loop */
X        /* normal deallocation follows */
X        /* ADDRESS AREXX 'WBMASTER -QUIT' /* pb: ??? when -RUN was launched by addressing AREXX*/ */
X        ADDRESS COMMAND 'rx WBMASTER -QUIT'
X    end /* end of -RUN */
X
X    /* this is the cleanup: this portion of the code should be executed
X       by the -RUN process when you quit, but in case something goes wrong,
X       we need a cleanup (DON'T RUN THIS IF -RUN IS ALIVE)
X    */
X    when upper(arg(1)) = '-QUIT' then do
X        call GenOpenLib("exec",36)
X        myport = GenACall("exec","FindPort",PORTNAME)
X        if myport = NULL() then do
X                            say "WBMASTER is not running"
X                            end
X        else do /* first delete the port*/
X            call GenACall("exec","RemPort",myport)
X            do msgloop=0
X                msg = GenACall("exec","GetMsg",myport)
X                if msg = NULL() then leave msgloop
X                call GenACall("exec","ReplyMsg",msg)
X                end
X            call GenACall("exec","FreeMem",IMPORT(OFFSET(myport,10),4),PORTLEN)
X            call GenACall("exec","DeleteMsgPort",myport)
X            end
X        /* cleanup the menu */
X        call GenOpenLib("workbench",36)
X        do i=0 to getclip('WBINDEX')
X            item = getclip('WBITEM'i)
X            call GenACall("workbench","RemoveAppMenuItem",item)
X            text = getclip('WBTEXT'i)
X            textlen = getclip('WBTEXTLEN'i)
X            call GenACall("exec","FreeMem",text,textlen)
X            end
X        call setclip('WBINDEX',-1) /* Avoid multiple FreeMems if run twice*/
X        call GenCloseLib("workbench")
X        call GenCloseLib("exec")
X        end
X
X    /* general case: install the menu item */
X    otherwise do
X        call GenOpenLib("exec",36)
X        myport = GenACall("exec","FindPort",PORTNAME)
X        if myport = NULL() then do
X                                    say "Can't find " PORTNAME
X                                    call GenCloseLib("exec")
X                                    exit 1
X                                end
X        call GenOpenLib("workbench",36)
X        index = getclip('WBINDEX')
X        index = index+1
X        call setclip('WBINDEX',index)
X        COM = strip(com)
X        par = strip(par)
X        /* allocate copy of the string */
X        copystr = GenACall("exec","AllocMem",length(COM)+1,'0001 0001'x)
X        call export(copystr,COM,length(COM)+1)
X
X        item = GenACall("workbench","AddAppMenuItem",index,NULL(),copystr,myport)
X        if item = NULL() then do
X                                say "Adding item failed"
X                                exit 1
X                               end
X        call setclip('WBITEM'index,item)
X        call setclip('WBTEXT'index,copystr)
X        call setclip('WBTEXTLEN'index,length(COM)+1)
X        call setclip('WBACTION'index,PAR)
X        call GenCloseLib("workbench")
X        call GenCloseLib("exec")
X        end /* of otherwise */
Xend /* of select */
Xexit 0
X
X/* Hm, we need some offsets.
Xstruct AppMessage {
X    struct Message am_Message;  /* standard message structure */
X    UWORD am_Type;              /* message type */
X    ULONG am_UserData;          /* application specific */
X    ULONG am_ID;                /* application definable ID */
X    LONG am_NumArgs;            /* # of elements in arglist */
X    struct WBArg *am_ArgList;   /* the arguements themselves */
X};
X*/
END_OF_FILE
if test 9869 -ne `wc -c <'rexx/wbmaster.rexx'`; then
    echo shar: \"'rexx/wbmaster.rexx'\" unpacked with wrong size!
fi
chmod +x 'rexx/wbmaster.rexx'
# end of 'rexx/wbmaster.rexx'
fi
if test -f 'rxgen.doc' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'rxgen.doc'\"
else
echo shar: Extracting \"'rxgen.doc'\" \(5894 characters\)
sed "s/^X//" >'rxgen.doc' <<'END_OF_FILE'
XTABLE OF CONTENTS
X
Xrxgen.library/GenOpenLib
Xrxgen.library/GenCloseLib
Xrxgen.library/GenACall
Xrxgen.library/Function Description Format
X
X
Xrxgen.library/GenOpenLib                             rxgen.library/GenOpenLib
X
XNAME
X    GenOpenLib  -opens an exec library from Arexx
X
XSYNOPSIS
X    call GenOpenLib("library name",version)
X
XFUNCTION
X    REQUIREMENTS: the ARexx variables
X                LIBS.libname
X                LIBS.libname.OPENCOUNT
X            should be properly initialized when you open the library for
X            the first time.
X            For example, if you want to open exec.library, use the
X            following clauses:
X                LIBS.EXEC = '0000 0000'x
X                LIBS.EXEC.OPENCOUNT = 0
X    Opens the specified library, using the specified version number.
X    If the library can be opened, its base will be stored in LIBS.libname,
X    and the open count (for GenOpenLib calls in the current program only)
X    will be incremented in LIBS.libname.OPENCOUNT
X    Failure to open the library will raise an ERROR
X
XINPUTS
X    "library name" is the name of the library you want to open
X        (without .library suffix)
X    version is an integer
XRESULT
X    You're not interested in the result (it is the opencount at this time,
X    but this is subject to change).
X    See above for side effects
X
XEXAMPLE
X    LIBS.intuition = '0000 0000'x
X    LIBS.intuition.OPENCOUNT = 0
X    call GenOpenLib("intuition",0)
X
XBUGS
X    Use of version not really tested.
X    Multiple uses with different version numbers are not supported.
X
X
Xrxgen.library/GenCloseLib                           rxgen.library/GenCloseLib
X
X
XNAME
X    GenCloseLib     -close a library from Arexx
X
XSYNOPSIS
X    call GenCloseLib("libname")
X
XFUNCTION
X    REQUIREMENTS: same as GenOpenLib, it is also better if the
X                  library has been opened...
X    Closes a library that has been opened by GenOpenLib.
X    Will fail if the opencount of the library is <= 0, otherwise,
X    the library will be closed, and the opencount decremented. If the count
X    gets null, then the base of the library will be set to 0.
X
XINPUTS
X    "libname" : the name of the library you want to close (what else ?)
X
XRESULT
X    You're not interested in the result (it is the opencount at this time,
X    but this is subject to change).
X    See above for side effects
X
XEXAMPLE
X    call GenCloseLib("intuition")
X
XBUGS
X    Maybe.
X
X
Xrxgen.library/GenACall                                  rxgen.library/GenACall
XNAME
X    GenACall        - call a function from ARexx
X
XSYNOPSIS
X    something = GenACall("libname","fname",par,...)
X
XFUNCTION
X    REQUIREMENTS:
X        the library should have been opened (see GenOpenLib)
X        the function fname should be defined by
X            LIBS.libname.fname = <description>
X        the format of the description is described later.
X    GenACall will check the base of the library, convert your parameters
X    following the description, and return (hopefully) the result.
X    If the library base is 0, the function will abort (ERROR).
X    If GenACall can't find the function description, it will abort.
X
XINPUTS
X    "libname" the name of the library your function belongs to
X    "fname"   the name of the function
X    par,...   parameters for the real function call. Many types allowed,
X              check the format of the description
X
XRESULT
X    A 32 bit word, hopefully a correct one...
X
XEXAMPLE
X    pointer = GenACall("exec","FindPort",'FOO BAR')
X
XBUGS
X    Surely. None found.
X
X
Xrxgen.library/Function Description Format
X
X
XDescription of the format:
XLet's take an example to fix the ideas
XLIBS.exec.FindPort='FE7A'x||S||'200A'x
XThus, the format is a string containing:
X    - two bytes for the offset of the function in the library
X    - a variable number of characters that describe the type of
X    conversion to be applied to the parameters
X    - a SPACE (here obtained by '20'x)
X    - a coding of the registers in which the parameters will be passed.
X
XYou don't have to find all this by yourself.
XThe FD2rxFD utility provided in this distribution is able to compute a
Xpartial description from the FD.FILES (to be found on Extras disk).
XCheck the two directory variables in the program, and run
X1> rx fd2rxfd exec
XThis will generate a file containing all (partial) function definitions
Xfor the Exec library.
X
XIn this examples, the information given by the FD.FILES is
XLIBS.exec.FindPort='FE7A'x||?||'200A'x
XThe question mark (?) is to be replaced by the proper type description.
X
X    Technical digression: the problem lies in the fact that datas in ARexx are
X    not typed. They all are represented by strings, with no way to determine
X    safely and systematically if a particular data is a "real" string, or
X    an integer, or a pointer.
X
XYou will have to find by yourself (consulting the proper docs) which kind
Xof conversion is needed.
XIn this version (1.0), the supported conversion are:
X    I   the ARexx data represents an integer
X        It will be converted internally to a 32bit integer with the AREXX
X        function CVa2i().
X        Valid data examples:        Invalid data:
X            1                           'foobar'
X            324
X
X    S   the ARexx data represents a string.
X        No conversion is applied. The pointer to the string is used as
X        an argument
X        Valid data: any
X
X    A   the ARexx data represents a pointer.
X        It MUST be a 4-byte long string, containing the value of the
X        pointer (usual convention for pointers in AREXX).
X        The "raw" value of the data will be used.
X        Valid data examples:
X            '00 00 00 00'x
X            '00 00 06 76'x
X
XIn the example, the parameter is a port name, so the conversion should be S.
X
X
XRegister coding is
X  D0 D1 D2 D3 D4 D5 D6 D7 A0 A1 A2 A3 A4 A5 A6 A7
X  01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E ** **
X   A6 is reserved for library base
X   A7 is SP. Don't dare to use it.
X
END_OF_FILE
if test 5894 -ne `wc -c <'rxgen.doc'`; then
    echo shar: \"'rxgen.doc'\" unpacked with wrong size!
fi
chmod +x 'rxgen.doc'
# end of 'rxgen.doc'
fi
if test -f 'rxgen.readme' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'rxgen.readme'\"
else
echo shar: Extracting \"'rxgen.readme'\" \(4005 characters\)
sed "s/^X//" >'rxgen.readme' <<'END_OF_FILE'
X/*
X *===========================================================================
X * \__________/ Copyright (c) 1990 Francois Rouaix and The Software Winery.
X *  \o   o   /  All Rights Reserved. This program may not be distributed
X *   \ o   o/   without the permission of the author:
X *    \  o /         Francois Rouaix
X *     \ o/          7 rue de la Ferme
X *      ||           78150 Le Chesnay   FRANCE
X *      ||      Contact The Software Winery at:
X *      ||           BBS     : +33 (1) 39 55 84 59  (V23 Videotex)
X *      ||           MAIL    : c/o Alain DIDIERJEAN 69 rue Dunois
X *      ||                     75646 Paris cedex 13 FRANCE
X *    <====>         INTERNET: rouaix@inria.inria.fr
X *===========================================================================
X */
X
X
X                    RXGEN README
X                    Version 1.0 (First released version)
X
XOverview:
X    RXGEN is an ARexx library designed for the hacker.
X    This library allows you to call any function of (almost) any amiga
X    library from a Arexx program.
X    I would say it is essentially useful under 2.0 to test some of
X    the new "high-level" features of the system. It also works under 1.3.
X    You can use the library to write small programs, when you don't want
X    to use your C-compiler ! Eventually, your program will get bigger and
X    bigger, and you'll find out that either you don't need your C-compiler,
X    or that Arexx is slow (heheh).
X
X
XDistribution:
X    The rxgen distribution consists in the following files
X        libs/rxgen.library      the library itself
X        rxgen.readme            (this file)
X        rxgen.doc               autodoc file
X        rexx/FD2rxFD.rexx       filter from FD.FILES to specific format
X
X        rexx/db.rexx            DisplayBeep example
X        rexx/wbfront.rexx       WBenchToFront example
X        rexx/alert.rexx         DisplayAlert example
X        rexx/port.rexx          MsgPort example
X
X        rexx/fd.rexx            Scanner for FD.FILES
X        rexx/wbmaster.rexx      AppMenuItems under 2.0
X
X    All the files of the distribution are Copyright (C) 1990 Francois Rouaix
X    and The Software Winery.
X    RXGEN is NOT Public Domain, but can be distributed freely, provided
X    all files are included, unmodified. Inclusion in a commercial product
X    requires previous written permission from the author.
X
XInstallation:
X    You will have to
X       -copy rxgen.library to your libs: directory (or any :libs directory
X        under 2.0)
X       -install the script FD2rxFD.rexx in your rexx: directory
X       -install rxgen.library in the list of arexx libraries with either
X        1> rxlib rxgen.library 0 -30 0
X        or the usual ARexx clause:
X        if ~show('L','rxgen.library') then call addlib('rxgen.library',0,-30,0)
X
XFunctionalities:
X    rxgen provides you with 3 functions,
X        GenOpenLib          generic open library
X        GenCloseLib         generic close library
X        GenACall            generic assembly call
X
X    GenACall will need a definition of the function it will call.
X    Fortunately, part of this definition can be obtained automatically
X    from the FD.FILES (found on the Extras disk), through the
X    ARexx program FD2rxFD. More details in the autodocs.
X
XIn the distribution, you will find an autodoc file for these three functions.
XYou're invited to check with the examples (the examples have to run, the doc
Xdoesn't). Examples are usually documented when needed (!).
X
XSpecial offer:
X   -INCLUDED in the distribution is an example (wbmaster.rexx) using a
X    new 2.0 feature of the Workbench: AppMenuItems
X    Read the comments. Use with care.
X
X   -INCLUDED in the distribution is an utility (fd.rexx) for scanning
X   the FD.FILES when looking for
X                    * either function OFFSET when function name is known
X                    * or function name when OFFSET is known
X
XBug reports, comments, suggestions: see my mail/e-mail address in the header
X
X                                    Francois Rouaix
X
END_OF_FILE
if test 4005 -ne `wc -c <'rxgen.readme'`; then
    echo shar: \"'rxgen.readme'\" unpacked with wrong size!
fi
chmod +x 'rxgen.readme'
# end of 'rxgen.readme'
fi
echo shar: End of archive 1 \(of 1\).
cp /dev/null ark1isdone
MISSING=""
for I in 1 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have the archive.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0
-- 
Mail submissions (sources or binaries) to <amiga@uunet.uu.net>.
Mail comments to the moderator at <amiga-request@uunet.uu.net>.
Post requests for sources, and general discussion to comp.sys.amiga.misc.