From 04e68443040c7abad84d66477e98f93bed701760 Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun Date: Mon, 4 Feb 2019 13:09:03 +0100 Subject: Initial import --- app/conversion/1.0/src/FILEUTIL.PAC | 142 ++++++++++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 app/conversion/1.0/src/FILEUTIL.PAC (limited to 'app/conversion/1.0/src/FILEUTIL.PAC') diff --git a/app/conversion/1.0/src/FILEUTIL.PAC b/app/conversion/1.0/src/FILEUTIL.PAC new file mode 100644 index 0000000..f772a38 --- /dev/null +++ b/app/conversion/1.0/src/FILEUTIL.PAC @@ -0,0 +1,142 @@ +PACKET eumel file utilities + DEFINES sort, + in denoter, + even number of command delimiters, + extract command, + next text command pos, + word wrap, + enumerator, + enumeration offset : +PROC sort (THESAURUS VAR th) : + disable stop; + FILE VAR d := sequential file (output, "dummy"); + d FILLBY th; + sort ("dummy"); + th := empty thesaurus; + input (d); + th FILLBY d; + forget ("dummy", quiet); + enable stop +END PROC sort; +BOOL PROC in denoter (TEXT CONST l, INT CONST p) : + INT VAR number of quotes := 0, + last quote pos, + quote pos := 0; + quote count loop; + number of quotes MOD 2 = 1 +. +quote count loop : + REP + last quote pos := quote pos; + quote pos := pos (l, """", last quote pos + 1, p - 1); + IF quote pos <> 0 + THEN number of quotes INCR 1 + ELSE LEAVE quote count loop + FI + PER +END PROC in denoter; +BOOL PROC even number of command delimiters (TEXT CONST l, INT CONST end pos) : + INT VAR number := 0, current pos := 1, cross pos; + counting loop; + number MOD 2 = 0 +. + counting loop : + REP + cross pos := pos (l, "#", current pos, end pos); + IF cross pos <> 0 + THEN number INCR 1; + current pos := cross pos + 1 + FI + UNTIL cross pos = 0 PER +END PROC even number of command delimiters; +BOOL PROC even number of command delimiters (TEXT CONST l) : + even number of command delimiters (l, LENGTH l) +END PROC even number of command delimiters; +PROC extract command (TEXT CONST l, INT CONST start pos, INT VAR next pos, + TEXT VAR cmd) : + next pos := pos (l, "#", start pos + 1); + IF next pos = 0 + THEN errorstop ("unkorrekte Textanweisung") + FI; + cmd := subtext (l, start pos + 1, next pos - 1); + next pos INCR 1 +END PROC extract command; +PROC next text command pos (TEXT CONST t, INT CONST start pos, + INT VAR start cross pos, end cross pos) : + start cross pos := pos (t, "#", start pos); + IF start cross pos <> 0 + THEN end cross pos := pos (t, "#", start cross pos + 1) + FI +END PROC next text command pos; +BOOL PROC word wrap (TEXT CONST file name) : + FILE VAR f := sequential file (input, file name); + word wrap (f) +END PROC word wrap; +BOOL PROC word wrap (FILE VAR f) : + TEXT VAR l; + modify (f); + toline (f, lines (f)); + WHILE line no (f) > 1 REP + read record (f, l); + IF l <> "" + THEN LEAVE word wrap WITH (l SUB LENGTH l) = " " + ELSE up (f, 1) + FI + PER; + FALSE +END PROC word wrap; +INT PROC enumeration offset (TEXT CONST this line, next line, + BOOL CONST in enumeration, INT CONST start pos) : + TEXT VAR initial chunk, next line initial chunk; + INT VAR blank pos, next line blank pos, + text start pos := 0, next line text start pos; + IF NOT only command line (this line) + THEN ascertain text start pos + FI; + text start pos +. +ascertain text start pos : + blank pos := pos (this line, " ", start pos); + IF blank pos > 1 CAND blank pos < LENGTH this line + THEN text start pos := pos (this line, ""33"", ""255"", blank pos); + IF is enumeration + THEN text start pos DECR 1 + ELSE text start pos := 0 + FI + FI +. +is enumeration : + neighboring lines correspond CAND this line is enumerated +. +neighboring lines correspond : + in enumeration COR next line corresponds +. +next line corresponds : + next line blank pos := pos (next line, " ", start pos); + next line text start pos := + pos (next line, ""33"", ""255"", next line blank pos); + text start pos = next line text start pos CAND + (next line indented COR also enumerated) +. +next line indented : + pos (next line, ""33"", ""255"", 1) = next line text start pos +. +also enumerated : + next line initial chunk + := subtext (next line, start pos, next line blank pos - 1); + enumerator (next line initial chunk) +. +this line is enumerated : + initial chunk := subtext (this line, start pos, blank pos - 1); + enumerator (initial chunk) +END PROC enumeration offset; +BOOL PROC enumerator (TEXT CONST t) : + t = "-" COR substantial enumerator +. +substantial enumerator : + INT CONST l := LENGTH t; + TEXT CONST last char := t SUB l; + l < 20 CAND last char = ":" COR + l < 7 CAND pos (".)", last char) <> 0 +END PROC enumerator; +END PACKET eumel file utilities; -- cgit v1.2.3