#include #include #include #include #include #include struct titlecase_context { casing_prefix_context_t ctx; }; int titlecase_partial(struct titlecase_context *ctx, const void **_start, size_t *len, unsigned char *result_r, size_t *result_len) { const uint8_t *ptr; const uint8_t *start = *_start; if ((ptr = u8_check(start, *len)) != NULL) { /* not fully good, so use only parts of it */ *len = ptr-start; } casing_prefix_context_t case_ctx = ctx->ctx; ctx->ctx = u8_casing_prefixes_context(start, *len, case_ctx); if (u8_ct_totitle(start, *len, case_ctx, unicase_empty_suffix_context, "fr", UNINORM_NFC, result_r, result_len) == NULL) { return -1; } *_start = start + *len; return 0; } int main(void) { FILE *f = fopen("udhr-fra.txt", "r"); if (f == NULL) { perror("fopen: "); return 1; } unsigned char buf[32]; size_t r = 0, off = 0; struct titlecase_context ctx = { .ctx = unicase_empty_prefix_context, }; while((r = fread(buf+off, 1, sizeof(buf)-off, f)) > 0) { const void *bufptr = buf; unsigned char newbuf[64] = {0}; size_t len = sizeof(newbuf); size_t foo = r+off; r += off; if (titlecase_partial(&ctx, &bufptr, &r, newbuf, &len) < 0) return 1; fwrite(newbuf, len, 1, stdout); if (r == foo) { off = 0; } else { memmove(buf, buf+r, sizeof(buf) - r); off = sizeof(buf) - r; } } return 0; }