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

Diff for /mandoc/Attic/ascii.c between version 1.8 and 1.9

version 1.8, 2009/06/10 20:18:43 version 1.9, 2009/07/27 12:02:49
Line 27 
Line 27 
 struct  line {  struct  line {
         const char       *code;          const char       *code;
         const char       *out;          const char       *out;
         /* 32- and 64-bit alignment safe. */  
         size_t            codesz;          size_t            codesz;
         size_t            outsz;          size_t            outsz;
           int               type;
   #define ASCII_CHAR       (1 << 0)
   #define ASCII_STRING     (1 << 1)
   #define ASCII_BOTH       (0x03)
 };  };
   
 struct  linep {  struct  linep {
Line 37  struct linep {
Line 40  struct linep {
         struct linep     *next;          struct linep     *next;
 };  };
   
 #define LINE(w, x, y, z) \  #define CHAR(w, x, y, z) \
         { (w), (y), (x), (z) },          { (w), (y), (x), (z), ASCII_CHAR },
   #define STRING(w, x, y, z) \
           { (w), (y), (x), (z), ASCII_STRING },
   #define BOTH(w, x, y, z) \
           { (w), (y), (x), (z), ASCII_BOTH },
 static  const struct line lines[] = {  static  const struct line lines[] = {
 #include "ascii.in"  #include "ascii.in"
 };  };
Line 50  struct asciitab {
Line 57  struct asciitab {
   
   
 static  inline int        match(const struct line *,  static  inline int        match(const struct line *,
                                 const char *, size_t);                                  const char *, size_t, int);
   static  const char *      lookup(struct asciitab *, const char *,
                                   size_t, size_t *, int);
   
   
 void  void
Line 125  term_ascii2htab(void)
Line 134  term_ascii2htab(void)
 const char *  const char *
 term_a2ascii(void *arg, 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;  
           return(lookup((struct asciitab *)arg, p,
                                   sz, rsz, ASCII_CHAR));
   }
   
   
   const char *
   term_a2res(void *arg, const char *p, size_t sz, size_t *rsz)
   {
   
           return(lookup((struct asciitab *)arg, p,
                                   sz, rsz, ASCII_STRING));
   }
   
   
   static const char *
   lookup(struct asciitab *tab, const char *p,
                   size_t sz, size_t *rsz, int type)
   {
         struct linep     *pp, *prev;          struct linep     *pp, *prev;
         void            **htab;          void            **htab;
         int               hash;          int               hash;
   
         tab = (struct asciitab *)arg;  
         htab = tab->htab;  
   
         assert(p);          assert(p);
         assert(sz > 0);          assert(sz > 0);
   
Line 147  term_a2ascii(void *arg, const char *p, size_t sz, size
Line 171  term_a2ascii(void *arg, const char *p, size_t sz, size
          */           */
   
         hash = (int)p[0] - ASCII_PRINT_LO;          hash = (int)p[0] - ASCII_PRINT_LO;
           htab = tab->htab;
   
         if (NULL == (pp = ((struct linep **)htab)[hash]))          if (NULL == (pp = ((struct linep **)htab)[hash]))
                 return(NULL);                  return(NULL);
   
         if (NULL == pp->next) {          if (NULL == pp->next) {
                 if ( ! match(pp->line, p, sz))                  if ( ! match(pp->line, p, sz, type))
                         return(NULL);                          return(NULL);
                 *rsz = pp->line->outsz;                  *rsz = pp->line->outsz;
                 return(pp->line->out);                  return(pp->line->out);
         }          }
   
         for (prev = NULL; pp; pp = pp->next) {          for (prev = NULL; pp; pp = pp->next) {
                 if ( ! match(pp->line, p, sz)) {                  if ( ! match(pp->line, p, sz, type)) {
                         prev = pp;                          prev = pp;
                         continue;                          continue;
                 }                  }
Line 181  term_a2ascii(void *arg, const char *p, size_t sz, size
Line 206  term_a2ascii(void *arg, const char *p, size_t sz, size
   
   
 static inline int  static inline int
 match(const struct line *line, const char *p, size_t sz)  match(const struct line *line, const char *p, size_t sz, int type)
 {  {
   
           if ( ! (line->type & type))
                   return(0);
         if (line->codesz != sz)          if (line->codesz != sz)
                 return(0);                  return(0);
         return(0 == strncmp(line->code, p, sz));          return(0 == strncmp(line->code, p, sz));

Legend:
Removed from v.1.8  
changed lines
  Added in v.1.9

CVSweb