dos_compilers/Microsoft QuickBASIC v200/PPRINT.BAS
2024-07-01 10:35:17 -07:00

752 lines
23 KiB
QBasic

REM $Title:'Microsoft PPRINT- Formatted Print Utility'
REM $Subtitle:'Introduction'
'
' Microsoft PPRINT- Formatted Print Utility
' Copyright (C) Microsoft Corporation - 1986
'
' This program is designed to format QuickBASIC source files that include
' the formatting metacommands found in QuickBASIC V1.00 and earlier
' Microsoft BASIC Compilers.
'
' The Metacommands processed by PPRINT are:
'
' TITLE: 'title' Prints 'title' at the top of each page
' SUBTITLE: 'subtitle' Prints 'subtitle' below the title area
' LINESIZE:n Sets output line width to n
' PAGESIZE:n Sets the output page size to n
' PAGE Skips to next page
' PAGEIF:n Skips to next page if there are fewer than n
' lines left on current page
' SKIP[:n] Skips n lines or to top of next page
' LIST- Turns OFF output of lines
' LIST+ Turns ON output of lines
'
'
' USAGE: The PPRINT Utility has the following usage:
'
' PPRINT InputFile, [OutputFile]
'
' If the OutputFile is ommitted, LPT1: is the default
'
' COMPILATION:
'
' Since the PPRINT utility is distributed in source form (PPRINT.BAS)
' You must compile it before using. Suggested compilation procedures are
' as follows:
'
' 1) Load PPRINT.BAS into the QuickBASIC editor
' 2) Select "Compile..." from the RUN Menu
' 3) Select ".EXE" from the output options section
' 4) press the "Compile" button or press return
'
' These 4 steps should create a file PPRINT.EXE on your default
' drive.
'
' REVISION HISTORY:
'
' 12/1/86- GEL - Fixed TARs # 57720 & 56937
'
rem $subtitle:'Global Declarations'
rem $page
DEFINT a - z
DIM KeyWordCount, LineCount, Seps$
DIM KeyBoard, Console
DIM InputFile$, OutputFile$
DIM Temp$,x ' temp variables
'
' global variables for handling metacommands
DIM Out.Title$, Out.Subtitle$, MetaCommand.On
DIM Out.LineSize, Out.Pagesize, Out.List, Out.LineCount, Out.BlankBottom
DIM Out.PageNum
REM $subtitle:'FnToUpper- Converts To Uppercase'
rem $page
'
' FNToUpper$ - Convert string to uppercase
' Description:
' This routine converts a string to uppercase. If already uppercase
' nothing is done. Returns a null string if input is null
' Input:
' InString$ - string to convert
' Output:
' FNToUpper$ - uppercase string
Def FNToUpper$(InString$)
static LenInString, AscChar, Index, IndexInString
LenInString = len(InString$)
' Exit if input string is empty (null)
if (LenInString = 0) then
FNToUpper$ = ""
Exit Def
end if
for IndexInstring = 1 to LenInString
AscChar = asc(mid$(InString$, IndexInstring, 1))
' &hdf is special bit pattern that converts from lower to upper
if ((AscChar >= asc("a")) and (AscChar <= asc("z"))) then
AscChar = AscChar and &hdf
mid$(InString$, IndexInstring, 1) = chr$(AscChar)
end if
next IndexInString
FNToUpper$ = InString$
End Def
rem $subtitle:'FnTabsToBlanks- Converts TABs to Blanks'
rem $page
'
' FnTabsToBlanks- turns TABs into blanks in the given string
'
' Input: Source$
' Output Source$ with ALL TABs as 3 Blanks
' Note: If TABs are set at a value different from 3, change the following
' procedure in the 'Then' part of the IF statement
'
DEF FNTabsToBlanks$(source$)
STATIC Temp$,i
Temp$ = ""
If Instr(Source$, Chr$(9)) = 0 Then FnTabsToBlanks$ = Source$: Exit Def
For i = 1 to Len(source$)
If ASC(Mid$(Source$,i,1)) = 9 Then
Temp$ = Temp$ + Space$(3) ' replace with 3 spaces
Else
Temp$ = Temp$ + Mid$(source$,i,1)
End If
Next i
FnTabsToBlanks$ = Temp$
End Def
rem $subtitle:'FnStrSpn- String Spanner'
rem $page
'
' FNStrSpn - Get the index of the first character within InString$ that is
' NOT one of the characters from Separater$
' Description:
' This routine will search the parameter string InString$ until it finds
' a character that is not part of the Separater string. This can be used
' with FNStrBrk to isolate strings within strings that are separated by
' blanks, comma etc. whatever is specified in Separater$. This is especially
' helpful in extracting parameters from the command line. See FNGetToken$
' for example of use.
'
' Input:
' InString$ = string to search
' Separater$ = string of Separater
'
' Output:
' FNStrSpn = index into InString$ if 0 then all character in Separater$
' are in InString$
Def FNStrSpn(InString$, Separater$)
static LenInString, LenSeparater, StartFound, IndexSeparater, IndexInString
static ChTemp$
LenInString = Len(InString$)
LenSeparater = Len(Separater$)
' Examine each character from InString$ to see if it is in Separater$
for IndexInString = 1 to LenInString
ChTemp$ = Mid$(InString$, IndexInString, 1)
StartFound = false
' search all of the Separaters to see of any equal this character
for IndexSeparater = 1 to LenSeparater
if (ChTemp$ = Mid$(Separater$, IndexSeparater, 1)) then
goto NextChar
end if
next IndexSeparater
' found a character not equal to one of the Separaters$
' exit from loops
StartFound = true
goto EndStrSpn
NextChar:
Next IndexInString
EndStrSpn:
if (StartFound) then
FNStrSpn = IndexInString
else
FNStrSpn = 0
end if
End Def
rem $subtitle:'FnStrBrk- String Breaker'
rem $page
'
' FNStrBrk - finds the first occurance of any character in string2$ in
' string1$
' Description:
' This routine is the opposite to FNStrSpn. It finds the first occurance
' of one of the characters from String2$ within String$. It is used
' generally for search from specific strings within strings. See FNSeparater
' on use. See FNGetToken$ to see the routines in use.
'
' Input:
' string1$ = string to search for first occurance
' string2$ = string of characters to search for
' Output:
' FNStrBrk = index to character in string1$ of first occurance
'
' Uses:
' LenString1 = length parameter string
' ChTemp$ = temp used for current character from String1$
' IndexString1 = current indices into parameter string
'
Def FNStrBrk(String1$, String2$)
static LenString1, IndexString1, StartFound
static ChTemp$
LenString1 = Len(String1$)
' Search String1$ until one of the characters from String2$ is found
' or run out of characters from String$2
for IndexString1 = 1 to LenString1
ChTemp$ = Mid$(String1$, IndexString1, 1)
if (instr(String2$, ChTemp$)) then
StartFound = true
FNStrBrk = IndexString1
Exit Def
end if
Next IndexString1
FnStrBrk = 0
End Def
rem $subtitle:'FnGetToken- Gets a Token'
rem $page
'
' FNGetToken$ - Extract a token for a string.
' Description:
' This routine extracts tokens from strings. A token is a word that is
' surrounded by separaters, such as spaces or commas. It is usually the
' word of interest and examining sentences or commands. If the string
' to search for tokens "Search$" is null (.i.e "") then the last
' non-null string passed will be used. The allows for multiple calls
' to FNGetToken$ to move through the string. EG: The sequences of calls
' would be:
' token$ = FNGetToken$("token string, a short one", " ,")
' while (token$ <> "")
' print token$
' token$ = FNGetToken$("", " ,")
' wend
' This will return "token", "string", "a", "short", "one"
'
' Note that the token is returned as an Uppercase character string.
'
' Input:
' Search$ = string to search
' InSeps$ = String of Seps$
' Output:
' FNGetToken$ = next token
' Uses:
' TokenString$ = last non-null string passed as parameter (do not modify)
' TokenIndex2 = index to last separater (do not modify)
'
def FNGetToken$(Search$, InSeps$)
static TokenIndex1
' Null strings indicate use of last string used
' TokenString$ is set to last string if Search$ is not null
if (Search$ = "") then
Search$ = TokenString$
else
TokenIndex2 = 1
TokenString$ = Search$
end if
' If last separater position is past end of search string then no more
' tokens can be in string, since searching is started from this position
' Exit with null return in this case
if (TokenIndex2 >= len(Search$)) then
FNGetToken$ = ""
Exit Def
end if
' Section out a token from the search string. This is done by finding the
' start of a token then locating it's end by the start of separaters
TokenIndex1 = FNStrSpn(mid$(Search$, TokenIndex2, len(Search$)), InSeps$)
' If no more token bump to end of line so we move past current point
if (TokenIndex1 = 0) then
TokenIndex1 = len(Search$)
else
TokenIndex1 = TokenIndex1 + TokenIndex2 - 1
end if
TokenIndex2 = FNStrBrk(mid$(Search$, TokenIndex1, len(Search$)), InSeps$)
' If separater position (end of token) came back zero the token must be
' up against end of string. Set the separater position one past string
' length so that size of token computation is correct and next call
' with same string will return null for no more tokens
if (TokenIndex2 = 0) then
TokenIndex2 = len(Search$) + 1
else
TokenIndex2 = TokenIndex1 + TokenIndex2 - 1
end if
' Cut out token from search string and convert to uppercase.
' It is converted to uppercase since string compares are case sensitive
FNGetToken$ = mid$(Search$,TokenIndex1,TokenIndex2 - TokenIndex1)
end def
rem $subtitle:'FnIsNumber- Is a Number?'
rem $page
'
' FNIsNumber - Checks to see if character a number or alpha
' Description:
' This routine returns true if character passed is in the range 0 - 9
' It returns false if not. It is used to tell wither a token is
' a number or alpha.
' Input:
' Char - character to check
' Output:
' FNIsNumber - true if within 0 - 9
'
def FNIsNumber(Char$)
static CharAsc
if (Char$ = "") then
FNIsNumber = false
else
CharAsc = asc(Char$)
FNIsNumber = ((CharAsc >= asc("0")) and (CharAsc <= asc("9")))
end if
end def
rem $subtitle:'FnIsChar- Is a character?'
rem $page
def FNIsChar(Char$)
static CharAsc
CharAsc = asc(Char$)
FNIsChar = ((CharAsc >= asc("A")) and (CharAsc <= asc("z")))
end def
rem $subtitle:'FnIsKeyword- Is a Keyword?'
rem $page
' FNIsKeyWord - returns true if specified string is a BASIC key word
' Description:
' Checks keyword list agains String$, non-zero return if keyword
'
def FNIsKeyWord(Key$)
static KeyWord$, AscCh, t
if (len(Key$) > 0) then
t = asc(key$)
while t < 33 AND Key$ <> "" ' strip off all spaces and below
key$= mid$(key$,2)
If key$ <> "" then t = asc(key$) Else FNIsKeyword=0: Exit Def
wend
Key$ = FNToUpper$(Key$)
AscCh = (asc(Key$) - asc("A") + 1)
if ((AscCh >= 0 ) and (AscCh <= 24)) then
on (AscCh) gosub AKey, BKey, CKey, DKey, EKey, FKey, GKey, HKey, _
IKey, JKey, KKey, LKey, MKey, NKey, OKey, PKey, _
QKey, RKey, SKey, TKey, UKey, VKey, WKey, XKey, _
YKey, ZKey
read KeyWord$
while (KeyWord$ <> "")
if (KeyWord$ = Key$) then
FNIsKeyWord = TRUE
exit def
end if
read KeyWord$
wend
end if
end if
FNIsKeyWord = FALSE
exit def
AKey:
DATA ABS, AND, APPEND, AS, ASC, ATN, AUTO, ""
restore AKey: return
BKey:
DATA BEEP, BLOAD, BSAVE, ""
restore BKey: return
CKey:
DATA CALL, CALLS, CDBL, CHAIN, CHDIR, CHR$, CINT, CIRCLE, CLEAR
DATA CLOSE, CLS, COLOR, COM, COMMAND$, COMMON, CONT, COS, CSNG
DATA CSRLIN, CVD, CVI, CVS, "", ""
restore CKey: return
DKey:
DATA DATA, DATE$, DEF, DEFDBL, DEFINT, DEFSNG, DEFSTR, DEF FN, DEF USR, DELETE
DATA DIM, DRAW, ""
restore DKey: return
EKey:
DATA EDIT, ELSE, END, ENVIRON, ENVIRON$, EOF, EQV, ERASE
DATA ERL, ERR, ERROR, EXIT, EXP, ""
restore EKey: return
FKey:
DATA FIELD, FILES, FIX, FOR, FRE, ""
restore FKey: return
GKey:
DATA GET, GO, GOSUB, GOTO, ""
restore GKey: return
HKey:
DATA HEX$, ""
restore HKey: return
IKey:
DATA IF, IMP, INKEY$, INP, INPUT, INPUT$, INPUT$, INSTR, INT, ""
restore IKey: return
JKey:
DATA ""
restore JKey: return
KKey:
DATA KEY, KILL, ""
restore KKey: return
LKey:
DATA LCOPY, LEFT$, LEN, LET, LINE, LIST, LBOUND, LLIST, LOAD
DATA LOC, LOCAL, LOCATE, LOCK, LOF, LOG, LPOS, LPRINT, LSET, ""
restore LKey: return
MKey:
DATA MERGE, MID$, MKD$, MKI$, MKS$, MKDIR, MOD, MOTOR, ""
restore MKey: return
NKey:
DATA NAME, NEW, NEXT, NOT NULL, ""
restore NKey: return
OKey:
DATA OCT$, ON, OPEN, OPTION, OR, OUT, OUTPUT, ""
restore OKey: return
PKey:
DATA PAINT, PALETTE, PEEK, PEN, PLAY, PMAP
DATA POINT, POKE, POS, PRESET, PRINT, PSET, PUT, ""
restore PKey: return
QKey:
DATA ""
restore QKey: return
RKey:
DATA RANDOMIZE, READ, REDIM, REM, RENUM, REM, RENUM
DATA RESTORE, RESUME, RETURN, RIGHT$, RMDIR, RND, RSET, RUN, ""
restore RKey: return
SKey:
DATA SAVE, SCREEN, SEG, SGN, SHARED, SHELL, SIN, SOUND, SPACE
DATA SPC, SQR, STATIC, STEP, STICK, STOP, STR, STRIG, STRING
DATA SUB, SWAP, SYSTEM, ""
restore SKey: return
TKey:
DATA TAB, TAN, THEN, TIME, TIMER, TO, TROFF, TRON, ""
restore TKey: return
UKey:
DATA UBOUND, UNLOCK, USING, ""
restore UKey: return
VKey:
DATA VAL, VARPTR, VIEW, ""
restore VKey: return
WKey:
DATA WAIT, WEND, WHILE, WIDTH, WINDOW, WRITE, ""
restore WKey: return
XKey:
DATA XOR, ""
restore XKey: return
YKey:
DATA ""
restore YKey: return
ZKey:
DATA ""
restore ZKey: return
end def
rem $subtitle:'FnIsMetacommand- Is a Metacommand?'
rem $page
'FNIsMetaCommand- returns non-zero if source$ is a meta command of
' the form "'$metacommand" or "$metacommand"
'
' Input:
' Source$ - source string to determine if metacommand
'
def FnIsMetacommand(source$)
' The following is a list of the metacommands processed by this program
Meta$ = "TITLE SUBTITLE LINESIZE PAGESIZE PAGE PAGEIF SKIP LIST- LIST+ LIST"
if (mid$(source$,1,1)) = "'" then source$=mid$(source$,2)
if ((mid$(source$,1,1)) <> "$") OR (len(source$) < 4 ) then
FnIsMetacommand = 0
exit def
else
source$=Mid$(source$,2) ' get rid of the $
source$ = FnToUpper$(source$) 'convert to uppercase
x = instr(meta$,source$)
if x <> 0 then FnIsMetacommand = -1 else FnIsMetacommand = 0
end if
end def
rem $subtitle:'InQuote'
rem $page
' InQuote- determines whether or not we are in the middle of a
' quoted literal
'
' Input: Target$- string to see if it contains a double quote character
' Output: either 1 or 0, toggles state of Quoted.Literal
'
SUB InQuote(Target$, Quoted.Literal) STATIC
STATIC x,xi
x= INSTR(1,target$,chr$(34)) ' is there a quote in the string??
IF x = 0 then
Exit SUB ' no quote chracters, exit...
ELSE
x1 = Instr(x+1, target$,chr$(34)) ' look for a 2nd quote
if x1 = 0 then quoted.Literal = NOT Quoted.Literal
END IF
END SUB
rem $subtitle:'Write.Outputfile- writes 1 line'
rem $page
' Write.Outputfile- Writes one line to the output file, handling all the
' all the parameters set up by metacommands.
' Assumptions:- This routine assumes that channel #2 has been opened for output
'
' Input:
' OutputLine$ - The line to output
' Output:
' None
' Uses:
' Out.Title$, Out.SubTitle$, Out.LineSize, Out.PageSize, Out.List,
' Out.LineCount, Out.BlankBottom, MetaCommand.On, True, False
SUB Write.Outputfile(outputLine$) STATIC
SHARED Out.Title$, Out.SubTitle$, Out.LineSize, Out.PageSize, Out.List
SHARED Out.LineCount, Out.BlankBottom, MetaCommand.On, True, False
If Out.List = False THEN Exit Sub 'Listing is OFF
If MetaCommand.On Then MetaCommand.On = False: Exit Sub ' Don't Print the metacommand line
IF Out.LineCount = 0 Then CALL Out.Header 'must be first time into this routine
' Convert all TABs in the line to Blanks
OutputLine$ = FnTabsToBlanks$(outputline$)
'Output the line, given the page width
OutLine.Length = Len(outputLine$)
While OutLine.Length > Out.LineSize-1
IF (Out.LineCount > (Out.PageSize-Out.BlankBottom)) AND (Out.PageSize <> 255) THEN CALL Out.Header
PRINT #2, Mid$(OutputLine$,1,Out.LineSize-1)
OutputLine$ = Mid$(OutputLine$,Out.LineSize) 'start at next char
OutLine.Length = Len(outputLine$)
Out.LineCount = Out.LineCount + 1
Wend
IF (Out.LineCount > (Out.PageSize-Out.BlankBottom)) AND (Out.PageSize <> 255) THEN CALL Out.Header
PRINT #2, Mid$(OutputLine$,1,Out.LineSize-1)
Out.LineCount = Out.LineCount + 1
End Sub
rem $subtitle:'Out.Header- Writes the Header Info'
rem $page
' Out.Header - Output the header to the output file
'
' Assumptions- Assumes Channel #2 is open for output
' Input:
' None
' Output:
' None
' Uses:
' Out.Title$, Out.SubTitle$, Out.LineSize, Out.PageSize, Out.List,
' Out.LineCount
SUB Out.Header STATIC
SHARED Out.Title$, Out.SubTitle$, Out.LineSize
SHARED Out.LineCount, Out.PageNum, Out.List
If Out.List = 0 Then exit sub
' first update the screen
Locate 2,5:print "Microsoft PPRINT: Formatted Print Utility"
locate 4,5:print space$(60)
locate 4,5:print "Currently printing Page: ";Out.Pagenum
if out.pagenum > 1 then Print #2, Chr$(12) ' The FF character
Print #2, Mid$(Out.Title$,1,Out.LineSize);
page$ = "Page"+string$(4-len(str$(out.pagenum))," ")+str$(out.PageNum)
print #2,Tab(Out.LineSize-len(page$));Page$
print #2, Mid$(Out.Subtitle$,1,Out.LineSize);
print.date$ = left$(date$,6)+right$(date$,2)
print #2, Tab(Out.LineSize-8);print.date$
print #2, Tab(Out.LineSize-8);Time$
Print #2,Tab(Out.LineSize-35);"Microsoft QuickBASIC Compiler V2.01"
Print #2, "" ' add a blank line
Out.LineCount = 7
Out.PageNum = Out.PageNum + 1
END SUB
rem $subtitle:'ProcessMetacommand- Process 1 Metacommand'
rem $page
' ProcessMetaCommand- Determines which meta command it is and takes
' the appropriate action(s)
'
' Input
' Token$- Last token found
' Output
' None, except the action associated with the metacommand
'
SUB ProcessMetaCommand( Token$) STATIC
SHARED Out.Title$, Out.SubTitle$, Out.LineSize, Out.PageSize, Out.List
SHARED Out.LineCount, Out.BlankBottom, MetaCommand.On, True, False
SHARED OutputFile$
STATIC X, Meta1$
' Each item in the following list is an a 10 character boundary so that
' I can find the index, divide by 10, and use the ON...GOTO contruct
meta1$ = " TITLE SUBTITLE LINESIZE PAGE PAGESIZE PAGEIF SKIP LIST- LIST+"
if (mid$(token$,1,1)) = "'" then token$=mid$(token$,2)
token$=Mid$(token$,2) ' get rid of the $
token$ = FnToUpper$(token$) 'convert to uppercase
MetaCommand.On = -1
x = instr(Meta1$,token$)/10
ON x GOTO Title, Subtitle, LineSize, Page, PageSize, Pageif, Skip, ListOff, ListOn
Title:
arg$=FnGetToken$("","'"): Arg$=FnGetToken$("","'")
Out.Title$ = Arg$
Exit Sub
Subtitle:
arg$=FnGetToken$("","'"): Arg$=FnGetToken$("","'")
Out.SubTitle$ = Arg$
Exit Sub
LineSize:
arg$=FnGetToken$("","': ")
Out.LineSize=Val(arg$)
IF OutputFile$ = "LPT1:" THEN WIDTH #2,Out.LineSize 'FIX #57720
Exit Sub
Page:
CALL Out.Header
Exit Sub
PageSize:
arg$=FnGetToken$("","': ")
Out.PageSize=Val(arg$)
Out.LineCount = Out.LineCount MOD Out.PageSize
Exit Sub
Pageif:
arg$=FnGetToken$("","': ")
x =Val(arg$)
If (Out.PageSize-Out.BlankBottom-x) <= Out.LineCount Then CALL Out.Header
Exit Sub
Skip:
arg$=FnGetToken$("","': ")
x =Val(arg$)
IF (Out.LineCount+x) > (Out.PageSize-Out.BlankBottom) Then
Call Out.Header
Else
For i=1 to x
Call Write.OutputFile(" ")
Next i
END IF
MetaCommand.On = -1 ' Fix #56937
Exit Sub
ListOff:
Out.List = False
Exit Sub
ListOn:
Out.List= True
Exit Sub
END SUB
rem $subtitle:'GetFilenames- Gets the I/O filenames'
rem $page
'
' GetFileNames - Parses the input and output file names from command$
' Description:
' This routine retrieves the input and output file names. These should
' be separated by a comma with the input file name coming first.
' Input:
' Command$ - Command line
' true, false - logical flags
' Output:
' InputFile$, OutputFile$ - Input/Output file name
'
sub GetFileNames static
shared InputFile$, OutputFile$, Seps$, true, false
if (Command$ = "") then
print " Microsoft PPrint: Formatted Print Utility"
print " "
Input " Input Filename (return to terminate)";InputFile$
If inputfile$ = "" Then Exit Sub
Input " Output Filename (default is LPT1:)";OutputFile$
CLS
else
InputFile$ = FNGetToken$(Command$, Seps$)
OutputFile$ = FNGetToken$("", " ") 'next token is outputfilename
end if
ExitGet:
'Add .bas if filename has no extension
if Instr(InputFile$,".") = 0 then InputFile$ = InputFile$ + ".bas"
if (OutputFile$ = "") then OutputFile$ = "LPT1:"
end sub
rem $subtitle:'InitSys- Initialize the System'
rem $page
'
' initialize the system
'
SUB initsys STATIC
SHARED true, false, KeyWordCount, Seps$
SHARED Out.Title$, Out.SubTitle$, Out.LineSize, Out.PageSize, Out.List, Out.LineCount, Out.BlankBottom, Out.PageNum
Seps$ = " ,: ": true = -1: false = 0
Out.Title$ = ""
Out.SubTitle$ = ""
Out.LineSize = 80
Out.PageSize = 66
Out.List = true
Out.LineCount = 0
Out.BlankBottom = 6 '6 lines are left blank at the bottom of each
' page unless pagesize=255 meaning an infinate
' page.
Out.PageNum = 1
MetaCommand.On = 0
END SUB
rem $subtitle:'MAIN PROGRAM'
rem $page
main:
Call InitSys
Call GetFileNames
If Inputfile$ = "" Then goto Exitmain
open InputFile$ for input as #1
open outputfile$ for output as #2
while not eof(1)
line input #1, LineCur$
outputLine$ = LineCur$
OutputIndex = 1
TokenCur$ = FNGetToken$(LineCur$, Seps$)
while (TokenCur$ <> "")
CALL InQuote(TokenCur$,Quoted.Literal)
IF FNIsKeyWord(TokenCur$) then
' Make uppercase
' stuff into line at appropriate position
'
Temp$=FNToUpper$(TokenCur$)
x = Instr(OutputIndex,OutputLine$,TokenCur$)
IF NOT Quoted.Literal THEN MID$(OutPutLine$,x) = Temp$ 'replace with uppercase
OutputIndex = x + len(temp$)
ELSEIF FnIsMetacommand(tokencur$) Then
OutputIndex = OutputIndex + Len(TokenCur$)
' process the metacommand
Call ProcessMetaCommand(TokenCur$)
ELSE
'move index across line
OutputIndex = OutputIndex + Len(TokenCur$)
END IF
TokenCur$ = FNGetToken$("", Seps$)
wend
Call Write.Outputfile(OutputLine$)
wend
Print #2,chr$(12) 'send one last FF character
CLOSE ' Close all files
Exitmain:
end