Author: tewk
Date: Fri Dec 5 04:39:55 2008
New Revision: 33506
Added:
trunk/compilers/ncigen/k.h
trunk/compilers/ncigen/kk.h
Modified:
trunk/compilers/ncigen/sqlite_interface_generator.pl
Log:
[ncigen] SQLite autogenerated stubs
Added: trunk/compilers/ncigen/k.h
==============================================================================
--- (empty file)
+++ trunk/compilers/ncigen/k.h Fri Dec 5 04:39:55 2008
@@ -0,0 +1,47 @@
+extern const char sqlite3_version[];
+const char *sqlite3_libversion(void);
+int sqlite3_libversion_number(void);
+int sqlite3_threadsafe(void);
+typedef struct sqlite3 sqlite3;
+typedef long long int sqlite_int64;
+typedef unsigned long long int sqlite_uint64;
+typedef sqlite_int64 sqlite3_int64;
+typedef sqlite_uint64 sqlite3_uint64;
+int sqlite3_close(sqlite3 *);
+typedef int (*sqlite3_callback)(void*,int,char**, char**);
+int sqlite3_exec( sqlite3*, const char *sql, int
(*callback)(void*,int,char**,char**), void *, char **errmsg);
+typedef struct sqlite3_mutex sqlite3_mutex;
+int sqlite3_extended_result_codes(sqlite3*, int onoff);
+sqlite3_int64 sqlite3_last_insert_rowid(sqlite3*);
+int sqlite3_changes(sqlite3*);
+int sqlite3_total_changes(sqlite3*);
+void sqlite3_interrupt(sqlite3*);
+int sqlite3_complete(const char *sql);
+int sqlite3_complete16(const void *sql);
+int sqlite3_busy_handler(sqlite3*, int(*)(void*,int), void*);
+int sqlite3_busy_timeout(sqlite3*, int ms);
+int sqlite3_get_table( sqlite3*, const char *sql, char ***pResult, int *nrow,
int *ncolumn, char **errmsg);
+void sqlite3_free_table(char **result);
+char *sqlite3_vmprintf(const char*, va_list);
+void *sqlite3_malloc(int);
+void *sqlite3_realloc(void*, int);
+void sqlite3_free(void*);
+sqlite3_int64 sqlite3_memory_used(void);
+sqlite3_int64 sqlite3_memory_highwater(int resetFlag);
+void sqlite3_randomness(int N, void *P);
+int sqlite3_set_authorizer( sqlite3*, int (*xAuth)(void*,int,const char*,const
char*,const char*,const char*), void *pUserData);
+void *sqlite3_trace(sqlite3*, void(*xTrace)(void*,const char*), void*);
+void *sqlite3_profile(sqlite3*, void(*xProfile)(void*,const
char*,sqlite3_uint64), void*);
+void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*);
+int sqlite3_open( const char *filename, sqlite3 **ppDb);
+int sqlite3_open16( const void *filename, sqlite3 **ppDb);
+int sqlite3_open_v2( const char *filename, sqlite3 **ppDb, int flags, const
char *zVfs);
+int sqlite3_errcode(sqlite3 *db);
+const char *sqlite3_errmsg(sqlite3*);
+const void *sqlite3_errmsg16(sqlite3*);
+typedef struct sqlite3_stmt sqlite3_stmt;
+int sqlite3_limit(sqlite3*, int id, int newVal);
+int sqlite3_prepare( sqlite3 *db, const char *zSql, int nByte, sqlite3_stmt
**ppStmt, const char **pzTail);
+int sqlite3_prepare_v2( sqlite3 *db, const char *zSql, int nByte, sqlite3_stmt
**ppStmt, const char **pzTail);
+int sqlite3_prepare16( sqlite3 *db, const void *zSql, int nByte, sqlite3_stmt
**ppStmt, const void **pzTail);
+int sqlite3_prepare16_v2( sqlite3 *db, const void *zSql, int nByte,
sqlite3_stmt **ppStmt, const void **pzTail);
Added: trunk/compilers/ncigen/kk.h
==============================================================================
--- (empty file)
+++ trunk/compilers/ncigen/kk.h Fri Dec 5 04:39:55 2008
@@ -0,0 +1,2 @@
+int a(int a, int b);
+int b(int a, int b);
Modified: trunk/compilers/ncigen/sqlite_interface_generator.pl
==============================================================================
--- trunk/compilers/ncigen/sqlite_interface_generator.pl (original)
+++ trunk/compilers/ncigen/sqlite_interface_generator.pl Fri Dec 5
04:39:55 2008
@@ -13,10 +13,17 @@
run("gcc -x c -E $fn > $pp_fn");
my $compiler = compreg('NCIGEN');
my $ast = $compiler.parse(slurp($pp_fn));
-say +$ast;
-for $ast.item() -> $x {
+
+my $b = $ast.item();
+
+for ($ast.item().kv) -> $k,$v {
say "====================================================";
- say $x;
+ say $k;
+ say $v.perl;
+ for ($v.list) -> $x {
+ say $x.perl;
+ }
+ say pir($v);
}
sub compreg {
@@ -29,3 +36,109 @@
$prefix ~ nonce;
}
+sub gen_preamble($nsname, $libname) {
+ my $fmt = ".namespace [$nsname]\n";
+ $fmt ~= ".sub __load_lib_dlfunc_init__ :anon :init :load\n";
+
+ if $libname {
+ $fmt ~= "loadlib \$P1, '$libname'\nif \$P1 goto has_lib\n";
+ }
+ else {
+ $fmt ~= "\$P1 = null\ngoto has_lib\n";
+ }
+
+ $fmt ~= "\$P2 = new 'Exception'";
+ $fmt ~= "\$P2[0] = 'error loading $libname - loadlib failed'";
+ $fmt ~= "throw \$P2";
+ $fmt ~= "has_lib:";
+
+ return $fmt;
+}
+
+multi sub pir($node) {
+ return pir_children($node);
+}
+multi sub pir(NCIGENAST::TypeDef $node) { return ""; }
+multi sub pir(NCIGENAST::VarDecl $node) { return ""; }
+multi sub pir(NCIGENAST::FuncDecl $node) {
+ ## get list of arguments to operation
+ my $arglist = $node.list();
+
+ my $type = param_to_code($node, 1);
+
+ for @($arglist) -> $x {
+ $type ~= param_to_code($x);
+ }
+
+ my $name = $node.name();
+ my $fmt = "dlfunc \$P2, \$P1, '$name', '$type'\nstore_global '$name',
\$P2";
+
+ return $fmt;
+}
+
+sub param_to_code($node, $returncode) {
+ my $I0 = $node.'pointer'();
+ my $I2 = $node.'pointer_cnt'();
+ my $pt = $node.'primitive_type'();
+
+ if ($node.pointer()) {
+ if ($pt ~~ 'void' ) {
+ if ($returncode) { return ""; }
+ else { return "v"; }
+ }
+ elsif ($pt ~~ 'int') { return "i"; }
+ elsif ($pt ~~ 'long') { return "l"; }
+ elsif ($pt ~~ 'char') { return "c"; }
+ elsif ($pt ~~ 'short') { return "s"; }
+ else { return "p"; }
+ }
+ else {
+ if ($node.pointer_cnt() > 1 ) {
+ return "V";
+ }
+ if ($pt ~~ 'void' ) {
+ if ($returncode) { return "p"; } #probably should be "V"
+ else { return "p"; }
+ }
+ elsif ($pt ~~ 'int') { return "V"; }
+ elsif ($pt ~~ 'long') { return "V"; }
+ elsif ($pt ~~ 'char') { return "t"; }
+ elsif ($pt ~~ 'short') { return "V"; }
+ else {
+ say "ERROR";
+ say $pt;
+ say "what is this";
+ return "p"; }
+ }
+}
+
+sub to_pir($ast, $adverbs) {
+# .param pmc ast
+# .param pmc adverbs :slurpy :named
+
+ my $code = "";
+ my $raw = $adverbs['raw'];
+ unless ($raw) {
+ $code = gen_preamble($adverbs);
+ }
+
+ ## now generate the pir
+ $code = pir(ast);
+
+ return $code;
+}
+
+sub pir_children($node) {
+ my $code = "";
+ for ($node.kv) -> $k, $v {
+ $code ~= pir($v);
+ }
+ return $code;
+}
+
+# Local Variables:
+# mode: pir
+# fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4 ft=perl6:
+