1 #include <stdlib.h>
2 #include <string.h>
3 #include <unistd.h>
4 #include <grass/gis.h>
5 #include <grass/spawn.h>
6 #include "kappa.h"
7 #include <grass/glocale.h>
8 #include "local_proto.h"
9 
10 
die(void)11 static void die(void)
12 {
13     unlink(stats_file);
14     G_fatal_error(_("Problem reading r.stats output"));
15 }
16 
17 
stats(void)18 int stats(void)
19 {
20     char buf[1024];
21     char mname[GNAME_MAX], rname[GNAME_MAX];
22     const char *mmapset, *rmapset;
23     int i, nl;
24     size_t ns;
25     FILE *fd;
26     char **tokens;
27     const char *argv[9];
28     int argc = 0;
29 
30     strcpy(mname, maps[1]);
31     mmapset = G_find_raster2(mname, "");
32     if (mmapset == NULL)
33 	G_fatal_error(_("Raster map <%s> not found"), maps[0]);
34 
35     strcpy(rname, maps[0]);
36     rmapset = G_find_raster2(rname, "");
37     if (rmapset == NULL)
38 	G_fatal_error(_("Raster map <%s> not found"), maps[1]);
39 
40     stats_file = G_tempfile();
41 
42     argv[argc++] = "r.stats";
43 
44     argv[argc++] = "-cin";
45 
46     argv[argc++] = "separator=:";
47 
48     sprintf(buf, "input=%s,%s",
49 	    G_fully_qualified_name(mname, mmapset),
50 	    G_fully_qualified_name(rname, rmapset));
51     argv[argc++] = buf;
52 
53     argv[argc++] = SF_REDIRECT_FILE;
54     argv[argc++] = SF_STDOUT;
55     argv[argc++] = SF_MODE_OUT;
56     argv[argc++] = stats_file;
57 
58     argv[argc++] = NULL;
59 
60     if (G_vspawn_ex(argv[0], argv) != 0) {
61 	remove(stats_file);
62 	G_fatal_error("error running r.stats");
63     }
64 
65     fd = fopen(stats_file, "r");
66     if (fd == NULL) {
67 	unlink(stats_file);
68 	sprintf(buf, "Unable to open result file <%s>\n", stats_file);
69     }
70 
71     while (G_getl(buf, sizeof buf, fd)) {
72 	tokens = G_tokenize(buf, ":");
73 	i = 0;
74 	ns = nstats++;
75 	Gstats = (GSTATS *) G_realloc(Gstats, nstats * sizeof(GSTATS));
76 	Gstats[ns].cats = (long *)G_calloc(nlayers, sizeof(long));
77 	for (nl = 0; nl < nlayers; nl++) {
78 	    if (sscanf(tokens[i++], "%ld", &Gstats[ns].cats[nl]) != 1)
79 		die();
80 	}
81 	if (sscanf(tokens[i++], "%ld", &Gstats[ns].count) != 1)
82 	    die();
83 	G_free_tokens(tokens);
84     }
85     fclose(fd);
86     unlink(stats_file);
87 
88     return 0;
89 }
90