SF.net SVN: geany: [2069] trunk

eht16 at users.sourceforge.net eht16 at xxxxx
Fri Nov 23 16:05:54 UTC 2007


Revision: 2069
          http://geany.svn.sourceforge.net/geany/?rev=2069&view=rev
Author:   eht16
Date:     2007-11-23 08:05:53 -0800 (Fri, 23 Nov 2007)

Log Message:
-----------
Use FreeBasic specific sections in symbol list.
Use Basic parser from CTags SVN and improve the parser for better handling of dim and const keywords.	 

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/src/symbols.c
    trunk/tagmanager/basic.c

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2007-11-22 17:48:59 UTC (rev 2068)
+++ trunk/ChangeLog	2007-11-23 16:05:53 UTC (rev 2069)
@@ -1,3 +1,11 @@
+2007-11-23  Enrico Tröger  <enrico(dot)troeger(at)uvena(dot)de>
+
+ * src/symbols.c, tagmanager/basic.c:
+   Use FreeBasic specific sections in symbol list.
+   Use Basic parser from CTags SVN and improve the parser for better
+   handling of dim and const keywords.
+
+
 2007-11-22  Enrico Tröger  <enrico(dot)troeger(at)uvena(dot)de>
 
  * po/POTFILES.in, plugins/autosave.c, plugins/Makefile.am,

Modified: trunk/src/symbols.c
===================================================================
--- trunk/src/symbols.c	2007-11-22 17:48:59 UTC (rev 2068)
+++ trunk/src/symbols.c	2007-11-23 16:05:53 UTC (rev 2069)
@@ -663,6 +663,18 @@
 				NULL);
 			break;
 		}
+		case GEANY_FILETYPES_BASIC:
+		{
+			tag_list_add_groups(tag_store,
+				&(tv_iters.tag_function), _("Functions"), "classviewer-method",
+				&(tv_iters.tag_variable), _("Variables"), "classviewer-var",
+				&(tv_iters.tag_macro), _("Constants"), "classviewer-macro",
+				&(tv_iters.tag_struct), _("Types"), "classviewer-namespace",
+				&(tv_iters.tag_namespace), _("Labels"), "classviewer-member",
+				&(tv_iters.tag_other), _("Other"), "classviewer-other",
+				NULL);
+			break;
+		}
 		case GEANY_FILETYPES_D:
 		default:
 		{

Modified: trunk/tagmanager/basic.c
===================================================================
--- trunk/tagmanager/basic.c	2007-11-22 17:48:59 UTC (rev 2068)
+++ trunk/tagmanager/basic.c	2007-11-23 16:05:53 UTC (rev 2069)
@@ -31,71 +31,111 @@
 	K_FUNCTION,
 	K_LABEL,
 	K_TYPE,
-    K_VARIABLE,
-    K_ENUM
+	K_VARIABLE,
+	K_ENUM
 } BasicKind;
 
 typedef struct {
 	char const *token;
 	BasicKind kind;
-	int skip;
 } KeyWord;
 
 static kindOption BasicKinds[] = {
-	{TRUE, 'c', "constant", "constants"},
+	{TRUE, 'c', "macro", "constants"},
 	{TRUE, 'f', "function", "functions"},
-	{TRUE, 'l', "label", "labels"},
-	{TRUE, 't', "type", "types"},
+	{TRUE, 'l', "namespace", "labels"},
+	{TRUE, 't', "struct", "types"},
 	{TRUE, 'v', "variable", "variables"},
-	{TRUE, 'g', "enum", "enumerations"}
+	{TRUE, 'g', "externvar", "enumerations"}
 };
 
-static KeyWord blitzbasic_keywords[] = {
-	{"const", K_CONST, 0},
-	{"global", K_VARIABLE, 0},
-	{"dim", K_VARIABLE, 0},
-	{"function", K_FUNCTION, 0},
-	{"type", K_TYPE, 0},
-	{NULL, 0, 0}
-};
-
-static KeyWord purebasic_keywords[] = {
-	{"newlist", K_VARIABLE, 0},
-	{"global", K_VARIABLE, 0},
-	{"dim", K_VARIABLE, 0},
-	{"procedure", K_FUNCTION, 0},
-	{"interface", K_TYPE, 0},
-	{"structure", K_TYPE, 0},
-	{NULL, 0, 0}
-};
-
 static KeyWord freebasic_keywords[] = {
-	{"const", K_CONST, 0},
-	{"dim as", K_VARIABLE, 1},
-	{"dim", K_VARIABLE, 0},
-	{"common", K_VARIABLE, 0},
-	{"function", K_FUNCTION, 0},
-	{"sub", K_FUNCTION, 0},
-	{"private sub", K_FUNCTION, 0},
-	{"public sub", K_FUNCTION, 0},
-	{"private function", K_FUNCTION, 0},
-	{"public function", K_FUNCTION, 0},
-	{"type", K_TYPE, 0},
-	{"enum", K_ENUM, 0},
-	{NULL, 0, 0}
+	{"dim", K_VARIABLE}, // must always be the first
+	{"common", K_VARIABLE}, // must always be the second
+	{"const", K_CONST}, // must always be the third
+	{"function", K_FUNCTION},
+	{"sub", K_FUNCTION},
+	{"private sub", K_FUNCTION},
+	{"public sub", K_FUNCTION},
+	{"private function", K_FUNCTION},
+	{"public function", K_FUNCTION},
+	{"type", K_TYPE},
+	{"enum", K_ENUM},
+	{NULL, 0}
 };
 
 /*
  *   FUNCTION DEFINITIONS
  */
 
+/* Match the name of a dim or const starting at pos. */
+static int extract_dim (char const *pos, vString * name, BasicKind kind)
+{
+	while (isspace (*pos))
+		pos++;
+
+	vStringClear (name);
+
+	if (strncasecmp (pos, "shared", 6) == 0)
+		pos += 6; // skip keyword "shared"
+
+	while (isspace (*pos))
+		pos++;
+
+	// capture "dim as String str"
+	if (strncasecmp (pos, "as", 2) == 0)
+	{
+			pos += 2; // skip keyword "as"
+
+		while (isspace (*pos))
+			pos++;
+		while (!isspace (*pos)) // skip next part which is a type
+			pos++;
+		while (isspace (*pos))
+			pos++;
+		// now we are at the name
+	}
+
+	// capture "dim as foo ptr bar"
+	if (strncasecmp (pos, "ptr", 3) == 0)
+	{
+		pos += 3; // skip keyword "ptr"
+
+		while (isspace (*pos))
+			pos++;
+	}
+
+	for (; *pos && !isspace (*pos) && *pos != '(' && *pos != ','; pos++)
+		vStringPut (name, *pos);
+	vStringTerminate (name);
+	makeSimpleTag (name, BasicKinds, kind);
+
+	// if the line contains a ',', we have multiple declarations
+	while (*pos && strchr (pos, ','))
+	{
+		while (*pos != ',') // skip all we don't need(e.g. "..., new_array(5), " we skip "(5)")
+			pos++;
+		while (isspace (*pos) || *pos == ',')
+			pos++;
+
+		vStringClear (name);
+		for (; *pos && !isspace (*pos) && *pos != '(' && *pos != ','; pos++)
+			vStringPut (name, *pos);
+		vStringTerminate (name);
+		makeSimpleTag (name, BasicKinds, kind);
+	}
+
+	vStringDelete (name);
+	return 1;
+}
+
 /* Match the name of a tag (function, variable, type, ...) starting at pos. */
 static char const *extract_name (char const *pos, vString * name)
 {
 	while (isspace (*pos))
 		pos++;
 	vStringClear (name);
-	for (; *pos && !isspace (*pos) && *pos != '(' && *pos != ','; pos++)
+	for (; *pos && !isspace (*pos) && *pos != '(' && *pos != ',' && *pos != '='; pos++)
 		vStringPut (name, *pos);
 	vStringTerminate (name);
 	return pos;
@@ -114,12 +154,18 @@
 	}
 	name = vStringNew ();
 	p += i;
-	for (j = 0; j < 1 + kw->skip; j++)
+	if (kw == &freebasic_keywords[0] ||
+		kw == &freebasic_keywords[1] ||
+		kw == &freebasic_keywords[2])
+		return extract_dim (p, name, kw->kind); // extract_dim adds the found tag(s)
+
+	for (j = 0; j < 1; j++)
 	{
-    	p = extract_name (p, name);
-    }
+		p = extract_name (p, name);
+	}
 	makeSimpleTag (name, BasicKinds, kw->kind);
 	vStringDelete (name);
+
 	return 1;
 }
 
@@ -138,23 +184,13 @@
 	}
 }
 
-/* Match a ".label" style label. */
-static void match_dot_label (char const *p)
+static void findBasicTags (void)
 {
-	if (*p == '.')
-	{
-		vString *name = vStringNew ();
-		extract_name (p + 1, name);
-		makeSimpleTag (name, BasicKinds, K_LABEL);
-		vStringDelete (name);
-	}
-}
-
-static void findBasicTags (KeyWord const keywords[],
-	void (*label) (const char *))
-{
 	const char *line;
+	KeyWord *keywords;
 
+	keywords = freebasic_keywords;
+
 	while ((line = (const char *) fileReadLine ()) != NULL)
 	{
 		const char *p = line;
@@ -172,55 +208,18 @@
 			if (match_keyword (p, kw)) break;
 
 		/* Is it a label? */
-		label (p);
+		match_colon_label (p);
 	}
 }
 
-static void findBlitzBasicTags (void)
-{
-	findBasicTags (blitzbasic_keywords, match_dot_label);
-}
-
-static void findPureBasicTags (void)
-{
-	findBasicTags (purebasic_keywords, match_colon_label);
-}
-
-static void findFreeBasicTags (void)
-{
-	findBasicTags (freebasic_keywords, match_colon_label);
-}
-
-parserDefinition *BlitzBasicParser (void)
-{
-	static char const *extensions[] = { "bb", NULL };
-	parserDefinition *def = parserNew ("BlitzBasic");
-	def->kinds = BasicKinds;
-	def->kindCount = KIND_COUNT (BasicKinds);
-	def->extensions = extensions;
-	def->parser = findBlitzBasicTags;
-	return def;
-}
-
-parserDefinition *PureBasicParser (void)
-{
-	static char const *extensions[] = { "pb", NULL };
-	parserDefinition *def = parserNew ("PureBasic");
-	def->kinds = BasicKinds;
-	def->kindCount = KIND_COUNT (BasicKinds);
-	def->extensions = extensions;
-	def->parser = findPureBasicTags;
-	return def;
-}
-
 parserDefinition *FreeBasicParser (void)
 {
-	static char const *extensions[] = { "bas", "bi", NULL };
+	static char const *extensions[] = { "bas", "bi", "bb", "pb", NULL };
 	parserDefinition *def = parserNew ("FreeBasic");
 	def->kinds = BasicKinds;
 	def->kindCount = KIND_COUNT (BasicKinds);
 	def->extensions = extensions;
-	def->parser = findFreeBasicTags;
+	def->parser = findBasicTags;
 	return def;
 }
 


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.



More information about the Commits mailing list