Silence a printf warning for %lu on 32bits archs.
[SXSI/libbp.git] / bp.c
diff --git a/bp.c b/bp.c
index d9e85a2..62f4613 100644 (file)
--- a/bp.c
+++ b/bp.c
@@ -1,4 +1,5 @@
 #include "bp.h"
+#include <unistd.h>
 
 //#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);
   }
-    
+
 }