* ext/syck/emitter.c (syck_emitter_flush): accepts count

of bytes to flush.  anchor offsets now functional.

* ext/syck/syck.h (syck_emitter_flush): ditto.

* ext/syck/rubyext.c: ditto.

* ext/syck/token.c: URI escaping now supported.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@4149 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
why 2003-07-24 16:30:43 +00:00
parent c37d8b287e
commit 4d859f926a
5 changed files with 247 additions and 116 deletions

View File

@ -1,3 +1,14 @@
Fri Jul 25 01:27:59 2003 why the lucky stiff <ruby-cvs@whytheluckystiff.net>
* ext/syck/emitter.c (syck_emitter_flush): accepts count
of bytes to flush. anchor offsets now functional.
* ext/syck/syck.h (syck_emitter_flush): ditto.
* ext/syck/rubyext.c: ditto.
* ext/syck/token.c: URI escaping now supported.
Thu Jul 24 16:41:31 2003 Nobuyoshi Nakada <nobu.nokada@softhome.net> Thu Jul 24 16:41:31 2003 Nobuyoshi Nakada <nobu.nokada@softhome.net>
* lib/mkmf.rb (have_type): check if a type is defined. * lib/mkmf.rb (have_type): check if a type is defined.

View File

@ -5,6 +5,9 @@
* $Date$ * $Date$
* *
* Copyright (C) 2003 why the lucky stiff * Copyright (C) 2003 why the lucky stiff
*
* All Base64 code from Ruby's pack.c.
* Ruby is Copyright (C) 1993-2003 Yukihiro Matsumoto
*/ */
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
@ -148,7 +151,7 @@ syck_emitter_write( SyckEmitter *e, char *str, long len )
at = e->marker - e->buffer; at = e->marker - e->buffer;
if ( len + at > e->bufsize ) if ( len + at > e->bufsize )
{ {
syck_emitter_flush( e ); syck_emitter_flush( e, 0 );
} }
/* /*
@ -162,8 +165,26 @@ syck_emitter_write( SyckEmitter *e, char *str, long len )
* Write a chunk of data out. * Write a chunk of data out.
*/ */
void void
syck_emitter_flush( SyckEmitter *e ) syck_emitter_flush( SyckEmitter *e, long check_room )
{ {
/*
* Check for enough space in the buffer for check_room length.
*/
if ( check_room > 0 )
{
if ( e->bufsize > ( e->marker - e->buffer ) + check_room )
{
return;
}
}
else
{
check_room = e->bufsize;
}
/*
* Determine headers.
*/
if ( ( e->stage == doc_open && ( e->headless == 0 || e->use_header == 1 ) ) || if ( ( e->stage == doc_open && ( e->headless == 0 || e->use_header == 1 ) ) ||
e->stage == doc_need_header ) e->stage == doc_need_header )
{ {
@ -181,9 +202,17 @@ syck_emitter_flush( SyckEmitter *e )
} }
e->stage = doc_processing; e->stage = doc_processing;
} }
(e->handler)( e, e->buffer, e->marker - e->buffer );
e->bufpos += e->marker - e->buffer; /*
e->marker = e->buffer; * Commit buffer.
*/
if ( check_room > e->marker - e->buffer )
{
check_room = e->marker - e->buffer;
}
(e->handler)( e, e->buffer, check_room );
e->bufpos += check_room;
e->marker -= check_room;
} }
/* /*
@ -202,9 +231,9 @@ syck_emitter_simple( SyckEmitter *e, char *str, long len )
int int
syck_adjust_anchors( char *key, SyckEmitterNode *n, struct adjust_arg *arg ) syck_adjust_anchors( char *key, SyckEmitterNode *n, struct adjust_arg *arg )
{ {
if ( arg->startpos >= n->pos ) if ( arg->startpos < n->pos )
{ {
n->pos += arg->offset + 1; n->pos += arg->offset;
} }
return ST_CONTINUE; return ST_CONTINUE;
} }
@ -271,32 +300,37 @@ syck_emitter_start_obj( SyckEmitter *e, SYMID oid )
char *start = e->buffer + ( n->pos - e->bufpos ); char *start = e->buffer + ( n->pos - e->bufpos );
char *anc = ( e->anchor_format == NULL ? DEFAULT_ANCHOR_FORMAT : e->anchor_format ); char *anc = ( e->anchor_format == NULL ? DEFAULT_ANCHOR_FORMAT : e->anchor_format );
char *aname = S_ALLOC_N( char, strlen( anc ) + 10 ); anchor_name = S_ALLOC_N( char, strlen( anc ) + 10 );
S_MEMZERO( aname, char, strlen( anc ) + 10 ); S_MEMZERO( anchor_name, char, strlen( anc ) + 10 );
sprintf( aname, anc, idx ); sprintf( anchor_name, anc, idx );
/*
* Need to flush the buffer some, if there is not room for the anchor.
*/
alen = strlen( anchor_name ) + 2;
syck_emitter_flush( e, alen );
/* /*
* Write the anchor into the buffer * Write the anchor into the buffer
* FIXME: Need to flush the buffer some, if there is not room for the anchor.
*/ */
alen = strlen( aname ); S_MEMMOVE( start + alen, start, char, e->marker - start );
S_MEMMOVE( start + alen + 1, start, char, e->marker - start ); S_MEMCPY( start + 1, anchor_name, char, strlen( anchor_name ) );
S_MEMCPY( start + 1, aname, char, alen );
start[0] = '&'; start[0] = '&';
e->marker += alen + 1; start[alen - 1] = ' ';
e->marker += alen;
/* /*
* Cycle through anchors, modify for the size of the anchor. * Cycle through anchors, modify for the size of the anchor.
*/ */
args->startpos = n->pos; args->startpos = n->pos;
args->offset = alen + 1; args->offset = alen;
st_foreach( e->anchors, syck_adjust_anchors, (st_data_t)args ); st_foreach( e->markers, syck_adjust_anchors, (st_data_t)args );
S_FREE( args ); S_FREE( args );
/* /*
* Insert into anchors table * Insert into anchors table
*/ */
st_insert( e->anchors, (st_data_t)oid, (st_data_t)aname ); st_insert( e->anchors, (st_data_t)oid, (st_data_t)anchor_name );
} }
} }

View File

@ -1025,7 +1025,12 @@ rb_syck_output_handler( emitter, str, len )
char *str; char *str;
long len; long len;
{ {
rb_str_cat( (VALUE)emitter->bonus, str, len ); VALUE dest = (VALUE)emitter->bonus;
if ( rb_respond_to( dest, rb_intern("to_str") ) ) {
rb_str_cat( dest, str, len );
} else {
rb_io_write( dest, rb_str_new( str, len ) );
}
} }
/* /*
@ -1104,7 +1109,7 @@ syck_emitter_flush_m( self )
SyckEmitter *emitter; SyckEmitter *emitter;
Data_Get_Struct(self, SyckEmitter, emitter); Data_Get_Struct(self, SyckEmitter, emitter);
syck_emitter_flush( emitter ); syck_emitter_flush( emitter, 0 );
return self; return self;
} }
@ -1171,7 +1176,7 @@ syck_emitter_end_object( self, oid )
if ( emitter->level < 0 ) if ( emitter->level < 0 )
{ {
syck_emitter_flush( emitter ); syck_emitter_flush( emitter, 0 );
} }
return (VALUE)emitter->bonus; return (VALUE)emitter->bonus;
} }

View File

@ -13,7 +13,7 @@
#define SYCK_YAML_MAJOR 1 #define SYCK_YAML_MAJOR 1
#define SYCK_YAML_MINOR 0 #define SYCK_YAML_MINOR 0
#define SYCK_VERSION "0.35" #define SYCK_VERSION "0.38"
#define YAML_DOMAIN "yaml.org,2002" #define YAML_DOMAIN "yaml.org,2002"
#include <stdio.h> #include <stdio.h>
@ -308,7 +308,7 @@ void syck_emitter_handler( SyckEmitter *, SyckOutputHandler );
void syck_free_emitter( SyckEmitter * ); void syck_free_emitter( SyckEmitter * );
void syck_emitter_clear( SyckEmitter * ); void syck_emitter_clear( SyckEmitter * );
void syck_emitter_write( SyckEmitter *, char *, long ); void syck_emitter_write( SyckEmitter *, char *, long );
void syck_emitter_flush( SyckEmitter * ); void syck_emitter_flush( SyckEmitter *, long );
char *syck_emitter_start_obj( SyckEmitter *, SYMID ); char *syck_emitter_start_obj( SyckEmitter *, SYMID );
void syck_emitter_end_obj( SyckEmitter * ); void syck_emitter_end_obj( SyckEmitter * );
SyckParser *syck_new_parser(); SyckParser *syck_new_parser();

View File

@ -1,4 +1,4 @@
/* Generated by re2c 0.5 on Sun Jun 15 16:14:26 2003 */ /* Generated by re2c 0.5 on Thu Jul 24 10:01:15 2003 */
#line 1 "token.re" #line 1 "token.re"
/* /*
* token.re * token.re
@ -1685,7 +1685,7 @@ yy153:
} }
else if ( indt_len < lvl->spaces ) else if ( indt_len < lvl->spaces )
{ {
/* Error! */ /* FIXME */
} }
if ( keep_nl == 1 ) if ( keep_nl == 1 )
@ -1880,6 +1880,11 @@ yy175: ++YYCURSOR;
TransferMethod: TransferMethod:
{ {
int qidx = 0;
int qcapa = 100;
char *qstr = S_ALLOC_N( char, qcapa );
TransferMethod2:
YYTOKTMP = YYCURSOR; YYTOKTMP = YYCURSOR;
{ {
@ -1888,22 +1893,28 @@ TransferMethod:
goto yy176; goto yy176;
yy177: ++YYCURSOR; yy177: ++YYCURSOR;
yy176: yy176:
if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); if((YYLIMIT - YYCURSOR) < 4) YYFILL(4);
yych = *YYCURSOR; yych = *YYCURSOR;
switch(yych){ switch(yych){
case '\000': goto yy178; case '\000': goto yy178;
case '\n': goto yy179; case '\n': goto yy179;
case '\r': goto yy182; case '\r': goto yy182;
case ' ': goto yy181; case ' ': goto yy181;
default: goto yy184; case '\\': goto yy184;
default: goto yy185;
} }
yy178:yy179: yych = *++YYCURSOR; yy178: YYCURSOR = YYMARKER;
switch(yyaccept){
case 0: goto yy183;
}
yy179: yych = *++YYCURSOR;
yy180: yy180:
#line 694 #line 699
{ SyckLevel *lvl; { SyckLevel *lvl;
YYCURSOR = YYTOKTMP; YYCURSOR = YYTOKTMP;
if ( YYCURSOR == YYTOKEN + 1 ) if ( YYCURSOR == YYTOKEN + 1 )
{ {
free( qstr );
return ITRANSFER; return ITRANSFER;
} }
@ -1912,62 +1923,132 @@ yy180:
/* /*
* URL Prefixing * URL Prefixing
*/ */
if ( *(YYTOKEN + 1) == '^' ) if ( *qstr == '^' )
{ {
yylval->name = S_ALLOC_N( char, ( YYCURSOR - YYTOKEN ) + strlen( lvl->domain ) ); yylval->name = S_ALLOC_N( char, qidx + strlen( lvl->domain ) );
yylval->name[0] = '\0'; yylval->name[0] = '\0';
strcat( yylval->name, lvl->domain ); strcat( yylval->name, lvl->domain );
strncat( yylval->name, YYTOKEN + 2, ( YYCURSOR - YYTOKEN ) - 2 ); strncat( yylval->name, qstr + 1, qidx - 1 );
free( qstr );
} }
else else
{ {
char *carat = YYTOKEN; char *carat = qstr;
while ( (++carat) < YYCURSOR ) char *qend = qstr + qidx;
while ( (++carat) < qend )
{ {
if ( *carat == '^' ) if ( *carat == '^' )
break; break;
} }
if ( carat < YYCURSOR ) if ( carat < qend )
{ {
free( lvl->domain ); free( lvl->domain );
lvl->domain = syck_strndup( YYTOKEN + 1, ( carat - YYTOKEN ) - 1 ); lvl->domain = syck_strndup( qstr, carat - qstr );
yylval->name = S_ALLOC_N( char, ( YYCURSOR - carat ) + strlen( lvl->domain ) ); yylval->name = S_ALLOC_N( char, ( qend - carat ) + strlen( lvl->domain ) );
yylval->name[0] = '\0'; yylval->name[0] = '\0';
strcat( yylval->name, lvl->domain ); strcat( yylval->name, lvl->domain );
strncat( yylval->name, carat + 1, ( YYCURSOR - carat ) - 1 ); strncat( yylval->name, carat + 1, ( qend - carat ) - 1 );
free( qstr );
} }
else else
{ {
yylval->name = syck_strndup( YYTOKEN + 1, ( YYCURSOR - YYTOKEN ) - 1 ); yylval->name = qstr;
} }
} }
return TRANSFER; return TRANSFER;
} }
yy181: yych = *++YYCURSOR; yy181: yych = *++YYCURSOR;
goto yy187; goto yy192;
yy182: yych = *++YYCURSOR; yy182: yych = *++YYCURSOR;
switch(yych){ switch(yych){
case '\n': goto yy185; case '\n': goto yy190;
default: goto yy183; default: goto yy183;
} }
yy183: yy183:
#line 740 #line 761
{ goto TransferMethod; } { QUOTECAT(qstr, qcapa, qidx, *(YYCURSOR - 1));
yy184: yych = *++YYCURSOR; goto TransferMethod2;
goto yy183; }
yy184: yyaccept = 0;
yych = *(YYMARKER = ++YYCURSOR);
switch(yych){
case 'x': goto yy186;
default: goto yy183;
}
yy185: yych = *++YYCURSOR; yy185: yych = *++YYCURSOR;
goto yy183;
yy186: yych = *++YYCURSOR;
switch(yych){
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F': case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f': goto yy187;
default: goto yy178;
}
yy187: yych = *++YYCURSOR;
switch(yych){
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F': case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f': goto yy188;
default: goto yy178;
}
yy188: yych = *++YYCURSOR;
yy189:
#line 752
{ long ch;
char *chr_text = syck_strndup( YYTOKTMP, 4 );
chr_text[0] = '0';
ch = strtol( chr_text, NULL, 16 );
free( chr_text );
QUOTECAT(qstr, qcapa, qidx, ch);
goto TransferMethod2;
}
yy190: yych = *++YYCURSOR;
goto yy180; goto yy180;
yy186: ++YYCURSOR; yy191: ++YYCURSOR;
if(YYLIMIT == YYCURSOR) YYFILL(1); if(YYLIMIT == YYCURSOR) YYFILL(1);
yych = *YYCURSOR; yych = *YYCURSOR;
yy187: switch(yych){ yy192: switch(yych){
case ' ': goto yy186; case ' ': goto yy191;
default: goto yy180; default: goto yy180;
} }
} }
#line 742 #line 766
} }
@ -2017,23 +2098,23 @@ ScalarBlock2:
{ {
YYCTYPE yych; YYCTYPE yych;
unsigned int yyaccept; unsigned int yyaccept;
goto yy188; goto yy193;
yy189: ++YYCURSOR; yy194: ++YYCURSOR;
yy188: yy193:
if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
yych = *YYCURSOR; yych = *YYCURSOR;
switch(yych){ switch(yych){
case '\000': goto yy196; case '\000': goto yy201;
case '\n': goto yy190; case '\n': goto yy195;
case '\r': goto yy192; case '\r': goto yy197;
case '#': goto yy194; case '#': goto yy199;
default: goto yy198; default: goto yy203;
} }
yy190: yyaccept = 0; yy195: yyaccept = 0;
yych = *(YYMARKER = ++YYCURSOR); yych = *(YYMARKER = ++YYCURSOR);
goto yy200; goto yy205;
yy191: yy196:
#line 790 #line 814
{ char *pacer; { char *pacer;
char *tok = YYTOKTMP; char *tok = YYTOKTMP;
int indt_len = 0, nl_count = 0, fold_nl = 0, nl_begin = 0; int indt_len = 0, nl_count = 0, fold_nl = 0, nl_begin = 0;
@ -2099,19 +2180,19 @@ yy191:
} }
goto ScalarBlock2; goto ScalarBlock2;
} }
yy192: yych = *++YYCURSOR; yy197: yych = *++YYCURSOR;
switch(yych){ switch(yych){
case '\n': goto yy199; case '\n': goto yy204;
default: goto yy193; default: goto yy198;
} }
yy193: yy198:
#line 876 #line 900
{ QUOTECAT(qstr, qcapa, qidx, *YYTOKTMP); { QUOTECAT(qstr, qcapa, qidx, *YYTOKTMP);
goto ScalarBlock2; goto ScalarBlock2;
} }
yy194: yych = *++YYCURSOR; yy199: yych = *++YYCURSOR;
yy195: yy200:
#line 857 #line 881
{ lvl = CURRENT_LEVEL(); { lvl = CURRENT_LEVEL();
if ( lvl->status != syck_lvl_block ) if ( lvl->status != syck_lvl_block )
{ {
@ -2124,37 +2205,37 @@ yy195:
} }
goto ScalarBlock2; goto ScalarBlock2;
} }
yy196: yych = *++YYCURSOR; yy201: yych = *++YYCURSOR;
yy197: yy202:
#line 871 #line 895
{ YYCURSOR--; { YYCURSOR--;
POP_LEVEL(); POP_LEVEL();
RETURN_BLOCK(); RETURN_BLOCK();
} }
yy198: yych = *++YYCURSOR; yy203: yych = *++YYCURSOR;
goto yy193; goto yy198;
yy199: yyaccept = 0; yy204: yyaccept = 0;
YYMARKER = ++YYCURSOR; YYMARKER = ++YYCURSOR;
if(YYLIMIT == YYCURSOR) YYFILL(1); if(YYLIMIT == YYCURSOR) YYFILL(1);
yych = *YYCURSOR; yych = *YYCURSOR;
yy200: switch(yych){ yy205: switch(yych){
case '\n': case ' ': goto yy199; case '\n': case ' ': goto yy204;
case '\r': goto yy201; case '\r': goto yy206;
default: goto yy191; default: goto yy196;
} }
yy201: ++YYCURSOR; yy206: ++YYCURSOR;
if(YYLIMIT == YYCURSOR) YYFILL(1); if(YYLIMIT == YYCURSOR) YYFILL(1);
yych = *YYCURSOR; yych = *YYCURSOR;
switch(yych){ switch(yych){
case '\n': goto yy199; case '\n': goto yy204;
default: goto yy202; default: goto yy207;
} }
yy202: YYCURSOR = YYMARKER; yy207: YYCURSOR = YYMARKER;
switch(yyaccept){ switch(yyaccept){
case 0: goto yy191; case 0: goto yy196;
} }
} }
#line 881 #line 905
} }
@ -2172,60 +2253,60 @@ Comment:
{ {
YYCTYPE yych; YYCTYPE yych;
unsigned int yyaccept; unsigned int yyaccept;
goto yy203; goto yy208;
yy204: ++YYCURSOR; yy209: ++YYCURSOR;
yy203: yy208:
if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
yych = *YYCURSOR; yych = *YYCURSOR;
switch(yych){ switch(yych){
case '\000': goto yy205; case '\000': goto yy210;
case '\n': goto yy207; case '\n': goto yy212;
case '\r': goto yy208; case '\r': goto yy213;
default: goto yy210; default: goto yy215;
} }
yy205: yych = *++YYCURSOR; yy210: yych = *++YYCURSOR;
yy206: yy211:
#line 897 #line 921
{ SyckLevel *lvl = CURRENT_LEVEL(); { SyckLevel *lvl = CURRENT_LEVEL();
YYCURSOR = tok; YYCURSOR = tok;
return; return;
} }
yy207: yyaccept = 0; yy212: yyaccept = 0;
yych = *(YYMARKER = ++YYCURSOR); yych = *(YYMARKER = ++YYCURSOR);
goto yy212; goto yy217;
yy208: yych = *++YYCURSOR; yy213: yych = *++YYCURSOR;
switch(yych){ switch(yych){
case '\n': goto yy211; case '\n': goto yy216;
default: goto yy209; default: goto yy214;
} }
yy209: yy214:
#line 902 #line 926
{ goto Comment; { goto Comment;
} }
yy210: yych = *++YYCURSOR; yy215: yych = *++YYCURSOR;
goto yy209; goto yy214;
yy211: yyaccept = 0; yy216: yyaccept = 0;
YYMARKER = ++YYCURSOR; YYMARKER = ++YYCURSOR;
if(YYLIMIT == YYCURSOR) YYFILL(1); if(YYLIMIT == YYCURSOR) YYFILL(1);
yych = *YYCURSOR; yych = *YYCURSOR;
yy212: switch(yych){ yy217: switch(yych){
case '\n': goto yy211; case '\n': goto yy216;
case '\r': goto yy213; case '\r': goto yy218;
default: goto yy206; default: goto yy211;
} }
yy213: ++YYCURSOR; yy218: ++YYCURSOR;
if(YYLIMIT == YYCURSOR) YYFILL(1); if(YYLIMIT == YYCURSOR) YYFILL(1);
yych = *YYCURSOR; yych = *YYCURSOR;
switch(yych){ switch(yych){
case '\n': goto yy211; case '\n': goto yy216;
default: goto yy214; default: goto yy219;
} }
yy214: YYCURSOR = YYMARKER; yy219: YYCURSOR = YYMARKER;
switch(yyaccept){ switch(yyaccept){
case 0: goto yy206; case 0: goto yy211;
} }
} }
#line 905 #line 929
} }