#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
int main(int argc, char* argv[])
{
- if(argc != 2)
- {
- printf("Usage: %s filepath\n", argv[0]);
- return 2;
- }
-
char c;
- int charsperline = 0;
- int numlines = 0;
- int occs[4] = {0, 0, 0, 0};
-
- FILE *f = fopen(argv[1], "r");
+ char charsperline = 0;
+ short numlines = 0;
+ long long unsigned int occs = 0;
+ /* When the filepath is not given or "-" assume stdin */
+ FILE *f = (argc!=2 || strcmp(argv[1], "-")==0) ? stdin : fopen(argv[1], "r");
if(f == NULL)
{
- printf("Unable to open file...");
+ printf("Unable to open file or stdin...\n");
return 2;
}
-
while((c = fgetc(f)) != EOF)
{
- if(c == '\n')
+ if(c == '\n' && charsperline == 100 && numlines <= 500)
{
- if(charsperline != 100 || numlines > 500)
- return -1;
numlines += 1;
charsperline = 0;
}
- else
- {
-/* Fancy polynome that translates A: 0, C: 1, G: 2, T: 3 */
- if(c == 'A' || c == 'C' || c == 'G' || c == 'T')
- occs[(int)(.001657140781*c*c*c-0.3780662484*c*c+28.74757194*c-726.3545635)] += 1;
- else
- return -1;
+ else if((c == 'A' || c=='C' || c=='G' || c=='T') && charsperline < 100)
+ { /*Fancy polynomial that translates the ascii value to a bitshift*/
+ occs += 1LL<<(int)(0.026514*c*c*c-6.049*c*c+459.96*c-11621.2);
charsperline += 1;
}
+ else
+ break;
}
- fclose(f);
+ if(f != stdout)
+ fclose(f);
if(numlines != 500)
return -1;
-
- printf("A: %d\nC: %d\nG: %d\nT: %d\n", occs[0], occs[1], occs[2], occs[3]);
+ printf("A: %llu\nC: %llu\nG: %llu\nT: %llu\n", occs & 0xFFFF,
+ (occs >> 16) & 0xFFFF, (occs >> 32) & 0xFFFF, (occs >> 48) & 0xFFFF);
return 0;
}