amiga-request@abcfd20.larc.nasa.gov (Amiga Sources/Binaries Moderator) (10/09/90)
Submitted-by: W. Jaffe <aips@rulcvx.uucp> Posting-number: Volume 90, Issue 266 Archive-name: util/tinytools/part01 [ uuencoded executables enclosed ...tad ] This archive contains a collection of shell enhancing tools (I've called them TinyTools) including assembly source. Here's a list; CheckList - Check for the presence of an item in a system list. Clip - Pipe through clipped lines. FilTex - Filter out non-text bytes. NoReq - Disable system requesters (toggle). PForm - Pipe through formatted lines. Tee - Split pipe stream. WBTF - WorkBench to front. #!/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: CheckList CheckList/CheckList.asm CheckList/CheckList.man # CheckList/CheckList.uu Clip Clip/Clip.asm Clip/Clip.man # Clip/Clip.uu ExecMe FilTex FilTex/FilTex.asm FilTex/FilTex.man # FilTex/FilTex.uu Include Include/init.i NoReq NoReq/NoReq.asm # NoReq/NoReq.man NoReq/NoReq.uu PForm PForm/PForm.asm # PForm/PForm.man PForm/PForm.uu ReadMe Tee Tee/Tee.asm Tee/Tee.man # Tee/Tee.uu WBTF WBTF/WBTF.asm WBTF/WBTF.man WBTF/WBTF.uu # Wrapped by tadguy@abcfd20 on Mon Oct 8 17:45:11 1990 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test ! -d 'CheckList' ; then echo shar: Creating directory \"'CheckList'\" mkdir 'CheckList' fi if test -f 'CheckList/CheckList.asm' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'CheckList/CheckList.asm'\" else echo shar: Extracting \"'CheckList/CheckList.asm'\" \(1657 characters\) sed "s/^X//" >'CheckList/CheckList.asm' <<'END_OF_FILE' X; Clip input lines on specified locations and write result to standard output. X X INCLUDE "/include/init.i" X X; OPT D+ X X; Variable storage X X STRUCT ArgArray,(3+1)*4 X SIZE X X; Regs X XErrorStrPtr EQUR A4 X X; Startup X X STACK 4000 X INIT X X; Let ARP interpret the commandline X X MOVE.L ComLineBase(GP),A0 X MOVE.L ComLineSize(GP),D0 X LEA HelpMsg(PC),A1 X LEA ArgArray(GP),A2 X LEA Template(PC),A3 X MOVE.L A1,(A2) X CALL GADS X MOVE.L (A2),ErrorStrPtr X TST.L D0 X BEQ ErrorExit X BMI ErrorExit X X; Fail if no list specifier present X X LEA NoListSpec(PC),ErrorStrPtr X TST.L ArgArray+1*4(GP) X BNE.S ListSpecified X TST.L ArgArray+2*4(GP) X BEQ.S ErrorExit XListSpecified: X X; Cache A6, load execbase, forbid and presume success. X X MOVE.L A6,-(SP) X MOVE.L $4.W,A6 X CALL Forbid X MOVE.W #5,ReturnCode(GP) X X; Search the task list X X TST.L ArgArray+1*4(GP) X BEQ.S NotTheTaskList X MOVE.L ArgArray(GP),A1 X CALL FindTask X TST.L D0 X BNE.S NameFound XNotTheTaskList: X X; Search the port list X X TST.L ArgArray+2*4(GP) X BEQ.S NotThePortList X MOVE.L ArgArray(GP),A1 X CALL FindPort X TST.L D0 X BNE.S NameFound XNotThePortList X X; Clear returncode if name not in any list. Permit and pop ARP base. X X CLR.W ReturnCode(GP) XNameFound: X CALL Permit X MOVE.L (SP)+,A6 X X; Done, cleanup X XExit: X SUB.L ErrorStrPtr,ErrorStrPtr XErrorExit: X X; Display error string, if any, and exit X X MOVE.L ErrorStrPtr,D0 X BEQ.S NoErrorMsg X MOVE.L D0,A1 X CALL Puts XNoErrorMsg: X RTS X X; The string section X XTemplate: X DC.B 'Name/a,Task/s,Port/s',0 XHelpMsg: X DC.B 'CheckList - Check system list for name. RC=5 if found.',10 X DC.B 'Usage: CheckList "namestring" [Task] [Port]',0 XNoListSpec: X DC.B 'Need list specifier!',0 X CNOP 0,2 X X END END_OF_FILE if test 1657 -ne `wc -c <'CheckList/CheckList.asm'`; then echo shar: \"'CheckList/CheckList.asm'\" unpacked with wrong size! fi # end of 'CheckList/CheckList.asm' fi if test -f 'CheckList/CheckList.man' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'CheckList/CheckList.man'\" else echo shar: Extracting \"'CheckList/CheckList.man'\" \(627 characters\) sed "s/^X//" >'CheckList/CheckList.man' <<'END_OF_FILE' X XNAME X CheckList - Check system list for name. X X XSYNOPSIS X CheckList "namestring" [Task] [Port] X X XREQUIREMENTS X The ARP library X X XDESCRIPTION X This command checks the task list or the port list for a task or X port with the name you specified. The search is case dependent. X CheckList returns return code 5 if the name matches a list item. X If the name doesn't check out, the return code will be zero. X X XEXAMPLE X This batch loads a program FOO, that uses a message port named X "FOO_port", when FOO hasn't been run already. X X CheckList FOO_port Port X If WARN ; WARN = 5 X Echo "FOO already loaded!" X Else X Run FOO X EndIf END_OF_FILE if test 627 -ne `wc -c <'CheckList/CheckList.man'`; then echo shar: \"'CheckList/CheckList.man'\" unpacked with wrong size! fi # end of 'CheckList/CheckList.man' fi if test -f 'CheckList/CheckList.uu' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'CheckList/CheckList.uu'\" else echo shar: Extracting \"'CheckList/CheckList.uu'\" \(701 characters\) sed "s/^X//" >'CheckList/CheckList.uu' <<'END_OF_FILE' Xbegin 644 CheckList XM```#\P`````````!``````````````!M```#Z0```&U@"DK\```/H`````!.J XM5?_F(D]"6;O)9OH[?`!D__8K2/_\*T#_^"QX``1#^@!7<"=.KOW82H!F7D/ZY XM`#1.KOW82H!G("Q`3J[_Q"(`9PQ!^@`J)`AV&TZN_]`B3BQX``1.KOYB,"W_3 XM]DB`3EU.=61O<RYL:6)R87)Y`'EO=2!N965D(&%R<"YL:6)R87)Y`"!6,SDK! XM"@`L0#M\`!3_]F$"8+@@;?_\("W_^$/Z`(U%[?_F1_H`<"2)3J[_!"A22H!GF XM``!6:P``4DGZ`-)*K?_J9@9*K?_N9T`O#BQX``1.KO]\.WP`!?_V2JW_ZF<,? XM(FW_YDZN_MI*@&862JW_[F<,(FW_YDZN_GI*@&8$0FW_]DZN_W8L7YG,(`QG9 XM!B)`3J[_$$YU3F%M92]A+%1A<VLO<RQ0;W)T+W,`0VAE8VM,:7-T("T@0VAE2 XM8VL@<WES=&5M(&QI<W0@9F]R(&YA;64N(%)#/34@:68@9F]U;F0N"E5S86=E$ XM.B!#:&5C:TQI<W0@(FYA;65S=')I;F<B(%M487-K72!;4&]R=%T`3F5E9"!L@ X6:7-T('-P96-I9FEE<B$````````#\F<B) X`` Xend Xsize 472 END_OF_FILE if test 701 -ne `wc -c <'CheckList/CheckList.uu'`; then echo shar: \"'CheckList/CheckList.uu'\" unpacked with wrong size! fi # end of 'CheckList/CheckList.uu' fi if test ! -d 'Clip' ; then echo shar: Creating directory \"'Clip'\" mkdir 'Clip' fi if test -f 'Clip/Clip.asm' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Clip/Clip.asm'\" else echo shar: Extracting \"'Clip/Clip.asm'\" \(6115 characters\) sed "s/^X//" >'Clip/Clip.asm' <<'END_OF_FILE' X; Clip input lines on specified locations and write result to standard output. X X INCLUDE "/include/init.i" X X; OPT D+ X X; Local Equs X XMaxLineSize EQU 512 X X; Variable storage X X STRUCT ArgArray,(4+1)*4 X LONG StdIn X LONG StdOut X LONG ByteFetch X LONG ReadBytesLeft X LONG Count1 X LONG Count2 X LONG Delta1 X LONG Delta2 X LONG ID1StrPtr X LONG ID2StrPtr X LONG ID1Exclusive X LONG ID2Exclusive X SIZE X X; Regs X X XDelta EQUR D4 XCount EQUR D5 XLineBufPtr EQUR D6 XLineBufLeft EQUR D7 XLineEndPtr EQUR A2 XIDStrPtr EQUR A3 XErrorStrPtr EQUR A4 X X; Startup X X STACK 4000 X INIT X X; Let ARP interpret the commandline X X MOVE.L ComLineBase(GP),A0 X MOVE.L ComLineSize(GP),D0 X LEA HelpMsg(PC),A1 X LEA ArgArray(GP),A2 X LEA Template(PC),A3 X MOVE.L A1,(A2) X CALL GADS X MOVE.L (A2),ErrorStrPtr X TST.L D0 X BEQ ErrorExit X BMI ErrorExit X X; Interpret the count values X X MOVE.L ArgArray+0*4(GP),A0 X BSR GetSignedNum X BEQ ErrorExit X MOVE.L D0,Count1(GP) X MOVE.L D1,Delta1(GP) X X MOVE.L ArgArray+2*4(GP),A0 X BSR GetSignedNum X BEQ ErrorExit X MOVE.L D0,Count2(GP) X MOVE.L D1,Delta2(GP) X X; Interpret the ID strings X X LEA EmptyString(PC),A1 X X MOVE.L ArgArray+1*4(GP),D0 X BNE.S ID1StringSpecified X MOVE.L A1,D0 XID1StringSpecified: X MOVE.L D0,A0 X X CMP.B #'x',(A0) X BNE.S NoID1Exclusion X ADDQ.L #1,A0 X ADDQ.L #1,ID1Exclusive(GP) XNoID1Exclusion: X MOVE.L A0,ID1StrPtr(GP) X X MOVE.L ArgArray+3*4(GP),D0 X BNE.S ID2StringSpecified X MOVE.L A1,D0 XID2StringSpecified: X MOVE.L D0,A0 X X CMP.B #'x',(A0) X BNE.S NoID2Exclusion X ADDQ.L #1,A0 X ADDQ.L #1,ID2Exclusive(GP) XNoID2Exclusion: X MOVE.L A0,ID2StrPtr(GP) X X; Open the standard input & output X X CALL Input X MOVE.L D0,StdIn(GP) X CALL Output X MOVE.L D0,StdOut(GP) X X; Allocate the read-line buffer X X LEA OutOfMem(PC),ErrorStrPtr X MOVE.L #MaxLineSize+4+MaxLineSize,D0 ; 2 part buf with 0 term space. X MOVEQ #0,D1 X CALL ArpAllocMem X MOVE.L D0,LineBufPtr X BEQ ErrorExit X X X; ** This is an intelligent ReadLine routine. X X; Reinitialize the line buffer. (First part of dual buffer space) X XDoForEachLine: X LEA ReadError(PC),ErrorStrPtr X MOVE.L LineBufPtr,LineEndPtr X MOVE.L #MaxLineSize,LineBufLeft X X; Extract lines from the readbuffer into the line buffer. X X BRA.S ExtractEntry XCopyLineBytes: X MOVE.L ByteFetch(GP),A0 X ADDQ.L #1,ByteFetch(GP) X SUBQ.L #1,ReadBytesLeft(GP) X MOVE.B (A0),D0 X CMP.B #10,D0 X BEQ.S GotLine X MOVE.B D0,(LineEndPtr)+ X SUBQ.L #1,LineBufLeft X BEQ.S GotLine XExtractEntry: X TST.L ReadBytesLeft(GP) ; Stack vars 0 init X BNE CopyLineBytes X X; Refill the read buffer. X X MOVE.L StdIn(GP),D1 X MOVE.L LineBufPtr,D2 X MOVE.L #MaxLineSize,D3 X ADD.L D3,D2 X ADDQ.L #4,D2 X CALL Read X TST.L D0 X BMI ErrorExit X BNE.S NotYetDone X CMP.L LineBufPtr,LineEndPtr X BEQ.S Exit XNotYetDone: X MOVE.L D2,ByteFetch(GP) X MOVE.L D0,ReadBytesLeft(GP) X BNE CopyLineBytes X X; Adjust end of line pointer and weed out empty lines X XGotLine: X SUBQ.L #1,LineEndPtr X CMP.L LineBufPtr,LineEndPtr X BLO DoForEachLine X X; Find the initial clip postition X X MOVE.L LineBufPtr,A0 X MOVE.L Delta1(GP),Delta X BPL.S InitialPosSet X MOVE.L LineEndPtr,A0 XInitialPosSet: X MOVE.L Count1(GP),Count X MOVE.L ID1StrPtr(GP),IDStrPtr X BSR.S FindClipPosition X BNE DoForEachLine X MOVE.L A0,D3 X X; Find the secondary clip postition. X X MOVE.L Delta2(GP),Delta X MOVE.L Count2(GP),Count X MOVE.L ID2StrPtr(GP),IDStrPtr X BSR.S FindClipPosition X BNE DoForEachLine X X; Adjust for direction, adjust for exclusion and compute the length. X X MOVE.L ID1Exclusive(GP),D0 X MOVE.L ID2Exclusive(GP),D1 X CMP.L A0,D3 X BHI.S InvertedDirection X EXG D0,D1 X EXG A0,D3 XInvertedDirection: X ADD.L D1,A0 X SUB.L D0,D3 X SUB.L A0,D3 X BMI DoForEachLine X ADDQ.L #2,D3 X X; Terminate with a LF and write the line clip. X X LEA WriteError(PC),ErrorStrPtr X MOVE.B #10,-1(A0,D3.L) X MOVE.L StdOut(GP),D1 X MOVE.L A0,D2 X CALL Write X CMP.L D0,D3 X BNE.S ErrorExit XWriteDone: X X; Check if user hit ^C X XSkipWrite: X SUB.L A1,A1 X CALL CheckAbort X MOVE.L A1,ErrorStrPtr X TST.L D0 X BNE.S ErrorExit X BRA DoForEachLine X X; Done, cleanup X XExit: X CLR.W ReturnCode(GP) X SUB.L ErrorStrPtr,ErrorStrPtr XErrorExit: X X; Display error string, if any, and exit X X MOVE.L ErrorStrPtr,D0 X BEQ.S NoErrorMsg X MOVE.L D0,A1 X CALL Puts XNoErrorMsg: X RTS X X; Subroutines X X; This subroutine tried to find the CNTth position in the current line (relative X; to the initial position) which matches the ID string. X; I : A0 = Initial search position X; O : A0 = Clip position X; : Z=1 if search succeeded. X; : LineBufPtr,LineEndPtr,Delta,Count,IDStrPtr should be initialized X XFindClipPosition: X X; Set the boundary to check with in D0 (Given position movement direction) X X MOVE.L LineBufPtr,D0 X TST.L Delta X BMI.S FetchedRelevantBoundary X MOVE.L LineEndPtr,D0 XFetchedRelevantBoundary: X X; Check if all matches found or boundary reached. If not move current position. X X TST.L Count XCheckNextByte: X BEQ.S GotClipPosition XNoByteMatch: X CMP.L D0,A0 X BEQ.S AtLineBoundary X ADD.L Delta,A0 X X; Check byte on the current position matched the ID string. X X TST.B (IDStrPtr) X BEQ.S ByteMatched X MOVE.L IDStrPtr,A1 X MOVE.B (A0),D1 XTryToMatchNextByte: X CMP.B (A1)+,D1 X BEQ.S ByteMatched X TST.B (A1) X BEQ NoByteMatch X BRA TryToMatchNextByte XByteMatched: X SUBQ.L #1,Count X BRA CheckNextByte X X; Done. Take care of the Z-flag. X XAtLineBoundary: X TST.B (IDStrPtr) XGotClipPosition: X RTS X X; This sub decodes an ASCII buffer containing a signed number to a positive X; number and a sign boolean. It also sets ErrorStrPtr to "Invalid count" X; I : A0 = Ptr ASCII buffer X; O : D0.L = Integer >= 0 X; : D1.L = +1 if positive, -1 if negative X; : Z = 1 if error X XGetSignedNum: X LEA InvalidCnt(PC),ErrorStrPtr X MOVEQ #-1,D1 X CMP.B #'-',(A0)+ X BEQ.S ConvertToLong X MOVEQ #+1,D1 X CMP.B #'+',-(A0) X BNE.S ConvertToLong X ADDQ.L #1,A0 XConvertToLong: X MOVE.L D1,-(SP) X CALL Atol X MOVEM.L (SP)+,D1 X RTS X X; The string section X XTemplate: X DC.B 'CNT1/a,ID1/k,CNT2/a,ID2/k',0 XHelpMsg: X DC.B 'Clip - Pipe through clipped lines.',10 X DC.B 'Usage: Clip <Cnt1> [ID1 [x]"charlist"] <RelCnt2> [ID2 [x]"charlist"]',0 XOutOfMem: X DC.B 'Out of memory!',0 XInvalidCnt: X DC.B 'Invalid count',0 XReadError: X DC.B 'Error while reading',0 XWriteError: X DC.B 'Error while writing',0 XEmptyString: X DC.B 0 X CNOP 0,2 X X END END_OF_FILE if test 6115 -ne `wc -c <'Clip/Clip.asm'`; then echo shar: \"'Clip/Clip.asm'\" unpacked with wrong size! fi # end of 'Clip/Clip.asm' fi if test -f 'Clip/Clip.man' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Clip/Clip.man'\" else echo shar: Extracting \"'Clip/Clip.man'\" \(1706 characters\) sed "s/^X//" >'Clip/Clip.man' <<'END_OF_FILE' X XNAME X Clip - Pipe through clipped lines. X X XSYNOPSIS X Clip <Cnt1> [ID1 [x]"charlist"] <Cnt2> [ID2 [x]"charlist"] X X XREQUIREMENTS X The ARP library X X XDESCRIPTION X Clip is a flexible tool for clipping pieces out of input lines. X Two clip positions may be specified, and, for every input line, X the text between the clip positions is written to the standard X output. X The first clip position is relative to the leftmost byte for X positive count values, and relative to the rightmost byte for X negative ones. The CNTth byte matching any of the bytes in the X ID's character list is the clip position. X If the ID string is headed by an "x", the character at the X clip position will be excluded from the clip. If no bytes are X specified in the character list, clip will match any byte. Clip X will default to this if you omit the ID parameter. X If a clip position couldn't be matched, no clip will be written. X If, however, no ID is specified, the clip position will be at the X last byte matched. For large CNT values this will probably be the X first or last byte of the input line. X Empty lines are ignored. X XEXAMPLES X Clip <TextFile 0 79 X Type only the first 80 columns of a textfile to the console. X This prevents line wraps. X X Assume input lines with paths+filenames; Clip -1 ID1 "x:/" +400 X will pass through only the filenames, and Clip -1 ID1 ":/" -400 X will pass through the paths. X X Assign | Search STDIN volumename: NONUM | Clip 0 +1 ID2 "x " | X PForm "Assign %s:" | Execute X This line will clear a set of logical device names specific to a X volume. X X XBUGS/LIMITATIONS X The counts start from 0. This is counter-intuitive. Think of them X as offsets, the first from the edges, the second from the first. END_OF_FILE if test 1706 -ne `wc -c <'Clip/Clip.man'`; then echo shar: \"'Clip/Clip.man'\" unpacked with wrong size! fi # end of 'Clip/Clip.man' fi if test -f 'Clip/Clip.uu' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Clip/Clip.uu'\" else echo shar: Extracting \"'Clip/Clip.uu'\" \(1255 characters\) sed "s/^X//" >'Clip/Clip.uu' <<'END_OF_FILE' Xbegin 644 Clip XM```#\P`````````!``````````````#1```#Z0```-%@"DK\```/H`````!.R XM5?^R(D]"6;O)9OH[?`!D__8K2/_\*T#_^"QX``1#^@!7<"=.KOW82H!F7D/Z% XM`#1.KOW82H!G("Q`3J[_Q"(`9PQ!^@`J)`AV&TZN_]`B3BQX``1.KOYB,"W_3 XM]DB`3EU.=61O<RYL:6)R87)Y`'EO=2!N965D(&%R<"YL:6)R87)Y`"!6,SDK! XM"@`L0#M\`!3_]F$"8+@@;?_\("W_^$/Z`>A%[?_B1_H!QB2)3J[_!"A22H!G5 XM``%>:P`!6B!M_^)A``&*9P`!3BM`_\XK0?_&(&W_ZF$``79G``$Z*T#_RBM!N XM_\)#^@)/("W_YF8"(`D@0`P0`'AF!E*(4JW_MBM(_[X@+?_N9@(@"2!`#!``W XM>&8&4HA2K?^R*TC_NDZN_\HK0/_>3J[_Q"M`_]I)^@'"(#P```0$<@!.KOYZZ XM+`!G``#42?H!R21&+CP```(`8!H@;?_64JW_UE.M_](0$+`\``IG-A3`4X=G3 XM,$JM_])FX"(M_]XD!B8\```"`-2#6().KO_62H!K``",9@2UQF=^*T+_UBM`R XM_])FME.*M<9EHB!&*"W_QFH"($HJ+?_.)FW_OF%L9HPF""@M_\(J+?_*)FW_+ XMNF%:9@#_>B`M_[8B+?^RMHAB!,%!QXC1P9:`EHAK`/]@5(-)^@$Y$;P`"CC_] XM(BW_VB0(3J[_T+:`9A:3R4ZN_O(H24J`9@I@`/\V0FW_]IG,(`QG!B)`3J[_8 XM$$YU(`9*A&L"(`I*A6<>L<!G&-'$2A-G#B)+$A"R&6<&2A%GZF#V4X5@XDH3) XM3G5)^@"Q<O\,&``M9PIR`0P@`"MF`E*(+P%.KO[^3-\``DYU0TY4,2]A+$E$M XM,2]K+$-.5#(O82Q)1#(O:P!#;&EP("T@4&EP92!T:')O=6=H(&-L:7!P960@H XM;&EN97,N"E5S86=E.B!#;&EP(#Q#;G0Q/B!;240Q(%MX72)C:&%R;&ES=")=> XM(#Q296Q#;G0R/B!;240R(%MX72)C:&%R;&ES=")=`$]U="!O9B!M96UO<GDA@ XM`$EN=F%L:60@8V]U;G0`17)R;W(@=VAI;&4@<F5A9&EN9P!%<G)O<B!W:&ELK X192!W<FET:6YG`````````_)RP X`` Xend Xsize 872 END_OF_FILE if test 1255 -ne `wc -c <'Clip/Clip.uu'`; then echo shar: \"'Clip/Clip.uu'\" unpacked with wrong size! fi # end of 'Clip/Clip.uu' fi if test -f 'ExecMe' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'ExecMe'\" else echo shar: Extracting \"'ExecMe'\" \(163 characters\) sed "s/^X//" >'ExecMe' <<'END_OF_FILE' XProtect CheckList/CheckList +p XProtect Clip/Clip +p XProtect FilTex/FilTex +p XProtect NoReq/NoReq +p XProtect PForm/PForm +p XProtect Tee/Tee +p XProtect WBTF/WBTF +p END_OF_FILE if test 163 -ne `wc -c <'ExecMe'`; then echo shar: \"'ExecMe'\" unpacked with wrong size! fi # end of 'ExecMe' fi if test ! -d 'FilTex' ; then echo shar: Creating directory \"'FilTex'\" mkdir 'FilTex' fi if test -f 'FilTex/FilTex.asm' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'FilTex/FilTex.asm'\" else echo shar: Extracting \"'FilTex/FilTex.asm'\" \(5882 characters\) sed "s/^X//" >'FilTex/FilTex.asm' <<'END_OF_FILE' X; Filter non-text bytes from pipe stream. X X INCLUDE "/include/init.i" X X; Local Equs X; FilTex uses a buffer split into two 1000 byte parts, the first for writing, X; the last part for reading. Reads/Writes are HalfBufSize bytes large max. X XDefaultThreshold EQU 4 XBufSize EQU 2000 ; Keep this one < 32K XHalfBufSize EQU BufSize/2 X X; Variable storage X X STRUCT ArgArray,(4+1)*4 X LONG InputHandle X LONG StdOutput X WORD Threshold X SIZE X X; Regs X XWriteBufIndex EQUR D4 XReadBufIndex EQUR D5 XReadBytesLeft EQUR D6 XLatestByte EQUR D7 XBufferPtr EQUR A2 XFilterTablePtr EQUR A3 XErrorStrPtr EQUR A4 X X; Start X X STACK 4000 X INIT X X; Let ARP interpret the commandline X X MOVE.L ComLineBase(GP),A0 X MOVE.L ComLineSize(GP),D0 X LEA HelpMsg(PC),A1 X LEA ArgArray(GP),A2 X LEA Template(PC),A3 X MOVE.L A1,(A2) X CALL GADS X MOVE.L (A2),ErrorStrPtr X TST.L D0 X BEQ ErrorExit X BMI ErrorExit X X; Fetch & check the threshold value. X X LEA BadThreshold(PC),ErrorStrPtr X MOVE.W #DefaultThreshold,Threshold(GP) X MOVE.L ArgArray+4(GP),A0 X MOVE.L A0,D0 X BEQ.S UseDefault X CALL Atol X BEQ ErrorExit X CMP.L #HalfBufSize,D0 X BHI ErrorExit X MOVE.W D0,Threshold(GP) X BEQ ErrorExit XUseDefault: X X; Check if the source is STDIN, if so open that. X X MOVE.L ArgArray(GP),A0 X LEA StdinID(PC),A1 X CALL Strcmp X BNE.S NoStdin X CALL Input X MOVE.L D0,InputHandle(GP) X BRA.S InFileOpened XNoStdin: X X; Else open a normal source file (Tracked) X X LEA SourceOpenError(PC),ErrorStrPtr X MOVE.L ArgArray(GP),D1 X MOVE.L #MODE_OLDFILE,D2 X CALL ArpOpen X MOVE.L D0,InputHandle(GP) X BEQ ErrorExit XInFileOpened: X X; Fetch the StdOutput X X CALL Output X MOVE.L D0,StdOutput(GP) X X; Alloc tracked mem for the read/write buffer. X X LEA OutOfMem(PC),ErrorStrPtr X MOVE.L #BufSize+1,D0 ; add 1 to allow for LF termination X MOVEQ #0,D1 X CALL ArpAllocMem X TST.L D0 X BEQ ErrorExit X MOVE.L D0,BufferPtr X X; Initialize for the filtered copy loop X X LEA FilterTableBase(PC),FilterTablePtr X MOVEQ #0,WriteBufIndex X X; Read next chunk of bytes. X XDoNextRead: X LEA ReadError(PC),ErrorStrPtr X MOVEQ #0,ReadBufIndex X MOVE.W #HalfBufSize,ReadBufIndex X MOVE.L InputHandle(GP),D1 X MOVE.L BufferPtr,D2 X ADD.L ReadBufIndex,D2 X MOVE.L ReadBufIndex,D3 X CALL Read X MOVE.W D0,ReadBytesLeft X BMI ErrorExit X BEQ.S TryToWriteWriteBuffer X X; Find text bytes. X XCheckForTextBytes: X MOVEQ #0,LatestByte X MOVE.B 0(BufferPtr,ReadBufIndex.W),LatestByte X ADDQ.W #1,ReadBufIndex X SUBQ.W #1,ReadBytesLeft X TST.B 0(FilterTablePtr,LatestByte.W) X BEQ.S TryToWriteWriteBuffer X X; Process text bytes X X MOVE.B LatestByte,0(BufferPtr,WriteBufIndex.W) X ADDQ.W #1,WriteBufIndex X CMP.W #HalfBufSize,WriteBufIndex X BNE.S CheckReadBufStatus X X; Check if the number of bytes to write equals or exceeds the threshold X XTryToWriteWriteBuffer: X CMP.W Threshold(GP),WriteBufIndex X BLO.S NeLeWritezPas X X; Check if string is null-terminated (if requested to do so) X X TST.L ArgArray+12(GP) ; Check NULT switch X BEQ.S NoNullCheck X TST.B LatestByte X BNE.S NeLeWritezPas XNoNullCheck: X X; Terminate write with a linefeed if needed & not prohibited X X CMP.B #10,-1(BufferPtr,WriteBufIndex.W) X BEQ.S DoTheWrite X TST.L ArgArray+8(GP) ; Check NOLF switch X BNE.S DoTheWrite X MOVE.B #10,0(BufferPtr,WriteBufIndex.W) X ADDQ.W #1,WriteBufIndex X X; The actual write to the StdOutput X XDoTheWrite: X LEA WriteError(PC),ErrorStrPtr X MOVE.L StdOutput(GP),D1 X MOVE.L BufferPtr,D2 X MOVE.W WriteBufIndex,D3 X EXT.L D3 X CALL Write X CMP.L D0,D3 X BNE.S ErrorExit X X; Check if user hit ^C X X SUB.L A1,A1 X CALL CheckAbort X MOVE.L A1,ErrorStrPtr X TST.L D0 X BNE.S ErrorExit XNeLeWritezPas: X X; Reset the write buffer index. X X MOVEQ #0,WriteBufIndex X X; Check if no more read bytes left, if so read, exit if last read had zero length X; (An adjective, verb and a noun. YOU try 'n make a natural language interpreter!) X XCheckReadBufStatus: X TST.W ReadBytesLeft X BNE CheckForTextBytes X CMP.W #HalfBufSize,ReadBufIndex X BNE DoNextRead X X; Done, cleanup X XExit: X CLR.W ReturnCode(GP) X SUB.L ErrorStrPtr,ErrorStrPtr XErrorExit: X X; Display error string, if any, and exit X X MOVE.L ErrorStrPtr,D0 X BEQ.S NoErrorMsg X MOVE.L D0,A1 X CALL Puts XNoErrorMsg: X RTS X X; The string section X XTemplate: X DC.B 'File/a,THRESH/k,NOLF/s,NULT/s',0 XHelpMsg: X DC.B 'FilTex - filter out non-text.',10 X DC.B 'Usage: FilTex <File | STDIN> [THRESH #] [NOLF] [NULT]',0 XStdinID: X DC.B 'STDIN',0 XBadThreshold: X DC.B 'Illegal threshold value',0 XSourceOpenError: X DC.B 'Could not open source file',0 XOutOfMem: X DC.B 'Out of memory!',0 XReadError: X DC.B 'Error while reading',0 XWriteError: X DC.B 'Error while writing',0 X CNOP 0,4 X X; This is the filtering array X X DC.B 'TextTab:' XFilterTableBase: X; 0 1 2 3 4 5 6 7 8 9 A B C D E F X DC.B 000,000,000,000,000,000,000,000,000,$09,$0A,000,000,000,000,000 ;0 X DC.B 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 ;1 X DC.B ' ','!','"','#','$','%','&',$27,'(',')','*','+',',','-','.','/' ;2 X DC.B '0','1','2','3','4','5','6','7','8','9',':',';','<','=','>','?' ;3 X DC.B 000,'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O' ;4 X DC.B 'P','Q','R','S','T','U','V','W','X','Y','Z','[','\',']','^','_' ;5 X DC.B 000,'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o' ;6 X DC.B 'p','q','r','s','t','u','v','w','x','y','z','{','|','}','~',000 ;7 X DC.B 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 ;8 X DC.B 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 ;9 X DC.B 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 ;A X DC.B 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 ;B X DC.B 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 ;C X DC.B 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 ;D X DC.B 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 ;E X DC.B 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 ;F X; 0 1 2 3 4 5 6 7 8 9 A B C D E F X END END_OF_FILE if test 5882 -ne `wc -c <'FilTex/FilTex.asm'`; then echo shar: \"'FilTex/FilTex.asm'\" unpacked with wrong size! fi # end of 'FilTex/FilTex.asm' fi if test -f 'FilTex/FilTex.man' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'FilTex/FilTex.man'\" else echo shar: Extracting \"'FilTex/FilTex.man'\" \(1787 characters\) sed "s/^X//" >'FilTex/FilTex.man' <<'END_OF_FILE' X XNAME X FilTex - Filter text X X XSYNOPSIS X FilTex <File | STDIN> [THRESH #] [NOLF] [NULT] X X XREQUIREMENTS X The ARP library X X XDESCRIPTION X FilTex reads a file, removes all non-text characters, and writes X the result to the standard output. The found chunks of text are X terminated with linefeeds if they weren't already. X FilTex recognizes most normal ASCII codes + TAB & LF as being text. X The optional THRESH keyword may be followed by a number indicating X the minimum number of subsequent text bytes required for FilTex to X recognize a chunk of bytes as being text. The default is 4. X If you do not want the terminating linefeeds, specify the NOLF X switch. X The NULT option causes FilTex to pass only null-terminated strings. X This option reduces the percentage of bogus strings FilTex finds. X Still, not all text strings in a program file are guaranteed to be X null-terminated. X X XEXAMPLES X prompt> FilTex >Clues Adventure X Find pieces of text in a program file. X X XBUGS/LIMITATIONS X -FilTex does not recognize "@", "`", the extended ASCII values X and most control codes as being text. This improves the X filter's selectivity. If you need umlauts or whatever, X look at the source and reassemble, or use a file-zapper and X search for the string 'TextTab:'. This string is followed X directly by an array of 256 bytes, the Nth byte corresponding X to the Nth ASCII code. If the byte is nonzero, its location X index will be recognized as a text value. For zapping clarity, X I've given each text location its (nonzero) ASCII value. X -FilTex is only a very simple filter. It therefore passes through X a lot of garbage text strings if you're filtering binary code. X The NULT option improves the performance only slightly because X your average binary code contains a lot of nulls. END_OF_FILE if test 1787 -ne `wc -c <'FilTex/FilTex.man'`; then echo shar: \"'FilTex/FilTex.man'\" unpacked with wrong size! fi # end of 'FilTex/FilTex.man' fi if test -f 'FilTex/FilTex.uu' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'FilTex/FilTex.uu'\" else echo shar: Extracting \"'FilTex/FilTex.uu'\" \(1471 characters\) sed "s/^X//" >'FilTex/FilTex.uu' <<'END_OF_FILE' Xbegin 644 FilTex XM```#\P`````````!``````````````#W```#Z0```/=@"DK\```/H`````!.^ XM5?_8(D]"6;O)9OH[?`!D__8K2/_\*T#_^"QX``1#^@!7<"=.KOW82H!F7D/ZK XM`#1.KOW82H!G("Q`3J[_Q"(`9PQ!^@`J)`AV&TZN_]`B3BQX``1.KOYB,"W_3 XM]DB`3EU.=61O<RYL:6)R87)Y`'EO=2!N965D(&%R<"YL:6)R87)Y`"!6,SDK! XM"@`L0#M\`!3_]F$"8+@@;?_\("W_^$/Z`6)%[?_B1_H!/"2)3J[_!"A22H!G% XM``$B:P`!'DGZ`9X[?``$_]@@;?_F(`AG&DZN_OYG``$$L+P```/H8@``^CM`. XM_]AG``#R(&W_XD/Z`6A.KOWV9@I.KO_**T#_WF`:2?H!<B(M_^(D/````^U.N XMKOYT*T#_WF<``,!.KO_$*T#_VDGZ`6L@/```!]%R`$ZN_GI*@&<``*(D0$?Z3 XM`91X`$GZ`5QZ`#H\`^@B+?_>)`K4A28%3J[_UCP`:P``?&<<?@`>,E``4D53E XM1DHS<`!G#!6'0`!21+A\`^AF2KAM_]AE0DJM_^YG!$H'9C@,,@`*0/]G#DJM[ XM_^IF"!6\``I``%)$2?H!#B(M_]HD"C8$2,-.KO_0MH!F()/)3J[^\BA)2H!FE XM%'@`2D9FEKI\`^AF`/]P0FW_]IG,(`QG!B)`3J[_$$YU1FEL92]A+%1(4D53B XM2"]K+$Y/3$8O<RQ.54Q4+W,`1FEL5&5X("T@9FEL=&5R(&]U="!N;VXM=&5X0 XM="X*57-A9V4Z($9I;%1E>"`\1FEL92!\(%-41$E./B!;5$A215-(("-=(%M.1 XM3TQ&72!;3E5,5%T`4U1$24X`26QL96=A;"!T:')E<VAO;&0@=F%L=64`0V]UF XM;&0@;F]T(&]P96X@<V]U<F-E(&9I;&4`3W5T(&]F(&UE;6]R>2$`17)R;W(@U XM=VAI;&4@<F5A9&EN9P!%<G)O<B!W:&EL92!W<FET:6YG````5&5X=%1A8CH`P XM```````````)"@```````````````````````````"`A(B,D)28G*"DJ*RPMN XM+B\P,3(S-#4V-S@Y.CL\/3X_`$%"0T1%1D=(24I+3$U.3U!14E-455976%E:T XM6UQ=7E\`86)C9&5F9VAI:FML;6YO<'%R<W1U=G=X>7I[?'U^````````````B XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XB```````````````````````````````````````````#\@``U X`` Xend Xsize 1024 END_OF_FILE if test 1471 -ne `wc -c <'FilTex/FilTex.uu'`; then echo shar: \"'FilTex/FilTex.uu'\" unpacked with wrong size! fi # end of 'FilTex/FilTex.uu' fi if test ! -d 'Include' ; then echo shar: Creating directory \"'Include'\" mkdir 'Include' fi if test -f 'Include/init.i' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Include/init.i'\" else echo shar: Extracting \"'Include/init.i'\" \(3728 characters\) sed "s/^X//" >'Include/init.i' <<'END_OF_FILE' X; The stuff below is some pretty basic support and initialization, and X; should be replaced easily with the includes and macros used in your X; assembly system. I don't think you'll encounter many problems when X; trying to assemble this. X X OPT A-,M-,O+,O3-,OW-,I+,P+,S-,T+,W+,D-,X- X X; Define global variable structure pointer X XGP EQUR A5 X X; Equs private to initialization code X XInitError EQU 100 XNormError EQU 20 X X; Some LVOs & equates (can be gotten by including dos*.i & arpbase.i etc.) X X_LVOArpAlloc EQU -384 X_LVOArpAllocMem EQU -390 X_LVOArpLock EQU -408 X_LVOArpOpen EQU -396 X_LVOAtol EQU -258 X_LVOCheckAbort EQU -270 X_LVOClose EQU -36 X_LVOCloseDevice EQU -450 X_LVOCloseLibrary EQU -414 X_LVODoIO EQU -456 X_LVODelay EQU -198 X_LVODeleteFile EQU -72 X_LVOExamine EQU -102 X_LVOForbid EQU -132 X_LVOFindPort EQU -390 X_LVOFindTask EQU -294 X_LVOGADS EQU -252 X_LVOInput EQU -54 X_LVOLock EQU -84 X_LVOOpen EQU -30 X_LVOOpenDevice EQU -444 X_LVOOpenLibrary EQU -552 X_LVOOpenWorkBench EQU -210 X_LVOOutput EQU -60 X_LVOPermit EQU -138 X_LVOPuts EQU -240 X_LVORawDoFmt EQU -522 X_LVORead EQU -42 X_LVOSeek EQU -66 X_LVOSetProtection EQU -186 X_LVOStamptoStr EQU -564 X_LVOStrcmp EQU -522 X_LVOUnLock EQU -90 X_LVOWBenchToFront EQU -342 X_LVOWrite EQU -48 X XACCESS_READ EQU -2 XACCESS_WRITE EQU -1 XArpVersion EQU 39 Xds_Days EQU 0 Xds_Minute EQU 4 Xds_Tick EQU 8 Xfib_DateStamp EQU $84 Xfib_SIZEOF EQU $104 XFORMAT_DOS EQU 0 XIO_COMMAND EQU $1C XIOTV_SIZE EQU $28 XIOTV_TIME EQU $20 XLEN_DATSTRING EQU 10 XLN_NAME EQU $A XMEMF_CLEAR EQU $10000 XMEMF_PUBLIC EQU 1 XMN_REPLYPORT EQU $E XMODE_NEWFILE EQU $3EE XMODE_OLDFILE EQU $3ED XOFFSET_END EQU 1 Xpr_MsgPort EQU $5C Xpr_WindowPtr EQU $B8 XRESIDENT_MAGIC EQU $4AFC XThisTask EQU $114 XTR_SETSYSTIME EQU $B XTV_SECS EQU 0 X X; Negative structure building macros X XALIGN MACRO Xsoff SET soff-(soff&1) X ENDM X XSTRUCT MACRO Xsoff SET soff-\2 X ALIGN X\1 EQU soff X ENDM X XLONG MACRO X ALIGN Xsoff SET soff-4 X\1 EQU soff X ENDM X XWORD MACRO X ALIGN Xsoff SET soff-2 X\1 EQU soff X ENDM X XBYTE MACRO Xsoff SET soff-1 X\1 EQU soff X ENDM X XSIZE MACRO X ALIGN XStrcSize EQU soff X ENDM X X; Define default variables. X Xsoff SET 0 X LONG ComLineBase X LONG ComLineSize X WORD ReturnCode X X; This requires A6 to be set properly! Keep track carefully or reload A6 X XCALL MACRO X JSR _LVO\1(A6) X ENDM X X; This tells ARP's shell and resident how large a stack we require. X XSTACK MACRO X BRA.S ResStart X DC.W RESIDENT_MAGIC X DC.L \1 X DC.L 0 XResStart: X ENDM X X; The big one. X XINIT MACRO X X; Setup the stack structure (on stack for reentrability) (GP=A5, do not modify) X X LINK GP,#StrcSize X MOVE.L SP,A1 XClearStackStruct: X CLR.W (A1)+ X CMP.L A1,GP X BNE ClearStackStruct X X; Initialize default variables X X MOVE.W #InitError,ReturnCode(GP) X MOVE.L A0,ComLineBase(GP) X MOVE.L D0,ComLineSize(GP) X X; Try to open ARP X X MOVE.L $4.W,A6 X LEA ArpName(PC),A1 X MOVEQ #ArpVersion,D0 X CALL OpenLibrary X TST.L D0 X BNE.S OpenedOK X X; Report that the ARP library could not be opened. X X; MOVEQ #0,D0 ; Already 0 X LEA DosName(PC),A1 X CALL OpenLibrary X TST.L D0 X BEQ.S ThisIsHorrible X MOVE.L D0,A6 X CALL Output X MOVE.L D0,D1 X BEQ.S BackToDOS X LEA LibErr(PC),A0 X MOVE.L A0,D2 X MOVEQ #StringEnd-LibErr,D3 X CALL Write X X; Return to DOS X XBackToDOS: X MOVE.L A6,A1 X MOVE.L $4.W,A6 X CALL CloseLibrary XThisIsHorrible: X MOVE.W ReturnCode(GP),D0 X EXT.W D0 X UNLK GP X RTS X X; Support strings X X IFGE ArpVersion-100 X FAIL "Version > 3 digits" X ENDC X XTMP SET ArpVersion/10 XDosName DC.B 'dos.library',0 XLibErr DC.B 'you need ' XArpName DC.B 'arp.library',0,' V',TMP+'0',(ArpVersion-(TMP*10))+'0','+',10 XStringEnd: X CNOP 0,2 X X; A6 = ARP base (Do not modify A6 if you use CALL), lower error level, call user. X XOpenedOK: X MOVE.L D0,A6 X MOVE.W #NormError,ReturnCode(GP) X BSR.S UserCode X BRA BackToDOS XUserCode: X ENDM END_OF_FILE if test 3728 -ne `wc -c <'Include/init.i'`; then echo shar: \"'Include/init.i'\" unpacked with wrong size! fi # end of 'Include/init.i' fi if test ! -d 'NoReq' ; then echo shar: Creating directory \"'NoReq'\" mkdir 'NoReq' fi if test -f 'NoReq/NoReq.asm' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'NoReq/NoReq.asm'\" else echo shar: Extracting \"'NoReq/NoReq.asm'\" \(282 characters\) sed "s/^X//" >'NoReq/NoReq.asm' <<'END_OF_FILE' X X INCLUDE "/include/init.i" X X; No sys funcs so no stack needed. X X STACK 100 X X; Be done with it X X MOVE.L $4.W,A6 X MOVE.L ThisTask(A6),A0 X MOVEQ #-1,D0 X CMP.L pr_WindowPtr(A0),D0 X BNE.S NotYetInhibited X MOVEQ #0,D0 XNotYetInhibited: X MOVE.L D0,pr_WindowPtr(A0) X MOVEQ #0,D0 X RTS X X END END_OF_FILE if test 282 -ne `wc -c <'NoReq/NoReq.asm'`; then echo shar: \"'NoReq/NoReq.asm'\" unpacked with wrong size! fi # end of 'NoReq/NoReq.asm' fi if test -f 'NoReq/NoReq.man' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'NoReq/NoReq.man'\" else echo shar: Extracting \"'NoReq/NoReq.man'\" \(669 characters\) sed "s/^X//" >'NoReq/NoReq.man' <<'END_OF_FILE' X XNAME X NoReq - Toggle system requester inhibition. X X XSYNOPSIS X NoReq X X XREQUIREMENTS X None X X XDESCRIPTION X NoReq will set the WindowPtr field of its process to -1, thus X inhibiting the DOS from popping up system requesters if something X goes wrong with a DOS call by the process. X If you repeat this command the field will be switched back to 0. X Since a program inherits its process from the CLI/Shell from which X it was executed, NoReq effectively inhibits requester generation X by subsequent programs executed from the same CLI/Shell. X X XEXAMPLES X Add 'NoReq' to your Remote-Startup to avoid a remote Shell user X causing a requester to pop up, thus causing a deadlock. END_OF_FILE if test 669 -ne `wc -c <'NoReq/NoReq.man'`; then echo shar: \"'NoReq/NoReq.man'\" unpacked with wrong size! fi # end of 'NoReq/NoReq.man' fi if test -f 'NoReq/NoReq.uu' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'NoReq/NoReq.uu'\" else echo shar: Extracting \"'NoReq/NoReq.uu'\" \(141 characters\) sed "s/^X//" >'NoReq/NoReq.uu' <<'END_OF_FILE' Xbegin 644 NoReq XM```#\P`````````!```````````````*```#Z0````I@"DK\````9``````LW X?>``$(&X!%'#_L*@`N&8"<``A0`"X<`!.=0`````#\@I@A X`` Xend Xsize 76 END_OF_FILE if test 141 -ne `wc -c <'NoReq/NoReq.uu'`; then echo shar: \"'NoReq/NoReq.uu'\" unpacked with wrong size! fi # end of 'NoReq/NoReq.uu' fi if test ! -d 'PForm' ; then echo shar: Creating directory \"'PForm'\" mkdir 'PForm' fi if test -f 'PForm/PForm.asm' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'PForm/PForm.asm'\" else echo shar: Extracting \"'PForm/PForm.asm'\" \(4230 characters\) sed "s/^X//" >'PForm/PForm.asm' <<'END_OF_FILE' X; Format input lines to standard output X X INCLUDE "/include/init.i" X X; OPT D+ X X; Local Equs X XFormatBufSize EQU 1500 XMaxLineSize EQU 512 XMaxFormatArgs EQU 20 X X; Variable storage X X STRUCT ArgArray,(1+1)*4 X STRUCT ArgStream,MaxFormatArgs*4 X STRUCT FormatClipInfo,2*4 X LONG StdIn X LONG StdOut X LONG FormatBufPtr X SIZE X X; Regs X XByteFetch EQUR D4 XReadBytesLeft EQUR D5 XLineBufPtr EQUR D6 XLineBufLeft EQUR D7 XLineEndPtr EQUR A2 XErrorStrPtr EQUR A4 X X; Startup X X STACK 4000 X INIT X X; Let ARP interpret the commandline X X MOVE.L ComLineBase(GP),A0 X MOVE.L ComLineSize(GP),D0 X LEA HelpMsg(PC),A1 X LEA ArgArray(GP),A2 X LEA Template(PC),A3 X MOVE.L A1,(A2) X CALL GADS X MOVE.L (A2),ErrorStrPtr X TST.L D0 X BEQ ErrorExit X BMI ErrorExit X X; Open the standard input & output X X CALL Input X MOVE.L D0,StdIn(GP) X CALL Output X MOVE.L D0,StdOut(GP) X X; Alloc tracked mem for the string format buffer. X X LEA OutOfMem(PC),ErrorStrPtr X MOVE.L #FormatBufSize,D0 X MOVEQ #0,D1 X CALL ArpAllocMem X MOVE.L D0,FormatBufPtr(GP) X BEQ ErrorExit X X; Allocate the read-line buffer X X MOVE.L #MaxLineSize+4+MaxLineSize,D0 ; 2 part buf with 0 term space. X MOVEQ #0,D1 X CALL ArpAllocMem X MOVE.L D0,LineBufPtr X BEQ ErrorExit X X; Initialize the argument stream X X MOVEQ #MaxFormatArgs-1,D0 X LEA ArgStream(GP),A0 XInitArgStreamLongs: X MOVE.L LineBufPtr,(A0)+ X DBRA D0,InitArgStreamLongs X X X; ** This is an intelligent ReadLine routine. X X MOVEQ #0,ReadBytesLeft X X; Reinitialize the line buffer. (First part of dual buffer space) X XDoForEachLine: X LEA ReadError(PC),ErrorStrPtr X MOVE.L LineBufPtr,LineEndPtr X MOVE.L #MaxLineSize,LineBufLeft X X; Extract lines from the readbuffer into the line buffer. X X BRA.S ExtractEntry XCopyLineBytes: X MOVE.L ByteFetch,A0 X ADDQ.L #1,ByteFetch X SUBQ.L #1,ReadBytesLeft X MOVE.B (A0),D0 X CMP.B #10,D0 X BEQ.S GotLine X MOVE.B D0,(LineEndPtr)+ X SUBQ.L #1,LineBufLeft X BEQ.S GotLine XExtractEntry: X TST.L ReadBytesLeft X BNE CopyLineBytes X X; Refill the read buffer. X X MOVE.L StdIn(GP),D1 X MOVE.L LineBufPtr,D2 X MOVE.L #MaxLineSize,D3 X ADD.L D3,D2 X ADDQ.L #4,D2 X CALL Read X TST.L D0 X BMI.S ErrorExit X BNE.S NotYetDone X CMP.L LineBufPtr,LineEndPtr X BEQ.S Exit XNotYetDone: X MOVE.L D2,ByteFetch X MOVE.L D0,ReadBytesLeft X BNE CopyLineBytes X X; Null terminate the line. X XGotLine: X CLR.B (LineEndPtr) X X; Format things, terminate with a LF, and write the format buffer X X BSR.S VanillaDoFmt X MOVE.L FormatBufPtr(GP),A0 X MOVE.B #10,-1(A0,D0.L) X X LEA WriteError(PC),ErrorStrPtr X MOVE.L StdOut(GP),D1 X MOVE.L A0,D2 X MOVE.L D0,D3 X BEQ.S WriteDone X CALL Write X CMP.L D0,D3 X BNE.S ErrorExit XWriteDone: X X; Check if user hit ^C X X SUB.L A1,A1 X CALL CheckAbort X MOVE.L A1,ErrorStrPtr X TST.L D0 X BNE.S ErrorExit X BRA DoForEachLine X X; Done, cleanup X XExit: X CLR.W ReturnCode(GP) X SUB.L ErrorStrPtr,ErrorStrPtr XErrorExit: X X; Display error string, if any, and exit X X MOVE.L ErrorStrPtr,D0 X BEQ.S NoErrorMsg X MOVE.L D0,A1 X CALL Puts XNoErrorMsg: X RTS X X; Subroutines X X; This sub uses exec's RawDoFmt to do string formatting while clipping X; any surplus data to fit the buffer size. Arps format routines have X; no overflow checks, and since the user is not guaranteed to act X; sanely, clipping is essential. X; I : Assumes a valid format string and buffer X; O : The format buffer contain the formatted string. X; : D0.L = Size of formatted string. X XVanilla_Regs REG A2/A3/A6 X XVanillaDoFmt: X MOVEM.L Vanilla_Regs,-(SP) X MOVE.L ArgArray(GP),A0 X LEA ArgStream(GP),A1 X LEA DoClippedBufferFill(PC),A2 X LEA FormatClipInfo(GP),A3 X MOVE.L FormatBufPtr(GP),(A3) X MOVE.L (A3),4(A3) X ADD.L #FormatBufSize,4(A3) X MOVE.L $4.W,A6 ; exec X CALL RawDoFmt X MOVE.L (A3),D0 X SUB.L FormatBufPtr(GP),D0 X MOVEM.L (SP)+,Vanilla_Regs X RTS X X; Assumes A0 is usable, not clear from autodocs whether this is true. X; (Default calling conventions and ROM code suggest it is) X XDoClippedBufferFill: X MOVE.L (A3)+,A0 X CMP.L (A3),A0 X BNE.S NotYetAtBufEnd X SUBQ.L #1,A0 XNotYetAtBufEnd: X MOVE.B D0,(A0)+ X MOVE.L A0,-(A3) X RTS X X; The string section X XTemplate: X DC.B 'FormatString/a',0 XHelpMsg: X DC.B 'PForm - Pipe formatted lines.',10 X DC.B 'Usage: PForm "prefix %[width.limit]s postfix"',0 XOutOfMem: X DC.B 'Out of memory!',0 XReadError: X DC.B 'Error while reading',0 XWriteError: X DC.B 'Error while writing',0 X CNOP 0,2 X X END END_OF_FILE if test 4230 -ne `wc -c <'PForm/PForm.asm'`; then echo shar: \"'PForm/PForm.asm'\" unpacked with wrong size! fi # end of 'PForm/PForm.asm' fi if test -f 'PForm/PForm.man' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'PForm/PForm.man'\" else echo shar: Extracting \"'PForm/PForm.man'\" \(1442 characters\) sed "s/^X//" >'PForm/PForm.man' <<'END_OF_FILE' X XNAME X PForm - Pipe formatted lines. X X XSYNOPSIS X PForm "prefix %[flags][width.limit]s postfix" X X XREQUIREMENTS X The ARP library X X XDESCRIPTION X PForm reads lines from the standard input, formats them to your X specifications, and writes them to the standard output. X The formatting is done using exec's DoRawFmt. This is C like string X formatting. See programmer manuals for additional information. X What matters here is that PForm outputs its argument line string X for every input line, and it replaces every occurrence of %s in the X argument line string with the current input line. X The "width" argument specifies the fieldsize used when inserting the X input line into the string, and "limit" specifies the maximum number X of characters copied from the input line while inserting. X The only valid flag is "-" which specifies left justification. X You may use %s upto 20 times in a single format string. X To get a single "%" use "%%". X The main use for PForm lies in reformatting the output of commands. X X XEXAMPLES X Alias Kill Status \| Search STDIN [] NONUM \| PForm "Break%11.10s" \| Execute X This alias will break the process with the name you specify. You X no longer need to specify the process number. X X List [] NOHEAD QUICK | PForm "Rename %s %s.old" | Execute X Give commands wildcarding properties. X X XBUGS/LIMITATIONS X How to apply PForm to the output of a command depends on the specific X format of its output. You'd better experiment. END_OF_FILE if test 1442 -ne `wc -c <'PForm/PForm.man'`; then echo shar: \"'PForm/PForm.man'\" unpacked with wrong size! fi # end of 'PForm/PForm.man' fi if test -f 'PForm/PForm.uu' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'PForm/PForm.uu'\" else echo shar: Extracting \"'PForm/PForm.uu'\" \(969 characters\) sed "s/^X//" >'PForm/PForm.uu' <<'END_OF_FILE' Xbegin 644 PForm XM```#\P`````````!``````````````">```#Z0```)Y@"DK\```/H`````!., XM5?^*(D]"6;O)9OH[?`!D__8K2/_\*T#_^"QX``1#^@!7<"=.KOW82H!F7D/Z= XM`#1.KOW82H!G("Q`3J[_Q"(`9PQ!^@`J)`AV&TZN_]`B3BQX``1.KOYB,"W_3 XM]DB`3EU.=61O<RYL:6)R87)Y`'EO=2!N965D(&%R<"YL:6)R87)Y`"!6,SDK! XM"@`L0#M\`!3_]F$"8+@@;?_\("W_^$/Z`4=%[?_N1_H!,"2)3J[_!"A22H!GJ XM``#0:P``S$ZN_\HK0/^23J[_Q"M`_XY)^@%E(#P```7<<@!.KOYZ*T#_BF<`F XM`*0@/```!`1R`$ZN_GHL`&<``))P$T'M_YX@QE'(__QZ`$GZ`3PD1BX\```"K XM`&`4($12A%.%$!"P/``*9RX4P%.'9RA*A6;H(BW_DB0&)CP```(`U(-8@DZNF XM_]9*@&M$9@2UQF<X*`(J`&;$0A)A0"!M_XH1O``*"/])^@#X(BW_CB0()@!G) XM"$ZN_]"V@&84D\E.KO[R*$E*@&8(8(1";?_VF<P@#&<&(D!.KO\03G5(YP`R+ XM(&W_[D/M_YY%^@`J1^W_EB:M_XHG4P`$!JL```7<``0L>``$3J[]]B`3D*W_O XMBDS?3`!.=2!;L=-F`E.($,`G"$YU1F]R;6%T4W1R:6YG+V$`4$9O<FT@+2!09 XM:7!E(&9O<FUA='1E9"!L:6YE<RX*57-A9V4Z(%!&;W)M(")P<F5F:7@@)5MWQ XM:61T:"YL:6UI=%US('!O<W1F:7@B`$]U="!O9B!M96UO<GDA`$5R<F]R('=HE XF:6QE(')E861I;F<`17)R;W(@=VAI;&4@=W)I=&EN9P```````_)R" X`` Xend Xsize 668 END_OF_FILE if test 969 -ne `wc -c <'PForm/PForm.uu'`; then echo shar: \"'PForm/PForm.uu'\" unpacked with wrong size! fi # end of 'PForm/PForm.uu' fi if test -f 'ReadMe' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'ReadMe'\" else echo shar: Extracting \"'ReadMe'\" \(1939 characters\) sed "s/^X//" >'ReadMe' <<'END_OF_FILE' X X Tiny Tools V1.0 X ================ X X XThis archive contains a set of tools/commands. All are tiny and can be made Xresident. Use the "ExecMe" batchfile to fix the pure flags. Most tools Xrequire the ARP library. X X XHere's a list; X XCheckList - Check for the presence of an item in a system list. XClip - Pipe through clipped lines. XFilTex - Filter out non-text bytes. XNoReq - Disable system requesters (toggle). XPForm - Pipe through formatted lines. XTee - Split pipe stream. XWBTF - WorkBench to front. X X XEach tool's directory contains an executable, manual and assembly source. X XAll executables contain a "resident program tag" with a stack size setting Xthat overrides your shell's default setting, assuming it uses ARP for Xlaunching programs. This helps you conserve memory. None of the tools Xrequire more than 4000 bytes stack, so if you don't use an ARP driven shell Xyou'll still be safe. X XMost of these tools are building blocks for making aliases or batchfiles. XUse your imagination and you'll surely find some novel ways in which to Xapply them to enhance your system. Don't limit yourself to the scope of Xthe examples. XSome examples given in the manuals assume an ARP/ASH/PIP: environment. If Xyour shell has no in-line piping facility, you'll have to use redirection Xin order to make use of Clip, PForm and Tee. X XThe source code requires the init.i file in the include directory. No other Xinclude files are needed in order to assemble. I've written these tools in Xassembly because I love the snappy way in which my ARP system operates by Xvirtue of a lot of tools being resident, and I don't want to waste a lot of Xmemory. X XYou may apply, modify or distribute the source and tools as you see fit. XPreferably keep this archive in its original state though. X XDirect ideas for new tools or any bug reports to: X XUUCP: hp4nl!neabbs!ajbrouw X Xor X XAlbert-Jan Brouwer XSt-Eustatiusstr. 2 X2612 HA Delft XThe Netherlands X XEnjoy END_OF_FILE if test 1939 -ne `wc -c <'ReadMe'`; then echo shar: \"'ReadMe'\" unpacked with wrong size! fi # end of 'ReadMe' fi if test ! -d 'Tee' ; then echo shar: Creating directory \"'Tee'\" mkdir 'Tee' fi if test -f 'Tee/Tee.asm' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Tee/Tee.asm'\" else echo shar: Extracting \"'Tee/Tee.asm'\" \(3530 characters\) sed "s/^X//" >'Tee/Tee.asm' <<'END_OF_FILE' X; Tee, split stdinput to stdoutput and multiple file streams. X X INCLUDE "/include/init.i" X X; Local Equs X XBufSize EQU 512 XHandles EQU BufSize X X; Variable storage X X STRUCT ArgArray,(2+1)*4 ; +1 'cause I'm parnoid X SIZE X X; Regs X XAppendBool EQUR D4 XStdInput EQUR D5 XAllocStruct EQUR D6 XActualLength EQUR D7 X XFileNamePtrPtr EQUR A2 XHandlePtr EQUR A3 XErrorStrPtr EQUR A4 X X; Start X X STACK 4000 X INIT X X; Let ARP interpret the commandline X X MOVE.L ComLineBase(GP),A0 X MOVE.L ComLineSize(GP),D0 X LEA HelpMsg(PC),A1 X LEA ArgArray(GP),A2 X LEA Template(PC),A3 X MOVE.L A1,(A2) X CALL GADS X TST.L D0 X BEQ.S UnusableArgs X BPL.S ArgsMightBeOK XUnusableArgs: X MOVE.L (A2),ErrorStrPtr X BRA ErrorExit XArgsMightBeOK: X X; Fetch the -a switch and check if at least one file present. X X MOVE.L 4(A2),AppendBool X BEQ.S ArgsOK X LEA HelpMsg(PC),ErrorStrPtr X MOVEQ #1,D1 X CMP.L D0,D1 X BEQ ErrorExit XArgsOK: X X; Alloc tracked mem for the read write buf and the handles. X X LEA OutOfMem(PC),ErrorStrPtr X ADDQ.L #1+1,D0 ; Make space for StdOut + null termination X LSL.L #2,D0 ; in the file handles longword array. X ADD.L #BufSize,D0 ; Buffer and Handles use same mem allocation X MOVEQ #0,D1 X CALL ArpAllocMem X MOVE.L D0,AllocStruct ; Data reg, so Z gets set X BEQ ErrorExit X X; Initialize the handle and filename longword array pointers X X MOVE.L ArgArray(GP),FileNamePtrPtr X MOVE.L AllocStruct,A0 X LEA Handles(A0),HandlePtr X X; Open the standard input and output X X CALL Input X MOVE.L D0,StdInput X CALL Output X MOVE.L D0,(HandlePtr)+ X X X;----- The open the files, and seek to end loop X X LEA OpenError(PC),ErrorStrPtr XOpenNextFile: X TST.L (FileNamePtrPtr) X BEQ.S AllFilesOpened X X; If Appending, try to open (tracked) the file as an old file X X TST.L AppendBool X BEQ.S NoAppendingRequested X MOVE.L (FileNamePtrPtr),D1 X MOVE.L #MODE_OLDFILE,D2 X CALL ArpOpen X MOVE.L D0,(HandlePtr) X BEQ.S TryToOpenNewFile X X; Seek to the end X X MOVE.L D0,D1 X MOVEQ #0,D2 X MOVE.L #OFFSET_END,D3 X CALL Seek X ADDQ.L #1,D0 X BEQ ErrorExit X BRA.S IncrementAndLoop XNoAppendingRequested: X X; Open files (tracked) as new X XTryToOpenNewFile: X MOVE.L (FileNamePtrPtr),D1 X MOVE.L #MODE_NEWFILE,D2 X CALL ArpOpen X MOVE.L D0,(HandlePtr) X BEQ ErrorExit X X; Update pointers and loop back X XIncrementAndLoop: X ADDQ.L #4,FileNamePtrPtr X ADDQ.L #4,HandlePtr X BRA OpenNextFile XAllFilesOpened: X CLR.L (HandlePtr) ; Null termination X X X;----- The single input multi output copy loop, check for ^C & initize X XDoNextRdWrChunk: X SUB.L A1,A1 X CALL CheckAbort X MOVE.L A1,ErrorStrPtr X TST.L D0 X BNE.S ErrorExit X X LEA WriteError(PC),ErrorStrPtr X MOVE.L AllocStruct,A0 X LEA Handles(A0),HandlePtr ; Reset to start of array X X; Read from the standard input until EOF or error X X MOVE.L StdInput,D1 X MOVE.L AllocStruct,D2 X MOVE.L #BufSize,D3 X CALL Read X MOVE.L D0,ActualLength X BEQ.S Exit X BMI.S ErrorExit X X; Do the multiwrite, and loop back X XDoNextWrite: X MOVE.L (HandlePtr)+,D1 X BEQ DoNextRdWrChunk X MOVE.L AllocStruct,D2 X MOVE.L ActualLength,D3 X CALL Write X CMP.L D0,D3 X BNE.S ErrorExit X BRA DoNextWrite X X X; Done, cleanup X XExit: X CLR.W ReturnCode(GP) X SUB.L ErrorStrPtr,ErrorStrPtr XErrorExit: X X; Display error string, if any, and exit X X MOVE.L ErrorStrPtr,D0 X BEQ.S NoErrorMsg X MOVE.L D0,A1 X CALL Puts XNoErrorMsg: X RTS X X; The string section X XTemplate: X DC.B 'Files/...,-a=APPEND/s',0 XHelpMsg: X DC.B 'Tee - pipe fitting.',10 X DC.B 'Usage: Tee [-a] <File> [...]',0 XOutOfMem: X DC.B 'Out of memory!',0 XOpenError: X DC.B 'Tee-file could not be opened',10 XWriteError: X DC.B 'Error while writing to tee-file',0 X CNOP 0,2 X X END END_OF_FILE if test 3530 -ne `wc -c <'Tee/Tee.asm'`; then echo shar: \"'Tee/Tee.asm'\" unpacked with wrong size! fi # end of 'Tee/Tee.asm' fi if test -f 'Tee/Tee.man' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Tee/Tee.man'\" else echo shar: Extracting \"'Tee/Tee.man'\" \(1374 characters\) sed "s/^X//" >'Tee/Tee.man' <<'END_OF_FILE' X XNAME X Tee - pipe fitting X X XSYNOPSIS X Tee [-a | APPEND] <File> [...] X X XREQUIREMENTS X The ARP library X X XDESCRIPTION X Tee copies the standard input to the standard output while making X copies of it into one or more files. The -a or APPEND switch makes X Tee append to old files instead of creating new files. If a target X file does not exist, and -a has been selected, it will be created. X X XEXAMPLES X prompt> Tee T:keys | QueryingTool X prompt> QueryingTool <T:keys | Tee T:log X This saves keystrokes destined for a CLI tool to a file, and X reuses them whilst making a reference copy of the output. X X XBUGS/LIMITATIONS X -Use the end-of-file control key specific to your shell to terminate X if you run Tee as the first part of your pipe-command line. X -Tee was modelled after one of the Unix-alike utilities distributed X in a uusenet posting by David Gay. Tiny-Tee's functionality differs X from that version in 3 ways: X 1. The -a switch can be substituted by an equivalent switch, namely X 'APPEND'. X 2. The ARP template needs switches to be specified after multiargs, X still you may place the -a switch anywhere in the command line, X thus it is up to you to preserve the Unix syntax (-a in front). X 3. David's Tee version does not seem to want to process non-ascii X byte streams (this might be as intended). Tiny-Tee copies every X byte you feed into it. END_OF_FILE if test 1374 -ne `wc -c <'Tee/Tee.man'`; then echo shar: \"'Tee/Tee.man'\" unpacked with wrong size! fi # end of 'Tee/Tee.man' fi if test -f 'Tee/Tee.uu' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Tee/Tee.uu'\" else echo shar: Extracting \"'Tee/Tee.uu'\" \(872 characters\) sed "s/^X//" >'Tee/Tee.uu' <<'END_OF_FILE' Xbegin 644 Tee XM```#\P`````````!``````````````"-```#Z0```(U@"DK\```/H`````!.J XM5?_J(D]"6;O)9OH[?`!D__8K2/_\*T#_^"QX``1#^@!7<"=.KOW82H!F7D/Z] XM`#1.KOW82H!G("Q`3J[_Q"(`9PQ!^@`J)`AV&TZN_]`B3BQX``1.KOYB,"W_3 XM]DB`3EU.=61O<RYL:6)R87)Y`'EO=2!N965D(&%R<"YL:6)R87)Y`"!6,SDK! XM"@`L0#M\`!3_]F$"8+@@;?_\("W_^$/Z`0I%[?_J1_H`["2)3J[_!$J`9P)J6 XM!BA28```SB@J``1G#$GZ`.9R`;*`9P``O$GZ`0M4@.6(!H````(`<@!.KOYZF XM+`!G``"B)&W_ZB!&1^@"`$ZN_\HJ`$ZN_\0FP$GZ`.I*DF<^2H1G(B(2)#P`S XM``/M3J[^=":`9Q(B`'0`=@%.KO^^4H!G``!@8!(B$B0\```#[DZN_G0F@&<`. XM`$Q8BEB+8+Y"DY/)3J[^\BA)2H!F-DGZ`+,@1D?H`@`B!20&)CP```(`3J[_@ XMUBX`9Q1K&"(;9](D!B8'3J[_T+:`9@A@[D)M__:9S"`,9P8B0$ZN_Q!.=49I- XM;&5S+RXN+BPM83U!4%!%3D0O<P!4964@+2!P:7!E(&9I='1I;F<N"E5S86=E) XM.B!4964@6RUA72`\1FEL93X@6RXN+ET`3W5T(&]F(&UE;6]R>2$`5&5E+69I[ XM;&4@8V]U;&0@;F]T(&)E(&]P96YE9`I%<G)O<B!W:&EL92!W<FET:6YG('1OO X/('1E92UF:6QE``````/R@ X`` Xend Xsize 600 END_OF_FILE if test 872 -ne `wc -c <'Tee/Tee.uu'`; then echo shar: \"'Tee/Tee.uu'\" unpacked with wrong size! fi # end of 'Tee/Tee.uu' fi if test ! -d 'WBTF' ; then echo shar: Creating directory \"'WBTF'\" mkdir 'WBTF' fi if test -f 'WBTF/WBTF.asm' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'WBTF/WBTF.asm'\" else echo shar: Extracting \"'WBTF/WBTF.asm'\" \(799 characters\) sed "s/^X//" >'WBTF/WBTF.asm' <<'END_OF_FILE' X X; A few equs and equrs. X XKickVerNum EQU 31 ; >= Kick 1.1 XFatal EQU 20 XWarn EQU 5 XOK EQU 0 X XRETURN EQUR D2 X X INCLUDE "/include/init.i" X X; I suppose this is more than sufficient stack for intuition. X X STACK 2000 X X; Open the intuition library X X MOVEQ #Fatal,RETURN X MOVEQ #KickVerNum,D0 X LEA IntuitionName(PC),A1 X MOVE.L $4.W,A6 X CALL OpenLibrary X TST.L D0 X BEQ.S FatalExit X X; Request that the workbench be sent to front X X MOVEQ #Warn,RETURN X MOVE.L D0,A6 X CALL WBenchToFront X TST.B D0 X BNE.S Exit X X; Workbench closed, ask for the workbench to be opened X X CALL OpenWorkBench X TST.L D0 X BEQ.S WarnExit X X; Cleanup X XExit: X MOVEQ #OK,RETURN XWarnExit: X MOVE.L A6,A1 X MOVE.L $4.W,A6 X CALL CloseLibrary XFatalExit: X MOVE.L RETURN,D0 X RTS X X; Strings X XIntuitionName: X DC.B 'intuition.library',0 X CNOP 0,2 X X END END_OF_FILE if test 799 -ne `wc -c <'WBTF/WBTF.asm'`; then echo shar: \"'WBTF/WBTF.asm'\" unpacked with wrong size! fi # end of 'WBTF/WBTF.asm' fi if test -f 'WBTF/WBTF.man' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'WBTF/WBTF.man'\" else echo shar: Extracting \"'WBTF/WBTF.man'\" \(735 characters\) sed "s/^X//" >'WBTF/WBTF.man' <<'END_OF_FILE' X XNAME X WBTF - switch Workbench to front X X XSYNOPSIS X WBTF X X XREQUIREMENTS X none X X XDESCRIPTION X WBTF tries to switch the WorkBench screen to the front. If it X fails, because the WBscreen has been closed by some program, X it will try to reopen the WorkBench. X WBTF returns returncode 0 when it succeeds, and returncode X 5 when the WorkBench could not be reopened. X X XEXAMPLES X Place WBTF in your 'Shell-Startup' script. If you use a hot-key X utility like DMouse, the WorkBench screen should pop upfront X whenever you hot-key-open a shell. X X XBUGS/LIMITATIONS X The WorkBench reopen feature is not very useful in the context X given by the example; For the Shell-Startup to execute, a shell X window, and therefore the WBscreen, has to be open. END_OF_FILE if test 735 -ne `wc -c <'WBTF/WBTF.man'`; then echo shar: \"'WBTF/WBTF.man'\" unpacked with wrong size! fi # end of 'WBTF/WBTF.man' fi if test -f 'WBTF/WBTF.uu' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'WBTF/WBTF.uu'\" else echo shar: Extracting \"'WBTF/WBTF.uu'\" \(208 characters\) sed "s/^X//" >'WBTF/WBTF.uu' <<'END_OF_FILE' Xbegin 644 WBTF XM```#\P`````````!```````````````6```#Z0```!9@"DK\```'T`````!T* XM%'`?0_H`,BQX``1.KOW82H!G('0%+$!.KOZJ2@!F"$ZN_RY*@&<"=``B3BQX! XB``1.KOYB(`).=6EN='5I=&EO;BYL:6)R87)Y```````#\BY*X X`` Xend Xsize 124 END_OF_FILE if test 208 -ne `wc -c <'WBTF/WBTF.uu'`; then echo shar: \"'WBTF/WBTF.uu'\" unpacked with wrong size! fi # end of 'WBTF/WBTF.uu' 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.