📄 header.c
字号:
for( ; n-- > 0; ) *out++ = *in++;}/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*//* Return a header structure which is an identical copy of header h. */Header *dup_header(h) Header *h;{ Header *h2; if (debug_level >= 1) printf("dup_header: nbytes = %d.\n", h->nbytes); if(h && (h2 = w_new_header(h->nbytes))) { if(h->nbytes) { chcopy(h2->header, h->header, h->nbytes); h2->header[h->nbytes] = 0; } h2->magic = h->magic; h2->esps_hdr = h->esps_hdr; h2->esps_nbytes = h->esps_nbytes; h2->strm = h->strm; h2->npad = h->npad; return(h2); } else printf("Error in dup_header\n"); return(NULL);} /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/void setup_access(sig) Signal *sig;{ head_a21.dest = (char*)&(sig->end_time); head_a15.dest = (char*)&(sig->start_time); head_a13.dest = (char*)&(sig->type) ; head_a12.dest = (char*)&(sig->freq) ; head_a11.dest = (char*)&(sig->band) ; head_a9.dest = (char*)&(sig->file_size) ; head_a7.dest = (char*)&(sig->dim) ; head_a6.dest = (char*)&(sig->smax[0]) ; head_a5.dest = (char*)&(sig->smin[0]) ; head_a4.dest = (char*)&(sig->version) ; head_a0.dest = (char*)&(sig->idents) ;}/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*//* Get information from ESPS header and initialize Waves Signal structure values accordingly. */intread_esps_hdr(sig, hdr) Signal *sig; struct header *hdr;{ switch (hdr->common.type) { case FT_SD: { static List sd_ident = {"ESPS sampled data", NULL}; sig->idents = &sd_ident; } sig->header->e_scrsd = 1; if (get_sd_type(hdr) == SHORT) { sig->header->e_short = 1; if (debug_level >= 1) printf("read_esps_hdr: FT_SD is SHORT, setting e_short\n"); } sig->version = 1; sig->dim = 1; sig->file_size = hdr->common.ndrec; if (debug_level >= 1) printf("read_esps_hdr: sig->file_size = %d.\n", sig->file_size); sig->band = 0.5 * hdr->hd.sd->sf; sig->freq = hdr->hd.sd->sf; if (debug_level >= 1) printf("read_esps_hdr: sig->freq = %g.\n", sig->freq); sig->type = P_SHORTS; sig->start_time = get_genhd_val("start_time", hdr, 0.0); if (genhd_type("start_time", (int *) NULL, hdr) == HD_UNDEF) *add_genhd_d("start_time", (double *) NULL, 1, hdr) = sig->start_time; sig->end_time = get_genhd_val("end_time", hdr, sig->file_size / sig->freq + sig->start_time); if (genhd_type("end_time", (int *) NULL, hdr) == HD_UNDEF) *add_genhd_d("end_time", (double *) NULL, 1, hdr) = sig->end_time; break; case FT_FEA: switch (hdr->hd.fea->fea_type) { case FEA_SPEC: { double sf; if (genhd_type("freq_format", (int *) NULL, hdr) != CODED) { printf("%s: header item \"freq_format\" missing or not CODED\n", "read_esps_hdr"); return FALSE; } else switch(*get_genhd_s("freq_format", hdr)) { case SPFMT_ARB_FIXED: printf("%s: freq_format ARB_FIXED not supported.\n", "read_esps_hdr"); return FALSE; break; case SPFMT_ARB_VAR: printf("%s: freq_format ARB_VAR not supported.\n", "read_esps_hdr"); return FALSE; break; default: break; } if (genhd_type("spec_type", (int *) NULL, hdr) != CODED) { printf("%s: header item \"spec_type\" missing or not CODED\n", "read_esps_hdr"); return FALSE; } else switch(*get_genhd_s("spec_type", hdr)) { case SPTYP_DB: break; default: printf( "%s: only spec_type SPTYP_DB supported in FEA_SPEC.\n", "read_esps_hdr"); return FALSE; break; }/*!*//* idents? */ sig->version = 1; if (genhd_type("num_freqs", (int *) NULL, hdr) == LONG) sig->dim = *get_genhd_l("num_freqs", hdr); else { printf("%s: header item \"num_freqs\" missing or not LONG.\n", "read_esps_hdr"); return FALSE; } sig->file_size = hdr->common.ndrec; if (genhd_type("sf", (int *) NULL, hdr) == FLOAT) sf = *get_genhd_f("sf", hdr); else { printf("%s: header item \"sf\" missing or not FLOAT.\n", "read_esps_hdr"); return FALSE; } sig->band = 0.5 * sf; sig->freq = get_genhd_val("record_freq", hdr, 1.0); if (sig->freq == 0.0) sig->freq = 1.0; sig->type = SIG_SPECTROGRAM | P_CHARS; sig->start_time = get_genhd_val("start_time", hdr, 0.0); sig->end_time = sig->start_time + sig->file_size/sig->freq; } break; case FEA_SD: /*if single-channel, non-complex, and if the fea_sd_special global is set, treat here; otherwise, drop through to general FEA file */ if (get_fea_siz("samples", hdr, (short *)NULL, (long **)NULL) == 1 && is_field_complex(hdr, "samples") == NO && fea_sd_special) { sig->header->e_scrsd = 1; if (debug_level >= 1) printf("read_esps_hdr: 1-chan., non-complex, FEA_SD; setting e_scrsd flag\n"); if (get_fea_type("samples", hdr) == SHORT) { sig->header->e_short = 1; if (debug_level >= 1) printf("read_esps_hdr: \"samples\" is SHORT, setting e_short\n"); } { static List sd_ident = {"ESPS sampled data", NULL}; sig->idents = &sd_ident; } sig->version = 1; sig->dim = 1; sig->file_size = hdr->common.ndrec; if (debug_level >= 1) printf("read_esps_hdr: sig->file_size = %d.\n", sig->file_size); sig->band = 0.5 * get_genhd_val("record_freq", hdr, 1.0); sig->freq = get_genhd_val("record_freq", hdr, 1.0); if (debug_level >= 1) printf("read_esps_hdr: sig->freq = %g.\n", sig->freq); sig->type = P_SHORTS; sig->start_time = get_genhd_val("start_time", hdr, 0.0); if (genhd_type("start_time", (int *) NULL, hdr) == HD_UNDEF) *add_genhd_d("start_time", (double *) NULL, 1, hdr) = sig->start_time; sig->end_time = get_genhd_val("end_time", hdr, sig->file_size / sig->freq + sig->start_time); if (genhd_type("end_time", (int *) NULL, hdr) == HD_UNDEF) *add_genhd_d("end_time", (double *) NULL, 1, hdr) = sig->end_time; break; } /*if not e_src FEA_SD, fall through to general FEA*/ default: /* General FEA file. */ sig->version = 1; sig->dim = get_rec_len(hdr); sig->file_size = hdr->common.ndrec; sig->band = 0.5 * get_genhd_val("record_freq", hdr, 1.0); sig->freq = get_genhd_val("record_freq", hdr, 1.0); if (sig->freq == 0.0) sig->freq = 1.0; sig->start_time = get_genhd_val("start_time", hdr, 0.0); sig->end_time = sig->file_size / sig->freq + sig->start_time; sig->type = P_MIXED; sig->types = (int *) malloc(sig->dim * sizeof(int)); if (!sig->types) { printf("%s: can't allocate space for type array.\n", "read_esps_hdr"); return FALSE; } { int i, k; long j; List fea_idents; /* dummy node precedes first actual node */ List *end_ptr = &fea_idents; long n = 0; for (i = 0; i < hdr->hd.fea->field_count; i++) { int type, real; int rank; long size, *dim; static unsigned maxrank; static long *coords = NULL; char buf[250], *suffix; switch(hdr->hd.fea->types[i]) { case BYTE: case CHAR: type = P_CHARS; real = YES; break; case SHORT: case CODED: type = P_SHORTS; real = YES; break; case LONG: type = P_INTS; real = YES; break; case FLOAT: type = P_FLOATS; real = YES; break; case DOUBLE: type = P_DOUBLES; real = YES; break; case BYTE_CPLX: type = P_CHARS; real = NO; break; case SHORT_CPLX: type = P_SHORTS; real = NO; break; case LONG_CPLX: type = P_INTS; real = NO; break; case FLOAT_CPLX: type = P_FLOATS; real = NO; break; case DOUBLE_CPLX: type = P_DOUBLES; real = NO; break; default: printf("%s: unrecognized ESPS data type.\n", "read_esps_hdr"); return FALSE; } size = hdr->hd.fea->sizes[i]; rank = (hdr->hd.fea->ranks) ? hdr->hd.fea->ranks[i] : 1; dim = (hdr->hd.fea->dimens && rank!=1) ? hdr->hd.fea->dimens[i] : &size; if (debug_level) { fprintf(stderr, "%s: size %ld, rank %d,\n\tdim ", "read_esps_hdr", size, rank); for (k = 0; k < rank; k++) fprintf(stderr, "%d ", dim[k]); fprintf(stderr, "\n"); } if (!coords) { maxrank = rank; coords = (long *) malloc(maxrank * sizeof(long)); if (!coords) { printf("%s: can't allocate coordinate array.\n", "read_esps_hdr"); return FALSE; } } else if (maxrank < rank) { maxrank = rank; coords = (long *) realloc((char *) coords, maxrank * sizeof(long)); if (!coords) { printf("%s: can't reallocate coordinate array.\n", "read_esps_hdr"); return FALSE; } } for (k = 0; k < rank; k++) coords[k] = 0; strcpy(buf, hdr->hd.fea->names[i]); suffix = buf + strlen(buf); for (j = 0; j < size; j++) { int h; char *end = suffix; for (k = 0; k < rank; k++) { sprintf(end, "[%ld]", coords[k]); end = end + strlen(end); } for (h = 0; h < (real ? 1 : 2); h++) { static char *re_im[2] = {".r", ".i"}; sig->types[n++] = type; end_ptr->next = (List *) malloc(sizeof(List)); end_ptr = end_ptr->next; if (!end_ptr) { printf("%s: can't allocate ident node.\n", "read_esps_hdr"); return FALSE; } if (!real) strcpy(end, re_im[h]); end_ptr->str = savestring(buf); } /* Advance coordinates; check overflow */ for (k = rank - 1; k >= 0 && coords[k] == dim[k] - 1; k--) coords[k] = 0; /* propagate carries */ if (k >= 0) coords[k]++; else if (j < size - 1) { printf("%s: field %s has inconsistent size and dimensions.\n", "read_esps_hdr", hdr->hd.fea->names[i]); return FALSE; } } if (k >= 0) { printf("%s: field %s has inconsistent size and dimensions.\n", "read_esps_hdr", hdr->hd.fea->names[i]); return FALSE; } } end_ptr->next = NULL; sig->idents = fea_idents.next; } break; } break; case FT_SPEC: default: printf("The only ESPS files supported so far are %s, %s, and %s.\n", "sampled-data", "FEA_SPEC", "general FEA files"); return FALSE; break; } return TRUE;}/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -