#include #include #include #include #include int main(int argc, char **argv) { char *buffer = NULL; size_t buflen = 0; char *extrabuf = NULL; size_t extralen = 0; const char *hexdigit = "0123456789abcdef"; if (argc < 3) { fprintf(stderr, "Usage: strxfrm {collation} {string}...\n"); exit(1); } if (setlocale(LC_COLLATE, argv[1]) == NULL) { fprintf(stderr, "setlocale: %s\n", strerror(errno)); exit(1); } argv += 2; while (*argv) { size_t r; size_t k; r = strxfrm(buffer, *argv, buflen); if (r > buflen) { if (buffer != NULL) free(buffer); buflen = r + 1; buffer = malloc(buflen); if (buffer == NULL) { fprintf(stderr, "out of memory\n"); exit(1); } continue; } if (extralen < 2 * r + 1) { if (extrabuf != NULL) free(extrabuf); extralen = 2 * r + 1; extrabuf = malloc(extralen); if (extrabuf == NULL) { fprintf(stderr, "out of memory\n"); exit(1); } } for (k = 0; k < r; ++k) { unsigned char c = buffer[k]; extrabuf[2 * k] = hexdigit[c >> 4]; extrabuf[2 * k + 1] = hexdigit[c & 15]; } extrabuf[2 * k] = '\0'; printf("\"%s\" -> %s (%d bytes)\n", *argv, extrabuf, r); ++argv; } exit(0); }