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

📄 posixunix.scm

📁 Scheme跨平台编译器
💻 SCM
📖 第 1 页 / 共 5 页
字号:
      tl += 3600;    }  tg = gmtime (&tl);  tg->tm_isdst = 0;  tb = mktime (tg);  if (tb == -1)    {      tg->tm_hour--;      tb = mktime (tg);      if (tb == -1)        return -1; /* can't deal with output from gmtime */      tb += 3600;    }  return (tl - (tb - tl));}#endif#define C_tm_set_08(v) \        (memset(&C_tm, 0, sizeof(struct tm)), \        C_tm.tm_sec = C_unfix(C_block_item(v, 0)), \        C_tm.tm_min = C_unfix(C_block_item(v, 1)), \        C_tm.tm_hour = C_unfix(C_block_item(v, 2)), \        C_tm.tm_mday = C_unfix(C_block_item(v, 3)), \        C_tm.tm_mon = C_unfix(C_block_item(v, 4)), \        C_tm.tm_year = C_unfix(C_block_item(v, 5)), \        C_tm.tm_wday = C_unfix(C_block_item(v, 6)), \        C_tm.tm_yday = C_unfix(C_block_item(v, 7)), \        C_tm.tm_isdst = (C_block_item(v, 8) != C_SCHEME_FALSE))#define C_tm_set_9(v) \        (C_tm.tm_gmtoff = C_unfix(C_block_item(v, 9)))#define C_tm_get_08(v) \        (C_set_block_item(v, 0, C_fix(C_tm.tm_sec)), \        C_set_block_item(v, 1, C_fix(C_tm.tm_min)), \        C_set_block_item(v, 2, C_fix(C_tm.tm_hour)), \        C_set_block_item(v, 3, C_fix(C_tm.tm_mday)), \        C_set_block_item(v, 4, C_fix(C_tm.tm_mon)), \        C_set_block_item(v, 5, C_fix(C_tm.tm_year)), \        C_set_block_item(v, 6, C_fix(C_tm.tm_wday)), \        C_set_block_item(v, 7, C_fix(C_tm.tm_yday)), \        C_set_block_item(v, 8, (C_tm.tm_isdst ? C_SCHEME_TRUE : C_SCHEME_FALSE)))#define C_tm_get_9(v) \        (C_set_block_item(v, 9, C_fix(C_tm.tm_gmtoff)))#if !defined(C_GNU_ENV) || defined(__CYGWIN__) || defined(__uClinux__)static struct tm *C_tm_set (C_word v){  C_tm_set_08 (v);  return &C_tm;}static C_wordC_tm_get (C_word v){  C_tm_get_08 (v);  return v;}#elsestatic struct tm *C_tm_set (C_word v){  C_tm_set_08 (v);  C_tm_set_9 (v);  return &C_tm;}static C_wordC_tm_get (C_word v){  C_tm_get_08 (v);  C_tm_get_9 (v);  return v;}#endif#define C_asctime(v)    (asctime(C_tm_set(v)))#define C_mktime(v)     ((C_temporary_flonum = mktime(C_tm_set(v))) != -1)#define C_timegm(v)     ((C_temporary_flonum = timegm(C_tm_set(v))) != -1)#define TIME_STRING_MAXLENGTH 255static char C_time_string [TIME_STRING_MAXLENGTH + 1];#undef TIME_STRING_MAXLENGTH#define C_strftime(v, f) \        (strftime(C_time_string, sizeof(C_time_string), C_c_string(f), C_tm_set(v)) ? C_time_string : NULL)#define C_strptime(s, f, v) \        (strptime(C_c_string(s), C_c_string(f), &C_tm) ? C_tm_get(v) : C_SCHEME_FALSE)static gid_t *C_groups = NULL;#define C_get_gid(n)      C_fix(C_groups[ C_unfix(n) ])#define C_set_gid(n, id)  (C_groups[ C_unfix(n) ] = C_unfix(id), C_SCHEME_UNDEFINED)#define C_set_groups(n)   C_fix(setgroups(C_unfix(n), C_groups))#ifdef TIOCGWINSZstatic int get_tty_size(int p, int *rows, int *cols){ struct winsize tty_size; int r; memset(&tty_size, 0, sizeof tty_size); r = ioctl(p, TIOCGWINSZ, &tty_size); if (r == 0) {    *rows = tty_size.ws_row;    *cols = tty_size.ws_col; } return r;}#elsestatic int get_tty_size(int p, int *rows, int *cols){ *rows = *cols = 0; return -1;}#endifEOF) )(cond-expand [paranoia] [else  (declare    (no-bound-checks)    (no-procedure-checks-for-usual-bindings)    (bound-to-procedure     string-match glob->regexp regexp make-anchored-pattern     ##sys#thread-yield! ##sys#make-string     ##sys#make-port ##sys#file-info ##sys#update-errno ##sys#fudge ##sys#make-c-string ##sys#check-port     ##sys#error ##sys#signal-hook ##sys#peek-unsigned-integer make-pathname glob directory?     pathname-file process-fork file-close duplicate-fileno process-execute getenv     make-string make-input-port make-output-port ##sys#thread-block-for-i/o create-pipe     process-wait pathname-strip-directory ##sys#expand-home-path directory     decompose-pathname ##sys#cons-flonum ##sys#decode-seconds ##sys#null-pointer ##sys#pointer->address     ##sys#substring ##sys#context-switch close-input-pipe close-output-pipe change-directory     current-directory ##sys#make-pointer port? ##sys#schedule ##sys#process     ##sys#peek-fixnum ##sys#make-structure ##sys#check-structure ##sys#enable-interrupts     make-nonblocking-input-port make-nonblocking-output-port      canonical-path) ) ] )(cond-expand [unsafe  (eval-when (compile)    (define-macro (##sys#check-structure . _) '(##core#undefined))    (define-macro (##sys#check-range . _) '(##core#undefined))    (define-macro (##sys#check-pair . _) '(##core#undefined))    (define-macro (##sys#check-list . _) '(##core#undefined))    (define-macro (##sys#check-symbol . _) '(##core#undefined))    (define-macro (##sys#check-string . _) '(##core#undefined))    (define-macro (##sys#check-char . _) '(##core#undefined))    (define-macro (##sys#check-exact . _) '(##core#undefined))    (define-macro (##sys#check-port . _) '(##core#undefined))    (define-macro (##sys#check-number . _) '(##core#undefined))    (define-macro (##sys#check-byte-vector . _) '(##core#undefined)) ) ] [else  (declare (emit-exports "posix.exports")) ] )(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) ) ) ) );; 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);"    "if(val == -1) return(0);"    "return(fcntl(fd, F_SETFL, val | O_NONBLOCK) != -1);" ) )(define ##sys#file-select-one  (foreign-lambda* int ([int fd])    "fd_set in;"    "struct timeval tm;"    "FD_ZERO(&in);"    "FD_SET(fd, &in);"    "tm.tv_sec = tm.tv_usec = 0;"    "if(select(fd + 1, &in, NULL, NULL, &tm) == -1) return(-1);"    "else return(FD_ISSET(fd, &in) ? 1 : 0);" ) );;; Lo-level I/O:(define-foreign-variable _pipe_buf int "PIPE_BUF")(define pipe/buf _pipe_buf)(define-foreign-variable _f_dupfd int "F_DUPFD")(define-foreign-variable _f_getfd int "F_GETFD")(define-foreign-variable _f_setfd int "F_SETFD")(define-foreign-variable _f_getfl int "F_GETFL")(define-foreign-variable _f_setfl int "F_SETFL")(define fcntl/dupfd _f_dupfd)(define fcntl/getfd _f_getfd)(define fcntl/setfd _f_setfd)(define fcntl/getfl _f_getfl)(define fcntl/setfl _f_setfl)(define-foreign-variable _o_rdonly int "O_RDONLY")(define-foreign-variable _o_wronly int "O_WRONLY")(define-foreign-variable _o_rdwr int "O_RDWR")(define-foreign-variable _o_creat int "O_CREAT")(define-foreign-variable _o_append int "O_APPEND")(define-foreign-variable _o_excl int "O_EXCL")(define-foreign-variable _o_noctty int "O_NOCTTY")(define-foreign-variable _o_nonblock int "O_NONBLOCK")(define-foreign-variable _o_trunc int "O_TRUNC")(define-foreign-variable _o_fsync int "O_FSYNC")(define-foreign-variable _o_binary int "O_BINARY")(define-foreign-variable _o_text int "O_TEXT")(define open/rdonly _o_rdonly)(define open/wronly _o_wronly)(define open/rdwr _o_rdwr)(define open/read _o_rdonly)(define open/write _o_wronly)(define open/creat _o_creat)(define open/append _o_append)(define open/excl _o_excl)(define open/noctty _o_noctty)(define open/nonblock _o_nonblock)(define open/trunc _o_trunc)(define open/sync _o_fsync)(define open/fsync _o_fsync)(define open/binary _o_binary)(define open/text _o_text)(define-foreign-variable _s_irusr int "S_IRUSR")(define-foreign-variable _s_iwusr int "S_IWUSR")(define-foreign-variable _s_ixusr int "S_IXUSR")(define-foreign-variable _s_irgrp int "S_IRGRP")(define-foreign-variable _s_iwgrp int "S_IWGRP")(define-foreign-variable _s_ixgrp int "S_IXGRP")(define-foreign-variable _s_iroth int "S_IROTH")(define-foreign-variable _s_iwoth int "S_IWOTH")(define-foreign-variable _s_ixoth int "S_IXOTH")(define-foreign-variable _s_irwxu int "S_IRWXU")(define-foreign-variable _s_irwxg int "S_IRWXG")(define-foreign-variable _s_irwxo int "S_IRWXO")(define-foreign-variable _s_isuid int "S_ISUID")(define-foreign-variable _s_isgid int "S_ISGID")(define-foreign-variable _s_isvtx int "S_ISVTX")(define perm/irusr _s_irusr)(define perm/iwusr _s_iwusr)(define perm/ixusr _s_ixusr)(define perm/irgrp _s_irgrp)(define perm/iwgrp _s_iwgrp)(define perm/ixgrp _s_ixgrp)(define perm/iroth _s_iroth)(define perm/iwoth _s_iwoth)(define perm/ixoth _s_ixoth)(define perm/irwxu _s_irwxu)(define perm/irwxg _s_irwxg)(define perm/irwxo _s_irwxo)(define perm/isvtx _s_isvtx)(define perm/isuid _s_isuid)(define perm/isgid _s_isgid)(define file-control  (let ([fcntl (foreign-lambda int fcntl int int long)])    (lambda (fd cmd #!optional (arg 0))      (##sys#check-exact fd 'file-control)      (##sys#check-exact cmd 'file-control)      (let ([res (fcntl fd cmd arg)])        (if (fx= res -1)            (posix-error #:file-error 'file-control "cannot control file" fd cmd)            res ) ) ) ) )(define file-open  (let ([defmode (bitwise-ior _s_irwxu (bitwise-ior _s_irgrp _s_iroth))] )    (lambda (filename flags . mode)      (let ([mode (if (pair? mode) (car mode) defmode)])        (##sys#check-string filename 'file-open)        (##sys#check-exact flags 'file-open)        (##sys#check-exact mode 'file-open)        (let ([fd (##core#inline "C_open" (##sys#make-c-string (##sys#expand-home-path filename)) flags mode)])          (when (eq? -1 fd)            (posix-error #:file-error 'file-open "cannot open file" filename flags mode) )          fd) ) ) ) )(define file-close  (lambda (fd)    (##sys#check-exact fd 'file-close)    (when (fx< (##core#inline "C_close" fd) 0)      (posix-error #:file-error 'file-close "cannot close file" fd) ) ) )(define file-read  (let ([make-string make-string] )    (lambda (fd size . buffer)      (##sys#check-exact fd 'file-read)      (##sys#check-exact size 'file-read)      (let ([buf (if (pair? buffer) (car buffer) (make-string size))])        (unless (and (##core#inline "C_blockp" buf) (##core#inline "C_byteblockp" buf))          (##sys#signal-hook #:type-error 'file-read "bad argument type - not a string or blob" buf) )        (let ([n (##core#inline "C_read" fd buf size)])          (when (eq? -1 n)            (posix-error #:file-error 'file-read "cannot read from file" fd size) )          (list buf n) ) ) ) ) )(define file-write  (lambda (fd buffer . size)    (##sys#check-exact fd 'file-write)    (unless (and (##core#inline "C_blockp" buffer) (##core#inline "C_byteblockp" buffer))      (##sys#signal-hook #:type-error 'file-write "bad argument type - not a string or blob" buffer) )    (let ([size (if (pair? size) (car size) (##sys#size buffer))])      (##sys#check-exact size 'file-write)      (let ([n (##core#inline "C_write" fd buffer size)])        (when (eq? -1 n)          (posix-error #:file-error 'file-write "cannot write to file" fd size) )        n) ) ) )(define file-mkstemp  (lambda (template)    (##sys#check-string template 'file-mkstemp)    (let* ([buf (##sys#make-c-string template)]	   [fd (##core#inline "C_mkstemp" buf)]	   [path-length (##sys#size buf)])      (when (eq? -1 fd)	(posix-error #:file-error 'file-mkstemp "cannot create temporary file" template) )      (values fd (##sys#substring buf 0 (fx- path-length 1) ) ) ) ) );;; I/O multiplexing:

⌨️ 快捷键说明

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