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.