(syscall-lseek-logic fd offset whence x86) → (mv * x86)
From the
The
SEEK_SET The offset is set to offset bytes.
SEEK_CUR The offset is set to its current location plus offset bytes.
SEEK_END The offset is set to the size of the file plus offset bytes.
The
RETURN VALUE
Upon successful completion,
NOTES
When converting old code, substitute values for whence with the follow ing macros:
old new
0 SEEK_SET
1 SEEK_CUR
2 SEEK_END
TO-DO: I have not modeled
Function:
(defun syscall-lseek-logic (fd offset whence x86) (declare (xargs :stobjs (x86))) (declare (ignorable fd offset whence x86)) (declare (xargs :guard (and (natp fd) (integerp offset) (natp whence)))) (let ((__function__ 'syscall-lseek-logic)) (declare (ignorable __function__)) (b* ((obj-fd-field (read-x86-file-des fd x86)) ((when (not (file-descriptor-fieldp obj-fd-field))) (b* ((- (cw "~%Error: File Descriptor Field ill-formed. Maybe these books were ~ not built with X86ISA_EXEC set to t? See :doc x86isa-build-instructions.~%~%")) (x86 (!ms (list (rip x86) "File Descriptor Field ill-formed. Maybe these books were not built with X86ISA_EXEC set to t? See :doc x86isa-build-instructions." (ms x86)) x86))) (mv -1 x86))) (obj-name (cdr (assoc :name obj-fd-field))) (obj-offset (cdr (assoc :offset obj-fd-field))) ((mv new-offset x86) (case whence (0 (b* (((when (not (natp offset))) (b* ((- (cw "~%Error: SEEK_SET: New file offset not a Natp.~%~%"))) (mv -1 x86))) (x86 (write-x86-file-des fd (put-assoc :offset offset obj-fd-field) x86))) (mv offset x86))) (1 (b* (((when (not (natp (+ obj-offset offset)))) (b* ((- (cw "~%Error: SEEK_CUR: New file offset not a natp.~%~%"))) (mv -1 x86))) (x86 (write-x86-file-des fd (put-assoc :offset (+ obj-offset offset) obj-fd-field) x86))) (mv (+ obj-offset offset) x86))) (2 (b* ((obj-contents-field (read-x86-file-contents obj-name x86)) ((when (not (file-contents-fieldp obj-contents-field))) (b* ((- (cw "~%Error: File Contents Field ill-formed.~%~%")) (x86 (!ms (list (rip x86) "File Contents Field ill-formed" (ms x86)) x86))) (mv -1 x86))) (obj-contents (cdr (assoc :contents obj-contents-field))) (bytes-of-obj (string-to-bytes obj-contents)) (obj-len (len bytes-of-obj)) ((when (not (natp (+ obj-len offset)))) (b* ((- (cw "~%Error: SEEK_END: New file offset not a natp.~%~%"))) (mv -1 x86))) (x86 (write-x86-file-des fd (put-assoc :offset (+ obj-len offset) obj-fd-field) x86))) (mv (+ obj-len offset) x86))) (t (b* ((- (cw "~%Error: Unsupported whence value.~%~%")) (x86 (!ms (list (rip x86) "Unsupported whence value." (ms x86)) x86))) (mv -1 x86)))))) (mv new-offset x86))))