script-interpreter.c 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. /* Copyright (c) 1993-2008 by Richard Kelsey and Jonathan Rees.
  2. See file COPYING. */
  3. /* Implementation of SRFI-22-style script interpreters. */
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <errno.h>
  7. #include <unistd.h>
  8. #include <string.h>
  9. #include "sysdep.h"
  10. int
  11. main(int argc, char *argv[])
  12. {
  13. char **new_argv;
  14. char *p, *language_tag;
  15. int i;
  16. if (argc < 2)
  17. {
  18. fprintf(stderr, "usage: %s script arg ...\n", argv[0]);
  19. return EX_USAGE;
  20. }
  21. p = strrchr(argv[0], '/');
  22. p = p ? (p+1) : argv[0];
  23. if (strncmp(p, "scheme-", 7))
  24. {
  25. fprintf(stderr,
  26. "%s: script interpreter name must start with `scheme-'\n",
  27. p);
  28. return EX_USAGE;
  29. }
  30. language_tag = p + 7;
  31. new_argv = (char **)malloc((argc + 4) * sizeof(char *));
  32. if (!new_argv)
  33. {
  34. fprintf(stderr, "%s: out of memory\n", argv[0]);
  35. return EX_SOFTWARE;
  36. }
  37. new_argv[0] = RUNNABLE;
  38. new_argv[1] = "-a";
  39. new_argv[2] = "run-script";
  40. new_argv[3] = language_tag;
  41. for (i = 4; i < argc + 4; ++i)
  42. new_argv[i] = argv[i-3];
  43. new_argv[argc + 3] = NULL;
  44. execv(RUNNABLE, new_argv);
  45. fprintf(stderr,
  46. "%s: exec'ing %s failed (%s)\n",
  47. argv[0], RUNNABLE, strerror(errno));
  48. return EX_SOFTWARE;
  49. }