]>
cygwin.com Git - cygwin-apps/setup.git/blob - String++.cc
90c8bdb8fc65591c88490f892902e730e25fcea0
2 * Copyright (c) 2002, Robert Collins.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * A copy of the GNU General Public License can be found at
12 * Written by Robert Collins.
16 // A String class to replace all the char * manipulation.
22 #include "io_stream.h"
26 String::_data::_data(_data
const &aData
) : count (1), theString (new unsigned char[aData
.length
]), cstr(0), length (aData
.length
) {
27 memcpy (theString
, aData
.theString
, aData
.length
);
30 String::_data::_data(): count (1), theString(new unsigned char[0]), cstr (0), length (0) {}
31 String::_data::_data(size_t aLength
): count (1), theString(new unsigned char[aLength
]), cstr(0), length (aLength
) {}
32 String::_data::~_data ()
42 String::String (const char *acString
) : theData (new _data(acString
? strlen(acString
) : 0))
44 memcpy (theData
->theString
, acString
, theData
->length
);
49 if (--theData
->count
== 0)
53 // able to cache the result if needed.
57 if (theData
->length
== 0)
59 char * tempcStr
=new char[theData
->length
+ 1];
60 // remove when exceptions are done
63 tempcStr
[theData
->length
] = '\0';
64 memcpy (tempcStr
, theData
->theString
, theData
->length
);
71 if (theData
->length
== 0)
73 char * tempcStr
=new char[theData
->length
+ 1];
74 // remove when exceptions are done
77 tempcStr
[theData
->length
] = '\0';
78 memcpy (tempcStr
, theData
->theString
, theData
->length
);
82 // able to cache the result if needed.
84 String::cstr_oneuse () const
86 if (theData
->length
== 0)
89 delete[] theData
->cstr
;
90 theData
->cstr
= new char[theData
->length
+ 1];
91 theData
->cstr
[theData
->length
] = '\0';
92 memcpy (theData
->cstr
, theData
->theString
, theData
->length
);
96 // does this character exist in the string?
97 // 0 is false, 1 is the first position...
98 // XXX FIXME: Introduce npos, and change all
99 // if (size) calls to be if (size()==npos)
101 String::find(char aChar
) const
103 for (size_t i
=0; i
< theData
->length
; ++i
)
104 if (theData
->theString
[i
] == aChar
)
110 String::compare (String
const &aString
, size_t const count
) const
113 if (theData
== aString
.theData
)
115 size_t length
= count
? count
: theData
->length
;
116 if (length
> theData
->length
)
117 length
= theData
->length
;
118 if (length
> aString
.theData
->length
)
119 length
= aString
.theData
->length
;
121 for (i
=0; i
< length
; ++i
)
122 if (theData
->theString
[i
] < aString
.theData
->theString
[i
])
124 else if (theData
->theString
[i
] > aString
.theData
->theString
[i
])
127 if (i
== count
&& count
!= 0)
129 if (theData
->length
< aString
.theData
->length
)
131 else if (theData
->length
> aString
.theData
->length
)
137 String::casecompare (String
const &aString
, size_t const count
) const
140 if (theData
== aString
.theData
)
142 size_t length
= count
? count
: theData
->length
;
143 if (length
> theData
->length
)
144 length
= theData
->length
;
145 if (length
> aString
.theData
->length
)
146 length
= aString
.theData
->length
;
148 for (i
=0; i
< length
; ++i
)
149 if (toupper(theData
->theString
[i
]) < toupper(aString
.theData
->theString
[i
]))
151 else if (toupper(theData
->theString
[i
]) > toupper(aString
.theData
->theString
[i
]))
154 if (i
== count
&& count
!= 0)
156 if (theData
->length
< aString
.theData
->length
)
158 else if (theData
->length
> aString
.theData
->length
)
164 String::operator+= (String
const &aString
)
166 if (theData
->count
> 1)
168 _data
* someData
= new _data(*theData
);
173 unsigned char *tempString
= theData
->theString
;
174 theData
->theString
= new unsigned char [theData
->length
+ aString
.theData
->length
];
175 // remove when exceptions are done
176 if (!theData
->theString
)
178 memcpy (theData
->theString
, tempString
, theData
->length
);
180 memcpy (&theData
->theString
[theData
->length
], aString
.theData
->theString
, aString
.theData
->length
);
181 theData
->length
+= aString
.theData
->length
;
186 String::operator + (String
const &aString
) const
188 unsigned char *tempcString
= new unsigned char [theData
->length
+ aString
.theData
->length
];
189 // remove when exceptions are done
192 memcpy (tempcString
, theData
->theString
, theData
->length
);
193 memcpy (&tempcString
[theData
->length
], aString
.theData
->theString
, aString
.theData
->length
);
194 return absorb (tempcString
, theData
->length
+ aString
.theData
->length
);
198 String::operator + (char const *aString
) const
200 // expensive, but quick to code.
201 return *this + String (aString
);
205 String::operator == (String
const &rhs
) const
207 return compare (rhs
) ? false : true;
211 String::operator == (char const *rhs
) const
213 return compare (rhs
) ? false : true;
217 String::absorb (unsigned char *aString
, size_t aLength
)
220 theString
.theData
->theString
= aString
;
221 theString
.theData
->length
= aLength
;
226 String::casecompare (String
const lhs
, String
const rhs
)
228 return lhs
.casecompare (rhs
);
This page took 0.043937 seconds and 5 git commands to generate.