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

#include "/triton/ped/Ped.h"
#include <strings.h>
#include <math.h>


/***** Prototipi delle due funzioni che si trovano in fondo al programma.
	Cio' e' necessario per far si che la funzione principale sia la
	prima nel codice! *****/

struct Line *MySearchLine( struct Line * , int );
char *mystrstr( char * , char * );



/*****
 *
 * FUNZIONE:	ULONG main(struct PEDWindow *p,LONG ccol,LONG cline,ULONG *start,ULONG *end,char *funcname)
 *
 * SCOPO:	Cerca un blocco racchiuso dalle stringhe iniziali e finali
 *		definite dall'utente e che si trovi a livello 0 (non
 *		racchiuso da un altro blocco dello stesso tipo).
 *
 * NOTA:	Utilizza SEMPRE la funzione geta4() o la direttiva __saveds!
 *
 * RESTITUISCE: TRUE=blocco trovato,FALSE=non trovato.
 *
 ****/

ULONG ASM SAVEDS main(RG(a0) struct PEDWindow *p,RG(d0) LONG ccol,RG(d1) LONG cline,RG(a1) ULONG *start,RG(a2) ULONG *end,RG(a3) char *funcname)
{
	struct Line	*line,
			*curstartline;
	int		 nline,
			 startline;
	char		*pun,
			*pun2,
			*name;



	/***** Scorri dal cursore in su per capire a che livello siamo *****/

	curstartline=line=MySearchLine(p->Text->FirstLine,cline);
	nline=cline;
	while(line)
	{
		/***** Se trovo un FOLD certamente non c'e' nulla sopra *****/
		if (line->Folder)
		{
			line=NULL;
			break;
		}

		/***** Se c'e' la stringa esci! *****/
		if (name=mystrstr(line->Buffer,p->Text->FileType->FoldStartStr))	break;

		/***** Passiamo alla linea precedente *****/
		line=line->PrevLine;
		nline--;
	}

	/***** Se non hai trovato la linea ritorna a mani vuote *****/
	if (!line)	return(FALSE);

	/***** Abbiamo trovato l'inizio del blocco. Memorizza la posizione in startline *****/
	startline=nline;

	/***** Partiamo di nuovo dal punto iniziale e scorriamo verso il basso
		fino a scendere al livello 0 (dove termina il blocco). *****/
	line=curstartline->NextLine;
	nline=cline+1;
	while(line)
	{
		/***** Se trovo un FOLD certamente non c'e' nulla sotto  *****/
		if (line->Folder)
		{
			line=NULL;
			break;
		}

		/***** Se c'e' la stringa esci! *****/
		if (mystrstr(line->Buffer,p->Text->FileType->FoldStopStr))	break;

		/***** Passiamo alla linea successiva *****/
		line=line->NextLine;
		nline++;
	}

	/***** Se line==NULL allora non c'e' il finale!!!!!!!!!!!!!! *****/
	if (!line)	return(FALSE);

	/***** Abbiamo trovato anche la fine del blocco. Memorizza le righe
		iniziali e finali del blocco nelle LONG a cui puntato i
		parametri "start" ed "end". *****/
	*start=startline;
	*end=nline;

	/***** Vai avanti fino alla fine copiando il nome della funzione *****/

	pun=funcname;
	pun2=name+strlen(p->Text->FileType->FoldStartStr);
	while((pun2[0]==32)||(pun2[0]==9))	pun2++;
	while((pun2[0]!=32)&&(pun2[0]!=9)&&(pun2[0]))	*pun++=*pun2++;
	*pun='\0';

	/***** Ritorna TRUE *****/
	return(TRUE);
}



/*****
 *
 * FUNZIONE:	struct Line *MySearchLine(struct Line *line,int y)
 *
 * SCOPO:	Cerca l'indirizzo della linea "y-esima" (0=prima) a partire
 *		dalla prima linea del file data da line.
 *		NB: NON tiene conto dei FOLDS.
 *
 * RESTITUISCE: Un puntatore alla linea cercata.
 *
 ****/

struct Line *MySearchLine(struct Line *line,int y)
{
	while(((y--)>0)&&(line))	line=line->NextLine;
	return(line);
}



/*****
 *
 * FUNZIONE:	char *mystrstr(char *str,char *sub)
 *
 * SCOPO:	Cerca la stringa "sub" all'interno della stringa "str"
 *		a partire da destra.
 *
 * RESTITUISCE: l'indirizzo della sottostringa in "str".
 *
 ****/

char *mystrstr(char *str,char *sub)
{
	int	lstr,
		lsub;
	char	*p,
		*q,
		*r;

	lstr=strlen(str);
	lsub=strlen(sub);

	for(p=str;p<=str+lstr-lsub;p++)
	{
		q=p;
		r=sub;
		while(*r)
		{
			if (*r!=*q)	break;
			r++;
			q++;
		}
		if (!(*r))	return(p);
	}
	return(NULL);
}
