SquidString.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 1996-2023 The Squid Software Foundation and contributors
3 *
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
7 */
8
9/* DEBUG: section 67 String */
10
11#ifndef SQUID_STRING_H
12#define SQUID_STRING_H
13
14#include "base/TextException.h"
15#include "debug/Stream.h"
16
17#include <ostream>
18
19/* squid string placeholder (for printf) */
20#ifndef SQUIDSTRINGPH
21#define SQUIDSTRINGPH "%.*s"
22#define SQUIDSTRINGPRINT(s) (s).psize(),(s).rawBuf()
23#endif /* SQUIDSTRINGPH */
24
25class String
26{
27
28public:
29 String() = default;
30 String(char const *);
31 String(String const &);
32 String(String && S) : size_(S.size_), len_(S.len_), buf_(S.buf_) {
33 S.buf_ = nullptr; // S is about to be destructed
34 S.size_ = S.len_ = 0;
35 }
36 ~String();
37
38 typedef size_t size_type; //storage size intentionally unspecified
39 const static size_type npos = static_cast<size_type>(-1);
40
41 String &operator =(char const *);
42 String &operator =(String const &);
44 if (this != &S) {
45 clean();
46 size_ = S.size_;
47 len_ = S.len_;
48 buf_ = S.buf_;
49 S.size_ = 0;
50 S.len_ = 0;
51 S.buf_ = nullptr; // S is about to be destructed
52 }
53 return *this;
54 }
55
56 bool operator ==(String const &) const;
57 bool operator !=(String const &) const;
58
63 char operator [](unsigned int aPos) const {
64 assert(aPos < size_);
65 return buf_[aPos];
66 }
67
71 static size_type SizeMaxXXX() { return SizeMax_; }
72
73 size_type size() const { return len_; }
74
77 int psize() const {
78 Must(size() < INT_MAX);
79 return size();
80 }
81
86 char const * rawBuf() const { return buf_; }
87
92 char const * termedBuf() const { return buf_; }
93
94 void assign(const char *str, int len);
95 void clean();
96 void reset(char const *str);
97 void append(char const *buf, int len);
98 void append(char const *buf);
99 void append(char const);
100 void append(String const &);
101 void absorb(String &old);
102 const char * pos(char const *aString) const;
103 const char * pos(char const ch) const;
106 size_type find(char const ch) const;
107 size_type find(char const *aString) const;
108 const char * rpos(char const ch) const;
109 size_type rfind(char const ch) const;
110 int cmp(char const *) const;
111 int cmp(char const *, size_type count) const;
112 int cmp(String const &) const;
113 int caseCmp(char const *) const;
114 int caseCmp(char const *, size_type count) const;
115 int caseCmp(String const &str) const {
116 return caseCmp(str.rawBuf(),str.size());
117 }
118
122 static bool CanGrowTo(size_type totalLen, const size_type extras = 0) { return SafeAdd(totalLen, extras) && SafeAdd(totalLen, 1); }
124 bool canGrowBy(const size_type growthLen) const { return CanGrowTo(size(), growthLen); }
125
126 String substr(size_type from, size_type to) const;
127
128 void cut(size_type newLength);
129
130private:
131 void allocAndFill(const char *str, int len);
132 void allocBuffer(size_type sz);
133 void setBuffer(char *buf, size_type sz);
134
135 bool defined() const {return buf_!=nullptr;}
136 bool undefined() const {return !defined();}
137
138 /* never reference these directly! */
139 size_type size_ = 0; /* buffer size; limited by SizeMax_ */
140
141 size_type len_ = 0; /* current length */
142
143 static const size_type SizeMax_ = 65535;
145 static bool SafeAdd(size_type &base, size_type extra) { if (extra <= SizeMax_ && base <= SizeMax_ - extra) { base += extra; return true; } return false; }
146
147 char *buf_ = nullptr;
148
149 void set(char const *loc, char const ch) {
150 if (loc < buf_ || loc > (buf_ + size_))
151 return;
152 buf_[loc-buf_] = ch;
153 }
154
155 void cutPointer(char const *loc) {
156 if (loc < buf_ || loc > (buf_ + size_))
157 return;
158 len_ = loc-buf_;
159 buf_[len_] = '\0';
160 }
161};
162
163inline std::ostream & operator<<(std::ostream &os, String const &aString)
164{
165 os.write(aString.rawBuf(),aString.size());
166 return os;
167}
168
169inline bool operator<(const String &a, const String &b)
170{
171 return a.cmp(b) < 0;
172}
173
174const char *checkNullString(const char *p);
175int stringHasWhitespace(const char *);
176int stringHasCntl(const char *);
177char *strwordtok(char *buf, char **t);
178
179#endif /* SQUID_STRING_H */
180
int stringHasWhitespace(const char *)
Definition: String.cc:287
std::ostream & operator<<(std::ostream &os, String const &aString)
Definition: SquidString.h:163
bool operator<(const String &a, const String &b)
Definition: SquidString.h:169
int stringHasCntl(const char *)
Definition: String.cc:294
char * strwordtok(char *buf, char **t)
Definition: String.cc:314
const char * checkNullString(const char *p)
Definition: String.cc:399
#define Must(condition)
Definition: TextException.h:75
#define assert(EX)
Definition: assert.h:17
bool canGrowBy(const size_type growthLen) const
whether appending growthLen characters is safe (i.e., unlikely to assert)
Definition: SquidString.h:124
int psize() const
Definition: SquidString.h:77
int cmp(char const *) const
Definition: String.cc:236
bool undefined() const
Definition: SquidString.h:136
size_type size_
Definition: SquidString.h:139
String(String &&S)
Definition: SquidString.h:32
static size_type SizeMaxXXX()
Definition: SquidString.h:71
String substr(size_type from, size_type to) const
Definition: String.cc:190
void absorb(String &old)
Definition: String.cc:179
size_t size_type
Definition: SquidString.h:38
size_type len_
Definition: SquidString.h:141
void setBuffer(char *buf, size_type sz)
Definition: String.cc:28
size_type find(char const ch) const
Definition: String.cc:429
static const size_type npos
Definition: SquidString.h:39
void clean()
Definition: String.cc:103
void assign(const char *str, int len)
Definition: String.cc:78
const char * pos(char const *aString) const
Definition: String.cc:405
bool operator==(String const &) const
Definition: String.cc:59
size_type rfind(char const ch) const
Definition: String.cc:449
char const * rawBuf() const
Definition: SquidString.h:86
void allocAndFill(const char *str, int len)
Definition: String.cc:87
char * buf_
Definition: SquidString.h:147
void allocBuffer(size_type sz)
Definition: String.cc:18
void cut(size_type newLength)
Definition: String.cc:203
int caseCmp(String const &str) const
Definition: SquidString.h:115
String()=default
char const * termedBuf() const
Definition: SquidString.h:92
void append(char const *buf, int len)
Definition: String.cc:130
char operator[](unsigned int aPos) const
Definition: SquidString.h:63
~String()
Definition: String.cc:116
static bool SafeAdd(size_type &base, size_type extra)
returns true after increasing the first argument by extra if the sum does not exceed SizeMax_
Definition: SquidString.h:145
bool defined() const
Definition: SquidString.h:135
int caseCmp(char const *) const
Definition: String.cc:266
static bool CanGrowTo(size_type totalLen, const size_type extras=0)
Definition: SquidString.h:122
void cutPointer(char const *loc)
Definition: SquidString.h:155
void reset(char const *str)
Definition: String.cc:122
static const size_type SizeMax_
Definition: SquidString.h:143
String & operator=(char const *)
Definition: String.cc:43
const char * rpos(char const ch) const
Definition: String.cc:421
void set(char const *loc, char const ch)
Definition: SquidString.h:149
bool operator!=(String const &) const
Definition: String.cc:68
size_type size() const
Definition: SquidString.h:73
#define INT_MAX
Definition: types.h:70

 

Introduction

Documentation

Support

Miscellaneous

Web Site Translations

Mirrors