/*
* html2hdml
*
* Coprygight (C) 2000-2003 Dino Co.,Ltd.
* http://www.dino.co.jp/
*/
#ifdef HAVE_CONFIG_H
# include
#endif
#include
#include
#include
#include
#include "html2hdml.h"
#include "strinput.h"
int add_header_and_footer(void);
int convert_A(char *stago, char *elemname, char **attr, char *tagc);
int convert_A_(char *stago, char *elemname, char **attr, char *tagc);
int convert_IMG(char *stago, char *elemname, char **attr, char *tagc);
int convert_INPUT(char *stago, char *elemname, char **attr, char *tagc);
int convert_SELECT(char *stago, char *elemname, char **attr, char *tagc);
int convert_OPTION(char *stago, char *elemname, char **attr, char *tagc);
int convert_FORM(char *stago, char *elemname, char **attr, char *tagc);
int convert_FORM_(char *stago, char *elemname, char **attr, char *tagc);
int convert_TEXTAREA(char *stago, char *elemname, char **attr, char *tagc);
int convert_TEXTAREA_(char *stago, char *elemname, char **attr, char *tagc);
int convert_PRE(char *stago, char *elemname, char **attr, char *tagc);
int convert_PRE_(char *stago, char *elemname, char **attr, char *tagc);
int convert_CENTER(char *stago, char *elemname, char **attr, char *tagc);
int convert_CENTER_(char *stago, char *elemname, char **attr, char *tagc);
int convert_BASE(char *stago, char *elemname, char **attr, char *tagc);
char *base_url(char *href);
char *replace_docomochar(char *str);
int convert_text(char *text);
int convert_ret(void);
int convert_comment(char *text);
char *remove_quote(unsigned char *str);
char *url_encode(unsigned char *str);
int add_text_card(void);
int add_cb_card(void); /* check box */
int add_rb_card(void); /* radio button */
int add_reset_card(int formnum);
int gl_cardnum;
int gl_formnum;
int gl_text_card;
int gl_cb_card;
int gl_rb_card;
int gl_reset_card;
char *gl_form_dest = NULL;
char *gl_form_method = NULL;
char *gl_select_init = NULL;
char *gl_select_1st_var = NULL;
char *gl_select_selected_var = NULL;
int gl_already_selected = 0;
int gl_printed_last_a = 0;
int gl_beginning_of_line = 1;
int gl_in_pre = 0;
int gl_align = 0;
int gl_last_align = 0;
#define ALIGN_LEFT 0
#define ALIGN_CENTER 1
#define ALIGN_RIGHT 2
char *gl_base_abs = NULL;
char *gl_base_rel = NULL;
int init_cardnum(void)
{
gl_cardnum = 0;
gl_formnum = 0;
gl_text_card = 0;
gl_cb_card = 0;
gl_rb_card = 0;
gl_reset_card = 0;
return 0;
}
/* MUST REFINE */
char *url_double_encode(unsigned char *str)
{
unsigned char *p1, *p2;
unsigned char *ret;
ret = my_malloc(sizeof(char)*(strlen(str)*5+1));
p1 = str;
p2 = ret;
while (*p1 != '\0') {
if (*p1 <= 0x1f || *p1 >= 0x7f || *p1 == '\'' || *p1 == '+' ||
*p1 == '$' || *p1 == '%' || *p1 == '&' || *p1 == ';') {
sprintf(p2, "%%25%02X", (int)*p1);
p1++;
p2 += 5;
} else if (*p1 == ' ') {
*p2 = '+';
p1++;
p2++;
} else {
*p2 = *p1;
p1++;
p2++;
}
}
*p2 = *p1;
return ret;
}
/* MUST REFINE */
char *url_encode(unsigned char *str)
{
unsigned char *p1, *p2;
unsigned char *ret;
ret = my_malloc(sizeof(char)*(strlen(str)*3+1));
p1 = str;
p2 = ret;
while (*p1 != '\0') {
if (*p1 <= 0x1f || *p1 >= 0x7f || *p1 == '\'' || *p1 == '+' ||
*p1 == '$' || *p1 == '%' || *p1 == '&' || *p1 == ';') {
sprintf(p2, "%%%02X", (int)*p1);
p1++;
p2 += 3;
} else if (*p1 == ' ') {
*p2 = '+';
p1++;
p2++;
} else {
*p2 = *p1;
p1++;
p2++;
}
}
*p2 = *p1;
return ret;
}
/* return quoting char: [\0\'\"] */
char *remove_quote(unsigned char *str)
{
unsigned char print_buf[BUFFER_SIZE];
unsigned char qc = '\0';
unsigned char *p;
if (str == NULL) return NULL;
p = print_buf;
if (*str == '"' || *str == '\'') {
qc = *str;
str++;
}
while (*str) {
if (*str == '"' || *str == '\'') {
if (*str == qc && *(str+1) == '\0') {
break;
}
sprintf(p, "%%%02X", (int)*str);
p += 3;
} else {
*p = *str;
p++;
}
str++;
}
*p = '\0';
return my_strdup(print_buf);
}
int add_header_and_footer(void)
{
add_piece(enum_begin,
"\n");
if (gl_cardnum) {
if ((gl_reset_card == 1) && (gl_formnum == 1)) {
add_piece(enum_begin,
"\n"
"\n"
"\n");
} else {
add_piece(enum_begin,
"\n"
"\n"
"\n");
add_piece(enum_header,
"\n"
"\n"
"\n");
}
}
/* MARKABLE="TRUE" ??? */
if (gl_cardnum) {
add_piece(enum_header, "\n");
} else {
add_piece(enum_header, " TITLE='");
append_varlist(enum_header, enum_title, 0);
add_piece(enum_header, "'>\n");
}
add_piece(enum_body,
"\n");
add_piece(enum_footer,
"\n");
return 0;
}
/* MUST REFINE */
char *replace_docomochar(char *str)
{
unsigned char *p;
p = str;
while (*p != '\0') {
if (*p == 0xf8 || *p == 0xf9) {
/* docomo picture */
*p = ' ';
p++;
if (*p >= 0x40 && *p <= 0xfc) {
*p = ' ';
p++;
}
} else if ((*p >= 0x81 && *p <= 0x9f) ||
(*p >= 0xe0 && *p <= 0xfc)) {
/* sjis 1st byte */
p++;
if (*p >= 0x40 && *p <= 0xfc) {
/* sjis 2nd byte */
p++;
}
} else {
p++;
}
}
return str;
}
int block_boundary(void)
{
if (gl_beginning_of_line == 0) {
/* last line isn't ended. insert
. */
if (gl_align) {
add_piece(enum_body, "
\n");
} else {
add_piece(enum_body, "
");
}
gl_beginning_of_line = 1;
}
return 0;
}
int alignment(void)
{
if (gl_beginning_of_line && is_current_output(enum_body)) {
if (gl_align == ALIGN_CENTER) {
add_piece(enum_body, "");
} else if (gl_align == ALIGN_RIGHT) {
add_piece(enum_body, "");
}
}
gl_beginning_of_line = 0;
return 0;
}
int convert_text(char *text)
{
char *p = NULL, *enc_p = NULL;
/* p = replace_docomochar(text); */
p = text;
alignment();
if (is_current_output(enum_select)) {
enc_p = url_encode(p);
add_piece(enum_select, enc_p);
add_piece(enum_footer, p);
my_free(enc_p);
} else {
add_piece(enum_current, p);
if (!is_current_output(enum_title)) {
gl_beginning_of_line = 0;
}
}
my_free(p);
return 0;
}
int convert_ret(void)
{
if (is_current_output(enum_select)) {
add_piece(enum_footer, "\n");
} else if (is_current_output(enum_title) ||
is_current_output(enum_textarea)) {
/* no output */
;
} else if (gl_align) {
/* center of right */
add_piece(enum_current, " ");
} else if (gl_in_pre && is_current_output(enum_body)) {
alignment();
add_piece(enum_current, "
\n");
gl_beginning_of_line = 1;
} else {
add_piece(enum_current, "\n");
}
return 0;
}
int convert_spc(char *spc)
{
if (is_current_output(enum_select)) {
add_piece(enum_select, spc);
add_piece(enum_footer, spc);
} else if (gl_in_pre) {
char *buf, *p, *p1;
int i = 0;
alignment();
buf = my_malloc(sizeof(char)*(strlen(spc)*6*8+1));
p = buf;
p1 = spc;
while (*p1) {
if (*p1 == ' ') {
i++;
sprintf(p, " ");
p += 6;
} else if (*p1 == '\t') {
sprintf(p, "%.*s", (8 - (i % 8))*6 ,
" ");
p += (8 - (i % 8))*6;
}
p1++;
}
add_piece(enum_current, buf);
} else {
add_piece(enum_current, spc);
}
return 0;
}
int convert_comment(char *text)
{
return 0;
}
int convert_BR(char *stago, char *elemname, char **attr, char *tagc)
{
if (gl_align) {
/* center or right */
add_piece(enum_body, "
\n");
} else {
add_piece(enum_body, "
");
}
gl_beginning_of_line = 1;
return 0;
}
int convert_HR(char *stago, char *elemname, char **attr, char *tagc)
{
block_boundary();
add_piece(enum_body, "--------------
");
return 0;
}
int convert_P(char *stago, char *elemname, char **attr, char *tagc)
{
char *align = NULL;
block_boundary();
align = remove_quote(attr[(int)enum_ALIGN]); /* ALIGN */
if (align) {
if (strcmpi(align, "center") == 0) {
gl_last_align = gl_align;
gl_align = ALIGN_CENTER;
} else if (strcmpi(align, "right") == 0) {
gl_last_align = gl_align;
gl_align = ALIGN_RIGHT;
} else {
/* illegal :> */
gl_last_align = gl_align;
gl_align = ALIGN_LEFT;
}
my_free(align);
} else {
/* no attribute "align" : keep current state */
gl_last_align = gl_align;
}
return 0;
}
int convert_P_(char *stago, char *elemname, char **attr, char *tagc)
{
block_boundary();
add_piece(enum_current, "
\n");
gl_align = gl_last_align;
gl_last_align = ALIGN_LEFT;
return 0;
}
int convert_A(char *stago, char *elemname, char **attr, char *tagc)
{
char *href = NULL, *enc_href = NULL, *akey = NULL, *base = NULL;
char *p;
/* char qc; */ /* quoting character: [\0\'\"] */
char print_buf[BUFFER_SIZE];
alignment();
akey = remove_quote(attr[(int)enum_ACCESSKEY]); /* HREF */
if (akey && !(isdigit(*akey))) {
my_free(akey);
akey = NULL;
}
href = remove_quote(attr[(int)enum_HREF]); /* HREF */
if (href == NULL) return 0; /* no HREF attribute. ignore. */
if (*href == '#') {
my_free(href);
return 0; /* link to same page. ignore. */
}
p = strchr(href, '#');
if (p) {
/* link to another page. */
/* ignore #label in URL */
*p = '\0';
} else {
/* searching last char of URL */
p = strchr(href, '\0');
}
if (gl_convertopt.a_href_html2hdml == 1) {
/* now p points last char excluding quotation one */
if ((strlen(href) >= 5) && strncmp(p-5, ".html", 5) == 0) {
strncpy(p-5, ".hdml", 5);
} else if ((strlen(href) >= 4) && strncmp(p-4, ".htm", 4) == 0) {
strncpy(p-4, ".hdm", 4);
}
}
if (href) {
enc_href = url_encode(href);
/* if (qc) value--; */
/* my_free(value) */
}
if (strncmpi(enc_href, "mailto:", 7) == 0) {
char *p, *p2;
char *to = NULL, *subj = NULL, *mt = NULL;
int size;
p = strchr(enc_href + 7, '?');
if (p == NULL) {
/* no "?" */
to = my_strdup(enc_href+7);
} else {
/* p points "?" */
if (p == enc_href + 7) {
/* no mail address specified */
} else {
size = p - (enc_href+7);
to = my_malloc(sizeof(char)*(size+1));
strncpy(to, enc_href+7, size);
to[size] = '\0';
}
p++;
while (*p) {
if (strncmpi(p, "subject=", 8) == 0) {
p2 = strchr(p, '&');
if (p2 == NULL) p2 = strchr(p, '\0');
size = p2 - (p+8);
subj = my_malloc(sizeof(char)*(size+1));
strncpy(subj, p+8, size);
subj[size] = '\0';
} else if (strncmpi(p, "body=", 5) == 0) {
p2 = strchr(p, '&');
if (p2 == NULL) p2 = strchr(p, '\0');
size = p2 - (p+5);
mt = my_malloc(sizeof(char)*(size+1));
strncpy(mt, p+5, size);
mt[size] = '\0';
} else {
p2 = strchr(p, '&');
if (p2 == NULL) p2 = strchr(p, '\0');
}
if (*p2 == '&') p2++;
p = p2;
}
}
#ifndef ENABLE_UPMAIL
// for @Mail
strcpy(print_buf, "");
#else
// for Up.Mail
sprintf(print_buf,
"");
#endif
/*
"",
mailto:090@docomo.ne.jp?subject=Yahoo!mobile&body=http://mobile.yahoo.co.jp
mailto:?subject=DAIMEI&body=NAIYO
TO
SUBJ
MT
*/
} else if (strncmpi(href, "tel:", 4) == 0) {
sprintf(print_buf,
/*
"",
*/
"",
href+4);
} else {
/* normal link: */
base = base_url(enc_href);
if (base == NULL) base = "";
if (akey) {
sprintf(print_buf,
"%s%s task=gosub accesskey='%c' dest='%s%s'%s",
stago, elemname, *akey, base, enc_href, tagc);
} else {
sprintf(print_buf,
"%s%s task=gosub dest='%s%s'%s",
stago, elemname, base, enc_href, tagc);
}
}
gl_printed_last_a = 1;
add_piece(enum_body, print_buf);
my_free(href); my_free(enc_href); my_free(akey);
return 0;
}
int convert_A_(char *stago, char *elemname, char **attr, char *tagc)
{
char print_buf[BUFFER_SIZE];
alignment();
if (gl_printed_last_a == 1) {
sprintf(print_buf, "%s%s%s", stago, elemname, tagc); /**/
add_piece(enum_body, print_buf);
} else if (gl_printed_last_a == 2) {
sprintf(print_buf, "%saction%s", stago, tagc); /**/
add_piece(enum_body, print_buf);
}
gl_printed_last_a = 0;
return 0;
}
int convert_IMG(char *stago, char *elemname, char **attr, char *tagc)
{
char print_buf[BUFFER_SIZE];
char *src, *alt, *base;
char *p;
alignment();
src = remove_quote(attr[(int)enum_SRC]); /* SRC */
alt = remove_quote(attr[(int)enum_ALT]); /* ALT */
if (src) {
if (gl_convertopt.img_src_gif2bmp == 1) {
p = strchr(src, '\0');
/* now p points last char excluding quotation one */
if ((strlen(src) >= 3) && strncmp(p-3, ".gif", 3) == 0) {
strncpy(p-3, ".bmp", 3);
}
}
base = base_url(src);
if (base == NULL) base = "";
if (gl_convertopt.img_alt == 1) {
if (alt) {
sprintf(print_buf,
"[%s]", alt);
}
} else {
if (alt) {
sprintf(print_buf,
"%s%s src='%s%s' alt='%s'%s",
stago, elemname, base, src, alt, tagc);
} else {
sprintf(print_buf,
"%s%s src='%s%s'%s",
stago, elemname, base, src, tagc);
}
}
if (gl_convertopt.img == 1) {
add_piece(enum_body, print_buf);
}
}
return 0;
}
int convert_FORM(char *stago, char *elemname, char **attr, char *tagc)
{
char *p1, *p2, *p3;
gl_formnum++;
reset_varlist(enum_reset);
reset_varlist(enum_submit);
/* discard infomation of previous form */
my_free(gl_form_dest);
my_free(gl_form_method);
gl_form_dest = gl_form_method = NULL;
/* must refine... */
p1 = remove_quote(attr[(int)enum_ACTION]);
if (p1 == NULL) {
/* gl_form_dest = NULL; */
} else {
p2 = base_url(p1);
if (p2) {
p3 = my_malloc((strlen(p2)+strlen(p1)+1)*sizeof(char));
sprintf(p3, "%s%s", p2, p1);
my_free(p1); my_free(p2);
gl_form_dest = p3;
} else {
gl_form_dest = p1;
}
}
gl_form_method = remove_quote(attr[(int)enum_METHOD]);
if (!gl_form_method) {
gl_form_method = my_strdup("get");
}
return 0;
}
int convert_FORM_(char *stago, char *elemname, char **attr, char *tagc)
{
my_free(gl_form_dest);
my_free(gl_form_method);
gl_form_dest = gl_form_method = NULL;
reset_varlist(enum_reset);
reset_varlist(enum_submit);
return 0;
}
int convert_TEXTAREA(char *stago, char *elemname, char **attr, char *tagc)
{
char print_str[BUFFER_SIZE];
char *name;
alignment();
name = remove_quote(attr[(int)enum_NAME]); /* NAME */
gl_cardnum++;
/*****************/
/*** print tag ***/
/*****************/
sprintf(print_str,
"$v%d",
gl_cardnum, gl_cardnum);
add_piece_with_sp_char(enum_body, print_str);
/******************/
/*** print card ***/
/******************/
add_text_card();
/*********************************/
/*** add init & reset variable ***/
/*********************************/
reset_varlist(enum_textarea);
sprintf(print_str, "$v%d=", gl_cardnum);
add_piece_with_sp_char(enum_textarea, print_str);
/***************************/
/*** add submit variable ***/
/***************************/
if (name) {
sprintf(print_str, "%s=$v%d&", name, gl_cardnum);
add_piece_with_sp_char(enum_submit, print_str);
}
return 0;
}
int convert_TEXTAREA_(char *stago, char *elemname, char **attr, char *tagc)
{
catdup_varlist(enum_init, enum_textarea);
catdup_varlist(enum_reset, enum_textarea);
reset_varlist(enum_textarea);
add_piece(enum_init, "&");
add_piece(enum_reset, "&");
return 0;
}
int convert_PRE(char *stago, char *elemname, char **attr, char *tagc)
{
block_boundary();
gl_in_pre = 1;
return 0;
}
int convert_PRE_(char *stago, char *elemname, char **attr, char *tagc)
{
block_boundary();
gl_in_pre = 0;
return 0;
}
int convert_CENTER(char *stago, char *elemname, char **attr, char *tagc)
{
block_boundary();
gl_last_align = gl_align;
gl_align = ALIGN_CENTER;
return 0;
}
int convert_CENTER_(char *stago, char *elemname, char **attr, char *tagc)
{
block_boundary();
gl_align = gl_last_align;
gl_last_align = ALIGN_LEFT;
return 0;
}
int convert_INPUT(char *stago, char *elemname, char **attr, char *tagc)
{
/* char *str;*/
char *p;
char *name, *value, *enc_value = NULL;
char *checked;
/* char qc; */ /* quoting character: [\0\'\"] */
/* int len = 0;*/
char print_str[BUFFER_SIZE];
enum inputtype type;
int radio_cardnum = -1; /* -1: error state */
alignment();
strcpy(print_str, "");
gl_cardnum++;
p = attr[(int)enum_TYPE]; /* TYPE */
if (p) {
p = remove_quote(p);
}
if ((p == NULL) || strcmpi(p, "text") == 0) {
type = enum_TEXT;
} else if (strcmpi(p, "password") == 0) {
type = enum_PASSWORD;
} else if (strcmpi(p, "checkbox") == 0) {
type = enum_CHECKBOX;
} else if (strcmpi(p, "radio") == 0) {
type = enum_RADIO;
} else if (strcmpi(p, "hidden") == 0) {
type = enum_HIDDEN;
} else if (strcmpi(p, "submit") == 0 || strcmpi(p, "image") == 0) {
type = enum_SUBMIT;
} else if (strcmpi(p, "reset") == 0) {
type = enum_RESET;
} else {
/* type = enum_UNKNOWNTYPE;*/
type = enum_TEXT;
}
free (p);
value = remove_quote(attr[(int)enum_VALUE]); /* VALUE */
name = remove_quote(attr[(int)enum_NAME]); /* NAME */
checked = remove_quote(attr[(int)enum_CHECKED]); /* CHECKED */
/*************************/
/*** set default value ***/
/*************************/
switch (type) {
case enum_RADIO:
radio_cardnum = find_radionum(name);
if (radio_cardnum == -1) {
/* name == NULL || name not found */
radio_cardnum = gl_cardnum;
add_radionum(name, gl_cardnum);
}
/* FALL TO NEXT */
case enum_CHECKBOX:
if (value == NULL) value = "on";
break;
case enum_SUBMIT:
if (value == NULL) value = "submit"; /* label of a button */
break;
case enum_RESET:
if (value == NULL) value = "reset"; /* label of a button */
break;
default:
break;
}
if (value) {
enc_value = url_encode(value);
/* if (qc) value--; */
/* my_free(value) */
}
/*****************/
/*** print tag ***/
/*****************/
switch (type) {
case enum_TEXT:
case enum_PASSWORD:
sprintf(print_str,
"$v%d",
gl_cardnum, gl_cardnum);
break;
case enum_CHECKBOX:
if (name) {
sprintf(print_str,
"$t%d",
gl_cardnum, gl_cardnum, gl_cardnum,
name, enc_value, gl_cardnum);
} else {
sprintf(print_str,
"$t%d",
gl_cardnum, gl_cardnum, gl_cardnum);
}
break;
case enum_RADIO:
if (name) {
sprintf(print_str,
"$t%d",
gl_cardnum, radio_cardnum, radio_cardnum, gl_cardnum,
name, enc_value, radio_cardnum, gl_cardnum, gl_cardnum);
} else {
sprintf(print_str,
"$t%d",
gl_cardnum, gl_cardnum);
}
break;
case enum_SUBMIT:
if (gl_form_dest) {
if (strcmpi(gl_form_method, "get") == 0) {
sprintf(print_str,
"%s", name, enc_value, value);
} else {
append_varlist(enum_body, enum_submit, 1);
sprintf(print_str, "'>%s", value);
}
}
break;
case enum_RESET:
sprintf(print_str, "%s",
gl_formnum, value);
break;
default:
break;
}
add_piece_with_sp_char(enum_body, print_str);
/******************/
/*** print card ***/
/******************/
switch (type) {
case enum_TEXT:
case enum_PASSWORD:
add_text_card();
break;
case enum_CHECKBOX:
add_cb_card();
break;
case enum_RADIO:
add_rb_card();
break;
case enum_HIDDEN:
break;
case enum_SUBMIT:
break;
case enum_RESET:
add_reset_card(gl_formnum);
break;
default:
break;
}
/*************************/
/*** add init variable ***/
/*************************/
strcpy(print_str, "");
switch (type) {
case enum_TEXT:
case enum_PASSWORD:
if (name) {
/* $v1=value */
sprintf(print_str, "v%d=%s&", gl_cardnum,
enc_value ? enc_value: "");
}
break;
case enum_CHECKBOX:
sprintf(print_str, "t%d=%s&",
gl_cardnum, checked ? "x" : "" );
if (name) {
char *p;
p = strchr(print_str, '\0');
if (checked) {
/* e1=name=value& & */
sprintf(p, "e%d=%s%%3d%s%%26&",
gl_cardnum, name, enc_value);
} else {
/* e1= & */
sprintf(p, "e%d=&", gl_cardnum);
}
}
break;
case enum_RADIO:
sprintf(print_str, "t%d=%s&",
gl_cardnum, checked ? "o" : "");
if (checked) {
char *p;
p = strchr(print_str, '\0');
sprintf(p, "x%d=%d&" "e%d=&",
radio_cardnum, gl_cardnum,
radio_cardnum);
if (name) {
p = strchr(print_str, '\0');
p--;
sprintf(p, "%s%%3d%s%%26&", name, enc_value);
}
}
break;
default:
break;
}
if (strcmp(print_str, "") != 0) {
add_piece(enum_init, print_str);
add_piece(enum_reset, print_str);
}
/**************************/
/*** add reset variable ***/
/**************************/
strcpy(print_str, "");
switch (type) {
case enum_TEXT:
case enum_PASSWORD:
break;
case enum_CHECKBOX:
break;
case enum_RADIO:
break;
default:
break;
}
if (strcmp(print_str, "") != 0) {
add_piece(enum_reset, print_str);
}
/***************************/
/*** add submit variable ***/
/***************************/
strcpy(print_str, "");
if (name) {
switch (type) {
case enum_TEXT:
case enum_PASSWORD:
/* name=$v1 */
sprintf(print_str, "%s=$v%d&", name, gl_cardnum);
break;
case enum_CHECKBOX:
/* $e1 */
/* I THINK there's no need for ':noesc'... */
/*sprintf(print_str, "$e%d", gl_cardnum);*/
sprintf(print_str, "$(e%d:noesc)", gl_cardnum);
break;
case enum_RADIO:
/* $e1 */
/* I THINK there's no need for ':noesc'... */
/*sprintf(print_str, "$e%d", gl_cardnum);*/
if (radio_cardnum == gl_cardnum) {
sprintf(print_str, "$(e%d:noesc)", radio_cardnum);
}
break;
case enum_HIDDEN:
/* name=$v1 */
sprintf(print_str, "%s=%s&", name, enc_value);
break;
default:
break;
}
}
if (strcmp(print_str, "") != 0) {
add_piece_with_sp_char(enum_submit, print_str);
}
return 0;
}
int convert_SELECT_(char *stago, char *elemname, char **attr, char *tagc)
{
alignment();
add_piece(enum_footer, "\n");
/*
fprintf(stderr, "%s\n", gl_select_1st_var);
*/
if (gl_select_1st_var) {
gl_already_selected = 0;
if (gl_select_selected_var == NULL) {
gl_select_selected_var = gl_select_1st_var;
} else {
my_free(gl_select_1st_var);
}
gl_select_1st_var = NULL;
add_piece(enum_init, gl_select_selected_var);
add_piece(enum_reset, gl_select_selected_var);
my_free(gl_select_selected_var);
gl_select_selected_var = NULL;
catdup_varlist(enum_init, enum_select_selected);
catdup_varlist(enum_reset, enum_select_selected);
reset_varlist(enum_select_selected);
add_piece(enum_init, "&");
add_piece(enum_reset, "&");
} else {
/* huh? */
}
return 0;
}
int convert_SELECT(char *stago, char *elemname, char **attr, char *tagc)
{
/* char *str; */
/* char *p; */
char *name = NULL;
/* char qc; */ /* quoting character: [\0\'\"] */
/* int len = 0; */
char print_str[BUFFER_SIZE];
alignment();
strcpy(print_str, "");
name = remove_quote(attr[(int)enum_NAME]);
gl_cardnum++;
/*************************/
/*** set default value ***/
/*************************/
/*****************/
/*** print tag ***/
/*****************/
sprintf(print_str,
"$t%d",
gl_cardnum, gl_cardnum, gl_cardnum, gl_cardnum);
add_piece_with_sp_char(enum_body, print_str);
sprintf(print_str,
"\n",
gl_cardnum);
add_piece(enum_footer, print_str);
/*************************/
/*** add init variable ***/
/*************************/
strcpy(print_str, "");
if (strcmp(print_str, "") != 0) {
add_piece(enum_init, print_str);
add_piece(enum_reset, print_str);
}
/**************************/
/*** add reset variable ***/
/**************************/
strcpy(print_str, "");
if (strcmp(print_str, "") != 0) {
add_piece(enum_reset, print_str);
}
/***************************/
/*** add submit variable ***/
/***************************/
if (name) {
sprintf(print_str, "%s=$(v%d:noesc)&", name, gl_cardnum);
add_piece_with_sp_char(enum_submit, print_str);
}
my_free(name);
return 0;
}
int convert_OPTION(char *stago, char *elemname, char **attr, char *tagc)
{
char *value, *enc_value = NULL;
char *selected;
char print_str[BUFFER_SIZE];
alignment();
value = remove_quote(attr[(int)enum_VALUE]); /* VALUE */
if (value == NULL) value = "";
selected = attr[(int)enum_SELECTED]; /* SELECTED */
if (value) {
enc_value = url_double_encode(value);
}
/*************************/
/*** set default value ***/
/*************************/
/*************************/
/*** add init variable ***/
/*************************/
/* v1= & t1= */
sprintf(print_str, "v%d=%s&" "t%d=",
gl_cardnum, enc_value,
gl_cardnum);
if (gl_select_1st_var == NULL) {
gl_select_1st_var = my_strdup(print_str);
set_select_selected();
}
if (!gl_already_selected && selected) {
gl_already_selected = 1;
gl_select_selected_var = my_strdup(print_str);
set_select_selected();
}
/*
if (strcmp(print_str, "") != 0) {
add_piece(enum_init, print_str);
add_piece(enum_reset, print_str);
}
*/
/**************************/
/*** add reset variable ***/
/**************************/
strcpy(print_str, "");
if (!selected) {
/* t1= */
/* sprintf(print_str, "t%d=&", gl_cardnum); */
/* e0= & x0= */
}
if (strcmp(print_str, "") != 0) {
add_piece(enum_reset, print_str);
}
/*****************/
/*** print tag ***/
/*****************/
if (is_current_output(enum_select)) {
sprintf(print_str,
"");
}
return 0;
}
int convert_BASE(char *stago, char *elemname, char **attr, char *tagc)
{
char *href, *p1, *p2;
int len;
href = remove_quote(attr[(int)enum_HREF]); /* HREF */
if (href == NULL) return 0;
p1 = strstr(href, ":/");
p2 = strchr(href, '/');
if (p1 == NULL) return 0;
if (p2 < p1) return 0;
/* p2 = p1+1 */
while (*p2 == '/') p2++;
p2 = strchr(p2, '/');
if (p2 == NULL) {
p2 = strchr(href, '\0');
}
len = p2-href;
p1 = my_malloc((len+1)*sizeof(char));
strncpy(p1, href, len);
p1[len] = '\0';
gl_base_abs = p1;
if (*p2 == '\0') {
len++;
p1 = my_malloc((len+1)*sizeof(char));
strncpy(p1, href, len-1);
p1[len-1] = '/';
p1[len] = '\0';
} else {
p2 = strrchr(p2, '/');
len = p2-href+1;
p1 = my_malloc((len+1)*sizeof(char));
strncpy(p1, href, len);
p1[len] = '\0';
}
gl_base_rel = p1;
/*
fprintf(stderr, "%s\n", gl_base_abs);
fprintf(stderr, "%s\n", gl_base_rel);
*/
return 0;
}
/* return appropriate BASE string (see convert_BASE().)*/
char *base_url(char *href)
{
if (href == NULL) {
return NULL;
} else if (strstr(href, "://")) {
return NULL;
} else if (href[0] == '/') {
if (gl_base_abs) return gl_base_abs;
else return NULL;
} else {
if (gl_base_rel) return gl_base_rel;
else return NULL;
}
return 0;
}
int add_text_card(void)
{
if (!gl_text_card) {
char *text_card = "\n"
"\n"
"\n";
gl_text_card = 1;
add_piece_with_sp_char(enum_footer, text_card);
}
return 0;
}
int add_cb_card(void)
{
if (!gl_cb_card) {
char *cb_card = "\n"
"\n"
"\n"
"\n"
"\n"
"\n";
gl_cb_card = 1;
add_piece_with_sp_char(enum_footer, cb_card);
}
return 0;
}
int add_rb_card(void)
{
if (!gl_rb_card) {
char *rb_card = "\n"
"\n"
"\n"
"\n"
"\n"
"\n";
gl_rb_card = 1;
add_piece_with_sp_char(enum_footer, rb_card);
}
return 0;
}
int add_reset_card(int formnum)
{
char *format_str = "\n"
"\n\n");
my_free(print_str);
}
return 0;
}