@@ -40,11 +40,48 @@ instance Show Integer where
4040instance Show Float where
4141 show = prim__floatToStr
4242
43+asciiTab : Vect 32 String
44+asciiTab = ["NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK", "BEL",
45+ "BS", "HT", "LF", "VT", "FF", "CR", "SO", "SI",
46+ "DLE", "DC1", "DC2", "DC3", "DC4", "NAK", "SYN", "ETB",
47+ "CAN", "EM", "SUB", "ESC", "FS", "GS", "RS", "US"]
48+
49+firstCharIs : (Char -> Bool) -> String -> Bool
50+firstCharIs p s with (strM s)
51+ firstCharIs p "" | StrNil = False
52+ firstCharIs p (strCons c cs) | StrCons c cs = p c
53+
54+protectEsc : (Char -> Bool) -> String -> String -> String
55+protectEsc p f s = f ++ (if firstCharIs p s then "\\&" else "") ++ s
56+
57+showLitChar : Char -> String -> String
58+showLitChar '\a' = ("\\a" ++)
59+showLitChar '\b' = ("\\b" ++)
60+showLitChar '\f' = ("\\f" ++)
61+showLitChar '\n' = ("\\n" ++)
62+showLitChar '\r' = ("\\r" ++)
63+showLitChar '\t' = ("\\t" ++)
64+showLitChar '\v' = ("\\v" ++)
65+showLitChar '\SO' = protectEsc (== 'H') "\\SO"
66+showLitChar '\DEL' = ("\\DEL" ++)
67+showLitChar '\\' = ("\\\\" ++)
68+showLitChar c = case (integerToFin (cast (cast {to=Int} c)) 32) of
69+ Just k => strCons '\\' . ((index k asciiTab) ++)
70+ Nothing => if (c > '\DEL')
71+ then strCons '\\' . protectEsc isDigit (show (cast {to=Int} c))
72+ else strCons c
73+
74+showLitString : List Char -> String -> String
75+showLitString [] = id
76+showLitString ('"'::cs) = ("\\\"" ++) . showLitString cs
77+showLitString (c ::cs) = showLitChar c . showLitString cs
78+
4379instance Show Char where
44− show x = strCons x ""
80+ show '\'' = "'\\''"
81+ show c = strCons '\'' (showLitChar c "'")
4582
4683instance Show String where
47− show = id
84+ show cs = strCons '"' (showLitString (cast cs) "\"")
4885
4986instance Show Nat where
5087 show n = show (the Integer (cast n))