X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/fd35b6f96777be3305879a9ca60ab5befb254042..7a7ef429182915745380c3074771d9f747dab964:/src/sysdep.c diff --git a/src/sysdep.c b/src/sysdep.c index 45e80ac015..3a73b1a467 100644 --- a/src/sysdep.c +++ b/src/sysdep.c @@ -296,15 +296,13 @@ init_baud_rate (int fd) int wait_debugging EXTERNALLY_VISIBLE; #ifndef MSDOS -/* Wait for subprocess with process id `pid' to terminate and - make sure it will get eliminated (not remain forever as a zombie) */ -void -wait_for_termination (int pid) +static void +wait_for_termination_1 (int pid, int interruptible) { while (1) { -#if defined (BSD_SYSTEM) || defined (HPUX) +#if (defined (BSD_SYSTEM) || defined (HPUX)) && !defined(__GNU__) /* Note that kill returns -1 even if the process is just a zombie now. But inevitably a SIGCHLD interrupt should be generated and child_sig will do wait3 and make the process go away. */ @@ -339,9 +337,27 @@ wait_for_termination (int pid) sigsuspend (&empty_mask); #endif /* not WINDOWSNT */ #endif /* not BSD_SYSTEM, and not HPUX version >= 6 */ + if (interruptible) + QUIT; } } +/* Wait for subprocess with process id `pid' to terminate and + make sure it will get eliminated (not remain forever as a zombie) */ + +void +wait_for_termination (int pid) +{ + wait_for_termination_1 (pid, 0); +} + +/* Like the above, but allow keyboard interruption. */ +void +interruptible_wait_for_termination (int pid) +{ + wait_for_termination_1 (pid, 1); +} + /* * flush any pending output * (may flush input as well; it does not matter the way we use it) @@ -1109,8 +1125,7 @@ tabs_safe_p (int fd) void get_tty_size (int fd, int *widthp, int *heightp) { - -#ifdef TIOCGWINSZ +#if defined TIOCGWINSZ /* BSD-style. */ struct winsize size; @@ -1123,8 +1138,7 @@ get_tty_size (int fd, int *widthp, int *heightp) *heightp = size.ws_row; } -#else -#ifdef TIOCGSIZE +#elif defined TIOCGSIZE /* SunOS - style. */ struct ttysize size; @@ -1137,16 +1151,28 @@ get_tty_size (int fd, int *widthp, int *heightp) *heightp = size.ts_lines; } -#else -#ifdef MSDOS +#elif defined WINDOWSNT + + CONSOLE_SCREEN_BUFFER_INFO info; + if (GetConsoleScreenBufferInfo (GetStdHandle (STD_OUTPUT_HANDLE), &info)) + { + *widthp = info.srWindow.Right - info.srWindow.Left + 1; + *heightp = info.srWindow.Bottom - info.srWindow.Top + 1; + } + else + *widthp = *heightp = 0; + +#elif defined MSDOS + *widthp = ScreenCols (); *heightp = ScreenRows (); + #else /* system doesn't know size */ + *widthp = 0; *heightp = 0; + #endif -#endif /* not SunOS-style */ -#endif /* not BSD-style */ } /* Set the logical window size associated with descriptor FD @@ -1760,23 +1786,14 @@ seed_random (long int arg) * Build a full Emacs-sized word out of whatever we've got. * This suffices even for a 64-bit architecture with a 15-bit rand. */ -long +EMACS_INT get_random (void) { - long val = random (); -#if VALBITS > RAND_BITS - val = (val << RAND_BITS) ^ random (); -#if VALBITS > 2*RAND_BITS - val = (val << RAND_BITS) ^ random (); -#if VALBITS > 3*RAND_BITS - val = (val << RAND_BITS) ^ random (); -#if VALBITS > 4*RAND_BITS - val = (val << RAND_BITS) ^ random (); -#endif /* need at least 5 */ -#endif /* need at least 4 */ -#endif /* need at least 3 */ -#endif /* need at least 2 */ - return val & ((1L << VALBITS) - 1); + EMACS_UINT val = 0; + int i; + for (i = 0; i < (VALBITS + RAND_BITS - 1) / RAND_BITS; i++) + val = (val << RAND_BITS) ^ random (); + return val & (((EMACS_INT) 1 << VALBITS) - 1); } #ifndef HAVE_STRERROR @@ -1995,37 +2012,6 @@ perror (void) } #endif /* HPUX and not HAVE_PERROR */ -#ifndef HAVE_DUP2 - -/* - * Emulate BSD dup2. First close newd if it already exists. - * Then, attempt to dup oldd. If not successful, call dup2 recursively - * until we are, then close the unsuccessful ones. - */ - -int -dup2 (int oldd, int newd) -{ - register int fd, ret; - - emacs_close (newd); - -#ifdef F_DUPFD - return fcntl (oldd, F_DUPFD, newd); -#else - fd = dup (old); - if (fd == -1) - return -1; - if (fd == new) - return new; - ret = dup2 (old,new); - emacs_close (fd); - return ret; -#endif -} - -#endif /* not HAVE_DUP2 */ - /* * Gettimeofday. Simulate as much as possible. Only accurate * to nearest second. Emacs doesn't use tzp so ignore it for now. @@ -2383,7 +2369,7 @@ serial_configure (struct Lisp_Process *p, CHECK_NUMBER (tem); err = cfsetspeed (&attr, XINT (tem)); if (err != 0) - error ("cfsetspeed(%"pEd") failed: %s", XINT (tem), + error ("cfsetspeed(%"pI"d) failed: %s", XINT (tem), emacs_strerror (errno)); childp2 = Fplist_put (childp2, QCspeed, tem);