ssize_t qes_seqfile_write (struct qes_seqfile *seqfile, struct qes_seq *seq) { #define sf_putc_check(c) ret = QES_ZFPUTC(seqfile->qf->fp, c); \ if (ret != c) {return -2;} \ else res_len += 1; \ ret = 0 #define sf_puts_check(s) ret = QES_ZFPUTS(seqfile->qf->fp, s); \ if (ret < 0) {return -2;} \ else res_len += ret; \ ret = 0 int ret = 0; ssize_t res_len = 0; if (!qes_seqfile_ok(seqfile) || !qes_seq_ok(seq)) { return -2; } switch (seqfile->format) { case FASTA_FMT: sf_putc_check(FASTA_DELIM); sf_puts_check(seq->name.str); if (qes_seq_has_comment(seq)) { sf_putc_check(' '); sf_puts_check(seq->comment.str); } sf_putc_check('\n'); sf_puts_check(seq->seq.str); sf_putc_check('\n'); break; case FASTQ_FMT: sf_putc_check(FASTQ_DELIM); sf_puts_check(seq->name.str); if (qes_seq_has_comment(seq)) { sf_putc_check(' '); sf_puts_check(seq->comment.str); } sf_putc_check('\n'); sf_puts_check(seq->seq.str); sf_putc_check('\n'); if (qes_seq_has_qual(seq)) { sf_putc_check('+'); sf_putc_check('\n'); sf_puts_check(seq->qual.str); sf_putc_check('\n'); } break; case UNKNOWN_FMT: default: return -2; break; } return res_len; #undef sf_putc_check #undef sf_puts_check }
/******************************************************************************* * MAIN * *******************************************************************************/ int trunc_main(int argc, char *argv[]) { int c = 0; size_t truncat = 0; float truncprop = 0.; const char *filename = NULL; /* Parse CLI options */ while ((c = getopt(argc, argv, trunc_optstr)) >= 0) { switch (c) { case 'p': truncprop = atof(optarg); break; case 'l': truncat = atoi(optarg); break; case 'h': trunc_usage(stdout); return EXIT_SUCCESS; break; case '?': trunc_usage(stderr); return EXIT_FAILURE; break; } } if (optind >= argc || (truncat == 0 && truncprop == 0.0)) { trunc_usage(stderr); return EXIT_FAILURE; } filename = argv[optind]; struct qes_seq *seq = qes_seq_create(); struct qes_seqfile *sf = qes_seqfile_create(filename, "r"); ssize_t res; while ((res = qes_seqfile_read(sf, seq)) > 0) { if (truncprop != 0.0) { truncat = truncprop * seq->seq.len; } qes_seq_truncate(seq, truncat); qes_seq_print(seq, stdout, !qes_seq_has_qual(seq), 0); } qes_seqfile_destroy(sf); qes_seq_destroy(seq); return EXIT_SUCCESS; }