volatile conf

This commit is contained in:
dockes 2006-11-08 06:56:41 +00:00
parent f0876d3e29
commit 1205b11f60
2 changed files with 43 additions and 15 deletions

View File

@ -1,5 +1,5 @@
#ifndef lint #ifndef lint
static char rcsid [] = "@(#$Id: conftree.cpp,v 1.6 2006-03-22 14:25:46 dockes Exp $ (C) 2003 J.F.Dockes"; static char rcsid [] = "@(#$Id: conftree.cpp,v 1.7 2006-11-08 06:56:41 dockes Exp $ (C) 2003 J.F.Dockes";
#endif #endif
/* /*
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
@ -126,6 +126,13 @@ void ConfSimple::parseinput(istream &input)
} }
ConfSimple::ConfSimple(int readonly, bool tildexp)
{
data = 0;
dotildexpand = tildexp;
status = readonly ? STATUS_RO : STATUS_RW;
}
ConfSimple::ConfSimple(string *d, int readonly, bool tildexp) ConfSimple::ConfSimple(string *d, int readonly, bool tildexp)
{ {
data = d; data = d;
@ -265,8 +272,8 @@ int ConfSimple::set(const std::string &nm, const std::string &value,
} }
return 1; return 1;
} else { } else {
// ?? // No backing store, no writing
return 0; return 1;
} }
} }
@ -298,8 +305,7 @@ int ConfSimple::erase(const string &nm, const string &sk)
} }
return 1; return 1;
} else { } else {
// ?? return 1;
return 0;
} }
} }
@ -422,10 +428,8 @@ const char *longvalue =
"0123456789012345678901234567890123456789012345678901234567890123456789FIN" "0123456789012345678901234567890123456789012345678901234567890123456789FIN"
; ;
void stringtest() void memtest(ConfSimple &c)
{ {
string s;
ConfSimple c(&s);
cout << "Initial:" << endl; cout << "Initial:" << endl;
c.list(); c.list();
if (c.set("nom", "avec nl \n 2eme ligne", "")) { if (c.set("nom", "avec nl \n 2eme ligne", "")) {
@ -456,6 +460,7 @@ static char usage [] =
"[-q] nm sect : subsection test: look for nm in 'sect' which can be ''\n" "[-q] nm sect : subsection test: look for nm in 'sect' which can be ''\n"
"[-d] nm sect : delete nm in 'sect' which can be ''\n" "[-d] nm sect : delete nm in 'sect' which can be ''\n"
"[-S] : string io test. No filename in this case\n" "[-S] : string io test. No filename in this case\n"
"[-V] : volatile config test. No filename in this case\n"
; ;
void Usage() { void Usage() {
@ -469,6 +474,7 @@ static int op_flags;
#define OPT_s 0x8 #define OPT_s 0x8
#define OPT_S 0x10 #define OPT_S 0x10
#define OPT_d 0x20 #define OPT_d 0x20
#define OPT_V 0x40
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
@ -485,9 +491,6 @@ int main(int argc, char **argv)
Usage(); Usage();
while (**argv) while (**argv)
switch (*(*argv)++) { switch (*(*argv)++) {
case 'w': op_flags |= OPT_w; break;
case 's': op_flags |= OPT_s; break;
case 'S': op_flags |= OPT_S; break;
case 'd': case 'd':
op_flags |= OPT_d; op_flags |= OPT_d;
if (argc < 3) if (argc < 3)
@ -502,6 +505,10 @@ int main(int argc, char **argv)
nm = *(++argv);argc--; nm = *(++argv);argc--;
sub = *(++argv);argc--; sub = *(++argv);argc--;
goto b1; goto b1;
case 's': op_flags |= OPT_s; break;
case 'S': op_flags |= OPT_S; break;
case 'V': op_flags |= OPT_S; break;
case 'w': op_flags |= OPT_w; break;
default: Usage(); break; default: Usage(); break;
} }
@ -511,7 +518,15 @@ int main(int argc, char **argv)
if ((op_flags & OPT_S)) { if ((op_flags & OPT_S)) {
if (argc != 0) if (argc != 0)
Usage(); Usage();
stringtest(); string s;
ConfSimple c(&s);
memtest(c);
} else if ((op_flags & OPT_V)) {
if (argc != 0)
Usage();
string s;
ConfSimple c;
memtest(c);
} else { } else {
if (argc < 1) if (argc < 1)
Usage(); Usage();

View File

@ -27,10 +27,16 @@
* *
* Whitespace around name and value is insignificant. * Whitespace around name and value is insignificant.
* *
* Values can be queried for, or set. (the file is then rewritten). * The names are case-sensitive but don't count on it.
* The names are case-sensitive but don't count on it either. *
* Values can be queried for, or set.
* Any line without a '=' is discarded when rewriting the file. * Any line without a '=' is discarded when rewriting the file.
* All 'set' calls currently cause an immediate file rewrite. * A configuration object can be created empty or by reading from a file or
* a string.
* All 'set' calls cause an immediate rewrite of the backing object if any
* (file or string)
*
* Config objects can be stacked (overlayed).
*/ */
#include <string> #include <string>
@ -72,6 +78,13 @@ class ConfSimple {
*/ */
ConfSimple(string *data, int readonly = 0, bool tildexp = false); ConfSimple(string *data, int readonly = 0, bool tildexp = false);
/**
* Build an empty object. This will be memory only, with no backing store.
* @param readonly if true open read only, else rw
* @param tildexp try tilde (home dir) expansion for subsection names
*/
ConfSimple(int readonly = 0, bool tildexp = false);
virtual ~ConfSimple() {}; virtual ~ConfSimple() {};
/** /**