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