
// pv.cpp

// includes

#include <cstring>

#include "board.h"
#include "move.h"
#include "move_do.h"
#include "pv.h"
#include "util.h"

// functions

// pv_is_ok()

bool pv_is_ok(const mv_t pv[]) {

    int pos;
    int move;

    if (pv == NULL) return false;

    for (pos = 0; true; pos++) {

        if (pos >= 256) return false;
        move = pv[pos];

        if (move == MoveNone) return true;
        if (!move_is_ok(move)) return false;
    }

    return true;
}

// pv_copy()

void pv_copy(mv_t dst[], const mv_t src[]) {

    ASSERT(pv_is_ok(src));
    ASSERT(dst!=NULL);

    while ((*dst++ = *src++) != MoveNone)
        ;
}

// pv_cat()

void pv_cat(mv_t dst[], const mv_t src[], int move) {

    ASSERT(pv_is_ok(src));
    ASSERT(dst!=NULL);

    *dst++ = move;

    while ((*dst++ = *src++) != MoveNone)
        ;
}

// pv_to_string()

bool pv_to_string(const mv_t pv[], char string[], int size) {

    int pos;
    int move;

    ASSERT(pv_is_ok(pv));
    ASSERT(string!=NULL);
    ASSERT(size>=512);

    // init

    if (size < 512) return false;

    pos = 0;

    // loop

    while ((move = *pv++) != MoveNone) {

        if (pos != 0) string[pos++] = ' ';

        move_to_string(move,&string[pos],size-pos);
        pos += strlen(&string[pos]);
    }

    string[pos] = '\0';

    return true;
}

// end of pv.cpp

