Example #1
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: 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;
}
Example #2
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;
}
Example #3
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;
}