37977956905d588f73ee5f635fae2f609cb40842 angie Wed Aug 9 12:52:00 2017 -0700 Assorted little util functions in support of adding HGVS output to hgVai -- refs #19968 diff --git src/lib/dnautil.c src/lib/dnautil.c index 8687e91..6d81ba5 100644 --- src/lib/dnautil.c +++ src/lib/dnautil.c @@ -1187,15 +1187,70 @@ /* Convert an AA abbreviation such as "Ala", "Asp" etc., to its single letter code * such as "A", "D" etc. Return the null char '\0' if abbr is not found. */ { // Lowercase for comparison. char abbrLC[4]; safencpy(abbrLC, sizeof(abbrLC), abbr, 3); toLowerN(abbrLC, 3); int ix; for (ix = 0; ix < ArraySize(aminoAcidTable); ix++) { if (sameStringN(abbrLC, aminoAcidTable[ix].abbreviation, 3)) return aminoAcidTable[ix].letter; } return '\0'; } + +void aaToAbbr(char aa, char *abbrBuf, size_t abbrBufSize) +/* Convert an AA single letter such as "A", "D" etc. to its abbreviation such as "Ala", "Asp" etc. + * abbrBufSize must be at least 4. If aa is not found, "?%c?",aa is written into abbrBuf. */ +{ +// Uppercase for comparison. +char aaUC = toupper(aa); +int ix; +for (ix = 0; ix < ArraySize(aminoAcidTable); ix++) + { + if (aaUC == aminoAcidTable[ix].letter) + { + // safencpy(...3) is required here because aminoAcidTable.abbreviation is char[3] not [4] + safencpy(abbrBuf, abbrBufSize, aminoAcidTable[ix].abbreviation, 3); + abbrBuf[0] = toupper(abbrBuf[0]); + return; + } + } +safef(abbrBuf, abbrBufSize, "?%c?", aa); +} + +void trimRefAlt(char *ref, char *alt, uint *pStart, uint *pEnd, int *pRefLen, int *pAltLen) +/* If ref and alt have identical bases at beginning and/or end, trim those & update all params. */ +{ +int trimStart = 0; +while (ref[trimStart] != '\0' && alt[trimStart] != '\0' && ref[trimStart] == alt[trimStart]) + trimStart++; +int refLen = strlen(ref); +int altLen = strlen(alt); +int iR = refLen - 1, iA = altLen - 1, trimEnd = 0; +while (iR >= trimStart && iA >= trimStart && ref[iR] == alt[iA]) + { + iR--; + iA--; + trimEnd++; + } +if (trimEnd) + { + *pEnd -= trimEnd; + refLen -= trimEnd; + altLen -= trimEnd; + ref[refLen] = '\0'; + alt[altLen] = '\0'; + } +if (trimStart) + { + *pStart += trimStart; + refLen -= trimStart; + altLen -= trimStart; + memmove(ref, ref+trimStart, refLen+1); + memmove(alt, alt+trimStart, altLen+1); + } +*pRefLen = refLen; +*pAltLen = altLen; +}