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

Diff for /mandoc/tag.c between version 1.1 and 1.5

version 1.1, 2015/07/17 22:38:29 version 1.5, 2015/07/25 14:28:59
Line 16 
Line 16 
  */   */
 #include <sys/types.h>  #include <sys/types.h>
   
   #include <signal.h>
 #include <stddef.h>  #include <stddef.h>
 #include <stdio.h>  #include <stdio.h>
 #include <stdlib.h>  #include <stdlib.h>
Line 33 
Line 34 
   
 struct tag_entry {  struct tag_entry {
         size_t   line;          size_t   line;
           int      prio;
         char     s[];          char     s[];
 };  };
   
   static  void     tag_signal(int);
 static  void    *tag_alloc(size_t, void *);  static  void    *tag_alloc(size_t, void *);
 static  void     tag_free(void *, void *);  static  void     tag_free(void *, void *);
 static  void    *tag_calloc(size_t, size_t, void *);  static  void    *tag_calloc(size_t, size_t, void *);
Line 50  static int   tag_fd = -1;
Line 53  static int   tag_fd = -1;
  * where various marked-up terms are documented and create   * where various marked-up terms are documented and create
  * the temporary tags file, saving the name for the pager.   * the temporary tags file, saving the name for the pager.
  */   */
 void  char *
 tag_init(void)  tag_init(void)
 {  {
         struct ohash_info        tag_info;          struct ohash_info        tag_info;
   
         tag_fn = mandoc_strdup("/tmp/man.XXXXXXXXXX");          tag_fn = mandoc_strdup("/tmp/man.XXXXXXXXXX");
           signal(SIGHUP, tag_signal);
           signal(SIGINT, tag_signal);
           signal(SIGTERM, tag_signal);
         if ((tag_fd = mkstemp(tag_fn)) == -1) {          if ((tag_fd = mkstemp(tag_fn)) == -1) {
                 free(tag_fn);                  free(tag_fn);
                 tag_fn = NULL;                  tag_fn = NULL;
                 return;                  return(NULL);
         }          }
   
         tag_info.alloc = tag_alloc;          tag_info.alloc = tag_alloc;
Line 68  tag_init(void)
Line 74  tag_init(void)
         tag_info.key_offset = offsetof(struct tag_entry, s);          tag_info.key_offset = offsetof(struct tag_entry, s);
         tag_info.data = NULL;          tag_info.data = NULL;
         ohash_init(&tag_data, 4, &tag_info);          ohash_init(&tag_data, 4, &tag_info);
 }  
   
 char *  
 tag_filename(void)  
 {  
   
         return(tag_fn);          return(tag_fn);
 }  }
   
 /*  /*
  * Return the line number where a term is defined,   * Set the line number where a term is defined,
  * or 0 if the term is unknown.   * unless it is already defined at a higher priority.
  */   */
 size_t  
 tag_get(const char *s, size_t len)  
 {  
         struct tag_entry        *entry;  
         const char              *end;  
         unsigned int             slot;  
   
         if (tag_fd == -1)  
                 return(0);  
         if (len == 0)  
                 len = strlen(s);  
         end = s + len;  
         slot = ohash_qlookupi(&tag_data, s, &end);  
         entry = ohash_find(&tag_data, slot);  
         return(entry == NULL ? 0 : entry->line);  
 }  
   
 /*  
  * Set the line number where a term is defined.  
  */  
 void  void
 tag_put(const char *s, size_t len, size_t line)  tag_put(const char *s, int prio, size_t line)
 {  {
         struct tag_entry        *entry;          struct tag_entry        *entry;
         const char              *end;          size_t                   len;
         unsigned int             slot;          unsigned int             slot;
   
         if (tag_fd == -1)          if (tag_fd == -1)
                 return;                  return;
         if (len == 0)          slot = ohash_qlookup(&tag_data, s);
                 len = strlen(s);  
         end = s + len;  
         slot = ohash_qlookupi(&tag_data, s, &end);  
         entry = ohash_find(&tag_data, slot);          entry = ohash_find(&tag_data, slot);
         if (entry == NULL) {          if (entry == NULL) {
                 entry = mandoc_malloc(sizeof(*entry) + len + 1);                  len = strlen(s) + 1;
                   entry = mandoc_malloc(sizeof(*entry) + len);
                 memcpy(entry->s, s, len);                  memcpy(entry->s, s, len);
                 entry->s[len] = '\0';  
                 ohash_insert(&tag_data, slot, entry);                  ohash_insert(&tag_data, slot, entry);
         }          } else if (entry->prio <= prio)
                   return;
         entry->line = line;          entry->line = line;
           entry->prio = prio;
 }  }
   
 /*  /*
Line 156  tag_unlink(void)
Line 135  tag_unlink(void)
   
         if (tag_fn != NULL)          if (tag_fn != NULL)
                 unlink(tag_fn);                  unlink(tag_fn);
   }
   
   static void
   tag_signal(int signum)
   {
   
           tag_unlink();
           signal(signum, SIG_DFL);
           kill(getpid(), signum);
           /* NOTREACHED */
           _exit(1);
 }  }
   
 /*  /*

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

CVSweb