#ifndef __OUC_STRING_H__
#define __OUC_STRING_H__
/******************************************************************************/
/* */
/* X r d O u c S t r i n g . h h */
/* */
/* (c) 2005 F. Furano (INFN Padova), G. Ganis (CERN) */
/* */
/* This file is part of the XRootD software suite. */
/* */
/* XRootD is free software: you can redistribute it and/or modify it under */
/* the terms of the GNU Lesser General Public License as published by the */
/* Free Software Foundation, either version 3 of the License, or (at your */
/* option) any later version. */
/* */
/* XRootD 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 Lesser General Public */
/* License for more details. */
/* */
/* You should have received a copy of the GNU Lesser General Public License */
/* along with XRootD in a file called COPYING.LESSER (LGPL license) and file */
/* COPYING (GPL license). If not, see . */
/* */
/* The copyright holder's institutional names and contributor's names may not */
/* be used to endorse or promote products derived from this software without */
/* specific prior written permission of the institution or contributor. */
/* All Rights Reserved. See XrdInfo.cc for complete License Terms */
/******************************************************************************/
/******************************************************************************/
/* */
/* Light string manipulation class */
/* */
/* This class has three private members: a buffer (char *) and two integers, */
/* indicating the effective length of the null-terminated string (len), and */
/* the buffer capacity (siz), i.e. the allocated size. The capacity is set */
/* at construction either at the value needed by the initializing string or */
/* to the value requested by the user; by default the capacity is never */
/* decreased during manipulations (it is increased if required by the */
/* operation). The capacity can be changed at any time by calling resize(). */
/* The user can choose a granularity other than 1 to increase the capacity */
/* by calling XrdOucString::setblksize(nbs) with nbs > 1: this will make */
/* new allocations to happen in blocks multiple of nbs bytes. */
/* */
/* 1. Constructors */
/* */
/* XrdOucString(int lmx = 0) */
/* - create an empty string; set capacity to lmx+1 if lmx > 0 */
/* XrdOucString(const char *s, int lmx = 0) */
/* - create a string containing s; capacity is set to strlen(s)+1 or */
/* to lmx+1 if lmx > 0; in the latter case truncation may occur. */
/* XrdOucString(const char c, int lmx = 0) */
/* - create a string char c; capacity is set to 2 or to lmx+1 if lmx > 0.*/
/* XrdOucString(const XrdOucString &s) */
/* - create string copying from XrdOucString s . */
/* XrdOucString(const XrdOucString &s, int j, int k = -1, int lmx = 0) */
/* - create string copying a portion of XrdOucString s; portion is */
/* defined by j to k inclusive; if k == -1 the portion copied will be */
/* from j to end-of-string; if j or k are inconsistent they are taken */
/* as 0 or len-1, respectively; capacity is set to k-j bytes or to */
/* to lmx+1 if lmx > 0; in the latter case truncation of the portion */
/* may occur. */
/* */
/* 2. Access to information */
/* */
/* const char *c_str() const */
/* - return pointer to stored string */
/* int length() const */
/* - return length stored string */
/* int capacity() const */
/* - return capacity of the allocated buffer */
/* */
/* char &operator[](int j) */
/* - array-like operator returning char at position j; abort is invoked */
/* if j is not in the correct range */
/* */
/* int find(const char c, int start = 0, bool forward = 1); */
/* - find first occurence of char c starting from position start in */
/* forward (forward == 1, default) or backward (forward == 0) */
/* direction; returns STR_NPOS if nothing is found */
/* int find(const char *s, int start = 0) */
/* - find first occurence of string s starting from position start in */
/* forward direction; returns STR_NPOS if nothing is found */
/* int find(XrdOucString s, int start = 0) */
/* - find first occurence of XrdOucString s starting from position start */
/* in forward direction; returns STR_NPOS if nothing is found */
/* */
/* int rfind(const char c, int start = STR_NPOS) */
/* - find first occurence of char c starting from position start in */
/* backward direction; returns STR_NPOS if nothing is found. */
/* int rfind(const char *s, int start = STR_NPOS) */
/* - find first occurence of string s starting from position start in */
/* backward direction; returns STR_NPOS if nothing is found; */
/* if start == STR_NPOS search starts from position len-strlen(s) */
/* int rfind(XrdOucString s, int start = STR_NPOS) */
/* - find first occurence of XrdOucString s starting from position start */
/* in backward direction; returns STR_NPOS if nothing is found; */
/* if start == STR_NPOS search starts from position len-s.lenght() */
/* */
/* bool beginswith(char c) */
/* - returns 1 if the stored string starts with char c */
/* bool beginswith(const char *s) */
/* - returns 1 if the stored string starts with string s */
/* bool beginswith(XrdOucString s) */
/* - returns 1 if the stored string starts with XrdOucString s */
/* */
/* bool endswith(char c) */
/* - returns 1 if the stored string ends with char c */
/* bool endswith(const char *s) */
/* - returns 1 if the stored string ends with string s */
/* bool endswith(XrdOucString s) */
/* - returns 1 if the stored string ends with XrdOucString s */
/* */
/* int matches(const char *s, char wch = '*') */
/* - check if stored string is compatible with s allowing for wild char */
/* wch (default: '*'); return the number of matching characters. */
/* */
/* 3. Modifiers */
/* */
/* void resize(int lmx = 0) */
/* - resize buffer capacity to lmx+1 bytes; if lmx <= 0, free the buffer.*/
/* */
/* void append(const int i) */
/* - append to stored string the string representation of integer i, */
/* e.g. if string is initially "x*", after append(5) it will be "x*5". */
/* void append(const char c) */
/* - append char c to stored string, e.g. if string is initially "pop", */
/* after append('_') it will be "pop_". */
/* void append(const char *s) */
/* - append string s to stored string, e.g. if string is initially "pop",*/
/* after append("star") it will be "popstar". */
/* void append(const XrdOucString s) */
/* - append s.c_str() to stored string, e.g. if string is initially */
/* "anti", after append("star") it will be "antistar". */
/* */
/* void assign(const char *s, int j, int k = -1) */
/* - copy to allocated buffer a portion of string s; portion is defined */
/* by j to k inclusive; if k == -1 the portion copied will be from j */
/* to end-of-string; if j or k are inconsistent they are taken as 0 or */
/* len-1, respectively; if necessary, capacity is increased to k-j */
/* bytes. */
/* void assign(const XrdOucString s, int j, int k = -1) */
/* - copy to allocated buffer a portion of s.c_str(); portion is defined */
/* by j to k inclusive; if k == -1 the portion copied will be from j */
/* to end-of-string; if j or k are inconsistent they are taken as 0 or */
/* len-1, respectively; if necessary, capacity is increased to k-j */
/* bytes. */
/* */
/* int keep(int start = 0, int size = 0) */
/* - drop chars outside the range of size bytes starting at start */
/* */
/* void insert(const int i, int start = -1) */
/* - insert the string representation of integer i at position start of */
/* the stored string, e.g. if string is initially "*x", after */
/* insert(5,0) it will be "5*x"; default action is append. */
/* void insert(const char c, int start = -1) */
/* - insert the char c at position start of the stored string, e.g. */
/* if string is initially "pok", after insert('_',0) it will be "_poc";*/
/* default action is append. */
/* void insert(const char *s, int start = -1, int lmx = 0) */
/* - insert string s at position start of the stored string, e.g. */
/* if string is initially "forth", after insert("backand",0) it will be*/
/* "backandforth"; default action is append. */
/* void insert(const XrdOucString s, int start = -1) */
/* - insert string s.c_str() at position start of the stored string. */
/* */
/* int replace(const char *s1, const char *s2, */
/* int from = 0, int to = -1); */
/* - replace all occurrencies of string s1 with string s2 in the region */
/* from position 'from' to position 'to' inclusive; the method is */
/* optimized to minimize the memory movements; with s2 == 0 or "" */
/* removes all instances of s1 in the specified region. */
/* int replace(const XrdOucString s1, const char *s2, */
/* int from = 0, int to = -1); */
/* int replace(const char *s1, const XrdOucString s2, */
/* int from = 0, int to = -1); */
/* int replace(const XrdOucString s1, const XrdOucString s2, */
/* int from = 0, int to = -1); */
/* - interfaces to replace(const char *, const char *, int, int) */
/* */
/* int erase(int start = 0, int size = 0) */
/* - erase size bytes starting at start */
/* int erase(const char *s, int from = 0, int to = -1) */
/* - erase occurences of string s within position 'from' and position */
/* 'to' (inclusive), e.g if stored string is "aabbccefccddgg", then */
/* erase("cc",0,9) will result in string "aabbefccddgg". */
/* int erase(XrdOucString s, int from = 0, int to = -1) */
/* - erase occurences of s.c_str() within position 'from' and position */
/* 'to' (inclusive). */
/* int erasefromstart(int sz = 0) */
/* - erase sz bytes from the start. */
/* int erasefromend(int sz = 0) */
/* - erase sz bytes from the end. */
/* */
/* void lower(int pos, int size = 0) */
/* - set to lower case size bytes from position start. */
/* void upper(int pos, int size = 0) */
/* - set to upper case size bytes from position start. */
/* */
/* void hardreset() */
/* - memset to 0 the len meaningful bytes of the buffer. */
/* */
/* int tokenize(XrdOucString &tok, int from, char del) */
/* - search for tokens delimited by 'del' (def ':') in string s; search */
/* starts from 'from' and the token is returned in 'tok'. */
/* */
/* 4. Assignement operators */
/* XrdOucString &operator=(const int i) */
/* XrdOucString &operator=(const char c) */
/* XrdOucString &operator=(const char *s) */
/* XrdOucString &operator=(const XrdOucString s) */
/* */
/* 5. Addition operators */
/* XrdOucString &operator+(const int i) */
/* XrdOucString &operator+(const char c) */
/* XrdOucString &operator+(const char *s) */
/* XrdOucString &operator+(const XrdOucString s) */
/* XrdOucString &operator+=(const int i) */
/* XrdOucString &operator+=(const char c) */
/* XrdOucString &operator+=(const char *s) */
/* XrdOucString &operator+=(const XrdOucString s) */
/* XrdOucString const operator+(const char *s1, const XrdOucString s2) */
/* XrdOucString const operator+(const char c, const XrdOucString s) */
/* XrdOucString const operator+(const int i, const XrdOucString s) */
/* */
/* 6. Equality operators */
/* int operator==(const int i) */
/* int operator==(const char c) */
/* int operator==(const char *s) */
/* int operator==(const XrdOucString s) */
/* */
/* 7. Inequality operators */
/* int operator!=(const int i) */
/* int operator!=(const char c) */
/* int operator!=(const char *s) */
/* int operator!=(const XrdOucString s) */
/* */
/* 8. Static methods to change / monitor the blksize */
/* static int getblksize(); */
/* static void setblksize(const int bs); */
/* */
/******************************************************************************/
#include "XrdSys/XrdSysHeaders.hh"
#include
#include
#include
using namespace std;
#define STR_NPOS -1
class XrdOucString {
private:
char *str;
int len;
int siz;
// Mininal block size to be used in (re-)allocations
// Option switched off by default; use XrdOucString::setblksize()
// and XrdOucString::getblksize() to change / monitor
static int blksize;
// Private methods
int adjust(int ls, int &j, int &k, int nmx = 0);
char *bufalloc(int nsz);
inline void init() { str = 0; len = 0; siz = 0; }
public:
XrdOucString(int lmx = 0) { init(); if (lmx > 0) str = bufalloc(lmx+1); }
XrdOucString(const char *s, int lmx = 0);
XrdOucString(const char c, int lmx = 0);
XrdOucString(const XrdOucString &s);
XrdOucString(const XrdOucString &s, int j, int k = -1, int lmx = 0);
virtual ~XrdOucString();
// Info access
const char *c_str() const { return (const char *)str; }
int length() const { return len; }
int capacity() const { return siz; }
char &operator[](int j);
int find(const char c, int start = 0, bool forward = 1);
int find(const char *s, int start = 0);
int find(XrdOucString s, int start = 0);
int rfind(const char c, int start = STR_NPOS)
{ return find(c, start, 0); }
int rfind(const char *s, int start = STR_NPOS);
int rfind(XrdOucString s, int start = STR_NPOS);
bool beginswith(char c) { return (find(c) == 0); }
bool beginswith(const char *s) { return (find(s) == 0); }
bool beginswith(XrdOucString s) { return (find(s) == 0); }
bool endswith(char c);
bool endswith(const char *s);
bool endswith(XrdOucString s) { return (endswith(s.c_str())); }
int matches(const char *s, char wch = '*');
// Tokenizer
int tokenize(XrdOucString &tok, int from, char del = ':');
// Modifiers
void resize(int lmx = 0) { int ns = (lmx > 0) ? lmx + 1 : 0;
str = bufalloc(ns); }
void append(const int i);
void append(const char c);
void append(const char *s);
void append(const XrdOucString s);
void assign(const char *s, int j, int k = -1);
void assign(const XrdOucString s, int j, int k = -1);
#if !defined(WINDOWS)
int form(const char *fmt, ...);
#endif
int keep(int start = 0, int size = 0);
void insert(const int i, int start = -1);
void insert(const char c, int start = -1);
void insert(const char *s, int start = -1, int lmx = 0);
void insert(const XrdOucString s, int start = -1);
int replace(const char *s1, const char *s2,
int from = 0, int to = -1);
int replace(const XrdOucString s1, const XrdOucString s2,
int from = 0, int to = -1);
int replace(const XrdOucString s1, const char *s2,
int from = 0, int to = -1);
int replace(const char *s1, const XrdOucString s2,
int from = 0, int to = -1);
int erase(int start = 0, int size = 0);
int erase(const char *s, int from = 0, int to = -1);
int erase(XrdOucString s, int from = 0, int to = -1);
int erasefromstart(int sz = 0) { return erase(0,sz); }
int erasefromend(int sz = 0) { return erase(len-sz,sz); }
void lower(int pos, int size = 0);
void upper(int pos, int size = 0);
void reset(const char c, int j = 0, int k = -1);
void hardreset();
void setbuffer(char *buf);
// Assignement operators
XrdOucString &operator=(const int i);
XrdOucString &operator=(const char c);
XrdOucString &operator=(const char *s);
XrdOucString &operator=(const XrdOucString s);
// Add operators
friend XrdOucString operator+(const XrdOucString &s1, const int i);
friend XrdOucString operator+(const XrdOucString &s1, const char c);
friend XrdOucString operator+(const XrdOucString &s1, const char *s);
friend XrdOucString operator+(const XrdOucString &s1, const XrdOucString &s);
XrdOucString &operator+=(const int i);
XrdOucString &operator+=(const char c);
XrdOucString &operator+=(const char *s);
XrdOucString &operator+=(const XrdOucString s);
// Equality operators
int operator==(const int i);
int operator==(const char c);
int operator==(const char *s);
int operator==(const XrdOucString s);
// Inequality operators
int operator!=(const int i) { return !(*this == i); }
int operator!=(const char c) { return !(*this == c); }
int operator!=(const char *s) { return !(*this == s); }
int operator!=(const XrdOucString s) { return !(*this == s); }
// Miscellanea
bool isdigit(int from = 0, int to = -1);
long atoi(int from = 0, int to = -1);
// Static methods to change / monitor the default blksize
static int getblksize();
static void setblksize(const int bs);
#if !defined(WINDOWS)
// format a string
static int form(XrdOucString &str, const char *fmt, ...);
#endif
};
// Operator << is useful to print a string into a stream
ostream &operator<< (ostream &, const XrdOucString s);
XrdOucString const operator+(const char *s1, const XrdOucString s2);
XrdOucString const operator+(const char c, const XrdOucString s);
XrdOucString const operator+(const int i, const XrdOucString s);
#endif