+static void pdf_put_string_contents_wide(pdf_buffer *buf, const afm_char *text)
+{
+ const afm_char *p = text;
+ while (1) {
+ afm_char ch = *p;
+ ch = afm_fix_osx_charset(ch); /* unsafe macro */
+ switch (ch) {
+ case 0:
+ return;
+ case '(':
+ pdf_puts(buf, "\\(");
+ break;
+ case ')':
+ pdf_puts(buf, "\\)");
+ break;
+ case '\\':
+ pdf_puts(buf, "\\\\");
+ break;
+ case '\n':
+ pdf_puts(buf, "\\n");
+ break;
+ case '\r':
+ pdf_puts(buf, "\\r");
+ break;
+ case '\t':
+ pdf_puts(buf, "\\t");
+ break;
+ default:
+ if (ch > 255) {
+ pdf_put_char(buf, '?');
+ } else if (ch > 125 || ch < 32) {
+ pdf_put_char(buf, ch);
+ } else {
+ char tmp[10];
+ snprintf(tmp, sizeof(tmp), "\\%03o", (int)ch);
+ pdf_puts(buf, tmp);
+ }
+ }
+ p++;
+ }
+}
+
+static void pdf_put_string_contents(pdf_buffer *buf, const char *text)
+{
+#ifdef HAVE_MBSTOWCS
+ size_t clen = strlen(text) + 1;
+ wchar_t *cstr = malloc(sizeof(wchar_t) * clen);
+ int text_count = mbstowcs(cstr, text, clen);
+ if (text_count == -1)
+ text_count = mbstowcs(cstr, "Enc-Err", 6);
+ pdf_put_string_contents_wide(buf, cstr);
+#if 0
+ if (*text == 'W') {
+ fprintf(stderr, "Decoding utf8 for '%s'\n", text);
+ wchar_t *p = cstr;
+ char *pp = text;
+ fprintf(stderr, "sz wc = %d\n", sizeof(wchar_t));
+ while (*p) {
+ fprintf(stderr, " %d = %c versus %d = %c\n", *p, (char)*p, 255 & (int)*pp, *pp);
+ p++;
+ pp++;
+ }
+ }
+#endif
+ free(cstr);
+#else
+ pdf_put_string_contents_wide(buf, text);
+#endif
+}
+