~sircmpwn/harec

6151bd66e4fef130f786b60e30544666cba3a910 — Alona Enraght-Moony 2 months ago edd7b87
lex: split `consume` into 2 functions.

The codepath is completely different when `n == -1` so there's little
point in merging that case into the same function. Seperating it out
makes the it clearer at the callsite what's actually being done.

Signed-off-by: Alona Enraght-Moony <code@alona.page>
1 files changed, 12 insertions(+), 11 deletions(-)

M src/lex.c
M src/lex.c => src/lex.c +12 -11
@@ 245,14 245,15 @@ wgetc(struct lexer *lexer, struct location *loc)
}

static void
consume(struct lexer *lexer, ssize_t n)
clearbuf(struct lexer *lexer) {
	lexer->buflen = 0;
	lexer->buf[0] = 0;
}

static void
consume(struct lexer *lexer, size_t n)
{
	if (n == -1) {
		lexer->buflen = 0;
		lexer->buf[0] = 0;
		return;
	}
	for (ssize_t i = 0; i < n; i++) {
	for (size_t i = 0; i < n; i++) {
		while ((lexer->buf[--lexer->buflen] & 0xC0) == 0x80) ;
	}
	lexer->buf[lexer->buflen] = 0;


@@ 298,7 299,7 @@ lex_name(struct lexer *lexer, struct token *out)
	} else {
		out->token = (const char **)token - tokens;
	}
	consume(lexer, -1);
	clearbuf(lexer);
	return out->token;
}



@@ 477,7 478,7 @@ want_int:
			error(out->loc, "Unexpected decimal point in integer literal");
		}
		out->fval = strtod(lexer->buf, NULL);
		consume(lexer, -1);
		clearbuf(lexer);
		return;
	}



@@ 503,7 504,7 @@ want_int:
	} else if (kind != UNSIGNED) {
		out->ival = (int64_t)out->uval;
	}
	consume(lexer, -1);
	clearbuf(lexer);
}

static uint32_t


@@ 613,7 614,7 @@ lex_string(struct lexer *lexer, struct token *out)
		out->storage = STORAGE_STRING;
		out->string.len = lexer->buflen;
		out->string.value = buf;
		consume(lexer, -1);
		clearbuf(lexer);
		return out->token;
	case '\'':
		c = next(lexer, NULL, false);