-- 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];
};
}.