From 342b273234405ab76dc159d2e402bfb1ddfa1d8f Mon Sep 17 00:00:00 2001 From: Pixel Date: Mon, 3 Oct 2011 14:48:05 -0700 Subject: First commit - very basic features. --- src/BString.cc | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/Local.cc | 27 +++++++++++++++ src/Main.cc | 34 ++++++++++++++++++ src/Printer.cc | 60 ++++++++++++++++++++++++++++++++ 4 files changed, 229 insertions(+) create mode 100644 src/BString.cc create mode 100644 src/Local.cc create mode 100644 src/Main.cc create mode 100644 src/Printer.cc (limited to 'src') diff --git a/src/BString.cc b/src/BString.cc new file mode 100644 index 0000000..61abb8c --- /dev/null +++ b/src/BString.cc @@ -0,0 +1,108 @@ +#include +#include + +#include "BString.h" + +void Balau::String::set(const char * fmt, va_list ap) { + char * t; + unsigned int l; +#ifdef _WIN32 + // Microsoft is stupid. + char tt[65536]; + l = _vsnprintf(tt, sizeof(tt) - 1, fmt, ap); + tt[65535] = 0; + t = ::strdup(tt); +#else + l = vasprintf(&t, fmt, ap); +#endif + assign(t, l); + free(t); +} + +int Balau::String::strchrcnt(char c) const { + unsigned int l = length(); + int r = 0; + const char * buffer = data(); + + for (unsigned int i = 0; i < l; i++) + if (buffer[i] == c) + r++; + + return r; +} + +Balau::String & Balau::String::do_ltrim() { + unsigned int l = length(), s = 0; + const char * buffer = data(); + + for (unsigned int i = 0; i < l; i++) + if (isspace(buffer[i])) + s++; + else + break; + + erase(0, s); + + return *this; +} + +Balau::String & Balau::String::do_rtrim() { + unsigned int l = length(), p = l; + const char * buffer = data(); + + for (unsigned int i = l - 1; i >= 0; i--) + if (isspace(buffer[i])) + p--; + else + break; + + erase(p); + + return *this; +} + +Balau::String & Balau::String::do_upper() { + unsigned int l = length(); + + for (unsigned int i = 0; i < l; i++) + (*this)[i] = toupper((*this)[i]); + + return *this; +} + +Balau::String & Balau::String::do_lower() { + unsigned int l = length(); + + for (unsigned int i = 0; i < l; i++) + (*this)[i] = tolower((*this)[i]); + + return *this; +} + +Balau::String & Balau::String::do_iconv(const char * from, const char * _to) { + iconv_t cd; + const String to = String(_to) + "//TRANSLIT"; + + const char * inbuf; + char * outbuf, * t; + size_t inleft, outleft; + + if ((cd = iconv_open(to.c_str(), from)) == (iconv_t) (-1)) + return *this; + + inleft = length(); + outleft = inleft * 8; + inbuf = c_str(); + t = outbuf = (char *) malloc(outleft + 1); + memset(t, 0, outleft + 1); +#ifdef HAVE_PROPER_ICONV + ::iconv(cd, &inbuf, &inleft, &outbuf, &outleft); +#else + ::iconv(cd, const_cast(&inbuf), &inleft, &outbuf, &outleft); +#endif + + assign(t, outbuf - t); + free(t); + + return *this; +} diff --git a/src/Local.cc b/src/Local.cc new file mode 100644 index 0000000..1262179 --- /dev/null +++ b/src/Local.cc @@ -0,0 +1,27 @@ +#include "Local.h" +#include "Main.h" + +static void * dummyTLS = NULL; + +void * Balau::TLSManager::getTLS() { + return dummyTLS; +} + +void * Balau::TLSManager::setTLS(void * val) { + void * r = dummyTLS; + dummyTLS = val; + return r; +} + +static Balau::TLSManager dummyTLSManager; +Balau::TLSManager * Balau::tlsManager = &dummyTLSManager; + +int Balau::Local::s_size = 0; +void ** Balau::Local::m_globals = 0; + +void Balau::Local::doStart() { + Assert(Main::status() == Main::STARTING); + m_idx = s_size++; + m_globals = reinterpret_cast(realloc(m_globals, s_size * sizeof(void *))); + m_globals[m_idx] = 0; +} diff --git a/src/Main.cc b/src/Main.cc new file mode 100644 index 0000000..04d867f --- /dev/null +++ b/src/Main.cc @@ -0,0 +1,34 @@ +#include "Main.h" + +Balau::AtStart * Balau::AtStart::s_head = 0; +Balau::AtExit * Balau::AtExit::s_head = 0; + +Balau::AtStart::AtStart(int priority) : m_priority(priority) { + if (priority < 0) + return; + + AtStart ** ptr = &s_head; + + m_next = 0; + + for (ptr = &s_head; *ptr && (priority > (*ptr)->m_priority); ptr = &((*ptr)->m_next)); + + m_next = *ptr; + *ptr = this; +} + +Balau::AtExit::AtExit(int priority) : m_priority(priority) { + if (priority < 0) + return; + + AtExit ** ptr = &s_head; + + m_next = 0; + + for (ptr = &s_head; *ptr && (priority > (*ptr)->m_priority); ptr = &((*ptr)->m_next)); + + m_next = *ptr; + *ptr = this; +} + +Balau::Main * Balau::Main::application = NULL; diff --git a/src/Printer.cc b/src/Printer.cc new file mode 100644 index 0000000..fda9952 --- /dev/null +++ b/src/Printer.cc @@ -0,0 +1,60 @@ +#include "Printer.h" +#include "Main.h" +#include "Local.h" + +class PrinterLocal : public Balau::Local { + public: + PrinterLocal() { } + Balau::Printer * getGlobal() { return reinterpret_cast(Local::getGlobal()); } + Balau::Printer * get() { return reinterpret_cast(Local::get()); } + void setGlobal(Balau::Printer * printer) { Local::setGlobal(printer); } + void set(Balau::Printer * printer) { Local::set(printer); } +} printerLocal; + +static const char * prefixes[] = { + "(DD) ", + "(II) ", + "(--) ", + "(WW) ", + "(EE) ", + "(AA) ", +}; + +Balau::Printer::Printer() : m_verbosity(M_STATUS | M_WARNING | M_ERROR) { + if (!printerLocal.getGlobal()) + printerLocal.setGlobal(this); +} + +Balau::Printer * Balau::Printer::getPrinter() { return printerLocal.get(); } + +void Balau::Printer::_log(uint32_t level, const char * fmt, va_list ap) { + if (!(level & m_verbosity)) + return; + + int l, i; + + for (l = M_MAX, i = (sizeof(prefixes) / sizeof(*prefixes)) - 1; l; l >>= 1, i--) + if (l & level) + break; + + print(prefixes[i]); + print(fmt, ap); + print("\n"); +} + +void Balau::Printer::_print(const char * fmt, va_list ap) { + vfprintf(stderr, fmt, ap); +} + +class DefaultPrinter : public Balau::AtStart { + public: + DefaultPrinter() : AtStart(10) { } + protected: + virtual void doStart(); +}; + +static DefaultPrinter defaultPrinter; + +void DefaultPrinter::doStart() { + new Balau::Printer(); +} -- cgit v1.2.3