[xml] Exslt Transform with Params



Hello,

I have written the following c++ code to allow me to use do exslt transforms
using libxml2/libxslt/libexslt from C# using .NET 1.1 on the Windows
platform.

In doing so, I based it upon the api's and sample code.

I would like to make sure that it does not memory leak and that I have
called the api's appropriately and not forgotten anything.

The code presently works. I am open to any and all suggestions for improving
it.

Kind Regards,

Alex


// exslt.h: Headers for the DLL application.

// The following ifdef block is the standard way of creating macros which
make exporting 
// from a DLL simpler. All files within this DLL are compiled with the
EXSLT_EXPORTS
// symbol defined on the command line. this symbol should not be defined on
any project
// that uses this DLL. This way any other project whose source files include
this file see 
// EXSLT_API functions as being imported from a DLL, whereas this DLL sees
symbols
// defined with this macro as being exported.
#ifdef EXSLT_EXPORTS
#define EXSLT_API __declspec(dllexport)
#else
#define EXSLT_API __declspec(dllimport)
#endif

EXSLT_API int ClearParms(void);
EXSLT_API int AddParams (char* paramname, char* paramvalue);
EXSLT_API int exslttransform(const char* xmlstring, const char* xsltstring,
const char* resultfile);
EXSLT_API int exslttransformxmlfile(const char* xmlstring, const char*
xsltstring, const char* resultfile);



// exslt.c: Defines the entry point for the DLL application.
//

#include "exslt.h"

#include <string.h>

#include <libxml/xmlmemory.h>
#include <libxml/debugXML.h>
#include <libxml/HTMLtree.h>
#include <libxml/xmlIO.h>
#include <libxml/DOCBparser.h>
#include <libxml/xinclude.h>
#include <libxml/catalog.h>

#include <libxslt/xslt.h>
#include <libxslt/xsltInternals.h>
#include <libxslt/transform.h>
#include <libxslt/xsltutils.h>

#include <libexslt/exslt.h>
#include <libexslt/exsltconfig.h>
#include <libexslt/exsltexports.h>
#include <libexslt/libexslt.h>

char params[100][512];
int nbparams = 0;

EXSLT_API int AddParams(char* paramname, char* paramvalue)
{
        int i;
        int k;
        i = 0;
        k = 0;
        // Make paramvalue ASCII and end with NULL
        while (paramvalue[i] != '\0')
        {
                if (paramvalue[i] < 128 && paramvalue[i] > 0)
                {
                        paramvalue[k] = paramvalue[i];
                        k++;
                }
                i++;
        }
        while (k < i)
        {
                paramvalue[k] = '\0';
                k++;
        }
        i = 0;
        // pass paramname into params and null rest of that string
        while (paramname[i] != '\0')
        {
                params[nbparams][i] = paramname[i];
                i++;
        }
        nbparams++;
        i = 0;
        // pass paramvalue into params and null rest of that string
        while (paramvalue[i] != '\0')
        {
                params[nbparams][i] = paramvalue[i];
                i++;
        }
        nbparams++;
        return (1);
}

EXSLT_API int ClearParms(void)
{
        int i, j;
        nbparams = 0;
        for (i = 0; i < 100; i++)
        {
                for (j = 0; j < 512; j++)
                {
                        params[i][j] = '\0';
                }
        }
        return (0);
}

EXSLT_API int exslttransform(const char* xmlstring, const char* xsltstring,
const char* resultfile)
{
        xsltStylesheetPtr cur = NULL;
        xmlDocPtr doc, res, dxsl;
        int i;
        const char *zparams[100 + 1];
        int nbzparams;
        nbzparams = 0;
        i = 0;
        while (i < nbparams)
        {
                zparams[i] = strdup((const char *)&params[i]);
                i++;
        }
        zparams[i] = NULL;
        exsltRegisterAll();
        xmlInitParser();
        xmlSubstituteEntitiesDefault(1);
        dxsl = xmlParseMemory(xsltstring, (int)strlen(xsltstring));
        cur = xsltParseStylesheetDoc(dxsl);
        doc = xmlParseMemory(xmlstring, (int)strlen(xmlstring));
        res = xsltApplyStylesheet(cur, doc, zparams);
        xsltSaveResultToFilename((const char*) resultfile, res, cur, 0);
        xsltFreeStylesheet(cur);
        //for (i = 0;i < nbparams;i++)
                //xmlFree(zparams[i]);
        xmlFreeDoc(res);
        xmlFreeDoc(doc);
        xsltCleanupGlobals();
        xmlCleanupParser();
        return(0);
}

EXSLT_API int exslttransformxmlfile(const char* xmlfile, const char*
xsltstring, const char* resultfile)
{
        xsltStylesheetPtr cur = NULL;
        xmlDocPtr doc, res, dxsl;
        int i;
        const char *zparams[100 + 1];
        int nbzparams;
        nbzparams = 0;
        i = 0;
        while (i < nbparams)
        {
                zparams[i] = strdup((const char *)&params[i]);
                i++;
        }
        zparams[i] = NULL;
        exsltRegisterAll();
        xmlInitParser();
        xmlSubstituteEntitiesDefault(1);
        dxsl = xmlParseMemory(xsltstring, (int)strlen(xsltstring));
        cur = xsltParseStylesheetDoc(dxsl);
        doc = xmlParseFile(xmlfile);
        res = xsltApplyStylesheet(cur, doc, zparams);
        xsltSaveResultToFilename((const char*) resultfile, res, cur, 0);
        xsltFreeStylesheet(cur);
        //for (i = 0;i < nbparams;i++)
                //xmlFree(zparams[i]);
        xmlFreeDoc(res);
        xmlFreeDoc(doc);
        xsltCleanupGlobals();
        xmlCleanupParser();
        return(0);
}





[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]