-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
+#include <stdint.h> /* - Basically we save the 4 frequencies in a 64bit int */
+#include <stdio.h> /* - The polynome fits the following coordinates: */
+#include <stdlib.h> /* (65,0), (67, 16), (71, 32), (84, 48) */
+#include <string.h> /* - Which is the mapping from ascii value and shiftwidth*/
+ /* - When no input file is given assume stdin */
int main(int argc, char* argv[])
{
char c;
char charsperline = 0;
short numlines = 0;
- long long unsigned int occs = 0;
- /* When the filepath is not given or "-" assume stdin */
+ uint64_t occs = 0;
FILE *f = (argc!=2 || strcmp(argv[1], "-")==0) ? stdin : fopen(argv[1], "r");
if(f == NULL)
- {
- printf("Unable to open file or stdin...\n");
return 2;
- }
- while((c = fgetc(f)) != EOF)
- {
- if(c == '\n' && charsperline == 100 && numlines <= 500)
- {
- numlines += 1;
+ while((c=fgetc(f)) != EOF)
+ if(c == '\n' && charsperline == 100 && numlines++ < 500)
charsperline = 0;
- }
- 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 if((c=='A' ||c=='C' || c=='G' || c=='T') && charsperline++<100)
+ occs += 1LL<<(char)(0.026514*c*c*c-6.049*c*c+459.96*c-11621.2);
else
break;
- }
if(f != stdout)
fclose(f);
- if(numlines != 500)
+ if(numlines!=500)
return -1;
- printf("A: %llu\nC: %llu\nG: %llu\nT: %llu\n", occs & 0xFFFF,
- (occs >> 16) & 0xFFFF, (occs >> 32) & 0xFFFF, (occs >> 48) & 0xFFFF);
+ printf("A:%u\nC:%u\nG:%u\nT:%u\n", (uint16_t)occs, (uint16_t)(occs>>16),
+ (uint16_t)(occs>>32), (uint16_t)(occs>>48));
return 0;
}