diff options
author | Ingo Schwarze <schwarze@openbsd.org> | 2021-10-04 18:56:31 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@openbsd.org> | 2021-10-04 18:56:31 +0000 |
commit | 3d2bee60386823d65fd28f111425ea3de7585bb7 (patch) | |
tree | e1cd71fdca51a50f88b8fec70f0b9a7763574a39 /term_tab.c | |
parent | d9e36737be633b363b9bcd7279d111cf27e49f8a (diff) | |
download | mandoc-3d2bee60386823d65fd28f111425ea3de7585bb7.tar.gz |
Provide a cleanup function for the term_tab module, freeing memory
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.
Diffstat (limited to 'term_tab.c')
-rw-r--r-- | term_tab.c | 22 |
1 files changed, 16 insertions, 6 deletions
@@ -1,6 +1,6 @@ /* $Id$ */ /* - * 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; +} |