/* $Id: rc.c,v 1.20 2001/11/30 11:11:44 ukai Exp $ */ /* * Initialization file etc. */ #include "fm.h" #include "myctype.h" #include #include #include "parsetag.h" #include "local.h" #include "terms.h" #include struct param_ptr { char *name; int type; int inputtype; void *varptr; char *comment; struct sel_c *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; static int rc_initialized = 0; static char *config_file = NULL; #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 JP_CHARSET #define P_CODE 7 #endif #define P_PIXELS 8 #define P_NZINT 9 #if LANG == JA #define CMT_HELPER "外部ビューアの編集" #define CMT_TABSTOP "タブ幅" #define CMT_PIXEL_PER_CHAR "文字幅 (4.0...32.0)" #define CMT_PAGERLINE "ページャとして利用した時に保存される行数" #define CMT_HISTSIZE "保持するURL履歴の数" #define CMT_SAVEHIST "URL履歴の保存" #define CMT_KANJICODE "表示用漢字コード" #define CMT_FRAME "フレームの自動表示" #define CMT_ARGV_IS_URL "scheme のない引数も URL とみなす" #define CMT_TSELF "targetが未指定の場合に_selfを使用する" #define CMT_DISPLINK "リンク先の自動表示" #define CMT_MULTICOL "ファイル名のマルチカラム表示" #define CMT_ALT_ENTITY "エンティティを ASCII の代替表現で表す" #define CMT_COLOR "カラー表示" #define CMT_B_COLOR "文字の色" #define CMT_A_COLOR "アンカーの色" #define CMT_I_COLOR "画像リンクの色" #define CMT_F_COLOR "フォームの色" #define CMT_BG_COLOR "背景の色" #define CMT_ACTIVE_STYLE "現在選択されているリンクの色を指定する" #define CMT_C_COLOR "現在選択されているリンクの色" #define CMT_VISITED_ANCHOR "訪れたことがあるリンクは色を変える" #define CMT_V_COLOR "訪れたことがあるリンクの色" #define CMT_HTTP_PROXY "HTTPプロキシ(URLで入力)" #ifdef USE_GOPHER #define CMT_GOPHER_PROXY "GOPHERプロキシ(URLで入力)" #endif /* USE_GOPHER */ #define CMT_FTP_PROXY "FTPプロキシ(URLで入力)" #define CMT_NO_PROXY "プロキシから除外するドメイン" #define CMT_NOPROXY_NETADDR "ネットワークアドレスでプロキシ除外のチェック" #define CMT_NO_CACHE "Cache を使わない" #define CMT_DNS_ORDER "名前解決の順序" #define CMT_DROOT "/ で表されるディレクトリ(document root)" #define CMT_PDROOT "/~user で表されるディレクトリ" #define CMT_CGIBIN "/cgi-bin で表されるディレクトリ" #define CMT_CONFIRM_QQ "q での終了時に確認する" #ifdef USE_MARK #define CMT_USE_MARK "マーク機能を有効にする" #endif #ifdef EMACS_LIKE_LINEEDIT #define CMT_EMACS_LIKE_LINEEDIT "Emacs風の行編集にする" #endif #ifdef VI_PREC_NUM #define CMT_VI_PREC_NUM "vi風の数値プレフィクス" #endif #ifdef LABEL_TOPLINE #define CMT_LABEL_TOPLINE "ラベルに移動する時にカーソルがトップになるようにする" #endif #ifdef NEXTPAGE_TOPLINE #define CMT_NEXTPAGE_TOPLINE "次のページに移動する時にカーソルがトップになるようにする" #endif #define CMT_SHOW_NUM "行番号を表示する" #define CMT_MIMETYPES "利用するmime.types" #define CMT_MAILCAP "利用するmailcap" #define CMT_EDITOR "利用するエディタ" #define CMT_MAILER "利用するメーラ" #define CMT_EXTBRZ "外部ブラウザ" #define CMT_EXTBRZ2 "外部ブラウザその2" #define CMT_EXTBRZ3 "外部ブラウザその3" #define CMT_FTPPASS "FTPのパスワード(普通は自分のmail addressを使う)" #ifdef FTPPASS_HOSTNAMEGEN #define CMT_FTPPASS_HOSTNAMEGEN "FTPのパスワードのドメイン名を自動生成する" #endif #define CMT_USERAGENT "User-Agent" #define CMT_ACCEPTENCODING "圧縮方法(Accept-Encoding:)" #define CMT_ACCEPTMEDIA "受けつけるメディアタイプ(Accept:)" #define CMT_ACCEPTLANG "受けつける言語(Accept-Language:)" #define CMT_DOCUMENTCODE "文書の文字コード" #define CMT_SYSTEMCODE "システムの文字コード" #define CMT_WRAP "折り返し検索" #define CMT_VIEW_UNSEENOBJECTS "背景画像等へのリンクを作る" #ifdef __EMX__ #define CMT_BGEXTVIEW "外部ビューアを別セッションで動かす" #else #define CMT_BGEXTVIEW "外部ビューアをバックグラウンドで動かす" #endif #define CMT_EXT_DIRLIST "ディレクトリリストに外部コマンドを使う" #define CMT_DIRLIST_CMD "ディレクトリリスト用コマンド" #define CMT_IGNORE_NULL_IMG_ALT "空のIMG ALT属性の時にリンク名を表示する" #define CMT_IFILE "各ディレクトリのインデックスファイル" #define CMT_RETRY_HTTP "URLに自動的に http:// を補う" #define CMT_DECODE_CTE "保存時に Content-Transfer-Encoding をデコードする" #ifdef USE_MOUSE #define CMT_MOUSE "マウスを使う" #define CMT_REVERSE_MOUSE "マウスのドラッグ動作を逆にする" #endif /* USE_MOUSE */ #define CMT_CLEAR_BUF "表示されていないバッファのメモリを開放する" #define CMT_NOSENDREFERER "Referer: を送らないようにする" #define CMT_IGNORE_CASE "サーチ時に大文字小文字の区別をしない" #define CMT_USE_LESSOPEN "LESSOPENを使用" #if defined(USE_SSL) && defined(USE_SSL_VERIFY) #define CMT_SSL_VERIFY_SERVER "SSLのサーバ認証を行う" #define CMT_SSL_CERT_FILE "SSLのクライアント用PEM形式証明書ファイル" #define CMT_SSL_KEY_FILE "SSLのクライアント用PEM形式秘密鍵ファイル" #define CMT_SSL_CA_PATH "SSLの認証局のPEM形式証明書群のあるディレクトリへのパス" #define CMT_SSL_CA_FILE "SSLの認証局のPEM形式証明書群のファイル" #endif /* defined(USE_SSL) && * defined(USE_SSL_VERIFY) */ #ifdef USE_SSL #define CMT_SSL_FORBID_METHOD "使わないSSLメソッドのリスト(2: SSLv2, 3: SSLv3, t:TLSv1)" #endif #ifdef USE_COOKIE #define CMT_USECOOKIE "クッキーを使用する" #define CMT_ACCEPTCOOKIE "クッキーを受け付ける" #define CMT_ACCEPTBADCOOKIE "問題のあるクッキーでも受け付ける" #define CMT_COOKIE_REJECT_DOMAINS "クッキーを受け付けないドメイン" #define CMT_COOKIE_ACCEPT_DOMAINS "クッキーを受け付けるドメイン" #endif #define CMT_FOLLOW_REDIRECTION "従うリダイレクトの回数" #define CMT_META_REFRESH "meta refresh に対応する" #else /* LANG != JA */ #define CMT_HELPER "External Viewer Setup" #define CMT_TABSTOP "Tab width" #define CMT_PIXEL_PER_CHAR "# of pixels per character (4.0...32.0)" #define CMT_PAGERLINE "# of reserved line when w3m is used as a pager" #define CMT_HISTSIZE "# of reserved URL" #define CMT_SAVEHIST "Save URL history" /* #define CMT_KANJICODE "Display Kanji Code" */ #define CMT_FRAME "Automatic rendering of frame" #define CMT_ARGV_IS_URL "Force argument without scheme to URL" #define CMT_TSELF "use _self as default target" #define CMT_DISPLINK "Automatic display of link URL" #define CMT_MULTICOL "Multi-column output of file names" #define CMT_ALT_ENTITY "Use alternate expression with ASCII for entity" #define CMT_COLOR "Display with color" #define CMT_B_COLOR "Color of normal character" #define CMT_A_COLOR "Color of anchor" #define CMT_I_COLOR "Color of image link" #define CMT_F_COLOR "Color of form" #define CMT_ACTIVE_STYLE "Use active link color" #define CMT_C_COLOR "Color of currently active link" #define CMT_VISITED_ANCHOR "Use visited link color" #define CMT_V_COLOR "Color of visited link" #define CMT_BG_COLOR "Color of background" #define CMT_HTTP_PROXY "URL of HTTP proxy host" #ifdef USE_GOPHER #define CMT_GOPHER_PROXY "URL of GOPHER proxy host" #endif /* USE_GOPHER */ #define CMT_FTP_PROXY "URL of FTP proxy host" #define CMT_NO_PROXY "Domains for direct access (no proxy)" #define CMT_NOPROXY_NETADDR "Check noproxy by network address" #define CMT_NO_CACHE "Don't use cache" #define CMT_DNS_ORDER "Order of name resolution" #define CMT_DROOT "Directory corresponds to / (document root)" #define CMT_PDROOT "Directory corresponds to /~user" #define CMT_CGIBIN "Directory corresponds to /cgi-bin" #define CMT_CONFIRM_QQ "Confirm when quitting with q" #ifdef USE_MARK #define CMT_USE_MARK "Enable mark operations" #endif #ifdef EMACS_LIKE_LINEEDIT #define CMT_EMACS_LIKE_LINEEDIT "Emacs-style line editing" #endif #ifdef VI_PREC_NUM #define CMT_VI_PREC_NUM "vi-like numeric prefix" #endif #ifdef LABEL_TOPLINE #define CMT_LABEL_TOPLINE "move cursor to top line when going to label" #endif #ifdef NEXTPAGE_TOPLINE #define CMT_NEXTPAGE_TOPLINE "move cursor to top line when moving to next page" #endif #define CMT_SHOW_NUM "Show line number" #define CMT_MIMETYPES "mime.types files" #define CMT_MAILCAP "mailcap files" #define CMT_EDITOR "Editor" #define CMT_MAILER "Mailer" #define CMT_EXTBRZ "External Browser" #define CMT_EXTBRZ2 "Second External Browser" #define CMT_EXTBRZ3 "Third External Browser" #define CMT_FTPPASS "Password for FTP(use your mail address)" #ifdef FTPPASS_HOSTNAMEGEN #define CMT_FTPPASS_HOSTNAMEGEN "generate domain part of password for FTP" #endif #define CMT_USERAGENT "User-Agent" #define CMT_ACCEPTENCODING "Accept-Encoding" #define CMT_ACCEPTMEDIA "Accept" #define CMT_ACCEPTLANG "Accept-Language" /* #define CMT_DOCUMENTCODE "Document Charset" */ /* #define CMT_SYSTEMCODE "System Kanji Code" */ #define CMT_WRAP "Wrap search" #define CMT_VIEW_UNSEENOBJECTS "Display unseenobjects (e.g. bgimage) tag" #ifdef __EMX__ #define CMT_BGEXTVIEW "Another session for an external viewer" #else #define CMT_BGEXTVIEW "Background an external viewer" #endif #define CMT_EXT_DIRLIST "Use external program for directory listing" #define CMT_DIRLIST_CMD "Directory listing command" #define CMT_IGNORE_NULL_IMG_ALT "Ignore IMG ALT=\"\" (display link name)" #define CMT_IFILE "Index file for the directory" #define CMT_RETRY_HTTP "Prepend http:// to URL automatically" #define CMT_DECODE_CTE "Decode Content-Transfer-Encoding when saving" #ifdef USE_MOUSE #define CMT_MOUSE "Use mouse" #define CMT_REVERSE_MOUSE "Reverse mouse dragging action" #endif /* USE_MOUSE */ #define CMT_CLEAR_BUF "Free memory of the undisplayed buffers" #define CMT_NOSENDREFERER "Don't send header `Referer:'" #define CMT_IGNORE_CASE "Ignore case when search" #define CMT_USE_LESSOPEN "Use LESSOPEN" #if defined(USE_SSL) && defined(USE_SSL_VERIFY) #define CMT_SSL_VERIFY_SERVER "Perform SSL server verification" #define CMT_SSL_CERT_FILE "PEM encoded certificate file of client" #define CMT_SSL_KEY_FILE "PEM encoded private key file of client" #define CMT_SSL_CA_PATH "Path to a directory for PEM encoded certificates of CAs" #define CMT_SSL_CA_FILE "File consisting of PEM encoded certificates of CAs" #endif /* defined(USE_SSL) && * defined(USE_SSL_VERIFY) */ #ifdef USE_SSL #define CMT_SSL_FORBID_METHOD "List of forbidden SSL method (2: SSLv2, 3: SSLv3, t:TLSv1)" #endif #ifdef USE_COOKIE #define CMT_USECOOKIE "Use Cookie" #define CMT_ACCEPTCOOKIE "Accept Cookie" #define CMT_ACCEPTBADCOOKIE "Invalid Cookie" #define CMT_COOKIE_REJECT_DOMAINS "Domains from which should reject cookies" #define CMT_COOKIE_ACCEPT_DOMAINS "Domains from which should accept cookies" #endif #define CMT_FOLLOW_REDIRECTION "Follow this number of redirections" #define CMT_META_REFRESH "Support meta refresh" #endif /* LANG != JA */ #define PI_TEXT 0 #define PI_ONOFF 1 #define PI_SEL_C 2 struct sel_c { int value; char *cvalue; char *text; }; #ifdef JP_CHARSET static struct sel_c kcodestr[] = { {CODE_EUC, "E", STR_EUC}, {CODE_SJIS, "S", STR_SJIS}, {CODE_JIS_j, "j", STR_JIS_j}, {CODE_JIS_N, "N", STR_JIS_N}, {CODE_JIS_m, "m", STR_JIS_m}, {CODE_JIS_n, "n", STR_JIS_n}, {0, NULL, NULL} }; static struct sel_c dcodestr[] = { {'\0', "0", "auto detect"}, {CODE_EUC, "E", STR_EUC}, {CODE_SJIS, "S", STR_SJIS}, {CODE_INNER_EUC, "I", STR_INNER_EUC}, {0, NULL, NULL} }; static struct sel_c scodestr[] = { {CODE_EUC, "E", STR_EUC}, {CODE_SJIS, "S", STR_SJIS}, {0, NULL, NULL} }; #endif /* JP_CHARSET */ #ifdef USE_COLOR static struct sel_c colorstr[] = { #if LANG == JA {0, "black", "黒"}, {1, "red", "赤"}, {2, "green", "緑"}, {3, "yellow", "黄"}, {4, "blue", "青"}, {5, "magenta", "紫"}, {6, "cyan", "空色"}, {7, "white", "白"}, {8, "terminal", "端末"}, {0, NULL, NULL} #else /* LANG != JA */ {0, "black", "black"}, {1, "red", "red"}, {2, "green", "green"}, {3, "yellow", "yellow"}, {4, "blue", "blue"}, {5, "magenta", "magenta"}, {6, "cyan", "cyan"}, {7, "white", "white"}, {8, "terminal", "terminal"}, {0, NULL, NULL} #endif /* LANG != JA */ }; #endif /* USE_COLOR */ #ifdef INET6 static struct sel_c dnsorders[] = { {0, "0", "unspec"}, {1, "1", "inet inet6"}, {2, "2", "inet6 inet"}, {0, NULL, NULL} }; #endif /* INET6 */ #ifdef USE_COOKIE static struct sel_c badcookiestr[] = { {0, "0", "discard"}, #if 0 {1, "1", "accept"}, #endif {2, "2", "ask"}, {0, NULL, NULL} }; #endif /* USE_COOKIE */ struct param_ptr params1[] = { {"tabstop", P_NZINT, PI_TEXT, (void *)&Tabstop, CMT_TABSTOP, NULL}, {"pixel_per_char", P_PIXELS, PI_TEXT, (void *)&pixel_per_char, CMT_PIXEL_PER_CHAR, NULL}, #ifdef JP_CHARSET {"kanjicode", P_CODE, PI_SEL_C, (void *)&DisplayCode, CMT_KANJICODE, kcodestr}, {"document_code", P_CODE, PI_SEL_C, (void *)&DocumentCode, CMT_DOCUMENTCODE, dcodestr}, {"system_code", P_CODE, PI_SEL_C, (void *)&SystemCode, CMT_SYSTEMCODE, scodestr}, #endif /* JP_CHARSET */ {"frame", P_CHARINT, PI_ONOFF, (void *)&RenderFrame, CMT_FRAME, NULL}, {"target_self", P_CHARINT, PI_ONOFF, (void *)&TargetSelf, CMT_TSELF, NULL}, {"display_link", P_INT, PI_ONOFF, (void *)&displayLink, CMT_DISPLINK, 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}, {"multicol", P_INT, PI_ONOFF, (void *)&multicolList, CMT_MULTICOL, NULL}, {"alt_entity", P_CHARINT, PI_ONOFF, (void *)&UseAltEntity, CMT_ALT_ENTITY, 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}, {"show_lnum", P_INT, PI_ONOFF, (void *)&showLineNum, CMT_SHOW_NUM, 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, colorstr}, {"anchor_color", P_COLOR, PI_SEL_C, (void *)&anchor_color, CMT_A_COLOR, colorstr}, {"image_color", P_COLOR, PI_SEL_C, (void *)&image_color, CMT_I_COLOR, colorstr}, {"form_color", P_COLOR, PI_SEL_C, (void *)&form_color, CMT_F_COLOR, colorstr}, #ifdef USE_BG_COLOR {"bg_color", P_COLOR, PI_SEL_C, (void *)&bg_color, CMT_BG_COLOR, 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, 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, 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 {"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}, #ifdef USE_MARK {"mark", P_INT, PI_ONOFF, (void *)&use_mark, CMT_USE_MARK, NULL}, #endif #ifdef EMACS_LIKE_LINEEDIT {"emacs_like_lineedit", P_INT, PI_ONOFF, (void *)&emacs_like_lineedit, CMT_EMACS_LIKE_LINEEDIT, NULL}, #endif #ifdef VI_PREC_NUM {"vi_prec_num", P_INT, PI_ONOFF, (void *)&vi_prec_num, CMT_VI_PREC_NUM, NULL}, #endif #ifdef LABEL_TOPLINE {"label_topline", P_INT, PI_ONOFF, (void *)&label_topline, CMT_LABEL_TOPLINE, NULL}, #endif #ifdef NEXTPAGE_TOPLINE {"nextpage_topline", P_INT, PI_ONOFF, (void *)&nextpage_topline, CMT_NEXTPAGE_TOPLINE, NULL}, #endif {"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_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}, #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}, {NULL, 0, 0, NULL, NULL, NULL}, }; struct param_ptr params4[] = { {"http_proxy", P_STRING, PI_TEXT, (void *)&HTTP_proxy, CMT_HTTP_PROXY, NULL}, #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}, {"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}, }; #if defined(USE_SSL) && defined(USE_SSL_VERIFY) struct param_ptr params7[] = { {"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}, {NULL, 0, 0, NULL, NULL, NULL}, }; #endif /* defined(USE_SSL) && * defined(USE_SSL_VERIFY) */ #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, 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[] = { {"ftppasswd", P_STRING, PI_TEXT, (void *)&ftppasswd, CMT_FTPPASS, NULL}, #ifdef FTPPASS_HOSTNAMEGEN {"ftppass_hostnamegen", P_INT, PI_ONOFF, (void *)&ftppass_hostnamegen, CMT_FTPPASS_HOSTNAMEGEN, NULL}, #endif {"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}, {"follow_redirection", P_INT, PI_TEXT, &FollowRedirection, CMT_FOLLOW_REDIRECTION, NULL}, {"meta_refresh", P_CHARINT, PI_ONOFF, (void *)&MetaRefresh, CMT_META_REFRESH, NULL}, #ifdef USE_SSL {"ssl_forbid_method", P_STRING, PI_TEXT, (void *)&ssl_forbid_method, CMT_SSL_FORBID_METHOD, NULL}, #endif /* USE_SSL */ #ifdef INET6 {"dns_order", P_INT, PI_SEL_C, (void *)&DNS_order, CMT_DNS_ORDER, dnsorders}, #endif /* INET6 */ {NULL, 0, 0, NULL, NULL, NULL}, }; struct param_section sections[] = { #if LANG == JA {"表示関係", params1}, #ifdef USE_COLOR {"表示色", params2}, #endif /* USE_COLOR */ {"雑多な設定", params3}, {"ディレクトリ設定", params5}, {"外部プログラム", params6}, {"ネットワークの設定", params9}, {"プロキシの設定", params4}, #if defined(USE_SSL) && defined(USE_SSL_VERIFY) {"SSL認証設定", params7}, #endif /* defined(USE_SSL) && * defined(USE_SSL_VERIFY) */ #ifdef USE_COOKIE {"クッキーの設定", params8}, #endif #else /* LANG != JA */ {"Display", params1}, #ifdef USE_COLOR {"Color Setting", params2}, #endif /* USE_COLOR */ {"Miscellaneous Setting", params3}, {"Directory Setting", params5}, {"External Programs", params6}, {"Network Setting", params9}, {"Proxy Setting", params4}, #if defined(USE_SSL) && defined(USE_SSL_VERIFY) {"SSL Verification Setting", params7}, #endif /* defined(USE_SSL) && * defined(USE_SSL_VERIFY) */ #ifdef USE_COOKIE {"Cookie Setting", params8}, #endif #endif /* LANG != JA */ {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); } 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; } void show_params(FILE * fp) { int i, j, l; char *t = NULL; char *cmt; fputs("\nconfiguration parameters\n", fp); for (j = 0; sections[j].name != NULL; j++) { #ifdef JP_CHARSET if (InnerCode != DisplayCode) cmt = conv(sections[j].name, InnerCode, DisplayCode)->ptr; else #endif /* JP_CHARSET */ cmt = sections[j].name; fprintf(fp, " section[%d]: %s\n", j, 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 JP_CHARSET case P_CODE: t = "E|S|j|N|m|n"; break; #endif case P_PIXELS: t = "number"; break; } #ifdef JP_CHARSET if (InnerCode != DisplayCode) cmt = conv(sections[j].params[i].comment, InnerCode, DisplayCode)->ptr; else #endif /* JP_CHARSET */ 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, " ", 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 #ifdef JP_CHARSET char str_to_code(char *str) { if (str == NULL) return CODE_ASCII; switch (*str) { case CODE_ASCII: return CODE_ASCII; case CODE_EUC: case 'e': return CODE_EUC; case CODE_SJIS: case 's': return CODE_SJIS; case CODE_JIS_n: return CODE_JIS_n; case CODE_JIS_m: return CODE_JIS_m; case CODE_JIS_N: return CODE_JIS_N; case CODE_JIS_j: return CODE_JIS_j; case CODE_JIS_J: return CODE_JIS_J; case CODE_INNER_EUC: return CODE_INNER_EUC; } return CODE_ASCII; } char * code_to_str(char code) { switch (code) { case CODE_ASCII: return STR_ASCII; case CODE_EUC: return STR_EUC; case CODE_SJIS: return STR_SJIS; case CODE_JIS_n: return STR_JIS_n; case CODE_JIS_m: return STR_JIS_m; case CODE_JIS_N: return STR_JIS_N; case CODE_JIS_j: return STR_JIS_j; case CODE_JIS_J: return STR_JIS_J; case CODE_INNER_EUC: return STR_INNER_EUC; } return "unknown"; } #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 JP_CHARSET case P_CODE: *(char *)p->varptr = str_to_code(value); break; #endif case P_PIXELS: ppc = atof(value); if (ppc >= MINIMUM_PIXEL_PER_CHAR && ppc <= MAXIMUM_PIXEL_PER_CHAR) *(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_GOPHER if (non_null(GOPHER_proxy)) parseURL(GOPHER_proxy, &GOPHER_proxy_parsed, NULL); #endif /* USE_GOPHER */ 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) { WrapSearch = WrapDefault; parse_proxy(); #ifdef USE_COOKIE parse_cookie(); #endif initMailcap(); initMimeTypes(); if (AcceptEncoding == NULL || *AcceptEncoding == '\0') AcceptEncoding = acceptableEncoding(); if (AcceptMedia == NULL || *AcceptMedia == '\0') AcceptMedia = acceptableMimeTypes(); } void init_rc(char *config_filename) { struct stat st; FILE *f; char *tmpdir; if (((tmpdir = getenv("TMP")) == NULL || *tmpdir == '\0') && ((tmpdir = getenv("TEMP")) == NULL || *tmpdir == '\0') && ((tmpdir = getenv("TMPDIR")) == NULL || *tmpdir == '\0')) tmpdir = "/tmp"; if (rc_initialized) return; rc_initialized = 1; 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); rc_dir = tmpdir; rc_dir_is_tmp = TRUE; return; } else { stat(rc_dir, &st); } } else { fprintf(stderr, "Can't open config directory (%s)!", rc_dir); rc_dir = tmpdir; rc_dir_is_tmp = TRUE; return; } } if (!S_ISDIR(st.st_mode)) { /* not a directory */ fprintf(stderr, "%s is not a directory!", rc_dir); rc_dir = tmpdir; rc_dir_is_tmp = TRUE; return; } /* open config file */ if ((f = fopen(etcFile(W3MCONFIG), "rt")) != NULL) { interpret_rc(f); fclose(f); } config_file = config_filename; if (config_file == NULL) config_file = rcFile(CONFIG_FILE); if ((f = fopen(config_file, "rt")) != NULL) { interpret_rc(f); fclose(f); } sync_with_option(); } static char optionpanel_src1[] = "Option Setting Panel\
Option Setting Panel
(w3m version %s)

\n" "%s\n" "

"; static Str to_str(struct param_ptr *p) { switch (p->type) { case P_INT: #ifdef USE_COLOR case P_COLOR: #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: #ifdef JP_CHARSET case P_CODE: #endif return Sprintf("%c", *(char *)p->varptr); case P_STRING: #if defined(USE_SSL) && defined(USE_SSL_VERIFY) case P_SSLPATH: #endif return Strnew_charp(*(char **)p->varptr); case P_PIXELS: return Sprintf("%g", *(double *)p->varptr); } /* not reached */ return NULL; } Buffer * load_option_panel(void) { Str src = Sprintf(optionpanel_src1, w3m_version, CMT_HELPER); struct param_ptr *p; struct sel_c *s; int x, i; Str tmp; Strcat_charp(src, "
"); for (i = 0; sections[i].name != NULL; i++) { Strcat_m_charp(src, "

", sections[i].name, "

", NULL); p = sections[i].params; Strcat_charp(src, ""); while (p->name) { Strcat_m_charp(src, "\n"); p++; } Strcat_charp(src, ""); Strcat_charp(src, "
", p->comment, NULL); Strcat(src, Sprintf("", (int)(28 * pixel_per_char))); switch (p->inputtype) { case PI_TEXT: Strcat_m_charp(src, "ptr), "\">", NULL); break; case PI_ONOFF: x = atoi(to_str(p)->ptr); Strcat_m_charp(src, "ON  OFF", NULL); break; case PI_SEL_C: tmp = to_str(p); Strcat_m_charp(src, ""); } Strcat_charp(src, "


"); } Strcat_charp(src, "
"); return loadHTMLString(src); } void panel_set_option(struct parsed_tagarg *arg) { FILE *f = NULL; if (rc_dir_is_tmp) { 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) { if (set_param(arg->arg, arg->value)) { if (f) fprintf(f, "%s %s\n", arg->arg, arg->value); } 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] == '/'))) return expandName(base); else { Str file = Strnew_charp(rc_dir); if (Strlastchar(file) != '/') Strcat_char(file, '/'); Strcat_charp(file, base); return expandName(file->ptr); } } char * libFile(char *base) { Str file = Strnew_charp(w3m_lib_dir()); Strcat_char(file, '/'); Strcat_charp(file, base); return expandName(file->ptr); } char * etcFile(char *base) { Str file = Strnew_charp(w3m_etc_dir()); Strcat_char(file, '/'); Strcat_charp(file, base); return expandName(file->ptr); } char * helpFile(char *base) { Str file = Strnew_charp(w3m_help_dir()); Strcat_char(file, '/'); Strcat_charp(file, base); return expandName(file->ptr); }