
/***********************************************************************
 *                                                                     *
 *  Program      : BRACKET COUNTER                                     *
 *                                                                     *
 *  Version      : 1.2        (24.03.1991)  (22.10.91)                 *
 *                                                                     *
 *  Description  : This program counts braces, parenthesises,          *
 *                 brackets and remarks from file.  Designed           *
 *                 especially for programmers.                         *
 *                                                                     *
 *  CLI-usage    : BraCo filename                                      *
 *                                                                     *
 *  Distribution : This program is absolutely PUBLIC DOMAIN            *
 *                                                                     *
 *  Bugs         : None known                                          *
 *                                                                     *
 *  Author       : Janne Kantola                                       *
 *                 Fellmanninpuistokatu 20 B 26                        *
 *                 92100  RAAHE ,  FINLAND                             *
 *                 982-220206 ( + 358 82 220206 from other countries)  *
 *                                                                     *
 *  E-mail       : janta@ratol.fi                                      *
 *                                                                     *
 ***********************************************************************/


#include <exec/types.h>
#include <exec/memory.h>
#include <stdio.h>
#include <clib/exec_protos.h>
#include <clib/dos_protos.h>
#include <libraries/dos.h>

BPTR infile;

BYTE BoldON[]  = {'\x1B','[','1','m','\0'};     /* Bold text ON   */
BYTE BoldOFF[] = {'\x1B','[','0','m','\0'};     /* Bold text OFF  */
BYTE ColorON[] = {'\x1B','[','3','3','m','\0'}; /* Color ON       */
BYTE Up[]      = {'\x1B','[','A','\0'};         /* Move cursor up */

LONG buffersize = 16384;


VOID main (argc, argv)
int argc;
char *argv[];

{
    APTR  mypointer;
    LONG  luettuja;
	UBYTE charz;
	UBYTE *alue;
	LONG  filelen  = 0;
	SHORT braceon  = 0;  	/* '{' */
	SHORT braceoff = 0;  	/* '}' */
 	SHORT pareon   = 0;  	/* '(' */  
 	SHORT pareoff  = 0;  	/* ')' */
 	SHORT brackon  = 0;  	/* '[' */  
 	SHORT brackoff = 0;  	/* ']' */
	SHORT remon	   = 0;  	/* remark on  */
	SHORT remoff   = 0;  	/* remark off */
	SHORT help     = 0;
	LONG  i        = 0;


	printf("\n%s Produced by JanTa ®1991 : Bracket Counter v1.2%s\n\n",ColorON,BoldOFF);
	if (argc<2 || argv[1][0]=='?')
		printf(" %s%sUSAGE:%s BraCo filename\n\n", BoldON, ColorON, BoldOFF);
	else
		{
		if ((infile=(BPTR)Open(argv[1], MODE_OLDFILE))!=NULL)
			{
			filelen = Seek(infile, 0,  1);
			filelen = Seek(infile, 0, -1);
			printf(" %ld bytes, counting ...\n", filelen);

			mypointer = (APTR)AllocMem(filelen+1, MEMF_PUBLIC);
			if (!mypointer)
				{
				mypointer = (APTR)AllocMem(buffersize, MEMF_PUBLIC);
				if (!mypointer)
				    {
				    printf("\nNot enought memory!!");
				    Close(infile);
					Exit(100);
				    }
				}
			else buffersize = filelen+1;	/* if !mypointer... */

			luettuja = Read(infile, mypointer, buffersize);
			alue = (UBYTE *)mypointer;
			printf("Luettuja oli %ld kpl.\n\n", luettuja);
			do
			  {
 			  i=-1;
			  while (i++<luettuja)
				{
				charz = *(alue+i);

				if (!( (charz <34 || charz >126) || (charz>47 && charz<91) || (charz>93 && charz<123) ))  
					{
					if (charz == '{')  braceon++ ;
					if (charz == '}')  braceoff++;
					if (charz == '(')  pareon++  ;
					if (charz == ')')  pareoff++ ;
					if (charz == '[')  brackon++ ;
					if (charz == ']')  brackoff++;
					if ((charz == '/') && (help == 0))    help = 1;
					if ((charz == '*') && (help == 0))    help = 2;
					if ((charz == '/') && (help == 2)) 
						{
						remoff++;
						help    = 0;
						}
					if ((charz == '*') && (help == 1))  
						{
						remon++;
						help   = 0;
						}
					}
					if (charz != '/' && charz != '*')  help = 0;
				}
			  } while (luettuja == buffersize);

			printf("%s", Up);
			printf(" Brackets in the file %s%s%s :\n\n", ColorON, argv[1], BoldOFF);
			printf(" %s{%s -> %3d pcs    ", ColorON, BoldOFF, braceon );
			printf(" %s(%s -> %3d pcs    ", ColorON, BoldOFF, pareon  );
			printf(" %s[%s -> %3d pcs    ", ColorON, BoldOFF, brackon );
			printf(" %s/*%s -> %3d pcs\n",  ColorON, BoldOFF, remon   );
			printf(" %s}%s -> %3d pcs    ", ColorON, BoldOFF, braceoff);
			printf(" %s)%s -> %3d pcs    ", ColorON, BoldOFF, pareoff );
			printf(" %s]%s -> %3d pcs    ", ColorON, BoldOFF, brackoff);
			printf(" %s*/%s -> %3d pcs\n\n",ColorON, BoldOFF, remoff  );
			if (braceon!=braceoff || pareon!=pareoff || brackon!=brackoff || remon!=remoff)
			printf(" %s%sWARNING: %sUnmatched brackets!!\n\n", BoldON, ColorON, BoldOFF);
			Close(infile);
			FreeMem(mypointer, buffersize);
			}
			else 
			{
			printf(" %s%sERROR: %sCan't ", BoldON, ColorON, BoldOFF);
			printf("open file %s%s%s\n\n", BoldON, argv[1], BoldOFF);
			}
		}		
}

/* end of file BraCo.c */
