- let
- fun readFile entries =
- let
- val fname = OS.Path.joinDirFile {dir = path,
- file = fname}
-
- val inf = TextIO.openIn fname
-
- fun loop entries =
- case TextIO.inputLine inf of
- NONE => entries
- | SOME line => loop (line :: entries)
- in
- loop entries
- before TextIO.closeIn inf
- end
- in
- app (fn (d, entries) =>
- case d of
- Filename {filename, heading} =>
- if fname = filename then
- entries := "\n" :: readFile ("\n" :: line :: ":\n" :: heading :: line :: !entries)
- else
- ()
- | Extension {extension, heading} =>
- let
- val {base, ext} = OS.Path.splitBaseExt fname
- in
- case ext of
- NONE => ()
- | SOME extension' =>
- if extension' = extension then
- entries := "\n" :: readFile ("\n" :: line :: ":\n" :: heading base :: line :: !entries)
- else
- ()
- end) ds;
- loop ()
- end
+ (app (fn (d, entries) =>
+ let
+ fun readFile showEmpty entries' =
+ let
+ val fname = OS.Path.joinDirFile {dir = path,
+ file = fname}
+
+ val inf = TextIO.openIn fname
+
+ fun loop (seenOne, entries') =
+ case TextIO.inputLine inf of
+ NONE => if seenOne orelse showEmpty then
+ "\n" :: entries'
+ else
+ !entries
+ | SOME line => loop (true, line :: entries')
+ in
+ loop (false, entries')
+ before TextIO.closeIn inf
+ end
+ in
+ case d of
+ Filename {filename, heading, showEmpty} =>
+ if fname = filename then
+ entries := readFile showEmpty ("\n" :: line :: ":\n" :: heading :: line :: !entries)
+ else
+ ()
+ | Extension {extension, heading} =>
+ let
+ val {base, ext} = OS.Path.splitBaseExt fname
+ in
+ case ext of
+ NONE => ()
+ | SOME extension' =>
+ if extension' = extension then
+ entries := readFile true ("\n" :: line :: ":\n" :: heading base :: line :: !entries)
+ else
+ ()
+ end
+ end) ds;
+ loop ())