int f_grib(ARG1) { unsigned long int size; int i; unsigned char s[8]; if (mode == -1) { if ((*local = (void *) ffopen(arg1, file_append ? "ab" : "wb")) == NULL) { fatal_error("Could not open %s", arg1); } } else if (mode >= 0) { /* figure out size of grib file */ size = (unsigned long int) GB2_Sec0_size + GB2_Sec1_size(sec) + GB2_Sec2_size(sec) + + GB2_Sec3_size(sec) + GB2_Sec4_size(sec) + GB2_Sec5_size(sec) + GB2_Sec6_size(sec) + GB2_Sec7_size(sec) + GB2_Sec8_size; /* section 0 */ fwrite((void *) sec[0], sizeof(char), 8, (FILE *) *local); uint8_char(size, s); fwrite((void *) s, sizeof(char), 8, (FILE *) *local); for (i = 1; i <= 7; i++) { if (sec[i]) { size = uint4(sec[i]); fwrite((void *) sec[i], sizeof(char), size, (FILE *) *local); } } s[0] = s[1] = s[2] = s[3] = 55; /* s = "7777" */ fwrite((void *) s, sizeof(char), 4, (FILE *) *local); // fwrite((void *) "7777", sizeof(char), 4, (FILE *) *local); if (flush_mode) fflush((FILE *) *local); } return 0; }
/* * write_tosubmsg: process each (sub)messages (mode = 0,1,2) */ int write_tosubmsg(ARG1, struct submsg *save) { int i, ok; static unsigned char sec6_repeat[] = {0,0,0,6,6,254}; if (save->written_count == 0L) { /* first message */ /* copy all sections */ copy_sec(sec, save->last_sec); /* write sections 0..7 */ fwrite((void *) sec[0], sizeof(char), GB2_Sec0_size, save->output); save->written_bytes = (unsigned long int) GB2_Sec0_size; for (i = 1; i <= 7; i++) { if (sec[i]) { fwrite((void *) sec[i], sizeof(char), GB2_Sec_i_size(i), save->output); save->written_bytes += GB2_Sec_i_size(i); } } save->written_count++; return 0; } /* can only merge if sec0 and sec1 are the same */ ok = 1; // check discipline if (sec[0][6] != save->last_sec[0][6]) ok = 0; // check grib number if (sec[0][7] != save->last_sec[0][7]) ok = 0; if (same_sec(sec[1],save->last_sec[1]) == 0) ok = 0; if (ok == 0) { fprintf(stderr,"tosubmsg: only handle one discipline at a time, record not saved\n"); return 0; } ok = 1; // ok to not to write for (i = 2; i <= 7; i++) { if (i == 4) ok = 0; // can only skip sections 2 or 3 if (ok == 1) { if (same_sec(sec[i],save->last_sec[i]) == 0) ok = 0; } if (ok == 0) { if (i == 6 && GB2_Sec6_size(sec) > 6 && same_sec(sec[i],save->last_sec[i])) { // if same bitmap as before .. use special code fwrite(sec6_repeat, sizeof(char), 6, save->output); save->written_bytes += 6; save->saved_space += GB2_Sec6_size(sec) - 6; if (mode == 99) fprintf(stdout, ":Bitmap indicator set to 254"); } else { if (sec[i] != NULL) { fwrite((void *) sec[i], sizeof(char), GB2_Sec_i_size(i), save->output); save->written_bytes += GB2_Sec_i_size(i); } } } else { // save space by not writing out a duplicate section if (sec[i]) save->saved_space += GB2_Sec_i_size(i); } } // refresh the sections // this could be optimized free_sec(save->last_sec); copy_sec(sec, save->last_sec); save->written_count++; return 0; }