ban2fail/cfgmap.h

269 lines
9.0 KiB
C
Raw Permalink Normal View History

2019-11-23 03:40:23 +00:00
/***************************************************************************
* Copyright (C) 2019 by John D. Robertson *
* john@rrci.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#ifndef CFGMAP_H
#define CFGMAP_H
#include <stdio.h>
#include <stddef.h>
#include "map.h"
#include "ptrvec.h"
#include "util.h"
#ifdef __cplusplus
extern "C" {
#endif
/*===================== CFGMAP_ENTRY ========================*/
typedef struct {
char *symbol;
PTRVEC value_lst; /* Possible multiple values for a given symbol */
unsigned nLookups;/* How many times this symbol has been looked up */
unsigned symLen;
} CFGMAP_ENTRY;
unsigned int
CFGMAP_ENTRY_numValues(const CFGMAP_ENTRY * self);
/******************************************************************
* Return the number of values stored for a given entry.
*/
const char*
CFGMAP_ENTRY_symbol(const CFGMAP_ENTRY * self);
/******************************************************************
* Return the string for a the symbol.
*/
const char*
CFGMAP_ENTRY_value(const CFGMAP_ENTRY * self, unsigned ndx);
/******************************************************************
* Return the string for a the value indicated by ndx.
*/
const char*
CFGMAP_ENTRY_value_sn(const CFGMAP_ENTRY * self, unsigned *sn_buf, unsigned ndx);
/******************************************************************
* Return the string *and* serial number for a the value indicated by ndx.
*/
void
CFGMAP_ENTRY_print(const CFGMAP_ENTRY * self, FILE * fh);
/************************************************************************
* Print information for debugging.
*/
/*================== CFGMAP =================================*/
typedef struct {
enum {
CFGMAP_NTUPLES_KNOWN_FLG = 1 << 0
} flags;
unsigned recurs_lvl;
2019-12-05 14:42:29 +00:00
MAP entry_map; /* Table of all entries in map */
2019-11-23 03:40:23 +00:00
PTRVEC curlyBlock_lst; /* Stack of curly brace block symbols */
unsigned serial_no_seq,/* For assigning serial number to values */
nTuples;
} CFGMAP;
#define CFGMAP_file_create(p, fname) \
(CFGMAP_file_constructor((p)=malloc(sizeof(CFGMAP)), fname) ? (p) : ( p ? realloc(CFGMAP_destructor(p),0) : 0 ))
CFGMAP*
CFGMAP_file_constructor(CFGMAP * self, const char *fname);
/******************************************************************
* Create a map from a configuration file.
*/
#define CFGMAP_create(p) \
((p)= (CFGMAP_constructor((p)=malloc(sizeof(CFGMAP))) ? (p) : ( p ? realloc(CFGMAP_destructor(p),0) : 0 )))
CFGMAP*
CFGMAP_constructor(CFGMAP * self);
/******************************************************************
* Create an empty map.
*/
#define CFGMAP_destroy(s) \
{if(CFGMAP_destructor(s)) {free(s); s=0;}}
void*
CFGMAP_destructor(CFGMAP * self);
/******************************************************************
* Free resources associated with configuration file map.
*/
int
CFGMAP_file_read(CFGMAP * self, const char *fname);
/**************************************************************************
* Read a file to populate the map.
*/
void
CFGMAP_print(CFGMAP * self, FILE * fh);
/******************************************************************
* Print to stream for debugging purposes
*/
int
CFGMAP_visitAllSymbols(CFGMAP * self, int (*func) (const char *symbol, void *ctxt), void *ctxt);
/******************************************************************
* Call (*func)() for all symbols in the map.
*/
size_t
CFGMAP_numUnused_symbols(CFGMAP * self);
/******************************************************************
* Print unused symbol count.
*/
void
CFGMAP_print_unused_symbols(CFGMAP * self, FILE * fh);
/******************************************************************
* Print unused symbols for troubleshooting
*/
const CFGMAP_ENTRY*
CFGMAP_find(CFGMAP * self, const char *symbol);
/************************************************************************
* Try to locate a matching CFGMAP_ENTRY
*/
struct CFGMAP_tuple {
const char *key,
*value;
unsigned serial_no;
};
unsigned
CFGMAP_find_tuples(CFGMAP * self, struct CFGMAP_tuple rtn_arr[], const char *symbol);
/************************************************************************
* Find all tuples with a key matching symbol
* returns the number of tuples which were populated.
*/
int
CFGMAP_regex_find(CFGMAP * self, const CFGMAP_ENTRY * rtn_arr[], const char *patternStr);
/************************************************************************
* Find all instances of symbol which match patternStr.
* Returns: the number of matches, or -1 for error.
*/
const char*
CFGMAP_find_single_value(CFGMAP * self, const char *symbol);
/************************************************************************
* Find exactly one value for a symbol, or return NULL.
*/
const char*
CFGMAP_find_last_value(CFGMAP * self, const char *symbol);
/************************************************************************
* Find the last value for a symbol, or return NULL.
*/
int
CFGMAP_append(CFGMAP * self, const char *symbol, unsigned int symLen, const char *value);
/**************************************************************************
* Append a value to a config entry, creating a new entry if necessary.
*/
int
CFGMAP_query_uint(CFGMAP * self, unsigned int *pRtn, unsigned int dfltVal, const char *symbol);
/**********************************************************************************
* Convenience query function.
*/
int
CFGMAP_query_last_enum(
CFGMAP * self,
int *pRtn,
int dfltVal,
const char *symbol,
const struct enumTuple et_arr[]
);
/**********************************************************************************
* Convenience query function for enums.
*/
int
CFGMAP_query_last_flags(
CFGMAP * self,
int *pRtn,
int dfltVal,
const char *symbol,
const struct bitTuple bt_arr[]
);
/**********************************************************************************
* Convenience query function for possibly OR'd flags.
*/
int
CFGMAP_query_last_bool(CFGMAP * self, int *pRtn, int dfltVal, const char *symbol);
/**********************************************************************************
* Convenience function.
*/
int
CFGMAP_query_last_int(CFGMAP * self, int *pRtn, int dfltVal, const char *symbol);
/**********************************************************************************
* Convenience function.
*/
int
CFGMAP_query_last_uint(CFGMAP * self, unsigned *pRtn, unsigned dfltVal, const char *symbol);
/**********************************************************************************
* Convenience function.
*/
int
CFGMAP_query_last_dbl(CFGMAP * self, double *pRtn, double dfltVal, const char *symbol);
/**********************************************************************************
* Convenience function.
*/
int
CFGMAP_query_last_string(CFGMAP * self, char **pRtn, const char *dfltVal, const char *symbol);
/**********************************************************************************
* Convenience function.
* Note: string assigned to *pRtn was allocated by strdup().
*/
int
CFGMAP_query_last_time_of_day(CFGMAP * self, int *pRtn, int dfltVal, const char *symbol);
/**********************************************************************************
* Convenience function to convert hh:mm to a number of seconds.
*/
unsigned int
CFGMAP_numEntries(CFGMAP * self);
/******************************************************************
* Return the number of values stored for a given entry.
*/
unsigned int
CFGMAP_numTuples(CFGMAP * self);
/******************************************************************
* Return the number of tuples stored in the configuration map.
*/
int
CFGMAP_obtain_prefix(char *rtnBuf, size_t buf_sz, const char *path);
/******************************************************************
* Given a full path string, place the prefix in rtnBuf.
*/
#ifdef __cplusplus
}
#endif
#endif