/***************************************************************** * SQUID - a library of functions for biological sequence analysis * Copyright (C) 1992-2002 Washington University School of Medicine * * This source code is freely distributed under the terms of the * GNU General Public License. See the files COPYRIGHT and LICENSE * for details. *****************************************************************/ /* revcomp.c * * Reverse complement of a IUPAC character string * RCS $Id: revcomp.c 217 2011-03-19 10:27:10Z andreas $ (Original squid RCS Id: revcomp.c,v 1.5 2002/06/25 20:06:06 eddy Exp) */ #include #include #include #include "squid.h" /* Function: revcomp() * * Purpose: Reverse complement seq; store in comp. * Can revcomp "in place" (revcomp(seq, seq)). * * Args: comp - destination for reverse complement of seq * seq - sequence to reverse complement * * Returns: NULL on failure; or a (useless) pointer to comp. */ char * revcomp(char *comp, char *seq) { char *s; char c; if (comp == NULL) return NULL; if (seq == NULL) return NULL; StrReverse(comp, seq); for (s = comp; *s != '\0'; s++) { c = *s; c = sre_toupper(c); switch (c) { case 'A': c = 'T'; break; case 'C': c = 'G'; break; case 'G': c = 'C'; break; case 'T': c = 'A'; break; case 'U': c = 'A'; break; case 'R': c = 'Y'; break; case 'Y': c = 'R'; break; case 'M': c = 'K'; break; case 'K': c = 'M'; break; case 'S': c = 'S'; break; case 'W': c = 'W'; break; case 'H': c = 'D'; break; case 'D': c = 'H'; break; case 'B': c = 'V'; break; case 'V': c = 'B'; break; default: break; /* anything else? leave it; it's prob a gap or an X */ } if (islower((int) *s)) c = (char) sre_tolower((int) c); *s = c; } return comp; } #ifdef REVCOMP_TESTDRIVER /* gcc -g -DREVCOMP_TESTDRIVER revcomp.c sre_string.c shuffle.c sre_math.c sre_ctype.c sqerror.c -lm */ int main(void) { float p[4] = {0.25, 0.25, 0.25, 0.25}; char *alphabet = "ACGT"; int len = 10; char *seq; seq = RandomSequence(alphabet, p, 4, len); printf("%s\n", seq); revcomp(seq, seq); printf("%s\n", seq); free(seq); exit(0); } #endif