[BACK]Return to term_tab.c CVS log [TXT][DIR] Up to [cvsweb.bsd.lv] / mandoc

Diff for /mandoc/term_tab.c between version 1.1 and 1.7

version 1.1, 2017/05/07 17:31:45 version 1.7, 2021/10/04 18:56:31
Line 1 
Line 1 
 /*      $OpenBSD$ */  /* $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   * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above   * purpose with or without fee is hereby granted, provided that the above
Line 14 
Line 14 
  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF   * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.   * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */   */
   #include "config.h"
   
 #include <sys/types.h>  #include <sys/types.h>
   
 #include <stddef.h>  #include <stddef.h>
   #include <stdlib.h>
   #include <string.h>
   
 #include "mandoc_aux.h"  #include "mandoc_aux.h"
 #include "out.h"  #include "out.h"
Line 31  struct tablist {
Line 35  struct tablist {
 static struct {  static struct {
         struct tablist   a;     /* All tab positions for lookup. */          struct tablist   a;     /* All tab positions for lookup. */
         struct tablist   p;     /* Periodic tab positions to add. */          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. */          size_t           d;     /* Default tab width in units of n. */
 } tabs;  } tabs;
   
Line 38  static struct {
Line 43  static struct {
 void  void
 term_tab_set(const struct termp *p, const char *arg)  term_tab_set(const struct termp *p, const char *arg)
 {  {
         static int       recording_period;  
   
         struct roffsu    su;          struct roffsu    su;
         struct tablist  *tl;          struct tablist  *tl;
         size_t           pos;          size_t           pos;
Line 49  term_tab_set(const struct termp *p, const char *arg)
Line 52  term_tab_set(const struct termp *p, const char *arg)
   
         if (arg == NULL) {          if (arg == NULL) {
                 tabs.a.n = tabs.p.n = 0;                  tabs.a.n = tabs.p.n = 0;
                 recording_period = 0;                  tabs.r = &tabs.a;
                 if (tabs.d == 0) {                  if (tabs.d == 0) {
                         a2roffsu(".8i", &su, SCALE_IN);                          a2roffsu(".8i", &su, SCALE_IN);
                         tabs.d = term_hspan(p, &su) / 24;                          tabs.d = term_hen(p, &su);
                 }                  }
                 return;                  return;
         }          }
         if (arg[0] == 'T' && arg[1] == '\0') {          if (arg[0] == 'T' && arg[1] == '\0') {
                 recording_period = 1;                  tabs.r = &tabs.p;
                 return;                  return;
         }          }
   
Line 68  term_tab_set(const struct termp *p, const char *arg)
Line 71  term_tab_set(const struct termp *p, const char *arg)
                 arg++;                  arg++;
         } else          } else
                 add = 0;                  add = 0;
         if (a2roffsu(arg, &su, SCALE_EM) == 0)          if (a2roffsu(arg, &su, SCALE_EM) == NULL)
                 return;                  return;
   
         /* Select the list, and extend it if it is full. */          /* 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) {          if (tl->n >= tl->s) {
                 tl->s += 8;                  tl->s += 8;
                 tl->t = mandoc_reallocarray(tl->t, tl->s, sizeof(*tl->t));                  tl->t = mandoc_reallocarray(tl->t, tl->s, sizeof(*tl->t));
Line 81  term_tab_set(const struct termp *p, const char *arg)
Line 84  term_tab_set(const struct termp *p, const char *arg)
   
         /* Append the new position. */          /* Append the new position. */
   
         pos = term_hspan(p, &su);          pos = term_hen(p, &su);
         tl->t[tl->n] = pos;          tl->t[tl->n] = pos;
         if (add && tl->n)          if (add && tl->n)
                 tl->t[tl->n] += tl->t[tl->n - 1];                  tl->t[tl->n] += tl->t[tl->n - 1];
         tl->n++;          tl->n++;
 }  }
   
   /*
    * Simplified version without a parser,
    * never incremental, never periodic, for use by tbl(7).
    */
   void
   term_tab_iset(size_t inc)
   {
           if (tabs.a.n >= tabs.a.s) {
                   tabs.a.s += 8;
                   tabs.a.t = mandoc_reallocarray(tabs.a.t, tabs.a.s,
                       sizeof(*tabs.a.t));
           }
           tabs.a.t[tabs.a.n++] = inc;
   }
   
 size_t  size_t
 term_tab_next(size_t prev)  term_tab_next(size_t prev)
 {  {
Line 97  term_tab_next(size_t prev)
Line 115  term_tab_next(size_t prev)
                 if (i == tabs.a.n) {                  if (i == tabs.a.n) {
                         if (tabs.p.n == 0)                          if (tabs.p.n == 0)
                                 return prev;                                  return prev;
 /*  
                                 return i ? prev :  
                                     (prev / tabs.d + 1) * tabs.d;  
  */  
                         tabs.a.n += tabs.p.n;                          tabs.a.n += tabs.p.n;
                         if (tabs.a.s < tabs.a.n) {                          if (tabs.a.s < tabs.a.n) {
                                 tabs.a.s = tabs.a.n;                                  tabs.a.s = tabs.a.n;
Line 111  term_tab_next(size_t prev)
Line 125  term_tab_next(size_t prev)
                                 tabs.a.t[i + j] = tabs.p.t[j] +                                  tabs.a.t[i + j] = tabs.p.t[j] +
                                     (i ? tabs.a.t[i - 1] : 0);                                      (i ? tabs.a.t[i - 1] : 0);
                 }                  }
                 if (prev < tabs.a.t[i] / 24)                  if (prev < tabs.a.t[i])
                         return tabs.a.t[i] / 24;                          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;
 }  }

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.7

CVSweb