[comp.os.msdos.programmer] gcgets - Turbo C fun. to read strings in grafix

stever@Octopus.COM (Steve Resnick ) (08/08/90)

For those of you who requested my post of gcgets, here it is!
Bear in mind this was written for a specific application and there
are some short-comings to it, but the general idea is expressed.

   -------<Cut Here>---------------------------------<Cut Here>--------------
/* gcgets (C) Copyright 1990 Steve Resnick
*/
gcgets(int Xstart, int Ystart, char * buffer, int size)
{
	char *tmp, *start;
	char CurBuf[512];
	int i, c, x, y, Hue, curx, cury;
	x = Xstart; y = Ystart;
	curx = x; cury = y+(textheight("[")-2);
	if ((tmp = calloc(size,1)) == NULL)
	{
		restorecrtmode();
		perror("Cannot allocate memory for console I/O!");
		exit(0);
	}
	start = tmp;
	for ( i = 0; i < (size - 1); )
	{
		Hue = getcolor();
		setcolor(8);
		getimage(curx,cury,curx+10,cury,CurBuf);
		line(curx,cury,curx+10,cury);
		c = getch();
		putimage(curx,cury,CurBuf,COPY_PUT);
		setcolor(Hue);
		switch(c)
		{
			case 0 :
				getch();
				break ;
			case 27:
				*buffer = 0;
				free(start);
				return(0);
			case 13:
				strncpy(buffer,start,size);
				free(start);
				return(strlen(buffer));
			case  8:
				if ((tmp - 1) >= start)
				{
					x-=8;
					setcolor(CYAN);
					gprintf(x,y,"[");
					setcolor(15);
					i-- ;
					*tmp-- = 0;
					*tmp = 0;
				}
				else
				{
					sound(2500);
					delay(10);
					nosound();
				}
				break ;
			default :		
				gprintf(x,y,"%c",c);
				x+=8;
				*tmp++ = c;
				i ++ ;
		}
		curx =  Xstart + textwidth(start);
	}
	strncpy(buffer,start,size);
	free(start);
	return(strlen(buffer));
}
/* This was taken and hacked from the BGIDEMO program */
int gprintf( int xloc, int yloc, char *fmt, ... )
{
  va_list  argptr;			/* Argument list pointer	*/
  char str[140];			/* Buffer to build sting into	*/
  int cnt;				/* Result of SPRINTF for return */
  va_start( argptr, format );		/* Initialize va_ functions	*/
  cnt = vsprintf( str, fmt, argptr );	/* prints string to buffer	*/
  outtextxy( xloc, yloc, str );		/* Send string in graphics mode */
  va_end( argptr );			/* Close va_ functions		*/
  return( cnt );			/* Return the conversion count	*/
}

-- 
----------------------------------------------------------------------------
steve.resnick@f105.n143.z1@FIDONET.ORG #include<std_disclaimer.h>
Flames, grammar errors, spelling errrors >/dev/nul
----------------------------------------------------------------------------