app/conversion/1.0/src/FILEUTIL.PAC

Raw file
Back to index

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;