📄 simuxmleep.c
字号:
/* ============================================================================ Project Name : jayaCard Module Name : proto/hal/simu/simuXMLeep.c Version : $Id: simuXMLeep.c,v 1.17 2004/01/11 09:56:31 dgil Exp $ Description: Export EEPROM content to XML file. The Original Code is jayaCard code. The Initial Developer of the Original Code is Gilles Dumortier. Portions created by the Initial Developer are Copyright (C) 2002-2004 the Initial Developer. All Rights Reserved. Contributor(s): This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see http://www.gnu.org/licenses/gpl.html History Rev Description 072803 dgil Wrote it from experimental eeprom_xml/eeprom_xml.c ============================================================================*/#include "precomp.h"/* ============================================================================ Output XML / the context ========================================================================= */typedef struct tagOutputXMLContext { FILE* f; jbyte space; jword curadr;} OUTPUTXMLCONTEXT,*POUTPUTXMLCONTEXT;void jlog_context( POUTPUTXMLCONTEXT context, char * func_name ) { jlog("simuXML", "%s - Context adr=%04Xh space=%d", func_name, context->curadr, context->space );}/* ============================================================================ Load a file header for dump ! ========================================================================= */BIOS_STREAM streamDump;HEADER_FILE dumpFile;jbool __load_file_header(jword link){ LOG1("simuXML","__load_file_header(): addr=0x%.4X",link); HAL_CRC_INIT(); BIOS_INIT_STREAM(&streamDump,READ_STREAM|CHKCRC_STREAM|SECURE_STREAM,link,SIZE_HEADER_FILE); if (BIOS_READ_STREAM((jbyte xdata*)&dumpFile,&streamDump,SIZE_HEADER_FILE)!=JSEC_OK) { return jfalse; } return jtrue;}/* ============================================================================ Endianess ========================================================================= */#if defined(PLATFORM_LITTLE_ENDIAN)#define blk(w) (w = ((jword)((((jword)LOBYTE(w))<<8) + ((jword)HIBYTE(w)))))#else#define blk(w) w#endif/* ============================================================================ Forward decls ========================================================================= */void xml_output_file(POUTPUTXMLCONTEXT context);void xml_output_DF(POUTPUTXMLCONTEXT context);void xml_output_EF(POUTPUTXMLCONTEXT context);/* ============================================================================ XML output area ========================================================================= */void xml_output_area(POUTPUTXMLCONTEXT context,jword adr,jword size){ jbyte n; jlog("simuXML", "xml_output_area - adr=%04Xh size=%04Xh (%d)", adr, size, size ); jlog_context( context, "xml_output_area" ); for (n=0;n<context->space+2;n++) { fprintf(context->f," "); } while (size>0) { fprintf(context->f,"%.2X ",HAL_EEPROM_READ_BYTE(adr)); adr++; size--; }}#ifdef JAYA_FILESYSTEM/* ============================================================================ XML output record ========================================================================= */void xml_output_record(POUTPUTXMLCONTEXT context,jword adr,jword size){ jbyte n; jlog("simuXML", "xml_output_record - adr=%04Xh size=%04Xh (%d)", adr, size, size ); jlog_context( context, "xml_output_record" ); for (n=0;n<context->space+1;n++) { fprintf(context->f," "); } fprintf(context->f,"<record adr=\"%.4X\" size=\"%.4X\" >\n",adr,size); xml_output_area(context,adr,size); fprintf(context->f,"\n"); for (n=0;n<context->space+1;n++) { fprintf(context->f," "); } fprintf(context->f,"</record>\n");}/* ============================================================================ XML output records ========================================================================= */void xml_output_records(POUTPUTXMLCONTEXT context,jbyte nummax,jbyte size){ jbyte n; jlog("simuXML", "xml_output_records - nummax=%d size=%02Xh (%d)", nummax , size, size ); jlog_context( context, "xml_output_records" ); n = 0; while (n<nummax) { xml_output_record(context,context->curadr+(n*size),size); n++; }}/* ============================================================================ XML output binary ========================================================================= */void xml_output_binary(POUTPUTXMLCONTEXT context,jword adr,jword size){ jbyte n; jlog("simuXML", "xml_output_binary - adr=%04Xh size=%04Xh (%d)", adr , size, size ); jlog_context( context, "xml_output_binary" ); for (n=0;n<context->space+1;n++) { fprintf(context->f," "); } fprintf(context->f,"<binary adr=\"%.4X\" size=\"%.4X\" >\n",adr,size); xml_output_area(context,adr,size); fprintf(context->f,"\n"); for (n=0;n<context->space+1;n++) { fprintf(context->f," "); } fprintf(context->f,"</binary>\n");}/* ============================================================================ XML output a link ========================================================================= */void xml_output_link(POUTPUTXMLCONTEXT context,jword link,jbool sibling){ POUTPUTXMLCONTEXT newcontext; jlog("simuXML", "xml_output_link - link=%04Xh sibling=%d", link, sibling ); jlog_context( context, "xml_output_link" ); /* embedded file */ newcontext = (POUTPUTXMLCONTEXT)malloc(sizeof(OUTPUTXMLCONTEXT)); if (newcontext==NULL) return; newcontext->curadr = link; newcontext->f = context->f; newcontext->space = context->space+(sibling?0:1); xml_output_file(newcontext); free((void*)newcontext);}/* ============================================================================ XML output tag MF ========================================================================= */void xml_output_MF(POUTPUTXMLCONTEXT context){ jword first_file; jword default_df; jlog_context( context, "xml_output_MF" ); first_file = HAL_EEPROM_READ_WORD(context->curadr+14); blk(first_file); default_df = HAL_EEPROM_READ_WORD(context->curadr+10); blk(default_df); fprintf(context->f,"first_file=\"%.4X\" default_df=\"%.4X\" ",first_file,default_df); fprintf(context->f,">\n"); if (first_file!=0x0000) xml_output_link(context,first_file,jfalse);}/* ============================================================================ XML output tag DF ========================================================================= */void xml_output_DF(POUTPUTXMLCONTEXT context){ jword first_file; jword next_file; jlog_context( context, "xml_output_DF" ); first_file = HAL_EEPROM_READ_WORD(context->curadr+14); blk(first_file); next_file = HAL_EEPROM_READ_WORD(context->curadr+10); blk(next_file); fprintf(context->f,"first_file=\"%.4X\" next_file=\"%.4X\" ",first_file,next_file); fprintf(context->f,">\n"); if (first_file!=0x0000) xml_output_link(context,first_file,jfalse);}/* ============================================================================ XML output tag binary EF ========================================================================= */void xml_output_binary_EF(POUTPUTXMLCONTEXT context){ jword body_ef; jword filesize; jword next_file; jword adr; jlog_context( context, "xml_output_binary_EF" ); next_file = HAL_EEPROM_READ_WORD(context->curadr+10); blk(next_file); body_ef = HAL_EEPROM_READ_WORD(context->curadr+12); blk(body_ef); filesize = HAL_EEPROM_READ_WORD(context->curadr+14); blk(filesize); fprintf(context->f,"body_ef=\"%.4X\" filesize=\"%.4X\" next_file=\"%.4X\" >\n",body_ef,filesize,next_file); adr = body_ef; while (filesize>0) { xml_output_binary(context,adr,MIN(filesize,16)); adr = adr + MIN(filesize,16); filesize = filesize - MIN(filesize,16); }}/* ============================================================================ XML output tag record EF ========================================================================= */void xml_output_record_EF(POUTPUTXMLCONTEXT context){ jbyte nummax; jbyte size; jbyte num; jbyte top; jword body_ef; jword next_file; jlog_context( context, "xml_output_record_EF" ); next_file = HAL_EEPROM_READ_WORD(context->curadr+10); blk(next_file); body_ef = HAL_EEPROM_READ_WORD(context->curadr+12); blk(body_ef); nummax = HAL_EEPROM_READ_BYTE(context->curadr+14); size = HAL_EEPROM_READ_BYTE(context->curadr+15); num = HAL_EEPROM_READ_BYTE(context->curadr+16); top = HAL_EEPROM_READ_BYTE(context->curadr+17); fprintf(context->f,"body_ef=\"%.4X\" nummax=\"%.2X\" size=\"%.2X\" num=\"%.2X\" top=\"%.2X\" next_file=\"%.4X\" >\n",body_ef,nummax,size,num,top,next_file); xml_output_records(context,nummax,size);}/* ============================================================================ XML output file ========================================================================= */void xml_output_file(POUTPUTXMLCONTEXT context){ jword fid; jbyte fdesc; jbyte sfi; jword acs1; jbyte acs2; jword key1; jbyte key2; jword crc; jbyte n; char end[80]; jword next_file = 0x0000; jlog_context( context, "xml_output_file" ); fid = HAL_EEPROM_READ_WORD(context->curadr); blk(fid); acs1 = HAL_EEPROM_READ_WORD(context->curadr+4); acs2 = HAL_EEPROM_READ_BYTE(context->curadr+6); key1 = HAL_EEPROM_READ_WORD(context->curadr+7); key2 = HAL_EEPROM_READ_BYTE(context->curadr+9); fdesc = HAL_EEPROM_READ_BYTE(context->curadr+2); sfi = HAL_EEPROM_READ_BYTE(context->curadr+3); crc = HAL_EEPROM_READ_WORD(context->curadr+18); blk(crc); fprintf(context->f,"\n"); for (n=0;n<context->space;n++) { fprintf(context->f," "); } switch (fdesc&FDESC_TYPE_MASK) { case FDESC_TYPE_DF: if (fid==0x3F00) { fprintf(context->f,"<MF"); } else { fprintf(context->f,"<DF"); } break; case FDESC_TYPE_BINARY: fprintf(context->f,"<EF_BINARY"); break; case FDESC_TYPE_LINEAR: fprintf(context->f,"<EF_LINEAR"); break; case FDESC_TYPE_CYCLIC: fprintf(context->f,"<EF_CYCLIC"); break; } fprintf(context->f," header=\"%.4X\" fid=\"%.4X\" fdesc=\"%.2X\" sfi=\"%.2X\" ac=\"%.4X%.2X\" ac_key=\"%.4X%.2X\" ",context->curadr,fid,fdesc,sfi,acs1,acs2,key1,key2); fprintf(context->f,"crc=\"%.4X\" ",crc); /* validate the header file ! */ if (!__load_file_header(context->curadr)) { fprintf(stderr,"******** xml_output_file(): file header corrupted ! \n"); return; } switch (fdesc&FDESC_TYPE_MASK) { case FDESC_TYPE_DF: if (fid==0x3F00) { xml_output_MF(context); sprintf(end,"</MF>\n"); next_file = 0x0000; } else { xml_output_DF(context); sprintf(end,"</DF>\n"); next_file = HAL_EEPROM_READ_WORD(context->curadr+10); blk(next_file); } break; case FDESC_TYPE_BINARY: xml_output_binary_EF(context); sprintf(end,"</EF_BINARY>\n"); next_file = HAL_EEPROM_READ_WORD(context->curadr+10); blk(next_file); break; case FDESC_TYPE_LINEAR: xml_output_record_EF(context); sprintf(end,"</EF_LINEAR>\n"); next_file = HAL_EEPROM_READ_WORD(context->curadr+10); blk(next_file); break; case FDESC_TYPE_CYCLIC: xml_output_record_EF(context); sprintf(end,"</EF_CYCLIC>\n"); next_file = HAL_EEPROM_READ_WORD(context->curadr+10); blk(next_file); break; } fprintf(context->f,"\n"); for (n=0;n<context->space;n++) { fprintf(context->f," "); } fprintf(context->f,end); if (next_file!=0x0000) xml_output_link(context,next_file,jtrue);}#endif /* defined JAYA_FILESYSTEM*//* ============================================================================ xml_eeprom() output the eeprom content ========================================================================= */jbool __simu_save_XML_eeprom(int life){ jbyte sav_lasterr; POUTPUTXMLCONTEXT context; FILE* f; char szFilename[80]; sav_lasterr = lasterr; context = (POUTPUTXMLCONTEXT)malloc(sizeof(OUTPUTXMLCONTEXT)); if (context==NULL) return jfalse; if (life==EEPROM_FILE_LIVE) { strcpy(szFilename,"eeprom.xml"); } else { sprintf(szFilename,"eeprom%.3d.xml",life); } f = fopen(szFilename,"wt"); if (f==NULL) { fprintf(stderr,"__simu_save_XML_eeprom(): can't open the '%s' file to write to !\n",szFilename); free((void*)context); return jfalse; } context->curadr = ADDR_HEADER_MF; context->f = f; context->space = 0; #ifdef JAYA_FILESYSTEM xml_output_file(context); #endif free((void*)context); fclose(f); LOG1("EEPROM","Info: '%s' file has been created !",szFilename); lasterr = sav_lasterr; return jtrue;}/* ========================================================================= That's all folks ! ========================================================================= */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -