#include <sys/types.h>
#include <stdio.h>

int	TICS,start,cmpar,fuser;
char	tc[20][10],user[30];

tcp(par)
	int	par;

{
	int	i,j;
	FILE	*fp;
	long	tloc,time();
	char	c,line[15];

	sprintf(line,"/tmp/%s",ttyname(0));
	if ((fp=fopen(line,"r")) == (FILE *)0) exit(1);
	c=getc(fp);
	TICS=c;
	c=getc(fp);
	start=c;
	c=getc(fp);
	cmpar=c;
	i=0;
	j=0;
	while((c=getc(fp))!= EOF) if (!c)
	{
		tc[i][j]=0;
		i++;
		j=0;
	}
	else
		tc[i][j++]=c;
	fclose(fp);
	if (par)
	{
		sprintf(user,"user/%s",getlogin());
		tloc=time ((long *) 0);
		strncat(user,ctime(&tloc)+3,7);

		if ((fuser=open(user,2)) < 0 )
		{
			fuser=creat(user,0777);
			close(fuser);
			if ((fuser=open(user,2)) < 0 ) exit(2);
		}
		lseek(fuser,0L,2);
	}
	else fuser=0;
}
/* imprime linea de comentario */

coment (lc)

	char lc[];
{
	mens(lc,tc[5][0]);
}

/* posicionamiento de cursor */

pos (row,col)
		
	int row,col;
{ 
	if (start) printf(tc[1],row+1,col+1);
	else if (cmpar) printf(tc[1],row+cmpar,col+cmpar);
	else  printf(tc[1],row,col);
	return;
}


/*		ingreso de datos


	row : posicion eje y 
	col : posicion eje x
	len : largo maximo de la variable
	type: tipo 0 -alfanumerico  1 -numerico
	l   : arreglo string de I/O
*/

input(row,col,len,type,l,ret)

	int row,col,len,type,ret;
	char l[];
{
	char n,l1[80];
	int point=0;
	int j,i;
	i=strlen(l);

	pos(row,col);
	for(j=0;j<len;j++) printf("_");
	pos(row,col);
	printf("%s",l);
	j=0;
	while(1)
	{
		n=getin1();
		if (n==27||n==10||n==26||n==13||n==9||n==1||n=='\\'||n==12||n==25||n==4||n==ret) return(n);
		switch (n)
		{
	case '\025' :
			if (i>0)
			{
				j++;
				strcpy(l1,l+i-1);
				i--;
				putchar('\b');
			}
			else putchar('\07');
			break;
	case '\06'  :
			if (j)
			{

				j--;
				printf("%c",l[i]);
				i++;
				if(!j) l1[0]=0;
				else strcpy(l1,l+i);
			}
			else printf("\07");
			break;

	case '\b' :
			if (i>0)
			{
				if(!j) printf("\b_\b");
				if(l[--i]=='.') point=0;
				l[i]=0;
				if(j)
				{
					printf("\b%s_",l1);
					pos(row,col+i);
					strcat(l,l1);
				}
			}
			else printf("\07");
			break;
	case '-' :
			if (len==i+j)
			{
				printf("\07");
				break;
			}
			if (type==1)
				if (i || l[0]=='-')
				{
					printf("\07");
					break;
				}
				else
				{
					l[i++]=n;
					printf("-");
					l[i]=0;
					if (j)
					{
						printf("%s",l1);
						pos(row,col+i);
						strcat(l,l1);
					}
					break;
				}
			else 
			{
				l[i++]=n;
				printf("-");
				l[i]=0;
				if (j)
				{
					printf("%s",l1);
					pos(row,col+i);
					strcat(l,l1);
				}
				break;
			}
	case '.' :
			if (len==i+j)
			{
				printf("\07");
				break;
			}
			if ((type!=1) || (point!=1))
			{
				l[i++]=n;
				if (type==1) point=1;
				printf(".");
				l[i]=0;
				if (j)
				{
					printf("%s",l1);
					pos(row,col+i);
					strcat(l,l1);
				}
			}
			else printf("\07");
			break;
	default:
			if (len==i+j)
			{
				printf("\07");
				break;
			}
			if (type==1)
			{
				if (n>47 && n <58)
				{
					l[i++]=n;
					l[i]=0;
					printf("%c",n);
					if (j)
					{
						printf("%s",l1);
						pos(row,col+i);
						strcat(l,l1);
					}
				}
				else printf("\07");
				break;
			}
			else if (n > 31 && n < 127)
			{
				printf("%c",n);
				l[i++]=n;
				l[i]=0;
				if (j)
				{
					printf("%s",l1);
					pos(row,col+i);
					strcat(l,l1);
				}
			}
			if (n < 32 || n > 126) printf("\07");
			break;
		}
	}
}

box(starty,startx,endy,endx)


	int	startx,starty,endx,endy;

{
	int i;

	printf ("%s",tc[11]);
	pos(starty,startx);

	for (i=startx;i<endx;i++) printf("%s",tc[18]);
	pos(endy,startx);
	for (i=startx;i<endx;i++) printf("%s",tc[18]);
	pos(starty,startx);
	printf("%s",tc[14]);
	pos(starty,endx);
	printf("%s",tc[13]);
	for (i=starty+1;i<endy;i++)
	{
		pos(i,startx);
		printf("%s",tc[17]);
		pos(i,endx);
		printf("%s",tc[17]);
	}
	pos(endy,startx);
	printf("%s",tc[15]);
	pos(endy,endx);
	printf("%s",tc[16]);
	printf ("%s",tc[12]);
}

/* imprime linea de comentario
   en linea row       */

mens (lc,row)

	char lc[];
	int     row;
{
	int n;
	char ll[41],l1[2];
	n=strlen(lc)+1;
	l1[0]=0;
	pos(row,1);
	printf(tc[2]);
	sprintf(ll,"%%%ds%%-%ds",39-n/2,39+n/2);

	printf(ll,l1,lc);
	printf(tc[3]);
	fflush(stdout);
	return(0);
}
getin1 ()

{
	char nn[10],n;
	int u,k,r,c,jj,np;

	np=0;

	while ((n=getchar())<0)
	{
		nap(10L);
		np++;
		if (np>100000)
		{
			if (fuser) write(fuser,"TIM\n",4);
			exit(0);
		}
	}
	for (k=6;k<TICS;k++) if (n==tc[k][0]) break;
	if (k<TICS)
	{
		c=1;
		u=0;
		do
		{
			if (c > -1)
			{
				nn[u++]=n;
				nn[u]=0;
			}
			r=1;
			for (k=6;k<TICS;k++) if (!strncmp(nn,tc[k],u)) break;
			if (k<TICS && u==strlen(tc[k]))
			{
				r=1;
				if (k==6) n=8;
				if (k==7) return (26);
				if (k==8) return (10);
				if (k==9) n=21;
				if (k==10) n=6;
			}
			else if (k<TICS)
			{
				jj=0;
				r=0;
				c= -1;
				while(jj<50)
				{
					c=getchar();
					if (c > 0)
					{
						n=c;
						break;
					}
					else jj++;
				}
				if (jj>49) r=1;
			}
		}
		while (!r);
	}
	return(n);
}
