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); }
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); }