static void validateTag(char *database,struct trackDb *tdb,char *type,char *tag, boolean firstIsDigitWarning) // Determines if tag is conforming to rules: // 1) must exist // 2) cannot be all numeric. // 3) Contains only letters, numbers, '_', '-' // 4) Begins with a letter // Aborts on 1-3 and optionally warns on 4 { char *c = tag; if (*c == '\0') errAbort("Track %s.%s has no '%s' tag",database,tdb->track,type); if (!isalpha(*c)) { if (countLeadingDigits(tag) == strlen(tag)) errAbort("Track %s.%s has all numeric '%s' tag '%s'",database,tdb->track,type,tag); if (!firstIsDigitWarning) return; warn("Track %s.%s has non-conforming '%s' tag '%s' (begins with digit)", database,tdb->track,type,tag); } for (c++;*c != '\0';c++) { if (!isalnum(*c) && *c != '_' && *c != '-') errAbort("Track %s.%s has non-conforming '%s' tag '%s' (contains unsupported characters)", database,tdb->track,type,tag); } }
int cigarWidth(char *cigar, int cigarSize) /* Return width of alignment as encoded in cigar format string. */ { int tLength=0; char *s, *end = cigar + cigarSize; s = cigar; while (s < end) { int digCount = countLeadingDigits(s); if (digCount <= 0) errAbort("expecting number got %s in cigarWidth", s); int n = atoi(s); s += digCount; char op = *s++; switch (op) { case 'M': // match or mismatch (gapless aligned block) tLength += n; break; case 'I': // inserted in query break; case 'D': // deleted from query case 'N': // long deletion from query (intron as opposed to small del) tLength += n; break; case 'S': // skipped query bases at beginning or end ("soft clipping") case 'H': // skipped query bases not stored in record's query sequence ("hard clipping") case 'P': // P="silent deletion from padded reference sequence" -- ignore these. break; default: errAbort("cigarWidth: unrecognized CIGAR op %c -- update me", op); } } return tLength; }
struct dyString *unrepFileName(char *fileName, boolean isSingle) /* Return string with Rep# in fileName replaced with "Merged" */ { char *s = strstr(fileName, "Rep"); struct dyString *dy = dyStringNew(0); if (s == NULL) { if (isSingle) dyStringAppend(dy, fileName); else errAbort("No 'Rep' in fileName %s", fileName); } else { char *pastRep = s + strlen("Rep"); int digitCount = countLeadingDigits(pastRep); if (digitCount < 1) errAbort("No digits after 'Rep' in filename %s", fileName); pastRep += digitCount; dyStringAppendN(dy, fileName, s-fileName); dyStringAppend(dy, "Merged"); int len = strlen(pastRep); if (!isSingle && endsWith(pastRep, ".gz")) len -= strlen(".gz"); dyStringAppendN(dy, pastRep, len); } return dy; }
INLINE boolean isAllDigits(char *s) { return (isNotEmpty(s) && countLeadingDigits(s) == strlen(s)); }