mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-11-04 05:39:29 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			150 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			150 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*	This file is part of the software similarity tester SIM.
 | 
						|
	Written by Dick Grune, Vrije Universiteit, Amsterdam.
 | 
						|
	$Id: sim.c,v 2.12 2007/08/27 09:57:34 dick Exp $
 | 
						|
*/
 | 
						|
 | 
						|
#include	<stdio.h>
 | 
						|
#include	<stdlib.h>
 | 
						|
 | 
						|
#include	"settings.par"
 | 
						|
#include	"sim.h"
 | 
						|
#include	"options.h"
 | 
						|
#include	"language.h"
 | 
						|
#include	"error.h"
 | 
						|
#include	"hash.h"
 | 
						|
#include	"compare.h"
 | 
						|
#include	"pass1.h"
 | 
						|
#include	"pass2.h"
 | 
						|
#include	"pass3.h"
 | 
						|
#include	"stream.h"
 | 
						|
#include	"lex.h"
 | 
						|
 | 
						|
unsigned int MinRunSize = DFLT_MIN_RUN_SIZE;
 | 
						|
int PageWidth = DFLT_PAGE_WIDTH;
 | 
						|
FILE *OutputFile;
 | 
						|
FILE *DebugFile;
 | 
						|
 | 
						|
struct text *Text;			/* to be filled in by malloc */
 | 
						|
int NumberOfTexts;			/* number of text records */
 | 
						|
int NumberOfNewTexts;			/* number of new text records */
 | 
						|
 | 
						|
char *progname;				/* for error reporting */
 | 
						|
 | 
						|
static const char *outputname;		/* for reporting */
 | 
						|
static const char *minrunstring;
 | 
						|
static const char *pagewidthstring;
 | 
						|
 | 
						|
static const struct option optlist[] = {
 | 
						|
	{'r', "minimum run size", 'N', &minrunstring},
 | 
						|
	{'w', "page width", 'N', &pagewidthstring},
 | 
						|
	{'f', "function-like forms only", ' ', 0},
 | 
						|
	{'d', "use diff format for output", ' ', 0},
 | 
						|
	{'p', "use percentage format for output", ' ', 0},
 | 
						|
	{'e', "compare each file to each file separately", ' ', 0},
 | 
						|
	{'s', "do not compare a file to itself", ' ', 0},
 | 
						|
	{'S', "compare new files to old files only", ' ', 0},
 | 
						|
	{'F', "keep function identifiers in tact", ' ', 0},
 | 
						|
	{'n', "display headings only", ' ', 0},
 | 
						|
	{'x', "no pass2 nl_buff allocation", ' ', 0},
 | 
						|
	{'o', "write output to file F", 'F', &outputname},
 | 
						|
	{'-', "lexical scan output only", ' ', 0},
 | 
						|
	{0, 0, 0, 0}
 | 
						|
};
 | 
						|
 | 
						|
static void print_stream(const char *fname);
 | 
						|
 | 
						|
int
 | 
						|
main(int argc, char *argv[]) {
 | 
						|
	progname = argv[0];		/* save program name */
 | 
						|
	argv++, argc--;			/* and skip it */
 | 
						|
 | 
						|
	/* Set the default output and debug streams */
 | 
						|
	OutputFile = stdout;
 | 
						|
	DebugFile = stdout;
 | 
						|
 | 
						|
	/* Get command line options */
 | 
						|
	{	int nop = do_options(progname, optlist, argc, argv);
 | 
						|
		argc -= nop, argv += nop;	/* skip them */
 | 
						|
	}
 | 
						|
 | 
						|
	/* Treat the value options */
 | 
						|
	if (minrunstring) {
 | 
						|
		MinRunSize = strtoul(minrunstring, NULL, 10);
 | 
						|
		if (MinRunSize == 0) fatal("bad or zero run size; form is: -r N");
 | 
						|
	}
 | 
						|
	if (pagewidthstring) {
 | 
						|
		PageWidth = atoi(pagewidthstring);
 | 
						|
		if (PageWidth == 0) fatal("bad or zero page width; form is: -w N");
 | 
						|
	}
 | 
						|
	if (outputname) {
 | 
						|
		OutputFile = fopen(outputname, "w");
 | 
						|
		if (OutputFile == 0) {
 | 
						|
			char msg[500];
 | 
						|
 | 
						|
			sprintf(msg, "cannot open output file %s", outputname);
 | 
						|
			fatal(msg);
 | 
						|
			/*NOTREACHED*/
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	if (option_set('-')) {
 | 
						|
		/* it is the lexical scan only */
 | 
						|
		while (argv[0]) {
 | 
						|
			print_stream(argv[0]);
 | 
						|
			argv++;
 | 
						|
		}
 | 
						|
		return 0;
 | 
						|
	}
 | 
						|
 | 
						|
	/* Start processing */
 | 
						|
	InitLanguage();
 | 
						|
 | 
						|
	/* Read the input files */
 | 
						|
	Pass1(argc, argv);
 | 
						|
 | 
						|
	/* Set up the forward reference table */
 | 
						|
	MakeForwardReferences();
 | 
						|
 | 
						|
	/* Compare the input files to find runs */
 | 
						|
	Compare();
 | 
						|
 | 
						|
	/* Delete forward reference table */
 | 
						|
	FreeForwardReferences();
 | 
						|
 | 
						|
	/* Find positions of the runs found */
 | 
						|
	Pass2();
 | 
						|
 | 
						|
	/* Print the similarities */
 | 
						|
	Pass3();
 | 
						|
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
print_stream(const char *fname) {
 | 
						|
	fprintf(OutputFile, "File %s:", fname);
 | 
						|
	if (!OpenStream(fname)) {
 | 
						|
		fprintf(OutputFile, " cannot open\n");
 | 
						|
		return;
 | 
						|
	}
 | 
						|
 | 
						|
	fprintf(OutputFile, " showing token stream:\nnl_cnt, tk_cnt: tokens");
 | 
						|
 | 
						|
	lex_token = EOL;
 | 
						|
	do {
 | 
						|
		if (TOKEN_EQ(lex_token, EOL)) {
 | 
						|
			fprintf(OutputFile, "\n%u,%u:",
 | 
						|
				lex_nl_cnt, lex_tk_cnt
 | 
						|
			);
 | 
						|
		}
 | 
						|
		else {
 | 
						|
			print_token(OutputFile, lex_token);
 | 
						|
		}
 | 
						|
	} while (NextStreamTokenObtained());
 | 
						|
 | 
						|
	fprintf(OutputFile, "\n");
 | 
						|
 | 
						|
	CloseStream();
 | 
						|
 | 
						|
}
 |