зеркало из https://github.com/mozilla/gecko-dev.git
109 строки
3.2 KiB
C++
109 строки
3.2 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
*
|
|
* The contents of this file are subject to the Netscape Public License
|
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
|
* http://www.mozilla.org/NPL/
|
|
*
|
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
|
* for the specific language governing rights and limitations under the
|
|
* NPL.
|
|
*
|
|
* The Initial Developer of this code under the NPL is Netscape
|
|
* Communications Corporation. Portions created by Netscape are
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
|
* Reserved.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "fredmem.h"
|
|
|
|
#define cstringMaxInternalLen 30
|
|
|
|
class cstring
|
|
{
|
|
public:
|
|
inline cstring ()
|
|
{ haveExternalSpace = false; space.internal[0] = 0; }
|
|
inline cstring (const char *s)
|
|
{ haveExternalSpace = false; assign (s); }
|
|
inline cstring (const unsigned char *ps)
|
|
{ haveExternalSpace = false; assign (ps+1, ps[0]); }
|
|
inline cstring (const cstring& s)
|
|
{ haveExternalSpace = false; assign (s.data(), s.length() ); }
|
|
inline cstring( void* ptr, long len )
|
|
{ haveExternalSpace = false; assign( ptr, len ); }
|
|
inline ~cstring () { reserve (0, false); }
|
|
char& operator[] (int i) { return data()[i]; }
|
|
inline void operator= (const char *s);
|
|
inline void operator= (const unsigned char *ps);
|
|
inline void operator= (const cstring& s);
|
|
void operator+= (const char *s);
|
|
void truncAt (char c);
|
|
// comparison
|
|
inline int operator== (const cstring& s);
|
|
inline int operator== (const char *s);
|
|
inline int operator!= (const cstring& s);
|
|
inline int operator!= (const char *s);
|
|
// query
|
|
inline const char* data() const { return haveExternalSpace? space.external: space.internal; }
|
|
inline operator const char* () const { return data(); }
|
|
/* This is not a bug because
|
|
inline operator char* () { return data(); }
|
|
cannot convert a "const cstring" to "char *"
|
|
This can be avoided by adding:
|
|
inline operator const char* () const { return data(); }
|
|
*/
|
|
inline char* data() { return haveExternalSpace? space.external: space.internal; }
|
|
inline operator char* () { return data(); }
|
|
inline int length() const { return strlen (data()); }
|
|
char* reserve (int len, Boolean preserve = false);
|
|
private:
|
|
void assign (const char *s) { assign (s, s? strlen (s): 0); }
|
|
void assign (const void *sd, int len);
|
|
union {
|
|
char* external;
|
|
char internal [cstringMaxInternalLen+1];
|
|
} space;
|
|
int haveExternalSpace;
|
|
};
|
|
|
|
inline void
|
|
cstring::operator= (const char *s) {
|
|
assign (s);
|
|
}
|
|
|
|
inline void
|
|
cstring::operator= (const unsigned char *ps) {
|
|
assign (ps+1, ps[0]);
|
|
}
|
|
|
|
inline void
|
|
cstring::operator= (const cstring& s) {
|
|
assign (s.data(), s.length() );
|
|
}
|
|
|
|
inline int
|
|
cstring::operator== (const cstring& s) {
|
|
return !strcmp (data(), s.data());
|
|
}
|
|
|
|
inline int
|
|
cstring::operator== (const char *s) {
|
|
return !strcmp (data(), s);
|
|
}
|
|
|
|
inline int
|
|
cstring::operator!= (const cstring& s) {
|
|
return strcmp (data(), s.data());
|
|
}
|
|
|
|
inline int
|
|
cstring::operator!= (const char *s) {
|
|
return strcmp (data(), s);
|
|
}
|
|
|
|
|