From 733a013ee75f43c4fe4a317a7806981f4e6dd8a1 Mon Sep 17 00:00:00 2001
From: Eric <eric@wolf42.net>
Date: Wed, 28 May 2025 17:31:07 +0200
Subject: [PATCH] remove bugs related to uninitialized variables

These bugs became visible when using optimization options. They were
either not present unoptimized or very unlikely to occur. However, given
the options, the resulting program would behave incorrectly and reliably
break under all circumstances.

The makefile will see the intended changes accordingly in the following
commit to ensure compatibility.
---
 main.c   | 31 +++++++++++++++++--------------
 output.c |  1 +
 2 files changed, 18 insertions(+), 14 deletions(-)

diff --git a/main.c b/main.c
index c2017bf..44b9a71 100644
--- a/main.c
+++ b/main.c
@@ -13,11 +13,12 @@ unsigned char sbuf[SXTETBUF];
 int
 main(int argc, char *argv[])
 {
-    int c, n, l;
+    int c, n, last;
     int dec, url, hlp, wrp;
-    char *prog = *argv;
     FILE *in, *out;
+    char *prog;
 
+    prog = *argv;
     dec = url = hlp = wrp = 0;
     while (--argc > 0 && (*++argv)[0] == '-')
         while ((c = *++argv[0]))
@@ -42,6 +43,7 @@ main(int argc, char *argv[])
     if (hlp) {
         fprintf(stdout, "Usage: %s -duhw infile outfile\n", prog);
     } else {
+        in = out = NULL;
         if (argc >= 1 && (in = fopen(*argv, "r")) == NULL) {
             fprintf(stderr, "%s: can't open %s\n", prog, *argv);
             exit(EXIT_FAILURE);
@@ -51,22 +53,23 @@ main(int argc, char *argv[])
             exit(EXIT_FAILURE);
         }
         if (dec) {
-            while ((n = getsxts((argc >= 1) ? in : stdin, sbuf))) {
+            while ((n = getsxts((in) ? in : stdin, sbuf))) {
                 n = decode(sbuf, n, obuf, url);
-                fwrite(obuf, sizeof(*obuf), n, (argc == 2) ? out : stdout);
+                fwrite(obuf, sizeof(*obuf), n, (out) ? out : stdout);
             }
+        } else if (wrp) {
+            last = 0;
+            while ((n = getocts((in) ? in : stdin, obuf))) {
+                n = encode(obuf, n, sbuf, url);
+                last = printw((out) ? out : stdout, sbuf, n);
+            }
+            if (last != '\n')
+                fprintf((out) ? out : stdout, "\n");
         } else {
-            while ((n = getocts((argc >= 1) ? in : stdin, obuf))) {
-                if (wrp) {
-                    n = encode(obuf, n, sbuf, url);
-                    l = printw((argc == 2) ? out : stdout, sbuf, n);
-                } else {
-                    encode(obuf, n, sbuf, url);
-                    fprintf((argc == 2) ? out : stdout, "%s", sbuf);
-                }
+            while ((n = getocts((in) ? in : stdin, obuf))) {
+                encode(obuf, n, sbuf, url);
+                fprintf((out) ? out : stdout, "%s", sbuf);
             }
-            if (wrp && l != '\n')
-                fprintf((argc == 2) ? out : stdout, "\n");
         }
         if (in)
             fclose(in);
diff --git a/output.c b/output.c
index d5c1a3a..b48713e 100644
--- a/output.c
+++ b/output.c
@@ -8,6 +8,7 @@ printw(FILE *fp, unsigned char *s, int slen)
     static int col;
     int c;
 
+    c = '\n';
     while (slen--) {
         fputc((c = *s++), fp);
         ++col;