xref: /Universal-ctags/main/tokeninfo.h (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 */
9c905c114SMasatake YAMATO 
10c905c114SMasatake YAMATO #include "general.h"  /* must always come first */
11c905c114SMasatake YAMATO #include "mio.h"
12c905c114SMasatake YAMATO #include "objpool.h"
13c905c114SMasatake YAMATO #include "vstring.h"
14c905c114SMasatake YAMATO 
15c905c114SMasatake YAMATO #ifndef CTAGS_MAIN_TOKEN_H
16c905c114SMasatake YAMATO #define CTAGS_MAIN_TOKEN_H
17c905c114SMasatake YAMATO 
18c905c114SMasatake YAMATO struct tokenClass;
19c905c114SMasatake YAMATO struct tokenTypePair;
20c905c114SMasatake YAMATO 
21c905c114SMasatake YAMATO typedef short tokenType;
22c905c114SMasatake YAMATO typedef short tokenKeyword;
23c905c114SMasatake YAMATO 
24c905c114SMasatake YAMATO typedef struct sTokenInfo {
25c27e1a5fSMasatake YAMATO 	tokenType type;
26c27e1a5fSMasatake YAMATO 	tokenKeyword keyword;
27c27e1a5fSMasatake YAMATO 	vString *string;
28c27e1a5fSMasatake YAMATO 	struct tokenInfoClass *klass;
29c27e1a5fSMasatake YAMATO 	unsigned long lineNumber;
30c27e1a5fSMasatake YAMATO 	MIOPos filePosition;
31c905c114SMasatake YAMATO } tokenInfo;
32c905c114SMasatake YAMATO 
33c905c114SMasatake YAMATO struct tokenTypePair {
34c905c114SMasatake YAMATO 	tokenType start;
35c905c114SMasatake YAMATO 	tokenType end;
36c905c114SMasatake YAMATO };
37c905c114SMasatake YAMATO 
38c905c114SMasatake YAMATO #define TOKEN(X)  ((tokenInfo *)X)
39c905c114SMasatake YAMATO 
40c905c114SMasatake YAMATO struct tokenInfoClass {
41c905c114SMasatake YAMATO 	unsigned int nPreAlloc;
42c905c114SMasatake YAMATO 	tokenType typeForUndefined;
43c905c114SMasatake YAMATO 	tokenKeyword keywordNone;
44c905c114SMasatake YAMATO 	tokenType typeForKeyword;
45c905c114SMasatake YAMATO 	tokenType typeForEOF;
46c905c114SMasatake YAMATO 	size_t extraSpace;
47c905c114SMasatake YAMATO 	struct tokenTypePair   *pairs;
48c905c114SMasatake YAMATO 	unsigned int        pairCount;
49c3a18775SMasatake YAMATO 	void (*init)   (tokenInfo *token, void *data);
50c905c114SMasatake YAMATO 	void (*read)   (tokenInfo *token, void *data);
51c905c114SMasatake YAMATO 	void (*clear)  (tokenInfo *token);
52a203ce0eSMasatake YAMATO 	void (*delete) (tokenInfo *token);
53c905c114SMasatake YAMATO 	void (*copy)   (tokenInfo *dest, tokenInfo *src, void *data);
54c905c114SMasatake YAMATO 	objPool *pool;
55c905c114SMasatake YAMATO 	ptrArray *backlog;
56*982cab14SMasatake YAMATO 
57*982cab14SMasatake YAMATO 	/* read_counter is incremented every time when reading a
58*982cab14SMasatake YAMATO 	 * new token from the input stream unless the new token is EOF.
59*982cab14SMasatake YAMATO 	 *
60*982cab14SMasatake YAMATO 	 * When filling a tokenInfo from an entry in the backlog, we don't
61*982cab14SMasatake YAMATO 	 * regard it as "reading a new token".
62*982cab14SMasatake YAMATO 	 */
63*982cab14SMasatake YAMATO 	int read_counter;
64c905c114SMasatake YAMATO };
65c905c114SMasatake YAMATO 
66c905c114SMasatake YAMATO void *newToken       (struct tokenInfoClass *klass);
67c3a18775SMasatake YAMATO void *newTokenFull   (struct tokenInfoClass *klass, void *data);
68b1a50b09SMasatake YAMATO void *newTokenByCopying (tokenInfo *src);
69b1a50b09SMasatake YAMATO void *newTokenByCopyingFull (tokenInfo *src, void *data);
70b1a50b09SMasatake YAMATO 
71c905c114SMasatake YAMATO void  flashTokenBacklog (struct tokenInfoClass *klass);
72a203ce0eSMasatake YAMATO void  tokenDelete    (tokenInfo *token);
73c905c114SMasatake YAMATO 
74c905c114SMasatake YAMATO void tokenReadFull   (tokenInfo *token, void *data);
75c905c114SMasatake YAMATO void tokenRead       (tokenInfo *token);
76c905c114SMasatake YAMATO void tokenUnreadFull (tokenInfo *token, void *data); /* DATA passed to copy method internally. */
77c905c114SMasatake YAMATO void tokenUnread     (tokenInfo *token);
78c905c114SMasatake YAMATO 
79c905c114SMasatake YAMATO 
80c905c114SMasatake YAMATO void tokenCopyFull   (tokenInfo *dest, tokenInfo *src, void *data);
81c905c114SMasatake YAMATO void tokenCopy       (tokenInfo *dest, tokenInfo *src);
82c905c114SMasatake YAMATO 
83c905c114SMasatake YAMATO /* Helper macro & functions */
84c905c114SMasatake YAMATO 
85d9d9244eSMasatake YAMATO #define tokenIsType(TKN,T)     ((TKN)->type == TOKEN_##T)
86f75fe7abSMasatake YAMATO #define tokenIsTypeVal(TKN,TV)   ((TKN)->type == (TV))
87d9d9244eSMasatake YAMATO #define tokenIsKeyword(TKN,K)  ((TKN)->type == TKN->klass->typeForKeyword \
88c905c114SMasatake YAMATO 									&& (TKN)->keyword == KEYWORD_##K)
89d9d9244eSMasatake YAMATO #define tokenIsEOF(TKN)      ((TKN)->type == (TKN)->klass->typeForEOF)
90c905c114SMasatake YAMATO 
912fe47fcaSMasatake YAMATO #define tokenString(TKN)       (vStringValue ((TKN)->string))
922fe47fcaSMasatake YAMATO #define tokenPutc(TKN,C)       (vStringPut ((TKN)->string, C))
938d8245daSMasatake YAMATO #define tokenCat(TKN,VS)       (vStringCat ((TKN)->string, VS))
945d44714dSMasatake YAMATO #define tokenCatS(TKN,S)       (vStringCatS ((TKN)->string, S))
958d8245daSMasatake YAMATO #define tokenLast(TKN)         (vStringIsEmpty((TKN)->string)? '\0': vStringLast((TKN)->string))
96c905c114SMasatake YAMATO 
97c905c114SMasatake YAMATO /* return true if t is found. In that case token holds an
98c905c114SMasatake YAMATO    language object type t.
99c905c114SMasatake YAMATO    return false if it reaches EOF. */
100c905c114SMasatake YAMATO bool tokenSkipToType (tokenInfo *token, tokenType t);
1014db94732SMasatake YAMATO bool tokenSkipToTypeFull (tokenInfo *token, tokenType t, void *data);
102c905c114SMasatake YAMATO bool tokenSkipOverPair (tokenInfo *token);
1034db94732SMasatake YAMATO bool tokenSkipOverPairFull (tokenInfo *token, void *data);
104c905c114SMasatake YAMATO 
105c905c114SMasatake YAMATO #endif
106