#include #include #include "ruby.h" /* int xmlRegisterInputCallbacks (xmlInputMatchCallback matchFunc, xmlInputOpenCallback openFunc, xmlInputReadCallback readFunc, xmlInputCloseCallback closeFunc); int (*xmlInputMatchCallback) (char const *filename); void* (*xmlInputOpenCallback) (char const *filename); int (*xmlInputReadCallback) (void *context, char *buffer, int len); int (*xmlInputCloseCallback) (void *context); */ typedef struct deb_doc_context { char *buffer; char *bpos; int remaining; } deb_doc_context; int deb_Match (char const *filename) { fprintf( stderr, "deb_Match: %s\n", filename ); if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "deb://", 6)) { return(1); } return(0); } void* deb_Open (char const *filename) { deb_doc_context *deb_doc; VALUE res; deb_doc = (deb_doc_context*)malloc( sizeof(deb_doc_context) ); res = rb_funcall( rb_funcall( rb_mKernel, rb_intern("const_get"), 1, rb_str_new2("DEBSystem") ), rb_intern("document_query"), 1, rb_str_new2(filename)); deb_doc->buffer = strdup( StringValuePtr(res) ); //deb_doc->buffer = strdup("serepes"); deb_doc->bpos = deb_doc->buffer; deb_doc->remaining = strlen(deb_doc->buffer); return deb_doc; } int deb_Read (void *context, char *buffer, int len) { deb_doc_context *deb_doc; int ret_len; deb_doc = (deb_doc_context*)context; if (len >= deb_doc->remaining) { ret_len = deb_doc->remaining; } else { ret_len = len; } deb_doc->remaining -= ret_len; strncpy( buffer, deb_doc->bpos, ret_len ); deb_doc->bpos += ret_len; return ret_len; } int deb_Close (void *context) { free( ((deb_doc_context*)context)->buffer ); free( context ); return 1; } void deb_register_cbg() { xmlRegisterInputCallbacks( deb_Match, deb_Open, deb_Read, deb_Close ); }