home *** CD-ROM | disk | FTP | other *** search
- {$S2}
- PROGRAM Pas_Main ;
-
- CONST
- {$I gemconst.pas}
- {$I pascal.i}
- max_option = 30 ; { Maximum number of options in one dialog }
-
- TYPE
- {$I gemtype.pas}
- opt_range = 1..max_option ;
- opt_array = PACKED ARRAY [ opt_range ] OF boolean ;
- opt_set = SET OF opt_range ;
- prog_name = PACKED ARRAY [ 1..13 ] OF char ;
- cmd_tail = PACKED ARRAY [ 0..255 ] OF char ;
- environment = cmd_tail ;
- env_ptr = ^environment ;
-
- VAR
- envp : env_ptr ;
- zero_word : integer ;
- menu : Menu_Ptr ;
- dummy : integer ;
- last_was_gem,
- link_gem : boolean ; { The only link option! }
- cmp_opts : opt_array ;
- bad_res,
- temp_path,
- addl_files,
- addl_libs : Str255 ;
- work_path,
- cmp_name,
- link_name,
- edit_name,
- run_name : Path_Name ;
- fullx, fully, fullw, fullh : integer ;
-
- {$I gemsubs.pas}
-
- PROCEDURE Form_Dial( cmd, sx, sy, sw, sh, ex, ey, ew, eh : integer ) ;
- EXTERNAL ;
- PROCEDURE Obj_Draw(dial: Dialog_Ptr; start, depth, cx, cy, cw, ch: integer);
- EXTERNAL;
- PROCEDURE IO_Check( on : boolean ) ;
- EXTERNAL ;
- FUNCTION IO_Result : integer ;
- EXTERNAL ;
-
-
-
- { Do_About - Perform the "Personal Pascal Info" Dialog box. }
-
- PROCEDURE Do_About ;
-
- VAR
- about : Dialog_Ptr ;
-
- BEGIN
- Find_Dialog( PASINFO, about ) ;
- Center_Dialog( about ) ;
- dummy := Do_Dialog( about, 0 ) ;
- Obj_SetState( about, INFOBTN, None, true ) ;
- End_Dialog( about ) ;
- END ;
-
-
-
- PROCEDURE Set_Defaults ;
-
- TYPE
- c_path = PACKED ARRAY [ 1..80 ] OF char ;
-
- VAR
- opt : opt_range ;
- path : c_path ;
- i : integer ;
-
- FUNCTION d_getdrv : integer ;
- GEMDOS( $19 ) ;
-
- PROCEDURE d_getpath( VAR path_buf : c_path ; drive : integer ) ;
- GEMDOS( $47 ) ;
-
- BEGIN
- FOR opt := 1 TO max_option DO
- IF opt IN [ FORGEM,ERRPAUSE,CHNLINK,DBGOPT,STKOPT,RNGOPT ]
- THEN cmp_opts[ opt ] := true ;
- work_path[1] := chr( ord('A') + d_getdrv ) ;
- work_path[2] := ':' ;
- d_getpath( path, 0 ) ; { Get default path } ;
- i := 1 ;
- WHILE (path[i] <> chr(0)) AND (path[i] <> ' ') AND (i <= 64 ) DO
- BEGIN
- work_path[i+2] := path[i] ;
- i := i + 1 ;
- END ;
- i := i + 1 ;
- work_path[0] := chr(i) ;
- work_path := concat( work_path, '\*.PAS' ) ;
- (* Personal Pascal clears all globals to 0's!
- temp_path[0] := chr(0) ;
- edit_name[0] := chr(0) ;
- run_name[0] := chr(0) ;
- addl_files[0] := chr(0) ;
- addl_libs[0] := chr(0) ;
- *)
- last_was_gem := true ;
- link_gem := true ;
- END ;
-
-
-
- PROCEDURE Read_Options ;
-
- VAR
- f : text ;
- version : integer ;
- temp : integer ;
- opt : opt_range ;
-
- BEGIN
- IO_Check( false ) ;
- reset( f, 'PASCAL.INF' ) ;
- IO_Check( true ) ;
- IF IO_Result = 0 THEN
- BEGIN
- readln( f, version ) ;
- FOR opt := 1 TO max_option DO
- IF opt IN [ FORGEM,ERRPAUSE,CHNLINK,DBGOPT,STKOPT,RNGOPT,CLROPT ]
- THEN
- BEGIN
- readln( f, temp ) ;
- cmp_opts[ opt ] := temp <> 0 ;
- END ;
- readln( f, temp ) ;
- link_gem := temp <> 0 ;
- readln( f, temp_path ) ;
- readln( f, addl_files ) ;
- readln( f, addl_libs ) ;
- IF length( temp_path ) <> 0 THEN
- work_path := concat( temp_path, '*.PAS' ) ;
- END
- END ;
-
-
-
- PROCEDURE Save_Options ;
-
- VAR
- f : text ;
- junk : integer ;
- alert : Str255 ;
- opt : opt_range ;
-
- BEGIN
- IO_Check( false ) ;
- rewrite( f, 'PASCAL.INF' ) ;
- IO_Check( true ) ;
- IF IO_Result <> 0 THEN
- BEGIN
- Find_Alert( ERROPTS, alert ) ;
- junk := Do_Alert( alert, 1 ) ;
- END
- ELSE
- BEGIN
- writeln( f, $100:1 ) ; { Version 1.00 }
- FOR opt := 1 TO max_option DO
- IF opt IN [ FORGEM,ERRPAUSE,CHNLINK,DBGOPT,STKOPT,RNGOPT,CLROPT ]
- THEN
- writeln( f, ord( cmp_opts[opt] ):1 ) ;
- writeln( f, ord( link_gem ):1 ) ;
- writeln( f, temp_path ) ;
- writeln( f, addl_files ) ;
- writeln( f, addl_libs ) ;
- END
- END ;
-
-
-
- PROCEDURE bconin( dev : integer ) ; { Really a function! }
- BIOS( 2 ) ;
-
- PROCEDURE bconout( dev, c : integer ) ;
- BIOS( 3 ) ;
-
- PROCEDURE out_esc( c : char ) ;
-
- BEGIN
- bconout( 2, 27 ) ;
- bconout( 2, ord(c) ) ;
- END ;
-
- PROCEDURE Tos_Screen ;
-
- BEGIN
- Hide_Mouse ;
- out_esc( 'E' ) ; { Clear screen }
- out_esc( 'e' ) ; { and cursor on }
- END ;
-
-
-
- PROCEDURE Redraw_Screen ;
-
- BEGIN
- Form_Dial( 3, 0, 0, 0, 0, fullx, fully, fullw, fullh ) ;
- END ;
-
-
-
- PROCEDURE Gem_Screen ;
-
- BEGIN
- out_esc( 'f' ) ; { Cursor off }
- Show_Mouse ;
- END ;
-
-
-
- FUNCTION Call_Overlay( prog : prog_name ; VAR cmd_line : Str255 ;
- tos : boolean ) : integer ;
-
- VAR
- i : integer ;
- tail : cmd_tail ;
-
- FUNCTION p_exec( load : integer ; VAR name : prog_name ;
- VAR tail : cmd_tail ; VAR envp : env_ptr ) : integer ;
- GEMDOS( $4B ) ;
-
- BEGIN
- FOR i := 1 TO length( cmd_line ) DO
- tail[i] := cmd_line[i] ;
- tail[ length(cmd_line)+1 ] := chr(0) ;
- tail[0] := chr( length(cmd_line) ) ;
- prog[13] := chr(0) ;
- Erase_Menu( menu ) ;
- IF tos THEN
- Tos_Screen ;
- Call_Overlay := p_exec( 0, prog, tail, envp ) ;
- IF tos THEN
- Gem_Screen ;
- Redraw_Screen ;
- Draw_Menu( menu ) ;
- END ;
-
-
-
- { Strip_Extension - Remove the extension from a Path_Name variable. }
-
- PROCEDURE Strip_Extension( VAR fn : Path_Name ) ;
-
- VAR
- i : integer ;
- done : boolean ;
-
- BEGIN
- i := length( fn ) ;
- done := false ;
- WHILE NOT done DO
- BEGIN
- IF i < 1 THEN
- done := true
- ELSE IF (fn[i] = ':') OR (fn[i] = '\') THEN
- done := true
- ELSE IF fn[i] = '.' THEN
- BEGIN
- fn[0] := chr(i-1) ;
- done := true ;
- END
- ELSE
- i := i - 1 ;
- END ;
- END ;
-
-
-
- { Do_Link - Call the linker with a desired file as input. }
-
- PROCEDURE Do_Link( name : Path_Name ; for_gem : boolean ) ;
-
- VAR
- junk : integer ;
- extension : STRING [ 5 ] ;
- libs : STRING ;
- cmd_line : Str255 ;
- x, y, w, h : integer ;
- dial : Dialog_Ptr ;
-
- BEGIN
- last_was_gem := for_gem ;
- Strip_Extension( name ) ;
- cmd_line := name ;
- IF for_gem THEN
- BEGIN
- extension := '.PRG=' ;
- libs := ',PASGEM,PASLIB' ;
- END
- ELSE
- BEGIN
- extension := '.TOS=' ;
- libs := ',PASLIB' ;
- END ;
- cmd_line := concat( '! ', name, extension, name ) ;
- IF length(addl_files) > 0 THEN
- cmd_line := concat( cmd_line, ',', addl_files ) ;
- IF length(addl_libs) > 0 THEN
- cmd_line := concat( cmd_line, ',', addl_libs ) ;
- cmd_line := concat( cmd_line, libs ) ;
- Find_Dialog( LOADING, dial ) ;
- Set_DText( dial, LOADNAME, 'LINKER.PRG', System_Font, TE_Left ) ;
- Center_Dialog( dial ) ;
- Obj_Size( dial, Root, x, y, w, h ) ;
- Obj_Draw( dial, Root, Max_Depth, x, y, w, h ) ;
- junk := Call_Overlay( 'linker.prg ', cmd_line, false ) ;
- END ;
-
-
-
- { Do_Compile - Call the compiler with a desired file as input. }
-
- FUNCTION Do_Compile : integer ;
-
- VAR
- cmp_code : integer ;
- cmd_line : Str255 ;
- name : Path_Name ;
- x, y, w, h,
- i : integer ;
- dial : Dialog_Ptr ;
-
- BEGIN
- last_was_gem := cmp_opts[ FORGEM ] ;
- name := edit_name ;
- Strip_Extension( name ) ;
- cmd_line := concat( name, ' ', temp_path, ' /UGEM' ) ;
- IF cmp_opts[ FORGEM ] THEN
- cmd_line := concat( cmd_line, ' /GEM' ) ;
- IF cmp_opts[ ERRPAUSE ] THEN
- cmd_line := concat( cmd_line, ' /PAUSE' ) ;
- IF cmp_opts[ DBGOPT ] THEN
- cmd_line := concat( cmd_line, ' /DEBUG' ) ;
- IF NOT cmp_opts[ STKOPT ] THEN
- cmd_line := concat( cmd_line, ' /NOCHECK' ) ;
- IF cmp_opts[ RNGOPT ] THEN
- cmd_line := concat( cmd_line, ' /CHECK' ) ;
- IF cmp_opts[ CLROPT ] THEN
- cmd_line := concat( cmd_line, ' /CLEAR' ) ;
- Find_Dialog( LOADING, dial ) ;
- Set_DText( dial, LOADNAME, 'COMPILER.PRG', System_Font, TE_Left ) ;
- Center_Dialog( dial ) ;
- Obj_Size( dial, Root, x, y, w, h ) ;
- Obj_Draw( dial, Root, Max_Depth, x, y, w, h ) ;
- cmp_code := Call_Overlay( 'compiler.prg ', cmd_line, false ) ;
- Do_Compile := 0 ;
- IF cmp_code = 2 THEN { User wants to edit! }
- BEGIN
- Do_Compile := 1 ;
- i := 0 ;
- WHILE envp^[i] <> chr(0) DO
- BEGIN
- edit_name[i+1] := envp^[i] ;
- i := i + 1 ;
- END ;
- edit_name[0] := chr(i) ;
- END
- ELSE IF (cmp_code = 0) AND (cmp_opts[ CHNLINK ]) THEN
- Do_Link( name, cmp_opts[FORGEM] ) ;
- END ;
-
-
-
- { Do_Edit - Pass control to the Lohse editor. }
-
- FUNCTION Do_Edit : integer ;
-
- VAR
- cmd_line : Str255 ;
- i : integer ;
-
- BEGIN
- cmd_line := edit_name ;
- IF Call_Overlay( 'editor.prg ', cmd_line, true ) = 1 THEN
- Do_Edit := 2
- ELSE
- Do_Edit := 0 ;
- END ;
-
-
-
- { Compile_Edit - Loop for "compile-edit-link" process. }
-
- PROCEDURE Compile_Edit( which : integer ) ;
-
- VAR
- i : integer ;
-
- BEGIN
- Strip_Extension( work_path ) ;
- work_path := concat( work_path, '.PAS' ) ;
- IF Get_In_File( work_path, edit_name ) AND (length(edit_name) <> 0) THEN
- WHILE which <> 0 DO
- BEGIN
- IF which = 1 THEN { Editor phase! }
- BEGIN
- which := Do_Edit ;
- FOR i := length( edit_name ) DOWNTO 1 DO
- IF edit_name[i] = ' ' THEN
- edit_name[0] := chr( i-1 ) ;
- END
- ELSE
- which := Do_Compile ;
- END ;
- END ;
-
-
-
- PROCEDURE Call_Linker ;
-
- BEGIN
- Strip_Extension( work_path ) ;
- work_path := concat( work_path, '.O' ) ;
- IF Get_In_File( work_path, link_name ) AND (length(link_name) <> 0) THEN
- Do_Link( link_name, link_gem ) ;
- END ;
-
-
-
- PROCEDURE Call_Program ;
-
- TYPE
- environment = PACKED ARRAY [ 1..9 ] OF char ;
-
- VAR
- i : integer ;
- name, tail : cmd_tail ;
- env : environment ;
-
- PROCEDURE p_exec( load : integer ; VAR name, tail : cmd_tail ;
- VAR env : environment ) ;
- GEMDOS( $4B ) ;
-
- FUNCTION Is_Gem_Name : boolean ;
-
- VAR
- i : integer ;
-
- BEGIN
- Is_Gem_Name := false ;
- IF length( run_name ) > 3 THEN
- BEGIN
- i := length( run_name ) - 3 ;
- IF (run_name[i]='.') AND (run_name[i+1]='P') AND (run_name[i+2]='R')
- AND (run_name[i+3]='G') THEN
- Is_Gem_name := true ;
- END
- END ;
-
- BEGIN
- Strip_Extension( work_path ) ;
- IF last_was_gem THEN
- work_path := concat( work_path, '.PRG' )
- ELSE
- work_path := concat( work_path, '.TOS' ) ;
- IF Get_In_File( work_path, run_name ) AND (length(run_name) <> 0) THEN
- BEGIN
- last_was_gem := Is_Gem_Name ;
- tail[0] := chr(0) ;
- tail[1] := chr(0) ;
- FOR i := 1 TO length( run_name ) DO
- name[i-1] := run_name[i] ;
- name[ length(run_name) ] := chr(0) ;
- env := 'PATH=A:\ ' ;
- env[9] := chr(0) ;
- Erase_Menu( menu ) ;
- IF NOT last_was_gem THEN
- Tos_Screen ;
- p_exec( 0, name, tail, env ) ;
- IF NOT last_was_gem THEN
- BEGIN
- writeln( 'Hit any key to continue...' ) ;
- bconin( 2 ) ; { Get a key from the BIOS! }
- Gem_Screen ;
- END ;
- Redraw_Screen ;
- Draw_Menu( menu ) ;
- END
- END ;
-
-
-
- PROCEDURE Link_Options ;
-
- VAR
- dial : Dialog_Ptr ;
- button : integer ;
-
- BEGIN
- Find_Dialog( LNKOPTS, dial ) ;
- Center_Dialog( dial ) ;
- IF link_gem THEN
- BEGIN
- Obj_SetState( dial, LFORGEM, Selected, false ) ;
- Obj_SetState( dial, LFORTOS, Normal, false ) ;
- END
- ELSE
- BEGIN
- Obj_SetState( dial, LFORGEM, Normal, false ) ;
- Obj_SetState( dial, LFORTOS, Selected, false ) ;
- END ;
- Set_DText( dial, LNKADDL, addl_files, System_Font, TE_Left ) ;
- Set_DText( dial, LNKLIBS, addl_libs, System_Font, TE_Left ) ;
- button := Do_Dialog( dial, LNKADDL ) ;
- Obj_SetState( dial, button, Normal, true ) ;
- End_Dialog( dial ) ;
- IF button = LNKOK THEN
- BEGIN
- link_gem := Obj_State( dial, LFORGEM ) = Selected ;
- Get_DEdit( dial, LNKADDL, addl_files ) ;
- Get_DEdit( dial, LNKLIBS, addl_libs ) ;
- END ;
- END ;
-
-
-
- { Compiler_Options - Allow the user to change various options within the
- compiler by activating the "Personal Pascal Compiler Options" dialog. }
-
- PROCEDURE Compiler_Options ;
-
- VAR
- dial : Dialog_Ptr ;
- button : integer ;
- opt : opt_range ;
-
- BEGIN
- Find_Dialog( CMPOPTS, dial ) ;
- Center_Dialog( dial ) ;
- { First, we need to ensure that the state of various dialog objects
- matches the state of our internal variables! }
- FOR opt := 1 TO max_option DO
- IF opt IN [ FORGEM,ERRPAUSE,CHNLINK,DBGOPT,STKOPT,RNGOPT,CLROPT ]
- THEN Obj_SetState( dial, opt, Normal, false ) ;
- FOR opt := 1 TO max_option DO
- IF opt IN [ ERRPAUSE,CHNLINK,DBGOPT,STKOPT,RNGOPT,CLROPT ] THEN
- IF cmp_opts[ opt ] THEN
- Obj_SetState( dial, opt, Checked, false ) ;
- IF cmp_opts[ FORGEM ] THEN
- Obj_SetState( dial, FORGEM, Selected, false )
- ELSE
- Obj_SetState( dial, FORTOS, Selected, false ) ;
- Set_DText( dial, TEMPPATH, temp_path, System_Font, TE_Left ) ;
- button := Do_Dialog( dial, TEMPPATH ) ;
- WHILE (button <> CMPOK) AND (button <> CMPCAN) DO
- BEGIN
- IF Obj_State(dial, button) = Normal THEN
- Obj_SetState( dial, button, Checked, true )
- ELSE
- Obj_SetState( dial, button, Normal, true ) ;
- button := Redo_Dialog( dial, TEMPPATH ) ;
- END ;
- Obj_SetState( dial, button, Normal, true ) ;
- End_Dialog( dial ) ;
- IF button = CMPOK THEN
- BEGIN
- FOR opt := 1 TO max_option DO
- IF opt IN [ ERRPAUSE,CHNLINK,DBGOPT,STKOPT,RNGOPT,CLROPT ] THEN
- cmp_opts[ opt ] := Obj_State( dial, opt ) = Checked ;
- cmp_opts[ FORGEM ] := Obj_State( dial, FORGEM ) = Selected ;
- Get_DEdit( dial, TEMPPATH, temp_path ) ;
- END ;
- END ;
-
-
-
- { Do_Menu - Perform a menu operation which was selected by the user with the
- mouse. The chosen menu title and item are passed in the parameters
- 'title' and 'item', respectively. }
-
- FUNCTION Do_Menu( title, item : integer ) : boolean ;
-
- VAR
- done : boolean ;
-
- BEGIN
- (* Menu_Hilight( menu, title ) ; *)
- done := false ;
- CASE item OF
- MIINFO:
- Do_About ;
- MIEDIT : Compile_Edit( 1 ) ;
- MICOMPIL : Compile_Edit( 2 ) ;
- MILINK : Call_Linker ;
- MIRUN: Call_Program ;
- MICMPOPT : Compiler_Options ;
- MILNKOPT : Link_Options ;
- MISAVOPT: Save_Options ;
- MIQUIT: done := true ;
- (* OTHERWISE:
- done := Do_Alert( '[3][Not yet implemented...|Abort?][ Yes |No]', 0 )
- = 1 ; *)
- END ;
- Menu_Normal( menu, title ) ;
- Do_Menu := done ;
- END ;
-
- PROCEDURE Event_Loop ;
-
- VAR
- which : integer ;
- done : boolean ;
- msg : Message_Buffer ;
-
- BEGIN
- REPEAT
- which := Get_Event( E_Message|E_Keyboard|E_Button, 1, 1, 1, 0,
- false, 0, 0, 0, 0, false, 0, 0, 0, 0,
- msg, dummy, dummy, dummy, dummy, dummy, dummy ) ;
- IF which & E_Message <> 0 THEN
- done := Do_Menu( msg[3], msg[4] ) ;
- UNTIL done ;
- END ;
-
- FUNCTION Low_Resolution : boolean ;
-
- FUNCTION get_rez : integer ;
- XBIOS( 4 ) ;
-
- BEGIN
- Low_Resolution := (get_rez = 0) ;
- END ;
-
- BEGIN
- IF Init_Gem <> -1 THEN
- BEGIN
- IF NOT Load_Resource( 'pascal.rsc' ) THEN
- dummy := Do_Alert( '[3][PASCAL.RSC not found!][ Cancel ]', 0 )
- ELSE IF Low_Resolution THEN
- BEGIN
- Find_Alert( LOWRES, bad_res ) ;
- dummy := Do_Alert( bad_res, 0 ) ;
- END
- ELSE
- BEGIN
- Set_Defaults ;
- Read_Options ;
- new( envp ) ;
- envp^[0] := chr(0) ;
- zero_word := 0 ;
- Find_Menu( PASMENU, menu ) ;
- Draw_Menu( menu ) ;
- Border_Rect( 0, fullx, fully, fullw, fullh ) ;
- Set_Mouse( M_Arrow ) ;
- Do_About ;
- Event_Loop ;
- Erase_Menu( menu ) ;
- END ;
- Exit_Gem ;
- END ;
- END.
-
- { End of pasmain.pas }
-