X-Git-Url: http://git.nguyen.vg/gitweb/?p=SXSI%2Flibbp.git;a=blobdiff_plain;f=bp.c;h=62f46131081df67e5c2cd6904523743c6b13b774;hp=d9e85a2aa65bb5dc4ca196af91502b6117675e5e;hb=HEAD;hpb=91d0a67b88ae130e9333e8dec6e10815b5b11859 diff --git a/bp.c b/bp.c index d9e85a2..62f4613 100644 --- a/bp.c +++ b/bp.c @@ -1,4 +1,5 @@ #include "bp.h" +#include //#define CHECK #define RANDOM @@ -159,7 +160,7 @@ static void make_matchtbl(void) if (bp_getbit(buf,i)==OP) { r++; if (r > M) { - M = r; + M = r; //maxtbl_li[x] = i; maxtbl_lv[x] = r; minmaxtbl_i[OPT_MAX | OPT_LEFT][x] = i; minmaxtbl_v[OPT_MAX | OPT_LEFT][x] = r; @@ -192,7 +193,7 @@ static void make_matchtbl(void) if (bp_getbit(buf,i)==OP) { r++; if (r >= M) { - M = r; + M = r; //maxtbl_ri[x] = i; maxtbl_rv[x] = r; minmaxtbl_i[OPT_MAX | OPT_RIGHT][x] = i; minmaxtbl_v[OPT_MAX | OPT_RIGHT][x] = r; @@ -446,7 +447,6 @@ void saveTree(bp *b, FILE *fp) { printf("Error: cannot save number of parentheses to file\n"); exit(1); } - if (fwrite(b->B, sizeof(pb), (b->n+D-1)/D, fp) != ((b->n+D-1)/D)) { printf("Error: cannot save parentheses sequence to file\n"); exit(1); @@ -458,6 +458,63 @@ void saveTree(bp *b, FILE *fp) { } } +static ssize_t uwrite(int fd, const void* buff, size_t count) +{ + ssize_t written; + char *p = (char *) buff; + do { + written = write(fd, p, count); + p += written; + count -= written; + } while (written > 0); + + return (written == -1); +} + +static ssize_t uread(int fd, const void* buff, size_t count) +{ + ssize_t loaded; + char *p = (char *) buff; + do { + loaded = read(fd, p, count); + p += loaded; + count -= loaded; + } while (loaded > 0); + + return (loaded == -1); +} + +int bp_save(bp *b, int fd) +{ + if (uwrite(fd, &b->n, sizeof(int))) return 1; + if (uwrite(fd, b->B, sizeof(pb) * (b->n+D-1)/D)) return 1; + if (uwrite(fd, &b->opt, sizeof(int))) return 1; + return 0; +} + +bp* bp_load(int fd) +{ + pb *B; + int n, opt; + if (uread(fd, &n, sizeof(int))) return NULL; + bp_xmalloc(B, (n+D-1)/D); + + if (B == NULL) return NULL; + + if (uread(fd, B, sizeof(pb) * (n+D-1)/D)) { + free(B); + return NULL; + }; + + if (uread(fd, &opt, sizeof(int))){ + free(B); + return NULL; + }; + + return bp_construct(n, B, opt); +} + + // loadTree: load parentheses data structure from file // By Diego Arroyuelo bp * loadTree(FILE *fp) { @@ -482,7 +539,7 @@ bp * loadTree(FILE *fp) { exit(1); } - return bp_construct(n, B, opt); + return bp_construct(n, B, opt); } @@ -860,7 +917,7 @@ int bp_child(bp *b, int s, int d) } else { return bp_naive_child(b,s,d); } - + }