static ParsedData parse(Allocator* alloc, unsigned char* data, unsigned data_size) { ParserState ps = {}; ps.data = data; ps.head = data; ps.end = (unsigned char*)mem_ptr_add(data, data_size); ParsedData pd = {}; pd.vertices = dynamic_array_create<Vector3>(alloc); pd.normals = dynamic_array_create<Vector3>(alloc); pd.uvs = dynamic_array_create<Vector2>(alloc); pd.faces = dynamic_array_create<ParsedFace>(alloc); ps.head = ps.data; while (ps.head < ps.end) { unsigned char c = *ps.head; bool first_on_line = ps.head == ps.data || (ps.head > ps.data && (*(ps.head - 1)) == '\n'); if (!first_on_line) skip_line(&ps); else if (c == 'v' && ps.head + 1 < ps.end && (*(ps.head+1)) == 't') parse_uv(&ps, &pd); else if (c == 'v' && ps.head + 1 < ps.end && (*(ps.head+1)) == 'n') parse_normal(&ps, &pd); else if (c == 'v') parse_vertex(&ps, &pd); else if (c == 'f') parse_face(&ps, &pd); else skip_line(&ps); } return pd; }
xml_cc * parse_cc (xmlNode *cur_node) { xml_cc *ret; if ((ret = g_new0(xml_cc, 1)) == NULL) return NULL; for (cur_node = cur_node->children; cur_node; cur_node = cur_node->next) { if (cur_node->type != XML_ELEMENT_NODE) continue; if (NODE_IS_TYPE (cur_node, "tmp")) ret->tmp = DATA(cur_node); else if (NODE_IS_TYPE (cur_node, "icon")) ret->icon = DATA(cur_node); else if (NODE_IS_TYPE (cur_node, "t")) ret->t = DATA(cur_node); else if (NODE_IS_TYPE (cur_node, "flik")) ret->flik = DATA(cur_node); else if (NODE_IS_TYPE (cur_node, "bar")) ret->bar = parse_bar(cur_node); else if (NODE_IS_TYPE (cur_node, "wind")) ret->wind = parse_wind(cur_node); else if (NODE_IS_TYPE (cur_node, "hmid")) ret->hmid = DATA(cur_node); else if (NODE_IS_TYPE (cur_node, "vis")) ret->vis = DATA(cur_node); else if (NODE_IS_TYPE (cur_node, "uv")) ret->uv = parse_uv(cur_node); else if (NODE_IS_TYPE (cur_node, "dewp")) ret->dewp = DATA(cur_node); else if (NODE_IS_TYPE (cur_node, "lsup")) ret->lsup = DATA(cur_node); else if (NODE_IS_TYPE (cur_node, "obst")) ret->obst = DATA(cur_node); } return ret; }