Fix Fix #1927852 - #include directives don't preprocess the file passed to it
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@12457 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
ac42dd8153
commit
e0ee14c3ba
8 changed files with 72 additions and 7 deletions
|
|
@ -5,6 +5,12 @@ See the RELEASENOTES file for a summary of changes in each release.
|
||||||
Version 2.0.2 (in progress)
|
Version 2.0.2 (in progress)
|
||||||
===========================
|
===========================
|
||||||
|
|
||||||
|
2011-02-13: wsfulton
|
||||||
|
Fix #1927852 #include directives don't preprocess the file passed to it. The fix is for
|
||||||
|
#include with -importall or -includeall, %include and %import, for example:
|
||||||
|
#define FILENAME "abc.h"
|
||||||
|
%include FILENAME
|
||||||
|
|
||||||
2011-02-12: wsfulton
|
2011-02-12: wsfulton
|
||||||
Fix #1940536, overactive preprocessor which was expanding defined(...) outside of #if and #elif
|
Fix #1940536, overactive preprocessor which was expanding defined(...) outside of #if and #elif
|
||||||
preprocessor directives.
|
preprocessor directives.
|
||||||
|
|
|
||||||
|
|
@ -494,6 +494,7 @@ C_TEST_CASES += \
|
||||||
preproc \
|
preproc \
|
||||||
preproc_constants_c \
|
preproc_constants_c \
|
||||||
preproc_defined \
|
preproc_defined \
|
||||||
|
preproc_include \
|
||||||
preproc_line_file \
|
preproc_line_file \
|
||||||
ret_by_value \
|
ret_by_value \
|
||||||
simple_array \
|
simple_array \
|
||||||
|
|
@ -518,6 +519,7 @@ MULTI_CPP_TEST_CASES += \
|
||||||
|
|
||||||
# Custom tests - tests with additional commandline options
|
# Custom tests - tests with additional commandline options
|
||||||
wallkw.cpptest: SWIGOPT += -Wallkw
|
wallkw.cpptest: SWIGOPT += -Wallkw
|
||||||
|
preproc_include.ctest: SWIGOPT += -includeall
|
||||||
|
|
||||||
|
|
||||||
NOT_BROKEN_TEST_CASES = $(CPP_TEST_CASES:=.cpptest) \
|
NOT_BROKEN_TEST_CASES = $(CPP_TEST_CASES:=.cpptest) \
|
||||||
|
|
|
||||||
18
Examples/test-suite/preproc_include.i
Normal file
18
Examples/test-suite/preproc_include.i
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
%module preproc_include
|
||||||
|
|
||||||
|
%{
|
||||||
|
#include "preproc_include_a.h"
|
||||||
|
#include "preproc_include_b.h"
|
||||||
|
int multiply10(int a) { return a*10; }
|
||||||
|
int multiply20(int a) { return a*20; }
|
||||||
|
int multiply30(int a) { return a*30; }
|
||||||
|
%}
|
||||||
|
|
||||||
|
#define INCLUDE_B preproc_include_b.h
|
||||||
|
#define FILE_INCLUDE(FNAME) #FNAME
|
||||||
|
|
||||||
|
%include FILE_INCLUDE(preproc_include_a.h)
|
||||||
|
|
||||||
|
// Note that this test uses -includeall, so including preproc_include_b.h also includes preproc_include_c.h
|
||||||
|
%include INCLUDE_B
|
||||||
|
|
||||||
3
Examples/test-suite/preproc_include_a.h
Normal file
3
Examples/test-suite/preproc_include_a.h
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
|
||||||
|
int multiply10(int a);
|
||||||
|
|
||||||
7
Examples/test-suite/preproc_include_b.h
Normal file
7
Examples/test-suite/preproc_include_b.h
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
|
||||||
|
int multiply20(int a);
|
||||||
|
|
||||||
|
#define PREPROC_INCLUDE_C "preproc_include_c.h"
|
||||||
|
|
||||||
|
#include PREPROC_INCLUDE_C
|
||||||
|
|
||||||
3
Examples/test-suite/preproc_include_c.h
Normal file
3
Examples/test-suite/preproc_include_c.h
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
|
||||||
|
int multiply30(int a);
|
||||||
|
|
||||||
11
Examples/test-suite/python/preproc_include_runme.py
Normal file
11
Examples/test-suite/python/preproc_include_runme.py
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
import preproc_include
|
||||||
|
|
||||||
|
if preproc_include.multiply10(10) != 100:
|
||||||
|
raise RuntimeError
|
||||||
|
|
||||||
|
if preproc_include.multiply20(10) != 200:
|
||||||
|
raise RuntimeError
|
||||||
|
|
||||||
|
if preproc_include.multiply30(10) != 300:
|
||||||
|
raise RuntimeError
|
||||||
|
|
||||||
|
|
@ -643,7 +643,7 @@ unterm:
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -----------------------------------------------------------------------------
|
/* -----------------------------------------------------------------------------
|
||||||
* DOH *get_filename(DOH *str)
|
* DOH *get_filename()
|
||||||
*
|
*
|
||||||
* Read a filename from str. A filename can be enclosed in quotes, angle brackets,
|
* Read a filename from str. A filename can be enclosed in quotes, angle brackets,
|
||||||
* or bare.
|
* or bare.
|
||||||
|
|
@ -1656,12 +1656,14 @@ String *Preprocessor_parse(String *s) {
|
||||||
String *s1, *s2, *fn;
|
String *s1, *s2, *fn;
|
||||||
char *dirname;
|
char *dirname;
|
||||||
int sysfile = 0;
|
int sysfile = 0;
|
||||||
|
String *filename_processed;
|
||||||
if (include_all && import_all) {
|
if (include_all && import_all) {
|
||||||
Swig_warning(WARN_PP_INCLUDEALL_IMPORTALL, Getfile(s), Getline(id), "Both includeall and importall are defined: using includeall\n");
|
Swig_warning(WARN_PP_INCLUDEALL_IMPORTALL, Getfile(s), Getline(id), "Both includeall and importall are defined: using includeall\n");
|
||||||
import_all = 0;
|
import_all = 0;
|
||||||
}
|
}
|
||||||
Seek(value, 0, SEEK_SET);
|
filename_processed = Preprocessor_replace(value);
|
||||||
fn = get_filename(value, &sysfile);
|
Seek(filename_processed, 0, SEEK_SET);
|
||||||
|
fn = get_filename(filename_processed, &sysfile);
|
||||||
s1 = cpp_include(fn, sysfile);
|
s1 = cpp_include(fn, sysfile);
|
||||||
if (s1) {
|
if (s1) {
|
||||||
if (include_all)
|
if (include_all)
|
||||||
|
|
@ -1787,11 +1789,13 @@ String *Preprocessor_parse(String *s) {
|
||||||
Ungetc(c, s);
|
Ungetc(c, s);
|
||||||
/* Look for common SWIG directives */
|
/* Look for common SWIG directives */
|
||||||
if (Equal(decl, kpp_dinclude) || Equal(decl, kpp_dimport) || Equal(decl, kpp_dextern)) {
|
if (Equal(decl, kpp_dinclude) || Equal(decl, kpp_dimport) || Equal(decl, kpp_dextern)) {
|
||||||
/* Got some kind of file inclusion directive */
|
/* Got some kind of file inclusion directive, eg: %import(option1="value1") "filename" */
|
||||||
if (allow) {
|
if (allow) {
|
||||||
DOH *s1, *s2, *fn, *opt;
|
DOH *s1, *s2, *fn, *opt;
|
||||||
String *options_whitespace = NewString("");
|
String *options_whitespace = NewStringEmpty();
|
||||||
String *filename_whitespace = NewString("");
|
String *filename_whitespace = NewStringEmpty();
|
||||||
|
String *filename_unprocessed = NewStringEmpty();
|
||||||
|
String *filename_processed;
|
||||||
int sysfile = 0;
|
int sysfile = 0;
|
||||||
|
|
||||||
if (Equal(decl, kpp_dextern)) {
|
if (Equal(decl, kpp_dextern)) {
|
||||||
|
|
@ -1801,8 +1805,17 @@ String *Preprocessor_parse(String *s) {
|
||||||
}
|
}
|
||||||
skip_whitespace(s, options_whitespace);
|
skip_whitespace(s, options_whitespace);
|
||||||
opt = get_options(s);
|
opt = get_options(s);
|
||||||
|
|
||||||
skip_whitespace(s, filename_whitespace);
|
skip_whitespace(s, filename_whitespace);
|
||||||
fn = get_filename(s, &sysfile);
|
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);
|
||||||
s1 = cpp_include(fn, sysfile);
|
s1 = cpp_include(fn, sysfile);
|
||||||
if (s1) {
|
if (s1) {
|
||||||
char *dirname;
|
char *dirname;
|
||||||
|
|
@ -1832,6 +1845,8 @@ String *Preprocessor_parse(String *s) {
|
||||||
Delete(s1);
|
Delete(s1);
|
||||||
}
|
}
|
||||||
Delete(fn);
|
Delete(fn);
|
||||||
|
Delete(filename_processed);
|
||||||
|
Delete(filename_unprocessed);
|
||||||
Delete(filename_whitespace);
|
Delete(filename_whitespace);
|
||||||
Delete(options_whitespace);
|
Delete(options_whitespace);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue