/*************************************************************************

 Programma: Labels.c - Testo sorgente in linguaggio C di pubblico dominio

           Autore: Paolo Bozzo - Via Bolzano, 23 - 20100 Milano

 -------------------------------------------------------------------------
 Visualizza etichette e numeri di linea di un listato sorgente AmigaBASIC
--------------------------------------------------------------------------

  Pubblicato in EnigmA Amiga Disk 4/89 a cura di Luigi R. Callegari, con 
        adattamenti ai compilatori Lattice C V5.00 e Aztec C V3.6a

--------------------------------------------------------------------------

Compilazione Lattice V5.0: lc -L Clips
Compilazione Aztec C V3.6: cc +L Clips ------ ln clips c32.lib

**************************************************************************/

#include <exec/types.h>
#include <ctype.h>
#include <string.h>
#include <stdio.h>

#ifndef AZTEC_C
#include <proto/exec.h>
#include <proto/dos.h>
#else
#include <functions.h>
#endif

#define	MAXLINEA		255

find_labels (etichetta, s) /* funzione trova-etichette */
char	etichetta[], s[];
{
register int i,  j;
int ctrl;

if ( isdigit( s[0] ) )   /* numero di linea ? */
	{
	for ( i = j = 0 ; ( isdigit( s[i]) ); i++, j++)
		etichetta [j] = s[i];
	etichetta[j] = '\0';
	return(1);
	}
else                 /* etichetta ? */
	{
	for (i=j=ctrl=0; s[i]!='\0' && s[i] != ':'; i++)
		{	
		if (ctrl==0)
			while (s[i]==' ' || s[i]=='\t')
				i++;
		ctrl = 1;
		if ((	j ==0 && isalpha(s[i]) ) || 
			(j>0 && ( isalnum( s[i] ) || s[i] == '.')) )
			etichetta[j++] = s[i];
		else
			break;
		}

	etichetta[j] = '\0';

	if ( s[i] == ':' && s[i--] != '\'' && !( iskeyword(etichetta)) )
		return(1);
	else return(0);
	}	
}

iskeyword (word) /* controlla se 'word' è una parola-chiave basic */
char	*word;
{
	int risposta=0;
	register int i;
	static char *keyword[]=	{
		"AREAFILL",	"BEEP",		"CLEAR",
		"CLOSE",		"CLS",		"COLOR",
		"CONT",		"CSRLIN",	"DATA",
		"END",		"FILES",		"NEXT",
		"RETURN",	"ELSE",		"LIST",
		"LLIST",		"LOAD",		"LPRINT",
		"NEW",		"PRINT",		"REM",
		"RESTORE",	"RESUME",	"RND",
		"RUN",		"SAVE",		"SLEEP",
		"STOP",		"SYSTEM",	"TRON",
		"TROFF",		"WEND",		"WRITE"
	};

	for ( i=0 ; i <33 ; i++ )
		if ( ! (strcmp (word, keyword[i])))
			risposta=1;

	return( risposta );
} 


void main (argc, argv)
int  argc;
char **argv;
{
FILE     *infile;
char     stringa[MAXLINEA];
char     label[MAXLINEA];
register int i=1;
register int j;

if ( ! ( argc == 2) ) 
	{
	printf("Sintassi: %s nome_file\n", argv[0]);
	exit();
	}

if ( !( infile = fopen (argv[1], "r")) )
	{
	puts("file non trovato");
	exit();
	}

while ( fgets(stringa, MAXLINEA, infile), strlen(stringa)==0) i++;

for ( j=0; j < strlen(stringa) ; j++)
 if ( ! (isascii ( stringa[j]) ) )          /* se non è ASCII */
	{
	puts("Il file selezionato non è ASCII!");
	fclose(infile);
	exit();
	}

puts ("\nLINEA FISICA  ETICHETTA/NUMERO\n");

do
	{
	if (find_labels(label, stringa))
		printf ("%4d          %s\n", i,label);
	++i;
  }
while (fgets(stringa, MAXLINEA, infile)); 

putchar('\n');
fclose(infile);
}

/* **************************** FINE DEL FILE **************************/
