alias.c 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #include "cache.h"
  2. static const char *alias_key;
  3. static char *alias_val;
  4. static int alias_lookup_cb(const char *k, const char *v,
  5. void *cb __maybe_unused)
  6. {
  7. if (!prefixcmp(k, "alias.") && !strcmp(k+6, alias_key)) {
  8. if (!v)
  9. return config_error_nonbool(k);
  10. alias_val = strdup(v);
  11. return 0;
  12. }
  13. return 0;
  14. }
  15. char *alias_lookup(const char *alias)
  16. {
  17. alias_key = alias;
  18. alias_val = NULL;
  19. perf_config(alias_lookup_cb, NULL);
  20. return alias_val;
  21. }
  22. int split_cmdline(char *cmdline, const char ***argv)
  23. {
  24. int src, dst, count = 0, size = 16;
  25. char quoted = 0;
  26. *argv = malloc(sizeof(char*) * size);
  27. /* split alias_string */
  28. (*argv)[count++] = cmdline;
  29. for (src = dst = 0; cmdline[src];) {
  30. char c = cmdline[src];
  31. if (!quoted && isspace(c)) {
  32. cmdline[dst++] = 0;
  33. while (cmdline[++src]
  34. && isspace(cmdline[src]))
  35. ; /* skip */
  36. if (count >= size) {
  37. size += 16;
  38. *argv = realloc(*argv, sizeof(char*) * size);
  39. }
  40. (*argv)[count++] = cmdline + dst;
  41. } else if (!quoted && (c == '\'' || c == '"')) {
  42. quoted = c;
  43. src++;
  44. } else if (c == quoted) {
  45. quoted = 0;
  46. src++;
  47. } else {
  48. if (c == '\\' && quoted != '\'') {
  49. src++;
  50. c = cmdline[src];
  51. if (!c) {
  52. free(*argv);
  53. *argv = NULL;
  54. return error("cmdline ends with \\");
  55. }
  56. }
  57. cmdline[dst++] = c;
  58. src++;
  59. }
  60. }
  61. cmdline[dst] = 0;
  62. if (quoted) {
  63. free(*argv);
  64. *argv = NULL;
  65. return error("unclosed quote");
  66. }
  67. return count;
  68. }