diff options
author | Andi Gutmans <andi@php.net> | 2000-02-19 19:51:47 +0000 |
---|---|---|
committer | Andi Gutmans <andi@php.net> | 2000-02-19 19:51:47 +0000 |
commit | 4f8ae75f4ff028e95a35511fb70caeb9a0419c6f (patch) | |
tree | 90c601aece6efdf3fb1ad74a057c16bde7f32a1f | |
parent | ceba50b6edc03128c29dfa96bfcb93d299654710 (diff) | |
download | php-git-4f8ae75f4ff028e95a35511fb70caeb9a0419c6f.tar.gz |
- Add two missing files
-rw-r--r-- | ext/mysql/libmysql/strto.c | 187 | ||||
-rw-r--r-- | ext/mysql/libmysql/thr_alarm.h | 79 |
2 files changed, 266 insertions, 0 deletions
diff --git a/ext/mysql/libmysql/strto.c b/ext/mysql/libmysql/strto.c new file mode 100644 index 0000000000..a2acd9c786 --- /dev/null +++ b/ext/mysql/libmysql/strto.c @@ -0,0 +1,187 @@ +/* + strtol,strtoul,strtoll,strtoull + convert string to long, unsigned long, long long or unsigned long long. + strtoxx(char *src,char **ptr,int base) + converts the string pointed to by src to an long of appropriate long and + returnes it. It skips leading spaces and tabs (but not newlines, formfeeds, + backspaces), then it accepts an optional sign and a sequence of digits + in the specified radix. + If the value of ptr is not (char **)NULL, a pointer to the character + terminating the scan is returned in the location pointed to by ptr. + Trailing spaces will NOT be skipped. + + If an error is detected, the result will be LONG_MIN, 0 or LONG_MAX, + (or LONGLONG..) and errno will be set to + EDOM if there are no digits + ERANGE if the result would overflow. + the ptr will be set to src. + This file is based on the strtol from the the GNU C Library. + it can be compiled with the UNSIGNED and/or LONGLONG flag set +*/ + +#include <global.h> +#include "m_string.h" +#include "m_ctype.h" +#include "my_sys.h" /* defines errno */ +#include <errno.h> + +#ifdef LONGLONG +#define UTYPE_MAX (~(ulonglong) 0) +#define TYPE_MIN LONGLONG_MIN +#define TYPE_MAX LONGLONG_MAX +#define longtype longlong +#define ulongtype ulonglong +#ifdef UNSIGNED +#define function ulongtype strtoull +#else +#define function longtype strtoll +#endif +#else +#define UTYPE_MAX (ulong) ~0L +#define TYPE_MIN LONG_MIN +#define TYPE_MAX LONG_MAX +#define longtype long +#define ulongtype unsigned long +#ifdef UNSIGNED +#define function ulongtype strtoul +#else +#define function longtype strtol +#endif +#endif + + +/* Convert NPTR to an `unsigned long int' or `long int' in base BASE. + If BASE is 0 the base is determined by the presence of a leading + zero, indicating octal or a leading "0x" or "0X", indicating hexadecimal. + If BASE is < 2 or > 36, it is reset to 10. + If ENDPTR is not NULL, a pointer to the character after the last + one converted is stored in *ENDPTR. */ + + +function (const char *nptr,char **endptr,int base) +{ + int negative; + register ulongtype cutoff; + register unsigned int cutlim; + register ulongtype i; + register const char *s; + register unsigned char c; + const char *save; + int overflow; + + if (base < 0 || base == 1 || base > 36) + base = 10; + + s = nptr; + + /* Skip white space. */ + while (isspace (*s)) + ++s; + if (*s == '\0') + { + goto noconv; + } + + /* Check for a sign. */ + if (*s == '-') + { + negative = 1; + ++s; + } + else if (*s == '+') + { + negative = 0; + ++s; + } + else + negative = 0; + + if (base == 16 && s[0] == '0' && toupper (s[1]) == 'X') + s += 2; + + /* If BASE is zero, figure it out ourselves. */ + if (base == 0) + { + if (*s == '0') + { + if (toupper (s[1]) == 'X') + { + s += 2; + base = 16; + } + else + base = 8; + } + else + base = 10; + } + + /* Save the pointer so we can check later if anything happened. */ + save = s; + + cutoff = UTYPE_MAX / (unsigned long int) base; + cutlim = (uint) (UTYPE_MAX % (unsigned long int) base); + + overflow = 0; + i = 0; + for (c = *s; c != '\0'; c = *++s) + { + if (isdigit (c)) + c -= '0'; + else if (isalpha (c)) + c = toupper (c) - 'A' + 10; + else + break; + if (c >= base) + break; + /* Check for overflow. */ + if (i > cutoff || (i == cutoff && c > cutlim)) + overflow = 1; + else + { + i *= (ulongtype) base; + i += c; + } + } + + /* Check if anything actually happened. */ + if (s == save) + goto noconv; + + /* Store in ENDPTR the address of one character + past the last character we converted. */ + if (endptr != NULL) + *endptr = (char *) s; + +#ifndef UNSIGNED + /* Check for a value that is within the range of + `unsigned long int', but outside the range of `long int'. */ + if (negative) + { + if (i > (ulongtype) TYPE_MIN) + overflow = 1; + } + else if (i > (ulongtype) TYPE_MAX) + overflow = 1; +#endif + + if (overflow) + { + my_errno=ERANGE; +#ifdef UNSIGNED + return UTYPE_MAX; +#else + return negative ? TYPE_MIN : TYPE_MAX; +#endif + } + + /* Return the result of the appropriate sign. */ + return (negative ? -((longtype) i) : i); + +noconv: + /* There was no number to convert. */ + my_errno=EDOM; + if (endptr != NULL) + *endptr = (char *) nptr; + return 0L; +} diff --git a/ext/mysql/libmysql/thr_alarm.h b/ext/mysql/libmysql/thr_alarm.h new file mode 100644 index 0000000000..b2c599f697 --- /dev/null +++ b/ext/mysql/libmysql/thr_alarm.h @@ -0,0 +1,79 @@ +/* Copyright Abandoned 1996 TCX DataKonsult AB & Monty Program KB & Detron HB + This file is public domain and comes with NO WARRANTY of any kind */ + +/* Prototypes when using thr_alarm library functions */ + +#ifndef _thr_alarm_h +#define _thr_alarm_h +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef USE_ALARM_THREAD +#define USE_ONE_SIGNAL_HAND /* One must call process_alarm */ +#endif +#ifdef HAVE_LINUXTHREADS +#define THR_CLIENT_ALARM SIGALRM +#else +#define THR_CLIENT_ALARM SIGUSR1 +#endif +#ifdef HAVE_rts_threads +#undef USE_ONE_SIGNAL_HAND +#define USE_ALARM_THREAD +#define THR_SERVER_ALARM SIGUSR1 +#else +#define THR_SERVER_ALARM SIGALRM +#endif + +#ifdef DONT_USE_THR_ALARM + +#define USE_ALARM_THREAD +#undef USE_ONE_SIGNAL_HAND + +typedef struct st_win_timer +{ + uint crono; +} thr_alarm_t; + +#define thr_alarm_init(A) (A)->crono=0 +#define thr_alarm_in_use(A) (A).crono +#define init_thr_alarm(A) +#define thr_alarm_kill(A) +#define end_thr_alarm() +#define thr_alarm(A,B) (((A)->crono=1)-1) +#define thr_got_alarm(A) (A).crono +#define thr_end_alarm(A) + +#else + +#ifdef __WIN32__ +typedef struct st_win_timer +{ + uint crono; +} thr_alarm_t; + +bool thr_got_alarm(thr_alarm_t *alrm); +#define thr_alarm_init(A) (A)->crono=0 +#define thr_alarm_in_use(A) (A)->crono +#define init_thr_alarm(A) +#define thr_alarm_kill(A) +#else + +typedef int* thr_alarm_t; +#define thr_got_alarm(thr_alarm) (*thr_alarm) +#define thr_alarm_init(A) (*A)=0 +#define thr_alarm_in_use(A) ((A) != 0) +void init_thr_alarm(uint max_alarm); +void thr_alarm_kill(pthread_t thread_id); +sig_handler process_alarm(int); +#endif /* __WIN32__ */ + +bool thr_alarm(thr_alarm_t *alarmed,uint sec); +void thr_end_alarm(thr_alarm_t *alarmed); +void end_thr_alarm(void); +#endif /* DONT_USE_THR_ALARM */ + +#ifdef __cplusplus +} +#endif +#endif |