00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef OLENA_IO_FILE_HH
00029 # define OLENA_IO_FILE_HH
00030
00031 # include <oln/io/stream_wrapper.hh>
00032
00033 # include <fstream>
00034 # include <sys/types.h>
00035 # include <dirent.h>
00036
00037 namespace oln {
00038
00039 namespace io {
00040
00041 namespace internal {
00042
00048 template<>
00049 struct stream_wrapper<StreamFile>
00050 {
00051 static const std::string&
00052 name()
00053 {
00054 static const std::string name_("file:"); return name_;
00055 }
00056
00057
00058 static bool
00059 knows_ext(const std::string&)
00060 {
00061 return true;
00062 }
00063
00065 static std::istream*
00066 wrap_in(std::string& name)
00067 {
00068 std::ifstream* in = new std::ifstream(name.c_str());
00069 if (!in->fail())
00070 return in;
00071 delete in;
00072 return 0;
00073 }
00074
00076 static std::ostream*
00077 wrap_out(std::string& name)
00078 {
00079 std::ofstream* out = new std::ofstream(name.c_str());
00080 if (!out->fail())
00081 return out;
00082 delete out;
00083 return 0;
00084 }
00085
00090 static void
00091 find(std::list<std::string>& names, const std::string& name)
00092 {
00093
00094 int pos = name.rfind('/');
00095 std::string base(name, pos+1);
00096
00097 std::string dir;
00098 if (pos >= 0)
00099 dir.assign(name, 0, pos+1);
00100 else
00101 dir = "./";
00102
00103 if (DIR* d = opendir(dir.c_str()))
00104 {
00105 struct dirent* ent;
00106 while ((ent = readdir(d)))
00107 if (!strncmp(base.c_str(), ent->d_name, base.size()))
00108 names.push_back(dir + ent->d_name);
00109 closedir(d);
00110 }
00111 }
00112
00113 };
00114
00115 }
00116
00117 }
00118
00119 }
00120
00121
00122 #endif // OLENA_IO_FILE_HH