'===========================================================================
' Subject: BATCH PROCEDURES                   Date: 07-04-96 (19:54)       
'  Author: Edward Blake                       Code: QB, PDS                
'  Origin: eblake2@quebectel.com            Packet: DOS.ABC
'===========================================================================
' 1996 Edward Blake (still 14 years old) Quebec, Canada
' Routines called from a Batch (.BAT) file. can be used for making a simple
' Installation batch program or anything else.
' uses the StrTok routine from the quickbasic example program Token.bas
' for tokenizing the command$
' Can't be used with QBasic because QBasic doesnt support Command$
'
' $INCLUDE: 'QB.BI'
DECLARE SUB READER (FILE$)
DECLARE SUB BCKGND ()
DECLARE SUB WIN (X1!, Y1!, X2!, Y2!, A$)
DECLARE FUNCTION StrTok$ (Source$, Delimiters$)
DECLARE SUB EXITWITHERRLEVEL ALIAS "_EXIT" (N AS INTEGER)
DIM TOK$(10)
IF COMMAND$ <> "" THEN
P$ = COMMAND$
DELM$ = " ,;:()?" + CHR$(9) + CHR$(34)
TOKN$ = StrTok$(P$, DELM$)
WHILE TOKN$ <> ""
   TOK$(I) = TOKN$
   I = I + 1
   TOKN$ = StrTok$("", DELM$)
WEND
FOR I = 0 TO 10
TOK$(0) = UCASE$(LTRIM$(RTRIM$(TOK$(0))))
NEXT I
SELECT CASE TOK$(0)
CASE "BCKGND"
BCKGND
CASE "COLOR"
COLOR VAL(TOK$(1)), VAL(TOK$(2))
LOCATE 1, 1: PRINT
CASE "WIN"
WIN VAL(TOK$(1)), VAL(TOK$(2)), VAL(TOK$(3)), VAL(TOK$(4)), TOK$(5)
CASE "PROGRESS"
LOCATE VAL(TOK$(1)), VAL(TOK$(2)): PRINT STRING$(VAL(TOK$(3)) / 10, 219)
CASE "LOCATE"
LOCATE VAL(TOK$(1)), VAL(TOK$(2))
CASE "SELECTDRIVE"
WIN 20, 5, 40, 11, "Select Drive"
DO
I$ = INKEY$
IF I$ = CHR$(0) + CHR$(80) THEN Y% = Y% + 1
IF I$ = CHR$(0) + CHR$(72) THEN Y% = Y% - 1
IF I$ = CHR$(13) THEN EXIT DO
IF Y% = 0 THEN COLOR 15, 1 ELSE COLOR 7, 0
LOCATE 6, 21: PRINT "         A:        "
IF Y% = 1 THEN COLOR 15, 1 ELSE COLOR 7, 0
LOCATE 7, 21: PRINT "         B:        "
IF Y% = 2 THEN COLOR 15, 1 ELSE COLOR 7, 0
LOCATE 8, 21: PRINT "         C:        "
IF Y% = 3 THEN COLOR 15, 1 ELSE COLOR 7, 0
LOCATE 9, 21: PRINT "         D:        "
IF Y% = 4 THEN COLOR 15, 1 ELSE COLOR 7, 0
LOCATE 10, 21: PRINT "         E:        "
LOOP
EXITWITHERRLEVEL Y%
CASE "READER"
READER TOK$(1)
END SELECT
ELSE
PRINT "±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±";
PRINT "±±ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ¸±±";
PRINT "±±³ Batch Procedures - 1996 Edward Blake                                     ³±±";
PRINT "±±ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[Commands]ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´±±";
PRINT "±±³Win x1 y1 x2 y2 title (note: no parameters are optional except title)     ³±±";
PRINT "±±³bckgnd (note: all parameters are ignored)                                 ³±±";
PRINT "±±³color num1 [num2] (note: default is 0 for all parameters!!)               ³±±";
PRINT "±±³Progress x1 y1 value                                                      ³±±";
PRINT "±±³selectdrive (note: will return a errorlevel 0=A 1=B 2=C 3=D 4=E,only A-E) ³±±";
PRINT "±±³locate x1 y1 (use echo for displaying text)                               ³±±";
PRINT "±±³Reader filename (must have the extension)                                 ³±±";
PRINT "±±ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ¾±±";
PRINT "±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±";
END IF

SUB BCKGND
FOR I = 1 TO 24
LOCATE I, 1: PRINT STRING$(80, 177);
NEXT I
LOCATE 25, 1: PRINT STRING$(80, 177);
END SUB

SUB READER (FILE$)
DIM FILEC$(500)
OPEN FILE$ FOR INPUT AS #1
DO UNTIL EOF(1)
INPUT #1, FILEC$(I)
I = I + 1
LOOP
CLOSE #1
COLOR 7, 1
Y = -1
DO
I$ = INKEY$
IF I$ = CHR$(0) + CHR$(80) THEN Y = Y + 1
IF I$ = CHR$(0) + CHR$(72) THEN Y = Y - 1
IF I$ = CHR$(27) THEN EXIT DO
IF Y < -1 THEN Y = -1
IF Y > 474 THEN Y = 474
FOR I = 1 TO 25
LOCATE I, 1, 0: PRINT FILEC$(I + Y) + STRING$(80 - (LEN(FILEC$(I + Y))), 32);
NEXT I
LOOP
COLOR 7, 0
CLS
END SUB

FUNCTION StrTok$ (Srce$, Delim$)
STATIC Start%, SaveStr$

   ' If first call, make a copy of the string.
   IF Srce$ <> "" THEN
      Start% = 1: SaveStr$ = Srce$
   END IF

   BegPos% = Start%: Ln% = LEN(SaveStr$)
   ' Look for start of a token (character that isn't delimiter).
   WHILE BegPos% <= Ln% AND INSTR(Delim$, MID$(SaveStr$, BegPos%, 1)) <> 0
      BegPos% = BegPos% + 1
   WEND
   ' Test for token start found.
   IF BegPos% > Ln% THEN
      StrTok$ = "": EXIT FUNCTION
   END IF
   ' Find the end of the token.
   EndPos% = BegPos%
   WHILE EndPos% <= Ln% AND INSTR(Delim$, MID$(SaveStr$, EndPos%, 1)) = 0
      EndPos% = EndPos% + 1
   WEND
   StrTok$ = MID$(SaveStr$, BegPos%, EndPos% - BegPos%)
   ' Set starting point for search for next token.
   Start% = EndPos%

END FUNCTION

SUB WIN (X1, Y1, X2, Y2, A$)
FOR I = Y1 TO Y2
LOCATE I, X1: PRINT STRING$(X2 - X1, 32);
NEXT I
LOCATE Y1, X1 + 1: PRINT STRING$(X2 - X1 - 1, 196);
LOCATE Y2, X1 + 1: PRINT STRING$(X2 - X1 - 1, 196);
FOR I = Y1 + 1 TO Y2 - 1
LOCATE I, X1: PRINT CHR$(179);
LOCATE I, X2: PRINT CHR$(179);
NEXT I
LOCATE Y1, X1: PRINT CHR$(218);
LOCATE Y1, X2: PRINT CHR$(191);
LOCATE Y2, X1: PRINT CHR$(192);
LOCATE Y2, X2: PRINT CHR$(217);
IF A$ <> "" THEN
LOCATE Y1, ((X2 + X1) / 2) - ((LEN(A$) + 2) / 2): PRINT " " + A$ + " "
END IF
END SUB
