Files
config-parser/config.c
2025-05-13 12:57:12 +02:00

214 lines
6.5 KiB
C

#include"config.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int loadConfig(char *str_file, char **str_entry,char **host,int *intervall,int size)
{
int i=0;
FILE *f_config;
char temp_str[256];
char *ret = NULL;
printf("\nopening config file\n");
f_config = fopen(str_file,"r");
if(f_config != NULL)
{
ret = fgets(temp_str,256,f_config);
while(ret!=NULL)
{
temp_str[strcspn(temp_str,"\n")]=0;
printf("first temp_str:%s\n",temp_str);
if(strcmp(temp_str,"[Host]")==0)
{
printf("temp_str host:%s\n",temp_str);
while(ret!=NULL)
{
printf("temp_str:%s\n",temp_str);
ret = fgets(temp_str,256,f_config);
if(strchr(temp_str,'[')==NULL)
{
printf("strchr\n");
if(strstr(temp_str,"Hostname")!=NULL)
{
char *ptr_host = strrchr(temp_str,'=')+1;//Without =
ptr_host[strcspn(ptr_host,"\n")]=0;
while(ptr_host[0]==' ') //Potential segfault??
{
if(ptr_host < (temp_str + strlen(temp_str)))
{
ptr_host = ptr_host + 1;
}else{
break;
}
}
*host = strdup(ptr_host);
printf("my host is:%s\n",*host);
}
}else{
break;
}
}
}
}
}
else
{
fprintf(stderr,"error opening file[%s]\n",str_file);
}
fclose(f_config);
printf("Done reading config file\n");
return 0;
}
/*
* Here we check if the given string contains a section
* for example [SECTIONName] here delimiterLeft is [ and delimiterRight is ]
* if a section is found, the section name will be written to sectionName
*
* Input:
* char **str: the string to check
* char delimiterLeft: the left delimiter to check for
* char delimiterRight: the right delimiter to check for
* Output:
* char **sectionName: if found the section Name of the section
* Return:
* int status_code: one of the following values:
*
*/
int checkSection(char *str,char delimiterLeft,char delimiterRight,char **sectionName)
{
char section[MAX_LEN_SECTIONNAME];
int i = 0; //most outer loop -> character of string
if(str == NULL)
{
return ERROR_STR;
}
int len = strlen(str);
printf("strlen: %d",len);
int state = ST_INIT;
int leftDelimiterPos=0;
int rightDelimiterPos=0;
char *sectionName2 = NULL;
while(state != ST_FINISH)
{
printf("STATE:%i\n",state);
switch(state)
{
case ST_INIT:
for(i=0;i<=len;i++) //find first (left) delimiter
{
if(str[i] == delimiterLeft)
{
state = ST_FOUND_LEFT_DELIMITER;
leftDelimiterPos = i;
break;
}
}
break;
case ST_FOUND_LEFT_DELIMITER:
for(i=0;i<=len;i++) //find second (right) delimiter
{
if(str[i] == delimiterRight)
{
state = ST_FOUND_RIGHT_DELIMITER;
rightDelimiterPos = i;
break;
}
}
if(state != ST_FOUND_RIGHT_DELIMITER)
{
return ST_ERROR_NOT_FOUND_RIGHT_DELIMITER;
}
break;
case ST_FOUND_RIGHT_DELIMITER:
int ret=0;
sectionName2 = malloc(MAX_LEN_SECTIONNAME*sizeof(char));
if((ret=getStrAtPos(str,leftDelimiterPos,rightDelimiterPos,&sectionName2,MAX_LEN_SECTIONNAME)) == NO_ERROR)
{
*sectionName = sectionName2;
state = ST_FINISH;
}else{
return ret;
}
case ST_FINISH:
return FOUND_SECTION;
}
}
return NO_SECTION;
}
/*
* Here we get / cut from fromPos to toPos and write it to an address
*
* Input:
* char *str: the string to cut
* int fromPos: from which position we want to copy, the pos is included and zero indexed
* int toPos: to which position we want to copy, the pos is included and zero indexed
* Output:
* char **name: here we will write the section name to
* Input:
* int sizeName: the size of the user allocated buffer at **name
*/
int getStrAtPos(char *str,int fromPos,int toPos,char **name,int sizeName)
{
int i=fromPos; //character iterator, which starts from specified pos
int j=0; //the character iterator for the target string
int diffLen=toPos-fromPos;
char *ptr_name=*name;
if(diffLen > MAX_LEN_SECTIONNAME || diffLen>sizeName)
{
return ERROR_MAX_LEN;
}
for(i=fromPos,j=0;i<=toPos;i++,j++)
{
ptr_name[j] = str[i];
}
ptr_name[j+1]='\0';
printf("*name:%s\n",*name);
return NO_ERROR;
}
int getNameValuePair(char *str,char leftDelimiterPos,char rightDelimiterPos,char **name,char **value,int sizeName,int sizeValue)
{
int state=ST_INIT;
char *ptr_name=*name;
char *ptr_value=*value;
int ret=0;
char *ptrDelimiter=NULL;
int posDelimiter=0;
int posEnd=0;
ptrDelimiter=strchr(str,leftDelimiterPos);
if(ptrDelimiter==NULL)
{
return ERROR_DELIMITER_NOT_FOUND;
}
posDelimiter = (ptrDelimiter - str);
printf("LenUntilDelimiter: %d",posDelimiter);
if((ret=getStrAtPos(str,0,posDelimiter-1,&ptr_name,MAX_LEN_SECTIONNAME)) == NO_ERROR)
{
printf("ptr_name:%s",ptr_name);
}else {
return ret;
}
if(rightDelimiterPos == 0)
{
posEnd = strlen(str);
}else{
posEnd = rightDelimiterPos;
}
if((ret=getStrAtPos(str,posDelimiter+1,posEnd,&ptr_value,MAX_LEN_SECTIONNAME)) == NO_ERROR)
{
printf("ptr_name:%s\n",ptr_value);
}else {
return ret;
}
return NO_ERROR;
}