version 1.13, 2016/04/10 17:06:52 |
version 1.14, 2022/01/13 05:10:46 |
|
|
int |
int |
main(int argc, char *argv[]) |
main(int argc, char *argv[]) |
{ |
{ |
char *filename, *p = NULL, *t, *u; |
char *filename, *p = NULL, *t, *te, *u; |
FILE *fp; |
FILE *fp; |
ssize_t len; |
ssize_t len; |
size_t ps = 0; |
size_t ps = 0; |
int ch, rval; |
int ch, multibyte, rval; |
|
|
setlocale(LC_CTYPE, ""); |
setlocale(LC_CTYPE, ""); |
|
multibyte = MB_CUR_MAX > 1; |
|
|
if (pledge("stdio rpath", NULL) == -1) |
if (pledge("stdio rpath", NULL) == -1) |
err(1, "pledge"); |
err(1, "pledge"); |
|
|
if (p[len - 1] == '\n') |
if (p[len - 1] == '\n') |
--len; |
--len; |
for (t = p + len - 1; t >= p; --t) { |
for (t = p + len - 1; t >= p; --t) { |
if (isu8cont(*t)) |
te = t; |
continue; |
if (multibyte) |
u = t; |
while (t > p && isu8cont(*t)) |
do { |
--t; |
putchar(*u); |
for (u = t; u <= te; ++u) |
} while (isu8cont(*(++u))); |
if (putchar(*u) == EOF) |
|
err(1, "stdout"); |
} |
} |
putchar('\n'); |
if (putchar('\n') == EOF) |
|
err(1, "stdout"); |
} |
} |
if (ferror(fp)) { |
if (ferror(fp)) { |
warn("%s", filename); |
warn("%s", filename); |
|
|
int |
int |
isu8cont(unsigned char c) |
isu8cont(unsigned char c) |
{ |
{ |
return MB_CUR_MAX > 1 && (c & (0x80 | 0x40)) == 0x80; |
return (c & (0x80 | 0x40)) == 0x80; |
} |
} |
|
|
void |
void |