add missing typecheck typemap for argc,argv

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@8901 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Marcelo Matus 2006-02-27 03:00:26 +00:00
commit eb3369a76b
3 changed files with 56 additions and 34 deletions

View file

@ -16,5 +16,8 @@ const char* mainv(size_t argc, const char **argv, int idx)
return argv[idx]; return argv[idx];
} }
void initializeApp(size_t argc, const char **argv, bool setPGid = true, bool isMakeline = false)
{
}
%} %}

View file

@ -22,3 +22,6 @@ except TypeError:
if error: if error:
raise RuntimeError, "bad main typemap" raise RuntimeError, "bad main typemap"
initializeApp(largs)

View file

@ -3,47 +3,58 @@
* ------------------------------------------------------------ */ * ------------------------------------------------------------ */
%fragment("SWIG_AsArgcArgv","header",fragment="SWIG_AsCharPtrAndSize") { %fragment("SWIG_AsArgcArgv","header",fragment="SWIG_AsCharPtrAndSize") {
SWIGINTERN char** SWIGINTERN int
SWIG_AsArgcArgv(PyObject* input, SWIG_AsArgcArgv(PyObject *input,
swig_type_info* ppchar_info, swig_type_info *ppchar_info,
size_t* argc, int* owner) size_t *argc, char ***argv, int *owner)
{ {
char **argv = 0; void *vptr;
size_t i = 0; int res = SWIG_ConvertPtr(input, &vptr, ppchar_info, 0);
if (SWIG_ConvertPtr(input, (void **)&argv, ppchar_info, 0) != SWIG_OK) { if (!SWIG_IsOK(res)) {
int list = 0; int list = 0;
PyErr_Clear(); PyErr_Clear();
list = PyList_Check(input); list = PyList_Check(input);
if (list || PyTuple_Check(input)) { if (list || PyTuple_Check(input)) {
*argc = list ? PyList_Size(input) : PyTuple_Size(input); size_t i = 0;
argv = %new_array(*argc + 1, char*); size_t size = list ? PyList_Size(input) : PyTuple_Size(input);
*owner = 1; if (argc) *argc = size;
for (; i < *argc; ++i) { if (argv) {
PyObject *obj = list ? PyList_GetItem(input,i) : PyTuple_GetItem(input,i); *argv = %new_array(size + 1, char*);
char *cptr = 0; size_t size = 0; int alloc = 0; for (; i < size; ++i) {
if (SWIG_AsCharPtrAndSize(obj, &cptr, &size, &alloc) == SWIG_OK) { PyObject *obj = list ? PyList_GetItem(input,i) : PyTuple_GetItem(input,i);
if (cptr && size) { char *cptr = 0; size_t size = 0; int alloc = 0;
argv[i] = (alloc == SWIG_NEWOBJ) ? cptr : %new_copy_array(cptr, size, char); res = SWIG_AsCharPtrAndSize(obj, &cptr, &size, &alloc);
if (SWIG_IsOK(res)) {
if (cptr && size) {
(*argv)[i] = (alloc == SWIG_NEWOBJ) ? cptr : %new_copy_array(cptr, size, char);
} else {
(*argv)[i] = 0;
}
} else { } else {
argv[i] = 0; return SWIG_TypeError;
} }
} else { }
SWIG_Error(SWIG_TypeError,"list or tuple must contain strings only"); (*argv)[i] = 0;
} if (owner) *owner = 1;
} else {
for (; i < size; ++i) {
PyObject *obj = list ? PyList_GetItem(input,i) : PyTuple_GetItem(input,i);
res = SWIG_AsCharPtrAndSize(obj, 0, 0, 0);
if (!SWIG_IsOK(res)) return SWIG_TypeError;
}
if (owner) *owner = 0;
} }
argv[i] = 0; return SWIG_OK;
return argv;
} else { } else {
*argc = 0; return SWIG_TypeError;
SWIG_Error(SWIG_TypeError,"a list or tuple is expected");
return 0;
} }
} else { } else {
/* seems dangerous, but the user asked for it... */ /* seems dangerous, but the user asked for it... */
while (argv[i] != 0) ++i; size_t i = 0;
*argc = i; if (argv) { while (*argv[i] != 0) ++i;}
owner = 0; if (argc) *argc = i;
return argv; if (owner) *owner = 0;
return SWIG_OK;
} }
} }
} }
@ -53,17 +64,22 @@ SWIG_AsArgcArgv(PyObject* input,
tuple tuple
*/ */
%typemap(in,noblock=0,fragment="SWIG_AsArgcArgv") (int ARGC, char **ARGV) (char **argv = 0, size_t argc = 0, int owner= 0) { %typemap(in,noblock=0,fragment="SWIG_AsArgcArgv") (int ARGC, char **ARGV) (int res,char **argv = 0, size_t argc = 0, int owner= 0) {
argv = SWIG_AsArgcArgv($input, $descriptor(char**), &argc, &owner); res = SWIG_AsArgcArgv($input, $descriptor(char**), &argc, &argv, &owner);
if (!argv) { if (!SWIG_IsOK(res)) {
$1 = 0; $2 = 0; $1 = 0; $2 = 0;
%argument_fail(SWIG_TypeError, "int ARGC, char **ARGV", $symname, $argnum); %argument_fail(SWIG_TypeError, "int ARGC, char **ARGV", $symname, $argnum);
} else { } else {
$1 = ($1_ltype) argc; $1 = %static_cast(argc,$1_ltype);
$2 = ($2_ltype) argv; $2 = %static_cast(argv, $2_ltype);
} }
} }
%typemap(typecheck, precedence=SWIG_TYPECHECK_STRING_ARRAY) (int ARGC, char **ARGV) {
int res = SWIG_AsArgcArgv($input, $descriptor(char**), 0, 0, 0);
$1 = SWIG_IsOK(res);
}
%typemap(freearg,noblock=1) (int ARGC, char **ARGV) { %typemap(freearg,noblock=1) (int ARGC, char **ARGV) {
if (owner$argnum) { if (owner$argnum) {
size_t i = argc$argnum; size_t i = argc$argnum;