#define MAX_VAR 400
static int scores[MAX_VAR], textEnd[MAX_VAR], keys[MAX_VAR], curDepth[2], nrVariations[2];
+static char fail[MAX_VAR];
extern int initialRulePlies;
InsertionPoint (int len, EngineOutputData *ed)
{
int i, offs = 0, newScore = ed->score, n = ed->which;
+ char failType;
if(ed->nodes == 0 && ed->score == 0 && ed->time == 0)
newScore = 1e6; // info lines inserted on top
curDepth[n] = ed->depth;
nrVariations[n] = 0; // throw away everything we had
}
+ i = strlen(ed->pv); if(i > 0) i--;
+ failType = ed->pv[i];
+ if(failType != '?' && failType != '!') failType = ' ';
// loop through all lines. Note even / odd used for different panes
for(i=nrVariations[n]-2; i>=0; i-=2) {
// put new item behind those we haven't looked at
textEnd[i+n+2] = offs + len;
scores[i+n+2] = newScore;
keys[i+n+2] = ed->moveKey;
+ fail[i+n+2] = failType;
if(ed->moveKey != keys[i+n] && // same move always tops previous one (as a higher score must be a fail low)
- newScore < scores[i+n]) break;
+ newScore < scores[i+n] && fail[i+n] == ' ') break;
// if it had higher score as previous, move previous in stead
scores[i+n+2] = ed->moveKey == keys[i+n] ? newScore : scores[i+n]; // correct scores of fail-low/high searches
textEnd[i+n+2] = textEnd[i+n] + len;
keys[i+n+2] = keys[i+n];
+ fail[i+n+2] = fail[i+n];
}
if(i<0) {
offs = 0;
textEnd[n] = offs + len;
scores[n] = newScore;
keys[n] = ed->moveKey;
+ fail[n] = failType;
}
nrVariations[n] += 2;
return offs + strlen(header[ed->which]);
}
+#define MATE_SCORE 100000
static char spaces[] = " "; // [HGM] align: spaces for padding
static void
snprintf( buf, 24, "%d%s\t", val, spaces + 2*i);
}
else {
- snprintf( buf, 24, "%.1fM%s\t", val/1000000.0, spaces + 8 + 2*(val > 1e7));
+ char unit = 'M';
+ if(val >= 1e9) val /= 1e3, unit = 'G';
+ snprintf( buf, 24, "%.*f%c%s\t", 1 + (val < 1e7), val/1e6, unit, spaces + 10 + 2*(val >= 1e8));
}
}
snprintf( s_nodes, sizeof(s_nodes)/sizeof(s_nodes[0]), u64Display "%s\t", ed->nodes, spaces + 2*i);
}
else {
- snprintf( s_nodes, sizeof(s_nodes)/sizeof(s_nodes[0]), "%.1fM%s\t", u64ToDouble(ed->nodes) / 1000000.0,
- spaces + 8 + 2*(ed->nodes > 1e7));
+ double x = u64ToDouble(ed->nodes);
+ char unit = 'M';
+ if(x >= 1e9) x /= 1e3, unit = 'G';
+ snprintf( s_nodes, sizeof(s_nodes)/sizeof(s_nodes[0]), "%.*f%c%s\t", 1 + (x < 1e7), x / 1e6,
+ unit, spaces + 10 + 2*(ed->nodes >= 1e8));
}
/* TB Hits etc. */
}
Format(s_seld, params[0]); Format(s_knps, params[1]); Format(s_hits, hits);
- fail = ed->pv[strlen(ed->pv)-1];
+ if(*ed->pv) fail = ed->pv[strlen(ed->pv)-1]; else fail = ' ';
if(fail != '?' && fail != '!') fail = ' ';
/* Score */
if( h == 0 ) {
snprintf( s_score, sizeof(s_score)/sizeof(s_score[0]), " 0.00%c\t", fail );
} else
+ if( h >= MATE_SCORE) snprintf(s_score, 16, " %s#%d%c\t", ( h > MATE_SCORE+9 ? "" : " "), h - MATE_SCORE, fail ); else
+ if(-h >= MATE_SCORE) snprintf(s_score, 16, " %s#-%d%c\t", (-h > MATE_SCORE+9 ? "" : " "), -h - MATE_SCORE, fail ); else
if( h > 0 ) {
snprintf( s_score, sizeof(s_score)/sizeof(s_score[0]), "+%.2f%c\t", h / 100.0, fail );
}
}
/* Time */
+ if(time_secs >= 3600)
+ snprintf( s_time, sizeof(s_time)/sizeof(s_time[0]), "%d:%02d:%02d\t", time_secs / 3600, (time_secs / 60) % 60, time_secs % 60 );
+ else
snprintf( s_time, sizeof(s_time)/sizeof(s_time[0]), "%d:%02d.%02d\t", time_secs / 60, time_secs % 60, time_cent );
if(columnMask & 2) s_score[0] = NULLCHAR; // [HGM] hide: erase columns the user has hidden