Read the entire STDIN.
authorMike Bostock <mbostock@gmail.com>
Wed, 6 Mar 2013 04:35:49 +0000 (20:35 -0800)
committerMike Bostock <mbostock@gmail.com>
Wed, 6 Mar 2013 04:35:49 +0000 (20:35 -0800)
The problem with reading synchronously from /dev/stdin is that you can get a
spurious EOF when the input buffer is empty, even if more content is coming. Now
STDIN is read from a loop, and only stops polling when all input has been read.
This fixes #70 #85 and other errors related to parsing large files on STDIN.

bin/uglifyjs

index 9d2eedc..88fd46b 100755 (executable)
@@ -347,12 +347,15 @@ function getOptions(x, constants) {
 }
 
 function read_whole_file(filename) {
-    if (filename == "-") {
-        // XXX: this sucks.  How does one read the whole STDIN
-        // synchronously?
-        filename = "/dev/stdin";
-    }
     try {
+        if (filename == "-") {
+            var chunks = [];
+            do {
+                var chunk = fs.readFileSync("/dev/stdin", "utf8");
+                chunks.push(chunk);
+            } while (chunk.length);
+            return chunks.join("");
+        }
         return fs.readFileSync(filename, "utf8");
     } catch(ex) {
         sys.error("ERROR: can't read file: " + filename);