summaryrefslogtreecommitdiff
path: root/app/eudas/4.4/src/eudas.satzzugriffe
diff options
context:
space:
mode:
Diffstat (limited to 'app/eudas/4.4/src/eudas.satzzugriffe')
-rw-r--r--app/eudas/4.4/src/eudas.satzzugriffe271
1 files changed, 271 insertions, 0 deletions
diff --git a/app/eudas/4.4/src/eudas.satzzugriffe b/app/eudas/4.4/src/eudas.satzzugriffe
new file mode 100644
index 0000000..d3f53f1
--- /dev/null
+++ b/app/eudas/4.4/src/eudas.satzzugriffe
@@ -0,0 +1,271 @@
+PACKET eudas satzzugriffe
+
+(*************************************************************************)
+(* *)
+(* Feldstrukturierung von Texten *)
+(* *)
+(* Version 03 *)
+(* *)
+(* Autor: Thomas Berlage *)
+(* Stand: 17.04.87 *)
+(* *)
+(*************************************************************************)
+
+ DEFINES
+
+ SATZ,
+ := ,
+ satz initialisieren,
+ felderzahl,
+ feld lesen,
+ feld bearbeiten,
+ feld aendern,
+ feldindex :
+
+
+LET
+ maximale felderzahl = 256,
+ zeigerlaenge = 2;
+
+LET
+ blank = " ",
+ niltext = "";
+
+LET
+ illegale feldnummer = #101#
+ " ist keine Feldnummer";
+
+TEXT VAR
+ raum fuer ein int := zeigerlaenge * blank;
+
+
+(**************************** Typ SATZ ***********************************)
+
+TYPE SATZ = TEXT;
+
+OP := (SATZ VAR links, SATZ CONST rechts) :
+
+ CONCR (links) := CONCR (rechts)
+
+END OP := ;
+
+
+(************************ Satz initialisieren ****************************)
+
+PROC satz initialisieren (SATZ VAR satz) :
+
+ satz initialisieren (satz, 0)
+
+END PROC satz initialisieren;
+
+PROC satz initialisieren (SATZ VAR satz, INT CONST felder) :
+
+ replace (raum fuer ein int, 1, 2 * felder + 3);
+ INT VAR i;
+ CONCR (satz) := niltext;
+ FOR i FROM 1 UPTO felder + 1 REP
+ CONCR (satz) CAT raum fuer ein int
+ END REP
+
+END PROC satz initialisieren;
+
+
+(*************************** Felderzahl **********************************)
+
+INT PROC felderzahl (SATZ CONST satz) :
+
+ INT VAR letzter zeiger := (CONCR (satz) ISUB 1) DIV 2;
+ INT CONST satzende := CONCR (satz) ISUB letzter zeiger;
+ REP
+ letzter zeiger DECR 1
+ UNTIL letzter zeiger <= 0 COR kein leeres feld END REP;
+ letzter zeiger .
+
+kein leeres feld :
+ (CONCR (satz) ISUB letzter zeiger) <> satzende .
+
+END PROC felderzahl;
+
+
+(************************** Feld lesen ***********************************)
+
+PROC feld lesen (SATZ CONST satz, INT CONST feldnr, TEXT VAR inhalt) :
+
+ feldgrenzen bestimmen (CONCR (satz), feldnr);
+ IF NOT is error THEN
+ inhalt := subtext (CONCR (satz), feldanfang, feldende)
+ END IF
+
+END PROC feld lesen;
+
+PROC feld bearbeiten (SATZ CONST satz, INT CONST feldnr,
+ PROC (TEXT CONST, INT CONST, INT CONST) bearbeite) :
+
+ feldgrenzen bestimmen (CONCR (satz), feldnr);
+ IF NOT is error THEN
+ bearbeite (CONCR (satz), feldanfang, feldende)
+ END IF
+
+END PROC feld bearbeiten;
+
+
+(************************ Feldgrenzen bestimmen **************************)
+
+INT VAR
+ feldanfang,
+ feldende;
+
+PROC feldgrenzen bestimmen (TEXT CONST satz, INT CONST feldnr) :
+
+ IF illegales feld THEN
+ errorstop (text (feldnr) + illegale feldnummer)
+ ELIF vorhandenes feld THEN
+ feldanfang := satz ISUB feldnr;
+ feldende := (satz ISUB feldnr + 1) - 1
+ ELSE
+ feldanfang := 1; feldende := 0
+ END IF .
+
+illegales feld :
+ feldnr <= 0 OR feldnr > maximale felderzahl .
+
+vorhandenes feld :
+ feldnr + feldnr < (satz ISUB 1) - 1 .
+
+END PROC feldgrenzen bestimmen;
+
+
+(*************************** Feld aendern ********************************)
+
+TEXT VAR puffer;
+
+PROC feld aendern (SATZ VAR satz, INT CONST feldnr, TEXT CONST inhalt) :
+
+ INT VAR zeigerstelle;
+ INT CONST satzfelder := ((CONCR (satz) ISUB 1) - 2) DIV 2;
+ IF normales feld THEN
+ normal ersetzen
+ ELSE
+ errorstop (text (feldnr) + illegale feldnummer)
+ END IF .
+
+normales feld :
+ feldnr > 0 AND feldnr <= maximale felderzahl .
+
+normal ersetzen :
+ INT CONST fehlende zeiger := feldnr - satzfelder;
+ IF fehlende zeiger <= 0 THEN
+ vorhandenes feld ersetzen
+ ELIF inhalt <> niltext THEN
+ neues feld anfuegen
+ END IF .
+
+neues feld anfuegen :
+ INT CONST endezeiger := CONCR (satz) ISUB (satzfelder + 1);
+ puffer := subtext (CONCR (satz), erstes feld, endezeiger - 1);
+ CONCR (satz) := subtext (CONCR (satz), 1, satzfelder + satzfelder);
+ korrigiere zeiger (CONCR (satz), 1, satzfelder, platz fuer zeiger);
+ neue zeiger anfuegen;
+ endezeiger anfuegen;
+ CONCR (satz) CAT puffer;
+ CONCR (satz) CAT inhalt .
+
+platz fuer zeiger :
+ fehlende zeiger + fehlende zeiger .
+
+neue zeiger anfuegen :
+ INT CONST neuer zeiger := endezeiger + platz fuer zeiger;
+ FOR zeigerstelle FROM satzfelder + 1 UPTO feldnr REP
+ zeiger anfuegen (CONCR (satz), neuer zeiger)
+ END REP .
+
+endezeiger anfuegen :
+ zeiger anfuegen (CONCR (satz), neuer zeiger + length (inhalt)) .
+
+erstes feld:
+ CONCR (satz) ISUB 1 .
+
+vorhandenes feld ersetzen :
+ INT CONST
+ feldanfang := CONCR (satz) ISUB feldnr,
+ naechster feldanfang := CONCR (satz) ISUB (feldnr + 1);
+ IF feldanfang > length (CONCR (satz)) THEN
+ optimiere leerfelder
+ ELSE
+ ersetze beliebig
+ END IF .
+
+optimiere leerfelder :
+ korrigiere zeiger (CONCR (satz), feldnr + 1, satzfelder + 1,
+ length (inhalt));
+ CONCR (satz) CAT inhalt .
+
+ersetze beliebig :
+ puffer := subtext (CONCR (satz), naechster feldanfang);
+ CONCR (satz) := subtext (CONCR (satz), 1, feldanfang - 1);
+ korrigiere zeiger (CONCR (satz), feldnr + 1, satzfelder + 1,
+ laengendifferenz);
+ CONCR (satz) CAT inhalt;
+ CONCR (satz) CAT puffer .
+
+laengendifferenz :
+ length (inhalt) - feldlaenge .
+
+feldlaenge :
+ naechster feldanfang - feldanfang .
+
+END PROC feld aendern;
+
+PROC zeiger anfuegen (TEXT VAR satz, INT CONST zeigerwert) :
+
+ replace (raum fuer ein int, 1, zeigerwert);
+ satz CAT raum fuer ein int
+
+END PROC zeiger anfuegen;
+
+PROC korrigiere zeiger (TEXT VAR satz, INT CONST anfang, ende, differenz) :
+
+ INT VAR zeigerstelle;
+ FOR zeigerstelle FROM anfang UPTO ende REP
+ replace (satz, zeigerstelle, alter zeiger + differenz)
+ END REP .
+
+alter zeiger :
+ satz ISUB zeigerstelle .
+
+END PROC korrigiere zeiger;
+
+
+(*************************** 'feldindex' *********************************)
+
+INT PROC feldindex (SATZ CONST satz, TEXT CONST muster) :
+
+ INT VAR
+ anfang := (CONCR (satz) ISUB 1) - 1,
+ zeigerstelle := 1;
+
+ REP
+ anfang := pos (CONCR (satz), muster, anfang + 1);
+ IF anfang = 0 THEN
+ LEAVE feldindex WITH 0
+ END IF;
+ durchsuche zeiger ob feldanfang
+ UNTIL zeiger zeigt auf anfang CAND naechster zeiger hinter ende END REP;
+ zeigerstelle .
+
+durchsuche zeiger ob feldanfang :
+ WHILE (CONCR (satz) ISUB zeigerstelle) < anfang REP
+ zeigerstelle INCR 1
+ END REP .
+
+zeiger zeigt auf anfang :
+ (CONCR (satz) ISUB zeigerstelle) = anfang .
+
+naechster zeiger hinter ende :
+ (CONCR (satz) ISUB (zeigerstelle + 1)) = anfang + length (muster) .
+
+END PROC feldindex;
+
+
+END PACKET eudas satzzugriffe;
+