unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    OpenDialog1: TOpenDialog;
    Button1: TButton;
    procedure jdi(Sender: TObject);
    procedure pero(Sender: TObject);
    procedure zahniP(Sender: TObject);
    procedure zahniL(Sender: TObject);
    procedure barva(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  soubor, puvodni: TextFile;
  pen: integer;
  uhel: word;
  znak, minuly: char;
  cislo: integer;
  x, y: real;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
  begin
  uhel:=90;
  x:=0;
  y:=0;
  pen:=0;
  if OpenDialog1.Execute then
    AssignFile(puvodni, OpenDialog1.FileName);

  if OpenDialog1.FileName<>'specialneupravenysoubor13579' then AssignFile(soubor, 'specialneupravenysoubor13579.txt')
  else AssignFile(soubor, 'specialneupravenysoubor02468');
  Reset(puvodni);
  Rewrite(soubor);
    repeat
    Read(puvodni, znak);
    if (znak='(') or (znak=')') or (znak='-') or ((znak>='0') and (znak<='9')) or ((znak>='a') and (znak<='z')) then
      Write(soubor, znak);
    until(eof(puvodni));
  CloseFile(puvodni);
  CloseFile(soubor);

  Reset(soubor);
  Read(soubor, znak);
    repeat
     minuly:=znak;
    Read(soubor, znak);
    case znak of
      'd': jdi(Form1);           //naslo se forward
      'n': pero(Form1);          //naslo se pen
      'h': zahniP(Form1);        //naslo se right
      'l': zahniL(Form1);        //naslo se left
      'c': barva(Form1);         //naslo se color
      end;

    until(eof(soubor));
  CloseFile(soubor);
  end;

procedure TForm1.jdi(Sender: TObject);
  var x2, y2: real;
      minus: boolean;
  begin
  Read(soubor, znak);
  minus:=false;
  Read(soubor, znak);
  cislo:=0;
  while (znak='-') or ((znak>='0') and (znak<='9')) do
    begin
    if znak='-' then minus:=true
    else
      begin
      cislo:=cislo*10+StrToInt(znak);
      end;                        
    Read(soubor, znak);
    end;
  if minus then cislo:=0-cislo;
  x2:=x+(cislo*cos(uhel*pi/180));
  y2:=y+(cislo*sin(uhel*pi/180));

  if pen > 0 then
    begin
    Form1.Canvas.MoveTo(400+round(x),400-round(y));
    Form1.Canvas.LineTo(400+round(x2),400-round(y2));
    end;
  x:=x2;
  y:=y2;
  end;

procedure TForm1.zahniP(Sender: TObject);
  var i: word;
  begin
  Read(soubor, znak);
  if znak='o' then Exit;
  Read(soubor, znak);
  Read(soubor, znak);
  cislo:=0;
  while (znak='-') or ((znak>='0') and (znak<='9')) do
    begin
    cislo:=cislo*10+StrToInt(znak);
    Read(soubor, znak);
    end;
  uhel:=uhel-cislo;
  end;

procedure TForm1.zahniL(Sender: TObject);
  var i: word;
  begin
  Read(soubor, znak);
  Read(soubor, znak);
  Read(soubor, znak);
  Read(soubor, znak);
  Read(soubor, znak);
  cislo:=0;
  while (znak='-') or ((znak>='0') and (znak<='9')) do
    begin
    cislo:=cislo*10+StrToInt(znak);
    Read(soubor, znak);
    end;
    uhel:=uhel+cislo;
  end;

procedure TForm1.pero(Sender: TObject);
  begin
  Read(soubor, znak);
  Read(soubor, znak);
  cislo:=0;
  while (znak='-') or ((znak>='0') and (znak<='9')) do
    begin
    cislo:=cislo*10+StrToInt(znak);
    Read(soubor, znak);                                      
    end;
  pen:=cislo;
  if pen>0 then Form1.Canvas.Pen.Width:=pen;
  end;

procedure TForm1.barva(Sender: TObject);
  var modra, zelena, cervena: byte;
      barva: TColor;
  begin
  Read(soubor, znak);       //o
  Read(soubor, znak);       //l
  Read(soubor, znak);       //o
  Read(soubor, znak);       //r
  Read(soubor, znak);       //(
  cislo:=0;
  while (znak='-') or ((znak>='0') and (znak<='9')) do
    begin
    cislo:=cislo*10+StrToInt(znak);
    Read(soubor, znak);
    end;
  modra:=cislo;
  cislo:=0;
  Read(soubor, znak);       //,
  while (znak='-') or ((znak>='0') and (znak<='9')) do
    begin
    cislo:=cislo*10+StrToInt(znak);
    Read(soubor, znak);
    end;
  zelena:=cislo;
  cislo:=0;
  Read(soubor, znak);       //,
  while (znak='-') or ((znak>='0') and (znak<='9')) do
    begin
    cislo:=cislo*10+StrToInt(znak);
    Read(soubor, znak);
    end;
  cervena:=cislo;
  barva:=(256*256*modra)+(256*zelena)+cervena;
  Form1.Canvas.Pen.Color:=barva;
  end;

end.
