diff src/compiler.sml @ 1603:06958d5a7088

Don't treat comment-only lines as blank, in determining split point of .urp files
author Adam Chlipala <adam@chlipala.net>
date Sun, 20 Nov 2011 18:33:21 -0500
parents 154cfe2eb366
children 48eed6cf2be7
line wrap: on
line diff
--- a/src/compiler.sml	Sat Nov 19 10:43:57 2011 -0500
+++ b/src/compiler.sml	Sun Nov 20 18:33:21 2011 -0500
@@ -1,4 +1,4 @@
-(* Copyright (c) 2008-2010, Adam Chlipala
+(* Copyright (c) 2008-2011, Adam Chlipala
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -347,20 +347,34 @@
      Settings.setMinHeap (#minHeap job);
      Settings.setSigFile (#sigFile job))
 
+datatype commentableLine =
+         EndOfFile
+       | OnlyComment
+       | Content of string
+
 fun inputCommentableLine inf =
-    Option.map (fn s =>
-                   let
-                       val s = #1 (Substring.splitl (fn ch => ch <> #"#") (Substring.full s))
-                       val s = #1 (Substring.splitr (not o Char.isSpace) s)
-                   in
-                       Substring.string (if Substring.size s > 0 andalso Char.isSpace (Substring.sub (s, Substring.size s - 1)) then
-                                             if Substring.size s > 1 andalso Char.isSpace (Substring.sub (s, Substring.size s - 2)) then
-                                                 Substring.trimr 2 s
-                                             else
-                                                 Substring.trimr 1 s
-                                         else
-                                             s)
-                   end) (TextIO.inputLine inf)
+    case TextIO.inputLine inf of
+        NONE => EndOfFile
+      | SOME s =>
+        let
+            val (befor, after) = Substring.splitl (fn ch => ch <> #"#") (Substring.full s)
+        in
+            if not (Substring.isEmpty after)
+               andalso Substring.foldl (fn (ch, b) => b andalso Char.isSpace ch) true befor then
+                OnlyComment
+            else
+                let
+                    val s = #1 (Substring.splitr (not o Char.isSpace) befor)
+                in
+                    Content (Substring.string (if Substring.size s > 0 andalso Char.isSpace (Substring.sub (s, Substring.size s - 1)) then
+                                                   if Substring.size s > 1 andalso Char.isSpace (Substring.sub (s, Substring.size s - 2)) then
+                                                       Substring.trimr 2 s
+                                                   else
+                                                       Substring.trimr 1 s
+                                               else
+                                                   s))
+                end
+        end
 
 fun parseUrp' accLibs fname =
     if not (Posix.FileSys.access (fname ^ ".urp", []) orelse Posix.FileSys.access (fname ^ "/lib.urp", []))
@@ -417,9 +431,9 @@
 
                     fun hasSpaceLine () =
                         case inputCommentableLine inf of
-                            NONE => false
-                          | SOME s => s = "debug" orelse s = "profile"
-                                      orelse CharVector.exists (fn ch => ch = #" " orelse ch = #"\t") s orelse hasSpaceLine ()
+                            Content s => s = "debug" orelse s = "profile"
+                                         orelse CharVector.exists (fn ch => ch = #" " orelse ch = #"\t") s orelse hasSpaceLine ()
+                          | _ => false
 
                     val hasBlankLine = hasSpaceLine ()
 
@@ -467,8 +481,7 @@
 
                     fun readSources acc =
                         case inputCommentableLine inf of
-                            NONE => rev acc
-                          | SOME line =>
+                            Content line =>
                             let
                                 val acc = if CharVector.all Char.isSpace line then
                                               acc
@@ -483,6 +496,7 @@
                             in
                                 readSources acc
                             end
+                          | _ => rev acc
 
                     val prefix = ref (case Settings.getUrlPrefix () of "/" => NONE | s => SOME s)
                     val database = ref (Settings.getDbstring ())
@@ -639,9 +653,10 @@
 
                     fun read () =
                         case inputCommentableLine inf of
-                            NONE => finish []
-                          | SOME "" => finish (readSources [])
-                          | SOME line =>
+                            EndOfFile => finish []
+                          | OnlyComment => read ()
+                          | Content "" => finish (readSources [])
+                          | Content line =>
                             let
                                 val (cmd, arg) = Substring.splitl (fn x => not (Char.isSpace x)) (Substring.full line)
                                 val cmd = Substring.string (trim cmd)