#include #include static char *append(char *, char *); static int do_text(char *,long,long); static int reclass_text(char *,struct Reclass *,int); char * maskinfo (void) { struct Reclass reclass; char *results; char text[100]; int next; int first; char *append(); results = NULL; if (G_find_cell ("MASK", G_mapset()) == NULL) return "none" ; if (G_get_reclass ("MASK", G_mapset(), &reclass) <= 0) { sprintf (text, "MASK in %s", G_mapset()); return append(results, text); } sprintf (text, "%s in %s", reclass.name, reclass.mapset); results = append (results, text); next = 0; first = 1; do { next = reclass_text (text, &reclass, next); if (*text == 0) break; if (first) { first = 0; results = append (results, ", categories"); } results = append (results, " "); results = append (results, text); } while (next >= 0); G_free_reclass (&reclass); return results; } static int reclass_text (char *text,struct Reclass *reclass, int next) { int i; int n; int first; *text = 0; n = reclass->num ; first = -1; for (i = next; i < n; i++) { if (reclass->table[i]) { if (first < 0) first = i; } else if (first >= 0) { do_text (text, (long)(first+reclass->min),(long)(i-1+reclass->min)); first = -1; if (strlen (text) > 60) return i; } } if (first >= 0) do_text (text, (long)(first+reclass->min), (long)(i-1+reclass->min)); return -1; } static int do_text(char *text,long first,long last) { char work[40]; if (*text) strcat (text, " "); if (first == last) sprintf (work, "%ld", first); else sprintf (work, "%ld-%ld", first, last); strcat (text, work); return 0; } static char *append ( char *results, char *text) { if (results == NULL) return G_store (text); results = G_realloc (results, strlen(results)+strlen(text)+1); strcat (results, text); return results; }