1 /*
2  * Copyright (C) 2018 Alexander Borisov
3  *
4  * Author: Alexander Borisov <borisov@lexbor.com>
5  */
6 
7 #ifndef LEXBOR_HTML_TEMPLATE_INSERTION_H
8 #define LEXBOR_HTML_TEMPLATE_INSERTION_H
9 
10 #ifdef __cplusplus
11 extern "C" {
12 #endif
13 
14 #include "lexbor/core/array.h"
15 
16 #include "lexbor/html/tree.h"
17 
18 
19 typedef struct {
20     lxb_html_tree_insertion_mode_f mode;
21 }
22 lxb_html_tree_template_insertion_t;
23 
24 
25 /*
26  * Inline functions
27  */
28 lxb_inline lxb_html_tree_insertion_mode_f
lxb_html_tree_template_insertion_current(lxb_html_tree_t * tree)29 lxb_html_tree_template_insertion_current(lxb_html_tree_t *tree)
30 {
31     if (lexbor_array_obj_length(tree->template_insertion_modes) == 0) {
32         return NULL;
33     }
34 
35     lxb_html_tree_template_insertion_t *tmp_ins;
36 
37     tmp_ins = (lxb_html_tree_template_insertion_t *)
38               lexbor_array_obj_last(tree->template_insertion_modes);
39 
40     return tmp_ins->mode;
41 }
42 
43 lxb_inline lxb_html_tree_insertion_mode_f
lxb_html_tree_template_insertion_get(lxb_html_tree_t * tree,size_t idx)44 lxb_html_tree_template_insertion_get(lxb_html_tree_t *tree, size_t idx)
45 {
46     lxb_html_tree_template_insertion_t *tmp_ins;
47 
48     tmp_ins = (lxb_html_tree_template_insertion_t *)
49               lexbor_array_obj_get(tree->template_insertion_modes, idx);
50     if (tmp_ins == NULL) {
51         return NULL;
52     }
53 
54     return tmp_ins->mode;
55 }
56 
57 lxb_inline lxb_html_tree_insertion_mode_f
lxb_html_tree_template_insertion_first(lxb_html_tree_t * tree)58 lxb_html_tree_template_insertion_first(lxb_html_tree_t *tree)
59 {
60     return lxb_html_tree_template_insertion_get(tree, 0);
61 }
62 
63 lxb_inline lxb_status_t
lxb_html_tree_template_insertion_push(lxb_html_tree_t * tree,lxb_html_tree_insertion_mode_f mode)64 lxb_html_tree_template_insertion_push(lxb_html_tree_t *tree,
65                                       lxb_html_tree_insertion_mode_f mode)
66 {
67     lxb_html_tree_template_insertion_t *tmp_ins;
68 
69     tmp_ins = (lxb_html_tree_template_insertion_t *)
70               lexbor_array_obj_push(tree->template_insertion_modes);
71     if (tmp_ins == NULL) {
72         return LXB_STATUS_ERROR_MEMORY_ALLOCATION;
73     }
74 
75     tmp_ins->mode = mode;
76 
77     return LXB_STATUS_OK;
78 }
79 
80 lxb_inline lxb_html_tree_insertion_mode_f
lxb_html_tree_template_insertion_pop(lxb_html_tree_t * tree)81 lxb_html_tree_template_insertion_pop(lxb_html_tree_t *tree)
82 {
83     lxb_html_tree_template_insertion_t *tmp_ins;
84 
85     tmp_ins = (lxb_html_tree_template_insertion_t *)
86               lexbor_array_obj_pop(tree->template_insertion_modes);
87     if (tmp_ins == NULL) {
88         return NULL;
89     }
90 
91     return tmp_ins->mode;
92 }
93 
94 
95 #ifdef __cplusplus
96 } /* extern "C" */
97 #endif
98 
99 #endif /* LEXBOR_HTML_TEMPLATE_INSERTION_H */
100 
101