write.lisp 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. (in-package :hurd)
  2. (defcfun ("io_write" %io-write)
  3. err
  4. (file port)
  5. (data :pointer)
  6. (data-cnt msg-type-number)
  7. (offset :unsigned-long-long)
  8. (amount :pointer))
  9. (defun %convert-item (item)
  10. (if (typep item 'character)
  11. (char-code item)
  12. item))
  13. (defmethod %write-sequence-to-ptr ((ls cons) total ptr)
  14. (loop for i from 0 below total
  15. for item in ls
  16. do (setf (mem-aref ptr :unsigned-char i)
  17. (%convert-item item))))
  18. (defmethod %write-sequence-to-ptr ((arr vector) total ptr)
  19. (loop for i from 0 below total
  20. for item across arr
  21. do (setf (mem-aref ptr :unsigned-char i)
  22. (%convert-item item))))
  23. (defun io-write (file data &key (offset +minus-one-ll+))
  24. "Write 'data' to 'file' starting at 'offset'. Data can be a string or an octet sequence/array."
  25. (declare (type fixnum file)
  26. (type integer offset))
  27. (let ((total (length data)))
  28. (when (zerop total)
  29. (return-from io-write 0))
  30. (with-foreign-pointer (ptr total)
  31. (with-foreign-pointer (amount (foreign-type-size 'vm-size))
  32. (%write-sequence-to-ptr data total ptr)
  33. (let ((err (%io-write file ptr total offset amount)))
  34. (select-error err
  35. (mem-ref amount 'vm-size)))))))