T20bad.mod 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  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. Storage.REALLOCATE( ptr^.b,ptr^.len + llen);
  32. MemUtils.MemCopy(SYSTEM.ADR(str),llen, SYSTEM.ADDADR(ptr^.b,ptr^.len));
  33. ptr^.len := ptr^.len + llen;
  34. END;
  35. END abAppend;
  36. BEGIN
  37. abufInit(abufPtr);
  38. str := " Bonjour les petits amis!";
  39. abAppend(abufPtr, str);
  40. str := " coucou";
  41. abAppend(abufPtr, str);
  42. (* writing the string in the terminal *)
  43. libc.write(FIO.StdOut,abufPtr^.b,abufPtr^.len);
  44. abFree(abufPtr);
  45. END T20.