From 06ff671f00676086e61aae774a91d669028800bb Mon Sep 17 00:00:00 2001 From: "Mike D. Lowis" Date: Fri, 5 Jun 2015 10:41:25 -0400 Subject: [PATCH] Initialized the build environment --- .gitmodules | 3 + Gemfile | 4 + Gemfile.lock | 29 ++++++ build.rb | 4 + modules/build-system | 1 + source/libc.h | 212 +++++++++++++++++++++++++++++++++++++++++++ source/main.c | 24 +++++ 7 files changed, 277 insertions(+) create mode 100644 .gitmodules create mode 100644 Gemfile create mode 100644 Gemfile.lock create mode 100755 build.rb create mode 160000 modules/build-system create mode 100644 source/libc.h create mode 100644 source/main.c diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..3806bc3 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "modules/build-system"] + path = modules/build-system + url = https://github.com/mikedlowis/build-system.git diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..894906d --- /dev/null +++ b/Gemfile @@ -0,0 +1,4 @@ +source 'https://rubygems.org' +gem 'rake', '>= 0' +gem 'rscons', '>= 0' +gem 'rspec', '>= 0' diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..88f9e23 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,29 @@ +GEM + remote: https://rubygems.org/ + specs: + diff-lcs (1.2.5) + json (1.8.2) + rake (10.4.2) + rscons (1.9.0) + json (~> 1.0) + rspec (3.2.0) + rspec-core (~> 3.2.0) + rspec-expectations (~> 3.2.0) + rspec-mocks (~> 3.2.0) + rspec-core (3.2.2) + rspec-support (~> 3.2.0) + rspec-expectations (3.2.0) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.2.0) + rspec-mocks (3.2.1) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.2.0) + rspec-support (3.2.2) + +PLATFORMS + ruby + +DEPENDENCIES + rake + rscons + rspec diff --git a/build.rb b/build.rb new file mode 100755 index 0000000..b0a131d --- /dev/null +++ b/build.rb @@ -0,0 +1,4 @@ +#!/usr/bin/env ruby + +require './modules/build-system/setup' + diff --git a/modules/build-system b/modules/build-system new file mode 160000 index 0000000..f1a522b --- /dev/null +++ b/modules/build-system @@ -0,0 +1 @@ +Subproject commit f1a522b4aed7c58ce3c8467ff8a00f00c3e27e64 diff --git a/source/libc.h b/source/libc.h new file mode 100644 index 0000000..353df8f --- /dev/null +++ b/source/libc.h @@ -0,0 +1,212 @@ +/** + @file libc.h +*/ +#ifndef LIBC_H +#define LIBC_H + +/* + * Base Types and Definitions + */ +#include +#include +#include +#include +#include +#include +#include + +#ifndef nil +#define nil NULL +#endif + +#ifndef nelem +#define nelem(x) (sizeof(x)/sizeof((x)[0])) +#endif + +/* + * Assertions + */ +#include + +#ifndef static_assert + #ifdef NDEBUG + #define static_assert(expr) ((void)0) + #else + #define static_assert(expr) switch(0){case 0:case (expr):;} + #endif +#endif + +/* + * Setjmp Routines + */ +#include + +/* + * Signal Routines + */ +#include + +/* + * Memory and String Routines + */ +#include + +/* + * Rune Definitions and Routines + */ +#define UTFmax 4 /*< Maximum number of bytes per rune */ +#define Runesync 0x80 /*< Upper bound of a UTF sequence */ +#define Runeself 0x80 /*< Upper bound of a rune sequence */ +#define Runeerror 0xFFFD /*< Decoding error */ +#define Runemax 0x10FFFF /*< Maximum rune value */ +#define Runemask 0x1FFFFF /*< All bits used by a rune */ + +/* +typedef uint32_t Rune; + +int runetochar(char*, Rune*); +int chartorune(Rune*, char*); +int runelen(long); +int runenlen(Rune*, int); +int fullrune(char*, int); +int utflen(char*); +int utfnlen(char*, long); +char* utfrune(char*, long); +char* utfrrune(char*, long); +char* utfutf(char*, char*); +char* utfecpy(char*, char*, char*); + +Rune* runestrcat(Rune*, Rune*); +Rune* runestrchr(Rune*, Rune); +int runestrcmp(Rune*, Rune*); +Rune* runestrcpy(Rune*, Rune*); +Rune* runestrncpy(Rune*, Rune*, long); +Rune* runestrecpy(Rune*, Rune*, Rune*); +Rune* runestrdup(Rune*); +Rune* runestrncat(Rune*, Rune*, long); +int runestrncmp(Rune*, Rune*, long); +Rune* runestrrchr(Rune*, Rune); +long runestrlen(Rune*); +Rune* runestrstr(Rune*, Rune*); + +Rune tolowerrune(Rune); +Rune totitlerune(Rune); +Rune toupperrune(Rune); +Rune tobaserune(Rune); +int isalpharune(Rune); +int isbaserune(Rune); +int isdigitrune(Rune); +int islowerrune(Rune); +int isspacerune(Rune); +int istitlerune(Rune); +int isupperrune(Rune); +*/ + +/* + * I/O Routines + */ +#include + +#define Bsize 8*1024 +#define Bungetsize 4 /* space for ungetc */ +#define Bmagic 0x314159 +#define Beof -1 +#define Bbad -2 +//#define Binactive 0 /* states */ +//#define Bractive, +//#define Bwactive, +//#define Bracteof, +//#define Bend + +//enum { +// Bsize = 8*1024, +// Bungetsize = 4, /* space for ungetc */ +// Bmagic = 0x314159, +// Beof = -1, +// Bbad = -2, +// +// Binactive = 0, /* states */ +// Bractive, +// Bwactive, +// Bracteof, +// +// Bend +//}; + +typedef struct Biobuf { + int icount; /* neg num of bytes at eob */ + int ocount; /* num of bytes at bob */ + int rdline; /* num of bytes after rdline */ + int runesize; /* num of bytes of last getrune */ + int state; /* r/w/inactive */ + int fid; /* open file */ + int flag; /* magic if malloc'ed */ + long long offset; /* offset of buffer in file */ + int bsize; /* size of buffer */ + unsigned char* bbuf; /* pointer to beginning of buffer */ + unsigned char* ebuf; /* pointer to end of buffer */ + unsigned char* gbuf; /* pointer to good data in buf */ + unsigned char b[Bungetsize+Bsize]; +} Biobuf; + +/* +#define BGETC(bp)\ + ((bp)->icount?(bp)->bbuf[(bp)->bsize+(bp)->icount++]:Bgetc((bp))) + +#define BPUTC(bp,c)\ + ((bp)->ocount?(bp)->bbuf[(bp)->bsize+(bp)->ocount++]=(c),0:Bputc((bp),(c))) + +#define BOFFSET(bp)\ + (((bp)->state==Bractive)?\ + (bp)->offset + (bp)->icount:\ + (((bp)->state==Bwactive)?\ + (bp)->offset + ((bp)->bsize + (bp)->ocount):\ + -1)) + +#define BLINELEN(bp)\ + (bp)->rdline + +#define BFILDES(bp)\ + (bp)->fid + +int Bbuffered(Biobuf*); +Biobuf* Bfdopen(int, int); +int Bfildes(Biobuf*); +int Bflush(Biobuf*); +int Bgetc(Biobuf*); +int Bgetd(Biobuf*, double*); +long Bgetrune(Biobuf*); +int Binit(Biobuf*, int, int); +int Binits(Biobuf*, int, int, unsigned char*, int); +int Blinelen(Biobuf*); +long long Boffset(Biobuf*); +Biobuf* Bopen(char*, int); +int Bprint(Biobuf*, char*, ...); +int Bputc(Biobuf*, int); +int Bputrune(Biobuf*, long); +void* Brdline(Biobuf*, int); +char* Brdstr(Biobuf*, int, int); +long Bread(Biobuf*, void*, long); +long long Bseek(Biobuf*, long long, int); +int Bterm(Biobuf*); +int Bungetc(Biobuf*); +int Bungetrune(Biobuf*); +long Bwrite(Biobuf*, void*, long); +int Bvprint(Biobuf*, char*, va_list); +*/ + +/* + * New Features + */ +extern char* errstr; +void exits(char*); + +/* + * Make sure we use the built-in main which calls user_main + */ +#ifndef NO_MAIN_WRAPPER + #define main user_main + extern void user_main(int, char**); +#endif + +#endif /* LIBC_H */ diff --git a/source/main.c b/source/main.c new file mode 100644 index 0000000..1930b05 --- /dev/null +++ b/source/main.c @@ -0,0 +1,24 @@ +#define NO_MAIN_WRAPPER +#include "libc.h" + +char* errstr = nil; + +static int exitcode(void) +{ + return errstr ? 1 : errno; +} + +void exits(char* estr) +{ + if (estr) + errstr = estr; + exit(exitcode()); +} + +int main(int argc, char** argv) +{ + user_main(argc, argv); + exits(errstr); + return -1; +} + -- 2.54.0