]> git.cameronkatri.com Git - mandoc.git/commitdiff
Provide a cleanup function for the term_tab module, freeing memory
authorIngo Schwarze <schwarze@openbsd.org>
Mon, 4 Oct 2021 18:56:31 +0000 (18:56 +0000)
committerIngo Schwarze <schwarze@openbsd.org>
Mon, 4 Oct 2021 18:56:31 +0000 (18:56 +0000)
and resetting the internal state to the initial state.
Call this function from the proper place in term_free().

With the way the module is currently used, this does not imply any
functional change, but doing proper cleanup is more robust, makes
it easier during code review to understand what is going on, and
makes it explicit that there is no memory leak.

term.c
term.h
term_tab.c

diff --git a/term.c b/term.c
index fb0351d91f1d693c28ee0bcebaa2712a4f2d1a18..f4adf9522a4f5edf166a3a855a31ed8e6f005ff4 100644 (file)
--- a/term.c
+++ b/term.c
@@ -1,7 +1,7 @@
-/* $Id: term.c,v 1.283 2021/08/10 12:55:04 schwarze Exp $ */
+/* $Id: term.c,v 1.284 2021/10/04 18:56:31 schwarze Exp $ */
 /*
+ * Copyright (c) 2010-2021 Ingo Schwarze <schwarze@openbsd.org>
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2010-2020 Ingo Schwarze <schwarze@openbsd.org>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -58,6 +58,7 @@ term_setcol(struct termp *p, size_t maxtcol)
 void
 term_free(struct termp *p)
 {
+       term_tab_free();
        for (p->tcol = p->tcols; p->tcol < p->tcols + p->maxtcol; p->tcol++)
                free(p->tcol->buf);
        free(p->tcols);
diff --git a/term.h b/term.h
index f0a033a46f318673108033d73386e17e0cd2fb39..fba4dca20126638320b0cfc9abebdf7db69d6857 100644 (file)
--- a/term.h
+++ b/term.h
@@ -1,4 +1,4 @@
-/*     $Id: term.h,v 1.131 2019/01/04 03:21:02 schwarze Exp $ */
+/* $Id: term.h,v 1.132 2021/10/04 18:56:31 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2011-2015, 2017, 2019 Ingo Schwarze <schwarze@openbsd.org>
@@ -150,6 +150,7 @@ size_t                term_len(const struct termp *, size_t);
 void             term_tab_set(const struct termp *, const char *);
 void             term_tab_iset(size_t);
 size_t           term_tab_next(size_t);
+void             term_tab_free(void);
 
 void             term_fontpush(struct termp *, enum termfont);
 void             term_fontpop(struct termp *);
index 84b4c00c6e65f13bee9d8f885392f3b90b287edb..a2d1074159b96ddc1536cae1c008613d98d855c0 100644 (file)
@@ -1,6 +1,6 @@
-/* $Id: term_tab.c,v 1.6 2020/06/22 19:20:40 schwarze Exp $ */
+/* $Id: term_tab.c,v 1.7 2021/10/04 18:56:31 schwarze Exp $ */
 /*
- * Copyright (c) 2017 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2017, 2021 Ingo Schwarze <schwarze@openbsd.org>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -19,6 +19,8 @@
 #include <sys/types.h>
 
 #include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
 
 #include "mandoc_aux.h"
 #include "out.h"
@@ -33,6 +35,7 @@ struct tablist {
 static struct {
        struct tablist   a;     /* All tab positions for lookup. */
        struct tablist   p;     /* Periodic tab positions to add. */
+       struct tablist  *r;     /* Tablist currently being recorded. */
        size_t           d;     /* Default tab width in units of n. */
 } tabs;
 
@@ -40,8 +43,6 @@ static struct {
 void
 term_tab_set(const struct termp *p, const char *arg)
 {
-       static int       recording_period;
-
        struct roffsu    su;
        struct tablist  *tl;
        size_t           pos;
@@ -51,7 +52,7 @@ term_tab_set(const struct termp *p, const char *arg)
 
        if (arg == NULL) {
                tabs.a.n = tabs.p.n = 0;
-               recording_period = 0;
+               tabs.r = &tabs.a;
                if (tabs.d == 0) {
                        a2roffsu(".8i", &su, SCALE_IN);
                        tabs.d = term_hen(p, &su);
@@ -59,7 +60,7 @@ term_tab_set(const struct termp *p, const char *arg)
                return;
        }
        if (arg[0] == 'T' && arg[1] == '\0') {
-               recording_period = 1;
+               tabs.r = &tabs.p;
                return;
        }
 
@@ -75,7 +76,7 @@ term_tab_set(const struct termp *p, const char *arg)
 
        /* Select the list, and extend it if it is full. */
 
-       tl = recording_period ? &tabs.p : &tabs.a;
+       tl = tabs.r;
        if (tl->n >= tl->s) {
                tl->s += 8;
                tl->t = mandoc_reallocarray(tl->t, tl->s, sizeof(*tl->t));
@@ -128,3 +129,12 @@ term_tab_next(size_t prev)
                        return tabs.a.t[i];
        }
 }
+
+void
+term_tab_free(void)
+{
+       free(tabs.a.t);
+       free(tabs.p.t);
+       memset(&tabs, 0, sizeof(tabs));
+       tabs.r = &tabs.a;
+}