xmlize.c

来自「ppc750 system design simulator using sys」· C语言 代码 · 共 285 行

C
285
字号
/***************************************************************************                          xmlize.c  -  description                             -------------------    begin                : Mon Feb 11 2002    copyright            : (C) 2002 by Gilles Mouchard    email                : gilles.mouchard@lri.fr, gilles.mouchard@cea.fr ***************************************************************************//*************************************************************************** *                                                                         * *   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.                                   * *                                                                         * ***************************************************************************/#include <xmlize.h>#include <stdio.h>#include <stdarg.h>void xmlf(char *buffer, UInt32 pc, char *mnemonic, int noperands, ...){	int i;	va_list args;		va_start(args, noperands);	buffer += sprintf(buffer, "<instruction>\n");	buffer += sprintf(buffer, "<pc>%u</pc>\n", pc);	buffer += sprintf(buffer, "<mnemonic>%s</mnemonic>", mnemonic);		buffer += sprintf(buffer, "<operands>\n");	buffer += sprintf(buffer, "<count>%d</count>\n", noperands);		for(i = 0; i < noperands; i++)	{		int type = va_arg(args, int);		buffer += sprintf(buffer, "<operand>\n");						switch(type)		{			case XML_DSTGPR:				{					unsigned regnum = va_arg(args, unsigned int);					buffer += sprintf(buffer, "<direction>destination</direction>\n");					buffer += sprintf(buffer, "<type>register</type>\n");					buffer += sprintf(buffer, "<value>r%u</value>\n", regnum);				}				break;							case XML_DSTFPR:				{					unsigned regnum = va_arg(args, unsigned int);					buffer += sprintf(buffer, "<direction>destination</direction>\n");					buffer += sprintf(buffer, "<type>register</type>\n");					buffer += sprintf(buffer, "<value>f%u</value>\n", regnum);				}				break;						case XML_DSTREG:				{					char *regname = va_arg(args, char *);					buffer += sprintf(buffer, "<direction>destination</direction>\n");					buffer += sprintf(buffer, "<type>register</type>\n");					buffer += sprintf(buffer, "<value>%s</value>\n", regname);				}				break;						case XML_SRCGPR:				{					unsigned int regnum = va_arg(args, unsigned int);										buffer += sprintf(buffer, "<direction>source</direction>\n");					buffer += sprintf(buffer, "<type>register</type>\n");					buffer += sprintf(buffer, "<value>r%u</value>\n", regnum);				}				break;			case XML_SRCFPR:				{					unsigned int regnum = va_arg(args, unsigned int);										buffer += sprintf(buffer, "<direction>source</direction>\n");					buffer += sprintf(buffer, "<type>register</type>\n");					buffer += sprintf(buffer, "<value>f%u</value>\n", regnum);				}				break;						case XML_SRCSPR:				{					unsigned int regnum = va_arg(args, unsigned int);										buffer += sprintf(buffer, "<direction>source</direction>\n");					buffer += sprintf(buffer, "<type>register</type>\n");										switch(regnum)					{						case 1:							buffer += sprintf(buffer, "<value>xer</value>\n");							break;												case 8:							buffer += sprintf(buffer, "<value>lr</value>\n");							break;													case 9:							buffer += sprintf(buffer, "<value>ctr</value>\n");							break;													default:							buffer += sprintf(buffer, "<value>spr%u</value>\n", regnum);					}				}				break;						case XML_DSTSPR:				{					unsigned int regnum = va_arg(args, unsigned int);										buffer += sprintf(buffer, "<direction>destination</direction>\n");					buffer += sprintf(buffer, "<type>register</type>\n");										switch(regnum)					{						case 1:							buffer += sprintf(buffer, "<value>xer</value>\n");							break;												case 8:							buffer += sprintf(buffer, "<value>lr</value>\n");							break;													case 9:							buffer += sprintf(buffer, "<value>ctr</value>\n");							break;													default:							buffer += sprintf(buffer, "<value>spr%u</value>\n", regnum);					}				}				break;						case XML_SRCREG:				{					char *regname = va_arg(args, char *);					buffer += sprintf(buffer, "<direction>source</direction>\n");					buffer += sprintf(buffer, "<type>register</type>\n");					buffer += sprintf(buffer, "<value>%s</value>\n", regname);				}				break;						case XML_UIMM:				{					UInt32 uimm = va_arg(args, UInt32);					buffer += sprintf(buffer, "<direction>source</direction>\n");					buffer += sprintf(buffer, "<type>immediate</type>\n");					buffer += sprintf(buffer, "<value>%u</value>\n", uimm);				}				break;								case XML_SIMM:				{					UInt32 simm = va_arg(args, SInt32);					buffer += sprintf(buffer, "<direction>source</direction>\n");					buffer += sprintf(buffer, "<type>immediate</type>\n");					buffer += sprintf(buffer, "<value>%d</value>\n", simm);				}				break;							case XML_DSTCRF:				{					int fieldnum = va_arg(args, int);					buffer += sprintf(buffer, "<direction>destination</direction>\n");					buffer += sprintf(buffer, "<type>register</type>\n");					if(fieldnum >= 0)						buffer += sprintf(buffer, "<value>cr%u</value>\n", fieldnum);					else						buffer += sprintf(buffer, "<value>cr</value>\n");				}				break;							case XML_DSTXER:				{					unsigned int flags = va_arg(args, unsigned int);					if(flags & XML_XERCA)					{						buffer += sprintf(buffer, "<direction>destination</direction>\n");						buffer += sprintf(buffer, "<type>register</type>\n");						buffer += sprintf(buffer, "<value>xer[ca]</value>\n");					}					if(flags & XML_XEROV)					{						buffer += sprintf(buffer, "<direction>destination</direction>\n");						buffer += sprintf(buffer, "<type>register</type>\n");						buffer += sprintf(buffer, "<value>xer[ov]</value>\n");					}										if(flags & XML_XERSO)					{						buffer += sprintf(buffer, "<direction>destination</direction>\n");						buffer += sprintf(buffer, "<type>register</type>\n");						buffer += sprintf(buffer, "<value>xer[so]</value>\n");					}				}				break;					case XML_SRCXER:				{					unsigned int flags = va_arg(args, unsigned int);					if(flags & XML_XERCA)					{						buffer += sprintf(buffer, "<direction>source</direction>\n");						buffer += sprintf(buffer, "<type>register</type>\n");						buffer += sprintf(buffer, "<value>xer[ca]</value>\n");					}					if(flags & XML_XEROV)					{						buffer += sprintf(buffer, "<direction>source</direction>\n");						buffer += sprintf(buffer, "<type>register</type>\n");						buffer += sprintf(buffer, "<value>xer[ov]</value>\n");					}										if(flags & XML_XERSO)					{						buffer += sprintf(buffer, "<direction>source</direction>\n");						buffer += sprintf(buffer, "<type>register</type>\n");						buffer += sprintf(buffer, "<value>xer[so]</value>\n");					}				}				break;						case XML_SRCCRF:				{					unsigned int fieldnum = va_arg(args, unsigned int);					buffer += sprintf(buffer, "<direction>source</direction>\n");					buffer += sprintf(buffer, "<type>register</type>\n");					buffer += sprintf(buffer, "<value>cr%u</value>\n", fieldnum);				}				break;							case XML_BO:				{					unsigned int bo = va_arg(args, unsigned int);					buffer += sprintf(buffer, "<direction>source</direction>\n");					buffer += sprintf(buffer, "<type>bo</type>\n");					buffer += sprintf(buffer, "<value>%u</value>\n", bo);				}				break;					case XML_BI:				{					unsigned int bi = va_arg(args, unsigned int);					buffer += sprintf(buffer, "<direction>source</direction>\n");					buffer += sprintf(buffer, "<type>bi</type>\n");					buffer += sprintf(buffer, "<value>%u</value>\n", bi);				}				break;							case XML_SRCFPSCR:				{					int dummy = va_arg(args, int);					buffer += sprintf(buffer, "<direction>source</direction>\n");					buffer += sprintf(buffer, "<type>register</type>\n");					buffer += sprintf(buffer, "<value>fpscr</value>\n");				}				break;					case XML_DSTFPSCR:				{					int dummy = va_arg(args, int);					buffer += sprintf(buffer, "<direction>destination</direction>\n");					buffer += sprintf(buffer, "<type>register</type>\n");					buffer += sprintf(buffer, "<value>fpscr</value>\n");				}				break;				}		buffer += sprintf(buffer, "</operand>\n");	}										buffer += sprintf(buffer, "</operands>\n");	buffer += sprintf(buffer, "</instruction>\n");		va_end(args);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?