diff options
author | Denys Dmytriyenko <denis@denix.org> | 2009-03-17 14:32:59 -0400 |
---|---|---|
committer | Denys Dmytriyenko <denis@denix.org> | 2009-03-17 14:32:59 -0400 |
commit | 709c4d66e0b107ca606941b988bad717c0b45d9b (patch) | |
tree | 37ee08b1eb308f3b2b6426d5793545c38396b838 /packages/lua/files/advanced-readline.patch | |
parent | fa6cd5a3b993f16c27de4ff82b42684516d433ba (diff) |
rename packages/ to recipes/ per earlier agreement
See links below for more details:
http://thread.gmane.org/gmane.comp.handhelds.openembedded/21326
http://thread.gmane.org/gmane.comp.handhelds.openembedded/21816
Signed-off-by: Denys Dmytriyenko <denis@denix.org>
Acked-by: Mike Westerhof <mwester@dls.net>
Acked-by: Philip Balister <philip@balister.org>
Acked-by: Khem Raj <raj.khem@gmail.com>
Acked-by: Marcin Juszkiewicz <hrw@openembedded.org>
Acked-by: Koen Kooi <koen@openembedded.org>
Acked-by: Frans Meulenbroeks <fransmeulenbroeks@gmail.com>
Diffstat (limited to 'packages/lua/files/advanced-readline.patch')
-rw-r--r-- | packages/lua/files/advanced-readline.patch | 336 |
1 files changed, 0 insertions, 336 deletions
diff --git a/packages/lua/files/advanced-readline.patch b/packages/lua/files/advanced-readline.patch deleted file mode 100644 index 93a7da8389..0000000000 --- a/packages/lua/files/advanced-readline.patch +++ /dev/null @@ -1,336 +0,0 @@ - -# -# Patch managed by http://www.holgerschurig.de/patcher.html -# - ---- lua-5.0.2/etc/saconfig.c~advanced-readline -+++ lua-5.0.2/etc/saconfig.c -@@ -1,14 +1,14 @@ --/* sa-config.c -- configuration for stand-alone Lua interpreter -+/* saconfig.c -- configuration for stand-alone Lua interpreter - * - * #define LUA_USERCONFIG to this file - * - * Here are the features that can be customized using #define: - * --*** Line edit and history: -+*** Line editing and history: - * #define USE_READLINE to use the GNU readline library. - * - * To use another library for this, use the code below as a start. --* Make sure you #define lua_readline and lua_saveline accordingly. -+* Make sure you #define lua_{read,save,init,exit}line accordingly. - * If you do not #define lua_readline, you'll get a version based on fgets - * that uses a static buffer of size MAXINPUT. - * -@@ -41,13 +41,20 @@ - - #ifdef USE_READLINE - /* --* This section implements of lua_readline and lua_saveline for lua.c using --* the GNU readline and history libraries. It should also work with drop-in --* replacements such as editline and libedit (you may have to include --* different headers, though). -+* This section implements lua_xxxxline for lua.c using the GNU readline -+* and history libraries or compatible replacements. - * -+* It has been successfully tested with: -+* -+* GNU readline 2.2.1 (1998-07-17) -+* GNU readline 4.0 (1999-02-18) [harmless compiler warning] -+* GNU readline 4.3 (2002-07-16) -+* NETBSD libedit 2.6.5 (2002-03-25) -+* NETBSD libedit 2.6.9 (2004-05-01) - */ - -+#define lua_initline myinitline -+#define lua_exitline myexitline - #define lua_readline myreadline - #define lua_saveline mysaveline - -@@ -55,33 +62,226 @@ - #include <readline/readline.h> - #include <readline/history.h> - --static int myreadline (lua_State *L, const char *prompt) { -- char *s=readline(prompt); -- if (s==NULL) -- return 0; -- else { -- lua_pushstring(L,s); -- lua_pushliteral(L,"\n"); -- lua_concat(L,2); -- free(s); -- return 1; -- } -+/* Environment variable names for the history file and the history size */ -+#ifndef LUA_HISTORY_ENV -+#define LUA_HISTORY_ENV "LUA_HISTORY" -+#endif -+ -+#ifndef LUA_HISTSIZE_ENV -+#define LUA_HISTSIZE_ENV "LUA_HISTSIZE" -+#endif -+ -+static char *myhist; -+static int myhistsize; -+ -+static lua_State *myL; /* readline does not pass user data to callbacks */ -+ -+/* Read a line from the terminal with line editing */ -+static int myreadline(lua_State *L, const char *prompt) -+{ -+ char *s; -+ if (!(s = readline(prompt))) return 0; -+ lua_pushstring(L, s); -+ lua_pushliteral(L, "\n"); -+ lua_concat(L, 2); -+ free(s); -+ return 1; - } - --static void mysaveline (lua_State *L, const char *s) { -+/* Add a line to the history */ -+static void mysaveline(lua_State *L, const char *s) -+{ - const char *p; -- for (p=s; isspace(*p); p++) -- ; -- if (*p!=0) { -- size_t n=strlen(s)-1; -- if (s[n]!='\n') -+ for (p = s; isspace(*p); p++) ; -+ if (*p) { -+ size_t n = strlen(s)-1; -+ if (s[n] != '\n') { - add_history(s); -- else { -- lua_pushlstring(L,s,n); -- s=lua_tostring(L,-1); -+ } else { -+ lua_pushlstring(L, s, n); -+ s = lua_tostring(L, -1); - add_history(s); -- lua_remove(L,-1); -+ lua_pop(L, 1); -+ } -+ } -+} -+ -+/* Reserved lua keywords */ -+static const char * const reskeywords[] = { -+ "and", "break", "do", "else", "elseif", "end", "false", -+ "for", "function", "if", "in", "local", "nil", "not", "or", -+ "repeat", "return", "then", "true", "until", "while", NULL -+}; -+ -+static int valididentifier(const char *s) -+{ -+ if (!(isalpha(*s) || *s == '_')) return 0; -+ for (s++; *s; s++) if (!(isalpha(*s) || isdigit(*s) || *s == '_')) return 0; -+ return 1; -+} -+ -+/* Dynamically resizable match list */ -+typedef struct { -+ char **list; -+ size_t idx, allocated, matchlen; -+} dmlist; -+ -+/* Add prefix + string + suffix to list and compute common prefix */ -+static int dmadd(dmlist *ml, const char *p, size_t pn, const char *s, int suf) -+{ -+ char *t = NULL; -+ -+ if (ml->idx+1 >= ml->allocated && -+ !(ml->list = realloc(ml->list, sizeof(char *)*(ml->allocated += 32)))) -+ return -1; -+ -+ if (s) { -+ size_t n = strlen(s); -+ if (!(t = (char *)malloc(sizeof(char)*(pn+n+(suf?2:1))))) return 1; -+ memcpy(t, p, pn); -+ memcpy(t+pn, s, n); -+ n += pn; -+ t[n] = suf; -+ if (suf) t[++n] = '\0'; -+ -+ if (ml->idx == 0) { -+ ml->matchlen = n; -+ } else { -+ size_t i; -+ for (i = 0; i < ml->matchlen && i < n && ml->list[1][i] == t[i]; i++) ; -+ ml->matchlen = i; /* Set matchlen to common prefix */ -+ } -+ } -+ -+ ml->list[++ml->idx] = t; -+ return 0; -+} -+ -+/* Get __index field of metatable of object on top of stack */ -+static int getmetaindex(lua_State *L) -+{ -+ if (!lua_getmetatable(L, -1)) { lua_pop(L, 1); return 0; } -+ lua_pushstring(L, "__index"); -+ lua_rawget(L, -2); -+ lua_replace(L, -2); -+ if (lua_isnil(L, -1) || lua_rawequal(L, -1, -2)) { lua_pop(L, 2); return 0; } -+ lua_replace(L, -2); -+ return 1; -+} /* 1: obj -- val, 0: obj -- */ -+ -+/* Get field from object on top of stack. Avoid calling metamethods */ -+static int safegetfield(lua_State *L, const char *s, size_t n) -+{ -+ int i = 20; /* Avoid infinite metatable loops */ -+ do { -+ if (lua_istable(L, -1)) { -+ lua_pushlstring(L, s, n); -+ lua_rawget(L, -2); -+ if (!lua_isnil(L, -1)) { lua_replace(L, -2); return 1; } -+ lua_pop(L, 1); -+ } -+ } while (--i > 0 && getmetaindex(L)); -+ lua_pop(L, 1); -+ return 0; -+} /* 1: obj -- val, 0: obj -- */ -+ -+/* Completion function */ -+static char **mycomplete(const char *text, int start, int end) -+{ -+ dmlist ml; -+ const char *s; -+ size_t i, n, dot; -+ int savetop; -+ -+ if (!(text[0] == '\0' || isalpha(text[0]) || text[0] == '_')) return NULL; -+ -+ ml.list = NULL; -+ ml.idx = ml.allocated = ml.matchlen = 0; -+ -+ savetop = lua_gettop(myL); -+ lua_pushvalue(myL, LUA_GLOBALSINDEX); -+ for (n = (size_t)(end-start), i = dot = 0; i < n; i++) -+ if (text[i] == '.' || text[i] == ':') { -+ if (!safegetfield(myL, text+dot, i-dot)) goto error; /* invalid prefix */ -+ dot = i+1; /* points to first char after dot/colon */ -+ } -+ -+ /* Add all matches against keywords if there is no dot/colon */ -+ if (dot == 0) -+ for (i = 0; (s = reskeywords[i]) != NULL; i++) -+ if (!strncmp(s, text, n) && dmadd(&ml, NULL, 0, s, ' ')) goto error; -+ -+ /* Add all valid matches from all tables/metatables */ -+ i = 20; /* Avoid infinite metatable loops */ -+ do { -+ if (lua_istable(myL, -1)) -+ for (lua_pushnil(myL); lua_next(myL, -2); lua_pop(myL, 1)) -+ if (lua_type(myL, -2) == LUA_TSTRING) { -+ s = lua_tostring(myL, -2); -+ /* Only match names starting with '_' if explicitly requested */ -+ if (!strncmp(s, text+dot, n-dot) && valididentifier(s) && -+ (*s != '_' || text[dot] == '_')) { -+ int suf = ' '; /* default suffix is a space */ -+ switch (lua_type(myL, -1)) { -+ case LUA_TTABLE: suf = '.'; break; /* No way to guess ':' */ -+ case LUA_TFUNCTION: suf = '('; break; -+ case LUA_TUSERDATA: -+ if (lua_getmetatable(myL, -1)) { lua_pop(myL, 1); suf = ':'; } -+ break; -+ } -+ if (dmadd(&ml, text, dot, s, suf)) goto error; -+ } -+ } -+ } while (--i > 0 && getmetaindex(myL)); -+ -+ if (ml.idx > 1) { -+ /* list[0] holds the common prefix of all matches (may be "") */ -+ if (!(ml.list[0] = (char *)malloc(sizeof(char)*(ml.matchlen+1)))) { -+error: -+ lua_settop(myL, savetop); -+ return NULL; - } -+ memcpy(ml.list[0], ml.list[1], ml.matchlen); -+ ml.list[0][ml.matchlen] = '\0'; -+ /* Add the NULL list terminator */ -+ if (dmadd(&ml, NULL, 0, NULL, 0)) goto error; -+ } else if (ml.idx == 1) { -+ ml.list[0] = ml.list[1]; /* Only return common prefix */ -+ ml.list[1] = NULL; - } -+ -+ lua_settop(myL, savetop); -+ return ml.list; -+} -+ -+/* Initialize library */ -+static void myinitline(lua_State *L, char *pname) -+{ -+ char *s; -+ -+ myL = L; -+ -+ /* This allows for $if lua ... $endif in ~/.inputrc */ -+ rl_readline_name = pname; -+ /* Break words at every non-identifier character except '.' and ':' */ -+ rl_completer_word_break_characters = -+ "\t\r\n !\"#$%&'()*+,-/;<=>?@[\\]^`{|}~"; -+ rl_completer_quote_characters = "\"'"; -+ rl_completion_append_character = '\0'; -+ rl_attempted_completion_function = mycomplete; -+ rl_initialize(); -+ -+ /* Start using history, optionally set history size and load history file */ -+ using_history(); -+ if ((s = getenv(LUA_HISTSIZE_ENV)) && -+ (myhistsize = atoi(s))) stifle_history(myhistsize); -+ if ((myhist = getenv(LUA_HISTORY_ENV))) read_history(myhist); -+} -+ -+/* Finalize library */ -+static void myexitline(lua_State *L) -+{ -+ /* Optionally save history file */ -+ if (myhist) write_history(myhist); - } - #endif ---- lua-5.0.2/src/lua/lua.c~advanced-readline -+++ lua-5.0.2/src/lua/lua.c -@@ -265,6 +265,19 @@ - - - /* -+** these macros can be used to perform initialization and finalization -+** for lua_saveline and lua_readline -+*/ -+#ifndef lua_initline -+#define lua_initline(L,pname) /* empty */ -+#endif -+ -+#ifndef lua_exitline -+#define lua_exitline(L) /* empty */ -+#endif -+ -+ -+/* - ** this macro can be used by some `history' system to save lines - ** read in manual input - */ -@@ -352,6 +365,7 @@ - const char *oldprogname = progname; - progname = NULL; - do_path(); -+ lua_initline(L, PROGNAME); /* progname may contain a path, so use PROGNAME */ - while ((status = load_string()) != -1) { - if (status == 0) status = lcall(0, 0); - report(status); -@@ -365,6 +379,7 @@ - } - lua_settop(L, 0); /* clear stack */ - fputs("\n", stdout); -+ lua_exitline(L); - progname = oldprogname; - } - |