-- Copyright (C) 1985, 1986 by Xerox Corporation. All rights reserved. -- CStringImpl.mesa -- NFS 20-Dec-85 15:50:53 DIRECTORY Ascii USING [NUL], CString USING [CString, IncrBPointer, ReadChar, ToBytePointer, WriteChar], Heap USING [MakeNode], String USING [MakeMDSString, MakeString]; CStringImpl: PROGRAM IMPORTS CString, String, Heap EXPORTS CString = { OPEN CString; CStringToString: PUBLIC PROCEDURE [cs: CString, z: MDSZone] RETURNS [STRING] = { s: STRING ← NIL; IF cs.pointer # NIL THEN { cs2: CString ← cs; nChars: CARDINAL ← 0; UNTIL ReadChar[cs2] = Ascii.NUL DO nChars ← nChars + 1; cs2 ← IncrBPointer[cs2]; ENDLOOP; s ← String.MakeMDSString[z, nChars]; s.length ← nChars; FOR i: CARDINAL IN [0..nChars) DO s.text[i] ← ReadChar[cs]; cs ← IncrBPointer[cs]; ENDLOOP; }; RETURN[s]; }; CStringToLongString: PUBLIC PROCEDURE [cs: CString, z: UNCOUNTED ZONE] RETURNS [LONG STRING] = { s: LONG STRING ← NIL; IF cs.pointer # NIL THEN { cs2: CString ← cs; nChars: CARDINAL ← 0; UNTIL ReadChar[cs2] = Ascii.NUL DO nChars ← nChars + 1; cs2 ← IncrBPointer[cs2]; ENDLOOP; s ← String.MakeString[z, nChars]; s.length ← nChars; FOR i: CARDINAL IN [0..nChars) DO s.text[i] ← ReadChar[cs]; cs ← IncrBPointer[cs]; ENDLOOP; }; RETURN[s]; }; StringToCString: PUBLIC PROCEDURE [s: STRING, z: UNCOUNTED ZONE] RETURNS [CString] = {RETURN[LongStringToCString[LONG[s], z]]; }; LongStringToCString: PUBLIC PROCEDURE [s: LONG STRING, z: UNCOUNTED ZONE] RETURNS [CString] = { cs, cs2: CString; cs.pointer ← NIL; IF s # NIL THEN { cs ← cs2 ← ToBytePointer[Heap.MakeNode[z, s.length / 2 + 1]]; -- always add 1 because of ending NUL. FOR i: CARDINAL IN [0..s.length) DO WriteChar[s.text[i], cs2]; cs2 ← IncrBPointer[cs2]; ENDLOOP; WriteChar[Ascii.NUL, cs2]; }; RETURN[cs]; }; }.