T20.mod 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. MODULE T20;
  2. IMPORT FIO, Storage, SYSTEM, Strings, MemUtils, libc;
  3. IMPORT NumberIO;
  4. TYPE
  5. abufType = RECORD
  6. b : SYSTEM.ADDRESS;
  7. len : CARDINAL;
  8. END;
  9. abufTypePtr = POINTER TO abufType;
  10. VAR
  11. abufPtr : abufTypePtr;
  12. str : ARRAY [0..100] OF CHAR;
  13. i : CARDINAL;
  14. PROCEDURE abufInit(VAR ptr : abufTypePtr);
  15. BEGIN
  16. Storage.ALLOCATE(ptr,SYSTEM.TSIZE(abufType) );
  17. ptr^.b := NIL;
  18. ptr^.len := 0;
  19. END abufInit;
  20. PROCEDURE abFree (VAR ptr : abufTypePtr);
  21. BEGIN
  22. Storage.DEALLOCATE(ptr^.b, ptr^.len);
  23. Storage.DEALLOCATE(ptr,SYSTEM.TSIZE(abufType));
  24. END abFree;
  25. PROCEDURE abAppend (VAR ptr : abufTypePtr; str: ARRAY OF CHAR );
  26. VAR
  27. llen : CARDINAL;
  28. BEGIN
  29. llen := Strings.Length(str);
  30. IF ptr <> NIL THEN
  31. IF ptr^.b = NIL THEN
  32. Storage.ALLOCATE(ptr^.b,llen)
  33. ELSE
  34. Storage.REALLOCATE( ptr^.b,ptr^.len + llen);
  35. END;
  36. MemUtils.MemCopy(SYSTEM.ADR(str),llen, SYSTEM.ADDADR(ptr^.b,ptr^.len));
  37. ptr^.len := ptr^.len + llen;
  38. END;
  39. END abAppend;
  40. BEGIN
  41. abufInit(abufPtr);
  42. str := " Bonjour les petits amis!";
  43. abAppend(abufPtr, str);
  44. str := " coucou";
  45. abAppend(abufPtr, str);
  46. (* writing the string in the terminal *)
  47. libc.write(FIO.StdOut,abufPtr^.b,abufPtr^.len);
  48. abFree(abufPtr);
  49. END T20.