| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 | /*	This file is part of the software similarity tester SIM.	Written by Dick Grune, Vrije Universiteit, Amsterdam.	$Id: pass2.c,v 2.10 2004/08/05 09:49:46 dick Exp $*/#include	<stdio.h>#include	"debug.par"#include	"sim.h"#include	"text.h"#include	"lex.h"#include	"pass2.h"#ifdef	DB_POSstatic void db_print_pos_list(const char *, const struct position *);static void db_print_lex(const char *);#endifstatic void pass2_txt(struct text *txt);static int next_eol_obtained(void);voidPass2(void) {	int n;	for (n = 0; n < NumberOfTexts; n++) {		pass2_txt(&Text[n]);	}}/* instantiate sort_pos_list() */#define	SORT_STRUCT		position#define	SORT_NAME		sort_pos_list#define	SORT_BEFORE(p1,p2)	((p1)->ps_tk_cnt < (p2)->ps_tk_cnt)#define	SORT_NEXT		ps_next#include	"sortlist.bdy"static voidpass2_txt(struct text *txt) {	register struct position *pos;	register unsigned int old_nl_cnt;	if (!txt->tx_pos)	/* no need to scan the file */		return;	if (!OpenText(Second, txt)) {		fprintf(stderr, ">>>> File %s disappeared <<<<\n",			txt->tx_fname		);	}	/* sets lex_nl_cnt and lex_tk_cnt */#ifdef	DB_POS	db_print_pos_list("before sorting", txt->tx_pos);#endif	/* DB_POS */	sort_pos_list(&txt->tx_pos);#ifdef	DB_POS	db_print_pos_list("after sorting", txt->tx_pos);#endif	/* DB_POS */#ifdef	DB_NL_BUFF	db_print_nl_buff(txt->tx_nl_start, txt->tx_nl_limit);#endif	/* DB_NL_BUFF */	old_nl_cnt = 1;	pos = txt->tx_pos;	while (pos) {		/* we scan the pos list and the file in parallel */		/* find the corresponding line */		while (pos->ps_tk_cnt >= lex_tk_cnt) {			/* pos does not refer to this line, try the next */			/* shift the administration */			old_nl_cnt = lex_nl_cnt;			/* and get the next eol position */			if (!next_eol_obtained()) {				/* ouch! not enough lines! */				fprintf(stderr, ">>>> File %s modified <<<<\n",					txt->tx_fname				);				break;			}#ifdef	DB_POS			db_print_lex(txt->tx_fname);#endif	/* DB_POS */		}		/* fill in the pos */		switch (pos->ps_type) {		case 0:	/* first token of run */			pos->ps_nl_cnt = old_nl_cnt;			break;		case 1:	/* last token of run */			pos->ps_nl_cnt = lex_nl_cnt;			break;		}		/* and get the next pos */		pos = pos->ps_next;	}#ifdef	DB_POS	db_print_pos_list("after scanning", txt->tx_pos);#endif	/* DB_POS */	CloseText(Second, txt);}static intnext_eol_obtained(void) {	while (NextTextTokenObtained(Second)) {		if (TOKEN_EQ(lex_token, EOL)) return 1;	}	return 0;}#ifdef	DB_POSstatic voiddb_print_pos(const struct position *pos) {	fprintf(DebugFile, "pos type: %s; token count: %u",		(pos->ps_type == 0 ? "first" : " last"),		pos->ps_tk_cnt	);	fprintf(DebugFile, ", line#: ");	if (pos->ps_nl_cnt == -1) {		fprintf(DebugFile, "<NOT SET>");	}	else {		fprintf(DebugFile, "%u", pos->ps_nl_cnt);	}	fprintf(DebugFile, "\n");}static voiddb_print_pos_list(const char *msg, const struct position *pos) {	fprintf(DebugFile, "\n**** DB_PRINT_POS_LIST, %s ****\n", msg);	while (pos) {		db_print_pos(pos);		pos = pos->ps_next;	}	fprintf(DebugFile, "\n");}static voiddb_print_lex(const char *fn) {	fprintf(DebugFile, "%s: lex_tk_cnt = %u, lex_nl_cnt = %u\n",		fn, lex_tk_cnt, lex_nl_cnt);}#endif	/* DB_POS */
 |