Computer Chess Club Archives


Search

Terms

Messages

Subject: cool stuff (free code!)

Author: Anthony Cozzie

Date: 11:16:26 10/07/03


This isn't particularly well tested, but it seems to work.

zprintf("Selected move: %02d of %-2d: %A is legal in position\n%B\n",
		      3, 4, p, mtemp, p);
zprintf("TTHits: %J (%1K) (%3K) (%6K) (%9K) %R\n", pc1, pc1, pc1, pc1, pc1, pc1,
pc2);
zprintf("Moving from %Q to %Q induced a crash!!\n", F7, G4);
loop = zappa_get_time_ms();
for(i = 0; i < 100000; i++)
zsprintf(tbuffer, "TTHits: %J (%1K) (%3K) (%6K) (%9K) %R\n", pc1, pc1, pc1, pc1,
pc1, pc1, pc2);
printf("100,000 runs completed: %d ms\n", zappa_get_time_ms() - loop);



Selected move: 03 of 4 : Ba1 is legal in position
- k - - - - - b
- - - - - - q -
- - - - - p p -
- - - - P - - -
- - - Q - - - -
- - - - - - - -
- B - - - - - -
- - - - - - - K

WQC:0 WKC:0 BQC:0 BKC:0 Turn:WHITE EP:0
MB:  -100 WPC: 2 BPC: 2 HM:0 HKL:2469983F HKH:30E7865D


TTHits: 5623777777 (5G) (5623M) (5623777K) (5623777777) [55.0%]
Moving from F7 to G4 induced a crash!!
100,000 runs completed: 1031 ms

//extended fprintf - arglist
//This is not duplicated because of the unknown (could be very large) size.
int vzfprintf(FILE *fp, char *fmt, va_list ap)
{
	int fmt_type, printed = 0, consumed, num;
	char temp[1024];
	zpos *p;
	zmove m;
	zappa_u64 pc1, pc2;
	int sq;

	while(1)
	{
		if((fmt_type = vzprintf_parse_fmt_str(fmt, temp, &consumed, &num)) ==
ZPRINTF_NONE)
			return printed + fprintf(fp, "%s", temp);

		if(fmt_type != ZPRINTF_LIBRARY)
			printed += fprintf(fp, temp);

		switch(fmt_type)
		{
		case ZPRINTF_BOARD:
			p = va_arg(ap, zpos*);   //1 argument
			printed += p_fprint(fp, p, 0);
			break;

		case ZPRINTF_SAN_MOVE:
			p = va_arg(ap, zpos*);
			m = va_arg(ap, zmove);
			printed += m_fprint(fp, p, m, ZMOVE_TEXT_TYPE_SAN);
			break;

		case ZPRINTF_LONG_SAN_MOVE:
			m = va_arg(ap, zmove);
			printed += m_fprint(fp, (zpos*)0, m, ZMOVE_TEXT_TYPE_LONG_SAN);
			break;

		case ZPRINTF_COORD_MOVE:
			m = va_arg(ap, zmove);
			printed += m_fprint(fp, (zpos*)0, m, ZMOVE_TEXT_TYPE_COORD);
			break;

		case ZPRINTF_PERF_CTR:
			pc1 = va_arg(ap, zappa_u64);
			printed += pc_fprint(fp, pc1, COUNTER_FIXEDPT, 0, (char*)0);
			break;

		case ZPRINTF_ENG_PERF_CTR:
			pc1 = va_arg(ap, zappa_u64);
			printed += pc_fprint(fp, pc1, COUNTER_ENG, num, (char*)0);
			break;

		case ZPRINTF_PERF_CTR_RATIO:
			pc1 = va_arg(ap, zappa_u64);
			pc2 = va_arg(ap, zappa_u64);
			printed += pcr_fprint(fp, pc1, pc2);
			break;

		case ZPRINTF_SQUARE:
			sq = va_arg(ap, int);
			printed += fprintf(fp, "%c%c", (sq & 7) + 'A', (sq >> 3) + '1');
			break;

		case ZPRINTF_LIBRARY:
			printed += vfprintf(fp, temp, ap);

			//we need to pull the argument off the arglist.
			switch(temp[strlen(temp)-1])
		  {
				case 'c': va_arg(ap, char); break;
				case 'd':
				case 'i':
				case 'o':
				case 'u':
				case 'x':
				case 'X': va_arg(ap, int); break;
				case 'e':
				case 'E':
				case 'f':
				case 'g':
				case 'G': va_arg(ap, double); break;
				case 'p': va_arg(ap, void*); break;
				case 's': va_arg(ap, char*); break;
				default:  printf("error: unknown type specifier!\n");
			}
		}
		fmt += consumed;
	}
}

int vzprintf_parse_fmt_str(char *fmt, char *straight, int *consumed, int *num)
{
	int i, j;

	for(i = 0; fmt[i] != '\0'; i++)
	{
		//Look for a format specifier
		if(fmt[i] == '%' && fmt[i+1] != '%')
		{
			straight[i] = '\0';                   //terminate pass_through string.
			for(j = i+1; !isalpha(fmt[j]); j++) ; //scan until we find our format
specifier
			*consumed = j + (fmt[j] != 0);        //format specifier could be last
character, don't overflow.

			if(j-i > 1) //assume we've got some numbers going on
				sscanf(fmt+i+1, "%d", num);

			switch(fmt[j])
			{
				case 'B': return ZPRINTF_BOARD;
				case 'A': return ZPRINTF_SAN_MOVE;
				case 'L': return ZPRINTF_LONG_SAN_MOVE;
				case 'M': return ZPRINTF_COORD_MOVE;
				case 'J': return ZPRINTF_PERF_CTR;
				case 'K': return ZPRINTF_ENG_PERF_CTR;
				case 'R': return ZPRINTF_PERF_CTR_RATIO;
				case 'Q': return ZPRINTF_SQUARE;
				case 'V': return ZPRINTF_VARIATION;
				default:  for(; i <= j; i++) straight[i] = fmt[i];
									straight[i] = '\0';
									return ZPRINTF_LIBRARY;
			}
		}
		straight[i] = fmt[i];
	}

	straight[i] = '\0';
	return ZPRINTF_NONE;
}



This page took 0 seconds to execute

Last modified: Thu, 15 Apr 21 08:11:13 -0700

Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.