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

Diff for /mandoc/Attic/ascii.c between version 1.1 and 1.7

version 1.1, 2009/03/16 22:19:19 version 1.7, 2009/04/12 19:45:26
Line 1 
Line 1 
 /* $Id$ */  /*      $Id$ */
 /*  /*
  * Copyright (c) 2009 Kristaps Dzonsons <kristaps@openbsd.org>   * Copyright (c) 2009 Kristaps Dzonsons <kristaps@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   * purpose with or without fee is hereby granted, provided that the above
  * above copyright notice and this permission notice appear in all   * copyright notice and this permission notice appear in all copies.
  * copies.  
  *   *
  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL   * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED   * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE   * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL   * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR   * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER   * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR   * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  * PERFORMANCE OF THIS SOFTWARE.  
  */   */
 #include <assert.h>  #include <assert.h>
 #include <err.h>  #include <err.h>
Line 26 
Line 24 
 #define ASCII_PRINT_HI   126  #define ASCII_PRINT_HI   126
 #define ASCII_PRINT_LO   32  #define ASCII_PRINT_LO   32
   
 /*  
  * Lookup and hashing routines for constructing the ASCII symbol table,  
  * which should contain a significant portion of mdoc(7)'s special  
  * symbols.  
  */  
   
 struct  line {  struct  line {
         const char      *code;          const char       *code;
         const char      *out;          const char       *out;
         /* 32- and 64-bit alignment safe. */          /* 32- and 64-bit alignment safe. */
         size_t           codesz;          size_t            codesz;
         size_t           outsz;          size_t            outsz;
 };  };
   
 struct  linep {  struct  linep {
         const struct line *line;          const struct line *line;
         struct linep    *next;          struct linep     *next;
 };  };
   
 #define LINE(w, x, y, z) \  #define LINE(w, x, y, z) \
Line 51  static const struct line lines[] = {
Line 43  static const struct line lines[] = {
 #include "ascii.in"  #include "ascii.in"
 };  };
   
   struct  asciitab {
           struct linep     *lines;
           void            **htab;
   };
   
 static  inline int       match(const struct line *,  
   static  inline int        match(const struct line *,
                                 const char *, size_t);                                  const char *, size_t);
   
   
   void
   term_asciifree(void *arg)
   {
           struct asciitab *tab;
   
           tab = (struct asciitab *)arg;
   
           free(tab->lines);
           free(tab->htab);
           free(tab);
   }
   
   
 void *  void *
 ascii2htab(void)  term_ascii2htab(void)
 {  {
           struct asciitab  *tab;
         void            **htab;          void            **htab;
         struct linep     *pp, *p;          struct linep     *pp, *p;
         int               i, len, hash;          int               i, len, hash;
Line 70  ascii2htab(void)
Line 81  ascii2htab(void)
          * (they're in-line re-ordered during lookup).           * (they're in-line re-ordered during lookup).
          */           */
   
         assert(0 == sizeof(lines) % sizeof(struct line));          if (NULL == (tab = malloc(sizeof(struct asciitab))))
                   err(1, "malloc");
   
         len = sizeof(lines) / sizeof(struct line);          len = sizeof(lines) / sizeof(struct line);
   
         if (NULL == (p = calloc((size_t)len, sizeof(struct linep))))          if (NULL == (p = calloc((size_t)len, sizeof(struct linep))))
Line 102  ascii2htab(void)
Line 115  ascii2htab(void)
                 pp->next = &p[i];                  pp->next = &p[i];
         }          }
   
         return((void *)htab);          tab->htab = htab;
           tab->lines = p;
   
           return(tab);
 }  }
   
   
 const char *  const char *
 a2ascii(void *htabp, const char *p, size_t sz, size_t *rsz)  term_a2ascii(void *arg, const char *p, size_t sz, size_t *rsz)
 {  {
           struct asciitab  *tab;
         struct linep     *pp, *prev;          struct linep     *pp, *prev;
         void            **htab;          void            **htab;
         int               hash;          int               hash;
   
         htab = (void **)htabp;          tab = (struct asciitab *)arg;
           htab = tab->htab;
   
         assert(p);          assert(p);
         assert(sz > 0);          assert(sz > 0);
         assert(p[0] >= ASCII_PRINT_LO && p[0] <= ASCII_PRINT_HI);  
           if (p[0] < ASCII_PRINT_LO || p[0] > ASCII_PRINT_HI)
                   return(NULL);
   
   
         /*          /*
          * Lookup the symbol in the symbol hash.  See ascii2htab for the           * Lookup the symbol in the symbol hash.  See ascii2htab for the

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

CVSweb