SF.net SVN: geany:[3849] trunk
eht16 at users.sourceforge.net
eht16 at xxxxx
Tue Jun 9 21:02:49 UTC 2009
Revision: 3849
http://geany.svn.sourceforge.net/geany/?rev=3849&view=rev
Author: eht16
Date: 2009-06-09 21:02:46 +0000 (Tue, 09 Jun 2009)
Log Message:
-----------
Parse Pascal calltips (closes #2802640).
Modified Paths:
--------------
trunk/ChangeLog
trunk/tagmanager/pascal.c
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2009-06-09 14:39:28 UTC (rev 3848)
+++ trunk/ChangeLog 2009-06-09 21:02:46 UTC (rev 3849)
@@ -1,3 +1,9 @@
+2009-06-09 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
+
+ * tagmanager/pascal.c:
+ Parse Pascal calltips (closes #2802640).
+
+
2009-06-09 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>
* src/filetypes.c, src/ui_utils.c:
Modified: trunk/tagmanager/pascal.c
===================================================================
--- trunk/tagmanager/pascal.c 2009-06-09 14:39:28 UTC (rev 3848)
+++ trunk/tagmanager/pascal.c 2009-06-09 21:02:46 UTC (rev 3849)
@@ -20,6 +20,7 @@
#include "entry.h"
#include "parse.h"
#include "read.h"
+#include "main.h"
#include "vstring.h"
/*
@@ -30,7 +31,7 @@
} pascalKind;
static kindOption PascalKinds [] = {
- { TRUE, 'f', "function", "functions"},
+ { TRUE, 'f', "function", "functions"},
{ TRUE, 'f', "function", "procedures"}
};
@@ -39,7 +40,8 @@
*/
static void createPascalTag (tagEntryInfo* const tag,
- const vString* const name, const int kind)
+ const vString* const name, const int kind,
+ const char *arglist, const char *vartype)
{
if (PascalKinds [kind].enabled && name != NULL && vStringLength (name) > 0)
{
@@ -47,6 +49,8 @@
tag->kindName = PascalKinds [kind].name;
tag->kind = PascalKinds [kind].letter;
+ tag->extensionFields.arglist = arglist;
+ tag->extensionFields.varType = vartype;
}
else
initTagEntry (tag, NULL);
@@ -79,6 +83,69 @@
return result;
}
+static void parseArglist(const char *buf, char **arglist, char **vartype)
+{
+ char *c, *start, *end;
+ int level;
+
+ if (NULL == buf || NULL == arglist)
+ return;
+
+ c = strdup(buf);
+ /* parse argument list which can be missing like in "function ginit:integer;" */
+ if (NULL != (start = strchr(c, '(')))
+ {
+ for (level = 1, end = start + 1; level > 0; ++end)
+ {
+ if ('\0' == *end)
+ break;
+ else if ('(' == *end)
+ ++ level;
+ else if (')' == *end)
+ -- level;
+ }
+ }
+ else /* if no argument list was found, continue looking for a return value */
+ {
+ start = "()";
+ end = c;
+ }
+
+ /* parse return type if requested by passing a non-NULL vartype argument */
+ if (NULL != vartype)
+ {
+ char *var, *var_start;
+
+ *vartype = NULL;
+
+ if (NULL != (var = strchr(end, ':')))
+ {
+ var++; /* skip ':' */
+ while (isspace((int) *var))
+ ++var;
+
+ if (starttoken(*var))
+ {
+ var_start = var;
+ var++;
+ while (intoken(*var))
+ var++;
+ if (endtoken(*var))
+ {
+ *var = '\0';
+ *vartype = strdup(var_start);
+ }
+ }
+ }
+ }
+
+ *end = '\0';
+ *arglist = strdup(start);
+
+ eFree(c);
+}
+
+
/* Algorithm adapted from from GNU etags.
* Locates tags for procedures & functions. Doesn't do any type- or
* var-definitions. It does look for the keyword "extern" or "forward"
@@ -89,6 +156,8 @@
{
vString *name = vStringNew ();
tagEntryInfo tag;
+ char *arglist = NULL;
+ char *vartype = NULL;
pascalKind kind = K_FUNCTION;
/* each of these flags is TRUE iff: */
boolean incomment = FALSE; /* point is inside a comment */
@@ -208,7 +277,11 @@
for (cp = dbp ; *cp != '\0' && !endtoken (*cp) ; cp++)
continue;
vStringNCopyS (name, (const char*) dbp, cp - dbp);
- createPascalTag (&tag, name, kind);
+ eFree(arglist);
+ if (kind == K_FUNCTION)
+ eFree(vartype);
+ parseArglist((const char*) cp, &arglist, (kind == K_FUNCTION) ? &vartype : NULL);
+ createPascalTag (&tag, name, kind, arglist, vartype);
dbp = cp; /* set dbp to e-o-token */
get_tagname = FALSE;
found_tag = TRUE;
@@ -254,8 +327,11 @@
}
break;
}
- } /* while not eof */
+ } /* while not eof */
}
+ eFree(arglist);
+ eFree(vartype);
+ vStringDelete(name);
}
extern parserDefinition* PascalParser (void)
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