X-Git-Url: http://winboard.nl/cgi-bin?p=polyglot.git;a=blobdiff_plain;f=book_merge.c;h=80ff5eb27c876e059eb76b3e1ee01f602b95388d;hp=ee2d848bcdc0fec59efd9b0c21cdf23500848f16;hb=95f2e11e77098c0ddb4f24404704f1ffc0f39040;hpb=037f73ac400afcd812f31f9260e6bf8a0ba7ef53 diff --git a/book_merge.c b/book_merge.c index ee2d848..80ff5eb 100644 --- a/book_merge.c +++ b/book_merge.c @@ -10,6 +10,11 @@ #include "book_merge.h" #include "util.h" +#include "pgheader.h" + +// macros + +#define MAXVARIANTS 50 // types @@ -32,6 +37,8 @@ static book_t In1[1]; static book_t In2[1]; static book_t Out[1]; +static const char *default_header="@PG@\n1.0\n1\nnormal\n"; + // prototypes static void book_clear (book_t * book); @@ -47,6 +54,73 @@ static void write_integer (FILE * file, int size, uint64 n); // functions +// variants_merge() + +static void variants_merge(char ** variants, char *header1, char *header2){ + + char *token; + int ret,i,j; + int count; + char *header1_dup; + char *header2_dup; + char *header; + char *variant; + + + // Step 1: Initial malloc + + *variants=malloc(strlen(header1)+strlen(header2)+1); + (*variants)[0]='\0'; + + // Step 2: Extract variant names. + + header1_dup=strdup(header1); + header2_dup=strdup(header2); + + for(i=0;i<2;i++){ + header=(i==0)?header1_dup:header2_dup; + ret=0; + token=strtok(header,"\n"); + if(token){ // MAGIC + token=strtok(NULL,"\n"); + if(token){ // VERSION + token=strtok(NULL,"\n"); + if(token){ // NBVARIANTS + count=atoi(token); + if(count>0){ + for(j=0;jfile); + } + free(raw_header); + skip = 0; i1 = 0; i2 = 0; - while (TRUE) { + - b1 = read_entry(In1,e1,i1); - b2 = read_entry(In2,e2,i2); + while (TRUE) { + do{ + b1 = read_entry(In1,e1,i1); + }while(b1 && e1->key==U64(0x0) && (++i1)); + + do{ + b2 = read_entry(In2,e2,i2); + }while(b2 && e2->key==U64(0x0) && (++i2)); + if (FALSE) { } else if (!b1 && !b2) { @@ -129,8 +261,7 @@ void book_merge(int argc, char * argv[]) { break; } else if (b1 && !b2) { - - write_entry(Out,e1); + write_entry(Out,e1); i1++; } else if (b2 && !b1) { @@ -246,6 +377,8 @@ static void write_entry(book_t * book, const entry_t * entry) { write_integer(book->file,2,entry->sum); } + + // read_integer() static uint64 read_integer(FILE * file, int size) {