/************************************************************************* * (C) 2008 AITNET ltd - Sofia/Bulgaria - * by Michael Pounov * * $Author: misho $ * $Id: aitcfg.h,v 1.5 2010/03/22 15:15:48 misho Exp $ * *************************************************************************/ #ifndef __AITCFG_H #define __AITCFG_H struct tagPair { unsigned int uLine; unsigned char *psSection; unsigned char *psAttribute; unsigned char *psValue; struct tagPair *sle_next; }; struct tagHead { struct tagPair *slh_first; }; typedef struct tagHead sl_config; /* * Macros for config library. Typecast string to specific config string format. */ #define CFG(x) (unsigned char *)(x) #define CFG_ISSET(x) ((long) cfg_FirstItem((x))) /* * InitConfig() Head initializing function for config * @cfg = New head element for init * return: 0 ok; -1 error:: new head element is null */ inline int InitConfig(sl_config * __restrict cfg); /* * cfg_CreateConfig() Create config file from memory without whitespaces! * @csConfigName = New config filename * @cfg = Head list element * return: 0 ok; -1 error:: can`t save new config */ int cfg_CreateConfig(const char *csConfigName, sl_config * __restrict cfg); /* * CreateConfig() Create config file from memory * @csConfigName = New config filename * @cfg = Head list element * return: 0 ok; -1 error:: can`t save new config */ int CreateConfig(const char *csConfigName, sl_config * __restrict cfg); /* * LoadConfig() Load config from file * @csConfigName = Filename of config * @cfg = Head list element * return: 0 ok; -1 error:: can`t load config */ int LoadConfig(const char *csConfigName, sl_config * __restrict cfg); /* * UnloadConfig() Unload config from memory and free resources * @cfg = Head list element */ void UnloadConfig(sl_config * __restrict cfg); // cfg_GetErrno() Get error code of last operation inline int cfg_GetErrno(); // cfg_GetError() Get error text of last operation inline const char *cfg_GetError(); /* * ReadConfig() Read from file and add new item to config list * @f = file resource * @cfg = Head list element * return: 0 ok; -1 error:: can`t allocate memory */ int ReadConfig(FILE *f, sl_config * __restrict cfg); /* * WriteConfig() Write to file from items in config list * @f = file resource * @cfg = Head list element * return: 0 ok; -1 error:: can`t write to file */ int WriteConfig(FILE *f, sl_config * __restrict cfg); /* * cfg_WriteConfig() Write to file from items in config list without whitespaces! * @f = file resource * @cfg = Head list element * return: 0 ok; -1 error:: can`t write to file */ int cfg_WriteConfig(FILE *f, sl_config * __restrict cfg); /* * ConcatConfig() Concat two list in one * @cfg = Head list element of main list * @add_cfg = Head list element of added list * return: 0 ok; -1 error:: can`t concat lists */ int ConcatConfig(sl_config * __restrict cfg, sl_config * __restrict add_cfg); /* * MergeConfig() Marge two list in one cfg and destroy add_cfg * @cfg = Head list element of main list * @add_cfg = Head list element of merged list (destroy after all!) * return: 0 ok; -1 error:: can`t merge lists */ int MergeConfig(sl_config * __restrict cfg, sl_config * __restrict add_cfg); /* * cfg_FindAttribute() Find attribute position in config list * @cfg = Head list element * @csSec = Config section //[{csSec}] * @csAttr = Config attribute //{csAttr} = ... * return: 0 not found item; -1 error: null parameters; >0 position in list */ inline int cfg_FindAttribute(sl_config * __restrict cfg, const u_char *csSec, const u_char *csAttr); /* * cfg_SetAttribute() Set item in config list or add new item if not exists * @cfg = Head list element * @csSec = Config section //[{csSec}], if NULL set in *default* section * @csAttr = Config attribute //{csAttr} = ..., if NULL set as *any* attribute * @csVal = Config value //... = {csVal} to setup * return: 0 nothing changed, -1 error: not enough memory; 1 find and update item; 2 added new item */ int cfg_SetAttribute(sl_config * __restrict cfg, const u_char *csSec, const u_char *csAttr, const u_char *csVal); /* * cfg_UnsetAttribute() Unset item from config list and free resources * @cfg = Head list element * @csSec = Config section //[{csSec}], if NULL unset in *default* section * @csAttr = Config attribute //{csAttr} = ..., if NULL unset as *any* attribute * return: 0 item not found, -1 error: null parameters; >0 position in list */ int cfg_UnsetAttribute(sl_config * __restrict cfg, const u_char *csSec, const u_char *csAttr); /* * cfg_GetAttribute() Get item from config list and return his value * @cfg = Head list element * @csSec = Config section //[{csSec}], if NULL unset in *default* section * @csAttr = Config attribute //{csAttr} = ..., if NULL unset as *any* attribute * return: NULL item not found or null parameters; !=NULL value const string */ inline const u_char *cfg_GetAttribute(sl_config * __restrict cfg, const u_char *csSec, const u_char *csAttr); /* * cfg_FirstItem() Get first item from config list and return his value * @cfg = Head list element * return: NULL if no items in list; !=NULL first pair item */ inline struct tagPair *cfg_FirstItem(sl_config * __restrict cfg); /* * cfg_LoadAttribute() Extended get attribute, if not found item return *default value* * @cfg = Head list element * @csSec = Config section //[{csSec}], if NULL unset in *default* section * @csAttr = Config attribute //{csAttr} = ..., if NULL unset as *any* attribute * @psVal = Return buffer for item Value //... = {psVal} * @ValLen = Length of buffer //{psVal} for return * @csDefValue = *Default Value* for return in //{psVal}, if not found item in config list * return: 0 item not found, -1 error: null parameters; >0 number of copied bytes in //{psVal} */ int cfg_LoadAttribute(sl_config * __restrict cfg, const u_char *csSec, const u_char *csAttr, u_char * __restrict psVal, int ValLen, const char *csDefValue); #endif