(declare (uses lolevel) (foreign-declare #< /* Warning: nonreentrant. */ #define C_opendir(x,h) C_set_block_item(h, 0, (C_word) opendir(C_c_string(x))) #define C_closedir(h) (closedir((DIR *)C_block_item(h, 0)), C_SCHEME_UNDEFINED) #define C_readdir(h,e) C_set_block_item(e, 0, (C_word) readdir((DIR *)C_block_item(h, 0))) #define C_foundfile(e,b) (strcpy(C_c_string(b), \ ((struct dirent *) C_block_item(e, 0))->d_name), \ C_fix(strlen(((struct dirent *) C_block_item(e, 0))->d_name))) EOF )) (define directory (let ((string-append string-append) (make-string make-string) (string string) (substring substring)) (lambda (spec) (##sys#check-string spec) (let ((buffer (make-string 256)) (handle (address->pointer 0)) (entry (address->pointer 0))) (##core#inline "C_opendir" (##sys#make-c-string spec) handle) (if (null-pointer? handle) (begin (##sys#update-errno) #f) (let loop () (##core#inline "C_readdir" handle entry) (if (null-pointer? entry) (begin (##core#inline "C_closedir" handle) '()) (let* ((flen (##core#inline "C_foundfile" entry buffer)) (file (substring buffer 0 flen))) (cons file (loop))))))))))