diff options
Diffstat (limited to 'contrib/cvs/lib')
-rw-r--r-- | contrib/cvs/lib/ChangeLog | 74 | ||||
-rw-r--r-- | contrib/cvs/lib/Makefile.in | 6 | ||||
-rw-r--r-- | contrib/cvs/lib/fncase.c | 115 | ||||
-rw-r--r-- | contrib/cvs/lib/getdate.y | 32 | ||||
-rw-r--r-- | contrib/cvs/lib/getline.c | 34 | ||||
-rw-r--r-- | contrib/cvs/lib/system.h | 80 | ||||
-rw-r--r-- | contrib/cvs/lib/xgetwd.c | 12 |
7 files changed, 298 insertions, 55 deletions
diff --git a/contrib/cvs/lib/ChangeLog b/contrib/cvs/lib/ChangeLog index 02a0e1f7a33ff..3d858ab8659da 100644 --- a/contrib/cvs/lib/ChangeLog +++ b/contrib/cvs/lib/ChangeLog @@ -1,3 +1,77 @@ +13 Jan 1998 Jim Kingdon + + * fncase.c: Include config.h before system.h. + + * system.h: Just include string.h unconditionally. We already + include it unconditionally elsewhere. + +Tue Jan 13 16:51:59 1998 Ian Lance Taylor <ian@cygnus.com> + + * fncase.c: New file, taken from windows-NT/filesubr.c. + * system.h: If __CYGWIN32__ or WIN32 are defined, define + FOLD_FN_CHAR, FILENAMES_CASE_INSENSITIVE, and ISDIRSEP, and + declare fncmp and fnfold. Taken from windows-NT/config.h. + * Makefile.in (SOURCES): Add fncase.c. + +Sat Jan 10 10:51:26 1998 Jim Kingdon <kingdon@harvey.cyclic.com> + + * getline.c (getstr): Make sure to set errno when appropriate. I + didn't test the error case for the new code but inspection shows + the old code was rather broken. + +Sat Nov 29 22:03:39 1997 Jim Kingdon <kingdon@harvey.cyclic.com> + + getwd and getcwd were a big big mess. Although Jim's fix might + indeed be fixing a typo, the code is so tangled that I would guess + it probably breaks some system. So clean this up: + * xgetwd.c: Always assume we have getcwd (we had been anyway, + before Jim's change). + * getwd.c: Removed. + * Makefile.in: Remove getwd.c + * system.h: Remove declarations of getwd and getcwd. Move getcwd + declaration to the !HAVE_UNISTD_H section. + +1997-11-29 Jim Meyering <meyering@na-net.ornl.gov> + + * xgetwd.c: Fix typo s/ifndef/ifdef/ in test of HAVE_GETWD. + +Wed Nov 26 10:12:33 1997 Jim Kingdon <kingdon@harvey.cyclic.com> + + * system.h: Always use "rb" and "wb". Check for O_BINARY with an + #ifdef, not the error-prone LINES_CRLF_TERMINATED. + +Thu Sep 25 10:57:39 1997 Jim Kingdon <kingdon@harvey.cyclic.com> + + * getdate.y (get_date): If gmtime returns NULL, try to cope. + * getdate.c: Regenerated using byacc. + + * getdate.y: Remove comment about sending email concerning this file + to Rich Salz. + * getdate.c: Regenerated using byacc. + +Wed Sep 24 10:35:38 1997 Jim Kingdon <kingdon@harvey.cyclic.com> + + * Makefile.in (OBJECTS): Add regex.o. + +Wed Sep 17 16:37:17 1997 Jim Kingdon <kingdon@harvey.cyclic.com> + + * getdate.y (ToSeconds): For am or pm, a hour of "12" really means 0. + * getdate.c: Regenerated using byacc (not bison per comment). + +Tue Sep 9 20:51:45 1997 Jim Kingdon <kingdon@harvey.cyclic.com> + + * build_lib.com: Add vasprintf.c and vasprintf.obj. + + * build_lib.com: Remove strippath.obj from library/create command. + +Sun Sep 7 17:35:27 1997 Jim Kingdon <kingdon@harvey.cyclic.com> + + * system.h: Replace comment referring to ChangeLog with a + comment based on the ChangeLog entries. + + * strdup.c: Removed, per change to ../configure.in + * Makefile.in (SOURCES): Remove strdup.c. + Mon Jun 16 18:59:50 1997 Jim Kingdon <kingdon@harvey.cyclic.com> * system.h: Add CVS_FNMATCH. diff --git a/contrib/cvs/lib/Makefile.in b/contrib/cvs/lib/Makefile.in index 9645ae9fa87b8..9c32d9fd1a289 100644 --- a/contrib/cvs/lib/Makefile.in +++ b/contrib/cvs/lib/Makefile.in @@ -25,6 +25,7 @@ exec_prefix = @exec_prefix@ SOURCES = \ argmatch.c \ dup2.c \ + fncase.c \ fnmatch.c \ ftruncate.c \ getdate.c \ @@ -32,7 +33,6 @@ SOURCES = \ getline.c \ getopt.c \ getopt1.c \ - getwd.c \ hostname.c \ md5.c \ mkdir.c \ @@ -40,7 +40,6 @@ SOURCES = \ rename.c \ savecwd.c \ sighandle.c \ - strdup.c \ strstr.c \ strerror.c \ stripslash.c \ @@ -53,6 +52,7 @@ SOURCES = \ HEADERS = getline.h getopt.h fnmatch.h regex.h system.h wait.h md5.h savecwd.h +# See long comment in ../configure.in concerning inclusion of regex.o. OBJECTS = \ @LIBOBJS@ \ argmatch.o \ @@ -60,6 +60,7 @@ OBJECTS = \ getopt.o \ getopt1.o \ md5.o \ + regex.o \ savecwd.o \ sighandle.o \ stripslash.o \ @@ -142,7 +143,6 @@ getdate.c: getdate.y fnmatch.o: fnmatch.h getopt1.o: getopt.h regex.o: regex.h -getwd.o: system.h md5.o: md5.h xlint: diff --git a/contrib/cvs/lib/fncase.c b/contrib/cvs/lib/fncase.c new file mode 100644 index 0000000000000..56e7f512bcf9b --- /dev/null +++ b/contrib/cvs/lib/fncase.c @@ -0,0 +1,115 @@ +/* fncase.c -- CVS support for case insensitive file systems. + Jim Blandy <jimb@cyclic.com> + + This file is part of GNU CVS. + + GNU CVS is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "system.h" + +/* The equivalence class mapping for filenames. + Windows NT filenames are case-insensitive, but case-preserving. + Both / and \ are path element separators. + Thus, this table maps both upper and lower case to lower case, and + both / and \ to /. */ + +#if 0 +main () +{ + int c; + + for (c = 0; c < 256; c++) + { + int t; + + if (c == '\\') + t = '/'; + else + t = tolower (c); + + if ((c & 0x7) == 0x0) + printf (" "); + printf ("0x%02x,", t); + if ((c & 0x7) == 0x7) + putchar ('\n'); + else if ((c & 0x7) == 0x3) + putchar (' '); + } +} +#endif + +unsigned char +WNT_filename_classes[] = +{ + 0x00,0x01,0x02,0x03, 0x04,0x05,0x06,0x07, + 0x08,0x09,0x0a,0x0b, 0x0c,0x0d,0x0e,0x0f, + 0x10,0x11,0x12,0x13, 0x14,0x15,0x16,0x17, + 0x18,0x19,0x1a,0x1b, 0x1c,0x1d,0x1e,0x1f, + 0x20,0x21,0x22,0x23, 0x24,0x25,0x26,0x27, + 0x28,0x29,0x2a,0x2b, 0x2c,0x2d,0x2e,0x2f, + 0x30,0x31,0x32,0x33, 0x34,0x35,0x36,0x37, + 0x38,0x39,0x3a,0x3b, 0x3c,0x3d,0x3e,0x3f, + 0x40,0x61,0x62,0x63, 0x64,0x65,0x66,0x67, + 0x68,0x69,0x6a,0x6b, 0x6c,0x6d,0x6e,0x6f, + 0x70,0x71,0x72,0x73, 0x74,0x75,0x76,0x77, + 0x78,0x79,0x7a,0x5b, 0x2f,0x5d,0x5e,0x5f, + 0x60,0x61,0x62,0x63, 0x64,0x65,0x66,0x67, + 0x68,0x69,0x6a,0x6b, 0x6c,0x6d,0x6e,0x6f, + 0x70,0x71,0x72,0x73, 0x74,0x75,0x76,0x77, + 0x78,0x79,0x7a,0x7b, 0x7c,0x7d,0x7e,0x7f, + 0x80,0x81,0x82,0x83, 0x84,0x85,0x86,0x87, + 0x88,0x89,0x8a,0x8b, 0x8c,0x8d,0x8e,0x8f, + 0x90,0x91,0x92,0x93, 0x94,0x95,0x96,0x97, + 0x98,0x99,0x9a,0x9b, 0x9c,0x9d,0x9e,0x9f, + 0xa0,0xa1,0xa2,0xa3, 0xa4,0xa5,0xa6,0xa7, + 0xa8,0xa9,0xaa,0xab, 0xac,0xad,0xae,0xaf, + 0xb0,0xb1,0xb2,0xb3, 0xb4,0xb5,0xb6,0xb7, + 0xb8,0xb9,0xba,0xbb, 0xbc,0xbd,0xbe,0xbf, + 0xc0,0xc1,0xc2,0xc3, 0xc4,0xc5,0xc6,0xc7, + 0xc8,0xc9,0xca,0xcb, 0xcc,0xcd,0xce,0xcf, + 0xd0,0xd1,0xd2,0xd3, 0xd4,0xd5,0xd6,0xd7, + 0xd8,0xd9,0xda,0xdb, 0xdc,0xdd,0xde,0xdf, + 0xe0,0xe1,0xe2,0xe3, 0xe4,0xe5,0xe6,0xe7, + 0xe8,0xe9,0xea,0xeb, 0xec,0xed,0xee,0xef, + 0xf0,0xf1,0xf2,0xf3, 0xf4,0xf5,0xf6,0xf7, + 0xf8,0xf9,0xfa,0xfb, 0xfc,0xfd,0xfe,0xff, +}; + +/* Like strcmp, but with the appropriate tweaks for file names. + Under Windows NT, filenames are case-insensitive but case-preserving, + and both \ and / are path element separators. */ +int +fncmp (const char *n1, const char *n2) +{ + while (*n1 && *n2 + && (WNT_filename_classes[(unsigned char) *n1] + == WNT_filename_classes[(unsigned char) *n2])) + n1++, n2++; + return (WNT_filename_classes[(unsigned char) *n1] + - WNT_filename_classes[(unsigned char) *n2]); +} + +/* Fold characters in FILENAME to their canonical forms. + If FOLD_FN_CHAR is not #defined, the system provides a default + definition for this. */ +void +fnfold (char *filename) +{ + while (*filename) + { + *filename = FOLD_FN_CHAR (*filename); + filename++; + } +} diff --git a/contrib/cvs/lib/getdate.y b/contrib/cvs/lib/getdate.y index 8ed565caacc42..fdb177d04c1c5 100644 --- a/contrib/cvs/lib/getdate.y +++ b/contrib/cvs/lib/getdate.y @@ -4,7 +4,6 @@ ** at the University of North Carolina at Chapel Hill. Later tweaked by ** a couple of people on Usenet. Completely overhauled by Rich $alz ** <rsalz@bbn.com> and Jim Berets <jberets@bbn.com> in August, 1990; -** send any email to Rich. ** ** This grammar has 10 shift/reduce conflicts. ** @@ -604,10 +603,14 @@ ToSeconds(Hours, Minutes, Seconds, Meridian) case MERam: if (Hours < 1 || Hours > 12) return -1; + if (Hours == 12) + Hours = 0; return (Hours * 60L + Minutes) * 60L + Seconds; case MERpm: if (Hours < 1 || Hours > 12) return -1; + if (Hours == 12) + Hours = 0; return ((Hours + 12) * 60L + Minutes) * 60L + Seconds; default: abort (); @@ -913,17 +916,34 @@ get_date(p, now) yyInput = p; if (now == NULL) { + struct tm *gmt_ptr; + now = &ftz; (void)time (&nowtime); - if (! (tm = gmtime (&nowtime))) - return -1; - gmt = *tm; /* Make a copy, in case localtime modifies *tm. */ + gmt_ptr = gmtime (&nowtime); + if (gmt_ptr != NULL) + { + /* Make a copy, in case localtime modifies *tm (I think + that comment now applies to *gmt_ptr, but I am too + lazy to dig into how gmtime and locatime allocate the + structures they return pointers to). */ + gmt = *gmt_ptr; + } if (! (tm = localtime (&nowtime))) return -1; - - ftz.timezone = difftm (&gmt, tm) / 60; + + if (gmt_ptr != NULL) + ftz.timezone = difftm (&gmt, tm) / 60; + else + /* We are on a system like VMS, where the system clock is + in local time and the system has no concept of timezones. + Hopefully we can fake this out (for the case in which the + user specifies no timezone) by just saying the timezone + is zero. */ + ftz.timezone = 0; + if(tm->tm_isdst) ftz.timezone += 60; } diff --git a/contrib/cvs/lib/getline.c b/contrib/cvs/lib/getline.c index 5f4fba640d82e..5b63fc18aaa29 100644 --- a/contrib/cvs/lib/getline.c +++ b/contrib/cvs/lib/getline.c @@ -21,6 +21,7 @@ General Public License for more details. */ #include <sys/types.h> #include <stdio.h> #include <assert.h> +#include <errno.h> #if STDC_HEADERS #include <stdlib.h> @@ -35,7 +36,9 @@ char *malloc (), *realloc (); + OFFSET (and null-terminate it). *LINEPTR is a pointer returned from malloc (or NULL), pointing to *N characters of space. It is realloc'd as necessary. Return the number of characters read (not including the - null terminator), or -1 on error or EOF. */ + null terminator), or -1 on error or EOF. On a -1 return, the caller + should check feof(), if not then errno has been set to indicate + the error. */ int getstr (lineptr, n, stream, terminator, offset) @@ -50,14 +53,20 @@ getstr (lineptr, n, stream, terminator, offset) int ret; if (!lineptr || !n || !stream) - return -1; + { + errno = EINVAL; + return -1; + } if (!*lineptr) { *n = MIN_CHUNK; *lineptr = malloc (*n); if (!*lineptr) - return -1; + { + errno = ENOMEM; + return -1; + } } nchars_avail = *n - offset; @@ -65,8 +74,11 @@ getstr (lineptr, n, stream, terminator, offset) for (;;) { + int save_errno; register int c = getc (stream); + save_errno = errno; + /* We always want at least one char left in the buffer, since we always (unless we get an error while reading the first char) NUL-terminate the line buffer. */ @@ -82,12 +94,24 @@ getstr (lineptr, n, stream, terminator, offset) nchars_avail = *n + *lineptr - read_pos; *lineptr = realloc (*lineptr, *n); if (!*lineptr) - return -1; + { + errno = ENOMEM; + return -1; + } read_pos = *n - nchars_avail + *lineptr; assert((*lineptr + *n) == (read_pos + nchars_avail)); } - if (c == EOF || ferror (stream)) + if (ferror (stream)) + { + /* Might like to return partial line, but there is no + place for us to store errno. And we don't want to just + lose errno. */ + errno = save_errno; + return -1; + } + + if (c == EOF) { /* Return partial line, if any. */ if (read_pos == *lineptr) diff --git a/contrib/cvs/lib/system.h b/contrib/cvs/lib/system.h index 1a692ffa4a9ae..7648b76355cf4 100644 --- a/contrib/cvs/lib/system.h +++ b/contrib/cvs/lib/system.h @@ -27,8 +27,14 @@ #undef S_ISNWK #endif -/* Not all systems have S_IFMT, but we probably want to use it if we - do. See ChangeLog for a more detailed discussion. */ +/* Not all systems have S_IFMT, but we want to use it if we have it. + The S_IFMT code below looks right (it masks and compares). The + non-S_IFMT code looks bogus (are there really systems on which + S_IFBLK, S_IFLNK, &c, each have their own bit? I suspect it was + written for OS/2 using the IBM C/C++ Tools 2.01 compiler). + + Of course POSIX systems will have S_IS*, so maybe the issue is + semi-moot. */ #if !defined(S_ISBLK) && defined(S_IFBLK) # if defined(S_IFMT) @@ -147,6 +153,7 @@ #include <limits.h> #else off_t lseek (); +char *getcwd (); #endif #if TIME_WITH_SYS_TIME @@ -276,16 +283,7 @@ int utime (); # endif #endif -#if STDC_HEADERS || HAVE_STRING_H -# include <string.h> - /* An ANSI string.h and pre-ANSI memory.h might conflict. */ -# if !STDC_HEADERS && HAVE_MEMORY_H -# include <memory.h> -# endif /* not STDC_HEADERS and HAVE_MEMORY_H */ -#else /* not STDC_HEADERS and not HAVE_STRING_H */ -# include <strings.h> - /* memory.h and strings.h conflict on some systems. */ -#endif /* not STDC_HEADERS and not HAVE_STRING_H */ +#include <string.h> #ifndef ERRNO_H_MISSING #include <errno.h> @@ -329,12 +327,6 @@ extern int errno; #define EXIT_FAILURE 1 #endif -#if defined(USG) || defined(POSIX) -char *getcwd (); -#else -char *getwd (); -#endif - /* check for POSIX signals */ #if defined(HAVE_SIGACTION) && defined(HAVE_SIGPROCMASK) # define POSIX_SIGNALS @@ -470,6 +462,31 @@ char *getwd (); #define CVS_FNMATCH fnmatch #endif +#if defined (__CYGWIN32__) || defined (WIN32) + +/* Under Windows NT, filenames are case-insensitive, and both / and \ + are path component separators. */ + +#define FOLD_FN_CHAR(c) (WNT_filename_classes[(unsigned char) (c)]) +extern unsigned char WNT_filename_classes[]; +#define FILENAMES_CASE_INSENSITIVE 1 + +/* Is the character C a path name separator? Under + Windows NT, you can use either / or \. */ +#define ISDIRSEP(c) (FOLD_FN_CHAR(c) == '/') + +/* Like strcmp, but with the appropriate tweaks for file names. + Under Windows NT, filenames are case-insensitive but case-preserving, + and both \ and / are path element separators. */ +extern int fncmp (const char *n1, const char *n2); + +/* Fold characters in FILENAME to their canonical forms. + If FOLD_FN_CHAR is not #defined, the system provides a default + definition for this. */ +extern void fnfold (char *FILENAME); + +#endif /* defined (__CYGWIN32__) || defined (WIN32) */ + /* Some file systems are case-insensitive. If FOLD_FN_CHAR is #defined, it maps the character C onto its "canonical" form. In a case-insensitive system, it would map all alphanumeric characters @@ -488,21 +505,22 @@ char *getwd (); #endif -/* On some systems, lines in text files should be terminated with CRLF, - not just LF, and the read and write routines do this translation - for you. LINES_CRLF_TERMINATED is #defined on such systems. - - OPEN_BINARY is the flag to pass to the open function for - untranslated I/O. - - FOPEN_BINARY_READ is the string to pass to fopen to get - untranslated reading. - - FOPEN_BINARY_WRITE is the string to pass to fopen to get - untranslated writing. */ -#if LINES_CRLF_TERMINATED -#define OPEN_BINARY (O_BINARY) +/* On some systems, we have to be careful about writing/reading files + in text or binary mode (so in text mode the system can handle CRLF + vs. LF, VMS text file conventions, &c). We decide to just always + be careful. That way we don't have to worry about whether text and + binary differ on this system. We just have to worry about whether + the system has O_BINARY and "rb". The latter is easy; all ANSI C + libraries have it, SunOS4 has it, and CVS has used it unguarded + some places for a while now without complaints (e.g. "rb" in + server.c (server_updated), since CVS 1.8). The former is just an + #ifdef. */ + #define FOPEN_BINARY_READ ("rb") #define FOPEN_BINARY_WRITE ("wb") + +#ifdef O_BINARY +#define OPEN_BINARY (O_BINARY) #else #define OPEN_BINARY (0) -#define FOPEN_BINARY_READ ("r") -#define FOPEN_BINARY_WRITE ("w") #endif diff --git a/contrib/cvs/lib/xgetwd.c b/contrib/cvs/lib/xgetwd.c index e2a3baa5a69cd..bbae81dd6ce66 100644 --- a/contrib/cvs/lib/xgetwd.c +++ b/contrib/cvs/lib/xgetwd.c @@ -1,5 +1,5 @@ /* xgetwd.c -- return current directory with unlimited length - Copyright (C) 1992 Free Software Foundation, Inc. + Copyright (C) 1992, 1997 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -26,14 +26,6 @@ extern int errno; #endif #include <sys/types.h> -#ifndef HAVE_GETWD -char *getwd (); -#define GETWD(buf, max) getwd (buf) -#else -char *getcwd (); -#define GETWD(buf, max) getcwd (buf, max) -#endif - /* Amount by which to increase buffer size when allocating more space. */ #define PATH_INCR 32 @@ -57,7 +49,7 @@ xgetwd () cwd = xmalloc (path_max); errno = 0; - while ((ret = GETWD (cwd, path_max)) == NULL && errno == ERANGE) + while ((ret = getcwd (cwd, path_max)) == NULL && errno == ERANGE) { path_max += PATH_INCR; cwd = xrealloc (cwd, path_max); |