|
32 | 32 | #include <stdarg.h>
|
33 | 33 | #include <assert.h>
|
34 | 34 | #include <ctype.h>
|
| 35 | +#include <float.h> |
35 | 36 |
|
36 | 37 | #include "mapserver.h"
|
37 | 38 | #include "mapfile.h"
|
@@ -768,6 +769,23 @@ int loadJoin(joinObj *join)
|
768 | 769 | } /* next token */
|
769 | 770 | }
|
770 | 771 |
|
| 772 | +static void writeScaleToken(FILE *stream, int indent, scaleTokenObj *token) { |
| 773 | + int i; |
| 774 | + indent++; |
| 775 | + writeBlockBegin(stream,indent,"SCALETOKEN"); |
| 776 | + writeString(stream, indent, "NAME", NULL, token->name); |
| 777 | + indent++; |
| 778 | + writeBlockBegin(stream,indent,"VALUES"); |
| 779 | + for(i=0;i<token->n_entries;i++) { |
| 780 | + char minscale[32]; |
| 781 | + sprintf(minscale,"%g",token->tokens[i].minscale); |
| 782 | + writeNameValuePair(stream, indent, minscale, token->tokens[i].value); |
| 783 | + } |
| 784 | + writeBlockEnd(stream,indent,"VALUES"); |
| 785 | + indent--; |
| 786 | + writeBlockEnd(stream,indent,"SCALETOKEN"); |
| 787 | +} |
| 788 | + |
771 | 789 | static void writeJoin(FILE *stream, int indent, joinObj *join)
|
772 | 790 | {
|
773 | 791 | indent++;
|
@@ -3687,6 +3705,9 @@ int initLayer(layerObj *layer, mapObj *map)
|
3687 | 3705 | layer->maxfeatures = -1; /* no quota */
|
3688 | 3706 | layer->startindex = -1; /*used for pagination*/
|
3689 | 3707 |
|
| 3708 | + layer->scaletokens = NULL; |
| 3709 | + layer->numscaletokens = 0; |
| 3710 | + |
3690 | 3711 | layer->template = layer->header = layer->footer = NULL;
|
3691 | 3712 |
|
3692 | 3713 | layer->transform = MS_TRUE;
|
@@ -3770,6 +3791,28 @@ int initLayer(layerObj *layer, mapObj *map)
|
3770 | 3791 | return(0);
|
3771 | 3792 | }
|
3772 | 3793 |
|
| 3794 | +int initScaleToken(scaleTokenObj* token) { |
| 3795 | + token->n_entries = 0; |
| 3796 | + token->name = NULL; |
| 3797 | + token->tokens = NULL; |
| 3798 | + return MS_SUCCESS; |
| 3799 | +} |
| 3800 | + |
| 3801 | +int freeScaleTokenEntry( scaleTokenEntryObj *token) { |
| 3802 | + msFree(token->value); |
| 3803 | + return MS_SUCCESS; |
| 3804 | +} |
| 3805 | + |
| 3806 | +int freeScaleToken(scaleTokenObj *scaletoken) { |
| 3807 | + int i; |
| 3808 | + msFree(scaletoken->name); |
| 3809 | + for(i=0;i<scaletoken->n_entries;i++) { |
| 3810 | + freeScaleTokenEntry(&scaletoken->tokens[i]); |
| 3811 | + } |
| 3812 | + msFree(scaletoken->tokens); |
| 3813 | + return MS_SUCCESS; |
| 3814 | +} |
| 3815 | + |
3773 | 3816 | int freeLayer(layerObj *layer)
|
3774 | 3817 | {
|
3775 | 3818 | int i;
|
@@ -3815,6 +3858,13 @@ int freeLayer(layerObj *layer)
|
3815 | 3858 | }
|
3816 | 3859 | msFree(layer->class);
|
3817 | 3860 |
|
| 3861 | + if(layer->numscaletokens>0) { |
| 3862 | + for(i=0;i<layer->numscaletokens;i++) { |
| 3863 | + freeScaleToken(&layer->scaletokens[i]); |
| 3864 | + } |
| 3865 | + msFree(layer->scaletokens); |
| 3866 | + } |
| 3867 | + |
3818 | 3868 | if(layer->features)
|
3819 | 3869 | freeFeatureList(layer->features);
|
3820 | 3870 |
|
@@ -3895,6 +3945,85 @@ classObj *msGrowLayerClasses( layerObj *layer )
|
3895 | 3945 | return layer->class[layer->numclasses];
|
3896 | 3946 | }
|
3897 | 3947 |
|
| 3948 | +scaleTokenObj *msGrowLayerScaletokens( layerObj *layer ) |
| 3949 | +{ |
| 3950 | + layer->scaletokens = msSmallRealloc(layer->scaletokens,(layer->numscaletokens+1)*sizeof(scaleTokenObj)); |
| 3951 | + memset(&layer->scaletokens[layer->numscaletokens],0,sizeof(scaleTokenObj)); |
| 3952 | + return &layer->scaletokens[layer->numscaletokens]; |
| 3953 | +} |
| 3954 | + |
| 3955 | +int loadScaletoken(scaleTokenObj *token, layerObj *layer) { |
| 3956 | + for(;;) { |
| 3957 | + int stop = 0; |
| 3958 | + switch(msyylex()) { |
| 3959 | + case(EOF): |
| 3960 | + msSetError(MS_EOFERR, NULL, "loadScaletoken()"); |
| 3961 | + return(MS_FAILURE); |
| 3962 | + case(NAME): |
| 3963 | + if(getString(&token->name) == MS_FAILURE) return(MS_FAILURE); |
| 3964 | + break; |
| 3965 | + case(VALUES): |
| 3966 | + for(;;) { |
| 3967 | + if(stop) break; |
| 3968 | + switch(msyylex()) { |
| 3969 | + case(EOF): |
| 3970 | + msSetError(MS_EOFERR, NULL, "loadScaletoken()"); |
| 3971 | + return(MS_FAILURE); |
| 3972 | + case(END): |
| 3973 | + stop = 1; |
| 3974 | + if(token->n_entries == 0) { |
| 3975 | + msSetError(MS_PARSEERR,"Scaletoken (line:%d) has no VALUES defined","loadScaleToken()",msyylineno); |
| 3976 | + return(MS_FAILURE); |
| 3977 | + } |
| 3978 | + token->tokens[token->n_entries-1].maxscale = DBL_MAX; |
| 3979 | + break; |
| 3980 | + case(MS_STRING): |
| 3981 | + /* we have a key */ |
| 3982 | + token->tokens = msSmallRealloc(token->tokens,(token->n_entries+1)*sizeof(scaleTokenEntryObj)); |
| 3983 | + |
| 3984 | + if(1 != sscanf(msyystring_buffer,"%lf",&token->tokens[token->n_entries].minscale)) { |
| 3985 | + msSetError(MS_PARSEERR, "failed to parse SCALETOKEN VALUE (%s):(line %d), expecting \"minscale\"", "loadScaletoken()", |
| 3986 | + msyystring_buffer,msyylineno); |
| 3987 | + return(MS_FAILURE); |
| 3988 | + } |
| 3989 | + if(token->n_entries == 0) { |
| 3990 | + /* check supplied value was 0*/ |
| 3991 | + if(token->tokens[0].minscale != 0) { |
| 3992 | + msSetError(MS_PARSEERR, "First SCALETOKEN VALUE (%s):(line %d) must be zero, expecting \"0\"", "loadScaletoken()", |
| 3993 | + msyystring_buffer,msyylineno); |
| 3994 | + return(MS_FAILURE); |
| 3995 | + } |
| 3996 | + } else { |
| 3997 | + /* set max scale of previous token */ |
| 3998 | + token->tokens[token->n_entries-1].maxscale = token->tokens[token->n_entries].minscale; |
| 3999 | + } |
| 4000 | + token->tokens[token->n_entries].value = NULL; |
| 4001 | + if(getString(&(token->tokens[token->n_entries].value)) == MS_FAILURE) return(MS_FAILURE); |
| 4002 | + token->n_entries++; |
| 4003 | + break; |
| 4004 | + default: |
| 4005 | + msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadScaletoken()", msyystring_buffer, msyylineno ); |
| 4006 | + return(MS_FAILURE); |
| 4007 | + } |
| 4008 | + } |
| 4009 | + break; |
| 4010 | + case(END): |
| 4011 | + if(!token->name || !*(token->name)) { |
| 4012 | + msSetError(MS_PARSEERR,"ScaleToken missing mandatory NAME entry (line %d)","loadScaleToken()",msyylineno); |
| 4013 | + return MS_FAILURE; |
| 4014 | + } |
| 4015 | + if(token->n_entries == 0) { |
| 4016 | + msSetError(MS_PARSEERR,"ScaleToken missing at least one VALUES entry (line %d)","loadScaleToken()",msyylineno); |
| 4017 | + return MS_FAILURE; |
| 4018 | + } |
| 4019 | + return MS_SUCCESS; |
| 4020 | + default: |
| 4021 | + msSetError(MS_IDENTERR, "Parsing error 2 near (%s):(line %d)", "loadScaletoken()", msyystring_buffer, msyylineno ); |
| 4022 | + return(MS_FAILURE); |
| 4023 | + } |
| 4024 | + } /* next token*/ |
| 4025 | +} |
| 4026 | + |
3898 | 4027 | int loadLayer(layerObj *layer, mapObj *map)
|
3899 | 4028 | {
|
3900 | 4029 | int type;
|
@@ -4211,6 +4340,13 @@ int loadLayer(layerObj *layer, mapObj *map)
|
4211 | 4340 | }
|
4212 | 4341 | }
|
4213 | 4342 | break;
|
| 4343 | + case(SCALETOKEN): |
| 4344 | + if (msGrowLayerScaletokens(layer) == NULL) |
| 4345 | + return(-1); |
| 4346 | + initScaleToken(&layer->scaletokens[layer->numscaletokens]); |
| 4347 | + if(loadScaletoken(&layer->scaletokens[layer->numscaletokens], layer) == -1) return(-1); |
| 4348 | + layer->numscaletokens++; |
| 4349 | + break; |
4214 | 4350 | case(SIZEUNITS):
|
4215 | 4351 | if((layer->sizeunits = getSymbol(8, MS_INCHES,MS_FEET,MS_MILES,MS_METERS,MS_KILOMETERS,MS_NAUTICALMILES,MS_DD,MS_PIXELS)) == -1) return(-1);
|
4216 | 4352 | break;
|
@@ -4391,6 +4527,7 @@ static void writeLayer(FILE *stream, int indent, layerObj *layer)
|
4391 | 4527 | writeHashTable(stream, indent, "VALIDATION", &(layer->validation));
|
4392 | 4528 |
|
4393 | 4529 | /* write potentially multiply occuring objects last */
|
| 4530 | + for(i=0; i<layer->numscaletokens; i++) writeScaleToken(stream, indent, &(layer->scaletokens[i])); |
4394 | 4531 | for(i=0; i<layer->numjoins; i++) writeJoin(stream, indent, &(layer->joins[i]));
|
4395 | 4532 | for(i=0; i<layer->numclasses; i++) writeClass(stream, indent, layer->class[i]);
|
4396 | 4533 |
|
|
0 commit comments