
/***** Include vari *****/

#include "ProgED:sources/include/Ped.h"
#include <string.h>



/*****
 *
 * FUNZIONE:	ULONG SAVEDS ASM main(char *line,char *sectionname)
 *
 * SCOPO:	Cerca un riferimento ad una funzione C nella linea puntata
 *		da "line". Il nome della funzione viene copiato in
 *		"sectionname". Dipendentemente dal modo di scrivere
 *		programmi questo scanner puo' fallire nel suo scopo.
 *		Ho scritto questo scanner secondo il MIO modo di
 *		scrivere funzioni. Se il vostro modo e' diverso dal mio
 *		scrivetene uno vostro o migliorate questo.
 *
 * NOTA:	Utilizza SEMPRE la funzione geta4() o la direttiva __saveds!
 *
 * RESTITUISCE: Lunghezza della stringa copiata in "sectionname".
 *		0=riferimento non trovato.
 *
 ****/

ULONG SAVEDS ASM main(RG(a0) char *line,RG(a1) char *sectionname)
{
	char	*p,
		*q,
		*d,
		*r;
	int	 i,
		 n1,
		 n2;




	/***** Se la linea inizia per 'static ' saltalo *****/
	if ((line[0]=='s')||(line[0]=='S'))
	if ((line[1]=='t')||(line[1]=='T'))
	if ((line[2]=='a')||(line[2]=='A'))
	if ((line[3]=='t')||(line[3]=='T'))
	if ((line[4]=='i')||(line[4]=='I'))
	if ((line[5]=='c')||(line[5]=='C'))
	if ((line[6]==32)||(line[6]==9))
	line+=7;

	/***** Se la linea inizia per 'struct ' saltalo *****/
	if (line[0]=='s')
	if (line[1]=='t')
	if (line[2]=='r')
	if (line[3]=='u')
	if (line[4]=='c')
	if (line[5]=='t')
	if (line[6]==32)
	line+=7;

	/***** Controlla che sulla linea ci siano UNA '(' ed UNA ')' *****/
	p=line;
	n1=n2=0;
	while(*p)
	{
		if (*p=='(')	n1++;
		if (*p==')')
		{
			r=p+1;
			n2++;
		}
		p++;
	}

	/****** Se c'e' una '(' ma nessuna ')' forse la definizione e' su piu' linee
		in tal caso controlla che la linea finisca per ','! *****/
	if ((n1==1)&&(!n2))
	{
		if (line[strlen(line)-1]==',')
		{
			r=line+strlen(line);
			n2=1;
		}
	}

	/****** Continua solo se c'era solo una '(' ed una ')' *****/
	if ((n1!=1)||(n2!=1))	return(0);

	/***** In caso positivo -> controlla che la ')' non sia seguita da altro (al massimo ';') *****/
	p=r;
	while(*p)
	{
		if ((*p!=32)&&(*p!=9)&&(*p!=';'))	break;
		p++;
	}

	if (*p)	return(0);

	/****** OK! Controlla che la linea sia del tipo xxxx xxxx(.... *****/
	q=p=line;
	n1=0;
	while(*p)
	{
		if ((*p==32)||(*p==9))
		{
			q=p+1;
			n1++;
		}

		if (*p=='(')	break;

		p++;
	}

	if (n1>1)	return(0);

	if (n1==1)	if (q==line+1)	return(0);

	/***** Se il tipo di ritorno e' un puntatore elimina l'asterisco *****/
	if (*q=='*')	q++;

	/***** Copia il nome e ritorna *****/
	d=sectionname;
	for(i=0;i<p-q;i++)	*d++=q[i];
	*d='\0';
	return(p-q);
}

