1 /* ------------------------------------------------------------ 2 * --- Argc & Argv --- 3 * ------------------------------------------------------------ */ 4 5 %fragment("SWIG_AsArgcArgv","header",fragment="SWIG_AsCharPtrAndSize") { 6 SWIGINTERN int 7 SWIG_AsArgcArgv(PyObject *input, 8 swig_type_info *ppchar_info, 9 size_t *argc, char ***argv, int *owner) 10 { 11 void *vptr; 12 int res = SWIG_ConvertPtr(input, &vptr, ppchar_info, 0); 13 if (!SWIG_IsOK(res)) { 14 int list = 0; 15 PyErr_Clear(); 16 list = PyList_Check(input); 17 if (list || PyTuple_Check(input)) { 18 size_t i = 0; 19 size_t size = list ? PyList_Size(input) : PyTuple_Size(input); 20 if (argc) *argc = size; 21 if (argv) { 22 *argv = %new_array(size + 1, char*); 23 for (; i < size; ++i) { 24 PyObject *obj = list ? PyList_GetItem(input,i) : PyTuple_GetItem(input,i); 25 char *cptr = 0; size_t sz = 0; int alloc = 0; 26 res = SWIG_AsCharPtrAndSize(obj, &cptr, &sz, &alloc); 27 if (SWIG_IsOK(res)) { 28 if (cptr && sz) { 29 (*argv)[i] = (alloc == SWIG_NEWOBJ) ? cptr : %new_copy_array(cptr, sz, char); 30 } else { 31 (*argv)[i] = 0; 32 } 33 } else { 34 return SWIG_TypeError; 35 } 36 } 37 (*argv)[i] = 0; 38 if (owner) *owner = 1; 39 } else { 40 for (; i < size; ++i) { 41 PyObject *obj = list ? PyList_GetItem(input,i) : PyTuple_GetItem(input,i); 42 res = SWIG_AsCharPtrAndSize(obj, 0, 0, 0); 43 if (!SWIG_IsOK(res)) return SWIG_TypeError; 44 } 45 if (owner) *owner = 0; 46 } 47 return SWIG_OK; 48 } else { 49 return SWIG_TypeError; 50 } 51 } else { 52 /* seems dangerous, but the user asked for it... */ 53 size_t i = 0; 54 if (argv) { while (*argv[i] != 0) ++i;} 55 if (argc) *argc = i; 56 if (owner) *owner = 0; 57 return SWIG_OK; 58 } 59 } 60 } 61 62 /* 63 This typemap works with either a char **, a python list or a python 64 tuple 65 */ 66 67 %typemap(in,noblock=0,fragment="SWIG_AsArgcArgv") (int ARGC, char **ARGV) (int res,char **argv = 0, size_t argc = 0, int owner= 0) { 68 res = SWIG_AsArgcArgv($input, $descriptor(char**), &argc, &argv, &owner); 69 if (!SWIG_IsOK(res)) { 70 $1 = 0; $2 = 0; 71 %argument_fail(SWIG_TypeError, "int ARGC, char **ARGV", $symname, $argnum); 72 } else { 73 $1 = %static_cast(argc,$1_ltype); 74 $2 = %static_cast(argv, $2_ltype); 75 } 76 } 77 78 %typemap(typecheck, precedence=SWIG_TYPECHECK_STRING_ARRAY) (int ARGC, char **ARGV) { 79 int res = SWIG_AsArgcArgv($input, $descriptor(char**), 0, 0, 0); 80 $1 = SWIG_IsOK(res); 81 } 82 83 %typemap(freearg,noblock=1) (int ARGC, char **ARGV) { 84 if (owner$argnum) { 85 size_t i = argc$argnum; 86 while (i) { 87 %delete_array(argv$argnum[--i]); 88 } 89 %delete_array(argv$argnum); 90 } 91 } 92 93