on master help sign in
Change document_render to be capable of rendering any node
commitb18669f92ba2544c7f2fe19bbf9d8062ea3a88ac authorNeil Mitchell <ndmitchell@gmail.com> dateWed 30 Nov 2016, 19:08 (10 years ago) parent6a74d3d
3 files changed+11−7
cbits/hexml.c+5−2 cbits/hexml.h+2−2 src/Text/XML/Hexml.hs+4−3
cbits/hexml.c+5−2
@@ -149,14 +149,17 @@ void render_tag(render* r, node* n)
149149 render_char(r, '>');
150150}
151151
152−int document_render(document* d, char* buffer, int length)
152+int node_render(document* d, node* n, char* buffer, int length)
153153{
154154 render r;
155155 r.d = d;
156156 r.buffer = buffer;
157157 r.length = length;
158158 r.cursor = 0;
159− render_content(&r, document_node(d));
159+ if (n->name.length == 0)
160+ render_content(&r, n);
161+ else
162+ render_tag(&r, n);
160163 return r.cursor;
161164}
162165
cbits/hexml.h+2−2
@@ -34,9 +34,9 @@ document* document_parse(char* s, int slen);
3434// Free the memory returned from document_parse.
3535void document_free(document* d);
3636
37−// generate a fresh document with the same semantics
37+// generate a fresh string with the same semantics as the node
3838// requires an input buffer, returns the size of the rendered document
39−int document_render(document* d, char* buffer, int length);
39+int node_render(document* d, node* n, char* buffer, int length);
4040
4141// return either NULL (successful parse) or the error message
4242char* document_error(document* d);
src/Text/XML/Hexml.hs+4−3
@@ -48,7 +48,7 @@ instance Storable Str where
4848foreign import ccall document_parse :: CString -> CInt -> IO (Ptr CDocument)
4949foreign import ccall document_free :: Ptr CDocument -> IO ()
5050foreign import ccall "&document_free" document_free_funptr :: FunPtr (Ptr CDocument -> IO ())
51−foreign import ccall document_render :: Ptr CDocument -> CString -> CInt -> IO CInt
51+foreign import ccall node_render :: Ptr CDocument -> Ptr CNode -> CString -> CInt -> IO CInt
5252foreign import ccall document_error :: Ptr CDocument -> IO CString
5353foreign import ccall document_node :: Ptr CDocument -> IO (Ptr CNode)
5454
@@ -86,8 +86,9 @@ documentParse src = unsafePerformIO $ BS.unsafeUseAsCStringLen (src <> BS.single
8686
8787documentRender :: Document -> BS.ByteString
8888documentRender (Document _ doc) = unsafePerformIO $ withForeignPtr doc $ \d -> do
89− i <- document_render d nullPtr 0
90− BS.create (fromIntegral i) $ \ptr -> void $ document_render d (castPtr ptr) i
89+ n <- document_node d
90+ i <- node_render d n nullPtr 0
91+ BS.create (fromIntegral i) $ \ptr -> void $ node_render d n (castPtr ptr) i
9192
9293
9394documentNode :: Document -> Node