diff options
Diffstat (limited to 'src/user/lib/fwik')
-rw-r--r-- | src/user/lib/fwik/Makefile | 11 | ||||
-rw-r--r-- | src/user/lib/fwik/String.cpp | 1 | ||||
-rw-r--r-- | src/user/lib/fwik/include/IO/IOStream.h | 33 | ||||
-rw-r--r-- | src/user/lib/fwik/include/IO/Node.h | 25 | ||||
-rw-r--r-- | src/user/lib/fwik/include/IO/Term.h | 32 | ||||
-rw-r--r-- | src/user/lib/fwik/include/String.h | 5 | ||||
-rw-r--r-- | src/user/lib/fwik/include/cpp.h | 16 | ||||
-rw-r--r-- | src/user/lib/fwik/io/IOStream.cpp | 19 | ||||
-rw-r--r-- | src/user/lib/fwik/io/Node.cpp | 23 | ||||
-rw-r--r-- | src/user/lib/fwik/io/Term.cpp | 51 | ||||
-rw-r--r-- | src/user/lib/fwik/main.cpp | 30 |
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; } + + |