| 137 | } |
| 138 | |
| 139 | xode xode_from_file(char *file) |
| 140 | { |
| 141 | XML_Parser p; |
| 142 | xode *x, node; /* pointer to an xmlnode */ |
| 143 | char buf[BUFSIZ]; |
| 144 | int done, fd, len; |
| 145 | char _file[1000]; |
| 146 | |
| 147 | if(NULL == file) |
| 148 | return NULL; |
| 149 | |
| 150 | /* perform tilde expansion */ |
| 151 | if(*file == '~') |
| 152 | { |
| 153 | char *env = getenv("HOME"); |
| 154 | if(env != NULL) |
| 155 | snprintf((char*)_file, 1000, "%s%s", env, file + 1); |
| 156 | else |
| 157 | snprintf((char*)_file, 1000, "%s", file); |
| 158 | } |
| 159 | else |
| 160 | { |
| 161 | snprintf((char*)_file, 1000, "%s", file); |
| 162 | } |
| 163 | |
| 164 | fd = open((char*)&_file,O_RDONLY); |
| 165 | if(fd < 0) |
| 166 | return NULL; |
| 167 | |
| 168 | x = malloc(sizeof(void *)); |
| 169 | |
| 170 | *x = NULL; /* pointer to NULL */ |
| 171 | p = XML_ParserCreate(NULL); |
| 172 | XML_SetUserData(p, x); |
| 173 | XML_SetElementHandler(p, _xode_expat_startElement, _xode_expat_endElement); |
| 174 | XML_SetCharacterDataHandler(p, _xode_expat_charData); |
| 175 | do{ |
| 176 | len = read(fd, buf, BUFSIZ); |
| 177 | done = len < BUFSIZ; |
| 178 | if(!XML_Parse(p, buf, len, done)) |
| 179 | { |
| 180 | /* jdebug(ZONE,"xmlnode_file_parseerror: %s",(char *)XML_ErrorString(XML_GetErrorCode(p)));*/ |
| 181 | xode_free(*x); |
| 182 | *x = NULL; |
| 183 | done = 1; |
| 184 | } |
| 185 | }while(!done); |
| 186 | |
| 187 | node = *x; |
| 188 | XML_ParserFree(p); |
| 189 | free(x); |
| 190 | close(fd); |
| 191 | return node; /* return the xmlnode x points to */ |
| 192 | } |
| 193 | |
| 194 | int xode_to_file(char *file, xode node) |
| 195 | { |
nothing calls this directly
no test coverage detected