[geany/geany] 1a43ee: Grab uctags kind.c/h

Jiří Techet git-noreply at xxxxx
Mon Dec 17 21:05:40 UTC 2018


Branch:      refs/heads/master
Author:      Jiří Techet <techet at gmail.com>
Committer:   Jiří Techet <techet at gmail.com>
Date:        Sat, 08 Oct 2016 15:38:31 UTC
Commit:      1a43ee2afa2cbecd497554aa3c07163ea5dabd01
             https://github.com/geany/geany/commit/1a43ee2afa2cbecd497554aa3c07163ea5dabd01

Log Message:
-----------
Grab uctags kind.c/h


Modified Paths:
--------------
    ctags/main/kind.c
    ctags/main/kind.h

Modified: ctags/main/kind.c
158 lines changed, 158 insertions(+), 0 deletions(-)
===================================================================
@@ -0,0 +1,158 @@
+/*
+ *
+ *  Copyright (c) 2015, Red Hat, Inc.
+ *  Copyright (c) 2015, Masatake YAMATO
+ *
+ *  Author: Masatake YAMATO <yamato at redhat.com>
+ *
+ *   This source code is released for free distribution under the terms of the
+ *   GNU General Public License version 2 or (at your option) any later version.
+ *
+ */
+
+#include "general.h"
+
+#include <stdio.h>
+#include "debug.h"
+#include "kind.h"
+#include "parse.h"
+
+extern void printRole (const roleDesc* const role)
+{
+	if (role)
+		printf ("%s\t%s\t%s\n", role->name, role->description, role->enabled? "on": "off");
+}
+
+extern const char *renderRole (const roleDesc* const role, vString* b)
+{
+	vStringCatS (b, role->name);
+	return vStringValue (b);
+}
+
+#define PR_KIND_WIDTH_LETTER         7
+#define PR_KIND_WIDTH_NAME          15
+#define PR_KIND_WIDTH_DESCRIPTION   30
+#define PR_KIND_WIDTH_ENABLED        8
+#define PR_KIND_WIDTH_REFONLY        7
+#define PR_KIND_WIDTH_NROLE          6
+#define PR_KIND_WIDTH_MASTER	    10
+#define MAKE_KIND_FMT(PREFIX,LETTER_SPEC,NROLL_SPEC)		\
+	PREFIX							\
+	PR_KIND_FMT (LETTER,LETTER_SPEC)			\
+	" "							\
+	PR_KIND_FMT (NAME,s)					\
+	" "							\
+	PR_KIND_FMT (ENABLED,s)					\
+	" "							\
+	PR_KIND_FMT (REFONLY,s)					\
+	" "							\
+	PR_KIND_FMT (NROLE,NROLL_SPEC)				\
+	" "							\
+	PR_KIND_FMT (MASTER,s)					\
+	" "							\
+	PR_KIND_FMT (DESCRIPTION,s)				\
+	"\n"
+
+extern void printKindListHeader (bool indent, bool tabSeparated)
+{
+#define KIND_HEADER_COMMON_FMT MAKE_KIND_FMT("%s", s, s)
+
+	const char *fmt = tabSeparated
+		? "%s%s%s\t%s\t%s\t%s\t%s\t%s\t%s\n"
+		: (indent
+		   ? PR_KIND_FMT (LANG,s) KIND_HEADER_COMMON_FMT
+		   : "%s"                 KIND_HEADER_COMMON_FMT)
+		;
+
+	printf (fmt,
+		(indent? "#PARSER": ""),
+		(indent? (tabSeparated? "\t": " "): ""),
+		(indent? "LETTER": "#LETTER"),
+		"NAME",
+		"ENABLED",
+		"REFONLY",
+		"NROLES",
+		"MASTER",
+		"DESCRIPTION");
+
+#undef KIND_HEADER_COMMON_FMT
+}
+
+extern void printKind (const kindOption* const kind, bool allKindFields, bool indent,
+		       bool tabSeparated)
+{
+#define KIND_FMT MAKE_KIND_FMT("", c, d)
+
+	if (allKindFields)
+	{
+		printf ((tabSeparated
+			 ?"%s%c\t%s\t%s\t%s\t%d\t%s\t%s\n"
+			 :"%s" KIND_FMT),
+			(indent? (tabSeparated? "\t": " "): ""),
+			kind->letter,
+			kind->name        != NULL ? kind->name        : "",
+			kind->enabled             ? "on"              : "off",
+			kind->referenceOnly       ? "TRUE"            : "FALSE",
+			kind->nRoles,
+			(kind->master
+			 || kind->slave ) ? getLanguageName (kind->syncWith): "",
+			kind->description != NULL ? kind->description : "");
+	}
+	else if (!kind->referenceOnly)
+	{
+		printf ("%s%c  %s%s\n", indent ? "    " : "", kind->letter,
+			kind->description != NULL ? kind->description :
+			(kind->name != NULL ? kind->name : ""),
+			kind->enabled ? "" : " [off]");
+	}
+
+#undef KIND_FMT
+}
+
+const char *scopeSeparatorFor (const kindOption *kind, char parentLetter)
+{
+	scopeSeparator *table;
+	Assert (kind);
+	table = kind->separators;
+
+	/* If no table is given, use the default generic separator ".".
+	   The exception is if a root separator is looked up. In this case,
+	   return NULL to notify there is no root separator to the caller. */
+
+	if (table == NULL)
+	{
+		if (parentLetter == KIND_NULL)
+			return NULL;
+		else
+			return ".";
+	}
+
+	while (table - kind->separators < kind->separatorCount)
+	{
+		/* KIND_WILDCARD cannot be used as a key for finding
+		   a root separator.*/
+		if ( (table->parentLetter == KIND_WILDCARD
+		       && parentLetter != KIND_NULL)
+		    || table->parentLetter == parentLetter)
+			return table->separator;
+		table++;
+	}
+	if (parentLetter == KIND_NULL)
+		return NULL;
+	else
+		return ".";
+}
+
+extern void enableKind (kindOption *kind, bool enable)
+{
+	kindOption *slave;
+
+	if (kind->master)
+		enableKind (kind->master, enable);
+	else
+	{
+		kind->enabled = enable;
+		for (slave = kind->slave; slave; slave = slave->slave)
+			slave->enabled = enable;
+	}
+}


Modified: ctags/main/kind.h
69 lines changed, 68 insertions(+), 1 deletions(-)
===================================================================
@@ -9,19 +9,86 @@
 #define CTAGS_MAIN_KIND_H
 
 #include "general.h"
+#include "types.h"
+#include "routines.h"		/* for STRINGIFY */
+#include "vstring.h"
+
+typedef struct sRoleDesc {
+	bool enabled;
+	const char* name;		  /* role name */
+	const char* description;	  /* displayed in --help output */
+} roleDesc;
+
+extern void printRole (const roleDesc* const role); /* for --help */
+extern const char *renderRole (const roleDesc* const role, vString* b);
+
+/*
+ * Predefined kinds
+ */
+#define KIND_REGEX_DEFAULT 'r'
+#define KIND_REGEX_DEFAULT_LONG "regex"
+/* We treat ' ' as a ghost kind.
+   It will never be listed up in --list-kinds. */
 
 #define KIND_NULL    '\0'
 
-#define KIND_FILE_ALT '!'
+#define KIND_GHOST   ' '
+#define KIND_GHOST_LONG "ghost"
 
 #define KIND_FILE_DEFAULT 'F'
 #define KIND_FILE_DEFAULT_LONG "file"
 
+#define KIND_FILE_ALT '!'
+
+#define KIND_GENERIC_REFERENCE '@'
+#define KIND_GENERIC_REFERENCE_DEFAULT_LONG "reference"
+
+#define KIND_WILDCARD '*'
+
+typedef struct sScopeSeparator {
+	char  parentLetter;
+	const char *separator;
+} scopeSeparator;
+
 struct sKindOption {
 	bool enabled;          /* are tags for kind enabled? */
 	char  letter;               /* kind letter */
 	const char* name;		  /* kind name */
 	const char* description;	  /* displayed in --help output */
+	bool referenceOnly;
+	int nRoles;		/* The number of role elements. */
+	roleDesc *roles;
+	scopeSeparator *separators;
+	unsigned int separatorCount;
+
+	/* Usage of `syncWith' field is a bit tricky.
+
+	   If `LANG_AUTO' is specified to `syncWith' field of a kind
+	   (target kind), the main part of ctags updtes the field with
+	   the id of a  parser (master parser) when initializing
+	   parsers. It also updates `slave' and `master' fields.
+
+	   If the value other than `LANG_AUTO' is specified,
+	   the main part does nothing. */
+	langType syncWith;
+	kindOption *slave;
+	kindOption *master;
 };
 
+#define ATTACH_ROLES(RS) .nRoles = ARRAY_SIZE(RS), .roles = RS
+#define ATTACH_SEPARATORS(S) .separators = S, .separatorCount = ARRAY_SIZE(S)
+
+/* The value of `tabSeparated' is meaningfull only when `allKindFields' is true. */
+extern void printKind (const kindOption* const kind, bool allKindFields, bool indent,
+		       bool tabSeparated);
+extern void printKindListHeader (bool indent, bool tabSeparated);
+extern const char *scopeSeparatorFor (const kindOption *kind, char parentLetter);
+
+extern void enableKind (kindOption *kind, bool enable);
+
+#define PR_KIND_STR(X) PR_KIND_WIDTH_##X
+#define PR_KIND_FMT(X,T) "%-" STRINGIFY(PR_KIND_STR(X)) STRINGIFY(T)
+
+#define PR_KIND_WIDTH_LANG 15
+
 #endif	/* CTAGS_MAIN_KIND_H */



--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).


More information about the Commits mailing list