+// allocate enough memory for nLen characters
+void wxString::Alloc(uint nLen)
+{
+ wxStringData *pData = GetStringData();
+ if ( pData->nAllocLength <= nLen ) {
+ if ( pData->IsEmpty() )
+ AllocBuffer(nLen);
+ else if ( pData->IsShared() ) {
+ pData->Unlock(); // memory not freed because shared
+ uint nLen = pData->nDataLength;
+ AllocBuffer(nLen);
+ memcpy(m_pchData, pData->data(), nLen*sizeof(char));
+ }
+ else {
+ nLen += EXTRA_ALLOC;
+
+ wxStringData *p = (wxStringData *)
+ realloc(pData, sizeof(wxStringData) + (nLen + 1)*sizeof(char));
+
+ if ( p == NULL ) {
+ // @@@ what to do on memory error?
+ return;
+ }
+
+ // it's not important if the pointer changed or not (the check for this
+ // is not faster than assigning to m_pchData in all cases)
+ p->nAllocLength = nLen;
+ m_pchData = p->data();
+ }
+ }
+ //else: we've already got enough
+}
+
+// shrink to minimal size (releasing extra memory)
+void wxString::Shrink()
+{
+ wxStringData *pData = GetStringData();
+ void *p = realloc(pData, sizeof(wxStringData) +
+ (pData->nDataLength + 1)*sizeof(char));
+ wxASSERT( p != NULL ); // can't free memory?
+ wxASSERT( p == pData ); // we're decrementing the size - block shouldn't move!
+}
+