Merge pull request #2708 from mesonbuild/nirbheek/windows-shebang-parsing
dependencies: Fix parsing of shebangs with spacespull/2411/merge
commit
ecba22965d
5 changed files with 101 additions and 1 deletions
@ -0,0 +1 @@ |
|||||||
|
some stuff here |
@ -0,0 +1,72 @@ |
|||||||
|
#include <stdio.h> |
||||||
|
#include <fcntl.h> |
||||||
|
#include <errno.h> |
||||||
|
#include <string.h> |
||||||
|
#include <stdlib.h> |
||||||
|
#include <sys/types.h> |
||||||
|
|
||||||
|
#ifdef _WIN32 |
||||||
|
#include <io.h> |
||||||
|
#include <windows.h> |
||||||
|
#else |
||||||
|
#include <unistd.h> |
||||||
|
#endif |
||||||
|
|
||||||
|
/* Who cares about stack sizes in test programs anyway */ |
||||||
|
#define LINE_LENGTH 4096 |
||||||
|
|
||||||
|
static int |
||||||
|
intrp_copyfile (char * src, char * dest) |
||||||
|
{ |
||||||
|
#ifdef _WIN32 |
||||||
|
if (!CopyFile (src, dest, FALSE)) |
||||||
|
return 1; |
||||||
|
return 0; |
||||||
|
#else |
||||||
|
return execlp ("cp", "copyfile", src, dest, NULL); |
||||||
|
#endif |
||||||
|
} |
||||||
|
|
||||||
|
static void |
||||||
|
parser_get_line (FILE * f, char line[LINE_LENGTH]) |
||||||
|
{ |
||||||
|
if (!fgets (line, LINE_LENGTH, f)) |
||||||
|
fprintf (stderr, "%s\n", strerror (errno)); |
||||||
|
} |
||||||
|
|
||||||
|
int |
||||||
|
main (int argc, char * argv[]) |
||||||
|
{ |
||||||
|
FILE *f = NULL; |
||||||
|
char line[LINE_LENGTH]; |
||||||
|
|
||||||
|
if (argc != 4) { |
||||||
|
fprintf (stderr, "Invalid number of arguments: %i\n", argc); |
||||||
|
goto err; |
||||||
|
} |
||||||
|
|
||||||
|
if ((f = fopen (argv[1], "r")) == NULL) { |
||||||
|
fprintf (stderr, "%s\n", strerror (errno)); |
||||||
|
goto err; |
||||||
|
} |
||||||
|
|
||||||
|
parser_get_line (f, line); |
||||||
|
|
||||||
|
if (!line || line[0] != '#' || line[1] != '!') { |
||||||
|
fprintf (stderr, "Invalid script\n"); |
||||||
|
goto err; |
||||||
|
} |
||||||
|
|
||||||
|
parser_get_line (f, line); |
||||||
|
|
||||||
|
if (!line || strncmp (line, "copy", 4) != 0) { |
||||||
|
fprintf (stderr, "Syntax error: %s\n", line); |
||||||
|
goto err; |
||||||
|
} |
||||||
|
|
||||||
|
return intrp_copyfile (argv[2], argv[3]); |
||||||
|
|
||||||
|
err: |
||||||
|
fclose (f); |
||||||
|
return 1; |
||||||
|
} |
@ -0,0 +1,21 @@ |
|||||||
|
project('shebang parsing', 'c') |
||||||
|
|
||||||
|
interpreter = executable('aninterp', 'main.c', native : true) |
||||||
|
|
||||||
|
cdata = configuration_data() |
||||||
|
cdata.set('INTRP', interpreter.full_path()) |
||||||
|
|
||||||
|
f = configure_file(input : 'script.int.in', |
||||||
|
output : 'script.int', |
||||||
|
configuration : cdata) |
||||||
|
|
||||||
|
# Test that parsing a shebang with spaces works properly. See `man execve`, |
||||||
|
# specifically the section on "Interpreter scripts" and the one under "NOTES". |
||||||
|
script = find_program(f) |
||||||
|
|
||||||
|
custom_target('interpthis', |
||||||
|
input : 'input.txt', |
||||||
|
output : 'output.txt', |
||||||
|
depends : interpreter, |
||||||
|
command : [script, '@INPUT@', '@OUTPUT@'], |
||||||
|
build_by_default : true) |
@ -0,0 +1,2 @@ |
|||||||
|
#!/usr/bin/env @INTRP@ |
||||||
|
copy |
Loading…
Reference in new issue