/* * cleanup_tosubmsg: cleaning up (mode = -2) */ static int cleanup_tosubmsg(ARG1, struct submsg *save) { unsigned char s[GB2_Sec8_size]; if (save->written_count > 0) { /* Write section 8 */ s[0] = s[1] = s[2] = s[3] = 55; /* 7777 */ fwrite((void *) s, sizeof(char), GB2_Sec8_size, save->output); save->written_bytes += (unsigned long int) GB2_Sec8_size; /* Rewrite section 0 with correct total size */ fseek(save->output, save->start_pos, SEEK_SET); uint8_char(save->written_bytes, save->last_sec[0]+8); fwrite(save->last_sec[0], sizeof(char), GB2_Sec0_size, save->output); } fprintf(stderr, "\nSubmessage statistics:\n" "- # submessages written : %ld\n" "- Kbytes saved : %ld\n" "- Kbytes written : %ld\n" ,save->written_count, save->saved_space/1024, save->written_bytes/1024); ffclose(save->output); free_sec(save->last_sec); return 0; }
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; }
int grib_ieee(unsigned char **sec, float *data, unsigned int ndata, FILE *out, FILE *head, FILE *tail, FILE *c) { int i; unsigned int n_defined, j; // int flag; unsigned long int size; unsigned char *p, *sec0, *sec1, *sec2, *sec3, *sec4, *sec5, *sec6, *sec7; unsigned char s[8]; float *new_data; /* required passed sections */ sec0 = sec[0]; sec1 = sec[1]; sec2 = sec[2]; sec3 = sec[3]; sec4 = sec[4]; /* change scan mode */ // flag = flag_table_3_4(sec); // set_order(sec, output_order); /* make a new section 6 */ n_defined = ndata; sec6 = (unsigned char *) malloc(6); if (sec6 == NULL) fatal_error("grib_out ieee memory allocation sec6",""); uint_char(6 * sizeof (unsigned char), sec6); sec6[4] = 6; // section 5 sec6[5] = 255; // no bitmap /* data representation section */ sec5 = (unsigned char *) malloc(12 * sizeof(unsigned char)); if (sec5 == NULL) fatal_error("grib_out ieee memory allocation sec5",""); uint_char(12 * sizeof (unsigned char), sec5); sec5[4] = 5; // section 5 uint_char(ndata, sec5+5); // number of points uint2_char(4,sec5+9); // data template 4 sec5[11] = 1; // precision: ieee 32-bit /* data section */ new_data = (float *) malloc(n_defined * sizeof(float)); if (new_data == NULL) fatal_error("grib_out ieee memory allocation data",""); undo_output_order(data, new_data, n_defined); sec7 = (unsigned char *) malloc(5 + n_defined * 4); if (sec7 == NULL) fatal_error("grib_out ieee memory allocation sec7",""); uint_char(5+n_defined*4, sec7); sec7[4] = 7; p = sec7 + 5; for (j = 0; j < n_defined; j++) { flt2ieee_nan(new_data[j], p); p += 4; } free(new_data); size = (unsigned long int) GB2_Sec0_size + GB2_Sec8_size + (sec1 ? uint4(sec1) : 0) + (sec2 ? uint4(sec2) : 0) + (sec3 ? uint4(sec3) : 0) + (sec4 ? uint4(sec4) : 0) + (sec5 ? uint4(sec5) : 0) + (sec6 ? uint4(sec6) : 0) + (sec7 ? uint4(sec7) : 0); fprintf(c,"unsigned char head[] = {"); /* section 0 */ fwrite((void *) sec0, sizeof(char), 8, out); fwrite((void *) sec0, sizeof(char), 8, head); output_c(c, sec0, 8); uint8_char(size, s); fwrite((void *) s, sizeof(char), 8, out); fwrite((void *) s, sizeof(char), 8, head); output_c(c, s, 8); fwrite((void *)sec1, sizeof(char), uint4(sec1), out); fwrite((void *)sec1, sizeof(char), uint4(sec1), head); output_c(c, sec1, uint4(sec1)); if (sec2) fwrite((void *)sec2, sizeof(char), uint4(sec2), out); if (sec2) fwrite((void *)sec2, sizeof(char), uint4(sec2), head); if (sec2) output_c(c, sec2, uint4(sec2)); if (sec3) fwrite((void *)sec3, sizeof(char), uint4(sec3), out); if (sec3) fwrite((void *)sec3, sizeof(char), uint4(sec3), head); if (sec3) output_c(c, sec3, uint4(sec3)); if (sec4) fwrite((void *)sec4, sizeof(char), uint4(sec4), out); if (sec4) fwrite((void *)sec4, sizeof(char), uint4(sec4), head); if (sec4) output_c(c, sec4, uint4(sec4)); if (sec5) fwrite((void *)sec5, sizeof(char), uint4(sec5), out); if (sec5) fwrite((void *)sec5, sizeof(char), uint4(sec5), head); if (sec5) output_c(c, sec5, uint4(sec5)); if (sec6) fwrite((void *)sec6, sizeof(char), uint4(sec6), out); if (sec6) fwrite((void *)sec6, sizeof(char), uint4(sec6), head); if (sec6) output_c(c, sec6, uint4(sec6)); if (sec7) fwrite((void *)sec7, sizeof(char), uint4(sec7), out); if (sec7) fwrite((void *)sec7, sizeof(char), 5, head); if (sec7) output_c(c, sec7, 5); fprintf(c,"};\n\n"); s[0] = s[1] = s[2] = s[3] = 55; /* s = "7777" */ fprintf(c,"unsigned char tail[4] = {55, 55, 55, 55};\n\n"); fwrite((void *) s, sizeof(char), 4, out); fwrite((void *) s, sizeof(char), 4, tail); fprintf(c,"#define NDATA %u\n", ndata); i = 0; fprintf(c,"#define SEC0 0\n"); fprintf(c,"#define DISCIPLINE %d\n",6); fprintf(c,"#define EDITION %d\n",7); i = 16; fprintf(c,"#define SEC1 %d\n",i); fprintf(c,"#define CENTER %d\n",i+5); fprintf(c,"#define SUBCENTER %d\n",i+7); fprintf(c,"#define MASTERTABLE %d\n",i+9); fprintf(c,"#define LOCALTABLE %d\n",i+9); fprintf(c,"#define YEAR %d\n",i+12); fprintf(c,"#define MONTH %d\n",i+14); fprintf(c,"#define DAY %d\n",i+15); fprintf(c,"#define HOUR %d\n",i+16); fprintf(c,"#define MINUTE %d\n",i+17); fprintf(c,"#define SECOND %d\n",i+18); i = i + uint4(sec1); if (sec2) { fprintf(c,"#define SEC2 %d\n",i); i = i + uint4(sec2); } if (sec3) { fprintf(c,"#define SEC3 %d\n",i); i = i + uint4(sec3); } if (sec4) { fprintf(c,"#define SEC4 %d\n",i); fprintf(c,"#define PRODUCTDEFTEMPLATENUM %d\n",i+7); fprintf(c,"#define PRODUCTDEFTEMPLATE %d\n",i+9); fprintf(c,"#define PRODUCTCATEGORY %d\n",i+9); fprintf(c,"#define PRODUCTNUMBER %d\n",i+9); i = i + uint4(sec4); } if (sec5) { fprintf(c,"#define SEC5 %d\n",i); i = i + uint4(sec5); } if (sec6) { fprintf(c,"#define SEC6 %d\n",i); i = i + uint4(sec6); } if (sec7) { fprintf(c,"#define SEC7 %d\n",i); i = i + uint4(sec4); } free(sec5); free(sec6); free(sec7); // /* set scan mode to original order */ // set_flag_table_3_4(sec, flag); return 0; }
int f_submsg_uv(ARG1) { struct local_struct { unsigned char *sec[9]; const char *vname; FILE *output; }; struct local_struct *save; int i, j, is_v; unsigned long int size; char name[NAMELEN]; unsigned char s[8]; if (mode == -1) { // initialization // allocate static structure *local = save = (struct local_struct *) malloc( sizeof(struct local_struct) ); if (save == NULL) fatal_error("submsg_uv: memory allocation",""); if ((save->output = ffopen(arg1, file_append ? "ab" : "wb")) == NULL) { fatal_error("submsg_uv: could not open file %s", arg1); } save->vname = NULL; init_sec(save->sec); return 0; } save = (struct local_struct *) *local; if (mode == -2) { // cleanup if (save->vname != NULL) { // write out cached field i = wrt_sec(save->sec[0], save->sec[1], save->sec[2], save->sec[3], save->sec[4], save->sec[5], save->sec[6], save->sec[7], save->output); if (i) fatal_error_i("submsg_uv: last record problem %i",i); free_sec(save->sec); } ffclose(save->output); free(save); return 0; } if (mode >= 0 ) { // processing i = getName(sec, mode, NULL, name, NULL, NULL); /* see if name == expected vname */ is_v = 0; if (save->vname != NULL && strcmp(name, save->vname) == 0) { is_v = 1; if (same_sec0(sec,save->sec) == 0) is_v = 0; if (same_sec1(sec,save->sec) == 0) is_v = 0; if (same_sec2(sec,save->sec) == 0) is_v = 0; if (same_sec3(sec,save->sec) == 0) is_v = 0; i = GB2_ParmNum(sec); j = GB2_ParmCat(sec); GB2_ParmNum(sec) = GB2_ParmNum(save->sec); GB2_ParmCat(sec) = GB2_ParmCat(save->sec); if (same_sec4(sec,save->sec) == 0) is_v = 0; GB2_ParmNum(sec) = i; GB2_ParmCat(sec) = j; } /* finished tests for U/V sequence */ /* is U/V sequence */ if (is_v) { size = (unsigned long int) GB2_Sec0_size + GB2_Sec8_size + (sec[1] ? uint4(sec[1]) : 0) + (sec[2] ? uint4(sec[2]) : 0) + (sec[3] ? uint4(sec[3]) : 0) + (sec[4] ? uint4(sec[4]) : 0) + (sec[5] ? uint4(sec[5]) : 0) + (sec[6] ? uint4(sec[6]) : 0) + (sec[7] ? uint4(sec[7]) : 0) + (save->sec[4] ? uint4(save->sec[4]) : 0) + (save->sec[5] ? uint4(save->sec[5]) : 0) + (save->sec[6] ? uint4(save->sec[6]) : 0) + (save->sec[7] ? uint4(save->sec[7]) : 0); fwrite((void *) sec[0], sizeof(char), 8, save->output); uint8_char(size, s); fwrite((void *) s, sizeof(char), 8, save->output); if (sec[1]) { i = uint4(sec[1]); if (fwrite((void *)sec[1], sizeof(char), i, save->output) != i) return 1; } if (sec[2]) { i = uint4(sec[2]); if (fwrite((void *)sec[2], sizeof(char), i, save->output) != i) return 1; } if (sec[3]) { i = uint4(sec[3]); if (fwrite((void *)sec[3], sizeof(char), i, save->output) != i) return 1; } if (save->sec[4]) { i = uint4(save->sec[4]); if (fwrite((void *)save->sec[4], sizeof(char), i, save->output) != i) return 1; } if (save->sec[5]) { i = uint4(save->sec[5]); if (fwrite((void *)save->sec[5],sizeof(char), i, save->output) != i) return 1; } if (save->sec[6]) { i = uint4(save->sec[6]); if (fwrite((void *)save->sec[6],sizeof(char), i, save->output) != i) return 1; } if (save->sec[7]) { i = uint4(save->sec[7]); if (fwrite((void *)save->sec[7],sizeof(char), i, save->output) != i) return 1; } if (sec[4]) { i = uint4(sec[4]); if (fwrite((void *)sec[4], sizeof(char), i, save->output) != i) return 1; } if (sec[5]) { i = uint4(sec[5]); if (fwrite((void *)sec[5], sizeof(char), i, save->output) != i) return 1; } if (sec[6]) { i = uint4(sec[6]); if (fwrite((void *)sec[6], sizeof(char), i, save->output) != i) return 1; } if (sec[7]) { i = uint4(sec[7]); if (fwrite((void *)sec[7], sizeof(char), i, save->output) != i) return 1; } s[0] = s[1] = s[2] = s[3] = 55; /* s = "7777" */ if (fwrite((void *) s, sizeof(char), 4, save->output) != 4) fatal_error("submsg_uv: write record problem",""); save->vname = NULL; free_sec(save->sec); return 0; } /* has U but not V, write U */ if (save->vname != NULL) { i = wrt_sec(save->sec[0], save->sec[1], save->sec[2], save->sec[3], save->sec[4], save->sec[5], save->sec[6], save->sec[7], save->output); if (i) fatal_error_i("submsg_uv: write record problem %i",i); free_sec(save->sec); save->vname = NULL; } /* check to see if new field is a U */ save->vname = is_u(name); /* if U, cache it */ if (save->vname != NULL) { copy_sec(sec,save->sec); return 0; } /* not U, write it out */ i = wrt_sec(sec[0], sec[1], sec[2], sec[3], sec[4], sec[5], sec[6], sec[7], save->output); if (i) fatal_error_i("submsg_uv: write problem %i",i); return 0; } return 0; }