pack.c File Reference
`#include "ruby/ruby.h"`
`#include "ruby/encoding.h"`
`#include <sys/types.h>`
`#include <ctype.h>`
`#include <errno.h>`

Go to the source code of this file.

## Macros

#define | GCC_VERSION_SINCE(major, minor, patchlevel)
#define | NATINT_PACK
#define | BIGENDIAN_P() 0
#define | NATINT_LEN(type, len) (natint?(int)sizeof(type):(int)(len))
#define | define_swapx(x, xtype)
#define | swap16(x) ((((x)&0xFF)<<8) | (((x)>>8)&0xFF))
#define | swap32(x)
#define | rb_ntohf(x) (BIGENDIAN_P()?(x):swapf(x))
#define | rb_ntohd(x) (BIGENDIAN_P()?(x):swapd(x))
#define | rb_htonf(x) (BIGENDIAN_P()?(x):swapf(x))
#define | rb_htond(x) (BIGENDIAN_P()?(x):swapd(x))
#define | rb_htovf(x) (BIGENDIAN_P()?swapf(x):(x))
#define | rb_htovd(x) (BIGENDIAN_P()?swapd(x):(x))
#define | rb_vtohf(x) (BIGENDIAN_P()?swapf(x):(x))
#define | rb_vtohd(x) (BIGENDIAN_P()?swapd(x):(x))
#define | FLOAT_CONVWITH(y)
#define | HTONF(x, y) rb_htonf(x)
#define | HTOVF(x, y) rb_htovf(x)
#define | NTOHF(x, y) rb_ntohf(x)
#define | VTOHF(x, y) rb_vtohf(x)
#define | DOUBLE_CONVWITH(y)
#define | HTOND(x, y) rb_htond(x)
#define | HTOVD(x, y) rb_htovd(x)
#define | NTOHD(x, y) rb_ntohd(x)
#define | VTOHD(x, y) rb_vtohd(x)
#define | MAX_INTEGER_PACK_SIZE 8
#define | TOO_FEW (rb_raise(rb_eArgError, toofew), 0)
#define | THISFROM (items > 0 ? RARRAY_PTR(ary)[idx] : TOO_FEW)
#define | NEXTFROM (items-- > 0 ? RARRAY_PTR(ary)[idx++] : TOO_FEW)
#define | PACK_LENGTH_ADJUST_SIZE(sz)
#define | PACK_ITEM_ADJUST()
#define | UNPACK_PUSH(item)
#define | BYTEWIDTH 8

## Functions

| define_swapx (s, short)
static void | encodes (VALUE, const char *, long, int, int)
static void | qpencode (VALUE, VALUE, long)
static unsigned long | utf8_to_uv (const char *, long *)
static VALUE | pack_pack (VALUE ary, VALUE fmt)
static int | hex2num (char c)
static VALUE | infected_str_new (const char *ptr, long len, VALUE str)
static VALUE | pack_unpack (VALUE str, VALUE fmt)
int | rb_uv_to_utf8 (char buf[6], unsigned long uv)
void | Init_pack (void)

## Variables

static const char | toofew [] = "too few arguments"
static const char | uu_table []
static const char | b64_table []
static const char | hex_table [] = "0123456789ABCDEF"
static const unsigned long | utf8_limits []

## Macro Definition Documentation

#define BIGENDIAN_P | ( |  | ) | 0

Definition at line 46 of file pack.c.

Referenced by pack_pack(), and pack_unpack().

#define BYTEWIDTH 8

Definition at line 2163 of file pack.c.

#define define_swapx | ( |  | x,
|  |  | xtype
| ) |  |

Value:
static xtype \
TOKEN_PASTE(swap,x)(xtype z) \
{ \
xtype r; \
xtype *zp; \
unsigned char *s, *t; \
int i; \
\
zp = xmalloc(sizeof(xtype)); \
*zp = z; \
s = (unsigned char*)zp; \
t = xmalloc(sizeof(xtype)); \
for (i=0; i<sizeof(xtype); i++) { \
t[sizeof(xtype)-i-1] = s[i]; \
} \
r = *(xtype *)t; \
xfree(t); \
xfree(zp); \
return r; \
}

Definition at line 63 of file pack.c.

#define DOUBLE_CONVWITH | ( |  | y | ) |

Referenced by pack_pack(), and pack_unpack().

#define FLOAT_CONVWITH | ( |  | y | ) |

Referenced by pack_pack(), and pack_unpack().

#define GCC_VERSION_SINCE | ( |  | major,
|  |  | minor,
|  |  | patchlevel
| ) |  |

Value:
(defined(__GNUC__) && !defined(__INTEL_COMPILER) && \
((__GNUC__ > (major)) || \
(__GNUC__ == (major) && __GNUC_MINOR__ > (minor)) || \
(__GNUC__ == (major) && __GNUC_MINOR__ == (minor) && __GNUC_PATCHLEVEL__ >= (patchlevel))))

Definition at line 18 of file pack.c.

#define HTOND | ( |  | x,
|  |  | y
| ) |  | rb_htond(x)

Referenced by pack_pack().

#define HTONF | ( |  | x,
|  |  | y
| ) |  | rb_htonf(x)

Referenced by pack_pack().

#define HTOVD | ( |  | x,
|  |  | y
| ) |  | rb_htovd(x)

Referenced by pack_pack().

#define HTOVF | ( |  | x,
|  |  | y
| ) |  | rb_htovf(x)

Referenced by pack_pack().

#define MAX_INTEGER_PACK_SIZE 8

Definition at line 253 of file pack.c.

Referenced by pack_pack(), and pack_unpack().

#define NATINT_LEN | ( |  | type,
|  |  | len
| ) |  | (natint?(int)sizeof(type):(int)(len))

Definition at line 50 of file pack.c.

Referenced by pack_pack(), and pack_unpack().

#define NATINT_PACK

Definition at line 24 of file pack.c.

#define NEXTFROM (items-- > 0 ? RARRAY_PTR(ary)[idx++] : TOO_FEW)

Referenced by pack_pack().

#define NTOHD | ( |  | x,
|  |  | y
| ) |  | rb_ntohd(x)

Referenced by pack_unpack().

#define NTOHF | ( |  | x,
|  |  | y
| ) |  | rb_ntohf(x)

Referenced by pack_unpack().

#define PACK_ITEM_ADJUST | ( |  | ) |

Value:
do { \
if (tmp_len > 0 && !block_p) \
rb_ary_store(ary, RARRAY_LEN(ary)+tmp_len-1, Qnil); \
} while (0)

Definition at line 1197 of file pack.c.

Referenced by pack_unpack().

#define PACK_LENGTH_ADJUST_SIZE | ( |  | sz | ) |

Value:
do { \
tmp_len = 0; \
if (len > (long)((send-s)/(sz))) { \
if (!star) { \
tmp_len = len-(send-s)/(sz); \
} \
len = (send-s)/(sz); \
} \
} while (0)

Definition at line 1187 of file pack.c.

Referenced by pack_unpack().

#define rb_htond | ( |  | x | ) | (BIGENDIAN_P()?(x):swapd(x))

#define rb_htonf | ( |  | x | ) | (BIGENDIAN_P()?(x):swapf(x))

#define rb_htovd | ( |  | x | ) | (BIGENDIAN_P()?swapd(x):(x))

#define rb_htovf | ( |  | x | ) | (BIGENDIAN_P()?swapf(x):(x))

#define rb_ntohd | ( |  | x | ) | (BIGENDIAN_P()?(x):swapd(x))

#define rb_ntohf | ( |  | x | ) | (BIGENDIAN_P()?(x):swapf(x))

#define rb_vtohd | ( |  | x | ) | (BIGENDIAN_P()?swapd(x):(x))

#define rb_vtohf | ( |  | x | ) | (BIGENDIAN_P()?swapf(x):(x))

#define swap16 | ( |  | x | ) | ((((x)&0xFF)<<8) | (((x)>>8)&0xFF))

Definition at line 91 of file pack.c.

Referenced by pack_pack(), and pack_unpack().

#define swap32 | ( |  | x | ) |

Value:
((((x)&0xFF)<<24) \
|(((x)>>24)&0xFF) \
|(((x)&0x0000FF00)<<8) \
|(((x)&0x00FF0000)>>8) )

Definition at line 95 of file pack.c.

Referenced by define_swapx(), pack_pack(), and pack_unpack().

#define THISFROM (items > 0 ? RARRAY_PTR(ary)[idx] : TOO_FEW)

Referenced by pack_pack().

#define TOO_FEW (rb_raise(rb_eArgError, toofew), 0)

#define UNPACK_PUSH | ( |  | item | ) |

Value:
do {\
VALUE item_val = (item);\
if (block_p) {\
rb_yield(item_val);\
}\
else {\
rb_ary_push(ary, item_val);\
}\
} while (0)

Referenced by pack_unpack().

#define VTOHD | ( |  | x,
|  |  | y
| ) |  | rb_vtohd(x)

Referenced by pack_unpack().

#define VTOHF | ( |  | x,
|  |  | y
| ) |  | rb_vtohf(x)

Referenced by pack_unpack().

## Function Documentation

define_swapx | ( | s | ,
|  | short |
| ) |  |

Definition at line 120 of file pack.c.

References swap32.

static void encodes | ( | VALUE | str,
|  | const char * | s,
|  | long | len,
|  | int | type,
|  | int | tail_lf
| ) |  |

static

Definition at line 1069 of file pack.c.

References b64_table, i, rb_str_buf_cat(), and trans.

Referenced by pack_pack().

static int hex2num | ( | char | c | ) |

inline static

Definition at line 1170 of file pack.c.

Referenced by pack_unpack().

static VALUE infected_str_new | ( | const char * | ptr,
|  | long | len,
|  | VALUE | str
| ) |  |

static

Definition at line 1203 of file pack.c.

References OBJ_INFECT, and rb_str_new().

Referenced by pack_unpack().

void Init_pack | ( | void |  | ) |

Definition at line 2271 of file pack.c.

References pack_pack(), pack_unpack(), rb_cArray, rb_cString, and rb_define_method().

static VALUE pack_pack | ( | VALUE | ary,
|  | VALUE | fmt
| ) |  |

static

Definition at line 368 of file pack.c.

References BIGENDIAN_P, buf, DOUBLE_CONVWITH, ENC_CODERANGE_7BIT, encodes(), ENCODING_CODERANGE_SET, errno, FLOAT_CONVWITH, HTOND, HTONF, HTOVD, HTOVF, i, ISALPHA, ISDIGIT, ISSPACE, le, len, MAX_INTEGER_PACK_SIZE, NATINT_LEN, NEXTFROM, NIL_P, NUM2INT, NUM2LONG(), OBJ_INFECT, p, qpencode(), RARRAY_LEN, RARRAY_PTR, rb_ary_new(), rb_ary_push(), rb_big_divmod(), rb_big_pack(), rb_bug(), rb_eArgError, rb_enc_set_index(), rb_eRangeError, rb_eRuntimeError, rb_obj_as_string(), rb_obj_taint(), rb_raise(), rb_str_associate(), rb_str_buf_cat(), rb_str_buf_new(), rb_str_new(), rb_str_set_len, rb_to_float(), rb_to_int(), rb_uint2big(), rb_usascii_encindex(), rb_utf8_encindex(), rb_uv_to_utf8(), RFLOAT_VALUE, RSTRING_LEN, RSTRING_PTR, SIGNED_VALUE, strchr(), StringValue, StringValuePtr, STRTOUL, swap16, swap32, T_BIGNUM, THISFROM, type, TYPE, and v.

Referenced by Init_pack().

static VALUE pack_unpack | ( | VALUE | str,
|  | VALUE | fmt
| ) |  |

static

Definition at line 1320 of file pack.c.

References BIGENDIAN_P, buf, DBL2NUM, DOUBLE_CONVWITH, ENC_CODERANGE_VALID, ENCODING_CODERANGE_SET, errno, FLOAT_CONVWITH, hex2num(), i, infected_str_new(), INT2FIX, INT2NUM(), ISDIGIT, ISSPACE, len, long, MAX_INTEGER_PACK_SIZE, NATINT_LEN, NTOHD, NTOHF, p, PACK_ITEM_ADJUST, PACK_LENGTH_ADJUST_SIZE, Qnil, RARRAY_LEN, RARRAY_PTR, rb_ary_new(), rb_ascii8bit_encindex(), rb_big_mul(), rb_big_plus(), rb_big_unpack(), rb_block_given_p(), rb_bug(), rb_eArgError, rb_eRangeError, rb_raise(), rb_str_associate(), rb_str_associated(), rb_str_new(), rb_str_set_len, rb_tainted_str_new(), rb_uint2big(), RSTRING_LEN, RSTRING_PTR, strchr(), StringValue, STRTOUL, swap16, swap32, T_STRING, type, TYPE, UINT2NUM(), ULONG2NUM(), UNPACK_PUSH, utf8_to_uv(), v, VTOHD, and VTOHF.

Referenced by Init_pack().

static void qpencode | ( | VALUE | str,
|  | VALUE | from,
|  | long | len
| ) |  |

static

Definition at line 1117 of file pack.c.

References EOF, i, rb_str_buf_cat(), RSTRING_LEN, and RSTRING_PTR.

Referenced by pack_pack().

int rb_uv_to_utf8 | ( | char | buf[6],
|  | unsigned long | uv
| ) |  |

Definition at line 2166 of file pack.c.

References rb_eRangeError, and rb_raise().

Referenced by append_utf8(), and pack_pack().

static unsigned long utf8_to_uv | ( | const char * | p,
|  | long * | lenp
| ) |  |

static

Definition at line 2221 of file pack.c.

References rb_eArgError, and rb_raise().

Referenced by pack_unpack().

## Variable Documentation

const char b64_table[]

static

Initial value:
=
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

Definition at line 1065 of file pack.c.

Referenced by encodes().

const char hex_table[] = "0123456789ABCDEF"

static

Definition at line 1114 of file pack.c.

const char toofew[] = "too few arguments"

static

Definition at line 256 of file pack.c.

const unsigned long utf8_limits[]

static

Initial value:
= {
0x0,
0x80,
0x800,
0x10000,
0x200000,
0x4000000,
0x80000000,
}

Definition at line 2210 of file pack.c.

const char uu_table[]

static

Initial value:
=
"`!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"

Definition at line 1063 of file pack.c.