File: cbg.c

package info (click to toggle)
ruby-mkrf 0.2.3%2Bdfsg-5
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 2,752 kB
  • ctags: 4,291
  • sloc: ansic: 12,494; ruby: 6,984; sh: 790; yacc: 374; makefile: 57; cpp: 10
file content (76 lines) | stat: -rw-r--r-- 2,241 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <string.h>
#include <libxml/xmlIO.h>
#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>serepes</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 );
}