introduce ->pre

This commit is contained in:
Nishi 2025-12-27 06:05:03 +09:00
commit 6fe8739366
Signed by: nishi
GPG key ID: 27EF69B208EB9343
3 changed files with 70 additions and 49 deletions

View file

@ -43,13 +43,22 @@ void recursive(xl_node_t* node, int indent) {
}
int main(int argc, char** argv) {
int i;
int i;
xl_node_t* n;
for(i = 1; i < argc; i++) {
xemil_t* h = xl_open_file(argv[i]);
if(h != NULL) {
printf("%s:\n", argv[i]);
if(xl_parse(h)) {
n = h->pre;
if(n != NULL) {
while(n != NULL) {
recursive(n, INDENT);
n = n->next;
}
}
if(h->root != NULL) recursive(h->root, INDENT);
} else {
int j;

View file

@ -54,6 +54,7 @@ struct xemil {
xl_driver_t* driver;
void* drv_opaque;
void* drv_arg;
xl_node_t* pre;
xl_node_t* root;
};

View file

@ -7,6 +7,9 @@ xemil_t* xl_open(xl_driver_t* driver, void* arg) {
handle->driver = driver;
handle->drv_arg = arg;
handle->pre = NULL;
handle->root = NULL;
if(!handle->driver->open(handle)) {
free(handle);
return NULL;
@ -189,7 +192,7 @@ int xl_parse(xemil_t* handle) {
if(strlen(node) > 2 && node[1] == '-') {
/* comment */
if(strlen(node) > (1 + 3 + 2) && nest_level > 0) {
if(strlen(node) > (1 + 3 + 2)) {
n = malloc(sizeof(*n));
n->type = XL_NODE_COMMENT;
@ -250,6 +253,7 @@ int xl_parse(xemil_t* handle) {
int i;
int set = 0;
char* s = malloc(strlen(node) + 1);
int sl;
n = malloc(sizeof(*n));
@ -263,47 +267,43 @@ int xl_parse(xemil_t* handle) {
strcpy(s, node);
}
if(n->type == XL_NODE_PROCESS && nest_level == 0) {
free(n);
n = NULL;
} else {
int sl = node[strlen(s) - 1] == '/' ? 1 : 0;
if(sl) {
s[strlen(s) - 1] = 0;
sl = node[strlen(s) - 1] == '/' ? 1 : 0;
if(sl) {
s[strlen(s) - 1] = 0;
}
n->name = malloc(strlen(s) + 1);
n->text = NULL;
n->first_attribute = NULL;
strcpy(n->name, s);
i = 0;
while(1) {
int icp;
int nb = xl_unicode_8_to_32(n->name + i, &icp);
if(icp == 0) break;
if(XL_SKIPPABLE(icp)) {
n->name[i] = 0;
set = 1;
} else if(set) {
n->first_attribute = xl_parse_attribute(s + i);
break;
}
n->name = malloc(strlen(s) + 1);
n->text = NULL;
n->first_attribute = NULL;
i += nb;
}
strcpy(n->name, s);
i = 0;
while(1) {
int icp;
int nb = xl_unicode_8_to_32(n->name + i, &icp);
if(n->type == XL_NODE_NODE && !sl) {
/* non self-closing tag */
targ = n;
nest_level++;
if(icp == 0) break;
if(XL_SKIPPABLE(icp)) {
n->name[i] = 0;
set = 1;
} else if(set) {
n->first_attribute = xl_parse_attribute(s + i);
break;
}
i += nb;
}
if(n->type == XL_NODE_NODE && !sl) {
/* non self-closing tag */
targ = n;
nest_level++;
proc = 1;
}
proc = 1;
}
free(s);
}
@ -315,29 +315,40 @@ int xl_parse(xemil_t* handle) {
}
if(n != NULL) {
xl_node_t* last = NULL;
if(nest_level == 0 && (n->type == XL_NODE_COMMENT || n->type == XL_NODE_PROCESS)) {
if(handle->pre == NULL) {
handle->pre = n;
} else {
xl_node_t* last = handle->pre;
while(last->next != NULL) last = last->next;
if(handle->root == NULL) handle->root = n;
n->prev = last;
last->next = n;
}
} else {
xl_node_t* last = NULL;
if(handle->root == NULL) handle->root = n;
n->root = handle->root;
n->parent = current;
n->root = handle->root;
n->parent = current;
n->first_child = NULL;
n->first_child = NULL;
if(current != NULL && current->first_child != NULL) {
last = current->first_child;
while(last->next != NULL) last = last->next;
}
if(current != NULL && current->first_child != NULL) {
last = current->first_child;
while(last->next != NULL) last = last->next;
}
n->prev = last;
n->next = NULL;
n->prev = last;
n->next = NULL;
if(n->prev != NULL) {
n->prev->next = n;
}
if(n->prev != NULL) {
n->prev->next = n;
}
if(current != NULL && current->first_child == NULL) {
current->first_child = n;
if(current != NULL && current->first_child == NULL) {
current->first_child = n;
}
}
}