construct_pattern.c 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #include <string.h>
  2. #include <grass/gis.h>
  3. #include <grass/glocale.h>
  4. char *construct_pattern(char **names)
  5. {
  6. char *pattern, *p;
  7. int i, j, len, found_illegal_names;
  8. const char *mapset;
  9. char xname[GNAME_MAX], xmapset[GMAPSET_MAX];
  10. len = 0;
  11. for (i = 0; names[i]; i++) {
  12. if ((p = strchr(names[i], '@')))
  13. len += p - names[i];
  14. else
  15. len += strlen(names[i]);
  16. /* make room for escaping special characters */
  17. for (j = 0; names[i][j]; j++)
  18. len += !isalnum(names[i][j]);
  19. }
  20. len += i; /* # names - 1 commas + \0 */
  21. pattern = p = (char *)G_malloc(len);
  22. mapset = G_mapset();
  23. found_illegal_names = 0;
  24. for (i = 0; names[i]; i++) {
  25. char *name;
  26. name = names[i];
  27. if (G_name_is_fully_qualified(name, xname, xmapset)) {
  28. if (strcmp(xmapset, mapset) != 0)
  29. G_fatal_error(_("%s: Cannot remove or exclude files not in "
  30. "the current mapset."), name);
  31. name = xname;
  32. }
  33. if (G_legal_filename(name) == -1)
  34. found_illegal_names = 1;
  35. if (i)
  36. *p++ = ',';
  37. for (j = 0; name[j]; j++) {
  38. if (!isalnum(name[j]))
  39. *p++ = '\\';
  40. *p++ = name[j];
  41. }
  42. }
  43. *p = '\0';
  44. if (found_illegal_names)
  45. G_fatal_error(_("Illegal filenames not allowed in the names or ignore "
  46. "option."));
  47. return pattern;
  48. }