summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPixel <pixel@nobis-crew.org>2011-10-03 14:48:05 -0700
committerPixel <pixel@nobis-crew.org>2011-10-03 14:48:05 -0700
commit342b273234405ab76dc159d2e402bfb1ddfa1d8f (patch)
treef10d6857960313d6fc3b0aaa325ed46b8ad481fb /src
First commit - very basic features.
Diffstat (limited to 'src')
-rw-r--r--src/BString.cc108
-rw-r--r--src/Local.cc27
-rw-r--r--src/Main.cc34
-rw-r--r--src/Printer.cc60
4 files changed, 229 insertions, 0 deletions
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 <iconv.h>
+#include <ctype.h>
+
+#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<char **>(&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<void **>(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<Balau::Printer *>(Local::getGlobal()); }
+ Balau::Printer * get() { return reinterpret_cast<Balau::Printer *>(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();
+}