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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list