123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- /* 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();
- }
|