Lines Matching defs:lex

18 /* $Id: lex.c,v 1.86 2007/09/17 09:56:29 shane Exp $ */
30 #include <isc/lex.h>
72 grow_data(isc_lex_t *lex, size_t *remainingp, char **currp, char **prevp) {
75 new = isc_mem_get(lex->mctx, lex->max_token * 2 + 1);
78 memcpy(new, lex->data, lex->max_token + 1);
79 *currp = new + (*currp - lex->data);
81 *prevp = new + (*prevp - lex->data);
82 isc_mem_put(lex->mctx, lex->data, lex->max_token + 1);
83 lex->data = new;
84 *remainingp += lex->max_token;
85 lex->max_token *= 2;
91 isc_lex_t *lex;
100 lex = isc_mem_get(mctx, sizeof(*lex));
101 if (lex == NULL)
103 lex->data = isc_mem_get(mctx, max_token + 1);
104 if (lex->data == NULL) {
105 isc_mem_put(mctx, lex, sizeof(*lex));
108 lex->mctx = mctx;
109 lex->max_token = max_token;
110 lex->comments = 0;
111 lex->comment_ok = ISC_TRUE;
112 lex->last_was_eol = ISC_TRUE;
113 lex->paren_count = 0;
114 lex->saved_paren_count = 0;
115 memset(lex->specials, 0, 256);
116 INIT_LIST(lex->sources);
117 lex->magic = LEX_MAGIC;
119 *lexp = lex;
126 isc_lex_t *lex;
133 lex = *lexp;
134 REQUIRE(VALID_LEX(lex));
136 while (!EMPTY(lex->sources))
137 RUNTIME_CHECK(isc_lex_close(lex) == ISC_R_SUCCESS);
138 if (lex->data != NULL)
139 isc_mem_put(lex->mctx, lex->data, lex->max_token + 1);
140 lex->magic = 0;
141 isc_mem_put(lex->mctx, lex, sizeof(*lex));
147 isc_lex_getcomments(isc_lex_t *lex) {
152 REQUIRE(VALID_LEX(lex));
154 return (lex->comments);
158 isc_lex_setcomments(isc_lex_t *lex, unsigned int comments) {
163 REQUIRE(VALID_LEX(lex));
165 lex->comments = comments;
169 isc_lex_getspecials(isc_lex_t *lex, isc_lexspecials_t specials) {
174 REQUIRE(VALID_LEX(lex));
176 memcpy(specials, lex->specials, 256);
180 isc_lex_setspecials(isc_lex_t *lex, isc_lexspecials_t specials) {
186 REQUIRE(VALID_LEX(lex));
188 memcpy(lex->specials, specials, 256);
192 new_source(isc_lex_t *lex, isc_boolean_t is_file, isc_boolean_t need_close,
198 source = isc_mem_get(lex->mctx, sizeof(*source));
206 source->name = isc_mem_strdup(lex->mctx, name);
208 isc_mem_put(lex->mctx, source, sizeof(*source));
212 result = isc_buffer_allocate(lex->mctx, &source->pushback,
213 lex->max_token);
215 isc_mem_free(lex->mctx, source->name);
216 isc_mem_put(lex->mctx, source, sizeof(*source));
221 ISC_LIST_INITANDPREPEND(lex->sources, source, link);
227 isc_lex_openfile(isc_lex_t *lex, const char *filename) {
232 * Open 'filename' and make it the current input source for 'lex'.
235 REQUIRE(VALID_LEX(lex));
241 result = new_source(lex, ISC_TRUE, ISC_TRUE, stream, filename);
248 isc_lex_openstream(isc_lex_t *lex, FILE *stream) {
252 * Make 'stream' the current input source for 'lex'.
255 REQUIRE(VALID_LEX(lex));
259 return (new_source(lex, ISC_TRUE, ISC_FALSE, stream, name));
263 isc_lex_openbuffer(isc_lex_t *lex, isc_buffer_t *buffer) {
267 * Make 'buffer' the current input source for 'lex'.
270 REQUIRE(VALID_LEX(lex));
274 return (new_source(lex, ISC_FALSE, ISC_FALSE, buffer, name));
278 isc_lex_close(isc_lex_t *lex) {
285 REQUIRE(VALID_LEX(lex));
287 source = HEAD(lex->sources);
291 ISC_LIST_UNLINK(lex->sources, source, link);
296 isc_mem_free(lex->mctx, source->name);
298 isc_mem_put(lex->mctx, source, sizeof(*source));
330 pushandgrow(isc_lex_t *lex, inputsource *source, int c) {
338 result = isc_buffer_allocate(lex->mctx, &tbuf, oldlen * 2);
353 isc_lex_gettoken(isc_lex_t *lex, unsigned int options, isc_token_t *tokenp) {
373 REQUIRE(VALID_LEX(lex));
374 source = HEAD(lex->sources);
388 lex->saved_paren_count = lex->paren_count;
395 lex->paren_count != 0) {
396 lex->paren_count = 0;
409 if ((options & ISC_LEXOPT_DNSMULTILINE) != 0 && lex->paren_count > 0)
412 curr = lex->data;
416 remaining = lex->max_token;
454 source->result = pushandgrow(lex, source, c);
475 if (lex->comment_ok && !no_comments) {
477 ((lex->comments & ISC_LEXCOMMENT_DNSMASTERFILE)
484 (lex->comments &
492 ((lex->comments & ISC_LEXCOMMENT_SHELL)
506 lex->last_was_eol = ISC_FALSE;
508 lex->paren_count != 0) {
509 lex->paren_count = 0;
520 if (lex->last_was_eol &&
523 lex->last_was_eol = ISC_FALSE;
533 lex->last_was_eol = ISC_TRUE;
539 lex->last_was_eol = ISC_FALSE;
542 } else if (lex->specials[c]) {
543 lex->last_was_eol = ISC_FALSE;
547 if (lex->paren_count == 0)
549 lex->paren_count++;
551 if (lex->paren_count == 0) {
555 lex->paren_count--;
556 if (lex->paren_count == 0)
567 lex->last_was_eol = ISC_FALSE;
575 lex->last_was_eol = ISC_FALSE;
585 lex->last_was_eol = ISC_TRUE;
591 lex->specials[c]) {
602 lex->data,
616 lex->data;
618 lex->max_token -
626 (curr != &lex->data[1]) ||
627 (lex->data[0] != '0'))) {
636 result = grow_data(lex, &remaining,
648 * EOF needs to be checked before lex->specials[c]
649 * as lex->specials[EOF] is not a good idea.
653 (c == ' ' || c == '\t' || lex->specials[c]))) {
660 tokenp->value.as_textregion.base = lex->data;
662 lex->max_token - remaining;
670 result = grow_data(lex, &remaining,
682 (lex->comments & ISC_LEXCOMMENT_C) != 0) {
686 (lex->comments & ISC_LEXCOMMENT_CPLUSPLUS) != 0) {
745 lex->data;
747 lex->max_token - remaining;
763 result = grow_data(lex, &remaining,
796 isc_lex_getmastertoken(isc_lex_t *lex, isc_token_t *token,
807 result = isc_lex_gettoken(lex, options, token);
809 isc_lex_ungettoken(lex, token);
820 isc_lex_ungettoken(lex, token);
832 isc_lex_getoctaltoken(isc_lex_t *lex, isc_token_t *token, isc_boolean_t eol)
839 result = isc_lex_gettoken(lex, options, token);
841 isc_lex_ungettoken(lex, token);
849 isc_lex_ungettoken(lex, token);
859 isc_lex_ungettoken(isc_lex_t *lex, isc_token_t *tokenp) {
865 REQUIRE(VALID_LEX(lex));
866 source = HEAD(lex->sources);
875 lex->paren_count = lex->saved_paren_count;
881 isc_lex_getlasttokentext(isc_lex_t *lex, isc_token_t *tokenp, isc_region_t *r)
885 REQUIRE(VALID_LEX(lex));
886 source = HEAD(lex->sources);
903 isc_lex_getsourcename(isc_lex_t *lex) {
906 REQUIRE(VALID_LEX(lex));
907 source = HEAD(lex->sources);
916 isc_lex_getsourceline(isc_lex_t *lex) {
919 REQUIRE(VALID_LEX(lex));
920 source = HEAD(lex->sources);
930 isc_lex_setsourcename(isc_lex_t *lex, const char *name) {
934 REQUIRE(VALID_LEX(lex));
935 source = HEAD(lex->sources);
939 newname = isc_mem_strdup(lex->mctx, name);
942 isc_mem_free(lex->mctx, source->name);
948 isc_lex_isfile(isc_lex_t *lex) {
951 REQUIRE(VALID_LEX(lex));
953 source = HEAD(lex->sources);