Index: [Article Count Order] [Thread]

Date:  Fri, 06 Apr 2001 10:26:19 +0900
From:  aito@ei5sun.yz.yamagata-u.ac.jp
Subject:  [w3m-dev 01898] Handling of arbitrary number of <select> and <textarea>
To:  w3m-dev@mi.med.tohoku.ac.jp
Message-Id:  <200104060126.VAA11439@ei5hp710.yz.yamagata-u.ac.jp>
X-Mail-Count: 01898

あ伊藤です.

あるページで<select>の数が100を越えていて(私が作ったページ
なんだ,これが),Too many select in one page になってしまい
ました.ちょっと悲しかったので,1ページ内の select と,
ついでに textarea の制限をなくしてみました.
--
山形大学工学部 情報科学科  伊藤 彰則
Akinori Ito, Dr.Eng.
Department of Informatics, Faculty of Engineering
Yamagata University
tel&fax: 0238-26-3369   E-mail: aito@eie.yz.yamagata-u.ac.jp

--- file.c.org	Wed Mar 28 17:51:31 2001
+++ file.c	Fri Apr  6 09:28:58 2001
@@ -59,16 +59,18 @@
 static int cur_status;
 #ifdef MENU_SELECT
 /* menu based <select>  */
-FormSelectOption select_option[MAX_SELECT];
+FormSelectOption *select_option;
+static int max_select = MAX_SELECT;
 static int n_select;
 static int cur_option_maxwidth;
 #endif				/* MENU_SELECT */
 
 static Str cur_textarea;
-Str textarea_str[MAX_TEXTAREA];
+Str *textarea_str;
 static int cur_textarea_size;
 static int cur_textarea_rows;
 static int n_textarea;
+static int max_textarea = MAX_TEXTAREA;
 
 static int http_response_code;
 
@@ -2372,7 +2374,7 @@
     select_is_multiple = parsedtag_exists(tag, ATTR_MULTIPLE);
 	
 #ifdef MENU_SELECT
-    if (!select_is_multiple && n_select < MAX_SELECT) {
+    if (!select_is_multiple) {
 #ifdef NEW_FORM
 	select_str = Sprintf("<pre_int>[<input_alt hseq=\"%d\" "
 		"fid=\"%d\" type=select name=\"%s\" selectnumber=%d",
@@ -2401,15 +2403,22 @@
 	return NULL;
     process_option();
 #ifdef MENU_SELECT
-    if (!select_is_multiple && n_select < MAX_SELECT) {
+    if (!select_is_multiple) {
 	if (select_option[n_select].first)
 	    Strcat(select_str, textfieldrep(chooseSelectOption(
 		select_option[n_select].first, CHOOSE_OPTION),
 		cur_option_maxwidth));
 	Strcat_charp(select_str, "</input_alt>]</pre_int>");
 	n_select++;
-	if (n_select == MAX_SELECT) {
+	if (n_select == max_select) {
+	    FormSelectOption *p = select_option;
+	    int n = max_select*2;
+	    select_option = New_N(FormSelectOption,n);
+	    bcopy(p,select_option,max_select*sizeof(FormSelectOption));
+	    max_select = n;
+/*	    
 	    disp_err_message("Too many select in one page", FALSE);
+*/
 	}
     } else
 #endif				/* MENU_SELECT */
@@ -2498,7 +2507,7 @@
     if (cur_option_label == NULL)
 	cur_option_label = cur_option;
 #ifdef MENU_SELECT
-    if (!select_is_multiple && n_select < MAX_SELECT) {
+    if (!select_is_multiple) {
 	if (cur_option_label->length > cur_option_maxwidth)
 	    cur_option_maxwidth = cur_option_label->length;
 	addSelectOption(&select_option[n_select],
@@ -2536,6 +2545,16 @@
     n_selectitem++;
 }
 
+static void
+expand_textarea_str()
+{
+    Str *s = textarea_str;
+    int n = max_textarea;
+    max_textarea *= 2;
+    textarea_str = New_N(Str,max_textarea);
+    bcopy(s,textarea_str,n*sizeof(Str));
+}
+
 Str
 process_textarea(struct parsed_tag * tag, int width)
 {
@@ -2556,8 +2575,9 @@
 	cur_textarea_size = 40;
 
     cur_textarea_rows = atoi(r);
-    if (n_textarea < MAX_TEXTAREA)
-	textarea_str[n_textarea] = Strnew();
+    if (n_textarea >= max_textarea)
+	expand_textarea_str();
+    textarea_str[n_textarea] = Strnew();
 
     return NULL;
 }
@@ -2567,7 +2587,7 @@
 {
     Str tmp;
 
-    if (cur_textarea == NULL || n_textarea >= MAX_TEXTAREA)
+    if (cur_textarea == NULL || n_textarea >= max_textarea)
 	return NULL;
 
 #ifdef NEW_FORM
@@ -2584,11 +2604,13 @@
     Strcat(tmp, textfieldrep(textarea_str[n_textarea], cur_textarea_size));
     Strcat_charp(tmp, "</u></input_alt>]</pre_int>");
     n_textarea++;
-    if (n_textarea == MAX_TEXTAREA) {
+    if (n_textarea == max_textarea) {
+	expand_textarea_str();
+/*
 	disp_err_message("Too many textarea in one page", FALSE);
+*/
     }
-    else
-	textarea_str[n_textarea] = Strnew();
+    textarea_str[n_textarea] = Strnew();
     cur_textarea = NULL;
 
     return tmp;
@@ -2597,17 +2619,15 @@
 void
 feed_textarea(char *str)
 {
-    if (n_textarea < MAX_TEXTAREA) {
-	while (*str) {
-	    if (*str == '&')
-		Strcat_charp(textarea_str[n_textarea], getescapecmd(&str));
-	    else if (*str == '\n') {
-		Strcat_charp(textarea_str[n_textarea], "\r\n");
-		str++;
-	    }
-	    else
-		Strcat_char(textarea_str[n_textarea], *(str++));
+    while (*str) {
+	if (*str == '&')
+	    Strcat_charp(textarea_str[n_textarea], getescapecmd(&str));
+	else if (*str == '\n') {
+	    Strcat_charp(textarea_str[n_textarea], "\r\n");
+	    str++;
 	}
+	else
+	    Strcat_char(textarea_str[n_textarea], *(str++));
     }
 }
 
@@ -4717,8 +4737,12 @@
 
     n_textarea = 0;
     cur_textarea = NULL;
+    max_textarea = MAX_TEXTAREA;
+    textarea_str = New_N(Str,max_textarea);
 #ifdef MENU_SELECT
     n_select = 0;
+    max_select = MAX_SELECT;
+    select_option = New_N(FormSelectOption,max_select);
 #endif				/* MENU_SELECT */
     cur_select = NULL;
     form_sp = -1;
--- form.c.org	Fri Apr  6 10:20:07 2001
+++ form.c	Fri Apr  6 10:19:33 2001
@@ -16,9 +16,9 @@
 #define lstat stat
 #endif				/* __EMX__ */
 
-extern Str textarea_str[];
+extern Str *textarea_str;
 #ifdef MENU_SELECT
-extern FormSelectOption select_option[];
+extern FormSelectOption *select_option;
 #include "menu.h"
 #endif				/* MENU_SELECT */
 
--- form.h.org	Fri Mar 23 10:49:53 2001
+++ form.h	Fri Apr  6 10:27:15 2001
@@ -32,10 +32,10 @@
 #define FORM_ENCTYPE_URLENCODED 0
 #define FORM_ENCTYPE_MULTIPART  1
 
-#define MAX_TEXTAREA 100	/* max number of * <textarea>..</textarea> 
+#define MAX_TEXTAREA 10		/* max number of * <textarea>..</textarea> 
 				 * within one * document */
 #ifdef MENU_SELECT
-#define MAX_SELECT 100		/* max number of <select>..</select> *
+#define MAX_SELECT 10		/* max number of <select>..</select> *
 				 * within one document */
 #endif				/* MENU_SELECT */
 
    

[Next]