dynamic_array_t *config_file_read (const char *filename){ char key[MAX_LINE_LENGTH]; char tail[MAX_LINE_LENGTH]; char buffer[MAX_LINE_LENGTH]; char format[MAX_LINE_LENGTH]; int status; int token=0; int comment=0; int offset=0; char *s; dynamic_array_t *a; FILE *stream; extern int errno; if(filename==NULL) return(NULL); if((stream=fopen(filename, "r"))==NULL){ return(NULL); } if((a=dynamic_array_create((size_t)0))==NULL){ fprintf(stderr, "config_file_read: dynamic_array_create\n"); return(NULL); } /*insert a dummy argv[0] into the dynamic array*/ if((a=dynamic_array_add_element(a, "", DESTROY_STR, DUP_STR))==NULL){ fprintf(stderr, "config_file_read: dynamic_array_add_element\n"); return(NULL); } *key=*(key+1)=*buffer=*(buffer+1)='-'; sprintf( format, "%%%d[^ \t\n\r#]%%%d[ \t\n\r#]", MAX_LINE_LENGTH-3, MAX_LINE_LENGTH-1 ); while((status=fscanf(stream, format, key+2+offset, tail))!=EOF){ if(status==0) { status=fscanf(stream, "%[^\n]\n", tail); continue; } if(!comment){ strncpy(buffer+offset,key+offset,MAX_LINE_LENGTH-offset); if(token==0){ ADD_ELEMENT; } } if(status==2){ if((s=strrchr(tail, '\n'))==NULL){ if(token++>0){ offset=strlen(key+2); *(key+2+offset)=' '; *(buffer+2+offset++)=' '; } } else{ if(!comment && *buffer!='\0'){ ADD_ELEMENT; } offset=0; token=0; comment=0; *buffer='\0'; } if(!comment){ comment=(strchr(s!=NULL?s:tail, '#')==NULL)?0:1; } } } return(a); }
dynamic_array_t * config_stream_read(FILE * stream, const char *first_element) { char token[MAX_LINE_LENGTH]; char tail[2]; char format[MAX_LINE_LENGTH]; char format_whitespace[MAX_LINE_LENGTH]; int status; int ntoken; int comment = 0; char *s; int c; int flag; dynamic_array_t *a; if ((a = dynamic_array_create((size_t) 0)) == NULL) { perror("config_file_read: dynamic_array_create"); return (NULL); } /*insert a argv[0] into the dynamic array */ if ((a = dynamic_array_add_element(a, (first_element != NULL ? first_element : ""), DESTROY_STR, DUP_STR)) == NULL) { perror("config_file_read: dynamic_array_add_element"); return (NULL); } sprintf(format, "%%%d[^ \t\n\r]%%1[ \t\n\r]", MAX_LINE_LENGTH); sprintf(format_whitespace, "%%%d[ \t\r]%%1[\n]", MAX_LINE_LENGTH); ntoken = 0; while ((status = fscanf(stream, format, token, tail)) != EOF) { if (status == 0) { flag = 1; while (flag) { c = fgetc(stream); switch (c) { case EOF: dynamic_array_destroy(a, DESTROY_STR); return (NULL); case '\n': return (a); case '\t': case '\r': case ' ': break; default: ungetc(c, stream); flag = 0; } } continue; } if (!comment && strcmp(token, "ipvsadm")) { ntoken++; if ((a = dynamic_array_add_element(a, token, DESTROY_STR, DUP_STR)) == NULL) { perror("config_file_read: dynamic_array_add_element"); dynamic_array_destroy(a, DESTROY_STR); return (NULL); } } if ((s = strrchr(tail, '\n')) != NULL) { return (a); } if (!comment) { comment = (strchr((s != NULL ? s : tail), '#') == NULL) ? 0 : 1; } } if (ntoken == 0) { dynamic_array_destroy(a, DESTROY_STR); return (NULL); } return (a); }