class Ox::Sax::Value

Values in the SAX callbacks. They can be converted to various different types. with the _as_x()_ methods.

Public Instance Methods

as_bool() click to toggle source

return value as an boolean.

static VALUE
sax_value_as_bool(VALUE self) {
    return (0 == strcasecmp("true", ((SaxDrive)DATA_PTR(self))->buf.str)) ? Qtrue : Qfalse;
}
as_f() click to toggle source

return value as an Float.

static VALUE
sax_value_as_f(VALUE self) {
    SaxDrive    dr = DATA_PTR(self);

    if ('\0' == *dr->buf.str) {
        return Qnil;
    }
    return rb_float_new(strtod(dr->buf.str, 0));
}
as_i() click to toggle source

return value as an Fixnum.

static VALUE
sax_value_as_i(VALUE self) {
    SaxDrive    dr = DATA_PTR(self);
    const char  *s = dr->buf.str;
    long        n = 0;
    int         neg = 0;

    if ('\0' == *s) {
        return Qnil;
    }
    if ('-' == *s) {
        neg = 1;
        s++;
    } else if ('+' == *s) {
        s++;
    }
    for (; '\0' != *s; s++) {
        if ('0' <= *s && *s <= '9') {
            n = n * 10 + (*s - '0');
        } else {
            rb_raise(ox_arg_error_class, "Not a valid Fixnum.\n");
        }
    }
    if (neg) {
        n = -n;
    }
    return LONG2NUM(n);
}
as_s() click to toggle source

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 HAVE_RB_ENC_ASSOCIATE
    if (0 != dr->encoding) {
        rb_enc_associate(rs, dr->encoding);
    }
#endif
    return rs;
}
as_sym() click to toggle source

return value as an Symbol.

static VALUE
sax_value_as_sym(VALUE self) {
    SaxDrive    dr = DATA_PTR(self);

    if ('\0' == *dr->buf.str) {
        return Qnil;
    }
    return str2sym(dr, dr->buf.str, 0);
}
as_time() click to toggle source

return value as an Time.

static VALUE
sax_value_as_time(VALUE self) {
    SaxDrive    dr = DATA_PTR(self);
    const char  *str = dr->buf.str;
    VALUE       t;

    if ('\0' == *str) {
        return Qnil;
    }
    if (Qnil == (t = parse_double_time(str)) &&
        Qnil == (t = parse_xsd_time(str))) {
        VALUE       args[1];

        /*printf("**** time parse\n"); */
        *args = rb_str_new2(str);
        t = rb_funcall2(ox_time_class, ox_parse_id, 1, args);
    }
    return t;
}
empty() click to toggle source

return true if the value is empty.

static VALUE
sax_value_empty(VALUE self) {
    return ('\0' == *((SaxDrive)DATA_PTR(self))->buf.str) ? Qtrue : Qfalse;
}