[9] | 1 | (*
|
---|
| 2 | (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
---|
| 3 | See the copyright notice in the ACK home directory, in the file "Copyright".
|
---|
| 4 | *)
|
---|
| 5 |
|
---|
| 6 | (*$R-*)
|
---|
| 7 | IMPLEMENTATION MODULE Strings;
|
---|
| 8 | (*
|
---|
| 9 | Module: String manipulations
|
---|
| 10 | Author: Ceriel J.H. Jacobs
|
---|
| 11 | Version: $Header: /cvsup/minix/src/lib/ack/libm2/Strings.mod,v 1.1 2005/10/10 15:27:46 beng Exp $
|
---|
| 12 | *)
|
---|
| 13 |
|
---|
| 14 | PROCEDURE Assign(source: ARRAY OF CHAR; VAR dest: ARRAY OF CHAR);
|
---|
| 15 | (* Assign string source to dest
|
---|
| 16 | *)
|
---|
| 17 | VAR i: CARDINAL;
|
---|
| 18 | max: CARDINAL;
|
---|
| 19 | BEGIN
|
---|
| 20 | max := HIGH(source);
|
---|
| 21 | IF HIGH(dest) < max THEN max := HIGH(dest); END;
|
---|
| 22 | i := 0;
|
---|
| 23 | WHILE (i <= max) AND (source[i] # 0C) DO
|
---|
| 24 | dest[i] := source[i];
|
---|
| 25 | INC(i);
|
---|
| 26 | END;
|
---|
| 27 | IF i < HIGH(dest) THEN dest[i] := 0C; END;
|
---|
| 28 | END Assign;
|
---|
| 29 |
|
---|
| 30 | PROCEDURE Insert(substr: ARRAY OF CHAR; VAR str: ARRAY OF CHAR; inx: CARDINAL);
|
---|
| 31 | (* Insert the string substr into str, starting at str[inx].
|
---|
| 32 | If inx is equal to or greater than Length(str) then substr is appended
|
---|
| 33 | to the end of str.
|
---|
| 34 | *)
|
---|
| 35 | VAR sublen, length, i: CARDINAL;
|
---|
| 36 | BEGIN
|
---|
| 37 | sublen := Length(substr);
|
---|
| 38 | IF sublen = 0 THEN RETURN; END;
|
---|
| 39 | length := Length(str);
|
---|
| 40 | IF inx > length THEN inx := length; END;
|
---|
| 41 | i := length;
|
---|
| 42 | IF i + sublen - 1 > HIGH(str) THEN i := HIGH(str); END;
|
---|
| 43 | WHILE i > inx DO
|
---|
| 44 | str[i+sublen-1] := str[i-1];
|
---|
| 45 | DEC(i);
|
---|
| 46 | END;
|
---|
| 47 | FOR i := 0 TO sublen - 1 DO
|
---|
| 48 | IF i + inx <= HIGH(str) THEN
|
---|
| 49 | str[i + inx] := substr[i];
|
---|
| 50 | ELSE
|
---|
| 51 | RETURN;
|
---|
| 52 | END;
|
---|
| 53 | END;
|
---|
| 54 | IF length + sublen <= HIGH(str) THEN
|
---|
| 55 | str[length + sublen] := 0C;
|
---|
| 56 | END;
|
---|
| 57 | END Insert;
|
---|
| 58 |
|
---|
| 59 | PROCEDURE Delete(VAR str: ARRAY OF CHAR; inx, len: CARDINAL);
|
---|
| 60 | (* Delete len characters from str, starting at str[inx].
|
---|
| 61 | If inx >= Length(str) then nothing happens.
|
---|
| 62 | If there are not len characters to delete, characters to the end of the
|
---|
| 63 | string are deleted.
|
---|
| 64 | *)
|
---|
| 65 | VAR length: CARDINAL;
|
---|
| 66 | BEGIN
|
---|
| 67 | IF len = 0 THEN RETURN; END;
|
---|
| 68 | length := Length(str);
|
---|
| 69 | IF inx >= length THEN RETURN; END;
|
---|
| 70 | WHILE inx + len < length DO
|
---|
| 71 | str[inx] := str[inx + len];
|
---|
| 72 | INC(inx);
|
---|
| 73 | END;
|
---|
| 74 | str[inx] := 0C;
|
---|
| 75 | END Delete;
|
---|
| 76 |
|
---|
| 77 | PROCEDURE Pos(substr, str: ARRAY OF CHAR): CARDINAL;
|
---|
| 78 | (* Return the index into str of the first occurrence of substr.
|
---|
| 79 | Pos returns a value greater than HIGH(str) of no occurrence is found.
|
---|
| 80 | *)
|
---|
| 81 | VAR i, j, max, subl: CARDINAL;
|
---|
| 82 | BEGIN
|
---|
| 83 | max := Length(str);
|
---|
| 84 | subl := Length(substr);
|
---|
| 85 | IF subl > max THEN RETURN HIGH(str) + 1; END;
|
---|
| 86 | IF subl = 0 THEN RETURN 0; END;
|
---|
| 87 | max := max - subl;
|
---|
| 88 | FOR i := 0 TO max DO
|
---|
| 89 | j := 0;
|
---|
| 90 | WHILE (j <= subl-1) AND (str[i+j] = substr[j]) DO
|
---|
| 91 | INC(j);
|
---|
| 92 | END;
|
---|
| 93 | IF j = subl THEN RETURN i; END;
|
---|
| 94 | END;
|
---|
| 95 | RETURN HIGH(str) + 1;
|
---|
| 96 | END Pos;
|
---|
| 97 |
|
---|
| 98 | PROCEDURE Copy(str: ARRAY OF CHAR;
|
---|
| 99 | inx, len: CARDINAL;
|
---|
| 100 | VAR result: ARRAY OF CHAR);
|
---|
| 101 | (* Copy at most len characters from str into result, starting at str[inx].
|
---|
| 102 | *)
|
---|
| 103 | VAR i: CARDINAL;
|
---|
| 104 | BEGIN
|
---|
| 105 | IF Length(str) <= inx THEN RETURN END;
|
---|
| 106 | i := 0;
|
---|
| 107 | LOOP
|
---|
| 108 | IF i > HIGH(result) THEN RETURN; END;
|
---|
| 109 | IF len = 0 THEN EXIT; END;
|
---|
| 110 | IF inx > HIGH(str) THEN EXIT; END;
|
---|
| 111 | result[i] := str[inx];
|
---|
| 112 | INC(i); INC(inx); DEC(len);
|
---|
| 113 | END;
|
---|
| 114 | IF i <= HIGH(result) THEN result[i] := 0C; END;
|
---|
| 115 | END Copy;
|
---|
| 116 |
|
---|
| 117 | PROCEDURE Concat(s1, s2: ARRAY OF CHAR; VAR result: ARRAY OF CHAR);
|
---|
| 118 | (* Concatenate two strings.
|
---|
| 119 | *)
|
---|
| 120 | VAR i, j: CARDINAL;
|
---|
| 121 | BEGIN
|
---|
| 122 | i := 0;
|
---|
| 123 | WHILE (i <= HIGH(s1)) AND (s1[i] # 0C) DO
|
---|
| 124 | IF i > HIGH(result) THEN RETURN END;
|
---|
| 125 | result[i] := s1[i];
|
---|
| 126 | INC(i);
|
---|
| 127 | END;
|
---|
| 128 | j := 0;
|
---|
| 129 | WHILE (j <= HIGH(s2)) AND (s2[j] # 0C) DO
|
---|
| 130 | IF i > HIGH(result) THEN RETURN END;
|
---|
| 131 | result[i] := s2[j];
|
---|
| 132 | INC(i);
|
---|
| 133 | INC(j);
|
---|
| 134 | END;
|
---|
| 135 | IF i <= HIGH(result) THEN result[i] := 0C; END;
|
---|
| 136 | END Concat;
|
---|
| 137 |
|
---|
| 138 | PROCEDURE Length(str: ARRAY OF CHAR): CARDINAL;
|
---|
| 139 | (* Return number of characters in str.
|
---|
| 140 | *)
|
---|
| 141 | VAR i: CARDINAL;
|
---|
| 142 | BEGIN
|
---|
| 143 | i := 0;
|
---|
| 144 | WHILE (i <= HIGH(str)) DO
|
---|
| 145 | IF str[i] = 0C THEN RETURN i; END;
|
---|
| 146 | INC(i);
|
---|
| 147 | END;
|
---|
| 148 | RETURN i;
|
---|
| 149 | END Length;
|
---|
| 150 |
|
---|
| 151 | PROCEDURE CompareStr(s1, s2: ARRAY OF CHAR): INTEGER;
|
---|
| 152 | (* Compare two strings, return -1 if s1 < s2, 0 if s1 = s2, and 1 if s1 > s2.
|
---|
| 153 | *)
|
---|
| 154 | VAR i: CARDINAL;
|
---|
| 155 | max: CARDINAL;
|
---|
| 156 | BEGIN
|
---|
| 157 | max := HIGH(s1);
|
---|
| 158 | IF HIGH(s2) < max THEN max := HIGH(s2); END;
|
---|
| 159 | i := 0;
|
---|
| 160 | WHILE (i <= max) DO
|
---|
| 161 | IF s1[i] < s2[i] THEN RETURN -1; END;
|
---|
| 162 | IF s1[i] > s2[i] THEN RETURN 1; END;
|
---|
| 163 | IF s1[i] = 0C THEN RETURN 0; END;
|
---|
| 164 | INC(i);
|
---|
| 165 | END;
|
---|
| 166 | IF (i <= HIGH(s1)) AND (s1[i] # 0C) THEN RETURN 1; END;
|
---|
| 167 | IF (i <= HIGH(s2)) AND (s2[i] # 0C) THEN RETURN -1; END;
|
---|
| 168 | RETURN 0;
|
---|
| 169 | END CompareStr;
|
---|
| 170 |
|
---|
| 171 | END Strings.
|
---|