summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Crayne <joe@jerkface.net>2019-06-14 01:15:59 -0400
committerJoe Crayne <joe@jerkface.net>2019-06-14 01:15:59 -0400
commitb84c528097bd4d3b93b0f174e093e694c0b2db37 (patch)
tree87a9b01adeb9c7192344f4e28f99ddb55a4c58eb
parent8bd628fb6e07c26377f18547eeb7b10dfd2841da (diff)
crayne parser: call command.
-rw-r--r--src/Wavefront.hs26
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