Report abuse


			
Index: test/test_parser.rb
===================================================================
--- test/test_parser.rb (revision 155)
+++ test/test_parser.rb (working copy)
@@ -299,10 +299,10 @@
     assert_equal "blah='blah'", doc.children[2].content
   end

-  def test_buffer_error
-    assert_raise Hpricot::ParseError, "ran out of buffer space on element , starting on line 3." do
-      Hpricot(%{

\n\n\n\n

}) - end + def test_no_buffer_error + viewstate = (("X" * 2000) + "\n") * 100 + doc = Hpricot(%{

\n\n\n\n

}) + assert_equal viewstate, (doc/:input)[0].get_attribute('value') end def test_youtube_attr Index: ext/hpricot_scan/hpricot_scan.rl =================================================================== --- ext/hpricot_scan/hpricot_scan.rl (revision 155) +++ ext/hpricot_scan/hpricot_scan.rl (working copy) @@ -162,16 +162,30 @@ while ( !done ) { VALUE str; - char *p = buf + have, *pe; - int len, space = buffer_size - have; + char *p, *pe; + int len, space = buffer_size - have, tokstart_diff, tokend_diff, mark_tag_diff, mark_akey_diff, mark_aval_diff; if ( space == 0 ) { - /* We've used up the entire buffer storing an already-parsed token - * prefix that must be preserved. Likely caused by super-long attributes. - * See ticket #13. */ - rb_raise(rb_eHpricotParseError, "ran out of buffer space on element <%s>, starting on line %d.", RSTRING(tag)->ptr, curline); + tokstart_diff = tokstart - buf; + tokend_diff = tokend - buf; + mark_tag_diff = mark_tag - buf; + mark_akey_diff = mark_akey - buf; + mark_aval_diff = mark_aval - buf; + + buffer_size += BUFSIZE; + buf = REALLOC_N(buf, char, buffer_size); + + space = buffer_size - have; + + tokstart = buf + tokstart_diff; + tokend = buf + tokend_diff; + mark_tag = buf + mark_tag_diff; + mark_akey = buf + mark_akey_diff; + mark_aval = buf + mark_aval_diff; } + p = buf + have; + if ( rb_respond_to( port, s_read ) ) { str = rb_funcall( port, s_read, 1, INT2FIX(space) );