tolower(conf.filename[len-2] != 'l') ||
tolower(conf.filename[len-1] != 'p')) {
char *newf;
- newf = mknewa(char, len + 5);
+ newf = snewn(len + 5, char);
sprintf(newf, "%s.hlp", conf.filename);
sfree(conf.filename);
conf.filename = newf;
len = strlen(newf);
}
- cntname = mknewa(char, len+1);
+ cntname = snewn(len+1, char);
sprintf(cntname, "%.*s.cnt", len-4, conf.filename);
}
* Loop over the index entries, preparing final text forms for
* each one.
*/
- for (i = 0; (ie = index234(idx->entries, i)) != NULL; i++) {
- rdstringc rs = {0, 0, NULL};
- whlp_rdaddwc(&rs, ie->text, &conf, NULL);
- ie->backend_data = rs.text;
+ {
+ indexentry *ie_prev = NULL;
+ int nspaces = 1;
+
+ for (i = 0; (ie = index234(idx->entries, i)) != NULL; i++) {
+ rdstringc rs = {0, 0, NULL};
+ charset_state state = CHARSET_INIT_STATE;
+ whlp_rdaddwc(&rs, ie->text, &conf, &state);
+
+ if (ie_prev) {
+ /*
+ * It appears that Windows Help's index mechanism
+ * is inherently case-insensitive. Therefore, if two
+ * adjacent index terms compare equal apart from
+ * case, I'm going to append nonbreaking spaces to
+ * the end of the second one so that Windows will
+ * treat them as distinct.
+ *
+ * This is nasty because we're depending on our
+ * case-insensitive comparison having the same
+ * semantics as the Windows one :-/ but I see no
+ * alternative.
+ */
+ wchar_t *a, *b;
+
+ a = ufroma_dup((char *)ie_prev->backend_data, conf.charset);
+ b = ufroma_dup(rs.text, conf.charset);
+ if (!ustricmp(a, b)) {
+ int j;
+ for (j = 0; j < nspaces; j++)
+ whlp_rdadds(&rs, L"\xA0", &conf, &state);
+ /*
+ * Add one to nspaces, so that if another term
+ * appears which is equivalent to the previous
+ * two it'll acquire one more space.
+ */
+ nspaces++;
+ } else
+ nspaces = 1;
+ sfree(a);
+ sfree(b);
+ }
+
+ whlp_rdadds(&rs, NULL, &conf, &state);
+
+ ie->backend_data = rs.text;
+
+ /*
+ * Only move ie_prev on if nspaces==1 (since when we
+ * have three or more adjacent terms differing only in
+ * case, we will want to compare with the _first_ of
+ * them because that won't have had any extra spaces
+ * added on which will foul up the comparison).
+ */
+ if (nspaces == 1)
+ ie_prev = ie;
+ }
}
whlp_prepare(h);
*/
whlp_begin_topic(h, contents_topic, "Contents", "DB(\"btn_up\")", NULL);
+ state.curr_topic = contents_topic;
/*
* The manual title goes in the non-scroll region, and also
whlp_navmenu(&state, p, &conf);
}
- state.curr_topic = contents_topic;
-
done_contents_topic = TRUE;
}
whlp_set_font(h, FONT_BOLD_CODE);
else
whlp_set_font(h, FONT_CODE);
- tmp = mknewa(wchar_t, n+1);
+ tmp = snewn(n+1, wchar_t);
ustrncpy(tmp, t, n);
tmp[n] = L'\0';
whlp_wtext(&state, tmp);