int main(int argc, char *argv[]) { tmx_map *m; if (argc != 2) { fprintf(stderr, "usage: %s <map.tmx>\n", argv[0]); return EXIT_FAILURE; } tmx_alloc_func = dbg_alloc; /* alloc/free dbg */ tmx_free_func = dbg_free; m = tmx_load(argv[1]); if (!m) tmx_perror("error"); dump_map(m); tmx_map_free(m); printf("\n%d mem alloc not freed\n", mal_vs_free_count); #ifdef PAUSE puts("press <Enter> to quit\n"); getchar(); #endif return EXIT_SUCCESS; }
static tmx_map *parse_root_map(xmlTextReaderPtr reader, const char *filename) { tmx_map *res = NULL; int curr_depth; const char *name; char *value; name = (char*) xmlTextReaderConstName(reader); curr_depth = xmlTextReaderDepth(reader); if (strcmp(name, "map")) { tmx_err(E_XDATA, "xml parser: root is not a 'map' element"); return NULL; } if (!(res = alloc_map())) return NULL; /* parses each attribute */ if ((value = (char*)xmlTextReaderGetAttribute(reader, (xmlChar*)"orientation"))) { /* orientation */ if (res->orient = parse_orient(value), res->orient == O_NONE) { tmx_err(E_XDATA, "xml parser: unsupported 'orientation' '%s'", value); goto cleanup; } tmx_free_func(value); } else { tmx_err(E_MISSEL, "xml parser: missing 'orientation' attribute in the 'map' element"); goto cleanup; } value = (char*)xmlTextReaderGetAttribute(reader, (xmlChar*)"renderorder"); /* renderorder */ if (res->renderorder = parse_renderorder(value), res->renderorder == R_NONE) { tmx_err(E_XDATA, "xml parser: unsupported 'renderorder' '%s'", value); goto cleanup; } tmx_free_func(value); if ((value = (char*)xmlTextReaderGetAttribute(reader, (xmlChar*)"height"))) { /* height */ res->height = atoi(value); tmx_free_func(value); } else { tmx_err(E_MISSEL, "xml parser: missing 'height' attribute in the 'map' element"); goto cleanup; } if ((value = (char*)xmlTextReaderGetAttribute(reader, (xmlChar*)"width"))) { /* width */ res->width = atoi(value); tmx_free_func(value); } else { tmx_err(E_MISSEL, "xml parser: missing 'width' attribute in the 'map' element"); goto cleanup; } if ((value = (char*)xmlTextReaderGetAttribute(reader, (xmlChar*)"tileheight"))) { /* tileheight */ res->tile_height = atoi(value); tmx_free_func(value); } else { tmx_err(E_MISSEL, "xml parser: missing 'tileheight' attribute in the 'map' element"); goto cleanup; } if ((value = (char*)xmlTextReaderGetAttribute(reader, (xmlChar*)"tilewidth"))) { /* tilewidth */ res->tile_width = atoi(value); tmx_free_func(value); } else { tmx_err(E_MISSEL, "xml parser: missing 'tilewidth' attribute in the 'map' element"); goto cleanup; } if ((value = (char*)xmlTextReaderGetAttribute(reader, (xmlChar*)"backgroundcolor"))) { /* backgroundcolor */ res->backgroundcolor = get_color_rgb(value); tmx_free_func(value); } /* Parse each child */ do { if (xmlTextReaderRead(reader) != 1) goto cleanup; /* error_handler has been called */ if (xmlTextReaderNodeType(reader) == XML_READER_TYPE_ELEMENT) { name = (char*)xmlTextReaderConstName(reader); if (!strcmp(name, "tileset")) { if (!parse_tileset(reader, &(res->ts_head), filename)) goto cleanup; } else if (!strcmp(name, "layer")) { if (!parse_layer(reader, &(res->ly_head), res->height, res->width, L_LAYER, filename)) goto cleanup; } else if (!strcmp(name, "objectgroup")) { if (!parse_layer(reader, &(res->ly_head), res->height, res->width, L_OBJGR, filename)) goto cleanup; } else if (!strcmp(name, "imagelayer")) { if (!parse_layer(reader, &(res->ly_head), res->height, res->width, L_IMAGE, filename)) goto cleanup; } else if (!strcmp(name, "properties")) { if (!parse_properties(reader, &(res->properties))) goto cleanup; } else { /* Unknow element, skip its tree */ if (xmlTextReaderNext(reader) != 1) goto cleanup; } } } while (xmlTextReaderNodeType(reader) != XML_READER_TYPE_END_ELEMENT || xmlTextReaderDepth(reader) != curr_depth); return res; cleanup: tmx_map_free(res); return NULL; }