Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
83726a71bf3cdc16c15f85e8d6fc3753c8a3cff7
[simgrid.git] / tools / tesh2 / src / directories.c
1 #include <directories.h>
2 #include <directory.h>
3
4 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(tesh);
5
6 directories_t
7 directories_new(void)
8 {
9         directories_t directories = xbt_new0(s_directories_t, 1);
10         
11         if(!(directories->items = vector_new(8, directory_free)))
12         {
13                 free(directories);
14                 return NULL;
15         }
16         
17         return directories;
18 }
19
20 int
21 directories_get_size(directories_t directories)
22 {
23         if(!directories)
24         {
25                 errno = EINVAL;
26                 return -1;
27         }
28         
29         return vector_get_size(directories->items);
30 }
31
32 int
33 directories_add(directories_t directories, directory_t directory)
34 {
35         directory_t cur;
36         
37         if(!directories)
38                 return EINVAL;
39         
40         vector_rewind(directories->items);
41         
42         while((cur = vector_get(directories->items)))
43         {
44                 if(!strcmp(cur->name, directory->name))
45                         return EEXIST;
46                 
47                 vector_move_next(directories->items);
48         }
49         
50         return vector_push_back(directories->items, directory);
51 }
52
53 int
54 directories_contains(directories_t directories, directory_t directory)
55 {
56         directory_t cur;
57         
58         if(!directories)
59                 return EINVAL;
60         
61         vector_rewind(directories->items);
62         
63         while((cur = vector_get(directories->items)))
64         {
65                 if(!strcmp(cur->name, directory->name))
66                         return 1;
67                 
68                 vector_move_next(directories->items);
69         }
70         
71         return 0;
72 }
73
74 directory_t
75 directories_search_fstream_directory(directories_t directories, const char* name)
76 {
77         
78         struct stat buffer = {0};
79         char* prev;
80         directory_t directory;
81         
82         if(!directories)
83         {
84                 errno = EINVAL;
85                 return NULL;
86         }
87         
88         prev = getcwd(NULL, 0);
89         
90         vector_rewind(directories->items);
91         
92         while((directory = vector_get(directories->items)))
93         {
94                 chdir(directory->name);
95                 
96                 if(!stat(name, &buffer) || S_ISREG(buffer.st_mode))
97                 {
98                         chdir(prev);
99                         free(prev);
100                         return directory;
101                 }
102                 
103                 vector_move_next(directories->items);
104         }
105         
106         chdir(prev);
107         free(prev);
108         errno = ESRCH;
109         return NULL;    
110 }
111
112 int
113 directories_load(directories_t directories, fstreams_t fstreams, lstrings_t suffixes)
114 {
115         directory_t directory;
116         
117         if(!directories || !fstreams || !suffixes)
118                 return EINVAL;
119         
120         vector_rewind(directories->items);
121         
122         while((directory = vector_get(directories->items)))
123         {
124                 if(directory->load)
125                 {
126                         if((errno = directory_open(directory)))
127                                 return errno;
128                         
129                         chdir(directory->name);
130                         
131                         if((errno = directory_load(directory, fstreams, suffixes)))
132                                 return errno;
133                                 
134                         if((errno = directory_close(directory)))
135                                 return errno;
136                         
137                         chdir(root_directory->name);
138                 }
139                         
140                 vector_move_next(directories->items);
141                 
142                 
143         }
144         
145         return 0;
146 }
147
148 int
149 directories_has_directories_to_load(directories_t directories)
150 {
151         directory_t directory;
152         
153         if(!directories)
154         {
155                 errno = EINVAL;
156                 return 0;
157         }
158         
159         vector_rewind(directories->items);
160         
161         while((directory = vector_get(directories->items)))
162         {
163                 if(directory->load)
164                         return 1;
165                         
166                 vector_move_next(directories->items);
167                 
168         }
169         
170         return 0;
171 }
172
173 directory_t
174 directories_get_back(directories_t directories)
175 {
176         if(!directories)
177         {
178                 errno = EINVAL;
179                 return NULL;
180         }
181         
182         return vector_get_back(directories->items);     
183 }
184
185 int
186 directories_free(void** directoriesptr)
187 {
188         if(!(*directoriesptr))
189                 return EINVAL;
190                 
191         if((errno = vector_free(&((*((directories_t*)directoriesptr))->items))))
192                 return errno;
193         
194         free(*directoriesptr);
195         *directoriesptr = NULL;
196         
197         return 0;       
198         
199 }