PageRenderTime 47ms CodeModel.GetById 20ms RepoModel.GetById 1ms app.codeStats 0ms

/trunk/Lib/python/argcargv.i

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