Bug 1004: NEWS and AUTHORS
[elinks/kon.git] / src / document / forms.c
blob2713355101c064d001b62980b77509c60366d416
1 /** The document base functionality
2 * @file */
4 #ifdef HAVE_CONFIG_H
5 #include "config.h"
6 #endif
8 #include <errno.h>
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <string.h>
13 #include "elinks.h"
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 {
25 enum form_type num;
26 unsigned char *name;
29 static struct form_type_name form_type2name[] = {
30 { FC_TEXT, "text" },
31 { FC_PASSWORD, "password" },
32 { FC_FILE, "file" },
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))
44 int
45 str2form_type(unsigned char *s)
47 int n;
49 for (n = 0; n < FORM_TYPE_COUNT; n++)
50 if (!strcmp(form_type2name[n].name, s))
51 return form_type2name[n].num;
53 return -1;
56 unsigned char *
57 form_type2str(enum form_type num)
59 int n;
61 for (n = 0; n < FORM_TYPE_COUNT; n++)
62 if (form_type2name[n].num == num)
63 return form_type2name[n].name;
65 return NULL;
68 #undef FORM_TYPE_COUNT
71 struct form *
72 init_form(void)
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);
83 return form;
86 void
87 done_form(struct form *form)
89 struct form_control *fc;
91 if (form->next)
92 del_from_list(form);
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);
104 mem_free(form);
108 has_form_submit(struct form *form)
110 struct form_control *fc;
112 assert(form);
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)
119 return 1;
122 /* Return path :-). */
123 return 0;
128 get_form_control_link(struct document *document, struct form_control *fc)
130 int link;
132 /* Hidden form fields have no links. */
133 if (fc->type == FC_HIDDEN)
134 return -1;
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]))
140 return link;
142 assertm(0, "Form control has no link.");
144 return -1;
147 void
148 done_form_control(struct form_control *fc)
150 int i;
152 assert(fc);
153 if_assert_failed return;
155 mem_free_if(fc->id);
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);