Module Name: src Committed By: rillig Date: Thu Aug 26 07:03:00 UTC 2021
Modified Files: src/usr.bin/indent: lexi.c Log Message: indent: extract lex_number, lex_word, lex_char_or_string No functional change. To generate a diff of this commit: cvs rdiff -u -r1.42 -r1.43 src/usr.bin/indent/lexi.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.bin/indent/lexi.c diff -u src/usr.bin/indent/lexi.c:1.42 src/usr.bin/indent/lexi.c:1.43 --- src/usr.bin/indent/lexi.c:1.42 Wed Aug 25 22:26:30 2021 +++ src/usr.bin/indent/lexi.c Thu Aug 26 07:03:00 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: lexi.c,v 1.42 2021/08/25 22:26:30 rillig Exp $ */ +/* $NetBSD: lexi.c,v 1.43 2021/08/26 07:03:00 rillig Exp $ */ /*- * SPDX-License-Identifier: BSD-4-Clause @@ -46,7 +46,7 @@ static char sccsid[] = "@(#)lexi.c 8.1 ( #include <sys/cdefs.h> #ifndef lint #if defined(__NetBSD__) -__RCSID("$NetBSD: lexi.c,v 1.42 2021/08/25 22:26:30 rillig Exp $"); +__RCSID("$NetBSD: lexi.c,v 1.43 2021/08/26 07:03:00 rillig Exp $"); #elif defined(__FreeBSD__) __FBSDID("$FreeBSD: head/usr.bin/indent/lexi.c 337862 2018-08-15 18:19:45Z pstef $"); #endif @@ -284,13 +284,78 @@ lexi_end(token_type code) # define lexi_end(tk) (tk) #endif +static void +lex_number(void) +{ + char s; + unsigned char i; + + for (s = 'A'; s != 'f' && s != 'i' && s != 'u'; ) { + i = (unsigned char)*buf_ptr; + if (i >= nitems(table) || table[i] == NULL || + table[i][s - 'A'] == ' ') { + s = table[0][s - 'A']; + break; + } + s = table[i][s - 'A']; + check_size_token(1); + *e_token++ = inbuf_next(); + } + /* s now indicates the type: f(loating), i(integer), u(nknown) */ +} + +static void +lex_word(void) +{ + while (isalnum((unsigned char)*buf_ptr) || + *buf_ptr == '\\' || + *buf_ptr == '_' || *buf_ptr == '$') { + /* fill_buffer() terminates buffer with newline */ + if (*buf_ptr == '\\') { + if (buf_ptr[1] == '\n') { + buf_ptr += 2; + if (buf_ptr >= buf_end) + fill_buffer(); + } else + break; + } + check_size_token(1); + *e_token++ = inbuf_next(); + } +} + +static void +lex_char_or_string(void) +{ + char delim; + + delim = *token; + do { /* copy the string */ + for (;;) { /* move one character or [/<char>]<char> */ + if (*buf_ptr == '\n') { + diag(1, "Unterminated literal"); + return; + } + check_size_token(2); + *e_token = inbuf_next(); + if (*e_token == '\\') { /* if escape, copy extra char */ + if (*buf_ptr == '\n') /* check for escaped newline */ + ++line_no; + *++e_token = inbuf_next(); + ++e_token; /* we must increment this again because we + * copied two chars */ + } else + break; /* we copied one character */ + } /* end of while (1) */ + } while (*e_token++ != delim); +} + token_type lexi(struct parser_state *state) { int unary_delim; /* this is set to 1 if the current token * forces a following operator to be unary */ token_type code; /* internal code to be returned */ - char qchar; /* the delimiter character for a string */ e_token = s_token; /* point to start of place to save token */ unary_delim = false; @@ -310,43 +375,15 @@ lexi(struct parser_state *state) *buf_ptr == '_' || *buf_ptr == '$' || (buf_ptr[0] == '.' && isdigit((unsigned char)buf_ptr[1]))) { /* - * we have a character or number + * we have a letter or number */ struct templ *p; if (isdigit((unsigned char)*buf_ptr) || (buf_ptr[0] == '.' && isdigit((unsigned char)buf_ptr[1]))) { - char s; - unsigned char i; - - for (s = 'A'; s != 'f' && s != 'i' && s != 'u'; ) { - i = (unsigned char)*buf_ptr; - if (i >= nitems(table) || table[i] == NULL || - table[i][s - 'A'] == ' ') { - s = table[0][s - 'A']; - break; - } - s = table[i][s - 'A']; - check_size_token(1); - *e_token++ = inbuf_next(); - } - /* s now indicates the type: f(loating), i(integer), u(nknown) */ + lex_number(); } else { - while (isalnum((unsigned char)*buf_ptr) || - *buf_ptr == '\\' || - *buf_ptr == '_' || *buf_ptr == '$') { - /* fill_buffer() terminates buffer with newline */ - if (*buf_ptr == '\\') { - if (buf_ptr[1] == '\n') { - buf_ptr += 2; - if (buf_ptr >= buf_end) - fill_buffer(); - } else - break; - } - check_size_token(1); - *e_token++ = inbuf_next(); - } + lex_word(); } *e_token = '\0'; @@ -477,28 +514,9 @@ lexi(struct parser_state *state) */ break; - case '\'': /* start of quoted character */ - case '"': /* start of string */ - qchar = *token; - do { /* copy the string */ - for (;;) { /* move one character or [/<char>]<char> */ - if (*buf_ptr == '\n') { - diag(1, "Unterminated literal"); - goto stop_lit; - } - check_size_token(2); - *e_token = inbuf_next(); - if (*e_token == '\\') { /* if escape, copy extra char */ - if (*buf_ptr == '\n') /* check for escaped newline */ - ++line_no; - *++e_token = inbuf_next(); - ++e_token; /* we must increment this again because we - * copied two chars */ - } else - break; /* we copied one character */ - } /* end of while (1) */ - } while (*e_token++ != qchar); -stop_lit: + case '\'': + case '"': + lex_char_or_string(); code = ident; break;