int *end;
enum attr_type attr_last;
int label;
- unsigned int *street_name_attr;
- unsigned int *street_name_systematic_attr;
+ unsigned int *label_attr[2];
struct map_selection *sel;
struct map_priv *m;
struct item item;
struct map_rect_priv *mr=priv_data;
struct tile *t=mr->t;
enum attr_type type;
- int size;
+ int i,size;
if (attr_type != mr->attr_last) {
t->pos_attr=t->pos_attr_start;
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->street_name_attr=t->pos_attr;
+ mr->label_attr[0]=t->pos_attr;
if (type == attr_street_name_systematic)
- mr->street_name_systematic_attr=t->pos_attr;
+ 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);
t->pos_attr+=size;
}
}
- if (!mr->label && (attr_type == attr_any || attr_type == attr_label) && (mr->street_name_attr || mr->street_name_systematic_attr)) {
- mr->label=1;
- attr->type=attr_label;
- attr_data_set(attr, (mr->street_name_attr ? mr->street_name_attr : mr->street_name_systematic_attr) +1);
- return 1;
+ 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;
}
mr->item.id_hi=t->zipfile_num;
mr->item.id_lo=t->pos-t->start;
mr->label=0;
- mr->street_name_attr=NULL;
- mr->street_name_systematic_attr=NULL;
+ memset(mr->label_attr, 0, sizeof(mr->label_attr));
setup_pos(mr);
if ((mr->item.type == type_submap) && (!mr->country_id)) {
struct coord_rect r;
mr->item.id_hi=id_hi;
mr->item.id_lo=id_lo;
mr->label=0;
- mr->street_name_attr=NULL;
- mr->street_name_systematic_attr=NULL;
+ memset(mr->label_attr, 0, sizeof(mr->label_attr));
setup_pos(mr);
return &mr->item;
}
#define debug_tile(x) (!strcmp(x,"bcdbd") || !strcmp(x,"bcdbd") || !strcmp(x,"bcdbda") || !strcmp(x,"bcdbdb") || !strcmp(x,"bcdbdba") || !strcmp(x,"bcdbdbb") || !strcmp(x,"bcdbdbba") || !strcmp(x,"bcdbdbaa") || !strcmp(x,"bcdbdbacaa") || !strcmp(x,"bcdbdbacab") || !strcmp(x,"bcdbdbacaba") || !strcmp(x,"bcdbdbacabaa") || !strcmp(x,"bcdbdbacabab") || !strcmp(x,"bcdbdbacababb") || !strcmp(x,"bcdbdbacababba") || !strcmp(x,"bcdbdbacababbb") || !strcmp(x,"bcdbdbacababbd") || !strcmp(x,"bcdbdbacababaa") || !strcmp(x,"bcdbdbacababab") || !strcmp(x,"bcdbdbacababac") || !strcmp(x,"bcdbdbacababad") || !strcmp(x,"bcdbdbacabaaa") || !strcmp(x,"bcdbdbacabaaba") || !strcmp(x,"bcdbdbacabaabb") || !strcmp(x,"bcdbdbacabaabc") || !strcmp(x,"bcdbdbacabaabd") || !strcmp(x,"bcdbdbacabaaaa") || !strcmp(x,"bcdbdbacabaaab") || !strcmp(x,"bcdbdbacabaaac") || !strcmp(x,"bcdbdbacabaaad") || 0)
#endif
+#define IS_TOWN(item) ((item).type >= type_town_label && (item).type <= type_town_label_1e7)
+#define IS_STREET(item) ((item).type >= type_street_nopass && (item).type <= type_ferry)
static GHashTable *dedupe_ways_hash;
};
char label_attr_buffer[BUFFER_SIZE];
+struct attr_bin town_name_attr = {
+ 0, attr_town_name
+};
+
struct attr_bin street_name_attr = {
0, attr_street_name
};
-char street_name_attr_buffer[BUFFER_SIZE];
struct attr_bin street_name_systematic_attr = {
0, attr_street_name_systematic
pad_text_attr(struct attr_bin *a, char *buffer)
{
int l;
- l=strlen(buffer)+1;
- while (l % 4)
- buffer[l++]='\0';
- a->len=l/4+1;
+ if (buffer && buffer[0]) {
+ l=strlen(buffer)+1;
+ while (l % 4)
+ buffer[l++]='\0';
+ a->len=l/4+1;
+ } else
+ a->len=0;
}
static int
if (! strcmp(k,"note"))
level=5;
if (! strcmp(k,"name")) {
- if (in_way) {
- strcpy(street_name_attr_buffer, v);
- pad_text_attr(&street_name_attr, street_name_attr_buffer);
- } else {
strcpy(label_attr_buffer, v);
pad_text_attr(&label_attr, label_attr_buffer);
- }
level=5;
}
if (! strcmp(k,"ref")) {
}
if ( (type != type_street_unkn ) && ( type != type_point_unkn ) )
{
- if (coverage && type >= type_street_nopass && type <= type_ramp)
+ item.type=type;
+ if (coverage && IS_STREET(item))
item.type=type_coverage;
- else
- item.type=type;
}
else
{
nodeid=id;
item.type=type_point_unkn;
label_attr.len=0;
+ town_name_attr.len=0;
debug_attr.len=0;
is_in_buffer[0]='\0';
sprintf(debug_attr_buffer,"nodeid=%d", nodeid);
wayid=id;
coord_count=0;
item.type=type_street_unkn;
+ label_attr.len=0;
street_name_attr.len=0;
street_name_systematic_attr.len=0;
debug_attr.len=0;
g_hash_table_insert(dedupe_ways_hash, (gpointer)wayid, (gpointer)1);
}
pad_text_attr(&debug_attr, debug_attr_buffer);
- if (street_name_attr.len)
- alen+=street_name_attr.len+1;
+ if (label_attr.len)
+ alen+=label_attr.len+1;
if (street_name_systematic_attr.len)
alen+=street_name_systematic_attr.len+1;
if (debug_attr.len)
item.len=item.clen+2+alen;
fwrite(&item, sizeof(item), 1, out);
fwrite(coord_buffer, coord_count*sizeof(struct coord), 1, out);
- write_attr(out, &street_name_attr, street_name_attr_buffer);
+ if (IS_STREET(item)) {
+ street_name_attr.len=label_attr.len;
+ write_attr(out, &street_name_attr, label_attr_buffer);
+ } else
+ write_attr(out, &label_attr, label_attr_buffer);
write_attr(out, &street_name_systematic_attr, street_name_systematic_attr_buffer);
write_attr(out, &debug_attr, debug_attr_buffer);
write_attr(out, &flags_attr, &flags_attr_value);
item.len=item.clen+2+alen;
fwrite(&item, sizeof(item), 1, out);
fwrite(&ni->c, 1*sizeof(struct coord), 1, out);
- write_attr(out, &label_attr, label_attr_buffer);
+ if (IS_TOWN(item)) {
+ town_name_attr.len=label_attr.len;
+ write_attr(out, &town_name_attr, label_attr_buffer);
+ } else
+ write_attr(out, &label_attr, label_attr_buffer);
write_attr(out, &debug_attr, debug_attr_buffer);
#ifdef GENERATE_INDEX
- if (item.type >= type_town_label && item.type <= type_town_label_1e7 && label_attr.len) {
+ if (IS_TOWN(item) && town_name_attr.len) {
char *tok,*buf=is_in_buffer;
while ((tok=strtok(buf, ","))) {
while (*tok==' ')
item.len=item.clen+2+label_attr.len+1;
fwrite(&item, sizeof(item), 1, result->file);
fwrite(&ni->c, 1*sizeof(struct coord), 1, result->file);
- write_attr(result->file, &label_attr, label_attr_buffer);
+ write_attr(result->file, &town_name_attr, label_attr_buffer);
result->count++;
result->size+=(item.clen+3+label_attr.len+1)*4;
}
assert(ib2->clen==2);
attr1=(struct attr_bin *)((int *)(ib1+1)+ib1->clen);
attr2=(struct attr_bin *)((int *)(ib2+1)+ib1->clen);
- assert(attr1->type == attr_label);
- assert(attr2->type == attr_label);
+ assert(attr1->type == attr_town_name);
+ assert(attr2->type == attr_town_name);
s1=(char *)(attr1+1);
s2=(char *)(attr2+1);
return strcmp(s1, s2);
fprintf(stderr,"ni=%p\n", ni);
#endif
c[i]=ni->c;
- if (ni->ref_way > 1 && i != 0 && i != ccount-1 && ib->type >= type_street_nopass && ib->type <= type_ferry) {
+ if (ni->ref_way > 1 && i != 0 && i != ccount-1 && IS_STREET(*ib)) {
write_item_part(out, ib, last, i);
last=i;
}