Revision: 2698 http://trac.macosforge.org/projects/ruby/changeset/2698 Author: mattaimonetti@gmail.com Date: 2009-10-01 00:35:10 -0700 (Thu, 01 Oct 2009) Log Message: ----------- another Array#pack bug fix by Ninh Bui(Phusion) Modified Paths: -------------- MacRuby/trunk/pack.c MacRuby/trunk/spec/frozen/tags/macruby/core/array/pack_tags.txt Modified: MacRuby/trunk/pack.c =================================================================== --- MacRuby/trunk/pack.c 2009-10-01 02:25:40 UTC (rev 2697) +++ MacRuby/trunk/pack.c 2009-10-01 07:35:10 UTC (rev 2698) @@ -364,7 +364,7 @@ #endif static const char toofew[] = "too few arguments"; -static void encodes(CFMutableDataRef,const char*,long,int); +static void encodes(CFMutableDataRef,const char*,long,int,int); static void qpencode(CFMutableDataRef,VALUE,long); static unsigned long utf8_to_uv(const char*,long*); @@ -910,6 +910,11 @@ ptr = RSTRING_PTR(from); plen = RSTRING_LEN(from); + if (len == 0 && type == 'm') { + encodes(data, ptr, plen, type, 0); + ptr += plen; + break; + } if (len <= 2) { len = 45; } @@ -925,7 +930,7 @@ else { todo = plen; } - encodes(data, ptr, todo, type); + encodes(data, ptr, todo, type, 1); plen -= todo; ptr += todo; } @@ -1037,7 +1042,7 @@ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; static void -encodes(CFMutableDataRef data, const char *s, long len, int type) +encodes(CFMutableDataRef data, const char *s, long len, int type, int tail_lf) { char *buff = ALLOCA_N(char, len * 4 / 3 + 6); long i = 0; @@ -1052,12 +1057,18 @@ padding = '='; } while (len >= 3) { - 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))]; - buff[i++] = trans[077 & s[2]]; - s += 3; - len -= 3; + while (len >= 3 && sizeof(buff) - 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))]; + buff[i++] = trans[077 & s[2]]; + s += 3; + len -= 3; + } + if (sizeof(buff) - i < 4) { + CFDataAppendBytes(data, (const UInt8 *)buff, i); + i = 0; + } } if (len == 2) { buff[i++] = trans[077 & (*s >> 2)]; @@ -1071,10 +1082,11 @@ buff[i++] = padding; buff[i++] = padding; } - buff[i++] = '\n'; + if (tail_lf) { + buff[i++] = '\n'; + } CFDataAppendBytes(data, (const UInt8 *)buff, i); } - static const char hex_table[] = "0123456789ABCDEF"; static void Modified: MacRuby/trunk/spec/frozen/tags/macruby/core/array/pack_tags.txt =================================================================== --- MacRuby/trunk/spec/frozen/tags/macruby/core/array/pack_tags.txt 2009-10-01 02:25:40 UTC (rev 2697) +++ MacRuby/trunk/spec/frozen/tags/macruby/core/array/pack_tags.txt 2009-10-01 07:35:10 UTC (rev 2698) @@ -8,7 +8,6 @@ fails:Array#pack with format 'H' fills low-nibble of the last byte with 0 when count is odd even if pack argument has insufficient length fails:Array#pack with format 'M' ignores star parameter critical:Array#pack with format 'M' does not check whether the pack argument responds to #to_s before call #to_s -fails:Array#pack with format 'm' does not append newline if line length parameter is 0 fails:Array#pack with format 'U' returns a UTF-8 string fails:Array#pack with format 'm' ignores star parameter fails:Array#pack just ignores unknown format \ No newline at end of file
participants (1)
-
source_changes@macosforge.org