120 lines
2.1 KiB
C
120 lines
2.1 KiB
C
/*
|
|
Title: traceType
|
|
|
|
File: traceType.c
|
|
Purpose: determining trace format
|
|
|
|
Last update: Wed Nov 11 1992
|
|
|
|
Change log :-
|
|
*/
|
|
|
|
/* ---- Imports ---- */
|
|
|
|
#include "traceType.h"
|
|
|
|
|
|
/* ---- Privates ---- */
|
|
struct {
|
|
int type;
|
|
int offset;
|
|
char *string;
|
|
} magics[] = {
|
|
{ TT_SCF , 0, ".scf" } ,
|
|
{ TT_ABI , 0, "ABIF" } ,
|
|
{ TT_ALF , 518, "ALF " } ,
|
|
{ TT_SCF , 0, "\234\330\300\000" } /* Amersham variant */
|
|
};
|
|
|
|
|
|
|
|
char *trace_types[5] = {
|
|
"unknownFmt",
|
|
"scfFmt",
|
|
"abiFmt",
|
|
"alfFmt",
|
|
"plainFmt"
|
|
};
|
|
|
|
|
|
#define Number(A) ( sizeof(A) / sizeof((A)[0]) )
|
|
|
|
|
|
|
|
int determine_trace_type(char *fn)
|
|
{
|
|
FILE *fp;
|
|
int i;
|
|
int len;
|
|
char buf[512];
|
|
int ps;
|
|
int acgt;
|
|
int c;
|
|
|
|
|
|
if ( (fp = fopen(fn,"rb")) == NULL ) return TT_EEK;
|
|
|
|
/* determine if this is a text file */
|
|
len = 0; ps = 0; acgt = 0;
|
|
for (i = 0; i < 512; i++) {
|
|
if ( ( c = fgetc(fp) ) == EOF ) break;
|
|
switch(c) {
|
|
case 'a': case 'c': case 'g': case 't':
|
|
case 'A': case 'C': case 'G': case 'T':
|
|
/*YUK! need the next line?*/
|
|
case 'n': case 'N': case '-':
|
|
acgt++;
|
|
default:
|
|
len++;
|
|
if ( isprint(c) || isspace(c) ) ps++;
|
|
}
|
|
}
|
|
/*YUK! 75% of characters printable means text*/
|
|
if ( 100 * ps > 75 * len ) {
|
|
fclose(fp);
|
|
/*YUK! 75% of printables ACGTN means plain*/
|
|
return ( 100 * acgt > 75 * ps ) ? TT_PLN : TT_UNK;
|
|
}
|
|
|
|
/* YUK! short files are not traces? */
|
|
if (len<512) {
|
|
fclose(fp);
|
|
return TT_UNK;
|
|
}
|
|
|
|
/* check magics */
|
|
for (i = 0 ; i < Number(magics) ; i++) {
|
|
if (fseek(fp,magics[i].offset,0) == 0) {
|
|
len = strlen(magics[i].string);
|
|
if (fread(buf,len,1,fp)==1) {
|
|
if (strncmp(buf,magics[i].string,len)==0) {
|
|
fclose(fp);
|
|
return magics[i].type;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
fclose(fp);
|
|
return TT_UNK;
|
|
|
|
}
|
|
|
|
char *traceType(char *traceName)
|
|
{
|
|
char *t;
|
|
switch(determine_trace_type(traceName)) {
|
|
case TT_UNK: t = "UNK"; break;
|
|
case TT_SCF: t = "SCF"; break;
|
|
case TT_ABI: t = "ABI"; break;
|
|
case TT_ALF: t = "ALF"; break;
|
|
case TT_PLN: t = "PLN"; break;
|
|
case TT_EEK:
|
|
default:
|
|
t = "EEK"; break;
|
|
}
|
|
return t;
|
|
|
|
}
|
|
|