Turn tagNumFromPyObject() into an object converter interface
authorPanu Matilainen <pmatilai@redhat.com>
Wed, 23 Sep 2009 09:28:47 +0000 (12:28 +0300)
committerPanu Matilainen <pmatilai@redhat.com>
Wed, 23 Sep 2009 09:28:47 +0000 (12:28 +0300)
- permits direct validation and conversion from arg parsing

python/header-py.c
python/header-py.h
python/rpmds-py.c
python/rpmfi-py.c
python/rpmmi-py.c
python/rpmte-py.c
python/rpmts-py.c

index bf734d1..c84056d 100644 (file)
@@ -278,10 +278,9 @@ static PyObject *hdrIsSource(hdrObject *s)
 
 static PyObject *hdrHasKey(hdrObject *s, PyObject *pytag)
 {
-    rpmTag tag = tagNumFromPyObject(pytag);
-    if (tag == RPMTAG_NOT_FOUND) {
-       return NULL;
-    }
+    rpmTag tag;
+    if (!tagNumFromPyObject(pytag, &tag)) return NULL;
+
     return PyBool_FromLong(headerIsEntry(s->h, tag));
 }
 
@@ -410,7 +409,7 @@ static void hdr_dealloc(hdrObject * s)
     PyObject_Del(s);
 }
 
-rpmTag tagNumFromPyObject (PyObject *item)
+int tagNumFromPyObject (PyObject *item, rpmTag *tagp)
 {
     rpmTag tag = RPMTAG_NOT_FOUND;
 
@@ -419,12 +418,17 @@ rpmTag tagNumFromPyObject (PyObject *item)
        tag = PyInt_AsLong(item);
     } else if (PyString_Check(item)) {
        tag = rpmTagGetValue(PyString_AsString(item));
+    } else {
+       PyErr_SetString(PyExc_TypeError, "expected a string or integer");
+       return 0;
     }
     if (tag == RPMTAG_NOT_FOUND) {
        PyErr_SetString(PyExc_ValueError, "unknown header tag");
+       return 0;
     }
-       
-    return tag;
+
+    *tagp = tag;
+    return 1;
 }
 
 static PyObject * hdr_subscript(hdrObject * s, PyObject * item)
@@ -438,8 +442,7 @@ static PyObject * hdr_subscript(hdrObject * s, PyObject * item)
     int forceArray = 0;
     struct rpmtd_s td;
 
-    tag = tagNumFromPyObject (item);
-    if (tag == RPMTAG_NOT_FOUND) return NULL;
+    if (!tagNumFromPyObject(item, &tag)) return NULL;
 
     tagtype = rpmTagGetType(tag); 
     forceArray = (tagtype & RPM_MASK_RETURN_TYPE) == RPM_ARRAY_RETURN_TYPE;
index 51f176b..534e038 100644 (file)
@@ -15,7 +15,7 @@ PyObject * hdr_Wrap(Header h);
 
 Header hdrGetHeader(hdrObject * h);
 
-rpmTag tagNumFromPyObject (PyObject *item);
+int tagNumFromPyObject (PyObject *item, rpmTag *tagp);
 
 PyObject * labelCompare (PyObject * self, PyObject * args);
 PyObject * versionCompare (PyObject * self, PyObject * args, PyObject * kwds);
index fe0e164..7514bdd 100644 (file)
@@ -428,20 +428,15 @@ static void rpmds_free(rpmdsObject * s)
 static PyObject * rpmds_new(PyTypeObject * subtype, PyObject *args, PyObject *kwds)
 {
     hdrObject * ho = NULL;
-    PyObject * to = NULL;
     rpmTag tagN = RPMTAG_REQUIRENAME;
     rpmsenseFlags flags = 0;
     rpmds ds = NULL;
     char * kwlist[] = {"header", "tag", "flags", NULL};
 
-    if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!|Oi:rpmds_new", kwlist, 
-           &hdr_Type, &ho, &to, &flags))
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!|O&i:rpmds_new", kwlist, 
+           &hdr_Type, &ho, tagNumFromPyObject, &tagN, &flags))
        return NULL;
 
-    if (to != NULL) {
-       tagN = tagNumFromPyObject(to);
-       if (tagN == RPMTAG_NOT_FOUND) return NULL;
-    }
     ds = rpmdsNew(hdrGetHeader(ho), tagN, 0);
 
     return rpmds_Wrap(ds);
@@ -515,21 +510,16 @@ PyObject * rpmds_Wrap(rpmds ds)
 
 PyObject * rpmds_Single(PyObject * s, PyObject * args, PyObject * kwds)
 {
-    PyObject * to = NULL;
     rpmTag tagN = RPMTAG_PROVIDENAME;
     const char * N;
     const char * EVR = NULL;
     rpmsenseFlags Flags = 0;
     char * kwlist[] = {"to", "name", "evr", "flags", NULL};
 
-    if (!PyArg_ParseTupleAndKeywords(args, kwds, "Os|si:Single", kwlist,
-           &to, &N, &EVR, &Flags))
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "O&s|si:Single", kwlist,
+           tagNumFromPyObject, &tagN, &N, &EVR, &Flags))
        return NULL;
 
-    if (to != NULL) {
-       tagN = tagNumFromPyObject(to);
-       if (tagN == RPMTAG_NOT_FOUND) return NULL;
-    }
     return rpmds_Wrap( rpmdsSingle(tagN, N, EVR, Flags) );
 }
 
index f1ab3a8..673d405 100644 (file)
@@ -316,10 +316,6 @@ static PyObject * rpmfi_new(PyTypeObject * subtype, PyObject *args, PyObject *kw
            &hdr_Type, &ho, &to, &flags))
        return NULL;
 
-    if (to != NULL) {
-       tagN = tagNumFromPyObject(to);
-       if (tagN == RPMTAG_NOT_FOUND) return NULL;
-    }
     fi = rpmfiNew(NULL, hdrGetHeader(ho), tagN, flags);
 
     return rpmfi_Wrap(fi);
index 7176844..5da2644 100644 (file)
@@ -104,19 +104,15 @@ rpmmi_Count(rpmmiObject * s)
 static PyObject *
 rpmmi_Pattern(rpmmiObject * s, PyObject * args, PyObject * kwds)
 {
-    PyObject *TagN = NULL;
     int type;
     char * pattern;
     rpmTag tag;
     char * kwlist[] = {"tag", "type", "patern", NULL};
 
-    if (!PyArg_ParseTupleAndKeywords(args, kwds, "Ois:Pattern", kwlist,
-           &TagN, &type, &pattern))
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "O&is:Pattern", kwlist,
+           tagNumFromPyObject, &tag, &type, &pattern))
        return NULL;
 
-    tag = tagNumFromPyObject (TagN);
-    if (tag == RPMTAG_NOT_FOUND) return NULL;
-
     rpmdbSetIteratorRE(s->mi, tag, type, pattern);
 
     Py_RETURN_NONE;
index f4b7d81..3d1a305 100644 (file)
@@ -175,17 +175,14 @@ rpmte_Key(rpmteObject * s)
 static PyObject *
 rpmte_DS(rpmteObject * s, PyObject * args, PyObject * kwds)
 {
-    PyObject * TagN = NULL;
     rpmds ds;
     rpmTag tag;
     char * kwlist[] = {"tag", NULL};
 
-    if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:DS", kwlist, &TagN))
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "O&:DS", kwlist,
+                               tagNumFromPyObject, &tag))
        return NULL;
 
-    tag = tagNumFromPyObject(TagN);
-    if (tag == RPMTAG_NOT_FOUND) return NULL;
-
     ds = rpmteDS(s->te, tag);
     if (ds == NULL) {
 #ifdef DYING
index 4f163c4..a80bbb9 100644 (file)
@@ -874,7 +874,6 @@ spec_Parse(rpmtsObject * s, PyObject * args, PyObject * kwds)
 static PyObject *
 rpmts_Match(rpmtsObject * s, PyObject * args, PyObject * kwds)
 {
-    PyObject *TagN = NULL;
     PyObject *Key = NULL;
     char *key = NULL;
 /* XXX lkey *must* be a 32 bit integer, int "works" on all known platforms. */
@@ -883,14 +882,10 @@ rpmts_Match(rpmtsObject * s, PyObject * args, PyObject * kwds)
     rpmTag tag = RPMDBI_PACKAGES;
     char * kwlist[] = {"tagNumber", "key", NULL};
 
-    if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:Match", kwlist,
-           &TagN, &Key))
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O&O:Match", kwlist,
+           tagNumFromPyObject, &tag, &Key))
        return NULL;
 
-    if (TagN && (tag = tagNumFromPyObject (TagN)) == RPMTAG_NOT_FOUND) {
-       return NULL;
-    }
-
     if (Key) {
        if (PyString_Check(Key)) {
            key = PyString_AsString(Key);