Mercurial > repos > dawe > srf2fastq
view srf2fastq/io_lib-1.12.2/progs/srf_index_hash.c @ 0:d901c9f41a6a default tip
Migrated tool version 1.0.1 from old tool shed archive to new tool shed repository
author | dawe |
---|---|
date | Tue, 07 Jun 2011 17:48:05 -0400 |
parents | |
children |
line wrap: on
line source
/* * This adds a hash table index (".hsh" v1.01 format) to an SRF archive. * It does this either inline on the file itself (provided it doesn't already * have an index) or by producing an external index file. */ /* ---------------------------------------------------------------------- */ #ifdef HAVE_CONFIG_H #include "io_lib_config.h" #endif #include <stdio.h> #include <string.h> #include <errno.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <io_lib/hash_table.h> #include <io_lib/os.h> #include <io_lib/array.h> #include <io_lib/srf.h> /* ------------------------------------------------------------------------ */ void usage(int code) { printf("Usage: srf_index_hash [-c] srf_file\n"); printf(" Options:\n"); printf(" -c check an existing index, don't re-index\n"); exit(code); } int main(int argc, char **argv) { srf_t *srf; uint64_t pos; char name[512]; int i, type; char *archive; int dbh_pos_stored_sep = 0; int check = 0; off_t old_index = 0; srf_index_t *idx; /* Parse args */ for (i = 1; i < argc && argv[i][0] == '-'; i++) { if (!strcmp(argv[i], "-")) { break; } else if (!strcmp(argv[i], "-c")) { check = 1; } else if (!strcmp(argv[i], "-h")) { usage(0); } else { usage(1); } } if (argc != (i+1)) { usage(1); } archive = argv[i]; if( check ){ srf = srf_open(archive, "rb"); } else { srf = srf_open(archive, "r+b"); } if (NULL == srf ){ perror(argv[i]); return 1; } idx = srf_index_create(NULL, NULL, dbh_pos_stored_sep); if (NULL == idx) return 1; /* Scan through file gathering the details to index in memory */ while ((type = srf_next_block_details(srf, &pos, name)) >= 0) { /* Only want this set if the last block in the file is an index */ old_index = 0; switch (type) { case SRFB_CONTAINER: if (srf_index_add_cont_hdr(idx, pos)) return 1; break; case SRFB_TRACE_HEADER: if (srf_index_add_trace_hdr(idx, pos)) return 1; break; case SRFB_TRACE_BODY: if (srf_index_add_trace_body(idx, name, pos)) return 1; break; case SRFB_INDEX: /* An old index */ old_index = pos; break; case SRFB_NULL_INDEX: old_index = pos; break; default: abort(); } } /* the type should be -1 (EOF) */ if( type != -1 ) abort(); /* are we really at the end of the srf file */ pos = ftell(srf->fp); fseek(srf->fp, 0, SEEK_END); if( pos != ftell(srf->fp) ){ fprintf(stderr, "srf file is corrupt\n"); return 1; } if (check) { srf_index_destroy(idx); srf_destroy(srf, 1); return 0; } /* Write out the index */ if (old_index) fseeko(srf->fp, old_index, SEEK_SET); srf_index_stats(idx, NULL); srf_index_write(srf, idx); /* Truncate incase we've somehow overwritten an old longer index */ ftruncate(fileno(srf->fp), ftello(srf->fp)); srf_index_destroy(idx); srf_destroy(srf, 1); return 0; }