Module Name: src
Committed By: rillig
Date: Sat Aug 12 17:13:28 UTC 2023
Modified Files:
src/usr.bin/xlint/common: emit.c
Log Message:
lint: remove unnecessary double-buffering for output files
To generate a diff of this commit:
cvs rdiff -u -r1.22 -r1.23 src/usr.bin/xlint/common/emit.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/emit.c
diff -u src/usr.bin/xlint/common/emit.c:1.22 src/usr.bin/xlint/common/emit.c:1.23
--- src/usr.bin/xlint/common/emit.c:1.22 Thu Jul 13 08:40:38 2023
+++ src/usr.bin/xlint/common/emit.c Sat Aug 12 17:13:27 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: emit.c,v 1.22 2023/07/13 08:40:38 rillig Exp $ */
+/* $NetBSD: emit.c,v 1.23 2023/08/12 17:13:27 rillig Exp $ */
/*
* Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID)
-__RCSID("$NetBSD: emit.c,v 1.22 2023/07/13 08:40:38 rillig Exp $");
+__RCSID("$NetBSD: emit.c,v 1.23 2023/08/12 17:13:27 rillig Exp $");
#endif
#include <stdio.h>
@@ -45,121 +45,71 @@ __RCSID("$NetBSD: emit.c,v 1.22 2023/07/
#include "lint.h"
-/* name and handle of output file */
-static const char *loname;
-static FILE *lout;
+static const char *output_name;
+static FILE *output_file;
+static bool in_line;
-/* output buffer data */
-static ob_t ob;
-
-static void outxbuf(void);
-
-
-/*
- * initialize output
- */
void
outopen(const char *name)
{
- loname = name;
-
- /* Open output file */
- if ((lout = fopen(name, "w")) == NULL)
+ output_name = name;
+ if ((output_file = fopen(name, "w")) == NULL)
err(1, "cannot open '%s'", name);
-
- /* Create output buffer */
- ob.o_len = 1024;
- ob.o_end = (ob.o_buf = ob.o_next = xmalloc(ob.o_len)) + ob.o_len;
}
-/*
- * flush output buffer and close file
- */
void
outclose(void)
{
outclr();
- if (fclose(lout) == EOF)
- err(1, "cannot close '%s'", loname);
-}
-
-/*
- * resize output buffer
- */
-static void
-outxbuf(void)
-{
-
- size_t next = (size_t)(ob.o_next - ob.o_buf);
- ob.o_len *= 2;
- ob.o_buf = xrealloc(ob.o_buf, ob.o_len);
- ob.o_end = ob.o_buf + ob.o_len;
- ob.o_next = ob.o_buf + next;
+ if (fclose(output_file) == EOF)
+ err(1, "cannot close '%s'", output_name);
}
-/*
- * reset output buffer
- * if it is not empty, it is flushed
- */
void
outclr(void)
{
- if (ob.o_buf != ob.o_next) {
+ if (in_line)
outchar('\n');
- size_t sz = (size_t)(ob.o_next - ob.o_buf);
- if (sz > ob.o_len)
- errx(1, "internal error: outclr");
- if (fwrite(ob.o_buf, sz, 1, lout) != 1)
- err(1, "cannot write to %s", loname);
- ob.o_next = ob.o_buf;
- }
}
-/*
- * write a character to the output buffer
- */
void
outchar(char c)
{
- if (ob.o_next == ob.o_end)
- outxbuf();
- *ob.o_next++ = c;
+ fputc(c, output_file);
+ in_line = c != '\n';
}
/*
- * write a string to the output buffer
- * the string must not contain any characters which
- * should be quoted
+ * write a string to the output file
+ * the string must not contain any characters which should be quoted
*/
void
outstrg(const char *s)
{
- while (*s != '\0') {
- if (ob.o_next == ob.o_end)
- outxbuf();
- *ob.o_next++ = *s++;
- }
+ while (*s != '\0')
+ outchar(*s++);
}
-/* write an integer value to the output buffer */
+/* write an integer value to the output file */
void
outint(int i)
{
+ char buf[1 + 3 * sizeof(int)];
- if ((size_t)(ob.o_end - ob.o_next) < 3 * sizeof(int))
- outxbuf();
- ob.o_next += snprintf(ob.o_next, ob.o_end - ob.o_next, "%d", i);
+ snprintf(buf, sizeof(buf), "%d", i);
+ outstrg(buf);
}
-/* write a name to the output buffer, preceded by its length */
+/* write a name to the output file, preceded by its length */
void
outname(const char *name)
{
+
outint((int)strlen(name));
outstrg(name);
}