Handling onsubmit
[elinks.git] / src / document / forms.c
blob6eefac52508612f473ae305005d3d196d60a2ce1
1 /* The document base functionality */
3 #ifdef HAVE_CONFIG_H
4 #include "config.h"
5 #endif
7 #include <errno.h>
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <string.h>
12 #include "elinks.h"
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 {
23 enum form_type num;
24 unsigned char *name;
27 static struct form_type_name form_type2name[] = {
28 { FC_TEXT, "text" },
29 { FC_PASSWORD, "password" },
30 { FC_FILE, "file" },
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))
42 int
43 str2form_type(unsigned char *s)
45 int n;
47 for (n = 0; n < FORM_TYPE_COUNT; n++)
48 if (!strcmp(form_type2name[n].name, s))
49 return form_type2name[n].num;
51 return -1;
54 unsigned char *
55 form_type2str(enum form_type num)
57 int n;
59 for (n = 0; n < FORM_TYPE_COUNT; n++)
60 if (form_type2name[n].num == num)
61 return form_type2name[n].name;
63 return NULL;
66 #undef FORM_TYPE_COUNT
69 struct form *
70 init_form(void)
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);
81 return form;
84 void
85 done_form(struct form *form)
87 struct form_control *fc;
89 if (form->next)
90 del_from_list(form);
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);
102 mem_free(form);
106 has_form_submit(struct form *form)
108 struct form_control *fc;
110 assert(form);
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)
117 return 1;
120 /* Return path :-). */
121 return 0;
126 get_form_control_link(struct document *document, struct form_control *fc)
128 int link;
130 /* Hidden form fields have no links. */
131 if (fc->type == FC_HIDDEN)
132 return -1;
134 for (link = 0; link < document->nlinks; link++)
135 if (fc == get_link_form_control(&document->links[link]))
136 return link;
138 assertm(0, "Form control has no link.");
140 return -1;
143 void
144 done_form_control(struct form_control *fc)
146 int i;
148 assert(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);