From 8f0beedbee985a73dc01e2f430311a69c8cebbd0 Mon Sep 17 00:00:00 2001 From: wsfulton Date: Thu, 17 Mar 2011 07:33:05 +0000 Subject: [PATCH] Fix regression introduced in swig-2.0.2 where filenames with spaces were not found when used with %include and %import git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@12546 626c5289-ae23-0410-ae9c-e8d60b6d4f22 Signed-off-by: Adam Tkac --- CHANGES.current | 4 ++ Examples/test-suite/preproc_include.i | 19 +++++++++ Examples/test-suite/preproc_include_d withspace.h | 3 + Examples/test-suite/preproc_include_e withspace.h | 3 + Examples/test-suite/preproc_include_f withspace.h | 3 + Examples/test-suite/preproc_include_g.h | 3 + .../test-suite/python/preproc_include_runme.py | 12 ++++++ Source/Preprocessor/cpp.c | 41 ++++++++++--------- 8 files changed, 69 insertions(+), 19 deletions(-) create mode 100644 Examples/test-suite/preproc_include_d withspace.h create mode 100644 Examples/test-suite/preproc_include_e withspace.h create mode 100644 Examples/test-suite/preproc_include_f withspace.h create mode 100644 Examples/test-suite/preproc_include_g.h diff --git a/Examples/test-suite/preproc_include.i b/Examples/test-suite/preproc_include.i index c6b08b5..86c5f71 100644 --- a/Examples/test-suite/preproc_include.i +++ b/Examples/test-suite/preproc_include.i @@ -6,6 +6,8 @@ int multiply10(int a) { return a*10; } int multiply20(int a) { return a*20; } int multiply30(int a) { return a*30; } +int multiply40(int a) { return a*40; } +int multiply50(int a) { return a*50; } %} #define INCLUDE_B preproc_include_b.h @@ -16,3 +18,20 @@ int multiply30(int a) { return a*30; } // Note that this test uses -includeall, so including preproc_include_b.h also includes preproc_include_c.h %include INCLUDE_B +%include"preproc_include_d withspace.h" + +#define INCLUDE_E "preproc_include_e withspace.h" + +%include INCLUDE_E + +%inline %{ +#define INCLUDE_F /*comments*/ "preproc_include_f withspace.h"/*testing*/ +#include INCLUDE_F +#include /*oooo*/"preproc_include_g.h"/*ahhh*/ +%} + +%{ +int multiply60(int a) { return a*60; } +int multiply70(int a) { return a*70; } +%} + diff --git a/Examples/test-suite/preproc_include_d withspace.h b/Examples/test-suite/preproc_include_d withspace.h new file mode 100644 index 0000000..142ddd5 --- /dev/null +++ b/Examples/test-suite/preproc_include_d withspace.h @@ -0,0 +1,3 @@ + +int multiply40(int a); + diff --git a/Examples/test-suite/preproc_include_e withspace.h b/Examples/test-suite/preproc_include_e withspace.h new file mode 100644 index 0000000..d749765 --- /dev/null +++ b/Examples/test-suite/preproc_include_e withspace.h @@ -0,0 +1,3 @@ + +int multiply50(int a); + diff --git a/Examples/test-suite/preproc_include_f withspace.h b/Examples/test-suite/preproc_include_f withspace.h new file mode 100644 index 0000000..8a39a34 --- /dev/null +++ b/Examples/test-suite/preproc_include_f withspace.h @@ -0,0 +1,3 @@ + +int multiply60(int a); + diff --git a/Examples/test-suite/preproc_include_g.h b/Examples/test-suite/preproc_include_g.h new file mode 100644 index 0000000..db4f914 --- /dev/null +++ b/Examples/test-suite/preproc_include_g.h @@ -0,0 +1,3 @@ + +int multiply70(int a); + diff --git a/Examples/test-suite/python/preproc_include_runme.py b/Examples/test-suite/python/preproc_include_runme.py index e156065..778de3c 100644 --- a/Examples/test-suite/python/preproc_include_runme.py +++ b/Examples/test-suite/python/preproc_include_runme.py @@ -9,3 +9,15 @@ if preproc_include.multiply20(10) != 200: if preproc_include.multiply30(10) != 300: raise RuntimeError +if preproc_include.multiply40(10) != 400: + raise RuntimeError + +if preproc_include.multiply50(10) != 500: + raise RuntimeError + +if preproc_include.multiply60(10) != 600: + raise RuntimeError + +if preproc_include.multiply70(10) != 700: + raise RuntimeError + diff --git a/Source/Preprocessor/cpp.c b/Source/Preprocessor/cpp.c index 752c95e..8d2346c 100644 --- a/Source/Preprocessor/cpp.c +++ b/Source/Preprocessor/cpp.c @@ -93,8 +93,6 @@ static String *cpp_include(const_String_or_char_ptr fn, int sysfile) { Setattr(included_files, file, file); } if (!s) { - /* XXX(bhy) may not need the seek */ - /* Seek(fn, 0, SEEK_SET); */ if (ignore_missing) { Swig_warning(WARN_PP_MISSING_FILE, Getfile(fn), Getline(fn), "Unable to find '%s'\n", fn); } else { @@ -665,11 +663,30 @@ static String *get_filename(String *str, int *sysfile) { while (((c = Getc(str)) != EOF) && (c != '>')) Putc(c, fn); } else { + String *preprocessed_str; Putc(c, fn); while (((c = Getc(str)) != EOF) && (!isspace(c))) Putc(c, fn); if (isspace(c)) Ungetc(c, str); + preprocessed_str = Preprocessor_replace(fn); + Seek(preprocessed_str, 0, SEEK_SET); + Delete(fn); + + fn = NewStringEmpty(); + copy_location(preprocessed_str, fn); + c = Getc(preprocessed_str); + if (c == '\"') { + while (((c = Getc(preprocessed_str)) != EOF) && (c != '\"')) + Putc(c, fn); + } else if (c == '<') { + *sysfile = 1; + while (((c = Getc(preprocessed_str)) != EOF) && (c != '>')) + Putc(c, fn); + } else { + fn = Copy(preprocessed_str); + } + Delete(preprocessed_str); } Swig_filename_unescape(fn); Swig_filename_correct(fn); @@ -1689,14 +1706,12 @@ String *Preprocessor_parse(String *s) { String *s1, *s2, *fn; char *dirname; int sysfile = 0; - String *filename_processed; if (include_all && import_all) { Swig_warning(WARN_PP_INCLUDEALL_IMPORTALL, Getfile(s), Getline(id), "Both includeall and importall are defined: using includeall.\n"); import_all = 0; } - filename_processed = Preprocessor_replace(value); - Seek(filename_processed, 0, SEEK_SET); - fn = get_filename(filename_processed, &sysfile); + Seek(value, 0, SEEK_SET); + fn = get_filename(value, &sysfile); s1 = cpp_include(fn, sysfile); if (s1) { if (include_all) @@ -1827,8 +1842,6 @@ String *Preprocessor_parse(String *s) { DOH *s1, *s2, *fn, *opt; String *options_whitespace = NewStringEmpty(); String *filename_whitespace = NewStringEmpty(); - String *filename_unprocessed = NewStringEmpty(); - String *filename_processed; int sysfile = 0; if (Equal(decl, kpp_dextern)) { @@ -1840,15 +1853,7 @@ String *Preprocessor_parse(String *s) { opt = get_options(s); skip_whitespace(s, filename_whitespace); - copy_location(s, filename_unprocessed); - while (((c = Getc(s)) != EOF) && (!isspace(c))) - Putc(c, filename_unprocessed); - if (isspace(c)) - Ungetc(c, s); - filename_processed = Preprocessor_replace(filename_unprocessed); - Seek(filename_processed, 0, SEEK_SET); - - fn = get_filename(filename_processed, &sysfile); + fn = get_filename(s, &sysfile); s1 = cpp_include(fn, sysfile); if (s1) { char *dirname; @@ -1878,8 +1883,6 @@ String *Preprocessor_parse(String *s) { Delete(s1); } Delete(fn); - Delete(filename_processed); - Delete(filename_unprocessed); Delete(filename_whitespace); Delete(options_whitespace); } -- 1.7.4.2