1 /**
2 *  Copyright Mikael H�gdahl - triyana@users.sourceforge.net
3 *
4 *  This source is distributed under the terms of the Q Public License version 1.0,
5 *  created by Trolltech (www.trolltech.com).
6 */
7 
8 #ifndef MHString_h
9 #define MHString_h
10 
11 #include <math.h>
12 #include "MH.h"
13 #include "MHUtil.h"
14 
15 
16 
17 /**
18 *  A string class.
19 */
20 class MHString : public MH {
21 public:
22     enum {
23                         SORT_STRING = 0,
24                         SORT_NUM,
25     };
26 
MHString()27                         MHString () : MH() {aData = 0; allocate((const char*)"");}
MHString(const MHString & s)28                         MHString (const MHString& s) : MH() {if (&s == this) return; aData = 0; allocate(s.Get());}
MHString(const char * s)29                         MHString (const char* s) : MH() {aData = 0; allocate(s);}
MHString(int n)30                         MHString (int n) : MH() {aData = 0; allocate(n);}
MHString(double n)31                         MHString (double n) : MH() {aData = 0; allocate(n);}
32                         MHString (int size, const char *str, ...);
~MHString()33     virtual             ~MHString () {Clear();}
34 
35     //friend ostream&     operator<< (ostream& os, MHString& s) {os << s(); return os;}
36     //friend ostream&     operator<< (ostream& os, MHString* s) {os << (*s)(); return os;}
37 
38     MHString&           operator= (const MHString& s) {if (&s == this) return *this; allocate(s);return *this;}
39     MHString&           operator= (const char* s) {allocate(s);return *this;}
40     MHString&           operator= (int n) {allocate(n);return *this;}
41     MHString&           operator= (double n) {allocate(n);return *this;}
42 
43     MHString&           operator+= (const MHString& s) {allocate(aData, s.Get());return *this;}
44     MHString&           operator+= (const char* s) {allocate(aData, s);return *this;}
45     MHString&           operator+= (int n) {allocate(aData, n);return *this;}
46     MHString&           operator+= (double n) {allocate(aData, n);return *this;}
47 
48     MHString            operator+ (const MHString& s) {MHString s3(aData); s3 += s; return s3;}
49     MHString            operator+ (const char* s) {MHString s3(aData); s3 += s; return s3;}
50     MHString            operator+ (int n) {MHString s3(aData); s3 += n; return s3;}
51     MHString            operator+ (double n) {MHString s3(aData); s3 += n; return s3;}
52 
53     bool                operator== (const MHString& s) {return (Compare (s.Get ()) == 0) ? true : false;}
54     bool                operator== (const char* s) {return (Compare (s) == 0) ? true : false;}
55     bool                operator!= (const MHString& s) {return (Compare (s.Get ()) != 0) ? true : false;}
56     bool                operator!= (const char* s) {return (Compare (s) != 0) ? true : false;}
57     bool                operator< (const MHString& s) {return (Compare (s.Get ()) < 0) ? true : false;}
58     bool                operator< (const char* s) {return (Compare (s) < 0) ? true : false;}
59     bool                operator> (const MHString& s) {return (Compare (s.Get ()) > 0) ? true : false;}
60     bool                operator> (const char* s) {return (Compare (s) > 0) ? true : false;}
61     bool                operator<= (const MHString& s) {return (Compare (s.Get ()) < 1) ? true : false;}
62     bool                operator<= (const char* s) {return (Compare (s) < 1) ? true : false;}
63     bool                operator>= (const MHString& s) {return (Compare (s.Get ()) >= 0) ? true : false;}
64     bool                operator>= (const char* s) {return (Compare (s) >= 0) ? true : false;}
65 
66     char                operator[] (int i) {return aData[i];}
operator()67     const char*         operator() () {return aData;}
68 
AlignLeft(int nWidth,char pad)69     void                AlignLeft (int nWidth, char pad) {align (false, nWidth, pad);}
AlignRight(int nWidth,char pad)70     void                AlignRight (int nWidth, char pad) {align (true, nWidth, pad);}
71     void                CapitalizeAll ();
72     void                CapitalizeFirst ();
Class()73     const char*         Class () {return "MHString";}
74     int                 Compare (const char* pBuffer);
75     int                 Compare (const MH* o, int type);
76     int                 CompareIgnoreCase (const char* pBuffer);
Double()77     double              Double () {return (aLen > 0) ? strtod(aData, 0) : HUGE_VAL;}
Erase()78     void                Erase () {*this = "";}
Escape()79     const char*         Escape () {return Get();}
80     int                 Find (const MHString& s, int nStart = 0) {return find (s.Get(), nStart, true);}
81     int                 Find (const char* s, int nStart = 0) {return find (s, nStart, true);}
82     int                 FindIgnoreCase (const char* s, int nStart = 0) {return find (s, nStart, false);}
83     int                 FindIgnoreCase (const MHString& s, int nStart = 0) {return find (s.Get(), nStart, false);}
Get()84     const char*         Get () const {return aData;}
GetChar(int i)85     char                GetChar (int i) {return (i >= 0 && i < aLen) ? aData[i] : '\0';}
GetLastChar()86     char                GetLastChar () {return (aLen > 0) ? aData[aLen - 1] : '\0';}
HashKey()87     const char*         HashKey () {return ((aData && *aData) ? aData : "MHString");}
88     MHString            Left (int count);
Int()89     int                 Int () {return (aLen > 0) ? atoi (aData) : 0;}
90     MHString            Mid (int nStart, int nCount);
Pop()91     char                Pop () {if (aLen > 0) {char c = aData[aLen - 1]; aData[aLen - 1] = '\0'; aLen--; return c;} else return '\0';}
92     void                Remove (char Char);
93     void                RemoveHead (char Char);
94     void                RemoveTail (char Char);
95     MHString            Right (int nCount);
96     void                Shrink (int size);
97     static void         Save (const char* fileName, MHVector* v, bool nl = false, bool row = false);
SetChar(int i,int c)98     void                SetChar (int i, int c) {if (i >= 0 && i < aLen) aData[i] = c;}
Size()99     int                 Size () {return aLen;}
100     int                 Split (char c, MHVector* ve);
101     int                 Split (MHVector* ve, int nFirstPos, ...);
102     void                Sprintf (int len, const char *str, ...);
103     void                Strip ();
104     int                 Subst (char OldChar, char NewChar, int nKeepMinOldChar);
ToDouble()105     double              ToDouble () {return (aData) ? atof (aData) : 0.0;}
ToInt()106     int                 ToInt () {return (aData) ? atoi (aData) : 0;}
107     void                ToLower ();
108     void                ToUpper ();
109 
110 private:
111     char*               aData;
112     int                 aLen;
113 
114     void                align (bool right, int nWidth, char pad);
allocate(const MHString & s)115     void                allocate (const MHString& s) {allocate (s.Get());}
116     void                allocate (const char* s);
117     void                allocate (char* s);
118     void                allocate (int n);
119     void                allocate (double n);
120     void                allocate (const char* s, const char* s2);
121     void                allocate (const char* s, int n);
122     void                allocate (const char* s, double n);
123 
124     void                Clear ();
125     char*               createAndConcat (const char* string1, const char* string2);
126     int                 find (const char* word, int start, bool compareCase);
127 };
128 
129 #endif
130