summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoman Smrž <roman.smrz@seznam.cz>2019-09-28 17:38:37 +0200
committerRoman Smrž <roman.smrz@seznam.cz>2019-09-28 17:38:37 +0200
commitf121ff66365ad1409f9903bbfaca1c0c90c71b68 (patch)
treed7072faf98e76afe957c000b1f21b0fb7915821d
parent829d71729effa345ca593a21f61349aac7474a62 (diff)
Storage: escape newlines by appending tabs
-rw-r--r--src/Storage.hs9
1 files changed, 6 insertions, 3 deletions
diff --git a/src/Storage.hs b/src/Storage.hs
index 52cda85..e610faa 100644
--- a/src/Storage.hs
+++ b/src/Storage.hs
@@ -245,8 +245,7 @@ serializeRecItem name (RecInt x) = [name, BC.pack ":i", BC.singleton ' ', BC.pac
serializeRecItem name (RecNum x) = [name, BC.pack ":n", BC.singleton ' ', BC.pack (showRatio x), BC.singleton '\n']
serializeRecItem name (RecText x) = [name, BC.pack ":t", BC.singleton ' ', escaped, BC.singleton '\n']
where escaped = BC.concatMap escape $ encodeUtf8 x
- escape '\\' = BC.pack "\\\\"
- escape '\n' = BC.pack "\\n"
+ escape '\n' = BC.pack "\n\t"
escape c = BC.singleton c
serializeRecItem name (RecBinary x) = [name, BC.pack ":b ", convertToBase Base64 x, BC.singleton '\n']
serializeRecItem name (RecDate x) = [name, BC.pack ":d", BC.singleton ' ', BC.pack (formatTime defaultTimeLocale "%s %z" x), BC.singleton '\n']
@@ -283,7 +282,7 @@ unsafeDeserializeObject st bytes =
(,next) <$> case otype of
_ | otype == BC.pack "blob" -> return $ Blob content
| otype == BC.pack "rec" -> maybe (throwError $ "Malformed record item ")
- (return . Rec) $ sequence $ map parseRecLine $ BC.lines content
+ (return . Rec) $ sequence $ map parseRecLine $ mergeCont [] $ BC.lines content
| otherwise -> throwError $ "Unknown object type"
_ -> throwError $ "Malformed object"
where splitObjPrefix line = do
@@ -292,6 +291,10 @@ unsafeDeserializeObject st bytes =
guard $ BL.null rest
return (BL.toStrict otype, len)
+ mergeCont cs (a:b:rest) | Just ('\t', b') <- BC.uncons b = mergeCont (b':BC.pack "\n":cs) (a:rest)
+ mergeCont cs (a:rest) = B.concat (a : reverse cs) : mergeCont [] rest
+ mergeCont _ [] = []
+
parseRecLine line = do
colon <- BC.elemIndex ':' line
space <- BC.elemIndex ' ' line