Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #include <malloc.h>
- #include "xml.h"
- #include "errhnd.h"
- static char* _readline(FILE*);
- char*
- ReadXMLValue(char *file, char *tag) {
- FILE *f = fopen(file, "r");
- if (f==NULL)
- return NULL;
- char *filetext = (char*)calloc(sizeof(char), 1);
- if (filetext==NULL)
- RaiseErr("calloc() failed");
- char *fileline = malloc(1);
- while ((fileline = _readline(f)) != NULL) {
- int oldlength = strlen(filetext);
- int newlength = oldlength + 2 + strlen(fileline);
- char *newfiletext = (char*)realloc(filetext, newlength);
- if (newfiletext==NULL) {
- free(filetext);
- RaiseErr("realloc() failed");
- }
- filetext = newfiletext;
- strcat(filetext, (char*)"\n");
- strcat(filetext, fileline);
- }
- char *starttag = (char*)calloc(sizeof(char), strlen(tag)+3);
- if (starttag==NULL)
- RaiseErr("calloc() failed");
- starttag[0] = '<';
- strcat(starttag, tag);
- starttag[strlen(starttag)] = '>';
- char *endtag = (char*)calloc(sizeof(char), strlen(tag)+4);
- endtag[0] = '<';
- endtag[1] = '/';
- strcat(endtag, tag);
- endtag[strlen(endtag)] = '>';
- if (strcasestr(filetext, starttag)==NULL)
- return NULL;
- if (strcasestr(filetext, endtag)==NULL)
- return NULL;
- int contentsize = strcasestr(filetext, endtag)-strcasestr(filetext, starttag) - strlen(starttag) + 1;
- char *content = (char*)calloc(sizeof(char), contentsize);
- strncpy(content, strcasestr(filetext, starttag)+strlen(starttag), contentsize-1);
- content[contentsize-1] = 0;
- return content;
- }
- static char*
- _readline(FILE* file) {
- if (!feof(file)) {
- char *line = (char*)malloc(0x20);
- if (line==NULL)
- RaiseErr("calloc() failed");
- line[0] = 0;
- int curchar;
- boolean inTag = bFalse;
- boolean skipToEndTag = bFalse;
- while ((curchar = getc(file)) != '\n' && curchar != EOF) {
- if (curchar == '\r')
- continue;
- if (curchar == '<')
- inTag = bTrue;
- if (curchar == '>') {
- inTag = bFalse;
- skipToEndTag = bFalse;
- }
- if (inTag && skipToEndTag)
- continue;
- if (inTag && curchar == ' ') {
- skipToEndTag = bTrue;
- continue;
- }
- int newlength = strlen(line)+2;
- char *newline = (char*)realloc(line, newlength);
- if (newline==NULL) {
- free(line);
- RaiseErr("realloc() failed");
- }
- line[newlength-2] = curchar;
- line[newlength-1] = 0;
- }
- return line;
- } else {
- return NULL;
- }
- }
Add Comment
Please, Sign In to add comment