diff options
Diffstat (limited to 'source/myhtml/tag.c')
-rwxr-xr-x | source/myhtml/tag.c | 65 |
1 files changed, 32 insertions, 33 deletions
diff --git a/source/myhtml/tag.c b/source/myhtml/tag.c index 89b5576..8c77eba 100755 --- a/source/myhtml/tag.c +++ b/source/myhtml/tag.c @@ -26,18 +26,21 @@ myhtml_tag_t * myhtml_tag_create(void) myhtml_status_t myhtml_tag_init(myhtml_tree_t *tree, myhtml_tag_t *tags) { - tags->context_size = MyHTML_TAG_LAST_ENTRY + 128; - tags->context = (myhtml_tag_context_t*)mymalloc(sizeof(myhtml_tag_context_t) * tags->context_size); + tags->mcsimple_context = mcsimple_create(); - if(tags->context == NULL) + if(tags->mcsimple_context == NULL) return MyHTML_STATUS_TAGS_ERROR_MEMORY_ALLOCATION; + mcsimple_init(tags->mcsimple_context, 128, 1024, sizeof(myhtml_tag_context_t)); + tags->mchar_node = mchar_async_node_add(tree->myhtml->mchar); tags->tree = mctree_create(32); tags->mchar = tree->myhtml->mchar; tags->tag_index = tree->myhtml->tag_index; + tags->tags_count = MyHTML_TAG_LAST_ENTRY; + myhtml_tag_clean(tags); return MyHTML_STATUS_OK; @@ -45,11 +48,11 @@ myhtml_status_t myhtml_tag_init(myhtml_tree_t *tree, myhtml_tag_t *tags) void myhtml_tag_clean(myhtml_tag_t* tags) { - tags->context_length = 0; - myhtml_tag_context_clean(tags, tags->context_length); - myhtml_tag_context_add(tags); + tags->tags_count = MyHTML_TAG_LAST_ENTRY; + mcsimple_clean(tags->mcsimple_context); mchar_async_node_clean(tags->mchar, tags->mchar_node); + mctree_clean(tags->tree); } myhtml_tag_t * myhtml_tag_destroy(myhtml_tag_t* tags) @@ -57,10 +60,8 @@ myhtml_tag_t * myhtml_tag_destroy(myhtml_tag_t* tags) if(tags == NULL) return NULL; - if(tags->context) - free(tags->context); - tags->tree = mctree_destroy(tags->tree); + tags->mcsimple_context = mcsimple_destroy(tags->mcsimple_context, true); mchar_async_node_delete(tags->mchar, tags->mchar_node); @@ -82,7 +83,7 @@ myhtml_status_t myhtml_tag_index_init(myhtml_tag_t* tags, myhtml_tag_index_t* id if(mcstatus != MCOBJECT_ASYNC_STATUS_OK) return MyHTML_STATUS_TAGS_ERROR_MCOBJECT_CREATE; - idx_tags->tags_size = tags->context_size; + idx_tags->tags_size = tags->tags_count + 128; idx_tags->tags_length = 0; idx_tags->tags = (myhtml_tag_index_entry_t*)calloc(idx_tags->tags_size, sizeof(myhtml_tag_index_entry_t)); @@ -95,7 +96,7 @@ myhtml_status_t myhtml_tag_index_init(myhtml_tag_t* tags, myhtml_tag_index_t* id void myhtml_tag_index_clean(myhtml_tag_t* tags, myhtml_tag_index_t* index_tags) { mcobject_async_node_clean(tags->tag_index, tags->mcobject_node); - memset(index_tags->tags, 0, sizeof(myhtml_tag_index_entry_t) * tags->context_length); + memset(index_tags->tags, 0, sizeof(myhtml_tag_index_entry_t) * index_tags->tags_size); } myhtml_tag_index_t * myhtml_tag_index_destroy(myhtml_tag_t* tags, myhtml_tag_index_t* index_tags) @@ -118,7 +119,7 @@ myhtml_tag_index_t * myhtml_tag_index_destroy(myhtml_tag_t* tags, myhtml_tag_ind void myhtml_tag_index_check_size(myhtml_tag_t* tags, myhtml_tag_index_t* index_tags, myhtml_tag_id_t tag_id) { if(tag_id >= index_tags->tags_size) { - size_t new_size = tags->context_size + MyHTML_TAG_LAST_ENTRY; + size_t new_size = tag_id + 128; myhtml_tag_index_entry_t *index_entries = (myhtml_tag_index_entry_t*)myrealloc(index_tags->tags, sizeof(myhtml_tag_index_entry_t) * @@ -246,35 +247,37 @@ myhtml_tag_id_t myhtml_tag_add(myhtml_tag_t* tags, const char* key, size_t key_s } // add tags - myhtml_tag_id_t new_ctx_id = myhtml_tag_context_get_free_id(tags); - mctree_insert(tags->tree, cache, key_size, (void *)new_ctx_id, NULL); + myhtml_tag_context_t *tag_ctx = mcsimple_malloc(tags->mcsimple_context); + + mctree_insert(tags->tree, cache, key_size, (void *)tag_ctx, NULL); - tags->context[new_ctx_id].id = new_ctx_id + MyHTML_TAG_LAST_ENTRY; - tags->context[new_ctx_id].name = cache; - tags->context[new_ctx_id].name_length = key_size; - tags->context[new_ctx_id].data_parser = data_parser; + tag_ctx->id = tags->tags_count; + tag_ctx->name = cache; + tag_ctx->name_length = key_size; + tag_ctx->data_parser = data_parser; - memset(tags->context[new_ctx_id].cats, 0, - sizeof(enum myhtml_tag_categories) * - MyHTML_NAMESPACE_LAST_ENTRY); + tags->tags_count++; - myhtml_tag_context_add(tags); + memset(tag_ctx->cats, 0, sizeof(enum myhtml_tag_categories) * MyHTML_NAMESPACE_LAST_ENTRY); - return tags->context[new_ctx_id].id; + return tag_ctx->id; } void myhtml_tag_set_category(myhtml_tag_t* tags, myhtml_tag_id_t tag_idx, enum myhtml_namespace my_namespace, enum myhtml_tag_categories cats) { - tags->context[(tag_idx - MyHTML_TAG_LAST_ENTRY)].cats[my_namespace] = cats; + if(tag_idx < MyHTML_TAG_LAST_ENTRY) + return; + + myhtml_tag_context_t *tag_ctx = mcsimple_get_by_absolute_position(tags->mcsimple_context, (tag_idx - MyHTML_TAG_LAST_ENTRY)); + tag_ctx->cats[my_namespace] = cats; } const myhtml_tag_context_t * myhtml_tag_get_by_id(myhtml_tag_t* tags, myhtml_tag_id_t tag_id) { - if(tag_id > MyHTML_TAG_LAST_ENTRY) { - tag_id -= MyHTML_TAG_LAST_ENTRY; - return &tags->context[tag_id]; + if(tag_id >= MyHTML_TAG_LAST_ENTRY) { + return mcsimple_get_by_absolute_position(tags->mcsimple_context, (tag_id - MyHTML_TAG_LAST_ENTRY)); } return myhtml_tag_static_get_by_id(tag_id); @@ -288,12 +291,8 @@ const myhtml_tag_context_t * myhtml_tag_get_by_name(myhtml_tag_t* tags, const ch return ctx; mctree_index_t idx = mctree_search_lowercase(tags->tree, name, length); - size_t ctx_idx = (size_t)tags->tree->nodes[idx].value; - - if(ctx_idx && ctx_idx < tags->context_length) - return &tags->context[ctx_idx]; - return NULL; + return (myhtml_tag_context_t*)tags->tree->nodes[idx].value; } void myhtml_tag_print(myhtml_tag_t* tags, FILE* fh) @@ -306,7 +305,7 @@ void myhtml_tag_print(myhtml_tag_t* tags, FILE* fh) fprintf(fh, "<%s id=\"%zu\">\n", ctx->name, i); } - for(i = (MyHTML_TAG_LAST_ENTRY + 1); i < tags->context_length; i++) + for(i = (MyHTML_TAG_LAST_ENTRY + 1); i < tags->tags_count; i++) { const myhtml_tag_context_t *ctx = myhtml_tag_get_by_id(tags, i); |