{$S0,D-}
program e_master;

const   {$Ia:gemconst.pas}
        {$Ib:e_master.i}

type    {$Ia:gemtype.pas}

        einheit=record
                  anrede,name,vorname,adresse1,adresse2,plz,ort,staat:string
                end;
var
        aplid,
        laufwerk,
        event,
        dummy,
        i,
        mausklick,
        alarm,
        menu_id,
        fenster,
        durchlauf:integer;
        meldung:message_buffer;
        imp_ptr,dru_ptr:dialog_ptr;
        dialog:tree_index;
        maske,dateiname:string[80];
        alert,acc_name:string[255];
        datei:text;
        zeile,test,abstand:string;
        ende,gefunden,neuzeichnen,ok,druckok,testok,neu:boolean;
        titel:window_title;
        adresse:einheit;

        {$Ia:gemsubs}

procedure klick;
  begin
    event:=get_event(e_message|e_button,($0001),($0001),1,0,
           false,0,0,0,0,
           false,0,0,0,0,
           meldung,dummy,mausklick,dummy,dummy,dummy,dummy)
  end;

procedure fensterauf;
  begin
    fenster:=new_window($0001,titel,0,0,0,0);
    open_window(fenster,0,0,0,0)
  end;

procedure fensterzu;
  begin
    close_window(fenster);
    delete_window(fenster)
  end;

procedure floppyerkennen;

  function dgetdrv:integer;
  gemdos($19);

  begin
    laufwerk:=dgetdrv;
    maske:=concat(chr(65+laufwerk),':\*.RPT')
  end;

procedure impressumzeigen;
  begin
    find_dialog(impresum,imp_ptr);
    center_dialog(imp_ptr);
    show_mouse;
    dialog:=do_dialog(imp_ptr,0);
    neuzeichnen:=true;
    obj_setstate(imp_ptr,dialog,0,neuzeichnen);
    end_dialog(imp_ptr);
    delete_dialog(imp_ptr)
  end;

procedure testen;
  begin
    readln(datei,zeile);
    test:=copy(zeile,1,6);
    if test='Anrede' then
      begin
        if length(zeile)>10 then
          adresse.anrede:=copy(zeile,11,(length(zeile)-10))
        else
          adresse.anrede:='';
        ok:=true
      end
    else
      ok:=false
   end;

procedure lesen;
  var i:integer;

  begin
    druckok:=true;
    with adresse do
      begin
        readln(datei,zeile);
        if length(zeile)>8 then
          name:=copy(zeile,9,(length(zeile)-8))
        else
          name:='';
        readln(datei,zeile);
        if length(zeile)>11 then
          vorname:=copy(zeile,12,(length(zeile)-11))
        else
          vorname:='';
        readln(datei,zeile);
        if length(zeile)>12 then
          adresse1:=copy(zeile,13,(length(zeile)-12))
        else
          adresse1:='';
        readln(datei,zeile);
        if length(zeile)>12 then
          adresse2:=copy(zeile,13,(length(zeile)-12))
        else
          adresse2:='';
        readln(datei,zeile);
        if length(zeile)>7 then
          plz:=copy(zeile,8,(length(zeile)-7))
        else
          plz:='';
        readln(datei,zeile);
        if length(zeile)>7 then
          ort:=copy(zeile,8,(length(zeile)-7))
        else
          ort:='';
        readln(datei,zeile);
        if length(zeile)>9 then
          staat:=copy(zeile,10,(length(zeile)-9))
        else
          staat:=''
      end;
    readln(datei,zeile)
  end;

procedure druckertesten;
  var  testen:integer;
       abbruch:boolean;

  function testdrucker:integer;
  gemdos($11);

  begin
    repeat
      testen:=testdrucker;
      if testen=-1 then
        begin
          testok:=true;
          abbruch:=true
        end
      else
        begin
          set_mouse(m_arrow);
          testok:=false;
          find_dialog(drucker,dru_ptr);
          center_dialog(dru_ptr);
          dialog:=do_dialog(dru_ptr,0);
          if dialog=druckeok then
            abbruch:=false
          else
            abbruch:=true;
          neuzeichnen:=true;
          obj_setstate(dru_ptr,dialog,0,neuzeichnen);
          end_dialog(dru_ptr);
          delete_dialog(dru_ptr);
          if abbruch=false then
            begin
              fensterzu;
              titel:='  ETI-MASTER V.1.1: DATENLESEN UND DRUCKEN  ';
              fensterauf
            end
        end
    until abbruch
  end;


procedure print;
 var kontrollnummer,m:integer;

 begin
   set_mouse(m_bee);
   abstand:='    ';
   rewrite(output,'lst:');
     with adresse do begin
       writeln;
       if anrede='' then
         writeln
       else
         writeln(abstand,anrede);
       if vorname='' then
         writeln(abstand,name)
       else
         writeln(abstand,vorname,' ',name);
       if adresse1<>'' then
         writeln(abstand,adresse1);
       if adresse2<>'' then
         writeln(abstand,adresse2);
       write(abstand,plz,' ');
       write(chr(27),'-');
       write(chr(1));
       writeln(ort);
       write(chr(27),'-');
       write(chr(0));
       if staat='' then
         writeln
       else
         writeln(abstand,staat);
       if (adresse1<>'') and (adresse2<>'') then
         for m:=1 to 2 do
           writeln
       else
         if (adresse1='') and (adresse2='') then
           for m:=1 to 4 do
             writeln
         else
           for m:=1 to 3 do
             writeln
     end;
   rewrite(output,'con:');
   set_mouse(m_arrow)
 end;

procedure hauptprogramm;
begin
  init_mouse;
  hide_mouse;
  floppyerkennen;
  mausklick:=1;
  gefunden:=load_resource('e_master.rsc');
  titel:='';
  fensterauf;
  impressumzeigen;
  fensterzu;
  repeat
    titel:='  ETI-MASTER V.1.1: DATEIEAUSWAHL  ';
    fensterauf;
    if get_in_file(maske,dateiname) then
      begin
        reset(datei,dateiname);
        readln(datei,zeile);
        fensterzu;
        titel:='  ETI-MASTER V.1.1: DATENLESEN UND DRUCKEN  ';
        fensterauf;
        set_mouse(m_bee);
        ende:=false;
        repeat
          testen;
          if ok then
            begin
              lesen;
              druckertesten;
              if testok then
                print
              else
                ok:=false
            end
        until not ok;
        fensterzu
      end
    else
      ende:=true
  until ende;
  fensterzu;
  free_resource
end;

procedure event_loop;
  var   dummy,event:integer;
        msg:message_buffer;

  begin
    while true do
      begin
        event:=get_event(e_message,0,0,0,0,
               false,0,0,0,0,
               false,0,0,0,0,
               msg,dummy,dummy,dummy,dummy,dummy,dummy);
        if msg[0]=ac_open then
           if msg[4]=menu_id
             then hauptprogramm
      end
  end;

begin
  aplid:=init_gem;
  if aplid>=0 then
    begin
      acc_name:='  Eti_Master';
      menu_id:=menu_register(aplid,acc_name);
      event_loop
    end
end.

