99 #include <unicode/ucasemap.h>
100 #include <unicode/ustring.h>
101 #include <unicode/uchar.h>
109 #define STR(x) vstring_str(x)
110 #define LEN(x) VSTRING_LEN(x)
136 const char myname[] =
"casefold";
138 static UCaseMap *csm = 0;
140 ssize_t space_needed;
149 dest = (fold_buf != 0 ? fold_buf : (fold_buf =
vstring_alloc(100)));
150 if ((flags & CASEF_FLAG_APPEND) == 0)
172 *err =
"malformed UTF-8 or invalid codepoint";
181 error = U_ZERO_ERROR;
182 csm = ucasemap_open(
"en_US", U_FOLD_CASE_DEFAULT, &error);
183 if (U_SUCCESS(error) == 0)
184 msg_fatal(
"ucasemap_open error: %s", u_errorName(error));
198 for (n = 0; n < 3; n++) {
199 error = U_ZERO_ERROR;
200 space_needed = ucasemap_utf8FoldCase(csm,
STR(dest) + old_len,
202 if (U_SUCCESS(error)) {
207 }
else if (error == U_BUFFER_OVERFLOW_ERROR) {
210 msg_fatal(
"%s: conversion error for \"%s\": %s",
211 myname, src, u_errorName(error));
220 static void encode_utf8(
VSTRING *buffer,
int codepoint)
222 const char myname[] =
"encode_utf8";
225 if (codepoint < 0x80) {
227 }
else if (codepoint < 0x800) {
230 }
else if (codepoint < 0x10000) {
234 }
else if (codepoint <= 0x10FFFF) {
240 msg_panic(
"%s: out-of-range codepoint U+%X", myname, codepoint);
253 int main(
int argc,
char **argv)
260 int codepoint, first, last;
263 if (setlocale(LC_ALL,
"C") == 0)
264 msg_fatal(
"setlocale(LC_ALL, C) failed: %m");
276 if (cmd == 0 || *cmd ==
'#')
284 if (strcmp(cmd,
"fold") == 0) {
292 else if (strcmp(cmd,
"range") == 0
293 && sscanf(bp,
"%i %i", &first, &last) == 2
295 for (codepoint = first; codepoint <= last; codepoint++) {
296 if (codepoint >= 0xD800 && codepoint <= 0xDFFF) {
300 encode_utf8(buffer, codepoint);
304 msg_fatal(
"bad utf-8 encoding for U+%X\n", codepoint);
314 else if (strcmp(cmd,
"chroot") == 0
315 && sscanf(bp,
"%255s",
STR(buffer)) == 1) {
316 if (geteuid() == 0) {
317 if (chdir(
STR(buffer)) < 0)
319 if (chroot(
STR(buffer)) < 0)
328 else if (strcmp(cmd,
"file") == 0
329 && sscanf(bp,
"%255s",
STR(buffer)) == 1) {
340 else if (strcmp(cmd,
"verbose") == 0
349 vstream_printf(
"Usage: %s chroot <path> | file <path> | fold <text> | range <first> <last> | verbose <int>\n",
#define vstring_fgets_nonl(s, p)
NORETURN msg_panic(const char *fmt,...)
int main(int argc, char **argv)
int valid_utf8_string(const char *, ssize_t)
VSTRING * vstring_strncat(VSTRING *vp, const char *src, ssize_t len)
char * mystrtok(char **src, const char *sep)
VSTREAM * vstream_fopen(const char *path, int flags, mode_t mode)
#define casefold(dst, src)
#define VSTRING_TERMINATE(vp)
char * casefoldx(int flags, VSTRING *dest, const char *src, ssize_t len)
#define VSTRING_ADDCH(vp, ch)
#define CASEF_FLAG_APPEND
int vstream_fclose(VSTREAM *stream)
VSTREAM * vstream_printf(const char *fmt,...)
#define VSTRING_RESET(vp)
VSTRING * vstring_alloc(ssize_t len)
char * lowercase(char *string)
#define vstring_avail(vp)
NORETURN msg_fatal(const char *fmt,...)
int vstream_fflush(VSTREAM *stream)
#define VSTRING_SPACE(vp, len)
VSTRING * vstring_free(VSTRING *vp)
#define VSTRING_AT_OFFSET(vp, offset)
void msg_vstream_init(const char *name, VSTREAM *vp)