Diff of /trunk/src/osm.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 154 by harbaum, Tue Mar 31 06:31:53 2009 UTC revision 155 by harbaum, Tue Mar 31 10:19:50 2009 UTC
# Line 393  void osm_relations_dump(relation_t *rela Line 393  void osm_relations_dump(relation_t *rela
393    
394      member_t *member = relation->member;      member_t *member = relation->member;
395      while(member) {      while(member) {
396        switch(member->type) {        switch(member->object.type) {
397        case ILLEGAL:        case ILLEGAL:
398        case NODE_ID:        case NODE_ID:
399        case WAY_ID:        case WAY_ID:
# Line 401  void osm_relations_dump(relation_t *rela Line 401  void osm_relations_dump(relation_t *rela
401          break;          break;
402    
403        case NODE:        case NODE:
404          if(member->node)          if(member->object.node)
405            printf(" Member: Node, id = %lu, role = %s\n",            printf(" Member: Node, id = %lu, role = %s\n",
406                   member->node->id, member->role);                   member->object.node->id, member->role);
407          break;          break;
408    
409        case WAY:        case WAY:
410          if(member->way)          if(member->object.way)
411          printf(" Member: Way, id = %lu, role = %s\n",          printf(" Member: Way, id = %lu, role = %s\n",
412                 member->way->id, member->role);                 member->object.way->id, member->role);
413          break;          break;
414    
415        case RELATION:        case RELATION:
416          if(member->relation)          if(member->object.relation)
417          printf(" Member: Relation, id = %lu, role = %s\n",          printf(" Member: Relation, id = %lu, role = %s\n",
418                 member->relation->id, member->role);                 member->object.relation->id, member->role);
419          break;          break;
420        }        }
421    
# Line 436  member_t *osm_parse_osm_relation_member( Line 436  member_t *osm_parse_osm_relation_member(
436                            xmlDocPtr doc, xmlNode *a_node) {                            xmlDocPtr doc, xmlNode *a_node) {
437    char *prop;    char *prop;
438    member_t *member = g_new0(member_t, 1);    member_t *member = g_new0(member_t, 1);
439    member->type = ILLEGAL;    member->object.type = ILLEGAL;
440    
441    if((prop = (char*)xmlGetProp(a_node, (unsigned char*)"type"))) {    if((prop = (char*)xmlGetProp(a_node, (unsigned char*)"type"))) {
442      if(strcasecmp(prop, "way") == 0)           member->type = WAY;      if(strcasecmp(prop, "way") == 0)           member->object.type = WAY;
443      else if(strcasecmp(prop, "node") == 0)     member->type = NODE;      else if(strcasecmp(prop, "node") == 0)     member->object.type = NODE;
444      else if(strcasecmp(prop, "relation") == 0) member->type = RELATION;      else if(strcasecmp(prop, "relation") == 0) member->object.type = RELATION;
445      xmlFree(prop);      xmlFree(prop);
446    }    }
447    
448    if((prop = (char*)xmlGetProp(a_node, (unsigned char*)"ref"))) {    if((prop = (char*)xmlGetProp(a_node, (unsigned char*)"ref"))) {
449      item_id_t id = strtoul(prop, NULL, 10);      item_id_t id = strtoul(prop, NULL, 10);
450    
451      switch(member->type) {      switch(member->object.type) {
452      case ILLEGAL:      case ILLEGAL:
453        printf("Unable to store illegal type\n");        printf("Unable to store illegal type\n");
454        break;        break;
455    
456      case WAY:      case WAY:
457        /* search matching way */        /* search matching way */
458        member->way = osm_get_way_by_id(osm, id);        member->object.way = osm_get_way_by_id(osm, id);
459        if(!member->way) {        if(!member->object.way) {
460          member->type = WAY_ID;          member->object.type = WAY_ID;
461          member->id = id;          member->object.id = id;
462        }        }
463        break;        break;
464    
465      case NODE:      case NODE:
466        /* search matching node */        /* search matching node */
467        member->node = osm_get_node_by_id(osm, id);        member->object.node = osm_get_node_by_id(osm, id);
468        if(!member->node) {        if(!member->object.node) {
469          member->type = NODE_ID;          member->object.type = NODE_ID;
470          member->id = id;          member->object.id = id;
471        }        }
472        break;        break;
473    
474      case RELATION:      case RELATION:
475        /* search matching relation */        /* search matching relation */
476        member->relation = osm_get_relation_by_id(osm, id);        member->object.relation = osm_get_relation_by_id(osm, id);
477        if(!member->relation) {        if(!member->object.relation) {
478          member->type = NODE_ID;          member->object.type = NODE_ID;
479          member->id = id;          member->object.id = id;
480        }        }
481        break;        break;
482    
# Line 836  static way_t *process_way(xmlTextReaderP Line 836  static way_t *process_way(xmlTextReaderP
836  static member_t *process_member(xmlTextReaderPtr reader, osm_t *osm) {  static member_t *process_member(xmlTextReaderPtr reader, osm_t *osm) {
837    char *prop;    char *prop;
838    member_t *member = g_new0(member_t, 1);    member_t *member = g_new0(member_t, 1);
839    member->type = ILLEGAL;    member->object.type = ILLEGAL;
840    
841    if((prop = (char*)xmlTextReaderGetAttribute(reader, BAD_CAST "type"))) {    if((prop = (char*)xmlTextReaderGetAttribute(reader, BAD_CAST "type"))) {
842      if(strcasecmp(prop, "way") == 0)           member->type = WAY;      if(strcasecmp(prop, "way") == 0)           member->object.type = WAY;
843      else if(strcasecmp(prop, "node") == 0)     member->type = NODE;      else if(strcasecmp(prop, "node") == 0)     member->object.type = NODE;
844      else if(strcasecmp(prop, "relation") == 0) member->type = RELATION;      else if(strcasecmp(prop, "relation") == 0) member->object.type = RELATION;
845      xmlFree(prop);      xmlFree(prop);
846    }    }
847    
848    if((prop = (char*)xmlTextReaderGetAttribute(reader, BAD_CAST "ref"))) {    if((prop = (char*)xmlTextReaderGetAttribute(reader, BAD_CAST "ref"))) {
849      item_id_t id = strtoul(prop, NULL, 10);      item_id_t id = strtoul(prop, NULL, 10);
850    
851      switch(member->type) {      switch(member->object.type) {
852      case ILLEGAL:      case ILLEGAL:
853        printf("Unable to store illegal type\n");        printf("Unable to store illegal type\n");
854        break;        break;
855    
856      case WAY:      case WAY:
857        /* search matching way */        /* search matching way */
858        member->way = osm_get_way_by_id(osm, id);        member->object.way = osm_get_way_by_id(osm, id);
859        if(!member->way) {        if(!member->object.way) {
860          member->type = WAY_ID;          member->object.type = WAY_ID;
861          member->id = id;          member->object.id = id;
862        }        }
863        break;        break;
864    
865      case NODE:      case NODE:
866        /* search matching node */        /* search matching node */
867        member->node = osm_get_node_by_id(osm, id);        member->object.node = osm_get_node_by_id(osm, id);
868        if(!member->node) {        if(!member->object.node) {
869          member->type = NODE_ID;          member->object.type = NODE_ID;
870          member->id = id;          member->object.id = id;
871        }        }
872        break;        break;
873    
874      case RELATION:      case RELATION:
875        /* search matching relation */        /* search matching relation */
876        member->relation = osm_get_relation_by_id(osm, id);        member->object.relation = osm_get_relation_by_id(osm, id);
877        if(!member->relation) {        if(!member->object.relation) {
878          member->type = NODE_ID;          member->object.type = NODE_ID;
879          member->id = id;          member->object.id = id;
880        }        }
881        break;        break;
882    
# Line 1249  char *osm_generate_xml(osm_t *osm, type_ Line 1249  char *osm_generate_xml(osm_t *osm, type_
1249          xmlNodePtr m_node = xmlNewChild(rel_node,NULL,BAD_CAST "member", NULL);          xmlNodePtr m_node = xmlNewChild(rel_node,NULL,BAD_CAST "member", NULL);
1250          char *str = NULL;          char *str = NULL;
1251    
1252          switch(member->type) {          switch(member->object.type) {
1253          case NODE:          case NODE:
1254            xmlNewProp(m_node, BAD_CAST "type", BAD_CAST "node");            xmlNewProp(m_node, BAD_CAST "type", BAD_CAST "node");
1255            str = g_strdup_printf("%ld", member->node->id);            str = g_strdup_printf("%ld", member->object.node->id);
1256            break;            break;
1257    
1258          case WAY:          case WAY:
1259            xmlNewProp(m_node, BAD_CAST "type", BAD_CAST "way");            xmlNewProp(m_node, BAD_CAST "type", BAD_CAST "way");
1260            str = g_strdup_printf("%ld", member->way->id);            str = g_strdup_printf("%ld", member->object.way->id);
1261            break;            break;
1262    
1263          case RELATION:          case RELATION:
1264            xmlNewProp(m_node, BAD_CAST "type", BAD_CAST "relation");            xmlNewProp(m_node, BAD_CAST "type", BAD_CAST "relation");
1265            str = g_strdup_printf("%ld", member->relation->id);            str = g_strdup_printf("%ld", member->object.relation->id);
1266            break;            break;
1267    
1268          default:          default:
# Line 1609  relation_chain_t *osm_node_to_relation(o Line 1609  relation_chain_t *osm_node_to_relation(o
1609    
1610      member_t *member = relation->member;      member_t *member = relation->member;
1611      while(member) {      while(member) {
1612        switch(member->type) {        switch(member->object.type) {
1613        case NODE:        case NODE:
1614          /* nodes are checked directly */          /* nodes are checked directly */
1615          if(member->node == node)          if(member->object.node == node)
1616            is_member = TRUE;            is_member = TRUE;
1617          break;          break;
1618    
1619        case WAY: {        case WAY: {
1620          /* ways have to be checked for the nodes they consist of */          /* ways have to be checked for the nodes they consist of */
1621          node_chain_t *chain = member->way->node_chain;          node_chain_t *chain = member->object.way->node_chain;
1622          while(chain && !is_member) {          while(chain && !is_member) {
1623            if(chain->node == node)            if(chain->node == node)
1624              is_member = TRUE;              is_member = TRUE;
# Line 1656  relation_chain_t *osm_way_to_relation(os Line 1656  relation_chain_t *osm_way_to_relation(os
1656    
1657      member_t *member = relation->member;      member_t *member = relation->member;
1658      while(member) {      while(member) {
1659        switch(member->type) {        switch(member->object.type) {
1660        case WAY: {        case WAY: {
1661          /* ways can be check directly */          /* ways can be check directly */
1662          if(member->way == way)          if(member->object.way == way)
1663            is_member = TRUE;            is_member = TRUE;
1664        } break;        } break;
1665    
# Line 1726  void osm_node_remove_from_relation(osm_t Line 1726  void osm_node_remove_from_relation(osm_t
1726    while(relation) {    while(relation) {
1727      member_t **member = &relation->member;      member_t **member = &relation->member;
1728      while(*member) {      while(*member) {
1729        if(((*member)->type == NODE) &&        if(((*member)->object.type == NODE) &&
1730           ((*member)->node == node)) {           ((*member)->object.node == node)) {
1731    
1732          printf("  from relation #%ld\n", relation->id);          printf("  from relation #%ld\n", relation->id);
1733    
# Line 1751  void osm_way_remove_from_relation(osm_t Line 1751  void osm_way_remove_from_relation(osm_t
1751    while(relation) {    while(relation) {
1752      member_t **member = &relation->member;      member_t **member = &relation->member;
1753      while(*member) {      while(*member) {
1754        if(((*member)->type == WAY) &&        if(((*member)->object.type == WAY) &&
1755           ((*member)->way == way)) {           ((*member)->object.way == way)) {
1756    
1757          printf("  from relation #%ld\n", relation->id);          printf("  from relation #%ld\n", relation->id);
1758    
# Line 2005  osm_way_reverse_direction_sensitive_role Line 2005  osm_way_reverse_direction_sensitive_role
2005        // First find the member corresponding to our way:        // First find the member corresponding to our way:
2006        member_t *member = rel_chain->relation->member;        member_t *member = rel_chain->relation->member;
2007        for (; member != NULL; member = member->next) {        for (; member != NULL; member = member->next) {
2008          if (member->type == WAY) {          if (member->object.type == WAY) {
2009            if (member->way == way)            if (member->object.way == way)
2010              break;              break;
2011          }          }
2012          if (member->type == WAY_ID) {          if (member->object.type == WAY_ID) {
2013            if (member->id == way->id)            if (member->object.id == way->id)
2014              break;              break;
2015          }          }
2016        }        }
# Line 2106  tag_t *osm_tags_copy(tag_t *src_tag, gbo Line 2106  tag_t *osm_tags_copy(tag_t *src_tag, gbo
2106  }  }
2107    
2108  /* return plain text of type */  /* return plain text of type */
2109  char *osm_type_string(type_t type) {  char *osm_object_type_string(object_t *object) {
2110    const struct { type_t type; char *name; } types[] = {    const struct { type_t type; char *name; } types[] = {
2111      { ILLEGAL,     "illegal" },      { ILLEGAL,     "illegal" },
2112      { NODE,        "node" },      { NODE,        "node" },
# Line 2120  char *osm_type_string(type_t type) { Line 2120  char *osm_type_string(type_t type) {
2120    
2121    int i;    int i;
2122    for(i=0;types[i].name;i++)    for(i=0;types[i].name;i++)
2123      if(type == types[i].type)      if(object->type == types[i].type)
2124        return types[i].name;        return types[i].name;
2125    
2126    return NULL;    return NULL;
2127  }  }
2128    
2129  char *osm_object_string(type_t type, void *object) {  char *osm_object_string(object_t *object) {
2130    char *type_str = osm_type_string(type);    char *type_str = osm_object_type_string(object);
2131    
2132    if(!object)    if(!object)
2133      return g_strdup_printf("%s #<invalid>", type_str);      return g_strdup_printf("%s #<invalid>", type_str);
2134    
2135    switch(type) {    switch(object->type) {
2136    case ILLEGAL:    case ILLEGAL:
2137      return g_strdup_printf("%s #<unspec>", type_str);      return g_strdup_printf("%s #<unspec>", type_str);
2138      break;      break;
2139    case NODE:    case NODE:
2140      return g_strdup_printf("%s #%ld", type_str, ((node_t*)object)->id);      return g_strdup_printf("%s #%ld", type_str, object->node->id);
2141      break;      break;
2142    case WAY:    case WAY:
2143      return g_strdup_printf("%s #%ld", type_str, ((way_t*)object)->id);      return g_strdup_printf("%s #%ld", type_str, object->way->id);
2144      break;      break;
2145    case RELATION:    case RELATION:
2146      return g_strdup_printf("%s #%ld", type_str, ((relation_t*)object)->id);      return g_strdup_printf("%s #%ld", type_str, object->relation->id);
2147      break;      break;
2148    case NODE_ID:    case NODE_ID:
2149    case WAY_ID:    case WAY_ID:
2150    case RELATION_ID:    case RELATION_ID:
2151      return g_strdup_printf("%s #%ld", type_str, ((item_id_t)object));      return g_strdup_printf("%s #%ld", type_str, object->id);
2152      break;      break;
2153    }    }
2154    return NULL;    return NULL;
2155  }  }
2156    
2157  char *osm_id_string(type_t type, void *object) {  char *osm_object_id_string(object_t *object) {
2158    if(!object) return NULL;    if(!object) return NULL;
2159    
2160    switch(type) {    switch(object->type) {
2161    case ILLEGAL:    case ILLEGAL:
2162      return NULL;      return NULL;
2163      break;      break;
2164    case NODE:    case NODE:
2165      return g_strdup_printf("#%ld", ((node_t*)object)->id);      return g_strdup_printf("#%ld", object->node->id);
2166      break;      break;
2167    case WAY:    case WAY:
2168      return g_strdup_printf("#%ld", ((way_t*)object)->id);      return g_strdup_printf("#%ld", object->way->id);
2169      break;      break;
2170    case RELATION:    case RELATION:
2171      return g_strdup_printf("#%ld", ((relation_t*)object)->id);      return g_strdup_printf("#%ld", object->relation->id);
2172      break;      break;
2173    case NODE_ID:    case NODE_ID:
2174    case WAY_ID:    case WAY_ID:
2175    case RELATION_ID:    case RELATION_ID:
2176      return g_strdup_printf("#%ld", ((item_id_t)object));      return g_strdup_printf("#%ld", object->id);
2177      break;      break;
2178    }    }
2179    return NULL;    return NULL;
2180  }  }
2181    
2182  tag_t *osm_object_get_tags(type_t type, void *object) {  tag_t *osm_object_get_tags(object_t *object) {
2183    if(!object) return NULL;    if(!object) return NULL;
2184    
2185    switch(type) {    switch(object->type) {
2186    case ILLEGAL:    case ILLEGAL:
2187      return NULL;      return NULL;
2188      break;      break;
2189    case NODE:    case NODE:
2190      return ((node_t*)object)->tag;      return object->node->tag;
2191      break;      break;
2192    case WAY:    case WAY:
2193      return ((way_t*)object)->tag;      return object->way->tag;
2194      break;      break;
2195    case RELATION:    case RELATION:
2196      return ((relation_t*)object)->tag;      return object->relation->tag;
2197      break;      break;
2198    case NODE_ID:    case NODE_ID:
2199    case WAY_ID:    case WAY_ID:

Legend:
Removed from v.154  
changed lines
  Added in v.155