T19.mod 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. MODULE T19;
  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. Storage.ALLOCATE( ptr^.b,Strings.Length(str));
  31. IF ptr <> NIL THEN
  32. MemUtils.MemCopy(SYSTEM.ADR(str),Strings.Length(str), ptr^.b);
  33. (* ptr^.len := ptr^.len + llen; *)
  34. ptr^.len := Strings.Length(str);
  35. END;
  36. END abAppend;
  37. BEGIN
  38. abufInit(abufPtr);
  39. str := " Bonjour les petits amis!";
  40. Storage.ALLOCATE(abufPtr^.b, Strings.Length(str));
  41. (* MemUtils.MemCopy(SYSTEM.ADR(str),Strings.Length(str), abufPtr^.b);
  42. abufPtr^.len := Strings.Length(str); *)
  43. abAppend(abufPtr, str);
  44. (* writing the string in the terminal *)
  45. libc.write(FIO.StdOut,abufPtr^.b,abufPtr^.len);
  46. abFree(abufPtr);
  47. END T19.