123456789_123456789_123456789_123456789_123456789_

Class: LibXML::XML::InputCallbacks

Relationships & Source Files
Inherits: Object
Defined in: ext/libxml/ruby_xml_input_cbg.c,
ext/libxml/ruby_xml_input_cbg.c

Overview

Support for adding custom scheme handlers.

Class Method Summary

Class Method Details

.add_scheme

No documentation available.

[ GitHub ]

  
# File 'ext/libxml/ruby_xml_input_cbg.c', line 103

static VALUE input_callbacks_add_scheme(VALUE self, VALUE scheme_name,
    VALUE class)
{
  ic_scheme *scheme;

  Check_Type(scheme_name, T_STRING);

  scheme = (ic_scheme*) malloc(sizeof(ic_scheme));
  scheme->next_scheme = 0;
  scheme->scheme_name = strdup(StringValuePtr(scheme_name)); /* TODO alloc, dealloc */
  scheme->name_len = (int)strlen(scheme->scheme_name);
  scheme->class = class; /* TODO alloc, dealloc */

  //fprintf( stderr, "registered: %s, %d, %s\n", scheme->scheme_name, scheme->name_len, scheme->class );

  if (0 == first_scheme)
    first_scheme = scheme;
  else
  {
    ic_scheme *pos;
    pos = first_scheme;
    while (0 != pos->next_scheme)
      pos = pos->next_scheme;
    pos->next_scheme = scheme;
  }

  return (Qtrue);
}

.register

Register a new set of I/O callback for handling parser input.

[ GitHub ]

  
# File 'ext/libxml/ruby_xml_input_cbg.c', line 91

static VALUE input_callbacks_register_input_callbacks(VALUE self)
{
  xmlRegisterInputCallbacks(ic_match, ic_open, ic_read, ic_close);
  return (Qtrue);
}

.remove_scheme

No documentation available.

[ GitHub ]

  
# File 'ext/libxml/ruby_xml_input_cbg.c', line 138

static VALUE input_callbacks_remove_scheme(VALUE self, VALUE scheme_name)
{
  char *name;
  ic_scheme *save_scheme, *scheme;

  Check_Type(scheme_name, T_STRING);
  name = StringValuePtr(scheme_name);

  if (0 == first_scheme)
    return Qfalse;

  if (!strncmp(name, first_scheme->scheme_name, first_scheme->name_len))
  {
    save_scheme = first_scheme->next_scheme;

    ruby_xfree(first_scheme->scheme_name);
    ruby_xfree(first_scheme);

    first_scheme = save_scheme;
    return Qtrue;
  }

  scheme = first_scheme;
  while (0 != scheme->next_scheme)
  {
    if (!strncmp(name, scheme->next_scheme->scheme_name,
        scheme->next_scheme->name_len))
    {
      save_scheme = scheme->next_scheme->next_scheme;

      ruby_xfree(scheme->next_scheme->scheme_name);
      ruby_xfree(scheme->next_scheme);

      scheme->next_scheme = save_scheme;
      return Qtrue;
    }
    scheme = scheme->next_scheme;
  }
  return Qfalse;
}