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

Diff for /mandoc/tag.c between version 1.22 and 1.26

version 1.22, 2019/07/10 19:39:01 version 1.26, 2020/01/19 18:02:00
Line 1 
Line 1 
 /*      $Id$ */  /*      $Id$ */
 /*  /*
  * Copyright (c) 2015, 2016, 2018, 2019 Ingo Schwarze <schwarze@openbsd.org>   * Copyright (c) 2015,2016,2018,2019,2020 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 53  static struct tag_files  tag_files;
Line 53  static struct tag_files  tag_files;
  * but for simplicity, create it anyway.   * but for simplicity, create it anyway.
  */   */
 struct tag_files *  struct tag_files *
 tag_init(void)  tag_init(char *tagname)
 {  {
         struct sigaction         sa;          struct sigaction         sa;
         int                      ofd;          int                      ofd;
Line 61  tag_init(void)
Line 61  tag_init(void)
         ofd = -1;          ofd = -1;
         tag_files.tfd = -1;          tag_files.tfd = -1;
         tag_files.tcpgid = -1;          tag_files.tcpgid = -1;
           tag_files.tagname = tagname;
   
         /* Clean up when dying from a signal. */          /* Clean up when dying from a signal. */
   
Line 129  fail:
Line 130  fail:
         *tag_files.tfn = '\0';          *tag_files.tfn = '\0';
         tag_files.ofd = -1;          tag_files.ofd = -1;
         tag_files.tfd = -1;          tag_files.tfd = -1;
           tag_files.tagname = NULL;
         return NULL;          return NULL;
 }  }
   
Line 151  tag_put(const char *s, int prio, size_t line)
Line 153  tag_put(const char *s, int prio, size_t line)
                 s += 2;                  s += 2;
   
         /*          /*
          * Skip whitespace and whatever follows it,           * Skip whitespace and escapes and whatever follows,
          * and if there is any, downgrade the priority.           * and if there is any, downgrade the priority.
          */           */
   
         len = strcspn(s, " \t");          len = strcspn(s, " \t\\");
         if (len == 0)          if (len == 0)
                 return;                  return;
   
Line 194  tag_put(const char *s, int prio, size_t line)
Line 196  tag_put(const char *s, int prio, size_t line)
   
                 /* A better entry is already present, ignore the new one. */                  /* A better entry is already present, ignore the new one. */
   
                 if (entry->prio > 0 && entry->prio < prio)                  if (entry->prio != -1 && entry->prio < prio)
                         return;                          return;
   
                 /* The existing entry is worse, clear it. */                  /* The existing entry is worse, clear it. */
   
                 if (entry->prio < 1 || entry->prio > prio)                  if (entry->prio == -1 || entry->prio == 0 ||
                       entry->prio > prio)
                         entry->nlines = 0;                          entry->nlines = 0;
         }          }
   
Line 225  tag_write(void)
Line 228  tag_write(void)
         struct tag_entry        *entry;          struct tag_entry        *entry;
         size_t                   i;          size_t                   i;
         unsigned int             slot;          unsigned int             slot;
           int                      empty;
   
         if (tag_files.tfd <= 0)          if (tag_files.tfd <= 0)
                 return;                  return;
Line 235  tag_write(void)
Line 239  tag_write(void)
         }          }
         if ((stream = fdopen(tag_files.tfd, "w")) == NULL)          if ((stream = fdopen(tag_files.tfd, "w")) == NULL)
                 mandoc_msg(MANDOCERR_FDOPEN, 0, 0, "%s", strerror(errno));                  mandoc_msg(MANDOCERR_FDOPEN, 0, 0, "%s", strerror(errno));
           empty = 1;
         entry = ohash_first(&tag_data, &slot);          entry = ohash_first(&tag_data, &slot);
         while (entry != NULL) {          while (entry != NULL) {
                 if (stream != NULL && entry->prio >= 0)                  if (stream != NULL && entry->prio != -1) {
                         for (i = 0; i < entry->nlines; i++)                          for (i = 0; i < entry->nlines; i++) {
                                 fprintf(stream, "%s %s %zu\n",                                  fprintf(stream, "%s %s %zu\n",
                                     entry->s, tag_files.ofn, entry->lines[i]);                                      entry->s, tag_files.ofn, entry->lines[i]);
                                   empty = 0;
                           }
                   }
                 free(entry->lines);                  free(entry->lines);
                 free(entry);                  free(entry);
                 entry = ohash_next(&tag_data, &slot);                  entry = ohash_next(&tag_data, &slot);
Line 251  tag_write(void)
Line 259  tag_write(void)
         else          else
                 close(tag_files.tfd);                  close(tag_files.tfd);
         tag_files.tfd = -1;          tag_files.tfd = -1;
           if (empty) {
                   unlink(tag_files.tfn);
                   *tag_files.tfn = '\0';
           }
 }  }
   
 void  void

Legend:
Removed from v.1.22  
changed lines
  Added in v.1.26

CVSweb