diff options
author | Olly Betts <olly@survex.com> | 2022-03-08 18:15:18 +1300 |
---|---|---|
committer | Olly Betts <olly@survex.com> | 2022-03-08 18:15:18 +1300 |
commit | f8a766295ca4104e5d89904cba87c6303f100b50 (patch) | |
tree | 1685b40a6b747b64744c0a4553343b8a85839b8d | |
parent | 663299281ebbadbe78781cc369dafd63c3fa3219 (diff) | |
download | swig-f8a766295ca4104e5d89904cba87c6303f100b50.tar.gz |
Handle `)` in command line interface filename
SWIG now handles an interface filename specified on the command line
which contains a closing parenthesis `)`, and more generally with
attributes to `%include` and `%import` which are quoted and contain
parentheses.
Fixes #1006
-rw-r--r-- | CHANGES.current | 6 | ||||
-rw-r--r-- | Examples/test-suite/import_nomodule.i | 4 | ||||
-rw-r--r-- | Source/Preprocessor/cpp.c | 33 |
3 files changed, 36 insertions, 7 deletions
diff --git a/CHANGES.current b/CHANGES.current index d87daeec6..ce8efe1bf 100644 --- a/CHANGES.current +++ b/CHANGES.current @@ -7,6 +7,12 @@ the issue number to the end of the URL: https://github.com/swig/swig/issues/ Version 4.1.0 (in progress) =========================== +2022-03-08: olly + #1006 SWIG now copes with an interface filename specified on the + command line which contains a closing parenthesis `)`, and more + generally with attributes to `%include` and `%import` which + are quoted and contain parentheses. + 2022-03-07: Omar Medina [Tcl] https://sourceforge.net/p/swig/bugs/1290/ Fix SWIG_AsWCharPtrAndSize() to actually assign to result diff --git a/Examples/test-suite/import_nomodule.i b/Examples/test-suite/import_nomodule.i index 48e119517..2794ad5f3 100644 --- a/Examples/test-suite/import_nomodule.i +++ b/Examples/test-suite/import_nomodule.i @@ -6,7 +6,9 @@ // For Python %warnfilter(SWIGWARN_TYPE_UNDEFINED_CLASS) Bar; // Base class 'Foo' ignored - unknown module name for base. Either import the appropriate module interface file or specify the name of the module in the %import directive. -%import "import_nomodule.h" +// The "dummy=" attribute is a regression test for #1006, fixed in SWIG 4.1.0. +// SWIG didn't used to take quoting into account when finding the closing `)`. +%import(dummy=")foo\"") "import_nomodule.h" #if !defined(SWIGJAVA) && !defined(SWIGRUBY) && !defined(SWIGCSHARP) && !defined(SWIGD) && !defined(SWIGPYTHON_BUILTIN) && !defined(SWIGPHP) diff --git a/Source/Preprocessor/cpp.c b/Source/Preprocessor/cpp.c index 439788b4b..34ace2d77 100644 --- a/Source/Preprocessor/cpp.c +++ b/Source/Preprocessor/cpp.c @@ -741,14 +741,35 @@ static String *get_options(String *str) { opt = NewString("("); while (((c = Getc(str)) != EOF)) { Putc(c, opt); - if (c == ')') { - level--; - if (!level) - return opt; + switch (c) { + case ')': + level--; + if (!level) + return opt; + break; + case '(': + level++; + break; + case '"': + /* Skip over quoted strings */ + while (1) { + c = Getc(str); + if (c == EOF) + goto bad; + Putc(c, opt); + if (c == '"') + break; + if (c == '\\') { + c = Getc(str); + if (c == EOF) + goto bad; + Putc(c, opt); + } + } + break; } - if (c == '(') - level++; } +bad: Delete(opt); return 0; } else { |