home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / Modula / Source / StringLib0 / StringLib0.MOD < prev   
Encoding:
Modula Implementation  |  1988-01-24  |  5.2 KB  |  205 lines  |  [TEXT/????]

  1. IMPLEMENTATION MODULE StringLib0;
  2. (* F. Paquet 17-Apr-86 / C. Pfister 9-Apr-86 *)
  3.  
  4.  
  5. CONST NUL = 0C; FirstDigit = '0';
  6.  
  7.  
  8.   PROCEDURE Length(s: ARRAY OF CHAR): INTEGER;
  9.   VAR cnt, max: INTEGER;
  10.   BEGIN
  11.     cnt:= 0; max:= HIGH(s);
  12.     LOOP
  13.       IF (cnt > max) OR (s[cnt] = NUL) THEN RETURN cnt END;
  14.       INC(cnt)
  15.     END (* LOOP *)
  16.   END Length;
  17.  
  18.  
  19.   PROCEDURE Equal(s1, s2: ARRAY OF CHAR): BOOLEAN;
  20. (*  VAR i, h1, h2: INTEGER;*)
  21.   BEGIN
  22.  (*    h1:= HIGH(s1); h2:= HIGH(s2); i:= 0;
  23.      LOOP
  24.        IF (i > h1) OR (s1[i] = NUL) THEN EXIT END;
  25.        IF (i > h2) OR (s2[i] = NUL) THEN EXIT END;
  26.        IF s1[i] <> s2[i] THEN RETURN (FALSE) END;
  27.        INC(i);
  28.      END; *)
  29.      (* now the strings are equal up to here, i *)
  30. (*     IF (i > h1) OR (s1[i] = NUL) THEN *)(* s1 possibly shorter, and s2 possibly longer *)
  31. (*       LOOP
  32.          IF (i > h2) OR (s2[i] = NUL) THEN EXIT END;
  33.          IF s2[i] <> ' ' THEN RETURN FALSE END;
  34.          INC(i)
  35.        END
  36.      ELSE    *)                      (* s2 is shorter, s1 is longer *)
  37.  (*      LOOP
  38.          IF (i > h1) OR (s1[i] = NUL) THEN EXIT END;
  39.          IF s1[i] <> ' ' THEN RETURN FALSE END;
  40.          INC(i)
  41.        END
  42.      END;
  43.      RETURN(TRUE); *)   (* s1 = s2 *)
  44.      RETURN Compare(s1, s2 ) = EqualTo;
  45.   END Equal;
  46.   
  47.   PROCEDURE Compare(s1, s2: ARRAY OF CHAR): Result;
  48.   (* Added, jnp *)
  49.   VAR i, h1, h2: INTEGER;
  50.   BEGIN
  51.      h1:= HIGH(s1); h2:= HIGH(s2); i:= 0;
  52.      LOOP
  53.        IF (i > h1) OR (s1[i] = NUL) THEN EXIT END;
  54.        IF (i > h2) OR (s2[i] = NUL) THEN EXIT END;
  55.        IF s1[i] < s2[i] THEN
  56.          RETURN LessThan
  57.        ELSIF s1[i] > s2[i] THEN
  58.          RETURN GreaterThan
  59.        END;
  60.        INC(i);
  61.      END; (* LOOP *)
  62.      (* now the strings are equal up to here, i *)
  63.      IF (i > h1) OR (s1[i] = NUL) THEN
  64.        (* s1 possibly shorter, and s2 possibly longer *)
  65.        LOOP
  66.          IF (i > h2) OR (s2[i] = NUL) THEN EXIT END;
  67.          IF s2[i] <> ' ' THEN RETURN LessThan END;
  68.          INC(i)
  69.        END (* LOOP *)
  70.      ELSE
  71.        (* s2 is shorter, s1 is longer *)
  72.        LOOP
  73.          IF (i > h1) OR (s1[i] = NUL) THEN EXIT END;
  74.          IF s1[i] <> ' ' THEN RETURN GreaterThan END;
  75.          INC(i)
  76.        END (* LOOP *)
  77.      END; (* IF *)
  78.      RETURN EqualTo;    (* s1 = s2 *)
  79.   END Compare;
  80.  
  81.   PROCEDURE Occurs(s, p: ARRAY OF CHAR): BOOLEAN;
  82.   VAR sl, pl, i, k: INTEGER;
  83.  
  84.     PROCEDURE Same(): BOOLEAN;
  85.     BEGIN
  86.       FOR k := 0 TO pl - 1 DO
  87.         IF s[k+i] # p[k] THEN RETURN FALSE END
  88.       END; (* FOR *)
  89.       RETURN TRUE
  90.     END Same;
  91.  
  92.   BEGIN
  93.     sl:= Length(s);
  94.     pl:= Length(p);
  95.     IF sl >= pl THEN
  96.       FOR i := 0 TO sl - pl DO
  97.         IF Same() THEN RETURN TRUE END
  98.       END (* FOR *)
  99.     END; (* IF *)
  100.     RETURN FALSE
  101.   END Occurs;
  102.  
  103.  
  104.   PROCEDURE Copy(from: ARRAY OF CHAR; VAR to: ARRAY OF CHAR);
  105.   VAR i: INTEGER;
  106.   BEGIN
  107.     i := 0;
  108.     LOOP
  109.        IF i > HIGH(to) THEN EXIT END;
  110.        IF (i > HIGH(from)) OR (from[i] = NUL) THEN
  111.       to[i] := NUL;
  112.       EXIT
  113.        END; (* IF *)
  114.        to[i] := from[i];
  115.        INC (i)
  116.     END (* LOOP *)
  117.   END Copy;
  118.  
  119.   PROCEDURE Concat(VAR dest: ARRAY OF CHAR;
  120.                        pat:  ARRAY OF CHAR);
  121.   VAR i, j: INTEGER;
  122.   BEGIN
  123.     i := 0;
  124.     WHILE (i <= HIGH(dest)) & (dest[i] # NUL) DO INC(i) END;
  125.     j := 0;
  126.     LOOP
  127.       IF (i > HIGH(dest)) OR (j > HIGH(pat)) OR (pat[j] = NUL) THEN EXIT END;
  128.       dest[i] := pat[j]; INC(i); INC(j)
  129.     END; (* LOOP *)
  130.     IF i <= HIGH(dest) THEN dest[i] := NUL END
  131.   END Concat;
  132.  
  133.  
  134.   PROCEDURE Min(x, y: INTEGER): INTEGER;
  135.   BEGIN
  136.     IF x > y THEN RETURN y ELSE RETURN x END
  137.   END Min;
  138.  
  139.  
  140.    (* GeneralCopyString *)
  141.  
  142.   PROCEDURE GCS(VAR ts: ARRAY OF CHAR;   (* destination string         *)
  143.                     tp: INTEGER;         (* start position destination *)
  144.                     fs: ARRAY OF CHAR;   (* source string              *)
  145.                     fp,                  (* start position source      *)
  146.                     l:  INTEGER);        (* length                     *)
  147.   VAR max: INTEGER;
  148.   BEGIN
  149.     IF ((fp + l) > HIGH(fs) + 1) OR ((tp + l) > HIGH(ts) + 1) THEN
  150.       HALT    (* Error ('GeneralCopyString', 'array bounds error') *)
  151.     END; (* IF *)
  152.     max:= fp + l;
  153.     LOOP
  154.       IF fp >= max THEN EXIT END;
  155.       ts[tp] := fs[fp]; INC(tp); INC(fp)
  156.     END (* LOOP *)
  157.   END GCS;
  158.  
  159.  
  160.   PROCEDURE Insert(VAR bs:  ARRAY OF CHAR;
  161.                        pat: ARRAY OF CHAR;
  162.                        i:   INTEGER); 
  163.   VAR ol, nl, rl, ssl: INTEGER;
  164.   BEGIN
  165.     ol := Length(bs);
  166.     IF ol >= i THEN
  167.       ssl := Min(Length(pat), HIGH(bs) + 1 - i);
  168.       IF ssl > 0 THEN
  169.         rl := Min(ol, HIGH(bs) + 1 - ssl) - i;
  170.         IF rl > 0 THEN
  171.           GCS(bs,i+ssl,bs,i,rl)
  172.         END; (* IF *)
  173.         GCS(bs,i,pat,0,ssl)
  174.       END; (* IF *)
  175.       nl:= i + ssl + rl;
  176.       IF nl <= HIGH(bs) THEN
  177.         bs[nl]:= NUL
  178.       END (* IF *)
  179.     END (* IF *)
  180.   END Insert;
  181.  
  182.  
  183.   PROCEDURE Delete(VAR bs: ARRAY OF CHAR;
  184.                        fp,
  185.                        l:  INTEGER);
  186.   VAR ol, nl, rl: INTEGER;
  187.   BEGIN
  188.     ol := Length(bs);
  189.     IF ol > fp THEN
  190.       rl := ol - fp;
  191.       IF rl > l THEN
  192.         GCS(bs,fp,bs,fp + l,rl - l);
  193.         nl := ol - l;
  194.       ELSE
  195.         nl := fp;
  196.       END; (* IF *)
  197.       IF nl <= HIGH (bs) THEN
  198.         bs[nl] := NUL
  199.       END (* IF *)
  200.     END (* IF *)
  201.   END Delete;
  202.  
  203.  
  204. END StringLib0.
  205.