Package: src/packages/char.fdoc

characters

key file
char.flx share/lib/std/scalar/char.flx

Char

//[char.flx]

//$ Standard C operations on C character set.
open class Char
{
  //$ Ordinal value as int.
  fun ord: char -> int = "(int)$1";

  //$ Constructor from any integer type.
  ctor[t in ints] char: t = "(char)$1";

  //$ Convert to upper case.
  fun toupper : char -> char requires C89_headers::ctype_h;

  //$ Convert to lower case.
  fun tolower : char -> char requires C89_headers::ctype_h;

  //$ Test if upper case [A-Z].
  fun isupper : char -> bool  = "!!isupper($1)" requires C89_headers::ctype_h;

  //$ Test if lower case [a-z].
  fun islower : char -> bool  = "!!islower($1)" requires C89_headers::ctype_h;

  //$ Test if alphanumeric [A-Za-z0-9].
  fun isalnum : char -> bool  = "!!isalnum($1)" requires C89_headers::ctype_h;

  //$ Test if alphabetic [A-Za-z]
  fun isalpha : char -> bool  = "!!isalpha($1)" requires C89_headers::ctype_h;

  //$ Test if digit [0-9].
  fun isdigit : char -> bool  = "!!isdigit($1)" requires C89_headers::ctype_h;

  //$ Test if hex digit [0-9A-Fa-f].
  fun isxdigit : char -> bool  = "!!isxdigit($1)" requires C89_headers::ctype_h;

  //$ Test if control character 0x0 - 0x20, 0x7F
  fun iscntrl : char -> bool  = "!!iscntrl($1)" requires C89_headers::ctype_h;

  //$ Test if space x020.
  fun isspace : char -> bool  = "!!isspace($1)" requires C89_headers::ctype_h;

  //$ Test if space 0x20 or tab 0x09
  fun isblank : char -> bool  = "!!isblank($1)" requires C89_headers::ctype_h;

  //$ Test if printable 0x20-0x7e
  fun isprint : char -> bool  = "!!isprint($1)" requires C89_headers::ctype_h;

  //$ Test if punctuation character.
  fun ispunct : char -> bool  = "!!ispunct($1)" requires C89_headers::ctype_h;

  // define some basic character sets
  val upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  val lower = "abcdefghijklmnopqrstuvwxyz";
  val letters = upper + lower;
  val digits = "0123456789";
  val alphanum = letters + digits;
  val cidstart = letters + "_";
  val cidcont= alphanum+"_";
  val flxidcont= alphanum+"_-'";
  val camlidcont= alphanum+"_'";
  val numeric = digits + ".eEdD_"; // crud hack

  // some character classification functions
  fun isidstart(x:char) => match (find$ letters,x) with | Some _ => true | #None => false endmatch;
  fun iscidstart(x:char) => match find$ cidstart,x with | Some _ => true | #None => false endmatch;
  fun iscidcont(x:char) => match find$ cidcont,x with | Some _ => true | #None => false endmatch;
  fun iscamlidcont(x:char) => match find$ camlidcont,x with | Some _ => true | #None => false endmatch;
  fun isflxidcont(x:char) => match find$ flxidcont,x with | Some _ => true | #None => false endmatch;
  fun isnumeric(x:char) => match find$ numeric,x with | Some _ => true | #None => false endmatch;
  fun isalphanum(x:char) => isidstart x or isdigit x;
  fun isletter (x:char) => match find$ letters, x with | Some _ => true | #None => false endmatch;

  fun issq(x:char) => x == char "'";
  fun isdq(x:char) => x == char '"';
  fun isslosh(x:char) => x == char '\\';
  fun isnull(x:char) => x == char "";
  fun iseol(x:char) => x == char "\n"; // will be CR on Windoze ;(

}

instance[T in chars] Str[T] {
  fun str: T -> string = "::flx::rtl::strutil::str<#1>($1)" requires package "flx_strutil";
}

instance[T in chars] Repr[T] {
  fun repr[with Str[T]] (c:T) : string = {
    val s = str c;
    return
      match s with
      | "'" =>  "\\'"
      | '\t' => '\\t'
      | '\n' => '\\n'
      | '\r' => '\\r'
      | '\f' => '\\f'
      | '\v' => '\\v'
      | _    => s
      endmatch
    ;
  }
}

instance Tord[char]
{
  fun < : char * char -> bool = "$1<$2";
}
open Tord[char];