menu.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <grass/gis.h>
  4. #include "list.h"
  5. static int count;
  6. static char **text;
  7. static int first, last;
  8. int menu(int type)
  9. {
  10. int i;
  11. int n;
  12. int x;
  13. char buf[100];
  14. build_menu();
  15. first = 0;
  16. while (1) {
  17. last = first + 30;
  18. if (last > count)
  19. last = count;
  20. G_clear_screen();
  21. switch (type) {
  22. case RENAME:
  23. fprintf(stdout, "RENAME");
  24. break;
  25. case REMOVE:
  26. fprintf(stdout, "REMOVE");
  27. break;
  28. case COPY:
  29. fprintf(stdout, "COPY");
  30. break;
  31. case LIST:
  32. fprintf(stdout, "LIST");
  33. break;
  34. }
  35. fprintf(stdout, " FACILITY\n\n");
  36. fprintf(stdout, "This program allows you to ");
  37. switch (type) {
  38. case RENAME:
  39. fprintf(stdout, "rename files found in your mapset");
  40. break;
  41. case REMOVE:
  42. fprintf(stdout, "remove files found in your mapset");
  43. break;
  44. case COPY:
  45. fprintf(stdout, "copy files from other mapsets into your mapset");
  46. break;
  47. case LIST:
  48. fprintf(stdout, "list files from mapsets in your search path");
  49. break;
  50. }
  51. fprintf(stdout, "\n\n");
  52. fprintf(stdout, "Please select the type of file to be ");
  53. switch (type) {
  54. case RENAME:
  55. fprintf(stdout, "renamed");
  56. break;
  57. case REMOVE:
  58. fprintf(stdout, "removed");
  59. break;
  60. case COPY:
  61. fprintf(stdout, "copied");
  62. break;
  63. case LIST:
  64. fprintf(stdout, "listed");
  65. break;
  66. }
  67. fprintf(stdout, "\n\n");
  68. display_menu();
  69. fprintf(stdout, "\n");
  70. if (first > 0)
  71. fprintf(stdout, " - to see previous menu page\n");
  72. if (last < count)
  73. fprintf(stdout, " + to see next menu page\n");
  74. fprintf(stdout, "RETURN to exit\n\n");
  75. fprintf(stdout, "> ");
  76. if (!G_gets(buf))
  77. continue;
  78. if (*buf == 0) {
  79. free_menu();
  80. return -1;
  81. }
  82. G_strip(buf);
  83. if (first > 0 && strcmp(buf, "-") == 0) {
  84. first -= 30;
  85. if (first < 0)
  86. first = 0;
  87. continue;
  88. }
  89. if (last < count && strcmp(buf, "+") == 0) {
  90. first = last;
  91. continue;
  92. }
  93. if (sscanf(buf, "%d", &x) != 1)
  94. continue;
  95. i = 1;
  96. for (n = 0; n < nlist; n++)
  97. if (list[n].status && (i++ == x)) {
  98. free_menu();
  99. return n;
  100. }
  101. }
  102. }
  103. int build_menu(void)
  104. {
  105. char buf[100];
  106. int n;
  107. count = 0;
  108. text = 0;
  109. for (n = 0; n < nlist; n++)
  110. if (list[n].status) {
  111. sprintf(buf, "%3d %-.30s", ++count, list[n].text);
  112. text = (char **)G_realloc(text, count * sizeof(char *));
  113. text[count - 1] = G_store(buf);
  114. }
  115. return 0;
  116. }
  117. int free_menu(void)
  118. {
  119. while (count-- > 0)
  120. G_free(text[count]);
  121. return 0;
  122. }
  123. int display_menu(void)
  124. {
  125. int left, right;
  126. int i;
  127. left = first;
  128. right = first + 15;
  129. for (i = 0; i < 15; i++) {
  130. if (left >= last)
  131. break;
  132. if (right >= last)
  133. fprintf(stdout, " %-35.35s\n", text[left]);
  134. else
  135. fprintf(stdout, " %-35.35s %-35.35s\n", text[left],
  136. text[right]);
  137. left++;
  138. right++;
  139. }
  140. return 0;
  141. }