On 5/07/2013 15:11, Shigio YAMAGUCHI wrote:
> How about making new environment variable GLOBAL_OPTIONS instead of
> GTAGSCOLOR? It is similar to GREP_OPTIONS of grep(1). You can use
>         $ export GLOBAL_OPTIONS='--path-style=shorter --basic-regexp 
> --ignore-case'

Find attached a patch that implements both GLOBAL_OPTIONS (removing
GTAGSTHROUGH and GTAGSCOLOR) and --color=never|always|auto (-C is the
same as --color=auto).  Given the above example, I've also added
-E,--ext-regexp, -m,--match-case and -S,--project to allow overriding of
GLOBAL_OPTIONS, restoring defaults.

-- 
Jason.
--- global~.c   2013-07-05 17:36:57 +1000
+++ global.c    2013-07-11 00:11:43 +1000
@@ -59,6 +59,7 @@
 static void help(void);
 static void setcom(int);
 int decide_tag_by_context(const char *, const char *, int);
+int prepend_args(const char *, int *, char ***);
 int main(int, char **);
 int completion_tags(const char *, const char *, const char *, int);
 void completion(const char *, const char *, const char *, int);
@@ -150,10 +151,11 @@
 static struct option const long_options[] = {
        {"absolute", no_argument, NULL, 'a'},
        {"completion", no_argument, NULL, 'c'},
-       {"color", no_argument, NULL, 'C'},
-       {"colour", no_argument, NULL, 'C'},
+       {"color", optional_argument, NULL, 'C'},
+       {"colour", optional_argument, NULL, 'C'},
        {"definition", no_argument, NULL, 'd'},
        {"regexp", required_argument, NULL, 'e'},
+       {"ext-regexp", no_argument, NULL, 'E'},
        {"file", no_argument, NULL, 'f'},
        {"local", no_argument, NULL, 'l'},
        {"file-list", required_argument, NULL, 'L'},
@@ -162,6 +164,7 @@
        {"basic-regexp", no_argument, NULL, 'G'},
        {"ignore-case", no_argument, NULL, 'i'},
        {"idutils", no_argument, NULL, 'I'},
+       {"match-case", no_argument, NULL, 'm'},
        {"other", no_argument, NULL, 'o'},
        {"only-other", no_argument, NULL, 'O'},
        {"print-dbpath", no_argument, NULL, 'p'},
@@ -170,6 +173,7 @@
        {"reference", no_argument, NULL, 'r'},
        {"rootdir", no_argument, NULL, 'r'},
        {"symbol", no_argument, NULL, 's'},
+       {"project", no_argument, NULL, 'S'},
        {"tags", no_argument, NULL, 't'},
        {"through", no_argument, NULL, 'T'},
        {"update", no_argument, NULL, 'u'},
@@ -335,6 +339,56 @@
        }
        return db;
 }
+/**
+ * prepend_args: insert arguments from a string into an array
+ *
+ *     @param[in]      var   string containing arguments to be inserted
+ *     @param          argc  current and new array size
+ *     @param          argv  current and new array arguments
+ *     @return         number of arguments prepended
+ *
+ *     @note preserves first element and assumes NULL exists after last.
+ *     @note backslash is used to escape the next character.
+ */
+int
+prepend_args(const char *var, int *argc, char ***argv)
+{
+       int cnt = 0;
+
+       if (var && *var) {
+               char *buf = check_strdup(var);
+               char *s = buf;
+               char *d = buf;
+               char **a, **args, **arg = *argv;
+               int i;
+               for (;;) {
+                       while (*s && isspace(*s))
+                               ++s;
+                       if (!*s)
+                               break;
+                       ++cnt;
+                       do {
+                               *d = *s++;
+                               if (*d == '\\' && *s)
+                                       *d = *s++;
+                               ++d;
+                       } while (*s && !isspace(*s));
+                       *d++ = '\0';
+               }
+               a = args = check_malloc((*argc + cnt + 1) * sizeof(char*));
+               *a++ = *arg++;
+               s = buf;
+               for (i = 0; i < cnt; ++i) {
+                       *a++ = s;
+                       s = strchr(s, '\0') + 1;
+               }
+               memcpy(a, arg, *argc * sizeof(char*));
+               *argc += cnt;
+               *argv = args;
+       }
+
+       return cnt;
+}
 int
 main(int argc, char **argv)
 {
@@ -343,8 +397,9 @@
        int optchar;
        int option_index = 0;
 
+       prepend_args(getenv("GLOBAL_OPTIONS"), &argc, &argv);
        logging_arguments(argc, argv);
-       while ((optchar = getopt_long(argc, argv, 
"acCde:ifgGIlL:noOpPqrstTuvVx", long_options, &option_index)) != EOF) {
+       while ((optchar = getopt_long(argc, argv, 
"acCde:EifgGIlL:mnoOpPqrsStTuvVx", long_options, &option_index)) != EOF) {
                switch (optchar) {
                case 0:
                        break;
@@ -356,7 +411,17 @@
                        setcom(optchar);
                        break;
                case 'C':
-                       Cflag++;
+                       if (optarg) {
+                               if (!strcmp(optarg, "never"))
+                                       Cflag = 0;
+                               else if (!strcmp(optarg, "always"))
+                                       Cflag = 1;
+                               else if (!strcmp(optarg, "auto"))
+                                       Cflag = 2;
+                               else
+                                       die_with_code(2, "unknown color type 
for the --color option.");
+                       } else
+                               Cflag = 2;
                        break;
                case 'd':
                        dflag++;
@@ -364,6 +429,9 @@
                case 'e':
                        av = optarg;
                        break;
+               case 'E':
+                       Gflag = 0;
+                       break;
                case 'f':
                        fflag++;
                        xflag++;
@@ -389,6 +457,9 @@
                case 'L':
                        file_list = optarg;
                        break;
+               case 'm':
+                       iflag = 0;
+                       break;
                case 'n':
                        nflag++;
                        if (optarg) {
@@ -424,6 +495,9 @@
                case 's':
                        sflag++;
                        break;
+               case 'S':
+                       Tflag = 0;
+                       break;
                case 't':
                        tflag++;
                        break;
@@ -532,10 +606,6 @@
                        warning("cannot encode '/' and '.' in the path. 
Ignored.");
                set_encode_chars((unsigned char *)encode_chars);
        }
-       if (getenv("GTAGSTHROUGH"))
-               Tflag++;
-       if (getenv("GTAGSCOLOR"))
-               Cflag++;
        if (qflag)
                vflag = 0;
        if (show_help)
@@ -547,6 +617,8 @@
                else if (!(getenv("ANSICON") || LoadLibrary("ANSI32.dll")))
                        Cflag = 0;
 #endif
+               if (Cflag == 2 && !isatty(1))
+                       Cflag = 0;
                if (Cflag)
                        highlight_init();
        }
--- manual~.in  2013-07-05 17:36:57 +1000
+++ manual.in   2013-07-11 00:37:58 +1000
@@ -25,12 +25,12 @@
 @HEADER        GLOBAL,1,May 2012,GNU Project
 @NAME  global - print locations of the specified object.
 @SYNOPSIS
-       @name{global} [-aCdGilnqrstTvx] [-e] @arg{pattern}
-       @name{global} -c[diIoOPrsT] @arg{prefix}
+       @name{global} [-aCdEGilmnqrsStTvx] [-e] @arg{pattern}
+       @name{global} -c[diImoOPrsST] @arg{prefix}
        @name{global} -f[aCdlnqrstvx] [-L file-list] @arg{files}
-       @name{global} -g[aCGilnoOqtvVx] [-L file-list] [-e] @arg{pattern} 
[@arg{files}]
-       @name{global} -I[aCilnqtvx] [-e] @arg{pattern}
-       @name{global} -P[aCGilnoOqtvVx] [-e] @arg{pattern}
+       @name{global} -g[aCEGilmnoOqtvVx] [-L file-list] [-e] @arg{pattern} 
[@arg{files}]
+       @name{global} -I[aCilmnqtvx] [-e] @arg{pattern}
+       @name{global} -P[aCEGilmnoOqtvVx] [-e] @arg{pattern}
        @name{global} -p[qrv]
        @name{global} -u[qv]
 @DESCRIPTION
@@ -91,10 +91,11 @@
        @begin_itemize
        @item{@option{-a}, @option{--absolute}}
                Print absolute path name. By default, print relative path name.
-       @item{@option{-C}, @option{--color}, @option{--colour}}
-               Use color to highlight the pattern within the line. The default
-               color is bold red text on current background; the environment
-               variable @var{GREP_COLORS} or @var{GREP_COLOR} defines it.
+       @item{@option{-C}, @option{--color}, @option{--colour}} @arg{when}
+               Use color to highlight the pattern within the line; @arg{when} 
may be one
+               of: @arg{never}, @arg{always} or @arg{auto} (default). The 
default color is bold red
+               text on current background; the environment variable 
@var{GREP_COLORS} or
+               @var{GREP_COLOR} defines it.
        @item{@option{-d}, @option{--definition}}
                Print locations of object definitions.
        @item{@option{--from-here} @arg{context}}
@@ -105,6 +106,9 @@
                editors and IDEs.
        @item{@option{-e}, @option{--regexp} @arg{pattern}}
                Use @arg{pattern} as the pattern; useful to protect patterns 
beginning with @file{-}.
+       @item{@option{-E}, @option{--ext-regexp}}
+               Interpret @arg{pattern} as an extended regular expression.
+               This is provided to override @option{-G} in 
@var{GLOBAL_OPTIONS}.
        @item{@option{--encode-path} @arg{chars}}
                Convert path characters in @arg{chars} into a '%' symbol, 
followed by the
                two-digit hexadecimal representation of the character.
@@ -121,6 +125,9 @@
        @item{@option{--literal}}
                Execute literal search instead of regular expression search.
                This option is only valid when the @option{-g} command is 
specified.
+       @item{@option{-m}, @option{--match-case}}
+               Consider case distinctions in the pattern.
+               This is provided to override @option{-i} in 
@var{GLOBAL_OPTIONS}.
        @item{@option{--match-part @arg{part}}}
                Specify the matched part of path name.
                This option is valid only with the @option{-c} command with the 
@option{-P} option.
@@ -153,6 +160,9 @@
                The @option{--result=ctags} and @option{--result=ctags-x} 
options are
                equivalent to the @option{-t} and @option{-x} options 
respectively.
                The @option{--result} option is given more priority than the 
@option{-t} and @option{-x} options.
+       @item{@option{-S}, @option{--project}}
+               Consider only the project's tag files.
+               This is provided to override @option{-T} in 
@var{GLOBAL_OPTIONS}.
        @item{@option{--single-update} @arg{file}}
                Update tag files using @xref{gtags,1} with 
@option{--single-update} option.
                It is considered that @arg{file} was added or updated,
@@ -242,12 +252,12 @@
        @item{@var{MAKEOBJDIRPREFIX}}
                If this variable is set, @file{$MAKEOBJDIRPREFIX} is used as 
the prefix
                of BSD-style objdir. The default is @file{/usr/obj}.
-       @item{@var{GTAGSTHROUGH}}
-               If this variable is set, the @option{-T} option is specified.
        @item{@var{GTAGSBLANKENCODE}}
                If this variable is set, the @option{--encode-path=" <TAB>"} 
option is specified.
-       @item{@var{GTAGSCOLOR}}
-               If this variable is set, the @option{-C} option is specified.
+       @item{@var{GLOBAL_OPTIONS}}
+               Use this variable to always add options to the beginning of the
+               command line (like 'global $GLOBAL_OPTIONS ...').
+               Backslash is used to escape the next character.
        @item{@var{GREP_COLOR}}
                The color to use for @option{-C}; @var{GREP_COLORS} has 
precedence.
        @item{@var{GREP_COLORS}}
_______________________________________________
Bug-global mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/bug-global

Reply via email to