]> Pileus Git - ~andy/rsl/blobdiff - dorade.c
Pass pointers instead of copying all the ray data
[~andy/rsl] / dorade.c
index bf78a1c18d625aa6bfdbca998d8b866252e958df..7cd137f5cabfb66b75ffff9db25b32e6e2495fcf 100644 (file)
--- a/dorade.c
+++ b/dorade.c
@@ -77,8 +77,14 @@ Comment_block *dorade_read_comment_block(FILE *in)
        perror("dorade_read_comment_block");
        return NULL;
   }
-  fread(cb->code, sizeof(cb->code), 1, in);
-  fread(&cb->len, sizeof(cb->len), 1, in);
+  if (fread(cb->code, sizeof(cb->code), 1, in) != 1) {
+       perror("dorade_read_comment_block: fread");
+       return NULL;
+  }
+  if (fread(&cb->len, sizeof(cb->len), 1, in) != 1) {
+       perror("dorade_read_comment_block: fread");
+       return NULL;
+  }
 
   /* Check for big endian data on little endian platform.  The smallest value
    * cb->len could have is 8 (length of cb->code + cb->len), so we put that in
@@ -96,7 +102,10 @@ Comment_block *dorade_read_comment_block(FILE *in)
        perror("dorade_read_comment_block: cb->comment");
        return cb;
   }
-  fread(cb->comment, sizeof(char), cb->len-8, in);
+  if (fread(cb->comment, sizeof(char), cb->len-8, in) != cb->len){
+       perror("dorade_read_comment_block: fread");
+       return NULL;
+  }
   return cb;
 }
 
@@ -115,7 +124,11 @@ Volume_desc    *dorade_read_volume_desc    (FILE *in)
        return NULL;
   }
 
-  fread(vd, sizeof(Volume_desc), 1, in);
+  if (fread(vd, sizeof(Volume_desc), 1, in) != 1) {
+       perror("dorade_read_volume_desc: fread");
+       return NULL;
+  }
+
   /* Now, convert from Big Endian. */
   if (do_swap) {
       vd->len = ntohl(vd->len);
@@ -158,7 +171,10 @@ Radar_desc     *dorade_read_radar_desc     (FILE *in)
        return NULL;
   }
 
-  fread(rd, sizeof(Radar_desc), 1, in);
+  if (fread(rd, sizeof(Radar_desc), 1, in) != 1) {
+       perror("dorade_read_radar_desc: fread");
+       return NULL;
+  }
   /* Now, convert from Big Endian. */
   if (do_swap) {
        swap_4_bytes(&rd->len);
@@ -217,7 +233,10 @@ Parameter_desc *dorade_read_parameter_desc (FILE *in)
        return NULL;
   }
 
-  fread(pd, sizeof(Parameter_desc), 1, in);
+  if (fread(pd, sizeof(Parameter_desc), 1, in) != 1) {
+       perror("dorade_read_parameter_desc: fread");
+       return NULL;
+  }
   /* Now, convert from Big Endian. */
   if (do_swap) {
        swap_4_bytes(&pd->len);
@@ -259,9 +278,12 @@ Cell_range_vector      *dorade_read_cell_range_vector     (FILE *in)
        return NULL;
   }
 
-  fread(&cv->code, sizeof(cv->code), 1, in);
-  fread(&cv->len, sizeof(cv->len), 1, in);
-  fread(&cv->ncells, sizeof(cv->ncells), 1, in);
+  if (fread(&cv->code, sizeof(cv->code), 1, in) != 1 ||
+      fread(&cv->len, sizeof(cv->len), 1, in) != 1 ||
+      fread(&cv->ncells, sizeof(cv->ncells), 1, in) != 1) {
+       perror("dorade_read_cell_range_vector: fread");
+       return NULL;
+  }
   if (do_swap) {
        swap_4_bytes(&cv->len);
        swap_4_bytes(&cv->ncells);
@@ -271,7 +293,10 @@ Cell_range_vector      *dorade_read_cell_range_vector     (FILE *in)
        perror("dorade_read_cell_range_vector: cv->range_cell");
        return cv;
   }
-  fread(cv->range_cell, sizeof(float), cv->ncells, in);
+  if (fread(cv->range_cell, sizeof(float), cv->ncells, in) != cv->ncells) {
+       perror("dorade_read_cell_range_vector: fread");
+       return NULL;
+  }
 
   if (do_swap) {
        for (i=0; i<cv->ncells; i++)
@@ -289,7 +314,10 @@ Cell_range_vector      *dorade_read_cell_range_vector     (FILE *in)
        - cv->ncells*4;
   buff = (char *)malloc(i);
   if (!buff) return cv;
-  fread(buff, sizeof(char), i, in);
+  if (fread(buff, sizeof(char), i, in) != i) {
+       perror("dorade_read_cell_range_vector: fread");
+       return NULL;
+  }
   free(buff);
   return cv;
 }
@@ -313,11 +341,17 @@ Correction_factor_desc *dorade_read_correction_factor_desc(FILE *in)
 
   /* Make sure we have Correction Factor Descriptor. */
   while (!is_cfac) {
-      fread(cf->code, sizeof(cf->code), 1, in);
+      if (fread(cf->code, sizeof(cf->code), 1, in) != 1) {
+         perror("dorade_read_correction_factor_desc: fread");
+         return NULL;
+      }
       if (strncmp(cf->code, "CFAC", 4) == 0)
          is_cfac = 1;
       else {
-         fread(&cf->len, sizeof(cf->len), 1, in);
+         if (fread(&cf->len, sizeof(cf->len), 1, in) != 1) {
+             perror("dorade_read_correction_factor_desc: fread");
+             return NULL;
+         }
          if (do_swap) swap_4_bytes(&cf->len);
          remaining = (char *) malloc(cf->len-8);
          if (!remaining) {
@@ -325,11 +359,17 @@ Correction_factor_desc *dorade_read_correction_factor_desc(FILE *in)
              fprintf(stderr,"cf->len = %d\n\n", cf->len);
              return NULL;
          }
-         fread(remaining, sizeof(char), cf->len-8, in);
+         if (fread(remaining, sizeof(char), cf->len-8, in) != 1) {
+             perror("dorade_read_correction_factor_desc: fread");
+             return NULL;
+         }
          free(remaining);
       }
   }
-  fread(&cf->len, sizeof(Correction_factor_desc)-4, 1, in);
+  if (fread(&cf->len, sizeof(Correction_factor_desc)-4, 1, in) != 1) {
+      perror("dorade_read_correction_factor_desc: fread");
+      return NULL;
+  }
   /* Now, convert from Big Endian. */
   if (do_swap) {
        swap_4_bytes(&cf->len);
@@ -404,7 +444,10 @@ Sweep_info *dorade_read_sweep_info(FILE *in)
        return NULL;
   }
 
-  fread(si, sizeof(Sweep_info), 1, in);
+  if (fread(si, sizeof(Sweep_info), 1, in) != 1) {
+       perror("dorade_read_sweep_info: fread");
+       return NULL;
+  }
   /* FIXME: ?? For now, VOLD is what we expect when there
    *           are no more SWIB.  This is a data driven EOF.
    *           Returning NULL should suffice.
@@ -446,7 +489,10 @@ Ray_info       *dorade_read_ray_info      (FILE *in)
        return NULL;
   }
 
-  fread(ri, sizeof(Ray_info), 1, in);
+  if (fread(ri, sizeof(Ray_info), 1, in) != 1) {
+       perror("dorade_read_ray_info: fread");
+       return NULL;
+  }
   /* Now, convert from Big Endian. */
   if (do_swap) {
        swap_4_bytes(&ri->len);
@@ -489,13 +535,19 @@ Platform_info  *dorade_read_platform_info (FILE *in)
    * the place of ASIB when radar is grounded.
    */
 
-  fread(pi->code, sizeof(pi->code), 1, in);
-  fread(&pi->len, sizeof(pi->len), 1, in);
+  if (fread(pi->code, sizeof(pi->code), 1, in) != 1 ||
+      fread(&pi->len, sizeof(pi->len), 1, in) != 1) {
+      perror("dorade_read_platform_info: fread");
+      return NULL;
+  }
   if (do_swap) swap_4_bytes(&pi->len);
   len_first_two = sizeof(pi->code) + sizeof(pi->len);
     
   if (strncmp(pi->code, "ASIB", 4) == 0) {
-      fread(&pi->longitude, sizeof(Platform_info)-len_first_two, 1, in);
+      if (fread(&pi->longitude, sizeof(Platform_info)-len_first_two, 1, in) != 1) {
+         perror("dorade_read_platform_info: fread");
+         return NULL;
+      }
       /* Read past any extra bytes. */
       if (pi->len > sizeof(Platform_info)) {
          if (read_extra_bytes(pi->len - sizeof(Platform_info), in) <= 0)
@@ -551,9 +603,12 @@ Parameter_data *dorade_read_parameter_data(FILE *in)
        return NULL;
   }
 
-  fread(&pd->code, sizeof(pd->code), 1, in);
-  fread(&pd->len, sizeof(pd->len), 1, in);
-  fread(&pd->name, sizeof(pd->name), 1, in);
+  if (fread(&pd->code, sizeof(pd->code), 1, in) != 1 ||
+      fread(&pd->len, sizeof(pd->len), 1, in) != 1 ||
+      fread(&pd->name, sizeof(pd->name), 1, in) != 1) {
+       perror("dorade_read_parameter_data: fread");
+       return NULL;
+  }
   if (do_swap) swap_4_bytes(&pd->len);
   /* Length is in parameter data block? or calculate if from pd->len. */
 
@@ -566,7 +621,10 @@ Parameter_data *dorade_read_parameter_data(FILE *in)
        perror("dorade_read_parameter_data: pd->data");
        return pd;
   }
-  fread(pd->data, sizeof(char), len, in);
+  if (fread(pd->data, sizeof(char), len, in) != len) {
+       perror("dorade_read_parameter_data: fread");
+       return NULL;
+  }
   
   /* FIXME: Big endian conversion in caller?  Is that the right place? */