static bool read_objectList(SerdReader* reader, ReadContext ctx, bool* ate_dot) { TRY_RET(read_object(reader, ctx, ate_dot)); while (!*ate_dot && eat_delim(reader, ',')) { TRY_RET(read_object(reader, ctx, ate_dot)); } return true; }
static bool read_blank(SerdReader* reader, ReadContext ctx, bool subject, Ref* dest, bool* ate_dot) { const SerdStatementFlags old_flags = *ctx.flags; bool empty; switch (peek_byte(reader)) { case '_': return (*dest = read_BLANK_NODE_LABEL(reader, ate_dot)); case '[': eat_byte_safe(reader, '['); if ((empty = peek_delim(reader, ']'))) { *ctx.flags |= (subject) ? SERD_EMPTY_S : SERD_EMPTY_O; } else { *ctx.flags |= (subject) ? SERD_ANON_S_BEGIN : SERD_ANON_O_BEGIN; if (peek_delim(reader, '=')) { if (!(*dest = read_blankName(reader)) || !eat_delim(reader, ';')) { return false; } } } if (!*dest) { *dest = blank_id(reader); } if (ctx.subject) { TRY_RET(emit_statement(reader, ctx, *dest, 0, 0)); } ctx.subject = *dest; if (!empty) { *ctx.flags &= ~(SERD_LIST_CONT); if (!subject) { *ctx.flags |= SERD_ANON_CONT; } bool ate_dot_in_list = false; read_predicateObjectList(reader, ctx, &ate_dot_in_list); if (ate_dot_in_list) { return r_err(reader, SERD_ERR_BAD_SYNTAX, "`.' inside blank\n"); } read_ws_star(reader); if (reader->end_sink) { reader->end_sink(reader->handle, deref(reader, *dest)); } *ctx.flags = old_flags; } return (eat_byte_check(reader, ']') == ']'); case '(': return read_collection(reader, ctx, dest); default: return false; // never reached } }
element_ptr parse( std::istream & in, const std::string & msg ) { char c = 0; // current character element_ptr e( new element ); in.get( c ); if ( c == '<' ) in.get( c ); e->name = get_name( c, in ); eat_whitespace( c, in ); // attributes while ( c != '>' ) { attribute a; a.name = get_name( c, in ); eat_delim( c, in, '=', msg ); eat_delim( c, in, '\"', msg ); a.value = get_value( c, in ); e->attributes.push_back( a ); eat_whitespace( c, in ); } in.get( c ); // next after '>' eat_whitespace( c, in ); // sub-elements while ( c == '<' ) { if ( in.peek() == '/' ) break; e->elements.push_back( parse( in, msg ) ); in.get( c ); // next after '>' eat_whitespace( c, in ); } // content if ( c != '<' ) { e->content += '\n'; while ( c != '<' ) { e->content += c; in.get( c ); } } assert( c == '<' ); in.get( c ); // next after '<' eat_delim( c, in, '/', msg ); std::string end_name( get_name( c, in ) ); if ( e->name != end_name ) throw std::string("xml syntax error: beginning name ") + e->name + " did not match end name " + end_name + " (" + msg + ")"; eat_delim( c, in, '>', msg ); return e; }