AtxString.h

00001 /*****************************************************************
00002 |
00003 |   Atomix - String Objects
00004 |
00005 |   (c) 2001-2006 Gilles Boccon-Gibod
00006 |   Author: Gilles Boccon-Gibod (bok@bok.net)
00007 |
00008 ****************************************************************/
00009 
00010 #ifndef _ATX_STRINGS_H_
00011 #define _ATX_STRINGS_H_
00012 
00013 /*----------------------------------------------------------------------
00014 |   includes
00015 +---------------------------------------------------------------------*/
00016 #include "AtxConfig.h"
00017 #include "AtxTypes.h"
00018 
00019 /*----------------------------------------------------------------------
00020 |   constants
00021 +---------------------------------------------------------------------*/
00022 #define ATX_STRING_SEARCH_FAILED (-1)
00023 #define ATX_EMPTY_STRING {0}
00024 
00025 #ifdef __cplusplus
00026 extern "C" {
00027 #endif /* __cplusplus */
00028 extern const char* const ATX_String_EmptyString;
00029 #ifdef __cplusplus
00030 }
00031 #endif /* __cplusplus */
00032 
00033 /*----------------------------------------------------------------------
00034 |   types
00035 +---------------------------------------------------------------------*/
00036 typedef struct {
00037     char* chars;
00038 } ATX_String;
00039 
00040 typedef struct {
00041     ATX_Cardinal length;
00042     ATX_Cardinal allocated;
00043     /* the actual string characters follow */
00044 } ATX_StringBuffer;
00045 
00046 /*----------------------------------------------------------------------
00047 |   ATX_String inline functions
00048 +---------------------------------------------------------------------*/
00049 #define ATX_String_GetBuffer(str) ( ((ATX_StringBuffer*)((str)->chars))-1 )
00050 #define ATX_String_Construct(str) do {                  \
00051     (str)->chars = NULL;                                \
00052 } while(0)
00053 #define ATX_String_Destruct(str) do {                        \
00054     if ((str)->chars) {                                      \
00055         ATX_FreeMemory((void*)ATX_String_GetBuffer((str)));  \
00056         (str)->chars = NULL;                                 \
00057     }                                                        \
00058 } while(0)
00059 #define ATX_String_GetChar(str, index) ((str)->chars[(index)])
00060 #define ATX_String_SetChar(str, index, c) do {          \
00061     (str)->chars[(index)] = (c);                        \
00062 }
00063 #define ATX_String_GetLength(str) ((str)->chars?(ATX_String_GetBuffer(str)->length):0)
00064 #define ATX_String_GetChars(str) ((str)->chars?(const char*)((str)->chars):ATX_String_EmptyString)
00065 #define ATX_String_UseChars(str) ((str)->chars?(str)->chars:(char*)ATX_String_EmptyString)
00066 #define ATX_CSTR(str) ATX_String_GetChars(&(str))
00067 #define ATX_String_IsEmpty(str) (ATX_String_GetLength((str))==0)
00068 #define ATX_INIT_STRING(s) do {(s).chars = NULL; } while(0)
00069 
00070 /*----------------------------------------------------------------------
00071 |   ATX_String functions
00072 +---------------------------------------------------------------------*/
00073 #ifdef __cplusplus
00074 extern "C" {
00075 #endif /* __cplusplus */
00076 
00077 extern ATX_String 
00078 ATX_String_Create(const char* s);
00079 
00080 extern ATX_String 
00081 ATX_String_CreateFromSubString(const char* s, ATX_Ordinal first, ATX_Size length);
00082 
00083 extern ATX_String 
00084 ATX_String_Clone(const ATX_String* str);
00085 
00086 extern void
00087 ATX_String_Copy(ATX_String* str, const ATX_String* other);
00088 
00089 extern ATX_Result 
00090 ATX_String_SetLength(ATX_String* str, ATX_Size length);
00091 
00092 extern ATX_Result 
00093 ATX_String_Assign(ATX_String* str, const char* chars);
00094 
00095 extern ATX_Result 
00096 ATX_String_AssignN(ATX_String* str, const char* chars, ATX_Size size);
00097 
00098 extern ATX_Result 
00099 ATX_String_Append(ATX_String* str, const char* other);
00100 
00101 extern ATX_Result 
00102 ATX_String_AppendSubString(ATX_String* str, const char* other, ATX_Size size);
00103 
00104 extern ATX_Result 
00105 ATX_String_AppendChar(ATX_String* str, char c);
00106 
00107 extern ATX_String
00108 ATX_String_Add(const ATX_String* str1, const char* str2);
00109 
00110 extern int 
00111 ATX_String_Compare(const ATX_String* str, const char* s, ATX_Boolean ignore_case);
00112 
00113 extern ATX_Boolean 
00114 ATX_String_Equals(const ATX_String* str, const char* s, ATX_Boolean ignore_case);
00115 
00116 extern ATX_String 
00117 ATX_String_SubString(const ATX_String* str, ATX_Ordinal first, ATX_Size length);
00118 
00119 extern ATX_String 
00120 ATX_String_Left(const ATX_String* str, ATX_Size length);
00121 
00122 extern ATX_String 
00123 ATX_String_Right(const ATX_String* str, ATX_Size length);
00124 
00125 extern ATX_Result
00126 ATX_String_Reserve(ATX_String* str, ATX_Size length);
00127 
00128 extern ATX_String
00129 ATX_String_ToLowercase(const ATX_String* str);
00130 
00131 extern ATX_String
00132 ATX_String_ToUppercase(const ATX_String* str);
00133 
00134 extern ATX_Result
00135 ATX_String_ToInteger(const ATX_String* str, long* value, ATX_Boolean relaxed);
00136 
00137 extern ATX_Result
00138 ATX_String_ToFloat(const ATX_String* str, float* value, ATX_Boolean relaxed);
00139 
00140 extern void
00141 ATX_String_MakeLowercase(ATX_String* str);
00142 
00143 extern void
00144 ATX_String_MakeUppercase(ATX_String* str);
00145 
00146 extern void
00147 ATX_String_Replace(ATX_String* str, char a, char b);
00148 
00149 extern int  
00150 ATX_String_FindChar(const ATX_String* str, char c);
00151 
00152 extern int  
00153 ATX_String_FindCharFrom(const ATX_String* str, char c, ATX_Ordinal start);
00154 
00155 extern int  
00156 ATX_String_FindString(const ATX_String* str, const char* s);
00157 
00158 extern int  
00159 ATX_String_FindStringFrom(const ATX_String* str, const char* s, ATX_Ordinal start);
00160 
00161 extern int  
00162 ATX_String_ReverseFindChar(const ATX_String* str, char c);
00163 
00164 extern int  
00165 ATX_String_ReverseFindCharFrom(const ATX_String* str, char c, ATX_Ordinal start);
00166 
00167 extern int  
00168 ATX_String_ReverseFindString(const ATX_String* str, const char* s);
00169 
00170 extern int  
00171 ATX_String_ReverseFindStringFrom(const ATX_String* str, const char* s, ATX_Ordinal start);
00172 
00173 extern ATX_Boolean
00174 ATX_String_StartsWith(const ATX_String* str, const char* s);
00175 
00176 extern ATX_Boolean 
00177 ATX_String_EndsWith(const ATX_String* str, const char* s);
00178 
00179 extern void
00180 ATX_String_TrimWhitespaceLeft(ATX_String* str);
00181 
00182 extern void
00183 ATX_String_TrimCharLeft(ATX_String* str, char c);
00184 
00185 extern void
00186 ATX_String_TrimCharsLeft(ATX_String* str, const char* chars);
00187 
00188 extern void
00189 ATX_String_TrimWhitespaceRight(ATX_String* str);
00190 
00191 extern void
00192 ATX_String_TrimCharRight(ATX_String* str, char c);
00193 
00194 extern void
00195 ATX_String_TrimCharsRight(ATX_String* str, const char* chars);
00196 
00197 extern void
00198 ATX_String_TrimWhitespace(ATX_String* str);
00199 
00200 extern void
00201 ATX_String_TrimChar(ATX_String* str, char c);
00202 
00203 extern void
00204 ATX_String_TrimChars(ATX_String* str, const char* chars);
00205 
00206 extern ATX_Result
00207 ATX_String_Insert(ATX_String* str, const char* s, ATX_Ordinal where);
00208 
00209 /*void Erase(ATX_Ordinal start, ATX_Cardinal count = 1);*/
00210 /*void Replace(ATX_Ordinal start, ATX_Cardinal count, const char* s);*/
00211 
00212 #ifdef __cplusplus
00213 }
00214 #endif /* __cplusplus */
00215 
00216 #endif /* _ATX_STRINGS_H_ */
00217