home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
17 Bit Software 1: Collection A
/
17Bit_Collection_A.iso
/
files
/
1024.dms
/
1024.adf
/
TextPlus
/
SrcE.lzh
/
SrcE
/
autotrennE.c
next >
Wrap
Text File
|
1990-08-06
|
19KB
|
515 lines
/*
* 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();
}