Advertisement
Guest User

Untitled

a guest
Jan 3rd, 2015
210
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.32 KB | None | 0 0
  1. #include "share/atspre_staload.hats"
  2. staload UN = "prelude/SATS/unsafe.sats"
  3.  
  4. absvtype stream_vt = ptr // for string streams
  5.  
  6. extern fun create_stream_vt(): stream_vt
  7. extern fun inc_stream_vt(stream: !stream_vt >> _): void
  8. extern fun free_stream_vt(stream: stream_vt): void
  9.  
  10. local
  11. vtypedef stream_struct_vt(n:int) = @{
  12. data= Strptr1,
  13. size= size_t(n),
  14. pos= sizeLte(n)
  15. }
  16. vtypedef stream_struct_vt = [n:nat] stream_struct_vt(n)
  17.  
  18. assume stream_vt = [l:addr] (stream_struct_vt@l, mfree_gc_v(l) | ptr(l))
  19. in
  20. implement create_stream_vt() = let
  21. val (pf, pfgc | p) = ptr_alloc<stream_struct_vt(0)> ()
  22. val () = p->data := string0_copy("content of a text file")
  23. val () = p->size := i2sz(13)
  24. val () = p->pos := i2sz(0)
  25. in
  26. $UN.castvwtp0{stream_vt}((pf, pfgc | p))
  27. end
  28.  
  29. implement inc_stream_vt(stream) = let
  30. val (pf, pfgc | p) = stream
  31. val () = p->pos := p->pos + 1
  32. val () = assertloc (p->pos <= p->size)
  33. val () = stream := (pf, pfgc | p)
  34. in
  35. end
  36.  
  37. implement free_stream_vt(stream) = let
  38. val (pf, pfgc | p) = stream
  39. val () = strptr_free(p->data)
  40. in
  41. ptr_free{stream_struct_vt(0)?}(pfgc, pf| p)
  42. end
  43. end
  44.  
  45. implement main0(argc, argv) = let
  46. val stream = create_stream_vt()
  47. val () = inc_stream_vt(stream)
  48. in
  49. free_stream_vt(stream)
  50. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement