diff options
author | Joe Crayne <joe@jerkface.net> | 2019-06-14 01:15:59 -0400 |
---|---|---|
committer | Joe Crayne <joe@jerkface.net> | 2019-06-14 01:15:59 -0400 |
commit | b84c528097bd4d3b93b0f174e093e694c0b2db37 (patch) | |
tree | 87a9b01adeb9c7192344f4e28f99ddb55a4c58eb | |
parent | 8bd628fb6e07c26377f18547eeb7b10dfd2841da (diff) |
crayne parser: call command.
-rw-r--r-- | src/Wavefront.hs | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/src/Wavefront.hs b/src/Wavefront.hs index b97c304..deae37b 100644 --- a/src/Wavefront.hs +++ b/src/Wavefront.hs | |||
@@ -53,6 +53,7 @@ data ObjBuilder m = ObjBuilder | |||
53 | , deprecated_res :: [Int] -> m () | 53 | , deprecated_res :: [Int] -> m () |
54 | , bevel :: Bool -> m () | 54 | , bevel :: Bool -> m () |
55 | , lod :: Int -> m () | 55 | , lod :: Int -> m () |
56 | , call :: S.ByteString -> [S.ByteString] -> m () | ||
56 | , badToken :: L.ByteString -> m () | 57 | , badToken :: L.ByteString -> m () |
57 | } | 58 | } |
58 | 59 | ||
@@ -99,6 +100,7 @@ nullBuilder = ObjBuilder | |||
99 | , deprecated_res = \is -> pure () | 100 | , deprecated_res = \is -> pure () |
100 | , bevel = \b -> pure () | 101 | , bevel = \b -> pure () |
101 | , lod = \lvl -> pure () | 102 | , lod = \lvl -> pure () |
103 | , call = \obj args -> pure () | ||
102 | , badToken = \bs -> pure () | 104 | , badToken = \bs -> pure () |
103 | } | 105 | } |
104 | 106 | ||
@@ -190,7 +192,7 @@ findNewLine ps o@(ObjConfig args) bs = case L.break (\c -> c=='\n' || c=='\\' || | |||
190 | 2 bmat | 192 | 2 bmat |
191 | 3 bsp | 193 | 3 bsp |
192 | 4 bzp | 194 | 4 bzp |
193 | 5 x call | 195 | 5 call |
194 | 6 cdc | 196 | 6 cdc |
195 | 7 cdp | 197 | 7 cdp |
196 | 8 c_interp | 198 | 8 c_interp |
@@ -390,6 +392,26 @@ parseOBJ builder args bs0 | |||
390 | 392 | ||
391 | "bs" -> parseI deprecated_bsp 4 -- bsp | 393 | "bs" -> parseI deprecated_bsp 4 -- bsp |
392 | "bz" -> parseI deprecated_bzp 4 -- bzp | 394 | "bz" -> parseI deprecated_bzp 4 -- bzp |
395 | "ca" -> -- call | ||
396 | case findNewLine [] args $ next 2 bs of | ||
397 | (fnn,bs') -> do | ||
398 | let slurp fnn = case L.break (=='.') fnn of | ||
399 | (fn,ext) | L.null (L.drop 1 ext) -> if L.null fn then [] | ||
400 | else [fn] | ||
401 | | ".obj" <- L.take 4 ext -> | ||
402 | if L.all isSpace (L.take 1 $ L.drop 4 ext) | ||
403 | then (fn <> ".obj") : slurpArgs (findToken args $ L.drop 4 ext) | ||
404 | else let f:fs = slurp (L.drop 3 ext) in (fn <> L.take 3 ext <> f) : fs | ||
405 | | otherwise -> let (f:fs) = slurp (L.drop 1 ext) | ||
406 | in (fn <> L.take 1 ext <> f) : fs | ||
407 | slurpArgs fnn | L.null fnn = [] | ||
408 | slurpArgs fnn = case L.break isSpace fnn of | ||
409 | (a,as) -> findToken args a : slurpArgs as | ||
410 | case map L.toStrict $ slurpArgs fnn of | ||
411 | [] -> return () | ||
412 | fn:as -> call builder fn as | ||
413 | parseOBJ builder args bs' | ||
414 | |||
393 | "cd" -> if lengthLessThan 3 bs || L.index bs 2 /= 'p' | 415 | "cd" -> if lengthLessThan 3 bs || L.index bs 2 /= 'p' |
394 | then parseI deprecated_cdc 4 -- cdc | 416 | then parseI deprecated_cdc 4 -- cdc |
395 | else parseI deprecated_cdp 4 -- cdp | 417 | else parseI deprecated_cdp 4 -- cdp |
@@ -571,7 +593,7 @@ parseOBJ builder args bs0 | |||
571 | in (fn <> L.take 1 ext <> f) : fs | 593 | in (fn <> L.take 1 ext <> f) : fs |
572 | mtllib builder (map L.toStrict $ slurp fnn) | 594 | mtllib builder (map L.toStrict $ slurp fnn) |
573 | parseOBJ builder args bs' | 595 | parseOBJ builder args bs' |
574 | -- TODO: call,csh | 596 | -- TODO: csh |
575 | _ -> bad bs | 597 | _ -> bad bs |
576 | where | 598 | where |
577 | bs = findToken args bs0 | 599 | bs = findToken args bs0 |