aboutsummaryrefslogtreecommitdiffstats
path: root/rc.c
diff options
context:
space:
mode:
Diffstat (limited to 'rc.c')
-rw-r--r--rc.c1256
1 files changed, 1256 insertions, 0 deletions
diff --git a/rc.c b/rc.c
new file mode 100644
index 0000000..49e59b9
--- /dev/null
+++ b/rc.c
@@ -0,0 +1,1256 @@
+
+/*
+ * Initialization file etc.
+ */
+#include "fm.h"
+#include "myctype.h"
+#include <stdio.h>
+#include <errno.h>
+#include "parsetag.h"
+#include "local.h"
+#include "terms.h"
+#include <stdlib.h>
+
+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;
+
+#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 COLOR
+#define P_COLOR 6
+#endif
+#ifdef JP_CHARSET
+#define P_CODE 7
+#endif
+#define P_PIXELS 8
+
+#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_TSELF "targetが未指定の場合に_selfを使用する"
+#define CMT_DISPLINK "リンク先の自動表示"
+#define CMT_MULTICOL "ファイル名のマルチカラム表示"
+#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_DNS_ORDER "名前解決の順序"
+#define CMT_DROOT "/ で表されるディレクトリ(document root)"
+#define CMT_PDROOT "/~user で表されるディレクトリ"
+#define CMT_CGIBIN "/cgi-bin で表されるディレクトリ"
+#define CMT_CONFIRM_QQ "q での終了時に確認する"
+#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を使う)"
+#define CMT_USERAGENT "User-Agent"
+#define CMT_ACCEPTLANG "受けつける言語(Accept-Language:)"
+#define CMT_DOCUMENTCODE "文書の文字コード"
+#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:// を補う"
+#ifdef MOUSE
+#define CMT_MOUSE "マウスを使う"
+#define CMT_REVERSE_MOUSE "マウスのドラッグ動作を逆にする"
+#endif /* 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
+
+
+#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_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_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_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"
+#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)"
+#define CMT_USERAGENT "User-Agent"
+#define CMT_ACCEPTLANG "Accept-Language"
+/* #define CMT_DOCUMENTCODE "Document Charset" */
+#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"
+#ifdef MOUSE
+#define CMT_MOUSE "Use mouse"
+#define CMT_REVERSE_MOUSE "Reverse mouse dragging action"
+#endif /* 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
+#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}
+};
+#endif /* JP_CHARSET */
+
+#ifdef 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 /* 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_INT, 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},
+#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},
+ {"ignore_null_img_alt", P_INT, PI_ONOFF, (void *) &ignore_null_img_alt, CMT_IGNORE_NULL_IMG_ALT, NULL},
+ {NULL, 0, 0, NULL, NULL, NULL},
+};
+
+#ifdef 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 BG_COLOR
+ {"bg_color", P_COLOR, PI_SEL_C, (void *) &bg_color, CMT_BG_COLOR, colorstr},
+#endif /* 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 /* COLOR */
+
+
+struct param_ptr params3[] =
+{
+ {"pagerline", P_INT, 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},
+{"show_lnum", P_INT, PI_ONOFF, (void *) &showLineNum, CMT_SHOW_NUM, NULL},
+{"ftppasswd", P_STRING, PI_TEXT, (void *) &ftppasswd, CMT_FTPPASS, 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},
+#ifdef JP_CHARSET
+ {"document_code", P_CODE, PI_SEL_C, (void *) &DocumentCode, CMT_DOCUMENTCODE, dcodestr},
+#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 VIEW_UNSEENOBJECTS
+ {"view_unseenobject", P_INT, PI_ONOFF, (void *) &view_unseenobject, CMT_VIEW_UNSEENOBJECTS, NULL},
+#endif /* VIEW_UNSEENOBJECTS */
+#ifdef 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 /* MOUSE */
+ {"retry_http", P_INT, PI_ONOFF, (void *) &retryAsHttp, CMT_RETRY_HTTP, NULL},
+ {"clear_buffer", P_INT, PI_ONOFF, (void *) &clear_buffer, CMT_CLEAR_BUF, NULL},
+#ifdef USE_SSL
+ {"ssl_forbid_method", P_STRING, PI_TEXT, (void *) &ssl_forbid_method, CMT_SSL_FORBID_METHOD, NULL},
+#endif /* USE_SSL */
+ {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},
+#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_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_section sections[] =
+{
+#if LANG == JA
+ {"表示関係", params1},
+#ifdef COLOR
+ {"表示色", params2},
+#endif /* COLOR */
+ {"その他の設定", params3},
+ {"プロキシの設定", params4},
+ {"ディレクトリ設定", params5},
+ {"外部プログラム", params6},
+#if defined(USE_SSL) && defined(USE_SSL_VERIFY)
+ {"SSL認証設定", params7},
+#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
+ {"クッキーの設定", params8},
+#endif
+#else /* LANG != JA */
+ {"Display", params1},
+#ifdef COLOR
+ {"Color Setting", params2},
+#endif /* COLOR */
+ {"Other Behavior", params3},
+ {"Proxy Setting", params4},
+ {"Directory Setting", params5},
+ {"External Programs", params6},
+#if defined(USE_SSL) && defined(USE_SSL_VERIFY)
+ {"SSL Verification Setting", params7},
+#endif /* defined(USE_SSL) &&
+ * defined(USE_SSL_VERIFY) */
+#ifdef USE_SSL
+#define CMT_SSL_FORBID_METHOD N_("List of forbidden SSL method (2: SSLv2, 3: SSLv3, t:TLSv1)")
+#endif
+#ifdef USE_COOKIE
+ {"Cookie Setting", params8},
+#endif
+#endif /* LANG != JA */
+ {NULL, NULL}
+};
+
+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 = &sections[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;
+}
+
+#ifdef SHOW_PARAMS
+void
+show_params(FILE * fp)
+{
+ int i, j, l;
+ char *t;
+ 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:
+ 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 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++;
+ }
+ }
+}
+#endif
+
+static int
+str_to_bool(char *value)
+{
+ if (value == NULL)
+ return 1;
+ switch (tolower(*value)) {
+ case '0':
+ case 'f': /* false */
+ case 'n': /* no */
+ case 'u': /* undef */
+ return 0;
+ }
+ return 1;
+}
+
+#ifdef 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:
+ *(int *) p->varptr = (p->inputtype == PI_ONOFF) ? str_to_bool(value) : atoi(value);
+ break;
+ case P_SHORT:
+ *(short *) p->varptr = (p->inputtype == PI_ONOFF) ? str_to_bool(value) : atoi(value);
+ break;
+ case P_CHARINT:
+ *(char *) p->varptr = (p->inputtype == PI_ONOFF) ? str_to_bool(value) : 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 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;
+}
+
+static void sync_with_option(void);
+
+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:
+ sync_with_option();
+ return 1;
+}
+
+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__ */
+
+struct table2 *
+loadMimeTypes(char *filename)
+{
+ FILE *f;
+ char *d, *type;
+ int i, n;
+ Str tmp;
+ struct table2 *mtypes;
+
+ f = fopen(expandName(filename), "r");
+ if (f == NULL)
+ return NULL;
+ n = 0;
+ while (tmp = Strfgets(f), tmp->length > 0) {
+ d = tmp->ptr;
+ if (d[0] != '#') {
+ d = strtok(d, " \t\n\r");
+ if (d != NULL) {
+ d = strtok(NULL, " \t\n\r");
+ for (i = 0; d != NULL; i++)
+ d = strtok(NULL, " \t\n\r");
+ n += i;
+ }
+ }
+ }
+ fseek(f, 0, 0);
+ mtypes = New_N(struct table2, n + 1);
+ i = 0;
+ while (tmp = Strfgets(f), tmp->length > 0) {
+ d = tmp->ptr;
+ if (d[0] == '#')
+ continue;
+ type = strtok(d, " \t\n\r");
+ if (type == NULL)
+ continue;
+ while (1) {
+ d = strtok(NULL, " \t\n\r");
+ if (d == NULL)
+ break;
+ mtypes[i].item1 = Strnew_charp(d)->ptr;
+ mtypes[i].item2 = Strnew_charp(type)->ptr;
+ i++;
+ }
+ }
+ mtypes[i].item1 = NULL;
+ mtypes[i].item2 = NULL;
+ fclose(f);
+ return mtypes;
+}
+
+void
+initMimeTypes()
+{
+ int i;
+ TextListItem *tl;
+
+ if (non_null(mimetypes_files))
+ mimetypes_list = make_domain_list(mimetypes_files);
+ else
+ mimetypes_list = NULL;
+ if (mimetypes_list == NULL)
+ return;
+ UserMimeTypes = New_N(struct table2 *, mimetypes_list->nitem);
+ for (i = 0, tl = mimetypes_list->first; tl; i++, tl = tl->next)
+ UserMimeTypes[i] = loadMimeTypes(tl->ptr);
+}
+
+static void
+sync_with_option(void)
+{
+ WrapSearch = WrapDefault;
+ parse_proxy();
+#ifdef USE_COOKIE
+ parse_cookie();
+#endif
+ initMailcap();
+ initMimeTypes();
+}
+
+void
+init_rc(char *config_file)
+{
+ struct stat st;
+ FILE *f;
+#ifndef __EMX__ /* jsawa */
+ char *tmpdir = "/tmp";
+#else
+ char *tmpdir;
+
+ if ( (tmpdir = getenv("TMP")) == NULL || *tmpdir == '\0' )
+ if ( (tmpdir = getenv("TEMP")) == NULL || *tmpdir == '\0' )
+ if ( (tmpdir = getenv("TMPDIR")) == NULL || *tmpdir == '\0' )
+ *tmpdir = "/tmp";
+#endif /* __EMX__ */
+
+ 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(libFile(W3MCONFIG), "rt")) != NULL) {
+ interpret_rc(f);
+ fclose(f);
+ }
+ 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[] =
+"<html><head><title>Option Setting Panel</title></head>\
+<body><center><b>Option Setting Panel</b></center><p>\n"
+#ifdef __EMX__
+"<a href=\"file:///$LIB/w3mhelperpanel.exe?mode=panel\">%s</a>\n"
+#else /* not __EMX__ */
+"<a href=\"file:///$LIB/w3mhelperpanel?mode=panel\">%s</a>\n"
+#endif /* not __EMX__ */
+"<form method=internal action=option>";
+
+static Str
+to_str(struct param_ptr *p)
+{
+ switch (p->type) {
+ case P_INT:
+#ifdef COLOR
+ case P_COLOR:
+#endif
+ 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, CMT_HELPER);
+ struct param_ptr *p;
+ struct sel_c *s;
+ int x, i;
+ Str tmp;
+
+ 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=\"",
+ htmlquote_str( 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" : ""),
+ ">ON&nbsp;&nbsp;<input type=radio name=",
+ p->name,
+ " value=0",
+ (x ? "" : " checked"),
+ ">OFF", NULL);
+ break;
+ case PI_SEL_C:
+ tmp = to_str(p);
+ Strcat_m_charp(src, "<select name=",
+ p->name,
+ ">", NULL);
+ for (s = p->select; s->text != NULL; s++) {
+ Strcat_charp(src, "<option value=");
+ Strcat(src, Sprintf("%s\n", s->cvalue));
+ if ((p->type != P_CHAR &&
+#ifdef JP_CHARSET
+ p->type != P_CODE &&
+#endif
+ s->value == atoi(tmp->ptr)) ||
+ ((p->type == P_CHAR
+#ifdef JP_CHARSET
+ || p->type == P_CODE
+#endif
+ ) && (char) (s->value) == *(tmp->ptr)))
+ Strcat_charp(src, " selected");
+ Strcat_char(src, '>');
+ Strcat_charp(src, s->text);
+ }
+ Strcat_charp(src, "</select>");
+ }
+ 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>");
+ 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)
+{
+#ifdef __EMX__
+ Str file = Strnew_charp(get_os2_dft("W3M_LIB_DIR", LIB_DIR));
+#else
+ Str file = Strnew_charp(LIB_DIR);
+#endif /* __EMX__ */
+
+ Strcat_char(file, '/');
+ Strcat_charp(file, base);
+ return expandName(file->ptr);
+}
+
+char *
+helpFile(char *base)
+{
+#ifdef __EMX__
+ Str file = Strnew_charp(get_os2_dft("W3M_HELP_DIR", HELP_DIR));
+#else /* not __EMX__ */
+ Str file = Strnew_charp(HELP_DIR);
+#endif /* not __EMX__ */
+ Strcat_char(file, '/');
+ Strcat_charp(file, base);
+ return expandName(file->ptr);
+}