(*******************************************************)
(*=====================================================*)
(*    textgenerator   paul h.- koop                    *)
(*                                                     *)
(*=====================================================*)
(*******************************************************)

      program textgenerator( dat , ergebnis ) ;
      uses crt;
(*------ constanten typen variablen -------------------*)

      const
           blank                   = '@';
           punkt                   = #91 ;
           komma                   = #92 ;
           semikolon               = #93 ;
           fragezeichen            = #94 ;
           ausrufezeichen          = #95 ;
           ae                      = #96;
           ue                      = #97;
           oe                      = #98;
           eszett                  = #99;
           null                    =  0  ;

      type
           buchstaben   = blank..eszett;
           vorgaenger   = string(.3.);

      var
           vor             : vorgaenger;
           ergebnis        : text;
           dat             : file of longint;
           name            : string(.80.);
           ch              : buchstaben;
           kein_nachfolger : boolean;
(*---- funktionen prozeduren ---------------------------*)

      function ort ( b : buchstaben ) : longint;
               begin
                    ort := ord ( b ) - ord ('@')
               end;

      function zufall_chr : buchstaben ;
               begin
                    zufall_chr :=char (random(ord(eszett)
                                       -ord(blank))+ord(blank))
               end;

      function  zufall_int ( a,b,c,d : buchstaben ) : longint;
               var
                  n,
                  zahl    :longint;
               begin
                  n := ort(eszett)+1;
                  seek ( dat , ort(a)*n*n*n+ort(b)*n*n+ort(c)*n+ort(d) );
                  read ( dat , zahl );
                  if zahl < 2
                  then
                  zufall_int := zahl
                  else
                  zufall_int := random (zahl) + 1
               end;



       procedure anpassung ( var vor : vorgaenger ; d : buchstaben );
                 begin
                      vor(.1.) := vor(.2.);
                      vor(.2.) := vor(.3.);
                      vor(.3.) := d
                 end;

       function  nachfolger ( var kein_nachfolger : boolean;
                              a,b,c               : buchstaben;
                              zahl                : longint     )
                            : char ;
                 var n,
                     m : longint;
                     d : char;
                 begin
                      n := ort(eszett)+1;
                      if zahl = 0
                      then
                      kein_nachfolger := true
                      else
                      begin
                      d := pred(blank);
                      repeat
                            d := succ(d);
                            seek (dat,ort(a)*n*n*n+ort(b)*n*n+ort(c)*n+ort(d));
                            read(dat,m)
                      until zahl <= m;
                      kein_nachfolger := false
                      end;
                      nachfolger := d
                 end;

(* ============hauptprogramm============================*)

       begin
            writeln('typo generator 5.1 (c) Paul Koop 1988, 1989, 1992');
            write('rohdaten ');
            readln(name);
            assign(dat,name);
            reset(dat);

            write('ergebnis ');
            readln(name);
            assign(ergebnis,name);
            rewrite(ergebnis);

            randomize;
            repeat
            vor(.1.) := zufall_chr;
            vor(.2.) := zufall_chr;
            vor(.3.) := zufall_chr;


            repeat
                  ch := nachfolger(kein_nachfolger,
                                   vor(.1.),
                                   vor(.2.),
                                   vor(.3.),
                                   zufall_int(
                                              vor(.1.),
                                              vor(.2.),
                                              vor(.3.),
                                              eszett       ));
                  anpassung(vor,ch );
                  if kein_nachfolger
                   then
                    write(ergebnis,'#')
                   else
                    if not kein_nachfolger
                     then
                      Case ch of
                       blank           : write(ergebnis,' ');
                       punkt           : write(ergebnis,'.');
                       komma           : write(ergebnis,',');
                       semikolon       : write(ergebnis,';');
                       fragezeichen    : write(ergebnis,'?');
                       ausrufezeichen  : write(ergebnis,'!');
                       ae              : write(ergebnis,'Ž');
                       ue              : write(ergebnis,'š');
                       oe              : write(ergebnis,'™');
                       eszett          : write(ergebnis,'á')
                       else              write(ergebnis,ch)
                      end
            until kein_nachfolger or keypressed
            until keypressed;
            close(dat);
            close(ergebnis)
            end.

