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.
7 * This module contains functions for generating tags for TCL scripts.
13 #include "general.h" /* must always come first */
25 K_CLASS
, K_METHOD
, K_PROCEDURE
, K_MODULE
28 static kindOption TclKinds
[] = {
29 { TRUE
, 'c', "class", "classes" },
30 { TRUE
, 'f', "member", "methods" },
31 { TRUE
, 'p', "function", "procedures" },
32 { TRUE
, 'm', "namespace", "modules" }
36 * FUNCTION DEFINITIONS
39 static const unsigned char *makeTclTag (
40 const unsigned char *cp
,
45 while ((int) *cp
!= '\0' && ! isspace ((int) *cp
))
47 vStringPut (name
, (int) *cp
);
50 vStringTerminate (name
);
51 makeSimpleTag (name
, TclKinds
, kind
);
55 static boolean
match (const unsigned char *line
, const char *word
)
57 size_t len
= strlen (word
);
58 boolean 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
= fileReadLine ()) != 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
= KIND_COUNT (TclKinds
);
142 def
->extensions
= extensions
;
143 def
->parser
= findTclTags
;
147 /* vi:set tabstop=4 shiftwidth=4: */