h2ph test suite bugfix and refactoring
[p5sagit/p5-mst-13.2.git] / utils / h2ph.PL
index 855a899..ab6cad9 100644 (file)
@@ -108,24 +108,7 @@ while (defined (my $file = next_file())) {
     }
 
     print OUT "require '_h2ph_pre.ph';\n\n";
-    while (<IN>) {
-       chop;
-       while (/\\$/) {
-           chop;
-           $_ .= <IN>;
-           chop;
-       }
-       print OUT "# $_\n" if $opt_D;
-
-       if (s:/\*:\200:g) {
-           s:\*/:\201:g;
-           s/\200[^\201]*\201//g;      # delete single line comments
-           if (s/\200.*//) {           # begin multi-line comment?
-               $_ .= '/*';
-               $_ .= <IN>;
-               redo;
-           }
-       }
+    while (defined (local $_ = next_line())) {
        if (s/^\s*\#\s*//) {
            if (s/^define\s+(\w+)//) {
                $name = $1;
@@ -415,6 +398,52 @@ sub expr {
 }
 
 
+sub next_line
+{
+    my ($in, $out);
+
+    READ: while (not eof IN) {
+        $in  .= <IN>;
+        chomp $in;
+        next unless length $in;
+
+        while (length $in) {
+            if ($in =~ s/\\$//) {                           # \-newline
+                $out    .= ' ';
+                next READ;
+            } elsif ($in =~ s/^([^"'\\\/]+)//) {            # Passthrough
+                $out    .= $1;
+            } elsif ($in =~ s/^(\\.)//) {                   # \...
+                $out    .= $1;
+            } elsif ($in =~ s/^('(\\.|[^'\\])*')//) {       # '...
+                $out    .= $1;
+            } elsif ($in =~ s/^("(\\.|[^"\\])*")//) {       # "...
+                $out    .= $1;
+            } elsif ($in =~ s/^\/\/.*//) {                  # //...
+                last READ;
+            } elsif ($in =~ m/^\/\*/) {                     # /*...
+                # C comment removal adapted from perlfaq6:
+                if ($in =~ s/^\/\*[^*]*\*+([^\/*][^*]*\*+)*\///) {
+                    $out    .= ' ';
+                } else {                                    # Incomplete /* */
+                    next READ;
+                }
+            } elsif ($in =~ s/^(\/)//) {                    # /...
+                $out    .= $1;
+            } elsif ($in =~ s/^([^\'\"\\\/]+)//) {
+                $out    .= $1;
+            } else {
+                die "Cannot parse:\n$in\n";
+            }
+        }
+
+        last READ;
+    }
+
+    return $out;
+}
+
+
 # Handle recursive subdirectories without getting a grotesquely big stack.
 # Could this be implemented using File::Find?
 sub next_file