X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Fnt.c;h=54e06e1a1ac9118c56e2067344e22392f49603bd;hb=6b3f40dfa3d8f18a2fcc6932be7f82acd94261c2;hp=b7b0362f6a5d2d9d054abdd61f8548361c4e566a;hpb=6883ee56ec887c2c48abe5b06b5e66aa74031910;p=chise%2Fxemacs-chise.git diff --git a/src/nt.c b/src/nt.c index b7b0362..54e06e1 100644 --- a/src/nt.c +++ b/src/nt.c @@ -34,6 +34,7 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA #include "systime.h" #include "syssignal.h" #include "sysproc.h" +#include "sysfile.h" #include #include @@ -42,13 +43,25 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA #include #include #include -#include /* for offsetof */ #include #include #include #include +#ifndef __MINGW32__ #include +#else +typedef void (CALLBACK TIMECALLBACK)(UINT uTimerID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2); + +typedef TIMECALLBACK FAR *LPTIMECALLBACK; +DWORD WINAPI timeGetTime(void); +MMRESULT WINAPI timeSetEvent(UINT uDelay, UINT uResolution, + LPTIMECALLBACK fptc, DWORD dwUser, UINT fuEvent); +MMRESULT WINAPI timeKillEvent(UINT uTimerID); +MMRESULT WINAPI timeGetDevCaps(TIMECAPS* ptc, UINT cbtc); +MMRESULT WINAPI timeBeginPeriod(UINT uPeriod); +MMRESULT WINAPI timeEndPeriod(UINT uPeriod); +#endif #include "nt.h" #include @@ -533,7 +546,6 @@ nt_get_resource (key, lpdwtype) LPBYTE lpvalue; HKEY hrootkey = NULL; DWORD cbData; - BOOL ok = FALSE; /* Check both the current user and the local machine to see if we have any resources. */ @@ -942,7 +954,7 @@ map_win32_filename (const char * name, const char ** pPath) static char shortname[MAX_PATH]; char * str = shortname; char c; - char * path; + const char * path; const char * save_name = name; if (is_fat_volume (name, &path)) /* truncate to 8.3 */ @@ -1052,7 +1064,7 @@ opendir (const char *filename) /* Opening is done by FindFirstFile. However, a read is inherent to this operation, so we defer the open until read time. */ - if (!(dirp = (DIR *) xmalloc (sizeof (DIR)))) + if (!(dirp = xnew_and_zero(DIR))) return NULL; if (dir_find_handle != INVALID_HANDLE_VALUE) return NULL; @@ -1077,7 +1089,7 @@ closedir (DIR *dirp) FindClose (dir_find_handle); dir_find_handle = INVALID_HANDLE_VALUE; } - xfree ((char *) dirp); + xfree (dirp); } struct direct * @@ -1169,7 +1181,7 @@ sys_rename (const char * oldname, const char * newname) return -1; } - /* Emulate Unix behaviour - newname is deleted if it already exists + /* Emulate Unix behavior - newname is deleted if it already exists (at least if it is a file; don't do this for directories). However, don't do this if we are just changing the case of the file name - we will end up deleting the file we are trying to rename! */ @@ -1288,7 +1300,7 @@ generate_inode_val (const char * name) unsigned hash; /* Get the truly canonical filename, if it exists. (Note: this - doesn't resolve aliasing due to subst commands, or recognise hard + doesn't resolve aliasing due to subst commands, or recognize hard links. */ if (!win32_get_long_filename ((char *)name, fullname, MAX_PATH)) abort (); @@ -1390,8 +1402,8 @@ stat (const char * path, struct stat * buf) } else if (!NILP (Vmswindows_get_true_file_attributes)) { - /* This is more accurate in terms of gettting the correct number - of links, but is quite slow (it is noticable when Emacs is + /* This is more accurate in terms of getting the correct number + of links, but is quite slow (it is noticeable when Emacs is making a list of file name completions). */ BY_HANDLE_FILE_INFORMATION info; @@ -1527,67 +1539,6 @@ sys_pipe (int * phandles) return rc; } -/* From ntproc.c */ -extern Lisp_Object Vwin32_pipe_read_delay; - -/* Function to do blocking read of one byte, needed to implement - select. It is only allowed on sockets and pipes. */ -int -_sys_read_ahead (int fd) -{ - child_process * cp; - int rc; - - if (fd < 0 || fd >= MAXDESC) - return STATUS_READ_ERROR; - - cp = fd_info[fd].cp; - - if (cp == NULL || cp->fd != fd || cp->status != STATUS_READ_READY) - return STATUS_READ_ERROR; - - if ((fd_info[fd].flags & (FILE_PIPE | FILE_SOCKET)) == 0 - || (fd_info[fd].flags & FILE_READ) == 0) - { - /* fd is not a pipe or socket */ - abort (); - } - - cp->status = STATUS_READ_IN_PROGRESS; - - if (fd_info[fd].flags & FILE_PIPE) - { - rc = _read (fd, &cp->chr, sizeof (char)); - - /* Give subprocess time to buffer some more output for us before - reporting that input is available; we need this because Win95 - connects DOS programs to pipes by making the pipe appear to be - the normal console stdout - as a result most DOS programs will - write to stdout without buffering, ie. one character at a - time. Even some Win32 programs do this - "dir" in a command - shell on NT is very slow if we don't do this. */ - if (rc > 0) - { - int wait = XINT (Vwin32_pipe_read_delay); - - if (wait > 0) - Sleep (wait); - else if (wait < 0) - while (++wait <= 0) - /* Yield remainder of our time slice, effectively giving a - temporary priority boost to the child process. */ - Sleep (0); - } - } - - if (rc == sizeof (char)) - cp->status = STATUS_READ_SUCCEEDED; - else - cp->status = STATUS_READ_FAILED; - - return cp->status; -} - void term_ntproc (int unused) { @@ -1810,6 +1761,7 @@ int msw_raise (int nsig) exit (3); /* Other signals are ignored by default */ + return 0; } /*--------------------------------------------------------------------*/ @@ -1833,7 +1785,7 @@ int msw_raise (int nsig) */ const int timer_prec = 10; -/* Last itimevals, as set by calls to setitimer */ +/* Last itimervals, as set by calls to setitimer */ static struct itimerval it_alarm; static struct itimerval it_prof; @@ -1863,7 +1815,7 @@ static UINT period (const struct itimerval* it, UINT denom) if (tv->tv_sec == 0 && tv->tv_usec == 0) return 0; - /* Conver to ms and divide by denom */ + /* Convert to ms and divide by denom */ res = (tv->tv_sec * 1000 + (tv->tv_usec + 500) / 1000) / denom; /* Converge to minimum timer resolution */ @@ -1928,4 +1880,45 @@ int setitimer (int kind, const struct itimerval* itnew, return errno = EINVAL; } +int +open_input_file (file_data *p_file, CONST char *filename) +{ + HANDLE file; + HANDLE file_mapping; + void *file_base; + DWORD size, upper_size; + + file = CreateFile (filename, GENERIC_READ, FILE_SHARE_READ, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); + if (file == INVALID_HANDLE_VALUE) + return FALSE; + + size = GetFileSize (file, &upper_size); + file_mapping = CreateFileMapping (file, NULL, PAGE_READONLY, + 0, size, NULL); + if (!file_mapping) + return FALSE; + + file_base = MapViewOfFile (file_mapping, FILE_MAP_READ, 0, 0, size); + if (file_base == 0) + return FALSE; + + p_file->name = (char*)filename; + p_file->size = size; + p_file->file = file; + p_file->file_mapping = file_mapping; + p_file->file_base = file_base; + + return TRUE; +} + +/* Close the system structures associated with the given file. */ +void +close_file_data (file_data *p_file) +{ + UnmapViewOfFile (p_file->file_base); + CloseHandle (p_file->file_mapping); + CloseHandle (p_file->file); +} + /* end of nt.c */