-
Notifications
You must be signed in to change notification settings - Fork 0
/
init_ranks.c
82 lines (69 loc) · 2.41 KB
/
init_ranks.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include "utils.h"
#include "algorithm.h"
void file_to_ranks (char * input_file_name, char * output_file_name, long *ranks_array, int file_id) {
char *input_buffer; //for reading original characters from input file
long *output_buffer; //for writing initial ranks to a new ranks file
int i, b, d;
FILE * inputFP=NULL; FILE * outputFP = NULL;
int read;
output_buffer = (long *) Calloc (DEFAULT_LONG_BUFFER_SIZE*sizeof(long));
input_buffer = (char *) Calloc (DEFAULT_CHAR_BUFFER_SIZE*sizeof(char));
OpenBinaryFileRead (&inputFP, input_file_name);
OpenBinaryFileWrite (&outputFP, output_file_name);
b=0; //position in output buffer
while ((read = fread (input_buffer,sizeof(char),DEFAULT_CHAR_BUFFER_SIZE,inputFP)) > 0){
for (i=0; i < read; i++) {
char current = Absolute (input_buffer[i]);
if (ranks_array [(int)current] == -1) {
printf ("Unexpected error: no initial rank for character %c\n", current);
exit (1);
}
if (input_buffer[i] == 0 ) //sentinel - resolved
output_buffer [b++] = - file_id; //negative - resolved
else
output_buffer [b++] = ranks_array [(int)current]; //positive - unresolved
if (b == DEFAULT_LONG_BUFFER_SIZE) {
if (DEBUG_SMALL) {
for (d=0; d<b; d++)
printf("%ld ",output_buffer[d]);
}
Fwrite (output_buffer, sizeof (long), b, outputFP);
b=0;
}
}
}
if (b > 0) {
if (DEBUG_SMALL) {
for (d=0; d<b; d++)
printf("%ld ",output_buffer[d]);
}
Fwrite (output_buffer, sizeof (long), b, outputFP);
}
printf ("\n");
fclose(inputFP);
fclose (outputFP);
free (output_buffer);
free (input_buffer);
}
int init_ranks (char *input_dir, char * output_dir, int total_files, char *initial_ranks_filename) {
char input_file_name [MAX_PATH_LENGTH];
char output_file_name [MAX_PATH_LENGTH];
FILE *initFP;
long *initial_ranks;
int result, f;
initial_ranks = (long *) Calloc (MAX_CHAR*sizeof(long));
OpenBinaryFileRead (&initFP, initial_ranks_filename);
result = fread (initial_ranks, sizeof(long), MAX_CHAR, initFP);
if (result != MAX_CHAR) {
printf ("Failed to read initial ranks from file %s\n", initial_ranks_filename);
return FAILURE;
}
fclose (initFP);
for (f = 0; f < total_files; f++) {
sprintf (input_file_name, "%s/binary_input_%d", input_dir, f);
sprintf(output_file_name, "%s/ranks_%d", output_dir, f);
file_to_ranks (input_file_name, output_file_name, initial_ranks, f);
}
free (initial_ranks);
return SUCCESS;
}