И последнее, чтение fis-файла (или любого другого ini-файла) (а точнее, текстовой модели, ассоциированной с этим файлом):
## Код:
```
MODULE IniFile;

   IMPORT TextModels, TextMappers, Strings;
   
   CONST defdelimiter = '=';
      sectiontag = '[';
      endstring = 0DX;
   
   VAR scan: TextMappers.Scanner;
      delimiter*: CHAR;   
   
   TYPE String* = ARRAY 256 OF CHAR;
   
   PROCEDURE ReadLn (OUT str: ARRAY OF CHAR);
      VAR ch: CHAR;
         i: INTEGER;
   BEGIN
      scan.rider.ReadChar(ch);
      i := 0;
      WHILE (ch # endstring) & (~scan.rider.eot) & (i < 256) DO
         str[i] := ch; 
         scan.rider.ReadChar(ch);
         INC(i);
      END;
      str[i] := 0X; 
   END ReadLn;   

   PROCEDURE FindSection (IN SectionName: ARRAY OF CHAR): BOOLEAN;
      VAR compstr, str: String;
         i: INTEGER;
   BEGIN
      compstr := '[' + SectionName + ']';
      scan.SetPos(0);
      ReadLn(str);
      WHILE (compstr # str) & (~scan.rider.eot) DO ReadLn(str) END;
      RETURN ~(compstr # str);
   END FindSection;
      
   PROCEDURE FindVar (IN SectionName: ARRAY OF CHAR; IN varname: ARRAY OF CHAR): BOOLEAN;
      VAR ch, newsec: CHAR; equal: BOOLEAN; str: String;
         i: INTEGER;
   BEGIN
      equal := FALSE;
      IF FindSection(SectionName) THEN
         scan.rider.ReadChar(ch);
         LOOP
            i := 0;
            WHILE (ch # delimiter) & (ch # endstring) & (~scan.rider.eot) & (ch # ' ') & (ch # 09X) DO
               str[i] := ch;
               scan.rider.ReadChar(ch);
               INC(i);
            END;
            str[i] := 0X;
            IF str = varname THEN
               equal := TRUE;
               WHILE (ch = delimiter)  OR (ch = 09X) OR (ch = ' ') DO scan.rider.ReadChar(ch) END;
               scan.SetPos(scan.Pos()-1);
               EXIT;
            ELSE
               WHILE (ch # endstring) DO scan.rider.ReadChar(ch) END;
               scan.rider.ReadChar(ch);
               IF (scan.rider.eot) OR (ch = '[') THEN EXIT END;
            END;
         END
      END;
      RETURN equal;
   END FindVar;
   
   PROCEDURE ConnectTo* (m: TextModels.Model);   
   BEGIN
      scan.ConnectTo(m)   
   END ConnectTo;

   PROCEDURE ReadSection* (IN SectionName: ARRAY OF CHAR; OUT strs: ARRAY OF ARRAY OF CHAR);
      VAR i: INTEGER; str: String;
   BEGIN
      i := 0;
      IF FindSection(SectionName) THEN
         ReadLn(str);
         WHILE (str[0] # '[') & (str[0] # 0X) DO
            strs[i] := str$;
            INC(i);
            ReadLn(str);
         END;
      END;
   END ReadSection;
      
   PROCEDURE ReadString* (IN SectionName: ARRAY OF CHAR; IN vrbl: ARRAY OF CHAR; OUT val: ARRAY OF CHAR);
      VAR i: INTEGER; str: String; ch: CHAR;   
   BEGIN
      IF FindVar(SectionName, vrbl) THEN ReadLn(val) ELSE val := 0X END;
   END ReadString;
   
   PROCEDURE ReadInteger* (IN SectionName: ARRAY OF CHAR; IN vrbl: ARRAY OF CHAR; OUT int: INTEGER);
      VAR str: String; x, res: INTEGER;
   BEGIN
      ReadString(SectionName, vrbl, str);
      Strings.StringToInt(str, x, res);
      IF (res # 1) & (res # 2)  THEN int := x END;
   END ReadInteger;
   
   BEGIN
      delimiter := defdelimiter;
   
END IniFile.
```
