diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | Src/Modules/curses.c | 204 | ||||
-rw-r--r-- | Src/Modules/curses.mdd | 2 |
3 files changed, 116 insertions, 95 deletions
diff --git a/ChangeLog b/ChangeLog index 8510bfd3d..504810543 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2007-10-08 Clint Adams <clint@zsh.org> + + * 23919: Src/Modules/curses.c, Src/Modules/curses.mdd: + have new zcurses builtin replace 4 separate builtins. + 2007-10-08 Peter Stephenson <pws@csr.com> * arno: 23910: Completion/Unix/Command/_init_d: handle diff --git a/Src/Modules/curses.c b/Src/Modules/curses.c index 638e54ec4..2c2022ec1 100644 --- a/Src/Modules/curses.c +++ b/Src/Modules/curses.c @@ -37,116 +37,137 @@ #include "curses.mdh" #include "curses.pro" -static char *nam="curses"; - #define ZCURSES_MAX_WINDOWS 9 static WINDOW *zcurses_WIN[ZCURSES_MAX_WINDOWS + 1]; -/**/ -static int -bin_zcurses_newwin(char *nam, char **args, Options ops, UNUSED(int func)) -{ - int nlines, ncols, begin_y, begin_x; - unsigned winnum; - - nlines = atoi(args[0]); - ncols = atoi(args[1]); - begin_y = atoi(args[2]); - begin_x = atoi(args[3]); - winnum = atoi(args[4]); - - if(winnum > ZCURSES_MAX_WINDOWS) { - zerrnam(nam, "bad window number: %s", args[4], 0); - return 1; - } +#define ZCURSES_ERANGE 1 +#define ZCURSES_EDEFINED 2 +#define ZCURSES_EUNDEFINED 3 - if(zcurses_WIN[winnum]!=NULL) { - zwarnnam(nam, "window number %s already defined", args[4], 0); - return 1; - } +#define ZCURSES_UNUSED 1 +#define ZCURSES_USED 2 - zcurses_WIN[winnum]=newwin(nlines, ncols, begin_y, begin_x); +static int zc_errno; - if(zcurses_WIN[winnum]==NULL) - return 1; +/**/ +static const char * +zcurses_strerror(int err) +{ + static const char *errs[] = { + NULL, + "window number out of range", + "window already defined", + NULL }; - return 0; + return errs[err]; } /**/ -static int -bin_zcurses_delwin(char *nam, char **args, Options ops, UNUSED(int func)) +static unsigned +zcurses_validate_window(char *win, int criteria) { - unsigned winnum; + unsigned target; - winnum = atoi(args[0]); + if (win==NULL) { + zc_errno = ZCURSES_ERANGE; + return -1; + } - if(winnum > ZCURSES_MAX_WINDOWS) { - zerrnam(nam, "bad window number: %s", args[0], 0); - return 1; + target = (unsigned)atoi(win); + + if (target > ZCURSES_MAX_WINDOWS) { + zc_errno = ZCURSES_ERANGE; + return -1; } - if(zcurses_WIN[winnum]==NULL) { - zwarnnam(nam, "window number %s does not exist", args[0], 0); - return 1; + if(zcurses_WIN[target]!=NULL && (criteria & ZCURSES_UNUSED)) { + zc_errno = ZCURSES_EDEFINED; + return -1; } - if(delwin(zcurses_WIN[winnum])!=OK) - return 1; + if(zcurses_WIN[target]==NULL && (criteria & ZCURSES_USED)) { + zc_errno = ZCURSES_EUNDEFINED; + return -1; + } - zcurses_WIN[winnum]=NULL; - return 0; + return target; } /**/ static int -bin_zcurses_wrefresh(char *nam, char **args, Options ops, UNUSED(int func)) +bin_zcurses(char *nam, char **args, Options ops, UNUSED(int func)) { - unsigned winnum; + int targetwin; - winnum = atoi(args[0]); + if (OPT_ISSET(ops,'a')) { + int nlines, ncols, begin_y, begin_x; + unsigned winnum; - if(winnum > ZCURSES_MAX_WINDOWS) { - zerrnam(nam, "bad window number: %s", args[0], 0); - return 1; - } + nlines = atoi(args[0]); + ncols = atoi(args[1]); + begin_y = atoi(args[2]); + begin_x = atoi(args[3]); + winnum = zcurses_validate_window(args[4], ZCURSES_UNUSED); - if(zcurses_WIN[winnum]==NULL) { - zwarnnam(nam, "window number %s does not exist", args[0], 0); - return 1; - } + if (winnum == -1) { + zerrnam(nam, "%s: %s", zcurses_strerror(zc_errno), args[4], 0); + return 1; + } - if(wrefresh(zcurses_WIN[winnum])!=OK) - return 1; + zcurses_WIN[winnum]=newwin(nlines, ncols, begin_y, begin_x); - return 0; -} + if(zcurses_WIN[winnum]==NULL) + return 1; -/**/ -static int -bin_zcurses_wmove(char *nam, char **args, Options ops, UNUSED(int func)) -{ - int y, x; - unsigned winnum; + return 0; + } + if (OPT_ISSET(ops,'d')) { + targetwin = zcurses_validate_window(OPT_ARG(ops,'d'), ZCURSES_USED); + if (targetwin == -1) { + zwarnnam(nam, "%s: %s", zcurses_strerror(zc_errno), OPT_ARG(ops,'d'), 0); + return 1; + } + + if(delwin(zcurses_WIN[targetwin])!=OK) + return 1; + + zcurses_WIN[targetwin]=NULL; + return 0; + } - winnum = atoi(args[0]); - y = atoi(args[1]); - x = atoi(args[2]); + if (OPT_ISSET(ops,'r')) { + targetwin = zcurses_validate_window(OPT_ARG(ops,'r'), ZCURSES_USED); + if (targetwin == -1) { + zwarnnam(nam, "%s: %s", zcurses_strerror(zc_errno), OPT_ARG(ops,'r'), 0); + return 1; + } - if(winnum > ZCURSES_MAX_WINDOWS) { - zerrnam(nam, "bad window number: %s", args[0], 0); - return 1; + return (wrefresh(zcurses_WIN[targetwin])!=OK) ? 1 : 0; } + if (OPT_ISSET(ops,'m')) { + int y, x; + unsigned winnum; - if(zcurses_WIN[winnum]==NULL) { - zwarnnam(nam, "window number %s is not defined", args[0], 0); - return 1; - } + winnum = atoi(args[0]); + y = atoi(args[1]); + x = atoi(args[2]); - if(wmove(zcurses_WIN[winnum], y, x)!=OK) - return 1; + if(winnum > ZCURSES_MAX_WINDOWS) { + zerrnam(nam, "bad window number: %s", args[0], 0); + return 1; + } + + if(zcurses_WIN[winnum]==NULL) { + zwarnnam(nam, "window number %s is not defined", args[0], 0); + return 1; + } + + if(wmove(zcurses_WIN[winnum], y, x)!=OK) + return 1; + return 0; + } return 0; } @@ -167,13 +188,13 @@ bin_zcurses_wadd_wch(char *nam, char **args, Options ops, UNUSED(int func)) return 1; if(winnum > ZCURSES_MAX_WINDOWS) { - zerrnam(nam, "bad window number: %s", args[0], 0); - return 1; + zerrnam(nam, "bad window number: %s", args[0], 0); + return 1; } if(zcurses_WIN[winnum]==NULL) { - zwarnnam(nam, "window number %s is not defined", args[0], 0); - return 1; + zwarnnam(nam, "window number %s is not defined", args[0], 0); + return 1; } if(wadd_wch(zcurses_WIN[winnum], &cc)!=OK) @@ -194,19 +215,19 @@ bin_zcurses_wadd_wchstr(char *nam, char **args, Options ops, UNUSED(int func)) winnum = atoi(args[0]); if(winnum > ZCURSES_MAX_WINDOWS) { - zerrnam(nam, "bad window number: %s", args[0], 0); - return 1; + zerrnam(nam, "bad window number: %s", args[0], 0); + return 1; } if(zcurses_WIN[winnum]==NULL) { - zwarnnam(nam, "window number %s is not defined", args[0], 0); - return 1; + zwarnnam(nam, "window number %s is not defined", args[0], 0); + return 1; } sl = strlen(args[1]); if(sl == 0) { - return 0; + return 0; } ws = malloc(sl * sizeof(wchar_t)); @@ -225,7 +246,7 @@ bin_zcurses_wadd_wchstr(char *nam, char **args, Options ops, UNUSED(int func)) free(ws); if(wadd_wchstr(zcurses_WIN[winnum], wcc)!=OK) { - free(wcc); + free(wcc); return 1; } @@ -242,13 +263,13 @@ bin_zcurses_wborder(char *nam, char **args, Options ops, UNUSED(int func)) winnum = atoi(args[0]); if(winnum > ZCURSES_MAX_WINDOWS) { - zerrnam(nam, "bad window number: %s", args[0], 0); - return 1; + zerrnam(nam, "bad window number: %s", args[0], 0); + return 1; } if(zcurses_WIN[winnum]==NULL) { - zwarnnam(nam, "window number %s does not exist", args[0], 0); - return 1; + zwarnnam(nam, "window number %s does not exist", args[0], 0); + return 1; } if(wborder(zcurses_WIN[winnum], 0, 0, 0, 0, 0, 0, 0, 0)!=OK) @@ -257,17 +278,12 @@ bin_zcurses_wborder(char *nam, char **args, Options ops, UNUSED(int func)) return 0; } - - /* * boot_ is executed when the module is loaded. */ static struct builtin bintab[] = { - BUILTIN("zcurses_newwin", 0, bin_zcurses_newwin, 5, 5, 0, NULL, NULL), - BUILTIN("zcurses_delwin", 0, bin_zcurses_delwin, 1, 1, 0, NULL, NULL), - BUILTIN("zcurses_wrefresh", 0, bin_zcurses_wrefresh, 1, 1, 0, NULL, NULL), - BUILTIN("zcurses_wmove", 0, bin_zcurses_wmove, 3, 3, 0, NULL, NULL), + BUILTIN("zcurses", 0, bin_zcurses, 0, 5, 0, "ad:mr:", NULL), BUILTIN("zcurses_wadd_wch", 0, bin_zcurses_wadd_wch, 2, 2, 0, NULL, NULL), BUILTIN("zcurses_wadd_wchstr", 0, bin_zcurses_wadd_wchstr, 2, 2, 0, NULL, NULL), BUILTIN("zcurses_wborder", 0, bin_zcurses_wborder, 1, 1, 0, NULL, NULL), diff --git a/Src/Modules/curses.mdd b/Src/Modules/curses.mdd index 4d1a6f19f..4d27d5c4f 100644 --- a/Src/Modules/curses.mdd +++ b/Src/Modules/curses.mdd @@ -2,6 +2,6 @@ name=zsh/curses link='if test "x$ac_cv_func_initscr" = xyes -a "x$ac_cv_header_curses_h" = xyes -a "x$ac_cv_func_setcchar" = xyes; then echo dynamic; else echo no; fi' load=no -autobins="zcurses_newwin" +autobins="zcurses" objects="curses.o" |