1 /* The document base functionality */
14 #include "bfu/listmenu.h"
15 #include "document/document.h"
16 #include "document/forms.h"
17 #include "util/error.h"
18 #include "util/lists.h"
19 #include "util/memory.h"
22 struct form_type_name
{
27 static struct form_type_name form_type2name
[] = {
29 { FC_PASSWORD
, "password" },
31 { FC_TEXTAREA
, "textarea" },
32 { FC_CHECKBOX
, "checkbox" },
33 { FC_RADIO
, "radio" },
34 { FC_SELECT
, "select" },
35 { FC_SUBMIT
, "submit" },
36 { FC_IMAGE
, "image" },
37 { FC_HIDDEN
, "hidden" },
40 #define FORM_TYPE_COUNT (sizeof(form_type2name)/sizeof(struct form_type_name))
43 str2form_type(unsigned char *s
)
47 for (n
= 0; n
< FORM_TYPE_COUNT
; n
++)
48 if (!strcmp(form_type2name
[n
].name
, s
))
49 return form_type2name
[n
].num
;
55 form_type2str(enum form_type num
)
59 for (n
= 0; n
< FORM_TYPE_COUNT
; n
++)
60 if (form_type2name
[n
].num
== num
)
61 return form_type2name
[n
].name
;
66 #undef FORM_TYPE_COUNT
72 struct form
*form
= mem_calloc(1, sizeof(*form
));
74 if (!form
) return NULL
;
76 /* Make the form initially stretch the whole range. */
77 form
->form_end
= INT_MAX
;
79 init_list(form
->items
);
85 done_form(struct form
*form
)
87 struct form_control
*fc
;
92 mem_free_if(form
->action
);
93 mem_free_if(form
->name
);
94 mem_free_if(form
->onsubmit
);
95 mem_free_if(form
->target
);
97 foreach (fc
, form
->items
) {
98 done_form_control(fc
);
100 free_list(form
->items
);
106 has_form_submit(struct form
*form
)
108 struct form_control
*fc
;
111 if_assert_failed
return 0;
113 assertm(!list_empty(form
->items
), "form has no items");
115 foreach (fc
, form
->items
) {
116 if (fc
->type
== FC_SUBMIT
|| fc
->type
== FC_IMAGE
)
120 /* Return path :-). */
126 get_form_control_link(struct document
*document
, struct form_control
*fc
)
130 /* Hidden form fields have no links. */
131 if (fc
->type
== FC_HIDDEN
)
134 for (link
= 0; link
< document
->nlinks
; link
++)
135 if (fc
== get_link_form_control(&document
->links
[link
]))
138 assertm(0, "Form control has no link.");
144 done_form_control(struct form_control
*fc
)
149 if_assert_failed
return;
151 mem_free_if(fc
->name
);
152 mem_free_if(fc
->alt
);
153 mem_free_if(fc
->default_value
);
155 for (i
= 0; i
< fc
->nvalues
; i
++) {
156 mem_free_if(fc
->values
[i
]);
157 mem_free_if(fc
->labels
[i
]);
160 mem_free_if(fc
->values
);
161 mem_free_if(fc
->labels
);
162 if (fc
->menu
) free_menu(fc
->menu
);