#include "rbxs_qname.h" #include "rbxs_domnode.h" #include "rbxs_pull.h" //*********************************************************************************** // GC //*********************************************************************************** void rbxs_qname_free(rbxs_qname *prbxs_qname) { if (prbxs_qname != NULL) { free(prbxs_qname); } } void rbxs_qname_mark(rbxs_qname *prbxs_qname) { if (prbxs_qname == NULL) return; if (!NIL_P(prbxs_qname->obj)) rb_gc_mark(prbxs_qname->obj); } //*********************************************************************************** // Methods //*********************************************************************************** VALUE rbxs_qname_inspect(VALUE self) { rbxs_qname *prbxs_qname; rbxs_domnode *prbxs_domnode; rbxs_pull *prbxs_pull; char *ret; VALUE val; Data_Get_Struct(self, rbxs_qname, prbxs_qname); switch (prbxs_qname->type) { case RBXS_PARSER_TYPE_DOM: Data_Get_Struct(prbxs_qname->obj, rbxs_domnode, prbxs_domnode); if (prbxs_domnode->node->ns != NULL) { val = rb_str_new2(prbxs_domnode->node->ns->prefix); rb_str_cat2(val,":"); rb_str_cat2(val,prbxs_domnode->node->name); } else val = rb_str_new2(prbxs_domnode->node->name); return val; case RBXS_PARSER_TYPE_READER: Data_Get_Struct(prbxs_qname->obj, rbxs_pull, prbxs_pull); ret = xmlTextReaderName(prbxs_pull->reader); if (ret) { val = rb_str_new2(ret); xmlFree(ret); return(val); } else return(Qnil); } return(Qnil); } VALUE rbxs_qname_name(VALUE self) { rbxs_qname *prbxs_qname; rbxs_domnode *prbxs_domnode; rbxs_pull *prbxs_pull; xmlChar *ret; VALUE val; Data_Get_Struct(self, rbxs_qname, prbxs_qname); switch (prbxs_qname->type) { case RBXS_PARSER_TYPE_DOM: Data_Get_Struct(prbxs_qname->obj, rbxs_domnode, prbxs_domnode); return(rb_str_new2(prbxs_domnode->node->name)); case RBXS_PARSER_TYPE_READER: Data_Get_Struct(prbxs_qname->obj, rbxs_pull, prbxs_pull); ret = xmlTextReaderLocalName(prbxs_pull->reader); if (ret) { val = rb_str_new2(ret); xmlFree(ret); return(val); } else return(Qnil); } return(Qnil); } VALUE rbxs_qname_prefix(VALUE self) { rbxs_qname *prbxs_qname; rbxs_domnode *prbxs_domnode; rbxs_pull *prbxs_pull; xmlChar *ret; VALUE val; Data_Get_Struct(self, rbxs_qname, prbxs_qname); switch (prbxs_qname->type) { case RBXS_PARSER_TYPE_DOM: Data_Get_Struct(prbxs_qname->obj, rbxs_domnode, prbxs_domnode); if (prbxs_domnode->node->ns != NULL) return(rb_str_new2(prbxs_domnode->node->ns->prefix)); else return(Qnil); case RBXS_PARSER_TYPE_READER: Data_Get_Struct(prbxs_qname->obj, rbxs_pull, prbxs_pull); ret = xmlTextReaderPrefix(prbxs_pull->reader); if (ret) { val = rb_str_new2(ret); xmlFree(ret); return(val); } else return(Qnil); } return Qnil; } VALUE rbxs_qname_namespace(VALUE self) { rbxs_qname *prbxs_qname; rbxs_domnode *prbxs_domnode; rbxs_pull *prbxs_pull; xmlChar *ret; VALUE val; Data_Get_Struct(self, rbxs_qname, prbxs_qname); switch (prbxs_qname->type) { case RBXS_PARSER_TYPE_DOM: Data_Get_Struct(prbxs_qname->obj, rbxs_domnode, prbxs_domnode); if (prbxs_domnode->node->ns != NULL) return(rb_str_new2(prbxs_domnode->node->ns->href)); else return(Qnil); case RBXS_PARSER_TYPE_READER: Data_Get_Struct(prbxs_qname->obj, rbxs_pull, prbxs_pull); ret = xmlTextReaderNamespaceUri(prbxs_pull->reader); if (ret) { val = rb_str_new2(ret); xmlFree(ret); return(val); } else return(Qnil); } return(Qnil); } //*********************************************************************************** // Constructors //*********************************************************************************** VALUE rbxs_qname_new(VALUE class, VALUE obj, int type) { rbxs_qname *prbxs_qname; prbxs_qname = (rbxs_qname *)malloc(sizeof(rbxs_qname)); if (prbxs_qname == NULL ) rb_raise(rb_eNoMemError, "No memory left for XML::Simple::QName struct"); prbxs_qname->obj = obj; prbxs_qname->type = type; return(Data_Wrap_Struct(class, rbxs_qname_mark, rbxs_qname_free, prbxs_qname)); } //*********************************************************************************** // Initialize class Node //*********************************************************************************** VALUE cSimpleQName; void init_rbxs_qname(void) { cSimpleQName = rb_define_class_under( cSimple, "QName", rb_cObject ); rb_define_method(cSimpleQName, "inspect", rbxs_qname_inspect, 0); rb_define_method(cSimpleQName, "to_s", rbxs_qname_name, 0); rb_define_method(cSimpleQName, "name", rbxs_qname_name, 0); rb_define_method(cSimpleQName, "prefix", rbxs_qname_prefix, 0); rb_define_method(cSimpleQName, "namespace", rbxs_qname_namespace,0); }