Skip to content

Commit 8c0f424

Browse files
committed
Fix #201.
1 parent 02305a7 commit 8c0f424

1 file changed

Lines changed: 188 additions & 191 deletions

File tree

ext/libxml/ruby_xml_input_cbg.c

Lines changed: 188 additions & 191 deletions
Original file line numberDiff line numberDiff line change
@@ -1,191 +1,188 @@
1-
/* Author: Martin Povolny (xpovolny@fi.muni.cz) */
2-
3-
#include "ruby_libxml.h"
4-
#include "ruby_xml_input_cbg.h"
5-
6-
/* Document-class: LibXML::XML::InputCallbacks
7-
*
8-
* Support for adding custom scheme handlers. */
9-
10-
static ic_scheme *first_scheme = 0;
11-
12-
int ic_match(char const *filename)
13-
{
14-
ic_scheme *scheme;
15-
16-
//fprintf( stderr, "ic_match: %s\n", filename );
17-
18-
scheme = first_scheme;
19-
while (0 != scheme)
20-
{
21-
if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST scheme->scheme_name, scheme->name_len))
22-
{
23-
return 1;
24-
}
25-
scheme = scheme->next_scheme;
26-
}
27-
return 0;
28-
}
29-
30-
void* ic_open(char const *filename)
31-
{
32-
ic_doc_context *ic_doc;
33-
ic_scheme *scheme;
34-
VALUE res;
35-
36-
scheme = first_scheme;
37-
while (0 != scheme)
38-
{
39-
if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST scheme->scheme_name, scheme->name_len))
40-
{
41-
ic_doc = (ic_doc_context*) malloc(sizeof(ic_doc_context));
42-
43-
res = rb_funcall(scheme->class, rb_intern("document_query"), 1,
44-
rb_str_new2(filename));
45-
46-
ic_doc->buffer = strdup(StringValuePtr(res));
47-
48-
ic_doc->bpos = ic_doc->buffer;
49-
ic_doc->remaining = (int)strlen(ic_doc->buffer);
50-
return ic_doc;
51-
}
52-
scheme = scheme->next_scheme;
53-
}
54-
return 0;
55-
}
56-
57-
int ic_read(void *context, char *buffer, int len)
58-
{
59-
ic_doc_context *ic_doc;
60-
int ret_len;
61-
ic_doc = (ic_doc_context*) context;
62-
63-
if (len >= ic_doc->remaining)
64-
{
65-
ret_len = ic_doc->remaining;
66-
}
67-
else
68-
{
69-
ret_len = len;
70-
}
71-
ic_doc->remaining -= ret_len;
72-
strncpy(buffer, ic_doc->bpos, ret_len);
73-
ic_doc->bpos += ret_len;
74-
75-
return ret_len;
76-
}
77-
78-
int ic_close(void *context)
79-
{
80-
ruby_xfree(((ic_doc_context*) context)->buffer);
81-
ruby_xfree(context);
82-
return 1;
83-
}
84-
85-
/*
86-
* call-seq:
87-
* register
88-
*
89-
* Register a new set of I/O callback for handling parser input.
90-
*/
91-
static VALUE input_callbacks_register_input_callbacks(void)
92-
{
93-
xmlRegisterInputCallbacks(ic_match, ic_open, ic_read, ic_close);
94-
return (Qtrue);
95-
}
96-
97-
/*
98-
* call-seq:
99-
* add_scheme
100-
*
101-
* No documentation available.
102-
*/
103-
static VALUE input_callbacks_add_scheme(VALUE self, VALUE scheme_name,
104-
VALUE class)
105-
{
106-
ic_scheme *scheme;
107-
108-
Check_Type(scheme_name, T_STRING);
109-
110-
scheme = (ic_scheme*) malloc(sizeof(ic_scheme));
111-
scheme->next_scheme = 0;
112-
scheme->scheme_name = strdup(StringValuePtr(scheme_name)); /* TODO alloc, dealloc */
113-
scheme->name_len = (int)strlen(scheme->scheme_name);
114-
scheme->class = class; /* TODO alloc, dealloc */
115-
116-
//fprintf( stderr, "registered: %s, %d, %s\n", scheme->scheme_name, scheme->name_len, scheme->class );
117-
118-
if (0 == first_scheme)
119-
first_scheme = scheme;
120-
else
121-
{
122-
ic_scheme *pos;
123-
pos = first_scheme;
124-
while (0 != pos->next_scheme)
125-
pos = pos->next_scheme;
126-
pos->next_scheme = scheme;
127-
}
128-
129-
return (Qtrue);
130-
}
131-
132-
/*
133-
* call-seq:
134-
* remove_scheme
135-
*
136-
* No documentation available.
137-
*/
138-
static VALUE input_callbacks_remove_scheme(VALUE self, VALUE scheme_name)
139-
{
140-
char *name;
141-
ic_scheme *save_scheme, *scheme;
142-
143-
Check_Type(scheme_name, T_STRING);
144-
name = StringValuePtr(scheme_name);
145-
146-
if (0 == first_scheme)
147-
return Qfalse;
148-
149-
if (!strncmp(name, first_scheme->scheme_name, first_scheme->name_len))
150-
{
151-
save_scheme = first_scheme->next_scheme;
152-
153-
ruby_xfree(first_scheme->scheme_name);
154-
ruby_xfree(first_scheme);
155-
156-
first_scheme = save_scheme;
157-
return Qtrue;
158-
}
159-
160-
scheme = first_scheme;
161-
while (0 != scheme->next_scheme)
162-
{
163-
if (!strncmp(name, scheme->next_scheme->scheme_name,
164-
scheme->next_scheme->name_len))
165-
{
166-
save_scheme = scheme->next_scheme->next_scheme;
167-
168-
ruby_xfree(scheme->next_scheme->scheme_name);
169-
ruby_xfree(scheme->next_scheme);
170-
171-
scheme->next_scheme = save_scheme;
172-
return Qtrue;
173-
}
174-
scheme = scheme->next_scheme;
175-
}
176-
return Qfalse;
177-
}
178-
179-
void rxml_init_input_callbacks(void)
180-
{
181-
VALUE cInputCallbacks;
182-
cInputCallbacks = rb_define_class_under(mXML, "InputCallbacks", rb_cObject);
183-
184-
/* Class Methods */
185-
rb_define_singleton_method(cInputCallbacks, "register",
186-
input_callbacks_register_input_callbacks, 0);
187-
rb_define_singleton_method(cInputCallbacks, "add_scheme",
188-
input_callbacks_add_scheme, 2);
189-
rb_define_singleton_method(cInputCallbacks, "remove_scheme",
190-
input_callbacks_remove_scheme, 1);
191-
}
1+
/* Author: Martin Povolny (xpovolny@fi.muni.cz) */
2+
3+
#include "ruby_libxml.h"
4+
#include "ruby_xml_input_cbg.h"
5+
6+
/* Document-class: LibXML::XML::InputCallbacks
7+
*
8+
* Support for adding custom scheme handlers. */
9+
10+
static ic_scheme *first_scheme = 0;
11+
12+
int ic_match(char const *filename)
13+
{
14+
ic_scheme *scheme;
15+
16+
//fprintf( stderr, "ic_match: %s\n", filename );
17+
18+
scheme = first_scheme;
19+
while (0 != scheme)
20+
{
21+
if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST scheme->scheme_name, scheme->name_len))
22+
{
23+
return 1;
24+
}
25+
scheme = scheme->next_scheme;
26+
}
27+
return 0;
28+
}
29+
30+
void* ic_open(char const *filename)
31+
{
32+
ic_doc_context *ic_doc;
33+
ic_scheme *scheme;
34+
VALUE res;
35+
36+
scheme = first_scheme;
37+
while (0 != scheme)
38+
{
39+
if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST scheme->scheme_name, scheme->name_len))
40+
{
41+
ic_doc = (ic_doc_context*) malloc(sizeof(ic_doc_context));
42+
43+
res = rb_funcall(scheme->class, rb_intern("document_query"), 1,
44+
rb_str_new2(filename));
45+
46+
ic_doc->buffer = strdup(StringValuePtr(res));
47+
48+
ic_doc->bpos = ic_doc->buffer;
49+
ic_doc->remaining = (int)strlen(ic_doc->buffer);
50+
return ic_doc;
51+
}
52+
scheme = scheme->next_scheme;
53+
}
54+
return 0;
55+
}
56+
57+
int ic_read(void *context, char *buffer, int len)
58+
{
59+
ic_doc_context *ic_doc;
60+
int ret_len;
61+
ic_doc = (ic_doc_context*) context;
62+
63+
if (len >= ic_doc->remaining)
64+
{
65+
ret_len = ic_doc->remaining;
66+
}
67+
else
68+
{
69+
ret_len = len;
70+
}
71+
ic_doc->remaining -= ret_len;
72+
strncpy(buffer, ic_doc->bpos, ret_len);
73+
ic_doc->bpos += ret_len;
74+
75+
return ret_len;
76+
}
77+
78+
int ic_close(void *context)
79+
{
80+
ruby_xfree(((ic_doc_context*) context)->buffer);
81+
ruby_xfree(context);
82+
return 1;
83+
}
84+
85+
/*
86+
* call-seq:
87+
* register
88+
*
89+
* Register a new set of I/O callback for handling parser input.
90+
*/
91+
static VALUE input_callbacks_register_input_callbacks(VALUE self)
92+
{
93+
xmlRegisterInputCallbacks(ic_match, ic_open, ic_read, ic_close);
94+
return (Qtrue);
95+
}
96+
97+
/*
98+
* call-seq:
99+
* add_scheme
100+
*
101+
* No documentation available.
102+
*/
103+
static VALUE input_callbacks_add_scheme(VALUE self, VALUE scheme_name,
104+
VALUE class)
105+
{
106+
ic_scheme *scheme;
107+
108+
Check_Type(scheme_name, T_STRING);
109+
110+
scheme = (ic_scheme*) malloc(sizeof(ic_scheme));
111+
scheme->next_scheme = 0;
112+
scheme->scheme_name = strdup(StringValuePtr(scheme_name)); /* TODO alloc, dealloc */
113+
scheme->name_len = (int)strlen(scheme->scheme_name);
114+
scheme->class = class; /* TODO alloc, dealloc */
115+
116+
//fprintf( stderr, "registered: %s, %d, %s\n", scheme->scheme_name, scheme->name_len, scheme->class );
117+
118+
if (0 == first_scheme)
119+
first_scheme = scheme;
120+
else
121+
{
122+
ic_scheme *pos;
123+
pos = first_scheme;
124+
while (0 != pos->next_scheme)
125+
pos = pos->next_scheme;
126+
pos->next_scheme = scheme;
127+
}
128+
129+
return (Qtrue);
130+
}
131+
132+
/*
133+
* call-seq:
134+
* remove_scheme
135+
*
136+
* No documentation available.
137+
*/
138+
static VALUE input_callbacks_remove_scheme(VALUE self, VALUE scheme_name)
139+
{
140+
char *name;
141+
ic_scheme *save_scheme, *scheme;
142+
143+
Check_Type(scheme_name, T_STRING);
144+
name = StringValuePtr(scheme_name);
145+
146+
if (0 == first_scheme)
147+
return Qfalse;
148+
149+
if (!strncmp(name, first_scheme->scheme_name, first_scheme->name_len))
150+
{
151+
save_scheme = first_scheme->next_scheme;
152+
153+
ruby_xfree(first_scheme->scheme_name);
154+
ruby_xfree(first_scheme);
155+
156+
first_scheme = save_scheme;
157+
return Qtrue;
158+
}
159+
160+
scheme = first_scheme;
161+
while (0 != scheme->next_scheme)
162+
{
163+
if (!strncmp(name, scheme->next_scheme->scheme_name,
164+
scheme->next_scheme->name_len))
165+
{
166+
save_scheme = scheme->next_scheme->next_scheme;
167+
168+
ruby_xfree(scheme->next_scheme->scheme_name);
169+
ruby_xfree(scheme->next_scheme);
170+
171+
scheme->next_scheme = save_scheme;
172+
return Qtrue;
173+
}
174+
scheme = scheme->next_scheme;
175+
}
176+
return Qfalse;
177+
}
178+
179+
void rxml_init_input_callbacks(void)
180+
{
181+
VALUE cInputCallbacks;
182+
cInputCallbacks = rb_define_class_under(mXML, "InputCallbacks", rb_cObject);
183+
184+
/* Class Methods */
185+
rb_define_singleton_method(cInputCallbacks, "register", input_callbacks_register_input_callbacks, 0);
186+
rb_define_singleton_method(cInputCallbacks, "add_scheme", input_callbacks_add_scheme, 2);
187+
rb_define_singleton_method(cInputCallbacks, "remove_scheme", input_callbacks_remove_scheme, 1);
188+
}

0 commit comments

Comments
 (0)