home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1991-08-10 | 3.6 KB | 155 lines |
- (*======================================================================*)
- (* Amiga Support Routines, Reading ENV: variables *)
- (*======================================================================*)
- (* Version: 1.00 Author: Dennis Brueni *)
- (* Date: 08-04-91 Changes: Original *)
- (*======================================================================*)
-
- IMPLEMENTATION MODULE Env;
-
- IMPORT FIO,ASCII,Strings;
-
- @INCLUDE "MACROS"
-
- @LongAddressing
- @NoVChecks
-
- (*----------------------------------------------------------------------*)
-
- PROCEDURE EnvNameCvt(VAR name,EnvName: ARRAY OF CHAR);
-
- VAR First4 : ARRAY [0..3] OF CHAR;
-
- BEGIN
- Strings.Assign(name,First4);
- Strings.Assign(name,EnvName);
- Strings.Capitalize(First4);
-
- IF NOT Strings.Equal(First4,'ENV:') THEN
- Strings.Insert('ENV:',0,EnvName);
- END;
- END EnvNameCvt;
-
- (*----------------------------------------------------------------------*)
-
- @NoCopyStrings
-
- PROCEDURE GetEnv(name: ARRAY OF CHAR; VAR value: ARRAY OF CHAR);
-
-
- VAR EnvFile: FIO.FILE;
- i : CARDINAL;
- EnvName: Strings.BigString;
- tempch : CHAR;
-
- BEGIN
- value[0]:=ASCII.NUL;
- EnvNameCvt(name,EnvName);
- EnvFile:=FIO.Open(EnvName);
-
- IF FIO.GoodFILE(EnvFile) THEN
-
- i:=0;
- REPEAT
- tempch:=FIO.ReadChar(EnvFile);
- value[i]:=tempch;
- INC(i);
- UNTIL (i>HIGH(value)) OR (tempch=ASCII.EOF);
- value[i-1]:=ASCII.NUL;
-
- FIO.Close(EnvFile);
- END;
- END GetEnv;
-
- (*----------------------------------------------------------------------*)
-
- @NoCopyStrings
-
- PROCEDURE SetEnv(name: ARRAY OF CHAR; value: ARRAY OF CHAR);
-
- VAR EnvFile: FIO.FILE;
- EnvName: Strings.BigString;
-
- BEGIN
- EnvNameCvt(name,EnvName);
- EnvFile:=FIO.Create(EnvName);
-
- IF FIO.GoodFILE(EnvFile) THEN
- FIO.WriteString(EnvFile,value);
- FIO.Close(EnvFile);
- END;
- END SetEnv;
-
- (*----------------------------------------------------------------------*)
-
- @NoCopyStrings
-
- PROCEDURE PutEnv(str: ARRAY OF CHAR);
-
- VAR name: Strings.BigString;
- i,j : CARDINAL;
-
- BEGIN
- Strings.Assign(str,name);
- i:=0;
- WHILE (i<=HIGH(str)) AND (str[i] # '=') DO INC(i); END;
-
- IF (i<=HIGH(name)) AND (i<=HIGH(str)) AND (i#0) THEN
- name[i]:=ASCII.NUL;
- Strings.Delete(str,0,i+1);
- SetEnv(name,str);
- END;
- END PutEnv;
-
- (*----------------------------------------------------------------------*)
-
- PROCEDURE ParseEnv(VAR str: ARRAY OF CHAR; VAR next: ARRAY OF CHAR):BOOLEAN;
-
- CONST ArgDelim1 = ';';
- ArgDelim2 = ',';
- EscDelim = 134C; (* \ *)
- QuoteChar = '"';
-
- VAR InQuote: BOOLEAN;
- i,j: CARDINAL;
- tempch: CHAR;
- done: BOOLEAN;
-
- BEGIN
- next[0]:=ASCII.NUL;
- i:=0; j:=0; InQuote:=FALSE; done:=FALSE;
- LOOP
- IF (i>HIGH(str)) OR (j>=HIGH(next)) THEN EXIT; END;
- tempch:=str[i];
- CASE tempch OF
- ASCII.LF ,
- ' ',ASCII.HT,
- ASCII.CR ,
- ASCII.VT : IF InQuote THEN next[j]:=str[i]; INC(j); END;
- INC(i);
- | ASCII.NUL: done:=TRUE; EXIT;
- | ArgDelim1,
- ArgDelim2: EXIT;
- | QuoteChar: InQuote:=NOT InQuote; INC(i);
- | EscDelim:
- CASE str[i+1] OF
- ArgDelim1,
- ArgDelim2,
- ASCII.HT,' ',
- QuoteChar,
- EscDelim: INC(i);
- ELSE END;
- next[j]:=str[i]; INC(i);
- INC(j);
- ELSE
- next[j]:=str[i]; INC(i); INC(j);
- END;
- END;
- next[j]:=ASCII.NUL;
- Strings.Delete(str,0,i+1);
- RETURN NOT done OR (j#0);
- END ParseEnv;
-
-
- END Env.
-