#include #include #include #include "list.h" static int count; static char **text; static int first, last; int menu(int type) { int i; int n; int x; char buf[100]; build_menu(); first = 0; while (1) { last = first + 30; if (last > count) last = count; G_clear_screen(); switch (type) { case RENAME: fprintf(stdout, "RENAME"); break; case REMOVE: fprintf(stdout, "REMOVE"); break; case COPY: fprintf(stdout, "COPY"); break; case LIST: fprintf(stdout, "LIST"); break; } fprintf(stdout, " FACILITY\n\n"); fprintf(stdout, "This program allows you to "); switch (type) { case RENAME: fprintf(stdout, "rename files found in your mapset"); break; case REMOVE: fprintf(stdout, "remove files found in your mapset"); break; case COPY: fprintf(stdout, "copy files from other mapsets into your mapset"); break; case LIST: fprintf(stdout, "list files from mapsets in your search path"); break; } fprintf(stdout, "\n\n"); fprintf(stdout, "Please select the type of file to be "); switch (type) { case RENAME: fprintf(stdout, "renamed"); break; case REMOVE: fprintf(stdout, "removed"); break; case COPY: fprintf(stdout, "copied"); break; case LIST: fprintf(stdout, "listed"); break; } fprintf(stdout, "\n\n"); display_menu(); fprintf(stdout, "\n"); if (first > 0) fprintf(stdout, " - to see previous menu page\n"); if (last < count) fprintf(stdout, " + to see next menu page\n"); fprintf(stdout, "RETURN to exit\n\n"); fprintf(stdout, "> "); if (!G_gets(buf)) continue; if (*buf == 0) { free_menu(); return -1; } G_strip(buf); if (first > 0 && strcmp(buf, "-") == 0) { first -= 30; if (first < 0) first = 0; continue; } if (last < count && strcmp(buf, "+") == 0) { first = last; continue; } if (sscanf(buf, "%d", &x) != 1) continue; i = 1; for (n = 0; n < nlist; n++) if (list[n].status && (i++ == x)) { free_menu(); return n; } } } int build_menu(void) { char buf[100]; int n; count = 0; text = 0; for (n = 0; n < nlist; n++) if (list[n].status) { sprintf(buf, "%3d %-.30s", ++count, list[n].text); text = (char **)G_realloc(text, count * sizeof(char *)); text[count - 1] = G_store(buf); } return 0; } int free_menu(void) { while (count-- > 0) G_free(text[count]); return 0; } int display_menu(void) { int left, right; int i; left = first; right = first + 15; for (i = 0; i < 15; i++) { if (left >= last) break; if (right >= last) fprintf(stdout, " %-35.35s\n", text[left]); else fprintf(stdout, " %-35.35s %-35.35s\n", text[left], text[right]); left++; right++; } return 0; }