return s;
}
-void stat_one(char *fmt, char *timefmt, char *filename, struct stat *buf) {
+void stat_one(char *fmt, char *timefmt, int zeroterm, char *filename, struct
+ stat *buf) {
struct tm *tm;
char timestr[1024];
struct format_string f;
fmt = format_string_parse(fmt, &f);
if (!f.found) break; /* done */
if (!f.flags) {
+ if (f.found == '\\') {
+ switch (*fmt) {
+ case 0:
+ continue; break;
+ case 'n':
+ putchar('\n'); break;
+ case 't':
+ putchar('\t'); break;
+ default:
+ putchar(*fmt);
+ break;
+ }
+ fmt++;
+ continue;
+ }
/* literal/noformat */
putchar(f.found); /* or whatever */
continue;
case 'n':
printf("%s", filename);
break;
+ case 'z':
+ putchar(0); break;
case '%':
putchar('%');
break;
break;
}
}
- putchar('\n');
+ if (zeroterm & 2) {
+ return;
+ }
+
+ if (zeroterm & 1 ) {
+ putchar(0);
+ } else {
+ putchar('\n');
+ }
}
int main(int ac, char *av[]) {
int errflg = 0;
int c;
int uselstat = 0;
+ int zeroterm = 0;
- while ((c = getopt(ac, av, "lf:t:")) != -1) {
+ while ((c = getopt(ac, av, "lf:t:0")) != -1) {
switch(c) {
case 'f':
fmt = optarg;
"Option -%c requires an operand\n", optopt);
errflg++;
break;
+ case 'z':
+ zeroterm |= 2;
+ case '0':
+ zeroterm |= 1;
+ break;
case 'l':
uselstat = 1;
break;
} else {
stat(av[optind], &buf);
}
- stat_one(fmt, timefmt, av[optind], &buf);
+ stat_one(fmt, timefmt, zeroterm, av[optind], &buf);
}
return 0;
}