X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fwin32.lisp;h=c970412c17e185b49600fbfcec44c6d6553ef824;hb=eaec8176060e89efa39f01017df1f6204e491ecc;hp=3e55344f1c75a9cfa2e45f41401d7927b1a7ba14;hpb=2b90fd1dbad23322258222a2ef4cef7f6a00831d;p=sbcl.git diff --git a/src/code/win32.lisp b/src/code/win32.lisp index 3e55344..c970412 100644 --- a/src/code/win32.lisp +++ b/src/code/win32.lisp @@ -118,7 +118,7 @@ (unless (zerop (peek-console-input handle (cast buf (* t)) - input-record-size (addr avail))) + 1 (addr avail))) (return-from handle-listen (plusp avail))) ;; FIXME-SOCKETS: Try again here with WSAEventSelect in case @@ -191,7 +191,7 @@ ;;870 IBM EBCDIC - Multilingual/ROECE (Latin-2) (874 :CP874) ;; ANSI/OEM - Thai (same as 28605, ISO 8859-15) ;;875 IBM EBCDIC - Modern Greek - ;;932 ANSI/OEM - Japanese, Shift-JIS + (932 :CP932) ;; ANSI/OEM - Japanese, Shift-JIS ;;936 ANSI/OEM - Simplified Chinese (PRC, Singapore) ;;949 ANSI/OEM - Korean (Unified Hangul Code) ;;950 ANSI/OEM - Traditional Chinese (Taiwan; Hong Kong SAR, PRC) @@ -432,14 +432,16 @@ err-code (get-last-error-message err-code)))) -(defun get-folder-pathname (csidl) +(defun get-folder-namestring (csidl) "http://msdn.microsoft.com/library/en-us/shellcc/platform/shell/reference/functions/shgetfolderpath.asp" (with-alien ((apath (* char) (make-system-buffer (1+ max_path)))) (syscall (("SHGetFolderPath" 20 t) int handle int handle dword (* char)) - (parse-native-namestring - (concatenate 'string (cast-and-free apath) "\\")) + (concatenate 'string (cast-and-free apath) "\\") 0 csidl 0 0 apath))) +(defun get-folder-pathname (csidl) + (parse-native-namestring (get-folder-namestring csidl))) + (defun sb!unix:posix-getcwd () (with-alien ((apath (* char) (make-system-buffer (1+ max_path)))) (with-sysfun (afunc ("GetCurrentDirectory" 8 t) dword dword (* char)) @@ -511,17 +513,70 @@ (addr ,kernel-time) (addr ,user-time)))) -(declaim (inline system-internal-real-time system-internal-run-time)) -(defun system-internal-real-time () - (with-alien ((system-time filetime)) - (syscall (("GetSystemTimeAsFileTime" 4) void (* filetime)) - (values (floor system-time 100ns-per-internal-time-unit)) - (addr system-time)))) +(declaim (inline system-internal-real-time)) + +(let ((epoch 0)) + (declare (unsigned-byte epoch)) + ;; FIXME: For optimization ideas see the unix implementation. + (defun reinit-internal-real-time () + (setf epoch 0 + epoch (get-internal-real-time))) + (defun get-internal-real-time () + (- (with-alien ((system-time filetime)) + (syscall (("GetSystemTimeAsFileTime" 4) void (* filetime)) + (values (floor system-time 100ns-per-internal-time-unit)) + (addr system-time))) + epoch))) (defun system-internal-run-time () (with-process-times (creation-time exit-time kernel-time user-time) (values (floor (+ user-time kernel-time) 100ns-per-internal-time-unit)))) +(define-alien-type hword (unsigned 16)) + +(define-alien-type systemtime + (struct systemtime + (year hword) + (month hword) + (weekday hword) + (day hword) + (hour hword) + (minute hword) + (second hword) + (millisecond hword))) + +;; Obtained with, but the XC can't deal with that -- but +;; it's not like the value is ever going to change... +;; (with-alien ((filetime filetime) +;; (epoch systemtime)) +;; (setf (slot epoch 'year) 1970 +;; (slot epoch 'month) 1 +;; (slot epoch 'day) 1 +;; (slot epoch 'hour) 0 +;; (slot epoch 'minute) 0 +;; (slot epoch 'second) 0 +;; (slot epoch 'millisecond) 0) +;; (syscall (("SystemTimeToFileTime" 8) void +;; (* systemtime) (* filetime)) +;; filetime +;; (addr epoch) +;; (addr filetime))) +(defconstant +unix-epoch-filetime+ 116444736000000000) + +#!-sb-fluid +(declaim (inline get-time-of-day)) +(defun get-time-of-day () + "Return the number of seconds and microseconds since the beginning of the +UNIX epoch: January 1st 1970." + (with-alien ((system-time filetime)) + (syscall (("GetSystemTimeAsFileTime" 4) void (* filetime)) + (multiple-value-bind (sec 100ns) + (floor (- system-time +unix-epoch-filetime+) + (* 100ns-per-internal-time-unit + internal-time-units-per-second)) + (values sec (floor 100ns 10))) + (addr system-time)))) + ;; SETENV ;; The SetEnvironmentVariable function sets the contents of the specified ;; environment variable for the current process.