X-Git-Url: http://git.nguyen.vg/gitweb/?p=SXSI%2Flibbp.git;a=blobdiff_plain;f=bp.c;fp=bp.c;h=62f46131081df67e5c2cd6904523743c6b13b774;hp=f1aef19261795ecd32ccc14f4f5195f26c2b906f;hb=5382b5fde5add82ebd492e97a458a824503fbd8d;hpb=35d38c5681c54a22125452a2e43dc4b8305c588f diff --git a/bp.c b/bp.c index f1aef19..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; @@ -457,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) { @@ -481,7 +539,7 @@ bp * loadTree(FILE *fp) { exit(1); } - return bp_construct(n, B, opt); + return bp_construct(n, B, opt); } @@ -859,7 +917,7 @@ int bp_child(bp *b, int s, int d) } else { return bp_naive_child(b,s,d); } - + }