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