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

Diff for /mandoc/term_tag.c between version 1.2 and 1.5

version 1.2, 2020/04/02 22:12:55 version 1.5, 2020/07/21 15:10:01
Line 22 
Line 22 
 #include <sys/types.h>  #include <sys/types.h>
   
 #include <errno.h>  #include <errno.h>
   #include <fcntl.h>
 #include <signal.h>  #include <signal.h>
 #include <stddef.h>  #include <stddef.h>
 #include <stdio.h>  #include <stdio.h>
Line 31 
Line 32 
   
 #include "mandoc.h"  #include "mandoc.h"
 #include "roff.h"  #include "roff.h"
   #include "roff_int.h"
 #include "tag.h"  #include "tag.h"
 #include "term_tag.h"  #include "term_tag.h"
   
Line 45  static struct tag_files tag_files;
Line 47  static struct tag_files tag_files;
  * but for simplicity, create it anyway.   * but for simplicity, create it anyway.
  */   */
 struct tag_files *  struct tag_files *
 term_tag_init(void)  term_tag_init(const char *outfilename, const char *tagfilename)
 {  {
         struct sigaction         sa;          struct sigaction         sa;
         int                      ofd;   /* In /tmp/, dup(2)ed to stdout. */          int                      ofd;   /* In /tmp/, dup(2)ed to stdout. */
Line 82  term_tag_init(void)
Line 84  term_tag_init(void)
   
         /* Create both temporary output files. */          /* Create both temporary output files. */
   
         (void)strlcpy(tag_files.ofn, "/tmp/man.XXXXXXXXXX",          if (outfilename == NULL) {
             sizeof(tag_files.ofn));                  (void)strlcpy(tag_files.ofn, "/tmp/man.XXXXXXXXXX",
         (void)strlcpy(tag_files.tfn, "/tmp/man.XXXXXXXXXX",                      sizeof(tag_files.ofn));
             sizeof(tag_files.tfn));                  if ((ofd = mkstemp(tag_files.ofn)) == -1) {
         if ((ofd = mkstemp(tag_files.ofn)) == -1) {                          mandoc_msg(MANDOCERR_MKSTEMP, 0, 0,
                 mandoc_msg(MANDOCERR_MKSTEMP, 0, 0,                              "%s: %s", tag_files.ofn, strerror(errno));
                     "%s: %s", tag_files.ofn, strerror(errno));                          goto fail;
                 goto fail;                  }
           } else {
                   (void)strlcpy(tag_files.ofn, outfilename,
                      sizeof(tag_files.ofn));
                   unlink(outfilename);
                   ofd = open(outfilename, O_WRONLY | O_CREAT | O_EXCL, 0644);
                   if (ofd == -1) {
                           mandoc_msg(MANDOCERR_OPEN, 0, 0,
                               "%s: %s", outfilename, strerror(errno));
                           goto fail;
                   }
         }          }
         if ((tfd = mkstemp(tag_files.tfn)) == -1) {          if (tagfilename == NULL) {
                 mandoc_msg(MANDOCERR_MKSTEMP, 0, 0,                  (void)strlcpy(tag_files.tfn, "/tmp/man.XXXXXXXXXX",
                     "%s: %s", tag_files.tfn, strerror(errno));                      sizeof(tag_files.tfn));
                 goto fail;                  if ((tfd = mkstemp(tag_files.tfn)) == -1) {
                           mandoc_msg(MANDOCERR_MKSTEMP, 0, 0,
                               "%s: %s", tag_files.tfn, strerror(errno));
                           goto fail;
                   }
           } else {
                   (void)strlcpy(tag_files.tfn, tagfilename,
                       sizeof(tag_files.tfn));
                   unlink(tagfilename);
                   tfd = open(tagfilename, O_WRONLY | O_CREAT | O_EXCL, 0644);
                   if (tfd == -1) {
                           mandoc_msg(MANDOCERR_OPEN, 0, 0,
                               "%s: %s", tagfilename, strerror(errno));
                           goto fail;
                   }
         }          }
         if ((tag_files.tfs = fdopen(tfd, "w")) == NULL) {          if ((tag_files.tfs = fdopen(tfd, "w")) == NULL) {
                 mandoc_msg(MANDOCERR_FDOPEN, 0, 0, "%s", strerror(errno));                  mandoc_msg(MANDOCERR_FDOPEN, 0, 0, "%s", strerror(errno));
Line 129  term_tag_write(struct roff_node *n, size_t line)
Line 155  term_tag_write(struct roff_node *n, size_t line)
   
         if (tag_files.tfs == NULL)          if (tag_files.tfs == NULL)
                 return;                  return;
         if (n->string == NULL)          cp = n->tag == NULL ? n->child->string : n->tag;
                 n = n->child;  
         cp = n->string;  
         if (cp[0] == '\\' && (cp[1] == '&' || cp[1] == 'e'))          if (cp[0] == '\\' && (cp[1] == '&' || cp[1] == 'e'))
                 cp += 2;                  cp += 2;
         len = strcspn(cp, " \t\\");          len = strcspn(cp, " \t\\");
Line 176  term_tag_unlink(void)
Line 200  term_tag_unlink(void)
                     getpgid(tc_pgid) == -1)                      getpgid(tc_pgid) == -1)
                         (void)tcsetpgrp(STDOUT_FILENO, tag_files.tcpgid);                          (void)tcsetpgrp(STDOUT_FILENO, tag_files.tcpgid);
         }          }
         if (*tag_files.ofn != '\0') {          if (strncmp(tag_files.ofn, "/tmp/man.", 9) == 0) {
                 unlink(tag_files.ofn);                  unlink(tag_files.ofn);
                 *tag_files.ofn = '\0';                  *tag_files.ofn = '\0';
         }          }
         if (*tag_files.tfn != '\0') {          if (strncmp(tag_files.tfn, "/tmp/man.", 9) == 0) {
                 unlink(tag_files.tfn);                  unlink(tag_files.tfn);
                 *tag_files.tfn = '\0';                  *tag_files.tfn = '\0';
         }          }

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

CVSweb