summaryrefslogblamecommitdiff
path: root/src/user/lib/fwik/String.cpp
blob: e3455e348b349e7e8e43d7d2440a3b52180826da (plain) (tree)
1
                   
















                                                      
                                  








                                                   
                                         




































                                                      
                                          









                                                   
                                   



                                
                                                    




                                                                               
                                                  





                                                                           
                                                   














                                                        





                                                   



                                                     
                                                     







































                                                          




                                                 
 







                                                      
#include <String.h>
#include <string.h>

String::String() {
	ptr = 0;
	len = 0;
}

String::String(const String &other) {
	len = other.len;
	if (len == 0) {
		ptr = 0;
	} else {
		ptr = (char*)malloc(len + 1);
		libc::memcpy(ptr, other.ptr, len + 1);
	}
}

String::String(const char* from) {
	len = (from == 0 ? 0 : libc::strlen(from));
	if (len == 0) {
		ptr = 0;
	} else {
		ptr = (char*)malloc(len + 1);
		libc::memcpy(ptr, from, len + 1);
	}
}

String::String(const char* from, int l) {
	len = l;
	if (len < 0) len = 0;
	if (len == 0) {
		ptr = 0;
	} else {
		ptr = (char*)malloc(len + 1);
		libc::memcpy(ptr, from, len);
		ptr[len] = 0;
	}
}

String::String(char c, int count) {
	len = count;
	if (len == 0) {
		ptr = 0;
	} else {
		ptr = (char*)malloc(len + 1);
		libc::memset(ptr, c, len);
		ptr[len] = 0;
	}
}

String::~String() {
	if (ptr != 0) free(ptr);
}

void String::operator=(const String &other) {
	if (ptr != 0) free(ptr);
	len = other.len;
	if (len == 0) {
		ptr = 0;
	} else {
		ptr = (char*)malloc(len + 1);
		libc::memcpy(ptr, other.ptr, len + 1);
	}
}

void String::operator=(const char* from) {
	if (ptr != 0) free(ptr);
	len = (from == 0 ? 0 : libc::strlen(from));
	if (len == 0) {
		ptr = 0;
	} else {
		ptr = (char*)malloc(len + 1);
		libc::memcpy(ptr, from, len + 1);
	}
}

const char* String::c_str() const {
	if (ptr == 0) return "";
	return ptr;
}

bool String::operator==(const String& other) const {
	if (len != other.len) return false;
	for (int i = 0; i < len; i++) if (ptr[i] != other.ptr[i]) return false;
	return true;
}

bool String::operator==(const char* other) const {
	if (other == 0) return (len == 0);
	if (len != libc::strlen(other)) return false;
	for (int i = 0; i < len; i++) if (ptr[i] != other[i]) return false;
	return true;
}

bool String::operator<(const String& other) const {
	for (int i = 0; i < len && i < other.len; i++) {
		if (ptr[i] > other.ptr[i]) return false;
		if (ptr[i] < other.ptr[i]) return true;
	}
	if (len < other.len) return true;
	return false;
}

static char crap;
char &String::operator[](int pos) {
	if (pos >= 0 && pos < len) return ptr[pos];
	crap = 0;
	return crap;
}

char String::operator[](int pos) const {
	if (pos >= 0 && pos < len) return ptr[pos];
	return 0;
}

String String::substr(int start, int count) const {
	if (start + count > len) count = len - start;
	return String(ptr + start, count);
}

String String::operator+(const String& other) const {
	String ret(' ', len + other.len);
	libc::memcpy(ret.ptr, ptr, len);
	libc::memcpy(ret.ptr + len, other.ptr, other.len);
	return ret;
}

void String::operator+=(const String& other) {
	if (other.len == 0) return;
	int newlen = len + other.len;
	char* newptr = (char*)malloc(newlen + 1);
	libc::memcpy(newptr, ptr, len);
	libc::memcpy(newptr+len, other.ptr, other.len);
	newptr[newlen] = 0;
	free(ptr);
	ptr = newptr;
	len = newlen;
}

void String::operator+=(char c) {
	char* newptr = (char*)malloc(len + 2);
	libc::memcpy(newptr, ptr, len);
	newptr[len] = c;
	len++;
	newptr[len] = 0;
	free(ptr);
	ptr = newptr;
}

String String::dec(int i) {
	char b[16];
	const char *e = libc::format_int(b, i);
	return String(b, e - b);
}

String String::hex(uint32_t v) {
	char b[16];
	const char *e = libc::format_hex(b, v);
	return String(b, e - b);
}

String String::sprintf(const char* format, ...) {
	va_list ap;
	va_start(ap, format);
	va_list ap2;
	va_copy(ap2, ap);

	String ret;
	ret.len = libc::printf_str_len(format, ap2);
	va_end(ap2);
	ret.ptr = (char*)malloc(ret.len + 1);
	ret.len = libc::vsprintf(ret.ptr, format, ap);
	va_end(ap);
	return ret;
}