You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
261 lines
6.5 KiB
261 lines
6.5 KiB
3 years ago
|
//
|
||
|
// htString.h
|
||
|
//
|
||
|
// htString: (implementation in String.cc) Just Another String class.
|
||
|
//
|
||
|
// Part of the ht://Dig package <http://www.htdig.org/>
|
||
|
// Copyright (c) 1999-2004 The ht://Dig Group
|
||
|
// For copyright details, see the file COPYING in your distribution
|
||
|
// or the GNU Library General Public License (LGPL) version 2 or later
|
||
|
// <http://www.gnu.org/copyleft/lgpl.html>
|
||
|
//
|
||
|
// $Id: htString.h,v 1.24 2004/05/28 13:15:21 lha Exp $
|
||
|
//
|
||
|
#ifndef __String_h
|
||
|
#define __String_h
|
||
|
|
||
|
#include "Object.h"
|
||
|
|
||
|
#include <stdarg.h>
|
||
|
#include <stdio.h>
|
||
|
|
||
|
#ifdef HAVE_STD
|
||
|
#include <iostream>
|
||
|
#ifdef HAVE_NAMESPACES
|
||
|
using namespace std;
|
||
|
#endif
|
||
|
#else
|
||
|
#include <iostream.h>
|
||
|
#endif /* HAVE_STD */
|
||
|
|
||
|
class String : public Object
|
||
|
{
|
||
|
public:
|
||
|
String() { Length = 0; Allocated = 0; Data = 0; } // Create an empty string
|
||
|
String(int init); // initial allocated length
|
||
|
String(const char *s); // from null terminated s
|
||
|
String(const char *s, int len); // from s with length len
|
||
|
String(const String &s); // Copy constructor
|
||
|
|
||
|
//
|
||
|
// This can be used for performance reasons if it is known the
|
||
|
// String will need to grow.
|
||
|
//
|
||
|
String(const String &s, int allocation_hint);
|
||
|
|
||
|
~String();
|
||
|
|
||
|
inline int length() const;
|
||
|
char *get();
|
||
|
const char *get() const;
|
||
|
operator char*() { return get(); }
|
||
|
operator const char*() const { return get(); }
|
||
|
|
||
|
//
|
||
|
// Interpretation
|
||
|
//
|
||
|
int as_integer(int def = 0) const;
|
||
|
double as_double(double def = 0) const;
|
||
|
int empty() const { return length() == 0; }
|
||
|
|
||
|
//
|
||
|
// If it is not posible to use the constructor with an initial
|
||
|
// allocation size, use the following member to set the size.
|
||
|
//
|
||
|
void allocate(int init) {reallocate_space(init);}
|
||
|
|
||
|
//
|
||
|
// allocate space for a new char *, and copy the String in.
|
||
|
//
|
||
|
char *new_char() const;
|
||
|
|
||
|
//
|
||
|
// Assignment
|
||
|
//
|
||
|
inline String& set(const char *s, int l) { trunc(); append(s, l); return *this; }
|
||
|
inline String& set(char *s) { trunc(); append(s, strlen(s)); return *this; }
|
||
|
void operator = (const String &s);
|
||
|
void operator = (const char *s);
|
||
|
inline void operator += (const String &s) { append(s); }
|
||
|
inline void operator += (const char *s) { append(s); }
|
||
|
|
||
|
//
|
||
|
// Appending
|
||
|
//
|
||
|
inline String &operator << (const char *);
|
||
|
inline String &operator << (char);
|
||
|
inline String &operator << (unsigned char c) {return *this<<(char)c;}
|
||
|
String &operator << (int);
|
||
|
String &operator << (unsigned int);
|
||
|
String &operator << (long);
|
||
|
inline String &operator << (short i) {return *this<<(int)i;}
|
||
|
String &operator << (const String &);
|
||
|
String &operator << (const String *s) {return *this << *s;}
|
||
|
|
||
|
//
|
||
|
// Access to specific characters
|
||
|
//
|
||
|
inline char &operator [] (int n);
|
||
|
inline char operator [] (int n) const;
|
||
|
inline char Nth (int n) { return (*this)[n]; }
|
||
|
inline char last() const { return Length > 0 ? Data[Length - 1] : '\0'; }
|
||
|
|
||
|
//
|
||
|
// Removing
|
||
|
//
|
||
|
char operator >> (char c);
|
||
|
|
||
|
//
|
||
|
// Comparison
|
||
|
// Return:
|
||
|
// 0 : 'this' is equal to 's'.
|
||
|
// -1 : 'this' is less than 's'.
|
||
|
// 1 : 'this' is greater than 's'.
|
||
|
//
|
||
|
int compare(const Object& s) const { return compare((const String&)s); }
|
||
|
int compare(const String& s) const;
|
||
|
int nocase_compare(const String &s) const;
|
||
|
|
||
|
//
|
||
|
// Searching for parts
|
||
|
//
|
||
|
int lastIndexOf(char c) const;
|
||
|
int lastIndexOf(char c, int pos) const;
|
||
|
int indexOf(char c) const;
|
||
|
int indexOf(char c, int pos) const;
|
||
|
int indexOf(const char *) const;
|
||
|
int indexOf(const char *, int pos) const;
|
||
|
|
||
|
//
|
||
|
// Manipulation
|
||
|
//
|
||
|
void append(const String &s);
|
||
|
void append(const char *s);
|
||
|
void append(const char *s, int n);
|
||
|
void append(char ch);
|
||
|
|
||
|
inline String &trunc() { Length = 0; return *this; }
|
||
|
String &chop(int n = 1);
|
||
|
String &chop(char ch = '\n');
|
||
|
String &chop(const char *str = (char *)"\r\n");
|
||
|
|
||
|
//
|
||
|
// SubStrings
|
||
|
//
|
||
|
// The string starting at postion 'start' and length 'len'.
|
||
|
//
|
||
|
String sub(int start, int len) const;
|
||
|
String sub(int start) const;
|
||
|
|
||
|
//
|
||
|
// IO
|
||
|
//
|
||
|
int Write(int fd) const;
|
||
|
|
||
|
#ifndef NOSTREAM
|
||
|
void debug(ostream &o);
|
||
|
#endif /* NOSTREAM */
|
||
|
|
||
|
//
|
||
|
// Non-member operators
|
||
|
//
|
||
|
friend String operator + (const String &a, const String &b);
|
||
|
friend int operator == (const String &a, const String &b);
|
||
|
friend int operator != (const String &a, const String &b);
|
||
|
friend int operator < (const String &a, const String &b);
|
||
|
friend int operator > (const String &a, const String &b);
|
||
|
friend int operator <= (const String &a, const String &b);
|
||
|
friend int operator >= (const String &a, const String &b);
|
||
|
|
||
|
#ifndef NOSTREAM
|
||
|
friend ostream &operator << (ostream &o, const String &s);
|
||
|
|
||
|
friend istream &operator >> (istream &in, String &line);
|
||
|
#endif /* NOSTREAM */
|
||
|
|
||
|
int readLine(FILE *in);
|
||
|
|
||
|
int lowercase();
|
||
|
int uppercase();
|
||
|
|
||
|
void replace(char c1, char c2);
|
||
|
int remove(const char *);
|
||
|
|
||
|
Object *Copy() const { return new String(*this); }
|
||
|
|
||
|
//
|
||
|
// Persistent storage support
|
||
|
//
|
||
|
void Serialize(String &);
|
||
|
void Deserialize(String &, int &);
|
||
|
|
||
|
private:
|
||
|
int Length; // Current Length
|
||
|
int Allocated; // Total space allocated
|
||
|
char *Data; // The actual contents
|
||
|
|
||
|
void copy_data_from(const char *s, int len, int dest_offset = 0);
|
||
|
void copy(const char *s, int len, int allocation_hint);
|
||
|
|
||
|
//
|
||
|
// Possibly make Data bigger.
|
||
|
//
|
||
|
void reallocate_space(int len);
|
||
|
|
||
|
//
|
||
|
// Allocate some space for the data. Delete Data if it
|
||
|
// has been allocated.
|
||
|
//
|
||
|
void allocate_space(int len);
|
||
|
// Allocate some space without rounding
|
||
|
void allocate_fix_space(int len);
|
||
|
|
||
|
friend class StringIndex;
|
||
|
};
|
||
|
|
||
|
extern char *form(const char *, ...);
|
||
|
extern char *vform(const char *, va_list);
|
||
|
|
||
|
//
|
||
|
// Inline methods.
|
||
|
//
|
||
|
inline String &String::operator << (const char *str)
|
||
|
{
|
||
|
append(str);
|
||
|
return *this;
|
||
|
}
|
||
|
|
||
|
inline String &String::operator << (char ch)
|
||
|
{
|
||
|
append(ch);
|
||
|
return *this;
|
||
|
}
|
||
|
|
||
|
inline int String::length() const
|
||
|
{
|
||
|
return Length;
|
||
|
}
|
||
|
|
||
|
inline char String::operator [] (int n) const
|
||
|
{
|
||
|
if(n < 0) n = Length + n;
|
||
|
if(n >= Length || n < 0) return '\0';
|
||
|
|
||
|
return Data[n];
|
||
|
}
|
||
|
|
||
|
static char null = '\0';
|
||
|
|
||
|
inline char &String::operator [] (int n)
|
||
|
{
|
||
|
if(n < 0) n = Length + n;
|
||
|
if(n >= Length || n < 0) return null;
|
||
|
|
||
|
return Data[n];
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Non friend, non member operators
|
||
|
//
|
||
|
#endif
|