mask.c 2.0 KB

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