5 // loose replacement for CString from MFC
13 #define strcasecmp strcmpi
16 //char* __StrDup(char* pStr);
17 //char* __StrDup(const char* pStr);
19 #define __StrDup strdup
22 #define strcmpi strcasecmp
23 #define stricmp strcasecmp
24 #define strnicmp strncasecmp
26 inline char* strlwr(char* string)
29 for (cp = string; *cp; ++cp)
31 if ('A' <= *cp && *cp <= 'Z')
38 inline char* strupr(char* string)
41 for (cp = string; *cp; ++cp)
43 if ('a' <= *cp && *cp <= 'z')
51 static char *g_pStrWork = NULL;
99 const char* GetBuffer()
107 m_pStr = __StrDup("");
136 char* lpszLast = NULL;
137 while (*lpsz != '\0')
141 if (lpszLast == NULL)
149 if (lpszLast != NULL)
151 // truncate at trailing space start
158 // find first non-space character
160 while (isspace(*lpsz))
163 // fix up data and length
164 int nDataLength = GetLength() - (lpsz - m_pStr);
165 memmove(m_pStr, lpsz, (nDataLength+1));
168 int Find(const char *p)
170 char *pf = strstr(m_pStr, p);
171 return (pf) ? (pf - m_pStr) : -1;
174 // search starting at a given offset
175 int Find(const char *p, int offset)
177 char *pf = strstr(m_pStr+offset, p);
178 return (pf) ? (pf - m_pStr) : -1;
181 int Find(const char ch)
183 char *pf = strchr (m_pStr, ch);
184 return (pf) ? (pf - m_pStr) : -1;
187 int ReverseFind(const char ch)
189 char *pf = strrchr(m_pStr, ch);
190 return (pf) ? (pf - m_pStr) : -1;
193 int CompareNoCase (const char* str) const
195 return strcasecmp (m_pStr, str);
200 return (m_pStr) ? strlen(m_pStr) : 0;
203 const char* Left(int n)
208 g_pStrWork = new char[n+1];
209 strncpy(g_pStrWork, m_pStr, n);
210 g_pStrWork[n] = '\0';
215 g_pStrWork = new char[1];
216 g_pStrWork[0] = '\0';
221 const char* Right(int n)
226 g_pStrWork = new char[n+1];
227 int nStart = GetLength() - n;
228 strncpy(g_pStrWork, &m_pStr[nStart], n);
229 g_pStrWork[n] = '\0';
233 g_pStrWork = new char[1];
234 g_pStrWork[0] = '\0';
239 const char* Mid(int nFirst) const
241 return Mid(nFirst, strlen (m_pStr) - nFirst);
244 const char* Mid(int first, int n) const
249 g_pStrWork = new char[n+1];
250 strncpy(g_pStrWork, m_pStr+first, n);
251 g_pStrWork[n] = '\0';
256 g_pStrWork = new char[1];
257 g_pStrWork[0] = '\0';
263 void Format(const char* fmt, ...)
268 va_start (args, fmt);
269 buffer = g_strdup_vprintf (fmt, args);
273 m_pStr = __StrDup(buffer);
277 void Format(const char* fmt, ...)
280 m_pStr = new char[1024];
282 va_start (args, fmt);
283 vsprintf (m_pStr, fmt, args);
288 void SetAt(int n, char ch)
290 if (n >= 0 && n < GetLength ())
294 // NOTE: unlike CString, this looses the pointer
295 void ReleaseBuffer(int n = -1)
302 m_pStr = __StrDup(tmp);
306 char* GetBufferSetLength(int n)
311 char *p = new char[n+1];
312 strncpy (p, m_pStr, n);
319 // char& operator *() { return *m_pStr; }
320 // char& operator *() const { return *const_cast<Str*>(this)->m_pStr; }
321 operator void*() { return m_pStr; }
322 operator char*() { return m_pStr; }
323 operator const char*(){ return reinterpret_cast<const char*>(m_pStr); }
324 operator unsigned char*() { return reinterpret_cast<unsigned char*>(m_pStr); }
325 operator const unsigned char*() { return reinterpret_cast<const unsigned char*>(m_pStr); }
326 Str& operator =(const Str& rhs)
331 m_pStr = __StrDup(rhs.m_pStr);
336 Str& operator =(const char* pStr)
341 m_pStr = __StrDup(pStr);
346 Str& operator +=(const char ch)
348 int len = GetLength ();
349 char *p = new char[len + 1 + 1];
359 m_pStr[len+1] = '\0';
364 Str& operator +=(const char *pStr)
370 char *p = new char[strlen(m_pStr) + strlen(pStr) + 1];
378 m_pStr = __StrDup(pStr);
384 bool operator ==(const Str& rhs) const { return (m_bIgnoreCase) ? stricmp(m_pStr, rhs.m_pStr) == 0 : strcmp(m_pStr, rhs.m_pStr) == 0; }
385 bool operator ==(char* pStr) const { return (m_bIgnoreCase) ? stricmp(m_pStr, pStr) == 0 : strcmp(m_pStr, pStr) == 0; }
386 bool operator ==(const char* pStr) const { return (m_bIgnoreCase) ? stricmp(m_pStr, pStr) == 0 : strcmp(m_pStr, pStr) == 0; }
387 bool operator !=(Str& rhs) const { return (m_bIgnoreCase) ? stricmp(m_pStr, rhs.m_pStr) != 0 : strcmp(m_pStr, rhs.m_pStr) != 0; }
388 bool operator !=(char* pStr) const { return (m_bIgnoreCase) ? stricmp(m_pStr, pStr) != 0 : strcmp(m_pStr, pStr) != 0; }
389 bool operator !=(const char* pStr) const { return (m_bIgnoreCase) ? stricmp(m_pStr, pStr) != 0 : strcmp(m_pStr, pStr) != 0; }
390 char& operator [](int nIndex) { return m_pStr[nIndex]; }
391 char& operator [](int nIndex) const { return m_pStr[nIndex]; }
392 const char GetAt (int nIndex) { return m_pStr[nIndex]; }