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