+static char *quotestr(char *str)
+{
+ unsigned char *buf;
+ unsigned char *p;
+ size_t bufsize, bufdata;
+ wchar_t *wbuf;
+ static char *enc = NULL;
+ size_t encsize, encdata;
+
+ buf = NULL;
+ bufsize = bufdata = 0;
+ for(p = (unsigned char *)str; *p; p++)
+ {
+ if(*p == '\b')
+ bufcat(buf, "\\b", 2);
+ else if(*p == '\t')
+ bufcat(buf, "\\t", 2);
+ else if(*p == '\n')
+ bufcat(buf, "\\n", 2);
+ else if(*p == '\r')
+ bufcat(buf, "\\r", 2);
+ else if(*p == '\\')
+ bufcat(buf, "\\\\", 2);
+ else if(*p >= 32)
+ addtobuf(buf, *p);
+ else
+ bprintf(buf, "\\x%02x", *p);
+ }
+ addtobuf(buf, 0);
+ if(enc != NULL)
+ free(enc);
+ enc = NULL;
+ if((wbuf = icmbstowcs((char *)buf, DCCHARSET)) != NULL)
+ {
+ enc = icwcstombs(wbuf, NULL);
+ free(wbuf);
+ }
+ if(enc == NULL)
+ {
+ encsize = encdata = 0;
+ for(p = buf; *p; p++) {
+ if(*p < 128)
+ addtobuf(enc, *p);
+ else
+ bprintf(buf, "\\x%x", *p);
+ }
+ }
+ free(buf);
+ return(enc);
+}
+
+static void logunimpl(char *list, char *cmd, char *args)
+{
+ FILE *log;
+
+ if((log = fopen("/tmp/dc-unimpl", "a")) == NULL)
+ {
+ flog(LOG_WARNING, "could not open unimpl log: %s", strerror(errno));
+ return;
+ }
+ fputs(list, log);
+ fputc('\t', log);
+ fputs(quotestr(cmd), log);
+ if(args != NULL)
+ {
+ fputc('\t', log);
+ fputs(quotestr(args), log);
+ }
+ fputc('\n', log);
+ fclose(log);
+}
+