diff --git a/apps/webbrowser/html-strings b/apps/webbrowser/html-strings
index 5e10d41d4..0c9a7c99f 100644
--- a/apps/webbrowser/html-strings
+++ b/apps/webbrowser/html-strings
@@ -1,5 +1,4 @@
html_slasha "/a\0"
-html_slashcenter "/center\0"
html_slashdiv "/div\0"
html_slashform "/form\0"
html_slashh "/h\0"
@@ -9,7 +8,6 @@ html_slashstyle "/style\0"
html_a "a\0"
html_body "body\0"
html_br "br\0"
-html_center "center\0"
html_form "form\0"
html_frame "frame\0"
html_h1 "h1\0"
diff --git a/apps/webbrowser/html-strings.c b/apps/webbrowser/html-strings.c
index cb4b05629..567d9ce4a 100644
--- a/apps/webbrowser/html-strings.c
+++ b/apps/webbrowser/html-strings.c
@@ -1,9 +1,6 @@
const char html_slasha[4] =
/* "/a\0" */
{0x2f, 0x61, 00, };
-const char html_slashcenter[9] =
-/* "/center\0" */
-{0x2f, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 00, };
const char html_slashdiv[6] =
/* "/div\0" */
{0x2f, 0x64, 0x69, 0x76, 00, };
@@ -31,9 +28,6 @@ const char html_body[6] =
const char html_br[4] =
/* "br\0" */
{0x62, 0x72, 00, };
-const char html_center[8] =
-/* "center\0" */
-{0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 00, };
const char html_form[6] =
/* "form\0" */
{0x66, 0x6f, 0x72, 0x6d, 00, };
diff --git a/apps/webbrowser/html-strings.h b/apps/webbrowser/html-strings.h
index b10a78c59..ec8587997 100644
--- a/apps/webbrowser/html-strings.h
+++ b/apps/webbrowser/html-strings.h
@@ -1,5 +1,4 @@
extern const char html_slasha[4];
-extern const char html_slashcenter[9];
extern const char html_slashdiv[6];
extern const char html_slashform[7];
extern const char html_slashh[4];
@@ -9,7 +8,6 @@ extern const char html_slashstyle[8];
extern const char html_a[3];
extern const char html_body[6];
extern const char html_br[4];
-extern const char html_center[8];
extern const char html_form[6];
extern const char html_frame[7];
extern const char html_h1[4];
diff --git a/apps/webbrowser/htmlparser.c b/apps/webbrowser/htmlparser.c
index 79e2724c6..2e2727993 100644
--- a/apps/webbrowser/htmlparser.c
+++ b/apps/webbrowser/htmlparser.c
@@ -160,7 +160,6 @@ struct htmlparser_state {
#if WWW_CONF_FORMS
char formaction[WWW_CONF_MAX_FORMACTIONLEN];
- char formname[WWW_CONF_MAX_FORMNAMELEN];
unsigned char inputtype;
char inputname[WWW_CONF_MAX_INPUTNAMELEN];
char inputvalue[WWW_CONF_MAX_INPUTVALUELEN];
@@ -177,57 +176,53 @@ static const char *tags[] = {
#define TAG_FIRST 0
#define TAG_SLASHA 0
html_slasha,
-#define TAG_SLASHCENTER 1
- html_slashcenter,
-#define TAG_SLASHDIV 2
+#define TAG_SLASHDIV 1
html_slashdiv,
-#define TAG_SLASHFORM 3
+#define TAG_SLASHFORM 2
html_slashform,
-#define TAG_SLASHH 4
+#define TAG_SLASHH 3
html_slashh,
-#define TAG_SLASHSCRIPT 5
+#define TAG_SLASHSCRIPT 4
html_slashscript,
-#define TAG_SLASHSELECT 6
+#define TAG_SLASHSELECT 5
html_slashselect,
-#define TAG_SLASHSTYLE 7
+#define TAG_SLASHSTYLE 6
html_slashstyle,
-#define TAG_A 8
+#define TAG_A 7
html_a,
-#define TAG_BODY 9
+#define TAG_BODY 8
html_body,
-#define TAG_BR 10
+#define TAG_BR 9
html_br,
-#define TAG_CENTER 11
- html_center,
-#define TAG_FORM 12
+#define TAG_FORM 10
html_form,
-#define TAG_FRAME 13
+#define TAG_FRAME 11
html_frame,
-#define TAG_H1 14
+#define TAG_H1 12
html_h1,
-#define TAG_H2 15
+#define TAG_H2 13
html_h2,
-#define TAG_H3 16
+#define TAG_H3 14
html_h3,
-#define TAG_H4 17
+#define TAG_H4 15
html_h4,
-#define TAG_IMG 18
+#define TAG_IMG 16
html_img,
-#define TAG_INPUT 19
+#define TAG_INPUT 17
html_input,
-#define TAG_LI 20
+#define TAG_LI 18
html_li,
-#define TAG_P 21
+#define TAG_P 19
html_p,
-#define TAG_SCRIPT 22
+#define TAG_SCRIPT 20
html_script,
-#define TAG_SELECT 23
+#define TAG_SELECT 21
html_select,
-#define TAG_STYLE 24
+#define TAG_STYLE 22
html_style,
-#define TAG_TR 25
+#define TAG_TR 23
html_tr,
-#define TAG_LAST 26
+#define TAG_LAST 24
last,
};
@@ -258,7 +253,7 @@ htmlparser_init(void)
s.minorstate = MINORSTATE_TEXT;
s.lastchar = 0;
#if WWW_CONF_FORMS
- s.formaction[0] = s.formname[0] = 0;
+ s.formaction[0] = 0;
#endif /* WWW_CONF_FORMS */
}
/*-----------------------------------------------------------------------------------*/
@@ -336,31 +331,28 @@ find_tag(char *tag)
first = TAG_FIRST;
last = TAG_LAST;
i = 0;
-
+
do {
tagc = tag[i];
- if((tagc == 0 || tagc == ISO_slash) &&
- tags[first][i] == 0) {
+ if((tagc == 0 || tagc == ISO_slash) && tags[first][i] == 0) {
return first;
}
tabi = first;
-
+
/* First, find first matching tag from table. */
- while(tagc > (tags[tabi])[i] &&
- tabi < last) {
+ while(tagc > (tags[tabi])[i] && tabi < last) {
++tabi;
}
first = tabi;
-
+
/* Second, find last matching tag from table. */
- while(tagc == (tags[tabi])[i] &&
- tabi < last) {
+ while(tagc == (tags[tabi])[i] && tabi < last) {
++tabi;
}
last = tabi;
-
+
/* If first and last matching tags are equal, we have a non-match
and return. Else we continue with the next character. */
++i;
@@ -377,8 +369,7 @@ parse_tag(void)
static char dummy;
- PRINTF(("Parsing tag '%s' '%s' '%s'\n",
- s.tag, s.tagattr, s.tagattrparam));
+ PRINTF(("Parsing tag '%s' '%s' '%s'\n", s.tag, s.tagattr, s.tagattrparam));
switch(find_tag(s.tag)) {
case TAG_P:
@@ -386,14 +377,12 @@ parse_tag(void)
case TAG_H2:
case TAG_H3:
case TAG_H4:
- /* parse_char(ISO_nl);*/
newline();
/* FALLTHROUGH */
case TAG_BR:
case TAG_TR:
case TAG_SLASHDIV:
case TAG_SLASHH:
- /* parse_char(ISO_nl);*/
dummy = 0;
newline();
break;
@@ -417,8 +406,7 @@ parse_tag(void)
s.majorstate = s.lastmajorstate = MAJORSTATE_BODY;
break;
case TAG_FRAME:
- if(strncmp(s.tagattr, html_src, sizeof(html_src)) == 0 &&
- s.tagattrparam[0] != 0) {
+ if(strncmp(s.tagattr, html_src, sizeof(html_src)) == 0 && s.tagattrparam[0] != 0) {
switch_majorstate(MAJORSTATE_BODY);
newline();
add_char(ISO_rbrack);
@@ -430,25 +418,20 @@ parse_tag(void)
}
break;
case TAG_IMG:
- if(strncmp(s.tagattr, html_alt, sizeof(html_alt)) == 0 &&
- s.tagattrparam[0] != 0) {
- /* parse_char(ISO_lt);*/
+ if(strncmp(s.tagattr, html_alt, sizeof(html_alt)) == 0 && s.tagattrparam[0] != 0) {
add_char(ISO_lt);
tagattrparam = &s.tagattrparam[0];
while(*tagattrparam) {
- /* parse_char(*tagattrparam);*/
add_char(*tagattrparam);
++tagattrparam;
}
- /* parse_char(ISO_gt);*/
add_char(ISO_gt);
do_word();
}
break;
case TAG_A:
PRINTF(("A %s %s\n", s.tagattr, s.tagattrparam));
- if(strncmp(s.tagattr, html_href, sizeof(html_href)) == 0 &&
- s.tagattrparam[0] != 0) {
+ if(strncmp(s.tagattr, html_href, sizeof(html_href)) == 0 && s.tagattrparam[0] != 0) {
strcpy(s.linkurl, s.tagattrparam);
do_word();
switch_majorstate(MAJORSTATE_LINK);
@@ -464,72 +447,62 @@ parse_tag(void)
break;
#if WWW_CONF_FORMS
case TAG_FORM:
- PRINTF(("Form tag\n"));
- switch_majorstate(MAJORSTATE_FORM);
- if(strncmp(s.tagattr, html_action, sizeof(html_action)) == 0) {
- PRINTF(("Form action '%s'\n", s.tagattrparam));
- strncpy(s.formaction, s.tagattrparam, WWW_CONF_MAX_FORMACTIONLEN - 1);
- } else if(strncmp(s.tagattr, html_name, sizeof(html_name)) == 0) {
- PRINTF(("Form name '%s'\n", s.tagattrparam));
- strncpy(s.formname, s.tagattrparam, WWW_CONF_MAX_FORMNAMELEN - 1);
+ /* First check if we are called at the end of a form tag. If
+ so, we should propagate the form action. */
+ if(s.tagattr[0] == 0 && s.formaction[0] != 0) {
+ htmlparser_form(s.formaction);
+ init_input();
+ } else {
+ PRINTF(("Form tag\n"));
+ switch_majorstate(MAJORSTATE_FORM);
+ if(strncmp(s.tagattr, html_action, sizeof(html_action)) == 0) {
+ PRINTF(("Form action '%s'\n", s.tagattrparam));
+ strncpy(s.formaction, s.tagattrparam, WWW_CONF_MAX_FORMACTIONLEN - 1);
+ }
}
- init_input();
break;
case TAG_SLASHFORM:
switch_majorstate(MAJORSTATE_BODY);
- s.formaction[0] = s.formname[0] = 0;
+ s.formaction[0] = 0;
break;
case TAG_INPUT:
if(s.majorstate == MAJORSTATE_FORM) {
/* First check if we are called at the end of an input tag. If
so, we should render the input widget. */
- if(s.tagattr[0] == 0 &&
- s.inputname[0] != 0) {
+ if(s.tagattr[0] == 0 && s.inputname[0] != 0) {
PRINTF(("Render input type %d\n", s.inputtype));
switch(s.inputtype) {
case HTMLPARSER_INPUTTYPE_NONE:
case HTMLPARSER_INPUTTYPE_TEXT:
s.inputvalue[s.inputvaluesize] = 0;
- htmlparser_inputfield(s.inputvaluesize, s.inputvalue, s.inputname,
- s.formname, s.formaction);
+ htmlparser_inputfield(s.inputvaluesize, s.inputvalue, s.inputname);
break;
case HTMLPARSER_INPUTTYPE_SUBMIT:
case HTMLPARSER_INPUTTYPE_IMAGE:
- htmlparser_submitbutton(s.inputvalue, s.inputname,
- s.formname, s.formaction);
+ htmlparser_submitbutton(s.inputvalue, s.inputname);
break;
}
init_input();
} else {
PRINTF(("Input '%s' '%s'\n", s.tagattr, s.tagattrparam));
if(strncmp(s.tagattr, html_type, sizeof(html_type)) == 0) {
- if(strncmp(s.tagattrparam, html_submit,
- sizeof(html_submit)) == 0) {
+ if(strncmp(s.tagattrparam, html_submit, sizeof(html_submit)) == 0) {
s.inputtype = HTMLPARSER_INPUTTYPE_SUBMIT;
- } else if(strncmp(s.tagattrparam, html_image,
- sizeof(html_image)) == 0) {
+ } else if(strncmp(s.tagattrparam, html_image, sizeof(html_image)) == 0) {
s.inputtype = HTMLPARSER_INPUTTYPE_IMAGE;
- } else if(strncmp(s.tagattrparam, html_text,
- sizeof(html_text)) == 0) {
+ } else if(strncmp(s.tagattrparam, html_text, sizeof(html_text)) == 0) {
s.inputtype = HTMLPARSER_INPUTTYPE_TEXT;
} else {
s.inputtype = HTMLPARSER_INPUTTYPE_OTHER;
}
- } else if(strncmp(s.tagattr, html_name,
- sizeof(html_name)) == 0) {
- strncpy(s.inputname, s.tagattrparam,
- WWW_CONF_MAX_INPUTNAMELEN);
- } else if(strncmp(s.tagattr, html_alt,
- sizeof(html_alt)) == 0 &&
+ } else if(strncmp(s.tagattr, html_name, sizeof(html_name)) == 0) {
+ strncpy(s.inputname, s.tagattrparam, WWW_CONF_MAX_INPUTNAMELEN);
+ } else if(strncmp(s.tagattr, html_alt, sizeof(html_alt)) == 0 &&
s.inputtype == HTMLPARSER_INPUTTYPE_IMAGE) {
- strncpy(s.inputvalue, s.tagattrparam,
- WWW_CONF_MAX_INPUTVALUELEN);
- } else if(strncmp(s.tagattr, html_value,
- sizeof(html_value)) == 0) {
- strncpy(s.inputvalue, s.tagattrparam,
- WWW_CONF_MAX_INPUTVALUELEN);
- } else if(strncmp(s.tagattr, html_size,
- sizeof(html_size)) == 0) {
+ strncpy(s.inputvalue, s.tagattrparam, WWW_CONF_MAX_INPUTVALUELEN);
+ } else if(strncmp(s.tagattr, html_value, sizeof(html_value)) == 0) {
+ strncpy(s.inputvalue, s.tagattrparam, WWW_CONF_MAX_INPUTVALUELEN);
+ } else if(strncmp(s.tagattr, html_size, sizeof(html_size)) == 0) {
size = 0;
if(s.tagattrparam[0] >= '0' &&
s.tagattrparam[0] <= '9') {
@@ -543,32 +516,15 @@ parse_tag(void)
size = WWW_CONF_MAX_INPUTVALUELEN - 1;
}
s.inputvaluesize = size;
- /* strncpy(s.inputvalue, s.tagattrparam,
- WWW_CONF_MAX_INPUTVALUELEN);*/
}
}
-
}
break;
-#endif /* WWW_CONF_FORMS */
-#if WWW_CONF_RENDERSTATE
- case TAG_CENTER:
- /* parse_char(ISO_nl); */
- newline();
- htmlparser_renderstate(HTMLPARSER_RENDERSTATE_BEGIN |
- HTMLPARSER_RENDERSTATE_CENTER);
- break;
- case TAG_SLASHCENTER:
- /* parse_char(ISO_nl);*/
- newline();
- htmlparser_renderstate(HTMLPARSER_RENDERSTATE_END |
- HTMLPARSER_RENDERSTATE_CENTER);
- break;
-#endif /* WWW_CONF_RENDERSTATE */
+#endif /* WWW_CONF_FORMS */
}
}
/*-----------------------------------------------------------------------------------*/
-static uint16_t
+static uint16_t CC_FASTCALL
parse_word(char *data, uint8_t dlen)
{
static uint8_t i;
@@ -586,7 +542,6 @@ parse_word(char *data, uint8_t dlen)
} else if(c == ISO_lt) {
s.minorstate = MINORSTATE_TAG;
s.tagptr = 0;
- /* do_word();*/
break;
} else if(c == ISO_ampersand) {
s.minorstate = MINORSTATE_EXTCHAR;
@@ -599,11 +554,11 @@ parse_word(char *data, uint8_t dlen)
case MINORSTATE_EXTCHAR:
for(i = 0; i < len; ++i) {
c = data[i];
- if(c == ISO_semicolon) {
+ if(c == ISO_semicolon) {
s.minorstate = MINORSTATE_TEXT;
add_char(' ');
break;
- } else if(iswhitespace(c)) {
+ } else if(iswhitespace(c)) {
s.minorstate = MINORSTATE_TEXT;
add_char('&');
add_char(' ');
@@ -622,7 +577,7 @@ parse_word(char *data, uint8_t dlen)
/* Full tag found. We continue parsing regular text. */
s.minorstate = MINORSTATE_TEXT;
s.tagattrptr = s.tagattrparamptr = 0;
- endtagfound();
+ endtagfound();
parse_tag();
break;
} else if(iswhitespace(c)) {
@@ -635,7 +590,6 @@ parse_word(char *data, uint8_t dlen)
} else {
/* Keep track of the name of the tag, but convert it to
lower case. */
-
s.tag[s.tagptr] = lowercase(c);
++s.tagptr;
/* Check if the ->tag field is full. If so, we just eat up
@@ -645,7 +599,7 @@ parse_word(char *data, uint8_t dlen)
break;
}
}
-
+
/* Check for HTML comment, indicated by