home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 549b.lha / M2P_v1.0_sources / source.lzh / Env.mpp < prev    next >
Encoding:
Modula Implementation  |  1991-08-10  |  3.6 KB  |  155 lines

  1. (*======================================================================*)
  2. (*              Amiga Support Routines, Reading ENV: variables          *)
  3. (*======================================================================*)
  4. (*  Version:    1.00            Author:  Dennis Brueni                  *)
  5. (*  Date:       08-04-91        Changes: Original                       *)
  6. (*======================================================================*)
  7.  
  8. IMPLEMENTATION MODULE Env;
  9.  
  10. IMPORT FIO,ASCII,Strings;
  11.  
  12. @INCLUDE "MACROS"
  13.  
  14. @LongAddressing
  15. @NoVChecks
  16.  
  17. (*----------------------------------------------------------------------*)
  18.  
  19. PROCEDURE EnvNameCvt(VAR name,EnvName: ARRAY OF CHAR);
  20.  
  21. VAR First4 : ARRAY [0..3] OF CHAR;
  22.  
  23. BEGIN
  24.    Strings.Assign(name,First4);
  25.    Strings.Assign(name,EnvName);
  26.    Strings.Capitalize(First4);
  27.  
  28.    IF NOT Strings.Equal(First4,'ENV:') THEN
  29.       Strings.Insert('ENV:',0,EnvName);
  30.    END;
  31. END EnvNameCvt;
  32.  
  33. (*----------------------------------------------------------------------*)
  34.  
  35. @NoCopyStrings
  36.  
  37. PROCEDURE GetEnv(name: ARRAY OF CHAR; VAR value: ARRAY OF CHAR);
  38.  
  39.  
  40. VAR EnvFile: FIO.FILE;
  41.     i      : CARDINAL;
  42.     EnvName: Strings.BigString;
  43.     tempch : CHAR;
  44.  
  45. BEGIN
  46.    value[0]:=ASCII.NUL;
  47.    EnvNameCvt(name,EnvName);
  48.    EnvFile:=FIO.Open(EnvName);
  49.    
  50.    IF FIO.GoodFILE(EnvFile) THEN
  51.       
  52.       i:=0;
  53.       REPEAT
  54.          tempch:=FIO.ReadChar(EnvFile);
  55.          value[i]:=tempch;
  56.          INC(i);
  57.       UNTIL (i>HIGH(value)) OR (tempch=ASCII.EOF);
  58.       value[i-1]:=ASCII.NUL;
  59.  
  60.       FIO.Close(EnvFile);         
  61.    END;
  62. END GetEnv;
  63.  
  64. (*----------------------------------------------------------------------*)
  65.  
  66. @NoCopyStrings
  67.  
  68. PROCEDURE SetEnv(name: ARRAY OF CHAR; value: ARRAY OF CHAR);
  69.  
  70. VAR EnvFile: FIO.FILE;
  71.     EnvName: Strings.BigString;
  72.  
  73. BEGIN
  74.    EnvNameCvt(name,EnvName);
  75.    EnvFile:=FIO.Create(EnvName);
  76.    
  77.    IF FIO.GoodFILE(EnvFile) THEN
  78.       FIO.WriteString(EnvFile,value);
  79.       FIO.Close(EnvFile);         
  80.    END;
  81. END SetEnv;
  82.  
  83. (*----------------------------------------------------------------------*)
  84.  
  85. @NoCopyStrings
  86.  
  87. PROCEDURE PutEnv(str: ARRAY OF CHAR);
  88.  
  89. VAR name:  Strings.BigString;
  90.     i,j : CARDINAL;
  91.  
  92. BEGIN
  93.    Strings.Assign(str,name);
  94.    i:=0;
  95.    WHILE (i<=HIGH(str)) AND (str[i] # '=') DO INC(i); END;
  96.    
  97.    IF (i<=HIGH(name)) AND (i<=HIGH(str)) AND (i#0) THEN
  98.       name[i]:=ASCII.NUL;
  99.       Strings.Delete(str,0,i+1);
  100.       SetEnv(name,str);
  101.    END;
  102. END PutEnv;
  103.  
  104. (*----------------------------------------------------------------------*)
  105.  
  106. PROCEDURE ParseEnv(VAR str: ARRAY OF CHAR; VAR next: ARRAY OF CHAR):BOOLEAN;
  107.  
  108. CONST ArgDelim1 = ';';
  109.       ArgDelim2 = ',';
  110.       EscDelim  = 134C; (* \ *)
  111.       QuoteChar = '"';
  112.  
  113. VAR InQuote: BOOLEAN;
  114.     i,j:     CARDINAL;
  115.     tempch:  CHAR;
  116.     done:    BOOLEAN;
  117.  
  118. BEGIN
  119.     next[0]:=ASCII.NUL;
  120.     i:=0; j:=0; InQuote:=FALSE; done:=FALSE;
  121.     LOOP
  122.        IF (i>HIGH(str)) OR (j>=HIGH(next)) THEN EXIT; END;
  123.        tempch:=str[i];
  124.        CASE tempch OF
  125.           ASCII.LF ,
  126.           ' ',ASCII.HT,
  127.           ASCII.CR ,
  128.           ASCII.VT : IF InQuote THEN next[j]:=str[i]; INC(j); END;
  129.                       INC(i);
  130.         | ASCII.NUL:  done:=TRUE; EXIT;
  131.         | ArgDelim1,
  132.           ArgDelim2:  EXIT;
  133.         | QuoteChar:  InQuote:=NOT InQuote; INC(i);
  134.         | EscDelim:
  135.           CASE str[i+1] OF
  136.              ArgDelim1,
  137.              ArgDelim2,
  138.              ASCII.HT,' ',
  139.              QuoteChar,
  140.              EscDelim: INC(i);
  141.           ELSE END;
  142.           next[j]:=str[i]; INC(i);
  143.           INC(j);
  144.        ELSE
  145.           next[j]:=str[i]; INC(i); INC(j);
  146.        END;
  147.     END;
  148.     next[j]:=ASCII.NUL;
  149.     Strings.Delete(str,0,i+1);
  150.     RETURN NOT done OR (j#0);
  151. END ParseEnv;
  152.  
  153.  
  154. END Env.
  155.