term_tab.c (6d38604fc532a3fc060788e3ce40464b46047eaf) | term_tab.c (c1c95add8c80843ba15d784f95c361d795b1f593) |
---|---|
1/* $Id: term_tab.c,v 1.6 2020/06/22 19:20:40 schwarze Exp $ */ | 1/* $Id: term_tab.c,v 1.7 2021/10/04 18:56:31 schwarze Exp $ */ |
2/* | 2/* |
3 * Copyright (c) 2017 Ingo Schwarze <schwarze@openbsd.org> | 3 * Copyright (c) 2017, 2021 Ingo Schwarze <schwarze@openbsd.org> |
4 * 5 * Permission to use, copy, modify, and distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17#include "config.h" 18 19#include <sys/types.h> 20 21#include <stddef.h> | 4 * 5 * Permission to use, copy, modify, and distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17#include "config.h" 18 19#include <sys/types.h> 20 21#include <stddef.h> |
22#include <stdlib.h> 23#include <string.h> |
|
22 23#include "mandoc_aux.h" 24#include "out.h" 25#include "term.h" 26 27struct tablist { 28 size_t *t; /* Allocated array of tab positions. */ 29 size_t s; /* Allocated number of positions. */ 30 size_t n; /* Currently used number of positions. */ 31}; 32 33static struct { 34 struct tablist a; /* All tab positions for lookup. */ 35 struct tablist p; /* Periodic tab positions to add. */ | 24 25#include "mandoc_aux.h" 26#include "out.h" 27#include "term.h" 28 29struct tablist { 30 size_t *t; /* Allocated array of tab positions. */ 31 size_t s; /* Allocated number of positions. */ 32 size_t n; /* Currently used number of positions. */ 33}; 34 35static struct { 36 struct tablist a; /* All tab positions for lookup. */ 37 struct tablist p; /* Periodic tab positions to add. */ |
38 struct tablist *r; /* Tablist currently being recorded. */ |
|
36 size_t d; /* Default tab width in units of n. */ 37} tabs; 38 39 40void 41term_tab_set(const struct termp *p, const char *arg) 42{ | 39 size_t d; /* Default tab width in units of n. */ 40} tabs; 41 42 43void 44term_tab_set(const struct termp *p, const char *arg) 45{ |
43 static int recording_period; 44 | |
45 struct roffsu su; 46 struct tablist *tl; 47 size_t pos; 48 int add; 49 50 /* Special arguments: clear all tabs or switch lists. */ 51 52 if (arg == NULL) { 53 tabs.a.n = tabs.p.n = 0; | 46 struct roffsu su; 47 struct tablist *tl; 48 size_t pos; 49 int add; 50 51 /* Special arguments: clear all tabs or switch lists. */ 52 53 if (arg == NULL) { 54 tabs.a.n = tabs.p.n = 0; |
54 recording_period = 0; | 55 tabs.r = &tabs.a; |
55 if (tabs.d == 0) { 56 a2roffsu(".8i", &su, SCALE_IN); 57 tabs.d = term_hen(p, &su); 58 } 59 return; 60 } 61 if (arg[0] == 'T' && arg[1] == '\0') { | 56 if (tabs.d == 0) { 57 a2roffsu(".8i", &su, SCALE_IN); 58 tabs.d = term_hen(p, &su); 59 } 60 return; 61 } 62 if (arg[0] == 'T' && arg[1] == '\0') { |
62 recording_period = 1; | 63 tabs.r = &tabs.p; |
63 return; 64 } 65 66 /* Parse the sign, the number, and the unit. */ 67 68 if (*arg == '+') { 69 add = 1; 70 arg++; 71 } else 72 add = 0; 73 if (a2roffsu(arg, &su, SCALE_EM) == NULL) 74 return; 75 76 /* Select the list, and extend it if it is full. */ 77 | 64 return; 65 } 66 67 /* Parse the sign, the number, and the unit. */ 68 69 if (*arg == '+') { 70 add = 1; 71 arg++; 72 } else 73 add = 0; 74 if (a2roffsu(arg, &su, SCALE_EM) == NULL) 75 return; 76 77 /* Select the list, and extend it if it is full. */ 78 |
78 tl = recording_period ? &tabs.p : &tabs.a; | 79 tl = tabs.r; |
79 if (tl->n >= tl->s) { 80 tl->s += 8; 81 tl->t = mandoc_reallocarray(tl->t, tl->s, sizeof(*tl->t)); 82 } 83 84 /* Append the new position. */ 85 86 pos = term_hen(p, &su); --- 36 unchanged lines hidden (view full) --- 123 for (j = 0; j < tabs.p.n; j++) 124 tabs.a.t[i + j] = tabs.p.t[j] + 125 (i ? tabs.a.t[i - 1] : 0); 126 } 127 if (prev < tabs.a.t[i]) 128 return tabs.a.t[i]; 129 } 130} | 80 if (tl->n >= tl->s) { 81 tl->s += 8; 82 tl->t = mandoc_reallocarray(tl->t, tl->s, sizeof(*tl->t)); 83 } 84 85 /* Append the new position. */ 86 87 pos = term_hen(p, &su); --- 36 unchanged lines hidden (view full) --- 124 for (j = 0; j < tabs.p.n; j++) 125 tabs.a.t[i + j] = tabs.p.t[j] + 126 (i ? tabs.a.t[i - 1] : 0); 127 } 128 if (prev < tabs.a.t[i]) 129 return tabs.a.t[i]; 130 } 131} |
132 133void 134term_tab_free(void) 135{ 136 free(tabs.a.t); 137 free(tabs.p.t); 138 memset(&tabs, 0, sizeof(tabs)); 139 tabs.r = &tabs.a; 140} |
|