Changeset: c38437e1b729 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c38437e1b729 Modified Files: sql/backends/monet5/bam/bam_lib.c Branch: bamloader Log Message:
Replace sscanf with more efficient parsing in seq_length diffs (52 lines): diff --git a/sql/backends/monet5/bam/bam_lib.c b/sql/backends/monet5/bam/bam_lib.c --- a/sql/backends/monet5/bam/bam_lib.c +++ b/sql/backends/monet5/bam/bam_lib.c @@ -183,31 +183,34 @@ reverse_qual(str * ret, str * qual) return MAL_SUCCEED; } +#define next_cigar_op(fn) { \ + str tmp; \ + cnt = strtol(s, &tmp, 10); \ + if(cnt <= 0 || s == tmp) { \ + *ret = -1; \ + throw(MAL, fn, "Could not read CIGAR operation"); \ + } \ + s = tmp; \ + op = *s++; \ +} + str seq_length(int * ret, str * cigar) { int result = 0; - str cigar_consumable = *cigar; + str s = *cigar; + long int cnt; + char op; - if (cigar_consumable[0] == '\0' || - (cigar_consumable[0] == '*' && cigar_consumable[1] == '\0')) { + if (*s == '\0' || (*s == '*' && *(s+1) == '\0')) { *ret = -1; return MAL_SUCCEED; } - while (cigar_consumable[0] != '\0') { - int cnt; - char op; - int nr_chars_read; - - if (sscanf - (cigar_consumable, "%d%c%n", &cnt, &op, - &nr_chars_read) != 2) - throw(MAL, "seq_length", - "Error parsing CIGAR string '%s'\n", *cigar); + while (*s != '\0') { + next_cigar_op("seq_length"); if (op == 'M' || op == 'D' || op == 'N' || op == '=' || op == 'X') result += cnt; - cigar_consumable += nr_chars_read; } *ret = result; return MAL_SUCCEED; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list