Esempio n. 1
0
static void stupidsort(unsigned char * result, unsigned int * source, unsigned int size)
{
	unsigned char pivot;
	unsigned char more[256];
	unsigned char less[256];
	unsigned char piv[256];
	unsigned int i,m,l,p;

	if(size<=1)
		return;
	i=0;
	while( (source[result[i]]==1000) && (i<size))
		i++;
	if(i==size)
		return;
	pivot = result[i];
	if(size<=1)
		return;
	m=0;
	l=0;
	p=0;
	for(i=0;i<size;i++)
	{
		if(source[result[i]]==source[pivot])
		{
			piv[p] = result[i];
			p++;
		}
		else if(source[result[i]]<=source[pivot])
		{
			less[l] = result[i];
			l++;
		}
		else
		{
			more[m] = result[i];
			m++;
		}
	}
	stupidsort(less, source, l);
	stupidsort(more, source, m);
	memcpy(result, less, l);
	memcpy(result+l, piv, p);
	memcpy(result+l+p, more, m);
}
Esempio n. 2
0
void init_probatables(char * filename)
{
	FILE * fichier;
	char * ligne;
	unsigned int i;
	unsigned int j;
	unsigned int k;
	unsigned int nb_lignes;

	if (!(fichier = fopen(filename, "r")))
	{
		static char fpath[PATH_BUFFER_SIZE] = "$JOHN/";

		strcat(fpath, filename);
		filename = path_expand(fpath);

		if (!(fichier = fopen(filename, "r")))
		{
			fprintf(stderr, "could not open %s\n", filename);
			error();
		}
	}

	first = mem_alloc( sizeof(unsigned char) * 256 );
	ligne = mem_alloc(4096);
	proba2 = mem_alloc(sizeof(unsigned char) * 256 * 256);
	proba1 = mem_alloc(sizeof(unsigned char) * 256 );

	for(j=0;j<256*256;j++)
		proba2[j] = UNK_STR;
	for(j=0;j<256;j++)
		proba1[j] = UNK_STR;

	for(i=0;i<256;i++)
	{
		first[i] = 255;
		for(j=0;j<256;j++)
		{
			charsorted[i*256+j] = j;
		}
	}

	nb_lignes = 0;
	while(fgets(ligne, 4096, fichier))
	{
		if (ligne[0] == 0)
			continue;
		ligne[strlen(ligne)-1] = 0; // chop
		if( sscanf(ligne, "%d=proba1[%d]", &i, &j) == 2 )
		{
			if(i>UNK_STR)
				i = UNK_STR;
			proba1[j] = i;
		}
		if( sscanf(ligne, "%d=proba2[%d*256+%d]", &i, &j, &k) == 3 )
		{
			if(i>UNK_STR)
				i = UNK_STR;
			if( (first[j]>k) && (i<UNK_STR))
				first[j] = k;
			proba2[j*256+k] = i;

		}
		nb_lignes++;
	}
	MEM_FREE(ligne);
	fclose(fichier);

	stupidsort(charsorted, proba1, 256);
	for(i=1;i<256;i++)
		stupidsort(&(charsorted[i*256]), &(proba2[i*256]), 256);
}