Guest User

Untitled

a guest
May 28th, 2018
173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.37 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <malloc.h>
  4.  
  5. #include "xml.h"
  6. #include "errhnd.h"
  7.  
  8. static char* _readline(FILE*);
  9.  
  10. char*
  11. ReadXMLValue(char *file, char *tag) {
  12. FILE *f = fopen(file, "r");
  13. if (f==NULL)
  14. return NULL;
  15.  
  16. char *filetext = (char*)calloc(sizeof(char), 1);
  17. if (filetext==NULL)
  18. RaiseErr("calloc() failed");
  19. char *fileline = malloc(1);
  20. while ((fileline = _readline(f)) != NULL) {
  21. int oldlength = strlen(filetext);
  22. int newlength = oldlength + 2 + strlen(fileline);
  23. char *newfiletext = (char*)realloc(filetext, newlength);
  24. if (newfiletext==NULL) {
  25. free(filetext);
  26. RaiseErr("realloc() failed");
  27. }
  28. filetext = newfiletext;
  29. strcat(filetext, (char*)"\n");
  30. strcat(filetext, fileline);
  31. }
  32.  
  33. char *starttag = (char*)calloc(sizeof(char), strlen(tag)+3);
  34. if (starttag==NULL)
  35. RaiseErr("calloc() failed");
  36. starttag[0] = '<';
  37. strcat(starttag, tag);
  38. starttag[strlen(starttag)] = '>';
  39.  
  40. char *endtag = (char*)calloc(sizeof(char), strlen(tag)+4);
  41. endtag[0] = '<';
  42. endtag[1] = '/';
  43. strcat(endtag, tag);
  44. endtag[strlen(endtag)] = '>';
  45.  
  46. if (strcasestr(filetext, starttag)==NULL)
  47. return NULL;
  48. if (strcasestr(filetext, endtag)==NULL)
  49. return NULL;
  50.  
  51. int contentsize = strcasestr(filetext, endtag)-strcasestr(filetext, starttag) - strlen(starttag) + 1;
  52. char *content = (char*)calloc(sizeof(char), contentsize);
  53. strncpy(content, strcasestr(filetext, starttag)+strlen(starttag), contentsize-1);
  54. content[contentsize-1] = 0;
  55.  
  56. return content;
  57. }
  58.  
  59. static char*
  60. _readline(FILE* file) {
  61. if (!feof(file)) {
  62. char *line = (char*)malloc(0x20);
  63. if (line==NULL)
  64. RaiseErr("calloc() failed");
  65. line[0] = 0;
  66. int curchar;
  67. boolean inTag = bFalse;
  68. boolean skipToEndTag = bFalse;
  69. while ((curchar = getc(file)) != '\n' && curchar != EOF) {
  70. if (curchar == '\r')
  71. continue;
  72. if (curchar == '<')
  73. inTag = bTrue;
  74. if (curchar == '>') {
  75. inTag = bFalse;
  76. skipToEndTag = bFalse;
  77. }
  78. if (inTag && skipToEndTag)
  79. continue;
  80. if (inTag && curchar == ' ') {
  81. skipToEndTag = bTrue;
  82. continue;
  83. }
  84.  
  85. int newlength = strlen(line)+2;
  86. char *newline = (char*)realloc(line, newlength);
  87. if (newline==NULL) {
  88. free(line);
  89. RaiseErr("realloc() failed");
  90. }
  91. line[newlength-2] = curchar;
  92. line[newlength-1] = 0;
  93. }
  94. return line;
  95. } else {
  96. return NULL;
  97. }
  98. }
Add Comment
Please, Sign In to add comment