stats.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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. static void die(void)
  10. {
  11. unlink(stats_file);
  12. G_fatal_error(_("Problem reading r.stats output"));
  13. }
  14. int stats(void)
  15. {
  16. char buf[1024];
  17. char mname[GNAME_MAX], rname[GMAPSET_MAX];
  18. const char *mmapset, *rmapset;
  19. int i, nl;
  20. size_t ns;
  21. FILE *fd;
  22. char **tokens;
  23. const char *argv[9];
  24. int argc = 0;
  25. strcpy(mname, maps[0]);
  26. mmapset = G_find_raster2(mname, "");
  27. if (mmapset == NULL)
  28. G_fatal_error(_("Raster map <%s> not found"), maps[0]);
  29. strcpy(rname, maps[1]);
  30. rmapset = G_find_raster2(rname, "");
  31. if (rmapset == NULL)
  32. G_fatal_error(_("Raster map <%s> not found"), maps[1]);
  33. stats_file = G_tempfile();
  34. argv[argc++] = "r.stats";
  35. argv[argc++] = "-cin";
  36. argv[argc++] = "separator=:";
  37. sprintf(buf, "input=%s,%s",
  38. G_fully_qualified_name(maps[1], mmapset),
  39. G_fully_qualified_name(maps[0], rmapset));
  40. argv[argc++] = buf;
  41. argv[argc++] = SF_REDIRECT_FILE;
  42. argv[argc++] = SF_STDOUT;
  43. argv[argc++] = SF_MODE_OUT;
  44. argv[argc++] = stats_file;
  45. argv[argc++] = NULL;
  46. if (G_vspawn_ex(argv[0], argv) != 0) {
  47. remove(stats_file);
  48. G_fatal_error("error running r.stats");
  49. }
  50. fd = fopen(stats_file, "r");
  51. if (fd == NULL) {
  52. unlink(stats_file);
  53. sprintf(buf, "Unable to open result file <%s>\n", stats_file);
  54. }
  55. while (G_getl(buf, sizeof buf, fd)) {
  56. tokens = G_tokenize(buf, ":");
  57. i = 0;
  58. ns = nstats++;
  59. Gstats = (GSTATS *) G_realloc(Gstats, nstats * sizeof(GSTATS));
  60. Gstats[ns].cats = (long *)G_calloc(nlayers, sizeof(long));
  61. for (nl = 0; nl < nlayers; nl++) {
  62. if (sscanf(tokens[i++], "%ld", &Gstats[ns].cats[nl]) != 1)
  63. die();
  64. }
  65. if (sscanf(tokens[i++], "%ld", &Gstats[ns].count) != 1)
  66. die();
  67. G_free_tokens(tokens);
  68. }
  69. fclose(fd);
  70. unlink(stats_file);
  71. return 0;
  72. }