merged shared ut
This commit is contained in:
parent
b0f8faa677
commit
ce76e5388e
@ -98,7 +98,11 @@ void ConfSimple::parseinput(istream& input)
|
|||||||
|
|
||||||
// Note that we trim whitespace before checking for backslash-eol
|
// Note that we trim whitespace before checking for backslash-eol
|
||||||
// This avoids invisible whitespace problems.
|
// This avoids invisible whitespace problems.
|
||||||
trimstring(line);
|
if (trimvalues) {
|
||||||
|
trimstring(line);
|
||||||
|
} else {
|
||||||
|
ltrimstring(line);
|
||||||
|
}
|
||||||
if (line.empty() || line.at(0) == '#') {
|
if (line.empty() || line.at(0) == '#') {
|
||||||
if (eof) {
|
if (eof) {
|
||||||
break;
|
break;
|
||||||
@ -119,7 +123,7 @@ void ConfSimple::parseinput(istream& input)
|
|||||||
appending = false;
|
appending = false;
|
||||||
|
|
||||||
if (line[0] == '[') {
|
if (line[0] == '[') {
|
||||||
trimstring(line, "[]");
|
trimstring(line, "[] \t");
|
||||||
if (dotildexpand) {
|
if (dotildexpand) {
|
||||||
submapkey = path_tildexpand(line);
|
submapkey = path_tildexpand(line);
|
||||||
} else {
|
} else {
|
||||||
@ -142,7 +146,9 @@ void ConfSimple::parseinput(istream& input)
|
|||||||
nm = line.substr(0, eqpos);
|
nm = line.substr(0, eqpos);
|
||||||
trimstring(nm);
|
trimstring(nm);
|
||||||
val = line.substr(eqpos + 1, string::npos);
|
val = line.substr(eqpos + 1, string::npos);
|
||||||
trimstring(val);
|
if (trimvalues) {
|
||||||
|
trimstring(val);
|
||||||
|
}
|
||||||
|
|
||||||
if (nm.length() == 0) {
|
if (nm.length() == 0) {
|
||||||
m_order.push_back(ConfLine(ConfLine::CFL_COMMENT, line));
|
m_order.push_back(ConfLine(ConfLine::CFL_COMMENT, line));
|
||||||
@ -156,8 +162,8 @@ void ConfSimple::parseinput(istream& input)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ConfSimple::ConfSimple(int readonly, bool tildexp)
|
ConfSimple::ConfSimple(int readonly, bool tildexp, bool trimv)
|
||||||
: dotildexpand(tildexp), m_fmtime(0), m_holdWrites(false)
|
: dotildexpand(tildexp), trimvalues(trimv), m_fmtime(0), m_holdWrites(false)
|
||||||
{
|
{
|
||||||
status = readonly ? STATUS_RO : STATUS_RW;
|
status = readonly ? STATUS_RO : STATUS_RW;
|
||||||
}
|
}
|
||||||
@ -169,8 +175,8 @@ void ConfSimple::reparse(const string& d)
|
|||||||
parseinput(input);
|
parseinput(input);
|
||||||
}
|
}
|
||||||
|
|
||||||
ConfSimple::ConfSimple(const string& d, int readonly, bool tildexp)
|
ConfSimple::ConfSimple(const string& d, int readonly, bool tildexp, bool trimv)
|
||||||
: dotildexpand(tildexp), m_fmtime(0), m_holdWrites(false)
|
: dotildexpand(tildexp), trimvalues(trimv), m_fmtime(0), m_holdWrites(false)
|
||||||
{
|
{
|
||||||
status = readonly ? STATUS_RO : STATUS_RW;
|
status = readonly ? STATUS_RO : STATUS_RW;
|
||||||
|
|
||||||
@ -178,8 +184,10 @@ ConfSimple::ConfSimple(const string& d, int readonly, bool tildexp)
|
|||||||
parseinput(input);
|
parseinput(input);
|
||||||
}
|
}
|
||||||
|
|
||||||
ConfSimple::ConfSimple(const char *fname, int readonly, bool tildexp)
|
ConfSimple::ConfSimple(const char *fname, int readonly, bool tildexp,
|
||||||
: dotildexpand(tildexp), m_filename(fname), m_fmtime(0), m_holdWrites(false)
|
bool trimv)
|
||||||
|
: dotildexpand(tildexp), trimvalues(trimv), m_filename(fname),
|
||||||
|
m_fmtime(0), m_holdWrites(false)
|
||||||
{
|
{
|
||||||
status = readonly ? STATUS_RO : STATUS_RW;
|
status = readonly ? STATUS_RO : STATUS_RW;
|
||||||
|
|
||||||
|
|||||||
@ -121,7 +121,8 @@ public:
|
|||||||
* @param readonly if true open readonly, else rw
|
* @param readonly if true open readonly, else rw
|
||||||
* @param tildexp try tilde (home dir) expansion for subkey values
|
* @param tildexp try tilde (home dir) expansion for subkey values
|
||||||
*/
|
*/
|
||||||
ConfSimple(const char *fname, int readonly = 0, bool tildexp = false);
|
ConfSimple(const char *fname, int readonly = 0, bool tildexp = false,
|
||||||
|
bool trimvalues = true);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Build the object by reading content from a string
|
* Build the object by reading content from a string
|
||||||
@ -129,14 +130,16 @@ public:
|
|||||||
* @param readonly if true open readonly, else rw
|
* @param readonly if true open readonly, else rw
|
||||||
* @param tildexp try tilde (home dir) expansion for subsection names
|
* @param tildexp try tilde (home dir) expansion for subsection names
|
||||||
*/
|
*/
|
||||||
ConfSimple(const string& data, int readonly = 0, bool tildexp = false);
|
ConfSimple(const string& data, int readonly = 0, bool tildexp = false,
|
||||||
|
bool trimvalues = true);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Build an empty object. This will be memory only, with no backing store.
|
* Build an empty object. This will be memory only, with no backing store.
|
||||||
* @param readonly if true open read only, else rw
|
* @param readonly if true open read only, else rw
|
||||||
* @param tildexp try tilde (home dir) expansion for subsection names
|
* @param tildexp try tilde (home dir) expansion for subsection names
|
||||||
*/
|
*/
|
||||||
ConfSimple(int readonly = 0, bool tildexp = false);
|
ConfSimple(int readonly = 0, bool tildexp = false,
|
||||||
|
bool trimvalues = true);
|
||||||
|
|
||||||
virtual ~ConfSimple() {};
|
virtual ~ConfSimple() {};
|
||||||
|
|
||||||
@ -281,6 +284,8 @@ public:
|
|||||||
*/
|
*/
|
||||||
ConfSimple& operator=(const ConfSimple& rhs) {
|
ConfSimple& operator=(const ConfSimple& rhs) {
|
||||||
if (this != &rhs && (status = rhs.status) != STATUS_ERROR) {
|
if (this != &rhs && (status = rhs.status) != STATUS_ERROR) {
|
||||||
|
dotildexpand = rhs.dotildexpand;
|
||||||
|
trimvalues = rhs.trimvalues;
|
||||||
m_filename = rhs.m_filename;
|
m_filename = rhs.m_filename;
|
||||||
m_submaps = rhs.m_submaps;
|
m_submaps = rhs.m_submaps;
|
||||||
}
|
}
|
||||||
@ -299,6 +304,7 @@ public:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool dotildexpand;
|
bool dotildexpand;
|
||||||
|
bool trimvalues;
|
||||||
StatusCode status;
|
StatusCode status;
|
||||||
private:
|
private:
|
||||||
// Set if we're working with a file
|
// Set if we're working with a file
|
||||||
@ -345,12 +351,12 @@ class ConfTree : public ConfSimple {
|
|||||||
public:
|
public:
|
||||||
/* The constructors just call ConfSimple's, asking for key tilde
|
/* The constructors just call ConfSimple's, asking for key tilde
|
||||||
* expansion */
|
* expansion */
|
||||||
ConfTree(const char *fname, int readonly = 0)
|
ConfTree(const char *fname, int readonly = 0, bool trimvalues=true)
|
||||||
: ConfSimple(fname, readonly, true) {}
|
: ConfSimple(fname, readonly, true, trimvalues) {}
|
||||||
ConfTree(const string& data, int readonly = 0)
|
ConfTree(const string& data, int readonly = 0, bool trimvalues=true)
|
||||||
: ConfSimple(data, readonly, true) {}
|
: ConfSimple(data, readonly, true, trimvalues) {}
|
||||||
ConfTree(int readonly = 0)
|
ConfTree(int readonly = 0, bool trimvalues=true)
|
||||||
: ConfSimple(readonly, true) {}
|
: ConfSimple(readonly, true, trimvalues) {}
|
||||||
virtual ~ConfTree() {};
|
virtual ~ConfTree() {};
|
||||||
ConfTree(const ConfTree& r) : ConfSimple(r) {};
|
ConfTree(const ConfTree& r) : ConfSimple(r) {};
|
||||||
ConfTree& operator=(const ConfTree& r) {
|
ConfTree& operator=(const ConfTree& r) {
|
||||||
|
|||||||
@ -34,7 +34,9 @@
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <map>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
@ -493,27 +495,47 @@ int ExecCmd::startExec(const string& cmd, const vector<string>& args,
|
|||||||
}
|
}
|
||||||
argv[i] = 0;
|
argv[i] = 0;
|
||||||
|
|
||||||
|
// Environment. We first merge our environment and the specified
|
||||||
|
// variables in a map<string,string>, overriding existing values,
|
||||||
|
// then generate an appropriate char*[]
|
||||||
Ccharp *envv;
|
Ccharp *envv;
|
||||||
int envsize;
|
map<string, string> envmap;
|
||||||
for (envsize = 0; ; envsize++)
|
for (int i = 0; environ[i] != 0; i++) {
|
||||||
if (environ[envsize] == 0) {
|
string entry(environ[i]);
|
||||||
break;
|
string::size_type eqpos = entry.find_first_of("=");
|
||||||
|
if (eqpos == string::npos) {
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
envv = (Ccharp *)malloc((envsize + m->m_env.size() + 2) * sizeof(char *));
|
envmap[entry.substr(0, eqpos)] = entry.substr(eqpos+1);
|
||||||
|
}
|
||||||
|
for (const auto& entry : m->m_env) {
|
||||||
|
string::size_type eqpos = entry.find_first_of("=");
|
||||||
|
if (eqpos == string::npos) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
envmap[entry.substr(0, eqpos)] = entry.substr(eqpos+1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Allocate space for the array + string storage in one block.
|
||||||
|
unsigned int allocsize = (envmap.size() + 2) * sizeof(char *);
|
||||||
|
for (const auto& it : envmap) {
|
||||||
|
allocsize += it.first.size() + 1 + it.second.size() + 1;
|
||||||
|
}
|
||||||
|
envv = (Ccharp *)malloc(allocsize);
|
||||||
if (envv == 0) {
|
if (envv == 0) {
|
||||||
LOGERR("ExecCmd::doexec: malloc() failed. errno " << errno << "\n");
|
LOGERR("ExecCmd::doexec: malloc() failed. errno " << errno << "\n");
|
||||||
free(argv);
|
free(argv);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
int eidx;
|
// Copy to new env array
|
||||||
for (eidx = 0; eidx < envsize; eidx++) {
|
i = 0;
|
||||||
envv[eidx] = environ[eidx];
|
char *cp = ((char *)envv) + (envmap.size() + 2) * sizeof(char *);
|
||||||
|
for (const auto& it : envmap) {
|
||||||
|
strcpy(cp, (it.first + "=" + it.second).c_str());
|
||||||
|
envv[i++] = cp;
|
||||||
|
cp += it.first.size() + 1 + it.second.size() + 1;
|
||||||
}
|
}
|
||||||
for (vector<string>::const_iterator it = m->m_env.begin();
|
envv[i++] = 0;
|
||||||
it != m->m_env.end(); it++) {
|
|
||||||
envv[eidx++] = it->c_str();
|
|
||||||
}
|
|
||||||
envv[eidx] = 0;
|
|
||||||
|
|
||||||
// As we are going to use execve, not execvp, do the PATH thing.
|
// As we are going to use execve, not execvp, do the PATH thing.
|
||||||
string exe;
|
string exe;
|
||||||
|
|||||||
@ -15,7 +15,6 @@
|
|||||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef TEST_PATHUT
|
|
||||||
#ifdef BUILDING_RECOLL
|
#ifdef BUILDING_RECOLL
|
||||||
#include "autoconfig.h"
|
#include "autoconfig.h"
|
||||||
#else
|
#else
|
||||||
@ -612,6 +611,45 @@ string url_encode(const string& url, string::size_type offs)
|
|||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int h2d(int c) {
|
||||||
|
if ('0' <= c && c <= '9')
|
||||||
|
return c - '0';
|
||||||
|
else if ('A' <= c && c <= 'F')
|
||||||
|
return 10 + c - 'A';
|
||||||
|
else
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
string url_decode(const string &in)
|
||||||
|
{
|
||||||
|
if (in.size() <= 2)
|
||||||
|
return in;
|
||||||
|
string out;
|
||||||
|
out.reserve(in.size());
|
||||||
|
const char *cp = in.c_str();
|
||||||
|
string::size_type i = 0;
|
||||||
|
for (; i < in.size() - 2; i++) {
|
||||||
|
if (cp[i] == '%') {
|
||||||
|
int d1 = h2d(cp[i+1]);
|
||||||
|
int d2 = h2d(cp[i+2]);
|
||||||
|
if (d1 != -1 && d2 != -1) {
|
||||||
|
out += (d1 << 4) + d2;
|
||||||
|
} else {
|
||||||
|
out += '%';
|
||||||
|
out += cp[i+1];
|
||||||
|
out += cp[i+2];
|
||||||
|
}
|
||||||
|
i += 2;
|
||||||
|
} else {
|
||||||
|
out += cp[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (i < in.size()) {
|
||||||
|
out += cp[i++];
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
string url_gpath(const string& url)
|
string url_gpath(const string& url)
|
||||||
{
|
{
|
||||||
// Remove the access schema part (or whatever it's called)
|
// Remove the access schema part (or whatever it's called)
|
||||||
@ -867,198 +905,3 @@ void pathut_init_mt()
|
|||||||
{
|
{
|
||||||
path_home();
|
path_home();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#else // TEST_PATHUT
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <iostream>
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
#include "pathut.h"
|
|
||||||
|
|
||||||
void path_to_thumb(const string& _input)
|
|
||||||
{
|
|
||||||
string input(_input);
|
|
||||||
// Make absolute path if needed
|
|
||||||
if (input[0] != '/') {
|
|
||||||
input = path_absolute(input);
|
|
||||||
}
|
|
||||||
|
|
||||||
input = string("file://") + path_canon(input);
|
|
||||||
|
|
||||||
string path;
|
|
||||||
//path = url_encode(input, 7);
|
|
||||||
thumbPathForUrl(input, 7, path);
|
|
||||||
cout << path << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *tstvec[] = {"", "/", "/dir", "/dir/", "/dir1/dir2",
|
|
||||||
"/dir1/dir2",
|
|
||||||
"./dir", "./dir1/", "dir", "../dir", "/dir/toto.c",
|
|
||||||
"/dir/.c", "/dir/toto.txt", "toto.txt1"
|
|
||||||
};
|
|
||||||
|
|
||||||
const string ttvec[] = {"/dir", "", "~", "~/sub", "~root", "~root/sub",
|
|
||||||
"~nosuch", "~nosuch/sub"
|
|
||||||
};
|
|
||||||
int nttvec = sizeof(ttvec) / sizeof(string);
|
|
||||||
|
|
||||||
const char *thisprog;
|
|
||||||
|
|
||||||
int main(int argc, const char **argv)
|
|
||||||
{
|
|
||||||
thisprog = *argv++;
|
|
||||||
argc--;
|
|
||||||
|
|
||||||
string s;
|
|
||||||
vector<string>::const_iterator it;
|
|
||||||
#if 0
|
|
||||||
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 0
|
|
||||||
if (argc != 2) {
|
|
||||||
cerr << "Usage: trpathut <dir> <pattern>" << endl;
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
string dir = *argv++;
|
|
||||||
argc--;
|
|
||||||
string pattern = *argv++;
|
|
||||||
argc--;
|
|
||||||
vector<string> matched = path_dirglob(dir, pattern);
|
|
||||||
for (it = matched.begin(); it != matched.end(); it++) {
|
|
||||||
cout << *it << endl;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
if (argc != 1) {
|
|
||||||
fprintf(stderr, "Usage: fsocc: trpathut <path>\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
string path = *argv++;
|
|
||||||
argc--;
|
|
||||||
|
|
||||||
int pc;
|
|
||||||
long long blocks;
|
|
||||||
if (!fsocc(path, &pc, &blocks)) {
|
|
||||||
fprintf(stderr, "fsocc failed\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
printf("pc %d, megabytes %ld\n", pc, blocks);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
Pidfile pidfile("/tmp/pathutpidfile");
|
|
||||||
pid_t pid;
|
|
||||||
if ((pid = pidfile.open()) != 0) {
|
|
||||||
cerr << "open failed. reason: " << pidfile.getreason() <<
|
|
||||||
" return " << pid << endl;
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
pidfile.write_pid();
|
|
||||||
sleep(10);
|
|
||||||
pidfile.close();
|
|
||||||
pidfile.remove();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
if (argc > 1) {
|
|
||||||
cerr << "Usage: thumbpath <filepath>" << endl;
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
string input;
|
|
||||||
if (argc == 1) {
|
|
||||||
input = *argv++;
|
|
||||||
if (input.empty()) {
|
|
||||||
cerr << "Usage: thumbpath <filepath>" << endl;
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
path_to_thumb(input);
|
|
||||||
} else {
|
|
||||||
while (getline(cin, input)) {
|
|
||||||
path_to_thumb(input);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
exit(0);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
if (argc != 1) {
|
|
||||||
cerr << "Usage: trpathut <filename>" << endl;
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
string fn = *argv++;
|
|
||||||
argc--;
|
|
||||||
string ext = path_suffix(fn);
|
|
||||||
cout << "Suffix: [" << ext << "]" << endl;
|
|
||||||
return 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
if (argc != 1) {
|
|
||||||
cerr << "Usage: trpathut url" << endl;
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
string url = *argv++;
|
|
||||||
argc--;
|
|
||||||
|
|
||||||
cout << "File: [" << fileurltolocalpath(url) << "]\n";
|
|
||||||
return 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if 1
|
|
||||||
if (argc != 1) {
|
|
||||||
cerr << "Usage: trpathut path" << endl;
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
string path = *argv++;
|
|
||||||
argc--;
|
|
||||||
|
|
||||||
int pc;
|
|
||||||
long long avmbs;
|
|
||||||
if (fsocc(path, &pc, &avmbs)) {
|
|
||||||
cout << "Percent occup " << pc << " avmbs " << avmbs << endl;
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
cerr << "fsocc failed\n";
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // TEST_PATHUT
|
|
||||||
|
|
||||||
|
|||||||
@ -52,6 +52,7 @@ extern std::vector<std::string> path_dirglob(const std::string& dir,
|
|||||||
/// Encode according to rfc 1738
|
/// Encode according to rfc 1738
|
||||||
extern std::string url_encode(const std::string& url,
|
extern std::string url_encode(const std::string& url,
|
||||||
std::string::size_type offs = 0);
|
std::string::size_type offs = 0);
|
||||||
|
extern std::string url_decode(const std::string& encoded);
|
||||||
//// Convert to file path if url is like file://. This modifies the
|
//// Convert to file path if url is like file://. This modifies the
|
||||||
//// input (and returns a copy for convenience)
|
//// input (and returns a copy for convenience)
|
||||||
extern std::string fileurltolocalpath(std::string url);
|
extern std::string fileurltolocalpath(std::string url);
|
||||||
|
|||||||
@ -453,6 +453,20 @@ bool stringToBool(const string& s)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void trimstring(string& s, const char *ws)
|
void trimstring(string& s, const char *ws)
|
||||||
|
{
|
||||||
|
rtrimstring(s, ws);
|
||||||
|
ltrimstring(s, ws);
|
||||||
|
}
|
||||||
|
|
||||||
|
void rtrimstring(string& s, const char *ws)
|
||||||
|
{
|
||||||
|
string::size_type pos = s.find_last_not_of(ws);
|
||||||
|
if (pos != string::npos && pos != s.length() - 1) {
|
||||||
|
s.replace(pos + 1, string::npos, string());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ltrimstring(string& s, const char *ws)
|
||||||
{
|
{
|
||||||
string::size_type pos = s.find_first_not_of(ws);
|
string::size_type pos = s.find_first_not_of(ws);
|
||||||
if (pos == string::npos) {
|
if (pos == string::npos) {
|
||||||
@ -460,11 +474,6 @@ void trimstring(string& s, const char *ws)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
s.replace(0, pos, string());
|
s.replace(0, pos, string());
|
||||||
|
|
||||||
pos = s.find_last_not_of(ws);
|
|
||||||
if (pos != string::npos && pos != s.length() - 1) {
|
|
||||||
s.replace(pos + 1, string::npos, string());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove some chars and replace them with spaces
|
// Remove some chars and replace them with spaces
|
||||||
|
|||||||
@ -142,6 +142,8 @@ extern bool stringToBool(const std::string& s);
|
|||||||
/** Remove instances of characters belonging to set (default {space,
|
/** Remove instances of characters belonging to set (default {space,
|
||||||
tab}) at beginning and end of input string */
|
tab}) at beginning and end of input string */
|
||||||
extern void trimstring(std::string& s, const char *ws = " \t");
|
extern void trimstring(std::string& s, const char *ws = " \t");
|
||||||
|
extern void rtrimstring(std::string& s, const char *ws = " \t");
|
||||||
|
extern void ltrimstring(std::string& s, const char *ws = " \t");
|
||||||
|
|
||||||
/** Escape things like < or & by turning them into entities */
|
/** Escape things like < or & by turning them into entities */
|
||||||
extern std::string escapeHtml(const std::string& in);
|
extern std::string escapeHtml(const std::string& in);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user