Module Name:    src
Committed By:   rillig
Date:           Tue May 16 13:26:26 UTC 2023

Modified Files:
        src/usr.bin/indent: indent.c indent.h io.c lexi.c pr_comment.c

Log Message:
indent: directly access the input buffer

No functional change.


To generate a diff of this commit:
cvs rdiff -u -r1.289 -r1.290 src/usr.bin/indent/indent.c
cvs rdiff -u -r1.145 -r1.146 src/usr.bin/indent/indent.h
cvs rdiff -u -r1.174 -r1.175 src/usr.bin/indent/io.c
cvs rdiff -u -r1.196 -r1.197 src/usr.bin/indent/lexi.c
cvs rdiff -u -r1.143 -r1.144 src/usr.bin/indent/pr_comment.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/indent.c
diff -u src/usr.bin/indent/indent.c:1.289 src/usr.bin/indent/indent.c:1.290
--- src/usr.bin/indent/indent.c:1.289	Tue May 16 11:32:01 2023
+++ src/usr.bin/indent/indent.c	Tue May 16 13:26:26 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: indent.c,v 1.289 2023/05/16 11:32:01 rillig Exp $	*/
+/*	$NetBSD: indent.c,v 1.290 2023/05/16 13:26:26 rillig Exp $	*/
 
 /*-
  * SPDX-License-Identifier: BSD-4-Clause
@@ -38,7 +38,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: indent.c,v 1.289 2023/05/16 11:32:01 rillig Exp $");
+__RCSID("$NetBSD: indent.c,v 1.290 2023/05/16 13:26:26 rillig Exp $");
 
 #include <sys/param.h>
 #include <err.h>
@@ -291,7 +291,7 @@ main_prepare_parsing(void)
     inp_read_line();
 
     int ind = 0;
-    for (const char *p = inp_p();; p++) {
+    for (const char *p = inp.st;; p++) {
 	if (*p == ' ')
 	    ind++;
 	else if (*p == '\t')
@@ -886,10 +886,10 @@ read_preprocessing_line(void)
 
     buf_add_char(&lab, '#');
 
-    while (ch_isblank(inp_peek()))
-	buf_add_char(&lab, inp_next());
+    while (ch_isblank(inp.st[0]))
+	buf_add_char(&lab, *inp.st++);
 
-    while (inp_peek() != '\n' || (state == COMM && !had_eof)) {
+    while (inp.st[0] != '\n' || (state == COMM && !had_eof)) {
 	buf_add_char(&lab, inp_next());
 	switch (lab.mem[lab.len - 1]) {
 	case '\\':
@@ -897,9 +897,9 @@ read_preprocessing_line(void)
 		buf_add_char(&lab, inp_next());
 	    break;
 	case '/':
-	    if (inp_peek() == '*' && state == PLAIN) {
+	    if (inp.st[0] == '*' && state == PLAIN) {
 		state = COMM;
-		buf_add_char(&lab, inp_next());
+		buf_add_char(&lab, *inp.st++);
 	    }
 	    break;
 	case '"':
@@ -915,9 +915,9 @@ read_preprocessing_line(void)
 		state = CHR;
 	    break;
 	case '*':
-	    if (inp_peek() == '/' && state == COMM) {
+	    if (inp.st[0] == '/' && state == COMM) {
 		state = PLAIN;
-		buf_add_char(&lab, inp_next());
+		buf_add_char(&lab, *inp.st++);
 	    }
 	    break;
 	}

Index: src/usr.bin/indent/indent.h
diff -u src/usr.bin/indent/indent.h:1.145 src/usr.bin/indent/indent.h:1.146
--- src/usr.bin/indent/indent.h:1.145	Tue May 16 11:32:01 2023
+++ src/usr.bin/indent/indent.h	Tue May 16 13:26:26 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: indent.h,v 1.145 2023/05/16 11:32:01 rillig Exp $	*/
+/*	$NetBSD: indent.h,v 1.146 2023/05/16 13:26:26 rillig Exp $	*/
 
 /*-
  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
@@ -133,6 +133,15 @@ struct buffer {
 extern FILE *input;
 extern FILE *output;
 
+/*
+ * The current line from the input file, used by the lexer to generate tokens.
+ * To read from the line, start at inp.st and continue up to and including the
+ * next '\n'. To read beyond the '\n', call inp_skip or inp_next, which will
+ * make the next line available, invalidating any pointers into the previous
+ * line.
+ */
+extern struct buffer inp;
+
 extern struct buffer token;	/* the current token to be processed, is
 				 * typically copied to the buffer 'code', or
 				 * in some cases to 'lab'. */
@@ -409,10 +418,6 @@ int compute_code_indent(void);
 int compute_label_indent(void);
 int ind_add(int, const char *, size_t);
 
-const char *inp_p(void);
-const char *inp_line_start(void);
-char inp_peek(void);
-char inp_lookahead(size_t);
 void inp_skip(void);
 char inp_next(void);
 void clear_indent_off_text(void);

Index: src/usr.bin/indent/io.c
diff -u src/usr.bin/indent/io.c:1.174 src/usr.bin/indent/io.c:1.175
--- src/usr.bin/indent/io.c:1.174	Tue May 16 11:32:01 2023
+++ src/usr.bin/indent/io.c	Tue May 16 13:26:26 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: io.c,v 1.174 2023/05/16 11:32:01 rillig Exp $	*/
+/*	$NetBSD: io.c,v 1.175 2023/05/16 13:26:26 rillig Exp $	*/
 
 /*-
  * SPDX-License-Identifier: BSD-4-Clause
@@ -38,47 +38,19 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: io.c,v 1.174 2023/05/16 11:32:01 rillig Exp $");
+__RCSID("$NetBSD: io.c,v 1.175 2023/05/16 13:26:26 rillig Exp $");
 
 #include <stdio.h>
 #include <string.h>
 
 #include "indent.h"
 
-/*
- * The current line, ready to be split into tokens, terminated with '\n'. The
- * current read position is inp.s, and the invariant inp.s < inp.e holds.
- */
-static struct buffer inp;
+struct buffer inp;
 static struct buffer indent_off_text;
 
 static int paren_indent;
 
 
-const char *
-inp_p(void)
-{
-    return inp.st;
-}
-
-const char *
-inp_line_start(void)
-{
-    return inp.mem;
-}
-
-char
-inp_peek(void)
-{
-    return *inp.st;
-}
-
-char
-inp_lookahead(size_t i)
-{
-    return inp.st[i];
-}
-
 void
 inp_skip(void)
 {
@@ -90,7 +62,7 @@ inp_skip(void)
 char
 inp_next(void)
 {
-    char ch = inp_peek();
+    char ch = inp.st[0];
     inp_skip();
     return ch;
 }

Index: src/usr.bin/indent/lexi.c
diff -u src/usr.bin/indent/lexi.c:1.196 src/usr.bin/indent/lexi.c:1.197
--- src/usr.bin/indent/lexi.c:1.196	Tue May 16 12:46:43 2023
+++ src/usr.bin/indent/lexi.c	Tue May 16 13:26:26 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: lexi.c,v 1.196 2023/05/16 12:46:43 rillig Exp $	*/
+/*	$NetBSD: lexi.c,v 1.197 2023/05/16 13:26:26 rillig Exp $	*/
 
 /*-
  * SPDX-License-Identifier: BSD-4-Clause
@@ -38,7 +38,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: lexi.c,v 1.196 2023/05/16 12:46:43 rillig Exp $");
+__RCSID("$NetBSD: lexi.c,v 1.197 2023/05/16 13:26:26 rillig Exp $");
 
 #include <stdlib.h>
 #include <string.h>
@@ -178,9 +178,9 @@ static void
 lex_number(void)
 {
     for (unsigned char s = 'A'; s != 'f' && s != 'i' && s != 'u';) {
-	unsigned char ch = (unsigned char)inp_peek();
-	if (ch == '\\' && inp_lookahead(1) == '\n') {
-	    inp_skip();
+	unsigned char ch = (unsigned char)inp.st[0];
+	if (ch == '\\' && inp.st[1] == '\n') {
+	    inp.st++;
 	    inp_skip();
 	    line_no++;
 	    continue;
@@ -218,10 +218,10 @@ static void
 lex_word(void)
 {
     for (;;) {
-	if (is_identifier_part(inp_peek()))
-	    token_add_char(inp_next());
-	else if (inp_peek() == '\\' && inp_lookahead(1) == '\n') {
-	    inp_skip();
+	if (is_identifier_part(inp.st[0]))
+	    token_add_char(*inp.st++);
+	else if (inp.st[0] == '\\' && inp.st[1] == '\n') {
+	    inp.st++;
 	    inp_skip();
 	    line_no++;
 	} else
@@ -233,17 +233,17 @@ static void
 lex_char_or_string(void)
 {
     for (char delim = token.mem[token.len - 1];;) {
-	if (inp_peek() == '\n') {
+	if (inp.st[0] == '\n') {
 	    diag(1, "Unterminated literal");
 	    return;
 	}
 
-	token_add_char(inp_next());
+	token_add_char(*inp.st++);
 	if (token.mem[token.len - 1] == delim)
 	    return;
 
 	if (token.mem[token.len - 1] == '\\') {
-	    if (inp_peek() == '\n')
+	    if (inp.st[0] == '\n')
 		++line_no;
 	    token_add_char(inp_next());
 	}
@@ -260,10 +260,10 @@ probably_typename(void)
 	return false;
     if (ps.in_stmt_or_decl)	/* XXX: this condition looks incorrect */
 	return false;
-    if (inp_peek() == '*' && inp_lookahead(1) != '=')
+    if (inp.st[0] == '*' && inp.st[1] != '=')
 	goto maybe;
     /* XXX: is_identifier_start */
-    if (ch_isalpha(inp_peek()))
+    if (ch_isalpha(inp.st[0]))
 	goto maybe;
     return false;
 maybe:
@@ -316,7 +316,7 @@ static bool
 probably_looking_at_definition(void)
 {
     int paren_level = 0;
-    for (const char *p = inp_p(); *p != '\n'; p++) {
+    for (const char *p = inp.st; *p != '\n'; p++) {
 	if (*p == '(')
 	    paren_level++;
 	if (*p == ')' && --paren_level == 0) {
@@ -353,15 +353,15 @@ probably_looking_at_definition(void)
 static lexer_symbol
 lexi_alnum(void)
 {
-    if (ch_isdigit(inp_peek()) ||
-	    (inp_peek() == '.' && ch_isdigit(inp_lookahead(1)))) {
+    if (ch_isdigit(inp.st[0]) ||
+	    (inp.st[0] == '.' && ch_isdigit(inp.st[1]))) {
 	lex_number();
-    } else if (is_identifier_start(inp_peek())) {
+    } else if (is_identifier_start(inp.st[0])) {
 	lex_word();
 
 	if (token.len == 1 && token.st[0] == 'L' &&
-		(inp_peek() == '"' || inp_peek() == '\'')) {
-	    token_add_char(inp_next());
+		(inp.st[0] == '"' || inp.st[0] == '\'')) {
+	    token_add_char(*inp.st++);
 	    lex_char_or_string();
 	    ps.next_unary = false;
 	    return lsym_word;
@@ -369,8 +369,8 @@ lexi_alnum(void)
     } else
 	return lsym_eof;	/* just as a placeholder */
 
-    while (ch_isblank(inp_peek()))
-	inp_skip();
+    while (ch_isblank(inp.st[0]))
+	inp.st++;
 
     ps.next_unary = ps.prev_token == lsym_tag
 	|| ps.prev_token == lsym_typedef;
@@ -415,7 +415,7 @@ found_typename:
 	}
     }
 
-    if (inp_peek() == '(' && ps.tos <= 1 && ps.ind_level == 0 &&
+    if (inp.st[0] == '(' && ps.tos <= 1 && ps.ind_level == 0 &&
 	    !ps.in_func_def_params && !ps.block_init) {
 
 	if (ps.nparen == 0 && probably_looking_at_definition()) {
@@ -447,14 +447,14 @@ is_asterisk_unary(void)
 static void
 lex_asterisk_unary(void)
 {
-    while (inp_peek() == '*' || ch_isspace(inp_peek())) {
-	if (inp_peek() == '*')
+    while (inp.st[0] == '*' || ch_isspace(inp.st[0])) {
+	if (inp.st[0] == '*')
 	    token_add_char('*');
 	inp_skip();
     }
 
     if (ps.in_decl) {
-	for (const char *tp = inp_p(); *tp != '\n';) {
+	for (const char *tp = inp.st; *tp != '\n';) {
 	    if (ch_isspace(*tp))
 		tp++;
 	    else if (is_identifier_start(*tp)) {
@@ -491,7 +491,7 @@ skip_string(const char **pp, const char 
 static void
 lex_indent_comment(void)
 {
-    const char *p = inp_line_start();
+    const char *p = inp.mem;
 
     skip_blank(&p);
     if (!skip_string(&p, "/*"))
@@ -528,11 +528,11 @@ lexi(void)
     ps.next_col_1 = false;
 
     for (;;) {
-	if (ch_isblank(inp_peek())) {
+	if (ch_isblank(inp.st[0])) {
 	    ps.curr_col_1 = false;
-	    inp_skip();
-	} else if (inp_peek() == '\\' && inp_lookahead(1) == '\n') {
-	    inp_skip();
+	    inp.st++;
+	} else if (inp.st[0] == '\\' && inp.st[1] == '\n') {
+	    inp.st++;
 	    inp_skip();
 	    line_no++;
 	} else
@@ -592,19 +592,19 @@ lexi(void)
 	lsym = ps.next_unary ? lsym_unary_op : lsym_binary_op;
 	next_unary = true;
 
-	if (inp_peek() == token.mem[token.len - 1]) {	/* '++' or '--' */
-	    token_add_char(inp_next());
+	if (inp.st[0] == token.mem[token.len - 1]) {	/* '++' or '--' */
+	    token_add_char(*inp.st++);
 	    if (ps.prev_token == lsym_word ||
 		    ps.prev_token == lsym_rparen_or_rbracket) {
 		lsym = ps.next_unary ? lsym_unary_op : lsym_postfix_op;
 		next_unary = false;
 	    }
 
-	} else if (inp_peek() == '=') {	/* '+=' or '-=' */
-	    token_add_char(inp_next());
+	} else if (inp.st[0] == '=') {	/* '+=' or '-=' */
+	    token_add_char(*inp.st++);
 
-	} else if (inp_peek() == '>') {	/* '->' */
-	    token_add_char(inp_next());
+	} else if (inp.st[0] == '>') {	/* '->' */
+	    token_add_char(*inp.st++);
 	    lsym = lsym_unary_op;
 	    next_unary = false;
 	    ps.want_blank = false;
@@ -614,8 +614,8 @@ lexi(void)
     case '=':
 	if (ps.init_or_struct)
 	    ps.block_init = true;
-	if (inp_peek() == '=')
-	    token_add_char(inp_next());
+	if (inp.st[0] == '=')
+	    token_add_char(*inp.st++);
 	lsym = lsym_binary_op;
 	next_unary = true;
 	break;
@@ -623,10 +623,10 @@ lexi(void)
     case '>':
     case '<':
     case '!':			/* ops like <, <<, <=, !=, etc */
-	if (inp_peek() == '>' || inp_peek() == '<' || inp_peek() == '=')
-	    token_add_char(inp_next());
-	if (inp_peek() == '=')
-	    token_add_char(inp_next());
+	if (inp.st[0] == '>' || inp.st[0] == '<' || inp.st[0] == '=')
+	    token_add_char(*inp.st++);
+	if (inp.st[0] == '=')
+	    token_add_char(*inp.st++);
 	lsym = ps.next_unary ? lsym_unary_op : lsym_binary_op;
 	next_unary = true;
 	break;
@@ -637,8 +637,8 @@ lexi(void)
 	    lsym = lsym_unary_op;
 	    next_unary = true;
 	} else {
-	    if (inp_peek() == '=')
-		token_add_char(inp_next());
+	    if (inp.st[0] == '=')
+		token_add_char(*inp.st++);
 	    lsym = lsym_binary_op;
 	    next_unary = true;
 	}
@@ -646,20 +646,20 @@ lexi(void)
 
     default:
 	if (token.mem[token.len - 1] == '/'
-		&& (inp_peek() == '*' || inp_peek() == '/')) {
+		&& (inp.st[0] == '*' || inp.st[0] == '/')) {
 	    enum indent_enabled prev = indent_enabled;
 	    lex_indent_comment();
 	    if (prev == indent_on && indent_enabled == indent_off)
 		clear_indent_off_text();
-	    token_add_char(inp_next());
+	    token_add_char(*inp.st++);
 	    lsym = lsym_comment;
 	    next_unary = ps.next_unary;
 	    break;
 	}
 
 	/* handle '||', '&&', etc., and also things as in 'int *****i' */
-	while (token.mem[token.len - 1] == inp_peek() || inp_peek() == '=')
-	    token_add_char(inp_next());
+	while (inp.st[0] == token.mem[token.len - 1] || inp.st[0] == '=')
+	    token_add_char(*inp.st++);
 
 	lsym = ps.next_unary ? lsym_unary_op : lsym_binary_op;
 	next_unary = true;

Index: src/usr.bin/indent/pr_comment.c
diff -u src/usr.bin/indent/pr_comment.c:1.143 src/usr.bin/indent/pr_comment.c:1.144
--- src/usr.bin/indent/pr_comment.c:1.143	Tue May 16 11:32:01 2023
+++ src/usr.bin/indent/pr_comment.c	Tue May 16 13:26:26 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: pr_comment.c,v 1.143 2023/05/16 11:32:01 rillig Exp $	*/
+/*	$NetBSD: pr_comment.c,v 1.144 2023/05/16 13:26:26 rillig Exp $	*/
 
 /*-
  * SPDX-License-Identifier: BSD-4-Clause
@@ -38,7 +38,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: pr_comment.c,v 1.143 2023/05/16 11:32:01 rillig Exp $");
+__RCSID("$NetBSD: pr_comment.c,v 1.144 2023/05/16 13:26:26 rillig Exp $");
 
 #include <string.h>
 
@@ -61,7 +61,7 @@ com_add_delim(void)
 static bool
 fits_in_one_line(int com_ind, int max_line_length)
 {
-    for (const char *start = inp_p(), *p = start; *p != '\n'; p++) {
+    for (const char *start = inp.st, *p = start; *p != '\n'; p++) {
 	if (p[0] == '*' && p[1] == '/') {
 	    int len = ind_add(com_ind + 3, start, (size_t)(p - start));
 	    len += p == start || ch_isblank(p[-1]) ? 2 : 3;
@@ -85,9 +85,9 @@ analyze_comment(bool *p_may_wrap, bool *
 	ind = 0;
 
     } else {
-	if (inp_peek() == '-' || inp_peek() == '*' ||
+	if (inp.st[0] == '-' || inp.st[0] == '*' ||
 		token.mem[token.len - 1] == '/' ||
-		(inp_peek() == '\n' && !opt.format_block_comments)) {
+		(inp.st[0] == '\n' && !opt.format_block_comments)) {
 	    may_wrap = false;
 	    delim = false;
 	}
@@ -122,20 +122,20 @@ analyze_comment(bool *p_may_wrap, bool *
 	 * Find out how much indentation there was originally, because that
 	 * much will have to be ignored by output_complete_line.
 	 */
-	size_t len = (size_t)(inp_p() - 2 - inp_line_start());
-	ps.n_comment_delta = -ind_add(0, inp_line_start(), len);
+	size_t len = (size_t)(inp.st - 2 - inp.mem);
+	ps.n_comment_delta = -ind_add(0, inp.mem, len);
     } else {
 	ps.n_comment_delta = 0;
-	if (!(inp_peek() == '\t' && !ch_isblank(inp_lookahead(1))))
-	    while (ch_isblank(inp_peek()))
-		inp_skip();
+	if (!(inp.st[0] == '\t' && !ch_isblank(inp.st[1])))
+	    while (ch_isblank(inp.st[0]))
+		inp.st++;
     }
 
     ps.comment_delta = 0;
     com_add_char('/');
     com_add_char(token.mem[token.len - 1]);	/* either '*' or '/' */
 
-    if (may_wrap && !ch_isblank(inp_peek()))
+    if (may_wrap && !ch_isblank(inp.st[0]))
 	com_add_char(' ');
 
     if (delim && fits_in_one_line(ind, line_length))
@@ -163,7 +163,7 @@ copy_comment_wrap(int line_length, bool 
     ssize_t last_blank = -1;	/* index of the last blank in com.mem */
 
     for (;;) {
-	switch (inp_peek()) {
+	switch (inp.st[0]) {
 	case '\n':
 	    if (had_eof) {
 		diag(1, "Unterminated comment");
@@ -194,21 +194,21 @@ copy_comment_wrap(int line_length, bool 
 	    do {		/* flush any blanks and/or tabs at start of
 				 * next line */
 		inp_skip();
-		if (inp_peek() == '*' && skip_asterisk) {
+		if (inp.st[0] == '*' && skip_asterisk) {
 		    skip_asterisk = false;
-		    inp_skip();
-		    if (inp_peek() == '/')
+		    inp.st++;
+		    if (inp.st[0] == '/')
 			goto end_of_comment;
 		}
-	    } while (ch_isblank(inp_peek()));
+	    } while (ch_isblank(inp.st[0]));
 
 	    break;		/* end of case for newline */
 
 	case '*':
-	    inp_skip();
-	    if (inp_peek() == '/') {
+	    inp.st++;
+	    if (inp.st[0] == '/') {
 	end_of_comment:
-		inp_skip();
+		inp.st++;
 
 		if (delim) {
 		    if (com.len > 3)
@@ -244,7 +244,7 @@ copy_comment_wrap(int line_length, bool 
 		    last_blank = (ssize_t)com.len;
 		com_add_char(ch);
 		now_len++;
-		if (memchr("*\n\r\b\t", inp_peek(), 6) != NULL)
+		if (memchr("*\n\r\b\t", inp.st[0], 6) != NULL)
 		    break;
 		if (now_len >= line_length && last_blank != -1)
 		    break;
@@ -284,7 +284,7 @@ static void
 copy_comment_nowrap(void)
 {
     for (;;) {
-	if (inp_peek() == '\n') {
+	if (inp.st[0] == '\n') {
 	    if (token.mem[token.len - 1] == '/')
 		return;
 
@@ -302,7 +302,7 @@ copy_comment_nowrap(void)
 	    continue;
 	}
 
-	com_add_char(inp_next());
+	com_add_char(*inp.st++);
 	if (com.mem[com.len - 2] == '*' && com.mem[com.len - 1] == '/'
 		&& token.mem[token.len - 1] == '*')
 	    return;

Reply via email to