maskinfo.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #include <string.h>
  2. #include <grass/gis.h>
  3. #include <grass/raster.h>
  4. static char *append(char *, char *);
  5. static int do_text(char *, long, long);
  6. static int reclass_text(char *, struct Reclass *, int);
  7. char *maskinfo(void)
  8. {
  9. struct Reclass reclass;
  10. char *results;
  11. char text[100];
  12. int next;
  13. int first;
  14. results = NULL;
  15. if (G_find_raster("MASK", G_mapset()) == NULL)
  16. return "none";
  17. if (Rast_get_reclass("MASK", G_mapset(), &reclass) <= 0) {
  18. sprintf(text, "MASK in %s", G_mapset());
  19. return append(results, text);
  20. }
  21. sprintf(text, "%s in %s", reclass.name, reclass.mapset);
  22. results = append(results, text);
  23. next = 0;
  24. first = 1;
  25. do {
  26. next = reclass_text(text, &reclass, next);
  27. if (*text == 0)
  28. break;
  29. if (first) {
  30. first = 0;
  31. results = append(results, ", categories");
  32. }
  33. results = append(results, " ");
  34. results = append(results, text);
  35. }
  36. while (next >= 0);
  37. Rast_free_reclass(&reclass);
  38. return results;
  39. }
  40. static int reclass_text(char *text, struct Reclass *reclass, int next)
  41. {
  42. int i;
  43. int n;
  44. int first;
  45. *text = 0;
  46. n = reclass->num;
  47. first = -1;
  48. for (i = next; i < n; i++) {
  49. if (reclass->table[i]) {
  50. if (first < 0)
  51. first = i;
  52. }
  53. else if (first >= 0) {
  54. do_text(text, (long)(first + reclass->min),
  55. (long)(i - 1 + reclass->min));
  56. first = -1;
  57. if (strlen(text) > 60)
  58. return i;
  59. }
  60. }
  61. if (first >= 0)
  62. do_text(text, (long)(first + reclass->min),
  63. (long)(i - 1 + reclass->min));
  64. return -1;
  65. }
  66. static int do_text(char *text, long first, long last)
  67. {
  68. char work[40];
  69. if (*text)
  70. strcat(text, " ");
  71. if (first == last)
  72. sprintf(work, "%ld", first);
  73. else
  74. sprintf(work, "%ld-%ld", first, last);
  75. strcat(text, work);
  76. return 0;
  77. }
  78. static char *append(char *results, char *text)
  79. {
  80. if (results == NULL)
  81. return G_store(text);
  82. results = G_realloc(results, strlen(results) + strlen(text) + 1);
  83. strcat(results, text);
  84. return results;
  85. }