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