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;
 

Reply via email to