added is/to_ascii_lower/upper;
authorwenzelm
Tue, 25 Jul 2006 21:18:07 +0200
changeset 20200 c6fb50dbbc30
parent 20199 3170fea83ae7
child 20201 24b49cbd438b
added is/to_ascii_lower/upper; tuned alphanum -- needs more work;
src/Pure/General/symbol.ML
--- a/src/Pure/General/symbol.ML	Tue Jul 25 21:18:06 2006 +0200
+++ b/src/Pure/General/symbol.ML	Tue Jul 25 21:18:07 2006 +0200
@@ -27,6 +27,10 @@
   val is_ascii_digit: symbol -> bool
   val is_ascii_quasi: symbol -> bool
   val is_ascii_blank: symbol -> bool
+  val is_ascii_lower: symbol -> bool
+  val is_ascii_upper: symbol -> bool
+  val to_ascii_lower: symbol -> symbol
+  val to_ascii_upper: symbol -> symbol
   val is_raw: symbol -> bool
   val decode_raw: symbol -> string
   val encode_raw: string -> string
@@ -143,6 +147,12 @@
   fn " " => true | "\t" => true | "\n" => true | "\^L" => true | "\^M" => true
     | _ => false;
 
+fun is_ascii_lower s = is_char s andalso (ord "a" <= ord s andalso ord s <= ord "z");
+fun is_ascii_upper s = is_char s andalso (ord "A" <= ord s andalso ord s <= ord "Z");
+
+fun to_ascii_lower s = if is_ascii_upper s then chr (ord s + ord "a" - ord "A") else s;
+fun to_ascii_upper s = if is_ascii_lower s then chr (ord s + ord "A" - ord "a") else s;
+
 
 (* encode_raw *)
 
@@ -482,6 +492,26 @@
   in implode (rev ss' @ qs) end;
 
 
+(*turning arbitrary names into alphanumerics*)
+
+fun alphanum s =
+  let
+    fun replace_invalid c (last_inv, cs) =
+      if (is_ascii_letter c orelse is_ascii_digit c orelse c = "'")
+        andalso not ("." = c)   (* FIXME !? *)
+      then (false, if last_inv then c :: "_" :: cs else c :: cs)
+      else (true, cs);
+    fun prefix_num_empty [] = ["x"]
+      | prefix_num_empty (cs as c::_) =
+          if is_ascii_digit c
+          then "x" :: cs
+          else cs;
+    val (prefix, cs1) = case explode s of "'"::cs => ("'", cs) | cs => ("", cs);
+    val (_, cs2) = fold_rev replace_invalid cs1 (false, []);
+    val cs3 = prefix_num_empty cs2;
+  in implode (prefix :: cs3) end;
+
+
 
 (** print modes **)
 
@@ -517,26 +547,6 @@
     in (implode (map out syms), real (sym_length syms)) end;
 
 
-(*turning arbitrary names into alphanumerics*)
-
-fun alphanum s =
-  let
-    fun replace_invalid c (last_inv, cs) =
-      if ((Char.isAlphaNum o the o Char.fromString) c orelse c = "'")
-        andalso not ("." = c)
-      then (false, if last_inv then c :: "_" :: cs else c :: cs)
-      else (true, cs);
-    fun prefix_num_empty [] = ["x"]
-      | prefix_num_empty (cs as c::_) =
-          if (Char.isDigit o the o Char.fromString) c
-          then "x" :: cs
-          else cs;
-    val (prefix, cs1) = case explode s of "'"::cs => ("'", cs) | cs => ("", cs);
-    val (_, cs2) = fold_rev replace_invalid cs1 (false, []);
-    val cs3 = prefix_num_empty cs2;
-  in implode (prefix :: cs3) end;
-
-
 (*final declarations of this structure!*)
 val length = sym_length;
 val explode = sym_explode;