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
This commit is contained in:
Olly Betts 2022-03-08 18:15:18 +13:00
parent 663299281e
commit f8a766295c
3 changed files with 36 additions and 7 deletions

View File

@ -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

View File

@ -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)

View File

@ -741,14 +741,35 @@ static String *get_options(String *str) {
opt = NewString("(");
while (((c = Getc(str)) != EOF)) {
Putc(c, opt);
if (c == ')') {
switch (c) {
case ')':
level--;
if (!level)
return opt;
}
if (c == '(')
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;
}
}
bad:
Delete(opt);
return 0;
} else {