version 1.4, 2005/04/02 19:17:26 |
version 1.5, 2005/04/03 18:31:00 |
|
|
#define FMT_ZERO '0' |
#define FMT_ZERO '0' |
#define FMT_MINUS '-' |
#define FMT_MINUS '-' |
|
|
#define FMT_DECIMAL 'D' |
#define FMT_DECIMAL 'D' |
#define FMT_OCTAL 'O' |
#define FMT_OCTAL 'O' |
#define FMT_UNSIGNED 'U' |
#define FMT_UNSIGNED 'U' |
#define FMT_HEX 'X' |
#define FMT_HEX 'X' |
#define FMT_FLOAT 'F' |
#define FMT_FLOAT 'F' |
#define FMT_STRING 'S' |
#define FMT_STRING 'S' |
|
|
#define FMTF_DECIMAL 0x01 |
#define FMTF_DECIMAL 0x01 |
#define FMTF_OCTAL 0x02 |
#define FMTF_OCTAL 0x02 |
|
|
errno == ENOENT && |
errno == ENOENT && |
(rc = lstat(argv[0], &st)) == -1) |
(rc = lstat(argv[0], &st)) == -1) |
errno = ENOENT; |
errno = ENOENT; |
} |
} else |
else |
|
rc = lstat(argv[0], &st); |
rc = lstat(argv[0], &st); |
|
|
if (rc == -1) { |
if (rc == -1) { |
|
|
if (!quiet) |
if (!quiet) |
warn("%s: stat", |
warn("%s: stat", |
argc == 0 ? "(stdin)" : argv[0]); |
argc == 0 ? "(stdin)" : argv[0]); |
} |
} else |
else |
|
output(&st, argv[0], statfmt, fn, nonl, quiet); |
output(&st, argv[0], statfmt, fn, nonl, quiet); |
|
|
argv++; |
argv++; |
|
|
exit(1); |
exit(1); |
} |
} |
|
|
/* |
/* |
* Parses a format string. |
* Parses a format string. |
*/ |
*/ |
void |
void |
|
|
*/ |
*/ |
flags = 0; |
flags = 0; |
do { |
do { |
if (*statfmt == FMT_POUND) |
if (*statfmt == FMT_POUND) |
flags |= FLAG_POUND; |
flags |= FLAG_POUND; |
else if (*statfmt == FMT_SPACE) |
else if (*statfmt == FMT_SPACE) |
flags |= FLAG_SPACE; |
flags |= FLAG_SPACE; |
|
|
#undef fmtcasef |
#undef fmtcasef |
#undef fmtcase |
#undef fmtcase |
|
|
t = format1(st, |
t = format1(st, file, subfmt, statfmt - subfmt, buf, |
file, |
sizeof(buf), flags, size, prec, ofmt, hilo, what); |
subfmt, statfmt - subfmt, |
|
buf, sizeof(buf), |
|
flags, size, prec, ofmt, hilo, what); |
|
|
|
for (i = 0; i < t && i < sizeof(buf); i++) |
for (i = 0; i < t && i < sizeof(buf); i++) |
addchar(stdout, buf[i], &nl); |
addchar(stdout, buf[i], &nl); |
|
|
data = (what == SHOW_st_dev) ? st->st_dev : st->st_rdev; |
data = (what == SHOW_st_dev) ? st->st_dev : st->st_rdev; |
sdata = (what == SHOW_st_dev) ? |
sdata = (what == SHOW_st_dev) ? |
devname(st->st_dev, S_IFBLK) : |
devname(st->st_dev, S_IFBLK) : |
devname(st->st_rdev, |
devname(st->st_rdev, |
S_ISCHR(st->st_mode) ? S_IFCHR : |
S_ISCHR(st->st_mode) ? S_IFCHR : |
S_ISBLK(st->st_mode) ? S_IFBLK : |
S_ISBLK(st->st_mode) ? S_IFBLK : |
0U); |
0U); |
|
|
if (hilo == HIGH_PIECE) { |
if (hilo == HIGH_PIECE) { |
data = major(data); |
data = major(data); |
hilo = 0; |
hilo = 0; |
} |
} else if (hilo == LOW_PIECE) { |
else if (hilo == LOW_PIECE) { |
|
data = minor((unsigned)data); |
data = minor((unsigned)data); |
hilo = 0; |
hilo = 0; |
} |
} |
|
|
sdata += 1; |
sdata += 1; |
sdata[3] = '\0'; |
sdata[3] = '\0'; |
hilo = 0; |
hilo = 0; |
} |
} else if (hilo == MIDDLE_PIECE) { |
else if (hilo == MIDDLE_PIECE) { |
|
data = (data >> 9) & 07; |
data = (data >> 9) & 07; |
sdata += 4; |
sdata += 4; |
sdata[3] = '\0'; |
sdata[3] = '\0'; |
hilo = 0; |
hilo = 0; |
} |
} else if (hilo == LOW_PIECE) { |
else if (hilo == LOW_PIECE) { |
|
data &= 0777; |
data &= 0777; |
sdata += 7; |
sdata += 7; |
sdata[3] = '\0'; |
sdata[3] = '\0'; |
|
|
} |
} |
path[l + 4] = '\0'; |
path[l + 4] = '\0'; |
sdata = path + (ofmt == FMTF_STRING ? 0 : 4); |
sdata = path + (ofmt == FMTF_STRING ? 0 : 4); |
} |
} else { |
else { |
|
linkfail = 1; |
linkfail = 1; |
sdata = ""; |
sdata = ""; |
} |
} |
|
|
break; |
break; |
} |
} |
hilo = 0; |
hilo = 0; |
} |
} else if (hilo == HIGH_PIECE) { |
else if (hilo == HIGH_PIECE) { |
|
switch (st->st_mode & S_IFMT) { |
switch (st->st_mode & S_IFMT) { |
case S_IFIFO: sdata = "Fifo File"; break; |
case S_IFIFO: sdata = "Fifo File"; break; |
case S_IFCHR: sdata = "Character Device"; break; |
case S_IFCHR: sdata = "Character Device"; break; |
|
|
char majdev[20], mindev[20]; |
char majdev[20], mindev[20]; |
int l1, l2; |
int l1, l2; |
|
|
l1 = format1(st, |
l1 = format1(st, file, fmt, flen, |
file, |
majdev, sizeof(majdev), flags, size, prec, |
fmt, flen, |
|
majdev, sizeof(majdev), |
|
flags, size, prec, |
|
ofmt, HIGH_PIECE, SHOW_st_rdev); |
ofmt, HIGH_PIECE, SHOW_st_rdev); |
l2 = format1(st, |
l2 = format1(st, file, fmt, flen, |
file, |
mindev, sizeof(mindev), flags, size, prec, |
fmt, flen, |
|
mindev, sizeof(mindev), |
|
flags, size, prec, |
|
ofmt, LOW_PIECE, SHOW_st_rdev); |
ofmt, LOW_PIECE, SHOW_st_rdev); |
return (snprintf(buf, blen, "%.*s,%.*s", |
return (snprintf(buf, blen, "%.*s,%.*s", |
l1, majdev, l2, mindev)); |
l1, majdev, l2, mindev)); |
|
} else { |
|
return (format1(st, file, fmt, flen, buf, blen, |
|
flags, size, prec, ofmt, 0, SHOW_st_size)); |
} |
} |
else { |
|
return (format1(st, |
|
file, |
|
fmt, flen, |
|
buf, blen, |
|
flags, size, prec, |
|
ofmt, 0, SHOW_st_size)); |
|
} |
|
/*NOTREACHED*/ |
/*NOTREACHED*/ |
default: |
default: |
errx(1, "%.*s: bad format", (int)flen, fmt); |
errx(1, "%.*s: bad format", (int)flen, fmt); |
|
|
/* |
/* |
* Only the timespecs support the FLOAT output format, and that |
* Only the timespecs support the FLOAT output format, and that |
* requires work that differs from the other formats. |
* requires work that differs from the other formats. |
*/ |
*/ |
if (ofmt == FMTF_FLOAT) { |
if (ofmt == FMTF_FLOAT) { |
/* |
/* |
* Nothing after the decimal point, so just print seconds. |
* Nothing after the decimal point, so just print seconds. |