{$V-} Program Print_Help; { This program prints ZCPR V3.0 Help files on your printer. It will strip off the eigth bit on help files processed by WordStar (TM micropro) and recurse down the help tree to get all of the files. If you define BF_On and BF_Off the portions of the help file in standout mode (ie preceeded by ^A and trailed by ^B) will be printed in with those two strings surrounding them. Written By: Chuck McManis, August 16th 1985 Do with it what you will but don't ask me to support your changes. } Const MaxHelp = 16; { (* I use these for the Mannesmann Tally 160L *) BF_On = ^['[=z'; (* Turn on Enhanced Print (BoldFace) *) BF_Off = ^['[>z'; (* Turn off Enhanced Print (Boldface) *) Lst_Init = ^['[1y'^['[5y'; (* Initialization String *) Lst_Exit = ^['[0y'^['[4w'; (* Deinitialization String *) UL_On = ^['[4m'; (* Start Underlining Characters *) UL_Off = ^['[0m'; (* Stop Underlining Characters *) } Lst_Init = ''; (* Initialization String *) Lst_Exit = ''; (* Deinitialization String *) BF_On = ''; BF_Off = ''; UL_On = ''; UL_Off = ''; Page_Length = 66; (* Define these for your printer *) CanFormFeed = False; Left_Margin = 4; Bottom_Margin = 5; TabWidth = 8; Type AnyString = String[255]; Var Line_Buf, Header : AnyString; Helpfiles : Array [0..MaxHelp] of Text; Page_Num,Current_Line,CurFile, I, J, K : Integer; HelpFileName, TempName : String[20]; HasType : Boolean; { Getfile will check the CP/M Command line to see if the user typed a filename after the command that invoked us, if not a filename will be specifically asked for. } Procedure GetFile; Begin For I := 1 to 15 do HelpFileName[I] := ' '; If (Mem[$80]=0) or (Mem[$80]=$FF) Then Begin Write('Enter Help file to print : '); Readln(HelpFileName); End Else Begin For I := 1 to Mem[$80] Do HelpFileName[I] := Chr(Mem[I+$80]); HelpFileName[0] := Chr(Mem[$80]); End; Assign(HelpFiles[0],HelpFileName); Reset(HelpFiles[0]); Writeln('Printing Help file ',HelpFileName:Length(HelpFileName)); End; (* GetFile *) { This function does two things, first it checks to see if the input character was a ^A (Boldface ON) or ^B (Boldface OFF) control, and if it is replace it with the appropriate escape sequence. Second, if it is a character it inserts enough spaces to emulate the tab and throws the tab away. } Function Format(Our_String : AnyString) : AnyString; Var I, Column : Integer; Tmp_string : AnyString; New_Char : Char; Begin Column := 0; Tmp_String := ''; For I := 1 to Length(Our_String) do Begin Case Our_String[I] of ^A : Tmp_String := Tmp_String + BF_On; ^B : Tmp_String := Tmp_String + BF_Off; ^I : Begin Repeat Tmp_String := Tmp_String + ' '; Column := Column + 1; Until ((Column Mod TabWidth) = 0); End; Else Begin Tmp_String := Tmp_String + Our_String[I]; Column := Column + 1; End; End; (* Case *) End; (* For Loop *) Format := Tmp_String; End; { This routine gets data from the file. Since a lot of the help files have been created using Wordstar (TM MicroPro) They have bit 7 set on some characters. This can really confuse Turbo so this routine fills in for what Readln should really be able to do. It gets single characters and masks off Bit 7, then (if it detects a ) it passes it on to the main code. } Procedure GetLine(Var Line : AnyString); Var Next_Chr : Char; Done : Boolean; Begin Line := ''; Done := False; Repeat Read(HelpFiles[CurFile],Next_Chr); If Eoln(Helpfiles[CurFile]) Then Begin Readln(HelpFiles[CurFile]); Done := True; End; Next_Chr := Chr(Ord(Next_Chr) And $7F); If Next_Chr = ^M then Begin Done := True; Read(HelpFiles[CurFile],Next_Chr); { Eat the Line feed } End Else If (Next_Chr <> ^J) And (Next_Chr <> ^L) Then Line := Line + Next_Chr; Until Done or Eof(HelpFiles[CurFile]); End; { Advance Printer to the Next Page. This actually advances the printer and Prints the header. The header is composed of either the file name or the latest information section that was processed. If you have set CanFormFeed to FALSE above it will fake a form feed by printing enough characters to make up a page. } Procedure Form_Feed; Begin If CanFormFeed Then Writeln(LST,^L) Else While (Current_Line Mod Page_Length) <> 0 do Begin Writeln(LST); Current_Line := Current_Line + 1; End; Current_Line := 4; Writeln(LST); Writeln(LST,' ':Left_Margin,Header,' ':60-(Length(Header)+Left_Margin), 'Page ',Page_Num:3); Writeln(LST); Writeln(LST); Page_Num := Page_Num + 1; End; { Print a line to the printer and add in the leftmargin if defined above. The purpose of the left margin is to skip over holes in the paper that allow the sheets to be stored in a 3 ring binder. } Procedure Print(Line : AnyString); Begin Writeln(LST,' ':Left_Margin,Line); Current_Line := Current_Line + 1; If (Current_Line Mod (Page_Length - Bottom_Margin)) = 0 Then Form_Feed; End; { * * * * - - M A I N C O D E - - * * * * } Begin GetFile; CurFile := 0; Page_Num := 1; Current_Line := 0; Write(LST,Lst_Init); Header := 'Helpfile ' + HelpfileName; Form_Feed; Repeat If Eof(HelpFiles[CurFile]) Then Begin Close(HelpFiles[CurFile]); CurFile := CurFile - 1; If CurFile = -1 Then CurFile := 0; End Else GetLine(Line_Buf); Line_Buf := Format(Line_Buf); If Length(Line_Buf) = 0 Then Print('') Else Begin If Line_Buf[1] = ':' Then Begin J := 0; For I := 2 to Length(Line_Buf) do If (Line_Buf[I] = ':') And (J = 0) Then J := I; If J <> 0 Then Begin CurFile := CurFile + 1; HelpFileName := Copy(Line_Buf,J+1,20); HasType := False; For I := 1 to Length(HelpFileName) do If HelpFileName[I] = '.' Then HasType := True; If Not HasType Then HelpFileName := helpfilename + '.HLP'; Writeln('Opening file "',HelpFileName,'"'); Assign(HelpFIles[Curfile],HelpFIlename); Reset(HelpFiles[CurFile]); Header := 'Subfile ' + HelpFileName; Form_Feed; End (* If : J <> 0 *) Else Begin Header := Copy(Line_Buf,2,40); Print(''); Print(UL_On+Header+UL_Off); Print(''); End; (* Else : Line_Buf[2] = ':' *) End (* If Line_Buf[1] = ':' *) Else Begin If Line_Buf <> ^L Then Print(Line_Buf); End; (* Else *) End; (* Else : Length > 0 *) Until (CurFile = 0) And (Eof(HelpFIles[0])); Writeln(LST,Lst_Exit); End.