// Copyright (C) 2010, Guy Barrand. All rights reserved.
// See the file tools.license for terms.

#ifndef tools_charmanip
#define tools_charmanip

namespace tools {

// some char ASCII code :
// \0      : 0
// \n = LF : 10 
// \r = CR : 13
// \t = HT : 9
// ,       : 44

inline bool is_upper(char a_char) {
  // do it myself: due to problem with ctype.h and 
  // isxxx macros on different platforms.
  switch(a_char) {
    case 'A':return true;
    case 'B':return true;
    case 'C':return true;
    case 'D':return true;
    case 'E':return true;
    case 'F':return true;
    case 'G':return true;
    case 'H':return true;
    case 'I':return true;
    case 'J':return true;
    case 'K':return true;
    case 'L':return true;
    case 'M':return true;
    case 'N':return true;
    case 'O':return true;
    case 'P':return true;
    case 'Q':return true;
    case 'R':return true;
    case 'S':return true;
    case 'T':return true;
    case 'U':return true;
    case 'V':return true;
    case 'W':return true;
    case 'X':return true;
    case 'Y':return true;
    case 'Z':return true;
    default:return false;
  }
  return false;
}

inline bool is_lower(char a_char) {
  switch(a_char) {
    case 'a':return true;
    case 'b':return true;
    case 'c':return true;
    case 'd':return true;
    case 'e':return true;
    case 'f':return true;
    case 'g':return true;
    case 'h':return true;
    case 'i':return true;
    case 'j':return true;
    case 'k':return true;
    case 'l':return true;
    case 'm':return true;
    case 'n':return true;
    case 'o':return true;
    case 'p':return true;
    case 'q':return true;
    case 'r':return true;
    case 's':return true;
    case 't':return true;
    case 'u':return true;
    case 'v':return true;
    case 'w':return true;
    case 'x':return true;
    case 'y':return true;
    case 'z':return true;
    default:return false;
  }
  return false;
}

inline bool is_digit(char a_char) {
  switch(a_char){
    case '0':return true;
    case '1':return true;
    case '2':return true;
    case '3':return true;
    case '4':return true;
    case '5':return true;
    case '6':return true;
    case '7':return true;
    case '8':return true;
    case '9':return true;
    default:return false;
  }
  return false;
}

inline bool is_letter(char a_char) { 
  return (is_lower(a_char)||is_upper(a_char)) ? true : false;
}

//inline bool is_alpha(char a_char) { 
//  return (is_lower(a_char)||is_upper(a_char)||is_digit(a_char)) ? true : false;
//}

inline bool is_printable(char a_char) { 
  if(is_lower(a_char)||is_upper(a_char)||is_digit(a_char)) return true;
  switch(a_char) {
    case ' ':return true;
    case '!':return true;
    case '"':return true;
    case '#':return true;
    case '$':return true;
    case '%':return true;
    case '&':return true;
    case '\'':return true;
    case '(':return true;
    case ')':return true;
    case '*':return true;
    case '+':return true;
    case ',':return true;
    case '-':return true;
    case '.':return true;
    case '/':return true;
    case ':':return true;
    case ';':return true;
    case '<':return true;
    case '=':return true;
    case '>':return true;
    case '?':return true;
    case '@':return true;
    case '[':return true;
    case '\\':return true;
    case ']':return true;
    case '^':return true;
    case '_':return true;
    case '`':return true;
    case '{':return true;
    case '|':return true;
    case '}':return true;
    case '~':return true;
    default:return false;
  }
  return false;
}

}

#endif
