📄 string.cc
字号:
}
else
{
delete(rep);
rep = nrep;
}
return nmatches;
}
/*
* deletion
*/
void String::del(int pos, int len)
{
if (pos < 0 || len <= 0 || (unsigned)(pos + len) > length()) return;
int nlen = length() - len;
int first = pos + len;
ncopy0(&(rep->s[first]), &(rep->s[pos]), length() - first);
rep->len = nlen;
}
void String::del(const Regex& r, int startpos)
{
int mlen;
int first = r.search(chars(), length(), mlen, startpos);
del(first, mlen);
}
void String::del(const char* t, int startpos)
{
int tlen = slen(t);
int p = search(startpos, length(), t, tlen);
del(p, tlen);
}
void String::del(const String& y, int startpos)
{
del(search(startpos, length(), y.chars(), y.length()), y.length());
}
void String::del(const SubString& y, int startpos)
{
del(search(startpos, length(), y.chars(), y.length()), y.length());
}
void String::del(char c, int startpos)
{
del(search(startpos, length(), c), 1);
}
/*
* substring extraction
*/
SubString String::at(int first, int len)
{
return _substr(first, len);
}
SubString String::operator() (int first, int len)
{
return _substr(first, len);
}
SubString String::before(int pos)
{
return _substr(0, pos);
}
SubString String::through(int pos)
{
return _substr(0, pos+1);
}
SubString String::after(int pos)
{
return _substr(pos + 1, length() - (pos + 1));
}
SubString String::from(int pos)
{
return _substr(pos, length() - pos);
}
SubString String::at(const String& y, int startpos)
{
int first = search(startpos, length(), y.chars(), y.length());
return _substr(first, y.length());
}
SubString String::at(const SubString& y, int startpos)
{
int first = search(startpos, length(), y.chars(), y.length());
return _substr(first, y.length());
}
SubString String::at(const Regex& r, int startpos)
{
int mlen;
int first = r.search(chars(), length(), mlen, startpos);
return _substr(first, mlen);
}
SubString String::at(const char* t, int startpos)
{
int tlen = slen(t);
int first = search(startpos, length(), t, tlen);
return _substr(first, tlen);
}
SubString String::at(char c, int startpos)
{
int first = search(startpos, length(), c);
return _substr(first, 1);
}
SubString String::before(const String& y, int startpos)
{
int last = search(startpos, length(), y.chars(), y.length());
return _substr(0, last);
}
SubString String::before(const SubString& y, int startpos)
{
int last = search(startpos, length(), y.chars(), y.length());
return _substr(0, last);
}
SubString String::before(const Regex& r, int startpos)
{
int mlen;
int first = r.search(chars(), length(), mlen, startpos);
return _substr(0, first);
}
SubString String::before(char c, int startpos)
{
int last = search(startpos, length(), c);
return _substr(0, last);
}
SubString String::before(const char* t, int startpos)
{
int tlen = slen(t);
int last = search(startpos, length(), t, tlen);
return _substr(0, last);
}
SubString String::through(const String& y, int startpos)
{
int last = search(startpos, length(), y.chars(), y.length());
if (last >= 0) last += y.length();
return _substr(0, last);
}
SubString String::through(const SubString& y, int startpos)
{
int last = search(startpos, length(), y.chars(), y.length());
if (last >= 0) last += y.length();
return _substr(0, last);
}
SubString String::through(const Regex& r, int startpos)
{
int mlen;
int first = r.search(chars(), length(), mlen, startpos);
if (first >= 0) first += mlen;
return _substr(0, first);
}
SubString String::through(char c, int startpos)
{
int last = search(startpos, length(), c);
if (last >= 0) last += 1;
return _substr(0, last);
}
SubString String::through(const char* t, int startpos)
{
int tlen = slen(t);
int last = search(startpos, length(), t, tlen);
if (last >= 0) last += tlen;
return _substr(0, last);
}
SubString String::after(const String& y, int startpos)
{
int first = search(startpos, length(), y.chars(), y.length());
if (first >= 0) first += y.length();
return _substr(first, length() - first);
}
SubString String::after(const SubString& y, int startpos)
{
int first = search(startpos, length(), y.chars(), y.length());
if (first >= 0) first += y.length();
return _substr(first, length() - first);
}
SubString String::after(char c, int startpos)
{
int first = search(startpos, length(), c);
if (first >= 0) first += 1;
return _substr(first, length() - first);
}
SubString String::after(const Regex& r, int startpos)
{
int mlen;
int first = r.search(chars(), length(), mlen, startpos);
if (first >= 0) first += mlen;
return _substr(first, length() - first);
}
SubString String::after(const char* t, int startpos)
{
int tlen = slen(t);
int first = search(startpos, length(), t, tlen);
if (first >= 0) first += tlen;
return _substr(first, length() - first);
}
SubString String::from(const String& y, int startpos)
{
int first = search(startpos, length(), y.chars(), y.length());
return _substr(first, length() - first);
}
SubString String::from(const SubString& y, int startpos)
{
int first = search(startpos, length(), y.chars(), y.length());
return _substr(first, length() - first);
}
SubString String::from(const Regex& r, int startpos)
{
int mlen;
int first = r.search(chars(), length(), mlen, startpos);
return _substr(first, length() - first);
}
SubString String::from(char c, int startpos)
{
int first = search(startpos, length(), c);
return _substr(first, length() - first);
}
SubString String::from(const char* t, int startpos)
{
int tlen = slen(t);
int first = search(startpos, length(), t, tlen);
return _substr(first, length() - first);
}
/*
* split/join
*/
int split(const String& src, String results[], int n, const String& sep)
{
String x = src;
const char* s = x.chars();
int sl = x.length();
int i = 0;
int pos = 0;
while (i < n && pos < sl)
{
int p = x.search(pos, sl, sep.chars(), sep.length());
if (p < 0)
p = sl;
results[i].rep = Salloc(results[i].rep, &(s[pos]), p - pos, p - pos);
i++;
pos = p + sep.length();
}
return i;
}
int split(const String& src, String results[], int n, const Regex& r)
{
String x = src;
const char* s = x.chars();
int sl = x.length();
int i = 0;
int pos = 0;
int p, matchlen;
while (i < n && pos < sl)
{
p = r.search(s, sl, matchlen, pos);
if (p < 0)
p = sl;
results[i].rep = Salloc(results[i].rep, &(s[pos]), p - pos, p - pos);
i++;
pos = p + matchlen;
}
return i;
}
#if defined(__GNUG__) && !defined(_G_NO_NRV)
String join(String src[], int n, const String& separator) return x;
{
String sep = separator;
int xlen = 0;
for (int i = 0; i < n; ++i)
xlen += src[i].length();
xlen += (n - 1) * sep.length();
x.alloc(xlen);
int j = 0;
for (i = 0; i < n - 1; ++i)
{
ncopy(src[i].chars(), &(x.rep->s[j]), src[i].length());
j += src[i].length();
ncopy(sep.chars(), &(x.rep->s[j]), sep.length());
j += sep.length();
}
ncopy0(src[i].chars(), &(x.rep->s[j]), src[i].length());
}
#else
String join(String src[], int n, const String& separator)
{
String x;
String sep = separator;
int xlen = 0;
for (int i = 0; i < n; ++i)
xlen += src[i].length();
xlen += (n - 1) * sep.length();
x.alloc(xlen);
int j = 0;
for (i = 0; i < n - 1; ++i)
{
ncopy(src[i].chars(), &(x.rep->s[j]), src[i].length());
j += src[i].length();
ncopy(sep.chars(), &(x.rep->s[j]), sep.length());
j += sep.length();
}
ncopy0(src[i].chars(), &(x.rep->s[j]), src[i].length());
return x;
}
#endif
/*
misc
*/
StrRep* Sreverse(const StrRep* src, StrRep* dest)
{
int n = src->len;
if (src != dest)
dest = Salloc(dest, src->s, n, n);
if (n > 0)
{
char* a = dest->s;
char* b = &(a[n - 1]);
while (a < b)
{
char t = *a;
*a++ = *b;
*b-- = t;
}
}
return dest;
}
StrRep* Supcase(const StrRep* src, StrRep* dest)
{
int n = src->len;
if (src != dest) dest = Salloc(dest, src->s, n, n);
char* p = dest->s;
char* e = &(p[n]);
for (; p < e; ++p) if (islower(*p)) *p = toupper(*p);
return dest;
}
StrRep* Sdowncase(const StrRep* src, StrRep* dest)
{
int n = src->len;
if (src != dest) dest = Salloc(dest, src->s, n, n);
char* p = dest->s;
char* e = &(p[n]);
for (; p < e; ++p) if (isupper(*p)) *p = tolower(*p);
return dest;
}
StrRep* Scapitalize(const StrRep* src, StrRep* dest)
{
int n = src->len;
if (src != dest) dest = Salloc(dest, src->s, n, n);
char* p = dest->s;
char* e = &(p[n]);
for (; p < e; ++p)
{
int at_word;
if (at_word = islower(*p))
*p = toupper(*p);
else
at_word = isupper(*p) || isdigit(*p);
if (at_word)
{
while (++p < e)
{
if (isupper(*p))
*p = tolower(*p);
/* A '\'' does not break a word, so that "Nathan's" stays
"Nathan's" rather than turning into "Nathan'S". */
else if (!islower(*p) && !isdigit(*p) && (*p != '\''))
break;
}
}
}
return dest;
}
#if defined(__GNUG__) && !defined(_G_NO_NRV)
String replicate(char c, int n) return w;
{
w.rep = Sresize(w.rep, n);
char* p = w.rep->s;
while (n-- > 0) *p++ = c;
*p = 0;
}
String replicate(const String& y, int n) return w
{
int len = y.length();
w.rep = Sresize(w.rep, n * len);
char* p = w.rep->s;
while (n-- > 0)
{
ncopy(y.chars(), p, len);
p += len;
}
*p = 0;
}
String common_prefix(const String& x, const String& y, int startpos) return r;
{
const char* xchars = x.chars();
const char* ychars = y.chars();
const char* xs = &(xchars[startpos]);
const char* ss = xs;
const char* topx = &(xchars[x.length()]);
const char* ys = &(ychars[startpos]);
const char* topy = &(ychars[y.length()]);
for (int l = 0; xs < topx && ys < topy && *xs++ == *ys++; ++l);
r.rep = Salloc(r.rep, ss, l, l);
}
String common_suffix(const String& x, const String& y, int startpos) return r;
{
const char* xchars = x.chars();
const char* ychars = y.chars();
const char* xs = &(xchars[x.length() + startpos]);
const char* botx = xchars;
const char* ys = &(ychars[y.length() + startpos]);
const char* boty = ychars;
for (int l = 0; xs >= botx && ys >= boty && *xs == *ys ; --xs, --ys, ++l);
r.rep = Salloc(r.rep, ++xs, l, l);
}
#else
String replicate(char c, int n)
{
String w;
w.rep = Sresize(w.rep, n);
char* p = w.rep->s;
while (n-- > 0) *p++ = c;
*p = 0;
return w;
}
String replicate(const String& y, int n)
{
String w;
int len = y.length();
w.rep = Sresize(w.rep, n * len);
char* p = w.rep->s;
while (n-- > 0)
{
ncopy(y.chars(), p, len);
p += len;
}
*p = 0;
return w;
}
String common_prefix(const String& x, const String& y, int startpos)
{
String r;
const char* xchars = x.chars();
const char* ychars = y.chars();
const char* xs = &(xchars[startpos]);
const char* ss = xs;
const char* topx = &(xchars[x.length()]);
const char* ys = &(ychars[startpos]);
const char* topy = &(ychars[y.length()]);
for (int l = 0; xs < topx && ys < topy && *xs++ == *ys++; ++l);
r.rep = Salloc(r.rep, ss, l, l);
return r;
}
String common_suffix(const String& x, const String& y, int startpos)
{
String r;
const char* xchars = x.chars();
const char* ychars = y.chars();
const char* xs = &(xchars[x.length() + startpos]);
const char* botx = xchars;
const char* ys = &(ychars[y.length() + startpos]);
const char* boty = ychars;
for (int l = 0; xs >= botx && ys >= boty && *xs == *ys ; --xs, --ys, ++l);
r.rep = Salloc(r.rep, ++xs, l, l);
return r;
}
#endif
// IO
istream& operator>>(istream& s, String& x)
{
if (!s.ipfx(0) || (!(s.flags() & ios::skipws) && !ws(s)))
{
s.clear(ios::failbit|s.rdstate()); // Redundant if using GNU iostreams.
return s;
}
int ch;
int i = 0;
x.rep = Sresize(x.rep, 20);
register streambuf *sb = s.rdbuf();
while ((ch = sb->sbumpc()) != EOF)
{
if (isspace(ch))
break;
if (i >= x.rep->sz - 1)
x.rep = Sresize(x.rep, i+1);
x.rep->s[i++] = ch;
}
x.rep->s[i] = 0;
x.rep->len = i;
int new_state = s.rdstate();
if (i == 0) new_state |= ios::failbit;
if (ch == EOF) new_state |= ios::eofbit;
s.clear(new_state);
return s;
}
int readline(istream& s, String& x, char terminator, int discard)
{
if (!s.ipfx(0))
return 0;
int ch;
int i = 0;
x.rep = Sresize(x.rep, 80);
register streambuf *sb = s.rdbuf();
while ((ch = sb->sbumpc()) != EOF)
{
if (ch != terminator || !discard)
{
if (i >= x.rep->sz - 1)
x.rep = Sresize(x.rep, i+1);
x.rep->s[i++] = ch;
}
if (ch == terminator)
break;
}
x.rep->s[i] = 0;
x.rep->len = i;
if (ch == EOF) s.clear(ios::eofbit|s.rdstate());
return i;
}
ostream& operator<<(ostream& s, const SubString& x)
{
const char* a = x.chars();
const char* lasta = &(a[x.length()]);
while (a < lasta)
s.put(*a++);
return(s);
}
// from John.Willis@FAS.RI.CMU.EDU
int String::freq(const SubString& y) const
{
int found = 0;
for (unsigned int i = 0; i < length(); i++)
if (match(i,length(),0,y.chars(), y.length())>= 0) found++;
return(found);
}
int String::freq(const String& y) const
{
int found = 0;
for (unsigned int i = 0; i < length(); i++)
if (match(i,length(),0,y.chars(),y.length()) >= 0) found++;
return(found);
}
int String::freq(const char* t) const
{
int found = 0;
for (unsigned int i = 0; i < length(); i++)
if (match(i,length(),0,t) >= 0) found++;
return(found);
}
int String::freq(char c) const
{
int found = 0;
for (unsigned int i = 0; i < length(); i++)
if (match(i,length(),0,&c,1) >= 0) found++;
return(found);
}
int String::OK() const
{
if (rep == 0 // don't have a rep
|| rep->len > rep->sz // string oustide bounds
|| rep->s[rep->len] != 0) // not null-terminated
error("invariant failure");
return 1;
}
int SubString::OK() const
{
int v = S != (const char*)0; // have a String;
v &= S.OK(); // that is legal
v &= pos + len >= S.rep->len;// pos and len within bounds
if (!v) S.error("SubString invariant failure");
return v;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -