Import existing source tree; original VCS history is no longer available. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
200 lines
4.8 KiB
C++
200 lines
4.8 KiB
C++
/*
|
|
-------------------------------------------------------------------
|
|
cfgparse.h - Generic Config File and Argument Parser
|
|
-------------------------------------------------------------------
|
|
* Copyright (C) 2001, 2007 David Olofson
|
|
*
|
|
* This code is released under the terms of the GNU LGPL.
|
|
*/
|
|
|
|
#ifndef CFGPARSE_H
|
|
#define CFGPARSE_H
|
|
|
|
#include <stdio.h>
|
|
|
|
enum cfg_types_t
|
|
{
|
|
CFG_NONE,
|
|
CFG_BOOL,
|
|
CFG_INT,
|
|
CFG_FLOAT,
|
|
CFG_STRING
|
|
};
|
|
|
|
|
|
#define CFG_STRING_LENGTH 256
|
|
|
|
typedef char cfg_string_t[CFG_STRING_LENGTH];
|
|
|
|
|
|
class cfg_key_t
|
|
{
|
|
public:
|
|
cfg_key_t *next;
|
|
int save;
|
|
int redefined;
|
|
|
|
cfg_types_t typecode;
|
|
const char *name;
|
|
char *description;
|
|
cfg_key_t();
|
|
virtual ~cfg_key_t();
|
|
virtual int read(int argc, char *argv[]);
|
|
virtual int test(const char *arg);
|
|
virtual int copy(cfg_key_t *from) = 0;
|
|
virtual void write(FILE *f) = 0;
|
|
virtual void set_default() = 0;
|
|
virtual int is_your_var(void *var) = 0;
|
|
};
|
|
|
|
|
|
class cfg_comment_t : public cfg_key_t
|
|
{
|
|
public:
|
|
cfg_comment_t(const char *text) { name = text; }
|
|
int read(int argc, char *argv[]) { return 0; }
|
|
int copy(cfg_key_t *from);
|
|
void write(FILE *f);
|
|
void set_default() { ; }
|
|
int is_your_var(void *var) { return 0; }
|
|
};
|
|
|
|
|
|
class cfg_switch_t : public cfg_key_t
|
|
{
|
|
public:
|
|
int *value;
|
|
int default_value;
|
|
|
|
cfg_switch_t(const char *_name, int &var, int def, int _save);
|
|
int copy(cfg_key_t *from);
|
|
virtual int test(const char *arg);
|
|
int read(int argc, char *argv[]);
|
|
void write(FILE *f);
|
|
void set_default();
|
|
int is_your_var(void *var);
|
|
};
|
|
|
|
|
|
class cfg_key_int_t : public cfg_key_t
|
|
{
|
|
public:
|
|
int *value;
|
|
int default_value;
|
|
|
|
cfg_key_int_t(const char *_name, int &var, int def, int _save);
|
|
int copy(cfg_key_t *from);
|
|
int read(int argc, char *argv[]);
|
|
void write(FILE *f);
|
|
void set_default();
|
|
int is_your_var(void *var);
|
|
};
|
|
|
|
|
|
class cfg_key_float_t : public cfg_key_t
|
|
{
|
|
public:
|
|
float *value;
|
|
float default_value;
|
|
|
|
cfg_key_float_t(const char *_name, float &var, float def, int _save);
|
|
int copy(cfg_key_t *from);
|
|
int read(int argc, char *argv[]);
|
|
void write(FILE *f);
|
|
void set_default();
|
|
int is_your_var(void *var);
|
|
};
|
|
|
|
|
|
class cfg_key_string_t : public cfg_key_t
|
|
{
|
|
public:
|
|
cfg_string_t *value;
|
|
cfg_string_t default_value;
|
|
|
|
cfg_key_string_t(const char *_name, cfg_string_t &var,
|
|
const cfg_string_t def, int _save);
|
|
int copy(cfg_key_t *from);
|
|
int read(int argc, char *argv[]);
|
|
void write(FILE *f);
|
|
void set_default();
|
|
int is_your_var(void *var);
|
|
};
|
|
|
|
|
|
class config_parser_t
|
|
{
|
|
cfg_key_t *keys, *last_key;
|
|
int initialized;
|
|
int nkeys; // For symbol table API
|
|
cfg_key_t **table; // For symbol table API
|
|
cfg_string_t retbuf; // For symbol table API
|
|
void initialize();
|
|
void print_switch(FILE *f, const char *base, int flag);
|
|
int read_config(char ***cv, FILE *f);
|
|
void add(cfg_key_t *_key);
|
|
int _redefined(void *var);
|
|
void _accept(void *var);
|
|
void build_table();
|
|
int check_symbol(int symbol);
|
|
protected:
|
|
//Key registration: For use in inherited init()
|
|
void comment(const char *text);
|
|
void yesno(const char *name, int &var, int def, int save = 1);
|
|
void command(const char *name, int &var);
|
|
void key(const char *name, int &var, int def, int save = 1);
|
|
void key(const char *name, float &var, float def, int save = 1);
|
|
void key(const char *name, cfg_string_t &var, const cfg_string_t def,
|
|
int save = 1);
|
|
void desc(const char *text);
|
|
|
|
//Plug key registration and custom stuff in here!
|
|
virtual void init() = 0;
|
|
virtual void postload() { ; }
|
|
virtual void presave() { ; }
|
|
public:
|
|
int changed; //Set when *edited* by the user
|
|
config_parser_t();
|
|
virtual ~config_parser_t();
|
|
config_parser_t &operator = (config_parser_t &from);
|
|
void set_defaults();
|
|
int parse(int argc, char *argv[]);
|
|
int read(FILE *f);
|
|
int write(FILE *f);
|
|
|
|
//Changed since last accept() call?
|
|
int redefined(int &var) { return _redefined(&var); }
|
|
int redefined(float &var) { return _redefined(&var); }
|
|
int redefined(cfg_string_t &var) { return _redefined(&var); }
|
|
|
|
//Reset redefined() state to 0.
|
|
void accept(int &var) { _accept(&var); }
|
|
void accept(float &var) { _accept(&var); }
|
|
void accept(cfg_string_t &var) { _accept(&var); }
|
|
|
|
/* Generic Symbol Table Style API */
|
|
int find(const char *name);
|
|
int find_next(int symbol = -1);
|
|
cfg_types_t type(int symbol);
|
|
int do_save(int symbol);
|
|
const char *name(int symbol);
|
|
const char *description(int symbol);
|
|
void set(int symbol, int value);
|
|
void set(int symbol, float value);
|
|
void set(int symbol, const char *text);
|
|
int get_i(int symbol);
|
|
int get_default_i(int symbol);
|
|
float get_f(int symbol);
|
|
float get_default_f(int symbol);
|
|
/*
|
|
* WARNING: These ones sometimes return pointers to non-constant
|
|
* buffers! Therefore, you need to copy the results
|
|
* before you call these functions again.
|
|
*/
|
|
const char *get_s(int symbol);
|
|
const char *get_default_s(int symbol);
|
|
};
|
|
|
|
|
|
#endif //CFGPARSE_H
|