SF.net SVN: geany:[3410] trunk
ntrel at users.sourceforge.net
ntrel at xxxxx
Sun Dec 21 12:32:25 UTC 2008
Revision: 3410
http://geany.svn.sourceforge.net/geany/?rev=3410&view=rev
Author: ntrel
Date: 2008-12-21 12:32:25 +0000 (Sun, 21 Dec 2008)
Log Message:
-----------
Parse sections in the order of first-used underline character,
which can now be any punctuation character (as per the spec).
Modified Paths:
--------------
trunk/ChangeLog
trunk/tagmanager/rest.c
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2008-12-19 18:11:54 UTC (rev 3409)
+++ trunk/ChangeLog 2008-12-21 12:32:25 UTC (rev 3410)
@@ -1,3 +1,10 @@
+2008-12-21 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>
+
+ * tagmanager/rest.c:
+ Parse sections in the order of first-used underline character,
+ which can now be any punctuation character (as per the spec).
+
+
2008-12-19 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>
* src/symbols.c, tagmanager/fortran.c:
Modified: trunk/tagmanager/rest.c
===================================================================
--- trunk/tagmanager/rest.c 2008-12-19 18:11:54 UTC (rev 3409)
+++ trunk/tagmanager/rest.c 2008-12-21 12:32:25 UTC (rev 3410)
@@ -24,10 +24,11 @@
* DATA DEFINITIONS
*/
typedef enum {
- K_CHAPTER,
+ K_CHAPTER = 0,
K_SECTION,
K_SUBSECTION,
- K_SUBSUBSECTION
+ K_SUBSUBSECTION,
+ SECTION_COUNT
} restKind;
static kindOption RestKinds[] = {
@@ -37,6 +38,8 @@
{ TRUE, 'v', "variable", "subsubsections" }
};
+static char kindchars[SECTION_COUNT];
+
/*
* FUNCTION DEFINITIONS
*/
@@ -57,40 +60,69 @@
}
}
-/* TODO: Parse any section with ispunct() underlining, in the order of first use.
- * Also parse overlining & underlining as higher-level sections. */
+
+/* checks if str is all the same character */
+static boolean issame(const char *str)
+{
+ char first = *str;
+
+ while (*str)
+ {
+ char c;
+
+ str++;
+ c = *str;
+ if (c && c != first)
+ return FALSE;
+ }
+ return TRUE;
+}
+
+
+static int get_kind(char c)
+{
+ int i;
+
+ for (i = 0; i < SECTION_COUNT; i++)
+ {
+ if (kindchars[i] == c)
+ return i;
+
+ if (kindchars[i] == 0)
+ {
+ kindchars[i] = c;
+ return i;
+ }
+ }
+ return -1;
+}
+
+
+/* TODO: parse overlining & underlining as distinct sections. */
static void findRestTags (void)
{
vString *name = vStringNew ();
const unsigned char *line;
+ memset(kindchars, 0, sizeof kindchars);
+
while ((line = fileReadLine ()) != NULL)
{
int line_len = strlen((const char*) line);
+ int name_len = vStringLength(name);
- if (line_len >= 3 && vStringLength(name) > 0 &&
- ! strstr((const char*) line, " ")) /* don't parse table borders */
+ /* underlines must be the same length or more */
+ if (line_len >= name_len && name_len > 0 &&
+ ispunct(line[0]) && issame((const char*) line))
{
- if (strncmp((const char*) line, "===", 3) == 0)
+ char c = line[0];
+ int kind = get_kind(c);
+
+ if (kind >= 0)
{
- makeRestTag(name, RestKinds, K_CHAPTER);
+ makeRestTag(name, RestKinds, kind);
continue;
}
- else if (strncmp((const char*) line, "---", 3) == 0)
- {
- makeRestTag(name, RestKinds, K_SECTION);
- continue;
- }
- else if (strncmp((const char*) line, "^^^", 3) == 0)
- {
- makeRestTag(name, RestKinds, K_SUBSECTION);
- continue;
- }
- else if (strncmp((const char*) line, "```", 3) == 0)
- {
- makeRestTag(name, RestKinds, K_SUBSUBSECTION);
- continue;
- }
}
vStringClear (name);
if (! isspace(*line))
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