summaryrefslogtreecommitdiff
path: root/render/form.c
diff options
context:
space:
mode:
authorJohn Tytgat <joty@netsurf-browser.org>2004-07-19 20:40:11 +0000
committerJohn Tytgat <joty@netsurf-browser.org>2004-07-19 20:40:11 +0000
commitc93b54b07cd0675e785b5c984055c3ea23b43c20 (patch)
treeca92adfb10c5f3373a0cf7019ecd39d4da0bd7ec /render/form.c
parentf94da4813992a06f829080629b7b17b17cb741c5 (diff)
downloadnetsurf-c93b54b07cd0675e785b5c984055c3ea23b43c20.tar.gz
netsurf-c93b54b07cd0675e785b5c984055c3ea23b43c20.tar.bz2
[project @ 2004-07-19 20:40:11 by joty]
form.h (struct form_control): renamed caret_char_offset to caret_box_offset; Added caret_form_offset & length. form.c: initialise new entries in struct form_control; form_successful_controls() : code reshuffling to improve readibility. box.h: TABing. box.c (box_input): init struct form_control::length. browser.c (browser_window_input_callback): UTF-8 support. Text area code needs similar changes. svn path=/import/netsurf/; revision=1117
Diffstat (limited to 'render/form.c')
-rw-r--r--render/form.c230
1 files changed, 131 insertions, 99 deletions
diff --git a/render/form.c b/render/form.c
index 6b1b247df..3713071e9 100644
--- a/render/form.c
+++ b/render/form.c
@@ -33,19 +33,22 @@ struct form_control *form_new_control(form_control_type type)
{
struct form_control *control;
- control = malloc(sizeof *control);
- if (!control)
- return 0;
+ if ((control = malloc(sizeof *control)) == NULL)
+ return NULL;
control->type = type;
- control->name = 0;
- control->value = 0;
- control->initial_value = 0;
+ control->name = NULL;
+ control->value = NULL;
+ control->initial_value = NULL;
control->disabled = false;
- control->form = 0;
- control->box = 0;
+ control->form = NULL;
+ control->box = NULL;
+ control->caret_inline_container = NULL;
+ control->caret_text_box = NULL;
+ control->caret_box_offset = control->caret_form_offset = 0;
+ control->length = control->maxlength = 0;
control->selected = false;
- control->prev = 0;
- control->next = 0;
+ control->prev = NULL;
+ control->next = NULL;
return control;
}
@@ -57,11 +60,11 @@ struct form_control *form_new_control(form_control_type type)
void form_add_control(struct form *form, struct form_control *control)
{
control->form = form;
- if (form->controls) {
+ if (form->controls != NULL) {
assert(form->last_control);
form->last_control->next = control;
control->prev = form->last_control;
- control->next = 0;
+ control->next = NULL;
form->last_control = control;
} else {
form->controls = form->last_control = control;
@@ -106,11 +109,13 @@ struct form_successful_control *form_successful_controls(struct form *form,
struct form_control *control;
struct form_option *option;
struct form_successful_control sentinel, *last_success;
+
last_success = &sentinel;
sentinel.next = 0;
for (control = form->controls; control; control = control->next) {
struct form_successful_control *success_new;
+ bool add_val;
/* ignore disabled controls */
if (control->disabled)
@@ -120,93 +125,120 @@ struct form_successful_control *form_successful_controls(struct form *form,
if (!control->name)
continue;
- /* only the activated submit button is successful */
- if (control->type == GADGET_SUBMIT && control != submit_button)
- continue;
-
- /* ignore checkboxes and radio buttons which aren't selected */
- if (control->type == GADGET_CHECKBOX && !control->selected)
- continue;
- if (control->type == GADGET_RADIO && !control->selected)
- continue;
-
- /* select */
- if (control->type == GADGET_SELECT) {
- for (option = control->data.select.items; option;
- option = option->next) {
- if (option->selected) {
- success_new = xcalloc(1, sizeof(*success_new));
- success_new->file = false;
- success_new->name = xstrdup(control->name);
- success_new->value = xstrdup(option->value);
- success_new->next = 0;
- last_success->next = success_new;
- last_success = success_new;
+ switch (control->type) {
+ case GADGET_HIDDEN:
+ case GADGET_TEXTBOX:
+ case GADGET_PASSWORD:
+ add_val = true;
+ break;
+
+ case GADGET_RADIO:
+ case GADGET_CHECKBOX:
+ /* ignore checkboxes and radio buttons which
+ * aren't selected
+ */
+ add_val = control->selected;
+ break;
+
+ case GADGET_SELECT:
+ /* select */
+ for (option = control->data.select.items;
+ option != NULL;
+ option = option->next) {
+ if (option->selected) {
+ success_new = xcalloc(1, sizeof(*success_new));
+ success_new->file = false;
+ success_new->name = cnv_str_local_enc(control->name);
+ success_new->value = cnv_str_local_enc(option->value);
+ success_new->next = NULL;
+ last_success->next = success_new;
+ last_success = success_new;
+ }
}
- }
- continue;
- }
-
- /* textarea */
- if (control->type == GADGET_TEXTAREA) {
- success_new = xcalloc(1, sizeof(*success_new));
- success_new->file = false;
- success_new->name = xstrdup(control->name);
- success_new->value = form_textarea_value(control);
- success_new->next = 0;
- last_success->next = success_new;
- last_success = success_new;
- continue;
- }
-
- /* image */
- if (control->type == GADGET_IMAGE) {
- unsigned int len = strlen(control->name) + 3;
- /* x */
- success_new = xcalloc(1, sizeof(*success_new));
- success_new->file = false;
- success_new->name = xcalloc(1, len);
- sprintf(success_new->name, "%s.x", control->name);
- success_new->value = xcalloc(1, 20);
- sprintf(success_new->value, "%i", control->data.image.mx);
- success_new->next = 0;
- last_success->next = success_new;
- last_success = success_new;
- /* y */
- success_new = xcalloc(1, sizeof(*success_new));
- success_new->file = false;
- success_new->name = xcalloc(1, len);
- sprintf(success_new->name, "%s.y", control->name);
- success_new->value = xcalloc(1, 20);
- sprintf(success_new->value, "%i", control->data.image.my);
- success_new->next = 0;
- last_success->next = success_new;
- last_success = success_new;
- }
- /* ignore reset */
- if (control->type == GADGET_RESET)
- continue;
+ add_val = false;
+ break;
+
+ case GADGET_TEXTAREA:
+ /* textarea */
+ success_new = xcalloc(1, sizeof(*success_new));
+ success_new->file = false;
+ success_new->name = cnv_str_local_enc(control->name);
+ success_new->value = form_textarea_value(control);
+ success_new->next = 0;
+ last_success->next = success_new;
+ last_success = success_new;
+
+ add_val = false;
+ break;
+
+ case GADGET_IMAGE: {
+ /* image */
+ const size_t len = strlen(control->name) + 3;
+
+ /* x */
+ success_new = xcalloc(1, sizeof(*success_new));
+ success_new->file = false;
+ success_new->name = xcalloc(1, len);
+ sprintf(success_new->name, "%s.x", control->name);
+ success_new->value = xcalloc(1, 20);
+ sprintf(success_new->value, "%i", control->data.image.mx);
+ success_new->next = 0;
+ last_success->next = success_new;
+ last_success = success_new;
+
+ /* y */
+ success_new = xcalloc(1, sizeof(*success_new));
+ success_new->file = false;
+ success_new->name = xcalloc(1, len);
+ sprintf(success_new->name, "%s.y", control->name);
+ success_new->value = xcalloc(1, 20);
+ sprintf(success_new->value, "%i", control->data.image.my);
+ success_new->next = 0;
+ last_success->next = success_new;
+ last_success = success_new;
+
+ add_val = false;
+ break;
+ }
- /* file */
- if (control->type == GADGET_FILE && control->value) {
- success_new = xcalloc(1, sizeof(*success_new));
- success_new->file = true;
- success_new->name = xstrdup(control->name);
- success_new->value = xstrdup(control->value);
- success_new->next = 0;
- last_success->next = success_new;
- last_success = success_new;
- continue;
+ case GADGET_SUBMIT:
+ /* only the activated submit button is
+ * successful
+ */
+ add_val = (control != submit_button) ? false : true;
+ break;
+
+ case GADGET_RESET:
+ /* ignore reset */
+ add_val = false;
+ break;
+
+ case GADGET_FILE:
+ /* file */
+ success_new = xcalloc(1, sizeof(*success_new));
+ success_new->file = true;
+ success_new->name = cnv_str_local_enc(control->name);
+ success_new->value = cnv_str_local_enc(control->value);
+ success_new->next = 0;
+ last_success->next = success_new;
+ last_success = success_new;
+
+ add_val = false;
+ break;
+
+ default:
+ assert(0);
+ break;
}
/* all others added if they have a value */
- if (control->value) {
+ if (add_val && control->value != NULL) {
success_new = xcalloc(1, sizeof(*success_new));
success_new->file = false;
- success_new->name = xstrdup(control->name);
- success_new->value = xstrdup(control->value);
- success_new->next = 0;
+ success_new->name = cnv_str_local_enc(control->name);
+ success_new->value = cnv_str_local_enc(control->value);
+ success_new->next = NULL;
last_success->next = success_new;
last_success = success_new;
}
@@ -228,10 +260,10 @@ char *form_textarea_value(struct form_control *textarea)
/* find required length */
for (inline_container = textarea->box->children;
- inline_container;
+ inline_container != NULL;
inline_container = inline_container->next) {
for (text_box = inline_container->children;
- text_box;
+ text_box != NULL;
text_box = text_box->next) {
len += text_box->length + 1;
}
@@ -241,10 +273,10 @@ char *form_textarea_value(struct form_control *textarea)
/* construct value */
s = value = xcalloc(1, len);
for (inline_container = textarea->box->children;
- inline_container;
+ inline_container != NULL;
inline_container = inline_container->next) {
for (text_box = inline_container->children;
- text_box;
+ text_box != NULL;
text_box = text_box->next) {
strncpy(s, text_box->text, text_box->length);
s += text_box->length;
@@ -269,14 +301,14 @@ char *form_url_encode(struct form_successful_control *control)
unsigned int len = 0, len1;
for (; control; control = control->next) {
- char *name = curl_escape(control->name, 0);
- char *value = curl_escape(control->value, 0);
+ const char *name = curl_escape(control->name, 0);
+ const char *value = curl_escape(control->value, 0);
len1 = len + strlen(name) + strlen(value) + 2;
s = xrealloc(s, len1 + 1);
sprintf(s + len, "%s=%s&", name, value);
len = len1;
- curl_free(name);
- curl_free(value);
+ curl_free(name);
+ curl_free(value);
}
if (len)
s[len - 1] = 0;