summaryrefslogtreecommitdiff
path: root/src/user/lib/fwik
diff options
context:
space:
mode:
Diffstat (limited to 'src/user/lib/fwik')
-rw-r--r--src/user/lib/fwik/Makefile11
-rw-r--r--src/user/lib/fwik/String.cpp1
-rw-r--r--src/user/lib/fwik/include/IO/IOStream.h33
-rw-r--r--src/user/lib/fwik/include/IO/Node.h25
-rw-r--r--src/user/lib/fwik/include/IO/Term.h32
-rw-r--r--src/user/lib/fwik/include/String.h5
-rw-r--r--src/user/lib/fwik/include/cpp.h16
-rw-r--r--src/user/lib/fwik/io/IOStream.cpp19
-rw-r--r--src/user/lib/fwik/io/Node.cpp23
-rw-r--r--src/user/lib/fwik/io/Term.cpp51
-rw-r--r--src/user/lib/fwik/main.cpp30
11 files changed, 246 insertions, 0 deletions
diff --git a/src/user/lib/fwik/Makefile b/src/user/lib/fwik/Makefile
new file mode 100644
index 0000000..cf8896a
--- /dev/null
+++ b/src/user/lib/fwik/Makefile
@@ -0,0 +1,11 @@
+Out = _fwik.o
+Obj = String.o io/Node.o io/Term.o io/IOStream.o main.o
+
+ExtObj = $(SrcPath)/user/lib/libc/_libc.o
+
+include $(SrcPath)/common.make
+
+CFLAGS += -I$(SrcPath)/include -I$(SrcPath)/user/lib/libc/include -I$(SrcPath)/user/lib/fwik/include
+
+LDFLAGS += -r
+
diff --git a/src/user/lib/fwik/String.cpp b/src/user/lib/fwik/String.cpp
new file mode 100644
index 0000000..75114c2
--- /dev/null
+++ b/src/user/lib/fwik/String.cpp
@@ -0,0 +1 @@
+#include <String.h>
diff --git a/src/user/lib/fwik/include/IO/IOStream.h b/src/user/lib/fwik/include/IO/IOStream.h
new file mode 100644
index 0000000..e9ae246
--- /dev/null
+++ b/src/user/lib/fwik/include/IO/IOStream.h
@@ -0,0 +1,33 @@
+#ifndef DEF_FWIK_IO_IOSTREAM_H
+#define DEF_FWIK_IO_IOSTREAM_H
+
+#include "Term.h"
+
+class IOStream {
+ public:
+ Term *term;
+
+ IOStream() : term(0) {}
+ IOStream(Term *t) : term(t) {}
+
+ void print(char* str);
+ void printf(char* fmt, ...);
+ char* readln();
+
+ IOStream &operator<<(char* s) {
+ print(s);
+ return *this;
+ }
+ IOStream &operator<<(int i) {
+ printf("%d", i);
+ return *this;
+ }
+ IOStream &operator<<(void* p) {
+ printf("%p", p);
+ return *this;
+ }
+};
+
+extern IOStream stdio;
+
+#endif
diff --git a/src/user/lib/fwik/include/IO/Node.h b/src/user/lib/fwik/include/IO/Node.h
new file mode 100644
index 0000000..6100fc9
--- /dev/null
+++ b/src/user/lib/fwik/include/IO/Node.h
@@ -0,0 +1,25 @@
+#ifndef DEF_FWIK_IO_NODE_H
+#define DEF_FWIK_IO_NODE_H
+
+#include <tce/syscall.h>
+#include <tce/vfs.h>
+#include <stdio.h>
+#include <cpp.h>
+
+class Term;
+class Node {
+ public:
+ FILE fd;
+ file_info info;
+ bool valid;
+
+ Node(FILE f);
+ Node(char* filename, int mode);
+ virtual ~Node() {}
+
+ void close();
+
+ virtual Term* as_term() { return 0; }
+};
+
+#endif
diff --git a/src/user/lib/fwik/include/IO/Term.h b/src/user/lib/fwik/include/IO/Term.h
new file mode 100644
index 0000000..cf90789
--- /dev/null
+++ b/src/user/lib/fwik/include/IO/Term.h
@@ -0,0 +1,32 @@
+#ifndef DEF_FWIK_IO_TERM_H
+#define DEF_FWIK_IO_TERM_H
+
+#include <stdio.h>
+#include "Node.h"
+
+#include <readline.h>
+
+class Term : public Node {
+ int w, h;
+
+ readline_history hist;
+
+ void _init();
+
+ public:
+ Term(FILE f);
+ Term(char* filename, int mode);
+ Term(const Node &n);
+ virtual ~Term();
+
+ virtual void print(char *s);
+ virtual void printf(char* fmt, ...);
+ virtual void vprintf(char* fmt, va_list ap);
+ virtual char* readln();
+ char* readline();
+
+ virtual Term* as_term() { return this; }
+};
+
+#endif
+
diff --git a/src/user/lib/fwik/include/String.h b/src/user/lib/fwik/include/String.h
new file mode 100644
index 0000000..2a44046
--- /dev/null
+++ b/src/user/lib/fwik/include/String.h
@@ -0,0 +1,5 @@
+#ifndef DEF_FWIK_STRING_H
+#define DEF_FWIK_STRING_H
+
+
+#endif
diff --git a/src/user/lib/fwik/include/cpp.h b/src/user/lib/fwik/include/cpp.h
new file mode 100644
index 0000000..5b66ba1
--- /dev/null
+++ b/src/user/lib/fwik/include/cpp.h
@@ -0,0 +1,16 @@
+#ifndef DEF_FWIK_CPPSUPPORT_H
+#define DEF_FWIK_CPPSUPPORT_H
+
+#include <stdlib.h>
+
+inline void* operator new(size_t, void* p) throw() { return p; }
+inline void* operator new[](size_t, void* p) throw() { return p; }
+inline void operator delete (void*, void*) throw() { };
+inline void operator delete[](void*, void*) throw() { };
+
+inline void* operator new (size_t size) { return malloc(size); }
+inline void* operator new[] (size_t size) { return malloc(size); }
+inline void operator delete (void* ptr) { return free(ptr); }
+inline void operator delete[] (void* ptr) { return free(ptr); }
+
+#endif
diff --git a/src/user/lib/fwik/io/IOStream.cpp b/src/user/lib/fwik/io/IOStream.cpp
new file mode 100644
index 0000000..bcaa581
--- /dev/null
+++ b/src/user/lib/fwik/io/IOStream.cpp
@@ -0,0 +1,19 @@
+#include <IO/IOStream.h>
+
+void IOStream::print(char* str) {
+ if (term == 0) return;
+ term->print(str);
+}
+
+void IOStream::printf(char* fmt, ...) {
+ if (term == 0) return;
+ va_list ap;
+ va_start(ap, fmt);
+ term->vprintf(fmt, ap);
+ va_end(ap);
+}
+
+char* IOStream::readln() {
+ if (term == 0) return 0;
+ return term->readln();
+}
diff --git a/src/user/lib/fwik/io/Node.cpp b/src/user/lib/fwik/io/Node.cpp
new file mode 100644
index 0000000..1d8b7f5
--- /dev/null
+++ b/src/user/lib/fwik/io/Node.cpp
@@ -0,0 +1,23 @@
+#include <IO/Node.h>
+
+Node::Node(FILE f) {
+ fd = f;
+ int i = libc::statf(f, &info);
+ valid = (i == 0);
+}
+
+Node::Node(char* filename, int mode) {
+ fd = libc::open(filename, mode);
+ if (fd < 0) {
+ valid = false;
+ } else {
+ int i = libc::statf(fd, &info);
+ valid = (i == 0);
+ if (!valid) libc::close(fd);
+ }
+}
+
+void Node::close() {
+ if (valid) libc::close(fd);
+ valid = false;
+}
diff --git a/src/user/lib/fwik/io/Term.cpp b/src/user/lib/fwik/io/Term.cpp
new file mode 100644
index 0000000..1c6db66
--- /dev/null
+++ b/src/user/lib/fwik/io/Term.cpp
@@ -0,0 +1,51 @@
+#include <IO/Term.h>
+
+Term::Term(const Node &n) : Node(n) {
+ _init();
+}
+
+Term::Term(FILE f) : Node(f) {
+ _init();
+}
+
+Term::Term(char* filename, int mode) : Node(filename, mode) {
+ _init();
+}
+
+void Term::_init() {
+ if (info.type & FT_TERMINAL) {
+ w = info.size >> 16;
+ h = info.size & 0xFFFF;
+ } else {
+ valid = false;
+ }
+ hist.str = 0;
+ hist.max = 12;
+}
+
+Term::~Term() {
+ //TODO : free readline history
+}
+
+void Term::print(char *s) {
+ libc::fprint(fd, s);
+}
+
+void Term::printf(char* fmt, ...) {
+ va_list ap;
+ va_start(ap, fmt);
+ libc::vfprintf(fd, fmt, ap);
+ va_end(ap);
+}
+
+void Term::vprintf(char* fmt, va_list ap) {
+ libc::vfprintf(fd, fmt, ap);
+}
+
+char* Term::readln() {
+ return libc::freadln(fd);
+}
+
+char *Term::readline() {
+ return libc::freadline(fd, &hist);
+}
diff --git a/src/user/lib/fwik/main.cpp b/src/user/lib/fwik/main.cpp
new file mode 100644
index 0000000..8e2e289
--- /dev/null
+++ b/src/user/lib/fwik/main.cpp
@@ -0,0 +1,30 @@
+#include <IO/IOStream.h>
+#include <stdio.h>
+#include <cpp.h>
+
+IOStream stdio;
+
+int Main(char **args); // FWIK app main
+
+extern "C" int main(char **args) {
+ stdio.term = 0;
+
+ Node zero(libc::term);
+ if (zero.info.type & FT_TERMINAL) {
+ stdio.term = new Term(zero);
+ }
+ Main(args);
+}
+
+
+// C++ support
+
+//Enables pure virtual functions
+extern "C" void __cxa_pure_virtual() {
+ //do nothing
+}
+//Enables global objects
+void *__dso_handle;
+extern "C" int __cxa_atexit(void (*f)(void*), void *p, void *d) { return 0; }
+
+