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