2003-07-11 19:44:37 -04:00
|
|
|
/*
|
|
|
|
* emitter.c
|
|
|
|
*
|
|
|
|
* $Author$
|
|
|
|
*
|
|
|
|
* Copyright (C) 2003 why the lucky stiff
|
2003-07-24 12:30:43 -04:00
|
|
|
*
|
|
|
|
* All Base64 code from Ruby's pack.c.
|
* encoding.c: provide basic features for M17N.
* parse.y: encoding aware parsing.
* parse.y (pragma_encoding): encoding specification pragma.
* parse.y (rb_intern3): encoding specified symbols.
* string.c (rb_str_length): length based on characters.
for older behavior, bytesize method added.
* string.c (rb_str_index_m): index based on characters. rindex as
well.
* string.c (succ_char): encoding aware succeeding string.
* string.c (rb_str_reverse): reverse based on characters.
* string.c (rb_str_inspect): encoding aware string description.
* string.c (rb_str_upcase_bang): encoding aware case conversion.
downcase, capitalize, swapcase as well.
* string.c (rb_str_tr_bang): tr based on characters. delete,
squeeze, tr_s, count as well.
* string.c (rb_str_split_m): split based on characters.
* string.c (rb_str_each_line): encoding aware each_line.
* string.c (rb_str_each_char): added. iteration based on
characters.
* string.c (rb_str_strip_bang): encoding aware whitespace
stripping. lstrip, rstrip as well.
* string.c (rb_str_justify): encoding aware justifying (ljust,
rjust, center).
* string.c (str_encoding): get encoding attribute from a string.
* re.c (rb_reg_initialize): encoding aware regular expression
* sprintf.c (rb_str_format): formatting (i.e. length count) based
on characters.
* io.c (rb_io_getc): getc to return one-character string.
for older behavior, getbyte method added.
* ext/stringio/stringio.c (strio_getc): ditto.
* io.c (rb_io_ungetc): allow pushing arbitrary string at the
current reading point.
* ext/stringio/stringio.c (strio_ungetc): ditto.
* ext/strscan/strscan.c: encoding support.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@13261 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-08-24 23:29:39 -04:00
|
|
|
* Ruby is Copyright (C) 1993-2007 Yukihiro Matsumoto
|
2003-07-11 19:44:37 -04:00
|
|
|
*/
|
2007-06-09 23:06:15 -04:00
|
|
|
#include "ruby/ruby.h"
|
2004-05-06 02:29:56 -04:00
|
|
|
|
2003-07-11 19:44:37 -04:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
#include "syck.h"
|
|
|
|
|
|
|
|
#define DEFAULT_ANCHOR_FORMAT "id%03d"
|
|
|
|
|
2005-09-12 23:58:33 -04:00
|
|
|
const char hex_table[] =
|
|
|
|
"0123456789ABCDEF";
|
2003-07-28 15:27:42 -04:00
|
|
|
static char b64_table[] =
|
|
|
|
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Built-in base64 (from Ruby's pack.c)
|
|
|
|
*/
|
|
|
|
char *
|
|
|
|
syck_base64enc( char *s, long len )
|
|
|
|
{
|
|
|
|
long i = 0;
|
|
|
|
int padding = '=';
|
2005-09-12 23:58:33 -04:00
|
|
|
char *buff = S_ALLOC_N(char, len * 4 / 3 + 6);
|
2003-07-28 15:27:42 -04:00
|
|
|
|
|
|
|
while (len >= 3) {
|
|
|
|
buff[i++] = b64_table[077 & (*s >> 2)];
|
|
|
|
buff[i++] = b64_table[077 & (((*s << 4) & 060) | ((s[1] >> 4) & 017))];
|
|
|
|
buff[i++] = b64_table[077 & (((s[1] << 2) & 074) | ((s[2] >> 6) & 03))];
|
|
|
|
buff[i++] = b64_table[077 & s[2]];
|
|
|
|
s += 3;
|
|
|
|
len -= 3;
|
|
|
|
}
|
|
|
|
if (len == 2) {
|
|
|
|
buff[i++] = b64_table[077 & (*s >> 2)];
|
|
|
|
buff[i++] = b64_table[077 & (((*s << 4) & 060) | ((s[1] >> 4) & 017))];
|
|
|
|
buff[i++] = b64_table[077 & (((s[1] << 2) & 074) | (('\0' >> 6) & 03))];
|
|
|
|
buff[i++] = padding;
|
|
|
|
}
|
|
|
|
else if (len == 1) {
|
|
|
|
buff[i++] = b64_table[077 & (*s >> 2)];
|
|
|
|
buff[i++] = b64_table[077 & (((*s << 4) & 060) | (('\0' >> 4) & 017))];
|
|
|
|
buff[i++] = padding;
|
|
|
|
buff[i++] = padding;
|
|
|
|
}
|
|
|
|
buff[i++] = '\n';
|
|
|
|
return buff;
|
|
|
|
}
|
|
|
|
|
|
|
|
char *
|
|
|
|
syck_base64dec( char *s, long len )
|
|
|
|
{
|
|
|
|
int a = -1,b = -1,c = 0,d;
|
|
|
|
static int first = 1;
|
|
|
|
static int b64_xtable[256];
|
|
|
|
char *ptr = syck_strndup( s, len );
|
|
|
|
char *end = ptr;
|
|
|
|
char *send = s + len;
|
|
|
|
|
|
|
|
if (first) {
|
|
|
|
int i;
|
|
|
|
first = 0;
|
|
|
|
|
|
|
|
for (i = 0; i < 256; i++) {
|
|
|
|
b64_xtable[i] = -1;
|
|
|
|
}
|
|
|
|
for (i = 0; i < 64; i++) {
|
|
|
|
b64_xtable[(int)b64_table[i]] = i;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
while (s < send) {
|
|
|
|
while (s[0] == '\r' || s[0] == '\n') { s++; }
|
|
|
|
if ((a = b64_xtable[(int)s[0]]) == -1) break;
|
|
|
|
if ((b = b64_xtable[(int)s[1]]) == -1) break;
|
|
|
|
if ((c = b64_xtable[(int)s[2]]) == -1) break;
|
|
|
|
if ((d = b64_xtable[(int)s[3]]) == -1) break;
|
|
|
|
*end++ = a << 2 | b >> 4;
|
|
|
|
*end++ = b << 4 | c >> 2;
|
|
|
|
*end++ = c << 6 | d;
|
|
|
|
s += 4;
|
|
|
|
}
|
|
|
|
if (a != -1 && b != -1) {
|
|
|
|
if (s + 2 < send && s[2] == '=')
|
|
|
|
*end++ = a << 2 | b >> 4;
|
|
|
|
if (c != -1 && s + 3 < send && s[3] == '=') {
|
|
|
|
*end++ = a << 2 | b >> 4;
|
|
|
|
*end++ = b << 4 | c >> 2;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
*end = '\0';
|
2006-08-31 08:10:08 -04:00
|
|
|
/*RSTRING_LEN(buf) = ptr - RSTRING_PTR(buf);*/
|
2003-07-28 15:27:42 -04:00
|
|
|
return ptr;
|
|
|
|
}
|
|
|
|
|
2003-07-11 19:44:37 -04:00
|
|
|
/*
|
|
|
|
* Allocate an emitter
|
|
|
|
*/
|
|
|
|
SyckEmitter *
|
2006-06-20 14:02:17 -04:00
|
|
|
syck_new_emitter(void)
|
2003-07-11 19:44:37 -04:00
|
|
|
{
|
|
|
|
SyckEmitter *e;
|
|
|
|
e = S_ALLOC( SyckEmitter );
|
|
|
|
e->headless = 0;
|
|
|
|
e->use_header = 0;
|
|
|
|
e->use_version = 0;
|
|
|
|
e->sort_keys = 0;
|
|
|
|
e->anchor_format = NULL;
|
|
|
|
e->explicit_typing = 0;
|
|
|
|
e->best_width = 80;
|
2005-09-12 23:58:33 -04:00
|
|
|
e->style = scalar_none;
|
2003-07-11 19:44:37 -04:00
|
|
|
e->stage = doc_open;
|
|
|
|
e->indent = 2;
|
|
|
|
e->level = -1;
|
|
|
|
e->anchors = NULL;
|
|
|
|
e->markers = NULL;
|
2005-09-12 23:58:33 -04:00
|
|
|
e->anchored = NULL;
|
2003-07-11 19:44:37 -04:00
|
|
|
e->bufsize = SYCK_BUFFERSIZE;
|
|
|
|
e->buffer = NULL;
|
|
|
|
e->marker = NULL;
|
|
|
|
e->bufpos = 0;
|
2005-09-12 23:58:33 -04:00
|
|
|
e->emitter_handler = NULL;
|
|
|
|
e->output_handler = NULL;
|
|
|
|
e->lvl_idx = 0;
|
|
|
|
e->lvl_capa = ALLOC_CT;
|
|
|
|
e->levels = S_ALLOC_N( SyckLevel, e->lvl_capa );
|
|
|
|
syck_emitter_reset_levels( e );
|
2003-07-11 19:44:37 -04:00
|
|
|
e->bonus = NULL;
|
|
|
|
return e;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
syck_st_free_anchors( char *key, char *name, char *arg )
|
|
|
|
{
|
|
|
|
S_FREE( name );
|
|
|
|
return ST_CONTINUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
syck_emitter_st_free( SyckEmitter *e )
|
|
|
|
{
|
|
|
|
/*
|
|
|
|
* Free the anchor tables
|
|
|
|
*/
|
|
|
|
if ( e->anchors != NULL )
|
|
|
|
{
|
|
|
|
st_foreach( e->anchors, syck_st_free_anchors, 0 );
|
|
|
|
st_free_table( e->anchors );
|
|
|
|
e->anchors = NULL;
|
|
|
|
}
|
|
|
|
|
2005-09-12 23:58:33 -04:00
|
|
|
if ( e->anchored != NULL )
|
|
|
|
{
|
|
|
|
st_free_table( e->anchored );
|
|
|
|
e->anchored = NULL;
|
|
|
|
}
|
|
|
|
|
2003-07-11 19:44:37 -04:00
|
|
|
/*
|
|
|
|
* Free the markers tables
|
|
|
|
*/
|
|
|
|
if ( e->markers != NULL )
|
|
|
|
{
|
|
|
|
st_free_table( e->markers );
|
|
|
|
e->markers = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2005-09-12 23:58:33 -04:00
|
|
|
SyckLevel *
|
|
|
|
syck_emitter_current_level( SyckEmitter *e )
|
|
|
|
{
|
|
|
|
return &e->levels[e->lvl_idx-1];
|
|
|
|
}
|
|
|
|
|
|
|
|
SyckLevel *
|
|
|
|
syck_emitter_parent_level( SyckEmitter *e )
|
|
|
|
{
|
|
|
|
return &e->levels[e->lvl_idx-2];
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
syck_emitter_pop_level( SyckEmitter *e )
|
|
|
|
{
|
|
|
|
ASSERT( e != NULL );
|
|
|
|
|
|
|
|
/* The root level should never be popped */
|
|
|
|
if ( e->lvl_idx <= 1 ) return;
|
|
|
|
|
|
|
|
e->lvl_idx -= 1;
|
|
|
|
free( e->levels[e->lvl_idx].domain );
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
syck_emitter_add_level( SyckEmitter *e, int len, enum syck_level_status status )
|
|
|
|
{
|
|
|
|
ASSERT( e != NULL );
|
|
|
|
if ( e->lvl_idx + 1 > e->lvl_capa )
|
|
|
|
{
|
|
|
|
e->lvl_capa += ALLOC_CT;
|
|
|
|
S_REALLOC_N( e->levels, SyckLevel, e->lvl_capa );
|
|
|
|
}
|
|
|
|
|
|
|
|
ASSERT( len > e->levels[e->lvl_idx-1].spaces );
|
|
|
|
e->levels[e->lvl_idx].spaces = len;
|
|
|
|
e->levels[e->lvl_idx].ncount = 0;
|
|
|
|
e->levels[e->lvl_idx].domain = syck_strndup( e->levels[e->lvl_idx-1].domain, strlen( e->levels[e->lvl_idx-1].domain ) );
|
|
|
|
e->levels[e->lvl_idx].status = status;
|
|
|
|
e->levels[e->lvl_idx].anctag = 0;
|
|
|
|
e->lvl_idx += 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
syck_emitter_reset_levels( SyckEmitter *e )
|
|
|
|
{
|
|
|
|
while ( e->lvl_idx > 1 )
|
|
|
|
{
|
|
|
|
syck_emitter_pop_level( e );
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( e->lvl_idx < 1 )
|
|
|
|
{
|
|
|
|
e->lvl_idx = 1;
|
|
|
|
e->levels[0].spaces = -1;
|
|
|
|
e->levels[0].ncount = 0;
|
|
|
|
e->levels[0].domain = syck_strndup( "", 0 );
|
|
|
|
e->levels[0].anctag = 0;
|
|
|
|
}
|
|
|
|
e->levels[0].status = syck_lvl_header;
|
|
|
|
}
|
|
|
|
|
2003-07-11 19:44:37 -04:00
|
|
|
void
|
2005-09-12 23:58:33 -04:00
|
|
|
syck_emitter_handler( SyckEmitter *e, SyckEmitterHandler hdlr )
|
2003-07-11 19:44:37 -04:00
|
|
|
{
|
2005-09-12 23:58:33 -04:00
|
|
|
e->emitter_handler = hdlr;
|
2003-07-11 19:44:37 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2005-09-12 23:58:33 -04:00
|
|
|
syck_output_handler( SyckEmitter *e, SyckOutputHandler hdlr )
|
2003-07-11 19:44:37 -04:00
|
|
|
{
|
2005-09-12 23:58:33 -04:00
|
|
|
e->output_handler = hdlr;
|
2003-07-11 19:44:37 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
syck_free_emitter( SyckEmitter *e )
|
|
|
|
{
|
|
|
|
/*
|
|
|
|
* Free tables
|
|
|
|
*/
|
|
|
|
syck_emitter_st_free( e );
|
2005-09-12 23:58:33 -04:00
|
|
|
syck_emitter_reset_levels( e );
|
|
|
|
S_FREE( e->levels[0].domain );
|
|
|
|
S_FREE( e->levels );
|
2003-07-11 19:44:37 -04:00
|
|
|
if ( e->buffer != NULL )
|
|
|
|
{
|
|
|
|
S_FREE( e->buffer );
|
|
|
|
}
|
|
|
|
S_FREE( e );
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
syck_emitter_clear( SyckEmitter *e )
|
|
|
|
{
|
|
|
|
if ( e->buffer == NULL )
|
|
|
|
{
|
|
|
|
e->buffer = S_ALLOC_N( char, e->bufsize );
|
|
|
|
S_MEMZERO( e->buffer, char, e->bufsize );
|
|
|
|
}
|
|
|
|
e->buffer[0] = '\0';
|
|
|
|
e->marker = e->buffer;
|
|
|
|
e->bufpos = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Raw write to the emitter buffer.
|
|
|
|
*/
|
|
|
|
void
|
* sprintf.c (rb_str_format): allow %c to print one character
string (e.g. ?x).
* lib/tempfile.rb (Tempfile::make_tmpname): put dot between
basename and pid. [ruby-talk:196272]
* parse.y (do_block): remove -> style block.
* parse.y (parser_yylex): remove tLAMBDA_ARG.
* eval.c (rb_call0): binding for the return event hook should have
consistent scope. [ruby-core:07928]
* eval.c (proc_invoke): return behavior should depend whether it
is surrounded by a lambda or a mere block.
* eval.c (formal_assign): handles post splat arguments.
* eval.c (rb_call0): ditto.
* st.c (strhash): use FNV-1a hash.
* parse.y (parser_yylex): removed experimental ';;' terminator.
* eval.c (rb_node_arity): should be aware of post splat arguments.
* eval.c (rb_proc_arity): ditto.
* parse.y (f_args): syntax rule enhanced to support arguments
after the splat.
* parse.y (block_param): ditto for block parameters.
* parse.y (f_post_arg): mandatory formal arguments after the splat
argument.
* parse.y (new_args_gen): generate nodes for mandatory formal
arguments after the splat argument.
* eval.c (rb_eval): dispatch mandatory formal arguments after the
splat argument.
* parse.y (args): allow more than one splat in the argument list.
* parse.y (method_call): allow aref [] to accept all kind of
method argument, including assocs, splat, and block argument.
* eval.c (SETUP_ARGS0): prepare block argument as well.
* lib/mathn.rb (Integer): remove Integer#gcd2. [ruby-core:07931]
* eval.c (error_line): print receivers true/false/nil specially.
* eval.c (rb_proc_yield): handles parameters in yield semantics.
* eval.c (nil_yield): gives LocalJumpError to denote no block
error.
* io.c (rb_io_getc): now takes one-character string.
* string.c (rb_str_hash): use FNV-1a hash from Fowler/Noll/Vo
hashing algorithm.
* string.c (rb_str_aref): str[0] now returns 1 character string,
instead of a fixnum. [Ruby2]
* parse.y (parser_yylex): ?c now returns 1 character string,
instead of a fixnum. [Ruby2]
* string.c (rb_str_aset): no longer support fixnum insertion.
* eval.c (umethod_bind): should not update original class.
[ruby-dev:28636]
* eval.c (ev_const_get): should support constant access from
within instance_eval(). [ruby-dev:28327]
* time.c (time_timeval): should round for usec floating
number. [ruby-core:07896]
* time.c (time_add): ditto.
* dir.c (sys_warning): should not call a vararg function
rb_sys_warning() indirectly. [ruby-core:07886]
* numeric.c (flo_divmod): the first element of Float#divmod should
be an integer. [ruby-dev:28589]
* test/ruby/test_float.rb: add tests for divmod, div, modulo and remainder.
* re.c (rb_reg_initialize): should not allow modifying literal
regexps. frozen check moved from rb_reg_initialize_m as well.
* re.c (rb_reg_initialize): should not modify untainted objects in
safe levels higher than 3.
* re.c (rb_memcmp): type change from char* to const void*.
* dir.c (dir_close): should not close untainted dir stream.
* dir.c (GetDIR): add tainted/frozen check for each dir operation.
* lib/rdoc/parsers/parse_rb.rb (RDoc::RubyParser::parse_symbol_arg):
typo fixed. a patch from Florian Gross <florg at florg.net>.
* eval.c (EXEC_EVENT_HOOK): trace_func may remove itself from
event_hooks. no guarantee for arbitrary hook deletion.
[ruby-dev:28632]
* util.c (ruby_strtod): differ addition to minimize error.
[ruby-dev:28619]
* util.c (ruby_strtod): should not raise ERANGE when the input
string does not have any digits. [ruby-dev:28629]
* eval.c (proc_invoke): should restore old ruby_frame->block.
thanks to ts <decoux at moulon.inra.fr>. [ruby-core:07833]
also fix [ruby-dev:28614] as well.
* signal.c (trap): sig should be less then NSIG. Coverity found
this bug. a patch from Kevin Tew <tewk at tewk.com>.
[ruby-core:07823]
* math.c (math_log2): add new method inspired by
[ruby-talk:191237].
* math.c (math_log): add optional base argument to Math::log().
[ruby-talk:191308]
* ext/syck/emitter.c (syck_scan_scalar): avoid accessing
uninitialized array element. a patch from Pat Eyler
<rubypate at gmail.com>. [ruby-core:07809]
* array.c (rb_ary_fill): initialize local variables first. a
patch from Pat Eyler <rubypate at gmail.com>. [ruby-core:07810]
* ext/syck/yaml2byte.c (syck_yaml2byte_handler): need to free
type_tag. a patch from Pat Eyler <rubypate at gmail.com>.
[ruby-core:07808]
* ext/socket/socket.c (make_hostent_internal): accept ai_family
check from Sam Roberts <sroberts at uniserve.com>.
[ruby-core:07691]
* util.c (ruby_strtod): should not cut off 18 digits for no
reason. [ruby-core:07796]
* array.c (rb_ary_fill): internalize local variable "beg" to
pacify Coverity. [ruby-core:07770]
* pack.c (pack_unpack): now supports CRLF newlines. a patch from
<tommy at tmtm.org>. [ruby-dev:28601]
* applied code clean-up patch from Stefan Huehner
<stefan at huehner.org>. [ruby-core:07764]
* lib/jcode.rb (String::tr_s): should have translated non
squeezing character sequence (i.e. a character) as well. thanks
to Hiroshi Ichikawa <gimite at gimite.ddo.jp> [ruby-list:42090]
* ext/socket/socket.c: document update patch from Sam Roberts
<sroberts at uniserve.com>. [ruby-core:07701]
* lib/mathn.rb (Integer): need not to remove gcd2. a patch from
NARUSE, Yui <naruse at airemix.com>. [ruby-dev:28570]
* parse.y (arg): too much NEW_LIST()
* eval.c (SETUP_ARGS0): remove unnecessary access to nd_alen.
* eval.c (rb_eval): use ARGSCAT for NODE_OP_ASGN1.
[ruby-dev:28585]
* parse.y (arg): use NODE_ARGSCAT for placeholder.
* lib/getoptlong.rb (GetoptLong::get): RDoc update patch from
mathew <meta at pobox.com>. [ruby-core:07738]
* variable.c (rb_const_set): raise error when no target klass is
supplied. [ruby-dev:28582]
* prec.c (prec_prec_f): documentation patch from
<gerardo.santana at gmail.com>. [ruby-core:07689]
* bignum.c (rb_big_pow): second operand may be too big even if
it's a Fixnum. [ruby-talk:187984]
* README.EXT: update symbol description. [ruby-talk:188104]
* COPYING: explicitly note GPLv2. [ruby-talk:187922]
* parse.y: remove some obsolete syntax rules (unparenthesized
method calls in argument list).
* eval.c (rb_call0): insecure calling should be checked for non
NODE_SCOPE method invocations too.
* eval.c (rb_alias): should preserve the current safe level as
well as method definition.
* process.c (rb_f_sleep): remove RDoc description about SIGALRM
which is not valid on the current implementation. [ruby-dev:28464]
Thu Mar 23 21:40:47 2006 K.Kosako <sndgk393 AT ybb.ne.jp>
* eval.c (method_missing): should support argument splat in
super. a bug in combination of super, splat and
method_missing. [ruby-talk:185438]
* configure.in: Solaris SunPro compiler -rapth patch from
<kuwa at labs.fujitsu.com>. [ruby-dev:28443]
* configure.in: remove enable_rpath=no for Solaris.
[ruby-dev:28440]
* ext/win32ole/win32ole.c (ole_val2olevariantdata): change behavior
of converting OLE Variant object with VT_ARRAY|VT_UI1 and Ruby
String object.
* ruby.1: a clarification patch from David Lutterkort
<dlutter at redhat.com>. [ruby-core:7508]
* lib/rdoc/ri/ri_paths.rb (RI::Paths): adding paths from rubygems
directories. a patch from Eric Hodel <drbrain at segment7.net>.
[ruby-core:07423]
* eval.c (rb_clear_cache_by_class): clearing wrong cache.
* ext/extmk.rb: use :remove_destination to install extension libraries
to avoid SEGV. [ruby-dev:28417]
* eval.c (rb_thread_fd_writable): should not re-schedule output
from KILLED thread (must be error printing).
* array.c (rb_ary_flatten_bang): allow specifying recursion
level. [ruby-talk:182170]
* array.c (rb_ary_flatten): ditto.
* gc.c (add_heap): a heap_slots may overflow. a patch from Stefan
Weil <weil at mail.berlios.de>.
* eval.c (rb_call): use separate cache for fcall/vcall
invocation.
* eval.c (rb_eval): NODE_FCALL, NODE_VCALL can call local
functions.
* eval.c (rb_mod_local): a new method to specify newly added
visibility "local".
* eval.c (search_method): search for local methods which are
visible only from the current class.
* class.c (rb_class_local_methods): a method to list local methods.
* object.c (Init_Object): add BasicObject class as a top level
BlankSlate class.
* ruby.h (SYM2ID): should not cast to signed long.
[ruby-core:07414]
* class.c (rb_include_module): allow module duplication.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@10235 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-06-09 17:20:17 -04:00
|
|
|
syck_emitter_write( SyckEmitter *e, const char *str, long len )
|
2003-07-11 19:44:37 -04:00
|
|
|
{
|
|
|
|
long at;
|
2008-07-22 17:12:00 -04:00
|
|
|
ASSERT( str != NULL );
|
2003-07-11 19:44:37 -04:00
|
|
|
if ( e->buffer == NULL )
|
|
|
|
{
|
|
|
|
syck_emitter_clear( e );
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Flush if at end of buffer
|
|
|
|
*/
|
|
|
|
at = e->marker - e->buffer;
|
2003-12-21 10:38:01 -05:00
|
|
|
if ( len + at >= e->bufsize )
|
2003-07-11 19:44:37 -04:00
|
|
|
{
|
2003-07-24 12:30:43 -04:00
|
|
|
syck_emitter_flush( e, 0 );
|
2003-12-21 10:38:01 -05:00
|
|
|
for (;;) {
|
|
|
|
long rest = e->bufsize - (e->marker - e->buffer);
|
|
|
|
if (len <= rest) break;
|
|
|
|
S_MEMCPY( e->marker, str, char, rest );
|
2004-01-02 11:21:26 -05:00
|
|
|
e->marker += rest;
|
2003-12-21 10:38:01 -05:00
|
|
|
str += rest;
|
|
|
|
len -= rest;
|
|
|
|
syck_emitter_flush( e, 0 );
|
|
|
|
}
|
2003-07-11 19:44:37 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Write to buffer
|
|
|
|
*/
|
|
|
|
S_MEMCPY( e->marker, str, char, len );
|
|
|
|
e->marker += len;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Write a chunk of data out.
|
|
|
|
*/
|
|
|
|
void
|
2003-07-24 12:30:43 -04:00
|
|
|
syck_emitter_flush( SyckEmitter *e, long check_room )
|
2003-07-11 19:44:37 -04:00
|
|
|
{
|
2003-07-24 12:30:43 -04:00
|
|
|
/*
|
|
|
|
* 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;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Commit buffer.
|
|
|
|
*/
|
|
|
|
if ( check_room > e->marker - e->buffer )
|
|
|
|
{
|
|
|
|
check_room = e->marker - e->buffer;
|
|
|
|
}
|
2005-09-12 23:58:33 -04:00
|
|
|
(e->output_handler)( e, e->buffer, check_room );
|
2003-07-24 12:30:43 -04:00
|
|
|
e->bufpos += check_room;
|
|
|
|
e->marker -= check_room;
|
2003-07-11 19:44:37 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
2005-09-12 23:58:33 -04:00
|
|
|
* Start emitting from the given node, check for anchoring and then
|
|
|
|
* issue the callback to the emitter handler.
|
2003-07-11 19:44:37 -04:00
|
|
|
*/
|
|
|
|
void
|
2005-09-12 23:58:33 -04:00
|
|
|
syck_emit( SyckEmitter *e, st_data_t n )
|
2003-07-11 19:44:37 -04:00
|
|
|
{
|
2005-09-12 23:58:33 -04:00
|
|
|
SYMID oid;
|
|
|
|
char *anchor_name = NULL;
|
2005-09-20 02:50:20 -04:00
|
|
|
int indent = 0;
|
|
|
|
long x = 0;
|
2005-09-12 23:58:33 -04:00
|
|
|
SyckLevel *lvl = syck_emitter_current_level( e );
|
|
|
|
|
2005-09-17 13:22:49 -04:00
|
|
|
/*
|
|
|
|
* Determine headers.
|
|
|
|
*/
|
|
|
|
if ( e->stage == doc_open && ( e->headless == 0 || e->use_header == 1 ) )
|
|
|
|
{
|
|
|
|
if ( e->use_version == 1 )
|
|
|
|
{
|
|
|
|
char *header = S_ALLOC_N( char, 64 );
|
|
|
|
S_MEMZERO( header, char, 64 );
|
|
|
|
sprintf( header, "--- %%YAML:%d.%d ", SYCK_YAML_MAJOR, SYCK_YAML_MINOR );
|
|
|
|
syck_emitter_write( e, header, strlen( header ) );
|
|
|
|
S_FREE( header );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
syck_emitter_write( e, "--- ", 4 );
|
|
|
|
}
|
|
|
|
e->stage = doc_processing;
|
|
|
|
}
|
|
|
|
|
2005-09-12 23:58:33 -04:00
|
|
|
/* Add new level */
|
|
|
|
if ( lvl->spaces >= 0 ) {
|
|
|
|
indent = lvl->spaces + e->indent;
|
|
|
|
}
|
|
|
|
syck_emitter_add_level( e, indent, syck_lvl_open );
|
|
|
|
lvl = syck_emitter_current_level( e );
|
|
|
|
|
|
|
|
/* Look for anchor */
|
|
|
|
if ( e->anchors != NULL &&
|
|
|
|
st_lookup( e->markers, n, (st_data_t *)&oid ) &&
|
2008-07-22 10:04:10 -04:00
|
|
|
st_lookup( e->anchors, (st_data_t)oid, (void *)&anchor_name ) )
|
2005-09-12 23:58:33 -04:00
|
|
|
{
|
|
|
|
if ( e->anchored == NULL )
|
|
|
|
{
|
|
|
|
e->anchored = st_init_numtable();
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( ! st_lookup( e->anchored, (st_data_t)anchor_name, (st_data_t *)&x ) )
|
|
|
|
{
|
|
|
|
char *an = S_ALLOC_N( char, strlen( anchor_name ) + 3 );
|
|
|
|
sprintf( an, "&%s ", anchor_name );
|
|
|
|
syck_emitter_write( e, an, strlen( anchor_name ) + 2 );
|
|
|
|
free( an );
|
|
|
|
|
|
|
|
x = 1;
|
|
|
|
st_insert( e->anchored, (st_data_t)anchor_name, (st_data_t)x );
|
|
|
|
lvl->anctag = 1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
char *an = S_ALLOC_N( char, strlen( anchor_name ) + 2 );
|
|
|
|
sprintf( an, "*%s", anchor_name );
|
|
|
|
syck_emitter_write( e, an, strlen( anchor_name ) + 1 );
|
|
|
|
free( an );
|
|
|
|
|
|
|
|
goto end_emit;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
(e->emitter_handler)( e, n );
|
|
|
|
|
|
|
|
/* Pop the level */
|
|
|
|
end_emit:
|
|
|
|
syck_emitter_pop_level( e );
|
|
|
|
if ( e->lvl_idx == 1 ) {
|
|
|
|
syck_emitter_write( e, "\n", 1 );
|
2005-09-17 13:22:49 -04:00
|
|
|
e->headless = 0;
|
2005-09-12 23:58:33 -04:00
|
|
|
e->stage = doc_open;
|
|
|
|
}
|
2003-07-11 19:44:37 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
2005-09-12 23:58:33 -04:00
|
|
|
* Determine what tag needs to be written, based on the taguri of the node
|
|
|
|
* and the implicit tag which would be assigned to this node. If a tag is
|
|
|
|
* required, write the tag.
|
|
|
|
*/
|
* sprintf.c (rb_str_format): allow %c to print one character
string (e.g. ?x).
* lib/tempfile.rb (Tempfile::make_tmpname): put dot between
basename and pid. [ruby-talk:196272]
* parse.y (do_block): remove -> style block.
* parse.y (parser_yylex): remove tLAMBDA_ARG.
* eval.c (rb_call0): binding for the return event hook should have
consistent scope. [ruby-core:07928]
* eval.c (proc_invoke): return behavior should depend whether it
is surrounded by a lambda or a mere block.
* eval.c (formal_assign): handles post splat arguments.
* eval.c (rb_call0): ditto.
* st.c (strhash): use FNV-1a hash.
* parse.y (parser_yylex): removed experimental ';;' terminator.
* eval.c (rb_node_arity): should be aware of post splat arguments.
* eval.c (rb_proc_arity): ditto.
* parse.y (f_args): syntax rule enhanced to support arguments
after the splat.
* parse.y (block_param): ditto for block parameters.
* parse.y (f_post_arg): mandatory formal arguments after the splat
argument.
* parse.y (new_args_gen): generate nodes for mandatory formal
arguments after the splat argument.
* eval.c (rb_eval): dispatch mandatory formal arguments after the
splat argument.
* parse.y (args): allow more than one splat in the argument list.
* parse.y (method_call): allow aref [] to accept all kind of
method argument, including assocs, splat, and block argument.
* eval.c (SETUP_ARGS0): prepare block argument as well.
* lib/mathn.rb (Integer): remove Integer#gcd2. [ruby-core:07931]
* eval.c (error_line): print receivers true/false/nil specially.
* eval.c (rb_proc_yield): handles parameters in yield semantics.
* eval.c (nil_yield): gives LocalJumpError to denote no block
error.
* io.c (rb_io_getc): now takes one-character string.
* string.c (rb_str_hash): use FNV-1a hash from Fowler/Noll/Vo
hashing algorithm.
* string.c (rb_str_aref): str[0] now returns 1 character string,
instead of a fixnum. [Ruby2]
* parse.y (parser_yylex): ?c now returns 1 character string,
instead of a fixnum. [Ruby2]
* string.c (rb_str_aset): no longer support fixnum insertion.
* eval.c (umethod_bind): should not update original class.
[ruby-dev:28636]
* eval.c (ev_const_get): should support constant access from
within instance_eval(). [ruby-dev:28327]
* time.c (time_timeval): should round for usec floating
number. [ruby-core:07896]
* time.c (time_add): ditto.
* dir.c (sys_warning): should not call a vararg function
rb_sys_warning() indirectly. [ruby-core:07886]
* numeric.c (flo_divmod): the first element of Float#divmod should
be an integer. [ruby-dev:28589]
* test/ruby/test_float.rb: add tests for divmod, div, modulo and remainder.
* re.c (rb_reg_initialize): should not allow modifying literal
regexps. frozen check moved from rb_reg_initialize_m as well.
* re.c (rb_reg_initialize): should not modify untainted objects in
safe levels higher than 3.
* re.c (rb_memcmp): type change from char* to const void*.
* dir.c (dir_close): should not close untainted dir stream.
* dir.c (GetDIR): add tainted/frozen check for each dir operation.
* lib/rdoc/parsers/parse_rb.rb (RDoc::RubyParser::parse_symbol_arg):
typo fixed. a patch from Florian Gross <florg at florg.net>.
* eval.c (EXEC_EVENT_HOOK): trace_func may remove itself from
event_hooks. no guarantee for arbitrary hook deletion.
[ruby-dev:28632]
* util.c (ruby_strtod): differ addition to minimize error.
[ruby-dev:28619]
* util.c (ruby_strtod): should not raise ERANGE when the input
string does not have any digits. [ruby-dev:28629]
* eval.c (proc_invoke): should restore old ruby_frame->block.
thanks to ts <decoux at moulon.inra.fr>. [ruby-core:07833]
also fix [ruby-dev:28614] as well.
* signal.c (trap): sig should be less then NSIG. Coverity found
this bug. a patch from Kevin Tew <tewk at tewk.com>.
[ruby-core:07823]
* math.c (math_log2): add new method inspired by
[ruby-talk:191237].
* math.c (math_log): add optional base argument to Math::log().
[ruby-talk:191308]
* ext/syck/emitter.c (syck_scan_scalar): avoid accessing
uninitialized array element. a patch from Pat Eyler
<rubypate at gmail.com>. [ruby-core:07809]
* array.c (rb_ary_fill): initialize local variables first. a
patch from Pat Eyler <rubypate at gmail.com>. [ruby-core:07810]
* ext/syck/yaml2byte.c (syck_yaml2byte_handler): need to free
type_tag. a patch from Pat Eyler <rubypate at gmail.com>.
[ruby-core:07808]
* ext/socket/socket.c (make_hostent_internal): accept ai_family
check from Sam Roberts <sroberts at uniserve.com>.
[ruby-core:07691]
* util.c (ruby_strtod): should not cut off 18 digits for no
reason. [ruby-core:07796]
* array.c (rb_ary_fill): internalize local variable "beg" to
pacify Coverity. [ruby-core:07770]
* pack.c (pack_unpack): now supports CRLF newlines. a patch from
<tommy at tmtm.org>. [ruby-dev:28601]
* applied code clean-up patch from Stefan Huehner
<stefan at huehner.org>. [ruby-core:07764]
* lib/jcode.rb (String::tr_s): should have translated non
squeezing character sequence (i.e. a character) as well. thanks
to Hiroshi Ichikawa <gimite at gimite.ddo.jp> [ruby-list:42090]
* ext/socket/socket.c: document update patch from Sam Roberts
<sroberts at uniserve.com>. [ruby-core:07701]
* lib/mathn.rb (Integer): need not to remove gcd2. a patch from
NARUSE, Yui <naruse at airemix.com>. [ruby-dev:28570]
* parse.y (arg): too much NEW_LIST()
* eval.c (SETUP_ARGS0): remove unnecessary access to nd_alen.
* eval.c (rb_eval): use ARGSCAT for NODE_OP_ASGN1.
[ruby-dev:28585]
* parse.y (arg): use NODE_ARGSCAT for placeholder.
* lib/getoptlong.rb (GetoptLong::get): RDoc update patch from
mathew <meta at pobox.com>. [ruby-core:07738]
* variable.c (rb_const_set): raise error when no target klass is
supplied. [ruby-dev:28582]
* prec.c (prec_prec_f): documentation patch from
<gerardo.santana at gmail.com>. [ruby-core:07689]
* bignum.c (rb_big_pow): second operand may be too big even if
it's a Fixnum. [ruby-talk:187984]
* README.EXT: update symbol description. [ruby-talk:188104]
* COPYING: explicitly note GPLv2. [ruby-talk:187922]
* parse.y: remove some obsolete syntax rules (unparenthesized
method calls in argument list).
* eval.c (rb_call0): insecure calling should be checked for non
NODE_SCOPE method invocations too.
* eval.c (rb_alias): should preserve the current safe level as
well as method definition.
* process.c (rb_f_sleep): remove RDoc description about SIGALRM
which is not valid on the current implementation. [ruby-dev:28464]
Thu Mar 23 21:40:47 2006 K.Kosako <sndgk393 AT ybb.ne.jp>
* eval.c (method_missing): should support argument splat in
super. a bug in combination of super, splat and
method_missing. [ruby-talk:185438]
* configure.in: Solaris SunPro compiler -rapth patch from
<kuwa at labs.fujitsu.com>. [ruby-dev:28443]
* configure.in: remove enable_rpath=no for Solaris.
[ruby-dev:28440]
* ext/win32ole/win32ole.c (ole_val2olevariantdata): change behavior
of converting OLE Variant object with VT_ARRAY|VT_UI1 and Ruby
String object.
* ruby.1: a clarification patch from David Lutterkort
<dlutter at redhat.com>. [ruby-core:7508]
* lib/rdoc/ri/ri_paths.rb (RI::Paths): adding paths from rubygems
directories. a patch from Eric Hodel <drbrain at segment7.net>.
[ruby-core:07423]
* eval.c (rb_clear_cache_by_class): clearing wrong cache.
* ext/extmk.rb: use :remove_destination to install extension libraries
to avoid SEGV. [ruby-dev:28417]
* eval.c (rb_thread_fd_writable): should not re-schedule output
from KILLED thread (must be error printing).
* array.c (rb_ary_flatten_bang): allow specifying recursion
level. [ruby-talk:182170]
* array.c (rb_ary_flatten): ditto.
* gc.c (add_heap): a heap_slots may overflow. a patch from Stefan
Weil <weil at mail.berlios.de>.
* eval.c (rb_call): use separate cache for fcall/vcall
invocation.
* eval.c (rb_eval): NODE_FCALL, NODE_VCALL can call local
functions.
* eval.c (rb_mod_local): a new method to specify newly added
visibility "local".
* eval.c (search_method): search for local methods which are
visible only from the current class.
* class.c (rb_class_local_methods): a method to list local methods.
* object.c (Init_Object): add BasicObject class as a top level
BlankSlate class.
* ruby.h (SYM2ID): should not cast to signed long.
[ruby-core:07414]
* class.c (rb_include_module): allow module duplication.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@10235 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-06-09 17:20:17 -04:00
|
|
|
void syck_emit_tag( SyckEmitter *e, const char *tag, const char *ignore )
|
2005-09-12 23:58:33 -04:00
|
|
|
{
|
|
|
|
SyckLevel *lvl;
|
|
|
|
if ( tag == NULL ) return;
|
|
|
|
if ( ignore != NULL && syck_tagcmp( tag, ignore ) == 0 && e->explicit_typing == 0 ) return;
|
|
|
|
lvl = syck_emitter_current_level( e );
|
|
|
|
|
|
|
|
/* implicit */
|
|
|
|
if ( strlen( tag ) == 0 ) {
|
|
|
|
syck_emitter_write( e, "! ", 2 );
|
|
|
|
|
|
|
|
/* global types */
|
|
|
|
} else if ( strncmp( tag, "tag:", 4 ) == 0 ) {
|
|
|
|
int taglen = strlen( tag );
|
|
|
|
syck_emitter_write( e, "!", 1 );
|
|
|
|
if ( strncmp( tag + 4, YAML_DOMAIN, strlen( YAML_DOMAIN ) ) == 0 ) {
|
|
|
|
int skip = 4 + strlen( YAML_DOMAIN ) + 1;
|
|
|
|
syck_emitter_write( e, tag + skip, taglen - skip );
|
|
|
|
} else {
|
* sprintf.c (rb_str_format): allow %c to print one character
string (e.g. ?x).
* lib/tempfile.rb (Tempfile::make_tmpname): put dot between
basename and pid. [ruby-talk:196272]
* parse.y (do_block): remove -> style block.
* parse.y (parser_yylex): remove tLAMBDA_ARG.
* eval.c (rb_call0): binding for the return event hook should have
consistent scope. [ruby-core:07928]
* eval.c (proc_invoke): return behavior should depend whether it
is surrounded by a lambda or a mere block.
* eval.c (formal_assign): handles post splat arguments.
* eval.c (rb_call0): ditto.
* st.c (strhash): use FNV-1a hash.
* parse.y (parser_yylex): removed experimental ';;' terminator.
* eval.c (rb_node_arity): should be aware of post splat arguments.
* eval.c (rb_proc_arity): ditto.
* parse.y (f_args): syntax rule enhanced to support arguments
after the splat.
* parse.y (block_param): ditto for block parameters.
* parse.y (f_post_arg): mandatory formal arguments after the splat
argument.
* parse.y (new_args_gen): generate nodes for mandatory formal
arguments after the splat argument.
* eval.c (rb_eval): dispatch mandatory formal arguments after the
splat argument.
* parse.y (args): allow more than one splat in the argument list.
* parse.y (method_call): allow aref [] to accept all kind of
method argument, including assocs, splat, and block argument.
* eval.c (SETUP_ARGS0): prepare block argument as well.
* lib/mathn.rb (Integer): remove Integer#gcd2. [ruby-core:07931]
* eval.c (error_line): print receivers true/false/nil specially.
* eval.c (rb_proc_yield): handles parameters in yield semantics.
* eval.c (nil_yield): gives LocalJumpError to denote no block
error.
* io.c (rb_io_getc): now takes one-character string.
* string.c (rb_str_hash): use FNV-1a hash from Fowler/Noll/Vo
hashing algorithm.
* string.c (rb_str_aref): str[0] now returns 1 character string,
instead of a fixnum. [Ruby2]
* parse.y (parser_yylex): ?c now returns 1 character string,
instead of a fixnum. [Ruby2]
* string.c (rb_str_aset): no longer support fixnum insertion.
* eval.c (umethod_bind): should not update original class.
[ruby-dev:28636]
* eval.c (ev_const_get): should support constant access from
within instance_eval(). [ruby-dev:28327]
* time.c (time_timeval): should round for usec floating
number. [ruby-core:07896]
* time.c (time_add): ditto.
* dir.c (sys_warning): should not call a vararg function
rb_sys_warning() indirectly. [ruby-core:07886]
* numeric.c (flo_divmod): the first element of Float#divmod should
be an integer. [ruby-dev:28589]
* test/ruby/test_float.rb: add tests for divmod, div, modulo and remainder.
* re.c (rb_reg_initialize): should not allow modifying literal
regexps. frozen check moved from rb_reg_initialize_m as well.
* re.c (rb_reg_initialize): should not modify untainted objects in
safe levels higher than 3.
* re.c (rb_memcmp): type change from char* to const void*.
* dir.c (dir_close): should not close untainted dir stream.
* dir.c (GetDIR): add tainted/frozen check for each dir operation.
* lib/rdoc/parsers/parse_rb.rb (RDoc::RubyParser::parse_symbol_arg):
typo fixed. a patch from Florian Gross <florg at florg.net>.
* eval.c (EXEC_EVENT_HOOK): trace_func may remove itself from
event_hooks. no guarantee for arbitrary hook deletion.
[ruby-dev:28632]
* util.c (ruby_strtod): differ addition to minimize error.
[ruby-dev:28619]
* util.c (ruby_strtod): should not raise ERANGE when the input
string does not have any digits. [ruby-dev:28629]
* eval.c (proc_invoke): should restore old ruby_frame->block.
thanks to ts <decoux at moulon.inra.fr>. [ruby-core:07833]
also fix [ruby-dev:28614] as well.
* signal.c (trap): sig should be less then NSIG. Coverity found
this bug. a patch from Kevin Tew <tewk at tewk.com>.
[ruby-core:07823]
* math.c (math_log2): add new method inspired by
[ruby-talk:191237].
* math.c (math_log): add optional base argument to Math::log().
[ruby-talk:191308]
* ext/syck/emitter.c (syck_scan_scalar): avoid accessing
uninitialized array element. a patch from Pat Eyler
<rubypate at gmail.com>. [ruby-core:07809]
* array.c (rb_ary_fill): initialize local variables first. a
patch from Pat Eyler <rubypate at gmail.com>. [ruby-core:07810]
* ext/syck/yaml2byte.c (syck_yaml2byte_handler): need to free
type_tag. a patch from Pat Eyler <rubypate at gmail.com>.
[ruby-core:07808]
* ext/socket/socket.c (make_hostent_internal): accept ai_family
check from Sam Roberts <sroberts at uniserve.com>.
[ruby-core:07691]
* util.c (ruby_strtod): should not cut off 18 digits for no
reason. [ruby-core:07796]
* array.c (rb_ary_fill): internalize local variable "beg" to
pacify Coverity. [ruby-core:07770]
* pack.c (pack_unpack): now supports CRLF newlines. a patch from
<tommy at tmtm.org>. [ruby-dev:28601]
* applied code clean-up patch from Stefan Huehner
<stefan at huehner.org>. [ruby-core:07764]
* lib/jcode.rb (String::tr_s): should have translated non
squeezing character sequence (i.e. a character) as well. thanks
to Hiroshi Ichikawa <gimite at gimite.ddo.jp> [ruby-list:42090]
* ext/socket/socket.c: document update patch from Sam Roberts
<sroberts at uniserve.com>. [ruby-core:07701]
* lib/mathn.rb (Integer): need not to remove gcd2. a patch from
NARUSE, Yui <naruse at airemix.com>. [ruby-dev:28570]
* parse.y (arg): too much NEW_LIST()
* eval.c (SETUP_ARGS0): remove unnecessary access to nd_alen.
* eval.c (rb_eval): use ARGSCAT for NODE_OP_ASGN1.
[ruby-dev:28585]
* parse.y (arg): use NODE_ARGSCAT for placeholder.
* lib/getoptlong.rb (GetoptLong::get): RDoc update patch from
mathew <meta at pobox.com>. [ruby-core:07738]
* variable.c (rb_const_set): raise error when no target klass is
supplied. [ruby-dev:28582]
* prec.c (prec_prec_f): documentation patch from
<gerardo.santana at gmail.com>. [ruby-core:07689]
* bignum.c (rb_big_pow): second operand may be too big even if
it's a Fixnum. [ruby-talk:187984]
* README.EXT: update symbol description. [ruby-talk:188104]
* COPYING: explicitly note GPLv2. [ruby-talk:187922]
* parse.y: remove some obsolete syntax rules (unparenthesized
method calls in argument list).
* eval.c (rb_call0): insecure calling should be checked for non
NODE_SCOPE method invocations too.
* eval.c (rb_alias): should preserve the current safe level as
well as method definition.
* process.c (rb_f_sleep): remove RDoc description about SIGALRM
which is not valid on the current implementation. [ruby-dev:28464]
Thu Mar 23 21:40:47 2006 K.Kosako <sndgk393 AT ybb.ne.jp>
* eval.c (method_missing): should support argument splat in
super. a bug in combination of super, splat and
method_missing. [ruby-talk:185438]
* configure.in: Solaris SunPro compiler -rapth patch from
<kuwa at labs.fujitsu.com>. [ruby-dev:28443]
* configure.in: remove enable_rpath=no for Solaris.
[ruby-dev:28440]
* ext/win32ole/win32ole.c (ole_val2olevariantdata): change behavior
of converting OLE Variant object with VT_ARRAY|VT_UI1 and Ruby
String object.
* ruby.1: a clarification patch from David Lutterkort
<dlutter at redhat.com>. [ruby-core:7508]
* lib/rdoc/ri/ri_paths.rb (RI::Paths): adding paths from rubygems
directories. a patch from Eric Hodel <drbrain at segment7.net>.
[ruby-core:07423]
* eval.c (rb_clear_cache_by_class): clearing wrong cache.
* ext/extmk.rb: use :remove_destination to install extension libraries
to avoid SEGV. [ruby-dev:28417]
* eval.c (rb_thread_fd_writable): should not re-schedule output
from KILLED thread (must be error printing).
* array.c (rb_ary_flatten_bang): allow specifying recursion
level. [ruby-talk:182170]
* array.c (rb_ary_flatten): ditto.
* gc.c (add_heap): a heap_slots may overflow. a patch from Stefan
Weil <weil at mail.berlios.de>.
* eval.c (rb_call): use separate cache for fcall/vcall
invocation.
* eval.c (rb_eval): NODE_FCALL, NODE_VCALL can call local
functions.
* eval.c (rb_mod_local): a new method to specify newly added
visibility "local".
* eval.c (search_method): search for local methods which are
visible only from the current class.
* class.c (rb_class_local_methods): a method to list local methods.
* object.c (Init_Object): add BasicObject class as a top level
BlankSlate class.
* ruby.h (SYM2ID): should not cast to signed long.
[ruby-core:07414]
* class.c (rb_include_module): allow module duplication.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@10235 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-06-09 17:20:17 -04:00
|
|
|
const char *subd = tag + 4;
|
2005-09-12 23:58:33 -04:00
|
|
|
while ( *subd != ':' && *subd != '\0' ) subd++;
|
|
|
|
if ( *subd == ':' ) {
|
|
|
|
if ( subd - tag > ( strlen( YAML_DOMAIN ) + 5 ) &&
|
|
|
|
strncmp( subd - strlen( YAML_DOMAIN ), YAML_DOMAIN, strlen( YAML_DOMAIN ) ) == 0 ) {
|
|
|
|
syck_emitter_write( e, tag + 4, subd - strlen( YAML_DOMAIN ) - ( tag + 4 ) - 1 );
|
|
|
|
syck_emitter_write( e, "/", 1 );
|
|
|
|
syck_emitter_write( e, subd + 1, ( tag + taglen ) - ( subd + 1 ) );
|
|
|
|
} else {
|
|
|
|
syck_emitter_write( e, tag + 4, subd - ( tag + 4 ) );
|
|
|
|
syck_emitter_write( e, "/", 1 );
|
|
|
|
syck_emitter_write( e, subd + 1, ( tag + taglen ) - ( subd + 1 ) );
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
/* TODO: Invalid tag (no colon after domain) */
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
syck_emitter_write( e, " ", 1 );
|
|
|
|
|
|
|
|
/* private types */
|
|
|
|
} else if ( strncmp( tag, "x-private:", 10 ) == 0 ) {
|
|
|
|
syck_emitter_write( e, "!!", 2 );
|
|
|
|
syck_emitter_write( e, tag + 10, strlen( tag ) - 10 );
|
|
|
|
syck_emitter_write( e, " ", 1 );
|
|
|
|
}
|
|
|
|
lvl->anctag = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Emit a newline and an appropriately spaced indent.
|
|
|
|
*/
|
|
|
|
void syck_emit_indent( SyckEmitter *e )
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
SyckLevel *lvl = syck_emitter_current_level( e );
|
2005-09-17 13:22:49 -04:00
|
|
|
if ( e->bufpos == 0 && ( e->marker - e->buffer ) == 0 ) return;
|
2005-09-12 23:58:33 -04:00
|
|
|
if ( lvl->spaces >= 0 ) {
|
|
|
|
char *spcs = S_ALLOC_N( char, lvl->spaces + 2 );
|
|
|
|
|
|
|
|
spcs[0] = '\n'; spcs[lvl->spaces + 1] = '\0';
|
|
|
|
for ( i = 0; i < lvl->spaces; i++ ) spcs[i+1] = ' ';
|
|
|
|
syck_emitter_write( e, spcs, lvl->spaces + 1 );
|
|
|
|
free( spcs );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Clear the scan */
|
|
|
|
#define SCAN_NONE 0
|
|
|
|
/* All printable characters? */
|
|
|
|
#define SCAN_NONPRINT 1
|
|
|
|
/* Any indented lines? */
|
|
|
|
#define SCAN_INDENTED 2
|
|
|
|
/* Larger than the requested width? */
|
|
|
|
#define SCAN_WIDE 4
|
2005-09-17 13:22:49 -04:00
|
|
|
/* Opens or closes with whitespace? */
|
|
|
|
#define SCAN_WHITEEDGE 8
|
2005-09-12 23:58:33 -04:00
|
|
|
/* Contains a newline */
|
|
|
|
#define SCAN_NEWLINE 16
|
|
|
|
/* Contains a single quote */
|
|
|
|
#define SCAN_SINGLEQ 32
|
|
|
|
/* Contains a double quote */
|
|
|
|
#define SCAN_DOUBLEQ 64
|
|
|
|
/* Starts with a token */
|
|
|
|
#define SCAN_INDIC_S 128
|
|
|
|
/* Contains a flow indicator */
|
|
|
|
#define SCAN_INDIC_C 256
|
|
|
|
/* Ends without newlines */
|
|
|
|
#define SCAN_NONL_E 512
|
|
|
|
/* Ends with many newlines */
|
|
|
|
#define SCAN_MANYNL_E 1024
|
|
|
|
/* Contains flow map indicators */
|
|
|
|
#define SCAN_FLOWMAP 2048
|
|
|
|
/* Contains flow seq indicators */
|
|
|
|
#define SCAN_FLOWSEQ 4096
|
|
|
|
/* Contains a valid doc separator */
|
|
|
|
#define SCAN_DOCSEP 8192
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Basic printable test for LATIN-1 characters.
|
2003-07-11 19:44:37 -04:00
|
|
|
*/
|
|
|
|
int
|
2008-07-22 14:02:12 -04:00
|
|
|
syck_scan_scalar( int req_width, const char *cursor, long len )
|
2005-09-12 23:58:33 -04:00
|
|
|
{
|
|
|
|
long i = 0, start = 0;
|
|
|
|
int flags = SCAN_NONE;
|
|
|
|
|
|
|
|
if ( len < 1 ) return flags;
|
|
|
|
|
|
|
|
/* c-indicators from the spec */
|
|
|
|
if ( cursor[0] == '[' || cursor[0] == ']' ||
|
|
|
|
cursor[0] == '{' || cursor[0] == '}' ||
|
|
|
|
cursor[0] == '!' || cursor[0] == '*' ||
|
|
|
|
cursor[0] == '&' || cursor[0] == '|' ||
|
|
|
|
cursor[0] == '>' || cursor[0] == '\'' ||
|
|
|
|
cursor[0] == '"' || cursor[0] == '#' ||
|
|
|
|
cursor[0] == '%' || cursor[0] == '@' ||
|
|
|
|
cursor[0] == '&' ) {
|
|
|
|
flags |= SCAN_INDIC_S;
|
|
|
|
}
|
|
|
|
if ( ( cursor[0] == '-' || cursor[0] == ':' ||
|
|
|
|
cursor[0] == '?' || cursor[0] == ',' ) &&
|
* sprintf.c (rb_str_format): allow %c to print one character
string (e.g. ?x).
* lib/tempfile.rb (Tempfile::make_tmpname): put dot between
basename and pid. [ruby-talk:196272]
* parse.y (do_block): remove -> style block.
* parse.y (parser_yylex): remove tLAMBDA_ARG.
* eval.c (rb_call0): binding for the return event hook should have
consistent scope. [ruby-core:07928]
* eval.c (proc_invoke): return behavior should depend whether it
is surrounded by a lambda or a mere block.
* eval.c (formal_assign): handles post splat arguments.
* eval.c (rb_call0): ditto.
* st.c (strhash): use FNV-1a hash.
* parse.y (parser_yylex): removed experimental ';;' terminator.
* eval.c (rb_node_arity): should be aware of post splat arguments.
* eval.c (rb_proc_arity): ditto.
* parse.y (f_args): syntax rule enhanced to support arguments
after the splat.
* parse.y (block_param): ditto for block parameters.
* parse.y (f_post_arg): mandatory formal arguments after the splat
argument.
* parse.y (new_args_gen): generate nodes for mandatory formal
arguments after the splat argument.
* eval.c (rb_eval): dispatch mandatory formal arguments after the
splat argument.
* parse.y (args): allow more than one splat in the argument list.
* parse.y (method_call): allow aref [] to accept all kind of
method argument, including assocs, splat, and block argument.
* eval.c (SETUP_ARGS0): prepare block argument as well.
* lib/mathn.rb (Integer): remove Integer#gcd2. [ruby-core:07931]
* eval.c (error_line): print receivers true/false/nil specially.
* eval.c (rb_proc_yield): handles parameters in yield semantics.
* eval.c (nil_yield): gives LocalJumpError to denote no block
error.
* io.c (rb_io_getc): now takes one-character string.
* string.c (rb_str_hash): use FNV-1a hash from Fowler/Noll/Vo
hashing algorithm.
* string.c (rb_str_aref): str[0] now returns 1 character string,
instead of a fixnum. [Ruby2]
* parse.y (parser_yylex): ?c now returns 1 character string,
instead of a fixnum. [Ruby2]
* string.c (rb_str_aset): no longer support fixnum insertion.
* eval.c (umethod_bind): should not update original class.
[ruby-dev:28636]
* eval.c (ev_const_get): should support constant access from
within instance_eval(). [ruby-dev:28327]
* time.c (time_timeval): should round for usec floating
number. [ruby-core:07896]
* time.c (time_add): ditto.
* dir.c (sys_warning): should not call a vararg function
rb_sys_warning() indirectly. [ruby-core:07886]
* numeric.c (flo_divmod): the first element of Float#divmod should
be an integer. [ruby-dev:28589]
* test/ruby/test_float.rb: add tests for divmod, div, modulo and remainder.
* re.c (rb_reg_initialize): should not allow modifying literal
regexps. frozen check moved from rb_reg_initialize_m as well.
* re.c (rb_reg_initialize): should not modify untainted objects in
safe levels higher than 3.
* re.c (rb_memcmp): type change from char* to const void*.
* dir.c (dir_close): should not close untainted dir stream.
* dir.c (GetDIR): add tainted/frozen check for each dir operation.
* lib/rdoc/parsers/parse_rb.rb (RDoc::RubyParser::parse_symbol_arg):
typo fixed. a patch from Florian Gross <florg at florg.net>.
* eval.c (EXEC_EVENT_HOOK): trace_func may remove itself from
event_hooks. no guarantee for arbitrary hook deletion.
[ruby-dev:28632]
* util.c (ruby_strtod): differ addition to minimize error.
[ruby-dev:28619]
* util.c (ruby_strtod): should not raise ERANGE when the input
string does not have any digits. [ruby-dev:28629]
* eval.c (proc_invoke): should restore old ruby_frame->block.
thanks to ts <decoux at moulon.inra.fr>. [ruby-core:07833]
also fix [ruby-dev:28614] as well.
* signal.c (trap): sig should be less then NSIG. Coverity found
this bug. a patch from Kevin Tew <tewk at tewk.com>.
[ruby-core:07823]
* math.c (math_log2): add new method inspired by
[ruby-talk:191237].
* math.c (math_log): add optional base argument to Math::log().
[ruby-talk:191308]
* ext/syck/emitter.c (syck_scan_scalar): avoid accessing
uninitialized array element. a patch from Pat Eyler
<rubypate at gmail.com>. [ruby-core:07809]
* array.c (rb_ary_fill): initialize local variables first. a
patch from Pat Eyler <rubypate at gmail.com>. [ruby-core:07810]
* ext/syck/yaml2byte.c (syck_yaml2byte_handler): need to free
type_tag. a patch from Pat Eyler <rubypate at gmail.com>.
[ruby-core:07808]
* ext/socket/socket.c (make_hostent_internal): accept ai_family
check from Sam Roberts <sroberts at uniserve.com>.
[ruby-core:07691]
* util.c (ruby_strtod): should not cut off 18 digits for no
reason. [ruby-core:07796]
* array.c (rb_ary_fill): internalize local variable "beg" to
pacify Coverity. [ruby-core:07770]
* pack.c (pack_unpack): now supports CRLF newlines. a patch from
<tommy at tmtm.org>. [ruby-dev:28601]
* applied code clean-up patch from Stefan Huehner
<stefan at huehner.org>. [ruby-core:07764]
* lib/jcode.rb (String::tr_s): should have translated non
squeezing character sequence (i.e. a character) as well. thanks
to Hiroshi Ichikawa <gimite at gimite.ddo.jp> [ruby-list:42090]
* ext/socket/socket.c: document update patch from Sam Roberts
<sroberts at uniserve.com>. [ruby-core:07701]
* lib/mathn.rb (Integer): need not to remove gcd2. a patch from
NARUSE, Yui <naruse at airemix.com>. [ruby-dev:28570]
* parse.y (arg): too much NEW_LIST()
* eval.c (SETUP_ARGS0): remove unnecessary access to nd_alen.
* eval.c (rb_eval): use ARGSCAT for NODE_OP_ASGN1.
[ruby-dev:28585]
* parse.y (arg): use NODE_ARGSCAT for placeholder.
* lib/getoptlong.rb (GetoptLong::get): RDoc update patch from
mathew <meta at pobox.com>. [ruby-core:07738]
* variable.c (rb_const_set): raise error when no target klass is
supplied. [ruby-dev:28582]
* prec.c (prec_prec_f): documentation patch from
<gerardo.santana at gmail.com>. [ruby-core:07689]
* bignum.c (rb_big_pow): second operand may be too big even if
it's a Fixnum. [ruby-talk:187984]
* README.EXT: update symbol description. [ruby-talk:188104]
* COPYING: explicitly note GPLv2. [ruby-talk:187922]
* parse.y: remove some obsolete syntax rules (unparenthesized
method calls in argument list).
* eval.c (rb_call0): insecure calling should be checked for non
NODE_SCOPE method invocations too.
* eval.c (rb_alias): should preserve the current safe level as
well as method definition.
* process.c (rb_f_sleep): remove RDoc description about SIGALRM
which is not valid on the current implementation. [ruby-dev:28464]
Thu Mar 23 21:40:47 2006 K.Kosako <sndgk393 AT ybb.ne.jp>
* eval.c (method_missing): should support argument splat in
super. a bug in combination of super, splat and
method_missing. [ruby-talk:185438]
* configure.in: Solaris SunPro compiler -rapth patch from
<kuwa at labs.fujitsu.com>. [ruby-dev:28443]
* configure.in: remove enable_rpath=no for Solaris.
[ruby-dev:28440]
* ext/win32ole/win32ole.c (ole_val2olevariantdata): change behavior
of converting OLE Variant object with VT_ARRAY|VT_UI1 and Ruby
String object.
* ruby.1: a clarification patch from David Lutterkort
<dlutter at redhat.com>. [ruby-core:7508]
* lib/rdoc/ri/ri_paths.rb (RI::Paths): adding paths from rubygems
directories. a patch from Eric Hodel <drbrain at segment7.net>.
[ruby-core:07423]
* eval.c (rb_clear_cache_by_class): clearing wrong cache.
* ext/extmk.rb: use :remove_destination to install extension libraries
to avoid SEGV. [ruby-dev:28417]
* eval.c (rb_thread_fd_writable): should not re-schedule output
from KILLED thread (must be error printing).
* array.c (rb_ary_flatten_bang): allow specifying recursion
level. [ruby-talk:182170]
* array.c (rb_ary_flatten): ditto.
* gc.c (add_heap): a heap_slots may overflow. a patch from Stefan
Weil <weil at mail.berlios.de>.
* eval.c (rb_call): use separate cache for fcall/vcall
invocation.
* eval.c (rb_eval): NODE_FCALL, NODE_VCALL can call local
functions.
* eval.c (rb_mod_local): a new method to specify newly added
visibility "local".
* eval.c (search_method): search for local methods which are
visible only from the current class.
* class.c (rb_class_local_methods): a method to list local methods.
* object.c (Init_Object): add BasicObject class as a top level
BlankSlate class.
* ruby.h (SYM2ID): should not cast to signed long.
[ruby-core:07414]
* class.c (rb_include_module): allow module duplication.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@10235 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-06-09 17:20:17 -04:00
|
|
|
( len == 1 || cursor[1] == ' ' || cursor[1] == '\n' ) )
|
2005-09-20 02:50:20 -04:00
|
|
|
{
|
2005-09-12 23:58:33 -04:00
|
|
|
flags |= SCAN_INDIC_S;
|
|
|
|
}
|
|
|
|
|
2005-09-17 13:22:49 -04:00
|
|
|
/* whitespace edges */
|
2005-09-12 23:58:33 -04:00
|
|
|
if ( cursor[len-1] != '\n' ) {
|
|
|
|
flags |= SCAN_NONL_E;
|
|
|
|
} else if ( len > 1 && cursor[len-2] == '\n' ) {
|
|
|
|
flags |= SCAN_MANYNL_E;
|
|
|
|
}
|
2005-09-17 13:22:49 -04:00
|
|
|
if (
|
|
|
|
( len > 0 && ( cursor[0] == ' ' || cursor[0] == '\t' ) ) ||
|
|
|
|
( len > 1 && ( cursor[len-1] == ' ' || cursor[len-1] == '\t' ) )
|
|
|
|
) {
|
|
|
|
flags |= SCAN_WHITEEDGE;
|
|
|
|
}
|
2005-09-12 23:58:33 -04:00
|
|
|
|
|
|
|
/* opening doc sep */
|
|
|
|
if ( len >= 3 && strncmp( cursor, "---", 3 ) == 0 )
|
|
|
|
flags |= SCAN_DOCSEP;
|
|
|
|
|
|
|
|
/* scan string */
|
|
|
|
for ( i = 0; i < len; i++ ) {
|
|
|
|
|
|
|
|
if ( ! ( cursor[i] == 0x9 ||
|
|
|
|
cursor[i] == 0xA ||
|
|
|
|
cursor[i] == 0xD ||
|
|
|
|
( cursor[i] >= 0x20 && cursor[i] <= 0x7E ) )
|
|
|
|
) {
|
|
|
|
flags |= SCAN_NONPRINT;
|
|
|
|
}
|
|
|
|
else if ( cursor[i] == '\n' ) {
|
|
|
|
flags |= SCAN_NEWLINE;
|
|
|
|
if ( len - i >= 3 && strncmp( &cursor[i+1], "---", 3 ) == 0 )
|
|
|
|
flags |= SCAN_DOCSEP;
|
|
|
|
if ( cursor[i+1] == ' ' || cursor[i+1] == '\t' )
|
|
|
|
flags |= SCAN_INDENTED;
|
|
|
|
if ( req_width > 0 && i - start > req_width )
|
|
|
|
flags |= SCAN_WIDE;
|
|
|
|
start = i;
|
|
|
|
}
|
|
|
|
else if ( cursor[i] == '\'' )
|
|
|
|
{
|
|
|
|
flags |= SCAN_SINGLEQ;
|
|
|
|
}
|
|
|
|
else if ( cursor[i] == '"' )
|
|
|
|
{
|
|
|
|
flags |= SCAN_DOUBLEQ;
|
|
|
|
}
|
|
|
|
else if ( cursor[i] == ']' )
|
|
|
|
{
|
|
|
|
flags |= SCAN_FLOWSEQ;
|
|
|
|
}
|
|
|
|
else if ( cursor[i] == '}' )
|
|
|
|
{
|
|
|
|
flags |= SCAN_FLOWMAP;
|
|
|
|
}
|
|
|
|
/* remember, if plain collections get implemented, to add nb-plain-flow-char */
|
|
|
|
else if ( ( cursor[i] == ' ' && cursor[i+1] == '#' ) ||
|
2005-09-20 02:50:20 -04:00
|
|
|
( cursor[i] == ':' &&
|
|
|
|
( cursor[i+1] == ' ' || cursor[i+1] == '\n' || i == len - 1 ) ) )
|
2005-09-12 23:58:33 -04:00
|
|
|
{
|
|
|
|
flags |= SCAN_INDIC_C;
|
|
|
|
}
|
2005-09-20 02:50:20 -04:00
|
|
|
else if ( cursor[i] == ',' &&
|
|
|
|
( cursor[i+1] == ' ' || cursor[i+1] == '\n' || i == len - 1 ) )
|
2005-09-12 23:58:33 -04:00
|
|
|
{
|
|
|
|
flags |= SCAN_FLOWMAP;
|
|
|
|
flags |= SCAN_FLOWSEQ;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* printf( "---STR---\n%s\nFLAGS: %d\n", cursor, flags ); */
|
|
|
|
return flags;
|
|
|
|
}
|
|
|
|
/*
|
|
|
|
* All scalars should be emitted through this function, which determines an appropriate style,
|
|
|
|
* tag and indent.
|
|
|
|
*/
|
2008-07-22 14:02:12 -04:00
|
|
|
void syck_emit_scalar( SyckEmitter *e, const char *tag, enum scalar_style force_style, int force_indent, int force_width,
|
|
|
|
char keep_nl, const char *str, long len )
|
2003-07-11 19:44:37 -04:00
|
|
|
{
|
2005-09-12 23:58:33 -04:00
|
|
|
enum scalar_style favor_style = scalar_literal;
|
|
|
|
SyckLevel *parent = syck_emitter_parent_level( e );
|
|
|
|
SyckLevel *lvl = syck_emitter_current_level( e );
|
2005-09-20 02:50:20 -04:00
|
|
|
int scan = 0;
|
2008-07-22 14:02:12 -04:00
|
|
|
const char *match_implicit;
|
2005-09-12 23:58:33 -04:00
|
|
|
char *implicit;
|
|
|
|
|
|
|
|
if ( str == NULL ) str = "";
|
|
|
|
|
|
|
|
/* No empty nulls as map keys */
|
|
|
|
if ( len == 0 && ( parent->status == syck_lvl_map || parent->status == syck_lvl_imap ) &&
|
|
|
|
parent->ncount % 2 == 1 && syck_tagcmp( tag, "tag:yaml.org,2002:null" ) == 0 )
|
2003-07-11 19:44:37 -04:00
|
|
|
{
|
2005-09-12 23:58:33 -04:00
|
|
|
str = "~";
|
|
|
|
len = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
scan = syck_scan_scalar( force_width, str, len );
|
2008-07-22 14:02:12 -04:00
|
|
|
match_implicit = syck_match_implicit( str, len );
|
2005-09-12 23:58:33 -04:00
|
|
|
|
|
|
|
/* quote strings which default to implicits */
|
2008-07-22 14:02:12 -04:00
|
|
|
implicit = syck_taguri( YAML_DOMAIN, match_implicit, strlen( match_implicit ) );
|
2005-09-12 23:58:33 -04:00
|
|
|
if ( syck_tagcmp( tag, implicit ) != 0 && syck_tagcmp( tag, "tag:yaml.org,2002:str" ) == 0 ) {
|
|
|
|
force_style = scalar_2quote;
|
|
|
|
} else {
|
2005-09-20 02:50:20 -04:00
|
|
|
/* complex key */
|
|
|
|
if ( parent->status == syck_lvl_map && parent->ncount % 2 == 1 &&
|
|
|
|
( !( tag == NULL ||
|
|
|
|
( implicit != NULL && syck_tagcmp( tag, implicit ) == 0 && e->explicit_typing == 0 ) ) ) )
|
|
|
|
{
|
|
|
|
syck_emitter_write( e, "? ", 2 );
|
|
|
|
parent->status = syck_lvl_mapx;
|
|
|
|
}
|
2005-09-12 23:58:33 -04:00
|
|
|
syck_emit_tag( e, tag, implicit );
|
|
|
|
}
|
|
|
|
S_FREE( implicit );
|
|
|
|
|
|
|
|
/* if still arbitrary, sniff a good block style. */
|
|
|
|
if ( force_style == scalar_none ) {
|
|
|
|
if ( scan & SCAN_NEWLINE ) {
|
|
|
|
force_style = scalar_literal;
|
|
|
|
} else {
|
|
|
|
force_style = scalar_plain;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( e->style == scalar_fold ) {
|
|
|
|
favor_style = scalar_fold;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Determine block style */
|
|
|
|
if ( scan & SCAN_NONPRINT ) {
|
|
|
|
force_style = scalar_2quote;
|
2005-09-17 13:22:49 -04:00
|
|
|
} else if ( scan & SCAN_WHITEEDGE ) {
|
2005-09-12 23:58:33 -04:00
|
|
|
force_style = scalar_2quote;
|
|
|
|
} else if ( force_style != scalar_fold && ( scan & SCAN_INDENTED ) ) {
|
|
|
|
force_style = scalar_literal;
|
|
|
|
} else if ( force_style == scalar_plain && ( scan & SCAN_NEWLINE ) ) {
|
|
|
|
force_style = favor_style;
|
|
|
|
} else if ( force_style == scalar_plain && parent->status == syck_lvl_iseq && ( scan & SCAN_FLOWSEQ ) ) {
|
|
|
|
force_style = scalar_2quote;
|
|
|
|
} else if ( force_style == scalar_plain && parent->status == syck_lvl_imap && ( scan & SCAN_FLOWMAP ) ) {
|
|
|
|
force_style = scalar_2quote;
|
|
|
|
/* } else if ( force_style == scalar_fold && ( ! ( scan & SCAN_WIDE ) ) ) {
|
|
|
|
force_style = scalar_literal; */
|
|
|
|
} else if ( force_style == scalar_plain && ( scan & SCAN_INDIC_S || scan & SCAN_INDIC_C ) ) {
|
|
|
|
if ( scan & SCAN_NEWLINE ) {
|
|
|
|
force_style = favor_style;
|
|
|
|
} else {
|
|
|
|
force_style = scalar_2quote;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( force_indent > 0 ) {
|
|
|
|
lvl->spaces = parent->spaces + force_indent;
|
|
|
|
} else if ( scan & SCAN_DOCSEP ) {
|
|
|
|
lvl->spaces = parent->spaces + e->indent;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* For now, all ambiguous keys are going to be double-quoted */
|
2005-09-20 02:50:20 -04:00
|
|
|
if ( ( parent->status == syck_lvl_map || parent->status == syck_lvl_mapx ) && parent->ncount % 2 == 1 ) {
|
2005-09-12 23:58:33 -04:00
|
|
|
if ( force_style != scalar_plain ) {
|
|
|
|
force_style = scalar_2quote;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* If the parent is an inline, double quote anything complex */
|
|
|
|
if ( parent->status == syck_lvl_imap || parent->status == syck_lvl_iseq ) {
|
|
|
|
if ( force_style != scalar_plain && force_style != scalar_1quote ) {
|
|
|
|
force_style = scalar_2quote;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Fix the ending newlines */
|
|
|
|
if ( scan & SCAN_NONL_E ) {
|
|
|
|
keep_nl = NL_CHOMP;
|
|
|
|
} else if ( scan & SCAN_MANYNL_E ) {
|
|
|
|
keep_nl = NL_KEEP;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Write the text node */
|
|
|
|
switch ( force_style )
|
|
|
|
{
|
|
|
|
case scalar_1quote:
|
|
|
|
syck_emit_1quoted( e, force_width, str, len );
|
|
|
|
break;
|
|
|
|
|
2005-09-20 02:50:20 -04:00
|
|
|
case scalar_none:
|
2005-09-12 23:58:33 -04:00
|
|
|
case scalar_2quote:
|
|
|
|
syck_emit_2quoted( e, force_width, str, len );
|
|
|
|
break;
|
|
|
|
|
|
|
|
case scalar_fold:
|
|
|
|
syck_emit_folded( e, force_width, keep_nl, str, len );
|
|
|
|
break;
|
|
|
|
|
|
|
|
case scalar_literal:
|
|
|
|
syck_emit_literal( e, keep_nl, str, len );
|
|
|
|
break;
|
|
|
|
|
|
|
|
case scalar_plain:
|
|
|
|
syck_emitter_write( e, str, len );
|
|
|
|
break;
|
|
|
|
}
|
2005-09-20 02:50:20 -04:00
|
|
|
|
|
|
|
if ( parent->status == syck_lvl_mapx )
|
|
|
|
{
|
|
|
|
syck_emitter_write( e, "\n", 1 );
|
|
|
|
}
|
2005-09-12 23:58:33 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2008-07-22 14:02:12 -04:00
|
|
|
syck_emitter_escape( SyckEmitter *e, const char *src, long len )
|
2005-09-12 23:58:33 -04:00
|
|
|
{
|
|
|
|
int i;
|
|
|
|
for( i = 0; i < len; i++ )
|
|
|
|
{
|
|
|
|
if( (src[i] < 0x20) || (0x7E < src[i]) )
|
|
|
|
{
|
|
|
|
syck_emitter_write( e, "\\", 1 );
|
|
|
|
if( '\0' == src[i] )
|
|
|
|
syck_emitter_write( e, "0", 1 );
|
|
|
|
else
|
|
|
|
{
|
|
|
|
syck_emitter_write( e, "x", 1 );
|
2006-06-20 14:02:17 -04:00
|
|
|
syck_emitter_write( e, (const char *)hex_table + ((src[i] & 0xF0) >> 4), 1 );
|
|
|
|
syck_emitter_write( e, (const char *)hex_table + (src[i] & 0x0F), 1 );
|
2005-09-12 23:58:33 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
syck_emitter_write( e, src + i, 1 );
|
|
|
|
if( '\\' == src[i] )
|
|
|
|
syck_emitter_write( e, "\\", 1 );
|
|
|
|
}
|
2003-07-11 19:44:37 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
2005-09-12 23:58:33 -04:00
|
|
|
* Outputs a single-quoted block.
|
2003-07-11 19:44:37 -04:00
|
|
|
*/
|
2008-07-22 14:02:12 -04:00
|
|
|
void
|
|
|
|
syck_emit_1quoted( SyckEmitter *e, int width, const char *str, long len )
|
2003-07-11 19:44:37 -04:00
|
|
|
{
|
2005-09-12 23:58:33 -04:00
|
|
|
char do_indent = 0;
|
2008-07-22 14:02:12 -04:00
|
|
|
const char *mark = str;
|
|
|
|
const char *start = str;
|
|
|
|
const char *end = str;
|
2005-09-12 23:58:33 -04:00
|
|
|
syck_emitter_write( e, "'", 1 );
|
|
|
|
while ( mark < str + len ) {
|
|
|
|
if ( do_indent ) {
|
|
|
|
syck_emit_indent( e );
|
|
|
|
do_indent = 0;
|
|
|
|
}
|
|
|
|
switch ( *mark ) {
|
|
|
|
case '\'': syck_emitter_write( e, "'", 1 ); break;
|
|
|
|
|
|
|
|
case '\n':
|
|
|
|
end = mark + 1;
|
|
|
|
if ( *start != ' ' && *start != '\n' && *end != '\n' && *end != ' ' ) {
|
|
|
|
syck_emitter_write( e, "\n\n", 2 );
|
|
|
|
} else {
|
|
|
|
syck_emitter_write( e, "\n", 1 );
|
|
|
|
}
|
|
|
|
do_indent = 1;
|
|
|
|
start = mark + 1;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case ' ':
|
|
|
|
if ( width > 0 && *start != ' ' && mark - end > width ) {
|
|
|
|
do_indent = 1;
|
|
|
|
end = mark + 1;
|
|
|
|
} else {
|
|
|
|
syck_emitter_write( e, " ", 1 );
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
syck_emitter_write( e, mark, 1 );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
mark++;
|
|
|
|
}
|
|
|
|
syck_emitter_write( e, "'", 1 );
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Outputs a double-quoted block.
|
|
|
|
*/
|
2008-07-22 14:02:12 -04:00
|
|
|
void
|
|
|
|
syck_emit_2quoted( SyckEmitter *e, int width, const char *str, long len )
|
2005-09-12 23:58:33 -04:00
|
|
|
{
|
|
|
|
char do_indent = 0;
|
2008-07-22 14:02:12 -04:00
|
|
|
const char *mark = str;
|
|
|
|
const char *start = str;
|
|
|
|
const char *end = str;
|
2005-09-12 23:58:33 -04:00
|
|
|
syck_emitter_write( e, "\"", 1 );
|
|
|
|
while ( mark < str + len ) {
|
|
|
|
if ( do_indent > 0 ) {
|
|
|
|
if ( do_indent == 2 ) {
|
|
|
|
syck_emitter_write( e, "\\", 1 );
|
|
|
|
}
|
|
|
|
syck_emit_indent( e );
|
|
|
|
do_indent = 0;
|
|
|
|
}
|
|
|
|
switch ( *mark ) {
|
|
|
|
|
|
|
|
/* Escape sequences allowed within double quotes. */
|
|
|
|
case '"': syck_emitter_write( e, "\\\"", 2 ); break;
|
|
|
|
case '\\': syck_emitter_write( e, "\\\\", 2 ); break;
|
|
|
|
case '\0': syck_emitter_write( e, "\\0", 2 ); break;
|
|
|
|
case '\a': syck_emitter_write( e, "\\a", 2 ); break;
|
|
|
|
case '\b': syck_emitter_write( e, "\\b", 2 ); break;
|
|
|
|
case '\f': syck_emitter_write( e, "\\f", 2 ); break;
|
|
|
|
case '\r': syck_emitter_write( e, "\\r", 2 ); break;
|
|
|
|
case '\t': syck_emitter_write( e, "\\t", 2 ); break;
|
|
|
|
case '\v': syck_emitter_write( e, "\\v", 2 ); break;
|
|
|
|
case 0x1b: syck_emitter_write( e, "\\e", 2 ); break;
|
|
|
|
|
|
|
|
case '\n':
|
|
|
|
end = mark + 1;
|
|
|
|
syck_emitter_write( e, "\\n", 2 );
|
|
|
|
do_indent = 2;
|
|
|
|
start = mark + 1;
|
|
|
|
if ( start < str + len && ( *start == ' ' || *start == '\n' ) ) {
|
|
|
|
do_indent = 0;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case ' ':
|
|
|
|
if ( width > 0 && *start != ' ' && mark - end > width ) {
|
|
|
|
do_indent = 1;
|
|
|
|
end = mark + 1;
|
|
|
|
} else {
|
|
|
|
syck_emitter_write( e, " ", 1 );
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
syck_emitter_escape( e, mark, 1 );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
mark++;
|
|
|
|
}
|
|
|
|
syck_emitter_write( e, "\"", 1 );
|
|
|
|
}
|
2003-07-11 19:44:37 -04:00
|
|
|
|
2005-09-12 23:58:33 -04:00
|
|
|
/*
|
|
|
|
* Outputs a literal block.
|
|
|
|
*/
|
2008-07-22 14:02:12 -04:00
|
|
|
void
|
|
|
|
syck_emit_literal( SyckEmitter *e, char keep_nl, const char *str, long len )
|
2005-09-12 23:58:33 -04:00
|
|
|
{
|
2008-07-22 14:02:12 -04:00
|
|
|
const char *mark = str;
|
|
|
|
const char *start = str;
|
|
|
|
const char *end = str;
|
2005-09-12 23:58:33 -04:00
|
|
|
syck_emitter_write( e, "|", 1 );
|
|
|
|
if ( keep_nl == NL_CHOMP ) {
|
|
|
|
syck_emitter_write( e, "-", 1 );
|
|
|
|
} else if ( keep_nl == NL_KEEP ) {
|
|
|
|
syck_emitter_write( e, "+", 1 );
|
|
|
|
}
|
|
|
|
syck_emit_indent( e );
|
|
|
|
while ( mark < str + len ) {
|
|
|
|
if ( *mark == '\n' ) {
|
|
|
|
end = mark;
|
|
|
|
if ( *start != ' ' && *start != '\n' && *end != '\n' && *end != ' ' ) end += 1;
|
|
|
|
syck_emitter_write( e, start, end - start );
|
|
|
|
if ( mark + 1 == str + len ) {
|
|
|
|
if ( keep_nl != NL_KEEP ) syck_emitter_write( e, "\n", 1 );
|
|
|
|
} else {
|
|
|
|
syck_emit_indent( e );
|
|
|
|
}
|
|
|
|
start = mark + 1;
|
|
|
|
}
|
|
|
|
mark++;
|
|
|
|
}
|
|
|
|
end = str + len;
|
|
|
|
if ( start < end ) {
|
|
|
|
syck_emitter_write( e, start, end - start );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Outputs a folded block.
|
|
|
|
*/
|
2008-07-22 14:02:12 -04:00
|
|
|
void
|
|
|
|
syck_emit_folded( SyckEmitter *e, int width, char keep_nl, const char *str, long len )
|
2005-09-12 23:58:33 -04:00
|
|
|
{
|
2008-07-22 14:02:12 -04:00
|
|
|
const char *mark = str;
|
|
|
|
const char *start = str;
|
|
|
|
const char *end = str;
|
2005-09-12 23:58:33 -04:00
|
|
|
syck_emitter_write( e, ">", 1 );
|
|
|
|
if ( keep_nl == NL_CHOMP ) {
|
|
|
|
syck_emitter_write( e, "-", 1 );
|
|
|
|
} else if ( keep_nl == NL_KEEP ) {
|
|
|
|
syck_emitter_write( e, "+", 1 );
|
|
|
|
}
|
|
|
|
syck_emit_indent( e );
|
|
|
|
if ( width <= 0 ) width = e->best_width;
|
|
|
|
while ( mark < str + len ) {
|
|
|
|
switch ( *mark ) {
|
|
|
|
case '\n':
|
|
|
|
syck_emitter_write( e, end, mark - end );
|
|
|
|
end = mark + 1;
|
|
|
|
if ( *start != ' ' && *start != '\n' && *end != '\n' && *end != ' ' ) {
|
|
|
|
syck_emitter_write( e, "\n", 1 );
|
|
|
|
}
|
|
|
|
if ( mark + 1 == str + len ) {
|
|
|
|
if ( keep_nl != NL_KEEP ) syck_emitter_write( e, "\n", 1 );
|
|
|
|
} else {
|
|
|
|
syck_emit_indent( e );
|
|
|
|
}
|
|
|
|
start = mark + 1;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case ' ':
|
|
|
|
if ( *start != ' ' ) {
|
|
|
|
if ( mark - end > width ) {
|
|
|
|
syck_emitter_write( e, end, mark - end );
|
|
|
|
syck_emit_indent( e );
|
|
|
|
end = mark + 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
mark++;
|
|
|
|
}
|
|
|
|
if ( end < mark ) {
|
|
|
|
syck_emitter_write( e, end, mark - end );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Begins emission of a sequence.
|
|
|
|
*/
|
2008-07-22 14:02:12 -04:00
|
|
|
void syck_emit_seq( SyckEmitter *e, const char *tag, enum seq_style style )
|
2005-09-12 23:58:33 -04:00
|
|
|
{
|
|
|
|
SyckLevel *parent = syck_emitter_parent_level( e );
|
|
|
|
SyckLevel *lvl = syck_emitter_current_level( e );
|
|
|
|
syck_emit_tag( e, tag, "tag:yaml.org,2002:seq" );
|
|
|
|
if ( style == seq_inline || ( parent->status == syck_lvl_imap || parent->status == syck_lvl_iseq ) ) {
|
|
|
|
syck_emitter_write( e, "[", 1 );
|
|
|
|
lvl->status = syck_lvl_iseq;
|
|
|
|
} else {
|
2006-01-15 20:29:58 -05:00
|
|
|
/* complex key */
|
|
|
|
if ( parent->status == syck_lvl_map && parent->ncount % 2 == 1 ) {
|
|
|
|
syck_emitter_write( e, "? ", 2 );
|
|
|
|
parent->status = syck_lvl_mapx;
|
|
|
|
}
|
2005-09-12 23:58:33 -04:00
|
|
|
lvl->status = syck_lvl_seq;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Begins emission of a mapping.
|
|
|
|
*/
|
2008-07-22 14:02:12 -04:00
|
|
|
void
|
|
|
|
syck_emit_map( SyckEmitter *e, const char *tag, enum map_style style )
|
2005-09-12 23:58:33 -04:00
|
|
|
{
|
|
|
|
SyckLevel *parent = syck_emitter_parent_level( e );
|
|
|
|
SyckLevel *lvl = syck_emitter_current_level( e );
|
|
|
|
syck_emit_tag( e, tag, "tag:yaml.org,2002:map" );
|
|
|
|
if ( style == map_inline || ( parent->status == syck_lvl_imap || parent->status == syck_lvl_iseq ) ) {
|
|
|
|
syck_emitter_write( e, "{", 1 );
|
|
|
|
lvl->status = syck_lvl_imap;
|
|
|
|
} else {
|
2006-01-15 20:29:58 -05:00
|
|
|
/* complex key */
|
|
|
|
if ( parent->status == syck_lvl_map && parent->ncount % 2 == 1 ) {
|
|
|
|
syck_emitter_write( e, "? ", 2 );
|
|
|
|
parent->status = syck_lvl_mapx;
|
|
|
|
}
|
2005-09-12 23:58:33 -04:00
|
|
|
lvl->status = syck_lvl_map;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Handles emitting of a collection item (for both
|
|
|
|
* sequences and maps)
|
|
|
|
*/
|
|
|
|
void syck_emit_item( SyckEmitter *e, st_data_t n )
|
|
|
|
{
|
|
|
|
SyckLevel *lvl = syck_emitter_current_level( e );
|
|
|
|
switch ( lvl->status )
|
2003-07-11 19:44:37 -04:00
|
|
|
{
|
2005-09-12 23:58:33 -04:00
|
|
|
case syck_lvl_seq:
|
2003-07-11 19:44:37 -04:00
|
|
|
{
|
2005-09-12 23:58:33 -04:00
|
|
|
SyckLevel *parent = syck_emitter_parent_level( e );
|
|
|
|
|
2006-01-15 20:29:58 -05:00
|
|
|
/* seq-in-map shortcut -- the lvl->anctag check should be unneccesary but
|
|
|
|
* there is a nasty shift/reduce in the parser on this point and
|
|
|
|
* i'm not ready to tickle it. */
|
|
|
|
if ( lvl->anctag == 0 && parent->status == syck_lvl_map && lvl->ncount == 0 ) {
|
|
|
|
lvl->spaces = parent->spaces;
|
2005-09-12 23:58:33 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
/* seq-in-seq shortcut */
|
|
|
|
else if ( lvl->anctag == 0 && parent->status == syck_lvl_seq && lvl->ncount == 0 ) {
|
|
|
|
int spcs = ( lvl->spaces - parent->spaces ) - 2;
|
|
|
|
if ( spcs >= 0 ) {
|
|
|
|
int i = 0;
|
|
|
|
for ( i = 0; i < spcs; i++ ) {
|
|
|
|
syck_emitter_write( e, " ", 1 );
|
|
|
|
}
|
|
|
|
syck_emitter_write( e, "- ", 2 );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
syck_emit_indent( e );
|
|
|
|
syck_emitter_write( e, "- ", 2 );
|
2003-07-11 19:44:37 -04:00
|
|
|
}
|
2005-09-12 23:58:33 -04:00
|
|
|
break;
|
2003-07-11 19:44:37 -04:00
|
|
|
|
2005-09-12 23:58:33 -04:00
|
|
|
case syck_lvl_iseq:
|
2003-07-11 19:44:37 -04:00
|
|
|
{
|
2005-09-12 23:58:33 -04:00
|
|
|
if ( lvl->ncount > 0 ) {
|
|
|
|
syck_emitter_write( e, ", ", 2 );
|
|
|
|
}
|
2003-07-11 19:44:37 -04:00
|
|
|
}
|
2005-09-12 23:58:33 -04:00
|
|
|
break;
|
|
|
|
|
|
|
|
case syck_lvl_map:
|
2003-07-11 19:44:37 -04:00
|
|
|
{
|
2005-09-12 23:58:33 -04:00
|
|
|
SyckLevel *parent = syck_emitter_parent_level( e );
|
|
|
|
|
|
|
|
/* map-in-seq shortcut */
|
|
|
|
if ( lvl->anctag == 0 && parent->status == syck_lvl_seq && lvl->ncount == 0 ) {
|
|
|
|
int spcs = ( lvl->spaces - parent->spaces ) - 2;
|
|
|
|
if ( spcs >= 0 ) {
|
|
|
|
int i = 0;
|
|
|
|
for ( i = 0; i < spcs; i++ ) {
|
|
|
|
syck_emitter_write( e, " ", 1 );
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( lvl->ncount % 2 == 0 ) {
|
|
|
|
syck_emit_indent( e );
|
|
|
|
} else {
|
|
|
|
syck_emitter_write( e, ": ", 2 );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case syck_lvl_mapx:
|
|
|
|
{
|
|
|
|
if ( lvl->ncount % 2 == 0 ) {
|
|
|
|
syck_emit_indent( e );
|
|
|
|
lvl->status = syck_lvl_map;
|
|
|
|
} else {
|
|
|
|
int i;
|
|
|
|
if ( lvl->spaces > 0 ) {
|
|
|
|
char *spcs = S_ALLOC_N( char, lvl->spaces + 1 );
|
|
|
|
|
|
|
|
spcs[lvl->spaces] = '\0';
|
|
|
|
for ( i = 0; i < lvl->spaces; i++ ) spcs[i] = ' ';
|
|
|
|
syck_emitter_write( e, spcs, lvl->spaces );
|
|
|
|
S_FREE( spcs );
|
2003-07-11 19:44:37 -04:00
|
|
|
}
|
2005-09-12 23:58:33 -04:00
|
|
|
syck_emitter_write( e, ": ", 2 );
|
2003-07-11 19:44:37 -04:00
|
|
|
}
|
2005-09-12 23:58:33 -04:00
|
|
|
}
|
|
|
|
break;
|
2003-07-11 19:44:37 -04:00
|
|
|
|
2005-09-12 23:58:33 -04:00
|
|
|
case syck_lvl_imap:
|
|
|
|
{
|
|
|
|
if ( lvl->ncount > 0 ) {
|
|
|
|
if ( lvl->ncount % 2 == 0 ) {
|
|
|
|
syck_emitter_write( e, ", ", 2 );
|
|
|
|
} else {
|
|
|
|
syck_emitter_write( e, ": ", 2 );
|
|
|
|
}
|
|
|
|
}
|
2003-07-11 19:44:37 -04:00
|
|
|
}
|
2005-09-12 23:58:33 -04:00
|
|
|
break;
|
2005-09-20 02:50:20 -04:00
|
|
|
|
|
|
|
default: break;
|
2003-07-11 19:44:37 -04:00
|
|
|
}
|
2005-09-12 23:58:33 -04:00
|
|
|
lvl->ncount++;
|
2003-07-11 19:44:37 -04:00
|
|
|
|
2005-09-12 23:58:33 -04:00
|
|
|
syck_emit( e, n );
|
2003-07-11 19:44:37 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
2005-09-12 23:58:33 -04:00
|
|
|
* Closes emission of a collection.
|
2003-07-11 19:44:37 -04:00
|
|
|
*/
|
2005-09-12 23:58:33 -04:00
|
|
|
void syck_emit_end( SyckEmitter *e )
|
2003-07-11 19:44:37 -04:00
|
|
|
{
|
2005-09-12 23:58:33 -04:00
|
|
|
SyckLevel *lvl = syck_emitter_current_level( e );
|
|
|
|
SyckLevel *parent = syck_emitter_parent_level( e );
|
|
|
|
switch ( lvl->status )
|
|
|
|
{
|
|
|
|
case syck_lvl_seq:
|
|
|
|
if ( lvl->ncount == 0 ) {
|
|
|
|
syck_emitter_write( e, "[]\n", 3 );
|
|
|
|
} else if ( parent->status == syck_lvl_mapx ) {
|
|
|
|
syck_emitter_write( e, "\n", 1 );
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case syck_lvl_iseq:
|
|
|
|
syck_emitter_write( e, "]\n", 1 );
|
|
|
|
break;
|
|
|
|
|
|
|
|
case syck_lvl_map:
|
|
|
|
if ( lvl->ncount == 0 ) {
|
|
|
|
syck_emitter_write( e, "{}\n", 3 );
|
|
|
|
} else if ( lvl->ncount % 2 == 1 ) {
|
|
|
|
syck_emitter_write( e, ":\n", 1 );
|
|
|
|
} else if ( parent->status == syck_lvl_mapx ) {
|
|
|
|
syck_emitter_write( e, "\n", 1 );
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case syck_lvl_imap:
|
|
|
|
syck_emitter_write( e, "}\n", 1 );
|
|
|
|
break;
|
2005-09-20 02:50:20 -04:00
|
|
|
|
|
|
|
default: break;
|
2005-09-12 23:58:33 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Fill markers table with emitter nodes in the
|
|
|
|
* soon-to-be-emitted tree.
|
|
|
|
*/
|
|
|
|
SYMID
|
|
|
|
syck_emitter_mark_node( SyckEmitter *e, st_data_t n )
|
|
|
|
{
|
|
|
|
SYMID oid = 0;
|
|
|
|
char *anchor_name = NULL;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Ensure markers table is initialized.
|
|
|
|
*/
|
|
|
|
if ( e->markers == NULL )
|
|
|
|
{
|
|
|
|
e->markers = st_init_numtable();
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Markers table initially marks the string position of the
|
|
|
|
* object. Doesn't yet create an anchor, simply notes the
|
|
|
|
* position.
|
|
|
|
*/
|
|
|
|
if ( ! st_lookup( e->markers, n, (st_data_t *)&oid ) )
|
|
|
|
{
|
|
|
|
/*
|
|
|
|
* Store all markers
|
|
|
|
*/
|
|
|
|
oid = e->markers->num_entries + 1;
|
|
|
|
st_insert( e->markers, n, (st_data_t)oid );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if ( e->anchors == NULL )
|
|
|
|
{
|
|
|
|
e->anchors = st_init_numtable();
|
|
|
|
}
|
|
|
|
|
2008-07-22 10:04:10 -04:00
|
|
|
if ( ! st_lookup( e->anchors, (st_data_t)oid, (void *)&anchor_name ) )
|
2005-09-12 23:58:33 -04:00
|
|
|
{
|
|
|
|
int idx = 0;
|
* sprintf.c (rb_str_format): allow %c to print one character
string (e.g. ?x).
* lib/tempfile.rb (Tempfile::make_tmpname): put dot between
basename and pid. [ruby-talk:196272]
* parse.y (do_block): remove -> style block.
* parse.y (parser_yylex): remove tLAMBDA_ARG.
* eval.c (rb_call0): binding for the return event hook should have
consistent scope. [ruby-core:07928]
* eval.c (proc_invoke): return behavior should depend whether it
is surrounded by a lambda or a mere block.
* eval.c (formal_assign): handles post splat arguments.
* eval.c (rb_call0): ditto.
* st.c (strhash): use FNV-1a hash.
* parse.y (parser_yylex): removed experimental ';;' terminator.
* eval.c (rb_node_arity): should be aware of post splat arguments.
* eval.c (rb_proc_arity): ditto.
* parse.y (f_args): syntax rule enhanced to support arguments
after the splat.
* parse.y (block_param): ditto for block parameters.
* parse.y (f_post_arg): mandatory formal arguments after the splat
argument.
* parse.y (new_args_gen): generate nodes for mandatory formal
arguments after the splat argument.
* eval.c (rb_eval): dispatch mandatory formal arguments after the
splat argument.
* parse.y (args): allow more than one splat in the argument list.
* parse.y (method_call): allow aref [] to accept all kind of
method argument, including assocs, splat, and block argument.
* eval.c (SETUP_ARGS0): prepare block argument as well.
* lib/mathn.rb (Integer): remove Integer#gcd2. [ruby-core:07931]
* eval.c (error_line): print receivers true/false/nil specially.
* eval.c (rb_proc_yield): handles parameters in yield semantics.
* eval.c (nil_yield): gives LocalJumpError to denote no block
error.
* io.c (rb_io_getc): now takes one-character string.
* string.c (rb_str_hash): use FNV-1a hash from Fowler/Noll/Vo
hashing algorithm.
* string.c (rb_str_aref): str[0] now returns 1 character string,
instead of a fixnum. [Ruby2]
* parse.y (parser_yylex): ?c now returns 1 character string,
instead of a fixnum. [Ruby2]
* string.c (rb_str_aset): no longer support fixnum insertion.
* eval.c (umethod_bind): should not update original class.
[ruby-dev:28636]
* eval.c (ev_const_get): should support constant access from
within instance_eval(). [ruby-dev:28327]
* time.c (time_timeval): should round for usec floating
number. [ruby-core:07896]
* time.c (time_add): ditto.
* dir.c (sys_warning): should not call a vararg function
rb_sys_warning() indirectly. [ruby-core:07886]
* numeric.c (flo_divmod): the first element of Float#divmod should
be an integer. [ruby-dev:28589]
* test/ruby/test_float.rb: add tests for divmod, div, modulo and remainder.
* re.c (rb_reg_initialize): should not allow modifying literal
regexps. frozen check moved from rb_reg_initialize_m as well.
* re.c (rb_reg_initialize): should not modify untainted objects in
safe levels higher than 3.
* re.c (rb_memcmp): type change from char* to const void*.
* dir.c (dir_close): should not close untainted dir stream.
* dir.c (GetDIR): add tainted/frozen check for each dir operation.
* lib/rdoc/parsers/parse_rb.rb (RDoc::RubyParser::parse_symbol_arg):
typo fixed. a patch from Florian Gross <florg at florg.net>.
* eval.c (EXEC_EVENT_HOOK): trace_func may remove itself from
event_hooks. no guarantee for arbitrary hook deletion.
[ruby-dev:28632]
* util.c (ruby_strtod): differ addition to minimize error.
[ruby-dev:28619]
* util.c (ruby_strtod): should not raise ERANGE when the input
string does not have any digits. [ruby-dev:28629]
* eval.c (proc_invoke): should restore old ruby_frame->block.
thanks to ts <decoux at moulon.inra.fr>. [ruby-core:07833]
also fix [ruby-dev:28614] as well.
* signal.c (trap): sig should be less then NSIG. Coverity found
this bug. a patch from Kevin Tew <tewk at tewk.com>.
[ruby-core:07823]
* math.c (math_log2): add new method inspired by
[ruby-talk:191237].
* math.c (math_log): add optional base argument to Math::log().
[ruby-talk:191308]
* ext/syck/emitter.c (syck_scan_scalar): avoid accessing
uninitialized array element. a patch from Pat Eyler
<rubypate at gmail.com>. [ruby-core:07809]
* array.c (rb_ary_fill): initialize local variables first. a
patch from Pat Eyler <rubypate at gmail.com>. [ruby-core:07810]
* ext/syck/yaml2byte.c (syck_yaml2byte_handler): need to free
type_tag. a patch from Pat Eyler <rubypate at gmail.com>.
[ruby-core:07808]
* ext/socket/socket.c (make_hostent_internal): accept ai_family
check from Sam Roberts <sroberts at uniserve.com>.
[ruby-core:07691]
* util.c (ruby_strtod): should not cut off 18 digits for no
reason. [ruby-core:07796]
* array.c (rb_ary_fill): internalize local variable "beg" to
pacify Coverity. [ruby-core:07770]
* pack.c (pack_unpack): now supports CRLF newlines. a patch from
<tommy at tmtm.org>. [ruby-dev:28601]
* applied code clean-up patch from Stefan Huehner
<stefan at huehner.org>. [ruby-core:07764]
* lib/jcode.rb (String::tr_s): should have translated non
squeezing character sequence (i.e. a character) as well. thanks
to Hiroshi Ichikawa <gimite at gimite.ddo.jp> [ruby-list:42090]
* ext/socket/socket.c: document update patch from Sam Roberts
<sroberts at uniserve.com>. [ruby-core:07701]
* lib/mathn.rb (Integer): need not to remove gcd2. a patch from
NARUSE, Yui <naruse at airemix.com>. [ruby-dev:28570]
* parse.y (arg): too much NEW_LIST()
* eval.c (SETUP_ARGS0): remove unnecessary access to nd_alen.
* eval.c (rb_eval): use ARGSCAT for NODE_OP_ASGN1.
[ruby-dev:28585]
* parse.y (arg): use NODE_ARGSCAT for placeholder.
* lib/getoptlong.rb (GetoptLong::get): RDoc update patch from
mathew <meta at pobox.com>. [ruby-core:07738]
* variable.c (rb_const_set): raise error when no target klass is
supplied. [ruby-dev:28582]
* prec.c (prec_prec_f): documentation patch from
<gerardo.santana at gmail.com>. [ruby-core:07689]
* bignum.c (rb_big_pow): second operand may be too big even if
it's a Fixnum. [ruby-talk:187984]
* README.EXT: update symbol description. [ruby-talk:188104]
* COPYING: explicitly note GPLv2. [ruby-talk:187922]
* parse.y: remove some obsolete syntax rules (unparenthesized
method calls in argument list).
* eval.c (rb_call0): insecure calling should be checked for non
NODE_SCOPE method invocations too.
* eval.c (rb_alias): should preserve the current safe level as
well as method definition.
* process.c (rb_f_sleep): remove RDoc description about SIGALRM
which is not valid on the current implementation. [ruby-dev:28464]
Thu Mar 23 21:40:47 2006 K.Kosako <sndgk393 AT ybb.ne.jp>
* eval.c (method_missing): should support argument splat in
super. a bug in combination of super, splat and
method_missing. [ruby-talk:185438]
* configure.in: Solaris SunPro compiler -rapth patch from
<kuwa at labs.fujitsu.com>. [ruby-dev:28443]
* configure.in: remove enable_rpath=no for Solaris.
[ruby-dev:28440]
* ext/win32ole/win32ole.c (ole_val2olevariantdata): change behavior
of converting OLE Variant object with VT_ARRAY|VT_UI1 and Ruby
String object.
* ruby.1: a clarification patch from David Lutterkort
<dlutter at redhat.com>. [ruby-core:7508]
* lib/rdoc/ri/ri_paths.rb (RI::Paths): adding paths from rubygems
directories. a patch from Eric Hodel <drbrain at segment7.net>.
[ruby-core:07423]
* eval.c (rb_clear_cache_by_class): clearing wrong cache.
* ext/extmk.rb: use :remove_destination to install extension libraries
to avoid SEGV. [ruby-dev:28417]
* eval.c (rb_thread_fd_writable): should not re-schedule output
from KILLED thread (must be error printing).
* array.c (rb_ary_flatten_bang): allow specifying recursion
level. [ruby-talk:182170]
* array.c (rb_ary_flatten): ditto.
* gc.c (add_heap): a heap_slots may overflow. a patch from Stefan
Weil <weil at mail.berlios.de>.
* eval.c (rb_call): use separate cache for fcall/vcall
invocation.
* eval.c (rb_eval): NODE_FCALL, NODE_VCALL can call local
functions.
* eval.c (rb_mod_local): a new method to specify newly added
visibility "local".
* eval.c (search_method): search for local methods which are
visible only from the current class.
* class.c (rb_class_local_methods): a method to list local methods.
* object.c (Init_Object): add BasicObject class as a top level
BlankSlate class.
* ruby.h (SYM2ID): should not cast to signed long.
[ruby-core:07414]
* class.c (rb_include_module): allow module duplication.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@10235 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2006-06-09 17:20:17 -04:00
|
|
|
const char *anc = ( e->anchor_format == NULL ? DEFAULT_ANCHOR_FORMAT : e->anchor_format );
|
2005-09-12 23:58:33 -04:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Second time hitting this object, let's give it an anchor
|
|
|
|
*/
|
|
|
|
idx = e->anchors->num_entries + 1;
|
|
|
|
anchor_name = S_ALLOC_N( char, strlen( anc ) + 10 );
|
|
|
|
S_MEMZERO( anchor_name, char, strlen( anc ) + 10 );
|
|
|
|
sprintf( anchor_name, anc, idx );
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Insert into anchors table
|
|
|
|
*/
|
|
|
|
st_insert( e->anchors, (st_data_t)oid, (st_data_t)anchor_name );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return oid;
|
2003-07-11 19:44:37 -04:00
|
|
|
}
|
|
|
|
|