+static int man_convert(wchar_t *s, int maxlen,
+ char **result, int quote_props);
+
+typedef struct {
+ wchar_t *th;
+ int headnumbers;
+ int mindepth;
+ char *filename;
+} manconfig;
+
+static manconfig man_configure(paragraph *source) {
+ manconfig ret;
+
+ /*
+ * Defaults.
+ */
+ ret.th = NULL;
+ ret.headnumbers = FALSE;
+ ret.mindepth = 0;
+ ret.filename = dupstr("output.1");
+
+ for (; source; source = source->next) {
+ if (source->type == para_Config) {
+ if (!ustricmp(source->keyword, L"man-identity")) {
+ wchar_t *wp, *ep;
+
+ wp = uadv(source->keyword);
+ ep = wp;
+ while (*ep)
+ ep = uadv(ep);
+ sfree(ret.th);
+ ret.th = mknewa(wchar_t, ep - wp + 1);
+ memcpy(ret.th, wp, (ep - wp + 1) * sizeof(wchar_t));
+ } else if (!ustricmp(source->keyword, L"man-headnumbers")) {
+ ret.headnumbers = utob(uadv(source->keyword));
+ } else if (!ustricmp(source->keyword, L"man-mindepth")) {
+ ret.mindepth = utoi(uadv(source->keyword));
+ } else if (!ustricmp(source->keyword, L"man-filename")) {
+ sfree(ret.filename);
+ ret.filename = utoa_dup(uadv(source->keyword));
+ }
+ }
+ }
+
+ return ret;
+}
+
+static void man_conf_cleanup(manconfig cf)
+{
+ sfree(cf.th);
+ sfree(cf.filename);
+}
+
+paragraph *man_config_filename(char *filename)
+{
+ paragraph *p;
+ wchar_t *ufilename, *up;
+ int len;
+
+ p = mknew(paragraph);
+ memset(p, 0, sizeof(*p));
+ p->type = para_Config;
+ p->next = NULL;
+ p->fpos.filename = "<command line>";
+ p->fpos.line = p->fpos.col = -1;
+
+ ufilename = ufroma_dup(filename);
+ len = ustrlen(ufilename) + 2 + lenof(L"man-filename");
+ p->keyword = mknewa(wchar_t, len);
+ up = p->keyword;
+ ustrcpy(up, L"man-filename");
+ up = uadv(up);
+ ustrcpy(up, ufilename);
+ up = uadv(up);
+ *up = L'\0';
+ assert(up - p->keyword < len);
+ sfree(ufilename);
+
+ return p;
+}