alias.c 1.4 KB

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