~ chicken-core (chicken-5) 2b5650ef6e9c141aed8ab8ed3875ad414aefaf3a
commit 2b5650ef6e9c141aed8ab8ed3875ad414aefaf3a Author: felix <felix@call-with-current-continuation.org> AuthorDate: Mon Jul 5 09:49:34 2010 +0200 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Mon Jul 5 09:49:34 2010 +0200 more posix-refactoring and fixing of bugs related to this diff --git a/posix-common.scm b/posix-common.scm index 248f6c27..a03861c9 100644 --- a/posix-common.scm +++ b/posix-common.scm @@ -53,6 +53,18 @@ static C_TLS struct stat C_statbuf; EOF )) +(include "common-declarations.scm") + + +(define posix-error + (let ([strerror (foreign-lambda c-string "strerror" int)] + [string-append string-append] ) + (lambda (type loc msg . args) + (let ([rn (##sys#update-errno)]) + (apply ##sys#signal-hook type loc (string-append msg " - " (strerror rn)) args) ) ) ) ) + +(define ##sys#posix-error posix-error) + ;;; File properties @@ -67,8 +79,6 @@ EOF (define-foreign-variable _stat_st_mode unsigned-int "C_statbuf.st_mode") (define-foreign-variable _stat_st_dev unsigned-int "C_statbuf.st_dev") (define-foreign-variable _stat_st_rdev unsigned-int "C_statbuf.st_rdev") -(define-foreign-variable _stat_st_blksize unsigned-int "C_statbuf.st_blksize") -(define-foreign-variable _stat_st_blocks unsigned-int "C_statbuf.st_blocks") (define-syntax (stat-mode x r c) ;; no need to rename here @@ -179,6 +189,41 @@ EOF (##sys#substring buffer 0 len) (##sys#signal-hook #:file-error 'current-directory "cannot retrieve current directory") ) ) ) ) ) ) +(define delete-directory + (lambda (name) + (##sys#check-string name 'delete-directory) + (let ((sname (##sys#make-c-string (##sys#expand-home-path name) 'delete-directory))) + (unless (fx= 0 (##core#inline "C_rmdir" sname)) + (posix-error #:file-error 'delete-directory "cannot delete directory" name) ) + name))) + +(define directory + (let ([make-string make-string]) + (lambda (#!optional (spec (current-directory)) show-dotfiles?) + (##sys#check-string spec 'directory) + (let ([buffer (make-string 256)] + [handle (##sys#make-pointer)] + [entry (##sys#make-pointer)] ) + (##core#inline "C_opendir" (##sys#make-c-string (##sys#expand-home-path spec) 'directory) handle) + (if (##sys#null-pointer? handle) + (posix-error #:file-error 'directory "cannot open directory" spec) + (let loop () + (##core#inline "C_readdir" handle entry) + (if (##sys#null-pointer? entry) + (begin + (##core#inline "C_closedir" handle) + '() ) + (let* ([flen (##core#inline "C_foundfile" entry buffer)] + [file (##sys#substring buffer 0 flen)] + [char1 (string-ref file 0)] + [char2 (and (fx> flen 1) (string-ref file 1))] ) + (if (and (eq? #\. char1) + (or (not char2) + (and (eq? #\. char2) (eq? 2 flen)) + (not show-dotfiles?) ) ) + (loop) + (cons file (loop)) ) ) ) ) ) ) ) ) ) + ;;; Filename globbing: @@ -186,6 +231,7 @@ EOF (let ((regexp regexp) (string-match string-match) (glob->regexp glob->regexp) + (directory directory) (make-pathname make-pathname) (decompose-pathname decompose-pathname) ) (lambda paths @@ -196,7 +242,7 @@ EOF (let-values (((dir fil ext) (decompose-pathname path))) (let* ((patt (glob->regexp (make-pathname #f (or fil "*") ext))) (rx (regexp patt))) - (let loop ((fns (##sys#directory (or dir ".") #t))) + (let loop ((fns (directory (or dir ".") #t))) (cond ((null? fns) (conc-loop (cdr paths))) ((string-match rx (car fns)) => (lambda (m) (cons (make-pathname dir (car m)) (loop (cdr fns)))) ) diff --git a/posixunix.scm b/posixunix.scm index ae437aa0..773f5d57 100644 --- a/posixunix.scm +++ b/posixunix.scm @@ -470,21 +470,13 @@ static int set_file_mtime(char *filename, C_word tm) EOF ) ) -(include "common-declarations.scm") +;; these are not available on Windows -(register-feature! 'posix) - -(define posix-error - (let ([strerror (foreign-lambda c-string "strerror" int)] - [string-append string-append] ) - (lambda (type loc msg . args) - (let ([rn (##sys#update-errno)]) - (apply ##sys#signal-hook type loc (string-append msg " - " (strerror rn)) args) ) ) ) ) +(define-foreign-variable _stat_st_blksize unsigned-int "C_statbuf.st_blksize") +(define-foreign-variable _stat_st_blocks unsigned-int "C_statbuf.st_blocks") ;; Faster versions of common operations -(define ##sys#posix-error posix-error) - (define ##sys#file-nonblocking! (foreign-lambda* bool ([int fd]) "int val = fcntl(fd, F_GETFL, 0);" @@ -777,43 +769,6 @@ EOF (posix-error #:file-error 'change-directory "cannot change current directory" name) ) name))) -(define delete-directory - (lambda (name) - (##sys#check-string name 'delete-directory) - (let ((sname (##sys#make-c-string (##sys#expand-home-path name) 'delete-directory))) - (unless (fx= 0 (##core#inline "C_rmdir" sname)) - (posix-error #:file-error 'delete-directory "cannot delete directory" name) ) - name))) - -(define ##sys#directory - (let ([make-string make-string]) - (lambda (#!optional (spec (current-directory)) show-dotfiles?) - (##sys#check-string spec 'directory) - (let ([buffer (make-string 256)] - [handle (##sys#make-pointer)] - [entry (##sys#make-pointer)] ) - (##core#inline "C_opendir" (##sys#make-c-string (##sys#expand-home-path spec) 'directory) handle) - (if (##sys#null-pointer? handle) - (posix-error #:file-error 'directory "cannot open directory" spec) - (let loop () - (##core#inline "C_readdir" handle entry) - (if (##sys#null-pointer? entry) - (begin - (##core#inline "C_closedir" handle) - '() ) - (let* ([flen (##core#inline "C_foundfile" entry buffer)] - [file (##sys#substring buffer 0 flen)] - [char1 (string-ref file 0)] - [char2 (and (fx> flen 1) (string-ref file 1))] ) - (if (and (eq? #\. char1) - (or (not char2) - (and (eq? #\. char2) (eq? 2 flen)) - (not show-dotfiles?) ) ) - (loop) - (cons file (loop)) ) ) ) ) ) ) ) ) ) - -(define directory ##sys#directory) - ;;; Pipes: diff --git a/posixwin.scm b/posixwin.scm index a3e9af43..9f313952 100644 --- a/posixwin.scm +++ b/posixwin.scm @@ -903,18 +903,10 @@ static int set_file_mtime(char *filename, C_word tm) EOF ) ) -(include "common-declarations.scm") -(register-feature! 'posix) - -(define posix-error - (let ([strerror (foreign-lambda c-string "strerror" int)] - [string-append string-append] ) - (lambda (type loc msg . args) - (let ([rn (##sys#update-errno)]) - (apply ##sys#signal-hook type loc (string-append msg " - " (strerror rn)) args) ) ) ) ) +;;; common code -(define ##sys#posix-error posix-error) +(include "posix-common.scm") ;;; Lo-level I/O: @@ -1138,46 +1130,6 @@ EOF #:file-error 'change-directory "cannot change current directory" name) ) name))) -(define delete-directory - (lambda (name) - (##sys#check-string name 'delete-directory) - (let ((sname (##sys#make-c-string (##sys#expand-home-path name) 'delete-directory))) - (unless (fx= 0 (##core#inline "C_rmdir" sname)) - (##sys#update-errno) - (##sys#signal-hook #:file-error 'delete-directory "cannot delete directory" name) ) - name))) - -(define directory - (let ([string-append string-append] - [make-string make-string] - [string string]) - (lambda (#!optional (spec (current-directory)) show-dotfiles?) - (##sys#check-string spec 'directory) - (let ([buffer (make-string 256)] - [handle (##sys#make-pointer)] - [entry (##sys#make-pointer)] ) - (##core#inline "C_opendir" (##sys#make-c-string (##sys#expand-home-path spec) 'directory) handle) - (if (##sys#null-pointer? handle) - (begin - (##sys#update-errno) - (##sys#signal-hook #:file-error 'directory "cannot open directory" spec) ) - (let loop () - (##core#inline "C_readdir" handle entry) - (if (##sys#null-pointer? entry) - (begin - (##core#inline "C_closedir" handle) - '() ) - (let* ([flen (##core#inline "C_foundfile" entry buffer)] - [file (##sys#substring buffer 0 flen)] - [char1 (string-ref file 0)] - [char2 (and (> flen 1) (string-ref file 1))] ) - (if (and (eq? char1 #\.) - (or (not char2) - (and (eq? char2 #\.) (eq? flen 2)) - (not show-dotfiles?) ) ) - (loop) - (cons file (loop)) ) ) ) ) ) ) ) ) ) - ;;; Pipes: @@ -1932,8 +1884,3 @@ EOF (define prot/none 0) (define prot/read 0) (define prot/write 0) - - -;;; common code - -(include "posix-common.scm")Trap