/** @file ircd_string.h * @brief Public declarations and APIs for string operations. * @version $Id: ircd_string.h 1478 2005-09-12 03:40:17Z entrope $ */ #ifndef INCLUDED_ircd_string_h #define INCLUDED_ircd_string_h #include /* for DupString()'s strcpy, strlen */ #ifndef INCLUDED_ircd_chattr_h #include "ircd_chattr.h" #endif struct irc_in_addr; /* * Macros */ /** Check whether \a x is a NULL or empty string. */ #define EmptyString(x) (!(x) || !(*x)) extern int string_has_wildcards(const char* str); extern int string_is_valid_utf8(const char* str); extern int string_contains_non_ascii (const char* str); extern int string_character_structure_is_sane(const char* str); extern char* ircd_strncpy(char* dest, const char* src, size_t len); extern int ircd_strcmp(const char *a, const char *b); extern int ircd_strncmp(const char *a, const char *b, size_t n); extern int unique_name_vector(char* names, char token, char** vector, int size); extern int token_vector(char* names, char token, char** vector, int size); extern const char* ircd_ntoa(const struct irc_in_addr* addr); extern const char* ircd_ntoa_r(char* buf, const struct irc_in_addr* addr); #define ircd_aton(ADDR, STR) ipmask_parse((STR), (ADDR), NULL) extern int ipmask_parse(const char *in, struct irc_in_addr *mask, unsigned char *bits_ptr); extern char* host_from_uh(char* buf, const char* userhost, size_t len); extern char* ircd_strtok(char** save, char* str, char* fs); extern char* canonize(char* buf); extern char* itoa(int n); extern unsigned long ParseInterval(const char *interval); extern int is_timestamp(char *str); extern const char* StripColor(const char* text); extern int HasColor(const char* text); extern int check_if_ipmask(const char *mask); extern int valid_username(const char* name); extern int valid_hostname(const char* name); #define COLOR_BOLD 2 /**< Bold text */ #define COLOR_COLOR 3 /**< Color text */ #define COLOR_ITALIC 29 /**< Italic text */ #define COLOR_NORMAL 15 /**< Normal text */ #define COLOR_REVERSE 22 /**< Reverse text */ #define COLOR_UNDERLINE 31 /**< Underlined text */ /** Make \a y a duplicate \a x, a la strdup(). */ #define DupString(x, y) (strcpy((x = (char*) MyMalloc(strlen(y) + 1)), y)) /* String classification pseudo-functions, when others are needed add them, strIsXxxxx(s) is true when IsXxxxx(c) is true for every char in s */ /** Test whether all characters in \a s are alphanumeric. */ #define strIsAlnum(s) (strChattr(s) & NTL_ALNUM) /** Test whether all characters in \a s are alphabetic. */ #define strIsAlpha(s) (strChattr(s) & NTL_ALPHA) /** Test whether all characters in \a s are digits. */ #define strIsDigit(s) (strChattr(s) & NTL_DIGIT) /** Test whether all characters in \a s are lower case. */ #define strIsLower(s) (strChattr(s) & NTL_LOWER) /** Test whether all characters in \a s are whitespace. */ #define strIsSpace(s) (strChattr(s) & NTL_SPACE) /** Test whether all characters in \a s are upper case. */ #define strIsUpper(s) (strChattr(s) & NTL_UPPER) /** Test whether all characters in \a s are channel name characters. */ #define strIsIrcCh(s) (strChattr(s) & NTL_IRCCH) /** Test whether all characters in \a s are forced to lower-case in channel names. */ #define strIsIrcCl(s) (strChattr(s) & NTL_IRCCL) /** Test whether all characters in \a s are valid in nicknames. */ #define strIsIrcNk(s) (strChattr(s) & NTL_IRCNK) /** Test whether all characters in \a s are valid in a user field. */ #define strIsIrcUi(s) (strChattr(s) & NTL_IRCUI) /** Test whether all characters in \a s are valid in host names. */ #define strIsIrcHn(s) (strChattr(s) & NTL_IRCHN) /** Test whether all characters in \a s are valid in IP addresses. */ #define strIsIrcIp(s) (strChattr(s) & NTL_IRCIP) /* * Critical small functions to inline even in separate compilation * when FORCEINLINE is defined (provided you have a compiler that supports * `inline'). */ /** Declaration for strChattr(). */ #define NTL_HDR_strChattr unsigned int strChattr(const char *s) /** Body for strChattr(). */ #define NTL_SRC_strChattr const char *rs = s; \ unsigned int x = ~0; \ while(*rs) \ x &= IRCD_CharAttrTab[*rs++ - CHAR_MIN]; \ return x; /* * XXX - bleah should return 1 if different 0 if the same */ /** Declaration for strCasediff(). */ #define NTL_HDR_strCasediff int strCasediff(const char *a, const char *b) /** Body for strCasediff(). */ #define NTL_SRC_strCasediff const char *ra = a; \ const char *rb = b; \ while(ToLower(*ra) == ToLower(*rb++)) \ if(!*ra++) \ return 0; \ return 1; #ifndef FORCEINLINE extern NTL_HDR_strChattr; extern NTL_HDR_strCasediff; #else /* FORCEINLINE */ #ifdef __cplusplus inline NTL_HDR_strChattr { NTL_SRC_strChattr } inline NTL_HDR_strCasediff { NTL_SRC_strCasediff } #else static __inline__ NTL_HDR_strChattr { NTL_SRC_strChattr } static __inline__ NTL_HDR_strCasediff { NTL_SRC_strCasediff } #endif #endif /* FORCEINLINE */ #endif /* INCLUDED_ircd_string_h */