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