winamp/Src/Wasabi/bfc/string/bigstring.cpp

96 lines
1.7 KiB
C++

#include "precomp_wasabi_bfc.h"
#include "bigstring.h"
BigString::BigString() {
mem = NULL;
m_linecount = 0;
}
BigString::~BigString() {
if (mem != NULL) {
FREE(mem);
}
strings.deleteAll();
}
const char *BigString::getValue() /*const*/ {
if (mem != NULL) return mem;
size_t l = 0;
foreach(strings)
l += strings.getfor()->len();
endfor;
mem = (char *)MALLOC(l+1);
char *p = mem;
String *s = NULL;
size_t sl = 0;
foreach(strings)
s = strings.getfor();
sl = s->len();
if (sl > 0) MEMCPY((void *)p, (void *)s->getValue(), sl);
p += sl;
endfor;
*p = 0;
return mem;
}
void BigString::setValue(const char *val) {
if (mem != NULL) {
FREE(mem);
mem = NULL;
}
strings.deleteAll();
cat(val);
}
int BigString::isempty() {
if (strings.getNumItems() == 0) return 1;
foreach(strings)
if (!strings.getfor()->isempty()) return 0;
endfor;
return 1;
}
void BigString::reset() {
if (mem != NULL) {
FREE(mem);
mem = NULL;
}
strings.deleteAll();
m_linecount = 0;
}
void BigString::catn(const char *s, int n) {
String *str = new String();
str->catn(s, n);
cat(str->getValue());
}
void BigString::cat(const char *s) {
if (mem != NULL) {
FREE(mem);
mem = NULL;
}
char *p = (char *)s;
while (p && *p) {
if (*p == '\r' || *p == '\n') {
if (*(p+1) == '\n' && *p == '\r') p++;
m_linecount++;
}
p++;
}
strings.addItem(new String(s));
}
char BigString::lastChar() {
return strings.getLast()->lastChar();
}
char BigString::firstChar() {
const char *s = strings.getFirst()->getValue();
return s ? *s : 0;
}
int BigString::getLineCount() {
return m_linecount;
}