/** * rasqal_rowsource_visit: * @node: #rasqal_rowsource row source * @fn: pointer to function to apply that takes user data and rowsource parameters * @user_data: user data for applied function * * Visit a user function over a #rasqal_rowsource * * If the user function @fn returns 0, the visit is truncated. * * Return value: non-0 if the visit was truncated or on failure. **/ int rasqal_rowsource_visit(rasqal_rowsource* rowsource, rasqal_rowsource_visit_fn fn, void *user_data) { int result; int offset; rasqal_rowsource* inner_rs; if(!rowsource || !fn) return 1; result = fn(rowsource, user_data); /* end if failed */ if(result < 0) return result; /* Do not recurse if handled */ if(result > 0) return 0; for(offset = 0; (inner_rs = rasqal_rowsource_get_inner_rowsource(rowsource, offset)); offset++) { result = rasqal_rowsource_visit(inner_rs, fn, user_data); /* end if failed */ if(result < 0) return result; } return 0; }
static int rasqal_rowsource_write_internal(rasqal_rowsource *rowsource, raptor_iostream* iostr, int indent) { const char* rs_name = rowsource->handler->name; int arg_count = 0; unsigned int indent_delta; int offset; rasqal_rowsource* inner_rowsource; indent_delta = (unsigned int)strlen(rs_name); raptor_iostream_counted_string_write(rs_name, indent_delta, iostr); raptor_iostream_counted_string_write("(\n", 2, iostr); indent_delta++; indent += indent_delta; rasqal_rowsource_write_indent(iostr, indent); for(offset = 0; (inner_rowsource = rasqal_rowsource_get_inner_rowsource(rowsource, offset)); offset++) { if(arg_count) { raptor_iostream_counted_string_write(" ,\n", 3, iostr); rasqal_rowsource_write_indent(iostr, indent); } rasqal_rowsource_write_internal(inner_rowsource, iostr, indent); arg_count++; } raptor_iostream_write_byte('\n', iostr); indent-= indent_delta; rasqal_rowsource_write_indent(iostr, indent); raptor_iostream_write_byte(')', iostr); return 0; }
/** * rasqal_rowsource_visit: * @node: #rasqal_rowsource row source * @fn: pointer to function to apply that takes user data and rowsource parameters * @user_data: user data for applied function * * Visit a user function over a #rasqal_rowsource * * If the user function @fn returns 0, the visit is truncated. * * Return value: 0 if the visit was truncated. **/ int rasqal_rowsource_visit(rasqal_rowsource* rowsource, rasqal_rowsource_visit_fn fn, void *user_data) { int result; int offset; rasqal_rowsource* inner_rs; result = fn(rowsource, user_data); if(result) return result; for(offset = 0; (inner_rs = rasqal_rowsource_get_inner_rowsource(rowsource, offset)); offset++) { result = rasqal_rowsource_visit(inner_rs, fn, user_data); if(result) return result; } return 0; }