• Main Page
  • Namespaces
  • Data Structures
  • Files
  • Examples
  • File List
  • Globals

ucommon/string.h

Go to the documentation of this file.
00001 // Copyright (C) 2006-2010 David Sugar, Tycho Softworks.
00002 //
00003 // This file is part of GNU uCommon C++.
00004 //
00005 // GNU uCommon C++ is free software: you can redistribute it and/or modify
00006 // it under the terms of the GNU Lesser General Public License as published 
00007 // by the Free Software Foundation, either version 3 of the License, or
00008 // (at your option) any later version.
00009 //
00010 // GNU uCommon C++ is distributed in the hope that it will be useful,
00011 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00012 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013 // GNU Lesser General Public License for more details.
00014 //
00015 // You should have received a copy of the GNU Lesser General Public License
00016 // along with GNU uCommon C++.  If not, see <http://www.gnu.org/licenses/>.
00017 
00035 #ifndef _UCOMMON_STRING_H_
00036 #define _UCOMMON_STRING_H_
00037 
00038 #ifndef _UCOMMON_MEMORY_H_
00039 #include <ucommon/memory.h>
00040 #endif
00041 
00042 #ifndef _UCOMMON_TIMERS_H_
00043 #include <ucommon/timers.h>
00044 #endif
00045 
00046 #ifndef _UCOMMON_SOCKET_H_
00047 #include <ucommon/socket.h>
00048 #endif
00049 
00050 #include <stdio.h>
00051 #include <string.h>
00052 #include <stdarg.h>
00053 
00054 #ifdef  HAVE_DIRENT_H
00055 #include <dirent.h>
00056 #endif
00057 
00058 NAMESPACE_UCOMMON
00059 
00063 typedef unsigned short strsize_t;
00064 
00065 class StringFormat;
00066 
00077 class __EXPORT string : public Object
00078 {
00079 protected:
00080     friend class StringFormat;
00081 
00093 public:
00094     class __EXPORT cstring : public CountedObject
00095     {
00096     public:
00097 #pragma pack(1)
00098         strsize_t max;  
00099         strsize_t len;  
00100         char fill;      
00101         char text[1];   
00102 #pragma pack()
00103 
00109         cstring(strsize_t size);
00110 
00118         cstring(strsize_t size, char fill);
00119 
00127         void clear(strsize_t offset, strsize_t size);
00128 
00135         void set(strsize_t offset, const char *text, strsize_t size);
00136 
00141         void set(const StringFormat& format);
00142 
00147         void set(const char *text);
00148 
00153         void add(const char *text);
00154 
00159         void add(const StringFormat &format);
00160 
00165         void add(char character);
00166 
00170         void fix(void);
00171 
00176         void unfix(void);
00177 
00183         void inc(strsize_t number);
00184 
00190         void dec(strsize_t number);
00191     };
00192 
00193 protected:
00194     cstring *str;  
00202     cstring *create(strsize_t size, char fill = 0) const;
00203 
00211     virtual int compare(const char *string) const;
00212 
00218     bool equal(const char *string) const;
00219 
00224     virtual void retain(void);
00225 
00230     virtual void release(void);
00231 
00236     virtual cstring *c_copy(void) const;
00237 
00244     virtual void cow(strsize_t size = 0);
00245 
00246     strsize_t getStringSize(void);
00247 
00248 public:
00252     static const strsize_t npos;
00253 
00257     string();
00258 
00263     string(const StringFormat& format);
00264 
00269     string(strsize_t size);
00270 
00276     string(strsize_t size, char fill);
00277 
00284     string(strsize_t size, const char *format, ...) __PRINTF(3, 4);
00285 
00290     string(const char *text);
00291 
00298     string(const char *text, strsize_t size);
00299 
00306     string(const char *text, const char *end);
00307 
00313     string(const string& existing);
00314 
00319     virtual ~string();
00320 
00327     string get(strsize_t offset, strsize_t size = 0) const;
00328 
00334     int scanf(const char *format, ...) __SCANF(2, 3);
00335 
00342     int vscanf(const char *format, va_list args) __SCANF(2, 0);
00343 
00349     strsize_t printf(const char *format, ...) __PRINTF(2, 3);
00350 
00357     strsize_t vprintf(const char *format, va_list args) __PRINTF(2, 0);
00358 
00363     char *c_mem(void) const;
00364 
00369     const char *c_str(void) const;
00370 
00376     virtual bool resize(strsize_t size);
00377 
00382     void set(const char *text);
00383 
00388     void set(const StringFormat& format);
00389 
00397     void set(strsize_t offset, const char *text, strsize_t size = 0);
00398 
00406     void set(const char *text, char overflow, strsize_t offset, strsize_t size = 0);
00407 
00415     void rset(const char *text, char overflow, strsize_t offset, strsize_t size = 0);
00416 
00421     void add(const StringFormat& format);
00422 
00423 
00428     void add(const char *text);
00429 
00434     void add(char character);
00435 
00440     void trim(const char *list);
00441 
00446     void chop(const char *list);
00447 
00452     void strip(const char *list);
00453 
00459     bool unquote(const char *quote);
00460 
00466     void cut(strsize_t offset, strsize_t size = 0);
00467 
00473     void clear(strsize_t offset, strsize_t size = 0);
00474 
00478     void clear(void);
00479 
00483     void upper(void);
00484 
00488     void lower(void);
00489 
00495     strsize_t ccount(const char *list) const;
00496 
00501     strsize_t count(void) const;
00502 
00507     strsize_t size(void) const;
00508 
00518     strsize_t offset(const char *pointer) const;
00519 
00525     char at(int position) const;
00526 
00532     const char *last(const char *list) const;
00533 
00539     const char *first(const char *list) const;
00540 
00545     const char *begin(void) const;
00546 
00551     const char *end(void) const;
00552 
00559     const char *skip(const char *list, strsize_t offset = 0) const;
00560 
00568     const char *rskip(const char *list, strsize_t offset = npos) const;
00569 
00576     const char *find(const char *list, strsize_t offset = 0) const;
00577 
00584     const char *rfind(const char *list, strsize_t offset = npos) const;
00585 
00591     void split(const char *pointer);
00592 
00598     void split(strsize_t offset);
00599 
00605     void rsplit(const char *pointer);
00606 
00612     void rsplit(strsize_t offset);
00613 
00619     const char *chr(char character) const;
00620 
00627     const char *rchr(char character) const;
00628 
00633     strsize_t len(void);
00634 
00639     char fill(void);
00640 
00645     inline operator const char *() const
00646         {return c_str();};
00647 
00652     inline const char *operator*() const
00653         {return c_str();};
00654 
00659     bool full(void) const;
00660 
00667     string operator()(int offset, strsize_t size) const;
00668 
00676     const char *operator()(int offset) const;
00677 
00683     const char operator[](int offset) const;
00684 
00689     bool operator!() const;
00690 
00695     operator bool() const;
00696 
00702     string& operator^=(const string& object);
00703 
00709     string& operator^=(const StringFormat& format);
00710 
00716     string& operator^=(const char *text);
00717 
00723     string& operator+(const char *text);
00724 
00730     string& operator+(const StringFormat& format);
00731 
00738     string& operator&(const char *text);
00739 
00746     string& operator&(const StringFormat& format);
00747 
00754     string& operator=(const string& object);
00755 
00760     string& operator=(const StringFormat& format);
00761 
00766     string& operator=(const char *text);
00767 
00771     string& operator++(void);
00772 
00777     string& operator+=(strsize_t number);
00778 
00782     string& operator--(void);
00783 
00788     string& operator-=(strsize_t number);
00789 
00795     bool operator==(const char *text) const;
00796 
00802     bool operator!=(const char *text) const;
00803 
00809     bool operator<(const char *text) const;
00810 
00816     bool operator<=(const char *text) const;
00817 
00823     bool operator>(const char *text) const;
00824 
00830     bool operator>=(const char *text) const;
00831 
00838     static int scanf(string& object, const char *format, ...) __SCANF(2, 3);
00839 
00846     static strsize_t printf(string& object, const char *format, ...) __PRINTF(2, 3);
00847 
00856     static int read(Socket& socket, string& object);
00857     
00864     static int write(Socket& socket, string& object);
00865 
00874     static int read(FILE *file, string& object);
00875 
00882     static int write(FILE *file, string& object); 
00883 
00892     static bool getline(Socket& socket, string& object);
00893 
00901     static bool putline(Socket& socket, string& object);
00902 
00911     static bool getline(FILE *file, string& object);
00912 
00920     static bool putline(FILE *file, string& object);
00921 
00927     static void swap(string& object1, string& object2);
00928     
00933     static void fix(string& object);
00934 
00939     static void lower(char *text);
00940     
00945     static void upper(char *text);
00946 
00960     static char *token(char *text, char **last, const char *list, const char *quote = NULL, const char *end = NULL);
00961 
00968     static char *skip(char *text, const char *list);
00969 
00976     static char *rskip(char *text, const char *list);
00977 
00985     static char *unquote(char *text, const char *quote);
00986 
00994     static char *rset(char *buffer, size_t size, const char *text);
00995     
01004     static char *set(char *buffer, size_t size, const char *text);
01005     
01015     static char *set(char *buffer, size_t size, const char *text, size_t max);
01016 
01026     static char *add(char *buffer, size_t size, const char *text); 
01027 
01038     static char *add(char *buffer, size_t size, const char *text, size_t max);
01039     
01047     static const char *ifind(const char *text, const char *key, const char *optional);
01048 
01056     static const char *find(const char *text, const char *key, const char *optional);
01057 
01063     static size_t count(const char *text);
01064 
01071     static int compare(const char *text1, const char *text2);
01072 
01079     static bool equal(const char *text1, const char *text2);
01080 
01088     static int compare(const char *text1, const char *text2, size_t size);
01089 
01097     static bool equal(const char *text1, const char *text2, size_t size);
01098 
01105     static int case_compare(const char *text1, const char *text2);
01106 
01113     static bool case_equal(const char *text1, const char *text2);
01114 
01122     static int case_compare(const char *text1, const char *text2, size_t size);
01123 
01131     static bool case_equal(const char *text1, const char *text2, size_t size);
01132 
01140     static char *trim(char *text, const char *list); 
01141 
01149     static char *chop(char *text, const char *list); 
01150 
01158     static char *strip(char *text, const char *list);
01159 
01168     static char *fill(char *text, size_t size, char character);
01169 
01176     static unsigned ccount(const char *text, const char *list);
01177 
01184     static char *find(char *text, const char *list);
01185 
01192     static char *rfind(char *text, const char *list);
01193 
01200     static char *first(char *text, const char *list);
01201 
01208     static char *last(char *text, const char *list);
01209 
01215     static char *dup(const char *text);
01216 
01230     inline static char *token(string& object, char **last, const char *list, const char *quote = NULL, const char *end = NULL)
01231         {return token(object.c_mem(), last, list, quote, end);};
01232 
01240     __SCANF(2,0) inline static int vscanf(string& object, const char *format, va_list args)
01241         {return object.vscanf(format, args);}
01242 
01250     __PRINTF(2,0) inline static strsize_t vprintf(string& object, const char *format, va_list args)
01251         {return object.vprintf(format, args);}
01252 
01258     inline static strsize_t len(string& object)
01259         {return object.len();};
01260 
01266     inline static char *mem(string& object)
01267         {return object.c_mem();};
01268 
01274     inline static strsize_t size(string& object)
01275         {return object.size();};
01276 
01281     inline static void clear(string& object)
01282         {object.clear();};
01283 
01290     inline static unsigned ccount(string& object, const char *list)
01291         {return object.ccount(list);};
01292 
01298     inline static size_t count(string& object)
01299         {return object.count();};
01300 
01305     inline static void upper(string& object)
01306         {object.upper();};
01307 
01312     inline static void lower(string& object)
01313         {object.lower();};
01314 
01321     inline static bool unquote(string& object, const char *quote)
01322         {return object.unquote(quote);};
01323 
01329     inline static void trim(string& object, const char *list)
01330         {object.trim(list);};
01331 
01337     inline static void chop(string& object, const char *list)
01338         {object.trim(list);};
01339 
01345     inline static void strip(string& object, const char *list)
01346         {object.trim(list);};
01347 
01354     inline static const char *find(string& object, const char *list)
01355         {return object.find(list);};
01356 
01363     inline static const char *rfind(string& object, const char *list)
01364         {return object.rfind(list);};
01365 
01372     inline static const char *first(string& object, const char *list)
01373         {return object.first(list);};
01374 
01381     inline static const char *last(string& object, const char *list)
01382         {return object.last(list);};
01383 
01390     inline static double tod(string& object, char **pointer = NULL)
01391         {return strtod(mem(object), pointer);};
01392 
01399     inline static long tol(string& object, char **pointer = NULL)
01400         {return strtol(mem(object), pointer, 0);};
01401 
01408     inline static double tod(const char *text, char **pointer = NULL)
01409         {return strtod(text, pointer);};
01410 
01417     inline static long tol(const char *text, char **pointer = NULL)
01418         {return strtol(text, pointer, 0);};
01419 
01427     static unsigned hexdump(const unsigned char *binary, char *string, const char *format);
01428 
01436     static unsigned hexpack(unsigned char *hex, const char *string, const char *format);
01437 
01438     static unsigned hexsize(const char *format);
01439 };
01440 
01448 class __EXPORT memstring : public string
01449 {
01450 public:
01451     static const size_t header;
01452 
01453 private:
01454     bool resize(strsize_t size);
01455     void cow(strsize_t adj = 0);
01456     void release(void);
01457 
01458 protected:
01459     cstring *c_copy(void) const;
01460 
01461 public:
01466     inline void operator=(string& object)
01467         {set(object.c_str());};
01468 
01473     inline void operator=(const char *text)
01474         {set(text);};
01475 
01482     memstring(void *memory, strsize_t size, char fill = 0);
01483 
01487     ~memstring();
01488 
01494     static memstring *create(strsize_t size, char fill = 0);
01495 
01502     static memstring *create(mempager *pager, strsize_t size, char fill = 0);
01503 };
01504 
01511 class __EXPORT StringFormat
01512 {
01513 protected:
01514     friend class string;
01515     friend class string::cstring;
01516 
01517     virtual ~StringFormat();
01518 
01525     virtual void put(char *buffer, size_t size) const = 0;
01526 
01531     virtual strsize_t getStringSize(void) const = 0;
01532 };
01533 
01534 
01542 template<size_t S>
01543 class charbuf
01544 {
01545 private:
01546     char buffer[S];
01547 
01548 public:
01552     inline charbuf() 
01553         {buffer[0] = 0;};
01554 
01560     inline charbuf(const char *text) 
01561         {string::set(buffer, S, text);};
01562 
01567     inline void operator=(const char *text)
01568         {string::set(buffer, S, text);};
01569 
01575     inline void operator+=(const char *text)
01576         {string::add(buffer, S, text);};
01577 
01582     inline operator bool() const
01583         {return buffer[0];};
01584 
01589     inline bool operator!() const
01590         {return buffer[0] == 0;};   
01591 
01596     inline operator char *()
01597         {return buffer;};
01598 
01603     inline char *operator*()
01604         {return buffer;};
01605 
01611     inline char operator[](size_t offset) const
01612         {return buffer[offset];};
01613 
01619     inline char *operator()(size_t offset)
01620         {return buffer + offset;};
01621 
01626     inline size_t size(void) const
01627         {return S;};
01628 };
01629 
01640 template<strsize_t S>
01641 class stringbuf : public memstring
01642 {
01643 private:
01644     char buffer[sizeof(cstring) + S];
01645     
01646 public:
01650     inline stringbuf() : memstring(buffer, S) {};
01651 
01656     inline stringbuf(const char *text) : memstring(buffer, S) {set(text);};
01657 
01662     inline void operator=(const char *text)
01663         {set(text);};
01664 
01669     inline void operator=(string& object)
01670         {set(object.c_str());}; 
01671 };
01672 
01673 #if !defined(_MSWINDOWS_) && !defined(__QNX__)
01674 
01681 extern "C" inline int stricmp(const char *string1, const char *string2)
01682     {return string::case_compare(string1, string2);}
01683 
01691 extern "C" inline int strnicmp(const char *string1, const char *string2, size_t max)
01692     {return string::case_compare(string1, string2, max);}
01693 
01694 #endif
01695 
01699 typedef string string_t;
01700 
01705 typedef string String;
01706 
01713 inline bool eq(char const *s1, char const *s2)
01714     {return String::equal(s1, s2);}
01715 
01723 inline bool eq(char const *s1, char const *s2, size_t size)
01724     {return String::equal(s1, s2, size);}
01725 
01732 inline bool eq(String &s1, String &s2)
01733     {return String::equal(s1.c_str(), s2.c_str());}
01734 
01742 inline bool ieq(char const *s1, char const *s2)
01743     {return String::case_equal(s1, s2);}
01744 
01753 inline bool ieq(char const *s1, char const *s2, size_t size)
01754     {return String::case_equal(s1, s2, size);}
01755 
01763 inline bool ieq(String &s1, String &s2)
01764     {return String::case_equal(s1.c_str(), s2.c_str());}
01765 
01766 END_NAMESPACE
01767 
01768 #endif

Generated on Sun Sep 4 2011 for UCommon by  doxygen 1.7.1