]> www.wagner.pp.ru Git - oss/fgis.git/blob - lib/reclass.y
*** empty log message ***
[oss/fgis.git] / lib / reclass.y
1 %{
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include "reclass.h"
5 #include "epp.h"
6 #define YYSTYPE int
7 int yylex();
8 int yyerror();
9  RECLASS table;
10  int curval,startval,endval,loop_var;
11  int maxclass;
12  int interactive_parser=0;
13 %}
14 %token NUMBER
15 %%
16 list: 
17      statement 
18     | list eol statement 
19     ;
20
21 statement: /* empty */
22          | dest range 
23          | map_statement 
24          | error { if (interactive_parser) 
25                      yyerrok;
26                    else
27                      YYABORT;
28                   }
29
30 dest: value '=' { curval=$1; }
31      | '(' value ':' value ')' '=' { curval=-1; startval=$2 ; endval = $4; 
32                                loop_var=startval;}
33 eol: '\n' 
34    | '\r' '\n'
35 range:subrange
36      |range subrange
37 subrange:value { 
38                  if (curval>=0) table[$1]=curval;
39                     else {table[$1]=loop_var++;
40                           if (loop_var>endval) 
41                             loop_var=startval;
42                          }
43                  }
44      
45      | value ':' value { int i; for(i=$1;i<=$3;i++) 
46                          if (curval>=0) table[i]=curval;
47                          else {table[i]=loop_var++;
48                                if (loop_var>endval) 
49                                 loop_var=startval;
50                               }
51                         }     
52      ;
53 value: NUMBER {if ($1>65535) 
54                    { yyerror("Class value out of range\n");
55                      return 1;YYERROR;
56                    }
57  }
58 map_statement: value ':' value '=' value ':' value {
59                int i,start,stop,startv,stopv;
60                if ($5>$7) {start=$7;startv=$3;stop=$5;stopv=$1;}
61                    else   {start=$5;startv=$1;stop=$7;stopv=$3;}
62                for (i=start;i<=stop;i++)
63                 table[i]=(i-start)*(stopv-startv)/(start-stop)+startv;
64                }
65 ;
66
67 %%
68 int (*my_getc)();
69 int yylex()
70 { int c,numb=0,isnumb=0; 
71   static char unget_buf=0;
72  while ((c=unget_buf?unget_buf:(*my_getc)())!=EOF)
73  { unget_buf=0;
74    switch (c)
75    {
76     case '0':
77     case '1':
78     case '2': 
79     case '3':
80     case '4':
81     case '5':
82     case '6':
83     case '7':
84     case '8':
85     case '9': {isnumb=1; numb=numb*10+c-'0'; break;}
86     case ' ':
87     case '\t': {if (isnumb) { yylval=numb; return NUMBER; } break;}
88     default: if (isnumb) { yylval=numb; unget_buf=c; return NUMBER;}
89              else return c;
90  }
91  }
92  return 0;
93 }
94
95 int yyerror(char *s)
96 { fprintf(stderr,"%s\n",s);
97  return 0;
98 }
99 RECLASS make_reclass_table(EPP *infile,int (*recl_getc)())
100 { int size=epp_table_size(infile); 
101   
102   return parse_statements(size,create_reclass_table(size),recl_getc);
103 }
104 RECLASS parse_statements(int size,RECLASS src,int (*recl_getc)())
105 { my_getc=recl_getc;
106   table=src;
107   if (size>65535)size=65535;
108   maxclass=size;
109   if (yyparse()) { free(table);return NULL;}
110     else return table;
111 }
112 RECLASS create_reclass_table(size)
113 { RECLASS table;
114   int i;
115   if (size<=0) return NULL;
116   else if (size>65535) size=65535;
117   table=malloc((size+1)*sizeof(short int));
118   for(i=0;i<=size;i++) table[i]=i;
119   return table;
120 }
121 RECLASS wrapped_reclass(EPP *infile,int white)
122 { int i,maxclass;
123   RECLASS table;
124   maxclass=epp_table_size(infile);
125   table=malloc(maxclass*sizeof(short int));
126   table[0]=0;
127   for(i=1;i<=maxclass;i++) table[i]=(i-1)%(white-1)+1;
128   table[infile->offsite]=white;
129   return table;  
130 }