page%swap@Sun.COM (Bob Page) (05/19/89)
Submitted-by: neabbs!amichel@nluug.nl Posting-number: Volume 89, Issue 148 Archive-name: printers/printfx.1 [uuencoded executable included. I had to mung the 'execute.me' file to get the lines less than 80 characters long. You'll have to re-join them. ("blinkers on"?) ..bob] # This is a shell archive. # Remove anything above and including the cut line. # Then run the rest of the file through 'sh'. # Unpacked files will be owned by you and have default permissions. #----cut here-----cut here-----cut here-----cut here----# #!/bin/sh # shar: SHell ARchive # Run the following text through 'sh' to create: # Notice # _main.a # an # cst.a # execute.me # explain.a # offswitch.a # printfx.c # printfx.doc # printfx.n # printfx.uu # stoi.c # This is archive 1 of a 1-part kit. # This archive created: Thu May 18 11:43:17 1989 echo "extracting Notice" sed 's/^X//' << \SHAR_EOF > Notice XOn your own risk you may do what you like with this code. It's PD. D.Reisig. SHAR_EOF echo "extracting _main.a" sed 's/^X//' << \SHAR_EOF > _main.a X X XEOL equ $0a CLI command activator X X xdef __main X X csect text,0,0,1,2 any xref's after this are 16-bit reloc X X xref _main Name of C program to start with. X X__main: movem.l d2/d3/a2,-(a7) X X*** insert terminators, get pointers, find argc X move.l a7,a2 keep stackpointer X move.l 16(a7),a0 get begin X lea.l 0(a7),a1 remember first argv for reverse action X moveq.l #0,d3 argc (program name) X XSrcNSp move.b (a0),d0 search *argv X cmp.b #' ',d0 spaces are delimiters X bhi.s Found any printable but SP causes an *argv X bcs.s FinalT any control causes a leave loop XKillSp clr.b (a0)+ no spaces allowed X bra.s SrcNSp XFound cmp.b #'"',d0 entry embedded spaces? X beq.s SplFnd yes, special search action X move.l a0,-(a7) no, normal, push a *argv X addq.l #1,d3 ++argc XSrcSp cmp.b #' ',(a0) now search for end X beq.s KillSp end found, search next *argv X bcs.s FinalT very end found; leave X addq.l #1,a0 still inside argument, X bra.s SrcSp so keep searching for delimiter XSplFnd addq.l #1,a0 skip special entry code char X move.l a0,-(a7) push a *argv X addq.l #1,d3 ++argc XSrcSpl move.b (a0),d0 only '"' and '\0' are delimiters (EOL?) X beq.s FinalT very end found; leave X cmp.b #'"',d0 special delimiter? X beq.s KillSp yes, act like space found X cmp.b #EOL,d0 @ we look for EOL too X beq.s FinalT @ and leave on meeting it X addq.l #1,a0 no, still inside argument, X bra.s SrcSpl so keep searching for delimiter XFinalT clr.b (a0) now, here is my story: X X* If the command line does not contain any embedded space arguments, X* FinalTerm deletes the closing control, normally a LF. However, you are X* allowed to embed all controls but '\0' in embedded space arguments. If X* you do not close this argument with '"', but instead gives an EOL, this X* EOL takes part of this argument. In this version, we leave the loop on X* finding it. (@) X X*** The argv-array is in reversed order, so do something about it X move.l a7,a0 get begin, end is already in a1 X move.l d3,d2 get number of pointers X lsr.l #1,d2 argc/2 we exchange two at a time X bra.s XPtrs1 XXPtrs0 move.l -(a1),d0 X move.l (a0),d1 X move.l d0,(a0)+ X move.l d1,(a1) XXPtrs1 dbra d2,XPtrs0 X X*** For some reasons its nice to have a long aligned stackpointer. X move.l a7,d1 argv X move.l a7,d0 prepare for long line up X lsr.l #2,d0 we look for a carry X bcc.s LongAl already long X subq.l #2,a7 make a7 long aligned XLongAl move.l d1,-(a7) push *argv[] X move.l d3,-(a7) push argc X jsr _main(pc) Our main is NOT void! X move.l a2,a7 restore stackpointer X movem.l (a7)+,d2/d3/a2 X rts X X end X SHAR_EOF echo "extracting an" sed 's/^X//' << \SHAR_EOF > an X.* X.* Macro package for NRO in KosmoSoft version X.* X.nr h 5 @" header indent X.nr i 10 @" normal text indent X.nr s @ni-@nh @" section heading indent (to the LEFT) X.* X.de TH X.in @nh;.rm 80-@nh;.he |$0($1)|$2|$0($1)| X.fo |$3|-#-|$4| X.in @ni;.rm 80-@ni X.ta +0 +5 X.en X.* Paragraph X.de PP X.sp 1;.ne 2;.ti +5 X.en X.* Bulleted Paragraph. Needs .RE after last para. X.* Must be last on line. Relies on first tab stop. X.de BP X.br;.in @ni+5;.ti -3;o@t@@ X.en X.* Section Heading X.de SH X.sp 1;.ne 3;.ti -@@ns;.bo "$0 $1 $2 $3 $4 $6 $6 $7 $8 $9 X.br X.en X.* SubSection X.de SS X.br;.ne 2;.ti -@@ns+1/2;$0 $1 $2 $3 $4 $5 $6 $7 $8 $9 X.br X.en X.* Relative indent Start X.de RS X.in +0$0 X.en X.* Relative indent End X.de RE X.in @ni X.en X.* Italics X.de I X.it 1 X$0 $1 $2 $3 $4 $5 $6 $7 $8 $9 X.en X.* Bold X.de B X.bo 1 X$0 $1 $2 $3 $4 $5 $6 $7 $8 $9 X.en X.* Underline X.de U X.ul 1 X$0 $1 $2 $3 $4 $5 $6 $7 $8 $9 X.en X.* UC X.de UC X.* Empty X.en X.* Italics and Roman X.de IR X.if !''$0' .it "$0 X.if !''$1' $1 X.if !''$2' .it "$2 X.if !''$3' $3 X.if !''$4' .it "$4 X.if !''$5' $5 X.if !''$6' .it "$6 X.if !''$7' $7 X.if !''$8' .it "$8 X.if !''$9' $9 X.en X.* Roman and Italic X.de RI X.if !''$0' $0 X.if !''$1' .it "$1 X.if !''$2' $2 X.if !''$3' .it "$3 X.if !''$4' $4 X.if !''$5' .it "$5 X.if !''$6' $6 X.if !''$7' .it "$7 X.if !''$8' $8 X.if !''$9' .it "$9 X.en X.* Bold and Roman X.de BR X.if !''$0' .bo "$0 X.if !''$1' $1 X.if !''$2' .bo "$2 X.if !''$3' $3 X.if !''$4' .bo "$4 X.if !''$5' $5 X.if !''$6' .bo "$6 X.if !''$7' $7 X.if !''$8' .bo "$8 X.if !''$9' $9 X.en X.* Bold and Italic X.de BI X.if !''$0' .bo "$0 X.if !''$1' .it "$1 X.if !''$2' .bo "$2 X.if !''$3' .it "$3 X.if !''$4' .bo "$4 X.if !''$5' .it "$5 X.if !''$6' .bo "$6 X.if !''$7' .it "$7 X.if !''$8' .bo "$8 X.if !''$9' .it "$9 X.en X.* Italic and Bold X.de IB X.if !''$0' .it "$0 X.if !''$1' .bo "$1 X.if !''$2' .it "$2 X.if !''$3' .bo "$3 X.if !''$4' .it "$4 X.if !''$5' .bo "$5 X.if !''$6' .it "$6 X.if !''$7' .bo "$7 X.if !''$8' .it "$8 X.if !''$9' .bo "$9 X.en X.* Italic and Roman X.de IR X.if !''$0' .it "$0 X.if !''$1' $1 X.if !''$2' .it "$2 X.if !''$3' $3 X.if !''$4' .it "$4 X.if !''$5' $5 X.if !''$6' .it "$6 X.if !''$7' $7 X.if !''$8' .it "$8 X.if !''$9' $9 X.en X.* SMall, do nothing X.de SM X$0 $1 $2 $3 $4 $5 $6 $7 $8 $9 X.en SHAR_EOF echo "extracting cst.a" sed 's/^X//' << \SHAR_EOF > cst.a X* X* C initial startup procedure under AmigaDOS X* Special stripped version !! X* X X INCLUDE "exec/types.i" X INCLUDE "exec/libraries.i" X INCLUDE "libraries/dos.i" X INCLUDE "libraries/dosextens.i" X INCLUDE "exec/funcdef.i" X INCLUDE "exec/exec_lib.i" X INCLUDE "libraries/dos_lib.i" X XAbsExecBase EQU 4 X X xdef _XCEXIT exit(code) is standard way to leave C. X X xref _LinkerDB linker defined base value X xref __BSSBAS linker defined base of BSS X xref __BSSLEN linker defined length of BSS X X csect text,0,0,1,2 any xref's after this are 16-bit reloc X X xref __main Name of C program to start with. X Xstart: X movem.l d1-d6/a0-a6,-(a7) XREGSIZE EQU (6+7)*4 X lea REGSIZE(a7),A5 determine old stack pointer X move.l a0,a2 save command pointer X move.l d0,d2 and command length X lea _LinkerDB,a4 load base register X X lea __BSSBAS,a0 get base of BSS X moveq #0,d1 X move.l #__BSSLEN,d0 get length of BSS in longwords X bra.s clr_lp and clear for length given Xclr_bss move.l d1,(a0)+ Xclr_lp dbf d0,clr_bss X X move.l AbsExecBase.W,a6 X move.l a6,_SysBase(A4) X move.l a7,__StackPtr(A4) Save stack ptr X X*------ get the address of our task X suba.l a1,a1 X jsr _LVOFindTask(a6) X move.l d0,a3 X X*------ are we running as a son of Workbench? X move.l pr_CurrentDir(A3),_curdir(A4) X tst.l pr_CLI(A3) X beq exit4 Not supported X X move.l a5,D0 Get top of stack X sub.l 4(a5),D0 compute bottom X move.l D0,__base(A4) save for stack checking X X*------ attempt to open DOS library: X lea DOSName(pc),A1 X moveq.l #0,D0 X jsr _LVOOpenLibrary(a6) X move.l D0,_DOSBase(A4) X bne.s DOSok X moveq.l #100,d0 X bra.s exit2 XDOSok X*------ find command name: X move.l pr_CLI(a3),a0 X add.l a0,a0 bcpl pointer conversion X add.l a0,a0 X move.l cli_CommandName(a0),a1 X add.l a1,a1 bcpl pointer conversion X add.l a1,a1 X X*------ collect parameters: X move.l d2,d0 get command line length X moveq.l #0,d1 X move.b (a1)+,d1 X move.l a1,__ProgramName(A4) X add.l d1,d0 add length of command name X addq.l #1,d0 allow for space after command X X clr.w -(A7) set null terminator for command line X addq.l #1,D0 force to even number of bytes X andi.w #$fffe,D0 *(round up) X sub.l D0,A7 make room on stack for command line X subq.l #2,D0 X clr.w 0(A7,D0) X X*------ copy command line onto stack X move.l d2,d0 get command line length X subq.l #1,d0 X add.l d1,d2 X Xcopy_line: X move.b 0(A2,D0.W),0(A7,D2.W) copy command line to stack X subq.l #1,d2 X dbf d0,copy_line X move.b #' ',0(a7,d2.w) add space between command and parms X subq.l #1,d2 X Xcopy_cmd: X move.b 0(a1,d2.w),0(a7,d2.w) copy command name to stack X dbf d2,copy_cmd X move.l A7,A1 X move.l A1,-(A7) push command line address X X lea.l Asterix(pc),a0 X move.l a0,d1 X move.l #MODE_OLDFILE,d2 X move.l _DOSBase(A4),a6 X jsr _LVOOpen(a6) X move.l d0,_ConOut(a4) X beq.s exit4 X Xmain jsr __main(PC) call C entrypoint X* moveq.l #0,d0 set successful status X bra.s exit2 X X X_XCEXIT: X move.l 4(SP),d0 extract return code Xexit2: X move.l d0,-(a7) X move.l __ONEXIT(A4),d0 exit trap function? X beq.s exit3 X move.l d0,a0 X jsr (a0) X Xexit3 move.l _ConOut(a4),d1 X move.l _DOSBase(A4),a6 X jsr _LVOClose(a6) X Xexit4 move.l AbsExecBase.W,a6 X move.l _DOSBase(A4),a1 X jsr _LVOCloseLibrary(a6) close Dos library X XexitToDOS: X move.l (a7)+,d0 X movea.l __StackPtr(a4),SP restore stack ptr X movem.l (a7)+,d1-d6/a0-a6 X rts X XDOSName dc.b 'dos.library',0 XAsterix dc.b '*',0 X X*----------------------------------------------------------------------- X X csect __MERGED,1,,2,2 X X xref _DOSBase X X xdef _SysBase,_LoadAddress X xdef _curdir,__mbase,__mnext,__msize,__tsize X xdef __oserr,__OSERR,__FPERR,__SIGFPE,__ONERR,__ONEXIT,__ONBREAK X xdef __SIGINT,__ECS X xdef __ProgramName,__StackPtr,__base X xdef _ConOut X X_ConOut ds.l 1 X__base ds.l 1 base of stack X__mbase ds.l 1 base of memory pool X__mnext ds.l 1 next available memory location X__msize ds.l 1 size of memory pool X__tsize ds.l 1 total size? X__oserr equ * X__OSERR ds.l 1 X__FPERR ds.l 1 X__SIGFPE ds.l 1 X__SIGINT ds.l 1 X__ONERR ds.l 1 X__ONEXIT ds.l 1 X__ONBREAK ds.l 1 X__ECS ds.l 1 extended character set flag X_curdir ds.l 1 X_console_dev ds.l 1 X_SysBase ds.l 1 X_LoadAddress ds.l 1 program load address X__StackPtr ds.l 1 X__ProgramName ds.l 1 X X END X SHAR_EOF echo "extracting execute.me" sed 's/^X//' << \SHAR_EOF > execute.me ; These two lines were added for USENET/mail transmission. You must remove ; them, then join the lines that end in "0" with the text on their next line. remove this line and Xprintfx execute.me -l0p7 X; 89012345678901234567890 X123456789012345678901234 X; This should use one sheet of paper. 89012345678901234567890 X1234567890123456789012345 X; If not, you have to throw this program away 89012345678901234567890 X12345678901234567890123456 X; Or to adapt the source. I'm sorry. 89012345678901234567890 X123456789012345678901234567 X; 89012345678901234567890 X1234567890123456789012345678 X; 34567890123456789012345678901234567890123456789012345678901234567890 X12345678901234567890123456789 SHAR_EOF echo "extracting explain.a" sed 's/^X//' << \SHAR_EOF > explain.a X INCLUDE "exec/types.i" X INCLUDE "libraries/dos.i" X INCLUDE "libraries/dos_lib.i" X XNEWLINE equ $0a X X xdef _Explain,_ConMsg,_ErrMsg,StrLen,_strlen X X CSECT text,0,0,1,2 X X_Explain X tst.b _Er(a4) X beq.s Rtn X lea.l ExplMsg1(pc),a0 X bsr.s WrtCon X move.l _Pr(a4),a0 X bsr.s WrtCon X lea.l ExplMsg2(pc),a0 X bra.s WrtCon X_ConMsg X move.l 4(a7),a0 X bra.s WrtCon X_ErrMsg X tst.b _Er(a4) X beq.s Rtn X move.l _Pr(a4),a0 X bsr.s WrtCon X lea.l Colon(pc),a0 X bsr.s WrtCon X move.l 4(a7),a0 X bsr.s WrtCon X move.l 8(a7),a0 X bsr.s WrtCon X lea.l NewLine(pc),a0 X XWrtCon movem.l d2/d3,-(a7) X move.l a0,d2 X bsr.s StrLen X move.l d0,d3 X move.l _ConOut(a4),d1 X move.l _DOSBase(a4),d6 X jsr _LVOWrite(a6) X movem.l (a7)+,d2/d3 XRtn rts X X_strlen move.l 4(a7),a0 XStrLen moveq.l #-1,d0 XCount addq.l #1,d0 X tst.b (a0)+ X bne.s Count X rts X XExplMsg1 X dc.b 'Syntax: ',0 XExplMsg2 X dc.b ' [<source>]',NEWLINE X dc.b 'Function: initiate FX-80+ printer and print file ',NEWLINE X dc.b 'Options:',NEWLINE X dc.b ' -s no output via stderr',NEWLINE X dc.b ' -l<i> left margin (5)',NEWLINE X dc.b ' -r<i> right margin (max)',NEWLINE X dc.b ' -x donot truncate',NEWLINE X dc.b ' -p<i> lines per page (auto)',NEWLINE X dc.b ' -n<i> linespace in dots/3 (29)',NEWLINE X dc.b ' -m<i> printer mode, overruling other settings (see manual)',NEWLINE X dc.b ' -q low height, superscript',NEWLINE X dc.b ' -el elite (default)',NEWLINE X dc.b ' -p pica',NEWLINE X dc.b ' -c condensed',NEWLINE X dc.b ' -en enlarged',NEWLINE X dc.b ' -em emphasized',NEWLINE X dc.b ' -d double strike',NEWLINE X dc.b ' -v variable pitch (proportional)',NEWLINE X dc.b ' -i<i> paperlength in inches (11)',NEWLINE X dc.b ' -ed paper end detection off',NEWLINE X dc.b ' -y donot adjust paper',NEWLINE X dc.b ' -t[<your special title>] print title',NEWLINE X dc.b ' -o output is standard',NEWLINE X dc.b 0 X XColon dc.b ': ',0 XNewLine dc.b NEWLINE,0 X X xref _Er,_ConOut,_DOSBase,_Pr X X X END X SHAR_EOF echo "extracting offswitch.a" sed 's/^X//' << \SHAR_EOF > offswitch.a X* Here three routines are defined: MakeOffswitch, TestOffSwitch and X* RemOffSwitch. They exist to replace the keyboard abort ^C by a kind of X* push button, labeled with the programname. So programs running in the X* background are easy reachable and you can/must use your own closing X* down. Must perhaps, because you MUST call RemOffSwitch before X* termination, otherwise the window exits forever and every push on the X* offswitch withdraws 56 bytes of the pool. X* MakeOffSwitch() may be used to make one window. Subsequent calls just X* return the (already existing) window pointer. X* X X* nolist X ifnd ifiles Xifiles set 1 X include "exec/types.i" X include "intuition/intuition.i" X endc X* list X XLEFT equ 640/2 Middle of the screen XTOP equ 0 XWIDTH equ 640/2 Half a screen XHEIGHT equ 10 Normal dragbar height X X xdef _MakeOffSwitch,MakeOffSwitch X xdef _TestOffSwitch,TestOffSwitch X xdef _RemOffSwitch,RemOffSwitch X X xref _LVOOpenLibrary X xref _LVOOpenWindow X xref _LVOGetMsg X xref _LVOReplyMsg X xref _LVOCloseWindow X xref _LVOCloseLibrary X X_AbsExecBase equ 4 X X csect OffSwitch,0,0,1,2 X X* X* From C: X* if (MakeOffSwitch(Title)!=NULL) /* then there is a window! */ X* else /* there is no window, but further no problem */ X* Title is a pointer to a '\0' terminated string. X* MakeOffSwitch returns a pointer to the Window structure. Ignore it X* or use it, perhaps to change the window. However you may not remove it. X* X* Intuition is opened, but when the OpenWindow fails, intuition is closed X* immediate. So if this routine returns NULL, it is not necesary to call X* RemOffSwitch, although this would cause no problem. X* X X_MakeOffSwitch: X move.l 4(a7),a0 XMakeOffSwitch: X move.l a0,Title(a4) Text in bar into NewWindow-$ X move.l a6,-(a7) Keep callers a6 X move.l Wind(a4),d0 See if there is already a window X bne.s QMOS Yes, return its pointer X move.l IBase(a4),d0 See if Intuition is already open X bne.s GotI X move.l _AbsExecBase,a6 Get Exec-function pointer X lea.l IntuName(pc),a1 "intuition.library" X moveq.l #0,d0 Any version is OK X jsr _LVOOpenLibrary(a6) Get Intuition library X move.l d0,IBase(a4) Keep for later X beq.s QMOS No intu; no window XGotI move.l d0,a6 Get intu pointer X lea.l NewWind(a4),a0 Get NewWindow structure X jsr _LVOOpenWindow(a6) Open a window X move.l d0,Wind(a4) Keep pointer, so we can close it X beq.s CloseI No window, Intu of no use XQMOS move.l (a7)+,a6 Restore callers a6 X rts X X* X* From C: X* if (TestOffSwitch()!=0) /* then close gadget was stirred */ X* else /* close gadged was passed */ X* This may be done more then once, the message is just passed. X* X* Even if there is no window, it is allowed to call this routine. X* Then it just returns zero. X* X X_TestOffSwitch: XTestOffSwitch: X move.l a6,-(a7) Keep callers a6 X move.l _AbsExecBase,a6 Get Exec-function pointer X move.l Wind(a4),d0 Get Window-$ X beq.s QTOS If none quit X move.l d0,a1 We need a member so use a-reg X move.l wd_UserPort(a1),a0 Get connection to our window X jsr _LVOGetMsg(a6) See if ther's a message X tst.l d0 non-zero is truly a message X beq.s QTOS zero means no message X move.l d0,a1 a1 is used to reply X move.l im_Class(a1),-(a7) Keep interesting part of mess X jsr _LVOReplyMsg(a6) Return message ownership X move.l (a7)+,d0 Get interesting part X cmp.l #CLOSEWINDOW,d0 We look only for closewindow X bne.s QZero If not we return zero XQTOS move.l (a7)+,a6 If true we return CLOSEWINDOW X rts X X* X* From C: X* RemOffSwitch(); /* removes the window */ X* X* Even if there was no window, it is allowed to call this routine. X* X X_RemOffSwitch: XRemOffSwitch: X move.l a6,-(a7) Save callers a6 X move.l IBase(a4),d0 Get key to intuition X beq.s QROS If none asume ready X move.l d0,a6 a6 is used to enter intuition X move.l Wind(a4),d0 Get window structure X beq.s CloseI If none close intuition X move.l d0,a0 A0 is parameter port X jsr _LVOCloseWindow(a6) Close our window X clr.l Wind(a4) Aint that nice? XCloseI move.l a6,a1 A1 is parameter port X move.l _AbsExecBase,a6 Get key to Exec X jsr _LVOCloseLibrary(a6) Close intuition X clr.l IBase(a4) There is NO intuition anymore.. XQZero moveq.l #0,d0 This routine always returns 0 XQROS move.l (a7)+,a6 Callers a6 X rts X XIntuName dc.b 'intuition.library',0 X X csect __MERGED,1,,2,2 X X*** The NewWindow structure X XNewWind dc.w LEFT,TOP,WIDTH,HEIGHT X dc.b -1,-1 X dc.l CLOSEWINDOW X dc.l WINDOWDRAG!WINDOWCLOSE!WINDOWDEPTH X dc.l 0,0 XTitle dc.l 0 X dc.l 0,0 X dc.w 0,0,0,0 X dc.w WBENCHSCREEN X XWind ds.l 1 XIBase ds.l 1 X X end SHAR_EOF echo "extracting printfx.c" sed 's/^X//' << \SHAR_EOF > printfx.c Xchar *Cr="PrintFx 2.7 09-MAY-89 by D.W.Reisig, NL 1151AV10\n"; Xchar *WTTl=" PrintFx 2.7 "; X X/* X XThis code is a good example how NOT to write a program. Then why Xdid I include the source? XThis is a utility that I made when I had the Amiga one month or so. XAnd I could not get my files to my printer without printing over Xthe perforation, or it stopped halfway the sheet when the printing Xwas done. Annyway I got irritated. XI have an Epson FX80+. I thought that made this program useless Xfor other printers. Suddenly the hole world can use it on their Xprinters as well. This is why I included the source. Perhaps it Xdoes not work on your printer. Now you can change it (if you can Xdecipher the code). XI used Lattice 5.02 and Asm 5.02 as compilers but 4.00 does it also Xfine. X X*/ X X X#include <libraries/dos.h> X#include <setjmp.h>> X#include <exec/types.h> X#include <intuition/intuition.h> X X#define CMDNAMES 1 /* one inputfile */ X#define ISM 64 /* init string max */ X#define IOBUFFER 512 /* twice allocated from the stack */ X#define RMARGINIT 255 /* means: not used */ X#define UNIT_INCH 216 /* there are 216 1/3 units in a inch */ X#define EOF -1 /* */ X#define ESC 0x1b /* */ X#define SKIPOVERA 198 /* skip-over space in 1/3 dots if back shift */ X#define SKIPOVERB 264 /* skip-over space if not shifted back */ X#define PERFSHIFT 54 /* paper shift back at start in 1/3 dots */ X#define ERROR -1 /* Used with longjump in an error situation */ X#define STOP 1 /* Used with longjump in a non error situation */ X Xjmp_buf Mains; /* easy does it */ Xchar DeinitPaper[]={ ESC,'J',PERFSHIFT,ESC,'C',0,0 } ; X#define DEINITLEN 7 /* size of DeinitPaper[] */ Xchar *Path[CMDNAMES+1]; Xchar *Title=NULL; /* title available */ Xint Infile; /* DOS file handler */ Xint Prt; /* DOS file handler */ Xint Page=0; /* printer determines pagelength */ Xint Lmarg=5; /* left margin */ Xint Rmarg=RMARGINIT; /* right margin not given */ Xint Cpline; /* will contain number of possible chars/line */ Xint Mode=64; /* 64=unused */ Xint Lsp=29; /* Linespace .13456" 3.41mm 82 l/p */ Xint Type=1; /* type is elite */ Xint Plen=11; /* paper length in inches */ Xint SpPTab=8; /* Spaces per Tab (make an option of it iyl */ Xchar *Pr; /* Name of this utility from cmdline */ Xchar Cond=0; /* not condensed */ Xchar Empha=0; /* not emphasized */ Xchar Double=0; /* not double strike */ Xchar Prop=0; /* not proportional */ Xchar Super=0; /* super script is off */ Xchar Trunc=1; /* truncation line overflow */ Xchar PlBack=1; /* paper is pulled back at start */ Xchar EndDet=1; /* paper end detection on */ Xchar OutStd=0; /* Output not standard; PAR: */ Xchar Let='\f'; /* last character send to printer, if it is FF, */ X /* no extra FF must be sent, and no FF if */ X /* nothing has been printed */ Xchar Er=1; /* stderr may be used */ X Xvoid ps(),ErrMsg(),Explain(); Xchar gc(); Xextern int ConOut; X X Xmain(argc,argv) Xregister int argc; Xregister char *argv[]; X{ X register int argcnt, namecnt, ret, err=0; X X Pr=argv[0]; /* adapt name the user uses */ X if (argc>1){ X if (*argv[1]=='?'){ X Explain(); X return(0); X } X } X for (argcnt=1,namecnt=0;argcnt<argc;++argcnt) if (*(argv[argcnt])!='-'){ X Path[namecnt++]=argv[argcnt]; X if (namecnt>CMDNAMES) break; X } X procopts(argc,argv); X if (namecnt>CMDNAMES){ X ErrMsg("Donot know what to do with: ",Path[CMDNAMES]); X return(0); X } X if (calc()) return(0); /* some things must be calculated */ X X if (Path[0]){ X if ((Infile=Open(Path[0],MODE_OLDFILE))==0){ X ErrMsg("Cannot open: ",Path[0]); X return(0); X } X } else Infile=Input(); X if (!OutStd){ X if ((Prt=Open("PAR:",MODE_OLDFILE))==0){ X ErrMsg("No printer (PAR:)",""); X goto CleanUp; X } X } else Prt=Output(); X ret=setjmp(Mains); /* return point from deep level errors */ X if (ret) goto CleanUp; X MakeOffSwitch(WTTl); /* nice to stop when you did RUN pr.. */ X X initprinter(); X filetoprinter(); X deinitprinter(); X goto CleanUp1; X XCleanUp: X if (ret==ERROR) err=IoErr(); X XCleanUp1: X RemOffSwitch(); X if (!OutStd) Close(Prt); X if (Path[0]) Close(Infile); X return(err); X} /* main */ X X Xprocopts(argc,argv) Xregister int argc; Xregister char *argv[]; X{ X register int argcnt; X register char *option, *error, avail; X int temp; X for (argcnt=1;argcnt<argc;++argcnt){ X if (*(option=argv[argcnt])=='-'){ X avail=1; X while (avail) switch(*(error=option++)){ X Xcase '-' : break; Xcase '\0' : avail=0; break; Xcase '?' : if (*option=='?') ConMsg(Cr); else Explain(); XCEXIT(0); Xcase 't' : Title =(*option=='=')?option+1:option; avail=0; break; Xcase 'i' : option+=stoi(option,&Plen); break; Xcase 'l' : option+=stoi(option,&Lmarg); break; Xcase 'r' : option+=stoi(option,&Rmarg); break; Xcase 'p' : option+=stoi(option,&temp); X if (temp==0) Type&=0xfe; X else Page=temp; X break; Xcase 'm' : option+=stoi(option,&Mode); break; Xcase 'n' : option+=stoi(option,&Lsp); break; Xcase 'c' : Type|=0x04; break; Xcase 'e' : switch(*(option++)){ X case 'd' : EndDet=0; break; X case 'l' : Type|=0x01; break; X case 'm' : Type|=0x08; break; X case 'n' : Type|=0x20; break; X default : goto opterr; X } Xcase 'd' : Type|=0x10; break; Xcase 'v' : Prop=1; break; Xcase 'x' : Trunc=0; break; Xcase 'y' : PlBack=0; break; Xcase 'o' : OutStd=1; break; Xcase 's' : Er=0; break; Xcase 'q' : Super=1; break; Xdefault : goto opterr; X X } } } return(0); Xopterr: X Explain(); X ErrMsg("Unknown option: -",error); X XCEXIT(0); X} /* procopts */ X X Xcalc() X{ X register int choose, avail; X register unsigned char *data; X if (Mode==64) Mode=Type; X data="\x50\x60\x28\x30\x89\xA0\x44\x50"; X choose=(int)Mode&0x05; /* b0 on is elite, b2 on is condensed */ X if (Mode&0x20) choose+=0x02; /* b1 on is enlarged */ X Cpline=(int)*(data+choose); X if (Rmarg!=RMARGINIT){ X if (Rmarg>Cpline){ X ErrMsg("Right margin too large",""); X return(-1); X } X } else Rmarg=Cpline; X Cpline=Rmarg-Lmarg; X avail=((Plen*UNIT_INCH)-((PlBack)?SKIPOVERA:SKIPOVERB))/Lsp; X if (Page){ X if (Page>avail){ X ErrMsg("You ask too much lines per page",""); X return(-1); X } X } else Page=avail; X return(0); X} X X Xinitprinter() X{ X char initstring[ISM]; X register char *is=initstring; X register int len; X X if (PlBack){ X *(is++)=ESC; *(is++)='j'; *(is++)=PERFSHIFT; X } X *(is++)=ESC; *(is++)='@'; X *(is++)=ESC; *(is++)='C'; *(is++)=0; *(is++)=Plen; X *(is++)=ESC; *(is++)='!'; *(is++)=Mode; X if (Prop) { *(is++)=ESC; *(is++)='p'; *(is++)='1'; } X *(is++)=ESC; *(is++)=EndDet?'9':'8'; X *(is++)=ESC; *(is++)='3'; *(is++)=Lsp; X if (Lmarg) { *(is++)=ESC; *(is++)='l'; *(is++)=Lmarg; } X *(is++)=ESC; *(is++)='Q'; *(is++)=Rmarg; X if (Super) { *(is++)=ESC; *(is++)='S'; *(is++)='0'; } X X len=is-initstring; X if (Write(Prt,initstring,len)!=len) longjmp(Mains,ERROR); X return(0); X} X X Xdeinitprinter() X{ X if (Let!='\f') if (Write(Prt,"\f",1)!=1) longjmp(Mains,ERROR); X if (PlBack){ X DeinitPaper[DEINITLEN-1]=Plen; /* FF button works ok now */ X if (Write(Prt,DeinitPaper,DEINITLEN)!=DEINITLEN) longjmp(Mains,ERROR); X } X return(0); X} X X X Xchar *Inb, *Outb; /* two buffer pointer global from here on */ X X Xfiletoprinter() X{ X char inbuffer[IOBUFFER], outbuffer[IOBUFFER]; /* from the stack */ X register int line, i; X register char c; X X Inb=inbuffer; Outb=outbuffer; X X i=Lmarg; X line=newpage(); X while (1){ X c=gc(); Xcheck: X if (c=='\t') i+=(SpPTab-((i-Lmarg)%SpPTab)); /* expand tabs */ X else ++i; X if (c=='\n'){ /* newline */ X i=Lmarg; X line=newline(line); X } else if (c=='\f'){ /* formfeed, newline inherent */ X i=Lmarg; X line=newpage(line); X } else if (i>Rmarg){ /* R-marge reached: newline */ X i=Lmarg; X line=newline(line); X if (Trunc) trunc(); /* skip rest of line */ X else goto check; /* no, print rest on next line */ X } else pc(c); X if (c==EOF) break; X } X return(0); X} X X Xnewline(line) Xregister int line; X{ X ++line; X if (line>=Page) line=newpage(); X else pc('\n'); X return(line); X} X X Xtrunc() X{ X char t; X while ((t=gc())>=0) if (t=='\n') break; X return(0); X} X X Xnewpage() X{ X static pagenr=0; X register out, factor, tpagenr, nr; X char ptd; X if ((pagenr)&&(Let!='\f')) ps("\r\f"); X ++pagenr; X if (Title){ X out=0; X ps("page "); out+=5; X for (tpagenr=pagenr,factor=1000,ptd=0;factor;factor/=10){ X if (nr=(tpagenr/factor)) ptd=1; X if (ptd){ X pc(nr+0x30); X ++out; X tpagenr-=(nr*factor); X } X } X for (;out<10;++out) pc(' '); X ps(Title); out+=strlen(Title); X factor=Cpline-strlen(Path[0])-Lmarg; X while (out++<factor) pc(' '); X ps(Path[0]); X ps("\n\n"); X return(2); /* now two lines used */ X } X return(0); /* no title; no lines used */ X} X X X Xchar gc() /* return a char, if buffer empty ask dos for more */ X{ X static avail=0, pos=0; X X if (avail==0){ X if ((avail=Read(Infile,Inb,IOBUFFER))<1){ X if (avail<0) longjmp(Mains,ERROR); X return(EOF); X } X pos=0; X } X --avail; X return(*(Inb+pos++)); X} /* gc */ X X Xvoid ps(string) Xregister char *string; X{ X while (*string) pc(*(string++)); X} X X Xpc(c) /* store a char, if buffer full, flush it */ Xchar c; X{ X static pos=0; X X if (c!=EOF){ X Let=*(Outb+pos++)=c; X if (pos<IOBUFFER) return(0); X } X if ((TestOffSwitch())||(SetSignal(0,0x3000)&0x3000)){ X deinitprinter(); X longjmp(Mains,STOP); X } X if (Write(Prt,Outb,pos)!=pos) longjmp(Mains,ERROR); X pos=0; X return(0); X} /* pc */ X SHAR_EOF echo "extracting printfx.doc" sed 's/^X//' << \SHAR_EOF > printfx.doc XPrintfx is written to control an Epson FX-80+. Back in 1986, I could not Xget my files printed in an easy way, so blinkers on and jam the code Xtogether. Recently my friends discovered the piece and suggessed that Xit might work on other printers as well. They reported positive. So here Xit is. Maybe it does not work properly on your printer. Don't blame me. XWell, I included the source, so perhaps... Use it a you like. X XNow I will descibe the switches. X X -? Give explanation how to use it. If this option is met X anywhere on the commandline, the only thing the program X does, is to give that explanation. X X -s no output via stderr X No error messages if you dont want them. X Is overuled by -? and -?? X X -l<i> left margin (5) X Default left margin is 5. Tabs are expanded without X including this value. A tab on colum 1 expands to X position 13 on the printer. X X -r<i> right margin (max) X Default is the last char that the FX-80+ can print X with the present pitch. X X -x donot truncate X Default is that lines longer than the right margin minus X the left margin are truncated. X X -p<i> lines per page (auto) X Default the maximum number of lines are printed on a X page, using the linespace as source. But you can select X to formfeed every pth line. X X -n<i> linespace in dots/3 (29) X This number is in 1/216th inch. Three of this units is X the vertical size of a dot. X X -m<i> printer mode, overruling other settings (see manual) X This is the value behind ESC!. Precede by '%' if you X give it in bynary, '$' if hex and '@' if octal. Donot X use it. X X -q low height, superscript X Now you can print a lot on a page! (27040 chars) Use it X together with -n=15 or 14 and -c. X X -el elite (default) X I do not know why printers use this this as default. I X never use pica. X X -p pica X If you are in a hurry use this ugly pitch. X X -c condensed X Narrows the characters. X X -en enlarged X Stretches the characters X X -em emphasized X I donot see difference with -d (And my profession is X printer!! (but perhaps a bad one)) X X -d double strike X Does something like emphasize. X X -v variable pitch (proportional) X Could be nice, but works only with that ugly pica. X X -i<i> paperlength in inches (11) X X -ed paper end detection off X Use this when you want to print a single sheet more than X only the upper half X X -y donot adjust paper X I like to start printing higher as normal, so the paper X is pulled back as much as possible. But this causes a jam X on a nonmodified FX-80+. You must fill the guide with those X two rolls with extra rolls. You can use 2 cm pieces of 8mm X high pressure tube. X X -t[<your special title>] print title X The path and page number are printed as well as your title, X if given. Use "" for titles with spaces: X "-t=your special title" Leave a space behind this option X and others. X X -o output is standard X Use this to sent the file to standard output instead of PAR: X X X XIf the printing job is done, the printer is left in the last used mode. XSo any text to PAR: is printed in the same pitch, same linespace, same Xskip over perforation, same margins. But without control. No trucation and Xno lines per page. (And no stop) XThe program will not be beware of changing printer settings inside your text, Xand may act strange if you do so. X XD.W.Reisig XWoudweeren 10 X1151 AV Broek in Waterland XHolland SHAR_EOF echo "extracting printfx.n" sed 's/^X//' << \SHAR_EOF > printfx.n X.so an X.TH PrintFX 1 "PrintFX manual" X.de cmd X!sp $1;!ne 2;!ti -5;!bo "$0 X.en X.SH NAME XPrintFX - EPSON compatible printer utility X X.SH HISTORY X XPrintfx is written to control an Epson FX-80+. Back in 1986, I could not Xget my files printed in an easy way, so blinkers on and jam the code Xtogether. Recently my friends discovered the piece and suggested that Xit might work on other printers as well. They reported positive. So here Xit is. Maybe it does not work properly on your printer. Don't blame me. XWell, I included the source, so perhaps... Use it a you like. X X.SH COMMAND LINE OPTIONS X X.in +8;.ta +0;.cc ! X!*--------------------------* X!cmd -? X@tGive explanation how to use it. If this option is met Xanywhere on the commandline, the only thing the program Xdoes, is to give that explanation. X!*--------------------------* X!cmd -n X@tno output via stderr XNo error messages if you don't want them. XIs overruled by -? and -?? X!*--------------------------* X!cmd -l<i> X@tleft margin (5) XDefault left margin is 5. Tabs are expanded without Xincluding this value. A tab on column 1 expands to Xposition 13 on the printer. X!*--------------------------* X!cmd -r<i> X@tright margin (max) XDefault is the last char that the FX-80+ can print Xwith the present pitch. X!*--------------------------* X!cmd -x X@tdonot truncate XDefault is that lines longer than the right margin minus Xthe left margin are truncated. X!*--------------------------* X!cmd -p<i> X@tlines per page (auto) XDefault the maximum number of lines are printed on a Xpage, using the linespace as source. But you can select Xto formfeed every pth line. X!*--------------------------* X!cmd -n<i> X@tlinespace in dots/3 (29) XThis number is in 1/216th inch. Three of this units is Xthe vertical size of a dot. X!*--------------------------* X!cmd -m<i> X@tprinter mode, overruling other settings (see manual) XThis is the value behind ESC!. Precede by '%' if you Xgive it in binary, '$' if hex and '@' if octal. Donot Xuse it. X!*--------------------------* X!cmd -q X@tlow height, superscript XNow you can print a lot on a page! (27040 chars) Use it Xtogether with -n=15 or 14 and -c. X!*--------------------------* X!cmd -el X@telite (default) XI do not know why printers use this as default. I Xnever use pica. X!*--------------------------* X!cmd -p X@tpica XIf you are in a hurry use this ugly pitch. X!*--------------------------* X!cmd -c X@tcondensed XNarrows the characters. X!*--------------------------* X!cmd -en X@tenlarged XStretches the characters X!*--------------------------* X!cmd -em X@temphasized XI don't see difference with -d (And my profession is Xprinter!! (but perhaps I'm a bad one)) X!*--------------------------* X!cmd -d X@tdouble strike XDoes something like emphasize. X!*--------------------------* X!cmd -v X@tvariable pitch (proportional) XCould be nice, but works only with that ugly pica. X!*--------------------------* X!cmd -i<i> X@tpaperlength in inches (11) X!*--------------------------* X!cmd -ed X@tpaper end detection off XUse this when you want to print a single sheet more than Xonly the upper half. X!*--------------------------* X!cmd -y X@tdonot adjust paper XI like to start printing higher as normal, so the paper Xis pulled back as much as possible. But this causes a jam Xon a nonmodified FX-80+. You must fill the guide with those Xtwo rolls with extra rolls. You can use 2 cm pieces of 8mm Xhigh pressure tube. X!*--------------------------* X!cmd -t X@t-t[<your special title>] prints your special title. XThe path and page number are printed as well as your title, Xif given. Use "" for titles with spaces: X"-t=your special title" Leave a space behind this option Xand others. X!*--------------------------* X!cmd -o X@toutput is standard XUse this to sent the file to standard output instead of PAR: X!*--------------------------* X!cc X.in -5;.PP X X.SH NOTES X XIf the printing job is done, the printer is left in the last used mode. XSo any text to PAR: is printed in the same pitch, same linespace, same Xskip over perforation, same margins. But without control. No trucation and Xno lines per page (and no stop). XThe program will not be beware of changing printer settings inside your text, Xand may act strange if you do so. X X.SH AUTHOR X XD.W.Reisig, XWoudweeren 10, X1151AV Broek in Waterland, XHolland. SHAR_EOF echo "extracting printfx.uu" sed 's/^X//' << \SHAR_EOF > printfx.uu X Xbegin 644 printfx XM```#\P`````````#``````````(```0*````B@````````/I```$"DCG?OY+# XM[P`T)$@D`$GY`````$'Y```!R'(`(#P````88`(@P5'(__PL>``$*4X`0"E/, XM`$B3R4ZN_MHF0"EK`)@`.$JK`*QG``"R(`V0K0`$*4``!$/Z`+QP`$ZN_=@IZ XM0`(D9@1P9&!Z(&L`K-'(T<@B:``0T\G3R2`"<@`2&2E)`$S0@5*`0F=2@`)`6 XM__Z?P%6`0G<(`"`"4X#4@1^R```@`%."4<C_]A^\`"`@`%."'[$@`"``4<K_J XM^")/+PE!^@!>(@@D/````^TL;`(D3J[_XBE```!G(DZZ`$9@!"`O``0O`"`L! XM`"QG!"!`3I`B+```+&P")$ZN_]PL>``$(FP")$ZN_F(@'RYL`$A,WW]^3G5D@ XM;W,N;&EB<F%R>0`J`$CG,"`D3R!O`!!#[P``=@`0$`P``"!B!F4T0AA@\@P`M XM`")G$"\(4H,,$``@9^QE'E*(8/12B"\(4H,0$&<0#```(F?6#```"F<$4HA@( XM[$(0($\D`^**8`@@(2(0(,`B@5'*__8B#R`/Y(AD`E6/+P$O`TZZ`M0N2DS?G XM!`Q.=0``2BP`T&=40?H`8F$T(&P"&&$N0?H`86`H(&\`!&`B2BP`T&<V(&P"E XM&&$60?H"E6$0(&\`!&$*(&\`"&$$0?H"ADCG,``D"&$8)@`B+```+"P")$ZN! XM_]!,WP`,3G4@;P`$</]2@$H89OI.=5-Y;G1A>#H@("``(%L\<V]U<F-E/ET*P XM1G5N8W1I;VXZ(&EN:71I871E($98+3@P*R!P<FEN=&5R(&%N9"!P<FEN="!F_ XM:6QE(`I/<'1I;VYS.@H)+7,);F\@;W5T<'5T('9I82!S=&1E<G(*"2UL/&D^7 XM"6QE9G0@;6%R9VEN("@U*0H)+7(\:3X)<FEG:'0@;6%R9VEN("AM87@I"@DM) XM>`ED;VYO="!T<G5N8V%T90H)+7`\:3X);&EN97,@<&5R('!A9V4@*&%U=&\IP XM"@DM;CQI/@EL:6YE<W!A8V4@:6X@9&]T<R\S("@R.2D*"2UM/&D^"7!R:6YTC XM97(@;6]D92P@;W9E<G)U;&EN9R!O=&AE<B!S971T:6YG<R`H<V5E(&UA;G5A_ XM;"D*"2UQ"6QO=R!H96EG:'0L('-U<&5R<V-R:7!T"@DM96P)96QI=&4@*&1E( XM9F%U;'0I"@DM<`EP:6-A"@DM8PEC;VYD96YS960*"2UE;@EE;FQA<F=E9`H)K XM+65M"65M<&AA<VEZ960*"2UD"61O=6)L92!S=')I:V4*"2UV"79A<FEA8FQE1 XM('!I=&-H("AP<F]P;W)T:6]N86PI"@DM:3QI/@EP87!E<FQE;F=T:"!I;B!I! XM;F-H97,@*#$Q*0H)+65D"7!A<&5R(&5N9"!D971E8W1I;VX@;V9F"@DM>0ED% XM;VYO="!A9&IU<W0@<&%P97(*"2UT6SQY;W5R('-P96-I86P@=&ET;&4^72`@; XM<')I;G0@=&ET;&4*"2UO"6]U='!U="!I<R!S=&%N9&%R9`H`.B``"@```$Y56 XM__!(YP\0+B\`+"9O`#!"K?_P*5,"&'`!OH!O%"!K``1P/[`09@I.NOT.<`!@" XM``$H?`%Z`+R';"8@!N6`(',(`'(MLA!G%"(%Y8%2A4/L`@0CB!@`<`&Z@&X$P XM4H9@UB\++P=A``#\4$]P`;J`;Q(O+`((2&P`TDZZ_-QP`&```-AA``,>2H!G, XM!G``8```RDJL`@1G*$AX`^TO+`($3KH*<%!/*4`"#$J`9AHO+`($2&P`\$ZZK XM_*!P`&```)Q.N@JX*4`"#$HL`,YF)DAX`^U(;`#^3KH*.E!/*4`"$$J`9AA(Q XM;`$62&P!!$ZZ_&I03V`P3KH*E"E``A!(;`'(3KH(_%A/*`!*A&88+RP`EDZZ7 XM"#QA``-(80`$@&$`!!183V`.</^X@&8(3KH*;BM`__!.N@B*2BP`SF8*+RP"] XM$$ZZ">Q83TJL`@1G"B\L`@Q.N@G<6$\@+?_P3.T(\/_<3EU.=4Y5_^Y(YP<P* XM+B\`+B9O`#)\`;R';``"!B`&Y8`D<P@`<"VP$F8``?!Z`4H%9P`!Z"M*__12Z XMBB!M__00$$B`<G)=06L``=RP>Q`(9O1.^Q`$`'%@``&X`'-@``&J`&]@``&:H XM`'E@``&,`'A@``%^`'9@``%N`&1@``%>`&5@``$.`&-@``#^`&Y@``#F`&U@[ XM``#.`'!@``">`')@``"&`&Q@``!N`&E@``!6`'1@```X`#]@```4``!@```(4 XM`"U@`/]J>@!@`/]D<#^P$F8,+RP`A$ZZ^QI83V`$3KKZ^D*G3KKZ,EA/<#VPZ XM$F8&0>H``6`"($HI2`"B>@!@`/\N2&P`OB\*3KH&)%!/U<!@`/\<2&P`JB\*S XM3KH&$E!/U<!@`/\*2&P`KB\*3KH&`%!/U<!@`/[X2&W_[B\*3KH%[E!/U<!*$ XMK?_N9@QP?]"`P:P`NF``_M@I;?_N`*9@`/[.2&P`LB\*3KH%Q%!/U<!@`/Z\[ XM2&P`MB\*3KH%LE!/U<!@`/ZJ".P``@"]8`#^H!`:2(!R&%U!:P``BK![$`AF' XM]$[[$`0`;F```"H`;6```!P`;&````X`9&````)"+`#-8!8([````+U@#@CL6 XM``,`O6`&".P`!0"]".P`!`"]8`#^3!E\``$`R6``_D)"+`#+8`#^.D(L`,Q@E XM`/XR&7P``0#.8`#^*$(L`-!@`/X@&7P``0#*8`#^%E*&8`#]^'``8!9.NOFTR XM+RW_]$AL`1A.NOG&0I=.NOC@3.T,X/_:3EU.=4CG(Q!P0+"L`+)F""`L`+HI% XM0`"R1^P!*GX%SJP`L@@L``4`M6<"5(=P`!`S>``I0`(4(BP`KG0`1@*R@F<6$ XMLH!O%DAL`4Q(;`$T3KKY:%!/</]@8"E``*X@+`"ND*P`JBE``A0@+`"^<FS2( XM@4ZZ!AQ*+`#,9P9R8]*!8`8B/````0B0@2(L`+9.N@8@+`!*K`"F9QH@+`"F- XML(9O%DAL`6Y(;`%.3KKY#E!/</]@!BE&`*9P`$S?",1.=4Y5_[A(YP$01^W_P XMP$HL`,QG#'`;%L`6_`!J%OP`-G`;%L`6_`!`%L`6_`!#0ALB+`"^%L$6P!;\@ XM`"$B+`"R%L%*+`#)9PH6P!;\`'`6_``Q%L`@2U*+2BP`S6<$<CE@`G(X$($6M XMP!;\`#,B+`"V%L%*K`"J9PP6P!;\`&PB+`"J%L$6P!;\`%$B+`"N%L%*+`#*B XM9PH6P!;\`%,6_``P(`M![?_`D(@N`"\'+P@O+`(03KH&3D_O``RPAV<.2'C_W XM_TAL`<A.N@3N4$]P`$S?"(!.74YU$"P`SW(,L`%G)DAX``%(;`%P+RP"$$ZZ( XM!A1/[P`,4X!G#DAX__](;`'(3KH$M%!/2BP`S&<N("P`OAE``*!(>``'2&P`; XMFB\L`A!.N@7@3^\`#%^`9PY(>/__2&P!R$ZZ!(!03W``3G5.5?OV2.<'`$'MC XM_@`I2`(<0>W\`"E(`B`L+`"J80``UBX`80`!SBH`<`FZ`&8:(`8B+`"JD($B/ XM+`#"3KH$>"`L`,*0@=R`8`)2AG`*N@!F$"PL`*HO!V$``%Y83RX`8$1P#+H`W XM9A`L+`"J+P=A``"&6$\N`&`NO*P`KF\:+"P`JB\'80``,EA/+@!*+`#+9YAA8 XM``!*8`X@!4B`2,`O`&$``<183PP%`/]F`/]X<`!,WP#@3EU.=2\'+B\`"%*'S XMOJP`IFT(80``+BX`8`I(>``*80`!DEA/(`<N'TYU+P=A``$2+@!*!VL&<`J^: XM`&;P<``N'TYU3E7_[DCG#P!*K`%R9Q00+`#/<@RP`6<*2&P!=F$``3183U*L9 XM`7)*K`"B9P``QGX`2&P!>F$``1Q83UJ'*BP!<BP\```#Z$(M_^]*AF=`(`4BB XM!DZZ`VPH`$J$9P9P`1M`_^]*+?_O9QH@!'(PT($O`&$``/Y83U*'(`0B!DZZY XM`R*:@"`&<@I.N@,X+`!@O'`*OH!L#DAX`"!A``#66$]2AV#L+RP`HF$``*HNW XMK`"B3KKV6-Z`+JP"!$ZZ]DY83R(L`A22@)*L`*HL`2`'4H>PAFP,2'@`(&$`/ XM`)A83V#L+RP"!&$``&Y(;`&`80``9G`"8`)P`$SM`/#_WDY=3G5*K`&$9CI(2 XM>`(`+RP"'"\L`@Q.N@.B3^\`#"E``81R`;"!;!9*@&H.2'C__TAL`<A.N@)4" XM4$]P_V`8<``I0`&(4ZP!A"!L`AS1[`&(4JP!B!`03G4O"R9O``A*$V<0$!M(D XM@$C`+P!A```*6$]@["9?3G4O!QXO``L,!P#_9R(@;`(@T>P!C%*L`8P@!Q"`` XM&4``SPRL```"``&,;`1P`&!>3KH!7DJ`9A9(>#``0J=.N@-N4$\"@```,`!*G XM@&<280#\YDAX``%(;`'(3KH!NE!/+RP!C"\L`B`O+`(03KH"]$_O``RPK`&,? XM9PY(>/__2&P!R$ZZ`9)03W``*4`!C"X?3G5.5?_N2.</,"9O`#(D;P`V>@`K3 XM2__N?`!*AF9*$!-R)+`!9@1\$&`Z<D"P`68$?`A@,'(EL`%F!'P"8"9R+;`!5 XM9@1Z`6`<<BNP`6<6<CVP`6<0<@FP`6<*<B"P`6<$4XM\"E*+8+)^`!@3<#FXK XM`&\,`@0`7W!!N`!M*%\$!`0`,&T@(`1(@$C`L(9L%B`'(@9.N@$.(@1(@4C!0 XMT($N`%*+8,9*A6<((`=$@"2`8`(DAR`+D*W_[DS?#/!.74YU```@;P`$*4@!+ XMJB\.("P!P&8J("P!Q&84+'@`!$/Z`()P`$ZN_=@I0`'$9Q`L0$'L`9!.KO\TU XM*4`!P&=0+%].=2\.+'@`!"`L`<!G(B)`(&D`5DZN_HQ*@&<4(D`O*0`43J[^^ XMAB`?#(````(`9BPL7TYU+PX@+`'$9R(L0"`L`<!G"B!`3J[_N$*L`<`B3BQX* XM``1.KOYB0JP!Q'``+%].=6EN='5I=&EO;BYL:6)R87)Y`"!O``1(Z/[^``0A[ XM;P````!P`$YU("\`"&8"4H`@;P`$3.C^_@`$+V@`````3G4``$CG,``D`"8!^ XM2$)(0\3!QL#`P=1#2$)"0M""3-\`#$YU2H!J```>1(!*@6H```Q$@6$``"!$S XM@4YU80``&$2`1(%.=4J!:@``#$2!80``!D2`3G4O`DA!-`%F```B2$!(04A"/ XM-`!G```&A,$P`DA`-`"$P3`"2$(R`B0?3G4O`W80#$$`@&0```;AF5%##$$(A XM`&0```;IF5E##$$@`&0```;EF55#2D%K```&XYE30S0`YJA(0D)"YJI(0X#!O XM-@`P`C0#2$'$P9""9```"%-#T(%D_G(`,@-(0^>X2$#!028?)!].=4CG(`(L7 XM>0```B1,[P`&``Q.KO_B3-]`!$YU```O#BQY```")"(O``A.KO_<+%].=4CGP XM,`(L>0```B1,[P`.`!!.KO_63-]`#$YU``!(YS`"+'D```(D3.\`#@`03J[_A XMT$S?0`Q.=0``+PXL>0```B1.KO_*+%].=2\.+'D```(D3J[_Q"Q?3G4O#BQY< XM```")$ZN_WPL7TYU+PXL>0```$!,[P`#``A.KO[.+%].=0`````#[`````H`B XM```!```0%```$`0```_T```/Y```#\H```^N```/F```#WX````4````#@``; XM``````/R```#Z@```'(`````````````````````````````````````````4 XM````````````````````````````````````````````````````````````` XM`````%!R:6YT1G@@,BXW("`P.2U-05DM.#D@8GD@1"Y7+E)E:7-I9RP@3DP@8 XM,3$U,4%6,3`*``````!0(%!R:6YT1G@@,BXW(`````"(&THV&T,`````````= XM``````````4```#_````0````!T````!````"P````@```````$!`0`,`0!$) XM;VYO="!K;F]W('=H870@=&\@9&\@=VET:#H@``!#86YN;W0@;W!E;CH@`%!!_ XM4CH``$YO('!R:6YT97(@*%!!4CHI````56YK;F]W;B!O<'1I;VXZ("T`4&`H# XM,(F@1%```%)I9VAT(&UA<F=I;B!T;V\@;&%R9V4`````66]U(&%S:R!T;V\@4 XM;75C:"!L:6YE<R!P97(@<&%G90````P```````T,``!P86=E(``*"@``````" XM`````````````4````%```K__P```@`````.````````````````````````: XM```````````````!``````````````/L`````@````$```"6````A```````- X/``/R```#Z0````````/R6 X`` Xend Xsize 4740 SHAR_EOF echo "extracting stoi.c" sed 's/^X//' << \SHAR_EOF > stoi.c X/* 01-12-86 by D.Reisig 1151AV 10 */ X Xstoi(cp,retval) /* convert bin, oct, dec or hex string */ Xregister char *cp; Xint *retval; X{ Xregister int value, base, neg=0; Xregister char digit; Xchar *hold; X hold=cp; X for (base=0;!base;++cp){ X if (*cp=='$') base=16; X else if (*cp=='@') base=8; X else if (*cp=='%') base=2; X else if (*cp=='-') neg=1; X else if ((*cp!='+')&&(*cp!='=')&&(*cp!='\t')&&(*cp!=' ')){ X --cp; X base=10; X } X } X for (value=0;;++cp){ X digit=*cp; X if (digit>'9'){ X digit&=0x5f; X if (digit<'A') break; X digit-=('A'-':'); X } X digit-='0'; X if ((digit<0)||(digit>=base)) break; X value=value*base+digit; X } X if (neg) *retval=-value; X else *retval=value; X return(cp-hold); /* return length of string involved */ X} X SHAR_EOF echo "End of archive 1 (of 1)" # if you want to concatenate archives, remove anything after this line exit