Changeset View
Changeset View
Standalone View
Standalone View
head/bin/ls/util.c
Show First 20 Lines • Show All 46 Lines • ▼ Show 20 Lines | |||||
#include <err.h> | #include <err.h> | ||||
#include <fts.h> | #include <fts.h> | ||||
#include <limits.h> | #include <limits.h> | ||||
#include <stdio.h> | #include <stdio.h> | ||||
#include <stdlib.h> | #include <stdlib.h> | ||||
#include <string.h> | #include <string.h> | ||||
#include <wchar.h> | #include <wchar.h> | ||||
#include <wctype.h> | #include <wctype.h> | ||||
#include <libxo/xo.h> | |||||
#include "ls.h" | #include "ls.h" | ||||
#include "extern.h" | #include "extern.h" | ||||
int | int | ||||
prn_normal(const char *field, const char *s) | prn_normal(const char *s) | ||||
{ | { | ||||
char fmt[_POSIX2_LINE_MAX]; | |||||
snprintf(fmt, sizeof(fmt), "{:%s/%%hs}", field); | |||||
return xo_emit(fmt, s); | |||||
#if 0 | |||||
mbstate_t mbs; | mbstate_t mbs; | ||||
wchar_t wc; | wchar_t wc; | ||||
int i, n; | int i, n; | ||||
size_t clen; | size_t clen; | ||||
memset(&mbs, 0, sizeof(mbs)); | memset(&mbs, 0, sizeof(mbs)); | ||||
n = 0; | n = 0; | ||||
while ((clen = mbrtowc(&wc, s, MB_LEN_MAX, &mbs)) != 0) { | while ((clen = mbrtowc(&wc, s, MB_LEN_MAX, &mbs)) != 0) { | ||||
Show All 10 Lines | while ((clen = mbrtowc(&wc, s, MB_LEN_MAX, &mbs)) != 0) { | ||||
} | } | ||||
for (i = 0; i < (int)clen; i++) | for (i = 0; i < (int)clen; i++) | ||||
putchar((unsigned char)s[i]); | putchar((unsigned char)s[i]); | ||||
s += clen; | s += clen; | ||||
if (iswprint(wc)) | if (iswprint(wc)) | ||||
n += wcwidth(wc); | n += wcwidth(wc); | ||||
} | } | ||||
return (n); | return (n); | ||||
#endif | |||||
} | } | ||||
char * | int | ||||
get_printable(const char *s) | prn_printable(const char *s) | ||||
{ | { | ||||
mbstate_t mbs; | mbstate_t mbs; | ||||
wchar_t wc; | wchar_t wc; | ||||
int i, n; | int i, n; | ||||
size_t clen; | size_t clen; | ||||
int slen = strlen(s); | |||||
char *buf = alloca(slen + 1), *bp = buf; | |||||
memset(&mbs, 0, sizeof(mbs)); | memset(&mbs, 0, sizeof(mbs)); | ||||
n = 0; | n = 0; | ||||
while ((clen = mbrtowc(&wc, s, MB_LEN_MAX, &mbs)) != 0) { | while ((clen = mbrtowc(&wc, s, MB_LEN_MAX, &mbs)) != 0) { | ||||
if (clen == (size_t)-1) { | if (clen == (size_t)-1) { | ||||
*bp++ = '?'; | putchar('?'); | ||||
s++; | s++; | ||||
n++; | n++; | ||||
memset(&mbs, 0, sizeof(mbs)); | memset(&mbs, 0, sizeof(mbs)); | ||||
continue; | continue; | ||||
} | } | ||||
if (clen == (size_t)-2) { | if (clen == (size_t)-2) { | ||||
*bp++ = '?'; | putchar('?'); | ||||
n++; | n++; | ||||
break; | break; | ||||
} | } | ||||
if (!iswprint(wc)) { | if (!iswprint(wc)) { | ||||
*bp++ = '?'; | putchar('?'); | ||||
s += clen; | s += clen; | ||||
n++; | n++; | ||||
continue; | continue; | ||||
} | } | ||||
for (i = 0; i < (int)clen; i++) | for (i = 0; i < (int)clen; i++) | ||||
*bp++ = (unsigned char)s[i]; | putchar((unsigned char)s[i]); | ||||
s += clen; | s += clen; | ||||
n += wcwidth(wc); | n += wcwidth(wc); | ||||
} | } | ||||
*bp = '\0'; | return (n); | ||||
return strdup(buf); | |||||
} | } | ||||
/* | /* | ||||
* The fts system makes it difficult to replace fts_name with a different- | * The fts system makes it difficult to replace fts_name with a different- | ||||
* sized string, so we just calculate the real length here and do the | * sized string, so we just calculate the real length here and do the | ||||
* conversion in prn_octal() | * conversion in prn_octal() | ||||
* | * | ||||
* XXX when using f_octal_escape (-b) rather than f_octal (-B), the | * XXX when using f_octal_escape (-b) rather than f_octal (-B), the | ||||
Show All 29 Lines | if (iswprint(wc)) | ||||
r++; | r++; | ||||
else | else | ||||
r += 4 * clen; | r += 4 * clen; | ||||
s += clen; | s += clen; | ||||
} | } | ||||
return (r); | return (r); | ||||
} | } | ||||
char * | int | ||||
get_octal(const char *s) | prn_octal(const char *s) | ||||
{ | { | ||||
static const char esc[] = "\\\\\"\"\aa\bb\ff\nn\rr\tt\vv"; | static const char esc[] = "\\\\\"\"\aa\bb\ff\nn\rr\tt\vv"; | ||||
const char *p; | const char *p; | ||||
mbstate_t mbs; | mbstate_t mbs; | ||||
wchar_t wc; | wchar_t wc; | ||||
size_t clen; | size_t clen; | ||||
unsigned char ch; | unsigned char ch; | ||||
int goodchar, i, len, prtlen; | int goodchar, i, len, prtlen; | ||||
int slen = strlen(s); | |||||
char *buf = alloca(slen * 4 + 1), *bp = buf; | |||||
memset(&mbs, 0, sizeof(mbs)); | memset(&mbs, 0, sizeof(mbs)); | ||||
len = 0; | len = 0; | ||||
while ((clen = mbrtowc(&wc, s, MB_LEN_MAX, &mbs)) != 0) { | while ((clen = mbrtowc(&wc, s, MB_LEN_MAX, &mbs)) != 0) { | ||||
goodchar = clen != (size_t)-1 && clen != (size_t)-2; | goodchar = clen != (size_t)-1 && clen != (size_t)-2; | ||||
if (goodchar && iswprint(wc) && wc != L'\"' && wc != L'\\') { | if (goodchar && iswprint(wc) && wc != L'\"' && wc != L'\\') { | ||||
for (i = 0; i < (int)clen; i++) | for (i = 0; i < (int)clen; i++) | ||||
*bp++ = (unsigned char)s[i]; | putchar((unsigned char)s[i]); | ||||
len += wcwidth(wc); | len += wcwidth(wc); | ||||
} else if (goodchar && f_octal_escape && | } else if (goodchar && f_octal_escape && | ||||
#if WCHAR_MIN < 0 | #if WCHAR_MIN < 0 | ||||
wc >= 0 && | wc >= 0 && | ||||
#endif | #endif | ||||
wc <= (wchar_t)UCHAR_MAX && | wc <= (wchar_t)UCHAR_MAX && | ||||
(p = strchr(esc, (char)wc)) != NULL) { | (p = strchr(esc, (char)wc)) != NULL) { | ||||
*bp ++ = '\\'; | putchar('\\'); | ||||
*bp++ = p[1]; | putchar(p[1]); | ||||
len += 2; | len += 2; | ||||
} else { | } else { | ||||
if (goodchar) | if (goodchar) | ||||
prtlen = clen; | prtlen = clen; | ||||
else if (clen == (size_t)-1) | else if (clen == (size_t)-1) | ||||
prtlen = 1; | prtlen = 1; | ||||
else | else | ||||
prtlen = strlen(s); | prtlen = strlen(s); | ||||
for (i = 0; i < prtlen; i++) { | for (i = 0; i < prtlen; i++) { | ||||
ch = (unsigned char)s[i]; | ch = (unsigned char)s[i]; | ||||
*bp++ = '\\'; | putchar('\\'); | ||||
*bp++ = '0' + (ch >> 6); | putchar('0' + (ch >> 6)); | ||||
*bp++ = '0' + ((ch >> 3) & 7); | putchar('0' + ((ch >> 3) & 7)); | ||||
*bp++ = '0' + (ch & 7); | putchar('0' + (ch & 7)); | ||||
len += 4; | len += 4; | ||||
} | } | ||||
} | } | ||||
if (clen == (size_t)-2) | if (clen == (size_t)-2) | ||||
break; | break; | ||||
if (clen == (size_t)-1) { | if (clen == (size_t)-1) { | ||||
memset(&mbs, 0, sizeof(mbs)); | memset(&mbs, 0, sizeof(mbs)); | ||||
s++; | s++; | ||||
} else | } else | ||||
s += clen; | s += clen; | ||||
} | } | ||||
return (len); | |||||
*bp = '\0'; | |||||
return strdup(buf); | |||||
} | } | ||||
void | void | ||||
usage(void) | usage(void) | ||||
{ | { | ||||
xo_error( | (void)fprintf(stderr, | ||||
#ifdef COLORLS | #ifdef COLORLS | ||||
"usage: ls [-ABCFGHILPRSTUWZabcdfghiklmnopqrstuwxy1,] [-D format]" | "usage: ls [-ABCFGHILPRSTUWZabcdfghiklmnopqrstuwxy1,] [-D format]" | ||||
#else | #else | ||||
"usage: ls [-ABCFHILPRSTUWZabcdfghiklmnopqrstuwxy1,] [-D format]" | "usage: ls [-ABCFHILPRSTUWZabcdfghiklmnopqrstuwxy1,] [-D format]" | ||||
#endif | #endif | ||||
" [file ...]\n"); | " [file ...]\n"); | ||||
exit(1); | exit(1); | ||||
} | } |