⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 posixwin.scm

📁 Scheme跨平台编译器
💻 SCM
📖 第 1 页 / 共 5 页
字号:
    (##sys#check-string name 'change-directory)    (unless (zero? (##core#inline "C_chdir" (##sys#make-c-string (##sys#expand-home-path name))))      (##sys#update-errno)      (##sys#signal-hook #:file-error 'change-directory "cannot change current directory" name) ) ) )(define delete-directory  (lambda (name)    (##sys#check-string name 'delete-directory)    (unless (zero? (##core#inline "C_rmdir" (##sys#make-c-string (##sys#expand-home-path name))))      (##sys#update-errno)      (##sys#signal-hook #:file-error 'delete-directory "cannot delete directory" 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)) 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)) ) ) ) ) ) ) ) ) )(define (directory? fname)  (##sys#check-string fname 'directory?)  (let ((info (##sys#file-info		(##sys#platform-fixup-pathname (##sys#expand-home-path fname)))))    (and info (fx= 1 (##sys#slot info 4))) ) )(define current-directory  (let ([make-string make-string])    (lambda (#!optional dir)      (if dir	  (change-directory dir)	  (let* ([buffer (make-string 256)]		 [len (##core#inline "C_curdir" buffer)] )	    (##sys#update-errno)	    (if len		(##sys#substring buffer 0 len)		(##sys#signal-hook #:file-error 'current-directory "cannot retrieve current directory") ) ) ) ) ) )(define canonical-path    (let ((null?      null?)          (char=?     char=?)          (string=?   string=?)          (alpha?     char-alphabetic?)          (sref       string-ref)          (ssplit     (cut string-split <> "/\\"))          (sappend    string-append)          (isperse    (cut string-intersperse <> "\\"))          (sep?       (lambda (c) (or (char=? #\/ c) (char=? #\\ c))))          (user       current-user-name)          (cwd        (let ((cw   current-directory))                          (lambda ()                              (condition-case (cw)                                  (var ()    "c:\\"))))))        (lambda (path)            (##sys#check-string path 'canonical-path)            (let ((p   (cond ((fx= 0 (##sys#size path))                                 (sappend (cwd) "\\"))                             ((and (fx< (##sys#size path) 3)                                   (sep? (sref path 0)))                                 (sappend                                     (##sys#substring (cwd) 0 2)                                     path))                             ((fx= 1 (##sys#size path))                                 (sappend (cwd) "\\" path))                             ((and (char=? #\~ (sref path 0))                                   (sep? (sref path 1)))                                 (sappend                                     (##sys#substring (cwd) 0 3)                                     "Documents and Settings\\"                                     (user)                                     (##sys#substring path 1                                         (##sys#size path))))                             ((fx= 2 (##sys#size path))                                 (sappend (cwd) "\\" path))                             ((and (alpha? (sref path 0))                                   (char=? #\: (sref path 1))                                   (sep? (sref path 2)))                                 path)                             ((and (char=? #\/ (sref path 0))                                   (alpha? (sref path 1))                                   (char=? #\: (sref path 2)))                                 (sappend                                     (##sys#substring path 1 3)                                     "\\"                                     (##sys#substring path 3                                         (##sys#size path))))                             ((sep? (sref path 0))                                 (sappend                                     (##sys#substring (cwd) 0 2)                                     path))                             (else                                 (sappend (cwd) "\\" path)))))                (let loop ((l   (ssplit (##sys#substring p 3 (##sys#size p))))                           (r   '()))                    (if (null? l)                        (if (null? r)                            (##sys#substring p 0 3)                            (if (sep? (sref p (- (##sys#size p) 1)))                                (sappend                                    (##sys#substring p 0 3)                                    (isperse (reverse (cons "" r))))                                (sappend                                    (##sys#substring p 0 3)                                    (isperse (reverse r)))))                        (loop                            (cdr l)                            (if (string=? ".." (car l))                                (cdr r)                                (if (string=? "." (car l))                                    r                                    (cons (car l) r))))))))))                           ;;; Pipes:(let ()  (define (mode arg) (if (pair? arg) (##sys#slot arg 0) '###text))  (define (badmode m) (##sys#error "illegal input/output mode specifier" m))  (define (check cmd inp r)    (##sys#update-errno)    (if (##sys#null-pointer? r)	(##sys#signal-hook #:file-error "cannot open pipe" cmd)	(let ([port (##sys#make-port inp ##sys#stream-port-class "(pipe)" 'stream)])	  (##core#inline "C_set_file_ptr" port r)	  port) ) )  (set! open-input-pipe    (lambda (cmd . m)      (##sys#check-string cmd 'open-input-pipe)      (let ([m (mode m)])	(check	 cmd #t	 (case m	   ((###text) (##core#inline_allocate ("open_text_input_pipe" 2) (##sys#make-c-string cmd)))	   ((###binary) (##core#inline_allocate ("open_binary_input_pipe" 2) (##sys#make-c-string cmd)))	   (else (badmode m)) ) ) ) ) )  (set! open-output-pipe    (lambda (cmd . m)      (##sys#check-string cmd 'open-output-pipe)      (let ((m (mode m)))	(check	 cmd #f	 (case m	   ((###text) (##core#inline_allocate ("open_text_output_pipe" 2) (##sys#make-c-string cmd)))	   ((###binary) (##core#inline_allocate ("open_binary_output_pipe" 2) (##sys#make-c-string cmd)))	   (else (badmode m)) ) ) ) ) )  (set! close-input-pipe    (lambda (port)      (##sys#check-port port 'close-input-pipe)      (let ((r (##core#inline "close_pipe" port)))	(##sys#update-errno)	(when (eq? -1 r) (##sys#signal-hook #:file-error 'close-input-pipe "error while closing pipe" port)) ) ) )  (set! close-output-pipe close-input-pipe) )(let ([open-input-pipe open-input-pipe]      [open-output-pipe open-output-pipe]      [close-input-pipe close-input-pipe]      [close-output-pipe close-output-pipe] )  (set! call-with-input-pipe    (lambda (cmd proc . mode)      (let ([p (apply open-input-pipe cmd mode)])	(##sys#call-with-values	 (lambda () (proc p))	 (lambda results	   (close-input-pipe p)	   (apply values results) ) ) ) ) )  (set! call-with-output-pipe    (lambda (cmd proc . mode)      (let ([p (apply open-output-pipe cmd mode)])	(##sys#call-with-values	 (lambda () (proc p))	 (lambda results	   (close-output-pipe p)	   (apply values results) ) ) ) ) )  (set! with-input-from-pipe    (lambda (cmd thunk . mode)      (let ([old ##sys#standard-input]	    [p (apply open-input-pipe cmd mode)] )	(set! ##sys#standard-input p)	(##sys#call-with-values thunk	  (lambda results	    (close-input-pipe p)	    (set! ##sys#standard-input old)	    (apply values results) ) ) ) ) )  (set! with-output-to-pipe    (lambda (cmd thunk . mode)      (let ([old ##sys#standard-output]	    [p (apply open-output-pipe cmd mode)] )	(set! ##sys#standard-output p)	(##sys#call-with-values thunk	  (lambda results	    (close-output-pipe p)	    (set! ##sys#standard-output old)	    (apply values results) ) ) ) ) ) );;; Pipe primitive:(define-foreign-variable _pipefd0 int "C_pipefds[ 0 ]")(define-foreign-variable _pipefd1 int "C_pipefds[ 1 ]")(define create-pipe    (lambda (#!optional (mode (fxior open/binary open/noinherit)))      (when (fx< (##core#inline "C_pipe" #f mode) 0)	(##sys#update-errno)	(##sys#signal-hook #:file-error 'create-pipe "cannot create pipe") )      (values _pipefd0 _pipefd1) ) );;; Signal processing:(define-foreign-variable _nsig int "NSIG")(define-foreign-variable _sigterm int "SIGTERM")(define-foreign-variable _sigint int "SIGINT")(define-foreign-variable _sigfpe int "SIGFPE")(define-foreign-variable _sigill int "SIGILL")(define-foreign-variable _sigsegv int "SIGSEGV")(define-foreign-variable _sigabrt int "SIGABRT")(define-foreign-variable _sigbreak int "SIGBREAK")(define signal/term _sigterm)(define signal/int _sigint)(define signal/fpe _sigfpe)(define signal/ill _sigill)(define signal/segv _sigsegv)(define signal/abrt _sigabrt)(define signal/break _sigbreak)(define signal/alrm 0)(define signal/chld 0)(define signal/cont 0)(define signal/hup 0)(define signal/io 0)(define signal/kill 0)(define signal/pipe 0)(define signal/prof 0)(define signal/quit 0)(define signal/stop 0)(define signal/trap 0)(define signal/tstp 0)(define signal/urg 0)(define signal/usr1 0)(define signal/usr2 0)(define signal/vtalrm 0)(define signal/winch 0)(define signal/xcpu 0)(define signal/xfsz 0)(define signals-list  (list    signal/term signal/int signal/fpe signal/ill    signal/segv signal/abrt signal/break))(let ([oldhook ##sys#interrupt-hook]      [sigvector (make-vector 256 #f)] )  (set! signal-handler    (lambda (sig)      (##sys#check-exact sig 'signal-handler)      (##sys#slot sigvector sig) ) )  (set! set-signal-handler!    (lambda (sig proc)      (##sys#check-exact sig 'set-signal-handler!)      (##core#inline "C_establish_signal_handler" sig (and proc sig))      (vector-set! sigvector sig proc) ) )  (set! ##sys#interrupt-hook    (lambda (reason state)      (let ([h (##sys#slot sigvector reason)])	(if h	    (begin	      (h reason)	      (##sys#context-switch state) )	    (oldhook reason state) ) ) ) ) );;; More errno codes:(define-foreign-variable _errno int "errno")(define-foreign-variable _eperm int "EPERM")(define-foreign-variable _enoent int "ENOENT")(define-foreign-variable _esrch int "ESRCH")(define-foreign-variable _eintr int "EINTR")(define-foreign-variable _eio int "EIO")(define-foreign-variable _enoexec int "ENOEXEC")(define-foreign-variable _ebadf int "EBADF")(define-foreign-variable _echild int "ECHILD")(define-foreign-variable _enomem int "ENOMEM")(define-foreign-variable _eacces int "EACCES")(define-foreign-variable _efault int "EFAULT")(define-foreign-variable _ebusy int "EBUSY")(define-foreign-variable _eexist int "EEXIST")(define-foreign-variable _enotdir int "ENOTDIR")(define-foreign-variable _eisdir int "EISDIR")(define-foreign-variable _einval int "EINVAL")(define-foreign-variable _emfile int "EMFILE")(define-foreign-variable _enospc int "ENOSPC")(define-foreign-variable _espipe int "ESPIPE")(define-foreign-variable _epipe int "EPIPE")(define-foreign-variable _eagain int "EAGAIN")(define-foreign-variable _erofs int "EROFS")(define-foreign-variable _enxio int "ENXIO")(define-foreign-variable _e2big int "E2BIG")(define-foreign-variable _exdev int "EXDEV")(define-foreign-variable _enodev int "ENODEV")(define-foreign-variable _enfile int "ENFILE")(define-foreign-variable _enotty int "ENOTTY")(define-foreign-variable _efbig int "EFBIG")(define-foreign-variable _emlink int "EMLINK")(define-foreign-variable _edom int "EDOM")(define-foreign-variable _erange int "ERANGE")(define-foreign-variable _edeadlk int "EDEADLK")(define-foreign-variable _enametoolong int "ENAMETOOLONG")(define-foreign-variable _enolck int "ENOLCK")(define-foreign-variable _enosys int "ENOSYS")(define-foreign-variable _enotempty int "ENOTEMPTY")(define-foreign-variable _eilseq int "EILSEQ")(define errno/perm _eperm)(define errno/noent _enoent)(define errno/srch _esrch)(define errno/intr _eintr)(define errno/io _eio)(define errno/noexec _enoexec)(define errno/badf _ebadf)(define errno/child _echild)(define errno/nomem _enomem)(define errno/acces _eacces)(define errno/fault _efault)(define errno/busy _ebusy)(define errno/exist _eexist)(define errno/notdir _enotdir)(define errno/isdir _eisdir)(define errno/inval _einval)(define errno/mfile _emfile)(define errno/nospc _enospc)(define errno/spipe _espipe)(define errno/pipe _epipe)(define errno/again _eagain)(define errno/rofs _erofs)(define errno/nxio _enxio)(define errno/2big _e2big)(define errno/xdev _exdev)(define errno/nodev _enodev)(define errno/nfile _enfile)(define errno/notty _enotty)(define errno/fbig _efbig)(define errno/mlink _emlink)(define errno/dom _edom)(define errno/range _erange)(define errno/deadlk _edeadlk)(define errno/nametoolong _enametoolong)(define errno/nolck _enolck)(define errno/nosys _enosys)(define errno/notempty _enotempty)(define errno/ilseq _eilseq);;; Permissions and owners:(define change-file-mode  (lambda (fname m)    (##sys#check-string fname 'change-file-mode)    (##sys#check-exact m 'change-file-mode)    (when (fx< (##core#inline "C_chmod" (##sys#make-c-string (##sys#expand-home-path fname)) m) 0)      (##sys#update-errno)      (##sys#signal-hook #:file-error 'change-file-mode "cannot change file mode" fname m) ) ) )(define-foreign-variable _r_ok int "2")(define-foreign-variable _w_ok int "4")(define-foreign-variable _x_ok int "2")(let ()  (define (check filename acc loc)    (##sys#check-string filename loc)    (let ([r (fx= 0 (##core#inline "C_access" (##sys#make-c-string (##sys#expand-home-path filename)) acc))])      (unless r (##sys#update-errno))      r) )  (set! file-read-access? (lambda (filename) (check filename _r_ok 'file-read-access?)))  (set! file-write-access? (lambda (filename) (check filename _w_ok 'file-write-access?)))  (set! file-execute-access? (lambda (filename) (check filename _x_ok 'file-execute-access?))) )(define-foreign-variable _filename_max int "FILENAME_MAX")

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -