Project

General

Profile

Bug #10019 » pack.patch

wkwood (Will Wood), 07/09/2014 02:35 PM

View differences:

D:/rubyinstaller/downloads/ruby_2_1/pack.c Wed Jul 9 09:17:30 2014
pack.c -
$Author: akr $
$Author: glass $
created at: Thu Feb 10 15:17:05 JST 1994
Copyright (C) 1993-2007 Yukihiro Matsumoto
......
#include <sys/types.h>
#include <ctype.h>
#include <errno.h>
#include <malloc.h>
/*
* It is intentional that the condition for natstr is HAVE_TRUE_LONG_LONG
* instead of HAVE_LONG_LONG or LONG_LONG.
......
static void
encodes(VALUE str, const char *s, long len, int type, int tail_lf)
{
char buff[4096];
long bufLen = len + 128; // enough room
char* buff = (char*)malloc(bufLen);
long i = 0;
const char *trans = type == 'u' ? uu_table : b64_table;
char padding;
if (type == 'u') {
buff[i++] = (char)len + ' ';
padding = '`';
buff[i++] = (char)len + ' ';
padding = '`';
}
else {
padding = '=';
padding = '=';
}
while (len >= 3) {
while (len >= 3 && sizeof(buff)-i >= 4) {
while (len >= 3 && bufLen-i >= 4) {
buff[i++] = trans[077 & (*s >> 2)];
buff[i++] = trans[077 & (((*s << 4) & 060) | ((s[1] >> 4) & 017))];
buff[i++] = trans[077 & (((s[1] << 2) & 074) | ((s[2] >> 6) & 03))];
......
s += 3;
len -= 3;
}
if (sizeof(buff)-i < 4) {
if (bufLen-i < 4) {
rb_str_buf_cat(str, buff, i);
i = 0;
}
......
}
if (tail_lf) buff[i++] = '\n';
rb_str_buf_cat(str, buff, i);
free(buff);
}
static const char hex_table[] = "0123456789ABCDEF";
......
s += sizeof(char *);
if (t) {
VALUE a, *p, *pend;
VALUE a;
const VALUE *p, *pend;
if (!(a = rb_str_associated(str))) {
rb_raise(rb_eArgError, "no associated pointer");
}
p = RARRAY_PTR(a);
p = RARRAY_CONST_PTR(a);
pend = p + RARRAY_LEN(a);
while (p < pend) {
if (RB_TYPE_P(*p, T_STRING) && RSTRING_PTR(*p) == t) {
......
s += sizeof(char *);
if (t) {
VALUE a, *p, *pend;
VALUE a;
const VALUE *p, *pend;
if (!(a = rb_str_associated(str))) {
rb_raise(rb_eArgError, "no associated pointer");
}
p = RARRAY_PTR(a);
p = RARRAY_CONST_PTR(a);
pend = p + RARRAY_LEN(a);
while (p < pend) {
if (RB_TYPE_P(*p, T_STRING) && RSTRING_PTR(*p) == t) {
(1-1/3)