Access Violation

"Alan Bort" <[email protected]>
Newsgroups gmane.text.xml.expat.general
Message-ID <[email protected]>
Hi, I am programming on windows, and this piece of code is giving me
an access violation when inicio_h ends. (at least that's how far I was
able to track the problem)
The Access Violation occurs in the call to XML_Parse();

/*###STRUCTURES###*/


typedef struct _PLAYERDATA {
	BOOL bEnabled;
	BOOL bPlayerMe; /* indica que este jugador, ya sea una pc o un
humano, pertenece a esta PC */
	CHAR cName[13];
	
	/* 0: controlado por el usuario, 1: CPU facil - 4: CPU tramposo, 5:
esperar jugadas de la red */
	UINT uiMode;
	/* puntero a una estructura de ficha, esto nos da acceso al linked
list de las fichas */
	/* NULL si no tenemos información de las fichas de este jugador, nos
basamos luego en uiFichasCount para dibujar la cantidad de fichas del
player */
	FICHA * fFicha;
	UINT uiFichasCount;
	UINT uiScore;
	int iGuiOrientation; /* indica en que angulo se dibuja a este player
en la pantalla, esto se define al crear la jugada */
	
	/* declarar más cosas */
} PLAYERDATA;

typedef struct _GAMEDATA {
	BOOL bNetworkGame;
	BOOL bHostMode;
	CHAR cPath[MAX_PATH];
	PLAYERDATA pdPlayers[4];
	UINT uiMaxPoints;
	UINT uiTimePerTurn;
	UINT uMe; /* jugador humano */
	FICHACOLOCADA * fcFichaCentro;
	/* uiGameStage indica que tiene que ocurrir en este momento en el juego:
		0: valor inicial, esperando configuración de partida
		1: inicializar juego, se crean o se leen los XMLs de inicio de juego
		   (depende si es local o network, si es host o client)
		2: leer el dato uiCurrentTurn para ver quien debe jugar y hacer algo
de acuerdo a que jugador es
		3: Juego terminó, pero el puntaje maximo no fue alcanzado, volver a 1
		4: juego terminó, y el puntaje máximo fue alcanzado.
	*/
	UINT uiGameStage;
	UINT uiCurrentTurn; /* jugada 1, 2, 3, 4, ... */
	UINT uQuedanFichas; /* cantidad de fichas que quedan para repartir a
los jugadores */
} GAMEDATA;

typedef struct {
	UINT uColor1;	//especifica color 1, va seguido al extremo de ultima ficha
	UINT uColor2; //especifica color 2
	UINT uExtremo; //indica el extremo
	BOOL bDomino;	//si ya un jugador canto domino y termino la partida
	BOOL bRecibio; //si un jugador recibio ficha
	BOOL bPaso; //si jugador no juega en su turno	
	UINT uNumJugada; //el numero de jugada
} JUGADA;


/*XML.C CODE*/

void obtener_fichas(char *name)
{
	char buffer[BUFSIZ];
	char file[MAX_PATH];
	char error[BUFSIZ];
	FILE *arch;
	XML_Parser parser;
	int done;
	//static CONFIG config;
//	struct stat estado;
	//Rellena el formato fichas-nombrejugador.xml
	sprintf(file,"%s\\fichas-%s.xml",gpgdJuego->cPath,name);
	MessageBox(NULL,file,"Error",MB_OK|MB_ICONEXCLAMATION);
	if((arch = fopen(file,"rb"))==NULL){
		MessageBox(NULL,"Error al abrir el archivo de
fichas","Error",MB_OK|MB_ICONEXCLAMATION);
		return;
	}
	//Resetea todos los componentes de config
	//reset_config(&config);
	reset_gamedata(gpgdJuego);

	/*Aqui comienza el parseo*/
	//Crea un parser con codificacion UTF-8
	parser = XML_ParserCreate("UTF-8");
	
	//paso estructura CONFIG al parser, para que las funciones
	//que procesan tags puedan operar con ella
	//la reciben en el campo *UserData
	XML_SetUserData(parser,gpgdJuego);
	//Funciones que van a procesar el principio y fin de tags>
 	//para el caso de varios atributos en multilíneas
 	XML_SetElementHandler(parser,inicio_h,fin_h);
 	//para el caso de atributos simples en una sola linea
 	XML_SetCharacterDataHandler(parser,char_h);
	
	do {
	    size_t len = fread(buffer, 1, sizeof(buffer), arch);
	    done = len < sizeof(buffer);
	    //Verifica si hay error en el xml
		int o;
		int p;
		o = XML_Parse(parser, buffer, len, done);
		MessageBox(NULL,"Parsed","Parsing",MB_OK);
		p = (o == XML_STATUS_ERROR);
		
	   if (p) {
	      sprintf(error,"%s at line
%d\n",XML_ErrorString(XML_GetErrorCode(parser)),XML_GetCurrentLineNumber(parser));
			MessageBox(NULL,error,"Error:",MB_OK);
	      //modificar esta parte para api
	      return;
	    }
  	}while (!done);
  	
  	fclose(arch);
	//remove(file);
	XML_ParserFree(parser);
	
	return /*&config*/;
}

static void inicio_h(void *userData,const XML_Char *name,const XML_Char **atts)
{
	int i = 0;
	static UINT uColor1;
	static UINT uColor2;
	static BOOL bEmpieza;
	static BOOL bDone;
//	CONFIG *conf = (CONFIG *)userData;
	GAMEDATA *juego = (GAMEDATA *)userData;
	
	int a;
	int b;
	a = lstrcmpi(name,"jugador");
	b = lstrcmpi(name,"ficha");
	//MessageBox(NULL,name,"CHAU",MB_OK);
	char c[100];
	sprintf(c,"a:%d, b:%d | el or da:%d",a,b,((!a) || (!b)));
	MessageBox(NULL,c,"Test",MB_OK);
	//if((!strcmp(name,"jugador"))||(!strcmp(name,"ficha"))){
	if ((!a) || (!b)){
		//verifica si atributos == NULL, si no entonces
		//contiene informacion importante
		MessageBox(NULL,"Hola","CHAU",MB_OK);
		if (atts == NULL)
			return;
		while(atts[i]){
			if(!strcmp(atts[i],"numero")){
				i++;
				switch(convertir(atts[i++])){
					case 1:	strcpy(juego->pdPlayers[0].cName,atts[++i]); break;
					case 2:	strcpy(juego->pdPlayers[1].cName,atts[++i]); break;
					case 3:	strcpy(juego->pdPlayers[2].cName,atts[++i]); break; 	
					case 4:	strcpy(juego->pdPlayers[3].cName,atts[++i]); break;	
				}
				i++;
			}else{
				bEmpieza = FALSE;
				bDone = FALSE;
				 if(!strcmp(atts[i],"color1")){
					uColor1 = convertir(atts[++i]);
					i++;
				 }else if(!strcmp(atts[i],"color2")){
					uColor2 = convertir(atts[++i]);
					i++;
				 }else if(!strcmp(atts[i],"empieza")){
						i++;
						if(!strcmp(atts[i],"si")){
							bEmpieza = TRUE;
							bDone = TRUE;
						   i++;
						}
				 }
				if (bDone)
					AgregarColor(juego->pdPlayers[juego->uMe].fFicha,uColor1,uColor2,bEmpieza);
			}
		}
	}
	else
		if(!strcmp(name,"maxtiempo"))
			gpgdJuego->uiTimePerTurn=1;
		else
			if(!strcmp(name,"maxpuntos"))
				gpgdJuego->uiMaxPoints = 1;
	MessageBox(NULL,"Parsed","Parsing",MB_OK);
	return;
}

static void fin_h(void *userData,const XML_Char *name)
{
	int a=0;
	a ++;
	/*if (!strcmp(name,"maxtiempo")) {
		gpgdJuego->uiTimePerTurn=0;
	} else if (!strcmp(name,"maxpuntos")) {
		gpgdJuego->uiMaxPoints=0;
	} */
	return;
}

static void char_h(void *userData,const XML_Char *s,int len)
{
	int a=0;
	a ++;
	/*char buffer[64];
//	CONFIG *conf = (CONFIG *)userData;
	GAMEDATA *gamedata = (GAMEDATA *)userData;
		
	strncpy(buffer,s,len);
	buffer[len] = '\0';
	
	if(gpgdJuego->uiTimePerTurn){
		gamedata->uiTimePerTurn = atoi(buffer);
	}else if(gpgdJuego->uiMaxPoints){
		gamedata->uiMaxPoints = atoi(buffer);
	}*/
	return;
}

it is supposed to parse this file, and the call to obtener_fichas is
the following:

                        char tmp_cName[13];
			lstrcpy(tmp_cName,gpgdJuego->pdPlayers[0].cName);
			obtener_fichas(tmp_cName);
			for (int i = 0; i<4;i++){
				if (gpgdJuego->pdPlayers[i].bEnabled){
					if (!lstrcmpi(tmp_cName,gpgdJuego->pdPlayers[i].cName)){
						gpgdJuego->pdPlayers[i].bPlayerMe = TRUE;
						gpgdJuego->uMe = i;
						break;
					}
				}
			}


/**FILE**/
<?xml version="1.0" encoding="UTF-8"?>
<fichas-obiwan>
	<jugadores>
		<jugador numero="1" nombre="obiwan"/>
		<jugador numero="2" nombre="CHAU"/>
		<jugador numero="3" nombre="CHAU"/>
		<jugador numero="4" nombre="CHAU"/>
	</jugadores>
	<maxtiempo>60</maxtiempo>
	<maxpuntos>100</maxpuntos>
	<fichas>
		<ficha color1="A" color2="N"/>
		<ficha color1="R" color2="V"/>
		<ficha color1="Z" color2="Z"/>
		<ficha color1="Z" color2="G"/>
		<ficha color1="Z" color2="B"/>
		<ficha color1="Z" color2="N"/>
		<ficha color1="N" color2="V"/>
		<ficha color1="R" color2="R"/>
		<ficha color1="A" color2="Z"/>
	</fichas>
</fichas-obiwan>


The Access Violation occurs in the call to XML_Parse();
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.