summaryrefslogtreecommitdiff
path: root/OPJ_Validate/OPJ_Validate.c
diff options
context:
space:
mode:
authorFrancois-Olivier Devaux <fodevaux@users.noreply.github.com>2010-03-05 21:17:11 +0000
committerFrancois-Olivier Devaux <fodevaux@users.noreply.github.com>2010-03-05 21:17:11 +0000
commit20d5c4c1a806e9c3602a36499f0873029a9ad232 (patch)
treec1b4aaaf370e9511cce6dbbc9275acf27c794311 /OPJ_Validate/OPJ_Validate.c
parent34c485169e5c67457e1eebc2ecc7ed487c447910 (diff)
First import of OPJ_Validate tool
Diffstat (limited to 'OPJ_Validate/OPJ_Validate.c')
-rw-r--r--OPJ_Validate/OPJ_Validate.c244
1 files changed, 244 insertions, 0 deletions
diff --git a/OPJ_Validate/OPJ_Validate.c b/OPJ_Validate/OPJ_Validate.c
new file mode 100644
index 00000000..e35b6294
--- /dev/null
+++ b/OPJ_Validate/OPJ_Validate.c
@@ -0,0 +1,244 @@
+/*
+* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
+* Copyright (c) 2002-2007, Professor Benoit Macq
+* Copyright (c) 2003-2007, Francois-Olivier Devaux
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+* 1. Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+* 2. Redistributions in binary form must reproduce the above copyright
+* notice, this list of conditions and the following disclaimer in the
+* documentation and/or other materials provided with the distribution.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+* POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#ifdef WIN32
+#include <windows.h>
+#endif
+#include <stdio.h>
+#include <string.h>
+#include "md5.h"
+
+#define OPJ_Bin_Dir "OPJ_Binaries"
+
+int doprocess(char programme[4096],char command_line[4096]) {
+
+#ifdef WIN32
+
+ int exit=STILL_ACTIVE;
+ STARTUPINFO siStartupInfo;
+ PROCESS_INFORMATION piProcessInfo;
+
+ memset(&siStartupInfo, 0, sizeof(siStartupInfo));
+ memset(&piProcessInfo, 0, sizeof(piProcessInfo));
+ siStartupInfo.cb = sizeof(siStartupInfo);
+
+ if(CreateProcess(programme, // Application name
+ command_line, // Application arguments
+ 0,
+ 0,
+ FALSE,
+ CREATE_DEFAULT_ERROR_MODE,
+ 0,
+ 0, // Working directory
+ &siStartupInfo,
+ &piProcessInfo) == FALSE)
+ return 1;
+
+ exit=STILL_ACTIVE;
+ while(exit==STILL_ACTIVE) {
+ Sleep(1000);
+ GetExitCodeProcess(piProcessInfo.hProcess,&exit);
+ }
+
+ return 0;
+
+#else // #ifndef WIN32
+ printf("\n%s\n", command_line);
+ system(command_line);
+ return 0;
+
+#endif
+
+}
+
+char MD5_process(char *input_filename, char *md5_filename) {
+ MD5_CTX mdContext;
+ int bytes;
+ unsigned char data[1024];
+ FILE *input_file, *md5_file;
+
+ input_file = fopen(input_filename, "rb");
+ if (!input_file) {
+ printf("Error opening file %s\n", input_filename);
+ return 1;
+ }
+
+ md5_file = fopen(md5_filename, "wb");
+ if (!md5_file) {
+ printf("Error opening file %s\n", md5_filename);
+ return 1;
+ }
+
+ MD5Init (&mdContext);
+ while ((bytes = fread (data, 1, 1024, input_file)) != 0)
+ MD5Update (&mdContext, data, bytes);
+ MD5Final (&mdContext);
+
+ fwrite(mdContext.digest,16,1,md5_file);
+
+ fclose(input_file);
+ fclose(md5_file);
+
+ return 0;
+}
+
+char fcompare(char *input_filename, char *output_filename) {
+ FILE *input_file, *output_file;
+ unsigned char input_buffer[17], output_buffer[17];
+ char comparison;
+
+ input_file = fopen(input_filename, "rb");
+ if (!input_file) {
+ printf("Error opening file %s\n", input_filename);
+ return -1;
+ }
+
+ output_file = fopen(output_filename, "rb");
+ if (!output_file) {
+ printf("Error opening file %s\n", output_filename);
+ return -1;
+ }
+
+ fread(input_buffer,16,1,input_file);
+ fread(output_buffer,16,1,output_file);
+ fclose(input_file);
+ fclose(output_file);
+ input_buffer[16] = 0;
+ output_buffer[16] = 0;
+
+ comparison = strcmp(input_buffer, output_buffer);
+
+ if (comparison)
+ return 1;
+ return 0;
+}
+
+int main(int argc, char* argv[]) {
+ FILE *param_file, *md5_file;
+ FILE *report_file;
+ char line[4096];
+ char md5_filename[4096], tempmd5_filename[4096], temp[4096], report_filename[4096];
+ char output_filename[4096];
+ char input_cmdline[4096];
+ char command_line[4096], exefile[4096];
+ int task_counter = 0, word_counter;
+ char bin_dir[4096];
+ unsigned int word_pointer;
+ char ch[4096];
+ char comparison;
+ int num_failed = 0;
+ int num_inexistant = 0;
+ int num_passed = 0;
+
+ if (argc != 3) {
+ printf("Error with command line. \nExpected: OPJ_Validate parameter_filename bin_directory\n Example: OPJ_Validate parameters_01.txt version1.1.a\n\n");
+ return 1;
+ }
+
+ param_file = fopen(argv[1],"rb");
+ if (!param_file) {
+ printf("Error opening parameter file %s\n",argv[1]);
+ return 1;
+ }
+
+ sprintf(bin_dir,"%s/%s",OPJ_Bin_Dir,argv[2]);
+ sprintf(tempmd5_filename,"temp/tempmd5.txt");
+ sprintf(report_filename,"%s/report.txt",bin_dir);
+ report_file = fopen(report_filename, "wb");
+ if (!report_file) {
+ printf("Unable to open report file %s", report_filename);
+ return 1;
+ }
+
+ while (fgets(line, 4096, param_file) != NULL) {
+
+ if (line[0] != '#' && line[0] != 0x0d) { // If not a comment line
+ sscanf(line, "%s", temp);
+ word_pointer = 0;
+ sprintf(input_cmdline,"");
+ sscanf(line+word_pointer,"%s",ch);
+ sprintf(exefile,"%s/%s",bin_dir,ch);
+ word_counter = 0;
+ while (sscanf(line+word_pointer,"%s",ch) > 0) {
+ if (word_counter == 4)
+ strcpy(output_filename, ch);
+ word_pointer += strlen(ch)+1;
+ sprintf(input_cmdline,"%s%s ",input_cmdline, ch);
+ word_counter++;
+ }
+ sprintf(md5_filename,"%s.md5",output_filename);
+ task_counter++;
+ sprintf(command_line,"%s/%s",bin_dir,input_cmdline);
+ printf("Task %d\nMD5 file: %s\nCommand line: \"%s\"\n",task_counter, md5_filename,command_line);
+ fprintf(report_file,"Task %d\n MD5 file: %s\n Command line: \"%s\"\n",task_counter, md5_filename,command_line);
+
+ if (doprocess(exefile,command_line)) {
+ printf("Error executing: \"%s\" \n", command_line);
+ fprintf(report_file,"Task %d failed because command line is not valid.\n\n", task_counter);
+ }
+ else {
+
+ // Check if MD5 reference exists
+ md5_file = fopen(md5_filename,"rb");
+ if (md5_file) {
+ fclose(md5_file);
+ if (MD5_process(output_filename, tempmd5_filename))
+ return 1;
+
+ comparison = fcompare(tempmd5_filename, md5_filename);
+ if (comparison == -1)
+ return 1;
+ else if (comparison) {
+ printf("ERROR: %s and %s are different.\nThe codec seems to behave differently.\n\n", tempmd5_filename, md5_filename);
+ fprintf(report_file,"ERROR: %s and %s are different.\nThe codec seems to behave differently.\n\n", tempmd5_filename, md5_filename);
+ num_failed++;
+ }
+ else {
+ printf("%s and %s are the same.\nTask %d OK\n\n",tempmd5_filename, md5_filename, task_counter);
+ fprintf(report_file," %s and %s are the same.\nTask %d OK\n\n",tempmd5_filename, md5_filename, task_counter);
+ num_passed++;
+ }
+ remove(tempmd5_filename);
+ }
+ else {
+ if (MD5_process(output_filename, md5_filename))
+ return 1;
+ printf("... MD5 of %s was inexistant. It has been created\n\n", output_filename);
+ fprintf(report_file,"MD5 of %s was inexistant. It has been created\n\n", output_filename);
+ num_inexistant++;
+ }
+ }
+ }
+ }
+
+ printf("\n\REPORT;\n%d tests num_passed\n%d tests num_failed\n%d MD5 were num_inexistant\n", num_passed, num_failed, num_inexistant);
+ fprintf(report_file,"\n\REPORT;\n%d tests num_passed\n%d tests num_failed\n%d MD5 were num_inexistant\n", num_passed, num_failed, num_inexistant);
+ fclose(param_file);
+ fclose(report_file);
+
+}