stats.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. #include <string.h>
  2. #include <unistd.h>
  3. #include <stdlib.h>
  4. #include <grass/gis.h>
  5. #include <grass/glocale.h>
  6. #include <grass/spawn.h>
  7. #include "global.h"
  8. static int die(void);
  9. int get_stats(void)
  10. {
  11. char buf[1024];
  12. int i, nl, ns;
  13. FILE *fd;
  14. char **tokens;
  15. if (stats_flag == EVERYTHING)
  16. stats_file = G_tempfile();
  17. if (stats_flag != REPORT_ONLY) {
  18. char tmp[50];
  19. int n_argv = 50;
  20. const char **argv = G_calloc(n_argv, sizeof(*argv));
  21. int argc = 0;
  22. argv[argc++] = "r.stats";
  23. argv[argc++] = "-acr";
  24. /* if (!masking) argv[argc++] = "-m"; */
  25. if (G_verbose() == G_verbose_min())
  26. argv[argc++] = "--quiet";
  27. if (no_nulls)
  28. argv[argc++] = "-n";
  29. if (no_nulls_all)
  30. argv[argc++] = "-N";
  31. if (as_int)
  32. argv[argc++] = "-i";
  33. if (cat_ranges)
  34. argv[argc++] = "-C";
  35. else if (nsteps != 255) {
  36. sprintf(tmp, "nsteps=%d", nsteps);
  37. argv[argc++] = tmp;
  38. }
  39. argv[argc++] = "separator=:";
  40. argv[argc++] = SF_REDIRECT_FILE;
  41. argv[argc++] = SF_STDOUT;
  42. argv[argc++] = SF_MODE_OUT;
  43. argv[argc++] = stats_file;
  44. if (do_sort == SORT_ASC)
  45. argv[argc++] = "sort=asc";
  46. else if (do_sort == SORT_DESC)
  47. argv[argc++] = "sort=desc";
  48. for (i = 0; i < nlayers; i++) {
  49. char *name = G_fully_qualified_name(layers[i].name, layers[i].mapset);
  50. char *buf = G_malloc(6 + strlen(name) + 1);
  51. sprintf(buf, "input=%s", name);
  52. G_free(name);
  53. if (argc + 1 >= n_argv) {
  54. n_argv += 50;
  55. argv = G_realloc(argv, n_argv * sizeof(*argv));
  56. }
  57. argv[argc++] = buf;
  58. }
  59. argv[argc++] = NULL;
  60. if (G_vspawn_ex(argv[0], argv) != 0) {
  61. remove(stats_file);
  62. G_fatal_error("error running r.stats");
  63. }
  64. }
  65. if (stats_flag == STATS_ONLY)
  66. return 0;
  67. fd = fopen(stats_file, "r");
  68. if (fd == NULL) {
  69. if (stats_flag == EVERYTHING)
  70. unlink(stats_file);
  71. G_fatal_error(_("Unable to open result file <%s>"), stats_file);
  72. }
  73. while (G_getl(buf, sizeof buf, fd)) {
  74. tokens = G_tokenize(buf, ":");
  75. i = 0;
  76. ns = nstats++;
  77. Gstats = (GSTATS *) G_realloc(Gstats, nstats * sizeof(GSTATS));
  78. Gstats[ns].cats = (CELL *) G_calloc(nlayers, sizeof(long));
  79. for (nl = 0; nl < nlayers; nl++) {
  80. if (sscanf(tokens[i], "%d", &Gstats[ns].cats[nl]) != 1) {
  81. if (tokens[i][0] == '*')
  82. Rast_set_c_null_value(&Gstats[ns].cats[nl], 1);
  83. else
  84. die();
  85. }
  86. i++;
  87. }
  88. if (sscanf(tokens[i++], "%lf", &Gstats[ns].area) != 1)
  89. die();
  90. if (sscanf(tokens[i++], "%ld", &Gstats[ns].count) != 1)
  91. die();
  92. G_free_tokens(tokens);
  93. }
  94. fclose(fd);
  95. if (stats_flag == EVERYTHING)
  96. unlink(stats_file);
  97. return 0;
  98. }
  99. static int die(void)
  100. {
  101. if (stats_flag == EVERYTHING)
  102. unlink(stats_file);
  103. G_fatal_error(_("Problem reading r.stats output"));
  104. }