home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fresh Fish 7
/
FreshFishVol7.bin
/
bbs
/
gnu
/
libg++-2.6-fsf.lha
/
libg++-2.6
/
libg++
/
src
/
String.h
< prev
next >
Wrap
C/C++ Source or Header
|
1994-07-18
|
36KB
|
1,329 lines
// This may look like C code, but it is really -*- C++ -*-
/*
Copyright (C) 1988 Free Software Foundation
written by Doug Lea (dl@rocky.oswego.edu)
This file is part of the GNU C++ Library. This library is free
software; you can redistribute it and/or modify it under the terms of
the GNU Library General Public License as published by the Free
Software Foundation; either version 2 of the License, or (at your
option) any later version. This library 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 Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free Software
Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef _String_h
#ifdef __GNUG__
#pragma interface
#endif
#define _String_h 1
#include <iostream.h>
#include <Regex.h>
struct StrRep // internal String representations
{
unsigned short len; // string length
unsigned short sz; // allocated space
char s[1]; // the string starts here
// (at least 1 char for trailing null)
// allocated & expanded via non-public fcts
};
// primitive ops on StrReps -- nearly all String fns go through these.
StrRep* Salloc(StrRep*, const char*, int, int);
StrRep* Scopy(StrRep*, const StrRep*);
StrRep* Sresize(StrRep*, int);
StrRep* Scat(StrRep*, const char*, int, const char*, int);
StrRep* Scat(StrRep*, const char*, int,const char*,int, const char*,int);
StrRep* Sprepend(StrRep*, const char*, int);
StrRep* Sreverse(const StrRep*, StrRep*);
StrRep* Supcase(const StrRep*, StrRep*);
StrRep* Sdowncase(const StrRep*, StrRep*);
StrRep* Scapitalize(const StrRep*, StrRep*);
// These classes need to be defined in the order given
class String;
class SubString;
class SubString
{
friend class String;
protected:
String& S; // The String I'm a substring of
unsigned short pos; // starting position in S's rep
unsigned short len; // length of substring
void assign(const StrRep*, const char*, int = -1);
SubString(String& x, int p, int l);
SubString(const SubString& x);
public:
// Note there are no public constructors. SubStrings are always
// created via String operations
~SubString();
SubString& operator = (const String& y);
SubString& operator = (const SubString& y);
SubString& operator = (const char* t);
SubString& operator = (char c);
// return 1 if target appears anywhere in SubString; else 0
int contains(char c) const;
int contains(const String& y) const;
int contains(const SubString& y) const;
int contains(const char* t) const;
int contains(const Regex& r) const;
// return 1 if target matches entire SubString
int matches(const Regex& r) const;
// IO
friend ostream& operator<<(ostream& s, const SubString& x);
// status
unsigned int length() const;
int empty() const;
const char* chars() const;
int OK() const;
};
class String
{
friend class SubString;
protected:
StrRep* rep; // Strings are pointers to their representations
// some helper functions
int search(int, int, const char*, int = -1) const;
int search(int, int, char) const;
int match(int, int, int, const char*, int = -1) const;
int _gsub(const char*, int, const char* ,int);
int _gsub(const Regex&, const char*, int);
SubString _substr(int, int);
public:
// constructors & assignment
String();
String(const String& x);
String(const SubString& x);
String(const char* t);
String(const char* t, int len);
String(char c);
~String();
String& operator = (const String& y);
String& operator = (const char* y);
String& operator = (char c);
String& operator = (const SubString& y);
// concatenation
String& operator += (const String& y);
String& operator += (const SubString& y);
String& operator += (const char* t);
String& operator += (char c);
void prepend(const String& y);
void prepend(const SubString& y);
void prepend(const char* t);
void prepend(char c);
// procedural versions:
// concatenate first 2 args, store result in last arg
friend void cat(const String&, const String&, String&);
friend void cat(const String&, const SubString&, String&);
friend void cat(const String&, const char*, String&);
friend void cat(const String&, char, String&);
friend void cat(const SubString&, const String&, String&);
friend void cat(const SubString&, const SubString&, String&);
friend void cat(const SubString&, const char*, String&);
friend void cat(const SubString&, char, String&);
friend void cat(const char*, const String&, String&);
friend void cat(const char*, const SubString&, String&);
friend void cat(const char*, const char*, String&);
friend void cat(const char*, char, String&);
// double concatenation, by request. (yes, there are too many versions,
// but if one is supported, then the others should be too...)
// Concatenate first 3 args, store in last arg
friend void cat(const String&,const String&, const String&,String&);
friend void cat(const String&,const String&,const SubString&,String&);
friend void cat(const String&,const String&, const char*, String&);
friend void cat(const String&,const String&, char, String&);
friend void cat(const String&,const SubString&,const String&,String&);
friend void cat(const String&,const SubString&,const SubString&,String&);
friend void cat(const String&,const SubString&, const char*, String&);
friend void cat(const String&,const SubString&, char, String&);
friend void cat(const String&,const char*, const String&, String&);
friend void cat(const String&,const char*, const SubString&, String&);
friend void cat(const String&,const char*, const char*, String&);
friend void cat(const String&,const char*, char, String&);
friend void cat(const char*, const String&, const String&,String&);
friend void cat(const char*,const String&,const SubString&,String&);
friend void cat(const char*,const String&, const char*, String&);
friend void cat(const char*,const String&, char, String&);
friend void cat(const char*,const SubString&,const String&,String&);
friend void cat(const char*,const SubString&,const SubString&,String&);
friend void cat(const char*,const SubString&, const char*, String&);
friend void cat(const char*,const SubString&, char, String&);
friend void cat(const char*,const char*, const String&, String&);
friend void cat(const char*,const char*, const SubString&, String&);
friend void cat(const char*,const char*, const char*, String&);
friend void cat(const char*,const char*, char, String&);
// searching & matching
// return position of target in string or -1 for failure
int index(char c, int startpos = 0) const;
int index(const String& y, int startpos = 0) const;
int index(const SubString& y, int startpos = 0) const;
int index(const char* t, int startpos = 0) const;
int index(const Regex& r, int startpos = 0) const;
// return 1 if target appears anyhere