9cf2a8c5cf241cfee686f3842e2faed9e4c07ef7 max Fri May 25 13:40:48 2018 -0700 changing gff3 reader to accept _ and - in tags, no redmine diff --git src/lib/gff3.c src/lib/gff3.c index 45f844c..714e878 100644 --- src/lib/gff3.c +++ src/lib/gff3.c @@ -352,38 +352,38 @@ else { #if 0 // spec unclear; bug report filed // spec currently doesn't restrict phase, unclear if it's allowed on start/stop codon features if (g3a->phase >= 0) gff3AnnErr(g3a, "phase only allowed on CDS features"); #endif } } /* check that an attribute tag name is valid. */ static boolean checkAttrTag(struct gff3Ann *g3a, char *tag) { // FIXME: spec is not clear on what is a valid tag. char *tc = tag; -boolean isOk = isalpha(*tc); +boolean isOk = (isalnum(*tc) || (*tc == '-') || (*tc == '_')); for (tc++; isOk && (*tc != '\0'); tc++) { if (!((*tc == '-') || (*tc == '_') || isalnum(*tc))) isOk = FALSE; } if (!isOk) - gff3AnnErr(g3a, "invalid attribute tag, must start with an alphabetic character and be composed of alphanumeric, dash, or underscore characters: %s", tag); + gff3AnnErr(g3a, "invalid attribute tag, must be only alphanumeric, dash or underscore: %s", tag); return isOk; } static struct slName *parseAttrVals(struct gff3Ann *g3a, char *tag, char *valsStr) /* parse an attribute into its values */ { int i, numVals = chopString(valsStr, ",", NULL, 0); char **vals = needMem((numVals+1)*sizeof(char**)); // +1 allows for no values chopString(valsStr, ",", vals, numVals); struct slName *unescVals = NULL; for (i = 0; i < numVals; i++) slAddHead(&unescVals, unescapeSlName(g3a, vals[i])); if (unescVals == NULL) slAddHead(&unescVals, slNameNew("")); // empty value freeMem(vals);