1d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen/* 2d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen WCharacter.h - Character utility functions for Wiring & Arduino 3d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen Copyright (c) 2010 Hernando Barragan. All right reserved. 4d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen 5d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen This library is free software; you can redistribute it and/or 6d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen modify it under the terms of the GNU Lesser General Public 7d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen License as published by the Free Software Foundation; either 8d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen version 2.1 of the License, or (at your option) any later version. 9d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen 10d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen This library is distributed in the hope that it will be useful, 11d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen but WITHOUT ANY WARRANTY; without even the implied warranty of 12d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen Lesser General Public License for more details. 14d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen 15d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen You should have received a copy of the GNU Lesser General Public 16d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen License along with this library; if not, write to the Free Software 17d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 18d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen */ 19d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen 20d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#ifndef Character_h 21d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define Character_h 22d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen 23d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#include <ctype.h> 24d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen 25d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen// WCharacter.h prototypes 26d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Cheninline boolean isAlphaNumeric(int c) __attribute__((always_inline)); 27d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Cheninline boolean isAlpha(int c) __attribute__((always_inline)); 28d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Cheninline boolean isAscii(int c) __attribute__((always_inline)); 29d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Cheninline boolean isWhitespace(int c) __attribute__((always_inline)); 30d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Cheninline boolean isControl(int c) __attribute__((always_inline)); 31d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Cheninline boolean isDigit(int c) __attribute__((always_inline)); 32d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Cheninline boolean isGraph(int c) __attribute__((always_inline)); 33d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Cheninline boolean isLowerCase(int c) __attribute__((always_inline)); 34d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Cheninline boolean isPrintable(int c) __attribute__((always_inline)); 35d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Cheninline boolean isPunct(int c) __attribute__((always_inline)); 36d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Cheninline boolean isSpace(int c) __attribute__((always_inline)); 37d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Cheninline boolean isUpperCase(int c) __attribute__((always_inline)); 38d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Cheninline boolean isHexadecimalDigit(int c) __attribute__((always_inline)); 39d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Cheninline int toAscii(int c) __attribute__((always_inline)); 40d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Cheninline int toLowerCase(int c) __attribute__((always_inline)); 41d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Cheninline int toUpperCase(int c)__attribute__((always_inline)); 42d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen 43d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen 44d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen// Checks for an alphanumeric character. 45d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen// It is equivalent to (isalpha(c) || isdigit(c)). 46d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Cheninline boolean isAlphaNumeric(int c) 47d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen{ 48d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen return ( isalnum(c) == 0 ? false : true); 49d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen} 50d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen 51d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen 52d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen// Checks for an alphabetic character. 53d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen// It is equivalent to (isupper(c) || islower(c)). 54d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Cheninline boolean isAlpha(int c) 55d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen{ 56d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen return ( isalpha(c) == 0 ? false : true); 57d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen} 58d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen 59d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen 60d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen// Checks whether c is a 7-bit unsigned char value 61d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen// that fits into the ASCII character set. 62d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Cheninline boolean isAscii(int c) 63d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen{ 64d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen return ( isascii (c) == 0 ? false : true); 65d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen} 66d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen 67d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen 68d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen// Checks for a blank character, that is, a space or a tab. 69d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Cheninline boolean isWhitespace(int c) 70d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen{ 71d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen return ( isblank (c) == 0 ? false : true); 72d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen} 73d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen 74d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen 75d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen// Checks for a control character. 76d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Cheninline boolean isControl(int c) 77d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen{ 78d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen return ( iscntrl (c) == 0 ? false : true); 79d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen} 80d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen 81d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen 82d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen// Checks for a digit (0 through 9). 83d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Cheninline boolean isDigit(int c) 84d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen{ 85d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen return ( isdigit (c) == 0 ? false : true); 86d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen} 87d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen 88d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen 89d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen// Checks for any printable character except space. 90d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Cheninline boolean isGraph(int c) 91d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen{ 92d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen return ( isgraph (c) == 0 ? false : true); 93d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen} 94d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen 95d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen 96d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen// Checks for a lower-case character. 97d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Cheninline boolean isLowerCase(int c) 98d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen{ 99d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen return (islower (c) == 0 ? false : true); 100d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen} 101d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen 102d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen 103d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen// Checks for any printable character including space. 104d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Cheninline boolean isPrintable(int c) 105d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen{ 106d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen return ( isprint (c) == 0 ? false : true); 107d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen} 108d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen 109d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen 110d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen// Checks for any printable character which is not a space 111d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen// or an alphanumeric character. 112d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Cheninline boolean isPunct(int c) 113d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen{ 114d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen return ( ispunct (c) == 0 ? false : true); 115d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen} 116d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen 117d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen 118d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen// Checks for white-space characters. For the avr-libc library, 119d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen// these are: space, formfeed ('\f'), newline ('\n'), carriage 120d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen// return ('\r'), horizontal tab ('\t'), and vertical tab ('\v'). 121d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Cheninline boolean isSpace(int c) 122d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen{ 123d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen return ( isspace (c) == 0 ? false : true); 124d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen} 125d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen 126d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen 127d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen// Checks for an uppercase letter. 128d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Cheninline boolean isUpperCase(int c) 129d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen{ 130d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen return ( isupper (c) == 0 ? false : true); 131d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen} 132d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen 133d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen 134d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen// Checks for a hexadecimal digits, i.e. one of 0 1 2 3 4 5 6 7 135d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen// 8 9 a b c d e f A B C D E F. 136d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Cheninline boolean isHexadecimalDigit(int c) 137d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen{ 138d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen return ( isxdigit (c) == 0 ? false : true); 139d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen} 140d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen 141d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen 142d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen// Converts c to a 7-bit unsigned char value that fits into the 143d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen// ASCII character set, by clearing the high-order bits. 144d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Cheninline int toAscii(int c) 145d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen{ 146d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen return toascii (c); 147d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen} 148d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen 149d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen 150d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen// Warning: 151d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen// Many people will be unhappy if you use this function. 152d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen// This function will convert accented letters into random 153d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen// characters. 154d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen 155d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen// Converts the letter c to lower case, if possible. 156d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Cheninline int toLowerCase(int c) 157d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen{ 158d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen return tolower (c); 159d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen} 160d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen 161d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen 162d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen// Converts the letter c to upper case, if possible. 163d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Cheninline int toUpperCase(int c) 164d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen{ 165d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen return toupper (c); 166d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen} 167d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen 168d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#endif