/*
 *          autotrennE.c             © by Martin Steppler
 */

#define TIEFER if(a[e] [f] [we+wl-1] <9) wl--; we--;
#define HOEHER if(a[e] [f] [we+wl+1] <9) wl++; we++;
#define MERKEN zw=a[e] [f] [we+wl];
#define KFRAGE if(Ktest(a[e] [f] [we+wl]))
#define VFRAGE if(Vtest(a[e] [f] [we+wl]))

int mit;

SchnellTest(e,f,xneu)
int e,f,xneu;
{
   int xalt=x, salt=s, zalt=z, len;

   x=xneu; s=e; z=f; len=Testen(stil); s=salt; z=zalt; x=xalt;
   return(len);
}
Ktest(p) /* Test auf Konsonanten plus ß */
int p;
{
   if(p>97 && p<=122 && p!=101 && p!=105 && p!=111 && p!=117)
      return(1); /* p ist kleiner Konsonant */

   if((p>65 && p<=90 && p!=69 && p!=73 && p!=79 && p!=85) || p==223)
      return(1); /* p ist großer Konsonant oder ß */
   return(0);
}
Vtest(p) /* Test auf Vokale und Umlaute */
int p;
{
   if(p==97 || p==101 || p==105 || p==111 || p==117)
      return(1); /* p ist kleiner Vokal */

   if(p==228 || p==246 || p==252)
      return(1); /* p ist kleiner Umlaut */

   if(p==65 || p==69 || p==73 || p==79 || p==85)
      return(1); /* p ist großer Vokal */

   if(p==196 || p==214 || p==220)
      return(1); /* p ist großer Umlaut */
   return(0);
}

AutoTrenn(g, len, i2, st2, e, f, eg)
int g, len, i2, st2, e, f, eg;
{
   int we=eg-1, wl, el=0, zw=0;

   mit=0;
   if(g==1) { if(a[e] [f] [g+len] != 32) { g=len=0; } }
   wl=SchnellTest(e,f,eg--);    /* el */
   FOREVER {          /* Ans Wortende springen */
      if(we+wl+1<i2) {
         if(Ktest(a[e] [f] [we+wl+1]) || Vtest(a[e] [f] [we+wl+1])) {
            we++; continue; }
         if(a[e] [f] [we+wl+1]  <9) { wl++; continue; }
      }
      break;
   }
   if(a[e] [f] [we+wl] <9) wl--;   /* Steuercode für Sonderzeichen ? */
   if((eg-g>=3 && we-g>=5) || (!g && eg>=2 && we>=4)) {
      while(we-g>=3 || (!g && we>=2)) {
         KFRAGE { TIEFER
            VFRAGE { MERKEN TIEFER
               KFRAGE {                     /*     k v k */
                  if((we-g<=3&&g)||(we<=2&&!g)) {   /* c v k v k */
                     TIEFER
                     VFRAGE { el=1; if(we-g<=1) { HOEHER } } HOEHER
                  }
                  if(!el) { we=TestSerie(0,e,f,we,wl,zw,eg); wl=au; au=0; }
                  el=0; if(we<=eg) break;
               }
               else VFRAGE {                /*     v v k */
                  if(TestSerie(1,e,f,we,wl,zw)) {
                     HOEHER if(we<=eg) break; TIEFER
                  }
                  MERKEN TIEFER
                  KFRAGE {                  /*    k v v k */
                     we=TestSerie(2,e,f,we,wl,zw,eg); wl=au; au=0;
                     if(we<=eg) break;
                  }
                  else VFRAGE {             /*    v v v k */
                     HOEHER HOEHER if(we<=eg) break; TIEFER TIEFER
                  }
               }
            }
            else KFRAGE { TIEFER
               VFRAGE { MERKEN TIEFER
                  KFRAGE {                  /*    k v k k */
                     if((we-g<=3&&g)||(we<=2&&!g)) {   /* c v k v k k */
                        TIEFER
                        VFRAGE { el=1; HOEHER } HOEHER
                     }
                     if(!el) { we=TestSerie(3,e,f,we,wl,zw,eg); wl=au; au=0; }
                     el=0; if(we<=eg) break;
                  }
                  else VFRAGE {             /*    v v k k */
                     if(TestSerie(4,e,f,we,wl,zw,eg)) {
                        HOEHER if(we<=eg) break; TIEFER
                     }
                     MERKEN TIEFER
                     KFRAGE {               /*  k v v k k */
                        we=TestSerie(3,e,f,we,wl,zw,eg); wl=au; au=0;
                        if(we<=eg) break;
                     }
                     else VFRAGE {          /*  v v v k k */
                        HOEHER HOEHER if(we<=eg) break; TIEFER TIEFER
                     }
                  }
               }
               else KFRAGE { TIEFER
                  VFRAGE { MERKEN TIEFER
                     VFRAGE {               /*  v v k k k */
                        if(TestSerie(4,e,f,we,wl,zw,eg)) {
                           HOEHER if(we<=eg) break; TIEFER
                        }
                     }
                     else KFRAGE {            /*  k v k k k */
                        we=TestSerie(3,e,f,we,wl,zw,eg); wl=au; au=0;
                        if(we<=eg) break;
                     }
                  }
               }
            }
         }
         else VFRAGE { TIEFER
            KFRAGE {                       /*        k v */
               we=TestSerie(3,e,f,we,wl,zw,eg); wl=au; au=0;    /* alte 5 */
               if(we<=eg) break;
            }
            else VFRAGE { MERKEN TIEFER
               KFRAGE {                    /*      k v v */
                  we=TestSerie(6,e,f,we,wl,zw,eg); wl=au; au=0;
                  if(we<=eg) break;
               }
            }
         }
         TIEFER mit++;
      }
   }
   else { au=len; return(g); }
   if((we-g>=3)||(we==2&&!g)) {
      TIEFER
      if(we>1) { TIEFER
         if(a[e] [f] [we+wl] != 32 && a[e] [f] [we+wl] !=45) { HOEHER }
         else { TIEFER }
      }
      au=wl; return(we);
   }
   au=len; return(g);
}
TestSerie(rg, e, f, we, wl, zw,eg)
int rg,e,f,we,wl,zw,eg;
{
   int gm = zw, gm2 = zw;

   FOREVER {
      MERKEN
      if(rg==1 || rg==4) {                         /* j: V2!=i,e V2!=V1! */
         if(rg==4 && zw==gm) gm=1;                 /* k:          V2==V1 */
         else if(rg==1&&zw!=101&&zw!=105&&zw!=69&&zw!=73&&zw!=gm) gm=1;
         else gm=0; break;
      }
      gm=zw; TIEFER MERKEN
      if(gm==107 || gm==75) {                      /* c: ck-Test */
         if((zw==99||zw==67) && we+1<=eg) {                        /*  k */
           a[e] [f] [we+wl] = 107; HOEHER break;
         }
      }
      if(gm==104 || gm==72) {                      /* d: sch-ph-th-Test */
         if(zw==116 || zw==112 || zw==84 || zw==80) break;        /* p,t */
         if(zw==99 || zw==67) { TIEFER MERKEN                     /*   c */
            if(zw!=115 && zw!=83 && rg!=6) { HOEHER } break;      /*  !s */
         }
         if(!rg || rg==3 || rg==6) {
            VFRAGE { TIEFER VFRAGE { HOEHER } HOEHER break; }     /* V,V */
         }
         HOEHER break;
      }
      /* if(rg==5) { HOEHER break; } */
      if(gm==114 || gm==82) {                      /* a: r-Test */
         if(zw==98||zw==100||zw==102||zw==103||zw==107||    /* b,d,f,g,k */
            zw==66||zw== 68||zw== 70||zw== 71||zw== 75  ) break;
         if(zw==116 || zw==112 || zw==84 || zw==80) {             /* p,t */
            TIEFER MERKEN
            if(zw==115 || zw==83) {                               /*   s */
               TIEFER VFRAGE { HOEHER }                           /*   V */
            } HOEHER break;
         }
         if(zw==104 || zw==72) { TIEFER MERKEN                    /*   h */
            if(zw==99 || zw==67) { TIEFER MERKEN                  /*   c */
               if(zw==115 || zw==83) break; HOEHER break;         /*   s */
            } HOEHER
         } HOEHER break;
      }
      if(gm==108 || gm==76) {                      /* f: l-Test */
         if(zw==98||zw==103||zw==107||zw==112||               /* b,g,k,p */
            zw==66||zw== 71||zw== 75||zw== 80  ) break;
         if(zw==102 || zw==70) {                                  /*   f */
            TIEFER MERKEN
            if(zw!=112 && zw!=80) { HOEHER } break;               /*  !p */
         }
         if(zw==104 || zw==72) { TIEFER MERKEN                    /*   h */
            if(zw==99 || zw==67) { TIEFER MERKEN                  /*   c */
               if(zw==115 || zw==83) break; HOEHER break;         /*   s */
            } HOEHER
         } HOEHER break;
      }
      if(((gm==116||gm==84)&&(zw==115||zw==83))||  /* h,i: t-Test      s */
         ((gm==102||gm==70)&&(zw==112||zw==80))) { /* e,l: f-Test      p */
         if(!rg) {                                              /* !e,!i */
            if(!(gm2==101||gm2==69||gm2==105||gm2==73)||mit) break;
         }
         else {
            TIEFER VFRAGE { HOEHER }                               /*  V */
         } HOEHER break;
      }
      if((gm==119||gm==87)&&(zw==122||zw==90)) break;      /* o: zw-Test */
      if((gm==122||gm==90)&&(zw==116||zw==84)) {           /* p: tz-Test */
         HOEHER HOEHER break;
      }
      if((gm=='p'||gm=='P')&&(zw=='s'||zw=='S')) break;    /* q: sp-Test */
      if(!rg) {                                    /* n:   n-Test        */
         if(gm==110 || gm==78) {
            VFRAGE { HOEHER } HOEHER break;                        /*  V */
         }
      }
      HOEHER break;
   }
   if(rg==1 || rg==4) return(gm);
   au=wl; return(we);
}
Ausrichtung(schalter)
int schalter;
{
   int s1=bas,z1=baz,wieder,anfang,i,st,len,e,f,g,st2,i2,zy,exmeld=meld;

   if(blo<3) { s1=bes=s; z1=bez=z; }
   FOREVER {
      st=SC(s1, z1, (i=SL(s1,z1)));
      if(MAX) f=TRUE; else f=FALSE;  /* i-st==MAX */
      if(i) { anfang=e=0; wieder=1;
         while(wieder) { wieder=g=0;
            for(len=anfang; len<=i-1; len++) {
               if(a[s1] [z1] [len] == 32) { g++; e=(e>=1) ? 2:0; continue; }
               if(e==1) e=0;
               if(a[s1] [z1] [len] <9) { anfang++; wieder=e=1; if(!g) len=0; }
               else if(f) { anfang++; wieder=1; }
               else if(!g) len=0;
               break;
            }
            if(len) {
               if(e==1) { e=0; if(!f) anfang--; }
               if(e==2) e--;
               if((f && (g>1 || len==g)) || !f) {
                  if(f) { if(len==g) g=0; else  g=len+1-g; /* -e */ }
                  else g=e;
                  for(e=g; len<=i; len++, e++)
                     a[s1] [z1] [e] = a[s1] [z1] [len]; e--;
                  BelAend(s1,z1,st,e,i);
                  i=e; e=0;
               }
            }
         }
      }
      z1++;
      if(s1==bes && z1>bez) break;
      if(z1>SEITE) { z1=0; s1++; }
   }
   if(blo>2) {
      if(schalter>=10) MAX=schalter;
      e=s1=bas; f=z1=baz; f++;
      FOREVER {
         if(z1>SEITE) { z1=0; s1++; }
         if(f >SEITE) { f =0;  e++; }
         if((s1==bes && z1>=bez) || s1>bes) {
            if(bas==bes && baz==bez && schalter>=10) {
               schalter=9; goto dahin;
            }
            break;
         }
         else {
            st =SC(s1, z1, (i =SL(s1,z1)));
            st2=SC( e,  f, (i2=SL( e, f)));
            if(i-st+i2-st2<MAX) {  /* <= */
               wieder=g=0;         /* st>0 und ungerade */
               if(st) SchnellTest(s1,z1,i-st); else letztes=8;
               if(st && letztes!=8 && a[e] [f] [0]>8) { g++; st++; }
               if(a[s1] [z1] [i-1] == 173) wieder=2;
               BelAend(s1,z1,st+st2,i+i2+g+1-wieder,i);
               if(wieder) { i=i-2;        /* -,ck-Test */
                  if(a[s1] [z1] [i] == 107 && (a[e] [f] [0] == 107 ||
                    (a[e] [f] [0]<9 && a[e] [f] [1] == 107)))
                     a[s1] [z1] [i] = 99;                      /* c */
                  if(g)  a[s1] [z1] [++i] = 8;
               }
               else {   if(g) a[s1] [z1] [i++] = 8;
                        a[s1] [z1] [i] = 32;
               }
               for(len=i+1; len<=i2+i+1; len++)
                  a[s1] [z1] [len]=a[e] [f] [len-i-1];
               g=bas; len=baz; anfang=bes; wieder=bez;
               meld=3; BlockLoeschen(e,f,e,f); meld=FALSE;
               bas=g; baz=len; bes=anfang; bez=wieder-1;
               if(bez<0) { bez=SEITE; bes--; }
            }
            else if((i-st>MAX) || (i2-st2>MAX)) {
dahin:         if(schalter==9) {
                  st =SC(s1, z1, (i =SL(s1,z1)));
                  if(i-st<=MAX) break;
               }
               zy=z; g=s;
               if(i-st>MAX) { s=s1; z=z1; } else { s=e; z=f; }
               x=MAX; st=Testen(stil);
               for(len=MAX+st-1; len>=0; len--) {
                  if(a[s] [z] [len] <9) st--;
                  if(a[s] [z] [len] == 32) {
                     x = len+2-st; break;
                  }
               }
               if(x>MAX || len<0)  x=MAX;  /* voll ohne space */
               len=baz; st=bas; anfang=bes; wieder=bez;
               meld=500; CarRet(); meld=FALSE;
               s=g; z=zy; baz=len; bas=st; bes=anfang;
               if((bez=wieder+1)>SEITE) { bez=0; bes++; }
            }
            else {
               if((g=MAX+st-i-1)>=3) {
                  len=SchnellTest(e, f, g--); wieder=0;
                  if(!(a[e] [f] [g+len+1] == 32)) {
                     while(g>=2) {
                        if(a[e] [f] [g+len]   == 32) { g--; wieder=1; break; }
                        if(a[e] [f] [g+len]   == 45)          break;
                        if(a[e] [f] [g+len]    <  9) { len--; continue; }
                        g--;
                     }
                  }
                  if(!au) { g=AutoTrenn(g,len,i2,st2,e,f, (MAX+st-i-1));
                            len=au; au=0;
                  }
                  if(g>=2 || (wieder && g)) {
                     wieder=anfang=zy=0;         /* st>0 und ungerade */
                     if(st) SchnellTest(s1,z1,i-st); else letztes=8;
                     if(st && letztes!=8 && a[e] [f] [0]>8) { anfang++; st++; }
                     if(a[s1] [z1] [i-1] == 173) wieder=2;
                     if(a[e] [f] [g+len+1]!=32 && a[e] [f] [g+len+1]!=45 &&
                       (Ktest(a[e] [f] [g+len]) || Vtest(a[e] [f] [g+len])))
                        zy++;         /* Trennungsstrich */
                     BelAend(s1,z1,st+len,i+g+len+2-wieder+anfang+zy,i);
                     if(wieder) { i=i-2;      /* -,ck-Test */
                        if(a[s1] [z1] [i] == 107 && (a[e] [f] [0] == 107 ||
                          (a[e] [f] [0]<9 && a[e] [f] [1] == 107)))
                           a[s1] [z1] [i] = 99;                      /* c */
                        if(anfang) a[s1] [z1] [++i] = 8;
                     }
                     else {   if(anfang) a[s1] [z1] [i++] = 8;
                        a[s1] [z1] [i] = 32;
                     }
                     wieder=zy;
                     for(zy=i+1; zy<=i+g+len+1; zy++)
                        a[s1] [z1] [zy] = a[e] [f] [zy-i-1];
                     if(wieder)  /* Trennungsstrich */
                        a[s1] [z1] [zy++] = 173;
                     a[s1] [z1] [zy] = anfang = 0;
                     if(len && a[e] [f] [g+len+1]>8) {
                        SchnellTest(e,f,g+len+2);
                        if(letztes!=8) { a[e] [f] [0] = letztes; anfang=1; }
                        else anfang=0;
                     }
                     if(a[e] [f] [g+len+1] == 32) g++;
                     for(zy=g+len+1; zy<=i2; zy++)
                        a[e] [f] [zy-g-len-1+anfang] = a[e] [f] [zy];
                     BelAend(e,f,st2-len+anfang,zy-g-len-2+anfang,i2);
                  }
               }
               z1++; f++;
            }
         }
      }
   }
   if(s>se || (s==se && z>ze)) { s=se; z=ze; }
   if(schalter>=9) { schalter=ausri; x=MIX; off=0; }
   if(schalter>LINKS) {
      if(blo<3) { s1=bes=s; z1=bez=z; }
      else { s1=bas; z1=baz; }
      FOREVER {
         st=SC(s1, z1, (i=SL(s1,z1)));
         if(i) { i=RechterRand(i,st,s1,z1);
                 st=meld; meld=FALSE; }
         if(i && i-st < MAX) {
            switch(schalter) {
               case RECHTS:    e=MAX+st;
               case ZENTRIERT:
                  if(schalter==ZENTRIERT) e=((MAX+st-i)/2)+i;
                  BelAend(s1,z1,st,e,i);
                  for(f=e, len=i; len>=0; len--, e--)
                     a[s1] [z1] [e] = a[s1] [z1] [len];
                  for(len=f-i-1; len>=0; len--) a[s1] [z1] [len] = 32;
                  break;
               case BLOCKSATZ:
                  if(vonri==LINKS) e=0; else e=i-1; g=0;
                  while(i-st<MAX) {
                     f=500;
                     if(vonri==LINKS) {
                        for(len=e; len<=i-1; len++) {
                           if(a[s1] [z1] [len] == 32) { e=f=len; g=1; break; }
                           else e=0;
                        }
                     }
                     else {
                        for(len=e; len>=0; len--) {
                           if(a[s1] [z1] [len] == 32) { e=f=len; g=1; break; }
                           else e=i-1;
                        }
                     }
                     if(f!=500) {
                        BelAend(s1,z1,st,i+1,i);
                        for(len=i++; len>=e; len--)
                           a[s1] [z1] [len+1] = a[s1] [z1] [len];
                        if(vonri==LINKS) { e+=2; if(e>i-1) e=0; }
                        else { e--; if(e<0) e=i-1; }
                     }
                     else if(!g) break;
                  }
                  if(vonri==LINKS) vonri=RECHTS; else vonri=LINKS;
                  break;
            }
         }
         z1++; if(z1>SEITE) { z1=0; s1++; }
         if((s1==bes && (z1>bez || (schalter==BLOCKSATZ && z1==bez)))||s1>bes)
            break;
      }
   }
   if(exmeld == 2) return(st);
   meld=sicher=FALSE; ausri=schalter;
   SText();
   ZSDisplay(); meld=FALSE;
}
RechterRand(i, st, s1, z1)
int i, st, s1, z1;
{
   int len;

   for(len=i-1; len>=0; len--) {
      if(a[s1] [z1] [len] == 32)   {       a[s1] [z1] [len] = EOS; continue; }
      else if(a[s1] [z1] [len] <9) { st--; a[s1] [z1] [len] = EOS; continue; }
      break;
   }
   if(len+1!=i) BelAend(s1,z1,st,len+1,i);
   meld=st;
   return(len+1);
}
Seitenlaenge(laenge)
int laenge;
{
   int frei=0, voll=0, es=se, ez=ze, ps, pz;

   if(--laenge < SEITE) {
      if(se) voll=(SEITE-laenge)*se;  /* Anzahl der zusätzlichen Zeilen */
      if(ze>laenge) voll+=(ze-laenge);
      frei=(MAS-se+1)*(laenge+1);     /* Anzahl der freien Zeilen */
      if(laenge>ze) frei+=(laenge-ze);
      if(frei==0 || frei<voll) {
         sprintf(buffer, "Out of memory!");
         meld=TRUE;
         return(0);
      }
      if(voll) {
         for(frei=0; frei<=voll-1; frei++) { if(++ze>laenge) { ze=0; se++; } }
         ps=se; pz=ze;
         FOREVER {
            a[ps] [pz] = a[es] [ez];
            if(--ez<0) { ez=SEITE;  es--; }
            if(--pz<0) { pz=laenge; ps--; }
            if(es==ps && pz==ez) break;
         }
      }
      SEITE = laenge;
   }
   else if(laenge > SEITE) {
      if(se) {
         ps=ez=0; pz=SEITE+1; es=1;
         FOREVER {
            a[ps] [pz] = a[es] [ez];
            if(es==se && ez==ze) { se=ps; ze=pz; break; }
            if(++ez>SEITE)  { ez=0; es++; }
            if(++pz>laenge) { pz=0; ps++; }
         }
      }
      SEITE = laenge;
   }
   sicher=FALSE; s=z=0; y=MIY;
   SText(); ZSDisplay();
   sprintf(buffer, "New page-length: %d lines!", SEITE+1);
   Meldung();
}
Textbreite(breite)
int breite;
{
   if(blo>2) {
      if(breite>MAX) { MAX = breite; Ausrichtung(ausri); }
      else if(breite<MAX) Ausrichtung(breite);
   }
   else {
      MAX=breite; if(x>MAX) x=MAX;
      SText(); ZSDisplay();
   }
   sprintf(buffer, "New text-width: %d columns!", MAX);
   Meldung();
}
