blob: 0209eb172dbd8fc90483adca00d28b1e7783c58c (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
#include <antlr3input.h>
#include <antlr3commontoken.h>
#include <antlr3interfaces.h>
#include "bounded_token_factory.h"
namespace CVC4 {
namespace parser {
static pANTLR3_COMMON_TOKEN
newPoolToken(pANTLR3_TOKEN_FACTORY factory);
static void
setInputStream (pANTLR3_TOKEN_FACTORY factory, pANTLR3_INPUT_STREAM input);
static void
factoryClose (pANTLR3_TOKEN_FACTORY factory);
pANTLR3_TOKEN_FACTORY
BoundedTokenFactoryNew(pANTLR3_INPUT_STREAM input,ANTLR3_UINT32 size)
{
pANTLR3_TOKEN_FACTORY factory;
pANTLR3_COMMON_TOKEN tok;
int i;
/* allocate memory
*/
factory = (pANTLR3_TOKEN_FACTORY) ANTLR3_MALLOC(sizeof(ANTLR3_TOKEN_FACTORY));
if (factory == NULL)
{
return NULL;
}
/* Install factory API
*/
factory->newToken = newPoolToken;
factory->close = factoryClose;
factory->setInputStream = setInputStream;
/* Allocate the initial pool
*/
factory->thisPool = size;
factory->nextToken = 0;
factory->pools = (pANTLR3_COMMON_TOKEN*) ANTLR3_MALLOC(sizeof(pANTLR3_COMMON_TOKEN));
factory->pools[0] =
(pANTLR3_COMMON_TOKEN)
ANTLR3_MALLOC((size_t)(sizeof(ANTLR3_COMMON_TOKEN) * size));
/* Set up the tokens once and for all */
for( i=0; i < size; i++ ) {
tok = factory->pools[0] + i;
antlr3SetTokenAPI(tok);
/* It is factory made, and we need to copy the string factory pointer
*/
tok->factoryMade = ANTLR3_TRUE;
tok->strFactory = input == NULL ? NULL : input->strFactory;
tok->input = input;
}
/* Factory space is good, we now want to initialize our cheating token
* which one it is initialized is the model for all tokens we manufacture
*/
antlr3SetTokenAPI(&factory->unTruc);
/* Set some initial variables for future copying
*/
factory->unTruc.factoryMade = ANTLR3_TRUE;
// Input stream
//
setInputStream(factory, input);
return factory;
}
static pANTLR3_COMMON_TOKEN
newPoolToken(pANTLR3_TOKEN_FACTORY factory)
{
ANTLR3_UINT32 size = factory->thisPool;
pANTLR3_COMMON_TOKEN tok = factory->pools[0] + (factory->nextToken % size);
if(factory->nextToken >= size && tok->custom != NULL && tok->freeCustom != NULL) {
tok->freeCustom(tok->custom);
tok->custom = NULL;
}
factory->nextToken++;
return tok;
}
static void
factoryClose (pANTLR3_TOKEN_FACTORY factory)
{
ANTLR3_UINT32 i;
ANTLR3_UINT32 size = factory->thisPool;
pANTLR3_COMMON_TOKEN tok;
for(i = 0; i < size && i < factory->nextToken; i++) {
tok = factory->pools[0] + i;
if(tok->custom != NULL && tok->freeCustom != NULL) {
tok->freeCustom(tok->custom);
tok->custom = NULL;
}
}
ANTLR3_FREE(factory->pools[0]);
ANTLR3_FREE(factory->pools);
ANTLR3_FREE(factory);
}
static void
setInputStream (pANTLR3_TOKEN_FACTORY factory, pANTLR3_INPUT_STREAM input)
{
factory->input = input;
factory->unTruc.input = input;
if (input != NULL)
{
factory->unTruc.strFactory = input->strFactory;
}
else
{
factory->unTruc.strFactory = NULL;
}
}
}/* CVC4::parser namespace */
}/* CVC4 namespace */
|