~ubuntu-branches/ubuntu/trusty/libxslt/trusty

« back to all changes in this revision

Viewing changes to python/libxslt.c

  • Committer: Package Import Robot
  • Author(s): Aron Xu
  • Date: 2012-10-03 00:22:53 UTC
  • mfrom: (1.1.9)
  • Revision ID: package-import@ubuntu.com-20121003002253-e6cjjwgepg5emub1
Tags: 1.1.27-1
* New upstream release (Closes: #448205, #683353)
* debian/rules:
  + Add hardening flags for dbg package in LDFLAGS (Closes: #681163)
* debian/control:
  - std-ver: 3.9.3 -> 3.9.4, no change required.

Show diffs side-by-side

added added

removed removed

Lines of Context:
100
100
    long hash_code;
101
101
    xsltTransformContextPtr tctxt;
102
102
 
103
 
    if (!PyArg_ParseTuple(args, (char *)"O:getTransformContextHashCode", 
 
103
    if (!PyArg_ParseTuple(args, (char *)"O:getTransformContextHashCode",
104
104
                          &py_tctxt))
105
105
        return NULL;
106
106
 
113
113
 
114
114
PyObject *
115
115
libxslt_xsltCompareTransformContextsEqual(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
116
 
    
 
116
 
117
117
    PyObject *py_tctxt1, *py_tctxt2;
118
118
    xsltTransformContextPtr tctxt1, tctxt2;
119
119
 
120
 
    if (!PyArg_ParseTuple(args, (char *)"OO:compareTransformContextsEqual", 
 
120
    if (!PyArg_ParseTuple(args, (char *)"OO:compareTransformContextsEqual",
121
121
                          &py_tctxt1, &py_tctxt2))
122
122
        return NULL;
123
123
 
137
137
    long hash_code;
138
138
    xsltStylesheetPtr style;
139
139
 
140
 
    if (!PyArg_ParseTuple(args, (char *)"O:getStylesheetHashCode", 
 
140
    if (!PyArg_ParseTuple(args, (char *)"O:getStylesheetHashCode",
141
141
                          &py_style))
142
142
        return NULL;
143
143
 
151
151
 
152
152
PyObject *
153
153
libxslt_xsltCompareStylesheetsEqual(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
154
 
    
 
154
 
155
155
    PyObject *py_style1, *py_style2;
156
156
    xsltStylesheetPtr style1, style2;
157
157
 
158
 
    if (!PyArg_ParseTuple(args, (char *)"OO:compareStylesheetsEqual", 
 
158
    if (!PyArg_ParseTuple(args, (char *)"OO:compareStylesheetsEqual",
159
159
                          &py_style1, &py_style2))
160
160
        return NULL;
161
161
 
240
240
 
241
241
    if (style == NULL)
242
242
        return (NULL);
243
 
    
 
243
 
244
244
    if (inst != NULL && inst->ns != NULL) {
245
245
        name = inst->name;
246
246
        ns_uri = inst->ns->href;
247
247
    } else {
248
 
        xsltTransformError(NULL, style, inst, 
 
248
        xsltTransformError(NULL, style, inst,
249
249
                "libxslt_xsltElementPreCompCallback: internal error bad parameter\n");
250
250
                printf("libxslt_xsltElementPreCompCallback: internal error bad parameter\n");
251
251
        if (style != NULL) style->errors++;
258
258
    pyobj_precomp_f = xmlHashLookup2(libxslt_extModuleElementPreComp,
259
259
                                      name, ns_uri);
260
260
    if (pyobj_precomp_f == NULL) {
261
 
        xsltTransformError(NULL, style, inst, 
 
261
        xsltTransformError(NULL, style, inst,
262
262
                "libxslt_xsltElementPreCompCallback: internal error, could not find precompile python function!\n");
263
263
        if (style != NULL) style->errors++;
264
264
        return (NULL);
267
267
    pyobj_element_f = xmlHashLookup2(libxslt_extModuleElements,
268
268
                                      name, ns_uri);
269
269
    if (pyobj_element_f == NULL) {
270
 
        xsltTransformError(NULL, style, inst, 
 
270
        xsltTransformError(NULL, style, inst,
271
271
                "libxslt_xsltElementPreCompCallback: internal error, could not find element python function!\n");
272
272
        if (style != NULL) style->errors++;
273
273
        return (NULL);
274
274
    }
275
275
 
276
 
    args = Py_BuildValue((char *)"(OOO)", 
 
276
    args = Py_BuildValue((char *)"(OOO)",
277
277
            libxslt_xsltStylesheetPtrWrap(style),
278
278
            libxml_xmlNodePtrWrap(inst),
279
279
            pyobj_element_f);
295
295
 
296
296
static void
297
297
libxslt_xsltElementTransformCallback(xsltTransformContextPtr ctxt,
298
 
                                    xmlNodePtr node, 
 
298
                                    xmlNodePtr node,
299
299
                                    xmlNodePtr inst,
300
 
                                    xsltElemPreCompPtr comp) 
 
300
                                    xsltElemPreCompPtr comp)
301
301
{
302
302
    PyObject *args, *result;
303
303
    PyObject *func = NULL;
306
306
 
307
307
    if (ctxt == NULL)
308
308
        return;
309
 
    
 
309
 
310
310
    if (inst != NULL && inst->name != NULL && inst->ns != NULL && inst->ns->href != NULL) {
311
311
        name = inst->name;
312
312
        ns_uri = inst->ns->href;
331
331
    }
332
332
 
333
333
    args = Py_BuildValue((char *)"OOOO",
334
 
        libxslt_xsltTransformContextPtrWrap(ctxt),
335
 
        libxml_xmlNodePtrWrap(node),
336
 
        libxml_xmlNodePtrWrap(inst),
337
 
        libxslt_xsltElemPreCompPtrWrap(comp));
 
334
        libxslt_xsltTransformContextPtrWrap(ctxt),
 
335
        libxml_xmlNodePtrWrap(node),
 
336
        libxml_xmlNodePtrWrap(inst),
 
337
        libxslt_xsltElemPreCompPtrWrap(comp));
338
338
 
339
339
    Py_INCREF(func); /* Protect refcount against reentrant manipulation of callback hash */
340
340
    result = PyEval_CallObject(func, args);
401
401
    }
402
402
    Py_XINCREF(pyobj_precomp_f);
403
403
 
404
 
    ret = xsltRegisterExtModuleElement(name, ns_uri, 
 
404
    ret = xsltRegisterExtModuleElement(name, ns_uri,
405
405
                                        libxslt_xsltElementPreCompCallback,
406
406
                                        libxslt_xsltElementTransformCallback);
407
407
    py_retval = libxml_intWrap((int) ret);
495
495
    }
496
496
    Py_XINCREF(pyobj_f);
497
497
 
498
 
    ret = xsltRegisterExtModuleFunction(name, ns_uri, 
 
498
    ret = xsltRegisterExtModuleFunction(name, ns_uri,
499
499
                                             libxslt_xmlXPathFuncCallback);
500
500
    py_retval = libxml_intWrap((int) ret);
501
501
    return(py_retval);
536
536
    xmlCtxtUseOptions(pctxt, options);
537
537
 
538
538
    /*
539
 
     * Now pass to python the URI, the xsltParserContext and the context 
 
539
     * Now pass to python the URI, the xsltParserContext and the context
540
540
     * (either a transformContext or a stylesheet) and get back an xmlDocPtr
541
541
     */
542
542
    if (pythonDocLoaderObject != NULL) {
545
545
 
546
546
        if (type == XSLT_LOAD_DOCUMENT) {
547
547
          ctxtobj = libxslt_xsltTransformContextPtrWrap(ctxt);
548
 
          result = PyObject_CallFunction(pythonDocLoaderObject, 
549
 
                                         (char *) "(sOOi)", URI, pctxtobj, ctxtobj, 0); 
 
548
          result = PyObject_CallFunction(pythonDocLoaderObject,
 
549
                                         (char *) "(sOOi)", URI, pctxtobj, ctxtobj, 0);
550
550
        }
551
551
        else {
552
552
          ctxtobj = libxslt_xsltStylesheetPtrWrap(ctxt);
553
 
          result = PyObject_CallFunction(pythonDocLoaderObject, 
554
 
                                         (char *) "(sOOi)", URI, pctxtobj, ctxtobj, 1); 
 
553
          result = PyObject_CallFunction(pythonDocLoaderObject,
 
554
                                         (char *) "(sOOi)", URI, pctxtobj, ctxtobj, 1);
555
555
        }
556
556
 
557
557
        Py_XDECREF(pctxtobj);
599
599
    xsltSetLoaderFunc(pythonDocLoaderFuncWrapper);
600
600
 
601
601
    py_retval = PyInt_FromLong(0);
602
 
    return(py_retval);    
 
602
    return(py_retval);
603
603
}
604
604
 
605
605
PyObject *
607
607
    PyObject *py_retval;
608
608
 
609
609
    py_retval = pythonDocLoaderObject;
610
 
    return(py_retval);    
 
610
    return(py_retval);
611
611
}
612
612
 
613
613
 
632
632
 
633
633
    style = (xsltStylesheetPtr) Pystylesheet_Get(pyobj_style);
634
634
    doc = (xmlDocPtr) PyxmlNode_Get(pyobj_doc);
635
 
    
 
635
 
636
636
    c_retval = xsltNewTransformContext(style, doc);
637
637
    py_retval = libxslt_xsltTransformContextPtrWrap((xsltTransformContextPtr) c_retval);
638
638
    return (py_retval);
645
645
 
646
646
    if (!PyArg_ParseTuple(args, (char *) "O:xsltFreeTransformContext", &py_tctxt))
647
647
        return(NULL);
648
 
                     
 
648
 
649
649
    tctxt = (xsltTransformContextPtr) PytransformCtxt_Get(py_tctxt);
650
650
    xsltFreeTransformContext(tctxt);
651
651
 
652
652
    /* Return None */
653
653
    Py_INCREF(Py_None);
654
 
    return(Py_None);    
 
654
    return(Py_None);
655
655
}
656
656
 
657
657
PyObject *
808
808
 
809
809
PyObject *
810
810
libxslt_xsltSaveResultToString(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
811
 
    PyObject *py_retval;        /* our final return value, a python string   */ 
 
811
    PyObject *py_retval;        /* our final return value, a python string   */
812
812
    xmlChar  *buffer;
813
813
    int       size    = 0;
814
814
    int       emitted = 0;
822
822
    result = (xmlDocPtr) PyxmlNode_Get(pyobj_result);
823
823
    style  = (xsltStylesheetPtr) Pystylesheet_Get(pyobj_style);
824
824
 
825
 
     
 
825
 
826
826
    /* FIXME: We should probably add more restrictive error checking
827
827
     * and raise an error instead of "just" returning NULL.
828
828
     * FIXME: Documentation and code for xsltSaveResultToString diff
829
 
     * -> emmitted will never be positive non-null. 
 
829
     * -> emmitted will never be positive non-null.
830
830
     */
831
831
    emitted = xsltSaveResultToString(&buffer, &size, result, style);
832
 
    if(!buffer || emitted < 0) 
 
832
    if(!buffer || emitted < 0)
833
833
      goto FAIL;
834
834
    /* We haven't tested the aberrant case of a transformation that
835
835
     * renders to an empty string. For now we try to play it safe.
837
837
    if(size)
838
838
      {
839
839
      buffer[size] = '\0';
840
 
      py_retval = PyString_FromString((char *) buffer); 
 
840
      py_retval = PyString_FromString((char *) buffer);
841
841
      xmlFree(buffer);
842
842
      }
843
843
    else
1125
1125
    }
1126
1126
    Py_XINCREF(pyobj_c);
1127
1127
 
1128
 
    ret = xsltRegisterExtModuleFull(ns_uri, 
 
1128
    ret = xsltRegisterExtModuleFull(ns_uri,
1129
1129
       (xsltExtInitFunction) libxslt_xsltPythonExtModuleCtxtInit,
1130
1130
       (xsltExtShutdownFunction) libxslt_xsltPythonExtModuleCtxtShutdown,
1131
1131
       (xsltStyleExtInitFunction) libxslt_xsltPythonExtModuleStyleInit,