home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / octa21fs.zip / octave / kpathsea / kdefault.c < prev    next >
C/C++ Source or Header  |  2000-01-15  |  4KB  |  123 lines

  1. /* kdefault.c: Expand extra colons.
  2.    (This is not named default.c because then the OSF/1 make tries to
  3.    make a program `default' from it, since we have a target `default';
  4.    and OSF/1 make doesn't understand .PHONY.)
  5.  
  6. Copyright (C) 1993, 94, 96 Karl Berry.
  7.  
  8. This library is free software; you can redistribute it and/or
  9. modify it under the terms of the GNU Library General Public
  10. License as published by the Free Software Foundation; either
  11. version 2 of the License, or (at your option) any later version.
  12.  
  13. This library is distributed in the hope that it will be useful,
  14. but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  16. Library General Public License for more details.
  17.  
  18. You should have received a copy of the GNU Library General Public
  19. License along with this library; if not, write to the Free Software
  20. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
  21.  
  22. #include <kpathsea/config.h>
  23.  
  24. #include <kpathsea/c-pathch.h>
  25. #include <kpathsea/default.h>
  26.  
  27.  
  28. /* Check for leading colon first, then trailing, then doubled, since
  29.    that is fastest.  Usually it will be leading or trailing.  */
  30.  
  31. string 
  32. kpse_expand_default P2C(const_string, path,  const_string, fallback)
  33. {
  34.   unsigned path_length;
  35.   string expansion;
  36.   
  37.   /* The default path better not be null.  */
  38.   assert (fallback);
  39.   
  40.   if (path == NULL)
  41.     expansion = xstrdup (fallback);
  42.  
  43.   /* Solitary or leading :?  */
  44.   else if (IS_ENV_SEP (*path))
  45.     {
  46.       expansion = path[1] == 0 ? xstrdup (fallback) : concat (fallback, path);
  47.     }
  48.  
  49.   /* Sorry about the assignment in the middle of the expression, but
  50.      conventions were made to be flouted and all that.  I don't see the
  51.      point of calling strlen twice or complicating the logic just to
  52.      avoid the assignment (especially now that I've pointed it out at
  53.      such great length).  */
  54.   else if (path[(path_length = strlen (path)) - 1] == ENV_SEP)
  55.     expansion = concat (path, fallback);
  56.  
  57.   /* OK, not leading or trailing.  Check for doubled.  */
  58.   else
  59.     {
  60.       const_string loc;
  61.  
  62.       /* What we'll return if we find none.  */
  63.       expansion = xstrdup (path);
  64.  
  65.       for (loc = path; *loc; loc++)
  66.         {
  67.           if (IS_ENV_SEP (loc[0]) && IS_ENV_SEP (loc[1]))
  68.             { /* We have a doubled colon.  */
  69.               expansion = xmalloc (path_length + strlen (fallback) + 1);
  70.               
  71.               /* Copy stuff up to and including the first colon.  */
  72.               strncpy (expansion, path, loc - path + 1);
  73.               expansion[loc - path + 1] = 0;
  74.               
  75.               /* Copy in FALLBACK, and then the rest of PATH.  */
  76.               strcat (expansion, fallback);
  77.               strcat (expansion, loc + 1);
  78.  
  79.           break;
  80.             }
  81.         }
  82.     }
  83.   
  84.   return expansion;
  85. }
  86.  
  87. #ifdef TEST
  88.  
  89. void
  90. test_expand_default (const_string path, const_string def)
  91. {
  92.   string answer;
  93.   
  94.   printf ("Expansion of `%s':\t", path ? path : "(nil)");
  95.   answer = kpse_expand_default (path, def);
  96.   puts (answer);
  97. }
  98.  
  99. int
  100. main ()
  101. {
  102.   string default_path = "default";
  103.  
  104.   test_expand_default (NULL, default_path);
  105.   test_expand_default ("", default_path);
  106.   test_expand_default ("none", default_path);
  107.   test_expand_default (ENV_SEP_STRING, default_path);
  108.   test_expand_default (ENV_SEP_STRING "first", default_path);
  109.   test_expand_default ("last" ENV_SEP_STRING, default_path);
  110.   test_expand_default ("middle" ENV_SEP_STRING ENV_SEP_STRING "elddim", default_path);
  111.   
  112.   return 0;
  113. }
  114.  
  115. #endif /* TEST */
  116.  
  117.  
  118. /*
  119. Local variables:
  120. standalone-compile-command: "gcc -g -I. -I.. -DTEST default.c kpathsea.a"
  121. End:
  122. */
  123.