Created
April 26, 2018 12:10
-
-
Save 0e4ef622/88db30bd07ac359b2e4ccd6bbf5b0ab0 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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