First commit
[anna.git] / source / io / Directory.cpp
1 // ANNA - Anna is Not 'N' Anymore
2 //
3 // (c) Copyright 2005-2014 Eduardo Ramos Testillano & Francisco Ruiz Rayo
4 //
5 // https://bitbucket.org/testillano/anna
6 //
7 // Redistribution and use in source and binary forms, with or without
8 // modification, are permitted provided that the following conditions
9 // are met:
10 //
11 //     * Redistributions of source code must retain the above copyright
12 // notice, this list of conditions and the following disclaimer.
13 //     * Redistributions in binary form must reproduce the above
14 // copyright notice, this list of conditions and the following disclaimer
15 // in the documentation and/or other materials provided with the
16 // distribution.
17 //     * Neither the name of Google Inc. nor the names of its
18 // contributors may be used to endorse or promote products derived from
19 // this software without specific prior written permission.
20 //
21 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 //
33 // Authors: eduardo.ramos.testillano@gmail.com
34 //          cisco.tierra@gmail.com
35
36
37 #include <string.h>
38 #include <limits.h>
39 #include <dirent.h>
40 #include <sys/types.h>
41 #include <stdio.h>
42
43 #include <algorithm>
44
45 #include <anna/config/defines.hpp>
46
47 #include <anna/io/Directory.hpp>
48 #include <anna/io/internal/sccs.hpp>
49
50 using namespace std;
51 using namespace anna;
52
53 io::Directory::Directory() :
54   a_hasPattern(false) {
55   io::sccs::activate();
56 }
57
58 void io::Directory::setPattern(const char* expression)
59 throw(RuntimeException) {
60   if(a_hasPattern == true) {
61     regfree(&a_regex);
62     a_hasPattern = false;
63   }
64
65   if(expression == NULL)
66     return;
67
68   int ret;
69
70   if((ret = regcomp(&a_regex, expression, REG_EXTENDED)) != 0) {
71     char err[256];
72     string msg("io::Directory | Pattern: ");
73     msg += expression;
74     msg += " | Error: ";
75
76     if(regerror(ret, &a_regex, err, sizeof(err)))
77       msg += err;
78     else
79       msg += "Invalid pattern";
80
81     throw RuntimeException(msg, ANNA_FILE_LOCATION);
82   }
83
84   a_hasPattern = true;
85 }
86
87 void io::Directory:: read(const char* dirName, const Mode::_v mode)
88 throw(RuntimeException) {
89   DIR* handle;
90   dirent* entry;
91   string file;
92
93   if((handle = opendir(dirName)) == NULL) {
94     const int aux_errno(errno);
95     throw RuntimeException(string(dirName), aux_errno, ANNA_FILE_LOCATION);
96   }
97
98   a_files.clear();
99
100   while((entry = readdir(handle)) != NULL) {
101     if(!anna_strcmp(entry->d_name, ".") || !anna_strcmp(entry->d_name, ".."))
102       continue;
103
104     if(a_hasPattern == true)
105       if(regexec(&a_regex, entry->d_name, 0, NULL, 0) != 0)
106         continue;
107
108     if(mode == Mode::FullPath) {
109       file = dirName;
110       file += "/";
111       file += entry->d_name;
112     } else
113       file = entry->d_name;
114
115     a_files.push_back(file);
116   }
117
118   closedir(handle);
119 }
120
121 io::Directory::const_iterator io::Directory::find(const std::string& file) const
122 throw() {
123   return std::find(begin(), end(), file);
124 }
125