Changeset 16


Ignore:
Timestamp:
Aug 18, 2008, 1:58:33 PM (6 years ago)
Author:
marius
Message:

start using glib

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/SConstruct

    r14 r16  
    33env = Environment() 
    44 
    5 env.ParseConfig('pkg-config --cflags --libs cairo') 
     5env.ParseConfig('/opt/local/bin/pkg-config --cflags --libs cairo') 
     6env.ParseConfig('/opt/local/bin/pkg-config --cflags --libs glib-2.0') 
    67 
    78conf = Configure(env) 
    8  
    9 if not conf.CheckDeclaration('strsep',includes="#include <string.h>"): 
    10     print 'Did not find strsep(), using local version' 
    11 else: 
    12     conf.env.Append(CCFLAGS = '-DHAVE_STRSEP') 
    13  
    14 if not conf.CheckDeclaration('strdup',includes="#include <string.h>"): 
    15     print 'Did not find strdup(), using local version' 
    16 else: 
    17     conf.env.Append(CCFLAGS = '-DHAVE_STRDUP') 
    189     
    1910if not conf.CheckLibWithHeader('expat','expat.h','C'): 
     
    3324    'renderer.c', 
    3425    'ruleset.c', 
    35     'compat.c', 
    36     'strlist.c', 
    3726    'textpath.c' 
    3827] 
     
    4433env.Program('testTextPath', source=['test/testTextPath.c','textpath.c']) 
    4534env.Program('testStrlist', source=['test/testStrlist.c','strlist.c']) 
     35env.Program('testSize', source=['test/testSize.c']) 
     36env.Program('testOSM', source=['test/testOSM.c','osm05.c']) 
    4637 
    4738#env.Program('testRuleset', source=['ruleset.c','testRuleset.c']) 
  • trunk/main.c

    r14 r16  
    1717 * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. 
    1818 */ 
    19  
     19#include <glib.h> 
    2020#include <stdio.h> 
    2121#include <stdlib.h> 
     
    2828#include "renderer.h" 
    2929#include "ruleset.h" 
    30 #include "strlist.h" 
     30#include "list.h" 
    3131 
    3232// Global Vars 
    33 strList     *keyStrings; 
    34 strList     *valStrings; 
    35 strList     *patternStrings; 
     33GTree       *keyStrings; 
     34GTree       *valStrings; 
     35GTree       *patternStrings; 
    3636memphisOpt  *opts; 
     37 
     38gint g_strcmp(gconstpointer  a, gconstpointer  b) { 
     39    return strcmp((char *)a,(char *)b); 
     40} 
    3741 
    3842void banner() { 
     
    8791    } 
    8892     
    89     keyStrings = strlist_init(); 
    90     valStrings = strlist_init(); 
    91     patternStrings = strlist_init(); 
     93    keyStrings = g_tree_new(g_strcmp); 
     94    valStrings = g_tree_new(g_strcmp); 
     95    patternStrings = g_tree_new(g_strcmp); 
    9296                         
    9397    banner(); 
     
    101105        return(-1); 
    102106     
     107    osmWay *way; 
     108    osmTag *tag; 
     109    LIST_FOREACH(way, osm->ways) { 
     110        if(way->id != 4719299) 
     111            continue; 
     112        printf("Way: %i\n",way->id); 
     113        LIST_FOREACH(tag, way->tag) { 
     114            printf(" %s: %s\n",tag->key, tag->value); 
     115        } 
     116    } 
     117     
    103118    renderCairo(ruleset, osm); 
    104119     
  • trunk/osm05.c

    r15 r16  
    1717 * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. 
    1818 */ 
    19  
     19#include <glib.h> 
    2020#include <time.h> 
    2121#include <expat.h> 
     
    2323#include <string.h> 
    2424 
    25 #include "compat.h" 
    26  
    2725#include "list.h" 
    28 #include "strlist.h" 
    2926#include "main.h" 
    3027#include "osm05.h" 
     
    3431// External Vars 
    3532extern memphisOpt   *opts; 
    36 extern strList      *keyStrings; 
    37 extern strList      *valStrings; 
     33GTree               *keyStrings; 
     34GTree               *valStrings; 
    3835 
    3936// Pointers to work with 
    4037osmTag      *cTag = NULL; 
    4138osmNode     *cNode = NULL; 
    42 osmNd       *cNd = NULL; 
    4339osmWay      *cWay = NULL; 
    4440 
     
    10096 
    10197       // Insert Node 
    102        LL_INSERT_ID(cNode,osm->nodes); 
     98       g_hash_table_insert(osm->nodeidx, &cNode->id, cNode); 
    10399 
    104100       if (opts->debug > 1) 
     
    118114                    return; 
    119115                } 
    120                 cTag-> key = strlist_get(keyStrings,(char *) *(atts+1)); 
     116                cTag->key = g_tree_lookup(keyStrings, (char *) *(atts+1)); 
     117                if(cTag->key == NULL) { 
     118                    cTag->key = g_strdup((char *) *(atts+1)); 
     119                    g_tree_insert(keyStrings, cTag->key, cTag->key); 
     120                } 
    121121            } else if(strncmp((char *) *(atts), "v", 1) == 0) { 
    122122                if(strcmp(cTag->key, "layer") == 0) { 
     
    131131                    free(cTag); 
    132132                    cTag = NULL; 
    133                     if (cWay) 
    134                         cWay->name = strlist_get(valStrings,(char *) *(atts+1)); 
     133                    if (cWay) { 
     134                        cWay->name = g_tree_lookup(valStrings, (char *) *(atts+1)); 
     135                        if(cWay->name == NULL) { 
     136                            cWay->name = g_strdup((char *) *(atts+1)); 
     137                            g_tree_insert(valStrings, cWay->name, cWay->name); 
     138                        } 
     139                    } 
    135140                    return; 
    136141                } 
    137                 cTag->value = strlist_get(valStrings,(char *) *(atts+1)); 
     142                cTag->value = g_tree_lookup(valStrings, (char *) *(atts+1)); 
     143                if(cTag->value == NULL) { 
     144                    cTag->value = g_strdup((char *) *(atts+1)); 
     145                    g_tree_insert(valStrings, cTag->value, cTag->value); 
     146                } 
    138147            } 
    139148            atts+=2; 
    140149       } 
    141  
     150        
    142151       if (opts->debug > 1) 
    143152           fprintf(stdout,"Tag: %s => %s\n", cTag->key, cTag->value); 
     
    162171            } 
    163172            atts+=2; 
    164        } 
    165  
    166        cWay->tag = NULL; 
    167        cWay->nd = NULL; 
    168        cWay->name = NULL; 
    169        cWay->layer = 0; 
    170  
    171        // Insert Way 
    172        LL_INSERT_ID(cWay,osm->ways); 
    173  
    174        if (opts->debug > 1) 
    175            fprintf(stdout,"WAY(%i)\n", cWay->id); 
     173     } 
     174 
     175        cWay->tag = NULL; 
     176        cWay->nd = NULL; 
     177        cWay->name = NULL; 
     178        cWay->layer = 0; 
     179 
     180        // Insert Way 
     181        LL_INSERT_ID(cWay,osm->ways); 
     182 
     183        if (opts->debug > 1) 
     184            fprintf(stdout,"WAY(%i)\n", cWay->id); 
    176185    } 
    177186    // Parsing WayNode 
     
    190199 
    191200        if (ref) { 
    192             cNd = malloc(sizeof(osmNd)); 
    193  
    194             LL_SEARCH_ID(osm->nodes,ref,cNd->node); 
    195  
     201            osmNode *n; 
     202             
     203            n = g_hash_table_lookup(osm->nodeidx, &ref); /* TODO check return value */ 
     204  
    196205            // Insert WayNode 
    197             LL_APPEND(cNd,cWay->nd); 
    198  
     206            cWay->nd = g_slist_prepend(cWay->nd, n); 
     207  
    199208            if (opts->debug > 1) 
    200                 fprintf(stdout," ND( %f %f )\n", cNd->node->lat, cNd->node->lon); 
     209                fprintf(stdout," ND( %f %f )\n", n->lat, n->lon); 
    201210 
    202211            cNode=NULL; 
    203             cNd = NULL; 
    204212        } 
    205213    } 
     
    221229        cNode = NULL; 
    222230    } else if (strncmp((char *) name, "way", 3) == 0) { 
     231        if (cWay->nd != NULL) 
     232            cWay->nd = g_slist_reverse(cWay->nd); 
    223233        cWay = NULL; 
    224234    } 
     
    255265    osm = malloc(sizeof(osmFile)); 
    256266    osm->nodes = NULL; 
     267    osm->nodeidx = g_hash_table_new(g_int_hash, g_int_equal); 
    257268    osm->ways = NULL; 
    258269    osm->minlon = -190; 
  • trunk/osm05.h

    r15 r16  
    2121#define OSM05_H 
    2222 
     23#include <glib.h> 
     24 
    2325typedef struct _osmTag osmTag; 
    2426struct _osmTag { 
     
    3840    }; 
    3941 
    40 typedef struct _osmNd osmNd; 
    41 struct _osmNd { 
    42         osmNode *node; 
    43         osmNd   *next; 
    44     }; 
    45  
    4642typedef struct _osmWay osmWay; 
    4743struct _osmWay { 
     
    5046        char    *name; 
    5147        osmTag  *tag; 
    52         osmNd   *nd; 
     48        GSList  *nd; 
    5349        osmWay  *next; 
    5450    }; 
     
    7268struct _osmFile { 
    7369        osmNode     *nodes; 
     70        GHashTable  *nodeidx; 
    7471        osmWay      *ways; 
    7572        float       minlat; 
  • trunk/renderer.c

    r15 r16  
    4646 * This function is used to prepare a Path. 
    4747 */ 
    48 void drawPath(renderInfo *info, osmNd *nd) { 
    49     if (opts->debug > 1) 
    50         fprintf(stdout,"drawPath\n"); 
     48void drawPath(renderInfo *info, GSList *nodes) { 
     49    GSList *iter; 
     50    osmNode *nd; 
    5151    coordinates xy; 
    5252    int z; 
    53  
    54     for (z=0;z<=opts->maxlayer-opts->minlayer;z++) { 
    55         xy = coord2xy(nd->node->lat, nd->node->lon, z+opts->minlayer); 
     53     
     54    if (opts->debug > 1) 
     55        fprintf(stdout,"drawPath\n"); 
     56 
     57    iter = nodes; 
     58    for (z = 0; z <= opts->maxlayer-opts->minlayer; z++) { 
     59        nd = iter->data; 
     60        xy = coord2xy(nd->lat, nd->lon, z + opts->minlayer); 
    5661        cairo_move_to(info->cr[z], xy.x-info->offset[z].x, 
    5762                                    xy.y-info->offset[z].y); 
    5863    } 
    59     nd = nd->next; 
    60     while(nd) { 
    61         for (z=0;z<=opts->maxlayer-opts->minlayer;z++) { 
    62             xy = coord2xy(nd->node->lat, nd->node->lon, z+opts->minlayer); 
     64     
     65    iter = g_slist_next(iter); 
     66    while(iter) { 
     67        nd = iter->data; 
     68        for (z = 0; z <= opts->maxlayer - opts->minlayer; z++) { 
     69            xy = coord2xy(nd->lat, nd->lon, z + opts->minlayer); 
    6370            cairo_line_to(info->cr[z], 
    64                             xy.x-info->offset[z].x, 
    65                             xy.y-info->offset[z].y); 
    66         } 
    67         nd = nd->next; 
     71                          xy.x-info->offset[z].x, 
     72                          xy.y-info->offset[z].y); 
     73        } 
     74        iter = g_slist_next(iter); 
    6875    } 
    6976} 
  • trunk/ruleset.c

    r15 r16  
    1717 * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. 
    1818 */ 
     19#include <glib.h> 
    1920#include <time.h> 
    2021#include <expat.h> 
     
    2223#include <string.h> 
    2324 
    24 #include "compat.h" 
    25  
    2625#include "main.h" 
    2726#include "list.h" 
    28 #include "strlist.h" 
    2927#include "ruleset.h" 
    3028 
     
    3533// External Vars 
    3634extern memphisOpt   *opts; 
    37 extern strList      *keyStrings; 
    38 extern strList      *valStrings; 
    39 extern strList      *patternStrings; 
     35extern GTree        *keyStrings; 
     36extern GTree        *valStrings; 
     37extern GTree        *patternStrings; 
    4038 
    4139// Pointers to work with 
     
    10199                    new->type |= NODE; 
    102100            } else if(strcmp((char *) *(atts), "k") == 0) { 
    103                 stringStack = malloc(MAXSTACK*sizeof(char *)); 
    104                 buf2 = strdup((char *) *(atts +1)); 
    105                 c = 0; 
    106                 while((buf = strsep(&buf2, "|")) != NULL) { 
    107                     *(stringStack+c) = malloc(strlen(buf)+1); 
    108                     strncpy((char *) *(stringStack+c),buf,strlen(buf)+1); 
    109                     c++; 
     101                new->key = g_strsplit((char *) *(atts +1), "|", 0); 
     102                for(c=0;c<g_strv_length(new->key);c++) { 
     103                    char *tmp; 
     104                    tmp = *(new->key+c); 
     105                    *(new->key+c) = g_tree_lookup(keyStrings, tmp); 
     106                    if(*(new->key+c) == NULL) { 
     107                        g_tree_insert(keyStrings, tmp, tmp); 
     108                        *(new->key+c) = tmp; 
     109                    } else  { 
     110                      free(tmp); 
     111                    } 
    110112                } 
    111                 new->key = malloc((c+1)*sizeof(char *)); 
    112                 *(new->key+c) = NULL; 
    113                 while(c--) { 
    114                     *(new->key+c) = strlist_get(keyStrings,*(stringStack+c)); 
    115                     free(*(stringStack+c)); 
     113            } else if(strcmp((char *) *(atts), "v") == 0) { 
     114                new->value = g_strsplit((char *) *(atts +1), "|", 0); 
     115                for(c=0;c<g_strv_length(new->value);c++) { 
     116                    char *tmp; 
     117                    tmp = *(new->value+c); 
     118                    *(new->value+c) = g_tree_lookup(valStrings, tmp); 
     119                    if(*(new->value+c) == NULL) { 
     120                        g_tree_insert(valStrings, tmp, tmp); 
     121                        *(new->value+c) = tmp; 
     122                    } else  { 
     123                      free(tmp); 
     124                    } 
    116125                } 
    117                 free(buf2); 
    118                 free(stringStack); 
    119             } else if(strcmp((char *) *(atts), "v") == 0) { 
    120                 stringStack = malloc(MAXSTACK*sizeof(char *)); 
    121                 buf2 = strdup((char *) *(atts +1)); 
    122                 c = 0; 
    123                 while((buf = strsep(&buf2, "|")) != NULL) { 
    124                     *(stringStack+c) = malloc(strlen(buf)+1); 
    125                     strncpy((char *) *(stringStack+c),buf,strlen(buf)+1); 
    126                     c++; 
    127                 } 
    128                 new->value = malloc((c+1)*sizeof(char *)); 
    129                 *(new->value+c) = NULL; 
    130                 while(c--) { 
    131                     *(new->value+c) = strlist_get(valStrings,*(stringStack+c)); 
    132                     free(*(stringStack+c)); 
    133                 } 
    134                 free(buf2); 
    135                 free(stringStack); 
    136126            } 
    137127            atts+=2; 
     
    184174                sscanf((char *) *(atts+1),"%f",&new->width); 
    185175            } else if(strcmp((char *) *(atts), "pattern") == 0) { 
    186                 new->pattern = strlist_get(patternStrings,(char *)*(atts+1)); 
     176                new->pattern = g_tree_lookup(patternStrings, (char *) *(atts+1)); 
     177                if(new->pattern == NULL) { 
     178                    new->pattern = g_strdup((char *) *(atts+1)); 
     179                    g_tree_insert(patternStrings, (char *) *(atts+1), new->pattern); 
     180                } 
    187181            } else if(strcmp((char *) *(atts), "layer") == 0) { 
    188182                sscanf((char *) *(atts+1),"%hi:%hi", 
Note: See TracChangeset for help on using the changeset viewer.