mirror of
				git://git.code.sf.net/p/zsh/code
				synced 2025-10-31 06:00:54 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			186 lines
		
	
	
	
		
			4.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			186 lines
		
	
	
	
		
			4.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * zleparameter.c - parameter interface to zle internals
 | |
|  *
 | |
|  * This file is part of zsh, the Z shell.
 | |
|  *
 | |
|  * Copyright (c) 1999 Sven Wischnowsky
 | |
|  * 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 Wischnowsky 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 Wischnowsky and the Zsh Development Group have been advised of
 | |
|  * the possibility of such damage.
 | |
|  *
 | |
|  * Sven Wischnowsky 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 Wischnowsky and the
 | |
|  * Zsh Development Group have no obligation to provide maintenance,
 | |
|  * support, updates, enhancements, or modifications.
 | |
|  *
 | |
|  */
 | |
| 
 | |
| #include "zleparameter.mdh"
 | |
| #include "zleparameter.pro"
 | |
| 
 | |
| /* Functions for the zlewidgets special parameter. */
 | |
| 
 | |
| /**/
 | |
| static char *
 | |
| widgetstr(Widget w)
 | |
| {
 | |
|     if (!w)
 | |
| 	return dupstring("undefined");
 | |
|     if (w->flags & WIDGET_INT)
 | |
| 	return dupstring("builtin");
 | |
|     if (w->flags & WIDGET_NCOMP) {
 | |
| 	char *t = (char *) zhalloc(13 + strlen(w->u.comp.wid) +
 | |
| 				   strlen(w->u.comp.func));
 | |
| 
 | |
| 	strcpy(t, "completion:");
 | |
| 	strcat(t, w->u.comp.wid);
 | |
| 	strcat(t, ":");
 | |
| 	strcat(t, w->u.comp.func);
 | |
| 
 | |
| 	return t;
 | |
|     }
 | |
|     return dyncat("user:", w->u.fnnam);
 | |
| }
 | |
| 
 | |
| /**/
 | |
| static HashNode
 | |
| getpmwidgets(UNUSED(HashTable ht), const char *name)
 | |
| {
 | |
|     Param pm = NULL;
 | |
|     Thingy th;
 | |
| 
 | |
|     pm = (Param) hcalloc(sizeof(struct param));
 | |
|     pm->node.nam = dupstring(name);
 | |
|     pm->node.flags = PM_SCALAR | PM_READONLY;
 | |
|     pm->gsu.s = &nullsetscalar_gsu;
 | |
| 
 | |
|     if ((th = (Thingy) thingytab->getnode(thingytab, name)) &&
 | |
| 	!(th->flags & DISABLED))
 | |
| 	pm->u.str = widgetstr(th->widget);
 | |
|     else {
 | |
| 	pm->u.str = dupstring("");
 | |
| 	pm->node.flags |= PM_UNSET;
 | |
|     }
 | |
|     return &pm->node;
 | |
| }
 | |
| 
 | |
| /**/
 | |
| static void
 | |
| scanpmwidgets(UNUSED(HashTable ht), ScanFunc func, int flags)
 | |
| {
 | |
|     struct param pm;
 | |
|     int i;
 | |
|     HashNode hn;
 | |
| 
 | |
|     memset((void *)&pm, 0, sizeof(struct param));
 | |
|     pm.node.flags = PM_SCALAR | PM_READONLY;
 | |
|     pm.gsu.s = &nullsetscalar_gsu;
 | |
| 
 | |
|     for (i = 0; i < thingytab->hsize; i++)
 | |
| 	for (hn = thingytab->nodes[i]; hn; hn = hn->next) {
 | |
| 	    pm.node.nam = hn->nam;
 | |
| 	    if (func != scancountparams &&
 | |
| 		((flags & (SCANPM_WANTVALS|SCANPM_MATCHVAL)) ||
 | |
| 		 !(flags & SCANPM_WANTKEYS)))
 | |
| 		pm.u.str = widgetstr(((Thingy) hn)->widget);
 | |
| 	    func(&pm.node, flags);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| /* Functions for the zlekeymaps special parameter. */
 | |
| 
 | |
| static char **
 | |
| keymapsgetfn(UNUSED(Param pm))
 | |
| {
 | |
|     int i;
 | |
|     HashNode hn;
 | |
|     char **ret, **p;
 | |
| 
 | |
|     p = ret = (char **) zhalloc((keymapnamtab->ct + 1) * sizeof(char *));
 | |
| 
 | |
|     for (i = 0; i < keymapnamtab->hsize; i++)
 | |
| 	for (hn = keymapnamtab->nodes[i]; hn; hn = hn->next)
 | |
| 	    *p++ = dupstring(hn->nam);
 | |
|     *p = NULL;
 | |
| 
 | |
|     return ret;
 | |
| }
 | |
| 
 | |
| /*
 | |
|  * This is a duplicate of stdhash_gsu.  On some systems
 | |
|  * (such as Cygwin) we can't put a pointer to an imported variable
 | |
|  * in a compile-time initialiser, so we use this instead.
 | |
|  */
 | |
| static const struct gsu_hash zlestdhash_gsu =
 | |
| { hashgetfn, hashsetfn, stdunsetfn };
 | |
| static const struct gsu_array keymaps_gsu =
 | |
| { keymapsgetfn, arrsetfn, stdunsetfn };
 | |
| 
 | |
| static struct paramdef partab[] = {
 | |
|     SPECIALPMDEF("keymaps", PM_ARRAY|PM_READONLY, &keymaps_gsu, NULL, NULL),
 | |
|     SPECIALPMDEF("widgets", PM_READONLY,
 | |
| 		 &zlestdhash_gsu, getpmwidgets, scanpmwidgets)
 | |
| };
 | |
| 
 | |
| static struct features module_features = {
 | |
|     NULL, 0,
 | |
|     NULL, 0,
 | |
|     NULL, 0,
 | |
|     partab, sizeof(partab)/sizeof(*partab),
 | |
|     0
 | |
| };
 | |
| 
 | |
| /**/
 | |
| int
 | |
| setup_(UNUSED(Module m))
 | |
| {
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| /**/
 | |
| int
 | |
| features_(Module m, char ***features)
 | |
| {
 | |
|     *features = featuresarray(m, &module_features);
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| /**/
 | |
| int
 | |
| enables_(Module m, int **enables)
 | |
| {
 | |
|     return handlefeatures(m, &module_features, enables);
 | |
| }
 | |
| 
 | |
| /**/
 | |
| int
 | |
| boot_(UNUSED(Module m))
 | |
| {
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| /**/
 | |
| int
 | |
| cleanup_(Module m)
 | |
| {
 | |
|     return setfeatureenables(m, &module_features, NULL);
 | |
| }
 | |
| 
 | |
| /**/
 | |
| int
 | |
| finish_(UNUSED(Module m))
 | |
| {
 | |
|     return 0;
 | |
| }
 |