Index: mapwmslayer.c =================================================================== RCS file: /data2/cvsroot/mapserver/mapwmslayer.c,v retrieving revision 1.65 diff -u -r1.65 mapwmslayer.c --- mapwmslayer.c 17 Apr 2004 06:33:24 -0000 1.65 +++ mapwmslayer.c 29 May 2004 10:13:59 -0000 @@ -167,18 +167,17 @@ const char *key, *value; int nLen; char *pszURL; - + hashTableIteratorObj iter; /* Compute size required for URL buffer */ nLen = strlen(wmsparams->onlineresource) + 3; - key = msFirstKeyFromHashTable(wmsparams->params); - while (key != NULL) + iter = msHashIteratorNew(wmsparams->params); + while (iter->current) { - value = msLookupHashTable(wmsparams->params, key); - nLen += strlen(key) + strlen(value) + 2; + nLen += strlen(iter->current->key) + strlen(iter->current->data) + 2; - key = msNextKeyFromHashTable(wmsparams->params, key); + msHashIteratorNext(iter); } pszURL = (char*)malloc((nLen+1)*sizeof(char*)); @@ -200,18 +199,18 @@ /* Now add all the parameters */ nLen = strlen(pszURL); - key = msFirstKeyFromHashTable(wmsparams->params); - while (key != NULL) + msHashIteratorFirst(iter); + while (iter->current) { value = msLookupHashTable(wmsparams->params, key); - sprintf(pszURL+nLen, "%s=%s&", key, value); - nLen += strlen(key) + strlen(value) + 2; - key = msNextKeyFromHashTable(wmsparams->params, key); + sprintf(pszURL+nLen, "%s=%s&", iter->current->key, iter->current->data); + nLen += strlen(iter->current->key) + strlen(iter->current->data) + 2; + msHashIteratorNext(iter); } /* Get rid of trailing '&'*/ pszURL[nLen-1] = '\0'; - + msHashIteratorFree(iter); return pszURL; } @@ -865,19 +864,21 @@ strcmp(sThisWMSParams.onlineresource, psLastWMSParams->onlineresource) == 0) { - const char *key, *value1, *value2; - bOkToMerge = MS_TRUE; + const char *value1, *value2; + hashTableIteratorObj iter; - key = msFirstKeyFromHashTable(sThisWMSParams.params); - while (key != NULL && bOkToMerge == MS_TRUE) + bOkToMerge = MS_TRUE; + + iter = msHashIteratorNew(sThisWMSParams.params); + while (iter->current != NULL && bOkToMerge == MS_TRUE) { // Skip parameters whose values can be different - if (!(strcmp(key, "LAYERS") == 0 || - strcmp(key, "QUERY_LAYERS") == 0 || - strcmp(key, "STYLES") == 0) ) + if (!(strcmp(iter->current->key, "LAYERS") == 0 || + strcmp(iter->current->key, "QUERY_LAYERS") == 0 || + strcmp(iter->current->key, "STYLES") == 0) ) { - value1 = msLookupHashTable(psLastWMSParams->params, key); - value2 = msLookupHashTable(sThisWMSParams.params, key); + value1 = iter->current->data; + value2 = msLookupHashTable(sThisWMSParams.params, iter->current->key); if (value1==NULL || value2==NULL || strcmp(value1, value2) != 0) @@ -886,8 +887,9 @@ break; } } - key = msNextKeyFromHashTable(sThisWMSParams.params, key); + msHashIteratorNext(iter); } + msHashIteratorFree(iter); } if (bOkToMerge) Index: mapobject.c =================================================================== RCS file: /data2/cvsroot/mapserver/mapobject.c,v retrieving revision 1.1 diff -u -r1.1 mapobject.c --- mapobject.c 25 May 2004 16:05:48 -0000 1.1 +++ mapobject.c 29 May 2004 10:00:36 -0000 @@ -158,24 +158,22 @@ void msApplyMapConfigOptions( mapObj *map ) { - const char *key; + hashTableIteratorObj iter = msHashIteratorNew(map->configoptions); - for( key = msFirstKeyFromHashTable( map->configoptions ); - key != NULL; - key = msNextKeyFromHashTable( map->configoptions, key ) ) - { - const char *value = msLookupHashTable( map->configoptions, key ); - if( strcasecmp(key,"PROJ_LIB") == 0 ) + while (iter->current) { + if( strcasecmp(iter->current->key,"PROJ_LIB") == 0 ) { - msSetPROJ_LIB( value ); + msSetPROJ_LIB( iter->current->data ); } else { #if defined(USE_GDAL) && GDAL_RELEASE_DATE > 20030601 - CPLSetConfigOption( key, value ); + CPLSetConfigOption( iter->current->key, iter->current->data ); #endif } + msHashIteratorNext(iter); } + msHashIteratorFree(iter); } /************************************************************************/ Index: maphash.h =================================================================== RCS file: /data2/cvsroot/mapserver/maphash.h,v retrieving revision 1.6 diff -u -r1.6 maphash.h --- maphash.h 12 Apr 2004 18:38:24 -0000 1.6 +++ maphash.h 29 May 2004 10:12:06 -0000 @@ -21,6 +21,14 @@ typedef struct hashObj ** hashTableObj; +struct hashIteratorObj { /* hash table iterator */ + hashTableObj table; + struct hashObj *current; + int index; +}; + +typedef struct hashIteratorObj * hashTableIteratorObj; + MS_DLL_EXPORT hashTableObj msCreateHashTable(void); MS_DLL_EXPORT struct hashObj *msInsertHashTable(hashTableObj, const char *, const char *); MS_DLL_EXPORT char *msLookupHashTable(hashTableObj, const char *); @@ -29,6 +37,11 @@ MS_DLL_EXPORT const char *msFirstKeyFromHashTable( hashTableObj table ); MS_DLL_EXPORT const char *msNextKeyFromHashTable( hashTableObj table, const char *lastKey ); +MS_DLL_EXPORT hashTableIteratorObj msHashIteratorNew( hashTableObj table); +MS_DLL_EXPORT void msHashIteratorFree( hashTableIteratorObj iter); +MS_DLL_EXPORT int msHashIteratorFirst( hashTableIteratorObj iter); +MS_DLL_EXPORT int msHashIteratorNext( hashTableIteratorObj iter); + #ifdef __cplusplus } #endif Index: maphash.c =================================================================== RCS file: /data2/cvsroot/mapserver/maphash.c,v retrieving revision 1.12 diff -u -r1.12 maphash.c --- maphash.c 11 May 2004 19:13:46 -0000 1.12 +++ maphash.c 29 May 2004 10:12:51 -0000 @@ -192,3 +192,69 @@ return NULL; } + +hashTableIteratorObj msHashIteratorNew( hashTableObj table) +{ + hashTableIteratorObj iter = (hashTableIteratorObj)malloc(sizeof(struct hashIteratorObj)); + iter->table = table; + iter->current = NULL; + + for( iter->index = 0; iter->index < MS_HASHSIZE; iter->index++ ) + { + if( iter->table[iter->index] != NULL ) { + iter->current = iter->table[iter->index]; + break; + } + } + + return iter; +} + +void msHashIteratorFree( hashTableIteratorObj iter) +{ + free (iter); +} + +int msHashIteratorFirst( hashTableIteratorObj iter) +{ + if(!iter || !iter->table) { + msSetError(MS_HASHERR, "No hash table", "msHashTableFirst"); + return MS_FALSE; + } + + for( iter->index = 0; iter->index < MS_HASHSIZE; iter->index++ ) + { + if( iter->table[iter->index] != NULL ) { + iter->current = iter->table[iter->index]; + return MS_TRUE; + } + } + iter->current = NULL; + return MS_FALSE; +} + +int msHashIteratorNext( hashTableIteratorObj iter) +{ + if(!iter || !iter->table) { + msSetError(MS_HASHERR, "No hash table", "msHashTableNext"); + return MS_FALSE; + } + + if (!iter->current) + return MS_FALSE; + + if (iter->current->next) { + /* next item in hash bucket */ + iter->current = iter->current->next; + return MS_TRUE; + } + for( iter->index++; iter->index < MS_HASHSIZE; iter->index++ ) + { + if( iter->table[iter->index] != NULL ) { + iter->current = iter->table[iter->index]; + return MS_TRUE; + } + } + iter->current = NULL; + return MS_FALSE; +} Index: mapfile.c =================================================================== RCS file: /data2/cvsroot/mapserver/mapfile.c,v retrieving revision 1.259 diff -u -r1.259 mapfile.c --- mapfile.c 25 May 2004 16:10:48 -0000 1.259 +++ mapfile.c 29 May 2004 09:48:30 -0000 @@ -3878,7 +3878,7 @@ int i; FILE *stream; char szPath[MS_MAXPATHLEN]; - const char *key; + hashTableIteratorObj iter; if(!map) { msSetError(MS_MISCERR, "Map is undefined.", "msSaveMap()"); @@ -3919,13 +3919,13 @@ fprintf(stream, " TRANSPARENT %s\n", msTrueFalse[map->transparent]); fprintf(stream, " UNITS %s\n", msUnits[map->units]); - for( key = msFirstKeyFromHashTable( map->configoptions ); - key != NULL; - key = msNextKeyFromHashTable( map->configoptions, key ) ) - { + iter = msHashIteratorNew(map->configoptions); + while (iter->current) { fprintf( stream, " CONFIG %s \"%s\"\n", - key, msLookupHashTable( map->configoptions, key ) ); + iter->current->key, iter->current->data ); + msHashIteratorNext(iter); } + msHashIteratorFree(iter); fprintf(stream, " NAME \"%s\"\n\n", map->name); if(map->debug) fprintf(stream, " DEBUG ON\n");