Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

extending addbuiltin()



-----BEGIN PGP SIGNED MESSAGE-----

This patch extends addbuiltin() to allow setting of all members of the
builtin structure.  Another function, add_autobin(), is added to make
creation of autoloadable builtins cleaner.

 -zefram

      *** Src/init.c	1996/12/24 03:45:30	1.31
      --- Src/init.c	1996/12/24 15:34:43
      ***************
      *** 521,528 ****
            createparamtable();     /* create paramater hash table             */
        
        #ifdef UNLINKED_XMOD_zle
      !     addbuiltin("bindkey", 0, NULL, 0, -1, "zle");
      !     addbuiltin("vared", 0, NULL, 1, 7, "zle");
        #endif /* UNLINKED_XMOD_zle */
        
        #ifdef LINKED_XMOD_zle
      --- 521,528 ----
            createparamtable();     /* create paramater hash table             */
        
        #ifdef UNLINKED_XMOD_zle
      !     add_autobin("bindkey", "zle");
      !     add_autobin("vared", "zle");
        #endif /* UNLINKED_XMOD_zle */
        
        #ifdef LINKED_XMOD_zle
      ***************
      *** 532,538 ****
        #endif
        
        #ifdef UNLINKED_XMOD_compctl
      !     addbuiltin("compctl", 0, NULL, 0, -1, "compctl");
            ZLE_DEP("compctl");
        #endif /* UNLINKED_XMOD_compctl */
        
      --- 532,538 ----
        #endif
        
        #ifdef UNLINKED_XMOD_compctl
      !     add_autobin("compctl", "compctl");
            ZLE_DEP("compctl");
        #endif /* UNLINKED_XMOD_compctl */
        
      *** Src/module.c	1996/12/24 02:46:01	1.18
      --- Src/module.c	1996/12/24 15:35:55
      ***************
      *** 31,54 ****
        
        #include "zsh.h"
        
      ! /* addbuiltin() can be used to add a new builtin.  It has six arguments: *
      !  *  - the name of the new builtin                                        *
      !  *  - BINF_* flags (see zsh.h).  Normally it is 0.                       *
      !  *  - the handler function of the builtin                                *
      !  *  - minimum number of arguments                                        *
      !  *  - maximum number of argument (-1 means unlimited)                    *
      !  *  - possible option leters                                             *
      !  * It returns zero on succes -1 on failure                               */
        
        /**/
        int
      ! addbuiltin(char *nam, int flags, HandlerFunc hfunc, int minargs, int maxargs, char *optstr)
        {
            Builtin bn;
        
            bn = (Builtin) builtintab->getnode2(builtintab, nam);
            if (bn && bn->handlerfunc)
      ! 	return -1;
            if (!bn) {
        	bn = zcalloc(sizeof(*bn));
        	bn->nam = ztrdup(nam);
      --- 31,57 ----
        
        #include "zsh.h"
        
      ! /* addbuiltin() can be used to add a new builtin.  It has eight arguments: *
      !  *  - the name of the new builtin                                          *
      !  *  - BINF_* flags (see zsh.h).  Normally it is 0.                         *
      !  *  - the handler function of the builtin                                  *
      !  *  - minimum number of arguments                                          *
      !  *  - maximum number of argument (-1 means unlimited)                      *
      !  *  - BIN_* ID for overloaded builtins (normally 0)                        *
      !  *  - possible option leters                                               *
      !  *  - default options for overloaded builtins (normally NULL)              *
      !  * It returns zero on success, 1 on failure.  The only possible type of    *
      !  * failure is that a builtin with the specified name already exists.       */
        
        /**/
        int
      ! addbuiltin(char *nam, int flags, HandlerFunc hfunc, int minargs, int maxargs, int funcid, char *optstr, char *defopts)
        {
            Builtin bn;
        
            bn = (Builtin) builtintab->getnode2(builtintab, nam);
            if (bn && bn->handlerfunc)
      ! 	return 1;
            if (!bn) {
        	bn = zcalloc(sizeof(*bn));
        	bn->nam = ztrdup(nam);
      ***************
      *** 60,72 ****
      --- 63,89 ----
            bn->handlerfunc = hfunc;
            bn->minargs = minargs;
            bn->maxargs = maxargs;
      +     bn->funcid = funcid;
            zsfree(bn->optstr);
            bn->optstr = ztrdup(optstr);
      +     zsfree(bn->defopts);
      +     bn->defopts = ztrdup(defopts);
            return 0;
        }
        
        #ifdef DYNAMIC
        
      + /* Define an autoloadable builtin.  It returns 0 on success, or 1 on *
      +  * failure.  The only possible cause of failure is that a builtin    *
      +  * with the specified name already exists.                           */
      + 
      + /**/
      + int
      + add_autobin(char *nam, char *module)
      + {
      +     return addbuiltin(nam, 0, NULL, 0, 0, 0, module, NULL);
      + }
      + 
        /* Remove the builtin added previously by addbuiltin().  Returns *
         * zero on succes and -1 if there is no builtin with that name.  *
         * Attempt to delete a builtin which is not defined by           *
      ***************
      *** 418,424 ****
        	    zwarnnam(nam, "too many arguments for `zmodload -a'", NULL, 0);
        	    return 1;
        	}
      ! 	if (addbuiltin(args[0], 0, NULL, 0, -1, args[1] ? args[1] : args[0])) {
        	    zwarnnam(nam, "failed to add builtin %s", args[0], 0);
        	    return 1;
        	}
      --- 435,441 ----
        	    zwarnnam(nam, "too many arguments for `zmodload -a'", NULL, 0);
        	    return 1;
        	}
      ! 	if (add_autobin(args[0], args[1] ? args[1] : args[0])) {
        	    zwarnnam(nam, "failed to add builtin %s", args[0], 0);
        	    return 1;
        	}
      *** Src/Modules/example.c	1996/12/22 04:50:54	1.3
      --- Src/Modules/example.c	1996/12/24 15:22:46
      ***************
      *** 57,76 ****
        
        /*
         * boot_example is executed when the module is loaded.
      -  * addbuiltin() can be used to add a new builtin.  It has six arguments:
      -  *  - the name of the new builtin
      -  *  - BINF_* flags (see zsh.h).  Normally it is 0.
      -  *  - the handler function of the builtin
      -  *  - minimum number of arguments
      -  *  - maximum number of argument (-1 means unlimited)
      -  *  - possible option leters
         */
        
        /**/
        int
        boot_example(Module m)
        {
      !     if (addbuiltin("example", 0, bin_example, 0, -1, "flags")) {
        	zwarnnam(m->nam, "name clash when adding builtin `example'", NULL, 0);
        	return -1;
            }
      --- 57,69 ----
        
        /*
         * boot_example is executed when the module is loaded.
         */
        
        /**/
        int
        boot_example(Module m)
        {
      !     if (addbuiltin("example", 0, bin_example, 0, -1, 0, "flags", NULL)) {
        	zwarnnam(m->nam, "name clash when adding builtin `example'", NULL, 0);
        	return -1;
            }
      *** Src/Modules/files.c	1996/12/24 14:29:19	1.3
      --- Src/Modules/files.c	1996/12/24 15:40:29
      ***************
      *** 301,313 ****
            return 0;
        }
        
      - /**/
      - static int
      - bin_mv(char *nam, char **args, char *ops, int func)
      - {
      -     return bin_ln(nam, args, ops, BIN_MV);
      - }
      - 
        /* rm builtin */
        
        /**/
      --- 301,306 ----
      ***************
      *** 412,432 ****
            char *name;
            int binf;
            HandlerFunc func;
      !     int min, max;
      !     char *optstr;
            int added;
        } bins[] = {
        #ifdef HAVE_LSTAT
      !     { "ln",    0, bin_ln,    1, -1, "dfis", 0 },
        #else
      !     { "ln",    0, bin_ln,    1, -1, "dfi",  0 },
        #endif
      !     { "mkdir", 0, bin_mkdir, 1, -1, "pm",   0 },
      !     { "mv",    0, bin_mv,    2, -1, "fi",   0 },
      !     { "rm",    0, bin_rm,    1, -1, "dfir", 0 },
      !     { "rmdir", 0, bin_rmdir, 1, -1, NULL,   0 },
      !     { "sync",  0, bin_sync,  0,  0, NULL,   0 },
      !     { NULL, 0, NULL, 0, 0, NULL, 0 }
        };
        
        /**/
      --- 405,425 ----
            char *name;
            int binf;
            HandlerFunc func;
      !     int min, max, funcid;
      !     char *optstr, *defopts;
            int added;
        } bins[] = {
        #ifdef HAVE_LSTAT
      !     { "ln",    0, bin_ln,    1, -1, BIN_LN, "dfis", NULL, 0 },
        #else
      !     { "ln",    0, bin_ln,    1, -1, BIN_LN, "dfi",  NULL, 0 },
        #endif
      !     { "mkdir", 0, bin_mkdir, 1, -1, 0,      "pm",   NULL, 0 },
      !     { "mv",    0, bin_ln,    2, -1, BIN_MV, "fi",   NULL, 0 },
      !     { "rm",    0, bin_rm,    1, -1, 0,      "dfir", NULL, 0 },
      !     { "rmdir", 0, bin_rmdir, 1, -1, 0,      NULL,   NULL, 0 },
      !     { "sync",  0, bin_sync,  0,  0, 0,      NULL,   NULL, 0 },
      !     { NULL, 0, NULL, 0, 0, 0, NULL, NULL, 0 }
        };
        
        /**/
      ***************
      *** 438,444 ****
        
            for(bin = bins; bin->name; bin++) {
        	if (!bin->added && addbuiltin(bin->name, bin->binf, bin->func,
      ! 	    bin->min, bin->max, bin->optstr))
        	    zwarnnam(m->nam, "name clash when adding builtin `%s'",
        		bin->name, 0);
        	else
      --- 431,437 ----
        
            for(bin = bins; bin->name; bin++) {
        	if (!bin->added && addbuiltin(bin->name, bin->binf, bin->func,
      ! 	    bin->min, bin->max, bin->funcid, bin->optstr, bin->defopts))
        	    zwarnnam(m->nam, "name clash when adding builtin `%s'",
        		bin->name, 0);
        	else
      *** Src/Zle/compctl.c	1996/12/24 03:07:09	1.2
      --- Src/Zle/compctl.c	1996/12/24 15:24:59
      ***************
      *** 1024,1030 ****
        int
        boot_compctl(Module m)
        {
      !     if (addbuiltin("compctl", 0, bin_compctl, 0, -1, NULL)) {
        	zwarnnam(m->nam, "name clash when adding builtin `compctl'", NULL, 0);
        	return -1;
            }
      --- 1024,1030 ----
        int
        boot_compctl(Module m)
        {
      !     if (addbuiltin("compctl", 0, bin_compctl, 0, -1, 0, NULL, NULL)) {
        	zwarnnam(m->nam, "name clash when adding builtin `compctl'", NULL, 0);
        	return -1;
            }
      *** Src/Zle/zle_main.c	1996/12/24 03:07:09	1.6
      --- Src/Zle/zle_main.c	1996/12/24 15:25:15
      ***************
      *** 1566,1572 ****
        
            initkeybindings();	    /* initialize key bindings */
            compctlsetup();
      !     addbuiltin("bindkey", 0, bin_bindkey, 0, -1, "asvemdruU");
      !     addbuiltin("vared", 0, bin_vared, 1, 7, NULL);
            return 0;
        }
      --- 1566,1572 ----
        
            initkeybindings();	    /* initialize key bindings */
            compctlsetup();
      !     addbuiltin("bindkey", 0, bin_bindkey, 0, -1, 0, "asvemdruU", NULL);
      !     addbuiltin("vared", 0, bin_vared, 1, 7, 0, NULL, NULL);
            return 0;
        }

-----BEGIN PGP SIGNATURE-----
Version: 2.6.2

iQCVAwUBMr/7KXD/+HJTpU/hAQEsDwP/bb55wnFjhVJ7CqMFVYq1QWSeZcAiPczk
tgtCG1euKkx2uATFauTlDXtUWBAvP6PgDxtZIdz/B2tXu4SaFeX3tgUIkAB8kK78
/cYrpBFAHXbk6zICWQsAXgxagjFY8lSJQiYldQ1509kTXvPbDsXucCyUg+LFingV
eCNtiEi33Oo=
=L1/n
-----END PGP SIGNATURE-----



Messages sorted by: Reverse Date, Date, Thread, Author