* On Sun, Apr 17, 2011 at 11:26:25PM +0200, Bram Moolenaar <[email protected]> 
wrote:

Raghavendra D Prabhu wrote:

Currently when using cscope with vim and being several levels deep from
project root directory (with cscope.out located in this directory), the
cscope queries fail because of lack of prefix. Using a cscope prefix on
a per-project basis is hard. So, this patch introduces a boolean
variable setting which vim will be able use (in the absence of an
already existing prefix path) the prefix of cscope.out to canonicalize
the path obtained from 'cs find'. I have also tested it and it works
fine.

Isn't this similar to what 'tagrelative' does to file names in tags
files?  Then perhaps we should use a similar name: 'cscoperelative'?
Yeah, 'cscoperelative' name makes more sense and it will be easier for
people to find it too. I have attached patch with the name change.
From 6296ddbecde5023ffc414bb7a92bd887a1b516c1 Mon Sep 17 00:00:00 2001
From: Raghavendra D Prabhu <[email protected]>
Date: Sat, 16 Apr 2011 16:36:04 +0530
Subject: [PATCH 1/2] Added cscoperelative (csre)

Currently, the only way to obtain canonical path for cscope is to use
ppath. However, using it on per project basis can be annoying. So this
introduces a boolean flag - csre - setting which makes vim use the
dirname of path of cscope out file (usually located in the root of
project directory) as the prefix in the absence of an already existing
ppath.

Signed-off-by: Raghavendra D Prabhu <[email protected]>
---
 src/if_cscope.c |   10 +++++++++-
 src/if_cscope.h |    2 +-
 src/option.c    |    9 ++++++++-
 src/option.h    |    1 +
 4 files changed, 19 insertions(+), 3 deletions(-)

diff --git a/src/if_cscope.c b/src/if_cscope.c
index 82c5173..6e454b5 100644
--- a/src/if_cscope.c
+++ b/src/if_cscope.c
@@ -2480,6 +2480,7 @@ cs_resolve_file(i, name)
     char *name;
 {
     char *fullname;
+    char *prefix;
     int len;
 
     /*
@@ -2490,6 +2491,9 @@ cs_resolve_file(i, name)
     len = (int)(strlen(name) + 2);
     if (csinfo[i].ppath != NULL)
        len += (int)strlen(csinfo[i].ppath);
+    else if (p_csre) {
+       len += (int)strlen(dirname(strdup(csinfo[i].fname)));
+    }
 
     if ((fullname = (char *)alloc(len)) == NULL)
        return NULL;
@@ -2508,7 +2512,11 @@ cs_resolve_file(i, name)
        )
        (void)sprintf(fullname, "%s/%s", csinfo[i].ppath, name);
     else
-       (void)sprintf(fullname, "%s", name);
+       if (p_csre && csinfo[i].fname != NULL) {
+           (void)sprintf(fullname, "%s/%s", 
dirname(strdup(csinfo[i].fname)),name);
+       } 
+       else
+           (void)sprintf(fullname, "%s", name);
 
     return fullname;
 } /* cs_resolve_file */
diff --git a/src/if_cscope.h b/src/if_cscope.h
index 5620eb3..ddfee28 100644
--- a/src/if_cscope.h
+++ b/src/if_cscope.h
@@ -10,7 +10,7 @@
  */
 
 #if defined(FEAT_CSCOPE) || defined(PROTO)
-
+#include <libgen.h>
 #if defined(UNIX)
 # include <sys/types.h>                /* pid_t */
 # include <sys/stat.h>         /* dev_t, ino_t */
diff --git a/src/option.c b/src/option.c
index b633466..3f5e695 100644
--- a/src/option.c
+++ b/src/option.c
@@ -898,13 +898,20 @@ static struct vimoption
                            {(char_u *)0L, (char_u *)0L}
 #endif
                            SCRIPTID_INIT},
+    {"cscoperelative", "csre", P_BOOL|P_VI_DEF|P_VIM, 
+#ifdef FEAT_CSCOPE
+                           (char_u *)&p_csre, PV_NONE,
+#else
+                           (char_u *)NULL, PV_NONE,
+#endif
+                           {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
     {"cscopequickfix", "csqf", P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
 #if defined(FEAT_CSCOPE) && defined(FEAT_QUICKFIX)
                            (char_u *)&p_csqf, PV_NONE,
                            {(char_u *)"", (char_u *)0L}
 #else
                            (char_u *)NULL, PV_NONE,
-                           {(char_u *)0L, (char_u *)0L}
+                           {(char_u *)0L, (char_u *)0L}  
 #endif
                            SCRIPTID_INIT},
     {"cscopetag",   "cst",  P_BOOL|P_VI_DEF|P_VIM,
diff --git a/src/option.h b/src/option.h
index e2e65a0..149a156 100644
--- a/src/option.h
+++ b/src/option.h
@@ -391,6 +391,7 @@ EXTERN long p_ph;           /* 'pumheight' */
 EXTERN char_u  *p_cpo;         /* 'cpoptions' */
 #ifdef FEAT_CSCOPE
 EXTERN char_u  *p_csprg;       /* 'cscopeprg' */
+EXTERN int       p_csre;        /*  'cscoperelative' */
 # ifdef FEAT_QUICKFIX
 EXTERN char_u  *p_csqf;        /* 'cscopequickfix' */
 #  define      CSQF_CMDS   "sgdctefi"
-- 
1.7.4.4

From e54faee6e8e660ac0c9af5513ec2530644c54f93 Mon Sep 17 00:00:00 2001
From: Raghavendra D Prabhu <[email protected]>
Date: Sat, 16 Apr 2011 17:01:38 +0530
Subject: [PATCH 2/2] Updated documentation for cscoperelative


Signed-off-by: Raghavendra D Prabhu <[email protected]>
---
 runtime/doc/if_cscop.txt |    7 +++++++
 runtime/doc/options.txt  |    9 +++++++++
 runtime/doc/quickref.txt |    1 +
 runtime/doc/tags         |    1 +
 4 files changed, 18 insertions(+), 0 deletions(-)

diff --git a/runtime/doc/if_cscop.txt b/runtime/doc/if_cscop.txt
index 91dd4c6..19509d6 100644
--- a/runtime/doc/if_cscop.txt
+++ b/runtime/doc/if_cscop.txt
@@ -271,6 +271,13 @@ tag files.  The default is off.  Examples: >
        :set cst
        :set nocst
 <
+                                                       *cscoperelative* *csre*
+If 'cscoperelative' set, then in absence of a prefix givent to cscope, prefix
+of cscope.out path (usually the project root directory)  will be used as the
+prefix path. The default is off. Examples: >
+       :set csre
+       :set nocsre
+<
                                                        *cscopetagorder* *csto*
 The value of 'csto' determines the order in which |:cstag| performs a search.
 If 'csto' is set to zero, cscope database(s) are searched first, followed
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt
index 166c0aa..8fd9f6b 100644
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -2184,6 +2184,15 @@ A jump table for the options with a short description 
can be found at |Q_op|.
        Determines how many components of the path to show in a list of tags.
        See |cscopepathcomp|.
 
+                                               *'cscoperelative'* *'csre'*
+'cscoperelative' 'csre' boolean (default off)
+                        global
+                       {not available when compiled without the |+cscope|
+                       feature}
+                       {not in Vi}
+       In the absence of prefix path for cscope. setting this option enables
+       to use the prefix of cscope.out path as the prefix.
+
                                                *'cscopeprg'* *'csprg'*
 'cscopeprg' 'csprg'    string  (default "cscope")
                        global
diff --git a/runtime/doc/quickref.txt b/runtime/doc/quickref.txt
index 5bf410e..e1e7212 100644
--- a/runtime/doc/quickref.txt
+++ b/runtime/doc/quickref.txt
@@ -655,6 +655,7 @@ Short explanation of each option:           *option-list*
 'cpoptions'      'cpo'     flags for Vi-compatible behavior
 'cryptmethod'    'cm'      type of encryption to use for file writing
 'cscopepathcomp'  'cspc'    how many components of the path to show
+'cscoperelative'  'csre'    Use cscope.out prefix as ppath
 'cscopeprg'       'csprg'   command to execute cscope
 'cscopequickfix'  'csqf'    use quickfix window for cscope results
 'cscopetag'       'cst'     use cscope for tag commands
diff --git a/runtime/doc/tags b/runtime/doc/tags
index bee39c1..ca09b65 100644
--- a/runtime/doc/tags
+++ b/runtime/doc/tags
@@ -152,6 +152,7 @@ $VIMRUNTIME starting.txt    /*$VIMRUNTIME*
 'crb'  options.txt     /*'crb'*
 'cryptmethod'  options.txt     /*'cryptmethod'*
 'cscopepathcomp'       options.txt     /*'cscopepathcomp'*
+'cscoperelative'       options.txt     /*'cscoperelative'*
 'cscopeprg'    options.txt     /*'cscopeprg'*
 'cscopequickfix'       options.txt     /*'cscopequickfix'*
 'cscopetag'    options.txt     /*'cscopetag'*
-- 
1.7.4.4

Attachment: pgpCD3qX7RIQ0.pgp
Description: PGP signature

Raspunde prin e-mail lui