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