diff options
author | Tatsuya Kinoshita <tats@vega.ocn.ne.jp> | 2011-05-04 07:05:14 +0000 |
---|---|---|
committer | Tatsuya Kinoshita <tats@vega.ocn.ne.jp> | 2011-05-04 07:05:14 +0000 |
commit | 72f72d64a422d6628c4796f5c0bf2e508f134214 (patch) | |
tree | 0c9ea90cc53310832c977265521fb44db24a515e /rc.c | |
parent | Adding upstream version 0.3 (diff) | |
download | w3m-72f72d64a422d6628c4796f5c0bf2e508f134214.tar.gz w3m-72f72d64a422d6628c4796f5c0bf2e508f134214.zip |
Adding upstream version 0.5.1upstream/0.5.1
Diffstat (limited to 'rc.c')
-rw-r--r-- | rc.c | 1482 |
1 files changed, 1482 insertions, 0 deletions
@@ -0,0 +1,1482 @@ +/* $Id: rc.c,v 1.96 2004/04/22 16:34:08 ukai Exp $ */ +/* + * Initialization file etc. + */ +#include "fm.h" +#include "myctype.h" +#include "proto.h" +#include <stdio.h> +#include <errno.h> +#include "parsetag.h" +#include "local.h" +#include <stdlib.h> + +struct param_ptr { + char *name; + int type; + int inputtype; + void *varptr; + char *comment; + void *select; +}; + +struct param_section { + char *name; + struct param_ptr *params; +}; + +struct rc_search_table { + struct param_ptr *param; + short uniq_pos; +}; + +static struct rc_search_table *RC_search_table; +static int RC_table_size; + +#define P_INT 0 +#define P_SHORT 1 +#define P_CHARINT 2 +#define P_CHAR 3 +#define P_STRING 4 +#if defined(USE_SSL) && defined(USE_SSL_VERIFY) +#define P_SSLPATH 5 +#endif +#ifdef USE_COLOR +#define P_COLOR 6 +#endif +#ifdef USE_M17N +#define P_CODE 7 +#endif +#define P_PIXELS 8 +#define P_NZINT 9 +#define P_SCALE 10 + +/* FIXME: gettextize here */ +#ifdef USE_M17N +static wc_ces OptionCharset = WC_CES_US_ASCII; /* FIXME: charset of source code */ +static int OptionEncode = FALSE; +#endif + +#define CMT_HELPER N_("External Viewer Setup") +#define CMT_TABSTOP N_("Tab width in characters") +#define CMT_INDENT_INCR N_("Indent for HTML rendering") +#define CMT_PIXEL_PER_CHAR N_("Number of pixels per character (4.0...32.0)") +#define CMT_PIXEL_PER_LINE N_("Number of pixels per line (4.0...64.0)") +#define CMT_PAGERLINE N_("Number of remembered lines when used as a pager") +#define CMT_HISTORY N_("Use URL history") +#define CMT_HISTSIZE N_("Number of remembered URL") +#define CMT_SAVEHIST N_("Save URL history") +#define CMT_FRAME N_("Render frames automatically") +#define CMT_ARGV_IS_URL N_("Treat argument without scheme as URL") +#define CMT_TSELF N_("Use _self as default target") +#define CMT_OPEN_TAB_BLANK N_("Open link on new tab if target is _blank or _new") +#define CMT_OPEN_TAB_DL_LIST N_("Open download list panel on new tab") +#define CMT_DISPLINK N_("Display link URL automatically") +#define CMT_DECODE_URL N_("Display decoded URL") +#define CMT_DISPLINEINFO N_("Display current line number") +#define CMT_DISP_IMAGE N_("Display inline images") +#ifdef USE_IMAGE +#define CMT_AUTO_IMAGE N_("Load inline images automatically") +#define CMT_MAX_LOAD_IMAGE N_("Maximum processes for parallel image loading") +#define CMT_EXT_IMAGE_VIEWER N_("Use external image viewer") +#define CMT_IMAGE_SCALE N_("Scale of image (%)") +#define CMT_IMGDISPLAY N_("External command to display image") +#define CMT_IMAGE_MAP_LIST N_("Use link list of image map") +#endif +#define CMT_MULTICOL N_("Display file names in multi-column format") +#define CMT_ALT_ENTITY N_("Use ASCII equivalents to display entities") +#define CMT_GRAPHIC_CHAR N_("Use graphic char for border of table and menu") +#define CMT_FOLD_TEXTAREA N_("Fold lines in TEXTAREA") +#define CMT_DISP_INS_DEL N_("Display DEL, S and STRIKE element") +#define CMT_COLOR N_("Display with color") +#define CMT_B_COLOR N_("Color of normal character") +#define CMT_A_COLOR N_("Color of anchor") +#define CMT_I_COLOR N_("Color of image link") +#define CMT_F_COLOR N_("Color of form") +#define CMT_ACTIVE_STYLE N_("Enable coloring of active link") +#define CMT_C_COLOR N_("Color of currently active link") +#define CMT_VISITED_ANCHOR N_("Use visited link color") +#define CMT_V_COLOR N_("Color of visited link") +#define CMT_BG_COLOR N_("Color of background") +#define CMT_MARK_COLOR N_("Color of mark") +#define CMT_USE_PROXY N_("Use proxy") +#define CMT_HTTP_PROXY N_("URL of HTTP proxy host") +#ifdef USE_SSL +#define CMT_HTTPS_PROXY N_("URL of HTTPS proxy host") +#endif /* USE_SSL */ +#ifdef USE_GOPHER +#define CMT_GOPHER_PROXY N_("URL of GOPHER proxy host") +#endif /* USE_GOPHER */ +#define CMT_FTP_PROXY N_("URL of FTP proxy host") +#define CMT_NO_PROXY N_("Domains to be accessed directly (no proxy)") +#define CMT_NOPROXY_NETADDR N_("Check noproxy by network address") +#define CMT_NO_CACHE N_("Disable cache") +#ifdef USE_NNTP +#define CMT_NNTP_SERVER N_("News server") +#define CMT_NNTP_MODE N_("Mode of news server") +#define CMT_MAX_NEWS N_("Number of news messages") +#endif +#define CMT_DNS_ORDER N_("Order of name resolution") +#define CMT_DROOT N_("Directory corresponding to / (document root)") +#define CMT_PDROOT N_("Directory corresponding to /~user") +#define CMT_CGIBIN N_("Directory corresponding to /cgi-bin") +#define CMT_CONFIRM_QQ N_("Confirm when quitting with q") +#define CMT_CLOSE_TAB_BACK N_("Close tab if buffer is last when back") +#ifdef USE_MARK +#define CMT_USE_MARK N_("Enable mark operations") +#endif +#define CMT_EMACS_LIKE_LINEEDIT N_("Enable Emacs-style line editing") +#define CMT_VI_PREC_NUM N_("Enable vi-like numeric prefix") +#define CMT_LABEL_TOPLINE N_("Move cursor to top line when going to label") +#define CMT_NEXTPAGE_TOPLINE N_("Move cursor to top line when moving to next page") +#define CMT_FOLD_LINE N_("Fold lines of plain text file") +#define CMT_SHOW_NUM N_("Show line numbers") +#define CMT_SHOW_SRCH_STR N_("Show search string") +#define CMT_MIMETYPES N_("List of mime.types files") +#define CMT_MAILCAP N_("List of mailcap files") +#define CMT_URIMETHODMAP N_("List of urimethodmap files") +#define CMT_EDITOR N_("Editor") +#define CMT_MAILER N_("Mailer") +#define CMT_EXTBRZ N_("External Browser") +#define CMT_EXTBRZ2 N_("Second External Browser") +#define CMT_EXTBRZ3 N_("Third External Browser") +#define CMT_DISABLE_SECRET_SECURITY_CHECK N_("Disable secret file security check") +#define CMT_PASSWDFILE N_("Password file") +#define CMT_PRE_FORM_FILE N_("File for setting form on loading") +#define CMT_FTPPASS N_("Password for anonymous FTP (your mail address)") +#define CMT_FTPPASS_HOSTNAMEGEN N_("Generate domain part of password for FTP") +#define CMT_USERAGENT N_("User-Agent identification string") +#define CMT_ACCEPTENCODING N_("Accept-Encoding header") +#define CMT_ACCEPTMEDIA N_("Accept header") +#define CMT_ACCEPTLANG N_("Accept-Language header") +#define CMT_MARK_ALL_PAGES N_("Treat URL-like strings as links in all pages") +#define CMT_WRAP N_("Wrap search") +#define CMT_VIEW_UNSEENOBJECTS N_("Display unseen objects (e.g. bgimage tag)") +#ifdef __EMX__ +#define CMT_BGEXTVIEW N_("Run external viewer in a separate session") +#else +#define CMT_BGEXTVIEW N_("Run external viewer in the background") +#endif +#define CMT_EXT_DIRLIST N_("Use external program for directory listing") +#define CMT_DIRLIST_CMD N_("URL of directory listing command") +#ifdef USE_DICT +#define CMT_USE_DICTCOMMAND N_("Enable dictionary lookup through CGI") +#define CMT_DICTCOMMAND N_("URL of dictionary lookup command") +#endif /* USE_DICT */ +#define CMT_IGNORE_NULL_IMG_ALT N_("Display link name for images lacking ALT") +#define CMT_IFILE N_("Index file for directories") +#define CMT_RETRY_HTTP N_("Prepend http:// to URL automatically") +#define CMT_DEFAULT_URL N_("Default value for open-URL command") +#define CMT_DECODE_CTE N_("Decode Content-Transfer-Encoding when saving") +#define CMT_PRESERVE_TIMESTAMP N_("Preserve timestamp when saving") +#ifdef USE_MOUSE +#define CMT_MOUSE N_("Enable mouse") +#define CMT_REVERSE_MOUSE N_("Scroll in reverse direction of mouse drag") +#define CMT_RELATIVE_WHEEL_SCROLL N_("Behavior of wheel scroll speed") +#define CMT_RELATIVE_WHEEL_SCROLL_RATIO N_("(A only)Scroll by # (%) of screen") +#define CMT_FIXED_WHEEL_SCROLL_COUNT N_("(B only)Scroll by # lines") +#endif /* USE_MOUSE */ +#define CMT_CLEAR_BUF N_("Free memory of undisplayed buffers") +#define CMT_NOSENDREFERER N_("Suppress `Referer:' header") +#define CMT_IGNORE_CASE N_("Search case-insensitively") +#define CMT_USE_LESSOPEN N_("Use LESSOPEN") +#ifdef USE_SSL +#ifdef USE_SSL_VERIFY +#define CMT_SSL_VERIFY_SERVER N_("Perform SSL server verification") +#define CMT_SSL_CERT_FILE N_("PEM encoded certificate file of client") +#define CMT_SSL_KEY_FILE N_("PEM encoded private key file of client") +#define CMT_SSL_CA_PATH N_("Path to directory for PEM encoded certificates of CAs") +#define CMT_SSL_CA_FILE N_("File consisting of PEM encoded certificates of CAs") +#endif /* USE_SSL_VERIFY */ +#define CMT_SSL_FORBID_METHOD N_("List of forbidden SSL methods (2: SSLv2, 3: SSLv3, t:TLSv1)") +#endif /* USE_SSL */ +#ifdef USE_COOKIE +#define CMT_USECOOKIE N_("Enable cookie processing") +#define CMT_ACCEPTCOOKIE N_("Accept cookies") +#define CMT_ACCEPTBADCOOKIE N_("Action to be taken on invalid cookie") +#define CMT_COOKIE_REJECT_DOMAINS N_("Domains to reject cookies from") +#define CMT_COOKIE_ACCEPT_DOMAINS N_("Domains to accept cookies from") +#endif +#define CMT_FOLLOW_REDIRECTION N_("Number of redirections to follow") +#define CMT_META_REFRESH N_("Enable processing of meta-refresh tag") + +#ifdef USE_MIGEMO +#define CMT_USE_MIGEMO N_("Enable Migemo (Roma-ji search)") +#define CMT_MIGEMO_COMMAND N_("Migemo command") +#endif /* USE_MIGEMO */ + +#ifdef USE_M17N +#define CMT_DISPLAY_CHARSET N_("Display charset") +#define CMT_DOCUMENT_CHARSET N_("Default document charset") +#define CMT_AUTO_DETECT N_("Automatic charset detect when loading") +#define CMT_SYSTEM_CHARSET N_("System charset") +#define CMT_FOLLOW_LOCALE N_("System charset follows locale(LC_CTYPE)") +#define CMT_EXT_HALFDUMP N_("Output halfdump with display charset") +#define CMT_USE_WIDE N_("Use multi column characters") +#define CMT_USE_COMBINING N_("Use combining characters") +#define CMT_USE_LANGUAGE_TAG N_("Use Unicode language tags") +#define CMT_UCS_CONV N_("Charset conversion using Unicode map") +#define CMT_PRE_CONV N_("Charset conversion when loading") +#define CMT_SEARCH_CONV N_("Adjust search string for document charset") +#define CMT_FIX_WIDTH_CONV N_("Fix character width when conversion") +#define CMT_USE_GB12345_MAP N_("Use GB 12345 Unicode map instead of GB 2312's") +#define CMT_USE_JISX0201 N_("Use JIS X 0201 Roman for ISO-2022-JP") +#define CMT_USE_JISC6226 N_("Use JIS C 6226:1978 for ISO-2022-JP") +#define CMT_USE_JISX0201K N_("Use JIS X 0201 Katakana") +#define CMT_USE_JISX0212 N_("Use JIS X 0212:1990 (Supplemental Kanji)") +#define CMT_USE_JISX0213 N_("Use JIS X 0213:2000 (2000JIS)") +#define CMT_STRICT_ISO2022 N_("Strict ISO-2022-JP/KR/CN") +#define CMT_GB18030_AS_UCS N_("Treat 4 bytes char. of GB18030 as Unicode") +#endif + +#define CMT_KEYMAP_FILE N_("keymap file") + +#define PI_TEXT 0 +#define PI_ONOFF 1 +#define PI_SEL_C 2 +#ifdef USE_M17N +#define PI_CODE 3 +#endif + +struct sel_c { + int value; + char *cvalue; + char *text; +}; + +#ifdef USE_COLOR +static struct sel_c colorstr[] = { + {0, "black", N_("black")}, + {1, "red", N_("red")}, + {2, "green", N_("green")}, + {3, "yellow", N_("yellow")}, + {4, "blue", N_("blue")}, + {5, "magenta", N_("magenta")}, + {6, "cyan", N_("cyan")}, + {7, "white", N_("white")}, + {8, "terminal", N_("terminal")}, + {0, NULL, NULL} +}; +#endif /* USE_COLOR */ + +#if 1 /* ANSI-C ? */ +#define N_STR(x) #x +#define N_S(x) (x), N_STR(x) +#else /* for traditional cpp? */ +static char n_s[][2] = { + {'0', 0}, + {'1', 0}, + {'2', 0}, +}; +#define N_S(x) (x), n_s[(x)] +#endif + + +static struct sel_c defaulturls[] = { + {N_S(DEFAULT_URL_EMPTY), N_("none")}, + {N_S(DEFAULT_URL_CURRENT), N_("current URL")}, + {N_S(DEFAULT_URL_LINK), N_("link URL")}, + {0, NULL, NULL} +}; + +#ifdef USE_MOUSE +static struct sel_c wheelmode[] = { + {TRUE, "1", N_("A:relative to screen height")}, + {FALSE, "0", N_("B:fixed speed")}, + {0, NULL, NULL} +}; +#endif /* MOUSE */ + +#ifdef INET6 +static struct sel_c dnsorders[] = { + {N_S(DNS_ORDER_UNSPEC), "unspecified"}, + {N_S(DNS_ORDER_INET_INET6), "inet inet6"}, + {N_S(DNS_ORDER_INET6_INET), "inet6 inet"}, + {N_S(DNS_ORDER_INET_ONLY), "inet only"}, + {N_S(DNS_ORDER_INET6_ONLY), "inet6 only"}, + {0, NULL, NULL} +}; +#endif /* INET6 */ + +#ifdef USE_COOKIE +static struct sel_c badcookiestr[] = { + {N_S(ACCEPT_BAD_COOKIE_DISCARD), "discard"}, +#if 0 + {N_S(ACCEPT_BAD_COOKIE_ACCEPT), "accept"}, +#endif + {N_S(ACCEPT_BAD_COOKIE_ASK), "ask"}, + {0, NULL, NULL} +}; +#endif /* USE_COOKIE */ + +#ifdef USE_M17N +static wc_ces_list *display_charset_str = NULL; +static wc_ces_list *document_charset_str = NULL; +static wc_ces_list *system_charset_str = NULL; +static struct sel_c auto_detect_str[] = { + {N_S(WC_OPT_DETECT_OFF), "OFF"}, + {N_S(WC_OPT_DETECT_ISO_2022), "Only ISO 2022"}, + {N_S(WC_OPT_DETECT_ON), "ON"}, + {0, NULL, NULL} +}; +#endif + +struct param_ptr params1[] = { + {"tabstop", P_NZINT, PI_TEXT, (void *)&Tabstop, CMT_TABSTOP, NULL}, + {"indent_incr", P_NZINT, PI_TEXT, (void *)&IndentIncr, CMT_INDENT_INCR, + NULL}, + {"pixel_per_char", P_PIXELS, PI_TEXT, (void *)&pixel_per_char, + CMT_PIXEL_PER_CHAR, NULL}, +#ifdef USE_IMAGE + {"pixel_per_line", P_PIXELS, PI_TEXT, (void *)&pixel_per_line, + CMT_PIXEL_PER_LINE, NULL}, +#endif + {"frame", P_CHARINT, PI_ONOFF, (void *)&RenderFrame, CMT_FRAME, NULL}, + {"target_self", P_CHARINT, PI_ONOFF, (void *)&TargetSelf, CMT_TSELF, NULL}, + {"open_tab_blank", P_INT, PI_ONOFF, (void *)&open_tab_blank, + CMT_OPEN_TAB_BLANK, NULL}, + {"open_tab_dl_list", P_INT, PI_ONOFF, (void *)&open_tab_dl_list, + CMT_OPEN_TAB_DL_LIST, NULL}, + {"display_link", P_INT, PI_ONOFF, (void *)&displayLink, CMT_DISPLINK, + NULL}, + {"decode_url", P_INT, PI_ONOFF, (void *)&DecodeURL, CMT_DECODE_URL, NULL}, + {"display_lineinfo", P_INT, PI_ONOFF, (void *)&displayLineInfo, + CMT_DISPLINEINFO, NULL}, + {"ext_dirlist", P_INT, PI_ONOFF, (void *)&UseExternalDirBuffer, + CMT_EXT_DIRLIST, NULL}, + {"dirlist_cmd", P_STRING, PI_TEXT, (void *)&DirBufferCommand, + CMT_DIRLIST_CMD, NULL}, +#ifdef USE_DICT + {"use_dictcommand", P_INT, PI_ONOFF, (void *)&UseDictCommand, + CMT_USE_DICTCOMMAND, NULL}, + {"dictcommand", P_STRING, PI_TEXT, (void *)&DictCommand, + CMT_DICTCOMMAND, NULL}, +#endif /* USE_DICT */ + {"multicol", P_INT, PI_ONOFF, (void *)&multicolList, CMT_MULTICOL, NULL}, + {"alt_entity", P_CHARINT, PI_ONOFF, (void *)&UseAltEntity, CMT_ALT_ENTITY, + NULL}, + {"graphic_char", P_CHARINT, PI_ONOFF, (void *)&UseGraphicChar, + CMT_GRAPHIC_CHAR, NULL}, + {"fold_textarea", P_CHARINT, PI_ONOFF, (void *)&FoldTextarea, + CMT_FOLD_TEXTAREA, NULL}, + {"display_ins_del", P_INT, PI_ONOFF, (void *)&displayInsDel, + CMT_DISP_INS_DEL, NULL}, + {"ignore_null_img_alt", P_INT, PI_ONOFF, (void *)&ignore_null_img_alt, + CMT_IGNORE_NULL_IMG_ALT, NULL}, + {"view_unseenobject", P_INT, PI_ONOFF, (void *)&view_unseenobject, + CMT_VIEW_UNSEENOBJECTS, NULL}, + /* XXX: emacs-w3m force to off display_image even if image options off */ + {"display_image", P_INT, PI_ONOFF, (void *)&displayImage, CMT_DISP_IMAGE, + NULL}, +#ifdef USE_IMAGE + {"auto_image", P_INT, PI_ONOFF, (void *)&autoImage, CMT_AUTO_IMAGE, NULL}, + {"max_load_image", P_INT, PI_TEXT, (void *)&maxLoadImage, + CMT_MAX_LOAD_IMAGE, NULL}, + {"ext_image_viewer", P_INT, PI_ONOFF, (void *)&useExtImageViewer, + CMT_EXT_IMAGE_VIEWER, NULL}, + {"image_scale", P_SCALE, PI_TEXT, (void *)&image_scale, CMT_IMAGE_SCALE, + NULL}, + {"imgdisplay", P_STRING, PI_TEXT, (void *)&Imgdisplay, CMT_IMGDISPLAY, + NULL}, + {"image_map_list", P_INT, PI_ONOFF, (void *)&image_map_list, + CMT_IMAGE_MAP_LIST, NULL}, +#endif + {"fold_line", P_INT, PI_ONOFF, (void *)&FoldLine, CMT_FOLD_LINE, NULL}, + {"show_lnum", P_INT, PI_ONOFF, (void *)&showLineNum, CMT_SHOW_NUM, NULL}, + {"show_srch_str", P_INT, PI_ONOFF, (void *)&show_srch_str, + CMT_SHOW_SRCH_STR, NULL}, + {"label_topline", P_INT, PI_ONOFF, (void *)&label_topline, + CMT_LABEL_TOPLINE, NULL}, + {"nextpage_topline", P_INT, PI_ONOFF, (void *)&nextpage_topline, + CMT_NEXTPAGE_TOPLINE, NULL}, + {NULL, 0, 0, NULL, NULL, NULL}, +}; + +#ifdef USE_COLOR +struct param_ptr params2[] = { + {"color", P_INT, PI_ONOFF, (void *)&useColor, CMT_COLOR, NULL}, + {"basic_color", P_COLOR, PI_SEL_C, (void *)&basic_color, CMT_B_COLOR, + (void *)colorstr}, + {"anchor_color", P_COLOR, PI_SEL_C, (void *)&anchor_color, CMT_A_COLOR, + (void *)colorstr}, + {"image_color", P_COLOR, PI_SEL_C, (void *)&image_color, CMT_I_COLOR, + (void *)colorstr}, + {"form_color", P_COLOR, PI_SEL_C, (void *)&form_color, CMT_F_COLOR, + (void *)colorstr}, +#ifdef USE_BG_COLOR + {"mark_color", P_COLOR, PI_SEL_C, (void *)&mark_color, CMT_MARK_COLOR, + (void *)colorstr}, + {"bg_color", P_COLOR, PI_SEL_C, (void *)&bg_color, CMT_BG_COLOR, + (void *)colorstr}, +#endif /* USE_BG_COLOR */ + {"active_style", P_INT, PI_ONOFF, (void *)&useActiveColor, + CMT_ACTIVE_STYLE, NULL}, + {"active_color", P_COLOR, PI_SEL_C, (void *)&active_color, CMT_C_COLOR, + (void *)colorstr}, + {"visited_anchor", P_INT, PI_ONOFF, (void *)&useVisitedColor, + CMT_VISITED_ANCHOR, NULL}, + {"visited_color", P_COLOR, PI_SEL_C, (void *)&visited_color, CMT_V_COLOR, + (void *)colorstr}, + {NULL, 0, 0, NULL, NULL, NULL}, +}; +#endif /* USE_COLOR */ + + +struct param_ptr params3[] = { + {"pagerline", P_NZINT, PI_TEXT, (void *)&PagerMax, CMT_PAGERLINE, NULL}, +#ifdef USE_HISTORY + {"use_history", P_INT, PI_ONOFF, (void *)&UseHistory, CMT_HISTORY, NULL}, + {"history", P_INT, PI_TEXT, (void *)&URLHistSize, CMT_HISTSIZE, NULL}, + {"save_hist", P_INT, PI_ONOFF, (void *)&SaveURLHist, CMT_SAVEHIST, NULL}, +#endif /* USE_HISTORY */ + {"confirm_qq", P_INT, PI_ONOFF, (void *)&confirm_on_quit, CMT_CONFIRM_QQ, + NULL}, + {"close_tab_back", P_INT, PI_ONOFF, (void *)&close_tab_back, + CMT_CLOSE_TAB_BACK, NULL}, +#ifdef USE_MARK + {"mark", P_INT, PI_ONOFF, (void *)&use_mark, CMT_USE_MARK, NULL}, +#endif + {"emacs_like_lineedit", P_INT, PI_ONOFF, (void *)&emacs_like_lineedit, + CMT_EMACS_LIKE_LINEEDIT, NULL}, + {"vi_prec_num", P_INT, PI_ONOFF, (void *)&vi_prec_num, CMT_VI_PREC_NUM, + NULL}, + {"mark_all_pages", P_INT, PI_ONOFF, (void *)&MarkAllPages, + CMT_MARK_ALL_PAGES, NULL}, + {"wrap_search", P_INT, PI_ONOFF, (void *)&WrapDefault, CMT_WRAP, NULL}, + {"ignorecase_search", P_INT, PI_ONOFF, (void *)&IgnoreCase, + CMT_IGNORE_CASE, NULL}, +#ifdef USE_MIGEMO + {"use_migemo", P_INT, PI_ONOFF, (void *)&use_migemo, CMT_USE_MIGEMO, + NULL}, + {"migemo_command", P_STRING, PI_TEXT, (void *)&migemo_command, + CMT_MIGEMO_COMMAND, NULL}, +#endif /* USE_MIGEMO */ +#ifdef USE_MOUSE + {"use_mouse", P_INT, PI_ONOFF, (void *)&use_mouse, CMT_MOUSE, NULL}, + {"reverse_mouse", P_INT, PI_ONOFF, (void *)&reverse_mouse, + CMT_REVERSE_MOUSE, NULL}, + {"relative_wheel_scroll", P_INT, PI_SEL_C, (void *)&relative_wheel_scroll, + CMT_RELATIVE_WHEEL_SCROLL, (void *)wheelmode}, + {"relative_wheel_scroll_ratio", P_INT, PI_TEXT, + (void *)&relative_wheel_scroll_ratio, + CMT_RELATIVE_WHEEL_SCROLL_RATIO, NULL}, + {"fixed_wheel_scroll_count", P_INT, PI_TEXT, + (void *)&fixed_wheel_scroll_count, + CMT_FIXED_WHEEL_SCROLL_COUNT, NULL}, +#endif /* USE_MOUSE */ + {"clear_buffer", P_INT, PI_ONOFF, (void *)&clear_buffer, CMT_CLEAR_BUF, + NULL}, + {"decode_cte", P_CHARINT, PI_ONOFF, (void *)&DecodeCTE, CMT_DECODE_CTE, + NULL}, + {"preserve_timestamp", P_CHARINT, PI_ONOFF, (void *)&PreserveTimestamp, + CMT_PRESERVE_TIMESTAMP, NULL}, + {"keymap_file", P_STRING, PI_TEXT, (void *)&keymap_file, CMT_KEYMAP_FILE, + NULL}, + {NULL, 0, 0, NULL, NULL, NULL}, +}; + +struct param_ptr params4[] = { + {"use_proxy", P_CHARINT, PI_ONOFF, (void *)&use_proxy, CMT_USE_PROXY, + NULL}, + {"http_proxy", P_STRING, PI_TEXT, (void *)&HTTP_proxy, CMT_HTTP_PROXY, + NULL}, +#ifdef USE_SSL + {"https_proxy", P_STRING, PI_TEXT, (void *)&HTTPS_proxy, CMT_HTTPS_PROXY, + NULL}, +#endif /* USE_SSL */ +#ifdef USE_GOPHER + {"gopher_proxy", P_STRING, PI_TEXT, (void *)&GOPHER_proxy, + CMT_GOPHER_PROXY, NULL}, +#endif /* USE_GOPHER */ + {"ftp_proxy", P_STRING, PI_TEXT, (void *)&FTP_proxy, CMT_FTP_PROXY, NULL}, + {"no_proxy", P_STRING, PI_TEXT, (void *)&NO_proxy, CMT_NO_PROXY, NULL}, + {"noproxy_netaddr", P_INT, PI_ONOFF, (void *)&NOproxy_netaddr, + CMT_NOPROXY_NETADDR, NULL}, + {"no_cache", P_CHARINT, PI_ONOFF, (void *)&NoCache, CMT_NO_CACHE, NULL}, + + {NULL, 0, 0, NULL, NULL, NULL}, +}; + +struct param_ptr params5[] = { + {"document_root", P_STRING, PI_TEXT, (void *)&document_root, CMT_DROOT, + NULL}, + {"personal_document_root", P_STRING, PI_TEXT, + (void *)&personal_document_root, CMT_PDROOT, NULL}, + {"cgi_bin", P_STRING, PI_TEXT, (void *)&cgi_bin, CMT_CGIBIN, NULL}, + {"index_file", P_STRING, PI_TEXT, (void *)&index_file, CMT_IFILE, NULL}, + {NULL, 0, 0, NULL, NULL, NULL}, +}; + +struct param_ptr params6[] = { + {"mime_types", P_STRING, PI_TEXT, (void *)&mimetypes_files, CMT_MIMETYPES, + NULL}, + {"mailcap", P_STRING, PI_TEXT, (void *)&mailcap_files, CMT_MAILCAP, NULL}, +#ifdef USE_EXTERNAL_URI_LOADER + {"urimethodmap", P_STRING, PI_TEXT, (void *)&urimethodmap_files, + CMT_URIMETHODMAP, NULL}, +#endif + {"editor", P_STRING, PI_TEXT, (void *)&Editor, CMT_EDITOR, NULL}, + {"mailer", P_STRING, PI_TEXT, (void *)&Mailer, CMT_MAILER, NULL}, + {"extbrowser", P_STRING, PI_TEXT, (void *)&ExtBrowser, CMT_EXTBRZ, NULL}, + {"extbrowser2", P_STRING, PI_TEXT, (void *)&ExtBrowser2, CMT_EXTBRZ2, + NULL}, + {"extbrowser3", P_STRING, PI_TEXT, (void *)&ExtBrowser3, CMT_EXTBRZ3, + NULL}, + {"bgextviewer", P_INT, PI_ONOFF, (void *)&BackgroundExtViewer, + CMT_BGEXTVIEW, NULL}, + {"use_lessopen", P_INT, PI_ONOFF, (void *)&use_lessopen, CMT_USE_LESSOPEN, + NULL}, + {NULL, 0, 0, NULL, NULL, NULL}, +}; + +#ifdef USE_SSL +struct param_ptr params7[] = { + {"ssl_forbid_method", P_STRING, PI_TEXT, (void *)&ssl_forbid_method, + CMT_SSL_FORBID_METHOD, NULL}, +#ifdef USE_SSL_VERIFY + {"ssl_verify_server", P_INT, PI_ONOFF, (void *)&ssl_verify_server, + CMT_SSL_VERIFY_SERVER, NULL}, + {"ssl_cert_file", P_SSLPATH, PI_TEXT, (void *)&ssl_cert_file, + CMT_SSL_CERT_FILE, NULL}, + {"ssl_key_file", P_SSLPATH, PI_TEXT, (void *)&ssl_key_file, + CMT_SSL_KEY_FILE, NULL}, + {"ssl_ca_path", P_SSLPATH, PI_TEXT, (void *)&ssl_ca_path, CMT_SSL_CA_PATH, + NULL}, + {"ssl_ca_file", P_SSLPATH, PI_TEXT, (void *)&ssl_ca_file, CMT_SSL_CA_FILE, + NULL}, +#endif /* USE_SSL_VERIFY */ + {NULL, 0, 0, NULL, NULL, NULL}, +}; +#endif /* USE_SSL */ + +#ifdef USE_COOKIE +struct param_ptr params8[] = { + {"use_cookie", P_INT, PI_ONOFF, (void *)&use_cookie, CMT_USECOOKIE, NULL}, + {"accept_cookie", P_INT, PI_ONOFF, (void *)&accept_cookie, + CMT_ACCEPTCOOKIE, NULL}, + {"accept_bad_cookie", P_INT, PI_SEL_C, (void *)&accept_bad_cookie, + CMT_ACCEPTBADCOOKIE, (void *)badcookiestr}, + {"cookie_reject_domains", P_STRING, PI_TEXT, + (void *)&cookie_reject_domains, CMT_COOKIE_REJECT_DOMAINS, NULL}, + {"cookie_accept_domains", P_STRING, PI_TEXT, + (void *)&cookie_accept_domains, CMT_COOKIE_ACCEPT_DOMAINS, NULL}, + {NULL, 0, 0, NULL, NULL, NULL}, +}; +#endif + +struct param_ptr params9[] = { + {"passwd_file", P_STRING, PI_TEXT, (void *)&passwd_file, CMT_PASSWDFILE, + NULL}, + {"disable_secret_security_check", P_INT, PI_ONOFF, + (void *)&disable_secret_security_check, CMT_DISABLE_SECRET_SECURITY_CHECK, + NULL}, + {"ftppasswd", P_STRING, PI_TEXT, (void *)&ftppasswd, CMT_FTPPASS, NULL}, + {"ftppass_hostnamegen", P_INT, PI_ONOFF, (void *)&ftppass_hostnamegen, + CMT_FTPPASS_HOSTNAMEGEN, NULL}, + {"pre_form_file", P_STRING, PI_TEXT, (void *)&pre_form_file, + CMT_PRE_FORM_FILE, NULL}, + {"user_agent", P_STRING, PI_TEXT, (void *)&UserAgent, CMT_USERAGENT, NULL}, + {"no_referer", P_INT, PI_ONOFF, (void *)&NoSendReferer, CMT_NOSENDREFERER, + NULL}, + {"accept_language", P_STRING, PI_TEXT, (void *)&AcceptLang, CMT_ACCEPTLANG, + NULL}, + {"accept_encoding", P_STRING, PI_TEXT, (void *)&AcceptEncoding, + CMT_ACCEPTENCODING, + NULL}, + {"accept_media", P_STRING, PI_TEXT, (void *)&AcceptMedia, CMT_ACCEPTMEDIA, + NULL}, + {"argv_is_url", P_CHARINT, PI_ONOFF, (void *)&ArgvIsURL, CMT_ARGV_IS_URL, + NULL}, + {"retry_http", P_INT, PI_ONOFF, (void *)&retryAsHttp, CMT_RETRY_HTTP, + NULL}, + {"default_url", P_INT, PI_SEL_C, (void *)&DefaultURLString, + CMT_DEFAULT_URL, (void *)defaulturls}, + {"follow_redirection", P_INT, PI_TEXT, &FollowRedirection, + CMT_FOLLOW_REDIRECTION, NULL}, + {"meta_refresh", P_CHARINT, PI_ONOFF, (void *)&MetaRefresh, + CMT_META_REFRESH, NULL}, +#ifdef INET6 + {"dns_order", P_INT, PI_SEL_C, (void *)&DNS_order, CMT_DNS_ORDER, + (void *)dnsorders}, +#endif /* INET6 */ +#ifdef USE_NNTP + {"nntpserver", P_STRING, PI_TEXT, (void *)&NNTP_server, CMT_NNTP_SERVER, + NULL}, + {"nntpmode", P_STRING, PI_TEXT, (void *)&NNTP_mode, CMT_NNTP_MODE, NULL}, + {"max_news", P_INT, PI_TEXT, (void *)&MaxNewsMessage, CMT_MAX_NEWS, NULL}, +#endif + {NULL, 0, 0, NULL, NULL, NULL}, +}; + +#ifdef USE_M17N +struct param_ptr params10[] = { + {"display_charset", P_CODE, PI_CODE, (void *)&DisplayCharset, + CMT_DISPLAY_CHARSET, (void *)&display_charset_str}, + {"document_charset", P_CODE, PI_CODE, (void *)&DocumentCharset, + CMT_DOCUMENT_CHARSET, (void *)&document_charset_str}, + {"auto_detect", P_CHARINT, PI_SEL_C, (void *)&WcOption.auto_detect, + CMT_AUTO_DETECT, (void *)auto_detect_str}, + {"system_charset", P_CODE, PI_CODE, (void *)&SystemCharset, + CMT_SYSTEM_CHARSET, (void *)&system_charset_str}, + {"follow_locale", P_CHARINT, PI_ONOFF, (void *)&FollowLocale, + CMT_FOLLOW_LOCALE, NULL}, + {"ext_halfdump", P_CHARINT, PI_ONOFF, (void *)&ExtHalfdump, + CMT_EXT_HALFDUMP, NULL}, + {"use_wide", P_CHARINT, PI_ONOFF, (void *)&WcOption.use_wide, CMT_USE_WIDE, + NULL}, + {"use_combining", P_CHARINT, PI_ONOFF, (void *)&WcOption.use_combining, + CMT_USE_COMBINING, NULL}, +#ifdef USE_UNICODE + {"use_language_tag", P_CHARINT, PI_ONOFF, + (void *)&WcOption.use_language_tag, CMT_USE_LANGUAGE_TAG, NULL}, + {"ucs_conv", P_CHARINT, PI_ONOFF, (void *)&WcOption.ucs_conv, CMT_UCS_CONV, + NULL}, +#endif + {"pre_conv", P_CHARINT, PI_ONOFF, (void *)&WcOption.pre_conv, CMT_PRE_CONV, + NULL}, + {"search_conv", P_CHARINT, PI_ONOFF, (void *)&SearchConv, CMT_SEARCH_CONV, + NULL}, + {"fix_width_conv", P_CHARINT, PI_ONOFF, (void *)&WcOption.fix_width_conv, + CMT_FIX_WIDTH_CONV, NULL}, +#ifdef USE_UNICODE + {"use_gb12345_map", P_CHARINT, PI_ONOFF, (void *)&WcOption.use_gb12345_map, + CMT_USE_GB12345_MAP, NULL}, +#endif + {"use_jisx0201", P_CHARINT, PI_ONOFF, (void *)&WcOption.use_jisx0201, + CMT_USE_JISX0201, NULL}, + {"use_jisc6226", P_CHARINT, PI_ONOFF, (void *)&WcOption.use_jisc6226, + CMT_USE_JISC6226, NULL}, + {"use_jisx0201k", P_CHARINT, PI_ONOFF, (void *)&WcOption.use_jisx0201k, + CMT_USE_JISX0201K, NULL}, + {"use_jisx0212", P_CHARINT, PI_ONOFF, (void *)&WcOption.use_jisx0212, + CMT_USE_JISX0212, NULL}, + {"use_jisx0213", P_CHARINT, PI_ONOFF, (void *)&WcOption.use_jisx0213, + CMT_USE_JISX0213, NULL}, + {"strict_iso2022", P_CHARINT, PI_ONOFF, (void *)&WcOption.strict_iso2022, + CMT_STRICT_ISO2022, NULL}, +#ifdef USE_UNICODE + {"gb18030_as_ucs", P_CHARINT, PI_ONOFF, (void *)&WcOption.gb18030_as_ucs, + CMT_GB18030_AS_UCS, NULL}, +#endif + {NULL, 0, 0, NULL, NULL, NULL}, +}; +#endif + +struct param_section sections[] = { + {N_("Display Settings"), params1}, +#ifdef USE_COLOR + {N_("Color Settings"), params2}, +#endif /* USE_COLOR */ + {N_("Miscellaneous Settings"), params3}, + {N_("Directory Settings"), params5}, + {N_("External Program Settings"), params6}, + {N_("Network Settings"), params9}, + {N_("Proxy Settings"), params4}, +#ifdef USE_SSL + {N_("SSL Settings"), params7}, +#endif +#ifdef USE_COOKIE + {N_("Cookie Settings"), params8}, +#endif +#ifdef USE_M17N + {N_("Charset Settings"), params10}, +#endif + {NULL, NULL} +}; + +static Str to_str(struct param_ptr *p); + +static int +compare_table(struct rc_search_table *a, struct rc_search_table *b) +{ + return strcmp(a->param->name, b->param->name); +} + +static void +create_option_search_table() +{ + int i, j, k; + int diff1, diff2; + char *p, *q; + + /* count table size */ + RC_table_size = 0; + for (j = 0; sections[j].name != NULL; j++) { + i = 0; + while (sections[j].params[i].name) { + i++; + RC_table_size++; + } + } + + RC_search_table = New_N(struct rc_search_table, RC_table_size); + k = 0; + for (j = 0; sections[j].name != NULL; j++) { + i = 0; + while (sections[j].params[i].name) { + RC_search_table[k].param = §ions[j].params[i]; + k++; + i++; + } + } + + qsort(RC_search_table, RC_table_size, sizeof(struct rc_search_table), + (int (*)(const void *, const void *))compare_table); + + diff1 = diff2 = 0; + for (i = 0; i < RC_table_size - 1; i++) { + p = RC_search_table[i].param->name; + q = RC_search_table[i + 1].param->name; + for (j = 0; p[j] != '\0' && q[j] != '\0' && p[j] == q[j]; j++) ; + diff1 = j; + if (diff1 > diff2) + RC_search_table[i].uniq_pos = diff1 + 1; + else + RC_search_table[i].uniq_pos = diff2 + 1; + diff2 = diff1; + } +} + +struct param_ptr * +search_param(char *name) +{ + size_t b, e, i; + int cmp; + int len = strlen(name); + + for (b = 0, e = RC_table_size - 1; b <= e;) { + i = (b + e) / 2; + cmp = strncmp(name, RC_search_table[i].param->name, len); + + if (!cmp) { + if (len >= RC_search_table[i].uniq_pos) { + return RC_search_table[i].param; + } + else { + while ((cmp = + strcmp(name, RC_search_table[i].param->name)) <= 0) + if (!cmp) + return RC_search_table[i].param; + else if (i == 0) + return NULL; + else + i--; + /* ambiguous */ + return NULL; + } + } + else if (cmp < 0) { + if (i == 0) + return NULL; + e = i - 1; + } + else + b = i + 1; + } + return NULL; +} + +/* show parameter with bad options invokation */ +void +show_params(FILE * fp) +{ + int i, j, l; + char *t = NULL; + char *cmt; + +#if ENABLE_NLS + OptionCharset = SystemCharset; /* FIXME */ +#endif + + fputs("\nconfiguration parameters\n", fp); + for (j = 0; sections[j].name != NULL; j++) { +#ifdef USE_M17N + if (!OptionEncode) + cmt = + wc_conv(gettext(sections[j].name), OptionCharset, + InnerCharset)->ptr; + else +#endif + cmt = sections[j].name; + fprintf(fp, " section[%d]: %s\n", j, conv_to_system(cmt)); + i = 0; + while (sections[j].params[i].name) { + switch (sections[j].params[i].type) { + case P_INT: + case P_SHORT: + case P_CHARINT: + case P_NZINT: + t = (sections[j].params[i].inputtype == + PI_ONOFF) ? "bool" : "number"; + break; + case P_CHAR: + t = "char"; + break; + case P_STRING: + t = "string"; + break; +#if defined(USE_SSL) && defined(USE_SSL_VERIFY) + case P_SSLPATH: + t = "path"; + break; +#endif +#ifdef USE_COLOR + case P_COLOR: + t = "color"; + break; +#endif +#ifdef USE_M17N + case P_CODE: + t = "charset"; + break; +#endif + case P_PIXELS: + t = "number"; + break; + case P_SCALE: + t = "percent"; + break; + } +#ifdef USE_M17N + if (!OptionEncode) + cmt = wc_conv(gettext(sections[j].params[i].comment), + OptionCharset, InnerCharset)->ptr; + else +#endif + cmt = sections[j].params[i].comment; + l = 30 - (strlen(sections[j].params[i].name) + strlen(t)); + if (l < 0) + l = 1; + fprintf(fp, " -o %s=<%s>%*s%s\n", + sections[j].params[i].name, t, l, " ", + conv_to_system(cmt)); + i++; + } + } +} + +int +str_to_bool(char *value, int old) +{ + if (value == NULL) + return 1; + switch (TOLOWER(*value)) { + case '0': + case 'f': /* false */ + case 'n': /* no */ + case 'u': /* undef */ + return 0; + case 'o': + if (TOLOWER(value[1]) == 'f') /* off */ + return 0; + return 1; /* on */ + case 't': + if (TOLOWER(value[1]) == 'o') /* toggle */ + return !old; + return 1; /* true */ + case '!': + case 'r': /* reverse */ + case 'x': /* exchange */ + return !old; + } + return 1; +} + +#ifdef USE_COLOR +static int +str_to_color(char *value) +{ + if (value == NULL) + return 8; /* terminal */ + switch (TOLOWER(*value)) { + case '0': + return 0; /* black */ + case '1': + case 'r': + return 1; /* red */ + case '2': + case 'g': + return 2; /* green */ + case '3': + case 'y': + return 3; /* yellow */ + case '4': + return 4; /* blue */ + case '5': + case 'm': + return 5; /* magenta */ + case '6': + case 'c': + return 6; /* cyan */ + case '7': + case 'w': + return 7; /* white */ + case '8': + case 't': + return 8; /* terminal */ + case 'b': + if (!strncasecmp(value, "blu", 3)) + return 4; /* blue */ + else + return 0; /* black */ + } + return 8; /* terminal */ +} +#endif + +static int +set_param(char *name, char *value) +{ + struct param_ptr *p; + double ppc; + + if (value == NULL) + return 0; + p = search_param(name); + if (p == NULL) + return 0; + switch (p->type) { + case P_INT: + if (atoi(value) >= 0) + *(int *)p->varptr = (p->inputtype == PI_ONOFF) + ? str_to_bool(value, *(int *)p->varptr) : atoi(value); + break; + case P_NZINT: + if (atoi(value) > 0) + *(int *)p->varptr = atoi(value); + break; + case P_SHORT: + *(short *)p->varptr = (p->inputtype == PI_ONOFF) + ? str_to_bool(value, *(short *)p->varptr) : atoi(value); + break; + case P_CHARINT: + *(char *)p->varptr = (p->inputtype == PI_ONOFF) + ? str_to_bool(value, *(char *)p->varptr) : atoi(value); + break; + case P_CHAR: + *(char *)p->varptr = value[0]; + break; + case P_STRING: + *(char **)p->varptr = value; + break; +#if defined(USE_SSL) && defined(USE_SSL_VERIFY) + case P_SSLPATH: + if (value != NULL && value[0] != '\0') + *(char **)p->varptr = rcFile(value); + else + *(char **)p->varptr = NULL; + ssl_path_modified = 1; + break; +#endif +#ifdef USE_COLOR + case P_COLOR: + *(int *)p->varptr = str_to_color(value); + break; +#endif +#ifdef USE_M17N + case P_CODE: + *(wc_ces *) p->varptr = + wc_guess_charset_short(value, *(wc_ces *) p->varptr); + break; +#endif + case P_PIXELS: + ppc = atof(value); + if (ppc >= MINIMUM_PIXEL_PER_CHAR && ppc <= MAXIMUM_PIXEL_PER_CHAR * 2) + *(double *)p->varptr = ppc; + break; + case P_SCALE: + ppc = atof(value); + if (ppc >= 10 && ppc <= 1000) + *(double *)p->varptr = ppc; + break; + } + return 1; +} + +int +set_param_option(char *option) +{ + Str tmp = Strnew(); + char *p = option, *q; + + while (*p && !IS_SPACE(*p) && *p != '=') + Strcat_char(tmp, *p++); + while (*p && IS_SPACE(*p)) + p++; + if (*p == '=') { + p++; + while (*p && IS_SPACE(*p)) + p++; + } + Strlower(tmp); + if (set_param(tmp->ptr, p)) + goto option_assigned; + q = tmp->ptr; + if (!strncmp(q, "no", 2)) { /* -o noxxx, -o no-xxx, -o no_xxx */ + q += 2; + if (*q == '-' || *q == '_') + q++; + } + else if (tmp->ptr[0] == '-') /* -o -xxx */ + q++; + else + return 0; + if (set_param(q, "0")) + goto option_assigned; + return 0; + option_assigned: + return 1; +} + +char * +get_param_option(char *name) +{ + struct param_ptr *p; + + p = search_param(name); + return p ? to_str(p)->ptr : NULL; +} + +static void +interpret_rc(FILE * f) +{ + Str line; + Str tmp; + char *p; + + for (;;) { + line = Strfgets(f); + Strchop(line); + if (line->length == 0) + break; + Strremovefirstspaces(line); + if (line->ptr[0] == '#') /* comment */ + continue; + tmp = Strnew(); + p = line->ptr; + while (*p && !IS_SPACE(*p)) + Strcat_char(tmp, *p++); + while (*p && IS_SPACE(*p)) + p++; + Strlower(tmp); + set_param(tmp->ptr, p); + } +} + +void +parse_proxy() +{ + if (non_null(HTTP_proxy)) + parseURL(HTTP_proxy, &HTTP_proxy_parsed, NULL); +#ifdef USE_SSL + if (non_null(HTTPS_proxy)) + parseURL(HTTPS_proxy, &HTTPS_proxy_parsed, NULL); +#endif /* USE_SSL */ +#ifdef USE_GOPHER + if (non_null(GOPHER_proxy)) + parseURL(GOPHER_proxy, &GOPHER_proxy_parsed, NULL); +#endif + if (non_null(FTP_proxy)) + parseURL(FTP_proxy, &FTP_proxy_parsed, NULL); + if (non_null(NO_proxy)) + set_no_proxy(NO_proxy); +} + +#ifdef USE_COOKIE +void +parse_cookie() +{ + if (non_null(cookie_reject_domains)) + Cookie_reject_domains = make_domain_list(cookie_reject_domains); + if (non_null(cookie_accept_domains)) + Cookie_accept_domains = make_domain_list(cookie_accept_domains); +} +#endif + +#ifdef __EMX__ +static int +do_mkdir(const char *dir, long mode) +{ + char *r, abs[_MAX_PATH]; + size_t n; + + _abspath(abs, rc_dir, _MAX_PATH); /* Translate '\\' to '/' */ + + if (!(n = strlen(abs))) + return -1; + + if (*(r = abs + n - 1) == '/') /* Ignore tailing slash if it is */ + *r = 0; + + return mkdir(abs, mode); +} +#else /* not __EMX__ */ +#define do_mkdir(dir,mode) mkdir(dir,mode) +#endif /* not __EMX__ */ + +void +sync_with_option(void) +{ + if (PagerMax < LINES) + PagerMax = LINES; + WrapSearch = WrapDefault; + parse_proxy(); +#ifdef USE_COOKIE + parse_cookie(); +#endif + initMailcap(); + initMimeTypes(); +#ifdef USE_EXTERNAL_URI_LOADER + initURIMethods(); +#endif +#ifdef USE_MIGEMO + init_migemo(); +#endif +#ifdef USE_IMAGE + if (fmInitialized && displayImage) + initImage(); +#else + displayImage = FALSE; /* XXX */ +#endif + loadPasswd(); + loadPreForm(); + + if (AcceptLang == NULL || *AcceptLang == '\0') { + /* TRANSLATORS: + * AcceptLang default: this is used in Accept-Language: HTTP request + * header. For example, ja.po should translate it as + * "ja;q=1.0, en;q=0.5" like that. + */ + AcceptLang = _("en;q=1.0"); + } + if (AcceptEncoding == NULL || *AcceptEncoding == '\0') + AcceptEncoding = acceptableEncoding(); + if (AcceptMedia == NULL || *AcceptMedia == '\0') + AcceptMedia = acceptableMimeTypes(); + if (fmInitialized) { + initKeymap(FALSE); +#ifdef USE_MOUSE + initMouseAction(); +#endif /* MOUSE */ +#ifdef USE_MENU + initMenu(); +#endif /* MENU */ + } +} + +void +init_rc(void) +{ + int i; + struct stat st; + FILE *f; + + if (rc_dir != NULL) + goto open_rc; + + rc_dir = expandPath(RC_DIR); + i = strlen(rc_dir); + if (i > 1 && rc_dir[i - 1] == '/') + rc_dir[i - 1] = '\0'; + +#ifdef USE_M17N + display_charset_str = wc_get_ces_list(); + document_charset_str = display_charset_str; + system_charset_str = display_charset_str; +#endif + + if (stat(rc_dir, &st) < 0) { + if (errno == ENOENT) { /* no directory */ + if (do_mkdir(rc_dir, 0700) < 0) { + fprintf(stderr, "Can't create config directory (%s)!", rc_dir); + goto rc_dir_err; + } + else { + stat(rc_dir, &st); + } + } + else { + fprintf(stderr, "Can't open config directory (%s)!", rc_dir); + goto rc_dir_err; + } + } + if (!S_ISDIR(st.st_mode)) { + /* not a directory */ + fprintf(stderr, "%s is not a directory!", rc_dir); + goto rc_dir_err; + } + if (!(st.st_mode & S_IWUSR)) { + fprintf(stderr, "%s is not writable!", rc_dir); + goto rc_dir_err; + } + no_rc_dir = FALSE; + tmp_dir = rc_dir; + + if (config_file == NULL) + config_file = rcFile(CONFIG_FILE); + + create_option_search_table(); + + open_rc: + /* open config file */ + if ((f = fopen(etcFile(W3MCONFIG), "rt")) != NULL) { + interpret_rc(f); + fclose(f); + } + if ((f = fopen(confFile(CONFIG_FILE), "rt")) != NULL) { + interpret_rc(f); + fclose(f); + } + if ((f = fopen(config_file, "rt")) != NULL) { + interpret_rc(f); + fclose(f); + } + return; + + rc_dir_err: + no_rc_dir = TRUE; + if (((tmp_dir = getenv("TMPDIR")) == NULL || *tmp_dir == '\0') && + ((tmp_dir = getenv("TMP")) == NULL || *tmp_dir == '\0') && + ((tmp_dir = getenv("TEMP")) == NULL || *tmp_dir == '\0')) + tmp_dir = "/tmp"; +} + + +static char optionpanel_src1[] = + "<html><head><title>Option Setting Panel</title></head><body>\ +<h1 align=center>Option Setting Panel<br>(w3m version %s)</b></h1>\ +<form method=post action=\"file:///$LIB/" W3MHELPERPANEL_CMDNAME "\">\ +<input type=hidden name=mode value=panel>\ +<input type=hidden name=cookie value=\"%s\">\ +<input type=submit value=\"%s\">\ +</form><br>\ +<form method=internal action=option>"; + +static Str optionpanel_str = NULL; + +static Str +to_str(struct param_ptr *p) +{ + switch (p->type) { + case P_INT: +#ifdef USE_COLOR + case P_COLOR: +#endif +#ifdef USE_M17N + case P_CODE: + return Sprintf("%d", (int)(*(wc_ces *) p->varptr)); +#endif + case P_NZINT: + return Sprintf("%d", *(int *)p->varptr); + case P_SHORT: + return Sprintf("%d", *(short *)p->varptr); + case P_CHARINT: + return Sprintf("%d", *(char *)p->varptr); + case P_CHAR: + return Sprintf("%c", *(char *)p->varptr); + case P_STRING: +#if defined(USE_SSL) && defined(USE_SSL_VERIFY) + case P_SSLPATH: +#endif + /* SystemCharset -> InnerCharset */ + return Strnew_charp(conv_from_system(*(char **)p->varptr)); + case P_PIXELS: + case P_SCALE: + return Sprintf("%g", *(double *)p->varptr); + } + /* not reached */ + return NULL; +} + +Buffer * +load_option_panel(void) +{ + Str src; + struct param_ptr *p; + struct sel_c *s; +#ifdef USE_M17N + wc_ces_list *c; +#endif + int x, i; + Str tmp; + Buffer *buf; + + if (optionpanel_str == NULL) + optionpanel_str = Sprintf(optionpanel_src1, w3m_version, + html_quote(localCookie()->ptr), CMT_HELPER); +#if ENABLE_NLS + OptionCharset = SystemCharset; /* FIXME */ +#endif +#ifdef USE_M17N + if (!OptionEncode) { + optionpanel_str = + wc_Str_conv(optionpanel_str, OptionCharset, InnerCharset); + for (i = 0; sections[i].name != NULL; i++) { + sections[i].name = + wc_conv(gettext(sections[i].name), OptionCharset, + InnerCharset)->ptr; + for (p = sections[i].params; p->name; p++) + p->comment = + wc_conv(gettext(p->comment), OptionCharset, + InnerCharset)->ptr; + } +#ifdef USE_COLOR + for (s = colorstr; s->text; s++) + s->text = wc_conv(gettext(s->text), OptionCharset, + InnerCharset)->ptr; +#endif + OptionEncode = TRUE; + } +#endif + src = Strdup(optionpanel_str); + + Strcat_charp(src, "<table><tr><td>"); + for (i = 0; sections[i].name != NULL; i++) { + Strcat_m_charp(src, "<h1>", sections[i].name, "</h1>", NULL); + p = sections[i].params; + Strcat_charp(src, "<table width=100% cellpadding=0>"); + while (p->name) { + Strcat_m_charp(src, "<tr><td>", p->comment, NULL); + Strcat(src, Sprintf("</td><td width=%d>", + (int)(28 * pixel_per_char))); + switch (p->inputtype) { + case PI_TEXT: + Strcat_m_charp(src, "<input type=text name=", + p->name, + " value=\"", + html_quote(to_str(p)->ptr), "\">", NULL); + break; + case PI_ONOFF: + x = atoi(to_str(p)->ptr); + Strcat_m_charp(src, "<input type=radio name=", + p->name, + " value=1", + (x ? " checked" : ""), + ">YES <input type=radio name=", + p->name, + " value=0", (x ? "" : " checked"), ">NO", NULL); + break; + case PI_SEL_C: + tmp = to_str(p); + Strcat_m_charp(src, "<select name=", p->name, ">", NULL); + for (s = (struct sel_c *)p->select; s->text != NULL; s++) { + Strcat_charp(src, "<option value="); + Strcat(src, Sprintf("%s\n", s->cvalue)); + if ((p->type != P_CHAR && s->value == atoi(tmp->ptr)) || + (p->type == P_CHAR && (char)s->value == *(tmp->ptr))) + Strcat_charp(src, " selected"); + Strcat_char(src, '>'); + Strcat_charp(src, s->text); + } + Strcat_charp(src, "</select>"); + break; +#ifdef USE_M17N + case PI_CODE: + tmp = to_str(p); + Strcat_m_charp(src, "<select name=", p->name, ">", NULL); + for (c = *(wc_ces_list **) p->select; c->desc != NULL; c++) { + Strcat_charp(src, "<option value="); + Strcat(src, Sprintf("%s\n", c->name)); + if (c->id == atoi(tmp->ptr)) + Strcat_charp(src, " selected"); + Strcat_char(src, '>'); + Strcat_charp(src, c->desc); + } + Strcat_charp(src, "</select>"); + break; +#endif + } + Strcat_charp(src, "</td></tr>\n"); + p++; + } + Strcat_charp(src, + "<tr><td></td><td><p><input type=submit value=\"OK\"></td></tr>"); + Strcat_charp(src, "</table><hr width=50%>"); + } + Strcat_charp(src, "</table></form></body></html>"); + buf = loadHTMLString(src); +#ifdef USE_M17N + if (buf) + buf->document_charset = OptionCharset; +#endif + return buf; +} + +void +panel_set_option(struct parsed_tagarg *arg) +{ + FILE *f = NULL; + char *p; + + if (no_rc_dir) { + disp_message("There's no ~/.w3m directory... config not saved", FALSE); + } + else { + f = fopen(config_file, "wt"); + if (f == NULL) { + disp_message("Can't write option!", FALSE); + } + } + while (arg) { + /* InnerCharset -> SystemCharset */ + if (arg->value) { + p = conv_to_system(arg->value); + if (set_param(arg->arg, p)) { + if (f) + fprintf(f, "%s %s\n", arg->arg, p); + } + } + arg = arg->next; + } + if (f) + fclose(f); + sync_with_option(); + backBf(); +} + +char * +rcFile(char *base) +{ + if (base && + (base[0] == '/' || + (base[0] == '.' + && (base[1] == '/' || (base[1] == '.' && base[2] == '/'))) + || (base[0] == '~' && base[1] == '/'))) + /* /file, ./file, ../file, ~/file */ + return expandPath(base); + return expandPath(Strnew_m_charp(rc_dir, "/", base, NULL)->ptr); +} + +char * +auxbinFile(char *base) +{ + return expandPath(Strnew_m_charp(w3m_auxbin_dir(), "/", base, NULL)->ptr); +} + +#if 0 /* not used */ +char * +libFile(char *base) +{ + return expandPath(Strnew_m_charp(w3m_lib_dir(), "/", base, NULL)->ptr); +} +#endif + +char * +etcFile(char *base) +{ + return expandPath(Strnew_m_charp(w3m_etc_dir(), "/", base, NULL)->ptr); +} + +char * +confFile(char *base) +{ + return expandPath(Strnew_m_charp(w3m_conf_dir(), "/", base, NULL)->ptr); +} + +#ifndef USE_HELP_CGI +char * +helpFile(char *base) +{ + return expandPath(Strnew_m_charp(w3m_help_dir(), "/", base, NULL)->ptr); +} +#endif |