- (with-alien ((ptr (* char) sap))
- (let* ((length (alien-funcall (extern-alien "strlen"
- (function integer (* char)))
- ptr))
- (result (make-string length)))
+ (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