php-internal-docs 8.4.8
Unofficial docs for php/php-src
Loading...
Searching...
No Matches
element.c
Go to the documentation of this file.
1/*
2 * Copyright (C) 2018-2021 Alexander Borisov
3 *
4 * Author: Alexander Borisov <borisov@lexbor.com>
5 */
6
9#include "lexbor/tag/tag.h"
10#include "lexbor/ns/ns.h"
11
12#include "lexbor/core/str.h"
13#include "lexbor/core/utils.h"
14#include "lexbor/core/hash.h"
15
16
17static const lxb_char_t *
18lxb_dom_element_upper_update(lxb_dom_element_t *element, size_t *len);
19
20const lxb_tag_data_t *
22 const lxb_char_t *name, size_t length);
23
24const lxb_tag_data_t *
26 const lxb_char_t *name, size_t length);
27
28const lxb_ns_data_t *
29lxb_ns_append(lexbor_hash_t *hash, const lxb_char_t *link, size_t length);
30
31
34{
35 lxb_dom_element_t *element;
36
37 element = lexbor_mraw_calloc(document->mraw,
38 sizeof(lxb_dom_element_t));
39 if (element == NULL) {
40 return NULL;
41 }
42
44
45 node->owner_document = lxb_dom_document_owner(document);
47
48 return element;
49}
50
53 const lxb_dom_element_t *element)
54{
56
58 if (new == NULL) {
59 return NULL;
60 }
61
62 if (lxb_dom_element_interface_copy(new, element) != LXB_STATUS_OK) {
64 }
65
66 return new;
67}
68
71{
72 lxb_dom_attr_t *attr_next;
73 lxb_dom_attr_t *attr = element->first_attr;
74
76
77 while (attr != NULL) {
78 attr_next = attr->next;
79
81
82 attr = attr_next;
83 }
84
85 return NULL;
86}
87
90 const lxb_dom_element_t *src)
91{
93 lxb_dom_document_t *document;
94 lxb_dom_attr_t *attr, *clone;
95
96 status = lxb_dom_node_interface_copy(&dst->node, &src->node, false);
97 if (status != LXB_STATUS_OK) {
98 return status;
99 }
100
101 document = lxb_dom_interface_node(dst)->owner_document;
102 attr = src->first_attr;
103
104 while (attr != NULL) {
105 clone = lxb_dom_attr_interface_clone(document, attr);
106 if (clone == NULL) {
108 }
109
110 (void) lxb_dom_element_attr_append(dst, clone);
111
112 attr = attr->next;
113 }
114
115 return LXB_STATUS_OK;
116}
117
120 const lxb_char_t *prefix, size_t prefix_len,
121 const lxb_char_t *lname, size_t lname_len)
122{
123 lxb_char_t *key = (lxb_char_t *) lname;
124 const lxb_tag_data_t *tag_data;
125
126 if (prefix != NULL && prefix_len != 0) {
127 key = lexbor_malloc(prefix_len + lname_len + 2);
128 if (key == NULL) {
130 }
131
132 memcpy(key, prefix, prefix_len);
133 memcpy(&key[prefix_len + 1], lname, lname_len);
134
135 lname_len = prefix_len + lname_len + 1;
136
137 key[prefix_len] = ':';
138 key[lname_len] = '\0';
139 }
140
141 tag_data = lxb_tag_append(element->node.owner_document->tags,
142 element->node.local_name, key, lname_len);
143
144 if (key != lname) {
146 }
147
148 if (tag_data == NULL) {
149 return LXB_STATUS_ERROR;
150 }
151
152 element->qualified_name = (lxb_tag_id_t) tag_data;
153
154 return LXB_STATUS_OK;
155}
156
159 const lxb_char_t *local_name, size_t lname_len,
160 const lxb_char_t *ns_link, size_t ns_len,
161 const lxb_char_t *prefix, size_t prefix_len,
162 const lxb_char_t *is, size_t is_len,
163 bool sync_custom)
164{
166 const lxb_ns_data_t *ns_data;
167 const lxb_tag_data_t *tag_data;
168 const lxb_ns_prefix_data_t *ns_prefix;
169 lxb_dom_element_t *element;
170
171 /* TODO: Must implement custom elements */
172
173 /* 7. Otherwise */
174
175 ns_data = NULL;
176 tag_data = NULL;
177 ns_prefix = NULL;
178
179 tag_data = lxb_tag_append_lower(document->tags, local_name, lname_len);
180 if (tag_data == NULL) {
181 return NULL;
182 }
183
184 if (ns_link != NULL) {
185 ns_data = lxb_ns_append(document->ns, ns_link, ns_len);
186 }
187 else {
188 ns_data = lxb_ns_data_by_id(document->ns, LXB_NS__UNDEF);
189 }
190
191 if (ns_data == NULL) {
192 return NULL;
193 }
194
195 element = lxb_dom_document_create_interface(document, tag_data->tag_id,
196 ns_data->ns_id);
197 if (element == NULL) {
198 return NULL;
199 }
200
201 if (prefix != NULL) {
202 ns_prefix = lxb_ns_prefix_append(document->prefix, prefix, prefix_len);
203 if (ns_prefix == NULL) {
205 }
206
207 element->node.prefix = ns_prefix->prefix_id;
208
209 status = lxb_dom_element_qualified_name_set(element, prefix, prefix_len,
210 local_name, lname_len);
211 if (status != LXB_STATUS_OK) {
213 }
214 }
215
216 if (is_len != 0) {
217 status = lxb_dom_element_is_set(element, is, is_len);
218 if (status != LXB_STATUS_OK) {
220 }
221 }
222
223 element->node.local_name = tag_data->tag_id;
224 element->node.ns = ns_data->ns_id;
225
226 if (ns_data->ns_id == LXB_NS_HTML && is_len != 0) {
228 }
229 else {
231 }
232
233 return element;
234}
235
241
242bool
244{
245 return element->first_attr != NULL;
246}
247
250 const lxb_char_t *qualified_name, size_t qn_len,
251 const lxb_char_t *value, size_t value_len)
252{
255
256 attr = lxb_dom_element_attr_is_exist(element, qualified_name, qn_len);
257
258 if (attr != NULL) {
260 if (status != LXB_STATUS_OK) {
262 }
263
264 return attr;
265 }
266
268 if (attr == NULL) {
269 return NULL;
270 }
271
272 attr->node.ns = element->node.ns;
273
274 if (element->node.ns == LXB_NS_HTML
276 {
277 status = lxb_dom_attr_set_name(attr, qualified_name, qn_len, true);
278 }
279 else {
280 status = lxb_dom_attr_set_name(attr, qualified_name, qn_len, false);
281 }
282
283 if (status != LXB_STATUS_OK) {
285 }
286
288 if (status != LXB_STATUS_OK) {
290 }
291
293
294 return attr;
295}
296
297const lxb_char_t *
299 const lxb_char_t *qualified_name, size_t qn_len,
300 size_t *value_len)
301{
303
304 attr = lxb_dom_element_attr_by_name(element, qualified_name, qn_len);
305 if (attr == NULL) {
306 if (value_len != NULL) {
307 *value_len = 0;
308 }
309
310 return NULL;
311 }
312
313 return lxb_dom_attr_value(attr, value_len);
314}
315
318 const lxb_char_t *qualified_name, size_t qn_len)
319{
322
323 attr = lxb_dom_element_attr_by_name(element, qualified_name, qn_len);
324 if (attr == NULL) {
325 return LXB_STATUS_OK;
326 }
327
329 if (status != LXB_STATUS_OK) {
330 return status;
331 }
332
334
335 return LXB_STATUS_OK;
336}
337
338bool
340 const lxb_char_t *qualified_name, size_t qn_len)
341{
342 return lxb_dom_element_attr_by_name(element, qualified_name, qn_len) != NULL;
343}
344
347{
348 lxb_dom_attr_t *exist;
349 lxb_dom_document_t *doc = lxb_dom_interface_node(element)->owner_document;
350
351 if (attr->node.local_name == LXB_DOM_ATTR_ID) {
352 exist = element->attr_id;
353
354 if (exist != NULL) {
355 lxb_dom_element_attr_remove(element, exist);
357 }
358
359 element->attr_id = attr;
360 }
361 else if (attr->node.local_name == LXB_DOM_ATTR_CLASS) {
362 exist = element->attr_class;
363
364 if (exist != NULL) {
365 lxb_dom_element_attr_remove(element, exist);
367 }
368
369 element->attr_class = attr;
370 }
371
372 if (element->first_attr == NULL) {
373 element->first_attr = attr;
374 element->last_attr = attr;
375
376 goto done;
377 }
378
379 attr->prev = element->last_attr;
380
381 element->last_attr->next = attr;
382 element->last_attr = attr;
383
384done:
385
386 attr->owner = element;
387
388 if (doc->ev_insert != NULL) {
390 }
391
392 return LXB_STATUS_OK;
393}
394
397{
398 (void) element;
399
401
402 return LXB_STATUS_OK;
403}
404
407 const lxb_char_t *qualified_name, size_t length)
408{
410 lexbor_hash_t *attrs = element->node.owner_document->attrs;
411 lxb_dom_attr_t *attr = element->first_attr;
412
413 if (element->node.ns == LXB_NS_HTML
415 {
416 data = lxb_dom_attr_data_by_local_name(attrs, qualified_name, length);
417 }
418 else {
419 data = lxb_dom_attr_data_by_qualified_name(attrs, qualified_name,
420 length);
421 }
422
423 if (data == NULL) {
424 return NULL;
425 }
426
427 while (attr != NULL) {
428 if (attr->node.local_name == data->attr_id
429 || attr->qualified_name == data->attr_id)
430 {
431 return attr;
432 }
433
434 attr = attr->next;
435 }
436
437 return NULL;
438}
439
443{
444 lxb_dom_attr_t *attr = element->first_attr;
445
446 while (attr != NULL) {
447 if (attr->node.local_name == data->attr_id
448 || attr->qualified_name == data->attr_id)
449 {
450 return attr;
451 }
452
453 attr = attr->next;
454 }
455
456 return NULL;
457}
458
461 lxb_dom_attr_id_t attr_id)
462{
463 lxb_dom_attr_t *attr = element->first_attr;
464
465 while (attr != NULL) {
466 if (attr->node.local_name == attr_id) {
467 return attr;
468 }
469
470 attr = attr->next;
471 }
472
473 return NULL;
474}
475
476bool
478{
479 lxb_dom_attr_t *f_attr = first->first_attr;
480 lxb_dom_attr_t *s_attr = second->first_attr;
481
482 if (first->node.local_name != second->node.local_name
483 || first->node.ns != second->node.ns
484 || first->qualified_name != second->qualified_name)
485 {
486 return false;
487 }
488
489 /* Compare attr counts */
490 while (f_attr != NULL && s_attr != NULL) {
491 f_attr = f_attr->next;
492 s_attr = s_attr->next;
493 }
494
495 if (f_attr != NULL || s_attr != NULL) {
496 return false;
497 }
498
499 /* Compare attr */
500 f_attr = first->first_attr;
501
502 while (f_attr != NULL) {
503 s_attr = second->first_attr;
504
505 while (s_attr != NULL) {
506 if (lxb_dom_attr_compare(f_attr, s_attr)) {
507 break;
508 }
509
510 s_attr = s_attr->next;
511 }
512
513 if (s_attr == NULL) {
514 return false;
515 }
516
517 f_attr = f_attr->next;
518 }
519
520 return true;
521}
522
525 const lxb_char_t *qualified_name, size_t length)
526{
528 lxb_dom_attr_t *attr = element->first_attr;
529
531 qualified_name, length);
532 if (data == NULL) {
533 return NULL;
534 }
535
536 while (attr != NULL) {
537 if (attr->node.local_name == data->attr_id
538 || attr->qualified_name == data->attr_id)
539 {
540 return attr;
541 }
542
543 attr = attr->next;
544 }
545
546 return NULL;
547}
548
551 const lxb_char_t *is, size_t is_len)
552{
553 if (element->is_value == NULL) {
555 sizeof(lexbor_str_t));
556 if (element->is_value == NULL) {
558 }
559 }
560
561 if (element->is_value->data == NULL) {
562 lexbor_str_init(element->is_value,
563 element->node.owner_document->text, is_len);
564
565 if (element->is_value->data == NULL) {
567 }
568 }
569
570 if (element->is_value->length != 0) {
571 element->is_value->length = 0;
572 }
573
575 element->node.owner_document->text,
576 is, is_len);
577 if (data == NULL) {
579 }
580
581 return LXB_STATUS_OK;
582}
583
586 lxb_dom_collection_t *collection,
587 const lxb_char_t *qname, size_t len)
588{
590 collection, qname, len);
591}
592
595 lxb_dom_collection_t *collection,
596 const lxb_char_t *class_name, size_t len)
597{
599 collection, class_name, len);
600}
601
604 lxb_dom_collection_t *collection,
605 const lxb_char_t *qname, size_t qname_len,
606 const lxb_char_t *value, size_t value_len,
607 bool case_insensitive)
608{
610 collection, qname, qname_len,
611 value, value_len, case_insensitive);
612}
613
616 lxb_dom_collection_t *collection,
617 const lxb_char_t *qname, size_t qname_len,
618 const lxb_char_t *value, size_t value_len,
619 bool case_insensitive)
620{
622 collection, qname, qname_len,
623 value, value_len, case_insensitive);
624}
625
628 lxb_dom_collection_t *collection,
629 const lxb_char_t *qname, size_t qname_len,
630 const lxb_char_t *value, size_t value_len,
631 bool case_insensitive)
632{
634 collection, qname, qname_len,
635 value, value_len, case_insensitive);
636}
637
640 lxb_dom_collection_t *collection,
641 const lxb_char_t *qname, size_t qname_len,
642 const lxb_char_t *value, size_t value_len,
643 bool case_insensitive)
644{
646 collection, qname, qname_len,
647 value, value_len, case_insensitive);
648}
649
650const lxb_char_t *
652{
653 const lxb_tag_data_t *data;
654
655 if (element->qualified_name != 0) {
657 }
658 else {
660 }
661
662 if (len != NULL) {
663 *len = data->entry.length;
664 }
665
666 return lexbor_hash_entry_str(&data->entry);
667}
668
669const lxb_char_t *
671{
673
674 if (element->upper_name == LXB_TAG__UNDEF) {
675 return lxb_dom_element_upper_update(element, len);
676 }
677
678 data = (lxb_tag_data_t *) element->upper_name;
679
680 if (len != NULL) {
681 *len = data->entry.length;
682 }
683
684 return lexbor_hash_entry_str(&data->entry);
685}
686
687static const lxb_char_t *
688lxb_dom_element_upper_update(lxb_dom_element_t *element, size_t *len)
689{
690 size_t length;
692 const lxb_char_t *name;
693
694 if (element->upper_name != LXB_TAG__UNDEF) {
695 /* TODO: release current tag data if ref_count == 0. */
696 /* data = (lxb_tag_data_t *) element->upper_name; */
697 }
698
699 name = lxb_dom_element_qualified_name(element, &length);
700 if (name == NULL) {
701 return NULL;
702 }
703
706 if (data == NULL) {
707 return NULL;
708 }
709
710 data->tag_id = element->node.local_name;
711
712 if (len != NULL) {
713 *len = length;
714 }
715
716 element->upper_name = (lxb_tag_id_t) data;
717
718 return lexbor_hash_entry_str(&data->entry);
719}
720
721const lxb_char_t *
723{
724 const lxb_tag_data_t *data;
725
727 if (data == NULL) {
728 if (len != NULL) {
729 *len = 0;
730 }
731
732 return NULL;
733 }
734
735 if (len != NULL) {
736 *len = data->entry.length;
737 }
738
739 return lexbor_hash_entry_str(&data->entry);
740}
741
742const lxb_char_t *
744{
746
747 if (element->node.prefix == LXB_NS__UNDEF) {
748 goto empty;
749 }
750
752 element->node.prefix);
753 if (data == NULL) {
754 goto empty;
755 }
756
757 return lexbor_hash_entry_str(&data->entry);
758
759empty:
760
761 if (len != NULL) {
762 *len = 0;
763 }
764
765 return NULL;
766}
767
768const lxb_char_t *
770{
771 lxb_dom_document_t *doc = lxb_dom_interface_node(element)->owner_document;
772
773 if (element->node.ns != LXB_NS_HTML
775 {
776 return lxb_dom_element_qualified_name(element, len);
777 }
778
780}
781
782
783
784/*
785 * No inline functions for ABI.
786 */
787const lxb_char_t *
789{
790 return lxb_dom_element_id(element, len);
791}
792
793const lxb_char_t *
795{
796 return lxb_dom_element_class(element, len);
797}
798
799bool
804
805bool
810
816
822
828
834
840
size_t len
Definition apprentice.c:174
lxb_inline const lxb_char_t * lxb_dom_attr_value(lxb_dom_attr_t *attr, size_t *len)
Definition attr.h:124
uintptr_t lxb_dom_attr_id_t
Definition attr_const.h:18
@ LXB_DOM_ATTR_CLASS
Definition attr_const.h:26
@ LXB_DOM_ATTR_ID
Definition attr_const.h:39
link(string $target, string $link)
@ LXB_STATUS_ERROR_MEMORY_ALLOCATION
Definition base.h:51
@ LXB_STATUS_OK
Definition base.h:49
@ LXB_STATUS_ERROR
Definition base.h:50
#define LXB_API
Definition def.h:48
DNS_STATUS status
Definition dns_win32.c:49
struct lxb_dom_document lxb_dom_document_t
Definition interface.h:41
#define lxb_dom_interface_node(obj)
Definition interface.h:31
struct lxb_dom_node lxb_dom_node_t
Definition interface.h:38
struct lxb_dom_attr lxb_dom_attr_t
Definition interface.h:40
struct lxb_dom_element lxb_dom_element_t
Definition interface.h:39
lxb_inline lxb_dom_interface_t * lxb_dom_document_create_interface(lxb_dom_document_t *document, lxb_tag_id_t tag_id, lxb_ns_id_t ns)
Definition document.h:142
lxb_inline lxb_dom_document_t * lxb_dom_document_owner(lxb_dom_document_t *document)
Definition document.h:198
lxb_inline lxb_dom_interface_t * lxb_dom_document_destroy_interface(lxb_dom_interface_t *intrfc)
Definition document.h:149
@ LXB_DOM_DOCUMENT_DTYPE_HTML
Definition document.h:30
lxb_inline lxb_dom_attr_t * lxb_dom_element_first_attribute(lxb_dom_element_t *element)
Definition element.h:233
@ LXB_DOM_ELEMENT_CUSTOM_STATE_UNDEFINED
Definition element.h:25
@ LXB_DOM_ELEMENT_CUSTOM_STATE_UNCUSTOMIZED
Definition element.h:27
lxb_inline bool lxb_dom_element_custom_is_defined(lxb_dom_element_t *element)
Definition element.h:226
lxb_inline lxb_dom_attr_t * lxb_dom_element_prev_attribute(lxb_dom_attr_t *attr)
Definition element.h:245
lxb_inline lxb_dom_attr_t * lxb_dom_element_next_attribute(lxb_dom_attr_t *attr)
Definition element.h:239
lxb_inline bool lxb_dom_element_is_custom(lxb_dom_element_t *element)
Definition element.h:220
lxb_inline lxb_dom_attr_t * lxb_dom_element_last_attribute(lxb_dom_element_t *element)
Definition element.h:251
lxb_inline lxb_dom_attr_t * lxb_dom_element_id_attribute(lxb_dom_element_t *element)
Definition element.h:257
lxb_inline lxb_dom_attr_t * lxb_dom_element_class_attribute(lxb_dom_element_t *element)
Definition element.h:263
lxb_inline const lxb_char_t * lxb_dom_element_class(lxb_dom_element_t *element, size_t *len)
Definition element.h:206
lxb_inline const lxb_char_t * lxb_dom_element_id(lxb_dom_element_t *element, size_t *len)
Definition element.h:192
@ LXB_DOM_NODE_TYPE_ELEMENT
Definition node.h:25
void * lexbor_hash_insert(lexbor_hash_t *hash, const lexbor_hash_insert_t *insert, const lxb_char_t *key, size_t length)
Definition hash.c:186
LXB_API const lexbor_hash_insert_t * lexbor_hash_insert_upper
Definition hash.c:44
memcpy(ptr1, ptr2, size)
new_type attr
Definition ffi.c:4364
#define NULL
Definition gdcache.h:45
#define prefix
lxb_inline lxb_char_t * lexbor_hash_entry_str(const lexbor_hash_entry_t *entry)
Definition hash.h:161
struct lexbor_hash lexbor_hash_t
Definition hash.h:41
hash(string $algo, string $data, bool $binary=false, array $options=[])
Definition hash.stub.php:12
const lxb_dom_attr_data_t * lxb_dom_attr_data_by_qualified_name(lexbor_hash_t *hash, const lxb_char_t *name, size_t length)
Definition attr.c:444
void lxb_dom_attr_remove(lxb_dom_attr_t *attr)
Definition attr.c:322
lxb_status_t lxb_dom_attr_set_name(lxb_dom_attr_t *attr, const lxb_char_t *name, size_t length, bool to_lowercase)
Definition attr.c:130
lxb_dom_attr_t * lxb_dom_attr_interface_create(lxb_dom_document_t *document)
Definition attr.c:26
lxb_dom_attr_t * lxb_dom_attr_interface_clone(lxb_dom_document_t *document, const lxb_dom_attr_t *attr)
Definition attr.c:44
bool lxb_dom_attr_compare(lxb_dom_attr_t *first, lxb_dom_attr_t *second)
Definition attr.c:295
const lxb_dom_attr_data_t * lxb_dom_attr_data_by_local_name(lexbor_hash_t *hash, const lxb_char_t *name, size_t length)
Definition attr.c:425
lxb_dom_attr_t * lxb_dom_attr_interface_destroy(lxb_dom_attr_t *attr)
Definition attr.c:109
lxb_status_t lxb_dom_attr_set_value(lxb_dom_attr_t *attr, const lxb_char_t *value, size_t value_len)
Definition attr.c:210
bool lxb_dom_element_has_attribute(lxb_dom_element_t *element, const lxb_char_t *qualified_name, size_t qn_len)
Definition element.c:339
lxb_status_t lxb_dom_element_attr_remove(lxb_dom_element_t *element, lxb_dom_attr_t *attr)
Definition element.c:396
lxb_dom_attr_t * lxb_dom_element_class_attribute_noi(lxb_dom_element_t *element)
Definition element.c:842
lxb_dom_attr_t * lxb_dom_element_attr_by_name(lxb_dom_element_t *element, const lxb_char_t *qualified_name, size_t length)
Definition element.c:406
bool lxb_dom_element_compare(lxb_dom_element_t *first, lxb_dom_element_t *second)
Definition element.c:477
lxb_status_t lxb_dom_element_is_set(lxb_dom_element_t *element, const lxb_char_t *is, size_t is_len)
Definition element.c:550
lxb_status_t lxb_dom_elements_by_attr_end(lxb_dom_element_t *root, lxb_dom_collection_t *collection, const lxb_char_t *qname, size_t qname_len, const lxb_char_t *value, size_t value_len, bool case_insensitive)
Definition element.c:627
lxb_status_t lxb_dom_elements_by_tag_name(lxb_dom_element_t *root, lxb_dom_collection_t *collection, const lxb_char_t *qname, size_t len)
Definition element.c:585
lxb_dom_attr_t * lxb_dom_element_set_attribute(lxb_dom_element_t *element, const lxb_char_t *qualified_name, size_t qn_len, const lxb_char_t *value, size_t value_len)
Definition element.c:249
lxb_dom_attr_t * lxb_dom_element_first_attribute_noi(lxb_dom_element_t *element)
Definition element.c:812
lxb_dom_element_t * lxb_dom_element_create(lxb_dom_document_t *document, const lxb_char_t *local_name, size_t lname_len, const lxb_char_t *ns_link, size_t ns_len, const lxb_char_t *prefix, size_t prefix_len, const lxb_char_t *is, size_t is_len, bool sync_custom)
Definition element.c:158
bool lxb_dom_element_custom_is_defined_noi(lxb_dom_element_t *element)
Definition element.c:806
lxb_status_t lxb_dom_element_interface_copy(lxb_dom_element_t *dst, const lxb_dom_element_t *src)
Definition element.c:89
bool lxb_dom_element_has_attributes(lxb_dom_element_t *element)
Definition element.c:243
lxb_status_t lxb_dom_elements_by_attr_contain(lxb_dom_element_t *root, lxb_dom_collection_t *collection, const lxb_char_t *qname, size_t qname_len, const lxb_char_t *value, size_t value_len, bool case_insensitive)
Definition element.c:639
lxb_status_t lxb_dom_element_remove_attribute(lxb_dom_element_t *element, const lxb_char_t *qualified_name, size_t qn_len)
Definition element.c:317
const lxb_char_t * lxb_dom_element_qualified_name(lxb_dom_element_t *element, size_t *len)
Definition element.c:651
const lxb_char_t * lxb_dom_element_prefix(lxb_dom_element_t *element, size_t *len)
Definition element.c:743
const lxb_char_t * lxb_dom_element_tag_name(lxb_dom_element_t *element, size_t *len)
Definition element.c:769
lxb_status_t lxb_dom_elements_by_attr(lxb_dom_element_t *root, lxb_dom_collection_t *collection, const lxb_char_t *qname, size_t qname_len, const lxb_char_t *value, size_t value_len, bool case_insensitive)
Definition element.c:603
lxb_status_t lxb_dom_element_attr_append(lxb_dom_element_t *element, lxb_dom_attr_t *attr)
Definition element.c:346
LXB_API lxb_status_t lxb_dom_element_qualified_name_set(lxb_dom_element_t *element, const lxb_char_t *prefix, size_t prefix_len, const lxb_char_t *lname, size_t lname_len)
Definition element.c:119
lxb_dom_element_t * lxb_dom_element_interface_create(lxb_dom_document_t *document)
Definition element.c:33
const lxb_char_t * lxb_dom_element_qualified_name_upper(lxb_dom_element_t *element, size_t *len)
Definition element.c:670
bool lxb_dom_element_is_custom_noi(lxb_dom_element_t *element)
Definition element.c:800
lxb_dom_attr_t * lxb_dom_element_attr_by_id(lxb_dom_element_t *element, lxb_dom_attr_id_t attr_id)
Definition element.c:460
const lxb_char_t * lxb_dom_element_local_name(lxb_dom_element_t *element, size_t *len)
Definition element.c:722
lxb_dom_attr_t * lxb_dom_element_attr_is_exist(lxb_dom_element_t *element, const lxb_char_t *qualified_name, size_t length)
Definition element.c:524
const lxb_char_t * lxb_dom_element_get_attribute(lxb_dom_element_t *element, const lxb_char_t *qualified_name, size_t qn_len, size_t *value_len)
Definition element.c:298
lxb_status_t lxb_dom_elements_by_class_name(lxb_dom_element_t *root, lxb_dom_collection_t *collection, const lxb_char_t *class_name, size_t len)
Definition element.c:594
lxb_dom_attr_t * lxb_dom_element_id_attribute_noi(lxb_dom_element_t *element)
Definition element.c:836
lxb_dom_attr_t * lxb_dom_element_prev_attribute_noi(lxb_dom_attr_t *attr)
Definition element.c:824
lxb_status_t lxb_dom_elements_by_attr_begin(lxb_dom_element_t *root, lxb_dom_collection_t *collection, const lxb_char_t *qname, size_t qname_len, const lxb_char_t *value, size_t value_len, bool case_insensitive)
Definition element.c:615
lxb_dom_attr_t * lxb_dom_element_attr_by_local_name_data(lxb_dom_element_t *element, const lxb_dom_attr_data_t *data)
Definition element.c:441
lxb_dom_element_t * lxb_dom_element_destroy(lxb_dom_element_t *element)
Definition element.c:237
const lxb_char_t * lxb_dom_element_id_noi(lxb_dom_element_t *element, size_t *len)
Definition element.c:788
lxb_dom_attr_t * lxb_dom_element_last_attribute_noi(lxb_dom_element_t *element)
Definition element.c:830
const lxb_char_t * lxb_dom_element_class_noi(lxb_dom_element_t *element, size_t *len)
Definition element.c:794
const lxb_tag_data_t * lxb_tag_append(lexbor_hash_t *hash, lxb_tag_id_t tag_id, const lxb_char_t *name, size_t length)
Definition tag.c:13
const lxb_ns_data_t * lxb_ns_append(lexbor_hash_t *hash, const lxb_char_t *link, size_t length)
Definition ns.c:17
lxb_dom_attr_t * lxb_dom_element_next_attribute_noi(lxb_dom_attr_t *attr)
Definition element.c:818
const lxb_tag_data_t * lxb_tag_append_lower(lexbor_hash_t *hash, const lxb_char_t *name, size_t length)
Definition tag.c:41
lxb_dom_element_t * lxb_dom_element_interface_destroy(lxb_dom_element_t *element)
Definition element.c:70
lxb_dom_element_t * lxb_dom_element_interface_clone(lxb_dom_document_t *document, const lxb_dom_element_t *element)
Definition element.c:52
lxb_status_t lxb_dom_node_by_attr_begin(lxb_dom_node_t *root, lxb_dom_collection_t *collection, const lxb_char_t *qualified_name, size_t qname_len, const lxb_char_t *value, size_t value_len, bool case_insensitive)
Definition node.c:833
lxb_status_t lxb_dom_node_by_attr_end(lxb_dom_node_t *root, lxb_dom_collection_t *collection, const lxb_char_t *qualified_name, size_t qname_len, const lxb_char_t *value, size_t value_len, bool case_insensitive)
Definition node.c:870
lxb_status_t lxb_dom_node_interface_copy(lxb_dom_node_t *dst, const lxb_dom_node_t *src, bool is_attr)
Definition node.c:136
lxb_status_t lxb_dom_node_by_tag_name(lxb_dom_node_t *root, lxb_dom_collection_t *collection, const lxb_char_t *qualified_name, size_t len)
Definition node.c:626
lxb_status_t lxb_dom_node_by_class_name(lxb_dom_node_t *root, lxb_dom_collection_t *collection, const lxb_char_t *class_name, size_t len)
Definition node.c:697
lxb_status_t lxb_dom_node_by_attr(lxb_dom_node_t *root, lxb_dom_collection_t *collection, const lxb_char_t *qualified_name, size_t qname_len, const lxb_char_t *value, size_t value_len, bool case_insensitive)
Definition node.c:797
lxb_status_t lxb_dom_node_by_attr_contain(lxb_dom_node_t *root, lxb_dom_collection_t *collection, const lxb_char_t *qualified_name, size_t qname_len, const lxb_char_t *value, size_t value_len, bool case_insensitive)
Definition node.c:905
lxb_dom_node_t * lxb_dom_node_interface_destroy(lxb_dom_node_t *node)
Definition node.c:124
LXB_API void * lexbor_free(void *dst)
Definition memory.c:33
LXB_API void * lexbor_malloc(size_t size)
Definition memory.c:15
void * lexbor_mraw_calloc(lexbor_mraw_t *mraw, size_t size)
Definition mraw.c:227
@ LXB_NS__UNDEF
Definition const.h:24
@ LXB_NS_HTML
Definition const.h:26
const lxb_ns_prefix_data_t * lxb_ns_prefix_append(lexbor_hash_t *hash, const lxb_char_t *prefix, size_t length)
Definition ns.c:97
const lxb_ns_data_t * lxb_ns_data_by_id(lexbor_hash_t *hash, lxb_ns_id_t ns_id)
Definition ns.c:64
const lxb_ns_prefix_data_t * lxb_ns_prefix_data_by_id(lexbor_hash_t *hash, lxb_ns_prefix_id_t prefix_id)
Definition ns.c:124
unsigned char key[REFLECTION_KEY_LEN]
zend_constant * data
lxb_char_t * lexbor_str_append(lexbor_str_t *str, lexbor_mraw_t *mraw, const lxb_char_t *buff, size_t length)
Definition str.c:131
lxb_char_t * lexbor_str_init(lexbor_str_t *str, lexbor_mraw_t *mraw, size_t size)
Definition str.c:22
lxb_char_t * data
Definition str.h:47
size_t length
Definition str.h:48
lxb_dom_attr_t * next
Definition attr.h:46
lexbor_hash_t * ns
Definition document.h:58
lexbor_mraw_t * mraw
Definition document.h:53
lexbor_hash_t * tags
Definition document.h:55
lexbor_mraw_t * text
Definition document.h:54
lexbor_hash_t * attrs
Definition document.h:56
lxb_dom_document_dtype_t type
Definition document.h:39
lexbor_hash_t * prefix
Definition document.h:57
lxb_dom_event_insert_f ev_insert
Definition document.h:48
lxb_dom_attr_id_t upper_name
Definition element.h:38
lxb_dom_element_custom_state_t custom_state
Definition element.h:51
lxb_dom_attr_t * attr_class
Definition element.h:49
lxb_dom_attr_t * last_attr
Definition element.h:46
lxb_dom_node_t node
Definition element.h:33
lxb_dom_attr_t * first_attr
Definition element.h:45
lxb_dom_attr_id_t qualified_name
Definition element.h:41
lxb_dom_attr_t * attr_id
Definition element.h:48
lexbor_str_t * is_value
Definition element.h:43
uintptr_t ns
Definition node.h:48
lxb_dom_document_t * owner_document
Definition node.h:50
uintptr_t prefix
Definition node.h:47
lxb_dom_node_type_t type
Definition node.h:59
uintptr_t local_name
Definition node.h:46
lxb_ns_id_t ns_id
Definition ns.h:23
lxb_ns_prefix_id_t prefix_id
Definition ns.h:32
lxb_tag_id_t tag_id
Definition tag.h:24
@ LXB_TAG__UNDEF
Definition const.h:24
uintptr_t lxb_tag_id_t
Definition const.h:21
const lxb_tag_data_t * lxb_tag_data_by_id(lxb_tag_id_t tag_id)
Definition tag.c:63
unsigned int lxb_status_t
Definition types.h:28
unsigned char lxb_char_t
Definition types.h:27
ZEND_API void(ZEND_FASTCALL *zend_touch_vm_stack_data)(void *vm_stack_data)
zend_string * name
value