Mac binaries
[jabaws.git] / website / archive / binaries / mac / src / clustalo / src / squid / translate.c
diff --git a/website/archive/binaries/mac/src/clustalo/src/squid/translate.c b/website/archive/binaries/mac/src/clustalo/src/squid/translate.c
new file mode 100644 (file)
index 0000000..caf4319
--- /dev/null
@@ -0,0 +1,86 @@
+/*****************************************************************
+ * 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.
+ *****************************************************************/
+
+/*
+ * translate.c - functions for translating nucleic acid sequence
+ * created Tue Jan 12 11:27:29 1993, SRE
+ * 
+ * RCS $Id: translate.c 217 2011-03-19 10:27:10Z andreas $ (Original squid RCS Id: translate.c,v 1.2 1998/10/09 18:07:16 eddy Exp)
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include "squid.h"
+
+
+#ifdef MEMDEBUG
+#include "dbmalloc.h"
+#endif
+
+
+
+/* Function: Translate(char *seq, char **code)
+ * 
+ * Given a ptr to the start of a nucleic acid sequence,
+ * and a genetic code, translate the sequence into
+ * amino acid sequence.
+ * 
+ * code is an array of 65 strings, representing
+ * the translations of the 64 codons, arranged
+ * in order AAA, AAC, AAG, AAU, ..., UUA, UUC, UUG, UUU.
+ * '*' or '***' is used to represent termination
+ * codons, usually. The final string, code[64],
+ * is the code for an ambiguous amino acid.
+ *
+ * Because of the way space is allocated for the amino
+ * acid sequence, the amino acid strings cannot be
+ * longer than 3 letters each. (I don't foresee using
+ * anything but the single- and triple- letter codes.)
+ * 
+ * Returns a ptr to the translation string on success,
+ * or NULL on failure.
+ */
+char *
+Translate(char *seq, char **code)
+{
+  int   codon;                 /* index for codon         */
+  char *aaseq;                  /* RETURN: the translation */
+  char *aaptr;                  /* ptr into aaseq */
+  int   i;
+  
+  if (seq == NULL) 
+    { squid_errno = SQERR_NODATA; return NULL; }
+  if ((aaseq = (char *) calloc (strlen(seq) + 1, sizeof(char))) == NULL)
+    Die("calloc failed");
+
+  aaptr = aaseq;
+  for (; *seq != '\0' && *(seq+1) != '\0' && *(seq+2) != '\0'; seq += 3)
+    {
+                               /* calculate the lookup value for
+                                  this codon */
+      codon = 0;
+      for (i = 0; i < 3; i++)
+       {
+         codon *= 4;
+         switch (*(seq + i)) {
+         case 'A': case 'a':             break;
+         case 'C': case 'c': codon += 1; break;
+         case 'G': case 'g': codon += 2; break;
+         case 'T': case 't': codon += 3; break;
+         case 'U': case 'u': codon += 3; break;
+         default: codon = 64; break;
+         }
+         if (codon == 64) break;
+       }
+
+      strcpy(aaptr, code[codon]);
+      aaptr += strlen(code[codon]);
+    }
+  return aaseq;
+}