MODULE T20; IMPORT FIO, Storage, SYSTEM, Strings, MemUtils, libc; IMPORT NumberIO; TYPE abufType = RECORD b : SYSTEM.ADDRESS; len : CARDINAL; END; abufTypePtr = POINTER TO abufType; VAR abufPtr : abufTypePtr; str : ARRAY [0..100] OF CHAR; i : CARDINAL; PROCEDURE abufInit(VAR ptr : abufTypePtr); BEGIN Storage.ALLOCATE(ptr,SYSTEM.TSIZE(abufType) ); ptr^.b := NIL; ptr^.len := 0; END abufInit; PROCEDURE abFree (VAR ptr : abufTypePtr); BEGIN Storage.DEALLOCATE(ptr^.b, ptr^.len); Storage.DEALLOCATE(ptr,SYSTEM.TSIZE(abufType)); END abFree; PROCEDURE abAppend (VAR ptr : abufTypePtr; str: ARRAY OF CHAR ); VAR llen : CARDINAL; BEGIN llen := Strings.Length(str); IF ptr <> NIL THEN IF ptr^.b = NIL THEN Storage.ALLOCATE(ptr^.b,llen); ELSE Storage.REALLOCATE( ptr^.b,ptr^.len + llen); END; MemUtils.MemCopy(SYSTEM.ADR(str),llen, SYSTEM.ADDADR(ptr^.b,ptr^.len)); ptr^.len := ptr^.len + llen; END; END abAppend; BEGIN abufInit(abufPtr); str := " Bonjour les petits amis!"; abAppend(abufPtr, str); str := " coucou! "; abAppend(abufPtr, str); str := " et encore une chaƮne :D "; abAppend(abufPtr, str); (* writing the string in the terminal *) libc.write(FIO.StdOut,abufPtr^.b,abufPtr^.len); abFree(abufPtr); END T20.