summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--bin/README4
-rw-r--r--bin/pngo.c26
2 files changed, 27 insertions, 3 deletions
diff --git a/bin/README b/bin/README
index 32f9862d..4e4a8d9d 100644
--- a/bin/README
+++ b/bin/README
@@ -86,6 +86,10 @@ PNG optimizer. Does not support interlaced PNGs.
  - Applies a simple filter type heuristic
  - Applies zlib's best compression
 
+    pngo foo.png
+    pngo -o bar.png foo.png
+    pngo -c foo.png | xx
+
                                   wake
 
 Broadcasts a wake-on-LAN packet to one of my machines.
diff --git a/bin/pngo.c b/bin/pngo.c
index 7151cb37..47ca4d9b 100644
--- a/bin/pngo.c
+++ b/bin/pngo.c
@@ -529,7 +529,7 @@ static void optimize(const char *inPath, const char *outPath) {
 
     if (outPath) {
         path = outPath;
-        file = fopen(path, "wx");
+        file = fopen(path, "w");
         if (!file) err(EX_CANTCREAT, "%s", path);
     } else {
         path = "(stdout)";
@@ -548,7 +548,27 @@ static void optimize(const char *inPath, const char *outPath) {
 }
 
 int main(int argc, char *argv[]) {
-    if (argc < 2) return EX_USAGE;
-    optimize(argv[1], NULL);
+    bool stdio = false;
+    char *output = NULL;
+
+    int opt;
+    while (0 < (opt = getopt(argc, argv, "co:"))) {
+        switch (opt) {
+            case 'c': stdio = true; break;
+            case 'o': output = optarg; break;
+            default: return EX_USAGE;
+        }
+    }
+
+    if (optind < argc) {
+        if (output || stdio) {
+            optimize(argv[optind], output);
+        } else {
+            optimize(argv[optind], argv[optind]);
+        }
+    } else {
+        optimize(NULL, output);
+    }
+
     return EX_OK;
 }