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

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

version 1.42, 2020/07/21 15:10: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" };          const char *const toks[] = { "manpath", "output" };
         char manpath_default[] = MANPATH_DEFAULT;          char manpath_default[] = MANPATH_DEFAULT;
Line 201  manconf_file(struct manconf *conf, const char *file)
Line 189  manconf_file(struct manconf *conf, const char *file)
   
                 switch (tok) {                  switch (tok) {
                 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 215  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 223  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", "outfilename", "tagfilename",              "outfilename", "tagfilename",
               /* Token taking an optional argument. */
               "tag",
               /* Tokens not taking arguments. */
             "fragment", "mdoc", "noval", "toc"              "fragment", "mdoc", "noval", "toc"
         };          };
         const size_t ntoks = sizeof(toks) / sizeof(toks[0]);          const size_t ntoks = sizeof(toks) / sizeof(toks[0]);
Line 307  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->tag != NULL) {  
                         oldval = mandoc_strdup(conf->tag);  
                         break;  
                 }  
                 conf->tag = mandoc_strdup(cp);  
                 return 0;  
         case 7:  
                 if (conf->outfilename != NULL) {                  if (conf->outfilename != NULL) {
                         oldval = mandoc_strdup(conf->outfilename);                          oldval = mandoc_strdup(conf->outfilename);
                         break;                          break;
                 }                  }
                 conf->outfilename = mandoc_strdup(cp);                  conf->outfilename = mandoc_strdup(cp);
                 return 0;                  return 0;
         case 8:          case 7:
                 if (conf->tagfilename != NULL) {                  if (conf->tagfilename != NULL) {
                         oldval = mandoc_strdup(conf->tagfilename);                          oldval = mandoc_strdup(conf->tagfilename);
                         break;                          break;
                 }                  }
                 conf->tagfilename = mandoc_strdup(cp);                  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) {
                           oldval = mandoc_strdup(conf->tag);
                           break;
                   }
                   conf->tag = mandoc_strdup(cp);
                 return 0;                  return 0;
         case 9:          case 9:
                 conf->fragment = 1;                  conf->fragment = 1;

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

CVSweb