color_rules.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. /*!
  2. \file lib/gis/color_rules.c
  3. \brief GIS Library - Color tables management subroutines
  4. Taken from r.colors module.
  5. (C) 2001-2011 by the GRASS Development Team
  6. */
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <grass/gis.h>
  10. #include <grass/glocale.h>
  11. static char **scan_rules(int *);
  12. static int cmp(const void *, const void *);
  13. /*!
  14. \brief Get list of color rules for Option->options
  15. \return allocated string buffer with options
  16. */
  17. char *G_color_rules_options(void)
  18. {
  19. char *list, **rules;
  20. const char *name;
  21. int size, len, nrules;
  22. int i, n;
  23. list = NULL;
  24. size = len = 0;
  25. rules = scan_rules(&nrules);
  26. for (i = 0; i < nrules; i++) {
  27. name = rules[i];
  28. n = strlen(name);
  29. if (size < len + n + 2) {
  30. size = len + n + 200;
  31. list = G_realloc(list, size);
  32. }
  33. if (len > 0)
  34. list[len++] = ',';
  35. memcpy(&list[len], name, n + 1);
  36. len += n;
  37. }
  38. G_free(rules);
  39. return list;
  40. }
  41. /*!
  42. \brief Get color rules description for Option->descriptions
  43. \return allocated buffer with descriptions
  44. */
  45. char *G_color_rules_descriptions(void)
  46. {
  47. char path[GPATH_MAX];
  48. struct Key_Value *kv;
  49. int result_len, result_max;
  50. char *result, **rules;
  51. const char *name, *desc;
  52. int i, len, nrules;
  53. result_len = 0;
  54. result_max = 2000;
  55. result = G_malloc(result_max);
  56. G_snprintf(path, GPATH_MAX, "%s/etc/colors.desc", G_gisbase());
  57. kv = G_read_key_value_file(path);
  58. if (!kv)
  59. return NULL;
  60. rules = scan_rules(&nrules);
  61. for (i = 0; i < nrules; i++) {
  62. name = rules[i];
  63. desc = G_find_key_value(name, kv);
  64. if (!desc)
  65. desc = _("no description");
  66. /* desc = _(desc); */
  67. len = strlen(name) + strlen(desc) + 2;
  68. if (result_len + len >= result_max) {
  69. result_max = result_len + len + 1000;
  70. result = G_realloc(result, result_max);
  71. }
  72. sprintf(result + result_len, "%s;%s;", name, desc);
  73. result_len += len;
  74. }
  75. G_free_key_value(kv);
  76. G_free(rules);
  77. return result;
  78. }
  79. char **scan_rules(int *nrules)
  80. {
  81. char **rules;
  82. char path[GPATH_MAX];
  83. G_snprintf(path, GPATH_MAX, "%s/etc/colors", G_gisbase());
  84. rules = G_ls2(path, nrules);
  85. rules = G_realloc(rules, (*nrules + 3) * sizeof (const char *));
  86. rules[(*nrules)++] = G_store("random");
  87. rules[(*nrules)++] = G_store("grey.eq");
  88. rules[(*nrules)++] = G_store("grey.log");
  89. qsort(rules, *nrules, sizeof (char *), cmp);
  90. return rules;
  91. }
  92. int cmp(const void *aa, const void *bb)
  93. {
  94. char *const *a = (char *const *) aa;
  95. char *const *b = (char *const *) bb;
  96. return strcmp(*a, *b);
  97. }
  98. /*!
  99. \brief Print color rules
  100. \param out file where to print
  101. */
  102. void G_list_color_rules(FILE *out)
  103. {
  104. int i, nrules;
  105. char **rules;
  106. rules = scan_rules(&nrules);
  107. for (i = 0; i < nrules; i++)
  108. fprintf(out, "%s\n", rules[i]);
  109. }
  110. /*!
  111. \brief Check if color rule is defined
  112. \param name color rule name
  113. \return 1 found
  114. \return 0 not found
  115. */
  116. int G_find_color_rule(const char *name)
  117. {
  118. int i, nrules;
  119. char **rules;
  120. rules = scan_rules(&nrules);
  121. for (i = 0; i < nrules; i++)
  122. if (strcmp(name, rules[i]) == 0)
  123. return 1;
  124. return 0;
  125. }