12#if defined __MINGW32__ || defined __MINGW64__
13# define MINGW_HAS_SECURE_API 1
35#define hexdigit ruby_hexdigits
40 register const char *s = start;
41 register unsigned long retval = 0;
44 for (i = 0; i <
len; i++) {
45 if ((s[0] <
'0') || (
'7' < s[0])) {
51 *retlen = (
int)(s - start);
58 register const char *s = start;
59 register unsigned long retval = 0;
63 for (i = 0; i <
len; i++) {
75 *retlen = (
int)(s - start);
81 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
82 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
83 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
84 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1,
85 -1,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,
86 25,26,27,28,29,30,31,32,33,34,35,-1,-1,-1,-1,-1,
87 -1,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,
88 25,26,27,28,29,30,31,32,33,34,35,-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,
93 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
94 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
95 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
96 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
104 const char *start =
str;
105 unsigned long ret = 0, x;
106 unsigned long mul_overflow = (~(
unsigned long)0) / base;
117 if (d == -1 || base <= d) {
121 if (mul_overflow < ret)
128 }
while (
len < 0 || --
len);
129 *retlen =
str - start;
140 const char *subject_found =
str;
142 if (base == 1 || 36 < base) {
160 subject_found =
str+1;
161 if (base == 0 || base == 16) {
162 if (
str[1] ==
'x' ||
str[1] ==
'X') {
167 b = base == 0 ? 8 : 16;
177 b = base == 0 ? 10 : base;
186 *endptr = (
char*)subject_found;
194 ret = (
unsigned long)(-(
long)ret);
202#include <sys/types.h>
207#if defined(HAVE_FCNTL_H)
212# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
217#if defined HAVE_QSORT_S && defined RUBY_MSVCRT_VERSION
221# define qsort_r(base, nel, size, arg, cmp) qsort_s(base, nel, size, cmp, arg)
222# define cmp_bsd_qsort cmp_ms_qsort
223# define HAVE_BSD_QSORT_R 1
226#if defined HAVE_BSD_QSORT_R
227struct bsd_qsort_r_args {
233cmp_bsd_qsort(
void *d,
const void *a,
const void *b)
235 const struct bsd_qsort_r_args *args = d;
236 return (*args->cmp)(a, b, args->arg);
242 struct bsd_qsort_r_args args;
245 qsort_r(base, nel,
size, &args, cmp_bsd_qsort);
247#elif defined HAVE_QSORT_S
253 if (!nel || !
size)
return;
256 if (!base || !cmp)
return;
257 if (nel > RSIZE_MAX ||
size > RSIZE_MAX)
return;
259 qsort_s(base, nel,
size, cmp, d);
261# define HAVE_GNU_QSORT_R 1
262#elif !defined HAVE_GNU_QSORT_R
266#define mmcount (16 / SIZEOF_LONG)
267#define A ((mmtype*)a)
268#define B ((mmtype*)b)
269#define C ((mmtype*)c)
270#define D ((mmtype*)d)
272#define mmstep (sizeof(mmtype) * mmcount)
273#define mmprepare(base, size) do {\
274 if (((VALUE)(base) % sizeof(mmtype)) == 0 && ((size) % sizeof(mmtype)) == 0) \
275 if ((size) >= mmstep) mmkind = 1;\
278 high = ((size) / mmstep) * mmstep;\
279 low = ((size) % mmstep);\
282#define mmarg mmkind, size, high, low
283#define mmargdecl int mmkind, size_t size, size_t high, size_t low
285static void mmswap_(
register char *a,
register char *b,
mmargdecl)
292 register char *
t = a + high;
294 s =
A[0];
A[0] =
B[0];
B[0] = s;
295 s =
A[1];
A[1] =
B[1];
B[1] = s;
297 s =
A[2];
A[2] =
B[2];
B[2] = s;
299 s =
A[3];
A[3] =
B[3];
B[3] = s;
306 if (low != 0) { s =
A[0];
A[0] =
B[0];
B[0] = s;
308 if (low >= 2 *
sizeof(
mmtype)) { s =
A[1];
A[1] =
B[1];
B[1] = s;
310 if (low >= 3 *
sizeof(
mmtype)) {s =
A[2];
A[2] =
B[2];
B[2] = s;}
317 register char *
t = a +
size, s;
318 do {s = *a; *a++ = *b; *b++ = s;}
while (a <
t);
321#define mmswap(a,b) mmswap_((a),(b),mmarg)
324static void mmrot3_(
register char *a,
register char *b,
register char *c,
mmargdecl)
330 register char *
t = a + high;
332 s =
A[0];
A[0] =
B[0];
B[0] =
C[0];
C[0] = s;
333 s =
A[1];
A[1] =
B[1];
B[1] =
C[1];
C[1] = s;
335 s =
A[2];
A[2] =
B[2];
B[2] =
C[2];
C[2] = s;
337 s =
A[3];
A[3] =
B[3];
B[3] =
C[3];
C[3] = s;
344 if (low != 0) { s =
A[0];
A[0] =
B[0];
B[0] =
C[0];
C[0] = s;
346 if (low >= 2 *
sizeof(
mmtype)) { s =
A[1];
A[1] =
B[1];
B[1] =
C[1];
C[1] = s;
348 if (low == 3 *
sizeof(
mmtype)) {s =
A[2];
A[2] =
B[2];
B[2] =
C[2];
C[2] = s;}
355 register char *
t = a +
size, s;
356 do {s = *a; *a++ = *b; *b++ = *c; *c++ = s;}
while (a <
t);
359#define mmrot3(a,b,c) mmrot3_((a),(b),(c),mmarg)
371#define PUSH(ll,rr) do { top->LL = (ll); top->RR = (rr); ++top; } while (0)
372#define POP(ll,rr) do { --top; (ll) = top->LL; (rr) = top->RR; } while (0)
374#define med3(a,b,c) ((*cmp)((a),(b),d)<0 ? \
375 ((*cmp)((b),(c),d)<0 ? (b) : ((*cmp)((a),(c),d)<0 ? (c) : (a))) : \
376 ((*cmp)((b),(c),d)>0 ? (b) : ((*cmp)((a),(c),d)<0 ? (a) : (c))))
381 register char *l, *r, *m;
382 register int t, eq_l, eq_r;
384 char *
R = (
char*)base +
size*(nel-1);
392 if (nel <= 1)
return;
397 if (stack ==
top)
return;
408 m = l +
size * (n >> 1);
416 register char *p1 = l + n;
417 register char *p2 = p1 + n;
418 register char *p3 = p2 + n;
419 m1 =
med3(p1, p2, p3);
423 m3 =
med3(p1, p2, p3);
434 if ((
t = (*cmp)(l,m,d)) < 0) {
435 if ((
t = (*cmp)(m,r,d)) < 0) {
436 if (chklim && nel >= chklim) {
439 for (p=l; p<r; p+=
size)
if ((*cmp)(p,p+
size,d) > 0)
goto fail;
445 if ((*cmp)(l,r,d) <= 0) {
mmswap(m,r);
goto loopA;}
446 mmrot3(r,m,l);
goto loopA;
452 if ((
t = (*cmp)(m,r,d)) > 0) {
453 if (chklim && nel >= chklim) {
456 for (p=l; p<r; p+=
size)
if ((*cmp)(p,p+
size,d) < 0)
goto fail2;
460 fail2:
mmswap(l,r);
goto loopA;
463 if ((*cmp)(l,r,d) <= 0) {
mmswap(l,m);
goto loopB;}
464 mmrot3(l,m,r);
goto loopA;
469 if ((
t = (*cmp)(m,r,d)) < 0) {
goto loopA;}
470 if (
t > 0) {
mmswap(l,r);
goto loopB;}
474 if ((l +=
size) == r)
goto nxt;
475 if (l == m)
continue;
476 if ((
t = (*cmp)(l,m,d)) > 0) {
mmswap(l,r); l =
L;
goto loopA;}
477 if (
t < 0) {
mmswap(
L,l); l =
L;
goto loopB;}
480 loopA: eq_l = 1; eq_r = 1;
483 if ((l +=
size) == r)
485 if (l == m)
continue;
486 if ((
t = (*cmp)(l,m,d)) > 0) {eq_r = 0;
break;}
490 if (l == (r -=
size))
492 if (r == m) {m = l;
break;}
493 if ((
t = (*cmp)(r,m,d)) < 0) {eq_l = 0;
break;}
499 loopB: eq_l = 1; eq_r = 1;
502 if (l == (r -=
size))
504 if (r == m)
continue;
505 if ((
t = (*cmp)(r,m,d)) < 0) {eq_l = 0;
break;}
509 if ((l +=
size) == r)
511 if (l == m) {m = r;
break;}
512 if ((
t = (*cmp)(l,m,d)) > 0) {eq_r = 0;
break;}
524 else if (eq_r == 0)
L = r;
545#if defined HAVE_GETCWD
546# undef RUBY_UNTYPED_DATA_WARNING
547# define RUBY_UNTYPED_DATA_WARNING 0
548# if defined NO_GETCWD_MALLOC
575# define PATH_MAX 8192
599 while (*end && !
ISSPACE(*end) && *end !=
',') end++;
606#define strtod ruby_strtod
608#define dtoa ruby_dtoa
610#define hdtoa ruby_hdtoa
Our own, locale independent, character handling routines.
char * strchr(char *, char)
char str[HTML_ESCAPE_MAX_LEN+1]
void rb_syserr_fail(int e, const char *mesg)
void rb_sys_fail(const char *mesg)
Thin wrapper to ruby/config.h.
Internal header corresponding util.c.
typedef long(ZCALLBACK *tell_file_func) OF((voidpf opaque
typedef int(ZCALLBACK *close_file_func) OF((voidpf opaque
Internal header for Math.
#define Data_Wrap_Struct(klass, mark, free, sval)
#define RUBY_DEFAULT_FREE
Internal header for ASAN / MSAN / etc.
#define NO_SANITIZE(x, y)
size_t strlen(const char *)
const signed char ruby_digit36_to_number_table[]
char * ruby_strdup(const char *str)
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_strtoul(const char *str, char **endptr, int base)
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 *)