mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-09 17:48:14 +02: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.
|
|
|