head 1.1; access; symbols pkgsrc-2026Q1:1.1.0.168 pkgsrc-2026Q1-base:1.1 pkgsrc-2025Q4:1.1.0.166 pkgsrc-2025Q4-base:1.1 pkgsrc-2025Q3:1.1.0.164 pkgsrc-2025Q3-base:1.1 pkgsrc-2025Q2:1.1.0.162 pkgsrc-2025Q2-base:1.1 pkgsrc-2025Q1:1.1.0.160 pkgsrc-2025Q1-base:1.1 pkgsrc-2024Q4:1.1.0.158 pkgsrc-2024Q4-base:1.1 pkgsrc-2024Q3:1.1.0.156 pkgsrc-2024Q3-base:1.1 pkgsrc-2024Q2:1.1.0.154 pkgsrc-2024Q2-base:1.1 pkgsrc-2024Q1:1.1.0.152 pkgsrc-2024Q1-base:1.1 pkgsrc-2023Q4:1.1.0.150 pkgsrc-2023Q4-base:1.1 pkgsrc-2023Q3:1.1.0.148 pkgsrc-2023Q3-base:1.1 pkgsrc-2023Q2:1.1.0.146 pkgsrc-2023Q2-base:1.1 pkgsrc-2023Q1:1.1.0.144 pkgsrc-2023Q1-base:1.1 pkgsrc-2022Q4:1.1.0.142 pkgsrc-2022Q4-base:1.1 pkgsrc-2022Q3:1.1.0.140 pkgsrc-2022Q3-base:1.1 pkgsrc-2022Q2:1.1.0.138 pkgsrc-2022Q2-base:1.1 pkgsrc-2022Q1:1.1.0.136 pkgsrc-2022Q1-base:1.1 pkgsrc-2021Q4:1.1.0.134 pkgsrc-2021Q4-base:1.1 pkgsrc-2021Q3:1.1.0.132 pkgsrc-2021Q3-base:1.1 pkgsrc-2021Q2:1.1.0.130 pkgsrc-2021Q2-base:1.1 pkgsrc-2021Q1:1.1.0.128 pkgsrc-2021Q1-base:1.1 pkgsrc-2020Q4:1.1.0.126 pkgsrc-2020Q4-base:1.1 pkgsrc-2020Q3:1.1.0.124 pkgsrc-2020Q3-base:1.1 pkgsrc-2020Q2:1.1.0.120 pkgsrc-2020Q2-base:1.1 pkgsrc-2020Q1:1.1.0.100 pkgsrc-2020Q1-base:1.1 pkgsrc-2019Q4:1.1.0.122 pkgsrc-2019Q4-base:1.1 pkgsrc-2019Q3:1.1.0.118 pkgsrc-2019Q3-base:1.1 pkgsrc-2019Q2:1.1.0.116 pkgsrc-2019Q2-base:1.1 pkgsrc-2019Q1:1.1.0.114 pkgsrc-2019Q1-base:1.1 pkgsrc-2018Q4:1.1.0.112 pkgsrc-2018Q4-base:1.1 pkgsrc-2018Q3:1.1.0.110 pkgsrc-2018Q3-base:1.1 pkgsrc-2018Q2:1.1.0.108 pkgsrc-2018Q2-base:1.1 pkgsrc-2018Q1:1.1.0.106 pkgsrc-2018Q1-base:1.1 pkgsrc-2017Q4:1.1.0.104 pkgsrc-2017Q4-base:1.1 pkgsrc-2017Q3:1.1.0.102 pkgsrc-2017Q3-base:1.1 pkgsrc-2017Q2:1.1.0.98 pkgsrc-2017Q2-base:1.1 pkgsrc-2017Q1:1.1.0.96 pkgsrc-2017Q1-base:1.1 pkgsrc-2016Q4:1.1.0.94 pkgsrc-2016Q4-base:1.1 pkgsrc-2016Q3:1.1.0.92 pkgsrc-2016Q3-base:1.1 pkgsrc-2016Q2:1.1.0.90 pkgsrc-2016Q2-base:1.1 pkgsrc-2016Q1:1.1.0.88 pkgsrc-2016Q1-base:1.1 pkgsrc-2015Q4:1.1.0.86 pkgsrc-2015Q4-base:1.1 pkgsrc-2015Q3:1.1.0.84 pkgsrc-2015Q3-base:1.1 pkgsrc-2015Q2:1.1.0.82 pkgsrc-2015Q2-base:1.1 pkgsrc-2015Q1:1.1.0.80 pkgsrc-2015Q1-base:1.1 pkgsrc-2014Q4:1.1.0.78 pkgsrc-2014Q4-base:1.1 pkgsrc-2014Q3:1.1.0.76 pkgsrc-2014Q3-base:1.1 pkgsrc-2014Q2:1.1.0.74 pkgsrc-2014Q2-base:1.1 pkgsrc-2014Q1:1.1.0.72 pkgsrc-2014Q1-base:1.1 pkgsrc-2013Q4:1.1.0.70 pkgsrc-2013Q4-base:1.1 pkgsrc-2013Q3:1.1.0.68 pkgsrc-2013Q3-base:1.1 pkgsrc-2013Q2:1.1.0.66 pkgsrc-2013Q2-base:1.1 pkgsrc-2013Q1:1.1.0.64 pkgsrc-2013Q1-base:1.1 pkgsrc-2012Q4:1.1.0.62 pkgsrc-2012Q4-base:1.1 pkgsrc-2012Q3:1.1.0.60 pkgsrc-2012Q3-base:1.1 pkgsrc-2012Q2:1.1.0.58 pkgsrc-2012Q2-base:1.1 pkgsrc-2012Q1:1.1.0.56 pkgsrc-2012Q1-base:1.1 pkgsrc-2011Q4:1.1.0.54 pkgsrc-2011Q4-base:1.1 pkgsrc-2011Q3:1.1.0.52 pkgsrc-2011Q3-base:1.1 pkgsrc-2011Q2:1.1.0.50 pkgsrc-2011Q2-base:1.1 pkgsrc-2011Q1:1.1.0.48 pkgsrc-2011Q1-base:1.1 pkgsrc-2010Q4:1.1.0.46 pkgsrc-2010Q4-base:1.1 pkgsrc-2010Q3:1.1.0.44 pkgsrc-2010Q3-base:1.1 pkgsrc-2010Q2:1.1.0.42 pkgsrc-2010Q2-base:1.1 pkgsrc-2010Q1:1.1.0.40 pkgsrc-2010Q1-base:1.1 pkgsrc-2009Q4:1.1.0.38 pkgsrc-2009Q4-base:1.1 pkgsrc-2009Q3:1.1.0.36 pkgsrc-2009Q3-base:1.1 pkgsrc-2009Q2:1.1.0.34 pkgsrc-2009Q2-base:1.1 pkgsrc-2009Q1:1.1.0.32 pkgsrc-2009Q1-base:1.1 pkgsrc-2008Q4:1.1.0.30 pkgsrc-2008Q4-base:1.1 pkgsrc-2008Q3:1.1.0.28 pkgsrc-2008Q3-base:1.1 cube-native-xorg:1.1.0.26 cube-native-xorg-base:1.1 pkgsrc-2008Q2:1.1.0.24 pkgsrc-2008Q2-base:1.1 cwrapper:1.1.0.22 pkgsrc-2008Q1:1.1.0.20 pkgsrc-2008Q1-base:1.1 pkgsrc-2007Q4:1.1.0.18 pkgsrc-2007Q4-base:1.1 pkgsrc-2007Q3:1.1.0.16 pkgsrc-2007Q3-base:1.1 pkgsrc-2007Q2:1.1.0.14 pkgsrc-2007Q2-base:1.1 pkgsrc-2007Q1:1.1.0.12 pkgsrc-2007Q1-base:1.1 pkgsrc-2006Q4:1.1.0.10 pkgsrc-2006Q4-base:1.1 pkgsrc-2006Q3:1.1.0.8 pkgsrc-2006Q3-base:1.1 pkgsrc-2006Q2:1.1.0.6 pkgsrc-2006Q2-base:1.1 pkgsrc-2006Q1:1.1.0.4 pkgsrc-2006Q1-base:1.1 pkgsrc-2005Q4:1.1.0.2 pkgsrc-2005Q4-base:1.1; locks; strict; comment @# @; 1.1 date 2005.12.01.18.46.53; author wiz; state Exp; branches; next ; desc @@ 1.1 log @Split up patch-global multipatch in multiple separate patches. @ text @$NetBSD$ --- ex/ex_tag.c.orig 1996-09-15 22:02:43.000000000 +0200 +++ ex/ex_tag.c @@@@ -46,6 +46,10 @@@@ static char *binary_search __P((char *, static int compare __P((char *, char *, char *)); static void ctag_file __P((SCR *, TAGF *, char *, char **, size_t *)); static int ctag_search __P((SCR *, char *, size_t, char *)); +#ifdef GTAGS +static int getentry __P((char *, char **, char **, char **)); +static TAGQ *gtag_slist __P((SCR *, char *, int)); +#endif static int ctag_sfile __P((SCR *, TAGF *, TAGQ *, char *)); static TAGQ *ctag_slist __P((SCR *, char *)); static char *linear_search __P((char *, char *, char *)); @@@@ -89,6 +93,25 @@@@ ex_tag_first(sp, tagarg) return (0); } +#ifdef GTAGS +/* + * ex_rtag_push -- ^] + * :rtag[!] [string] + * + * Enter a new TAGQ context based on a ctag string. + * + * PUBLIC: int ex_rtag_push __P((SCR *, EXCMD *)); + */ +int +ex_rtag_push(sp, cmdp) + SCR *sp; + EXCMD *cmdp; +{ + F_SET(cmdp, E_REFERENCE); + return ex_tag_push(sp, cmdp); +} +#endif + /* * ex_tag_push -- ^] * :tag[!] [string] @@@@ -138,6 +161,12 @@@@ ex_tag_push(sp, cmdp) } /* Get the tag information. */ +#ifdef GTAGS + if (O_ISSET(sp, O_GTAGSMODE)) { + if ((tqp = gtag_slist(sp, exp->tag_last, F_ISSET(cmdp, E_REFERENCE))) == NULL) + return (1); + } else +#endif if ((tqp = ctag_slist(sp, exp->tag_last)) == NULL) return (1); @@@@ -969,6 +998,129 @@@@ notfound: tag_msg(sp, TAG_SEARCH, tag) return (0); } +#ifdef GTAGS +/* + * getentry -- + * get tag information from current line. + * + * gtags temporary file format. + * + * + * sample. + * +------------------------------------------------ + * |main 30 main.c main(argc, argv) + * |func 21 subr.c func(arg) + */ +static int +getentry(buf, tag, file, line) + char *buf, **tag, **file, **line; +{ + char *p = buf; + + for (*tag = p; *p && !isspace(*p); p++) /* tag name */ + ; + if (*p == 0) + goto err; + *p++ = 0; + for (; *p && isspace(*p); p++) /* (skip blanks) */ + ; + if (*p == 0) + goto err; + *line = p; /* line no */ + for (*line = p; *p && !isspace(*p); p++) + ; + if (*p == 0) + goto err; + *p++ = 0; + for (; *p && isspace(*p); p++) /* (skip blanks) */ + ; + if (*p == 0) + goto err; + *file = p; /* file name */ + for (*file = p; *p && !isspace(*p); p++) + ; + if (*p == 0) + goto err; + *p = 0; + + /* value check */ + if (strlen(*tag) && strlen(*line) && strlen(*file) && atoi(*line) > 0) + return 1; /* OK */ +err: + return 0; /* ERROR */ +} + +/* + * gtag_slist -- + * Search the list of tags files for a tag, and return tag queue. + */ +static TAGQ * +gtag_slist(sp, tag, ref) + SCR *sp; + char *tag; + int ref; +{ + EX_PRIVATE *exp; + TAGF *tfp; + TAGQ *tqp; + size_t len; + int echk; + TAG *tp; + char *name, *file, *line; + char command[BUFSIZ]; + char buf[BUFSIZ]; + FILE *fp; + + /* Allocate and initialize the tag queue structure. */ + len = strlen(tag); + CALLOC_GOTO(sp, tqp, TAGQ *, 1, sizeof(TAGQ) + len + 1); + CIRCLEQ_INIT(&tqp->tagq); + tqp->tag = tqp->buf; + memcpy(tqp->tag, tag, (tqp->tlen = len) + 1); + + /* + * Find the tag, only display missing file messages once, and + * then only if we didn't find the tag. + */ + snprintf(command, sizeof(command), "global -%s '%s' 2>/dev/null", ref ? "rx" : "x", tag); + if (fp = popen(command, "r")) { + while (fgets(buf, sizeof(buf), fp)) { + if (buf[strlen(buf)-1] == '\n') /* chop(buf) */ + buf[strlen(buf)-1] = 0; + else + while (fgetc(fp) != '\n') + ; + if (getentry(buf, &name, &file, &line) == 0) { + echk = 1; + F_SET(tfp, TAGF_ERR); + break; + } + CALLOC_GOTO(sp, tp, + TAG *, 1, sizeof(TAG) + strlen(file) + 1 + strlen(line) + 1); + tp->fname = tp->buf; + strcpy(tp->fname, file); + tp->fnlen = strlen(file); + tp->search = tp->fname + tp->fnlen + 1; + strcpy(tp->search, line); + CIRCLEQ_INSERT_TAIL(&tqp->tagq, tp, q); + } + pclose(fp); + } + + /* Check to see if we found anything. */ + if (tqp->tagq.cqh_first == (void *)&tqp->tagq) { + msgq_str(sp, M_ERR, tag, "162|%s: tag not found"); + free(tqp); + return (NULL); + } + + tqp->current = tqp->tagq.cqh_first; + return (tqp); + +alloc_err: + return (NULL); +} +#endif /* * ctag_slist -- * Search the list of tags files for a tag, and return tag queue. @