/* call-seq: as_s() * * *return* value as an String. */ static VALUE sax_value_as_s(VALUE self) { SaxDrive dr = DATA_PTR(self); VALUE rs; if ('\0' == *dr->buf.str) { return Qnil; } if (dr->options.convert_special) { ox_sax_collapse_special(dr, dr->buf.str, dr->buf.pos, dr->buf.line, dr->buf.col); } switch (dr->options.skip) { case CrSkip: buf_collapse_return(dr->buf.str); break; case SpcSkip: buf_collapse_white(dr->buf.str); break; default: break; } rs = rb_str_new2(dr->buf.str); #if HAS_ENCODING_SUPPORT if (0 != dr->encoding) { rb_enc_associate(rs, dr->encoding); } #elif HAS_PRIVATE_ENCODING if (Qnil != dr->encoding) { rb_funcall(rs, ox_force_encoding_id, 1, dr->encoding); } #endif return rs; }
static char read_text(SaxDrive dr) { char c; int line = dr->buf.line; int col = dr->buf.col - 1; buf_backup(&dr->buf); buf_protect(&dr->buf); while ('<' != (c = buf_get(&dr->buf))) { if ('\0' == c) { ox_sax_drive_error(dr, NO_TERM "text not terminated"); break; } } if ('\0' != c) { *(dr->buf.tail - 1) = '\0'; } if (dr->has.value) { VALUE args[1]; if (dr->has.line) { rb_ivar_set(dr->handler, ox_at_line_id, LONG2NUM(line)); } if (dr->has.column) { rb_ivar_set(dr->handler, ox_at_column_id, LONG2NUM(col)); } *args = dr->value_obj; rb_funcall2(dr->handler, ox_value_id, 1, args); } else if (dr->has.text) { VALUE args[1]; if (dr->options.convert_special) { ox_sax_collapse_special(dr, dr->buf.str, line, col); } args[0] = rb_str_new2(dr->buf.str); #if HAS_ENCODING_SUPPORT if (0 != dr->encoding) { rb_enc_associate(args[0], dr->encoding); } #elif HAS_PRIVATE_ENCODING if (Qnil != dr->encoding) { rb_funcall(args[0], ox_force_encoding_id, 1, dr->encoding); } #endif if (dr->has.line) { rb_ivar_set(dr->handler, ox_at_line_id, LONG2NUM(line)); } if (dr->has.column) { rb_ivar_set(dr->handler, ox_at_column_id, LONG2NUM(col)); } rb_funcall2(dr->handler, ox_text_id, 1, args); } dr->buf.str = 0; return c; }
static char read_attrs(SaxDrive dr, char c, char termc, char term2, int is_xml, int eq_req) { VALUE name = Qnil; int is_encoding = 0; int line; int col; char *attr_value; // already protected by caller dr->buf.str = dr->buf.tail; if (is_white(c)) { c = buf_next_non_white(&dr->buf); } while (termc != c && term2 != c) { buf_backup(&dr->buf); if ('\0' == c) { ox_sax_drive_error(dr, NO_TERM "attributes not terminated"); return '\0'; } line = dr->buf.line; col = dr->buf.col; if ('\0' == (c = read_name_token(dr))) { ox_sax_drive_error(dr, NO_TERM "error reading token"); return '\0'; } if (is_xml && 0 == strcasecmp("encoding", dr->buf.str)) { is_encoding = 1; } if (dr->has.attr || dr->has.attr_value) { name = str2sym(dr, dr->buf.str, 0); } if (is_white(c)) { c = buf_next_non_white(&dr->buf); } if ('=' != c) { if (eq_req) { dr->err = 1; return c; } else { ox_sax_drive_error(dr, WRONG_CHAR "no attribute value"); attr_value = (char*)""; } } else { line = dr->buf.line; col = dr->buf.col; c = read_quoted_value(dr); attr_value = dr->buf.str; if (is_encoding) { #if HAS_ENCODING_SUPPORT dr->encoding = rb_enc_find(dr->buf.str); #elif HAS_PRIVATE_ENCODING dr->encoding = rb_str_new2(dr->buf.str); #else dr->encoding = dr->buf.str; #endif is_encoding = 0; } } if (dr->has.attr_value) { VALUE args[2]; if (dr->has.line) { rb_ivar_set(dr->handler, ox_at_line_id, LONG2NUM(line)); } if (dr->has.column) { rb_ivar_set(dr->handler, ox_at_column_id, LONG2NUM(col)); } args[0] = name; args[1] = dr->value_obj; rb_funcall2(dr->handler, ox_attr_value_id, 2, args); } else if (dr->has.attr) { VALUE args[2]; args[0] = name; ox_sax_collapse_special(dr, dr->buf.str, line, col); args[1] = rb_str_new2(attr_value); #if HAS_ENCODING_SUPPORT if (0 != dr->encoding) { rb_enc_associate(args[1], dr->encoding); } #elif HAS_PRIVATE_ENCODING if (Qnil != dr->encoding) { rb_funcall(args[1], ox_force_encoding_id, 1, dr->encoding); } #endif if (dr->has.line) { rb_ivar_set(dr->handler, ox_at_line_id, LONG2NUM(line)); } if (dr->has.column) { rb_ivar_set(dr->handler, ox_at_column_id, LONG2NUM(col)); } rb_funcall2(dr->handler, ox_attr_id, 2, args); } if (is_white(c)) { c = buf_next_non_white(&dr->buf); } } dr->buf.str = 0; return c; }
/* Entered after the "<?" sequence. Ready to read the rest. */ static char read_instruction(SaxDrive dr) { char content[1024]; char c; char *cend; VALUE target = Qnil; int is_xml; int line = dr->buf.line; int col = dr->buf.col - 1; buf_protect(&dr->buf); if ('\0' == (c = read_name_token(dr))) { return c; } is_xml = (0 == strcmp("xml", dr->buf.str)); if (dr->has.instruct || dr->has.end_instruct) { target = rb_str_new2(dr->buf.str); } if (dr->has.instruct) { VALUE args[1]; if (dr->has.line) { rb_ivar_set(dr->handler, ox_at_line_id, LONG2NUM(line)); } if (dr->has.column) { rb_ivar_set(dr->handler, ox_at_column_id, LONG2NUM(col)); } args[0] = target; rb_funcall2(dr->handler, ox_instruct_id, 1, args); } buf_protect(&dr->buf); line = dr->buf.line; col = dr->buf.col; read_content(dr, content, sizeof(content) - 1); cend = dr->buf.tail; buf_reset(&dr->buf); dr->err = 0; c = read_attrs(dr, c, '?', '?', is_xml, 1); if (dr->has.attrs_done) { rb_funcall(dr->handler, ox_attrs_done_id, 0); } if (dr->err) { if (dr->has.text) { VALUE args[1]; if (dr->options.convert_special) { ox_sax_collapse_special(dr, content, line, col); } args[0] = rb_str_new2(content); #if HAS_ENCODING_SUPPORT if (0 != dr->encoding) { rb_enc_associate(args[0], dr->encoding); } #elif HAS_PRIVATE_ENCODING if (Qnil != dr->encoding) { rb_funcall(args[0], ox_force_encoding_id, 1, dr->encoding); } #endif if (dr->has.line) { rb_ivar_set(dr->handler, ox_at_line_id, LONG2NUM(line)); } if (dr->has.column) { rb_ivar_set(dr->handler, ox_at_column_id, LONG2NUM(col)); } rb_funcall2(dr->handler, ox_text_id, 1, args); } dr->buf.tail = cend; c = buf_get(&dr->buf); } else { line = dr->buf.line; col = dr->buf.col; c = buf_next_non_white(&dr->buf); if ('>' == c) { c = buf_get(&dr->buf); } else { ox_sax_drive_error_at(dr, NO_TERM "instruction not terminated", line, col); if ('>' == c) { c = buf_get(&dr->buf); } } } if (dr->has.end_instruct) { VALUE args[1]; if (dr->has.line) { rb_ivar_set(dr->handler, ox_at_line_id, LONG2NUM(line)); } if (dr->has.column) { rb_ivar_set(dr->handler, ox_at_column_id, LONG2NUM(col)); } args[0] = target; rb_funcall2(dr->handler, ox_end_instruct_id, 1, args); } dr->buf.str = 0; return c; }