ctype.h revision ab3d9c17d039446a2820517e3f0850f65d5a727f
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * IPRT - Simple character type classiciation and conversion.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Copyright (C) 2006-2007 Oracle Corporation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * available from http://www.virtualbox.org. This file is free software;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * you can redistribute it and/or modify it under the terms of the GNU
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * General Public License (GPL) as published by the Free Software
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * The contents of this file may alternatively be used under the terms
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * of the Common Development and Distribution License Version 1.0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * VirtualBox OSE distribution, in which case the provisions of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * CDDL are applicable instead of those of the GPL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * You may elect to license modified versions of this file under the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * terms and conditions of either the GPL or the CDDL or both.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifndef ___iprt_ctype_h
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define ___iprt_ctype_h
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <iprt/types.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @name C locale predicates and conversions.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * For most practical purposes, this can safely be used when parsing UTF-8
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * strings. Just keep in mind that we only deal with the first 127 chars and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * that full correctness is only archived using the non-existing RTLocIs* API.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @remarks Use the marcros, not the inlined functions.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @remarks ASSUMES the source code includes the basic ASCII chars. This is a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * general IPRT assumption.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @{ */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define RT_C_IS_BLANK(ch) RTLocCIsBlank((ch))
#define RT_C_IS_ALNUM(ch) RTLocCIsAlNum((ch))
#define RT_C_IS_ALPHA(ch) RTLocCIsAlpha((ch))
#define RT_C_IS_CNTRL(ch) RTLocCIsCntrl((ch))
#define RT_C_IS_DIGIT(ch) RTLocCIsDigit((ch))
#define RT_C_IS_LOWER(ch) RTLocCIsLower((ch))
#define RT_C_IS_GRAPH(ch) RTLocCIsGraph((ch))
#define RT_C_IS_ODIGIT(ch) RTLocCIsODigit((ch))
#define RT_C_IS_PRINT(ch) RTLocCIsPrint((ch))
#define RT_C_IS_PUNCT(ch) RTLocCIsPunct((ch))
#define RT_C_IS_SPACE(ch) RTLocCIsSpace((ch))
#define RT_C_IS_UPPER(ch) RTLocCIsUpper((ch))
#define RT_C_IS_XDIGIT(ch) RTLocCIsXDigit((ch))
#define RT_C_TO_LOWER(ch) RTLocCToLower((ch))
#define RT_C_TO_UPPER(ch) RTLocCToUpper((ch))
/**
* Checks for a blank character.
*
* @returns true / false.
* @param ch The character to test.
*/
DECL_FORCE_INLINE(bool) RTLocCIsBlank(int ch)
{
return ch == ' ' || ch == '\t';
}
/**
* Checks for a control character.
*
* @returns true / false.
* @param ch The character to test.
*/
DECL_FORCE_INLINE(bool) RTLocCIsCntrl(int ch)
{
return (ch) >= 0 && (ch) < 32;
}
/**
* Checks for a decimal digit.
*
* @returns true / false.
* @param ch The character to test.
*/
DECL_FORCE_INLINE(bool) RTLocCIsDigit(int ch)
{
return (ch) >= '0' && (ch) <= '9';
}
/**
* Checks for a lower case character.
*
* @returns true / false.
* @param ch The character to test.
*/
DECL_FORCE_INLINE(bool) RTLocCIsLower(int ch)
{
return (ch) >= 'a' && (ch) <= 'z';
}
/**
* Checks for an octal digit.
*
* @returns true / false.
* @param ch The character to test.
*/
DECL_FORCE_INLINE(bool) RTLocCIsODigit(int ch)
{
return (ch) >= '0' && (ch) <= '7';
}
/**
* Checks for a printable character (whitespace included).
*
* @returns true / false.
* @param ch The character to test.
*/
DECL_FORCE_INLINE(bool) RTLocCIsPrint(int ch)
{
/** @todo quite possibly incorrect */
return (ch) >= 32 && (ch) < 127;
}
/**
* Checks for punctuation (?).
*
* @returns true / false.
* @param ch The character to test.
*/
DECL_FORCE_INLINE(bool) RTLocCIsPunct(int ch)
{
/** @todo possibly incorrect */
return (ch) == ',' || (ch) == '.' || (ch) == ':' || (ch) == ';' || (ch) == '!' || (ch) == '?';
}
/**
* Checks for a white-space character.
*
* @returns true / false.
* @param ch The character to test.
*/
DECL_FORCE_INLINE(bool) RTLocCIsSpace(int ch)
{
/* \t (9), \n (10), \v (11), \f (12), \r (13), ' ' (32). */
return (ch) == ' ' || ((ch) >= 9 && (ch) <= 13);
}
/**
* Checks for an upper case character.
*
* @returns true / false.
* @param ch The character to test.
*/
DECL_FORCE_INLINE(bool) RTLocCIsUpper(int ch)
{
return (ch) >= 'A' && (ch) <= 'Z';
}
/**
* Checks for a hexadecimal digit.
*
* @returns true / false.
* @param ch The character to test.
*/
DECL_FORCE_INLINE(bool) RTLocCIsXDigit(int ch)
{
return RTLocCIsDigit(ch) || ((ch) >= 'a' && (ch) <= 'f') || ((ch) >= 'A' && (ch) <= 'F');
}
/**
* Checks for an alphabetic character.
*
* @returns true / false.
* @param ch The character to test.
*/
DECL_FORCE_INLINE(bool) RTLocCIsAlpha(int ch)
{
return RTLocCIsLower(ch) || RTLocCIsUpper(ch);
}
/**
* Checks for an alphanumerical character.
*
* @returns true / false.
* @param ch The character to test.
*/
DECL_FORCE_INLINE(bool) RTLocCIsAlNum(int ch)
{
return RTLocCIsDigit(ch) || RTLocCIsAlpha(ch);
}
/**
* Checks for a printable character whitespace excluded.
*
* @returns true / false.
* @param ch The character to test.
*/
DECL_FORCE_INLINE(bool) RTLocCIsGraph(int ch)
{
return RTLocCIsPrint(ch) && !RTLocCIsBlank(ch);
}
/**
* Converts the character to lower case if applictable.
*
* @returns lower cased character or ch.
* @param ch The character to test.
*/
DECL_FORCE_INLINE(int) RTLocCToLower(int ch)
{
return RTLocCIsUpper(ch) ? (ch) + ('a' - 'A') : (ch);
}
/**
* Converts the character to upper case if applictable.
*
* @returns upper cased character or ch.
* @param ch The character to test.
*/
DECL_FORCE_INLINE(int) RTLocCToUpper(int ch)
{
return RTLocCIsLower(ch) ? (ch) - ('a' - 'A') : (ch);
}
/** @} */
#endif