#include "bp.h"
+#include <unistd.h>
//#define CHECK
#define RANDOM
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;
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;
}
}
+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) {
exit(1);
}
- return bp_construct(n, B, opt);
+ return bp_construct(n, B, opt);
}
} else {
return bp_naive_child(b,s,d);
}
-
+
}