Diff of /trunk/src/osm.c

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

revision 175 by harbaum, Wed Jun 10 09:24:47 2009 UTC revision 194 by harbaum, Tue Jul 7 19:31:45 2009 UTC
# Line 1746  relation_chain_t *osm_way_to_relation(os Line 1746  relation_chain_t *osm_way_to_relation(os
1746    return rel_chain;    return rel_chain;
1747  }  }
1748    
1749    /* return all relations a relation is in */
1750    relation_chain_t *osm_relation_to_relation(osm_t *osm, relation_t *rel) {
1751      relation_chain_t *rel_chain = NULL, **cur_rel_chain = &rel_chain;
1752    
1753      relation_t *relation = osm->relation;
1754      while(relation) {
1755        gboolean is_member = FALSE;
1756    
1757        member_t *member = relation->member;
1758        while(member) {
1759          switch(member->object.type) {
1760          case RELATION: {
1761            /* relations can be check directly */
1762            if(member->object.relation == rel)
1763              is_member = TRUE;
1764          } break;
1765    
1766          default:
1767            break;
1768          }
1769          member = member->next;
1770        }
1771    
1772        /* way is a member of this relation, so move it to the member chain */
1773        if(is_member) {
1774          *cur_rel_chain = g_new0(relation_chain_t, 1);
1775          (*cur_rel_chain)->relation = relation;
1776          cur_rel_chain = &((*cur_rel_chain)->next);
1777        }
1778    
1779        relation = relation->next;
1780      }
1781    
1782      return rel_chain;
1783    }
1784    
1785    /* return all relations an object is in */
1786    relation_chain_t *osm_object_to_relation(osm_t *osm, object_t *object) {
1787      relation_chain_t *rel_chain = NULL;
1788    
1789      switch(object->type) {
1790      case NODE:
1791        rel_chain = osm_node_to_relation(osm, object->node);
1792        break;
1793    
1794      case WAY:
1795        rel_chain = osm_way_to_relation(osm, object->way);
1796        break;
1797    
1798      case RELATION:
1799        rel_chain = osm_relation_to_relation(osm, object->relation);
1800        break;
1801    
1802      default:
1803        break;
1804      }
1805    
1806      return rel_chain;
1807    }
1808    
1809    void osm_relation_chain_free(relation_chain_t *rchain) {
1810      while(rchain) {
1811        relation_chain_t *next = rchain->next;
1812        g_free(rchain);
1813        rchain = next;
1814      }
1815    }
1816    
1817  /* return all ways a node is in */  /* return all ways a node is in */
1818  way_chain_t *osm_node_to_way(osm_t *osm, node_t *node) {  way_chain_t *osm_node_to_way(osm_t *osm, node_t *node) {
1819    way_chain_t *chain = NULL, **cur_chain = &chain;    way_chain_t *chain = NULL, **cur_chain = &chain;
# Line 2186  char *osm_object_type_string(object_t *o Line 2254  char *osm_object_type_string(object_t *o
2254    return NULL;    return NULL;
2255  }  }
2256    
2257    char *osm_object_get_name(object_t *object) {
2258      tag_t *tags = osm_object_get_tags(object);
2259    
2260      if(!tags) return NULL;
2261      return osm_tag_get_by_key(tags, "name");
2262    }
2263    
2264  char *osm_object_string(object_t *object) {  char *osm_object_string(object_t *object) {
2265    char *type_str = osm_object_type_string(object);    char *type_str = osm_object_type_string(object);
2266    
2267    if(!object)    if(!object)
2268      return g_strdup_printf("%s #<invalid>", type_str);      return g_strdup_printf("%s #<invalid>", type_str);
2269    
2270      char *name = osm_object_get_name(object);
2271      if(name)
2272        return g_strdup_printf("%s \"%s\"", type_str, name);
2273    
2274    switch(object->type) {    switch(object->type) {
2275    case ILLEGAL:    case ILLEGAL:
2276      return g_strdup_printf("%s #<unspec>", type_str);      return g_strdup_printf("%s #<unspec>", type_str);

Legend:
Removed from v.175  
changed lines
  Added in v.194