--- a/src/utils/pathut.cpp
+++ b/src/utils/pathut.cpp
@@ -1,15 +1,21 @@
#ifndef lint
-static char rcsid[] = "@(#$Id: pathut.cpp,v 1.6 2005-12-13 12:42:59 dockes Exp $ (C) 2004 J.F.Dockes";
+static char rcsid[] = "@(#$Id: pathut.cpp,v 1.7 2006-01-09 16:53:31 dockes Exp $ (C) 2004 J.F.Dockes";
#endif
#ifndef TEST_PATHUT
#include <unistd.h>
+#include <sys/param.h>
#include <pwd.h>
+
#include <iostream>
+#include <list>
+#include <stack>
#include "pathut.h"
#ifndef NO_NAMESPACES
using std::string;
+using std::list;
+using std::stack;
#endif /* NO_NAMESPACES */
void path_catslash(std::string &s) {
@@ -58,6 +64,18 @@
return simple;
simple.erase(0, slp+1);
+ return simple;
+}
+
+string path_basename(const string &s, const string &suff)
+{
+ string simple = path_getsimple(s);
+ string::size_type pos = string::npos;
+ if (suff.length() && simple.length() > suff.length()) {
+ pos = simple.rfind(suff);
+ if (pos != string::npos && pos + suff.length() == simple.length())
+ return simple.substr(0, pos);
+ }
return simple;
}
@@ -98,6 +116,64 @@
return o;
}
+#include <smallut.h>
+extern std::string path_canon(const std::string &is)
+{
+ if (is.length() == 0)
+ return is;
+ string s = is;
+ if (s[0] != '/') {
+ char buf[MAXPATHLEN];
+ if (!getcwd(buf, MAXPATHLEN)) {
+ return "";
+ }
+ s = path_cat(string(buf), s);
+ }
+ list<string>elems;
+ stringToTokens(s, elems, "/");
+ list<string> cleaned;
+ for (list<string>::const_iterator it = elems.begin();
+ it != elems.end(); it++){
+ if (*it == "..") {
+ if (!cleaned.empty())
+ cleaned.pop_back();
+ } else if (it->empty() || *it == ".") {
+ } else {
+ cleaned.push_back(*it);
+ }
+ }
+ string ret;
+ if (!cleaned.empty()) {
+ for (list<string>::const_iterator it = cleaned.begin();
+ it != cleaned.end(); it++) {
+ ret += "/";
+ ret += *it;
+ }
+ } else {
+ ret = "/";
+ }
+ return ret;
+}
+
+#include <glob.h>
+#include <sys/stat.h>
+list<std::string> path_dirglob(const std::string &dir,
+ const std::string pattern)
+{
+ list<string> res;
+ glob_t mglob;
+ string mypat=path_cat(dir, pattern);
+ if (glob(mypat.c_str(), 0, 0, &mglob)) {
+ return res;
+ }
+ for (int i = 0; i < mglob.gl_pathc; i++) {
+ res.push_back(mglob.gl_pathv[i]);
+ }
+ globfree(&mglob);
+ return res;
+}
+
+
#else // TEST_PATHUT
#include <iostream>
@@ -108,7 +184,7 @@
const char *tstvec[] = {"", "/", "/dir", "/dir/", "/dir1/dir2",
"/dir1/dir2",
"./dir", "./dir1/", "dir", "../dir", "/dir/toto.c",
- "/dir/.c",
+ "/dir/.c", "/dir/toto.txt", "toto.txt1"
};
const string ttvec[] = {"/dir", "", "~", "~/sub", "~root", "~root/sub",
@@ -117,22 +193,51 @@
int main(int argc, const char **argv)
{
+ string s;
+ list<string>::const_iterator it;
#if 0
- for (int i = 0;i < sizeof(tstvec) / sizeof(char *); i++) {
- cout << tstvec[i] << " FATHER " << path_getfather(tstvec[i]) << endl;
- }
- for (int i = 0;i < sizeof(tstvec) / sizeof(char *); i++) {
- cout << tstvec[i] << " SIMPLE " << path_getsimple(tstvec[i]) << endl;
- }
-#endif
- string s;
-
+ for (unsigned int i = 0;i < sizeof(tstvec) / sizeof(char *); i++) {
+ cout << tstvec[i] << " Father " << path_getfather(tstvec[i]) << endl;
+ }
+ for (unsigned int i = 0;i < sizeof(tstvec) / sizeof(char *); i++) {
+ cout << tstvec[i] << " Simple " << path_getsimple(tstvec[i]) << endl;
+ }
+ for (unsigned int i = 0;i < sizeof(tstvec) / sizeof(char *); i++) {
+ cout << tstvec[i] << " Basename " <<
+ path_basename(tstvec[i], ".txt") << endl;
+ }
+#endif
+
+#if 0
for (int i = 0; i < nttvec; i++) {
cout << "tildexp: '" << ttvec[i] << "' -> '" <<
path_tildexpand(ttvec[i]) << "'" << endl;
}
-
-
+#endif
+
+#if 0
+ const string canontst[] = {"/dir1/../../..", "/////", "",
+ "/dir1/../../.././/////dir2///////",
+ "../../",
+ "../../../../../../../../../../"
+ };
+ unsigned int nttvec = sizeof(canontst) / sizeof(string);
+ for (unsigned int i = 0; i < nttvec; i++) {
+ cout << "canon: '" << canontst[i] << "' -> '" <<
+ path_canon(canontst[i]) << "'" << endl;
+ }
+#endif
+#if 1
+ if (argc != 3) {
+ fprintf(stderr, "Usage: trpathut <dir> <pattern>\n");
+ exit(1);
+ }
+ string dir=argv[1], pattern=argv[2];
+ list<string> matched = path_dirglob(dir, pattern);
+ for (it = matched.begin(); it != matched.end();it++) {
+ cout << *it << endl;
+ }
+#endif
return 0;
}