4 * Created on: 25 juil. 2011
6 * BASELINE MUST BE GENERATED BY UNIX PLATFORM REGARDING TO THE CRLF PROBLEM
16 typedef struct test_cmp_parameters
22 } test_cmp_parameters;
24 /*******************************************************************************
25 * Command line help function
26 *******************************************************************************/
27 void compare_dump_files_help_display() {
28 fprintf(stdout,"\nList of parameters for the compare_dump_files function \n");
30 fprintf(stdout," -b \t REQUIRED \t filename to the reference/baseline dump file \n");
31 fprintf(stdout," -t \t REQUIRED \t filename to the test dump file image\n");
34 /*******************************************************************************
36 *******************************************************************************/
37 int parse_cmdline_cmp(int argc, char **argv, test_cmp_parameters* param)
39 int sizemembasefile, sizememtestfile;
41 const char optlist[] = "b:t:";
45 param->base_filename = NULL;
46 param->test_filename = NULL;
50 while ((c = getopt(argc, argv, optlist)) != -1)
54 sizemembasefile = (int)strlen(optarg)+1;
55 param->base_filename = (char*) malloc(sizemembasefile);
56 param->base_filename[0] = '\0';
57 strncpy(param->base_filename, optarg, strlen(optarg));
58 param->base_filename[strlen(optarg)] = '\0';
59 //printf("param->base_filename = %s [%d / %d]\n", param->base_filename, strlen(param->base_filename), sizemembasefile );
62 sizememtestfile = (int) strlen(optarg) + 1;
63 param->test_filename = (char*) malloc(sizememtestfile);
64 param->test_filename[0] = '\0';
65 strncpy(param->test_filename, optarg, strlen(optarg));
66 param->test_filename[strlen(optarg)] = '\0';
67 //printf("param->test_filename = %s [%d / %d]\n", param->test_filename, strlen(param->test_filename), sizememtestfile);
70 if ( (optopt == 'b') || (optopt == 't') )
71 fprintf(stderr, "Option -%c requires an argument.\n", optopt);
73 if (isprint(optopt)) fprintf(stderr, "Unknown option `-%c'.\n", optopt);
74 else fprintf(stderr, "Unknown option character `\\x%x'.\n", optopt);
77 fprintf(stderr, "WARNING -> this option is not valid \"-%c %s\"\n", c, optarg);
83 for (index = optind; index < argc; index++)
84 fprintf(stderr,"Non-option argument %s\n", argv[index]);
90 /*******************************************************************************
92 *******************************************************************************/
93 int main(int argc, char **argv)
95 test_cmp_parameters inParam;
96 FILE *fbase=NULL, *ftest=NULL;
99 unsigned long l=1, pos;
101 if( parse_cmdline_cmp(argc, argv, &inParam) == EXIT_FAILURE )
103 compare_dump_files_help_display();
104 if (!inParam.base_filename) free(inParam.base_filename);
105 if (!inParam.test_filename) free(inParam.test_filename);
109 // Display Parameters
110 printf("******Parameters********* \n");
111 printf(" base_filename = %s\n"
112 " test_filename = %s\n",
113 inParam.base_filename, inParam.test_filename);
114 printf("************************* \n");
117 printf("Try to open: %s for reading ... ", inParam.base_filename);
118 if((fbase = fopen(inParam.base_filename, "rb"))==NULL)
121 free(inParam.base_filename);
122 free(inParam.test_filename);
128 printf("Try to open: %s for reading ... ", inParam.test_filename);
129 if((ftest = fopen(inParam.test_filename, "rb"))==NULL)
133 free(inParam.base_filename);
134 free(inParam.test_filename);
143 chbase = fgetc(fbase);
146 printf("Error reading base file.\n");
150 chtest = fgetc(ftest);
153 printf("Error reading test file.\n");
157 // CRLF problem (Baseline must be always generated by unix platform)
158 if (chbase == '\n' && chtest == '\r')
159 if (fgetc(ftest) == '\n')
164 size_t nbytes = 2048;
166 char *strbase, *strtest, *strbase_d, *strtest_d;
168 printf("Files differ at line %lu:\n", l);
169 fseek(fbase,pos,SEEK_SET);
171 // Take into account CRLF characters when we write \n into
172 // dump file when we used WIN platform
175 fseek(ftest,pos + l - 1,SEEK_SET);
177 fseek(ftest,pos,SEEK_SET);
180 strbase = (char *) malloc(nbytes + 1);
181 strtest = (char *) malloc(nbytes + 1);
182 fgets(strbase, nbytes, fbase);
183 fgets(strtest, nbytes, ftest);
184 strbase_d = (char *) malloc(strlen(strbase)+1);
185 strtest_d = (char *) malloc(strlen(strtest)+1);
186 strncpy(strbase_d, strbase, strlen(strbase)-1);
187 strncpy(strtest_d, strtest, strlen(strtest)-CRLF_shift);
188 strbase_d[strlen(strbase)-1] = '\0';
189 strtest_d[strlen(strtest)-CRLF_shift] = '\0';
190 printf("<%s> vs. <%s>\n", strbase_d, strtest_d);
192 free(strbase);free(strtest);
193 free(strbase_d);free(strtest_d);
212 free(inParam.base_filename);
213 free(inParam.test_filename);
217 printf("\n***** TEST SUCCEED: Files are the same. *****\n");
220 else return EXIT_FAILURE;