1 /** The document base functionality
15 #include "bfu/listmenu.h"
16 #include "document/document.h"
17 #include "document/forms.h"
18 #include "document/renderer.h"
19 #include "util/error.h"
20 #include "util/lists.h"
21 #include "util/memory.h"
24 struct form_type_name
{
29 static struct form_type_name form_type2name
[] = {
31 { FC_PASSWORD
, "password" },
33 { FC_TEXTAREA
, "textarea" },
34 { FC_CHECKBOX
, "checkbox" },
35 { FC_RADIO
, "radio" },
36 { FC_SELECT
, "select" },
37 { FC_SUBMIT
, "submit" },
38 { FC_IMAGE
, "image" },
39 { FC_HIDDEN
, "hidden" },
42 #define FORM_TYPE_COUNT (sizeof(form_type2name)/sizeof(struct form_type_name))
45 str2form_type(unsigned char *s
)
49 for (n
= 0; n
< FORM_TYPE_COUNT
; n
++)
50 if (!strcmp(form_type2name
[n
].name
, s
))
51 return form_type2name
[n
].num
;
57 form_type2str(enum form_type num
)
61 for (n
= 0; n
< FORM_TYPE_COUNT
; n
++)
62 if (form_type2name
[n
].num
== num
)
63 return form_type2name
[n
].name
;
68 #undef FORM_TYPE_COUNT
74 struct form
*form
= mem_calloc(1, sizeof(*form
));
76 if (!form
) return NULL
;
78 /* Make the form initially stretch the whole range. */
79 form
->form_end
= INT_MAX
;
81 init_list(form
->items
);
87 done_form(struct form
*form
)
89 struct form_control
*fc
;
94 mem_free_if(form
->action
);
95 mem_free_if(form
->name
);
96 mem_free_if(form
->onsubmit
);
97 mem_free_if(form
->target
);
99 foreach (fc
, form
->items
) {
100 done_form_control(fc
);
102 free_list(form
->items
);
108 has_form_submit(struct form
*form
)
110 struct form_control
*fc
;
113 if_assert_failed
return 0;
115 assertm(!list_empty(form
->items
), "form has no items");
117 foreach (fc
, form
->items
) {
118 if (fc
->type
== FC_SUBMIT
|| fc
->type
== FC_IMAGE
)
122 /* Return path :-). */
128 get_form_control_link(struct document
*document
, struct form_control
*fc
)
132 /* Hidden form fields have no links. */
133 if (fc
->type
== FC_HIDDEN
)
136 if (!document
->links_sorted
) sort_links(document
);
138 for (link
= 0; link
< document
->nlinks
; link
++)
139 if (fc
== get_link_form_control(&document
->links
[link
]))
142 assertm(0, "Form control has no link.");
148 done_form_control(struct form_control
*fc
)
153 if_assert_failed
return;
156 mem_free_if(fc
->name
);
157 mem_free_if(fc
->alt
);
158 mem_free_if(fc
->default_value
);
160 for (i
= 0; i
< fc
->nvalues
; i
++) {
161 mem_free_if(fc
->values
[i
]);
162 mem_free_if(fc
->labels
[i
]);
165 mem_free_if(fc
->values
);
166 mem_free_if(fc
->labels
);
167 if (fc
->menu
) free_menu(fc
->menu
);