ctags.rb 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. data/Gemfile +2 -0
  2. data/Rakefile +23 -0
  3. data/ctags.rb.gemspec +23 -0
  4. data/ext/.gitignore +3 -0
  5. data/ext/extconf.rb +15 -0
  6. data/ext/vendor/exuberant-ctags/.gitignore +6 -0
  7. data/ext/vendor/exuberant-ctags/.indent.pro +31 -0
  8. data/ext/vendor/exuberant-ctags/COPYING +340 -0
  9. data/ext/vendor/exuberant-ctags/EXTENDING.html +386 -0
  10. data/ext/vendor/exuberant-ctags/FAQ +371 -0
  11. data/ext/vendor/exuberant-ctags/INSTALL +215 -0
  12. data/ext/vendor/exuberant-ctags/INSTALL.oth +73 -0
  13. data/ext/vendor/exuberant-ctags/MAINTAINERS +88 -0
  14. data/ext/vendor/exuberant-ctags/Makefile.in +222 -0
  15. data/ext/vendor/exuberant-ctags/NEWS +871 -0
  16. data/ext/vendor/exuberant-ctags/README +73 -0
  17. data/ext/vendor/exuberant-ctags/ant.c +42 -0
  18. data/ext/vendor/exuberant-ctags/argproc.c +505 -0
  19. data/ext/vendor/exuberant-ctags/args.c +274 -0
  20. data/ext/vendor/exuberant-ctags/args.h +63 -0
  21. data/ext/vendor/exuberant-ctags/asm.c +387 -0
  22. data/ext/vendor/exuberant-ctags/asp.c +328 -0
  23. data/ext/vendor/exuberant-ctags/awk.c +81 -0
  24. data/ext/vendor/exuberant-ctags/basic.c +203 -0
  25. data/ext/vendor/exuberant-ctags/beta.c +321 -0
  26. data/ext/vendor/exuberant-ctags/c.c +2932 -0
  27. data/ext/vendor/exuberant-ctags/cobol.c +50 -0
  28. data/ext/vendor/exuberant-ctags/config.h.in +277 -0
  29. data/ext/vendor/exuberant-ctags/configure +7704 -0
  30. data/ext/vendor/exuberant-ctags/configure.ac +532 -0
  31. data/ext/vendor/exuberant-ctags/ctags.1 +1186 -0
  32. data/ext/vendor/exuberant-ctags/ctags.h +28 -0
  33. data/ext/vendor/exuberant-ctags/ctags.html +2087 -0
  34. data/ext/vendor/exuberant-ctags/ctags.spec +40 -0
  35. data/ext/vendor/exuberant-ctags/debug.c +113 -0
  36. data/ext/vendor/exuberant-ctags/debug.h +70 -0
  37. data/ext/vendor/exuberant-ctags/descrip.mms +68 -0
  38. data/ext/vendor/exuberant-ctags/dosbatch.c +42 -0
  39. data/ext/vendor/exuberant-ctags/e_amiga.h +24 -0
  40. data/ext/vendor/exuberant-ctags/e_djgpp.h +47 -0
  41. data/ext/vendor/exuberant-ctags/e_mac.h +143 -0
  42. data/ext/vendor/exuberant-ctags/e_msoft.h +76 -0
  43. data/ext/vendor/exuberant-ctags/e_os2.h +37 -0
  44. data/ext/vendor/exuberant-ctags/e_qdos.h +34 -0
  45. data/ext/vendor/exuberant-ctags/e_riscos.h +58 -0
  46. data/ext/vendor/exuberant-ctags/e_vms.h +31 -0
  47. data/ext/vendor/exuberant-ctags/eiffel.c +1352 -0
  48. data/ext/vendor/exuberant-ctags/entry.c +847 -0
  49. data/ext/vendor/exuberant-ctags/entry.h +103 -0
  50. data/ext/vendor/exuberant-ctags/erlang.c +189 -0
  51. data/ext/vendor/exuberant-ctags/flex.c +2243 -0
  52. data/ext/vendor/exuberant-ctags/fortran.c +2197 -0
  53. data/ext/vendor/exuberant-ctags/general.h +127 -0
  54. data/ext/vendor/exuberant-ctags/get.c +669 -0
  55. data/ext/vendor/exuberant-ctags/get.h +50 -0
  56. data/ext/vendor/exuberant-ctags/gnu_regex/.svn/all-wcprops +47 -0
  57. data/ext/vendor/exuberant-ctags/gnu_regex/.svn/entries +112 -0
  58. data/ext/vendor/exuberant-ctags/gnu_regex/.svn/text-base/README.txt.svn-base +5 -0
  59. data/ext/vendor/exuberant-ctags/gnu_regex/.svn/text-base/regcomp.c.svn-base +3818 -0
  60. data/ext/vendor/exuberant-ctags/gnu_regex/.svn/text-base/regex.c.svn-base +74 -0
  61. data/ext/vendor/exuberant-ctags/gnu_regex/.svn/text-base/regex.h.svn-base +575 -0
  62. data/ext/vendor/exuberant-ctags/gnu_regex/.svn/text-base/regex_internal.c.svn-base +1713 -0
  63. data/ext/vendor/exuberant-ctags/gnu_regex/.svn/text-base/regex_internal.h.svn-base +773 -0
  64. data/ext/vendor/exuberant-ctags/gnu_regex/.svn/text-base/regexec.c.svn-base +4338 -0
  65. data/ext/vendor/exuberant-ctags/gnu_regex/README.txt +5 -0
  66. data/ext/vendor/exuberant-ctags/gnu_regex/regcomp.c +3818 -0
  67. data/ext/vendor/exuberant-ctags/gnu_regex/regex.c +74 -0
  68. data/ext/vendor/exuberant-ctags/gnu_regex/regex.h +575 -0
  69. data/ext/vendor/exuberant-ctags/gnu_regex/regex_internal.c +1713 -0
  70. data/ext/vendor/exuberant-ctags/gnu_regex/regex_internal.h +773 -0
  71. data/ext/vendor/exuberant-ctags/gnu_regex/regexec.c +4338 -0
  72. data/ext/vendor/exuberant-ctags/html.c +49 -0
  73. data/ext/vendor/exuberant-ctags/jscript.c +1572 -0
  74. data/ext/vendor/exuberant-ctags/keyword.c +258 -0
  75. data/ext/vendor/exuberant-ctags/keyword.h +34 -0
  76. data/ext/vendor/exuberant-ctags/lisp.c +139 -0
  77. data/ext/vendor/exuberant-ctags/lregex.c +704 -0
  78. data/ext/vendor/exuberant-ctags/lua.c +133 -0
  79. data/ext/vendor/exuberant-ctags/mac.c +273 -0
  80. data/ext/vendor/exuberant-ctags/magic.diff +21 -0
  81. data/ext/vendor/exuberant-ctags/main.c +584 -0
  82. data/ext/vendor/exuberant-ctags/main.h +32 -0
  83. data/ext/vendor/exuberant-ctags/maintainer.mak +476 -0
  84. data/ext/vendor/exuberant-ctags/make.c +217 -0
  85. data/ext/vendor/exuberant-ctags/matlab.c +44 -0
  86. data/ext/vendor/exuberant-ctags/mk_bc3.mak +46 -0
  87. data/ext/vendor/exuberant-ctags/mk_bc5.mak +49 -0
  88. data/ext/vendor/exuberant-ctags/mk_djg.mak +18 -0
  89. data/ext/vendor/exuberant-ctags/mk_manx.mak +65 -0
  90. data/ext/vendor/exuberant-ctags/mk_mingw.mak +31 -0
  91. data/ext/vendor/exuberant-ctags/mk_mpw.mak +130 -0
  92. data/ext/vendor/exuberant-ctags/mk_mvc.mak +40 -0
  93. data/ext/vendor/exuberant-ctags/mk_os2.mak +104 -0
  94. data/ext/vendor/exuberant-ctags/mk_qdos.mak +100 -0
  95. data/ext/vendor/exuberant-ctags/mk_sas.mak +63 -0
  96. data/ext/vendor/exuberant-ctags/mkinstalldirs +40 -0
  97. data/ext/vendor/exuberant-ctags/ocaml.c +1842 -0
  98. data/ext/vendor/exuberant-ctags/options.c +1842 -0
  99. data/ext/vendor/exuberant-ctags/options.h +155 -0
  100. data/ext/vendor/exuberant-ctags/parse.c +677 -0
  101. data/ext/vendor/exuberant-ctags/parse.h +129 -0
  102. data/ext/vendor/exuberant-ctags/parsers.h +63 -0
  103. data/ext/vendor/exuberant-ctags/pascal.c +267 -0
  104. data/ext/vendor/exuberant-ctags/perl.c +382 -0
  105. data/ext/vendor/exuberant-ctags/php.c +237 -0
  106. data/ext/vendor/exuberant-ctags/python.c +771 -0
  107. data/ext/vendor/exuberant-ctags/qdos.c +106 -0
  108. data/ext/vendor/exuberant-ctags/read.c +569 -0
  109. data/ext/vendor/exuberant-ctags/read.h +116 -0
  110. data/ext/vendor/exuberant-ctags/readtags.c +959 -0
  111. data/ext/vendor/exuberant-ctags/readtags.h +252 -0
  112. data/ext/vendor/exuberant-ctags/rexx.c +39 -0
  113. data/ext/vendor/exuberant-ctags/routines.c +891 -0
  114. data/ext/vendor/exuberant-ctags/routines.h +134 -0
  115. data/ext/vendor/exuberant-ctags/ruby.c +408 -0
  116. data/ext/vendor/exuberant-ctags/scheme.c +111 -0
  117. data/ext/vendor/exuberant-ctags/sh.c +115 -0
  118. data/ext/vendor/exuberant-ctags/slang.c +41 -0
  119. data/ext/vendor/exuberant-ctags/sml.c +212 -0
  120. data/ext/vendor/exuberant-ctags/sort.c +230 -0
  121. data/ext/vendor/exuberant-ctags/sort.h +32 -0
  122. data/ext/vendor/exuberant-ctags/source.mak +122 -0
  123. data/ext/vendor/exuberant-ctags/sql.c +2112 -0
  124. data/ext/vendor/exuberant-ctags/strlist.c +281 -0
  125. data/ext/vendor/exuberant-ctags/strlist.h +54 -0
  126. data/ext/vendor/exuberant-ctags/tcl.c +116 -0
  127. data/ext/vendor/exuberant-ctags/tex.c +524 -0
  128. data/ext/vendor/exuberant-ctags/verilog.c +340 -0
  129. data/ext/vendor/exuberant-ctags/vhdl.c +835 -0
  130. data/ext/vendor/exuberant-ctags/vim.c +636 -0
  131. data/ext/vendor/exuberant-ctags/vstring.c +232 -0
  132. data/ext/vendor/exuberant-ctags/vstring.h +85 -0
  133. data/ext/vendor/exuberant-ctags/yacc.c +40 -0
  134. data/lib/ctags/exuberant.rb +45 -0
  135. data/lib/ctags/version.rb +3 -0
  136. data/lib/ctags.rb +6 -0
  137. data/test/test_ctags.rb +24 -0
  138. metadata +233 -0
@@ -0,0 +1,340 @@
1
+ /*
2
+ * $Id: verilog.c 573 2007-06-26 05:41:27Z elliotth $
3
+ *
4
+ * Copyright (c) 2003, Darren Hiebert
5
+ *
6
+ * This source code is released for free distribution under the terms of the
7
+ * GNU General Public License.
8
+ *
9
+ * This module contains functions for generating tags for the Verilog HDL
10
+ * (Hardware Description Language).
11
+ *
12
+ * Language definition documents:
13
+ * http://www.eg.bucknell.edu/~cs320/verilog/verilog-manual.html
14
+ * http://www.sutherland-hdl.com/on-line_ref_guide/vlog_ref_top.html
15
+ * http://www.verilog.com/VerilogBNF.html
16
+ * http://eesun.free.fr/DOC/VERILOG/verilog_manual1.html
17
+ */
18
+
19
+ /*
20
+ * INCLUDE FILES
21
+ */
22
+ #include "general.h" /* must always come first */
23
+
24
+ #include <string.h>
25
+ #include <setjmp.h>
26
+
27
+ #include "debug.h"
28
+ #include "get.h"
29
+ #include "keyword.h"
30
+ #include "parse.h"
31
+ #include "read.h"
32
+ #include "vstring.h"
33
+
34
+ /*
35
+ * DATA DECLARATIONS
36
+ */
37
+ typedef enum eException { ExceptionNone, ExceptionEOF } exception_t;
38
+
39
+ typedef enum {
40
+ K_UNDEFINED = -1,
41
+ K_CONSTANT,
42
+ K_EVENT,
43
+ K_FUNCTION,
44
+ K_MODULE,
45
+ K_NET,
46
+ K_PORT,
47
+ K_REGISTER,
48
+ K_TASK
49
+ } verilogKind;
50
+
51
+ typedef struct {
52
+ const char *keyword;
53
+ verilogKind kind;
54
+ } keywordAssoc;
55
+
56
+ /*
57
+ * DATA DEFINITIONS
58
+ */
59
+ static int Ungetc;
60
+ static int Lang_verilog;
61
+ static jmp_buf Exception;
62
+
63
+ static kindOption VerilogKinds [] = {
64
+ { TRUE, 'c', "constant", "constants (define, parameter, specparam)" },
65
+ { TRUE, 'e', "event", "events" },
66
+ { TRUE, 'f', "function", "functions" },
67
+ { TRUE, 'm', "module", "modules" },
68
+ { TRUE, 'n', "net", "net data types" },
69
+ { TRUE, 'p', "port", "ports" },
70
+ { TRUE, 'r', "register", "register data types" },
71
+ { TRUE, 't', "task", "tasks" }
72
+ };
73
+
74
+ static keywordAssoc VerilogKeywordTable [] = {
75
+ { "`define", K_CONSTANT },
76
+ { "event", K_EVENT },
77
+ { "function", K_FUNCTION },
78
+ { "inout", K_PORT },
79
+ { "input", K_PORT },
80
+ { "integer", K_REGISTER },
81
+ { "module", K_MODULE },
82
+ { "output", K_PORT },
83
+ { "parameter", K_CONSTANT },
84
+ { "real", K_REGISTER },
85
+ { "realtime", K_REGISTER },
86
+ { "reg", K_REGISTER },
87
+ { "specparam", K_CONSTANT },
88
+ { "supply0", K_NET },
89
+ { "supply1", K_NET },
90
+ { "task", K_TASK },
91
+ { "time", K_REGISTER },
92
+ { "tri0", K_NET },
93
+ { "tri1", K_NET },
94
+ { "triand", K_NET },
95
+ { "tri", K_NET },
96
+ { "trior", K_NET },
97
+ { "trireg", K_NET },
98
+ { "wand", K_NET },
99
+ { "wire", K_NET },
100
+ { "wor", K_NET }
101
+ };
102
+
103
+ /*
104
+ * FUNCTION DEFINITIONS
105
+ */
106
+
107
+ static void initialize (const langType language)
108
+ {
109
+ size_t i;
110
+ const size_t count =
111
+ sizeof (VerilogKeywordTable) / sizeof (VerilogKeywordTable [0]);
112
+ Lang_verilog = language;
113
+ for (i = 0 ; i < count ; ++i)
114
+ {
115
+ const keywordAssoc* const p = &VerilogKeywordTable [i];
116
+ addKeyword (p->keyword, language, (int) p->kind);
117
+ }
118
+ }
119
+
120
+ static void vUngetc (int c)
121
+ {
122
+ Assert (Ungetc == '\0');
123
+ Ungetc = c;
124
+ }
125
+
126
+ static int vGetc (void)
127
+ {
128
+ int c;
129
+ if (Ungetc == '\0')
130
+ c = fileGetc ();
131
+ else
132
+ {
133
+ c = Ungetc;
134
+ Ungetc = '\0';
135
+ }
136
+ if (c == '/')
137
+ {
138
+ int c2 = fileGetc ();
139
+ if (c2 == EOF)
140
+ longjmp (Exception, (int) ExceptionEOF);
141
+ else if (c2 == '/') /* strip comment until end-of-line */
142
+ {
143
+ do
144
+ c = fileGetc ();
145
+ while (c != '\n' && c != EOF);
146
+ }
147
+ else if (c2 == '*') /* strip block comment */
148
+ {
149
+ c = skipOverCComment();
150
+ }
151
+ else
152
+ {
153
+ fileUngetc (c2);
154
+ }
155
+ }
156
+ else if (c == '"') /* strip string contents */
157
+ {
158
+ int c2;
159
+ do
160
+ c2 = fileGetc ();
161
+ while (c2 != '"' && c2 != EOF);
162
+ c = '@';
163
+ }
164
+ if (c == EOF)
165
+ longjmp (Exception, (int) ExceptionEOF);
166
+ return c;
167
+ }
168
+
169
+ static boolean isIdentifierCharacter (const int c)
170
+ {
171
+ return (boolean)(isalnum (c) || c == '_' || c == '`');
172
+ }
173
+
174
+ static int skipWhite (int c)
175
+ {
176
+ while (isspace (c))
177
+ c = vGetc ();
178
+ return c;
179
+ }
180
+
181
+ static int skipPastMatch (const char *const pair)
182
+ {
183
+ const int begin = pair [0], end = pair [1];
184
+ int matchLevel = 1;
185
+ int c;
186
+ do
187
+ {
188
+ c = vGetc ();
189
+ if (c == begin)
190
+ ++matchLevel;
191
+ else if (c == end)
192
+ --matchLevel;
193
+ }
194
+ while (matchLevel > 0);
195
+ return vGetc ();
196
+ }
197
+
198
+ static boolean readIdentifier (vString *const name, int c)
199
+ {
200
+ vStringClear (name);
201
+ if (isIdentifierCharacter (c))
202
+ {
203
+ while (isIdentifierCharacter (c))
204
+ {
205
+ vStringPut (name, c);
206
+ c = vGetc ();
207
+ }
208
+ vUngetc (c);
209
+ vStringTerminate (name);
210
+ }
211
+ return (boolean)(name->length > 0);
212
+ }
213
+
214
+ static void tagNameList (const verilogKind kind, int c)
215
+ {
216
+ vString *name = vStringNew ();
217
+ boolean repeat;
218
+ Assert (isIdentifierCharacter (c));
219
+ do
220
+ {
221
+ repeat = FALSE;
222
+ if (isIdentifierCharacter (c))
223
+ {
224
+ readIdentifier (name, c);
225
+ makeSimpleTag (name, VerilogKinds, kind);
226
+ }
227
+ else
228
+ break;
229
+ c = skipWhite (vGetc ());
230
+ if (c == '[')
231
+ c = skipPastMatch ("[]");
232
+ c = skipWhite (c);
233
+ if (c == '=')
234
+ {
235
+ if (c == '{')
236
+ skipPastMatch ("{}");
237
+ else
238
+ {
239
+ do
240
+ c = vGetc ();
241
+ while (c != ',' && c != ';');
242
+ }
243
+ }
244
+ if (c == ',')
245
+ {
246
+ c = skipWhite (vGetc ());
247
+ repeat = TRUE;
248
+ }
249
+ else
250
+ repeat = FALSE;
251
+ } while (repeat);
252
+ vStringDelete (name);
253
+ vUngetc (c);
254
+ }
255
+
256
+ static void findTag (vString *const name)
257
+ {
258
+ const verilogKind kind = (verilogKind) lookupKeyword (vStringValue (name), Lang_verilog);
259
+ if (kind == K_CONSTANT && vStringItem (name, 0) == '`')
260
+ {
261
+ /* Bug #961001: Verilog compiler directives are line-based. */
262
+ int c = skipWhite (vGetc ());
263
+ readIdentifier (name, c);
264
+ makeSimpleTag (name, VerilogKinds, kind);
265
+ /* Skip the rest of the line. */
266
+ do {
267
+ c = vGetc();
268
+ } while (c != '\n');
269
+ vUngetc (c);
270
+ }
271
+ else if (kind != K_UNDEFINED)
272
+ {
273
+ int c = skipWhite (vGetc ());
274
+
275
+ /* Many keywords can have bit width.
276
+ * reg [3:0] net_name;
277
+ * inout [(`DBUSWIDTH-1):0] databus;
278
+ */
279
+ if (c == '(')
280
+ c = skipPastMatch ("()");
281
+ c = skipWhite (c);
282
+ if (c == '[')
283
+ c = skipPastMatch ("[]");
284
+ c = skipWhite (c);
285
+ if (c == '#')
286
+ {
287
+ c = vGetc ();
288
+ if (c == '(')
289
+ c = skipPastMatch ("()");
290
+ }
291
+ c = skipWhite (c);
292
+ if (isIdentifierCharacter (c))
293
+ tagNameList (kind, c);
294
+ }
295
+ }
296
+
297
+ static void findVerilogTags (void)
298
+ {
299
+ vString *const name = vStringNew ();
300
+ volatile boolean newStatement = TRUE;
301
+ volatile int c = '\0';
302
+ exception_t exception = (exception_t) setjmp (Exception);
303
+
304
+ if (exception == ExceptionNone) while (c != EOF)
305
+ {
306
+ c = vGetc ();
307
+ switch (c)
308
+ {
309
+ case ';':
310
+ case '\n':
311
+ newStatement = TRUE;
312
+ break;
313
+
314
+ case ' ':
315
+ case '\t':
316
+ break;
317
+
318
+ default:
319
+ if (newStatement && readIdentifier (name, c))
320
+ findTag (name);
321
+ newStatement = FALSE;
322
+ break;
323
+ }
324
+ }
325
+ vStringDelete (name);
326
+ }
327
+
328
+ extern parserDefinition* VerilogParser (void)
329
+ {
330
+ static const char *const extensions [] = { "v", NULL };
331
+ parserDefinition* def = parserNew ("Verilog");
332
+ def->kinds = VerilogKinds;
333
+ def->kindCount = KIND_COUNT (VerilogKinds);
334
+ def->extensions = extensions;
335
+ def->parser = findVerilogTags;
336
+ def->initialize = initialize;
337
+ return def;
338
+ }
339
+
340
+ /* vi:set tabstop=4 shiftwidth=4: */