]> mj.ucw.cz Git - libucw.git/blob - lib/getopt.h
Merge with git+ssh://git.ucw.cz/projects/sherlock/GIT/sherlock.git
[libucw.git] / lib / getopt.h
1 /*
2  *      UCW Library -- Parsing of configuration and command-line options
3  *
4  *      (c) 2001--2006 Robert Spalek <robert@ucw.cz>
5  *      (c) 2003--2006 Martin Mares <mj@ucw.cz>
6  *
7  *      This software may be freely distributed and used according to the terms
8  *      of the GNU Lesser General Public License.
9  */
10
11 #ifndef _UCW_GETOPT_H
12 #define _UCW_GETOPT_H
13
14 #include <getopt.h>
15
16 /* Safe loading and reloading of configuration files: conf-input.c */
17
18 extern byte *cf_def_file;               /* DEFAULT_CONFIG; NULL if already loaded */
19 int cf_reload(byte *file);
20 int cf_load(byte *file);
21 int cf_set(byte *string);
22
23 /* Direct access to configuration items: conf-intr.c */
24
25 #define CF_OPERATIONS T(CLOSE) T(SET) T(CLEAR) T(ALL) \
26   T(APPEND) T(PREPEND) T(REMOVE) T(EDIT) T(AFTER) T(BEFORE) T(COPY)
27   /* Closing brace finishes previous block.
28    * Basic attributes (static, dynamic, parsed) can be used with SET.
29    * Dynamic arrays can be used with SET, APPEND, PREPEND.
30    * Sections can be used with SET.
31    * Lists can be used with everything. */
32 #define T(x) OP_##x,
33 enum cf_operation { CF_OPERATIONS };
34 #undef T
35
36 struct cf_item;
37 byte *cf_find_item(byte *name, struct cf_item *item);
38 byte *cf_write_item(struct cf_item *item, enum cf_operation op, int number, byte **pars);
39
40 /* Debug dumping: conf-dump.c */
41
42 struct fastbuf;
43 void cf_dump_sections(struct fastbuf *fb);
44
45 /* Journaling control: conf-journal.c */
46
47 struct cf_journal_item;
48 struct cf_journal_item *cf_journal_new_transaction(uns new_pool);
49 void cf_journal_commit_transaction(uns new_pool, struct cf_journal_item *oldj);
50 void cf_journal_rollback_transaction(uns new_pool, struct cf_journal_item *oldj);
51
52 /*
53  * cf_getopt() takes care of parsing the command-line arguments, loading the
54  * default configuration file (cf_def_file) and processing configuration options.
55  * The calling convention is the same as with GNU getopt_long(), but you must prefix
56  * your own short/long options by the CF_(SHORT|LONG)_OPTS or pass CF_NO_LONG_OPTS
57  * of there are no long options.
58  *
59  * The default configuration file can be overriden by the --config options,
60  * which must come first. During parsing of all other options, the configuration
61  * is already available.
62  */
63
64 #define CF_SHORT_OPTS   "C:S:"
65 #define CF_LONG_OPTS    {"config",      1, 0, 'C'}, {"set",             1, 0, 'S'}, CF_LONG_OPTS_DEBUG
66 #define CF_NO_LONG_OPTS (const struct option []) { CF_LONG_OPTS { NULL, 0, 0, 0 } }
67 #ifndef CF_USAGE_TAB
68 #define CF_USAGE_TAB ""
69 #endif
70 #define CF_USAGE        \
71 "-C, --config filename\t" CF_USAGE_TAB "Override the default configuration file\n\
72 -S, --set sec.item=val\t" CF_USAGE_TAB "Manual setting of a configuration item\n" CF_USAGE_DEBUG
73
74 #ifdef CONFIG_DEBUG
75 #define CF_LONG_OPTS_DEBUG { "dumpconfig", 0, 0, 0x64436667 } ,
76 #define CF_USAGE_DEBUG "    --dumpconfig\t" CF_USAGE_TAB "Dump program configuration\n"
77 #else
78 #define CF_LONG_OPTS_DEBUG
79 #define CF_USAGE_DEBUG
80 #endif
81
82 // conf-input.c
83 int cf_getopt(int argc, char * const argv[], const char *short_opts, const struct option *long_opts, int *long_index);
84
85 #endif