ztr_t *fread_ztr(FILE *fp) { ztr_t *z; mFILE *mf; if (NULL == (mf = mfreopen(NULL, "r", fp))) return NULL; z = mfread_ztr(mf); mfclose(mf); return z; }
int main(int argc, char **argv) { ztr_t *ztr; mFILE *fp; int i; if (argc >= 2) { if (NULL == (fp = mfopen(argv[1], "rb"))) { perror(argv[1]); return 1; } } else { fp = mstdin(); } if (NULL == (ztr = mfread_ztr(fp))) { perror("fread_ztr"); return 1; } printf("Nchunks = %d\n", ztr->nchunks); for (i = 0; i < ztr->nchunks; i++) { char str[5]; int complen; int rawlen; char *val; (void)ZTR_BE2STR(ztr->chunk[i].type, str); complen = ztr->chunk[i].dlength; val = ztr_lookup_mdata_value(ztr, &ztr->chunk[i], "TYPE"); if (val) printf("-- %s (%s) --\n", str, val); else printf("-- %s --\n", str); explode_chunk(ztr, &ztr->chunk[i]); rawlen = ztr->chunk[i].dlength; printf("SUMMARY %s mlen %3d, dlen %6d, rawlen %6d, ratio %f\n", str, ztr->chunk[i].mdlength, complen, rawlen, (double)complen/rawlen); #if 0 fflush(stdout); puts("\n========================================"); write(1, ztr->chunk[i].data, ztr->chunk[i].dlength); puts("\n========================================"); #endif } delete_ztr(ztr); return 0; }
/* * Read a sequence from a FILE *fp of format "format". If "format" is 0 * (ANY_FORMAT), we automatically determine the correct format. * We still pass a filename 'fn' although this isn't used other than for * filling in the read->trace_name field. * * NB this function should NOT be used when Biolims support is required * (as biolims readings are not stored in a file) * * Returns: * Read * for success * NULLRead for failure */ Read *mfread_reading(mFILE *fp, char *fn, int format) { Read *read; mFILE *newfp; if (!fn) fn = "(unknown)"; newfp = freopen_compressed(fp, NULL); if (newfp != fp) { fp = newfp; } else { newfp = NULL; } #ifdef _WIN32 /* * jkb 16/05/00 comment below * * On windows "prog < file.abi" will work wrongly (compared to * "prog file.abi") because windows is rather stupid. It treats ascii * and binary streams differently, it considers stdin to be ascii unless * told otherwise, and it can only be told otherwise by using non-ansi * windows-specific function calls. */ if (format != TT_EXP && format != TT_PLN && fp->fp) _setmode(_fileno(fp->fp), _O_BINARY); #endif if (format == TT_ANY) { format = fdetermine_trace_type(fp); mrewind(fp); } switch (format) { case TT_UNK: case TT_ERR: errout("File '%s' has unknown trace type\n", fn); read = NULLRead; break; #ifdef IOLIB_SCF case TT_SCF: { Scf *scf; scf = mfread_scf(fp); if (scf) { read = scf2read(scf); scf_deallocate(scf); } else read = NULLRead; break; } #endif #ifdef IOLIB_CTF case TT_CTF: read = mfread_ctf(fp); break; #endif #ifdef IOLIB_ZTR case TT_ZTR: case TT_ZTR1: case TT_ZTR2: case TT_ZTR3: { ztr_t *ztr; if ((ztr = mfread_ztr(fp))) { uncompress_ztr(ztr); read = ztr2read(ztr); delete_ztr(ztr); } else { read = NULLRead; } break; } #endif #ifdef IOLIB_ABI case TT_ABI: read = mfread_abi(fp); break; #endif #ifdef IOLIB_ALF case TT_ALF: read = mfread_alf(fp); break; #endif #ifdef IOLIB_EXP case TT_EXP: { /* FIXME: we shouldn't redirect like this */ Exp_info *e = exp_mfread_info(fp); read = e ? exp2read(e,fn) : NULLRead; break; } #endif #ifdef IOLIB_PLN case TT_PLN: read = mfread_pln(fp); break; #endif default: errout("Unknown format %d specified to read_reading()\n", format); read = NULLRead; } if (read != NULLRead && (read->trace_name = (char *)xmalloc(strlen(fn)+1))) strcpy(read->trace_name, fn); if (newfp) mfclose(newfp); return read; }