]> pd.if.org Git - zpackage/blobdiff - zpm-stat.c
expand docs
[zpackage] / zpm-stat.c
index b8cb9d767cb906746aae7f4bc78626360f2dee18..d9f5aa115a8985ab24beaffc8cc58f50f63254e8 100644 (file)
@@ -60,7 +60,8 @@ char *format_string_parse(char *s, struct format_string *f) {
        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;
@@ -71,6 +72,21 @@ void stat_one(char *fmt, char *timefmt, char *filename, struct stat *buf) {
                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;
@@ -126,6 +142,8 @@ void stat_one(char *fmt, char *timefmt, char *filename, struct stat *buf) {
                        case 'n':
                                printf("%s", filename);
                                break;
+                       case 'z':
+                               putchar(0); break;
                        case '%':
                                putchar('%');
                                break;
@@ -134,7 +152,15 @@ void stat_one(char *fmt, char *timefmt, char *filename, struct stat *buf) {
                                break;
                }
        }
-       putchar('\n');
+       if (zeroterm & 2) {
+               return;
+       }
+
+       if (zeroterm & 1 ) {
+               putchar(0);
+       } else {
+               putchar('\n');
+       }
 }
 
 int main(int ac, char *av[]) {
@@ -143,8 +169,9 @@ 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;
@@ -157,6 +184,11 @@ int main(int ac, char *av[]) {
                                "Option -%c requires an operand\n", optopt);
                                errflg++;
                                break;
+                       case 'z':
+                               zeroterm |= 2;
+                       case '0':
+                               zeroterm |= 1;
+                               break;
                        case 'l':
                                uselstat = 1;
                                break;
@@ -177,7 +209,7 @@ int main(int ac, char *av[]) {
                } else {
                        stat(av[optind], &buf);
                }
-               stat_one(fmt, timefmt, av[optind], &buf);
+               stat_one(fmt, timefmt, zeroterm, av[optind], &buf);
        }
        return 0;
 }