From: Theo Buehler Subject: Re: mg: "support" for exuberant/universal ctags tags files To: Omar Polo Cc: tech@openbsd.org Date: Fri, 14 Jun 2024 09:35:59 +0200 On Tue, Jun 04, 2024 at 08:59:56AM +0200, Omar Polo wrote: > 36-week bump :) > > I noticed I still had this in my tree. Actually I am in doubt whether > to actually keep the first hunk or not, I could as well drop it, but the > others are nice for compatibility. > > While it could be interesting to support uctags annotations, I don't > have plans to do so. > > Thoughts? I think you should just commit this. ok tb > > On 2023/09/27 18:23:52 +0200, Omar Polo wrote: > > TL;DR "support" because this is not about supporting the fancy new > > stuff, but just not breaking on a universal-ctags generated tag file. > > I'd just like to tell mg enough of the file format to ignore the > > extensions over plain tag files. > > > > The diff is mostly from troglobit' mg: > > https://github.com/troglobit/mg/commit/64cd07ecf5c521d50966eca8ba04026e7c9f3be8 > > > > The documentation about the universal-ctags extension over tags files > > is documented in utags(5) after you install the universal-ctags > > package. Tags file entries follows this scheme: > > > > {tagname}{tagfile}{tagaddress} > > > > where tagaddress is an ex command (could be anything, I haven't > > checked how vi(1) actually implements it, but mg assumes it's a search > > and just does that. Works most of the times). > > > > To store extra metadata about the tag itself, the address is put a > > comment in the tagaddress. For example, here's how the main() entry > > would look like. Not the type information after ;" > > > > % uctags *.c > > % g ^main tags > > tags:526: main main.c /^main(int argc, char **argv)$/;" f typeref:typename:int > > > > Similarly, universal-ctags introduced support for some meta-tag using > > some dummy entries under the !_TAG_ "namespace" > > (e.g. !_TAG_FILE_FORMAT, !_TAG_FILE_SORTED, ...) > > > > So, the idea is to just ignore tags starting with !_TAG_ and ignore > > comments. As simple as that :-) > > Index: tags.c > =================================================================== > RCS file: /home/cvs/src/usr.bin/mg/tags.c,v > diff -u -p -r1.27 tags.c > --- tags.c 29 Mar 2023 19:09:04 -0000 1.27 > +++ tags.c 27 Sep 2023 16:21:42 -0000 > @@ -281,6 +281,10 @@ loadtags(const char *fn) > } > while ((l = fparseln(fd, NULL, NULL, "\\\\\0", > FPARSELN_UNESCCONT | FPARSELN_UNESCREST)) != NULL) { > + if (!strncmp(l, "!_TAG_", 6)) { > + free(l); > + continue; > + } > if (addctag(l) == FALSE) { > fclose(fd); > return (FALSE); > @@ -340,7 +344,7 @@ int > addctag(char *s) > { > struct ctag *t = NULL; > - char *l; > + char *l, *c; > > if ((t = malloc(sizeof(struct ctag))) == NULL) { > dobeep(); > @@ -357,6 +361,15 @@ addctag(char *s) > *l++ = '\0'; > if (*l == '\0') > goto cleanup; > + > + /* > + * Newer universal ctags format abuse vi comments in the > + * pattern to store extra metadata. Since we don't support it > + * remove it so the pattern is not mangled. > + */ > + if ((c = strstr(l, ";\"")) != NULL) > + *c = '\0'; > + > t->pat = strip(l, strlen(l)); > if (RB_INSERT(tagtree, &tags, t) != NULL) { > free(t); >