[pure-lang-svn] SF.net SVN: pure-lang: [301] pure/trunk
Status: Beta
Brought to you by:
agraef
From: <ag...@us...> - 2008-06-24 15:58:29
|
Revision: 301 http://pure-lang.svn.sourceforge.net/pure-lang/?rev=301&view=rev Author: agraef Date: 2008-06-24 08:21:36 -0700 (Tue, 24 Jun 2008) Log Message: ----------- Bugfix: include external symbols in command completion. Modified Paths: -------------- pure/trunk/ChangeLog pure/trunk/lexer.ll pure/trunk/pure.cc Modified: pure/trunk/ChangeLog =================================================================== --- pure/trunk/ChangeLog 2008-06-24 14:53:08 UTC (rev 300) +++ pure/trunk/ChangeLog 2008-06-24 15:21:36 UTC (rev 301) @@ -1,5 +1,8 @@ 2008-06-24 Albert Graef <Dr....@t-...> + * pure.cc, lexer.ll: Bugfix: include external symbols in command + completion. + * interpreter.cc/h, runtime.cc/h, lib/strings.pure: Add error reporting to the eval() routine. Modified: pure/trunk/lexer.ll =================================================================== --- pure/trunk/lexer.ll 2008-06-24 14:53:08 UTC (rev 300) +++ pure/trunk/lexer.ll 2008-06-24 15:21:36 UTC (rev 301) @@ -141,14 +141,18 @@ { static int list_index, len; static env::iterator it, end; + static extmap::iterator xit, xend; const char *name; + assert(interpreter::g_interp); + interpreter& interp = *interpreter::g_interp; /* New match. */ if (!state) { list_index = 0; - assert(interpreter::g_interp); - it = interpreter::g_interp->globenv.begin(); - end = interpreter::g_interp->globenv.end(); + it = interp.globenv.begin(); + end = interp.globenv.end(); + xit = interp.externals.begin(); + xend = interp.externals.end(); len = strlen(text); } @@ -164,12 +168,21 @@ symbol list. */ while (it != end) { assert(it->first > 0); - symbol& sym = interpreter::g_interp->symtab.sym(it->first); + symbol& sym = interp.symtab.sym(it->first); it++; if (strncmp(sym.s.c_str(), text, len) == 0) return strdup(sym.s.c_str()); } + /* Also process the declared externals which don't have any rules yet. */ + while (xit != xend) { + assert(xit->first > 0); + symbol& sym = interp.symtab.sym(xit->first); + xit++; + if (strncmp(sym.s.c_str(), text, len) == 0) + return strdup(sym.s.c_str()); + } + /* If no names matched, then return NULL. */ return 0; } Modified: pure/trunk/pure.cc =================================================================== --- pure/trunk/pure.cc 2008-06-24 14:53:08 UTC (rev 300) +++ pure/trunk/pure.cc 2008-06-24 15:21:36 UTC (rev 301) @@ -54,19 +54,25 @@ /* Generator functions for command completion. */ +typedef map<int32_t,ExternInfo> extmap; + static char * command_generator(const char *text, int state) { static int list_index, len; static env::iterator it, end; + static extmap::iterator xit, xend; const char *name; + assert(interpreter::g_interp); + interpreter& interp = *interpreter::g_interp; /* New match. */ if (!state) { list_index = 0; - assert(interpreter::g_interp); - it = interpreter::g_interp->globenv.begin(); - end = interpreter::g_interp->globenv.end(); + it = interp.globenv.begin(); + end = interp.globenv.end(); + xit = interp.externals.begin(); + xend = interp.externals.end(); len = strlen(text); } @@ -82,12 +88,21 @@ symbol list. */ while (it != end) { assert(it->first > 0); - symbol& sym = interpreter::g_interp->symtab.sym(it->first); + symbol& sym = interp.symtab.sym(it->first); it++; if (strncmp(sym.s.c_str(), text, len) == 0) return strdup(sym.s.c_str()); } + /* Also process the declared externals which don't have any rules yet. */ + while (xit != xend) { + assert(xit->first > 0); + symbol& sym = interp.symtab.sym(xit->first); + xit++; + if (strncmp(sym.s.c_str(), text, len) == 0) + return strdup(sym.s.c_str()); + } + /* If no names matched, then return NULL. */ return 0; } @@ -97,12 +112,16 @@ { static int len; static env::iterator it, end; + static extmap::iterator xit, xend; + assert(interpreter::g_interp); + interpreter& interp = *interpreter::g_interp; /* New match. */ if (!state) { - assert(interpreter::g_interp); - it = interpreter::g_interp->globenv.begin(); - end = interpreter::g_interp->globenv.end(); + it = interp.globenv.begin(); + end = interp.globenv.end(); + xit = interp.externals.begin(); + xend = interp.externals.end(); len = strlen(text); } @@ -110,12 +129,21 @@ symbol list. */ while (it != end) { assert(it->first > 0); - symbol& sym = interpreter::g_interp->symtab.sym(it->first); + symbol& sym = interp.symtab.sym(it->first); it++; if (strncmp(sym.s.c_str(), text, len) == 0) return strdup(sym.s.c_str()); } + /* Also process the declared externals which don't have any rules yet. */ + while (xit != xend) { + assert(xit->first > 0); + symbol& sym = interp.symtab.sym(xit->first); + xit++; + if (strncmp(sym.s.c_str(), text, len) == 0) + return strdup(sym.s.c_str()); + } + /* If no names matched, then return NULL. */ return 0; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |