kobodl/cfgparse.h
Ville Lindholm dbc223eb84
Initial commit
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>
2026-05-28 16:35:31 +03:00

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