mirror of
				https://gitlab.com/freepascal.org/lazarus/lazarus.git
				synced 2025-10-31 21:29:27 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			629 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
			
		
		
	
	
			629 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
| unit pdfvrsintatico;
 | |
| 
 | |
| {$mode objfpc}{$H+}
 | |
| 
 | |
| interface
 | |
| 
 | |
| uses
 | |
|   Classes, SysUtils, pdfvrlexico;
 | |
| 
 | |
| type
 | |
|   AnSintaticoPage = class
 | |
|   public
 | |
|     Estado: Int64;
 | |
|     obj1,obj2 : String;
 | |
|     pageFound: Boolean;
 | |
|     constructor Create;
 | |
|     procedure automata(t: Token);
 | |
|   end;
 | |
| 
 | |
|   AnSintaticoPageContents = class
 | |
|   public
 | |
|     Estado: Int64;
 | |
|     obj1,obj2 : String;
 | |
|     len_obj1,len_obj2: String;
 | |
|     contentsFound: Boolean;
 | |
|     h: PageHeader;
 | |
|     constructor Create;
 | |
|     procedure automata(t: Token; Input: TStream);
 | |
|   end;
 | |
| 
 | |
|   AnSintaticoCommand = class
 | |
|   public
 | |
|     Estado: Int64;
 | |
|     Codigo: Boolean;
 | |
|     c: Command;
 | |
|     constructor Create;
 | |
|     function automata(t: Token):Command;
 | |
|   end;
 | |
| 
 | |
|   AnSintaticoLength = class
 | |
|   public
 | |
|     Estado: Int64;
 | |
|     len_obj1,len_obj2: String;
 | |
|     page_length : Int64;
 | |
|     lenghtFound: Boolean;
 | |
|     constructor Create;
 | |
|     procedure automata(t: Token);
 | |
|   end;
 | |
| 
 | |
| implementation
 | |
| 
 | |
| procedure AnSintaticoPage.automata(t: Token);
 | |
| begin
 | |
|   case Estado of
 | |
|   1:
 | |
|   begin
 | |
|     {$ifdef FPVECTORIALDEBUG}
 | |
|     WriteLn(':> AnSintaticoPage.automata Estado 1');
 | |
|     {$endif}
 | |
|              if(t.token_string = 'Type') then
 | |
|                    begin
 | |
|                        Estado := 2;
 | |
|                    end
 | |
|              else
 | |
|                    begin
 | |
|                         Estado := 1;
 | |
|                    end;
 | |
|   end;
 | |
|   2:
 | |
|   begin
 | |
|     {$ifdef FPVECTORIALDEBUG}
 | |
|     WriteLn(':> AnSintaticoPage.automata Estado 2');
 | |
|     {$endif}
 | |
|              if(t.token_string = 'Page') then
 | |
|                    begin
 | |
|                         Estado := 3;
 | |
|                    end
 | |
|              else
 | |
|                    begin
 | |
|                         Estado := 1;
 | |
|                    end;
 | |
|   end;
 | |
|   3:
 | |
|   begin
 | |
|     {$ifdef FPVECTORIALDEBUG}
 | |
|     WriteLn(':> AnSintaticoPage.automata Estado 3');
 | |
|     {$endif}
 | |
|              if(t.token_string = 'Contents') then
 | |
|                    begin
 | |
|                         Estado := 4;
 | |
|                    end
 | |
|              else
 | |
|                    begin
 | |
|                         Estado := 3;
 | |
|                    end;
 | |
|   end;
 | |
|   4:
 | |
|   begin
 | |
|     {$ifdef FPVECTORIALDEBUG}
 | |
|     WriteLn(':> AnSintaticoPage.automata Estado 4');
 | |
|     {$endif}
 | |
|              if(t.tipo = 1) then // numbers 1
 | |
|                    begin
 | |
|                         obj1:=t.token_string;
 | |
|                         Estado := 5;
 | |
|                    end
 | |
|              else
 | |
|                    begin
 | |
|                         raise Exception.Create('ERROR: Arquivo corrompido.');
 | |
|                         Halt(1);
 | |
|                    end;
 | |
|   end;
 | |
|   5:
 | |
|   begin
 | |
|     {$ifdef FPVECTORIALDEBUG}
 | |
|     WriteLn(':> AnSintaticoPage.automata Estado 5');
 | |
|     {$endif}
 | |
|              if(t.tipo = 1) then // numbers 2
 | |
|                    begin
 | |
|                         obj2:=t.token_string;
 | |
|                         Estado := 6; // symbolic state
 | |
|                         pageFound := true;
 | |
|                    end
 | |
|              else
 | |
|                    begin
 | |
|                         raise Exception.Create('ERROR: Arquivo corrompido.');
 | |
|                         Halt(1);
 | |
|                    end;
 | |
|   end;
 | |
|   else
 | |
|     {$ifdef FPVECTORIALDEBUG}
 | |
|     WriteLn(':> AnSintaticoPage.automata Estado ELSE');
 | |
|     {$endif}
 | |
|     Estado := 1;
 | |
|   end;
 | |
| end;
 | |
| 
 | |
| procedure AnSintaticoPageContents.automata(t: Token; Input: TStream);
 | |
| var
 | |
|   myAnLexicoLength: AnLexico;
 | |
|   myAnSintaticoLength: AnSintaticoLength;
 | |
|   mytokenLength: Token;
 | |
| begin
 | |
|   case Estado of
 | |
|   1:
 | |
|   begin
 | |
|     {$ifdef FPVECTORIALDEBUG}
 | |
|     WriteLn(':> AnSintaticoPageContents.automata Estado 1');
 | |
|     {$endif}
 | |
|              if(t.token_string = obj1) then
 | |
|                    begin
 | |
|                         Estado := 2;
 | |
|                    end
 | |
|              else
 | |
|                    begin
 | |
|                         Estado := 1;
 | |
|                    end;
 | |
|   end;
 | |
|   2:
 | |
|   begin
 | |
|     {$ifdef FPVECTORIALDEBUG}
 | |
|     WriteLn(':> AnSintaticoPageContents.automata Estado 2');
 | |
|     {$endif}
 | |
|              if(t.token_string = obj2) then
 | |
|                    begin
 | |
|                         Estado := 3;
 | |
|                    end
 | |
|              else
 | |
|                    begin
 | |
|                         Estado := 1;
 | |
|                    end;
 | |
|   end;
 | |
|   3:
 | |
|   begin
 | |
|     {$ifdef FPVECTORIALDEBUG}
 | |
|     WriteLn(':> AnSintaticoPageContents.automata Estado 3');
 | |
|     {$endif}
 | |
|              if(t.token_string = 'obj') then
 | |
|                    begin
 | |
|                         Estado := 4;
 | |
|                    end
 | |
|              else
 | |
|                    begin
 | |
|                         Estado := 1;
 | |
|                    end;
 | |
|   end;
 | |
|   4:
 | |
|   begin
 | |
|     {$ifdef FPVECTORIALDEBUG}
 | |
|     WriteLn(':> AnSintaticoPageContents.automata Estado 4');
 | |
|     {$endif}
 | |
|              if(t.token_string = 'Length') then
 | |
|                    begin
 | |
|                         Estado := 5;
 | |
|                    end
 | |
|              else if (t.token_string = 'Filter') then
 | |
|                   begin
 | |
|                        Estado := 7;
 | |
|                   end
 | |
|              else
 | |
|                    begin
 | |
|                         Estado := 4;
 | |
|                    end;
 | |
|   end;
 | |
|   5:
 | |
|   begin
 | |
|     {$ifdef FPVECTORIALDEBUG}
 | |
|     WriteLn(':> AnSintaticoPageContents.automata Estado 5');
 | |
|     {$endif}
 | |
|              if(t.tipo = 1) then
 | |
|                    begin
 | |
|                         h.page_length := StrToInt(t.token_string);
 | |
|                         len_obj1:=t.token_string;
 | |
|                         Estado := 6;
 | |
|                    end
 | |
|              else
 | |
|                    begin
 | |
|                         raise Exception.Create('ERROR: Arquivo corrompido.');
 | |
|                         Halt(1);
 | |
|                    end;
 | |
|   end;
 | |
|   6:
 | |
|   begin
 | |
|     {$ifdef FPVECTORIALDEBUG}
 | |
|     WriteLn(':> AnSintaticoPageContents.automata Estado 6');
 | |
|     {$endif}
 | |
|              if(t.token_string = 'Filter') then
 | |
|                    begin
 | |
|                         Estado := 7;
 | |
|                    end
 | |
|              else if (t.token_string = 'stream') then
 | |
|                   begin
 | |
|                        contentsFound := true;
 | |
|                        Estado := 9; // symbolic state
 | |
|                   end
 | |
|              else if (t.tipo = 1) then
 | |
|                   begin
 | |
|                       len_obj2:=t.token_string;
 | |
|                       myAnLexicoLength := AnLexico.Create;
 | |
|                       myAnLexicoLength.Doc := Input;
 | |
|                       myAnLexicoLength.bytesRemaining:= myAnLexicoLength.Doc.Size;
 | |
|                       myAnSintaticoLength := AnSintaticoLength.Create;
 | |
| 
 | |
|                       myAnSintaticoLength.len_obj1:=len_obj1;
 | |
|                       myAnSintaticoLength.len_obj2:=len_obj2;
 | |
| 
 | |
|                       while ((myAnSintaticoLength.lenghtFound <> true) and
 | |
|                             (myAnLexicoLength.bytesRemaining > 0)) do
 | |
|                       begin
 | |
|                            mytokenLength := myAnLexicoLength.getToken();
 | |
|                            myAnSintaticoLength.automata(mytokenLength);
 | |
|                       end;
 | |
| 
 | |
|                       if (myAnSintaticoLength.lenghtFound = false) then
 | |
|                       begin
 | |
|                            raise Exception.Create('ERROR: Arquivo corrompido.');
 | |
|                            Halt(1);
 | |
|                       end;
 | |
| 
 | |
|                       h.page_length:=myAnSintaticoLength.page_length;
 | |
|                       myAnLexicoLength.Doc.Destroy;
 | |
|                       Estado := 6;
 | |
|                   end
 | |
|              else
 | |
|                    begin
 | |
|                         Estado := 6;
 | |
|                    end;
 | |
|   end;
 | |
|   7:
 | |
|   begin
 | |
|     {$ifdef FPVECTORIALDEBUG}
 | |
|     WriteLn(':> AnSintaticoPageContents.automata Estado 7');
 | |
|     {$endif}
 | |
|              if(t.token_string = 'FlateDecode') then
 | |
|                    begin
 | |
|                         h.flate_decode := true;
 | |
|                         Estado := 8;
 | |
|                    end
 | |
|              else
 | |
|                    begin
 | |
|                         raise Exception.Create('ERROR: Encodificacao nao suportada.');
 | |
|                         Halt(1);
 | |
|                    end;
 | |
|   end;
 | |
|   8:
 | |
|   begin
 | |
|     {$ifdef FPVECTORIALDEBUG}
 | |
|     WriteLn(':> AnSintaticoPageContents.automata Estado 8');
 | |
|     {$endif}
 | |
|              if(t.token_string = 'stream') then
 | |
|                    begin
 | |
|                         contentsFound := true;
 | |
|                         Estado := 9; // symbolic state
 | |
|                    end
 | |
|              else if (t.token_string = 'Length') then
 | |
|                   begin
 | |
|                        Estado := 5;
 | |
|                   end
 | |
|              else
 | |
|                    begin
 | |
|                         Estado := 8;
 | |
|                    end;
 | |
|   end;
 | |
|   else
 | |
|     {$ifdef FPVECTORIALDEBUG}
 | |
|     WriteLn(':> AnSintaticoPageContents.automata Estado ELSE');
 | |
|     {$endif}
 | |
|     Estado := 1;
 | |
|   end;
 | |
| end;
 | |
| 
 | |
| procedure AnSintaticoLength.automata(t: Token);
 | |
| begin
 | |
|   case Estado of
 | |
|   1:
 | |
|   begin
 | |
|     {$ifdef FPVECTORIALDEBUG}
 | |
|     WriteLn(':> AnSintaticoLength.automata Estado 1');
 | |
|     {$endif}
 | |
|              if(t.token_string = len_obj1) then
 | |
|                    begin
 | |
|                         Estado := 2;
 | |
|                    end
 | |
|              else
 | |
|                    begin
 | |
|                         Estado := 1;
 | |
|                    end;
 | |
|   end;
 | |
|   2:
 | |
|   begin
 | |
|     {$ifdef FPVECTORIALDEBUG}
 | |
|     WriteLn(':> AnSintaticoLength.automata Estado 2');
 | |
|     {$endif}
 | |
|              if(t.token_string = len_obj2) then
 | |
|                    begin
 | |
|                         Estado := 3;
 | |
|                    end
 | |
|              else
 | |
|                    begin
 | |
|                         Estado := 1;
 | |
|                    end;
 | |
|   end;
 | |
|   3:
 | |
|   begin
 | |
|     {$ifdef FPVECTORIALDEBUG}
 | |
|     WriteLn(':> AnSintaticoLength.automata Estado 3');
 | |
|     {$endif}
 | |
|              if(t.token_string = 'obj') then
 | |
|                    begin
 | |
|                         Estado := 4;
 | |
|                    end
 | |
|              else
 | |
|                    begin
 | |
|                         Estado := 1;
 | |
|                    end;
 | |
|   end;
 | |
|   4:
 | |
|   begin
 | |
|     {$ifdef FPVECTORIALDEBUG}
 | |
|     WriteLn(':> AnSintaticoLength.automata Estado 4 Length: ', StrToInt(t.token_string));
 | |
|     {$endif}
 | |
|              if(t.tipo = 1) then
 | |
|                    begin
 | |
|                         page_length:=StrToInt(t.token_string);
 | |
|                         lenghtFound:=true;
 | |
|                         Estado := 5; // symbolic state
 | |
|                    end
 | |
|              else
 | |
|                    begin
 | |
|                         raise Exception.Create('ERROR: Arquivo corrompido.');
 | |
|                         Halt(1);
 | |
|                    end;
 | |
|   end;
 | |
|   else
 | |
|     {$ifdef FPVECTORIALDEBUG}
 | |
|     WriteLn(':> AnSintaticoLength.automata Estado ELSE');
 | |
|     {$endif}
 | |
|     Estado := 1;
 | |
|   end;
 | |
| end;
 | |
| 
 | |
| function AnSintaticoCommand.automata(t: Token):Command;
 | |
| begin
 | |
|   c.cord_x3 := c.cord_y3;
 | |
|   c.cord_y3 := c.cord_x2;
 | |
|   c.cord_x2 := c.cord_y2;
 | |
|   c.cord_y2 := c.cord_x;
 | |
|   c.cord_x := c.cord_y;
 | |
|   c.cord_y := c.my_operator;
 | |
|   c.my_operator := t.token_string;
 | |
|   c.code := cc_NONE;
 | |
| 
 | |
|   Codigo := false;
 | |
| 
 | |
|   case Estado of
 | |
|   1:
 | |
|   begin
 | |
|     {$ifdef FPVECTORIALDEBUG}
 | |
|     WriteLn(':> AnSintaticoCommand.automata Estado 1');
 | |
|     {$endif}
 | |
|              if(t.tipo = 1) then // numbers 1
 | |
|                    begin
 | |
|                        Estado := 2;
 | |
|                    end
 | |
|              else if( t.token_string = 'h' ) then  // command h
 | |
|                   begin
 | |
|                         Estado := 9; // symbolic state
 | |
|                         Estado := 1;
 | |
|                         Codigo := true;
 | |
|                         c.code:=cc_H_CLOSE_PATH;
 | |
|                         Result:=c;
 | |
|                   end
 | |
|              else if( t.token_string = 's' ) then // command s
 | |
|                   begin
 | |
|                         Estado := 10; // symbolic state
 | |
|                         Estado := 1;
 | |
|                         Codigo := true;
 | |
|                         c.code:=cc_hS_CLOSE_AND_END_PATH;
 | |
|                         Result:=c;
 | |
|                   end
 | |
|              else if( t.token_string = 'S' ) then // command S
 | |
|                   begin
 | |
|                         Estado := 11; // symbolic state
 | |
|                         Estado := 1;
 | |
|                         Codigo := true;
 | |
|                         c.code:=cc_S_END_PATH;
 | |
|                         Result:=c;
 | |
|                   end
 | |
|              else if( t.token_string = 'Q' ) then // command Q
 | |
|                   begin
 | |
|                        Estado := 21; // symbolic state
 | |
|                        Estado := 1;
 | |
|                        Codigo := true;
 | |
|                        c.code:=cc_RESTORE_MATRIX;
 | |
|                        Result:=c;
 | |
|                   end
 | |
|              else if ((t.token_string = 'f') or (t.token_string = 'F')
 | |
|                   or (t.token_string = 'f*') or (t.token_string = 'B')
 | |
|                   or (t.token_string = 'B*') or (t.token_string = 'b')
 | |
|                   or (t.token_string = 'b*') or (t.token_string = 'n')) then
 | |
|                   begin
 | |
|                       Estado := 12; // symbolic state
 | |
|                       Estado := 1;
 | |
|                       Codigo := true;
 | |
|                       c.code:=cc_hS_CLOSE_AND_END_PATH; // ignore painting..
 | |
|                       Result:=c;
 | |
|                       //raise Exception.Create('ERROR: Prenchimento nao eh suportado.');
 | |
|                       //Halt(1);
 | |
|                   end
 | |
|              else if ((t.token_string = 'W') or (t.token_string = 'W*')) then
 | |
|                   begin
 | |
|                       Estado := 13; // symbolic state
 | |
|                       raise Exception.Create('ERROR: Clipping nao eh suportado.');
 | |
|                       Halt(1);
 | |
|                   end
 | |
|              else
 | |
|                    begin
 | |
|                         Estado := 1;
 | |
|                    end;
 | |
|   end;
 | |
|   2:
 | |
|   begin
 | |
|     {$ifdef FPVECTORIALDEBUG}
 | |
|     WriteLn(':> AnSintaticoCommand.automata Estado 2');
 | |
|     {$endif}
 | |
|              if(t.tipo = 1) then // numbers 2
 | |
|                    begin
 | |
|                         Estado := 3;
 | |
|                    end
 | |
|              else
 | |
|                    begin
 | |
|                         Estado := 1;
 | |
|                    end;
 | |
|   end;
 | |
|   3:
 | |
|   begin
 | |
|     {$ifdef FPVECTORIALDEBUG}
 | |
|     WriteLn(':> AnSintaticoCommand.automata Estado 3');
 | |
|     {$endif}
 | |
|              if(t.tipo = 1) then // numbers 3
 | |
|                   begin
 | |
|                        Estado := 5;
 | |
|                   end
 | |
|              else if(t.token_string = 'l') then // command l
 | |
|                   begin
 | |
|                        Estado := 14; // symbolic state
 | |
|                        Estado := 1;
 | |
|                        c.code:=cc_l_ADD_LINE_TO_PATH;
 | |
|                        Codigo := true;
 | |
|                        Result:=c;
 | |
|                   end
 | |
|              else if(t.token_string = 'm') then  // command m
 | |
|                   begin
 | |
|                        Estado := 15; // symbolic state
 | |
|                        Estado := 1;
 | |
|                        c.code:=cc_m_START_PATH;
 | |
|                        Codigo := true;
 | |
|                        Result:=c;
 | |
|                   end
 | |
|              else
 | |
|                   begin
 | |
|                        Estado := 1;
 | |
|                   end;
 | |
|   end;
 | |
|   5:
 | |
|   begin
 | |
|     {$ifdef FPVECTORIALDEBUG}
 | |
|     WriteLn(':> AnSintaticoCommand.automata Estado 5');
 | |
|     {$endif}
 | |
|              if(t.tipo = 1) then // numbers 4
 | |
|                    begin
 | |
|                        Estado := 6;
 | |
|                    end
 | |
|              else
 | |
|                    begin
 | |
|                         Estado := 1;
 | |
|                    end;
 | |
|   end;
 | |
|   6:
 | |
|   begin
 | |
|     {$ifdef FPVECTORIALDEBUG}
 | |
|     WriteLn(':> AnSintaticoCommand.automata Estado 6');
 | |
|     {$endif}
 | |
|              if(t.tipo = 1) then // numbers 5
 | |
|                    begin
 | |
|                        Estado := 7;
 | |
|                    end
 | |
|              else if( t.token_string = 'v' ) then // command v
 | |
|                   begin
 | |
|                        Estado := 16; // symbolic state
 | |
|                        raise Exception.Create('ERROR: Curva de bezier nao eh suportada.');
 | |
|                        Halt(1);
 | |
|                   end
 | |
|              else if( t.token_string = 'y' ) then // command y
 | |
|                   begin
 | |
|                        Estado := 17; // symbolic state
 | |
|                        raise Exception.Create('ERROR: Curva de bezier nao eh suportada.');
 | |
|                        Halt(1);
 | |
|                   end
 | |
|              else if( t.token_string = 're' ) then // command re
 | |
|                   begin
 | |
|                        Estado := 18; // symbolic state
 | |
|                        raise Exception.Create('ERROR: Comando nao suportado.');
 | |
|                        Halt(1);
 | |
|                   end
 | |
|              else
 | |
|                    begin
 | |
|                         Estado := 1;
 | |
|                    end;
 | |
|   end;
 | |
|   7:
 | |
|   begin
 | |
|     {$ifdef FPVECTORIALDEBUG}
 | |
|     WriteLn(':> AnSintaticoCommand.automata Estado 7');
 | |
|     {$endif}
 | |
|              if(t.tipo = 1) then // numbers 6
 | |
|                    begin
 | |
|                        Estado := 8;
 | |
|                    end
 | |
|              else
 | |
|                    begin
 | |
|                         Estado := 1;
 | |
|                    end;
 | |
|   end;
 | |
|   8:
 | |
|   begin
 | |
|     {$ifdef FPVECTORIALDEBUG}
 | |
|     WriteLn(':> AnSintaticoCommand.automata Estado 8');
 | |
|     {$endif}
 | |
|              if(t.token_string = 'c') then // commmand c
 | |
|                    begin
 | |
|                        Estado := 19; // symbolic state
 | |
|                        Estado := 1;
 | |
|                        c.code:=cc_c_BEZIER_TO_X_Y_USING_X2_Y2_AND_X3_Y3;
 | |
|                        Codigo := true;
 | |
|                        Result:=c;
 | |
|                    end
 | |
|              else if( t.token_string = 'cm' ) then // command cm
 | |
|                   begin
 | |
|                        Estado := 20; // symbolic state
 | |
|                        Estado := 1;
 | |
|                        c.code:=cc_CONCATENATE_MATRIX;
 | |
|                        Codigo := true;
 | |
|                        Result:=c;
 | |
|                   end
 | |
|              else
 | |
|                    begin
 | |
|                         Estado := 1;
 | |
|                    end;
 | |
|   end;
 | |
|   else
 | |
|     {$ifdef FPVECTORIALDEBUG}
 | |
|     WriteLn(':> AnSintaticoCommand.automata Estado ELSE');
 | |
|     {$endif}
 | |
|     Estado := 1;
 | |
|   end;
 | |
| end;
 | |
| 
 | |
| constructor AnSintaticoCommand.Create;
 | |
| begin
 | |
|   inherited Create;
 | |
|   Estado := 1;
 | |
| end;
 | |
| 
 | |
| constructor AnSintaticoPage.Create;
 | |
| begin
 | |
|   inherited Create;
 | |
|   Estado := 1;
 | |
|   pageFound := false;
 | |
| end;
 | |
| 
 | |
| constructor AnSintaticoPageContents.Create;
 | |
| begin
 | |
|   inherited Create;
 | |
|   Estado := 1;
 | |
|   contentsFound := false;
 | |
|   h.flate_decode := false;
 | |
| end;
 | |
| 
 | |
| constructor AnSintaticoLength.Create;
 | |
| begin
 | |
|   inherited Create;
 | |
|   Estado := 1;
 | |
|   lenghtFound := false;
 | |
| end;
 | |
| 
 | |
| end.
 | |
| 
 | 
