char * rxvt_wcstombs (const wchar_t *str, int len) { if (len < 0) len = wcslen (str); mbstate mbs; char *r = (char *)rxvt_malloc (len * MB_CUR_MAX + 1); char *dst = r; while (len--) { ssize_t l = wcrtomb (dst, *str++, mbs); if (l < 0) { *dst++ = '?'; wcrtomb (0, 0, mbs); // reset undefined state } else dst += l; } *dst++ = 0; return (char *)rxvt_realloc (r, dst - r); }
/* INTPROTO */ void kstate_add_xlat(char *str) { K_XLAT *xlat; u_int *pval_tmp; char *sval; int i; if (str == NULL) return; /* add a new xlat table in state */ if (pStateNow->num_xlat == 0) { pStateNow->xlat = rxvt_malloc(sizeof(K_XLAT)); } else /* prefer contiguous data, realloc */ pStateNow->xlat = rxvt_realloc (pStateNow->xlat, (pStateNow->num_xlat + 1) * sizeof(K_XLAT)); xlat = &pStateNow->xlat[pStateNow->num_xlat]; /* parse str and derive first, last, values */ xlat->first = (u_int) atoi(strtok(str, "-")); xlat->last = (u_int) atoi(strtok(NULL, ":")); i = 0; pval_tmp = calloc(MAX_VAL, sizeof(K_XLAT)); while ((sval = strtok(NULL, ",")) != NULL) pval_tmp[i++] = (u_int) (atoi(sval)); xlat->pval = calloc(i, sizeof(K_XLAT)); if (xlat->pval != NULL) MEMCPY(xlat->pval, pval_tmp, i * sizeof(u_int)); free(pval_tmp); pStateNow->num_xlat++; }