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

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

version 1.43, 2020/08/27 14:59:47 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');
 }  }
   

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

CVSweb