12#if defined __MINGW32__ || defined __MINGW64__
13#define MINGW_HAS_SECURE_API 1
31#define hexdigit ruby_hexdigits
36 register const char *s = start;
37 register unsigned long retval = 0;
40 for (
i = 0;
i <
len;
i++) {
41 if ((s[0] <
'0') || (
'7' < s[0])) {
47 *retlen = (
int)(s - start);
54 register const char *s = start;
55 register unsigned long retval = 0;
59 for (
i = 0;
i <
len;
i++) {
71 *retlen = (
int)(s - start);
77 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
78 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
79 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
80 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1,
81 -1,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,
82 25,26,27,28,29,30,31,32,33,34,35,-1,-1,-1,-1,-1,
83 -1,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,
84 25,26,27,28,29,30,31,32,33,34,35,-1,-1,-1,-1,-1,
85 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
86 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
87 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
88 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
89 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
90 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
91 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
92 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
100 const char *start =
str;
101 unsigned long ret = 0, x;
102 unsigned long mul_overflow = (~(
unsigned long)0) / base;
113 if (d == -1 || base <= d) {
117 if (mul_overflow < ret)
124 }
while (
len < 0 || --
len);
125 *retlen =
str - start;
136 const char *subject_found =
str;
138 if (base == 1 || 36 < base) {
156 subject_found =
str+1;
157 if (base == 0 || base == 16) {
158 if (
str[1] ==
'x' ||
str[1] ==
'X') {
163 b = base == 0 ? 8 : 16;
173 b = base == 0 ? 10 : base;
182 *endptr = (
char*)subject_found;
190 ret = (
unsigned long)(-(
long)ret);
198#include <sys/types.h>
203#if defined(HAVE_FCNTL_H)
208# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
213#if defined HAVE_QSORT_S && defined RUBY_MSVCRT_VERSION
217# define qsort_r(base, nel, size, arg, cmp) qsort_s(base, nel, size, cmp, arg)
218# define cmp_bsd_qsort cmp_ms_qsort
219# define HAVE_BSD_QSORT_R 1
222#if defined HAVE_BSD_QSORT_R
223struct bsd_qsort_r_args {
229cmp_bsd_qsort(
void *d,
const void *a,
const void *b)
231 const struct bsd_qsort_r_args *args = d;
232 return (*args->cmp)(a, b, args->arg);
238 struct bsd_qsort_r_args args;
243#elif defined HAVE_QSORT_S
249 if (!nel || !
size)
return;
252 if (!base || !cmp)
return;
253 if (nel > RSIZE_MAX ||
size > RSIZE_MAX)
return;
255 qsort_s(base, nel,
size, cmp, d);
257# define HAVE_GNU_QSORT_R 1
258#elif !defined HAVE_GNU_QSORT_R
262#define mmcount (16 / SIZEOF_LONG)
263#define A ((mmtype*)a)
264#define B ((mmtype*)b)
265#define C ((mmtype*)c)
266#define D ((mmtype*)d)
268#define mmstep (sizeof(mmtype) * mmcount)
269#define mmprepare(base, size) do {\
270 if (((VALUE)(base) % sizeof(mmtype)) == 0 && ((size) % sizeof(mmtype)) == 0) \
271 if ((size) >= mmstep) mmkind = 1;\
274 high = ((size) / mmstep) * mmstep;\
275 low = ((size) % mmstep);\
278#define mmarg mmkind, size, high, low
279#define mmargdecl int mmkind, size_t size, size_t high, size_t low
281static void mmswap_(
register char *a,
register char *b,
mmargdecl)
288 register char *t = a + high;
290 s =
A[0];
A[0] =
B[0];
B[0] = s;
291 s =
A[1];
A[1] =
B[1];
B[1] = s;
293 s =
A[2];
A[2] =
B[2];
B[2] = s;
295 s =
A[3];
A[3] =
B[3];
B[3] = s;
302 if (low != 0) { s =
A[0];
A[0] =
B[0];
B[0] = s;
304 if (low >= 2 *
sizeof(
mmtype)) { s =
A[1];
A[1] =
B[1];
B[1] = s;
306 if (low >= 3 *
sizeof(
mmtype)) {s =
A[2];
A[2] =
B[2];
B[2] = s;}
313 register char *t = a +
size, s;
314 do {s = *a; *a++ = *b; *b++ = s;}
while (a < t);
317#define mmswap(a,b) mmswap_((a),(b),mmarg)
320static void mmrot3_(
register char *a,
register char *b,
register char *c,
mmargdecl)
326 register char *t = a + high;
328 s =
A[0];
A[0] =
B[0];
B[0] =
C[0];
C[0] = s;
329 s =
A[1];
A[1] =
B[1];
B[1] =
C[1];
C[1] = s;
331 s =
A[2];
A[2] =
B[2];
B[2] =
C[2];
C[2] = s;
333 s =
A[3];
A[3] =
B[3];
B[3] =
C[3];
C[3] = s;
340 if (low != 0) { s =
A[0];
A[0] =
B[0];
B[0] =
C[0];
C[0] = s;
342 if (low >= 2 *
sizeof(
mmtype)) { s =
A[1];
A[1] =
B[1];
B[1] =
C[1];
C[1] = s;
344 if (low == 3 *
sizeof(
mmtype)) {s =
A[2];
A[2] =
B[2];
B[2] =
C[2];
C[2] = s;}
351 register char *t = a +
size, s;
352 do {s = *a; *a++ = *b; *b++ = *c; *c++ = s;}
while (a < t);
355#define mmrot3(a,b,c) mmrot3_((a),(b),(c),mmarg)
367#define PUSH(ll,rr) do { top->LL = (ll); top->RR = (rr); ++top; } while (0)
368#define POP(ll,rr) do { --top; (ll) = top->LL; (rr) = top->RR; } while (0)
370#define med3(a,b,c) ((*cmp)((a),(b),d)<0 ? \
371 ((*cmp)((b),(c),d)<0 ? (b) : ((*cmp)((a),(c),d)<0 ? (c) : (a))) : \
372 ((*cmp)((b),(c),d)>0 ? (b) : ((*cmp)((a),(c),d)<0 ? (a) : (c))))
377 register char *l, *r, *m;
378 register int t, eq_l, eq_r;
380 char *
R = (
char*)base +
size*(nel-1);
388 if (nel <= 1)
return;
393 if (stack ==
top)
return;
404 m = l +
size * (
n >> 1);
412 register char *p1 = l +
n;
413 register char *p2 = p1 +
n;
414 register char *p3 = p2 +
n;
415 m1 =
med3(p1, p2, p3);
419 m3 =
med3(p1, p2, p3);
430 if ((t = (*cmp)(l,m,d)) < 0) {
431 if ((t = (*cmp)(m,r,d)) < 0) {
432 if (chklim && nel >= chklim) {
435 for (p=l; p<r; p+=
size)
if ((*cmp)(p,p+
size,d) > 0)
goto fail;
441 if ((*cmp)(l,r,d) <= 0) {
mmswap(m,r);
goto loopA;}
442 mmrot3(r,m,l);
goto loopA;
448 if ((t = (*cmp)(m,r,d)) > 0) {
449 if (chklim && nel >= chklim) {
452 for (p=l; p<r; p+=
size)
if ((*cmp)(p,p+
size,d) < 0)
goto fail2;
456 fail2:
mmswap(l,r);
goto loopA;
459 if ((*cmp)(l,r,d) <= 0) {
mmswap(l,m);
goto loopB;}
460 mmrot3(l,m,r);
goto loopA;
465 if ((t = (*cmp)(m,r,d)) < 0) {
goto loopA;}
466 if (t > 0) {
mmswap(l,r);
goto loopB;}
470 if ((l +=
size) == r)
goto nxt;
471 if (l == m)
continue;
472 if ((t = (*cmp)(l,m,d)) > 0) {
mmswap(l,r); l =
L;
goto loopA;}
473 if (t < 0) {
mmswap(
L,l); l =
L;
goto loopB;}
476 loopA: eq_l = 1; eq_r = 1;
479 if ((l +=
size) == r)
481 if (l == m)
continue;
482 if ((t = (*cmp)(l,m,d)) > 0) {eq_r = 0;
break;}
486 if (l == (r -=
size))
488 if (r == m) {m = l;
break;}
489 if ((t = (*cmp)(r,m,d)) < 0) {eq_l = 0;
break;}
495 loopB: eq_l = 1; eq_r = 1;
498 if (l == (r -=
size))
500 if (r == m)
continue;
501 if ((t = (*cmp)(r,m,d)) < 0) {eq_l = 0;
break;}
505 if ((l +=
size) == r)
507 if (l == m) {m = r;
break;}
508 if ((t = (*cmp)(l,m,d)) > 0) {eq_r = 0;
break;}
520 else if (eq_r == 0)
L = r;
541#if defined HAVE_GETCWD
542# undef RUBY_UNTYPED_DATA_WARNING
543# define RUBY_UNTYPED_DATA_WARNING 0
544# if defined NO_GETCWD_MALLOC
571# define PATH_MAX 8192
595 while (*end && !
ISSPACE(*end) && *end !=
',') end++;
602#define strtod ruby_strtod
604#define dtoa ruby_dtoa
606#define hdtoa ruby_hdtoa
char str[HTML_ESCAPE_MAX_LEN+1]
unsigned long ruby_strtoul(const char *str, char **endptr, int base)
void rb_syserr_fail(int e, const char *mesg)
void rb_sys_fail(const char *mesg)
unsigned char buf[MIME_BUF_SIZE]
const signed char ruby_digit36_to_number_table[]
char * ruby_strdup(const char *str)
NO_SANITIZE("unsigned-integer-overflow", extern unsigned long ruby_scan_digits(const char *str, ssize_t len, int base, size_t *retlen, int *overflow))
void ruby_qsort(void *base, const size_t nel, const size_t size, cmpfunc_t *cmp, void *d)
void ruby_each_words(const char *str, void(*func)(const char *, int, void *), void *arg)
unsigned long ruby_scan_oct(const char *start, size_t len, size_t *retlen)
const char ruby_hexdigits[]
unsigned long ruby_scan_hex(const char *start, size_t len, size_t *retlen)
#define mmprepare(base, size)
unsigned long ruby_scan_digits(const char *str, ssize_t len, int base, size_t *retlen, int *overflow)
int() cmpfunc_t(const void *, const void *, void *)