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

Diff for /mandoc/manpath.c between version 1.40 and 1.44

version 1.40, 2019/07/10 19:39:01 version 1.44, 2021/11/05 18:03:08
Line 31 
Line 31 
 #include "mandoc.h"  #include "mandoc.h"
 #include "manconf.h"  #include "manconf.h"
   
 static  void     manconf_file(struct manconf *, const char *);  static  void     manconf_file(struct manconf *, const char *, int);
 static  void     manpath_add(struct manpaths *, const char *, char);  static  void     manpath_add(struct manpaths *, const char *, char);
 static  void     manpath_parseline(struct manpaths *, char *, char);  static  void     manpath_parseline(struct manpaths *, char *, char);
   
   
 void  void
 manconf_parse(struct manconf *conf, const char *file,  manconf_parse(struct manconf *conf, const char *file, char *pend, char *pbeg)
                 char *defp, char *auxp)  
 {  {
         char            *insert;          int use_path_from_file = 1;
   
         /* Always prepend -m. */          /* Always prepend -m. */
         manpath_parseline(&conf->manpath, auxp, 'm');          manpath_parseline(&conf->manpath, pbeg, 'm');
   
         /* If -M is given, it overrides everything else. */          if (pend != NULL && *pend != '\0') {
         if (NULL != defp) {                  /* If -M is given, it overrides everything else. */
                 manpath_parseline(&conf->manpath, defp, 'M');                  manpath_parseline(&conf->manpath, pend, 'M');
                 return;                  use_path_from_file = 0;
                   pbeg = pend = NULL;
           } else if ((pbeg = getenv("MANPATH")) == NULL || *pbeg == '\0') {
                   /* No MANPATH; use man.conf(5) only. */
                   pbeg = pend = NULL;
           } else if (*pbeg == ':') {
                   /* Prepend man.conf(5) to MANPATH. */
                   pend = pbeg + 1;
                   pbeg = NULL;
           } else if ((pend = strstr(pbeg, "::")) != NULL) {
                   /* Insert man.conf(5) into MANPATH. */
                   *pend = '\0';
                   pend += 2;
           } else if (pbeg[strlen(pbeg) - 1] == ':') {
                   /* Append man.conf(5) to MANPATH. */
                   pend = NULL;
           } else {
                   /* MANPATH overrides man.conf(5) completely. */
                   use_path_from_file = 0;
                   pend = NULL;
         }          }
   
         /* MANPATH and man.conf(5) cooperate. */          manpath_parseline(&conf->manpath, pbeg, '\0');
         defp = getenv("MANPATH");  
         if (NULL == file)          if (file == NULL)
                 file = MAN_CONF_FILE;                  file = MAN_CONF_FILE;
           manconf_file(conf, file, use_path_from_file);
   
         /* No MANPATH; use man.conf(5) only. */          manpath_parseline(&conf->manpath, pend, '\0');
         if (NULL == defp || '\0' == defp[0]) {  
                 manconf_file(conf, file);  
                 return;  
         }  
   
         /* Prepend man.conf(5) to MANPATH. */  
         if (':' == defp[0]) {  
                 manconf_file(conf, file);  
                 manpath_parseline(&conf->manpath, defp, '\0');  
                 return;  
         }  
   
         /* Append man.conf(5) to MANPATH. */  
         if (':' == defp[strlen(defp) - 1]) {  
                 manpath_parseline(&conf->manpath, defp, '\0');  
                 manconf_file(conf, file);  
                 return;  
         }  
   
         /* Insert man.conf(5) into MANPATH. */  
         insert = strstr(defp, "::");  
         if (NULL != insert) {  
                 *insert++ = '\0';  
                 manpath_parseline(&conf->manpath, defp, '\0');  
                 manconf_file(conf, file);  
                 manpath_parseline(&conf->manpath, insert + 1, '\0');  
                 return;  
         }  
   
         /* MANPATH overrides man.conf(5) completely. */  
         manpath_parseline(&conf->manpath, defp, '\0');  
 }  }
   
 void  void
Line 161  manconf_free(struct manconf *conf)
Line 149  manconf_free(struct manconf *conf)
 }  }
   
 static void  static void
 manconf_file(struct manconf *conf, const char *file)  manconf_file(struct manconf *conf, const char *file, int use_path_from_file)
 {  {
         const char *const toks[] = { "manpath", "output", "_whatdb" };          const char *const toks[] = { "manpath", "output" };
         char manpath_default[] = MANPATH_DEFAULT;          char manpath_default[] = MANPATH_DEFAULT;
   
         FILE            *stream;          FILE            *stream;
Line 200  manconf_file(struct manconf *conf, const char *file)
Line 188  manconf_file(struct manconf *conf, const char *file)
                 }                  }
   
                 switch (tok) {                  switch (tok) {
                 case 2:  /* _whatdb */  
                         while (ep > cp && ep[-1] != '/')  
                                 ep--;  
                         if (ep == cp)  
                                 continue;  
                         *ep = '\0';  
                         /* FALLTHROUGH */  
                 case 0:  /* manpath */                  case 0:  /* manpath */
                         manpath_add(&conf->manpath, cp, '\0');                          if (use_path_from_file)
                                   manpath_add(&conf->manpath, cp, '\0');
                         *manpath_default = '\0';                          *manpath_default = '\0';
                         break;                          break;
                 case 1:  /* output */                  case 1:  /* output */
Line 222  manconf_file(struct manconf *conf, const char *file)
Line 204  manconf_file(struct manconf *conf, const char *file)
         fclose(stream);          fclose(stream);
   
 out:  out:
         if (*manpath_default != '\0')          if (use_path_from_file && *manpath_default != '\0')
                 manpath_parseline(&conf->manpath, manpath_default, '\0');                  manpath_parseline(&conf->manpath, manpath_default, '\0');
 }  }
   
Line 230  int
Line 212  int
 manconf_output(struct manoutput *conf, const char *cp, int fromfile)  manconf_output(struct manoutput *conf, const char *cp, int fromfile)
 {  {
         const char *const toks[] = {          const char *const toks[] = {
               /* Tokens requiring an argument. */
             "includes", "man", "paper", "style", "indent", "width",              "includes", "man", "paper", "style", "indent", "width",
             "tag", "fragment", "mdoc", "noval", "toc"              "outfilename", "tagfilename",
               /* Token taking an optional argument. */
               "tag",
               /* Tokens not taking arguments. */
               "fragment", "mdoc", "noval", "toc"
         };          };
         const size_t ntoks = sizeof(toks) / sizeof(toks[0]);          const size_t ntoks = sizeof(toks) / sizeof(toks[0]);
   
Line 252  manconf_output(struct manoutput *conf, const char *cp,
Line 239  manconf_output(struct manoutput *conf, const char *cp,
                 }                  }
         }          }
   
         if (tok < 6 && *cp == '\0') {          if (tok < 8 && *cp == '\0') {
                 mandoc_msg(MANDOCERR_BADVAL_MISS, 0, 0, "-O %s=?", toks[tok]);                  mandoc_msg(MANDOCERR_BADVAL_MISS, 0, 0, "-O %s=?", toks[tok]);
                 return -1;                  return -1;
         }          }
         if (tok > 6 && tok < ntoks && *cp != '\0') {          if (tok > 8 && tok < ntoks && *cp != '\0') {
                 mandoc_msg(MANDOCERR_BADVAL, 0, 0, "-O %s=%s", toks[tok], cp);                  mandoc_msg(MANDOCERR_BADVAL, 0, 0, "-O %s=%s", toks[tok], cp);
                 return -1;                  return -1;
         }          }
Line 313  manconf_output(struct manoutput *conf, const char *cp,
Line 300  manconf_output(struct manoutput *conf, const char *cp,
                     "-O width=%s is %s", cp, errstr);                      "-O width=%s is %s", cp, errstr);
                 return -1;                  return -1;
         case 6:          case 6:
                   if (conf->outfilename != NULL) {
                           oldval = mandoc_strdup(conf->outfilename);
                           break;
                   }
                   conf->outfilename = mandoc_strdup(cp);
                   return 0;
           case 7:
                   if (conf->tagfilename != NULL) {
                           oldval = mandoc_strdup(conf->tagfilename);
                           break;
                   }
                   conf->tagfilename = mandoc_strdup(cp);
                   return 0;
           /*
            * If the index of the following token changes,
            * do not forget to adjust the range check above the switch.
            */
           case 8:
                 if (conf->tag != NULL) {                  if (conf->tag != NULL) {
                         oldval = mandoc_strdup(conf->tag);                          oldval = mandoc_strdup(conf->tag);
                         break;                          break;
                 }                  }
                 conf->tag = mandoc_strdup(cp);                  conf->tag = mandoc_strdup(cp);
                 return 0;                  return 0;
         case 7:          case 9:
                 conf->fragment = 1;                  conf->fragment = 1;
                 return 0;                  return 0;
         case 8:          case 10:
                 conf->mdoc = 1;                  conf->mdoc = 1;
                 return 0;                  return 0;
         case 9:          case 11:
                 conf->noval = 1;                  conf->noval = 1;
                 return 0;                  return 0;
         case 10:          case 12:
                 conf->toc = 1;                  conf->toc = 1;
                 return 0;                  return 0;
         default:          default:

Legend:
Removed from v.1.40  
changed lines
  Added in v.1.44

CVSweb