## Код:
```
DEFINITION O3stdConfig;

   CONST
      copyright = "© 1998 - 2002 O³ Software GmbH & Co. KG; http://www.o3-software.de";

   TYPE
      ListPtr = POINTER TO ARRAY OF ARRAY OF CHAR;

      TablePtr = POINTER TO ARRAY OF ARRAY OF ARRAY OF CHAR;

   PROCEDURE New (VAR rec: ANYREC; IN name: ARRAY OF CHAR);
   PROCEDURE NewGlobal (IN qualident: ARRAY OF CHAR);
   PROCEDURE Read (VAR rec: ANYREC; IN name, path: ARRAY OF CHAR);
   PROCEDURE ReadGlobal (IN path: ARRAY OF CHAR);
   PROCEDURE ReadList (IN name, path: ARRAY OF CHAR): ListPtr;
   PROCEDURE ReadTable (IN name, path: ARRAY OF CHAR): TablePtr;

END O3stdConfig.

This module provides support for configuration files.
Data in a software system can be treated differently depending on its lifetime. For very long lifetime CONST declarations are typically used. For short lifetimes databases / files are used. O3stdConfig is for data lifetime somewhere in between. Configuration-Files are modified manually and read in by programs.

Config-files have the following format. Each line starts with an qualident, either in the form "name.field.{field}" if it is a configuration for local variables or with "Module.Name.field{.field}" if it is a globally exported variable. The values follows after at least an TAB or whitespace.
Configuration-file can include comments. A comment has to begin with "#" or "*" and ends at the end of that line. If a string value contains "#" or "*", the value has to be enclosed in " or ' (this symbol is  then not allowed to be used in that value), otherwise everything after "#" / "*" will be treated as an comment.. Empty lines are ignored.

Lists start with "@list" and end with "@end" | "@list" | "@table". "@list" is followed by a List-Name, values are separated by linefeeds. Comments after values are ignored (read into the values).

Tables start with "@table" and end with "@end" | "@list" | "@table". "@table" is followed by a Table-Name, columns are tab-separated, rows are separated by linefeeds. Comments are ignored (read into the values).

PROCEDURE New (VAR rec: ANYREC; IN name: ARRAY OF CHAR);
Generates a New configuration file text out of the given rec. name has to be the same when reading the file by the procedure Read. The resulting text can be copied into another config-file or saved as a new config-file.
   
PROCEDURE NewGlobal (IN qualident: ARRAY OF CHAR);
Generates a New configuration file text out of the given qualident, which has to bee an "module.record".
The resulting text can be copied into another config-file or saved as a new config-file.

PROCEDURE Read (VAR rec: ANYREC; IN name, path: ARRAY OF CHAR);
Fills the fields of rec with the values from the configuration file at location path. The value for a record field rec.field will be taken from the first entry matching "name.fieldname" otherwise the values remains unchanged.
Pre
20   path # ""

PROCEDURE ReadGlobal (IN path: ARRAY OF CHAR);
Fills the fields of globally exported records given in the config-file at location path.
Pre
20   path # ""

PROCEDURE ReadList (IN name, path: ARRAY OF CHAR): ListPtr;
Reads the list name from the configuration file at location path.
Pre
20   path # ""
   
PROCEDURE ReadTable (IN name, path: ARRAY OF CHAR): ListPtr;
Reads the table name from the configuration file at location path.
Pre
20   path # ""
```
