14 #include <sys/types.h> 18 #define GCC_VERSION_SINCE(major, minor, patchlevel) \ 19 (defined(__GNUC__) && !defined(__INTEL_COMPILER) && \ 20 ((__GNUC__ > (major)) || \ 21 (__GNUC__ == (major) && __GNUC_MINOR__ > (minor)) || \ 22 (__GNUC__ == (major) && __GNUC_MINOR__ == (minor) && __GNUC_PATCHLEVEL__ >= (patchlevel)))) 23 #if SIZEOF_SHORT != 2 || SIZEOF_LONG != 4 34 static int endian_value;
37 if (
init)
return endian_value;
40 return endian_value =
p[0]?0:1;
42 # define BIGENDIAN_P() (is_bigendian()) 43 #elif defined(WORDS_BIGENDIAN) 44 # define BIGENDIAN_P() 1 46 # define BIGENDIAN_P() 0 50 # define NATINT_LEN(type,len) (natint?(int)sizeof(type):(int)(len)) 52 # define NATINT_LEN(type,len) ((int)sizeof(type)) 56 # define INT64toNUM(x) LONG2NUM(x) 57 # define UINT64toNUM(x) ULONG2NUM(x) 58 #elif defined(HAVE_LONG_LONG) && SIZEOF_LONG_LONG == 8 59 # define INT64toNUM(x) LL2NUM(x) 60 # define UINT64toNUM(x) ULL2NUM(x) 63 #define define_swapx(x, xtype) \ 65 TOKEN_PASTE(swap,x)(xtype z) \ 69 unsigned char *s, *t; \ 72 zp = xmalloc(sizeof(xtype)); \ 74 s = (unsigned char*)zp; \ 75 t = xmalloc(sizeof(xtype)); \ 76 for (i=0; i<sizeof(xtype); i++) { \ 77 t[sizeof(xtype)-i-1] = s[i]; \ 85 #if GCC_VERSION_SINCE(4,3,0) 86 # define swap32(x) __builtin_bswap32(x) 87 # define swap64(x) __builtin_bswap64(x) 91 # define swap16(x) ((((x)&0xFF)<<8) | (((x)>>8)&0xFF)) 95 # define swap32(x) ((((x)&0xFF)<<24) \ 97 |(((x)&0x0000FF00)<<8) \ 98 |(((x)&0x00FF0000)>>8) ) 103 # define byte_in_64bit(n) ((uint64_t)0xff << (n)) 104 # define swap64(x) ((((x)&byte_in_64bit(0))<<56) \ 106 |(((x)&byte_in_64bit(8))<<40) \ 107 |(((x)&byte_in_64bit(48))>>40) \ 108 |(((x)&byte_in_64bit(16))<<24) \ 109 |(((x)&byte_in_64bit(40))>>24) \ 110 |(((x)&byte_in_64bit(24))<<8) \ 111 |(((x)&byte_in_64bit(32))>>8)) 115 #if SIZEOF_SHORT == 2 116 # define swaps(x) swap16(x) 117 #elif SIZEOF_SHORT == 4 118 # define swaps(x) swap32(x) 124 # define swapi(x) swap16(x) 125 #elif SIZEOF_INT == 4 126 # define swapi(x) swap32(x) 132 # define swapl(x) swap32(x) 133 #elif SIZEOF_LONG == 8 134 # define swapl(x) swap64(x) 139 #ifdef HAVE_LONG_LONG 140 # if SIZEOF_LONG_LONG == 8 141 # define swapll(x) swap64(x) 147 #if SIZEOF_FLOAT == 4 && defined(HAVE_INT32_T) 148 # define swapf(x) swap32(x) 149 # define FLOAT_SWAPPER uint32_t 154 #if SIZEOF_DOUBLE == 8 && defined(HAVE_INT64_T) 155 # define swapd(x) swap64(x) 156 # define DOUBLE_SWAPPER uint64_t 157 #elif SIZEOF_DOUBLE == 8 && defined(HAVE_INT32_T) 159 swapd(
const double d)
165 utmp[0] = 0; utmp[1] = 0;
166 memcpy(utmp,&dtmp,
sizeof(
double));
168 utmp[0] =
swap32(utmp[1]);
170 memcpy(&dtmp,utmp,
sizeof(
double));
179 #define rb_ntohf(x) (BIGENDIAN_P()?(x):swapf(x)) 180 #define rb_ntohd(x) (BIGENDIAN_P()?(x):swapd(x)) 181 #define rb_htonf(x) (BIGENDIAN_P()?(x):swapf(x)) 182 #define rb_htond(x) (BIGENDIAN_P()?(x):swapd(x)) 183 #define rb_htovf(x) (BIGENDIAN_P()?swapf(x):(x)) 184 #define rb_htovd(x) (BIGENDIAN_P()?swapd(x):(x)) 185 #define rb_vtohf(x) (BIGENDIAN_P()?swapf(x):(x)) 186 #define rb_vtohd(x) (BIGENDIAN_P()?swapd(x):(x)) 189 # define FLOAT_CONVWITH(y) FLOAT_SWAPPER y; 190 # define HTONF(x,y) (memcpy(&(y),&(x),sizeof(float)), \ 191 (y) = rb_htonf((FLOAT_SWAPPER)(y)), \ 192 memcpy(&(x),&(y),sizeof(float)), \ 194 # define HTOVF(x,y) (memcpy(&(y),&(x),sizeof(float)), \ 195 (y) = rb_htovf((FLOAT_SWAPPER)(y)), \ 196 memcpy(&(x),&(y),sizeof(float)), \ 198 # define NTOHF(x,y) (memcpy(&(y),&(x),sizeof(float)), \ 199 (y) = rb_ntohf((FLOAT_SWAPPER)(y)), \ 200 memcpy(&(x),&(y),sizeof(float)), \ 202 # define VTOHF(x,y) (memcpy(&(y),&(x),sizeof(float)), \ 203 (y) = rb_vtohf((FLOAT_SWAPPER)(y)), \ 204 memcpy(&(x),&(y),sizeof(float)), \ 207 # define FLOAT_CONVWITH(y) 208 # define HTONF(x,y) rb_htonf(x) 209 # define HTOVF(x,y) rb_htovf(x) 210 # define NTOHF(x,y) rb_ntohf(x) 211 # define VTOHF(x,y) rb_vtohf(x) 214 #ifdef DOUBLE_SWAPPER 215 # define DOUBLE_CONVWITH(y) DOUBLE_SWAPPER y; 216 # define HTOND(x,y) (memcpy(&(y),&(x),sizeof(double)), \ 217 (y) = rb_htond((DOUBLE_SWAPPER)(y)), \ 218 memcpy(&(x),&(y),sizeof(double)), \ 220 # define HTOVD(x,y) (memcpy(&(y),&(x),sizeof(double)), \ 221 (y) = rb_htovd((DOUBLE_SWAPPER)(y)), \ 222 memcpy(&(x),&(y),sizeof(double)), \ 224 # define NTOHD(x,y) (memcpy(&(y),&(x),sizeof(double)), \ 225 (y) = rb_ntohd((DOUBLE_SWAPPER)(y)), \ 226 memcpy(&(x),&(y),sizeof(double)), \ 228 # define VTOHD(x,y) (memcpy(&(y),&(x),sizeof(double)), \ 229 (y) = rb_vtohd((DOUBLE_SWAPPER)(y)), \ 230 memcpy(&(x),&(y),sizeof(double)), \ 233 # define DOUBLE_CONVWITH(y) 234 # define HTOND(x,y) rb_htond(x) 235 # define HTOVD(x,y) rb_htovd(x) 236 # define NTOHD(x,y) rb_ntohd(x) 237 # define VTOHD(x,y) rb_vtohd(x) 253 #define MAX_INTEGER_PACK_SIZE 8 256 static const char toofew[] =
"too few arguments";
261 static unsigned long utf8_to_uv(
const char*,
long*);
370 static const char nul10[] =
"\0\0\0\0\0\0\0\0\0\0";
371 static const char spc10[] =
" ";
372 const char *
p, *pend;
373 VALUE res, from, associates = 0;
375 long items,
len, idx, plen;
381 int signed_p, integer_size, bigendian_p;
391 #define TOO_FEW (rb_raise(rb_eArgError, toofew), 0) 392 #define THISFROM (items > 0 ? RARRAY_PTR(ary)[idx] : TOO_FEW) 393 #define NEXTFROM (items-- > 0 ? RARRAY_PTR(ary)[idx++] : TOO_FEW) 396 int explicit_endian = 0;
407 while ((
p < pend) && (*
p !=
'\n')) {
414 static const char natstr[] =
"sSiIlL";
415 static const char endstr[] =
"sSiIlLqQ";
437 if (explicit_endian) {
440 explicit_endian = *
p++;
465 if (enc_info == 1) enc_info = 2;
467 case 'm':
case 'M':
case 'u':
476 case 'A':
case 'a':
case 'Z':
500 if (
p[-1] ==
'*' &&
type ==
'Z')
520 j = (
len - plen + 1)/2;
523 for (
i=0;
i++ <
len; ptr++) {
529 char c = byte & 0xff;
536 byte >>= 7 - (
len & 7);
551 j = (
len - plen + 1)/2;
554 for (
i=0;
i++ <
len; ptr++) {
559 char c = byte & 0xff;
566 byte <<= 7 - (
len & 7);
581 j = (
len + 1) / 2 - (plen + 1) / 2;
584 for (
i=0;
i++ <
len; ptr++) {
586 byte |= (((*ptr & 15) + 9) & 15) << 4;
588 byte |= (*ptr & 15) << 4;
592 char c = byte & 0xff;
598 char c = byte & 0xff;
612 j = (
len + 1) / 2 - (plen + 1) / 2;
615 for (
i=0;
i++ <
len; ptr++) {
617 byte |= ((*ptr & 15) + 9) & 15;
623 char c = byte & 0xff;
629 char c = byte & 0xff;
645 c = (char)num2i32(from);
664 integer_size = (int)
sizeof(
int);
670 integer_size = (int)
sizeof(
int);
723 if (explicit_endian) {
724 bigendian_p = explicit_endian ==
'>';
727 switch (integer_size) {
728 #if defined(HAVE_INT16_T) && !defined(FORCE_BIG_PACK) 733 char a[
sizeof(int16_t)];
737 v.i = (int16_t)num2i32(from);
744 #if defined(HAVE_INT32_T) && !defined(FORCE_BIG_PACK) 749 char a[
sizeof(int32_t)];
753 v.i = (int32_t)num2i32(from);
760 #if defined(HAVE_INT64_T) && SIZEOF_LONG == SIZEOF_INT64_T && !defined(FORCE_BIG_PACK) 765 char a[
sizeof(int64_t)];
778 rb_bug(
"unexpected intger size for pack: %d", integer_size);
784 int num_longs = (integer_size+SIZEOF_LONG-1)/SIZEOF_LONG;
790 for (
i = 0;
i < num_longs/2;
i++) {
791 unsigned long t =
v.i[
i];
792 v.i[
i] =
v.i[num_longs-1-
i];
793 v.i[num_longs-1-
i] = t;
797 for (
i = 0;
i < num_longs;
i++)
798 v.i[
i] = swapl(
v.i[
i]);
802 v.a +
sizeof(
long)*num_longs - integer_size :
899 if (
len > 0)
goto grow;
901 if (
len > 0)
goto shrink;
995 char c, *bufs, *bufe;
1017 c = (char)(ul & 0x7f) | 0x80;
1026 while (bufs < bufe) {
1064 "`!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_";
1066 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
1077 buff[
i++] = (char)
len +
' ';
1084 while (
len >= 3 &&
sizeof(buff)-
i >= 4) {
1085 buff[
i++] =
trans[077 & (*s >> 2)];
1086 buff[
i++] =
trans[077 & (((*s << 4) & 060) | ((s[1] >> 4) & 017))];
1087 buff[
i++] =
trans[077 & (((s[1] << 2) & 074) | ((s[2] >> 6) & 03))];
1088 buff[
i++] =
trans[077 & s[2]];
1092 if (
sizeof(buff)-
i < 4) {
1099 buff[
i++] =
trans[077 & (*s >> 2)];
1100 buff[
i++] =
trans[077 & (((*s << 4) & 060) | ((s[1] >> 4) & 017))];
1101 buff[
i++] =
trans[077 & (((s[1] << 2) & 074) | ((
'\0' >> 6) & 03))];
1102 buff[
i++] = padding;
1104 else if (
len == 1) {
1105 buff[
i++] =
trans[077 & (*s >> 2)];
1106 buff[
i++] =
trans[077 & (((*s << 4) & 060) | (('\0' >> 4) & 017))];
1107 buff[
i++] = padding;
1108 buff[
i++] = padding;
1110 if (tail_lf) buff[
i++] =
'\n';
1120 long i = 0, n = 0, prev =
EOF;
1121 unsigned char *s = (
unsigned char*)
RSTRING_PTR(from);
1126 (*s < 32 && *s !=
'\n' && *s !=
'\t') ||
1134 else if (*s ==
'\n') {
1135 if (prev ==
' ' || prev ==
'\t') {
1173 case '0':
case '1':
case '2':
case '3':
case '4':
1174 case '5':
case '6':
case '7':
case '8':
case '9':
1176 case 'a':
case 'b':
case 'c':
1177 case 'd':
case 'e':
case 'f':
1178 return c -
'a' + 10;
1179 case 'A':
case 'B':
case 'C':
1180 case 'D':
case 'E':
case 'F':
1181 return c -
'A' + 10;
1187 #define PACK_LENGTH_ADJUST_SIZE(sz) do { \ 1189 if (len > (long)((send-s)/(sz))) { \ 1191 tmp_len = len-(send-s)/(sz); \ 1193 len = (send-s)/(sz); \ 1197 #define PACK_ITEM_ADJUST() do { \ 1198 if (tmp_len > 0 && !block_p) \ 1199 rb_ary_store(ary, RARRAY_LEN(ary)+tmp_len-1, Qnil); \ 1322 static const char hexdigits[] =
"0123456789abcdef";
1333 int signed_p, integer_size, bigendian_p;
1334 #define UNPACK_PUSH(item) do {\ 1335 VALUE item_val = (item);\ 1337 rb_yield(item_val);\ 1340 rb_ary_push(ary, item_val);\ 1353 int explicit_endian = 0;
1361 while ((
p < pend) && (*
p !=
'\n')) {
1369 static const char natstr[] =
"sSiIlL";
1370 static const char endstr[] =
"sSiIlLqQ";
1393 if (explicit_endian) {
1396 explicit_endian = *
p++;
1403 else if (*
p ==
'*') {
1425 if (
len > send - s)
len = send - s;
1428 char *t = s +
len - 1;
1431 if (*t !=
' ' && *t !=
'\0')
break;
1443 if (
len > send-s)
len = send-s;
1444 while (t < s+
len && *t) t++;
1447 s = star ? t : s+
len;
1452 if (
len > send - s)
len = send - s;
1464 if (
p[-1] ==
'*' ||
len > (send - s) * 8)
1465 len = (send - s) * 8;
1470 if (
i & 7) bits >>= 1;
1472 *t++ = (bits & 1) ?
'1' :
'0';
1484 if (
p[-1] ==
'*' ||
len > (send - s) * 8)
1485 len = (send - s) * 8;
1490 if (
i & 7) bits <<= 1;
1492 *t++ = (bits & 128) ?
'1' :
'0';
1504 if (
p[-1] ==
'*' ||
len > (send - s) * 2)
1505 len = (send - s) * 2;
1514 *t++ = hexdigits[bits & 15];
1526 if (
p[-1] ==
'*' ||
len > (send - s) * 2)
1527 len = (send - s) * 2;
1536 *t++ = hexdigits[(bits >> 4) & 15];
1545 if (c > (
char)127) c-=256;
1554 unsigned char c = *s++;
1564 goto unpack_integer;
1570 goto unpack_integer;
1574 integer_size = (int)
sizeof(
int);
1576 goto unpack_integer;
1580 integer_size = (int)
sizeof(
int);
1582 goto unpack_integer;
1588 goto unpack_integer;
1594 goto unpack_integer;
1600 goto unpack_integer;
1606 goto unpack_integer;
1612 goto unpack_integer;
1618 goto unpack_integer;
1624 goto unpack_integer;
1630 goto unpack_integer;
1633 if (explicit_endian) {
1634 bigendian_p = explicit_endian ==
'>';
1637 switch (integer_size) {
1638 #if defined(HAVE_INT16_T) && !defined(FORCE_BIG_PACK) 1639 case SIZEOF_INT16_T:
1645 char a[
sizeof(int16_t)];
1647 memcpy(
v.a, s,
sizeof(int16_t));
1649 s +=
sizeof(int16_t);
1659 char a[
sizeof(uint16_t)];
1661 memcpy(
v.a, s,
sizeof(uint16_t));
1663 s +=
sizeof(uint16_t);
1671 #if defined(HAVE_INT32_T) && !defined(FORCE_BIG_PACK) 1672 case SIZEOF_INT32_T:
1678 char a[
sizeof(int32_t)];
1680 memcpy(
v.a, s,
sizeof(int32_t));
1682 s +=
sizeof(int32_t);
1704 #if defined(HAVE_INT64_T) && !defined(FORCE_BIG_PACK) 1705 case SIZEOF_INT64_T:
1711 char a[
sizeof(int64_t)];
1713 memcpy(
v.a, s,
sizeof(int64_t));
1715 s +=
sizeof(int64_t);
1739 rb_bug(
"unexpected intger size for pack: %d", integer_size);
1746 int num_longs = (integer_size+SIZEOF_LONG)/SIZEOF_LONG;
1749 if (signed_p && (
signed char)s[bigendian_p ? 0 : (integer_size-1)] < 0)
1750 memset(
v.a, 0xff,
sizeof(
long)*num_longs);
1752 memset(
v.a, 0,
sizeof(
long)*num_longs);
1754 memcpy(
v.a +
sizeof(
long)*num_longs - integer_size, s, integer_size);
1756 memcpy(
v.a, s, integer_size);
1758 for (
i = 0;
i < num_longs/2;
i++) {
1759 unsigned long t =
v.i[
i];
1760 v.i[
i] =
v.i[num_longs-1-
i];
1761 v.i[num_longs-1-
i] = t;
1765 for (
i = 0;
i < num_longs;
i++)
1766 v.i[
i] = swapl(
v.i[
i]);
1781 memcpy(&tmp, s,
sizeof(
float));
1794 memcpy(&tmp, s,
sizeof(
float));
1796 tmp =
VTOHF(tmp,ftmp);
1808 memcpy(&tmp, s,
sizeof(
double));
1809 s +=
sizeof(double);
1810 tmp =
VTOHD(tmp,dtmp);
1821 memcpy(&tmp, s,
sizeof(
double));
1822 s +=
sizeof(double);
1834 memcpy(&tmp, s,
sizeof(
float));
1836 tmp =
NTOHF(tmp,ftmp);
1848 memcpy(&tmp, s,
sizeof(
double));
1849 s +=
sizeof(double);
1850 tmp =
NTOHD(tmp,dtmp);
1857 if (
len > send - s)
len = send - s;
1858 while (
len > 0 && s < send) {
1859 long alen = send - s;
1874 while (s < send && *s >
' ' && *s <
'a') {
1879 len = (*s++ -
' ') & 077;
1887 long mlen =
len > 3 ? 3 :
len;
1889 if (s < send && *s >=
' ')
1890 a = (*s++ -
' ') & 077;
1893 if (s < send && *s >=
' ')
1894 b = (*s++ -
' ') & 077;
1897 if (s < send && *s >=
' ')
1898 c = (*s++ -
' ') & 077;
1901 if (s < send && *s >=
' ')
1902 d = (*s++ -
' ') & 077;
1905 hunk[0] = (char)(a << 2 | b >> 4);
1906 hunk[1] = (char)(b << 4 | c >> 2);
1907 hunk[2] = (char)(c << 6 | d);
1908 memcpy(ptr, hunk, mlen);
1912 if (*s ==
'\r') s++;
1913 if (*s ==
'\n') s++;
1914 else if (s < send && (s+1 == send || s[1] ==
'\n'))
1927 int a = -1,b = -1,c = 0,d = 0;
1928 static signed char b64_xtable[256];
1930 if (b64_xtable[
'/'] <= 0) {
1933 for (
i = 0;
i < 256;
i++) {
1936 for (
i = 0;
i < 64;
i++) {
1943 a = b64_xtable[(
unsigned char)*s++];
1945 b = b64_xtable[(
unsigned char)*s++];
1948 if (s + 2 == send && *(s + 1) ==
'=')
break;
1951 c = b64_xtable[(
unsigned char)*s++];
1953 if (s + 1 == send && *s ==
'=')
break;
1954 d = b64_xtable[(
unsigned char)*s++];
1956 *ptr++ = a << 2 | b >> 4;
1957 *ptr++ = b << 4 | c >> 2;
1958 *ptr++ = c << 6 | d;
1961 *ptr++ = a << 2 | b >> 4;
1965 *ptr++ = a << 2 | b >> 4;
1966 *ptr++ = b << 4 | c >> 2;
1973 while ((a = b64_xtable[(
unsigned char)*s]) == -1 && s < send) {s++;}
1974 if (s >= send)
break;
1976 while ((b = b64_xtable[(
unsigned char)*s]) == -1 && s < send) {s++;}
1977 if (s >= send)
break;
1979 while ((c = b64_xtable[(
unsigned char)*s]) == -1 && s < send) {
if (*s ==
'=')
break; s++;}
1980 if (*s ==
'=' || s >= send)
break;
1982 while ((d = b64_xtable[(
unsigned char)*s]) == -1 && s < send) {
if (*s ==
'=')
break; s++;}
1983 if (*s ==
'=' || s >= send)
break;
1985 *ptr++ = a << 2 | b >> 4;
1986 *ptr++ = b << 4 | c >> 2;
1987 *ptr++ = c << 6 | d;
1989 if (a != -1 && b != -1) {
1990 if (c == -1 && *s ==
'=')
1991 *ptr++ = a << 2 | b >> 4;
1992 else if (c != -1 && *s ==
'=') {
1993 *ptr++ = a << 2 | b >> 4;
1994 *ptr++ = b << 4 | c >> 2;
2011 if (++s == send)
break;
2012 if (s+1 < send && *s ==
'\r' && *(s+1) ==
'\n')
2015 if ((c1 =
hex2num(*s)) == -1)
break;
2016 if (++s == send)
break;
2017 if ((c2 =
hex2num(*s)) == -1)
break;
2018 *ptr++ = c1 << 4 | c2;
2053 if (
sizeof(
char *) <= (
size_t)(send - s)) {
2057 memcpy(&t, s,
sizeof(
char *));
2058 s +=
sizeof(
char *);
2090 if (
len > (
long)((send - s) /
sizeof(
char *)))
2091 len = (send - s) /
sizeof(
char *);
2093 if ((
size_t)(send - s) <
sizeof(
char *))
2099 memcpy(&t, s,
sizeof(
char *));
2100 s +=
sizeof(
char *);
2128 unsigned long ul = 0;
2129 unsigned long ulmask = 0xfeUL << ((
sizeof(
unsigned long) - 1) * 8);
2131 while (
len > 0 && s < send) {
2134 if (!(*s++ & 0x80)) {
2139 else if (ul & ulmask) {
2145 if (!(*s++ & 0x80)) {
2175 buf[0] = (char)((uv>>6)&0xff)|0xc0;
2176 buf[1] = (char)(uv&0x3f)|0x80;
2180 buf[0] = (char)((uv>>12)&0xff)|0xe0;
2181 buf[1] = (char)((uv>>6)&0x3f)|0x80;
2182 buf[2] = (char)(uv&0x3f)|0x80;
2185 if (uv <= 0x1fffff) {
2186 buf[0] = (char)((uv>>18)&0xff)|0xf0;
2187 buf[1] = (char)((uv>>12)&0x3f)|0x80;
2188 buf[2] = (char)((uv>>6)&0x3f)|0x80;
2189 buf[3] = (char)(uv&0x3f)|0x80;
2192 if (uv <= 0x3ffffff) {
2193 buf[0] = (char)((uv>>24)&0xff)|0xf8;
2194 buf[1] = (char)((uv>>18)&0x3f)|0x80;
2195 buf[2] = (char)((uv>>12)&0x3f)|0x80;
2196 buf[3] = (char)((uv>>6)&0x3f)|0x80;
2197 buf[4] = (char)(uv&0x3f)|0x80;
2200 if (uv <= 0x7fffffff) {
2201 buf[0] = (char)((uv>>30)&0xff)|0xfc;
2202 buf[1] = (char)((uv>>24)&0x3f)|0x80;
2203 buf[2] = (char)((uv>>18)&0x3f)|0x80;
2204 buf[3] = (char)((uv>>12)&0x3f)|0x80;
2205 buf[4] = (char)((uv>>6)&0x3f)|0x80;
2206 buf[5] = (char)(uv&0x3f)|0x80;
2222 static unsigned long 2225 int c = *
p++ & 0xff;
2226 unsigned long uv = c;
2238 if (!(uv & 0x20)) { n = 2; uv &= 0x1f; }
2239 else if (!(uv & 0x10)) { n = 3; uv &= 0x0f; }
2240 else if (!(uv & 0x08)) { n = 4; uv &= 0x07; }
2241 else if (!(uv & 0x04)) { n = 5; uv &= 0x03; }
2242 else if (!(uv & 0x02)) { n = 6; uv &= 0x01; }
2255 if ((c & 0xc0) != 0x80) {
RUBY_EXTERN VALUE rb_cString
#define RSTRING_LEN(string)
static long NUM2LONG(VALUE x)
static VALUE UINT2NUM(unsigned int v)
#define MAX_INTEGER_PACK_SIZE
void rb_bug(const char *fmt,...)
VALUE rb_uint2big(VALUE n)
#define ENCODING_CODERANGE_SET(obj, encindex, cr)
#define NATINT_LEN(type, len)
void rb_big_pack(VALUE val, unsigned long *buf, long num_longs)
#define RFLOAT_VALUE(val)
#define PACK_ITEM_ADJUST()
VALUE rb_big_plus(VALUE x, VALUE y)
VALUE rb_ary_push(VALUE ary, VALUE item)
int rb_usascii_encindex(void)
static VALUE INT2NUM(int v)
#define RSTRING_PTR(string)
void rb_raise(VALUE exc, const char *fmt,...)
VALUE rb_str_associated(VALUE)
static const char uu_table[]
#define RARRAY_LEN(ARRAY)
static const char toofew[]
#define DOUBLE_CONVWITH(y)
VALUE rb_big_unpack(unsigned long *buf, long num_longs)
#define ENC_CODERANGE_7BIT
const char * rb_obj_classname(VALUE)
VALUE rb_str_buf_cat(VALUE, const char *, long)
static const signed char trans[][0x100]
static VALUE pack_unpack(VALUE str, VALUE fmt)
VALUE rb_big2ulong_pack(VALUE x)
VALUE rb_big_divmod(VALUE x, VALUE y)
unsigned long long uint64_t
static void encodes(VALUE, const char *, long, int, int)
int rb_block_given_p(void)
VALUE rb_obj_taint(VALUE)
VALUE rb_obj_as_string(VALUE)
static VALUE infected_str_new(const char *ptr, long len, VALUE str)
int rb_ascii8bit_encindex(void)
#define STRTOUL(str, endptr, base)
#define define_swapx(x, xtype)
static void qpencode(VALUE, VALUE, long)
void rb_enc_set_index(VALUE obj, int idx)
void rb_str_associate(VALUE, VALUE)
#define ENC_CODERANGE_VALID
static const char hex_table[]
unsigned char buf[MIME_BUF_SIZE]
static int hex2num(char c)
VALUE rb_big_mul(VALUE x, VALUE y)
char * strchr(char *, char)
int rb_utf8_encindex(void)
register unsigned int len
#define RARRAY_PTR(ARRAY)
#define FLOAT_CONVWITH(y)
static VALUE pack_pack(VALUE ary, VALUE fmt)
static unsigned long utf8_to_uv(const char *, long *)
static const unsigned long utf8_limits[]
static VALUE ULONG2NUM(unsigned long v)
#define rb_str_set_len(str, length)
int rb_uv_to_utf8(char buf[6], unsigned long uv)
#define PACK_LENGTH_ADJUST_SIZE(sz)
#define StringValuePtr(v)
static const char b64_table[]
VALUE rb_tainted_str_new(const char *, long)
VALUE rb_str_buf_new(long)
void rb_define_method(VALUE klass, const char *name, VALUE(*func)(ANYARGS), int argc)
#define UNPACK_PUSH(item)
VALUE rb_str_new(const char *, long)