+static PyObject *mdwopt_pynext(PyObject *me)
+{
+ mdwopt_pyobj *m = (mdwopt_pyobj *)me;
+ PyObject *val = 0, *arg = 0, *t = 0, *u = 0, *v = 0;
+ int f, ix, i;
+ unsigned char ch;
+ PyObject *rc = 0;
+
+again:
+ i = mdwopt(m->narg, m->argv, m->stringdata, m->longopt, &ix,
+ &m->opt, m->flags);
+
+ if (i == -1) goto end;
+
+ f = i&OPTF_NEGATED;
+
+ if (m->opt.arg) arg = TEXT_FROMSTR(m->opt.arg);
+ else { arg = Py_None; Py_INCREF(Py_None); }
+
+ if (ix < 0) {
+ ch = i&0xff;
+ val = TEXT_FROMSTRLEN((char *)&ch, 1); if (!val) goto end;
+ } else {
+ if (m->extra[ix].attr == Py_None)
+ { val = m->extra[ix].tag; Py_INCREF(val); }
+ else if (m->longopt[ix].has_arg&OPTF_SWITCH) {
+ t = PyObject_GetAttr(m->state, m->extra[ix].attr);
+ if (!t && PyErr_ExceptionMatches(PyExc_AttributeError)) {
+ PyErr_Clear();
+ t = PyInt_FromLong(0); if (!t) goto end;
+ }
+ if (!f)
+ { v = PyNumber_Or(t, m->extra[ix].tag); if (!v) goto end; }
+ else {
+ u = PyNumber_Invert(m->extra[ix].tag); if (!u) goto end;
+ v = PyNumber_And(t, u); if (!v) goto end;
+ }
+ if (PyObject_SetAttr(m->state, m->extra[ix].attr, v)) goto end;
+ Py_DECREF(t); Py_XDECREF(u); Py_DECREF(v);
+ } else {
+ if (PyObject_SetAttr(m->state, m->extra[ix].attr,
+ f ?
+ Py_None :
+ m->longopt[ix].has_arg&OPTF_ARG ?
+ arg : m->extra[ix].tag))
+ goto end;
+ }
+ Py_DECREF(arg);
+ goto again;
+ }
+
+ rc = Py_BuildValue("(OOi)", val, arg, f);
+end:
+ Py_XDECREF(val); Py_XDECREF(arg);
+ Py_XDECREF(t); Py_XDECREF(u); Py_XDECREF(v);
+ return (rc);
+}
+
+static PyObject *moget_argv(PyObject *me, void *hunoz)
+{
+ mdwopt_pyobj *m = (mdwopt_pyobj *)me;
+ PyObject *rc = 0, *t = 0;
+ size_t i = 0;
+
+ rc = PyList_New(m->narg); if (!rc) goto fail;
+ for (i = 0; i < m->narg; i++) {
+ t = TEXT_FROMSTR(m->argv[i]); if (!t) goto fail;
+ PyList_SET_ITEM(rc, i, t); t = 0;
+ }
+ return (rc);
+
+fail:
+ Py_XDECREF(t);
+ Py_XDECREF(rc);
+ return (0);
+}
+
+static PyObject *moget_err(PyObject *me, void *hunoz)
+ { mdwopt_pyobj *m = (mdwopt_pyobj *)me; return (getbool(m->opt.err)); }
+static int moset_err(PyObject *me, PyObject *v, void *hunoz)
+{
+ mdwopt_pyobj *m = (mdwopt_pyobj *)me;
+ int rc = -1;
+
+ if (!v) NIERR("__del__");
+ if (convbool(v, &m->opt.err)) goto end;
+ rc = 0;
+end:
+ return (rc);
+}
+
+static PyObject *moget_prog(PyObject *me, void *hunoz)
+{
+ mdwopt_pyobj *m = (mdwopt_pyobj *)me;
+
+ if (!m->opt.prog) RETURN_NONE;
+ if (!m->prog)
+ { m->prog = TEXT_FROMSTR(m->opt.prog); if (!m->prog) return (0); }
+ RETURN_OBJ(m->prog);
+}
+static int moset_prog(PyObject *me, PyObject *v, void *hunoz)
+{
+ mdwopt_pyobj *m = (mdwopt_pyobj *)me;
+ char *p;
+ int rc = -1;
+
+ if (!v) NIERR("__del__");
+ p = TEXT_STR(v); if (!p) goto end;
+ m->opt.prog = p;
+ Py_XDECREF(m->prog); m->prog = v; Py_INCREF(v);
+ rc = 0;
+end:
+ return (rc);
+}
+