(root)/
gettext-0.22.4/
gettext-tools/
src/
dir-list.c
       1  /* GNU gettext - internationalization aids
       2     Copyright (C) 1996, 1998, 2000-2002, 2006 Free Software Foundation, Inc.
       3  
       4     This file was written by Peter Miller <millerp@canb.auug.org.au>
       5  
       6     This program is free software: you can redistribute it and/or modify
       7     it under the terms of the GNU General Public License as published by
       8     the Free Software Foundation; either version 3 of the License, or
       9     (at your option) any later version.
      10  
      11     This program is distributed in the hope that it will be useful,
      12     but WITHOUT ANY WARRANTY; without even the implied warranty of
      13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14     GNU General Public License for more details.
      15  
      16     You should have received a copy of the GNU General Public License
      17     along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
      18  
      19  
      20  #ifdef HAVE_CONFIG_H
      21  #include "config.h"
      22  #endif
      23  
      24  /* Specification.  */
      25  #include "dir-list.h"
      26  
      27  #include <stddef.h>
      28  #include <stdlib.h>
      29  
      30  #include "str-list.h"
      31  
      32  static string_list_ty *directory /* = NULL */;
      33  
      34  
      35  /* Append a directory to the end of the list of directories.  */
      36  void
      37  dir_list_append (const char *s)
      38  {
      39    if (directory == NULL)
      40      directory = string_list_alloc ();
      41    string_list_append_unique (directory, s);
      42  }
      43  
      44  
      45  /* Return the nth directory, or NULL of n is out of range.  */
      46  const char *
      47  dir_list_nth (int n)
      48  {
      49    /* The default value of the list consists of the single directory ".".  */
      50    if (directory == NULL)
      51      dir_list_append (".");
      52  
      53    if (n < 0 || n >= directory->nitems)
      54      return NULL;
      55    return directory->item[n];
      56  }
      57  
      58  
      59  /* Return the current list of directories, for later use with dir_list_restore.
      60     Reset the list to empty.  */
      61  void *
      62  dir_list_save_reset ()
      63  {
      64    void *saved_value = directory;
      65  
      66    directory = NULL;
      67    return saved_value;
      68  }
      69  
      70  
      71  /* Restore a previously saved list of directories.  */
      72  void
      73  dir_list_restore (void *saved_value)
      74  {
      75    /* Don't free the contained strings, because they may have been returned
      76       by dir_list_nth and may still be in use.  */
      77    if (directory != NULL)
      78      {
      79        if (directory->item != NULL)
      80          free (directory->item);
      81        free (directory);
      82      }
      83  
      84    directory = (string_list_ty *) saved_value;
      85  }