static int binfile_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) { struct map_rect_priv *mr=priv_data; struct tile *t=mr->t; enum attr_type type; int i,size; if (attr_type != mr->attr_last) { t->pos_attr=t->pos_attr_start; mr->attr_last=attr_type; } while (t->pos_attr < t->pos_next) { size=le32_to_cpu(*(t->pos_attr++)); type=le32_to_cpu(t->pos_attr[0]); if (type == attr_label) mr->label=1; if (type == attr_town_name) mr->label_attr[0]=t->pos_attr; if (type == attr_street_name) mr->label_attr[0]=t->pos_attr; if (type == attr_street_name_systematic) mr->label_attr[1]=t->pos_attr; if (type == attr_type || attr_type == attr_any) { if (attr_type == attr_any) { dbg(1,"pos %p attr %s size %d\n", t->pos_attr-1, attr_to_name(type), size); } attr->type=type; attr_data_set(attr, t->pos_attr+1); if (type == attr_url_local) { g_free(mr->url); mr->url=binfile_extract(mr->m, mr->m->cachedir, attr->u.str, 1); attr->u.str=mr->url; } t->pos_attr+=size; return 1; } else { t->pos_attr+=size; } } if (!mr->label && (attr_type == attr_any || attr_type == attr_label)) { for (i = 0 ; i < sizeof(mr->label_attr)/sizeof(int *) ; i++) { if (mr->label_attr[i]) { mr->label=1; attr->type=attr_label; attr_data_set(attr, mr->label_attr[i]+1); return 1; } } } return 0; }
void item_bin_dump(struct item_bin *ib, FILE *out) { struct coord *c; struct attr_bin *a; struct attr attr; int *attr_start; int *attr_end; int i; char *str; c=(struct coord *)(ib+1); if (ib->type < type_line) { dump_coord(c,out); fprintf(out, " "); } attr_start=(int *)(ib+1)+ib->clen; attr_end=(int *)ib+ib->len+1; fprintf(out,"type=%s", item_to_name(ib->type)); while (attr_start < attr_end) { a=(struct attr_bin *)(attr_start); attr_start+=a->len+1; attr.type=a->type; attr_data_set(&attr, (a+1)); str=attr_to_text(&attr, NULL, 1); fprintf(out," %s=\"%s\"", attr_to_name(a->type), str); g_free(str); } fprintf(out," debug=\"length=%d\"", ib->len); fprintf(out,"\n"); if (ib->type >= type_line) { for (i = 0 ; i < ib->clen/2 ; i++) { dump_coord(c+i,out); fprintf(out,"\n"); } } }