/*-------------------------------------------------------------*/
/* Cut this out and save to disp.c */
/* Program written by Gregory F. Shay */
#include <stdio.h>

#define MAXN 2048
#define ssh 128    /* Horizontal plot size */
#define ssv 22     /* Vertical plot size */

main()
{
	int i,j,k,flag;
	char dtype;
	char graph[ssv+1][ssh+1];
	float max,sumi[132],sumr[132];
	float xinr[MAXN],xini[MAXN];
	int LOGN,N,size,avenum;
	float av();

flag = 0;
/* input size of array */
scanf("%c\n",&dtype);
if ((dtype != 'r') && (dtype != 'c'))
	{
	fprintf(stderr,"Incompatible input data file, expect real or complex\n");
	flag = 1;
	}
scanf("%d \n",&LOGN);
if ((LOGN<2) || (LOGN>14) )
	{
	flag = 1;
	fprintf(stderr,"Error, size of array, %d, out of range.\n",LOGN);
	}

N = 1 << LOGN;
if (N>MAXN) 
	{
	fprintf(stderr,"Error, maximum size of array is set to %d\n",MAXN);
	flag = 1;
	}

if (flag == 0)
  {

/* Find size of graph */

if (N>ssh)
	{
	avenum = N/ssh;
	size = ssh;
	}
 else
	{
	avenum = 1;
	size = N;
	}

/*printf("avenum= %d, size = %d\n",avenum,size);*/
/* Read in data */
if (dtype == 'r')
	for(i=0;i<N;i++)
	{
	scanf("%f ",&xinr[i]);
	xini[i] = 0.;
	}
if (dtype == 'c')
	for(i=0;i<N;i++)
		scanf("%f %f",&xinr[i],&xini[i]);

/* Initialize graph */
graphinit(graph,size);

/* Rescale horizontally and find maximum */
max = 0.;
for(i=0;i<size;i++)
	{
	if (avenum != 1)
		{
		sumr[i] = 0.;
		sumi[i] = 0.;
		for (j=0;j<avenum;j++)
			{
			sumr[i] += xinr[i*avenum+j];
			sumi[i] += xini[i*avenum+j];
			}
		sumi[i] /= avenum;
		sumr[i] /= avenum;
		}
	else
		{
		sumr[i] = xinr[i];
		sumi[i] = xini[i];
		}

	if (av(sumr[i])>max)
			max = sumr[i];
/* A---------------------------------------A */
/* Note: delete this section if real only    */
	if (av(sumi[i])>max)
			max = sumi[i];
/* A---------------------------------------A */
	}
/*printf("Max = %g \n",max);*/

if (max == 0.) 
	{
	fprintf (stderr,"Error! Max = 0.0");
	max = 1.0;
	}

/* Normalize to (ssv/2)*max */

for(i=0;i<size;i++)
	{
	sumr[i] *= (ssv/2)/max;
	sumi[i] *= (ssv/2)/max;
	j=(int)(sumr[i]+.5);
	graph[(ssv/2)-j][i]='*';
	}

/* Print out graph */
/* Set up graphics mode */
if (N > 80)
	printf("%c%c%c%c%c",27,91,'?','3','h');

for(i=0;i<=ssv;i++)
	printf("%s\n",graph[i]);

/* Now plot complex part */
if (dtype == 'c')
{
printf("\n");
graphinit(graph,size);

for(i=0;i<size;i++)
	{
	j=(int)(sumi[i]+.5);
	graph[(ssv/2)-j][i]='*';
	}

/* Print out graph */
for(i=0;i<=ssv;i++)
	printf("%s\n",graph[i]);
}
	
  } /* end of if flag == 0 clause */
} /* End of main */

float av(a)
float a;
{
if (a < 0.) 
	return(-1.*a);
else
	return(a);
}

graphinit(graph,size)
	char graph[ssv+1][ssh+1];
	int size;
{
	int i,j;

for(i=0;i<=ssv;i++)
	{
	graph[i][size]=0;
	for(j=0;j<size;j++)
		graph[i][j]=' ';
	}

for(i=0;i<size;i++)
	graph[ssv/2][i]='_';

for(i=0;i<=ssv;i++)
	{
	graph[i][0]='|';
	graph[i][size-1]='|';
	}

}
