Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Diff of /sml/branches/dbm-type-blame/system/Basis/Implementation/string.sml
ViewVC logotype

Diff of /sml/branches/dbm-type-blame/system/Basis/Implementation/string.sml

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 3593, Wed May 11 03:44:12 2011 UTC revision 3594, Thu May 12 16:06:32 2011 UTC
# Line 177  Line 177 
177      fun op >= (a,b) = b <= a      fun op >= (a,b) = b <= a
178      val op > = sgtr      val op > = sgtr
179    
180  (* FIXME: this code does not work when the string ends in a formatting character      fun scan getc = let
181   * escape sequence.  For example:            val cscan = Char.scan getc
182   *            fun illegal (strm, chrs) = (case chrs
183   *      fromString "0\\ \\"                   of [] => NONE (* string starts with illegal escape or non-printing char *)
184   *                    | _ => SOME(implode(List.rev chrs), strm)
185   * will return NONE, instead of SOME "0".  The problem is that scanChar returns NONE                  (* end case *))
186   * on "\\  \\".  I'm not sure how to fix this problem.            fun scan' (strm, chrs) = (case getc strm
187   *)                   of NONE => SOME(implode(List.rev chrs), strm)
188      fun fromString' scanChar s = let                    | SOME(#"\\", strm') => (case getc strm'
189                           of SOME(c, strm'') =>
190                                if Char.isSpace c
191                                  then let (* skip over the formatting escape *)
192                                    fun skip strm' = (case getc strm'
193                                           of SOME(#"\\", strm') => scan'(strm', chrs)
194                                            | SOME(c, strm') =>
195                                                if Char.isSpace c
196                                                  then skip strm'
197                                                  else illegal (strm, chrs)
198                                            | NONE => illegal (strm, chrs)
199                                          (* end case *))
200                                    in
201                                      skip strm''
202                                    end
203                                (* otherwise use Char.scan to scan the escape character *)
204                                  else (case cscan strm
205                                     of SOME(c, strm') => scan' (strm', c::chrs)
206                                      | NONE => illegal (strm, chrs)
207                                    (* end case *))
208                            | NONE => illegal (strm, chrs)
209                          (* end case *))
210                      | SOME(c, strm') => if Char.isPrint c
211                          then scan' (strm', c::chrs)
212                          else illegal (strm, chrs)
213                    (* end case *))
214              in
215                fn strm => scan' (strm, [])
216              end
217    
218        val fromString = StringCvt.scanString scan
219        val toString = translate Char.toString
220    
221        fun fromCString s = let
222            val len = size s            val len = size s
223            fun getc i = if InlineT.DfltInt.<(i, len)            fun getc i = if InlineT.DfltInt.<(i, len)
224                  then SOME(unsafeSub(s, i), i+1)                  then SOME(unsafeSub(s, i), i+1)
225                  else NONE                  else NONE
226            val scanChar = scanChar getc            val scanChar = Char.scanC getc
227            fun accum (i, chars) = (case (scanChar i)            fun accum (i, chars) = (case (scanChar i)
228                   of NONE => if InlineT.DfltInt.<(i, len)                   of NONE => if InlineT.DfltInt.<(i, len)
229                        then NONE (* bad format *)                        then NONE (* bad format *)
# Line 201  Line 234 
234              accum (0, [])              accum (0, [])
235            end            end
236    
     val fromString = fromString' Char.scan  
     val toString = translate Char.toString  
   
     val fromCString = fromString' Char.scanC  
237      val toCString = translate Char.toCString      val toCString = translate Char.toCString
238    
239    end (* structure String *)    end (* structure String *)

Legend:
Removed from v.3593  
changed lines
  Added in v.3594

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0