// -*- c -*- // // $Id: xml_fs.moc,v 1.9 2001/05/14 21:55:57 kmacleod Exp $ // #include @namespace itr urn:to-be-determined //---------------------------------------------------------------------- @class XML_FastSmall_Document(Node, XML_NonOpt_Document) typedef id XML_FastSmall_Document; @new() { self = Node__new(NULL, 0); self->isa_ = &XML_FastSmall_Document_isa_; @self.contents = List__new(NULL, 0); return self; } @.itr:node_type { return XML_DocumentType; } @createDocument() { return XML_FastSmall_Document__new(NULL, 0); } @createElement() { return XML_FastSmall_Element__new(NULL, 0); } @createAttribute() { return XML_FastSmall_Attribute__new(NULL, 0); } @createCharacters() { return XML_FastSmall_Characters__new(NULL, 0); } //---------------------------------------------------------------------- @class XML_FastSmall_Element(XML_FastSmall_user_node, XML_FastSmall_elem_attr_common) typedef struct XML_FastSmall_Element_ { isa_list *isa_; id user_node; id parent; id namespace_uri; id local_name; id prefix; id contents; id attributes; } *XML_FastSmall_Element; @new() { SELF = GC_MALLOC(sizeof(struct XML_FastSmall_Element_)); SELF->isa_ = &XML_FastSmall_Element_isa_; SELF->user_node = NULL; SELF->parent = MOC_NIL; SELF->namespace_uri = MOC_NIL; SELF->local_name = MOC_NIL; SELF->prefix = MOC_NIL; SELF->contents = NULL; SELF->attributes = NULL; return (id)SELF; } @.itr:node_type { static id node_type = NULL; if (NULL == node_type) node_type = XML_ElementType; return node_type; } @.contents { if (NULL == SELF->contents) SELF->contents = List__new(NULL, 0); return SELF->contents; } @.contents= { SELF->contents = value; return self; } @.attributes { if (NULL == SELF->attributes) SELF->attributes = Node__new(NULL, 0); return SELF->attributes; } @.attributes= { SELF->attributes = value; return self; } //---------------------------------------------------------------------- @class XML_FastSmall_Attribute(XML_FastSmall_user_node, XML_FastSmall_elem_attr_common) typedef struct XML_FastSmall_Attribute_ { isa_list *isa_; id user_node; id parent; id namespace_uri; id local_name; id prefix; const char *value; } *XML_FastSmall_Attribute; @new() { SELF = GC_MALLOC(sizeof(struct XML_FastSmall_Attribute_)); SELF->isa_ = &XML_FastSmall_Attribute_isa_; SELF->user_node = NULL; SELF->parent = MOC_NIL; SELF->namespace_uri = MOC_NIL; SELF->local_name = MOC_NIL; SELF->prefix = MOC_NIL; SELF->value = NULL; return (id)SELF; } @.itr:node_type { static id node_type = NULL; if (NULL == node_type) node_type = XML_AttributeType; return node_type; } @.value { if (NULL == SELF->value) { return @""; } else { return String__new_g(SELF->value); } } @.value= { const char *att_value = String_s(value); if ('\0' == *att_value) { SELF->value = NULL; } else { SELF->value = att_value; } return self; } @as_string() { return @self.value; } //---------------------------------------------------------------------- @class XML_FastSmall_Characters(XML_FastSmall_user_node) typedef struct XML_FastSmall_Characters_ { isa_list *isa_; id user_node; id parent; const char *data; } *XML_FastSmall_Characters; @new() { SELF = GC_MALLOC(sizeof(struct XML_FastSmall_Characters_)); SELF->isa_ = &XML_FastSmall_Characters_isa_; SELF->user_node = NULL; SELF->parent = MOC_NIL; SELF->data = NULL; return (id)SELF; } @.itr:node_type { static id node_type = NULL; if (NULL == node_type) node_type = XML_CharactersType; return node_type; } @.data { if (NULL == SELF->data) { return @""; } else { return String__new_g(SELF->data); } } @.data= { const char *data = String_s(value); if ('\0' == *data) { SELF->data = NULL; } else { SELF->data = data; } return self; } //---------------------------------------------------------------------- @class XML_FastSmall_user_node typedef struct XML_FastSmall_user_node_ { isa_list *isa_; id user_node; id parent; } *XML_FastSmall_user_node; @get(id key) { // XXX This method is intended to do accessor handling return @self.get_stored(key); } @get_stored(id key) { id user_node = SELF->user_node; if (NULL == user_node) return MOC_NIL; return @user_node.get_stored(key); } @put(id key, id value) { // XXX This method is intended to do accessor handling return @self.put_stored(key, value); } @put_stored(id key, id value) { id user_node = SELF->user_node; if (NULL == user_node) { user_node = Node__new(NULL, 0); SELF->user_node = user_node; } @user_node.put_stored(key, value); return self; } @.itr:parent { return SELF->parent; } @.itr:parent= { SELF->parent = value; return self; } @keys() { id keys; id user_node = SELF->user_node; if (NULL == SELF->user_node) { keys = List__new(NULL, 0); } else { keys = @user_node.keys(); } // XXX should push "fixed" keys return keys; } //---------------------------------------------------------------------- @class XML_FastSmall_elem_attr_common typedef struct XML_FastSmall_elem_attr_common_ { isa_list *isa_; id user_node; id parent; id namespace_uri; id local_name; id prefix; } *XML_FastSmall_elem_attr_common; @.namespace_uri { return SELF->namespace_uri; } @.namespace_uri= { if (MOC_NIL != value && @value.itr:node_type != SymbolType) value = Symbol__new_S(value); SELF->namespace_uri = value; return self; } @.local_name { return SELF->local_name; } @.local_name= { if (MOC_NIL != value && @value.itr:node_type != SymbolType) value = Symbol__new_S(value); SELF->local_name = value; return self; } @.prefix { return SELF->prefix; } @.prefix= { if (MOC_NIL != value && @value.itr:node_type != SymbolType) value = Symbol__new_S(value); SELF->prefix = value; return self; } @.name { id prefix = @self.prefix; id local_name = @self.local_name; if (MOC_NIL == local_name) { local_name = @""; } if (MOC_NIL != prefix) { id str = String__new_s(String_s(prefix)); str = @str.concat(@":"); str = @str.concat(local_name); return str; } else { return @local_name.copy(); } } @.name= { const char *name = String_s(value); char *localname; if (has_prefix(name, &localname)) { @self.prefix = Symbol__new_sn(name, localname - name - 1); @self.local_name = Symbol__new_s(localname); } else { @self.prefix = MOC_NIL; @self.local_name = Symbol__new_s(name); } return self; }