- (with-alien ((ptr (* char) sap))
- (locally
- (declare (optimize (speed 3) (safety 0)))
- (let ((length (loop
- for offset of-type fixnum upfrom 0
- until (zerop (deref ptr offset))
- finally (return offset))))
- (let ((result (make-string length)))
- (sb!kernel:copy-from-system-area (alien-sap ptr) 0
- result (* sb!vm:vector-data-offset
- sb!vm:n-word-bits)
- (* length sb!vm:byte-bits))
- result)))))
+ (locally
+ (declare (optimize (speed 3) (safety 0)))
+ (let ((length (loop for offset of-type fixnum upfrom 0
+ until (zerop (sap-ref-8 sap offset))
+ finally (return offset))))
+ (let ((result (make-string length :element-type 'base-char)))
+ (sb!kernel:copy-ub8-from-system-area sap 0 result 0 length)
+ result))))
+
+(defun string-to-c-string (string external-format)
+ (declare (type simple-string string))
+ (locally
+ (declare (optimize (speed 3) (safety 0)))
+ (let ((func (sb!impl::get-external-format-function external-format 10)))
+ (unless func
+ (error "Undefined external-format ~A.~%" external-format))
+ (funcall (symbol-function func) string))))
+
+(defun c-string-to-string (sap external-format element-type)
+ (declare (type system-area-pointer sap))
+ (locally
+ (declare (optimize (speed 3) (safety 0)))
+ (let ((func (sb!impl::get-external-format-function external-format 9)))
+ (unless func
+ (error "Undefined external-format ~A.~%" external-format))
+ (funcall (symbol-function func) sap element-type))))
+