Skip to content
Snippets Groups Projects
Commit 735059e4 authored by rswindell's avatar rswindell
Browse files

Created strList iniGet functions for getting values (strings, numbers, etc).

Using sprintf() instead of strcpy() to avoid potential buffer overrun.
Using strdup() instead of malloc()/strcpy().
parent 6f67dc2e
No related branches found
No related tags found
No related merge requests found
......@@ -73,7 +73,7 @@ static char* section_name(char* p)
return(p);
}
static BOOL find_section(FILE* fp, const char* section)
static BOOL seek_section(FILE* fp, const char* section)
{
char* p;
char str[INI_MAX_LINE_LEN];
......@@ -109,7 +109,7 @@ static size_t find_section_index(str_list_t list, const char* section)
return(i);
}
static size_t find_section_values(str_list_t list, const char* section)
static size_t find_section(str_list_t list, const char* section)
{
size_t i;
......@@ -163,7 +163,7 @@ static char* key_name(char* p, char** vp)
return(p);
}
static char* get_value(FILE* fp, const char* section, const char* key, char* value)
static char* read_value(FILE* fp, const char* section, const char* key, char* value)
{
char* p;
char* vp=NULL;
......@@ -172,7 +172,7 @@ static char* get_value(FILE* fp, const char* section, const char* key, char* val
if(fp==NULL)
return(NULL);
if(!find_section(fp,section))
if(!seek_section(fp,section))
return(NULL);
while(!feof(fp)) {
......@@ -194,7 +194,7 @@ static char* get_value(FILE* fp, const char* section, const char* key, char* val
return(NULL);
}
static size_t find_value_index(str_list_t list, const char* section, const char* key, char* value)
static size_t get_value(str_list_t list, const char* section, const char* key, char* value)
{
char str[INI_MAX_LINE_LEN];
char* p;
......@@ -202,7 +202,7 @@ static size_t find_value_index(str_list_t list, const char* section, const char*
size_t i;
value[0]=0;
for(i=find_section_values(list, section); list[i]!=NULL; i++) {
for(i=find_section(list, section); list[i]!=NULL; i++) {
SAFECOPY(str, list[i]);
if((p=key_name(str,&vp))==NULL)
continue;
......@@ -210,7 +210,7 @@ static size_t find_value_index(str_list_t list, const char* section, const char*
break;
if(stricmp(p,key)!=0)
continue;
strcpy(value,vp);
sprintf(value,"%.*s",INI_MAX_VALUE_LEN-1,vp);
return(i);
}
......@@ -233,7 +233,7 @@ BOOL iniKeyExists(str_list_t* list, const char* section, const char* key)
char val[INI_MAX_VALUE_LEN];
size_t i;
i=find_value_index(*list, section, key, val);
i=get_value(*list, section, key, val);
if((*list)[i]==NULL || *(*list)[i]==INI_OPEN_SECTION_CHAR)
return(FALSE);
......@@ -245,7 +245,7 @@ BOOL iniValueExists(str_list_t* list, const char* section, const char* key)
{
char val[INI_MAX_VALUE_LEN];
find_value_index(*list, section, key, val);
get_value(*list, section, key, val);
return(val[0]!=0);
}
......@@ -255,7 +255,7 @@ BOOL iniRemoveKey(str_list_t* list, const char* section, const char* key)
char val[INI_MAX_VALUE_LEN];
size_t i;
i=find_value_index(*list, section, key, val);
i=get_value(*list, section, key, val);
if((*list)[i]==NULL || *(*list)[i]==INI_OPEN_SECTION_CHAR)
return(FALSE);
......@@ -269,7 +269,7 @@ BOOL iniRemoveValue(str_list_t* list, const char* section, const char* key)
size_t i;
char* vp=NULL;
i=find_value_index(*list, section, key, val);
i=get_value(*list, section, key, val);
key_name((*list)[i], &vp);
if(vp==NULL)
......@@ -357,7 +357,7 @@ char* iniSetString(str_list_t* list, const char* section, const char* key, const
value="";
safe_snprintf(str, sizeof(str), "%s%-*s%s%s"
, style->key_prefix, style->key_len, key, style->value_separator, value);
i=find_value_index(*list, section, key, curval);
i=get_value(*list, section, key, curval);
if((*list)[i]==NULL || *(*list)[i]==INI_OPEN_SECTION_CHAR) {
while(i && *(*list)[i-1]==0) i--; /* Insert before blank lines, not after */
return strListInsert(list, str, i);
......@@ -471,7 +471,7 @@ char* iniSetStringList(str_list_t* list, const char* section, const char* key
char* iniReadString(FILE* fp, const char* section, const char* key, const char* deflt, char* value)
{
if(get_value(fp,section,key,value)==NULL || *value==0 /* blank */) {
if(read_value(fp,section,key,value)==NULL || *value==0 /* blank */) {
if(deflt==NULL)
return(NULL);
sprintf(value,"%.*s",INI_MAX_VALUE_LEN-1,deflt);
......@@ -480,21 +480,25 @@ char* iniReadString(FILE* fp, const char* section, const char* key, const char*
return(value);
}
str_list_t iniReadStringList(FILE* fp, const char* section, const char* key
,const char* sep, const char* deflt)
char* iniGetString(str_list_t* list, const char* section, const char* key, const char* deflt, char* value)
{
get_value(*list, section, key, value);
if(*value==0 /* blank */) {
if(deflt==NULL)
return(NULL);
sprintf(value,"%.*s",INI_MAX_VALUE_LEN-1,deflt);
}
return(value);
}
static str_list_t splitList(char* list, const char* sep)
{
char* value;
char buf[INI_MAX_VALUE_LEN];
char* token;
char list[INI_MAX_VALUE_LEN];
ulong items=0;
str_list_t lp;
if((value=get_value(fp,section,key,buf))==NULL || *value==0 /* blank */)
value=(char*)deflt;
SAFECOPY(list,value);
if((lp=strListInit())==NULL)
return(NULL);
......@@ -508,9 +512,41 @@ str_list_t iniReadStringList(FILE* fp, const char* section, const char* key
break;
token=strtok(NULL,sep);
}
return(lp);
}
str_list_t iniReadStringList(FILE* fp, const char* section, const char* key
,const char* sep, const char* deflt)
{
char* value;
char buf[INI_MAX_VALUE_LEN];
char list[INI_MAX_VALUE_LEN];
if((value=read_value(fp,section,key,buf))==NULL || *value==0 /* blank */)
value=(char*)deflt;
SAFECOPY(list,value);
return(splitList(list,sep));
}
str_list_t iniGetStringList(str_list_t* list, const char* section, const char* key
,const char* sep, const char* deflt)
{
char buf[INI_MAX_VALUE_LEN];
char* value=buf;
get_value(*list, section, key, value);
if(*value==0 /* blank */)
value=(char*)deflt;
SAFECOPY(buf,value);
return(splitList(buf,sep));
}
void* iniFreeStringList(str_list_t list)
{
strListFree(&list);
......@@ -582,7 +618,7 @@ str_list_t iniReadKeyList(FILE* fp, const char* section)
rewind(fp);
if(!find_section(fp,section))
if(!seek_section(fp,section))
return(lp);
while(!feof(fp)) {
......@@ -619,7 +655,7 @@ iniReadNamedStringList(FILE* fp, const char* section)
rewind(fp);
if(!find_section(fp,section))
if(!seek_section(fp,section))
return(lp);
while(!feof(fp)) {
......@@ -634,12 +670,10 @@ iniReadNamedStringList(FILE* fp, const char* section)
lp=np;
if((lp[items]=(named_string_t*)malloc(sizeof(named_string_t)))==NULL)
break;
if((lp[items]->name=(char*)malloc(strlen(name)+1))==NULL)
if((lp[items]->name=strdup(name))==NULL)
break;
strcpy(lp[items]->name,name);
if((lp[items]->value=(char*)malloc(strlen(value)+1))==NULL)
if((lp[items]->value=strdup(value))==NULL)
break;
strcpy(lp[items]->value,value);
items++;
}
......@@ -655,7 +689,7 @@ long iniReadInteger(FILE* fp, const char* section, const char* key, long deflt)
char* value;
char buf[INI_MAX_VALUE_LEN];
if((value=get_value(fp,section,key,buf))==NULL)
if((value=read_value(fp,section,key,buf))==NULL)
return(deflt);
if(*value==0) /* blank value */
......@@ -664,36 +698,72 @@ long iniReadInteger(FILE* fp, const char* section, const char* key, long deflt)
return(strtol(value,NULL,0));
}
long iniGetInteger(str_list_t* list, const char* section, const char* key, long deflt)
{
char value[INI_MAX_VALUE_LEN];
get_value(*list, section, key, value);
if(*value==0) /* blank value */
return(deflt);
return(strtol(value,NULL,0));
}
ushort iniReadShortInt(FILE* fp, const char* section, const char* key, ushort deflt)
{
return((ushort)iniReadInteger(fp, section, key, deflt));
}
ushort iniGetShortInt(str_list_t* list, const char* section, const char* key, ushort deflt)
{
return((ushort)iniGetInteger(list, section, key, deflt));
}
#if !defined(NO_SOCKET_SUPPORT)
static ulong parseIpAddress(const char* value)
{
if(strchr(value,'.')==NULL)
return(strtol(value,NULL,0));
return(ntohl(inet_addr(value)));
}
ulong iniReadIpAddress(FILE* fp, const char* section, const char* key, ulong deflt)
{
char buf[INI_MAX_VALUE_LEN];
char* value;
if((value=get_value(fp,section,key,buf))==NULL)
if((value=read_value(fp,section,key,buf))==NULL)
return(deflt);
if(*value==0) /* blank value */
return(deflt);
if(strchr(value,'.')==NULL)
return(strtol(value,NULL,0));
return(parseIpAddress(value));
}
return(ntohl(inet_addr(value)));
ulong iniGetIpAddress(str_list_t* list, const char* section, const char* key, ulong deflt)
{
char value[INI_MAX_VALUE_LEN];
get_value(*list, section, key, value);
if(*value==0) /* blank value */
return(deflt);
return(parseIpAddress(value));
}
#endif
#endif /* !NO_SOCKET_SUPPORT */
double iniReadFloat(FILE* fp, const char* section, const char* key, double deflt)
{
char buf[INI_MAX_VALUE_LEN];
char* value;
if((value=get_value(fp,section,key,buf))==NULL)
if((value=read_value(fp,section,key,buf))==NULL)
return(deflt);
if(*value==0) /* blank value */
......@@ -702,17 +772,20 @@ double iniReadFloat(FILE* fp, const char* section, const char* key, double deflt
return(atof(value));
}
BOOL iniReadBool(FILE* fp, const char* section, const char* key, BOOL deflt)
double iniGetFloat(str_list_t* list, const char* section, const char* key, double deflt)
{
char buf[INI_MAX_VALUE_LEN];
char* value;
char value[INI_MAX_VALUE_LEN];
if((value=get_value(fp,section,key,buf))==NULL)
return(deflt);
get_value(*list, section, key, value);
if(*value==0) /* blank value */
return(deflt);
return(atof(value));
}
static BOOL parseBool(const char* value)
{
if(!stricmp(value,"TRUE"))
return(TRUE);
if(!stricmp(value,"FALSE"))
......@@ -721,19 +794,39 @@ BOOL iniReadBool(FILE* fp, const char* section, const char* key, BOOL deflt)
return(strtol(value,NULL,0));
}
ulong iniReadBitField(FILE* fp, const char* section, const char* key,
ini_bitdesc_t* bitdesc, ulong deflt)
BOOL iniReadBool(FILE* fp, const char* section, const char* key, BOOL deflt)
{
char buf[INI_MAX_VALUE_LEN];
char* value;
if((value=read_value(fp,section,key,buf))==NULL)
return(deflt);
if(*value==0) /* blank value */
return(deflt);
return(parseBool(value));
}
BOOL iniGetBool(str_list_t* list, const char* section, const char* key, BOOL deflt)
{
char value[INI_MAX_VALUE_LEN];
get_value(*list, section, key, value);
if(*value==0) /* blank value */
return(deflt);
return(parseBool(value));
}
static ulong parseBitField(char* value, ini_bitdesc_t* bitdesc)
{
int i;
char* p;
char* tp;
char* value;
char buf[INI_MAX_VALUE_LEN];
ulong v=0;
if((value=get_value(fp,section,key,buf))==NULL)
return(deflt);
for(p=value;*p;) {
tp=strchr(p,'|');
if(tp!=NULL)
......@@ -759,6 +852,31 @@ ulong iniReadBitField(FILE* fp, const char* section, const char* key,
return(v);
}
ulong iniReadBitField(FILE* fp, const char* section, const char* key,
ini_bitdesc_t* bitdesc, ulong deflt)
{
char* value;
char buf[INI_MAX_VALUE_LEN];
if((value=read_value(fp,section,key,buf))==NULL)
return(deflt);
return(parseBitField(value,bitdesc));
}
ulong iniGetBitField(str_list_t* list, const char* section, const char* key,
ini_bitdesc_t* bitdesc, ulong deflt)
{
char value[INI_MAX_VALUE_LEN];
get_value(*list, section, key, value);
if(*value==0) /* blank value */
return(deflt);
return(parseBitField(value,bitdesc));
}
str_list_t iniReadFile(FILE* fp)
{
size_t i;
......
......@@ -71,22 +71,22 @@ named_string_t**
iniReadNamedStringList (FILE*, const char* section);
/* These functions read a single key of the specified type */
char* iniReadString(FILE*, const char* section, const char* key,
const char* deflt, char* value);
char* iniReadString(FILE*, const char* section, const char* key
,const char* deflt, char* value);
str_list_t iniReadStringList(FILE*, const char* section, const char* key
,const char* sep, const char* deflt);
long iniReadInteger(FILE*, const char* section, const char* key,
long deflt);
ushort iniReadShortInt(FILE*, const char* section, const char* key,
ushort deflt);
ulong iniReadIpAddress(FILE*, const char* section, const char* key,
ulong deflt);
double iniReadFloat(FILE*, const char* section, const char* key,
double deflt);
BOOL iniReadBool(FILE*, const char* section, const char* key,
BOOL deflt);
ulong iniReadBitField(FILE*, const char* section, const char* key,
ini_bitdesc_t* bitdesc, ulong deflt);
long iniReadInteger(FILE*, const char* section, const char* key
,long deflt);
ushort iniReadShortInt(FILE*, const char* section, const char* key
,ushort deflt);
ulong iniReadIpAddress(FILE*, const char* section, const char* key
,ulong deflt);
double iniReadFloat(FILE*, const char* section, const char* key
,double deflt);
BOOL iniReadBool(FILE*, const char* section, const char* key
,BOOL deflt);
ulong iniReadBitField(FILE*, const char* section, const char* key
,ini_bitdesc_t* bitdesc, ulong deflt);
/* Free string list returned from iniRead*List functions */
void* iniFreeStringList(str_list_t list);
......@@ -100,8 +100,24 @@ str_list_t iniReadFile(FILE*);
BOOL iniWriteFile(FILE*, const str_list_t);
/* StringList functions */
size_t iniAddSection(str_list_t*, const char* section
,ini_style_t*);
char* iniGetString(str_list_t*, const char* section, const char* key
,const char* deflt, char* value);
str_list_t iniGetStringList(str_list_t*, const char* section, const char* key
,const char* sep, const char* deflt);
long iniGetInteger(str_list_t*, const char* section, const char* key
,long deflt);
ushort iniGetShortInt(str_list_t*, const char* section, const char* key
,ushort deflt);
ulong iniGetIpAddress(str_list_t*, const char* section, const char* key
,ulong deflt);
double iniGetFloat(str_list_t*, const char* section, const char* key
,double deflt);
BOOL iniGetBool(str_list_t*, const char* section, const char* key
,BOOL deflt);
ulong iniGetBitField(str_list_t*, const char* section, const char* key
,ini_bitdesc_t* bitdesc, ulong deflt);
char* iniSetString(str_list_t*, const char* section, const char* key, const char* value
,ini_style_t*);
char* iniSetInteger(str_list_t*, const char* section, const char* key, long value
......@@ -121,6 +137,9 @@ char* iniSetBitField(str_list_t*, const char* section, const char* key, ini_bit
char* iniSetStringList(str_list_t*, const char* section, const char* key
,const char* sep, str_list_t value, ini_style_t*);
size_t iniAddSection(str_list_t*, const char* section
,ini_style_t*);
BOOL iniSectionExists(str_list_t*, const char* section);
BOOL iniKeyExists(str_list_t*, const char* section, const char* key);
BOOL iniValueExists(str_list_t*, const char* section, const char* key);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment