+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);
+}
+
+