Skip to content

Instantly share code, notes, and snippets.

@0e4ef622
Created April 26, 2018 12:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save 0e4ef622/88db30bd07ac359b2e4ccd6bbf5b0ab0 to your computer and use it in GitHub Desktop.
Save 0e4ef622/88db30bd07ac359b2e4ccd6bbf5b0ab0 to your computer and use it in GitHub Desktop.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char last_input;
char *getstdin() {
char *line = NULL, *tmp = NULL;
size_t size = 0, index = 0;
int ch = EOF;
while (ch) {
ch = getc(stdin);
/* Check if we need to stop. */
switch (ch) {
case EOF:
last_input = 1;
case '\n':
ch = 0;
break;
}
/* Check if we need to expand. */
if (size <= index) {
size += 1;
tmp = realloc(line, size);
if (!tmp) {
free(line);
line = NULL;
break;
}
line = tmp;
}
/* Actually store the thing. */
line[index++] = ch;
}
return line;
}
char *dna_anticodon(char *dna) {
size_t bufsize = strlen(dna)/3*4 + 1;
char *anticodons = malloc(sizeof(char) * bufsize);
memset(anticodons, 0, bufsize);
char *p = dna;
char *np = anticodons;
char a = 0;
while (*p) {
if (*p == 'T') *np = 'U';
else *np = *p;
p++;
np++;
if (++a == 3) {
*np = '-';
np++;
a = 0;
}
}
return anticodons;
}
char *dna_mrna(char *dna) {
size_t bufsize = strlen(dna)/3*4 + 1;
char *mrna = malloc(sizeof(char) * bufsize);
memset(mrna, 0, bufsize);
char *p = dna;
char *np = mrna;
char a = 0;
while (*p) {
switch (*p) {
case 'A':
*np = 'U';
break;
case 'T':
*np = 'A';
break;
case 'C':
*np = 'G';
break;
case 'G':
*np = 'C';
break;
}
p++;
np++;
if (++a == 3) {
*np = '-';
np++;
a = 0;
}
}
return mrna;
}
char *mrna_aa(char *mrna) {
size_t mrna_len = strlen(mrna);
mrna[mrna_len-mrna_len%4+1] = 0;
size_t bufsize = strlen(mrna) + 1;
char *aa = malloc(sizeof(char) * bufsize);
memset(aa, 0, bufsize);
char *p = mrna;
char *aap = aa;
while (*p) {
switch (*p) {
case 'A':
switch (1[p]) {
case 'A':
switch (2[p]) {
case 'A':
case 'G':
strcpy(aap, "Lys ");
aap += 4;
break;
default:
strcpy(aap, "Asn ");
aap += 4;
break;
}
break;
case 'C':
strcpy(aap, "Thr ");
aap += 4;
break;
case 'G':
switch (2[p]) {
case 'A':
case 'G':
strcpy(aap, "Arg ");
aap += 4;
break;
default:
strcpy(aap, "Ser ");
aap += 4;
break;
}
break;
case 'U':
switch (2[p]) {
case 'G':
strcpy(aap, "Met ");
aap += 4;
break;
default:
strcpy(aap, "Ile ");
aap += 4;
break;
}
break;
}
break;
case 'C':
switch (1[p]) {
case 'A':
switch (2[p]) {
case 'A':
case 'G':
strcpy(aap, "Gln ");
aap += 4;
break;
default:
strcpy(aap, "His ");
aap += 4;
break;
}
break;
case 'C':
strcpy(aap, "Ser ");
aap += 4;
break;
case 'G':
strcpy(aap, "Arg ");
aap += 4;
break;
case 'U':
strcpy(aap, "Leu ");
aap += 4;
break;
}
break;
case 'G':
switch (1[p]) {
case 'A':
switch (2[p]) {
case 'A':
case 'G':
strcpy(aap, "Glu ");
aap += 4;
break;
default:
strcpy(aap, "Asp ");
aap += 4;
break;
}
break;
case 'C':
strcpy(aap, "Ala ");
aap += 4;
break;
case 'G':
strcpy(aap, "Gly ");
aap += 4;
break;
case 'U':
strcpy(aap, "Val ");
aap += 4;
break;
}
break;
case 'U':
switch (1[p]) {
case 'A':
switch (2[p]) {
case 'A':
case 'G':
strcpy(aap, "Stop");
aap += 4;
break;
default:
strcpy(aap, "Tyr ");
aap += 4;
break;
}
break;
case 'C':
strcpy(aap, "Ser ");
aap += 4;
break;
case 'G':
switch (2[p]) {
case 'A':
strcpy(aap, "Stop");
aap += 4;
break;
case 'G':
strcpy(aap, "Trp ");
aap += 4;
break;
default:
strcpy(aap, "Cys ");
aap += 4;
break;
}
break;
case 'U':
switch (2[p]) {
case 'A':
case 'G':
strcpy(aap, "Leu ");
aap += 4;
break;
default:
strcpy(aap, "Phe ");
aap += 4;
break;
}
break;
}
break;
}
p += 4;
}
return aa;
}
int main() {
for (;;) {
char *dna = getstdin();
if (strlen(dna) == 0 && last_input) break;
char *mrna = dna_mrna(dna);
printf("mRNA: %s\n", mrna);
char *anticodons = dna_anticodon(dna);
char *aa = mrna_aa(mrna);
char *tmp=mrna;
while(*(++tmp));
if (*(--tmp) == '-') *tmp = 0;
tmp=anticodons;
while(*(++tmp));
if (*(--tmp) == '-') *tmp = 0;
printf("Anticodons: %s\n"
"Amino Acids: %s\n",
anticodons, aa);
free(dna);
free(mrna);
free(anticodons);
free(aa);
if (last_input) break;
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment