From d2ec5ac52105c526390d8a31e52a7a2c260dde80 Mon Sep 17 00:00:00 2001 From: zilio nicolas Date: Thu, 27 Aug 2015 16:19:53 +0200 Subject: xml files get by model and remove of validation mode --- pcilib/pci.c | 17 ++--- pcilib/xml.c | 224 ++++++++++++++++++++++++++++++++-------------------------- pcilib/xml.h | 4 +- pcitool/cli.c | 6 -- 4 files changed, 132 insertions(+), 119 deletions(-) diff --git a/pcilib/pci.c b/pcilib/pci.c index 5d9fedb..03b2623 100644 --- a/pcilib/pci.c +++ b/pcilib/pci.c @@ -109,14 +109,8 @@ pcilib_t *pcilib_open(const char *device, const char *model) { size_t i; pcilib_t *ctx = malloc(sizeof(pcilib_t)); - char *xmlfile; - pcilib_xml_read_config(&xmlfile,3); - xmlDocPtr doc; - doc=pcilib_xml_getdoc(xmlfile); - - xmlXPathContextPtr context; - context=pcilib_xml_getcontext(doc); - + xmlDocPtr* docs=NULL; + if (!model) model = getenv("PCILIB_MODEL"); @@ -179,9 +173,10 @@ pcilib_t *pcilib_open(const char *device, const char *model) { if (!ctx->model) ctx->model = strdup(model?model:"pci"); - - pcilib_xml_initialize_banks(ctx,doc); - pcilib_xml_initialize_registers(ctx,doc); + + pcilib_init_xml(docs); + pcilib_xml_initialize_banks(ctx,docs); + pcilib_xml_initialize_registers(ctx,docs); ctx->model_info.registers = ctx->registers; ctx->model_info.banks = ctx->banks; diff --git a/pcilib/xml.c b/pcilib/xml.c index 68ac42a..203b147 100644 --- a/pcilib/xml.c +++ b/pcilib/xml.c @@ -10,17 +10,18 @@ In case the performance is not good enough, please consider the following : no more configuration file indicating where the files required are, hard code of formulas, and go to complete non evolutive code : get 1 access to xml file and context, and then make recursive descent to get all you need(investigation of libxml2 source code would be so needed to prove it's better to go recursive than just xpath). */ - +#define _XOPEN_SOURCE 700 #include "xml.h" #include "error.h" #include #include #include #include -#include +//#include #include "pci.h" #include "bank.h" #include "register.h" +#include //#define VIEW_OK //#define UNIT_OK @@ -79,6 +80,83 @@ xmlXPathContextPtr pcilib_xml_getcontext(xmlDocPtr doc){ } +/** validation + * + * function to validate the xml file against the xsd, so that it does not require extern software + */ +void validation(char* xml_filename, char* xsd_filename) +{ +xmlDocPtr doc; +xmlSchemaPtr schema = NULL; +xmlSchemaParserCtxtPtr ctxt; +int ret=1; + +ctxt = xmlSchemaNewParserCtxt(xsd_filename); +schema = xmlSchemaParse(ctxt); +xmlSchemaFreeParserCtxt(ctxt); + +doc = xmlReadFile(xml_filename, NULL, 0); + +if (doc == NULL) +{ + pcilib_error("Could not parse xml document "); +} +else +{ +xmlSchemaValidCtxtPtr ctxt; +/** validation here*/ +ctxt = xmlSchemaNewValidCtxt(schema); +ret = xmlSchemaValidateDoc(ctxt, doc); +xmlSchemaFreeValidCtxt(ctxt); +xmlFreeDoc(doc); +} + +//! free the resource +if(schema != NULL) +xmlSchemaFree(schema); +xmlSchemaCleanupTypes(); + +if(ret!=0) pcilib_error("xml file \"%s\" does not validate against the schema",xml_filename); + +} + +void pcilib_init_xml(xmlDocPtr* docs){ + char *path,*command,*command_xsd, *line, *line_xsd; + FILE *in, *in2; + int i=1; + + path=malloc(sizeof(char*)); + command=malloc(sizeof(char*)); + command_xsd=malloc(sizeof(char*)); + line=malloc(sizeof(char*)); + line_xsd=malloc(sizeof(char*)); + docs=malloc(sizeof(xmlDocPtr)); + + path=getenv("PCILIB_MODEL_DIR"); + if((strcmp(path,"(null)"))==0) pcilib_error("can't find environment variable for xml files"); + + sprintf(command,"find %s -name *.xml -print",path); + sprintf(command_xsd,"find %s -name *.xsd -print",path); + + if(!(in=popen(command,"r"))) pcilib_error("fail popen xml"); + if(!((in2=popen(command_xsd,"r")))) pcilib_error("fail popen xsd"); + + while(fgets(line_xsd,sizeof(line_xsd),in2)!=NULL) { + if((strstr(line_xsd,"units"))!=NULL) break; + } + if(line_xsd==NULL) pcilib_error("no xsd file found"); + +while((fgets(line,sizeof(line),in))!=NULL) { + validation(line,line_xsd); + docs=(xmlDocPtr*) realloc(docs,i*sizeof(xmlDocPtr)); + docs[i-1]=pcilib_xml_getdoc(line); + i++; + } + + docs=(xmlDocPtr*) realloc(docs,i*sizeof(xmlDocPtr)); + docs[i]=NULL; +} + /** pcilib_xml_create_register. * this function create a register structure from the results of xml parsing. * @param[out] myregister the register we want to create @@ -262,7 +340,7 @@ void pcilib_xml_create_bank(pcilib_register_bank_description_t *mybank,xmlChar* * @param[in] doc the AST of the xml file. * @param[in,out] mybanks the structure containing the banks. */ -void pcilib_xml_initialize_banks(pcilib_t* pci, xmlDocPtr doc/*, pcilib_register_bank_description_t* mybanks*/){ +void pcilib_xml_initialize_banks(pcilib_t* pci,xmlDocPtr* docs){ pcilib_register_bank_description_t mybank; xmlNodeSetPtr nodesetadress=NULL,nodesetbar=NULL,nodesetsize=NULL,nodesetprotocol=NULL,nodesetread_addr=NULL,nodesetwrite_addr=NULL,nodesetaccess=NULL,nodesetendianess=NULL,nodesetformat=NULL,nodesetname=NULL,nodesetdescription=NULL; @@ -270,20 +348,17 @@ void pcilib_xml_initialize_banks(pcilib_t* pci, xmlDocPtr doc/*, pcilib_register xmlNodePtr mynode; int number_banks; pcilib_register_bank_description_t* banks; - xmlXPathContextPtr context; - context=pcilib_xml_getcontext(doc); - - int i; - + int i,p; + xmlXPathObjectPtr temp; mynode=malloc(sizeof(xmlNode)); - - number_banks=pcilib_xml_getnumberbanks(context); + p=0; + while(docs[p]!=NULL){ + context=pcilib_xml_getcontext(docs[p]); + number_banks=pcilib_xml_getnumberbanks(context); if(number_banks) banks=calloc((number_banks),sizeof(pcilib_register_bank_description_t)); else return; - xmlXPathObjectPtr temp; - /** we first get the nodes corresponding to the properties we want*/ /* -----> certainly not necessary if we validate xml each time*/ temp=pcilib_xml_getsetproperty(context,BANK_ADDR_PATH); @@ -334,17 +409,17 @@ void pcilib_xml_initialize_banks(pcilib_t* pci, xmlDocPtr doc/*, pcilib_register for(i=0;inodeNr;i++){ /** we then get each node from the structures above*/ - adress=xmlNodeListGetString(doc,nodesetadress->nodeTab[i]->xmlChildrenNode, 1); - bar=xmlNodeListGetString(doc,nodesetbar->nodeTab[i]->xmlChildrenNode, 1); - size=xmlNodeListGetString(doc,nodesetsize->nodeTab[i]->xmlChildrenNode, 1); - protocol=xmlNodeListGetString(doc,nodesetprotocol->nodeTab[i]->xmlChildrenNode, 1); - read_addr=xmlNodeListGetString(doc,nodesetread_addr->nodeTab[i]->xmlChildrenNode, 1); - write_addr=xmlNodeListGetString(doc,nodesetwrite_addr->nodeTab[i]->xmlChildrenNode, 1); - access=xmlNodeListGetString(doc,nodesetaccess->nodeTab[i]->xmlChildrenNode, 1); - endianess=xmlNodeListGetString(doc,nodesetendianess->nodeTab[i]->xmlChildrenNode, 1); - format=xmlNodeListGetString(doc,nodesetformat->nodeTab[i]->xmlChildrenNode, 1); - name=xmlNodeListGetString(doc,nodesetname->nodeTab[i]->xmlChildrenNode, 1); - description=xmlNodeListGetString(doc,nodesetdescription->nodeTab[i]->xmlChildrenNode, 1); + adress=xmlNodeListGetString(docs[p],nodesetadress->nodeTab[i]->xmlChildrenNode, 1); + bar=xmlNodeListGetString(docs[p],nodesetbar->nodeTab[i]->xmlChildrenNode, 1); + size=xmlNodeListGetString(docs[p],nodesetsize->nodeTab[i]->xmlChildrenNode, 1); + protocol=xmlNodeListGetString(docs[p],nodesetprotocol->nodeTab[i]->xmlChildrenNode, 1); + read_addr=xmlNodeListGetString(docs[p],nodesetread_addr->nodeTab[i]->xmlChildrenNode, 1); + write_addr=xmlNodeListGetString(docs[p],nodesetwrite_addr->nodeTab[i]->xmlChildrenNode, 1); + access=xmlNodeListGetString(docs[p],nodesetaccess->nodeTab[i]->xmlChildrenNode, 1); + endianess=xmlNodeListGetString(docs[p],nodesetendianess->nodeTab[i]->xmlChildrenNode, 1); + format=xmlNodeListGetString(docs[p],nodesetformat->nodeTab[i]->xmlChildrenNode, 1); + name=xmlNodeListGetString(docs[p],nodesetname->nodeTab[i]->xmlChildrenNode, 1); + description=xmlNodeListGetString(docs[p],nodesetdescription->nodeTab[i]->xmlChildrenNode, 1); mynode=nodesetadress->nodeTab[i]->parent; @@ -356,6 +431,8 @@ void pcilib_xml_initialize_banks(pcilib_t* pci, xmlDocPtr doc/*, pcilib_register } pcilib_add_register_banks(pci,number_banks,banks); + p++; + } } /* @@ -438,19 +515,18 @@ int pcilib_xml_getnumberregisters(xmlXPathContextPtr doc){ * @param[in] doc the xpath context of the xml file. * @param[in,out] registers in: initialized list out: the list of the created registers. */ -void pcilib_xml_initialize_registers(pcilib_t* pci, xmlDocPtr doc/*,pcilib_register_description_t *registers*/){ +void pcilib_xml_initialize_registers(pcilib_t* pci,xmlDocPtr* docs){ xmlNodeSetPtr nodesetadress=NULL,nodesetoffset=NULL,nodesetdefvalue=NULL,nodesetrwmask=NULL,nodesetsize=NULL,nodesetmode=NULL,nodesetname=NULL; xmlChar *adress=NULL,*offset=NULL,*defvalue=NULL,*rwmask=NULL,*size=NULL,*mode=NULL,*name=NULL,*bank=NULL,*type=NULL,*description=NULL; xmlNodePtr mynode; xmlNodePtr tempnode; xmlXPathContextPtr context; - int number_registers; +int number_registers, count=0; pcilib_register_description_t *registers=NULL; - context=pcilib_xml_getcontext(doc); - mynode=malloc(sizeof(xmlNode)); - +while(docs[count]!=NULL){ + context=pcilib_xml_getcontext(docs[count]); number_registers=pcilib_xml_getnumberregisters(context); if(number_registers) registers=calloc(number_registers,sizeof(pcilib_register_description_t)); else return; @@ -518,19 +594,19 @@ void pcilib_xml_initialize_registers(pcilib_t* pci, xmlDocPtr doc/*,pcilib_regis for(i=0;inodeNr;i++){ /** get each sub property of each standard registers*/ - adress=xmlNodeListGetString(doc,nodesetadress->nodeTab[i]->xmlChildrenNode, 1); + adress=xmlNodeListGetString(docs[count],nodesetadress->nodeTab[i]->xmlChildrenNode, 1); tempnode=xmlFirstElementChild(xmlFirstElementChild(nodesetadress->nodeTab[i]->parent->parent->parent)); - if(strcmp("adress",(char*)tempnode->name)==0) bank=xmlNodeListGetString(doc,tempnode->xmlChildrenNode,1); + if(strcmp("adress",(char*)tempnode->name)==0) bank=xmlNodeListGetString(docs[count],tempnode->xmlChildrenNode,1); else pcilib_error("the xml file is malformed"); - offset=xmlNodeListGetString(doc,nodesetoffset->nodeTab[i]->xmlChildrenNode, 1); - size=xmlNodeListGetString(doc,nodesetsize->nodeTab[i]->xmlChildrenNode, 1); - defvalue=xmlNodeListGetString(doc,nodesetdefvalue->nodeTab[i]->xmlChildrenNode, 1); - rwmask=xmlNodeListGetString(doc,nodesetrwmask->nodeTab[i]->xmlChildrenNode, 1); - mode=xmlNodeListGetString(doc,nodesetmode->nodeTab[i]->xmlChildrenNode, 1); - name=xmlNodeListGetString(doc,nodesetname->nodeTab[i]->xmlChildrenNode, 1); + offset=xmlNodeListGetString(docs[count],nodesetoffset->nodeTab[i]->xmlChildrenNode, 1); + size=xmlNodeListGetString(docs[count],nodesetsize->nodeTab[i]->xmlChildrenNode, 1); + defvalue=xmlNodeListGetString(docs[count],nodesetdefvalue->nodeTab[i]->xmlChildrenNode, 1); + rwmask=xmlNodeListGetString(docs[count],nodesetrwmask->nodeTab[i]->xmlChildrenNode, 1); + mode=xmlNodeListGetString(docs[count],nodesetmode->nodeTab[i]->xmlChildrenNode, 1); + name=xmlNodeListGetString(docs[count],nodesetname->nodeTab[i]->xmlChildrenNode, 1); type=(xmlChar*)"standard"; if(nodesetname->nodeTab[i]->next->next!= NULL && strcmp((char*)nodesetname->nodeTab[i]->next->next->name,"description")==0){ - description=xmlNodeListGetString(doc,nodesetname->nodeTab[i]->next->next->xmlChildrenNode,1); + description=xmlNodeListGetString(docs[count],nodesetname->nodeTab[i]->next->next->xmlChildrenNode,1); }else{ description=(xmlChar*)""; } @@ -546,22 +622,22 @@ void pcilib_xml_initialize_registers(pcilib_t* pci, xmlDocPtr doc/*,pcilib_regis for(i=0;inodeNr;i++){ /** we get there each subproperty of each bits register*/ tempnode=xmlFirstElementChild(nodesetsuboffset->nodeTab[i]->parent->parent->parent); - if(strcmp((char*)tempnode->name,"adress")==0)subadress=xmlNodeListGetString(doc,tempnode->xmlChildrenNode, 1); + if(strcmp((char*)tempnode->name,"adress")==0)subadress=xmlNodeListGetString(docs[count],tempnode->xmlChildrenNode, 1); else pcilib_error("xml file is malformed"); tempnode= xmlFirstElementChild(xmlFirstElementChild(nodesetsuboffset->nodeTab[i]->parent->parent->parent->parent->parent)); - if(strcmp((char*)tempnode->name,"adress")==0) subbank=xmlNodeListGetString(doc,tempnode->xmlChildrenNode,1); + if(strcmp((char*)tempnode->name,"adress")==0) subbank=xmlNodeListGetString(docs[count],tempnode->xmlChildrenNode,1); else pcilib_error("xml file is malformed"); - suboffset=xmlNodeListGetString(doc,nodesetsuboffset->nodeTab[i]->xmlChildrenNode, 1); - subsize=xmlNodeListGetString(doc,nodesetsubsize->nodeTab[i]->xmlChildrenNode, 1); + suboffset=xmlNodeListGetString(docs[count],nodesetsuboffset->nodeTab[i]->xmlChildrenNode, 1); + subsize=xmlNodeListGetString(docs[count],nodesetsubsize->nodeTab[i]->xmlChildrenNode, 1); tempnode=xmlFirstElementChild(nodesetsuboffset->nodeTab[i]->parent->parent->parent)->next->next->next->next->next->next; - if(strcmp((char*)tempnode->name,"default")==0)subdefvalue=xmlNodeListGetString(doc,tempnode->xmlChildrenNode, 1); + if(strcmp((char*)tempnode->name,"default")==0)subdefvalue=xmlNodeListGetString(docs[count],tempnode->xmlChildrenNode, 1); else pcilib_error("xml file is malformed"); - subrwmask=xmlNodeListGetString(doc,nodesetsuboffset->nodeTab[i]->parent->parent->prev->prev->prev->prev->prev->prev->xmlChildrenNode, 1); - submode=xmlNodeListGetString(doc,nodesetsubmode->nodeTab[i]->xmlChildrenNode, 1); - subname=xmlNodeListGetString(doc,nodesetsubname->nodeTab[i]->xmlChildrenNode, 1); + subrwmask=xmlNodeListGetString(docs[count],nodesetsuboffset->nodeTab[i]->parent->parent->prev->prev->prev->prev->prev->prev->xmlChildrenNode, 1); + submode=xmlNodeListGetString(docs[count],nodesetsubmode->nodeTab[i]->xmlChildrenNode, 1); + subname=xmlNodeListGetString(docs[count],nodesetsubname->nodeTab[i]->xmlChildrenNode, 1); subtype=(xmlChar*)"bits"; if(nodesetsubname->nodeTab[i]->next->next!= NULL && strcmp((char*)nodesetsubname->nodeTab[i]->next->next->name,"sub_description")==0){ - subdescription=xmlNodeListGetString(doc,nodesetsubname->nodeTab[i]->next->next->xmlChildrenNode,1); + subdescription=xmlNodeListGetString(docs[count],nodesetsubname->nodeTab[i]->next->next->xmlChildrenNode,1); }else{ subdescription=(xmlChar*)""; } @@ -574,64 +650,12 @@ void pcilib_xml_initialize_registers(pcilib_t* pci, xmlDocPtr doc/*,pcilib_regis pcilib_xml_arrange_registers(registers,number_registers); pcilib_add_registers(pci,number_registers,registers); + count++; + } } -#include -/** validation - * - * function to validate the xml file against the xsd, so that it does not require extern software - */ -void validation() -{ -xmlDocPtr doc; -xmlSchemaPtr schema = NULL; -xmlSchemaParserCtxtPtr ctxt; - -char *XMLFileName; - pcilib_xml_read_config(&XMLFileName,3); -char *XSDFileName; - pcilib_xml_read_config(&XSDFileName,12); -int ret=1; - -ctxt = xmlSchemaNewParserCtxt(XSDFileName); - -schema = xmlSchemaParse(ctxt); -xmlSchemaFreeParserCtxt(ctxt); - -doc = xmlReadFile(XMLFileName, NULL, 0); - -if (doc == NULL) -{ - pcilib_error("Could not parse xml document "); -} -else -{ -xmlSchemaValidCtxtPtr ctxt; -/** validation here*/ -ctxt = xmlSchemaNewValidCtxt(schema); -ret = xmlSchemaValidateDoc(ctxt, doc); -xmlSchemaFreeValidCtxt(ctxt); -xmlFreeDoc(doc); -} - -//! free the resource -if(schema != NULL) -xmlSchemaFree(schema); - -xmlSchemaCleanupTypes(); -/** print results */ -if (ret == 0) -{ - printf("xml file validates\n"); -} -else -{ - printf("xml file does not validate against the schema\n"); -} - -} /** pcilib_xml_read_config * diff --git a/pcilib/xml.h b/pcilib/xml.h index a921b3e..ee7fdbd 100644 --- a/pcilib/xml.h +++ b/pcilib/xml.h @@ -106,7 +106,7 @@ xmlXPathObjectPtr pcilib_xml_getsetproperty(xmlXPathContextPtr doc, xmlChar *xpa * @param[in] doc the xpath context of the xml file. * @param[out] registers out: the list of the created registers. */ -void pcilib_xml_initialize_registers(pcilib_t* pci, xmlDocPtr doc); +void pcilib_xml_initialize_registers(pcilib_t* pci, xmlDocPtr* doc); /** * this functions initialize the structures containing banks, for use in the rest of execution, from the xml file. @@ -114,7 +114,7 @@ void pcilib_xml_initialize_registers(pcilib_t* pci, xmlDocPtr doc); * @param[in] doc the AST of the xml file. * @param[in,out] mybanks the structure containing the banks. */ -void pcilib_xml_initialize_banks(pcilib_t* pci,xmlDocPtr doc); +void pcilib_xml_initialize_banks(pcilib_t* pci,xmlDocPtr* doc); /** * this function read the config file of the pcitool tool to give back the pwd of diverse files like the xml file to treat, the xsd file, the pythonscript file, the units xml file, the units xsd file. diff --git a/pcitool/cli.c b/pcitool/cli.c index 3a09528..e9c9574 100644 --- a/pcitool/cli.c +++ b/pcitool/cli.c @@ -93,7 +93,6 @@ typedef enum { MODE_LIST_KMEM, MODE_READ_KMEM, MODE_FREE_KMEM, - MODE_VALIDATE_XML, MODE_LIST_LOCKS, MODE_FREE_LOCKS, MODE_LOCK, @@ -143,7 +142,6 @@ typedef enum { OPT_GRAB = 'g', OPT_QUIETE = 'q', OPT_HELP = 'h', - OPT_VALIDATE_XML= 'v', OPT_RESET = 128, OPT_BENCHMARK, OPT_TRIGGER, @@ -195,7 +193,6 @@ static struct option long_options[] = { {"iterations", required_argument, 0, OPT_ITERATIONS }, {"info", no_argument, 0, OPT_INFO }, {"list", no_argument, 0, OPT_LIST }, - {"validate", no_argument,0,OPT_VALIDATE_XML}, {"reset", no_argument, 0, OPT_RESET }, {"benchmark", optional_argument, 0, OPT_BENCHMARK }, {"read", optional_argument, 0, OPT_READ }, @@ -3299,9 +3296,6 @@ int main(int argc, char **argv) { } switch (mode) { - case MODE_VALIDATE_XML: - validation(); - break; case MODE_INFO: Info(handle, model_info); break; -- cgit v1.2.3