-- File: StringsA.Mesa Edited by: -- Sandman on July 1, 1980 8:39 AM -- Sapsford on May 8, 1980 4:04 PM -- Copyright Xerox Corporation 1979, 1980 DIRECTORY InlineDefs USING [BITOR], NucleusOps USING [], String USING [], StringDefs USING [CharsPerWord, StringHeaderSize, SubString]; StringsA: PROGRAM IMPORTS InlineDefs EXPORTS NucleusOps, StringDefs, String =PUBLIC BEGIN OPEN StringDefs; WordsForString: PROCEDURE [nchars: CARDINAL] RETURNS [CARDINAL] = BEGIN RETURN[StringHeaderSize + (nchars + (CharsPerWord - 1))/CharsPerWord] END; StringBoundsFault: SIGNAL [s: STRING] RETURNS [ns: STRING] = CODE; AppendChar: PROCEDURE [s: STRING, c: CHARACTER] = BEGIN IF s = NIL THEN RETURN; UNTIL s.length < s.maxlength DO s _ SIGNAL StringBoundsFault[s]; ENDLOOP; s[s.length] _ c; s.length _ s.length + 1; RETURN END; AppendString: PROCEDURE [to: STRING, from: STRING] = BEGIN i, j, n: CARDINAL; IF to = NIL OR from = NIL THEN RETURN; WHILE from.length + to.length > to.maxlength DO to _ SIGNAL StringBoundsFault[to]; ENDLOOP; n _ MIN[from.length, LOOPHOLE[to.maxlength - to.length, CARDINAL]]; i _ to.length; j _ 0; WHILE j < n DO to[i] _ from[j]; i _ i + 1; j _ j + 1; ENDLOOP; to.length _ i; RETURN END; EqualString, EqualStrings: PROCEDURE [s1, s2: STRING] RETURNS [BOOLEAN] = BEGIN i: CARDINAL; IF s1 = NIL AND s2 = NIL THEN RETURN[TRUE]; IF s1 = NIL OR s2 = NIL OR s1.length # s2.length THEN RETURN[FALSE]; FOR i IN [0..s1.length) DO IF s1[i] # s2[i] THEN RETURN[FALSE]; ENDLOOP; RETURN[TRUE] END; EquivalentString, EquivalentStrings: PROCEDURE [s1, s2: STRING] RETURNS [BOOLEAN] = BEGIN OPEN InlineDefs; i: CARDINAL; casebit: WORD = 40B; IF s1 = NIL AND s2 = NIL THEN RETURN[TRUE]; IF s1 = NIL OR s2 = NIL OR s1.length # s2.length THEN RETURN[FALSE]; FOR i IN [0..s1.length) DO IF BITOR[s1[i], casebit] # BITOR[s2[i], casebit] THEN RETURN[FALSE]; ENDLOOP; RETURN[TRUE] END; AppendSubString: PROCEDURE [to: STRING, from: SubString] = BEGIN i, j, n: CARDINAL; s: STRING; IF to = NIL OR (s _ from.base) = NIL THEN RETURN; WHILE from.length + to.length > to.maxlength DO to _ SIGNAL StringBoundsFault[to]; ENDLOOP; i _ to.length; j _ from.offset; n _ MIN[from.length, LOOPHOLE[to.maxlength - to.length, CARDINAL]]; WHILE n > 0 DO to[i] _ s[j]; i _ i + 1; j _ j + 1; n _ n - 1; ENDLOOP; to.length _ i; RETURN END; EqualSubString, EqualSubStrings: PROCEDURE [s1, s2: SubString] RETURNS [BOOLEAN] = BEGIN i1, i2, n: CARDINAL; b1, b2: STRING; IF s1.length # s2.length THEN RETURN[FALSE]; b1 _ s1.base; i1 _ s1.offset; b2 _ s2.base; i2 _ s2.offset; FOR n _ s1.length, n - 1 WHILE n > 0 DO IF b1[i1] # b2[i2] THEN RETURN[FALSE]; i1 _ i1 + 1; i2 _ i2 + 1; ENDLOOP; RETURN[TRUE] END; EquivalentSubString, EquivalentSubStrings: PROCEDURE [s1, s2: SubString] RETURNS [BOOLEAN] = BEGIN OPEN InlineDefs; casebit: WORD = 40B; i1, i2, n: CARDINAL; b1, b2: STRING; IF s1.length # s2.length THEN RETURN[FALSE]; b1 _ s1.base; i1 _ s1.offset; b2 _ s2.base; i2 _ s2.offset; FOR n _ s1.length, n - 1 WHILE n > 0 DO IF BITOR[b1[i1], casebit] # BITOR[b2[i2], casebit] THEN RETURN[FALSE]; i1 _ i1 + 1; i2 _ i2 + 1; ENDLOOP; RETURN[TRUE] END; DeleteSubString: PROCEDURE [s: SubString] = BEGIN b: STRING = s.base; i: CARDINAL _ s.offset; j: CARDINAL _ i + s.length; WHILE j < b.length DO b[i] _ b[j]; i _ i + 1; j _ j + 1; ENDLOOP; b.length _ i; RETURN END; END.