home *** CD-ROM | disk | FTP | other *** search
- { ANYPROG.PAS }
- {
- Description: Program that demonstrates the ability of Turbo 4.0 to run
- a child process and return. This two-level demonstration
- shows how the DOS FORMAT command can be used in conjunction
- with batch files and a Turbo Pascal program to format a disk
- in Drive B: without any of the usual user input or screen
- messages from FORMAT.
-
- Author: Jay van Santen
- Application: IBM PC and compatibles; Turbo Pascal 4.0
-
- }
-
- {Copyright 1988 Jay van Santen All Rights Reserved}
-
- {$M 16384,0,0}
- program ANYPROG;
-
- {
- In a parent process of normal size and no pointer variables, to free
- memory for the child process, set memory directive $M as follows:
-
- STACKsize to 16384 (default), HEAPmin to 0, HEAPmax to 0.
- }
-
- uses
- Dos, Crt;
-
-
- const
- NONE = 0;
- FILEexists = 0;
- SOMECRITICALerror = 255;
- FIRST = '1';
-
- type
- STRING80 = STRING [80];
- STRING11 = STRING [11];
- ERRORfiles = TEXT;
-
- var
- PROCEED : BOOLEAN;
- ROUTINE : CHAR;
- ERRORcode : INTEGER;
- ERRORinfo : STRING80;
- ERRORfile : ERRORfiles;
-
- const
- ERRORprog : STRING80 = 'A:ERRMSGE.DAT';
-
-
- procedure BeginProg;
- begin
- clrscr;
- writeln ('BEGINNING Parent Process "ANYPROG.PAS".');
- writeln;
- writeln ('This program calls a child process to format a disk.');
- writeln (' COMMAND.COM must be in root or current directory.');
- write (' FORMAT.COM (or FORMAT.EXE) must be in the current directory');
- writeln (' or path.');
- writeln;
- writeln (' Keep program disk in Drive A:, put blank disk in Drive B:')
- end;
-
-
- procedure UserResp
- (var PROCEED : BOOLEAN);
-
- var
- KEYin : CHAR;
-
- begin
- writeln;
- write ('If you want to proceed, type Y. Otherwise, type N: ');
- repeat
- KEYin := readkey
- until KEYin in ['Y', 'y', 'N', 'n'];
- write (KEYin);
- writeln;
-
- case KEYin of
- 'Y', 'y': PROCEED := TRUE;
- 'N', 'n': PROCEED := FALSE;
- end
- end;
-
-
- procedure UserDirection
- (var KEYin : CHAR);
-
- begin
- writeln;
- writeln ('Process 1 is the most straightforward.');
- writeln ('Process 2 provides much better error-trapping (try some out!)');
- write ('CHOOSE child process 1 or 2: ');
- repeat
- KEYin := ReadKey
- until KEYin in ['1', '2'];
- write (KEYin);
- writeln
- end;
-
-
- procedure UserInform;
- begin
- writeln;
- writeln ('BEGINNING Child Process: (note the lack of messages)')
- end;
-
-
- procedure ReportError
- (ERRORcode : INTEGER);
-
- var
- ERRORinfo : STRING80;
-
- begin
- case ERRORcode of
- 2: ERRORinfo := 'FILE NOT FOUND -- COMMAND.COM or child process.';
- 5: ERRORinfo := 'ACCESS DENIED -- child process is write only.';
- 8: ERRORinfo := 'INSUFFICIENT MEMORY to run child process.';
- 10: ERRORinfo := 'INVALID ENVIRONMENT -- improper SET path variables.';
- 11: ERRORinfo := 'INVALID FORMAT.';
- 152: ERRORinfo := 'DRIVE NOT READY -- where child process located.';
- 162: ERRORinfo := 'HARDWARE FAILURE -- drive door probably not closed.';
- 255: ERRORinfo := 'CHILD PROCESS RAN but halted on critical error.';
- else ERRORinfo := 'ERROR in accessing child process to run.'
- end;
-
- gotoXY (1, 25);
- writeln (ERRORinfo);
- writeln ('PROGRAM ENDING. Fix error and run again.')
- end;
-
-
- procedure EndProgA;
- begin
- writeln;
- writeln('ENDING Child Process. Format complete, parent process takes');
- writeln(' control, and itself ends.')
- end;
-
-
- procedure EndProgB;
- begin
- writeln;
- writeln ('By your choice, the program now ends.')
- end;
-
-
- procedure InitDiskA
- (var ERRORcode : INTEGER);
-
- begin
- exec ( '\COMMAND.COM', '/C FORMAT B: <A:FMTINFO.BAT >NUL');
- ERRORcode := DosError
- end;
-
-
- procedure InitDiskB
- (var ERRORcode : INTEGER);
-
- var
- TEMP : INTEGER;
-
- begin
- {$I-}
- exec ('\COMMAND.COM', '/C A:BATCH.BAT >NUL');
- {$I+}
- ERRORcode := IOResult;
- if (ERRORcode = NONE) AND (DosError <> NONE) then
- ERRORcode := DosError;
-
- if ERRORcode = NONE then
- begin
- assign (ERRORfile, ERRORprog);
- {$I-}
- reset (ERRORfile);
- {$I+}
- TEMP := IOResult;
- if TEMP = FILEexists then
- begin
- ERRORcode := SOMECRITICALerror;
- close (ERRORfile);
- erase (ERRORfile)
- end
- end
- end;
-
- begin { Main program }
-
- CheckBreak := FALSE; { Prevent CTL-BREAK from terminating program }
- BeginProg;
- UserResp (PROCEED);
- if PROCEED then
- begin
- UserDirection (ROUTINE);
- UserInform;
- if ROUTINE = FIRST
- then InitDiskA (ERRORcode)
- else InitDiskB (ERRORcode);
- if ERRORcode <> NONE
- then ReportError (ERRORcode)
- else EndProgA
- end
- else EndProgB
- end.
-