2 * Copyright (c) 2000-2003, Darren Hiebert
4 * This source code is released for free distribution under the terms of the
5 * GNU General Public License version 2 or (at your option) any later version.
7 * This module contains functions for generating tags for TCL scripts.
13 #include "general.h" /* must always come first */
26 K_CLASS
, K_METHOD
, K_PROCEDURE
, K_MODULE
29 static kindOption TclKinds
[] = {
30 { true, 'c', "class", "classes" },
31 { true, 'm', "method", "methods" },
32 { true, 'p', "procedure", "procedures" },
33 { true, 'n', "module", "modules" }
37 * FUNCTION DEFINITIONS
40 static const unsigned char *makeTclTag (
41 const unsigned char *cp
,
46 while ((int) *cp
!= '\0' && ! isspace ((int) *cp
))
48 vStringPut (name
, (int) *cp
);
51 makeSimpleTag (name
, TclKinds
, kind
);
55 static bool match (const unsigned char *line
, const char *word
)
57 size_t len
= strlen (word
);
58 bool matched
= (strncmp ((const char*) line
, word
, len
) == 0);
62 /* check that the word is followed by a space to avoid detecting something
63 * like "proc_new ..." */
64 matched
= isspace (*(line
+ len
));
69 static void findTclTags (void)
71 vString
*name
= vStringNew ();
72 const unsigned char *line
;
74 while ((line
= readLineFromInputFile ()) != NULL
)
76 const unsigned char *cp
;
78 while (isspace (line
[0]))
81 if (line
[0] == '\0' || line
[0] == '#')
85 for (cp
= line
; *cp
!= '\0' && ! isspace ((int) *cp
) ; ++cp
)
87 if (! isspace ((int) *cp
))
89 while (isspace ((int) *cp
))
91 /* Now `line' points at first word and `cp' points at next word */
93 if (match (line
, "proc"))
94 cp
= makeTclTag (cp
, name
, K_PROCEDURE
);
95 else if (match (line
, "class") || match (line
, "itcl::class"))
96 cp
= makeTclTag (cp
, name
, K_CLASS
);
97 else if (match (line
, "public") ||
98 match (line
, "protected") ||
99 match (line
, "private"))
101 if (match (cp
, "method"))
104 while (isspace ((int) *cp
))
106 cp
= makeTclTag (cp
, name
, K_METHOD
);
109 else if (match (line
, "method"))
111 cp
= makeTclTag (cp
, name
, K_METHOD
);
113 else if (match (line
, "oo::class") ) {
114 if (match (cp
, "create"))
117 while (isspace ((int) *cp
))
119 cp
= makeTclTag (cp
, name
, K_CLASS
);
122 else if (match (line
, "namespace") ) {
123 if (match (cp
, "eval"))
126 while (isspace ((int) *cp
))
128 cp
= makeTclTag (cp
, name
, K_MODULE
);
133 vStringDelete (name
);
136 extern parserDefinition
* TclParser (void)
138 static const char *const extensions
[] = { "tcl", "tk", "wish", "itcl", NULL
};
139 parserDefinition
* def
= parserNew ("Tcl");
140 def
->kinds
= TclKinds
;
141 def
->kindCount
= ARRAY_SIZE (TclKinds
);
142 def
->extensions
= extensions
;
143 def
->parser
= findTclTags
;