home *** CD-ROM | disk | FTP | other *** search
- (* ----------------------------------------------------------------------- *)
- (* LISTPASC.PAS *)
- (* Hilfsprogramm zum Ausdruck von Pascaltexten fuer ATARI ST *)
- (* Als Accessorie unter GEM aufrufbar, Compiler Pascal ST + *)
-
- (*$O,D-*) (* Option nur setzen, wenn Accessorie gewuenscht!! *)
- PROGRAM PrintFile;
- CONST
- maxWords = 61; (* Anzahl der markierbaren Worte *)
- (*$I gemconst.pas *)
- TYPE
- Datei = TEXT;
- PackChar = PACKED ARRAY[1..255] OF CHAR;
- str128 = STRING[128];
- str13 = STRING[13];
- (*$I gemtype.pas *)
- VAR
- fname : path_name; (* in gemtype definiert *)
- eindat : Datei;
- RW : ARRAY[1..maxWords] OF str13;
- fett, unter, unterfett,
- Epson, Itoh, Atari, (* nur noetig, wenn versch. Drucker *)
- Kommentar,imText : BOOLEAN;
- menu_id,Appl_Id,i : INTEGER;
- alstr, mein_Menu : str255;
-
- (*$I gemsubs.pas *)
- (* ----------------------------------------------------------------------- *)
- PROCEDURE WordInit;
- BEGIN (*Turbo kann das mit den typisierten Konstanten besser !!! *)
- RW[ 1]:='AND'; RW[ 2]:='ARRAY'; RW[ 3]:='BEGIN'; RW[ 4]:='CASE';
- RW[ 5]:='CONST'; RW[ 6]:='DIV' ; RW[ 7]:='DO'; RW[ 8]:='DOWNTO';
- RW[ 9]:='ELSE'; RW[10]:='END'; RW[11]:='END.';
- RW[12]:='EXTERNAL'; RW[13]:='FILE'; RW[14]:='FOR'; RW[15]:='GOTO';
- RW[16]:='FORWARD'; RW[17]:='FUNCTION'; RW[18]:='IF'; RW[19]:='IN';
- RW[20]:='PROCEDURE'; RW[21]:='LABEL'; RW[22]:='MOD';
- RW[23]:='NIL'; RW[24]:='PROGRAM';
- RW[25]:='RECORD'; RW[26]:='OF'; RW[27]:='OR'; RW[28]:='PACKED';
- RW[29]:='REPEAT'; RW[30]:='SET'; RW[31]:='SHL'; RW[32]:='STRING';
- RW[33]:='SHR'; RW[34]:='THEN'; RW[35]:='TO'; RW[36]:='TYPE';
- RW[37]:='UNTIL'; RW[38]:='VAR'; RW[39]:='WHILE'; RW[40]:='WITH';
- RW[41]:='XOR'; RW[42]:='GEMDOS'; RW[43]:='BIOS'; RW[44]:='XBIOS';
- RW[45]:='EXIT'; RW[46]:='LOOP'; RW[47]:='ALFA';
- RW[48]:='OTHERWISE'; RW[49]:='BYTE'; RW[50]:='BOOLEAN';
- RW[51]:='CHAR'; RW[52]:='INTEGER'; RW[53]:='REAL';
- RW[54]:='TEXT'; RW[55]:='FALSE'; RW[56]:='LONG_INTEGER';
- RW[57]:='TRUE'; RW[58]:='NOT'; RW[59]:='MAXINT';
- RW[60]:='CHR'; RW[61]:='ORD';
- END;
- (* ----------------------------------------------------------------------- *)
- FUNCTION HolFile (VAR FileName : path_name) : BOOLEAN;
- VAR Pfad : path_name;
- BEGIN
- Pfad := 'A:\*.PAS';
- IF Get_in_File(Pfad,FileName) THEN HolFile :=TRUE ELSE HolFile := FALSE;
- END;
- (* ----------------------------------------------------------------------- *)
- (* wandelt Kleintexte in Grosstexte *)
- PROCEDURE mach_gross (VAR Wort : str128);
- VAR i : INTEGER;
- BEGIN
- FOR i := 1 TO Length(Wort) DO
- IF Wort[i] IN ['a'..'z'] THEN Wort[i] := Chr(Ord(Wort[i])-32);
- END;
- (* ----------------------------------------------------------------------- *)
- (* Uebergebene Zeile wird auf zu markierende Woerter abgesucht *)
- PROCEDURE Zerlegen (Zeile : PackChar; len : INTEGER);
- VAR Wort : str128; ZeilPos : INTEGER;
- (* --------------------------------------------------------------------- *)
- (* Stringvergleiche *)
- FUNCTION compare (s1 : str128; s2 : str13) : BOOLEAN;
- VAR i : INTEGER; ist_gleich : BOOLEAN;
- BEGIN
- ist_gleich := FALSE; i := 1;
- IF Length(s1) = Length(s2) THEN BEGIN
- WHILE (s1[i] = s2[i]) AND (i <= Length(s1)) DO i := Succ(i);
- IF i > Length(s1) THEN ist_gleich := TRUE;
- END;
- compare := ist_gleich;
- END;
- (* --------------------------------------------------------------------- *)
- (* absuchen und wandeln, falls nicht in Kommentarklammern *)
- (* und nicht in Texten innerhalb von Textkonstanten *)
- FUNCTION Wort_Reserviert (VAR Wort : str128) : BOOLEAN;
- VAR i : INTEGER; HilfsWort : str128; gefunden : BOOLEAN;
- BEGIN
- HilfsWort := Wort; gefunden := FALSE; i := 1; mach_gross(HilfsWort);
- IF NOT (Kommentar) AND NOT (imText) THEN
- REPEAT
- IF compare(HilfsWort,RW[i]) THEN gefunden := TRUE;
- i := Succ(i);
- UNTIL (gefunden) OR (i = maxWords +1);
- Wort_Reserviert := gefunden;
- END;
- (* --------------------------------------------------------------------- *)
- (* Umlautschalterei beim Epson, bei Itoh geht's per Software leider *)
- (* nicht, der Atari (IBM) braucht's nicht *)
- PROCEDURE chckumlaut (z : CHAR);
- VAR umlstr : STRING[20]; i : INTEGER;
- BEGIN
- IF (imText) OR (Kommentar) THEN BEGIN
- umlstr := 'Ä[Ö\Ü]ä{ö|ü}ß~';
- i:= -1 ;
- REPEAT i := i+2; UNTIL (i > 13) OR (z = umlstr[i]);
- IF i <= 13 THEN BEGIN
- IF Epson THEN
- Write(Chr(27),'R',Chr(2),umlstr[i+1],Chr(27),'R',Chr(0))
- ELSE IF Itoh THEN Write(umlstr[i+1]);
- END
- ELSE Write(z);
- END
- ELSE Write(z)
- END;
- (* --------------------------------------------------------------------- *)
- (* hervorgehoben ausdrucken je nach Druckertyp aussuchen *)
- PROCEDURE hebe_hervor (VAR Wort : str128);
- BEGIN
- mach_gross(Wort);
- IF (Atari OR Epson) THEN BEGIN
- IF fett THEN Write(Chr(27),'E',Wort,Chr(27),'F');
- IF unter THEN Write(Chr(27),'-',Chr(1),Wort,Chr(27),'-',Chr(0));
- IF unterfett THEN BEGIN
- Write(Chr(27),'E',Chr(27),'-',Chr(1),Wort);
- Write(Chr(27),'-',Chr(0),Chr(27),'F');
- END;
- END;
- IF Itoh THEN BEGIN
- IF fett THEN Write(Chr(27),'!',Wort, Chr(27),'"');
- IF unter THEN Write(Chr(27),'X',Wort, Chr(27),'Y');
- IF unterfett THEN
- Write(Chr(27),'X',Chr(27),'!',Wort,Chr(27),'"',Chr(27),'Y');
- END;
- END;
- (* --------------------------------------------------------------------- *)
- BEGIN (* Zerlegen *)
- Wort := Chr(0); ZeilPos := 1; Zeile[len] := Chr(13);
- WHILE ZeilPos <= len DO BEGIN (* Wort muss mit Alfazeichen anfangen: *)
- IF Zeile[ZeilPos] IN ['A'..'Z','a'..'z'] THEN BEGIN
- Wort := Zeile[ZeilPos]; ZeilPos := Succ(ZeilPos);
- (* der Rest muss Alfa oder der Unterstrich sein: *)
- WHILE (Zeile[ZeilPos] IN ['A'..'Z','a'..'z','_'])
- AND (ZeilPos <= len) DO BEGIN
- Wort := Concat(Wort,Zeile[ZeilPos]); ZeilPos := Succ(ZeilPos);
- END;
- END
- ELSE BEGIN
- IF Wort <> Chr(0) THEN IF Wort_Reserviert(Wort) THEN hebe_hervor(Wort)
- ELSE Write(Wort);
- Wort := Chr(0);
- IF (Epson) OR (Itoh) THEN chckumlaut(Zeile[ZeilPos])
- ELSE Write(Zeile[ZeilPos]);
- IF NOT(imText) AND ((Zeile[ZeilPos] = '{') OR ((Zeile[ZeilPos] = '(')
- AND (Zeile[ZeilPos+1] = '*'))) THEN
- Kommentar := TRUE;
- IF NOT(imText) AND ((Zeile[ZeilPos] = '}') OR ((Zeile[ZeilPos] = '*')
- AND (Zeile[ZeilPos+1] = ')'))) THEN
- Kommentar := FALSE;
- IF NOT(Kommentar) AND (Zeile[ZeilPos] = Chr(39)) THEN
- imText := NOT(imText);
- ZeilPos := Succ(ZeilPos);
- END;
- END;
- imText := FALSE;
- END;
- (* ----------------------------------------------------------------------- *)
- PROCEDURE printKopf (fn : path_name; Seite : INTEGER);
- BEGIN
- WriteLn; WriteLn(' Ausdruck von ',fn,'Seite: ':20,Seite); WriteLn;
- END;
-
- PROCEDURE printFuss;
- BEGIN WriteLn; WriteLn; WriteLn; END;
-
- PROCEDURE laden (fname : path_name);
- VAR Zeile, Seite, chz : INTEGER; ch : CHAR; ArbZeile : PackChar;
- BEGIN
- Seite := 1; ReSet(eindat,fname); printKopf(fname, Seite); Zeile := 1;
- WHILE NOT Eof(eindat) DO BEGIN
- IF Zeile MOD 66 = 0 THEN BEGIN
- printFuss; Seite := Succ(Seite); printKopf(fname, Seite);
- END;
- WriteLn; Write(Zeile:4,': '); Zeile := Succ(Zeile); chz := 1;
- REPEAT (* eine Arbeitszeile fuellen *)
- Read(eindat,ch); ArbZeile[chz] := ch; chz := Succ(chz);
- UNTIL Eoln(eindat);
- Zerlegen(ArbZeile,chz); (* und Zeile untersuchen *)
- END;
- WriteLn;
- END;
- (* ----------------------------------------------------------------------- *)
- PROCEDURE druckein;
- BEGIN
- ReWrite(Output,'PRN:'); IF Epson THEN Write(Chr(27),'R',Chr(0));
- END;
-
- PROCEDURE druckaus;
- BEGIN ReWrite(Output,'CON:'); END;
- (* ----------------------------------------------------------------------- *)
- (* soll Programm nicht als Accessorie laufen, die Folgeprozedur zum *)
- (* Hauptprogramm erklaeren ! *)
- PROCEDURE ausgeben;
- VAR i : INTEGER;
- BEGIN
- WordInit;
- fett := TRUE; unter := FALSE; unterfett := FALSE;
- Epson := FALSE; Itoh := FALSE; Atari := FALSE;
- Kommentar := FALSE; imText := FALSE; (* GEM-Dialogbox: *)
- i := do_alert('[2][ Welcher Drucker ][Itoh |Atari|Epson]',2);
- CASE i OF
- 1: Itoh := TRUE; 2: Atari := TRUE; 3: Epson := TRUE;
- END;
- i := do_alert('[2][ Hervorhebung ][Unter|fett |beides]',2);
- CASE i OF
- 1: BEGIN unter := TRUE; fett := FALSE; END;
- 2: fett := TRUE;
- 3: BEGIN unterfett := TRUE; fett := FALSE; END;
- END;
- druckein;
- IF HolFile(fname) THEN laden(fname);
- druckaus;
- END; (* bezw. "END.", wenn kein Accessorie und Rest weglassen !! *)
- (* ----------------------------------------------------------------------- *)
- PROCEDURE Event_Loop;
- VAR event, du : INTEGER; msg : Message_Buffer; (* in gemtype definiert *)
- BEGIN
- WHILE TRUE DO BEGIN (* auf eine Ereignis-Botschaft von GEM warten *)
- event := Get_event(E_Message,0,0,0,0,
- FALSE,0,0,0,0,FALSE,0,0,0,0,
- msg, du,du,du,du,du,du);
- IF msg[0] = AC_Open THEN (* Botschaft = "Accessorie oeffnen" ? *)
- IF msg[4] = menu_id THEN (* Ja, aber ist PrintFile gemeint ? *)
- ausgeben; (* jawoll, alos los.... *)
- END;
- END;
- (* ----------------------------------------------------------------------- *)
- BEGIN (*********** Accessorie-Hauptprogramm *************)
- Appl_Id := Init_Gem; (* Accessorie bei GEM anmelden *)
- IF Appl_Id >= 0 THEN BEGIN (* hat Anmeldung geklappt ? *)
- mein_Menu := ' ListPascal'; (* ja, PrintFile in Desk-Menue *)
- menu_id := Menu_Register(Appl_Id,mein_Menu); (* eintragen... *)
- Event_Loop; (* ... und abwarten... *)
- END;
- END.