[GRASS-SVN] r56748 - grass-addons/grass6/raster/r.fuzzy.system

svn_grass at osgeo.org svn_grass at osgeo.org
Mon Jun 17 00:32:06 PDT 2013


Author: neteler
Date: 2013-06-17 00:32:05 -0700 (Mon, 17 Jun 2013)
New Revision: 56748

Modified:
   grass-addons/grass6/raster/r.fuzzy.system/description.html
   grass-addons/grass6/raster/r.fuzzy.system/fuzzylogic.c
   grass-addons/grass6/raster/r.fuzzy.system/helpers.c
   grass-addons/grass6/raster/r.fuzzy.system/io.c
   grass-addons/grass6/raster/r.fuzzy.system/main.c
   grass-addons/grass6/raster/r.fuzzy.system/map_parser.c
   grass-addons/grass6/raster/r.fuzzy.system/rule_parser.c
   grass-addons/grass6/raster/r.fuzzy.system/system.c
Log:
r.fuzzy.system: source code layout sync with G7 version for easier comparison of existing differences

Modified: grass-addons/grass6/raster/r.fuzzy.system/description.html
===================================================================
--- grass-addons/grass6/raster/r.fuzzy.system/description.html	2013-06-17 07:31:16 UTC (rev 56747)
+++ grass-addons/grass6/raster/r.fuzzy.system/description.html	2013-06-17 07:32:05 UTC (rev 56748)
@@ -1,6 +1,6 @@
 <h2>OPTIONS</h2>
 
-<p>
+<dl>
 <dt><b>maps</b></dt>
 <dd>A text file containing maps name and  fuzzy sets connected with map
 definition. Maps in text file must exist on a search path, except the output
@@ -14,7 +14,7 @@
 Any whitespaces like spaces, tabs, empty lines are allowed and may used to
 visual format of rule file.
 
-<pre>$ set_name {side; points; boundary_shape; hedge; height }
+<pre>$ set_name {side; points; boundary_shape; hedge; height }</pre>
 <ul>
 <li><b>set_name</b>: Any name of the fuzzy set. Must not contain symbols: <i>
 %,$ and #</i>
@@ -38,7 +38,6 @@
 memebrship is equal to height.
 </ul>
 <p>An example of fuzzy sets definiton:
-</pre>
 <pre>$ moderate {both; 90,100,120,130; sshaped; 0; 1}</pre>
 
 <b>Special notes about sets definition for output map:</b><br>
@@ -71,16 +70,18 @@
 <li>OR is symbolised by <b>|</b>
 <li>To  specify the order of operators must use parentheses <b>()</b>.
 </ul>
-<p>
 
+
 <p>An example of fuzzy rules definiton:
 <pre>
 $ small {distance = high & elev = high}
 </pre>
+
 </dd>
+</dl>
 <h2>ADVANCED OPTIONS</h2>
 In most cases default options shoud not be changed.
-<p>
+<dl>
 <dt><b>family</b></dt>
 <dd>AND and OR operations in fuzzy logic are made with T-norms, T-conorms.
 T-norms, T-conorms are a generalization of the two-valued logical conjunction
@@ -142,38 +143,39 @@
 than 30 may impact on precision of final result, but values above 200 may slow
 down computation time.
 </dd>
+</dl>
 <h2>VISUAL OUTPUT</h2>
+<dl>
 <dt><b>coordinates</b></dt>
 <dd>Coordinates of points for which output: universe, all consequents sets and
 agregate set. It is useful for visual presentation or detail analysis of fuzzy
 rules behaviour. In that cases calculations are peroforemd n=only for selected
-point.
+point.</dd>
 <dt><b>membership only flag</b></dt>
 <dd>Prints for all maps sat of values in map range (map universe) and values of
 fuzzy sets (linguistic values). Number of values is taken from resolution
 (default 100). This option is useful for visual control fuzzy set definitions
-for evrey map.
+for every map.</dd>
+</dl>
 
-
 <h2>OUTPUTS</h2>
+<dl>
 <dt><b>output</b></dt>
 <dd>Map containing deffuzified values. Map is always of type FCELLS and contains
 values defined in output universe.
 </dd>
-<p>
 <dt><b>multipe output flag</b></dt>
 <dd>This flag is used to create fuzzified maps for every rule. The name of the
 map consist of otput map name, '_' and rule name (for example: output=probs and
 rule name high, the map name: probs_high). Values of maps ranges from 0  to 1.
 If map with such name exists will be overwritten without warning.
 </dd>
-<p>
+</dl>
 <h2>NOTES</h2>
 <h4>Calculation of boundary shape</h4>
 Depending on type of the boundary different equation are used to determine its
 shape:
 <p>
-
 <b>Linear:</b> the membership is calculated according following equation:<br>
 
 <pre><code>
@@ -216,9 +218,9 @@
 using two maps: distance to streams and elevation above streams. We can write
 some common sense rules:
 <pre>
-IF elevation IS low AND distance IS near THEN risk IS very high
+IF elevation IS low AND distance IS near THEN risk IS very probable
 IF elevation IS low OR distance IS near THEN risk IS probable
-IF elevation IS high AND distance IS far THEN risk IS low
+IF elevation IS high AND distance IS far THEN risk IS unprobable
 </pre>
 In clasical boolean sense, we would taken some limits of ideas "near" "far" etc,
 but what about walues near the limit? The fuzzy set uses partial memberships
@@ -238,15 +240,16 @@
 <p>
 First we need two maps created with r.stream package:
 
+<!-- TODO: update to GRASS 7 version -->
 <pre>
-r.watershed -f elevation=elevation.10m at PERMANENT accumulation=accum
-r.mapcalc 'accum_abs=abs(accum)'
-r.stream.extract elevation="elevation.10m at PERMANENT" threshold=1000
-stream_rast="stream" direction="dirs"
-r.stream.order stream=streams dir=dirs horton=horton 
-r.mapcalc horton3=if(horton>2,1,0)
-r.stream.distance stream=horton3 dir=dirs dem=elevation.10m at PERMANENT 
-distance=distance elevation=elevation
+r.watershed -f elevation=elevation.10m accumulation=accum
+r.mapcalc "accum_abs = abs(accum)"
+r.stream.extract elevation=elevation.10m threshold=1000 \
+         stream_rast=streams direction=dirs
+r.stream.order stream=streams dir=dirs horton=horton
+r.mapcalc "horton3 = if(horton>2,1,0)"
+r.stream.distance stream=horton3 dir=dirs dem=elevation.10m \
+         distance=distance elevation=elevation
 </pre>
 
 Next, to perform analysis we need two files: one with definition of map used in
@@ -256,7 +259,6 @@
 <p>MAPS
 <pre>
 #flood.map
-
 	%elevation
 $ low {right; 2,4; sshaped; 0; 1}
 $ moderate {both; 2,4,5,10; sshaped; 0; 1}
@@ -267,7 +269,7 @@
 $ medium {both; 30,70,100,150; sshaped; 0; 1}
 $ far {both; 100,150,200,300; sshaped; 0; 1}
 $ veryfar {left; 200,300; sshaped; 0; 1}
-	
+
 	%accum_abs
 $ low {right; 500,5000; sshaped; 0; 1}
 $ $ high {left; 500,5000; sshaped; 0; 1}
@@ -280,8 +282,8 @@
 $ moderate {both; 40,60,60,80; linear; 0;1}
 $ high {both; 60,80,80,100; linear; 0;1}
 $ veryhigh {both; 80,100,100,120; linear; 0;1}
+</pre>
 
-</pre>
 <p>RULES:
 <pre>
 #flood.rul
@@ -316,13 +318,12 @@
 <a href="r.mapcalc.html">r.mapcalc</a>,
 </em>
 
-
 <h2>REFERENCES</h2>
 
 Zadeh, L.A. (1965). "Fuzzy sets". Information and Control 8 (3): 338–353.
 doi:10.1016/S0019-9958(65)90241-X. ISSN 0019-9958.<p>
 
-Novák, Vilém (1989). Fuzzy Sets and Their Applications. Bristol: Adam Hilger.
+Novák, Vilém (1989). Fuzzy Sets and Their Applications. Bristol: Adam Hilger.
 ISBN 0-85274-583-4.<p>
 
 Klir, George J.; Yuan, Bo (1995). Fuzzy sets and fuzzy logic: theory and

Modified: grass-addons/grass6/raster/r.fuzzy.system/fuzzylogic.c
===================================================================
--- grass-addons/grass6/raster/r.fuzzy.system/fuzzylogic.c	2013-06-17 07:31:16 UTC (rev 56747)
+++ grass-addons/grass6/raster/r.fuzzy.system/fuzzylogic.c	2013-06-17 07:32:05 UTC (rev 56748)
@@ -48,8 +48,7 @@
     if (set->hedge)
 	x = (set->hedge > 0) ? pow(x, pow(2, set->hedge)) : pow(x,
 								pow(0.5,
-								    (-set->
-								     hedge)));
+								    (-set->hedge)));
 
     if (set->height < 1)
 	x = x * set->height;
@@ -82,7 +81,7 @@
 	break;
 
     case l_HAMACHER:
-	return (x == 0||y == 0) ? 0 : (x * y) / ((x + y) - x * y);
+	return (x == 0 || y == 0) ? 0 : (x * y) / ((x + y) - x * y);
 	break;
 
 

Modified: grass-addons/grass6/raster/r.fuzzy.system/helpers.c
===================================================================
--- grass-addons/grass6/raster/r.fuzzy.system/helpers.c	2013-06-17 07:31:16 UTC (rev 56747)
+++ grass-addons/grass6/raster/r.fuzzy.system/helpers.c	2013-06-17 07:32:05 UTC (rev 56748)
@@ -1,6 +1,7 @@
 #include "local_proto.h"
 
 int get_nsets(FILE * fd, fpos_t position)
+/* get number of maps (setd) used in analysis */
 {
 
     int nsets = 0;
@@ -29,6 +30,7 @@
 
 
 int char_strip(char *buf, char rem)
+/* remove spaces, tabs and one addational character */
 {
     register char *a, *b;
 
@@ -40,6 +42,7 @@
 }
 
 int char_copy(const char *buf, char *res, int start, int stop)
+/* copy part of the string to another string */
 {
     register int i, j;
 
@@ -81,7 +84,7 @@
     for (i = 0; i < resolution; ++i)
 	universe[i] = min + ((max - min) / resolution) * i;
 
-/* visual output */
+    /* visual output */
 
     return 0;
 }
@@ -96,32 +99,32 @@
     int num_points;
     float result;
 
-		visual_output = (float **)G_malloc(resolution * sizeof(float *));
+    visual_output = (float **)G_malloc(resolution * sizeof(float *));
 
-				for (j = 0; j < nrules; ++j) 
-		for (i = 0; i < resolution; ++i) {
+    for (j = 0; j < nrules; ++j)
+	for (i = 0; i < resolution; ++i) {
 	    visual_output[i] = (float *)G_calloc(nrules + 2, sizeof(float));
 	    visual_output[i][0] = universe[i];
-		}
-			
+	}
+
     G_get_window(&window);
     num_points = sscanf(answer, "%lf,%lf", &x, &y);
 
     c = (int)G_easting_to_col(x, &window);
     r = (int)G_northing_to_row(y, &window);
-    
-		get_rows(r);
+
+    get_rows(r);
     get_cells(c);
-    
-    result = implicate(); /* jump to different function */
 
+    result = implicate();	/* jump to different function */
+
     for (i = 0; i < nrules; ++i)
 	fprintf(stdout, "ANTECEDENT %s: %5.3f\n", s_rules[i].outname,
 		antecedents[i]);
 
-  fprintf(stdout, "RESULT (deffuzified):  %5.3f\n", result);
-  
-  fprintf(stdout, "UNIVERSE,");
+    fprintf(stdout, "RESULT (deffuzified):  %5.3f\n", result);
+
+    fprintf(stdout, "UNIVERSE,");
     for (i = 0; i < nrules; ++i)
 	fprintf(stdout, "%s,", s_rules[i].outname);
     fprintf(stdout, "AGREGATE \n");
@@ -135,34 +138,35 @@
 		fprintf(stdout, "\n");
 	}
 
-			for (i = 0; i < nmaps; ++i) {
+    for (i = 0; i < nmaps; ++i) {
 	G_free(s_maps[i].sets);
 	if (s_maps[i].output)
 	    continue;
-		G_free(s_maps[i].in_buf);
+	G_free(s_maps[i].in_buf);
 	G_close_cell(s_maps[i].cfd);
     }
 
-			for (j = 0; j < nrules; ++j)
-				G_free(visual_output[j]);
+    for (j = 0; j < nrules; ++j)
+	G_free(visual_output[j]);
     G_free(visual_output);
-    
+
     G_free(antecedents);
     G_free(s_maps);
     G_free(s_rules);
-   
+
     exit(EXIT_SUCCESS);
 }
 
 
-void show_membership(void) {
-	int i,j,k;
-	STRING cur_mapset;
-	struct FPRange map_range;
-	DCELL min, max;
-	float* map_universe;
+void show_membership(void)
+{
+    int i, j, k;
+    STRING cur_mapset;
+    struct FPRange map_range;
+    DCELL min, max;
+    float *map_universe;
 	
-	resolution=resolution+1;
+	resolution=resolution + 1;
 	map_universe = (float *)G_calloc(resolution, sizeof(float));
 
 	for(i=0;i<nmaps;++i) {
@@ -209,29 +213,29 @@
     G_free(s_maps);
     G_free(s_rules);
 
-		exit(EXIT_SUCCESS);
-	
+    exit(EXIT_SUCCESS);
+
 }
 
 int set_cats(void)
 {
-struct Categories cats;
-float fmin, fmax;
-int cmin, cmax;
-int i, j;
+    struct Categories cats;
+    float fmin, fmax;
+    int cmin, cmax;
+    int i, j;
 
-fmin=universe[0];
-fmax=universe[resolution];
-cmin=(int)universe[0];
-cmax=(int)universe[resolution];
-double tmp1, tmp2;
-float fuzzy_val=0;
-char buf[200];
-float rang;
+    fmin = universe[0];
+    fmax = universe[resolution];
+    cmin = (int)universe[0];
+    cmax = (int)universe[resolution];
+    double tmp1, tmp2;
+    float fuzzy_val = 0;
+    char buf[200];
+    float rang;
 
-rang=(universe[0]+universe[1])/2.;
-G_read_raster_cats(output, G_mapset(), &cats);
-G_set_raster_cats_title("Result membership", &cats);
+    rang = (universe[0] + universe[1])/2.;
+    G_read_raster_cats(output, G_mapset(), &cats);
+    G_set_raster_cats_title("Result membership", &cats);
 
 	for (i=0;i<resolution;++i) {
 		strcpy(buf,"");
@@ -246,22 +250,25 @@
 			
 		}
 
-			tmp1=(double)universe[i]-rang;
-			tmp2=(double)universe[i]+rang;
-			if(i==0) tmp1=(double)universe[i];
-			if(i==resolution) tmp2=(double)universe[i];
-			G_set_d_raster_cat(&tmp1, &tmp2, buf, &cats);
-	}	
-G_write_raster_cats(output, &cats);
-G_free_raster_cats(&cats);
-return 0;
+	tmp1 = (double)universe[i] - rang;
+	tmp2 = (double)universe[i] + rang;
+	if (i == 0)
+	    tmp1 = (double)universe[i];
+	if (i == resolution)
+	    tmp2 = (double)universe[i];
+	G_set_d_raster_cat(&tmp1, &tmp2, buf, &cats);
+    }
+    G_write_raster_cats(output, &cats);
+    G_free_raster_cats(&cats);
+    return 0;
 }
 
 
-
-void set_colors(void) { /* not in use yet */
-struct Colors colors;
-G_init_colors(&colors);
-G_add_color_rule(0, 255, 255, 255, 2, 255, 255, 0, &colors);
-G_write_colors(output, G_mapset(), &colors);
+/* not in use yet
+void set_colors(void) {
+  struct Colors colors;
+  G_init_colors(&colors);
+  G_add_color_rule(0, 255, 255, 255, 2, 255, 255, 0, &colors);
+  G_write_colors(output, G_mapset(), &colors);
 }
+ */

Modified: grass-addons/grass6/raster/r.fuzzy.system/io.c
===================================================================
--- grass-addons/grass6/raster/r.fuzzy.system/io.c	2013-06-17 07:31:16 UTC (rev 56747)
+++ grass-addons/grass6/raster/r.fuzzy.system/io.c	2013-06-17 07:32:05 UTC (rev 56748)
@@ -8,12 +8,10 @@
     struct Cell_head cellhd;
 
     for (i = 0; i < nmaps; ++i) {
-
 	if (s_maps[i].output) {
 	    s_maps[i].in_buf = NULL;
 	    continue;
 	}
-
 	mapset = G_find_cell2(s_maps[i].name, "");
 
 	if (mapset == NULL)
@@ -31,18 +29,14 @@
 	s_maps[i].in_buf = G_allocate_raster_buf(s_maps[i].raster_type);
 
     }
-
     return 0;
 }
 
-
 int get_rows(int row)
 {
-
     int i;
 
     for (i = 0; i < nmaps; ++i) {
-
 	if (s_maps[i].output)
 	    continue;
 
@@ -54,7 +48,6 @@
 			  s_maps[i].name, row);
 	}
     }
-
     return 0;
 }
 
@@ -122,6 +115,5 @@
 	m_outputs[i].out_buf = G_allocate_f_raster_buf();
 
     }
-return 0;
+    return 0;
 }
-

Modified: grass-addons/grass6/raster/r.fuzzy.system/main.c
===================================================================
--- grass-addons/grass6/raster/r.fuzzy.system/main.c	2013-06-17 07:31:16 UTC (rev 56747)
+++ grass-addons/grass6/raster/r.fuzzy.system/main.c	2013-06-17 07:32:05 UTC (rev 56748)
@@ -61,7 +61,8 @@
     module = G_define_module();
     module->keywords = _("raster, fuzzy logic");
     module->description =
-        _("xxxx");
+	_("Full fuzzy logic standalone classification system with few fuzzy "
+	  "logic families implication and defuzzification and methods.");
 
     file_vars = G_define_standard_option(G_OPT_F_INPUT);
     file_vars->key = "maps";
@@ -185,19 +186,19 @@
 
     nrows = G_window_rows();
     ncols = G_window_cols();
-		
-		parse_map_file(var_name_file);
-			if (membership_only)
-    show_membership();
-    
-		parse_rule_file(rule_name_file);
+
+    parse_map_file(var_name_file);
+    if (membership_only)
+	show_membership();
+
+    parse_rule_file(rule_name_file);
     get_universe();
     open_maps();
 	
-		antecedents = (float *)G_malloc(nrules * sizeof(float));
-		agregate = (float *)G_calloc(resolution, sizeof(float));
-			if (coor_proc)
-		process_coors(in_coor_opt->answer);
+	antecedents = (float *)G_malloc(nrules * sizeof(float));
+	agregate = (float *)G_calloc(resolution, sizeof(float));
+	if (coor_proc)
+       process_coors(in_coor_opt->answer);
 
     if ((outfd = G_open_raster_new(output, FCELL_TYPE)) < 0)
 	G_fatal_error(_("Unable to create raster map <%s>"), output);
@@ -206,9 +207,9 @@
 
     if (multiple)
 	create_output_maps();
-  
-		G_message("Calculate...");
 
+    G_message("Calculate...");
+
     for (row = 0; row < nrows; ++row) {
 		G_percent(row, nrows, 2);
 		get_rows(row);
@@ -246,30 +247,30 @@
 
     }
     G_percent(row, nrows, 2);
-		
+
     G_message("Close...");
 
-		
 
+
     G_close_cell(outfd);
     G_short_history(output, "raster", &history);
     G_command_history(&history);
     G_write_history(output, &history);
-		set_cats();
-		/* free */
-			for (i = 0; i < nmaps; ++i) {
+	set_cats();
+	/* free */
+	for (i = 0; i < nmaps; ++i) {
 		G_free(s_maps[i].sets);
 				if (s_maps[i].output)
 	    continue;
 		G_free(s_maps[i].in_buf);
 		G_close_cell(s_maps[i].cfd);
-			}
+	}
     G_free(antecedents);
     G_free(agregate);
     G_free(out_buf);
     G_free(s_maps);
     G_free(s_rules);
-   
+
     if (multiple)
 	for (i = 0; i < nrules; ++i) {
 	    G_free(m_outputs[i].out_buf);

Modified: grass-addons/grass6/raster/r.fuzzy.system/map_parser.c
===================================================================
--- grass-addons/grass6/raster/r.fuzzy.system/map_parser.c	2013-06-17 07:31:16 UTC (rev 56747)
+++ grass-addons/grass6/raster/r.fuzzy.system/map_parser.c	2013-06-17 07:32:05 UTC (rev 56748)
@@ -54,17 +54,17 @@
 	    if (mapset == NULL && strcmp(map, "_OUTPUT_"))
 		G_fatal_error(_("Raster map <%s> not found"), map);
 
-				if (!strcmp(map, "_OUTPUT_")) {
+		if (!strcmp(map, "_OUTPUT_")) {
 			G_strcpy(s_maps[nmaps2].name, output);
-			s_maps[nmaps2].output=1;
-				} else {
+			s_maps[nmaps2].output = 1;
+		} else {
 	    G_strcpy(s_maps[nmaps2].name, map);
-	    s_maps[nmaps2].output=0;
-				}
+	    s_maps[nmaps2].output = 0;
+		}
 	    s_maps[nmaps2].position = position;
 	    s_maps[nmaps2].nsets = get_nsets(fd, position);
-	    
 
+
 	    if (!s_maps[nmaps2].nsets)
 		G_warning(_("map <%s> has no rules"), s_maps[nmaps2].name);
 

Modified: grass-addons/grass6/raster/r.fuzzy.system/rule_parser.c
===================================================================
--- grass-addons/grass6/raster/r.fuzzy.system/rule_parser.c	2013-06-17 07:31:16 UTC (rev 56747)
+++ grass-addons/grass6/raster/r.fuzzy.system/rule_parser.c	2013-06-17 07:32:05 UTC (rev 56748)
@@ -49,9 +49,9 @@
 	/* next rule */
     }
 
-			for (i = 0; i < nrules; ++i)
-		G_free(rules[i]);
-		G_free(rules);
+    for (i = 0; i < nrules; ++i)
+	G_free(rules[i]);
+    G_free(rules);
     fclose(fd);
     return 0;
 

Modified: grass-addons/grass6/raster/r.fuzzy.system/system.c
===================================================================
--- grass-addons/grass6/raster/r.fuzzy.system/system.c	2013-06-17 07:31:16 UTC (rev 56747)
+++ grass-addons/grass6/raster/r.fuzzy.system/system.c	2013-06-17 07:32:05 UTC (rev 56748)
@@ -4,6 +4,7 @@
 {
 
     int i, j;
+
     //float *agregate = NULL;
     int set_index;
     float consequent;
@@ -11,13 +12,13 @@
     float max_agregate = 0;
     float result;
 
-    memset(agregate,0,resolution * sizeof(float));
+    memset(agregate, 0, resolution * sizeof(float));
 
     for (j = 0; j < nrules; ++j) {
 	antecedents[j] = parse_expression(j);
 	max_antecedent =
 	    (max_antecedent >
-	     antecedents[j]) ? max_antecedent : antecedents[j]; 
+	     antecedents[j]) ? max_antecedent : antecedents[j];
    }
 
     if (max_antecedent == 0. && !coor_proc)
@@ -27,33 +28,33 @@
 
 	if (defuzzyfication > d_BISECTOR && antecedents[j] < max_antecedent && !coor_proc)
 	    continue;
-	    
-	    set_index = s_rules[j].output_set_index;
 
+	set_index = s_rules[j].output_set_index;
+
 	for (i = 0; i < resolution; ++i) {
-	    
+
 	    consequent = fuzzy(universe[i],
 			       &s_maps[output_index].sets[set_index]);
-	    
+
 	    consequent = (!implication) ? MIN(antecedents[j], consequent) :
 		antecedents[j] * consequent;
 	    agregate[i] = MAX(agregate[i], consequent);
 	    
 	   max_agregate = (max_agregate > agregate[i]) 
 				? max_agregate : agregate[i];
-	   
 
+
 	    if (coor_proc)
 		visual_output[i][j + 1] = consequent;
 	}
-	
+
     }
     if (coor_proc)
 	for (i = 0; i < resolution; ++i)
 	    visual_output[i][j + 1] = agregate[i];
 
-     result=defuzzify(defuzzyfication, max_agregate);
-     return result;
+    result = defuzzify(defuzzyfication, max_agregate);
+    return result;
 }
 
 float parse_expression(int n)
@@ -140,16 +141,16 @@
 		break;
 
 	    case A:		/* accept */
-	
+
 		if (!val_top)
 		    G_fatal_error("Stack error at end, contact autor");
 		return values_stack[val_top];
-	
+
 	    }
 	}
 
     } while (s_rules[n].work_queue[i++] != t_STOP);
-    
+
     G_fatal_error("Parse Stack empty, contact autor");
 }
 



More information about the grass-commit mailing list