diff options
Diffstat (limited to 'Src/Modules/terminfo.c')
-rw-r--r-- | Src/Modules/terminfo.c | 226 |
1 files changed, 226 insertions, 0 deletions
diff --git a/Src/Modules/terminfo.c b/Src/Modules/terminfo.c new file mode 100644 index 000000000..3ad8a8a27 --- /dev/null +++ b/Src/Modules/terminfo.c @@ -0,0 +1,226 @@ +/* + * terminfo.c - parameter interface to terminfo via curses + * + * This file is part of zsh, the Z shell. + * + * Copyright (c) 2000 Sven Wishnowsky, Clint Adams + * All rights reserved. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and to distribute modified versions of this software for any + * purpose, provided that the above copyright notice and the following + * two paragraphs appear in all copies of this software. + * + * In no event shall Sven Wishnowsky, Clint Adams or the Zsh Development Group + * be liable to any party for direct, indirect, special, incidental, or + * consequential damages arising out of the use of this software and its + * documentation, even if Sven Wishnowsky, Clint Adams and the Zsh + * Development Group have been advised of the possibility of such damage. + * + * Sven Wishnowsky, Clint Adams and the Zsh Development Group specifically + * disclaim any warranties, including, but not limited to, the implied + * warranties of merchantability and fitness for a particular purpose. + * The software provided hereunder is on an "as is" basis, and Sven + * Wishnowsky, Clint Adams and the Zsh Development Group have no obligation + * to provide maintenance, support, updates, enhancements, or modifications. + * + */ + +#include "terminfo.mdh" +#include "terminfo.pro" + +static char terminfo_nam[] = "terminfo"; +static Param terminfo_pm; + +/* echoti: output a terminfo capability */ + +/**/ +int +bin_echoti(char *name, char **argv, char *ops, int func) +{ + char *s, buf[2048], *t, *u; + int num, argct; + + s = *argv++; + if (termflags & TERM_BAD) + return 1; + if ((termflags & TERM_UNKNOWN) && (isset(INTERACTIVE) || !init_term())) + return 1; + /* if the specified capability has a numeric value, display it */ + if (((num = tigetnum(s)) != -1) && (num != -2)) { + printf("%d\n", num); + return 0; +} + +switch (tigetflag(s)) { + case -1: + break; + case 0: + puts("no"); + return 0; + default: + puts("yes"); + return 0; +} + +/* get a string-type capability */ +t = tigetstr(s); +if (!t || !*t) { + /* capability doesn't exist, or (if boolean) is off */ + zwarnnam(name, "no such terminfo capability: %s", s, 0); + return 1; +} + +printf("%s", t); +return 0; +} + +static struct builtin bintab[] = { +BUILTIN("echoti", 0, bin_echoti, 1, -1, 0, NULL, NULL), + }; + +/* This says if we are cleaning up when the module is unloaded. */ + +static int incleanup; + +/* Empty dummy function for special hash parameters. */ + +/**/ +static void +shempty(void) +{ +} + +/* Create a simple special hash parameter. */ + +/**/ +static Param +createtihash() +{ + Param pm; + HashTable ht; + + unsetparam(terminfo_nam); + + if (!(pm = createparam(terminfo_nam, PM_SPECIAL|PM_HIDE|PM_HIDEVAL| + PM_REMOVABLE|PM_HASHED))) + return NULL; + + pm->level = pm->old ? locallevel : 0; + pm->gets.hfn = hashgetfn; + pm->sets.hfn = hashsetfn; + pm->unsetfn = stdunsetfn; + pm->u.hash = ht = newhashtable(7, terminfo_nam, NULL); + + ht->hash = hasher; + ht->emptytable = (TableFunc) shempty; + ht->filltable = NULL; + ht->addnode = (AddNodeFunc) shempty; + ht->getnode = ht->getnode2 = getterminfo; + ht->removenode = (RemoveNodeFunc) shempty; + ht->disablenode = NULL; + ht->enablenode = NULL; + ht->freenode = (FreeNodeFunc) shempty; + ht->printnode = printparamnode; + ht->scantab = scanterminfo; + + return (terminfo_pm = pm); +} + +/**/ +static HashNode +getterminfo(HashTable ht, char *name) +{ + int len, num; + char *tistr; + Param pm = NULL; + + if (termflags & TERM_BAD) + return 1; + if ((termflags & TERM_UNKNOWN) && (isset(INTERACTIVE) || !init_term())) + return 1; + + unmetafy(name, &len); + + pm = (Param) zhalloc(sizeof(struct param)); + pm->nam = dupstring(name); + pm->flags = PM_READONLY; + pm->sets.cfn = NULL; + pm->gets.cfn = strgetfn; + pm->unsetfn = NULL; + pm->ct = 0; + pm->env = NULL; + pm->ename = NULL; + pm->old = NULL; + pm->level = 0; + + if (((num = tigetnum(name)) != -1) && (num != -2)) { + pm->u.val = num; + pm->flags |= PM_INTEGER; + } + else if ((num = tigetflag(name)) != -1) { + pm->u.str = num ? dupstring("yes") : dupstring("no"); + pm->flags |= PM_SCALAR; + } + else if ((tistr = tigetstr(name)) != NULL) + { + pm->u.str = dupstring(tistr); + pm->flags |= PM_SCALAR; + } + else + { + zwarn("no such capability: %s", name, 0); + pm->u.str = dupstring(""); + pm->flags |= PM_UNSET; + } + return (HashNode) pm; + +} + +/**/ +static void +scanterminfo(HashTable ht, ScanFunc func, int flags) +{ +return 0; +} + +/**/ +int +setup_(Module m) +{ + incleanup = 0; + + return 0; +} + +/**/ +int +boot_(Module m) +{ + return !createtihash() || !addbuiltins(m->nam, bintab, sizeof(bintab)/sizeof(*bintab)); +} + +/**/ +int +cleanup_(Module m) +{ + Param pm; + + incleanup = 1; + + if ((pm = (Param) paramtab->getnode(paramtab, terminfo_nam)) && + pm == terminfo_pm) { + pm->flags &= ~PM_READONLY; + unsetparam_pm(pm, 0, 1); + } + deletebuiltins(m->nam, bintab, sizeof(bintab)/sizeof(*bintab)); + return 0; +} + +/**/ +int +finish_(Module m) +{ + return 0; +} |