Module Name: src Committed By: rillig Date: Thu Feb 1 18:37:07 UTC 2024
Modified Files: src/usr.bin/xlint/common: lint.h tyname.c src/usr.bin/xlint/lint1: cgram.y ckgetopt.c debug.c emit1.c externs1.h init.c lex.c lint1.h tree.c Log Message: lint: use standard buffer for storing string values No functional change. To generate a diff of this commit: cvs rdiff -u -r1.47 -r1.48 src/usr.bin/xlint/common/lint.h cvs rdiff -u -r1.58 -r1.59 src/usr.bin/xlint/common/tyname.c cvs rdiff -u -r1.484 -r1.485 src/usr.bin/xlint/lint1/cgram.y cvs rdiff -u -r1.19 -r1.20 src/usr.bin/xlint/lint1/ckgetopt.c cvs rdiff -u -r1.67 -r1.68 src/usr.bin/xlint/lint1/debug.c cvs rdiff -u -r1.82 -r1.83 src/usr.bin/xlint/lint1/emit1.c cvs rdiff -u -r1.212 -r1.213 src/usr.bin/xlint/lint1/externs1.h cvs rdiff -u -r1.256 -r1.257 src/usr.bin/xlint/lint1/init.c cvs rdiff -u -r1.204 -r1.205 src/usr.bin/xlint/lint1/lex.c cvs rdiff -u -r1.210 -r1.211 src/usr.bin/xlint/lint1/lint1.h cvs rdiff -u -r1.599 -r1.600 src/usr.bin/xlint/lint1/tree.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/xlint/common/lint.h diff -u src/usr.bin/xlint/common/lint.h:1.47 src/usr.bin/xlint/common/lint.h:1.48 --- src/usr.bin/xlint/common/lint.h:1.47 Sat Jan 20 10:25:57 2024 +++ src/usr.bin/xlint/common/lint.h Thu Feb 1 18:37:06 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: lint.h,v 1.47 2024/01/20 10:25:57 rillig Exp $ */ +/* $NetBSD: lint.h,v 1.48 2024/02/01 18:37:06 rillig Exp $ */ /* * Copyright (c) 1994, 1995 Jochen Pohl @@ -48,6 +48,14 @@ #include "param.h" #if IS_LINT1 || IS_LINT2 + +// Null-terminated character buffer, may contain null characters. +typedef struct { + size_t len; /* excluding the terminating '\0' */ + size_t cap; + char *data; +} buffer; + /* * Type specifiers, used in type structures (type_t) and elsewhere. */ Index: src/usr.bin/xlint/common/tyname.c diff -u src/usr.bin/xlint/common/tyname.c:1.58 src/usr.bin/xlint/common/tyname.c:1.59 --- src/usr.bin/xlint/common/tyname.c:1.58 Sat Jan 20 10:25:57 2024 +++ src/usr.bin/xlint/common/tyname.c Thu Feb 1 18:37:06 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: tyname.c,v 1.58 2024/01/20 10:25:57 rillig Exp $ */ +/* $NetBSD: tyname.c,v 1.59 2024/02/01 18:37:06 rillig Exp $ */ /*- * Copyright (c) 2005 The NetBSD Foundation, Inc. @@ -35,7 +35,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) -__RCSID("$NetBSD: tyname.c,v 1.58 2024/01/20 10:25:57 rillig Exp $"); +__RCSID("$NetBSD: tyname.c,v 1.59 2024/02/01 18:37:06 rillig Exp $"); #endif #include <assert.h> @@ -56,13 +56,6 @@ typedef struct name_tree_node { struct name_tree_node *ntn_greater; } name_tree_node; -/* A growable string buffer. */ -typedef struct buffer { - size_t len; - size_t cap; - char * data; -} buffer; - static name_tree_node *type_names; static name_tree_node * Index: src/usr.bin/xlint/lint1/cgram.y diff -u src/usr.bin/xlint/lint1/cgram.y:1.484 src/usr.bin/xlint/lint1/cgram.y:1.485 --- src/usr.bin/xlint/lint1/cgram.y:1.484 Tue Jan 23 19:44:28 2024 +++ src/usr.bin/xlint/lint1/cgram.y Thu Feb 1 18:37:06 2024 @@ -1,5 +1,5 @@ %{ -/* $NetBSD: cgram.y,v 1.484 2024/01/23 19:44:28 rillig Exp $ */ +/* $NetBSD: cgram.y,v 1.485 2024/02/01 18:37:06 rillig Exp $ */ /* * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved. @@ -35,7 +35,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) -__RCSID("$NetBSD: cgram.y,v 1.484 2024/01/23 19:44:28 rillig Exp $"); +__RCSID("$NetBSD: cgram.y,v 1.485 2024/02/01 18:37:06 rillig Exp $"); #endif #include <limits.h> @@ -148,7 +148,7 @@ is_either(const char *s, const char *a, type_t *y_type; tnode_t *y_tnode; range_t y_range; - strg_t *y_string; + buffer *y_string; qual_ptr *y_qual_ptr; bool y_seen_statement; struct generic_association *y_generic; Index: src/usr.bin/xlint/lint1/ckgetopt.c diff -u src/usr.bin/xlint/lint1/ckgetopt.c:1.19 src/usr.bin/xlint/lint1/ckgetopt.c:1.20 --- src/usr.bin/xlint/lint1/ckgetopt.c:1.19 Mon Jan 29 21:30:24 2024 +++ src/usr.bin/xlint/lint1/ckgetopt.c Thu Feb 1 18:37:06 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: ckgetopt.c,v 1.19 2024/01/29 21:30:24 rillig Exp $ */ +/* $NetBSD: ckgetopt.c,v 1.20 2024/02/01 18:37:06 rillig Exp $ */ /*- * Copyright (c) 2021 The NetBSD Foundation, Inc. @@ -35,7 +35,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) -__RCSID("$NetBSD: ckgetopt.c,v 1.19 2024/01/29 21:30:24 rillig Exp $"); +__RCSID("$NetBSD: ckgetopt.c,v 1.20 2024/02/01 18:37:06 rillig Exp $"); #endif #include <stdbool.h> @@ -80,7 +80,7 @@ static bool is_getopt_condition(const tnode_t *tn, char **out_options) { const tnode_t *call, *last_arg; - const strg_t *str; + const buffer *str; if (tn != NULL && tn->tn_op == NE @@ -99,8 +99,8 @@ is_getopt_condition(const tnode_t *tn, c && (last_arg = call->tn_right->tn_left)->tn_op == CVT && last_arg->tn_left->tn_op == ADDR && last_arg->tn_left->tn_left->tn_op == STRING - && (str = last_arg->tn_left->tn_left->tn_string)->st_char) { - *out_options = xstrdup(str->st_chars); + && (str = last_arg->tn_left->tn_left->tn_string)->data != NULL) { + *out_options = xstrdup(str->data); return true; } return false; Index: src/usr.bin/xlint/lint1/debug.c diff -u src/usr.bin/xlint/lint1/debug.c:1.67 src/usr.bin/xlint/lint1/debug.c:1.68 --- src/usr.bin/xlint/lint1/debug.c:1.67 Mon Jan 29 21:30:24 2024 +++ src/usr.bin/xlint/lint1/debug.c Thu Feb 1 18:37:06 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: debug.c,v 1.67 2024/01/29 21:30:24 rillig Exp $ */ +/* $NetBSD: debug.c,v 1.68 2024/02/01 18:37:06 rillig Exp $ */ /*- * Copyright (c) 2021 The NetBSD Foundation, Inc. @@ -35,7 +35,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) -__RCSID("$NetBSD: debug.c,v 1.67 2024/01/29 21:30:24 rillig Exp $"); +__RCSID("$NetBSD: debug.c,v 1.68 2024/02/01 18:37:06 rillig Exp $"); #endif #include <stdlib.h> @@ -235,12 +235,10 @@ debug_node(const tnode_t *tn) // NOLINT( debug_printf("\n"); break; case STRING: - if (tn->tn_string->st_char) - debug_printf(", length %zu, \"%s\"\n", - tn->tn_string->st_len, - tn->tn_string->st_chars); - else - debug_printf(", length %zu\n", tn->tn_string->st_len); + debug_printf(", length %zu\n", tn->tn_string->len); + if (tn->tn_string->data != NULL) + // TODO: May contain \0 or control characters. + debug_printf(", \"%s\"\n", tn->tn_string->data); break; default: debug_printf("\n"); Index: src/usr.bin/xlint/lint1/emit1.c diff -u src/usr.bin/xlint/lint1/emit1.c:1.82 src/usr.bin/xlint/lint1/emit1.c:1.83 --- src/usr.bin/xlint/lint1/emit1.c:1.82 Mon Jan 29 21:30:24 2024 +++ src/usr.bin/xlint/lint1/emit1.c Thu Feb 1 18:37:06 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: emit1.c,v 1.82 2024/01/29 21:30:24 rillig Exp $ */ +/* $NetBSD: emit1.c,v 1.83 2024/02/01 18:37:06 rillig Exp $ */ /* * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved. @@ -38,13 +38,13 @@ #include <sys/cdefs.h> #if defined(__RCSID) -__RCSID("$NetBSD: emit1.c,v 1.82 2024/01/29 21:30:24 rillig Exp $"); +__RCSID("$NetBSD: emit1.c,v 1.83 2024/02/01 18:37:06 rillig Exp $"); #endif #include "lint1.h" static void outtt(sym_t *, sym_t *); -static void outfstrg(strg_t *); +static void outfstrg(const char *); /* * Write type into the output file, encoded as follows: @@ -367,11 +367,11 @@ outcall(const tnode_t *tn, bool retval_u } } else if (arg->tn_op == ADDR && arg->tn_left->tn_op == STRING && - arg->tn_left->tn_string->st_char) { + arg->tn_left->tn_string->data != NULL) { /* constant string, write all format specifiers */ outchar('s'); outint(n); - outfstrg(arg->tn_left->tn_string); + outfstrg(arg->tn_left->tn_string->data); } } outchar((char)(retval_discarded ? 'd' : retval_used ? 'u' : 'i')); @@ -448,12 +448,9 @@ outqchar(char c) * writes them, enclosed in "" and quoted if necessary, to the output file */ static void -outfstrg(strg_t *strg) +outfstrg(const char *cp) { - lint_assert(strg->st_char); - const char *cp = strg->st_chars; - outchar('"'); char c = *cp++; Index: src/usr.bin/xlint/lint1/externs1.h diff -u src/usr.bin/xlint/lint1/externs1.h:1.212 src/usr.bin/xlint/lint1/externs1.h:1.213 --- src/usr.bin/xlint/lint1/externs1.h:1.212 Tue Jan 23 19:44:28 2024 +++ src/usr.bin/xlint/lint1/externs1.h Thu Feb 1 18:37:06 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: externs1.h,v 1.212 2024/01/23 19:44:28 rillig Exp $ */ +/* $NetBSD: externs1.h,v 1.213 2024/02/01 18:37:06 rillig Exp $ */ /* * Copyright (c) 1994, 1995 Jochen Pohl @@ -275,7 +275,7 @@ type_t *expr_derive_type(type_t *, tspec bool is_compiler_builtin(const char *); tnode_t *build_constant(type_t *, val_t *); tnode_t *build_name(sym_t *, bool); -tnode_t *build_string(strg_t *); +tnode_t *build_string(buffer *); tnode_t *build_generic_selection(const tnode_t *, struct generic_association *); @@ -298,7 +298,7 @@ val_t *integer_constant(tnode_t *, bool) void expr(tnode_t *, bool, bool, bool, bool); void check_expr_misc(const tnode_t *, bool, bool, bool, bool, bool, bool); bool constant_addr(const tnode_t *, const sym_t **, ptrdiff_t *); -strg_t *cat_strings(strg_t *, strg_t *); +buffer *cat_strings(buffer *, buffer *); unsigned int type_size_in_bits(const type_t *); sym_t *find_member(const struct_or_union *, const char *); Index: src/usr.bin/xlint/lint1/init.c diff -u src/usr.bin/xlint/lint1/init.c:1.256 src/usr.bin/xlint/lint1/init.c:1.257 --- src/usr.bin/xlint/lint1/init.c:1.256 Sat Jan 13 11:24:57 2024 +++ src/usr.bin/xlint/lint1/init.c Thu Feb 1 18:37:06 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: init.c,v 1.256 2024/01/13 11:24:57 rillig Exp $ */ +/* $NetBSD: init.c,v 1.257 2024/02/01 18:37:06 rillig Exp $ */ /* * Copyright (c) 1994, 1995 Jochen Pohl @@ -38,7 +38,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) -__RCSID("$NetBSD: init.c,v 1.256 2024/01/13 11:24:57 rillig Exp $"); +__RCSID("$NetBSD: init.c,v 1.257 2024/02/01 18:37:06 rillig Exp $"); #endif #include <stdlib.h> @@ -887,7 +887,7 @@ initialization_init_array_from_string(in if (!can_init_character_array(tp, tn)) return false; - size_t len = tn->tn_string->st_len; + size_t len = tn->tn_string->len; if (!tp->t_incomplete_array && (size_t)tp->t_dim < len) { /* string literal too long (%lu) for target array (%lu) */ warning(187, (unsigned long)len, (unsigned long)tp->t_dim); Index: src/usr.bin/xlint/lint1/lex.c diff -u src/usr.bin/xlint/lint1/lex.c:1.204 src/usr.bin/xlint/lint1/lex.c:1.205 --- src/usr.bin/xlint/lint1/lex.c:1.204 Mon Jan 29 21:30:25 2024 +++ src/usr.bin/xlint/lint1/lex.c Thu Feb 1 18:37:06 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: lex.c,v 1.204 2024/01/29 21:30:25 rillig Exp $ */ +/* $NetBSD: lex.c,v 1.205 2024/02/01 18:37:06 rillig Exp $ */ /* * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved. @@ -38,7 +38,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) -__RCSID("$NetBSD: lex.c,v 1.204 2024/01/29 21:30:25 rillig Exp $"); +__RCSID("$NetBSD: lex.c,v 1.205 2024/02/01 18:37:06 rillig Exp $"); #endif #include <ctype.h> @@ -1275,12 +1275,11 @@ lex_string(void) /* unterminated string constant */ error(258); - strg_t *strg = xcalloc(1, sizeof(*strg)); - strg->st_char = true; - strg->st_len = s_len; - strg->st_chars = s; + buffer *str = xcalloc(1, sizeof(*str)); + str->len = s_len; + str->data = s; - yylval.y_string = strg; + yylval.y_string = str; return T_STRING; } @@ -1328,11 +1327,10 @@ lex_wide_string(void) free(s); free(ws); - strg_t *strg = xcalloc(1, sizeof(*strg)); - strg->st_char = false; - strg->st_len = wlen; + buffer *str = xcalloc(1, sizeof(*str)); + str->len = wlen; - yylval.y_string = strg; + yylval.y_string = str; return T_STRING; } @@ -1576,8 +1574,8 @@ freeyyv(void *sp, int tok) val_t *val = *(val_t **)sp; free(val); } else if (tok == T_STRING) { - strg_t *strg = *(strg_t **)sp; - free(strg->st_chars); - free(strg); + buffer *str = *(buffer **)sp; + free(str->data); + free(str); } } Index: src/usr.bin/xlint/lint1/lint1.h diff -u src/usr.bin/xlint/lint1/lint1.h:1.210 src/usr.bin/xlint/lint1/lint1.h:1.211 --- src/usr.bin/xlint/lint1/lint1.h:1.210 Mon Jan 29 21:30:25 2024 +++ src/usr.bin/xlint/lint1/lint1.h Thu Feb 1 18:37:06 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: lint1.h,v 1.210 2024/01/29 21:30:25 rillig Exp $ */ +/* $NetBSD: lint1.h,v 1.211 2024/02/01 18:37:06 rillig Exp $ */ /* * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved. @@ -71,19 +71,6 @@ typedef struct { int p_uniq; /* uniquifier */ } pos_t; -/* - * Strings cannot be referenced simply by a pointer to their first - * char. This is because strings can contain NUL characters other than the - * trailing NUL. - * - * Strings are stored with a trailing NUL. - */ -typedef struct strg { - bool st_char; /* string doesn't have an 'L' prefix */ - size_t st_len; /* length without trailing NUL */ - char *st_chars; /* only if st_char */ -} strg_t; - // TODO: Use bit-fields instead of plain bool, but keep an eye on arm and // powerpc, on which NetBSD's GCC 10.5.0 (but not the upstream GCC) generates // code that leads to extra 327 warnings, even in msg_327.c, which does not @@ -324,7 +311,9 @@ typedef struct tnode { } tn_s; sym_t *_tn_sym; /* symbol if op == NAME */ val_t _tn_val; /* value if op == CON */ - strg_t *_tn_string; /* string if op == STRING */ + buffer *_tn_string; /* string if op == STRING; for wide + * char strings, data is NULL but len + * is valid */ } tn_u; } tnode_t; Index: src/usr.bin/xlint/lint1/tree.c diff -u src/usr.bin/xlint/lint1/tree.c:1.599 src/usr.bin/xlint/lint1/tree.c:1.600 --- src/usr.bin/xlint/lint1/tree.c:1.599 Mon Jan 29 21:30:25 2024 +++ src/usr.bin/xlint/lint1/tree.c Thu Feb 1 18:37:06 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: tree.c,v 1.599 2024/01/29 21:30:25 rillig Exp $ */ +/* $NetBSD: tree.c,v 1.600 2024/02/01 18:37:06 rillig Exp $ */ /* * Copyright (c) 1994, 1995 Jochen Pohl @@ -37,7 +37,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) -__RCSID("$NetBSD: tree.c,v 1.599 2024/01/29 21:30:25 rillig Exp $"); +__RCSID("$NetBSD: tree.c,v 1.600 2024/02/01 18:37:06 rillig Exp $"); #endif #include <float.h> @@ -522,13 +522,13 @@ build_name(sym_t *sym, bool is_funcname) } tnode_t * -build_string(strg_t *strg) +build_string(buffer *strg) { - size_t len = strg->st_len; + size_t len = strg->len; type_t *tp = expr_zero_alloc(sizeof(*tp), "type"); tp->t_tspec = ARRAY; - tp->t_subt = gettyp(strg->st_char ? CHAR : WCHAR_TSPEC); + tp->t_subt = gettyp(strg->data != NULL ? CHAR : WCHAR_TSPEC); tp->t_dim = (int)(len + 1); tnode_t *n = expr_alloc_tnode(); @@ -537,16 +537,13 @@ build_string(strg_t *strg) n->tn_lvalue = true; n->tn_string = expr_zero_alloc(sizeof(*n->tn_string), "tnode.string"); - n->tn_string->st_char = strg->st_char; - n->tn_string->st_len = len; + n->tn_string->len = len; - size_t chsize = strg->st_char ? sizeof(char) : sizeof(wchar_t); - size_t size = (len + 1) * chsize; - if (strg->st_char) { - n->tn_string->st_chars = expr_zero_alloc(size, + if (strg->data != NULL) { + n->tn_string->data = expr_zero_alloc(len + 1, "tnode.string.data"); - (void)memcpy(n->tn_string->st_chars, strg->st_chars, size); - free(strg->st_chars); + (void)memcpy(n->tn_string->data, strg->data, len + 1); + free(strg->data); } free(strg); @@ -4691,24 +4688,22 @@ constant_addr(const tnode_t *tn, const s } /* Append s2 to s1, then free s2. */ -strg_t * -cat_strings(strg_t *s1, strg_t *s2) +buffer * +cat_strings(buffer *s1, buffer *s2) { - if (s1->st_char != s2->st_char) { + if ((s1->data != NULL) != (s2->data != NULL)) { /* cannot concatenate wide and regular string literals */ error(292); return s1; } - size_t len1 = s1->st_len; - size_t len2 = s2->st_len; - if (s1->st_char) { - s1->st_chars = xrealloc(s1->st_chars, len1 + len2 + 1); - memcpy(s1->st_chars + len1, s2->st_chars, len2 + 1); - free(s2->st_chars); + if (s1->data != NULL) { + s1->data = xrealloc(s1->data, s1->len + s2->len + 1); + memcpy(s1->data + s1->len, s2->data, s2->len + 1); + free(s2->data); } - s1->st_len = len1 + len2; + s1->len += s2->len; free(s2); return s1;