Ejemplo n.º 1
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;
}
Ejemplo n.º 2
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;
}