/* ScummVM - Graphic Adventure Engine * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT * file distributed with this source distribution. * * Additional copyright for this file: * Copyright (C) 1999-2000 Revolution Software Ltd. * This code is based on source code created by Revolution Software, * used with permission. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #ifndef ICB_PX_STRING_H #define ICB_PX_STRING_H #include "engines/icb/common/px_rcutypes.h" namespace ICB { class pxString { protected: char *s; // The actual string public: pxString(); // Empty creator pxString(const char *); // Copy constructor pxString(const pxString &); // Copy constructor ~pxString(); // Destructor operator const char *() const { return (s); // Return a pointer to the string } const char *operator=(const char *); // Assign a value void operator=(const pxString &); // Assign a value const char *operator+=(const char *); // Add a string char &operator[](uint32 n) { return (s[n]); // Get a character (no reason not to allow it to change) } char &operator[](int32 n) { return (s[n]); // Get a character (no reason not to allow it to change) } bool IsNull() const { return ((bool)(s == NULL)); // Check for a null value } bool IsEmpty() const; // Check for an empty string uint32 GetLen() const; // Returns the length of the string. void ToUpper(); // Make contents of string uppercase void ToLower(); // Make contents of string lowercase void ConvertPath(); // Converts a path to native format const char *c_str() { return s; } const pxString &Format(const char *, ...); // Use variable arguments to set the string const pxString operator+(const char *) const; inline pxString Substr(uint32 nStart, uint32 nLen) const; // Return a part of this string void Substr(pxString &rsStr, uint32 nStart, uint32 nLen) const; // A faster substring. void SetString(const char *data, uint32 len); // Get the first len characters from another string uint32 StrChr(char cToFind, uint32 nStartPos = 0) const; // Find position of a character in a string [PS 17/08/98] // char * comparisons bool operator==(const char *string) const; // Do a character by character comparison bool operator!=(const char *string) const; // Do a character by character uncomparison }; inline pxString::pxString(const pxString &str) { if (str.s) { // There is some data to copy uint32 len = strlen((char *)str.s) + 1; s = new char[len]; memcpy((unsigned char *)s, (unsigned char *)str.s, len); } else // No data for this string s = NULL; } inline pxString::~pxString() { // Destructor if (s) delete[] s; } const char *pxVString(MSVC_PRINTF const char *format, ...) GCC_PRINTF(1, 2); class pxFlexiCharBuffer { char *m_buffer; // The buffer itself uint32 m_bufLen; // The buffer length public: // explicit pxFlexiCharBuffer(uint32 len = 40); ~pxFlexiCharBuffer(); char &operator[](uint32); // Allow array access void CheckSize(uint32); // Make sure we have enough room char *GetBuffer() { return (m_buffer); // Make it a little more difficult to pass the pointer } // Pointer access was originally const char *, but for use as a buffer for reading in from // files this needs to be changeable, and needs a void * operator operator char *() { return (m_buffer); // Treat as a char * } operator void *() { return (m_buffer); // Treat as a void * } void StrCpy(uint32 offset, const char *text); // Copy a string to the buffer void StrnCpy(uint32 offset, const char *text, uint32 len); // Copy a number of characters to the buffer // Prevent copy or assignment private: pxFlexiCharBuffer(const pxFlexiCharBuffer &) {} void operator=(const pxFlexiCharBuffer &) {} }; class pxFixedCharBuffer { char *m_data; public: pxFixedCharBuffer(uint32 len); ~pxFixedCharBuffer() { delete[] m_data; } operator void *() { return (m_data); } operator char *() { return (m_data); } // Prevent copy or assignment private: pxFixedCharBuffer(const pxFixedCharBuffer &) {} void operator=(const pxFixedCharBuffer &) {} }; inline pxString::pxString() { // Empty creator s = NULL; } inline pxString::pxString(const char *str) { // Copy constructor if (str) { uint32 len = strlen(str) + 1; s = new char[len]; memcpy(s, str, len); } else s = NULL; } inline bool pxString::IsEmpty() const { // Check for an empty string if ((s == NULL) || (*s == 0)) return (true); return (false); } inline uint32 pxString::GetLen() const { if ((s == NULL)) return (0); return (strlen(s)); } inline pxString pxString::Substr(uint32 nStart, uint32 nNum) const { pxString rsRetVal; Substr(rsRetVal, nStart, nNum); return rsRetVal; } inline bool pxString::operator!=(const char *string) const { // Do a character by character uncomparison // Simply return the opposit of the == function return ((bool)!((*this) == string)); } } // End of namespace ICB #endif // #ifndef _PX_pxString_H