diff --git a/dotscape b/dotscape index 8f119fd..159eb63 100755 Binary files a/dotscape and b/dotscape differ diff --git a/dotscape.mlb b/dotscape.mlb index ae51337..6a4aca4 100644 --- a/dotscape.mlb +++ b/dotscape.mlb @@ -1,28 +1,31 @@ $(SML_LIB)/basis/basis.mlb (* FUNCTIONAL CORE *) -functional-core/app-type.sml +functional-core/app/app-type.sml ann "allowVectorExps true" in - functional-core/ndc.sml - functional-core/click-points.sml - functional-core/graph-lines.sml - functional-core/triangles.sml + functional-core/app/ndc.sml + functional-core/app/click-points.sml + functional-core/app/graph-lines.sml + functional-core/app/triangles.sml end -functional-core/triangle-stage.sml +functional-core/app/triangle-stage.sml -functional-core/app-init.sml -functional-core/app-with.sml +functional-core/app/app-init.sml +functional-core/app/app-with.sml message-types/input-msg.sml message-types/file-msg.sml message-types/draw-msg.sml message-types/update-msg.sml -functional-core/app-update.sml +functional-core/app/app-update.sml + +(* pure file parsing functions *) +functional-core/file/parse-file.sml (* IMPERATIVE SHELL *) $(SML_LIB)/basis/mlton.mlb diff --git a/functional-core/app-init.sml b/functional-core/app/app-init.sml similarity index 100% rename from functional-core/app-init.sml rename to functional-core/app/app-init.sml diff --git a/functional-core/app-type.sml b/functional-core/app/app-type.sml similarity index 100% rename from functional-core/app-type.sml rename to functional-core/app/app-type.sml diff --git a/functional-core/app-update.sml b/functional-core/app/app-update.sml similarity index 100% rename from functional-core/app-update.sml rename to functional-core/app/app-update.sml diff --git a/functional-core/app-with.sml b/functional-core/app/app-with.sml similarity index 100% rename from functional-core/app-with.sml rename to functional-core/app/app-with.sml diff --git a/functional-core/click-points.sml b/functional-core/app/click-points.sml similarity index 100% rename from functional-core/click-points.sml rename to functional-core/app/click-points.sml diff --git a/functional-core/graph-lines.sml b/functional-core/app/graph-lines.sml similarity index 100% rename from functional-core/graph-lines.sml rename to functional-core/app/graph-lines.sml diff --git a/functional-core/ndc.sml b/functional-core/app/ndc.sml similarity index 100% rename from functional-core/ndc.sml rename to functional-core/app/ndc.sml diff --git a/functional-core/triangle-stage.sml b/functional-core/app/triangle-stage.sml similarity index 100% rename from functional-core/triangle-stage.sml rename to functional-core/app/triangle-stage.sml diff --git a/functional-core/triangles.sml b/functional-core/app/triangles.sml similarity index 100% rename from functional-core/triangles.sml rename to functional-core/app/triangles.sml diff --git a/functional-core/file/parse-file.sml b/functional-core/file/parse-file.sml new file mode 100644 index 0000000..89faef1 --- /dev/null +++ b/functional-core/file/parse-file.sml @@ -0,0 +1,55 @@ +signature PARSE_FILE = +sig + val parseLine: string -> AppType.triangle option +end + +structure ParseFile :> PARSE_FILE = +struct + datatype triangle_token = X | Y | COORD of Real32.real | UNKNOWN of string + + fun extractTriangle lst = + case lst of + [ X, COORD x1 + , Y, COORD y1 + , X, COORD x2 + + , Y, COORD y2 + , X, COORD x3 + , Y, COORD y3 + ] => SOME {x1 = x1, y1 = y1, x2 = x2, y2 = y2, x3 = x3, y3 = y3} + | _ => NONE + + fun tokeniseString str = + if str = "x" then + X + else if str = "y" then + Y + else + case Real32.fromString str of + SOME num => COORD num + | NONE => UNKNOWN str + + fun helpParseLine (line, pos, acc, lastSpacePos) = + 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 + else + helpParseLine (line, pos + 1, acc, lastSpacePos) + end + + fun parseLine line = + let val lst = helpParseLine (line, 0, [], ~1) + in extractTriangle lst + end +end diff --git a/imperative-shell/file-thread.sml b/imperative-shell/file-thread.sml index 822df0e..8ee3cea 100644 --- a/imperative-shell/file-thread.sml +++ b/imperative-shell/file-thread.sml @@ -5,67 +5,18 @@ end structure FileThread :> FILE_THREAD = struct - open AppType open FileMessage open InputMessage + datatype parse_result = OK of AppType.triangle list | PARSE_ERROR + val filename = "a.dsc" - datatype triangle_token = X | Y | COORD of Real32.real | UNKNOWN - - fun extractTriangle lst = - case lst of - [ X, COORD x1 - , Y, COORD y1 - , X, COORD x2 - - , Y, COORD y2 - , X, COORD x3 - , Y, COORD y3 - ] => SOME {x1 = x1, y1 = y1, x2 = x2, y2 = y2, x3 = x3, y3 = y3} - | _ => NONE - - fun tokeniseString str = - if str = "x" then - X - else if str = "y" then - Y - else - case Real32.fromString str of - SOME num => COORD num - | NONE => UNKNOWN - - fun helpParseLine (line, pos, acc, lastSpacePos) = - 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 - else - helpParseLine (line, pos + 1, acc, lastSpacePos) - end - - fun parseLine line = - let val lst = helpParseLine (line, 0, [], ~1) - in extractTriangle lst - end - - datatype parse_resule = OK of AppType.triangle list | PARSE_ERROR - fun parse (io, acc) = case TextIO.inputLine io of SOME line => let - val line = parseLine line + val line = ParseFile.parseLine line in (case line of SOME tri => parse (io, tri :: acc) @@ -79,7 +30,7 @@ struct val triangles = parse (io, []) val _ = TextIO.closeIn io - val inputMsg = + val inputMsg = case triangles of OK triangles => USE_TRIANGLES triangles | PARSE_ERROR => TRIANGLES_LOAD_ERROR @@ -92,14 +43,14 @@ struct {x1, y1, x2, y2, x3, y3} :: tl => let val triString = String.concat - [ "x " , Real32.toString x1 - , " y " , Real32.toString y1 + [ "x ", Real32.toString x1 + , " y ", Real32.toString y1 - , " x " , Real32.toString x2 - , " y " , Real32.toString y2 + , " x ", Real32.toString x2 + , " y ", Real32.toString y2 - , " x " , Real32.toString x3 - , " y " , Real32.toString y3 + , " x ", Real32.toString x3 + , " y ", Real32.toString y3 , "\n" ]