/**********************************************************************/
/**                                                                  **/
/** CHECK_BRACE: Finds the matching brace and jumps to it.           **/
/**                                                                  **/
/**********************************************************************/

#define NUMBRACES 3

void check_brace()
	{
	int bracecount = 1,
		starty,
		startx,
		dir = 0,
		char,ochar
		;

	string brace,
		braces = "{([})]";


	string searchstr = "[";
	int n;

	inq_position (starty,startx);

/* generate search string */

	for (n = 1;n<(strlen(braces)+1);n++)
		{
		sprintf(searchstr,"%s\\%s",searchstr,substr(braces,n,1));
		}

	sprintf(searchstr,"%s]",searchstr);



	ochar = index(braces,read(1))-1;
	if (ochar == -1)
		{
		error ("Must be positioned on a brace - (, ), {, or }.");
		return;
		}

	dir = ochar/NUMBRACES;

	while (bracecount)
		{

		char = 0;
		if (dir)
			{
			if (prev_char())
				if (search_back(searchstr));
					char = index(braces,read(1));
			}
		else
			{
			if (next_char())
				if (search_fwd(searchstr))
					char = index(braces,read(1));
			}

		if (!char) break;

		if (ochar/NUMBRACES == (char-1)/NUMBRACES)
			bracecount++;
		else
			bracecount--;
		}

	if (read(1) != substr(braces,ochar+1+NUMBRACES-NUMBRACES*2*dir,1))
		char = 0;


	if (!char)
		{
		move_abs(starty,startx);
		error("Unmatched Bracket");
		}
	else
		{
		message("Matched.");
		}

	}
