FreeBasic: Update keywords
[geany-mirror.git] / tagmanager / ctags / latex.c
bloba747fc43cf21fd4d387ef52eaba208251465fc63
1 /*
2 * Copyright (c) 2000-2001, Jérôme Plût
3 * Copyright (c) 2006, Enrico Tröger
5 * This source code is released for free distribution under the terms of the
6 * GNU General Public License.
8 * This module contains functions for generating tags for source files
9 * for the TeX formatting system.
13 * INCLUDE FILES
15 #include "general.h" /* must always come first */
17 #include <ctype.h>
18 #include <string.h>
20 #include "parse.h"
21 #include "read.h"
22 #include "vstring.h"
25 * DATA DEFINITIONS
27 typedef enum {
28 K_COMMAND,
29 K_ENVIRONMENT,
30 K_SECTION,
31 K_SUBSECTION,
32 K_SUBSUBSECTION,
33 K_CHAPTER,
34 K_LABEL
35 } TeXKind;
37 static kindOption TeXKinds[] = {
38 { TRUE, 'f', "function", "command definitions" },
39 { TRUE, 'c', "class", "environment definitions" },
40 { TRUE, 'm', "member", "labels, sections and bibliography" },
41 { TRUE, 'd', "macro", "subsections" },
42 { TRUE, 'v', "variable", "subsubsections" },
43 { TRUE, 'n', "namespace", "chapters"},
44 { TRUE, 's', "struct", "labels and bibliography" }
47 #define TEX_BRACES (1<<0)
48 #define TEX_BSLASH (1<<1)
49 #define TEX_LABEL (1<<2)
52 * FUNCTION DEFINITIONS
55 static int getWord(const char * ref, const char **ptr)
57 const char *p = *ptr;
59 while ((*ref != '\0') && (*p != '\0') && (*ref == *p))
60 ref++, p++;
63 if (*ref)
64 return FALSE;
66 if (*p == '*') /* to allow something like \section*{foobar} */
67 p++;
69 *ptr = p;
70 return TRUE;
73 static void createTag(int flags, TeXKind kind, const char * l)
75 vString *name = vStringNew ();
77 while ((*l == ' '))
78 l++;
79 if (flags & (TEX_BRACES | TEX_LABEL))
81 if (*l == '[')
83 while (*l != ']')
85 if (*l == '\0')
86 goto no_tag;
87 l++;
89 l++; /* skip the closing square bracket */
91 if (*l != '{')
92 goto no_tag;
93 l++;
95 if (flags & TEX_BSLASH)
97 if ((*(l++)) != '\\')
98 goto no_tag;
100 if (flags & TEX_LABEL)
104 vStringPut(name, (int) *l);
105 ++l;
106 } while ((*l != '\0') && (*l != '}'));
107 vStringTerminate(name);
108 if (name->buffer[0] != '}')
109 makeSimpleTag(name, TeXKinds, kind);
111 else if (isalpha((int) *l) || *l == '@')
115 vStringPut (name, (int) *l);
116 ++l;
117 } while (isalpha((int) *l) || *l == '@');
118 vStringTerminate(name);
119 makeSimpleTag(name, TeXKinds, kind);
121 else
123 vStringPut(name, (int) *l);
124 vStringTerminate(name);
125 makeSimpleTag(name, TeXKinds, kind);
128 no_tag:
129 vStringDelete(name);
132 static void findTeXTags(void)
134 const char *line;
136 while ((line = (const char*)fileReadLine()) != NULL)
138 const char *cp = line;
139 /*int escaped = 0;*/
141 for (; *cp != '\0'; cp++)
143 if (*cp == '%')
144 break;
145 if (*cp == '\\')
147 cp++;
149 /* \newcommand{\command} */
150 if (getWord("newcommand", &cp)
151 || getWord("providecommand", &cp)
152 || getWord("renewcommand", &cp)
155 createTag (TEX_BRACES|TEX_BSLASH, K_COMMAND, cp);
156 continue;
159 /* \DeclareMathOperator{\command} */
160 else if (getWord("DeclareMathOperator", &cp))
162 if (*cp == '*')
163 cp++;
164 createTag(TEX_BRACES|TEX_BSLASH, K_COMMAND, cp);
165 continue;
168 /* \def\command */
169 else if (getWord("def", &cp))
171 createTag(TEX_BSLASH, K_COMMAND, cp);
172 continue;
175 /* \newenvironment{name} */
176 else if ( getWord("newenvironment", &cp)
177 || getWord("newtheorem", &cp)
178 || getWord("begin", &cp)
181 createTag(TEX_BRACES, K_ENVIRONMENT, cp);
182 continue;
185 /* \bibitem[label]{key} */
186 else if (getWord("bibitem", &cp))
188 while (*cp == ' ')
189 cp++;
190 if (*(cp++) != '[')
191 break;
192 while ((*cp != '\0') && (*cp != ']'))
193 cp++;
194 if (*(cp++) != ']')
195 break;
196 createTag(TEX_LABEL, K_LABEL, cp);
197 continue;
200 /* \label{key} */
201 else if (getWord("label", &cp))
203 createTag(TEX_LABEL, K_LABEL, cp);
204 continue;
206 /* \section{key} */
207 else if (getWord("section", &cp))
209 createTag(TEX_LABEL, K_SECTION, cp);
210 continue;
212 /* \subsection{key} */
213 else if (getWord("subsection", &cp))
215 createTag(TEX_LABEL, K_SUBSECTION, cp);
216 continue;
218 /* \subsubsection{key} */
219 else if (getWord("subsubsection", &cp))
221 createTag(TEX_LABEL, K_SUBSUBSECTION, cp);
222 continue;
224 /* \chapter{key} */
225 else if (getWord("chapter", &cp))
227 createTag(TEX_LABEL, K_CHAPTER, cp);
228 continue;
235 extern parserDefinition* LaTeXParser (void)
237 static const char *const extensions [] = { "tex", "sty", "idx", NULL };
238 parserDefinition * def = parserNew ("LaTeX");
239 def->kinds = TeXKinds;
240 def->kindCount = KIND_COUNT (TeXKinds);
241 def->extensions = extensions;
242 def->parser = findTeXTags;
243 return def;