xref: /Universal-ctags/main/tokeninfo.c (revision 982cab14ce439abc13f338f873b0a4989e514d8c)
1c905c114SMasatake YAMATO /*
2c905c114SMasatake YAMATO *   Copyright (c) 2016, Masatake YAMATO <yamato@redhat.com>
3c905c114SMasatake YAMATO *   Copyright (c) 2016, Red Hat, Inc.
4c905c114SMasatake YAMATO *
5c905c114SMasatake YAMATO *   This source code is released for free distribution under the terms of the
6c905c114SMasatake YAMATO *   GNU General Public License version 2 or (at your option) any later version.
7c905c114SMasatake YAMATO *
8c905c114SMasatake YAMATO *   This module contains functions for generating tags for Python language
9c905c114SMasatake YAMATO *   files.
10c905c114SMasatake YAMATO */
11c905c114SMasatake YAMATO 
12edfd5352SMasatake YAMATO #include "general.h"
13c905c114SMasatake YAMATO #include "tokeninfo.h"
14c905c114SMasatake YAMATO 
15c905c114SMasatake YAMATO #include "entry.h"
16c905c114SMasatake YAMATO #include "read.h"
17c905c114SMasatake YAMATO #include "routines.h"
18c905c114SMasatake YAMATO 
createToken(void * createArg)19c905c114SMasatake YAMATO static void* createToken (void *createArg)
20c905c114SMasatake YAMATO {
21c905c114SMasatake YAMATO 	struct tokenInfoClass *klass = createArg;
22c905c114SMasatake YAMATO 	tokenInfo *token;
23c905c114SMasatake YAMATO 
2423bf787cSMasatake YAMATO 	token = eCalloc (1, sizeof (*token) + klass->extraSpace);
25c905c114SMasatake YAMATO 	token->klass = klass;
26c905c114SMasatake YAMATO 	token->string  = vStringNew ();
27c905c114SMasatake YAMATO 
28c905c114SMasatake YAMATO 	return token;
29c905c114SMasatake YAMATO }
30c905c114SMasatake YAMATO 
clearToken(void * data)31c905c114SMasatake YAMATO static void clearToken (void *data)
32c905c114SMasatake YAMATO {
33c905c114SMasatake YAMATO 	tokenInfo *token = data;
34c905c114SMasatake YAMATO 
35c905c114SMasatake YAMATO 	if (token->klass->clear)
36c905c114SMasatake YAMATO 		token->klass->clear (token);
37c905c114SMasatake YAMATO 
38f93e2ce0SMasatake YAMATO 	token->type = token->klass->typeForUndefined;
39c905c114SMasatake YAMATO 	token->keyword = token->klass->keywordNone;
40c905c114SMasatake YAMATO 	vStringClear (token->string);
41c905c114SMasatake YAMATO 	token->lineNumber = getInputLineNumber ();
42c905c114SMasatake YAMATO 	token->filePosition = getInputFilePosition ();
43c905c114SMasatake YAMATO }
44c905c114SMasatake YAMATO 
deleteToken(void * data)45a203ce0eSMasatake YAMATO static void deleteToken (void *data)
46c905c114SMasatake YAMATO {
47c905c114SMasatake YAMATO 	tokenInfo *token = data;
48c905c114SMasatake YAMATO 
49a203ce0eSMasatake YAMATO 	if (token->klass->delete)
50a203ce0eSMasatake YAMATO 		token->klass->delete (token);
51c905c114SMasatake YAMATO 
52c905c114SMasatake YAMATO 	vStringDelete (token->string);
53c905c114SMasatake YAMATO 	eFree (token);
54c905c114SMasatake YAMATO }
55c905c114SMasatake YAMATO 
newToken(struct tokenInfoClass * klass)56c905c114SMasatake YAMATO void *newToken (struct tokenInfoClass *klass)
57c905c114SMasatake YAMATO {
58c3a18775SMasatake YAMATO 	return newTokenFull (klass, NULL);
59c3a18775SMasatake YAMATO }
60c3a18775SMasatake YAMATO 
newTokenFull(struct tokenInfoClass * klass,void * data)61c3a18775SMasatake YAMATO void *newTokenFull (struct tokenInfoClass *klass, void *data)
62c3a18775SMasatake YAMATO {
63c905c114SMasatake YAMATO 	tokenInfo *token = NULL;
64c905c114SMasatake YAMATO 
65c905c114SMasatake YAMATO 	if (klass->nPreAlloc == 0)
66c905c114SMasatake YAMATO 		klass->nPreAlloc = 16;
67c905c114SMasatake YAMATO 
68c905c114SMasatake YAMATO  retry:
69c905c114SMasatake YAMATO 	if (klass->pool)
70c905c114SMasatake YAMATO 		token = objPoolGet (klass->pool);
71c905c114SMasatake YAMATO 	else
72c905c114SMasatake YAMATO 	{
73c905c114SMasatake YAMATO 		klass->pool = objPoolNew (klass->nPreAlloc,
74c905c114SMasatake YAMATO 					  createToken,
75a203ce0eSMasatake YAMATO 					  deleteToken,
76c905c114SMasatake YAMATO 					  clearToken,
77c905c114SMasatake YAMATO 					  klass);
78c905c114SMasatake YAMATO 		goto retry;
79c905c114SMasatake YAMATO 	}
80c905c114SMasatake YAMATO 
81c3a18775SMasatake YAMATO 	if (klass->init)
82c3a18775SMasatake YAMATO 		klass->init (token, data);
83c905c114SMasatake YAMATO 	return token;
84c905c114SMasatake YAMATO }
85c905c114SMasatake YAMATO 
flashTokenBacklog(struct tokenInfoClass * klass)86c905c114SMasatake YAMATO void  flashTokenBacklog (struct tokenInfoClass *klass)
87c905c114SMasatake YAMATO {
8891b0515aSMasatake YAMATO 	if (klass->backlog)
89c905c114SMasatake YAMATO 		ptrArrayClear (klass->backlog);
90c905c114SMasatake YAMATO }
91c905c114SMasatake YAMATO 
tokenDelete(tokenInfo * token)92a203ce0eSMasatake YAMATO void tokenDelete (tokenInfo *token)
93c905c114SMasatake YAMATO {
94c905c114SMasatake YAMATO 	objPoolPut (token->klass->pool, token);
95c905c114SMasatake YAMATO }
96c905c114SMasatake YAMATO 
97c905c114SMasatake YAMATO 
tokenReadFull(tokenInfo * token,void * data)98c905c114SMasatake YAMATO void tokenReadFull (tokenInfo *token, void *data)
99c905c114SMasatake YAMATO {
100c905c114SMasatake YAMATO 	if (!token->klass->backlog)
101a203ce0eSMasatake YAMATO 		token->klass->backlog = ptrArrayNew ((ptrArrayDeleteFunc)tokenDelete);
102c905c114SMasatake YAMATO 
103c905c114SMasatake YAMATO 	if (ptrArrayCount (token->klass->backlog) > 0)
104c905c114SMasatake YAMATO 	{
105c905c114SMasatake YAMATO 		tokenInfo *backlog = ptrArrayLast (token->klass->backlog);
106c905c114SMasatake YAMATO 		tokenCopyFull (token, backlog, data);
107c905c114SMasatake YAMATO 		ptrArrayRemoveLast (token->klass->backlog);
108a203ce0eSMasatake YAMATO 		tokenDelete (backlog);
109c905c114SMasatake YAMATO 	}
110c905c114SMasatake YAMATO 	else
111*982cab14SMasatake YAMATO 	{
112c905c114SMasatake YAMATO 		token->klass->read (token, data);
113*982cab14SMasatake YAMATO 		if (!tokenIsEOF (token))
114*982cab14SMasatake YAMATO 			token->klass->read_counter++;
115*982cab14SMasatake YAMATO 	}
116c905c114SMasatake YAMATO }
117c905c114SMasatake YAMATO 
tokenRead(tokenInfo * token)118c905c114SMasatake YAMATO void tokenRead (tokenInfo *token)
119c905c114SMasatake YAMATO {
120c905c114SMasatake YAMATO 	tokenReadFull (token, NULL);
121c905c114SMasatake YAMATO }
122c905c114SMasatake YAMATO 
tokenCopyFull(tokenInfo * dest,tokenInfo * src,void * data)123c905c114SMasatake YAMATO void tokenCopyFull  (tokenInfo *dest, tokenInfo *src, void *data)
124c905c114SMasatake YAMATO {
125c905c114SMasatake YAMATO 	dest->lineNumber = src->lineNumber;
126c905c114SMasatake YAMATO 	dest->filePosition = src->filePosition;
127c905c114SMasatake YAMATO 	dest->type = src->type;
128c905c114SMasatake YAMATO 	dest->keyword = src->keyword;
129c905c114SMasatake YAMATO 	/* klass */
130c905c114SMasatake YAMATO 	vStringCopy(dest->string, src->string);
131c905c114SMasatake YAMATO 	if (src->klass->copy)
132c905c114SMasatake YAMATO 		src->klass->copy (dest, src, data);
133c905c114SMasatake YAMATO }
134c905c114SMasatake YAMATO 
tokenCopy(tokenInfo * dest,tokenInfo * src)135c905c114SMasatake YAMATO void tokenCopy      (tokenInfo *dest, tokenInfo *src)
136c905c114SMasatake YAMATO {
137c905c114SMasatake YAMATO 	tokenCopyFull (dest, src, NULL);
138c905c114SMasatake YAMATO }
139c905c114SMasatake YAMATO 
newTokenByCopying(tokenInfo * src)140b1a50b09SMasatake YAMATO void *newTokenByCopying (tokenInfo *src)
141b1a50b09SMasatake YAMATO {
142b1a50b09SMasatake YAMATO 	return newTokenByCopyingFull (src, NULL);
143b1a50b09SMasatake YAMATO }
144b1a50b09SMasatake YAMATO 
newTokenByCopyingFull(tokenInfo * src,void * data)145b1a50b09SMasatake YAMATO void *newTokenByCopyingFull (tokenInfo *src, void *data)
146b1a50b09SMasatake YAMATO {
147b1a50b09SMasatake YAMATO 	void * dest = newToken (src->klass);
148b1a50b09SMasatake YAMATO 	tokenCopyFull (dest, src, data);
149b1a50b09SMasatake YAMATO 	return dest;
150b1a50b09SMasatake YAMATO }
151b1a50b09SMasatake YAMATO 
tokenSkipToTypeFull(tokenInfo * token,tokenType t,void * data)1524db94732SMasatake YAMATO bool tokenSkipToTypeFull (tokenInfo *token, tokenType t, void *data)
153c905c114SMasatake YAMATO {
154d9d9244eSMasatake YAMATO 	while (! (tokenIsEOF (token)
155c905c114SMasatake YAMATO 			  || token->type == t))
1564db94732SMasatake YAMATO 		tokenReadFull (token, data);
157c905c114SMasatake YAMATO 
158c905c114SMasatake YAMATO 	return (token->type == t)? true: false;
159c905c114SMasatake YAMATO }
160c905c114SMasatake YAMATO 
tokenSkipToType(tokenInfo * token,tokenType t)1614db94732SMasatake YAMATO bool tokenSkipToType (tokenInfo *token, tokenType t)
1624db94732SMasatake YAMATO {
1634db94732SMasatake YAMATO 	return tokenSkipToTypeFull (token, t, NULL);
1644db94732SMasatake YAMATO }
1654db94732SMasatake YAMATO 
tokenUnreadFull(tokenInfo * token,void * data)166c905c114SMasatake YAMATO void tokenUnreadFull (tokenInfo *token, void *data)
167c905c114SMasatake YAMATO {
168c905c114SMasatake YAMATO 	tokenInfo *backlog;
169c905c114SMasatake YAMATO 
170c905c114SMasatake YAMATO 	if (!token->klass->backlog)
171a203ce0eSMasatake YAMATO 		token->klass->backlog = ptrArrayNew ((ptrArrayDeleteFunc)tokenDelete);
172c905c114SMasatake YAMATO 
173c905c114SMasatake YAMATO 	backlog = newToken (token->klass);
174c905c114SMasatake YAMATO 	tokenCopyFull (backlog, token, data);
175c905c114SMasatake YAMATO 	ptrArrayAdd (token->klass->backlog, backlog);
176c905c114SMasatake YAMATO }
177c905c114SMasatake YAMATO 
tokenUnread(tokenInfo * token)178c905c114SMasatake YAMATO void tokenUnread      (tokenInfo *token)
179c905c114SMasatake YAMATO {
180c905c114SMasatake YAMATO 	tokenUnreadFull (token, NULL);
181c905c114SMasatake YAMATO }
182c905c114SMasatake YAMATO 
tokenSkipOverPair(tokenInfo * token)183c905c114SMasatake YAMATO bool tokenSkipOverPair (tokenInfo *token)
184c905c114SMasatake YAMATO {
1854db94732SMasatake YAMATO 	return tokenSkipOverPairFull(token, NULL);
1864db94732SMasatake YAMATO }
187723fd0d8SMasatake YAMATO 
tokenSkipOverPairFull(tokenInfo * token,void * data)1884db94732SMasatake YAMATO bool tokenSkipOverPairFull (tokenInfo *token, void *data)
1894db94732SMasatake YAMATO {
190c905c114SMasatake YAMATO 	int start = token->type;
191c905c114SMasatake YAMATO 	int end = token->klass->typeForUndefined;
19246ab94ccSMasatake YAMATO 	unsigned int i;
193c905c114SMasatake YAMATO 
194c905c114SMasatake YAMATO 	for (i = 0; i < token->klass->pairCount; i++)
195c905c114SMasatake YAMATO 		if (start == token->klass->pairs[i].start)
196c905c114SMasatake YAMATO 			end = token->klass->pairs[i].end;
197c905c114SMasatake YAMATO 
198c905c114SMasatake YAMATO 	if (end == token->klass->typeForUndefined)
199c905c114SMasatake YAMATO 		return false;
200c905c114SMasatake YAMATO 
201c905c114SMasatake YAMATO 	int depth = 1;
202c905c114SMasatake YAMATO 	do {
2034db94732SMasatake YAMATO 		tokenReadFull (token, data);
204c905c114SMasatake YAMATO 		if (token->type == start)
205c905c114SMasatake YAMATO 			depth ++;
206c905c114SMasatake YAMATO 		else if (token->type == end)
207c905c114SMasatake YAMATO 			depth--;
208d9d9244eSMasatake YAMATO 	} while ((!tokenIsEOF(token)) && (depth > 0));
209c905c114SMasatake YAMATO 
210c905c114SMasatake YAMATO 	return (depth == 0)? true: false;
211c905c114SMasatake YAMATO }
212