diff --git a/a.dsc b/a.dsc index 429cd07..9125231 100644 --- a/a.dsc +++ b/a.dsc @@ -1,2 +1,2 @@ -x ~0.0499999858439 y 0.400000035763 x ~0.400000035763 y 0.350000023842 x ~0.100000038743 y 0.100000038743 +x ~0.0499999858439 y 0.400000035763 x ~0.400000035763 y 0.350000023842 x ~0.100000038743 y 0.100000038743 x 0.25 y ~0.449999958277 x 0.599999964237 y ~0.199999943376 x 0.0499999858439 y 0.0499999858439 diff --git a/dotscape b/dotscape index 159eb63..051dad5 100755 Binary files a/dotscape and b/dotscape differ diff --git a/functional-core/file/parse-file.sml b/functional-core/file/parse-file.sml index 89faef1..4b33005 100644 --- a/functional-core/file/parse-file.sml +++ b/functional-core/file/parse-file.sml @@ -29,27 +29,41 @@ struct SOME num => COORD num | NONE => UNKNOWN str - fun helpParseLine (line, pos, acc, lastSpacePos) = + fun helpParseLine (line, pos, acc, wordStartPos) = if pos = String.size line then List.rev acc else let val chr = String.sub (line, pos) in - if chr = #" " orelse chr = #"\n" then - let - val strToken = String.substring - (line, lastSpacePos + 1, pos - (lastSpacePos + 1)) - val token = tokeniseString strToken - in - helpParseLine (line, pos + 1, token :: acc, pos) - end + if Char.isSpace chr then + if pos > 0 andalso Char.isSpace (String.sub (line, pos - 1)) then + (* if previous character is space, just proceed to next character *) + helpParseLine (line, pos + 1, acc, wordStartPos) + else + let + (* current character is space, but previous character is not, + * which means we have some text to substring and tokenise + * before proceeding to next character *) + val strToken = + String.substring (line, wordStartPos, pos - wordStartPos) + val token = tokeniseString strToken + in + helpParseLine (line, pos + 1, token :: acc, pos) + end + else if pos > 0 andalso Char.isSpace (String.sub (line, pos - 1)) then + (* previous character was space but current character is not, + * meaning that we have hit the start of a new word *) + helpParseLine (line, pos + 1, acc, pos) else - helpParseLine (line, pos + 1, acc, lastSpacePos) + (* just proceed to next character *) + helpParseLine (line, pos + 1, acc, wordStartPos) end fun parseLine line = - let val lst = helpParseLine (line, 0, [], ~1) - in extractTriangle lst + let + val lst = helpParseLine (line, 0, [], 0) + in + extractTriangle lst end end