diff options
Diffstat (limited to 'compat')
-rw-r--r-- | compat/fixstrtod.c | 10 | ||||
-rw-r--r-- | compat/gettod.c | 10 | ||||
-rw-r--r-- | compat/memcmp.c | 42 | ||||
-rw-r--r-- | compat/opendir.c | 120 | ||||
-rw-r--r-- | compat/strftime.c | 521 | ||||
-rw-r--r-- | compat/string.h | 4 | ||||
-rw-r--r-- | compat/strncasecmp.c | 46 | ||||
-rw-r--r-- | compat/strstr.c | 31 | ||||
-rw-r--r-- | compat/strtod.c | 64 | ||||
-rw-r--r-- | compat/strtol.c | 41 | ||||
-rw-r--r-- | compat/strtoll.c | 111 | ||||
-rw-r--r-- | compat/strtoul.c | 72 | ||||
-rw-r--r-- | compat/strtoull.c | 261 | ||||
-rw-r--r-- | compat/tclErrno.h | 99 | ||||
-rw-r--r-- | compat/tmpnam.c | 42 | ||||
-rw-r--r-- | compat/waitpid.c | 94 |
16 files changed, 260 insertions, 1308 deletions
diff --git a/compat/fixstrtod.c b/compat/fixstrtod.c index 165b7d1..a779e22 100644 --- a/compat/fixstrtod.c +++ b/compat/fixstrtod.c @@ -10,7 +10,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: fixstrtod.c,v 1.2 1998/09/14 18:39:44 stanton Exp $ + * RCS: @(#) $Id: fixstrtod.c,v 1.3 2007/04/16 13:36:34 dkf Exp $ */ #include <stdio.h> @@ -22,12 +22,12 @@ * somes systems (e.g. SunOS 4.1.4) stdlib.h doesn't declare strtod. */ -extern double strtod(); +extern double strtod(char *, char **); double -fixstrtod(string, endPtr) - char *string; - char **endPtr; +fixstrtod( + char *string, + char **endPtr) { double d; d = strtod(string, endPtr); diff --git a/compat/gettod.c b/compat/gettod.c index 9fc0ca5..179491b 100644 --- a/compat/gettod.c +++ b/compat/gettod.c @@ -9,21 +9,21 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: gettod.c,v 1.2 1998/09/14 18:39:44 stanton Exp $ + * RCS: @(#) $Id: gettod.c,v 1.4 2007/04/16 13:36:34 dkf Exp $ */ -#include "tcl.h" #include "tclPort.h" #include <sys/timeb.h> #undef timezone int -gettimeofday(tp, tz) -struct timeval *tp; -struct timezone *tz; +gettimeofday( + struct timeval *tp, + struct timezone *tz) { struct timeb t; + ftime(&t); tp->tv_sec = t.time; tp->tv_usec = t. millitm * 1000; diff --git a/compat/memcmp.c b/compat/memcmp.c index 8bb7e39..43202a5 100644 --- a/compat/memcmp.c +++ b/compat/memcmp.c @@ -1,26 +1,23 @@ -/* +/* * memcmp.c -- * * Source code for the "memcmp" library routine. * * Copyright (c) 1998 Sun Microsystems, Inc. * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. + * See the file "license.terms" for information on usage and redistribution of + * this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * SCCS: @(#) memcmp.c 1.2 98/01/19 10:48:58 + * RCS: @(#) $Id: memcmp.c,v 1.4 2007/01/22 09:15:50 dkf Exp $ */ -#include "tcl.h" #include "tclPort.h" /* - * Here is the prototype just in case it is not included - * in tclPort.h. + * Here is the prototype just in case it is not included in tclPort.h. */ -int memcmp _ANSI_ARGS_((CONST VOID *s1, - CONST VOID *s2, size_t n)); +int memcmp(CONST VOID *s1, CONST VOID *s2, size_t n); /* *---------------------------------------------------------------------- @@ -30,11 +27,10 @@ int memcmp _ANSI_ARGS_((CONST VOID *s1, * Compares two bytes sequences. * * Results: - * compares its arguments, looking at the first n - * bytes (each interpreted as an unsigned char), and returns - * an integer less than, equal to, or greater than 0, accord- - * ing as s1 is less than, equal to, or - * greater than s2 when taken to be unsigned 8 bit numbers. + * Compares its arguments, looking at the first n bytes (each interpreted + * as an unsigned char), and returns an integer less than, equal to, or + * greater than 0, according as s1 is less than, equal to, or greater + * than s2 when taken to be unsigned 8 bit numbers. * * Side effects: * None. @@ -43,10 +39,10 @@ int memcmp _ANSI_ARGS_((CONST VOID *s1, */ int -memcmp(s1, s2, n) - CONST VOID *s1; /* First string. */ - CONST VOID *s2; /* Second string. */ - size_t n; /* Length to compare. */ +memcmp( + CONST VOID *s1, /* First string. */ + CONST VOID *s2, /* Second string. */ + size_t n) /* Length to compare. */ { CONST unsigned char *ptr1 = (CONST unsigned char *) s1; CONST unsigned char *ptr2 = (CONST unsigned char *) s2; @@ -54,9 +50,17 @@ memcmp(s1, s2, n) for ( ; n-- ; ptr1++, ptr2++) { unsigned char u1 = *ptr1, u2 = *ptr2; - if ( u1 != u2) { + if (u1 != u2) { return (u1-u2); } } return 0; } + +/* + * Local Variables: + * mode: c + * c-basic-offset: 4 + * fill-column: 78 + * End: + */ diff --git a/compat/opendir.c b/compat/opendir.c index 8eec7db..6c8f263 100644 --- a/compat/opendir.c +++ b/compat/opendir.c @@ -1,17 +1,14 @@ /* * opendir.c -- * - * This file provides dirent-style directory-reading procedures - * for V7 Unix systems that don't have such procedures. The - * origin of this code is unclear, but it seems to have come - * originally from Larry Wall. + * This file provides dirent-style directory-reading procedures for V7 + * Unix systems that don't have such procedures. The origin of this code + * is unclear, but it seems to have come originally from Larry Wall. * - * - * RCS: @(#) $Id: opendir.c,v 1.2 1998/09/14 18:39:44 stanton Exp $ + * RCS: @(#) $Id: opendir.c,v 1.4 2007/04/16 13:36:34 dkf Exp $ */ #include "tclInt.h" -#include "tclPort.h" #undef DIRSIZ #define DIRSIZ(dp) \ @@ -20,24 +17,28 @@ /* * open a directory. */ + DIR * -opendir(name) -char *name; +opendir( + char *name) { - register DIR *dirp; - register int fd; - char *myname; + register DIR *dirp; + register int fd; + char *myname; - myname = ((*name == '\0') ? "." : name); - if ((fd = open(myname, 0, 0)) == -1) - return NULL; - if ((dirp = (DIR *)ckalloc(sizeof(DIR))) == NULL) { - close (fd); - return NULL; - } - dirp->dd_fd = fd; - dirp->dd_loc = 0; - return dirp; + myname = ((*name == '\0') ? "." : name); + if ((fd = open(myname, 0, 0)) == -1) { + return NULL; + } + dirp = (DIR *) ckalloc(sizeof(DIR)); + if (dirp == NULL) { + /* unreachable? */ + close(fd); + return NULL; + } + dirp->dd_fd = fd; + dirp->dd_loc = 0; + return dirp; } /* @@ -47,62 +48,65 @@ char *name; #define ODIRSIZ 14 struct olddirect { - ino_t od_ino; - char od_name[ODIRSIZ]; + ino_t od_ino; + char od_name[ODIRSIZ]; }; #else /* a Pyramid in the ATT universe */ #define ODIRSIZ 248 struct olddirect { - long od_ino; - short od_fill1, od_fill2; - char od_name[ODIRSIZ]; + long od_ino; + short od_fill1, od_fill2; + char od_name[ODIRSIZ]; }; #endif /* * get next entry in a directory. */ + struct dirent * -readdir(dirp) -register DIR *dirp; +readdir( + register DIR *dirp) { - register struct olddirect *dp; - static struct dirent dir; + register struct olddirect *dp; + static struct dirent dir; - for (;;) { - if (dirp->dd_loc == 0) { - dirp->dd_size = read(dirp->dd_fd, dirp->dd_buf, - DIRBLKSIZ); - if (dirp->dd_size <= 0) - return NULL; - } - if (dirp->dd_loc >= dirp->dd_size) { - dirp->dd_loc = 0; - continue; - } - dp = (struct olddirect *)(dirp->dd_buf + dirp->dd_loc); - dirp->dd_loc += sizeof(struct olddirect); - if (dp->od_ino == 0) - continue; - dir.d_ino = dp->od_ino; - strncpy(dir.d_name, dp->od_name, ODIRSIZ); - dir.d_name[ODIRSIZ] = '\0'; /* insure null termination */ - dir.d_namlen = strlen(dir.d_name); - dir.d_reclen = DIRSIZ(&dir); - return (&dir); + for (;;) { + if (dirp->dd_loc == 0) { + dirp->dd_size = read(dirp->dd_fd, dirp->dd_buf, DIRBLKSIZ); + if (dirp->dd_size <= 0) { + return NULL; + } + } + if (dirp->dd_loc >= dirp->dd_size) { + dirp->dd_loc = 0; + continue; } + dp = (struct olddirect *)(dirp->dd_buf + dirp->dd_loc); + dirp->dd_loc += sizeof(struct olddirect); + if (dp->od_ino == 0) { + continue; + } + dir.d_ino = dp->od_ino; + strncpy(dir.d_name, dp->od_name, ODIRSIZ); + dir.d_name[ODIRSIZ] = '\0'; /* insure null termination */ + dir.d_namlen = strlen(dir.d_name); + dir.d_reclen = DIRSIZ(&dir); + return &dir; + } } /* * close a directory. */ + void -closedir(dirp) -register DIR *dirp; +closedir( + register DIR *dirp) { - close(dirp->dd_fd); - dirp->dd_fd = -1; - dirp->dd_loc = 0; - ckfree((char *) dirp); + close(dirp->dd_fd); + dirp->dd_fd = -1; + dirp->dd_loc = 0; + ckfree((char *) dirp); } diff --git a/compat/strftime.c b/compat/strftime.c deleted file mode 100644 index 7d2c416..0000000 --- a/compat/strftime.c +++ /dev/null @@ -1,521 +0,0 @@ -/* - * strftime.c -- - * - * This file contains a modified version of the BSD 4.4 strftime - * function. - * - * This file is a modified version of the strftime.c file from the BSD 4.4 - * source. See the copyright notice below for details on redistribution - * restrictions. The "license.terms" file does not apply to this file. - * - * Changes 2002 Copyright (c) 2002 ActiveState Corporation. - * - * RCS: @(#) $Id: strftime.c,v 1.10.2.3 2005/11/04 18:18:04 kennykb Exp $ - */ - -/* - * Copyright (c) 1989 The Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#if defined(LIBC_SCCS) -static char *rcsid = "$Id: strftime.c,v 1.10.2.3 2005/11/04 18:18:04 kennykb Exp $"; -#endif /* LIBC_SCCS */ - -#include <time.h> -#include <string.h> -#include <locale.h> -#include "tclInt.h" -#include "tclPort.h" - -#define TM_YEAR_BASE 1900 -#define IsLeapYear(x) ((x % 4 == 0) && (x % 100 != 0 || x % 400 == 0)) - -typedef struct { - const char *abday[7]; - const char *day[7]; - const char *abmon[12]; - const char *mon[12]; - const char *am_pm[2]; - const char *d_t_fmt; - const char *d_fmt; - const char *t_fmt; - const char *t_fmt_ampm; -} _TimeLocale; - -/* - * This is the C locale default. On Windows, if we wanted to make this - * localized, we would use GetLocaleInfo to get the correct values. - * It may be acceptable to do localization of month/day names, as the - * numerical values would be considered the locale-independent versions. - */ -static const _TimeLocale _DefaultTimeLocale = -{ - { - "Sun","Mon","Tue","Wed","Thu","Fri","Sat", - }, - { - "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", - "Friday", "Saturday" - }, - { - "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" - }, - { - "January", "February", "March", "April", "May", "June", "July", - "August", "September", "October", "November", "December" - }, - { - "AM", "PM" - }, - "%a %b %d %H:%M:%S %Y", - "%m/%d/%y", - "%H:%M:%S", - "%I:%M:%S %p" -}; - -static const _TimeLocale *_CurrentTimeLocale = &_DefaultTimeLocale; - -static int isGMT; -static size_t gsize; -static char *pt; -static int _add _ANSI_ARGS_((const char* str)); -static int _conv _ANSI_ARGS_((int n, int digits, int pad)); -static int _secs _ANSI_ARGS_((const struct tm *t)); -static size_t _fmt _ANSI_ARGS_((const char *format, - const struct tm *t)); -static int ISO8601Week _ANSI_ARGS_((CONST struct tm* t, int *year )); - -size_t -TclpStrftime(s, maxsize, format, t, useGMT) - char *s; - size_t maxsize; - const char *format; - const struct tm *t; - int useGMT; -{ - if (format[0] == '%' && format[1] == 'Q') { - /* Format as a stardate */ - sprintf(s, "Stardate %2d%03d.%01d", - (((t->tm_year + TM_YEAR_BASE) + 377) - 2323), - (((t->tm_yday + 1) * 1000) / - (365 + IsLeapYear((t->tm_year + TM_YEAR_BASE)))), - (((t->tm_hour * 60) + t->tm_min)/144)); - return(strlen(s)); - } - - isGMT = useGMT; - /* - * We may be able to skip this for useGMT, but it should be harmless. - * -- hobbs - */ - tzset(); - - pt = s; - if ((gsize = maxsize) < 1) - return(0); - if (_fmt(format, t)) { - *pt = '\0'; - return(maxsize - gsize); - } - return(0); -} - -#define SUN_WEEK(t) (((t)->tm_yday + 7 - \ - ((t)->tm_wday)) / 7) -#define MON_WEEK(t) (((t)->tm_yday + 7 - \ - ((t)->tm_wday ? (t)->tm_wday - 1 : 6)) / 7) - -static size_t -_fmt(format, t) - const char *format; - const struct tm *t; -{ -#ifdef WIN32 -#define BUF_SIZ 256 - TCHAR buf[BUF_SIZ]; - SYSTEMTIME syst = { - t->tm_year + 1900, - t->tm_mon + 1, - t->tm_wday, - t->tm_mday, - t->tm_hour, - t->tm_min, - t->tm_sec, - 0, - }; -#endif - for (; *format; ++format) { - if (*format == '%') { - ++format; - if (*format == 'E') { - /* Alternate Era */ - ++format; - } else if (*format == 'O') { - /* Alternate numeric symbols */ - ++format; - } - switch(*format) { - case '\0': - --format; - break; - case 'A': - if (t->tm_wday < 0 || t->tm_wday > 6) - return(0); - if (!_add(_CurrentTimeLocale->day[t->tm_wday])) - return(0); - continue; - case 'a': - if (t->tm_wday < 0 || t->tm_wday > 6) - return(0); - if (!_add(_CurrentTimeLocale->abday[t->tm_wday])) - return(0); - continue; - case 'B': - if (t->tm_mon < 0 || t->tm_mon > 11) - return(0); - if (!_add(_CurrentTimeLocale->mon[t->tm_mon])) - return(0); - continue; - case 'b': - case 'h': - if (t->tm_mon < 0 || t->tm_mon > 11) - return(0); - if (!_add(_CurrentTimeLocale->abmon[t->tm_mon])) - return(0); - continue; - case 'C': - if (!_conv((t->tm_year + TM_YEAR_BASE) / 100, - 2, '0')) - return(0); - continue; - case 'D': - if (!_fmt("%m/%d/%y", t)) - return(0); - continue; - case 'd': - if (!_conv(t->tm_mday, 2, '0')) - return(0); - continue; - case 'e': - if (!_conv(t->tm_mday, 2, ' ')) - return(0); - continue; - case 'g': - { - int year; - ISO8601Week( t, &year ); - if ( !_conv( year%100, 2, '0' ) ) { - return( 0 ); - } - continue; - } - case 'G': - { - int year; - ISO8601Week( t, &year ); - if ( !_conv( year, 4, '0' ) ) { - return( 0 ); - } - continue; - } - case 'H': - if (!_conv(t->tm_hour, 2, '0')) - return(0); - continue; - case 'I': - if (!_conv(t->tm_hour % 12 ? - t->tm_hour % 12 : 12, 2, '0')) - return(0); - continue; - case 'j': - if (!_conv(t->tm_yday + 1, 3, '0')) - return(0); - continue; - case 'k': - if (!_conv(t->tm_hour, 2, ' ')) - return(0); - continue; - case 'l': - if (!_conv(t->tm_hour % 12 ? - t->tm_hour % 12: 12, 2, ' ')) - return(0); - continue; - case 'M': - if (!_conv(t->tm_min, 2, '0')) - return(0); - continue; - case 'm': - if (!_conv(t->tm_mon + 1, 2, '0')) - return(0); - continue; - case 'n': - if (!_add("\n")) - return(0); - continue; - case 'p': - if (!_add(_CurrentTimeLocale->am_pm[t->tm_hour >= 12])) - return(0); - continue; - case 'R': - if (!_fmt("%H:%M", t)) - return(0); - continue; - case 'r': - if (!_fmt(_CurrentTimeLocale->t_fmt_ampm, t)) - return(0); - continue; - case 'S': - if (!_conv(t->tm_sec, 2, '0')) - return(0); - continue; - case 's': - if (!_secs(t)) - return(0); - continue; - case 'T': - if (!_fmt("%H:%M:%S", t)) - return(0); - continue; - case 't': - if (!_add("\t")) - return(0); - continue; - case 'U': - if (!_conv(SUN_WEEK(t), 2, '0')) - return(0); - continue; - case 'u': - if (!_conv(t->tm_wday ? t->tm_wday : 7, 1, '0')) - return(0); - continue; - case 'V': - { - int week = ISO8601Week( t, NULL ); - if (!_conv(week, 2, '0')) - return(0); - continue; - } - case 'W': - if (!_conv(MON_WEEK(t), 2, '0')) - return(0); - continue; - case 'w': - if (!_conv(t->tm_wday, 1, '0')) - return(0); - continue; -#ifdef WIN32 - /* - * To properly handle the localized time routines on Windows, - * we must make use of the special localized calls. - */ - case 'c': - if (!GetDateFormat(LOCALE_USER_DEFAULT, - DATE_LONGDATE | LOCALE_USE_CP_ACP, - &syst, NULL, buf, BUF_SIZ) - || !_add(buf) - || !_add(" ")) { - return(0); - } - /* - * %c is created with LONGDATE + " " + TIME on Windows, - * so continue to %X case here. - */ - case 'X': - if (!GetTimeFormat(LOCALE_USER_DEFAULT, - LOCALE_USE_CP_ACP, - &syst, NULL, buf, BUF_SIZ) - || !_add(buf)) { - return(0); - } - continue; - case 'x': - if (!GetDateFormat(LOCALE_USER_DEFAULT, - DATE_SHORTDATE | LOCALE_USE_CP_ACP, - &syst, NULL, buf, BUF_SIZ) - || !_add(buf)) { - return(0); - } - continue; -#else - case 'c': - if (!_fmt(_CurrentTimeLocale->d_t_fmt, t)) - return(0); - continue; - case 'x': - if (!_fmt(_CurrentTimeLocale->d_fmt, t)) - return(0); - continue; - case 'X': - if (!_fmt(_CurrentTimeLocale->t_fmt, t)) - return(0); - continue; -#endif - case 'y': - if (!_conv((t->tm_year + TM_YEAR_BASE) % 100, - 2, '0')) - return(0); - continue; - case 'Y': - if (!_conv((t->tm_year + TM_YEAR_BASE), 4, '0')) - return(0); - continue; - case 'Z': { - char *name = (isGMT ? "GMT" : TclpGetTZName(t->tm_isdst)); - int wrote; - Tcl_UtfToExternal(NULL, NULL, name, -1, 0, NULL, - pt, gsize, NULL, &wrote, NULL); - pt += wrote; - gsize -= wrote; - continue; - } - case '%': - /* - * X311J/88-090 (4.12.3.5): if conversion char is - * undefined, behavior is undefined. Print out the - * character itself as printf(3) does. - */ - default: - break; - } - } - if (!gsize--) - return(0); - *pt++ = *format; - } - return(gsize); -} - -static int -_secs(t) - const struct tm *t; -{ - static char buf[15]; - register time_t s; - register char *p; - struct tm tmp; - - /* Make a copy, mktime(3) modifies the tm struct. */ - tmp = *t; - s = mktime(&tmp); - for (p = buf + sizeof(buf) - 2; s > 0 && p > buf; s /= 10) - *p-- = (char)(s % 10 + '0'); - return(_add(++p)); -} - -static int -_conv(n, digits, pad) - int n, digits; - int pad; -{ - static char buf[10]; - register char *p; - - p = buf + sizeof( buf ) - 1; - *p-- = '\0'; - if ( n == 0 ) { - *p-- = '0'; --digits; - } else { - for (; n > 0 && p > buf; n /= 10, --digits) - *p-- = (char)(n % 10 + '0'); - } - while (p > buf && digits-- > 0) - *p-- = (char) pad; - return(_add(++p)); -} - -static int -_add(str) - const char *str; -{ - for (;; ++pt, --gsize) { - if (!gsize) - return(0); - if (!(*pt = *str++)) - return(1); - } -} - -static int -ISO8601Week( t, year ) - CONST struct tm* t; - int* year; -{ - /* Find the day-of-year of the Thursday in - * the week in question. */ - - int ydayThursday; - int week; - if ( t->tm_wday == 0 ) { - ydayThursday = t->tm_yday - 3; - } else { - ydayThursday = t->tm_yday - t->tm_wday + 4; - } - - if ( ydayThursday < 0 ) { - - /* This is the last week of the previous year. */ - if ( IsLeapYear(( t->tm_year + TM_YEAR_BASE - 1 )) ) { - ydayThursday += 366; - } else { - ydayThursday += 365; - } - week = ydayThursday / 7 + 1; - if ( year != NULL ) { - *year = t->tm_year + 1899; - } - - } else if ( ( IsLeapYear(( t -> tm_year + TM_YEAR_BASE )) - && ydayThursday >= 366 ) - || ( !IsLeapYear(( t -> tm_year - + TM_YEAR_BASE )) - && ydayThursday >= 365 ) ) { - - /* This is week 1 of the following year */ - - week = 1; - if ( year != NULL ) { - *year = t->tm_year + 1901; - } - - } else { - - week = ydayThursday / 7 + 1; - if ( year != NULL ) { - *year = t->tm_year + 1900; - } - - } - - return week; - -} diff --git a/compat/string.h b/compat/string.h index 15f60fb..128b458 100644 --- a/compat/string.h +++ b/compat/string.h @@ -9,7 +9,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: string.h,v 1.4.18.1 2005/04/26 00:46:02 das Exp $ + * RCS: @(#) $Id: string.h,v 1.7 2005/05/10 18:33:53 kennykb Exp $ */ #ifndef _STRING @@ -24,9 +24,7 @@ * it exists everywhere) */ -#ifndef MAC_TCL #include <sys/types.h> -#endif #ifdef __APPLE__ extern VOID * memchr _ANSI_ARGS_((CONST VOID *s, int c, size_t n)); diff --git a/compat/strncasecmp.c b/compat/strncasecmp.c index ca2bf91..d752ba8 100644 --- a/compat/strncasecmp.c +++ b/compat/strncasecmp.c @@ -6,18 +6,18 @@ * Copyright (c) 1988-1993 The Regents of the University of California. * Copyright (c) 1995-1996 Sun Microsystems, Inc. * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. + * See the file "license.terms" for information on usage and redistribution of + * this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: strncasecmp.c,v 1.2 1998/09/14 18:39:45 stanton Exp $ + * RCS: @(#) $Id: strncasecmp.c,v 1.3 2007/04/16 13:36:34 dkf Exp $ */ #include "tclPort.h" /* - * This array is designed for mapping upper and lower case letter - * together for a case independent comparison. The mappings are - * based upon ASCII character sequences. + * This array is designed for mapping upper and lower case letter together for + * a case independent comparison. The mappings are based upon ASCII character + * sequences. */ static unsigned char charmap[] = { @@ -56,14 +56,11 @@ static unsigned char charmap[] = { }; /* - * Here are the prototypes just in case they are not included - * in tclPort.h. + * Here are the prototypes just in case they are not included in tclPort.h. */ -int strncasecmp _ANSI_ARGS_((CONST char *s1, - CONST char *s2, size_t n)); -int strcasecmp _ANSI_ARGS_((CONST char *s1, - CONST char *s2)); +int strncasecmp(CONST char *s1, CONST char *s2, size_t n); +int strcasecmp(CONST char *s1, CONST char *s2); /* *---------------------------------------------------------------------- @@ -73,9 +70,8 @@ int strcasecmp _ANSI_ARGS_((CONST char *s1, * Compares two strings, ignoring case differences. * * Results: - * Compares two null-terminated strings s1 and s2, returning -1, 0, - * or 1 if s1 is lexicographically less than, equal to, or greater - * than s2. + * Compares two null-terminated strings s1 and s2, returning -1, 0, or 1 + * if s1 is lexicographically less than, equal to, or greater than s2. * * Side effects: * None. @@ -84,9 +80,9 @@ int strcasecmp _ANSI_ARGS_((CONST char *s1, */ int -strcasecmp(s1, s2) - CONST char *s1; /* First string. */ - CONST char *s2; /* Second string. */ +strcasecmp( + CONST char *s1, /* First string. */ + CONST char *s2) /* Second string. */ { unsigned char u1, u2; @@ -108,9 +104,9 @@ strcasecmp(s1, s2) * Compares two strings, ignoring case differences. * * Results: - * Compares up to length chars of s1 and s2, returning -1, 0, or 1 - * if s1 is lexicographically less than, equal to, or greater - * than s2 over those characters. + * Compares up to length chars of s1 and s2, returning -1, 0, or 1 if s1 + * is lexicographically less than, equal to, or greater than s2 over + * those characters. * * Side effects: * None. @@ -119,10 +115,10 @@ strcasecmp(s1, s2) */ int -strncasecmp(s1, s2, length) - CONST char *s1; /* First string. */ - CONST char *s2; /* Second string. */ - size_t length; /* Maximum number of characters to compare +strncasecmp( + CONST char *s1, /* First string. */ + CONST char *s2, /* Second string. */ + size_t length) /* Maximum number of characters to compare * (stop earlier if the end of either string * is reached). */ { diff --git a/compat/strstr.c b/compat/strstr.c index d6f5cab..8679fe3 100644 --- a/compat/strstr.c +++ b/compat/strstr.c @@ -6,13 +6,13 @@ * Copyright (c) 1988-1993 The Regents of the University of California. * Copyright (c) 1994 Sun Microsystems, Inc. * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. + * See the file "license.terms" for information on usage and redistribution of + * this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: strstr.c,v 1.3.2.1 2005/04/12 18:28:56 kennykb Exp $ + * RCS: @(#) $Id: strstr.c,v 1.7 2007/04/16 13:36:34 dkf Exp $ */ -#include <tcl.h> +#include "tcl.h" #ifndef NULL #define NULL 0 #endif @@ -25,12 +25,10 @@ * Locate the first instance of a substring in a string. * * Results: - * If string contains substring, the return value is the - * location of the first matching instance of substring - * in string. If string doesn't contain substring, the - * return value is 0. Matching is done on an exact - * character-for-character basis with no wildcards or special - * characters. + * If string contains substring, the return value is the location of the + * first matching instance of substring in string. If string doesn't + * contain substring, the return value is 0. Matching is done on an exact + * character-for-character basis with no wildcards or special characters. * * Side effects: * None. @@ -39,15 +37,16 @@ */ char * -strstr(string, substring) - register char *string; /* String to search. */ - char *substring; /* Substring to try to find in string. */ +strstr( + register char *string, /* String to search. */ + char *substring) /* Substring to try to find in string. */ { register char *a, *b; - /* First scan quickly through the two strings looking for a - * single-character match. When it's found, then compare the - * rest of the substring. + /* + * First scan quickly through the two strings looking for a + * single-character match. When it's found, then compare the rest of the + * substring. */ b = substring; diff --git a/compat/strtod.c b/compat/strtod.c index 063e175..9e494b1 100644 --- a/compat/strtod.c +++ b/compat/strtod.c @@ -9,11 +9,10 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: strtod.c,v 1.6 2002/02/25 14:26:12 dgp Exp $ + * RCS: @(#) $Id: strtod.c,v 1.8 2007/04/16 13:36:34 dkf Exp $ */ #include "tclInt.h" -#include "tclPort.h" #include <ctype.h> #ifndef TRUE @@ -63,20 +62,19 @@ static double powersOf10[] = { /* Table giving binary powers of 10. Entry */ */ double -strtod(string, endPtr) - CONST char *string; /* A decimal ASCII floating-point number, - * optionally preceded by white space. - * Must have form "-I.FE-X", where I is the - * integer part of the mantissa, F is the - * fractional part of the mantissa, and X - * is the exponent. Either of the signs - * may be "+", "-", or omitted. Either I - * or F may be omitted, or both. The decimal - * point isn't necessary unless F is present. - * The "E" may actually be an "e". E and X - * may both be omitted (but not just one). - */ - char **endPtr; /* If non-NULL, store terminating character's +strtod( + CONST char *string, /* A decimal ASCII floating-point number, + * optionally preceded by white space. Must + * have form "-I.FE-X", where I is the integer + * part of the mantissa, F is the fractional + * part of the mantissa, and X is the + * exponent. Either of the signs may be "+", + * "-", or omitted. Either I or F may be + * omitted, or both. The decimal point isn't + * necessary unless F is present. The "E" may + * actually be an "e". E and X may both be + * omitted (but not just one). */ + char **endPtr) /* If non-NULL, store terminating character's * address here. */ { int sign, expSign = FALSE; @@ -85,19 +83,19 @@ strtod(string, endPtr) register int c; int exp = 0; /* Exponent read from "EX" field. */ int fracExp = 0; /* Exponent that derives from the fractional - * part. Under normal circumstatnces, it is + * part. Under normal circumstatnces, it is * the negative of the number of digits in F. * However, if I is very long, the last digits * of I get dropped (otherwise a long I with a * large negative exponent could cause an - * unnecessary overflow on I alone). In this + * unnecessary overflow on I alone). In this * case, fracExp is incremented one for each * dropped digit. */ int mantSize; /* Number of digits in mantissa. */ int decPt; /* Number of mantissa digits BEFORE decimal * point. */ - CONST char *pExp; /* Temporarily holds location of exponent - * in string. */ + CONST char *pExp; /* Temporarily holds location of exponent in + * string. */ /* * Strip off leading blanks and check for a sign. @@ -136,10 +134,10 @@ strtod(string, endPtr) } /* - * Now suck up the digits in the mantissa. Use two integers to - * collect 9 digits each (this is faster than using floating-point). - * If the mantissa has more than 18 digits, ignore the extras, since - * they can't affect the value anyway. + * Now suck up the digits in the mantissa. Use two integers to collect 9 + * digits each (this is faster than using floating-point). If the mantissa + * has more than 18 digits, ignore the extras, since they can't affect the + * value anyway. */ pExp = p; @@ -147,7 +145,7 @@ strtod(string, endPtr) if (decPt < 0) { decPt = mantSize; } else { - mantSize -= 1; /* One of the digits was the point. */ + mantSize -= 1; /* One of the digits was the point. */ } if (mantSize > 18) { fracExp = decPt - 18; @@ -161,9 +159,9 @@ strtod(string, endPtr) goto done; } else { int frac1, frac2; + frac1 = 0; - for ( ; mantSize > 9; mantSize -= 1) - { + for ( ; mantSize > 9; mantSize -= 1) { c = *p; p += 1; if (c == '.') { @@ -173,8 +171,7 @@ strtod(string, endPtr) frac1 = 10*frac1 + (c - '0'); } frac2 = 0; - for (; mantSize > 0; mantSize -= 1) - { + for (; mantSize > 0; mantSize -= 1) { c = *p; p += 1; if (c == '.') { @@ -218,10 +215,9 @@ strtod(string, endPtr) } /* - * Generate a floating-point number that represents the exponent. - * Do this by processing the exponent one bit at a time to combine - * many powers of 2 of 10. Then combine the exponent with the - * fraction. + * Generate a floating-point number that represents the exponent. Do this + * by processing the exponent one bit at a time to combine many powers of + * 2 of 10. Then combine the exponent with the fraction. */ if (exp < 0) { @@ -246,7 +242,7 @@ strtod(string, endPtr) fraction *= dblExp; } -done: + done: if (endPtr != NULL) { *endPtr = (char *) p; } diff --git a/compat/strtol.c b/compat/strtol.c index 78b0d59..3779597 100644 --- a/compat/strtol.c +++ b/compat/strtol.c @@ -6,16 +6,14 @@ * Copyright (c) 1988 The Regents of the University of California. * Copyright (c) 1994 Sun Microsystems, Inc. * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. + * See the file "license.terms" for information on usage and redistribution of + * this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: strtol.c,v 1.4 2002/02/25 16:23:26 dgp Exp $ + * RCS: @(#) $Id: strtol.c,v 1.6 2007/04/16 13:36:34 dkf Exp $ */ #include <ctype.h> #include "tclInt.h" -#include "tclPort.h" - /* *---------------------------------------------------------------------- @@ -25,11 +23,10 @@ * Convert an ASCII string into an integer. * * Results: - * The return value is the integer equivalent of string. If endPtr - * is non-NULL, then *endPtr is filled in with the character - * after the last one that was part of the integer. If string - * doesn't contain a valid integer value, then zero is returned - * and *endPtr is set to string. + * The return value is the integer equivalent of string. If endPtr is + * non-NULL, then *endPtr is filled in with the character after the last + * one that was part of the integer. If string doesn't contain a valid + * integer value, then zero is returned and *endPtr is set to string. * * Side effects: * None. @@ -38,20 +35,18 @@ */ long int -strtol(string, endPtr, base) - CONST char *string; /* String of ASCII digits, possibly - * preceded by white space. For bases - * greater than 10, either lower- or - * upper-case digits may be used. - */ - char **endPtr; /* Where to store address of terminating +strtol( + CONST char *string, /* String of ASCII digits, possibly preceded + * by white space. For bases greater than 10, + * either lower- or upper-case digits may be + * used. */ + char **endPtr, /* Where to store address of terminating * character, or NULL. */ - int base; /* Base for conversion. Must be less - * than 37. If 0, then the base is chosen - * from the leading characters of string: - * "0x" means hex, "0" means octal, anything - * else means decimal. - */ + int base) /* Base for conversion. Must be less than 37. + * If 0, then the base is chosen from the + * leading characters of string: "0x" means + * hex, "0" means octal, anything else means + * decimal. */ { register CONST char *p; long result; diff --git a/compat/strtoll.c b/compat/strtoll.c deleted file mode 100644 index ca00fd0..0000000 --- a/compat/strtoll.c +++ /dev/null @@ -1,111 +0,0 @@ -/* - * strtoll.c -- - * - * Source code for the "strtoll" library procedure. - * - * Copyright (c) 1988 The Regents of the University of California. - * Copyright (c) 1994 Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: strtoll.c,v 1.5 2002/02/24 02:53:25 dgp Exp $ - */ - -#include "tcl.h" -#include "tclPort.h" -#include <ctype.h> - -#define TCL_WIDEINT_MAX (((Tcl_WideUInt)Tcl_LongAsWide(-1))>>1) - - -/* - *---------------------------------------------------------------------- - * - * strtoll -- - * - * Convert an ASCII string into an integer. - * - * Results: - * The return value is the integer equivalent of string. If endPtr - * is non-NULL, then *endPtr is filled in with the character - * after the last one that was part of the integer. If string - * doesn't contain a valid integer value, then zero is returned - * and *endPtr is set to string. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -#if TCL_WIDE_INT_IS_LONG -long long -#else -Tcl_WideInt -#endif -strtoll(string, endPtr, base) - CONST char *string; /* String of ASCII digits, possibly - * preceded by white space. For bases - * greater than 10, either lower- or - * upper-case digits may be used. - */ - char **endPtr; /* Where to store address of terminating - * character, or NULL. */ - int base; /* Base for conversion. Must be less - * than 37. If 0, then the base is chosen - * from the leading characters of string: - * "0x" means hex, "0" means octal, anything - * else means decimal. - */ -{ - register CONST char *p; - Tcl_WideInt result = Tcl_LongAsWide(0); - Tcl_WideUInt uwResult; - - /* - * Skip any leading blanks. - */ - - p = string; - while (isspace(UCHAR(*p))) { - p += 1; - } - - /* - * Check for a sign. - */ - - errno = 0; - if (*p == '-') { - p += 1; - uwResult = strtoull(p, endPtr, base); - if (errno != ERANGE) { - if (uwResult > TCL_WIDEINT_MAX+1) { - errno = ERANGE; - return Tcl_LongAsWide(-1); - } else if (uwResult > TCL_WIDEINT_MAX) { - return ~((Tcl_WideInt)TCL_WIDEINT_MAX); - } else { - result = -((Tcl_WideInt) uwResult); - } - } - } else { - if (*p == '+') { - p += 1; - } - uwResult = strtoull(p, endPtr, base); - if (errno != ERANGE) { - if (uwResult > TCL_WIDEINT_MAX) { - errno = ERANGE; - return Tcl_LongAsWide(-1); - } else { - result = uwResult; - } - } - } - if ((result == 0) && (endPtr != 0) && (*endPtr == p)) { - *endPtr = (char *) string; - } - return result; -} diff --git a/compat/strtoul.c b/compat/strtoul.c index 912e252..64f95a6 100644 --- a/compat/strtoul.c +++ b/compat/strtoul.c @@ -6,19 +6,18 @@ * Copyright (c) 1988 The Regents of the University of California. * Copyright (c) 1994 Sun Microsystems, Inc. * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. + * See the file "license.terms" for information on usage and redistribution of + * this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: strtoul.c,v 1.5 2002/02/25 10:36:32 dkf Exp $ + * RCS: @(#) $Id: strtoul.c,v 1.7 2007/04/16 13:36:34 dkf Exp $ */ #include "tclInt.h" -#include "tclPort.h" /* - * The table below is used to convert from ASCII digits to a - * numerical equivalent. It maps from '0' through 'z' to integers - * (100 for non-digit characters). + * The table below is used to convert from ASCII digits to a numerical + * equivalent. It maps from '0' through 'z' to integers (100 for non-digit + * characters). */ static char cvtIn[] = { @@ -40,11 +39,10 @@ static char cvtIn[] = { * Convert an ASCII string into an integer. * * Results: - * The return value is the integer equivalent of string. If endPtr - * is non-NULL, then *endPtr is filled in with the character - * after the last one that was part of the integer. If string - * doesn't contain a valid integer value, then zero is returned - * and *endPtr is set to string. + * The return value is the integer equivalent of string. If endPtr is + * non-NULL, then *endPtr is filled in with the character after the last + * one that was part of the integer. If string doesn't contain a valid + * integer value, then zero is returned and *endPtr is set to string. * * Side effects: * None. @@ -53,20 +51,18 @@ static char cvtIn[] = { */ unsigned long int -strtoul(string, endPtr, base) - CONST char *string; /* String of ASCII digits, possibly - * preceded by white space. For bases - * greater than 10, either lower- or - * upper-case digits may be used. - */ - char **endPtr; /* Where to store address of terminating +strtoul( + CONST char *string, /* String of ASCII digits, possibly preceded + * by white space. For bases greater than 10, + * either lower- or upper-case digits may be + * used. */ + char **endPtr, /* Where to store address of terminating * character, or NULL. */ - int base; /* Base for conversion. Must be less - * than 37. If 0, then the base is chosen - * from the leading characters of string: - * "0x" means hex, "0" means octal, anything - * else means decimal. - */ + int base) /* Base for conversion. Must be less than 37. + * If 0, then the base is chosen from the + * leading characters of string: "0x" means + * hex, "0" means octal, anything else means + * decimal. */ { register CONST char *p; register unsigned long int result = 0; @@ -93,31 +89,29 @@ strtoul(string, endPtr, base) } /* - * If no base was provided, pick one from the leading characters - * of the string. + * If no base was provided, pick one from the leading characters of the + * string. */ - if (base == 0) - { + if (base == 0) { if (*p == '0') { p += 1; if ((*p == 'x') || (*p == 'X')) { p += 1; base = 16; } else { - /* - * Must set anyDigits here, otherwise "0" produces a - * "no digits" error. + * Must set anyDigits here, otherwise "0" produces a "no + * digits" error. */ anyDigits = 1; base = 8; } + } else { + base = 10; } - else base = 10; } else if (base == 16) { - /* * Skip a leading "0x" from hex numbers. */ @@ -128,12 +122,13 @@ strtoul(string, endPtr, base) } /* - * Sorry this code is so messy, but speed seems important. Do - * different things for base 8, 10, 16, and other. + * Sorry this code is so messy, but speed seems important. Do different + * things for base 8, 10, 16, and other. */ if (base == 8) { unsigned long maxres = ULONG_MAX >> 3; + for ( ; ; p += 1) { digit = *p - '0'; if (digit > 7) { @@ -147,6 +142,7 @@ strtoul(string, endPtr, base) } } else if (base == 10) { unsigned long maxres = ULONG_MAX / 10; + for ( ; ; p += 1) { digit = *p - '0'; if (digit > 9) { @@ -160,6 +156,7 @@ strtoul(string, endPtr, base) } } else if (base == 16) { unsigned long maxres = ULONG_MAX >> 4; + for ( ; ; p += 1) { digit = *p - '0'; if (digit > ('z' - '0')) { @@ -175,8 +172,9 @@ strtoul(string, endPtr, base) result += digit; anyDigits = 1; } - } else if ( base >= 2 && base <= 36 ) { + } else if (base >= 2 && base <= 36) { unsigned long maxres = ULONG_MAX / base; + for ( ; ; p += 1) { digit = *p - '0'; if (digit > ('z' - '0')) { diff --git a/compat/strtoull.c b/compat/strtoull.c deleted file mode 100644 index 00eca3c..0000000 --- a/compat/strtoull.c +++ /dev/null @@ -1,261 +0,0 @@ -/* - * strtoull.c -- - * - * Source code for the "strtoull" library procedure. - * - * Copyright (c) 1988 The Regents of the University of California. - * Copyright (c) 1994 Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: strtoull.c,v 1.5 2002/02/24 02:53:25 dgp Exp $ - */ - -#include "tcl.h" -#include "tclPort.h" -#include <ctype.h> - -/* - * The table below is used to convert from ASCII digits to a - * numerical equivalent. It maps from '0' through 'z' to integers - * (100 for non-digit characters). - */ - -static char cvtIn[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, /* '0' - '9' */ - 100, 100, 100, 100, 100, 100, 100, /* punctuation */ - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, /* 'A' - 'Z' */ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, - 100, 100, 100, 100, 100, 100, /* punctuation */ - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, /* 'a' - 'z' */ - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35}; - - -/* - *---------------------------------------------------------------------- - * - * strtoull -- - * - * Convert an ASCII string into an integer. - * - * Results: - * The return value is the integer equivalent of string. If endPtr - * is non-NULL, then *endPtr is filled in with the character - * after the last one that was part of the integer. If string - * doesn't contain a valid integer value, then zero is returned - * and *endPtr is set to string. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -#if TCL_WIDE_INT_IS_LONG -unsigned long long -#else -Tcl_WideUInt -#endif -strtoull(string, endPtr, base) - CONST char *string; /* String of ASCII digits, possibly - * preceded by white space. For bases - * greater than 10, either lower- or - * upper-case digits may be used. - */ - char **endPtr; /* Where to store address of terminating - * character, or NULL. */ - int base; /* Base for conversion. Must be less - * than 37. If 0, then the base is chosen - * from the leading characters of string: - * "0x" means hex, "0" means octal, anything - * else means decimal. - */ -{ - register CONST char *p; - register Tcl_WideUInt result = 0; - register unsigned digit; - register Tcl_WideUInt shifted; - int anyDigits = 0, negative = 0; - - /* - * Skip any leading blanks. - */ - - p = string; - while (isspace(UCHAR(*p))) { /* INTL: locale-dependent */ - p += 1; - } - - /* - * Check for a sign. - */ - - if (*p == '-') { - p += 1; - negative = 1; - } else { - if (*p == '+') { - p += 1; - } - } - - /* - * If no base was provided, pick one from the leading characters - * of the string. - */ - - if (base == 0) { - if (*p == '0') { - p += 1; - if (*p == 'x' || *p == 'X') { - p += 1; - base = 16; - } else { - - /* - * Must set anyDigits here, otherwise "0" produces a - * "no digits" error. - */ - - anyDigits = 1; - base = 8; - } - } else { - base = 10; - } - } else if (base == 16) { - - /* - * Skip a leading "0x" from hex numbers. - */ - - if ((p[0] == '0') && (p[1] == 'x' || *p == 'X')) { - p += 2; - } - } - - /* - * Sorry this code is so messy, but speed seems important. Do - * different things for base 8, 10, 16, and other. - */ - - if (base == 8) { - for ( ; ; p += 1) { - digit = *p - '0'; - if (digit > 7) { - break; - } - shifted = result << 3; - if ((shifted >> 3) != result) { - goto overflow; - } - result = shifted + digit; - if ( result < shifted ) { - goto overflow; - } - anyDigits = 1; - } - } else if (base == 10) { - for ( ; ; p += 1) { - digit = *p - '0'; - if (digit > 9) { - break; - } - shifted = 10 * result; - if ((shifted / 10) != result) { - goto overflow; - } - result = shifted + digit; - if ( result < shifted ) { - goto overflow; - } - anyDigits = 1; - } - } else if (base == 16) { - for ( ; ; p += 1) { - digit = *p - '0'; - if (digit > ('z' - '0')) { - break; - } - digit = cvtIn[digit]; - if (digit > 15) { - break; - } - shifted = result << 4; - if ((shifted >> 4) != result) { - goto overflow; - } - result = shifted + digit; - if ( result < shifted ) { - goto overflow; - } - anyDigits = 1; - } - } else if ( base >= 2 && base <= 36 ) { - for ( ; ; p += 1) { - digit = *p - '0'; - if (digit > ('z' - '0')) { - break; - } - digit = cvtIn[digit]; - if (digit >= (unsigned) base) { - break; - } - shifted = result * base; - if ((shifted/base) != result) { - goto overflow; - } - result = shifted + digit; - if ( result < shifted ) { - goto overflow; - } - anyDigits = 1; - } - } - - /* - * Negate if we found a '-' earlier. - */ - - if (negative) { - result = (Tcl_WideUInt)(-((Tcl_WideInt)result)); - } - - /* - * See if there were any digits at all. - */ - - if (!anyDigits) { - p = string; - } - - if (endPtr != 0) { - *endPtr = (char *) p; - } - - return result; - - /* - * On overflow generate the right output - */ - - overflow: - errno = ERANGE; - if (endPtr != 0) { - for ( ; ; p += 1) { - digit = *p - '0'; - if (digit > ('z' - '0')) { - break; - } - digit = cvtIn[digit]; - if (digit >= (unsigned) base) { - break; - } - } - *endPtr = (char *) p; - } - return (Tcl_WideUInt)Tcl_LongAsWide(-1); -} diff --git a/compat/tclErrno.h b/compat/tclErrno.h deleted file mode 100644 index bcbc984..0000000 --- a/compat/tclErrno.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - * tclErrno.h -- - * - * This header file contains the various POSIX errno definitions that - * are used by Tcl. This file is derived from the spec POSIX 2.4 and - * previous implementations for Berkeley UNIX. - * - * Copyright (c) 1982, 1986, 1989 Regents of the University of California. - * Copyright (c) 1996 Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tclErrno.h,v 1.3 2002/06/07 08:50:22 dkf Exp $ - */ - -extern int errno; /* global error number */ - -#define EPERM 1 /* Operation not permitted */ -#define ENOENT 2 /* No such file or directory */ -#define ESRCH 3 /* No such process */ -#define EINTR 4 /* Interrupted system call */ -#define EIO 5 /* Input/output error */ -#define ENXIO 6 /* Device not configured */ -#define E2BIG 7 /* Argument list too long */ -#define ENOEXEC 8 /* Exec format error */ -#define EBADF 9 /* Bad file descriptor */ -#define ECHILD 10 /* No child processes */ -#define EDEADLK 11 /* Resource deadlock avoided */ - /* 11 was EAGAIN */ -#define ENOMEM 12 /* Cannot allocate memory */ -#define EACCES 13 /* Permission denied */ -#define EFAULT 14 /* Bad address */ -#define ENOTBLK 15 /* Block device required */ -#define EBUSY 16 /* Device busy */ -#define EEXIST 17 /* File exists */ -#define EXDEV 18 /* Cross-device link */ -#define ENODEV 19 /* Operation not supported by device */ -#define ENOTDIR 20 /* Not a directory */ -#define EISDIR 21 /* Is a directory */ -#define EINVAL 22 /* Invalid argument */ -#define ENFILE 23 /* Too many open files in system */ -#define EMFILE 24 /* Too many open files */ -#define ENOTTY 25 /* Inappropriate ioctl for device */ -#define ETXTBSY 26 /* Text file busy */ -#define EFBIG 27 /* File too large */ -#define ENOSPC 28 /* No space left on device */ -#define ESPIPE 29 /* Illegal seek */ -#define EROFS 30 /* Read-only file system */ -#define EMLINK 31 /* Too many links */ -#define EPIPE 32 /* Broken pipe */ -#define EDOM 33 /* Numerical argument out of domain */ -#define ERANGE 34 /* Result too large */ -#define EAGAIN 35 /* Resource temporarily unavailable */ -#define EWOULDBLOCK EAGAIN /* Operation would block */ -#define EINPROGRESS 36 /* Operation now in progress */ -#define EALREADY 37 /* Operation already in progress */ -#define ENOTSOCK 38 /* Socket operation on non-socket */ -#define EDESTADDRREQ 39 /* Destination address required */ -#define EMSGSIZE 40 /* Message too long */ -#define EPROTOTYPE 41 /* Protocol wrong type for socket */ -#define ENOPROTOOPT 42 /* Protocol not available */ -#define EPROTONOSUPPORT 43 /* Protocol not supported */ -#define ESOCKTNOSUPPORT 44 /* Socket type not supported */ -#define EOPNOTSUPP 45 /* Operation not supported on socket */ -#define EPFNOSUPPORT 46 /* Protocol family not supported */ -#define EAFNOSUPPORT 47 /* Address family not supported by protocol family */ -#define EADDRINUSE 48 /* Address already in use */ -#define EADDRNOTAVAIL 49 /* Can't assign requested address */ -#define ENETDOWN 50 /* Network is down */ -#define ENETUNREACH 51 /* Network is unreachable */ -#define ENETRESET 52 /* Network dropped connection on reset */ -#define ECONNABORTED 53 /* Software caused connection abort */ -#define ECONNRESET 54 /* Connection reset by peer */ -#define ENOBUFS 55 /* No buffer space available */ -#define EISCONN 56 /* Socket is already connected */ -#define ENOTCONN 57 /* Socket is not connected */ -#define ESHUTDOWN 58 /* Can't send after socket shutdown */ -#define ETOOMANYREFS 59 /* Too many references: can't splice */ -#define ETIMEDOUT 60 /* Connection timed out */ -#define ECONNREFUSED 61 /* Connection refused */ -#define ELOOP 62 /* Too many levels of symbolic links */ -#define ENAMETOOLONG 63 /* File name too long */ -#define EHOSTDOWN 64 /* Host is down */ -#define EHOSTUNREACH 65 /* No route to host */ -#define ENOTEMPTY 66 /* Directory not empty */ -#define EPROCLIM 67 /* Too many processes */ -#define EUSERS 68 /* Too many users */ -#define EDQUOT 69 /* Disc quota exceeded */ -#define ESTALE 70 /* Stale NFS file handle */ -#define EREMOTE 71 /* Too many levels of remote in path */ -#define EBADRPC 72 /* RPC struct is bad */ -#define ERPCMISMATCH 73 /* RPC version wrong */ -#define EPROGUNAVAIL 74 /* RPC prog. not avail */ -#define EPROGMISMATCH 75 /* Program version wrong */ -#define EPROCUNAVAIL 76 /* Bad procedure for program */ -#define ENOLCK 77 /* No locks available */ -#define ENOSYS 78 /* Function not implemented */ -#define EOVERFLOW 79 /* Value too large to be stored in data type */ diff --git a/compat/tmpnam.c b/compat/tmpnam.c deleted file mode 100644 index 89bfc6a..0000000 --- a/compat/tmpnam.c +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 1988 Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms are permitted - * provided that this notice is preserved and that due credit is given - * to the University of California at Berkeley. The name of the University - * may not be used to endorse or promote products derived from this - * software without specific written prior permission. This software - * is provided ``as is'' without express or implied warranty. - * - * RCS: @(#) $Id: tmpnam.c,v 1.2 1998/09/14 18:39:45 stanton Exp $ - */ - -#include <sys/param.h> -#include <sys/stat.h> -#include <sys/file.h> -#include <stdio.h> - -/* - * Use /tmp instead of /usr/tmp, because L_tmpname is only 14 chars - * on some machines (like NeXT machines) and /usr/tmp will cause - * buffer overflows. - */ - -#ifdef P_tmpdir -# undef P_tmpdir -#endif -#define P_tmpdir "/tmp" - -char * -tmpnam(s) - char *s; -{ - static char name[50]; - char *mktemp(); - - if (!s) - s = name; - (void)sprintf(s, "%s/XXXXXX", P_tmpdir); - return(mktemp(s)); -} diff --git a/compat/waitpid.c b/compat/waitpid.c index 00113cf..0e9e6d6 100644 --- a/compat/waitpid.c +++ b/compat/waitpid.c @@ -1,21 +1,19 @@ /* * waitpid.c -- * - * This procedure emulates the POSIX waitpid kernel call on - * BSD systems that don't have waitpid but do have wait3. - * This code is based on a prototype version written by - * Mark Diekhans and Karl Lehenbauer. + * This procedure emulates the POSIX waitpid kernel call on BSD systems + * that don't have waitpid but do have wait3. This code is based on a + * prototype version written by Mark Diekhans and Karl Lehenbauer. * * Copyright (c) 1993 The Regents of the University of California. * Copyright (c) 1994 Sun Microsystems, Inc. * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. + * See the file "license.terms" for information on usage and redistribution of + * this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: waitpid.c,v 1.3 2000/01/11 22:08:50 hobbs Exp $ + * RCS: @(#) $Id: waitpid.c,v 1.5 2007/04/16 13:36:35 dkf Exp $ */ -#include "tclInt.h" #include "tclPort.h" #ifndef pid_t @@ -23,40 +21,37 @@ #endif /* - * A linked list of the following structures is used to keep track - * of processes for which we received notification from the kernel, - * but the application hasn't waited for them yet (this can happen - * because wait may not return the process we really want). We - * save the information here until the application finally does - * wait for the process. + * A linked list of the following structures is used to keep track of + * processes for which we received notification from the kernel, but the + * application hasn't waited for them yet (this can happen because wait may + * not return the process we really want). We save the information here until + * the application finally does wait for the process. */ typedef struct WaitInfo { - pid_t pid; /* Pid of process that exited. */ - WAIT_STATUS_TYPE status; /* Status returned when child exited - * or suspended. */ - struct WaitInfo *nextPtr; /* Next in list of exited processes. */ + pid_t pid; /* Pid of process that exited. */ + WAIT_STATUS_TYPE status; /* Status returned when child exited or + * suspended. */ + struct WaitInfo *nextPtr; /* Next in list of exited processes. */ } WaitInfo; -static WaitInfo *deadList = NULL; /* First in list of all dead - * processes. */ +static WaitInfo *deadList = NULL; + /* First in list of all dead processes. */ /* *---------------------------------------------------------------------- * * waitpid -- * - * This procedure emulates the functionality of the POSIX - * waitpid kernel call, using the BSD wait3 kernel call. - * Note: it doesn't emulate absolutely all of the waitpid - * functionality, in that it doesn't support pid's of 0 - * or < -1. + * This procedure emulates the functionality of the POSIX waitpid kernel + * call, using the BSD wait3 kernel call. Note: it doesn't emulate + * absolutely all of the waitpid functionality, in that it doesn't + * support pid's of 0 or < -1. * * Results: - * -1 is returned if there is an error in the wait kernel call. - * Otherwise the pid of an exited or suspended process is - * returned and *statusPtr is set to the status value of the - * process. + * -1 is returned if there is an error in the wait kernel call. Otherwise + * the pid of an exited or suspended process is returned and *statusPtr + * is set to the status value of the process. * * Side effects: * None. @@ -69,12 +64,12 @@ static WaitInfo *deadList = NULL; /* First in list of all dead #endif pid_t -waitpid(pid, statusPtr, options) - pid_t pid; /* The pid to wait on. Must be -1 or - * greater than zero. */ - int *statusPtr; /* Where to store wait status for the +waitpid( + pid_t pid, /* The pid to wait on. Must be -1 or greater + * than zero. */ + int *statusPtr, /* Where to store wait status for the * process. */ - int options; /* OR'ed combination of WNOHANG and + int options) /* OR'ed combination of WNOHANG and * WUNTRACED. */ { register WaitInfo *waitPtr, *prevPtr; @@ -87,9 +82,9 @@ waitpid(pid, statusPtr, options) } /* - * See if there's a suitable process that has already stopped or - * exited. If so, remove it from the list of exited processes and - * return its information. + * See if there's a suitable process that has already stopped or exited. + * If so, remove it from the list of exited processes and return its + * information. */ for (waitPtr = deadList, prevPtr = NULL; waitPtr != NULL; @@ -112,12 +107,12 @@ waitpid(pid, statusPtr, options) } /* - * Wait for any process to stop or exit. If it's an acceptable one - * then return it to the caller; otherwise store information about it - * in the list of exited processes and try again. On systems that - * have only wait but not wait3, there are several situations we can't - * handle, but we do the best we can (e.g. can still handle some - * combinations of options by invoking wait instead of wait3). + * Wait for any process to stop or exit. If it's an acceptable one then + * return it to the caller; otherwise store information about it in the + * list of exited processes and try again. On systems that have only wait + * but not wait3, there are several situations we can't handle, but we do + * the best we can (e.g. can still handle some combinations of options by + * invoking wait instead of wait3). */ while (1) { @@ -150,13 +145,13 @@ waitpid(pid, statusPtr, options) return result; /* - * Can't return this info to caller. Save it in the list of - * stopped or exited processes. Tricky point: first check for - * an existing entry for the process and overwrite it if it - * exists (e.g. a previously stopped process might now be dead). + * Can't return this info to caller. Save it in the list of stopped or + * exited processes. Tricky point: first check for an existing entry + * for the process and overwrite it if it exists (e.g. a previously + * stopped process might now be dead). */ - saveInfo: + saveInfo: for (waitPtr = deadList; waitPtr != NULL; waitPtr = waitPtr->nextPtr) { if (waitPtr->pid == result) { waitPtr->status = status; @@ -169,6 +164,7 @@ waitpid(pid, statusPtr, options) waitPtr->nextPtr = deadList; deadList = waitPtr; - waitAgain: continue; + waitAgain: + continue; } } |