MODULE DDTERM; (* This module takes a Gfile and ans simply prints the graphics instructions on standard output. $ DDTERM gfile Where gfile is the file containing graphics commands. 1. INIT baudrate 2. ERAS 3. WIND lowerx,lowery,upperx,uppery 4. MAPW xmin,ymin,xmax,ymax 5. MOVE x,y 6. DRAW x,y 7. PLIN pcount,x[1],y[1],...,x[pcount],y[pcount] 8. LPAT SOLI|DASH|DOTT 9. FONT HARD|ROMA|STIC|SCRI|GOTH 10. CSIZ cht,cwid,slant,hindex,vindex 11. COLO BLAC|BLUE|GREE|REDD 12. LORG 3|6|9 13. TEXT x,y,rotation 20 words for 80 byte string 14. *EOG *) FROM VMSRTL IMPORT Lib$Get_Foreign; FROM FileSystem IMPORT File; FROM GfileManager IMPORT OpenGfile, GetW, GetWords, CloseGfile; FROM InOut IMPORT WriteInt, WriteReal, WriteString, WriteLn; PROCEDURE MakePrompt( s : ARRAY OF CHAR ); VAR i : CARDINAL; BEGIN FOR i := 0 TO HIGH( s ) DO prompt[i+1] := s[i] END; prompt[ HIGH(s)+2 ] := 0C END MakePrompt; PROCEDURE cmp( s, t : ARRAY OF CHAR ) : BOOLEAN; VAR i : CARDINAL; BEGIN FOR i := 0 TO HIGH( s ) DO IF s[i] # t[i] THEN RETURN FALSE END END; RETURN TRUE END cmp; PROCEDURE PolyLine( ); VAR pc : INTEGER; x,y: REAL; i : CARDINAL; BEGIN ok := GetW( gf, pc ); IF pc <= 0 THEN RETURN END; WriteLn; FOR i := 1 TO CARDINAL( pc ) DO ok := GetW( gf, x ); ok := GetW( gf, y ); WriteReal( x, rfl ); WriteString(" " ); WriteReal( y, rfl ); WriteLn; END; END PolyLine; CONST ifl = 8; rfl = 10; VAR argv, prompt : ARRAY [1..80] OF CHAR; status, cmdlen : INTEGER; gf : File; ok : BOOLEAN; gcmd : ARRAY [1..4] OF CHAR; lowerx,lowery,upperx,uppery, xmin,ymin,xmax,ymax : REAL; I, pc : CARDINAL; BaudRate : INTEGER; x, y : REAL; cht, cwid : REAL; rotation : REAL; slant : REAL; hcindex : INTEGER; vcindex : INTEGER; int : INTEGER; BEGIN MakePrompt( "Gfile > " ); status := Lib$Get_Foreign( argv, prompt, cmdlen ); IF status # 1 THEN WriteString(" Error in processing command line args" ); WriteLn; HALT END; argv[ cmdlen+1 ] := 0C; IF NOT OpenGfile( gf, argv, TRUE ) THEN WriteString("Error opening " ); WriteString( argv ); WriteLn; HALT END; ok := GetW( gf, gcmd ); WriteString( gcmd ); WriteString( " " ); WHILE ok DO IF cmp( gcmd, "DRAW" ) THEN ok := GetW( gf, x ); ok := GetW( gf, y ); WriteReal( x,rfl ); WriteString(" " ); WriteReal( y,rfl ); ELSIF cmp( gcmd, "MOVE" ) THEN ok := GetW( gf, x ); ok := GetW( gf, y ); WriteReal( x,rfl ); WriteString(" " ); WriteReal( y,rfl ); ELSIF cmp( gcmd, "PLIN" ) THEN PolyLine( ); ELSIF cmp( gcmd, "TEXT" ) THEN ok := GetW( gf, x ); ok := GetW( gf, y ); WriteReal( x,rfl ); WriteString(" " ); WriteReal( y,rfl ); WriteString(" " ); ok := GetW( gf, rotation ); WriteReal( rotation,rfl ); WriteString(" " ); ok := GetW( gf, int ); WriteInt( int, ifl ); WriteLn; ok := GetWords( gf, argv, 20 ); WriteLn; WriteString( argv ); ELSIF cmp( gcmd, "COLO" ) THEN ok := GetW( gf, gcmd ); WriteString( gcmd ); ELSIF cmp( gcmd, "LPAT" ) THEN ok := GetW( gf, gcmd ); WriteString( gcmd ); ELSIF cmp( gcmd, "CSIZ" ) THEN ok := GetW( gf, cht ); ok := GetW( gf, cwid ); ok := GetW( gf, slant ); WriteReal( cht,rfl ); WriteString( " " ); WriteReal( cwid,rfl ); WriteString( " " ); WriteReal( slant,rfl ); WriteString( " " ); ok := GetW( gf, hcindex ); ok := GetW( gf, vcindex ); WriteInt( hcindex, rfl ); WriteString( " " ); WriteInt( vcindex, rfl ); ELSIF cmp( gcmd, "LORG" ) THEN ok := GetW( gf, int ); (* ignore this in RGL *) WriteInt( int, ifl ); ELSIF cmp( gcmd, "FONT" ) THEN ok := GetW( gf, gcmd ); (* ignore font in RGL *) WriteString( gcmd ); ELSIF cmp( gcmd, "WIND" ) THEN ok := GetW( gf, lowerx ); ok := GetW( gf, lowery ); ok := GetW( gf, upperx ); ok := GetW( gf, uppery ); WriteReal( lowerx,rfl ); WriteString( " " ); WriteReal( lowery,rfl ); WriteString( " " ); WriteReal( upperx,rfl ); WriteString( " " ); WriteReal( uppery,rfl ); ELSIF cmp( gcmd, "MAPW" ) THEN ok := GetW( gf, xmin ); ok := GetW( gf, ymin ); ok := GetW( gf, xmax ); ok := GetW( gf, ymax ); WriteReal( xmin ,rfl ); WriteString( " " ); WriteReal( ymin,rfl ); WriteString( " " ); WriteReal( xmax,rfl ); WriteString( " " ); WriteReal( ymax,rfl ); ELSIF cmp( gcmd, "INIT" ) THEN ok := GetW( gf, int ); (* skip the baud *) WriteInt( int, ifl ); ELSIF cmp( gcmd, "ERAS" ) THEN ELSIF cmp( gcmd, "*EOG" ) THEN ok := FALSE; ELSE WriteString(" ??? " ) END; WriteLn; IF ok THEN ok := GetW( gf, gcmd ); (* get next command *) WriteString( gcmd ); WriteString(" " ) END END; (* WHILE *) ok := CloseGfile( gf ); END DDTERM.