#define DONT_ENCAPSULATE
#include <config.h>
-
-#ifdef WINDOWSNT
-#include <direct.h>
-#ifdef __MINGW32__
-#include <mingw32/process.h>
-#else
-/* <process.h> should not conflict with "process.h", as per ANSI definition.
- This is not true with visual c though. The trick below works with
- VC4.2b, 5.0 and 6.0. It assumes that VC is installed in a kind of
- standard way, so include path ends with /include.
-
- Unfortunately, this must go before lisp.h, since process.h defines abort()
- which will conflict with the macro defined in lisp.h
-*/
-#include <../include/process.h>
-#endif /* __MINGW32__ */
-#endif /* WINDOWSNT */
-
#include "lisp.h"
-#include <stdlib.h>
-
/* ------------------------------- */
/* basic includes */
/* ------------------------------- */
#include "syswait.h"
#include "sysdir.h"
#include "systime.h"
-#if defined(WINDOWSNT) || defined(__CYGWIN32__)
+#if defined(WIN32_NATIVE) || defined(CYGWIN)
#include "syssignal.h"
#endif
-#ifndef WINDOWSNT
+
+#include "sysproc.h"
+
+#ifndef WIN32_NATIVE
#include <sys/times.h>
#endif
-#ifdef WINDOWSNT
+#ifdef WIN32_NATIVE
#include <sys/utime.h>
#include "ntheap.h"
+#include "nt.h"
#endif
-#ifdef HAVE_MMAP
-#include <unistd.h>
-#include <sys/mman.h>
-#endif
+#ifdef WIN32_NATIVE
+#ifdef MINGW
+#include <../mingw/process.h>
+#else
+/* <process.h> should not conflict with "process.h", as per ANSI definition.
+ This is not true with visual c though. The trick below works with
+ VC4.2b, 5.0 and 6.0. It assumes that VC is installed in a kind of
+ standard way, so include path ends with /include.
+*/
+#include <../include/process.h>
+#endif /* MINGW */
+#endif /* WIN32_NATIVE */
/* ------------------------------- */
/* TTY definitions */
#endif /* TIOCGWINSZ or ISC4_0 */
#endif /* USG */
-#ifdef HAVE_SYS_STROPTS_H
-#include <sys/stropts.h>
-#endif /* HAVE_SYS_STROPTS_H */
-
/* LPASS8 is new in 4.3, and makes cbreak mode provide all 8 bits. */
#ifndef LPASS8
#define LPASS8 0
#include <sys/termio.h>
#endif
-/* ------------------------------- */
-/* miscellaneous */
-/* ------------------------------- */
-
-#ifndef HAVE_UTIMES
-#ifndef HAVE_STRUCT_UTIMBUF
-/* We want to use utime rather than utimes, but we couldn't find the
- structure declaration. We'll use the traditional one. */
-struct utimbuf
-{
- long actime;
- long modtime;
-};
-#endif
-#endif
-
\f
/************************************************************************/
/* subprocess control */
#endif /* NO_SUBPROCESSES */
-#ifdef WINDOWSNT
+#ifdef WIN32_NATIVE
void wait_for_termination (HANDLE pHandle)
#else
void wait_for_termination (int pid)
Since implementations may add their own error indicators on top,
we ignore it by default. */
-#elif defined (WINDOWSNT)
+#elif defined (WIN32_NATIVE)
int ret = 0, status = 0;
if (pHandle == NULL)
{
Try defining BROKEN_WAIT_FOR_SIGNAL. */
EMACS_WAIT_FOR_SIGNAL (SIGCHLD);
}
-#else /* not HAVE_WAITPID and not WINDOWSNT and (not EMACS_BLOCK_SIGNAL or BROKEN_WAIT_FOR_SIGNAL) */
+#else /* not HAVE_WAITPID and not WIN32_NATIVE and (not EMACS_BLOCK_SIGNAL or BROKEN_WAIT_FOR_SIGNAL) */
/* This approach is kind of cheesy but is guaranteed(?!) to work
for all systems. */
while (1)
#endif
}
-#ifndef WINDOWSNT
+#ifndef WIN32_NATIVE
/* Set up the terminal at the other end of a pseudo-terminal that
we will be controlling an inferior through.
It should not echo or do line-editing, since that is done
}
#endif /* RTU */
}
-#endif /* WINDOWSNT */
+#endif /* WIN32_NATIVE */
#endif /* not NO_SUBPROCESSES */
}
}
-#ifdef WINDOWSNT
+#ifdef WIN32_NATIVE
pid_t
sys_getpid (void)
return abs (getpid ());
}
-#endif /* WINDOWSNT */
+#endif /* WIN32_NATIVE */
/* Fork a subshell. */
static void
sys_subshell (void)
{
-#ifndef WINDOWSNT
+#ifndef WIN32_NATIVE
int pid;
#endif
struct save_signal saved_handlers[5];
str[len] = 0;
xyzzy:
-#ifndef WINDOWSNT
+#ifndef WIN32_NATIVE
pid = fork ();
if (pid == -1)
error ("Can't spawn subshell");
if (pid == 0)
-#endif /* not WINDOWSNT */
+#endif /* not WIN32_NATIVE */
{
char *sh = 0;
if (str)
sys_chdir (str);
-#ifdef WINDOWSNT
+#ifdef WIN32_NATIVE
/* Waits for process completion */
if (_spawnlp (_P_WAIT, sh, sh, NULL) != 0)
wait_for_termination (pid);
restore_signal_handlers (saved_handlers);
-#endif /* not WINDOWSNT */
+#endif /* not WIN32_NATIVE */
}
\f
/* Given FD, obtain pty buffer size. When no luck, a good guess is made,
- so that the function works even fd is not a pty. */
+ so that the function works even when fd is not a pty. */
int
get_pty_max_bytes (int fd)
{
- int pty_max_bytes;
-
+ /* DEC OSF 4.0 fpathconf returns 255, but xemacs hangs on long shell
+ input lines if we return 253. 252 is OK!. So let's leave a bit
+ of slack for the newline that xemacs will insert, and for those
+ inevitable vendor off-by-one-or-two-or-three bugs. */
+#define MAX_CANON_SLACK 10
+#define SAFE_MAX_CANON (127 - MAX_CANON_SLACK)
#if defined (HAVE_FPATHCONF) && defined (_PC_MAX_CANON)
- pty_max_bytes = fpathconf (fd, _PC_MAX_CANON);
- if (pty_max_bytes < 0)
+ {
+ int max_canon = fpathconf (fd, _PC_MAX_CANON);
+#ifdef __hpux__
+ /* HP-UX 10.20 fpathconf returns 768, but this results in
+ truncated input lines, while 255 works. */
+ if (max_canon > 255) max_canon = 255;
+#endif
+ return (max_canon < 0 ? SAFE_MAX_CANON :
+ max_canon > SAFE_MAX_CANON ? max_canon - MAX_CANON_SLACK :
+ max_canon);
+ }
+#elif defined (_POSIX_MAX_CANON)
+ return (_POSIX_MAX_CANON > SAFE_MAX_CANON ?
+ _POSIX_MAX_CANON - MAX_CANON_SLACK :
+ _POSIX_MAX_CANON);
+#else
+ return SAFE_MAX_CANON;
#endif
- pty_max_bytes = 250;
-
- /* Deduct one, to leave space for the eof. */
- pty_max_bytes--;
-
- return pty_max_bytes;
}
/* Figure out the eof character for the FD. */
void
setup_pty (int fd)
{
- /* I'm told that TOICREMOTE does not mean control chars
+ /* I'm told that TIOCREMOTE does not mean control chars
"can't be sent" but rather that they don't have
input-editing or signaling effects.
That should be good, because we have other ways
assert (DEVICE_TTY_P (d));
{
int input_fd = CONSOLE_TTY_DATA (con)->infd;
-#if defined (WINDOWSNT)
+#if defined (WIN32_NATIVE)
DEVICE_TTY_DATA (d)->ospeed = 15;
#elif defined (HAVE_TERMIOS)
struct termios sg;
sg.sg_ospeed = B9600;
if (ioctl (input_fd, TIOCGETP, &sg) < 0)
- abort ();
+ ABORT ();
DEVICE_TTY_DATA (d)->ospeed = sg.sg_ospeed;
#endif
}
#ifdef SIGIO_REQUIRES_SEPARATE_PROCESS_GROUP
-static int inherited_pgroup;
-static int inherited_tty_pgroup;
+static pid_t inherited_pgroup;
+static pid_t inherited_tty_pgroup;
#endif
CONSOLE_LIVE_P (XCONSOLE (Vcontrolling_terminal)))
{
int fd = open ("/dev/tty", O_RDWR, 0);
- int me = getpid ();
+ pid_t me = getpid ();
EMACS_BLOCK_SIGNAL (SIGTTOU);
EMACS_SET_TTY_PROCESS_GROUP (fd, &me);
EMACS_UNBLOCK_SIGNAL (SIGTTOU);
/* It's wrong to encase these into #ifdef HAVE_TTY because we need
them for child TTY processes. */
/* However, this does break NT support while we don't do child TTY processes */
-#ifndef WINDOWSNT
+#ifndef WIN32_NATIVE
/* Set *TC to the parameters associated with the terminal FD.
Return zero if all's well, or -1 if we ran into an error we
if (ioctl (fd, TCGETA, &settings->main) < 0)
return -1;
-#elif !defined (WINDOWSNT)
+#elif !defined (WIN32_NATIVE)
/* I give up - I hope you have the BSD ioctls. */
if (ioctl (fd, TIOCGETP, &settings->main) < 0)
return -1;
if (ioctl (fd, flushp ? TCSETAF : TCSETAW, &settings->main) < 0)
return -1;
-#elif !defined (WINDOWSNT)
+#elif !defined (WIN32_NATIVE)
/* I give up - I hope you have the BSD ioctls. */
if (ioctl (fd, (flushp) ? TIOCSETP : TIOCSETN, &settings->main) < 0)
return -1;
return 0;
}
-#endif /* WINDOWSNT */
+#endif /* WIN32_NATIVE */
\f
/* ------------------------------------------------------ */
/* Initializing a device */
tty.main.c_iflag &= ~BRKINT;
#endif /* AIX */
#else /* if not HAVE_TERMIO */
-#if !defined (WINDOWSNT)
+#if !defined (WIN32_NATIVE)
con->tty_erase_char = make_char (tty.main.sg_erase);
tty.main.sg_flags &= ~(ECHO | CRMOD | XTABS);
if (TTY_FLAGS (con).meta_key)
tty.main.sg_flags |= ANYP;
/* #### should we be using RAW mode here? */
tty.main.sg_flags |= /* interrupt_input ? RAW : */ CBREAK;
-#endif /* not WINDOWSNT */
+#endif /* not WIN32_NATIVE */
#endif /* not HAVE_TERMIO */
/* If going to use CBREAK mode, we must request C-g to interrupt
#if !defined(HAVE_TEXT_START) && !defined(PDUMP)
-#ifdef __cplusplus
- extern "C" int _start (void);
-#else
- extern int _start (void);
-#endif
+EXTERN_C int _start (void);
char *
start_of_text (void)
{
#ifdef TEXT_START
- return ((char *) TEXT_START);
+ return (char *) TEXT_START;
#else
-#ifdef GOULD
- extern csrt ();
- return ((char *) csrt);
-#else /* not GOULD */
- return ((char *) _start);
-#endif /* GOULD */
+ return (char *) _start;
#endif /* TEXT_START */
}
#endif /* !defined(HAVE_TEXT_START) && !defined(PDUMP) */
/*
* Return the address of the start of the data segment prior to
* doing an unexec. After unexec the return value is undefined.
- * See crt0.c for further information and definition of data_start.
+ * See ecrt0.c for further information and definition of data_start.
*
* Apparently, on BSD systems this is etext at startup. On
* USG systems (swapping) this is highly mmu dependent and
*
*/
-#if defined(ORDINARY_LINK) && !defined(__MINGW32__)
+#if defined(ORDINARY_LINK) && !defined(MINGW)
extern char **environ;
#endif
#ifdef DATA_START
return ((char *) DATA_START);
#else
-#ifdef ORDINARY_LINK
+#if defined (ORDINARY_LINK) || defined(PDUMP)
/*
* This is a hack. Since we're not linking crt0.c or pre_crt0.c,
* data_start isn't defined. We take the address of environ, which
extern Lisp_Object Vsystem_name;
-#ifdef HAVE_SOCKETS
-# include <sys/socket.h>
-# include <netdb.h>
-#endif /* HAVE_SOCKETS */
-
void
init_system_name (void)
{
-#if defined (WINDOWSNT)
+#if defined (WIN32_NATIVE)
char hostname [MAX_COMPUTERNAME_LENGTH + 1];
size_t size = sizeof (hostname);
GetComputerName (hostname, &size);
xzero (hints);
hints.ai_flags = AI_CANONNAME;
+#ifdef IPV6_CANONICALIZE
hints.ai_family = AF_UNSPEC;
+#else
+ hints.ai_family = PF_INET;
+#endif
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = 0;
if (!getaddrinfo (hostname, NULL, &hints, &res))
#endif /* ! HAVE_STRERROR */
-#ifdef WINDOWSNT
+#ifdef WIN32_NATIVE
struct errentry {
unsigned long oscode; /* Win32 error */
mswindows_set_errno (GetLastError ());
}
-#endif /* WINDOWSNT */
+#endif /* WIN32_NATIVE */
\f
/************************************************************************/
PATHNAME_CONVERT_OUT (path);
-#ifdef WINDOWSNT
+#ifdef WIN32_NATIVE
/* Make all handles non-inheritable */
oflag |= _O_NOINHERIT;
#endif
PATHNAME_CONVERT_OUT (nonreloc);
-#ifdef WINDOWSNT
+#ifdef WIN32_NATIVE
/* Make all handles non-inheritable */
oflag |= _O_NOINHERIT;
#endif
sys_fopen (const char *path, const char *type)
{
PATHNAME_CONVERT_OUT (path);
-#if defined (WINDOWSNT)
+#if defined (WIN32_NATIVE)
{
int fd;
int oflag;
sys_mkdir (const char *path, mode_t mode)
{
PATHNAME_CONVERT_OUT (path);
-#ifdef WINDOWSNT
+#ifdef WIN32_NATIVE
return mkdir (path);
#else
return mkdir (path, mode);
if (rtnval == NULL) /* End of directory */
return NULL;
{
- Extcount external_len;
- int ascii_filename_p = 1;
const Extbyte * const external_name = (const Extbyte *) rtnval->d_name;
-
- /* Optimize for the common all-ASCII case, computing len en passant */
- for (external_len = 0; external_name[external_len] ; external_len++)
- {
- if (!BYTE_ASCII_P (external_name[external_len]))
- ascii_filename_p = 0;
- }
- if (ascii_filename_p)
+ Extcount external_len = strlen (rtnval->d_name);
+ const Bufbyte *internal_name;
+ Bytecount internal_len;
+
+ TO_INTERNAL_FORMAT (DATA, (external_name, external_len),
+ ALLOCA, (internal_name, internal_len),
+ Qfile_name);
+
+ /* check for common case of ASCII filename */
+ if (internal_len == external_len &&
+ !memcmp (external_name, internal_name, internal_len))
return rtnval;
{ /* Non-ASCII filename */
static Bufbyte_dynarr *internal_DIRENTRY;
- const Bufbyte *internal_name;
- Bytecount internal_len;
if (!internal_DIRENTRY)
internal_DIRENTRY = Dynarr_new (Bufbyte);
else
Dynarr_add_many (internal_DIRENTRY, (Bufbyte *) rtnval,
offsetof (DIRENTRY, d_name));
- TO_INTERNAL_FORMAT (DATA, (external_name, external_len),
- ALLOCA, (internal_name, internal_len),
- Qfile_name);
Dynarr_add_many (internal_DIRENTRY, internal_name, internal_len);
- Dynarr_add (internal_DIRENTRY, 0); /* zero-terminate */
+ Dynarr_add (internal_DIRENTRY, '\0'); /* NUL-terminate */
return (DIRENTRY *) Dynarr_atp (internal_DIRENTRY, 0);
}
}
}
#endif /* ENCAPSULATE_READLINK */
-
#ifdef ENCAPSULATE_FSTAT
int
sys_fstat (int fd, struct stat *buf)
{
+#ifdef WIN32_NATIVE
+ return mswindows_fstat (fd, buf);
+#else
return fstat (fd, buf);
+#endif
}
#endif /* ENCAPSULATE_FSTAT */
-
-#ifdef ENCAPSULATE_STAT
int
-sys_stat (const char *path, struct stat *buf)
+xemacs_stat (const char *path, struct stat *buf)
{
PATHNAME_CONVERT_OUT (path);
+#ifdef WIN32_NATIVE
+ return mswindows_stat (path, buf);
+#else
return stat (path, buf);
+#endif
}
-#endif /* ENCAPSULATE_STAT */
-
/****************** file-manipulation calls *****************/
{
PATHNAME_CONVERT_OUT (old);
PATHNAME_CONVERT_OUT (new);
-#ifdef WINDOWSNT
+#ifdef WIN32_NATIVE
/* Windows rename fails if NEW exists */
if (rename (old, new) == 0)
return 0;
- if (errno != EEXIST)
+ /* In some cases errno is EACCES if NEW exists */
+ if (errno != EEXIST && errno != EACCES)
+ return -1;
+ if (unlink (new) != 0)
return -1;
- unlink (new);
-#endif /* WINDOWSNT */
+#endif /* WIN32_NATIVE */
return rename (old, new);
}
#endif /* ENCAPSULATE_RENAME */
access to those functions goes through the following. */
int
-set_file_times (char *filename, EMACS_TIME atime, EMACS_TIME mtime)
+set_file_times (Lisp_Object path, EMACS_TIME atime, EMACS_TIME mtime)
{
-#ifdef HAVE_UTIMES
- struct timeval tv[2];
- tv[0] = atime;
- tv[1] = mtime;
- return utimes (filename, tv);
-#else /* not HAVE_UTIMES */
+#if defined (WIN32_NATIVE)
+ struct utimbuf utb;
+ utb.actime = EMACS_SECS (atime);
+ utb.modtime = EMACS_SECS (mtime);
+ return mswindows_utime (path, &utb);
+#elif defined (HAVE_UTIME)
struct utimbuf utb;
+ Extbyte *filename;
utb.actime = EMACS_SECS (atime);
utb.modtime = EMACS_SECS (mtime);
+ LISP_STRING_TO_EXTERNAL (path, filename, Qfile_name);
return utime (filename, &utb);
-#endif /* not HAVE_UTIMES */
+#elif defined (HAVE_UTIMES)
+ struct timeval tv[2];
+ Extbyte *filename;
+ tv[0] = atime;
+ tv[1] = mtime;
+ LISP_STRING_TO_EXTERNAL (path, filename, Qfile_name);
+ return utimes (filename, tv);
+#else
+ /* No file times setting function available. */
+ return -1;
+#endif
}
/* */
static int
get_process_times_1 (long *user_ticks, long *system_ticks)
{
-#if defined (_SC_CLK_TCK) || defined (CLK_TCK) && !defined(WINDOWSNT)
+#if defined (_SC_CLK_TCK) || defined (CLK_TCK) && !defined(WIN32_NATIVE)
/* We have the POSIX times() function available. */
struct tms tttt;
times (&tttt);
get_random (void)
{
long val = random ();
-#if VALBITS > RAND_BITS
+#if INT_VALBITS > RAND_BITS
val = (val << RAND_BITS) ^ random ();
-#if VALBITS > 2*RAND_BITS
+#if INT_VALBITS > 2*RAND_BITS
val = (val << RAND_BITS) ^ random ();
-#if VALBITS > 3*RAND_BITS
+#if INT_VALBITS > 3*RAND_BITS
val = (val << RAND_BITS) ^ random ();
-#if VALBITS > 4*RAND_BITS
+#if INT_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);
+ return val & (EMACS_INT) ((1UL << INT_VALBITS) - 1);
}
\f
#if !defined (SYS_SIGLIST_DECLARED) && !defined (HAVE_SYS_SIGLIST)
-#if defined(WINDOWSNT) || defined(__CYGWIN32__)
+#if defined(WIN32_NATIVE) || defined(CYGWIN)
const char *sys_siglist[] =
{
"bum signal!!",
DEFER_GETTEXT ("bad argument to system call"), /* 12 SIGSYS */
DEFER_GETTEXT ("write on a pipe with no one to read it"), /* 13 SIGPIPE */
DEFER_GETTEXT ("alarm clock"), /* 14 SIGALRM */
- DEFER_GETTEXT ("software termination signum"), /* 15 SIGTERM */
+ DEFER_GETTEXT ("software termination signal"), /* 15 SIGTERM */
DEFER_GETTEXT ("user defined signal 1"), /* 16 SIGUSR1 */
DEFER_GETTEXT ("user defined signal 2"), /* 17 SIGUSR2 */
DEFER_GETTEXT ("death of a child"), /* 18 SIGCLD */
DEFER_GETTEXT ("bad argument to system call"), /* 12 SIGSYS */
DEFER_GETTEXT ("write on a pipe with no one to read it"), /* 13 SIGPIPE */
DEFER_GETTEXT ("alarm clock"), /* 14 SIGALRM */
- DEFER_GETTEXT ("software termination signum"), /* 15 SIGTERM */
+ DEFER_GETTEXT ("software termination signal"), /* 15 SIGTERM */
DEFER_GETTEXT ("user defined signal 1"), /* 16 SIGUSR1 */
DEFER_GETTEXT ("user defined signal 2"), /* 17 SIGUSR2 */
DEFER_GETTEXT ("death of a child"), /* 18 SIGCLD */
int cpid, status, fd;
struct stat statbuf;
- if (stat (dpath, &statbuf) == 0)
+ if (stat (dpath, &statbuf) == 0) /* we do want stat() here */
{
errno = EEXIST; /* Stat worked, so it already exists */
return -1;
int cpid, status, fd;
struct stat statbuf;
- if (stat (dpath, &statbuf) != 0)
+ if (stat (dpath, &statbuf) != 0) /* we do want stat() here */
{
/* Stat just set errno. We don't have to */
return -1;
}
#endif /* USE_DL_STUBS */
-
-\f
-
-#ifndef HAVE_STRCASECMP
-/*
- * From BSD
- */
-static unsigned char charmap[] = {
- '\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007',
- '\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017',
- '\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027',
- '\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037',
- '\040', '\041', '\042', '\043', '\044', '\045', '\046', '\047',
- '\050', '\051', '\052', '\053', '\054', '\055', '\056', '\057',
- '\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067',
- '\070', '\071', '\072', '\073', '\074', '\075', '\076', '\077',
- '\100', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
- '\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
- '\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
- '\170', '\171', '\172', '\133', '\134', '\135', '\136', '\137',
- '\140', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
- '\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
- '\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
- '\170', '\171', '\172', '\173', '\174', '\175', '\176', '\177',
- '\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
- '\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217',
- '\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227',
- '\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237',
- '\240', '\241', '\242', '\243', '\244', '\245', '\246', '\247',
- '\250', '\251', '\252', '\253', '\254', '\255', '\256', '\257',
- '\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267',
- '\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277',
- '\300', '\301', '\302', '\303', '\304', '\305', '\306', '\307',
- '\310', '\311', '\312', '\313', '\314', '\315', '\316', '\317',
- '\320', '\321', '\322', '\323', '\324', '\325', '\326', '\327',
- '\330', '\331', '\332', '\333', '\334', '\335', '\336', '\337',
- '\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
- '\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
- '\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
- '\370', '\371', '\372', '\373', '\374', '\375', '\376', '\377',
-};
-
-int
-strcasecmp (char *s1, char *s2)
-{
- unsigned char *cm = charmap;
- unsigned char *us1 = (unsigned char *) s1;
- unsigned char *us2 = (unsigned char *)s2;
-
- while (cm[*us1] == cm[*us2++])
- if (*us1++ == '\0')
- return (0);
-
- return (cm[*us1] - cm[*--us2]);
-}
-#endif /* !HAVE_STRCASECMP */