示例#1
0
文件: makedsig.c 项目: Nico01/dcc
int main(int argc, char *argv[])
{
	int s;

	if (((argv[1][0] == '-') || (argv[1][0] == '-')) &&
		((argv[1][1] == 'h') || (argv[1][1] == '?')))
	{
		printf(
	"This program is to make 'signatures' of known c library calls for the dcc "
	"program. It needs as the first arg the name of a library file, and as the "
	"second arg, the name of the signature file to be generated.\n"
			  );
		exit(0);
	}
	if (argc <= 2)
	{
		printf("Usage: makedsig <libname> <signame>\nor makedsig -h for help\n");
		exit(1);
	}

	if ((f = fopen(argv[1], "rb")) == NULL)
	{
		printf("Cannot read %s\n", argv[1]);
		exit(2);
	}

	if ((f2 = fopen(argv[2], "wb")) == NULL)
	{
		printf("Cannot write %s\n", argv[2]);
		exit(2);
	}

	fprintf(stderr, "Seed: ");
	scanf("%d", &s);
	srand(s);

	numKeys = readSyms();			/* Read the keys (symbols) */

printf("Num keys: %d; vertices: %d\n", numKeys, (int)(numKeys*C));

	hashParams(						/* Set the parameters for the hash table */
		numKeys,					/* The number of symbols */
		PATLEN,						/* The length of the pattern to be hashed */
		256,						/* The character set of the pattern (0-FF) */
		0,							/* Minimum pattern character value */
		(int)(numKeys*C));			/* C is the sparseness of the graph. See Czech,
										Havas and Majewski for details */

	/* The following two functions are in perfhlib.c */
	map();							/* Perform the mapping. This will call
										getKey() repeatedly */
	assign();						/* Generate the function g */

	saveFile();						/* Save the resultant information */

	fclose(f);
	fclose(f2);
	
}
static void testBloomFilter()
{
	HashParams hashParams(10);
	BloomFilter* bf = new BloomFilter(&hashParams, 1000);

	REQUIRE(bf->get(key1.data, key1.len) == false);
	REQUIRE(bf->get(key1.data, key1.len) == false);

	bf->set(key1.data, key1.len);
	REQUIRE(bf->get(key1.data, key1.len) == true);
	
	REQUIRE(bf->get(key2.data, key2.len) == false);
	bf->set(key2.data, key2.len);
	REQUIRE(bf->get(key2.data, key2.len) == true);
	REQUIRE(bf->get(key1.data, key1.len) == true);

	delete bf;
}
static void testAgeBloomFilter()
{
	HashParams hashParams(10);
	AgeBloomFilter* bf = new AgeBloomFilter(&hashParams, 1000);

	time_t now = time(NULL);
	time_t later = now + 10;

        REQUIRE(bf->get(key1.data, key1.len) == 0);
        REQUIRE(bf->get(key1.data, key1.len) == 0);

        bf->set(key1.data, key1.len, now);
        REQUIRE(bf->get(key1.data, key1.len) == now);
        REQUIRE(bf->get(key2.data, key2.len) == 0);

        bf->set(key2.data, key2.len, later);
        REQUIRE(bf->get(key2.data, key2.len) == later);
        REQUIRE(bf->get(key1.data, key1.len) == now);	

	REQUIRE(bf->get(key2.data, key2.len) > bf->get(key1.data, key1.len));

	delete bf;
}
static void testCountBloomFilter()
{
	HashParams hashParams(10);
	CountBloomFilter* bf = new CountBloomFilter(&hashParams, 1000);

	std::cout << "bf(key1) == " << bf->get(key1.data, key1.len) << std::endl;
        REQUIRE(bf->get(key1.data, key1.len) == 0);
        std::cout << "bf(key2) == " << bf->get(key2.data, key2.len) << std::endl;
        REQUIRE(bf->get(key2.data, key2.len) == 0);
	
        bf->set(key1.data, key1.len, 100);
	std::cout << "bf(key1) == " << bf->get(key1.data, key1.len) << std::endl;
	std::cout << "bf(key2) == " << bf->get(key2.data, key2.len) << std::endl;
        REQUIRE(bf->get(key1.data, key1.len) == 100);
        REQUIRE(bf->get(key2.data, key2.len) == 0);
	
        bf->set(key2.data, key2.len, 1000);
	std::cout << "bf(key1) == " << bf->get(key1.data, key1.len) << std::endl;
	std::cout << "bf(key2) == " << bf->get(key2.data, key2.len) << std::endl;
        REQUIRE(bf->get(key2.data, key2.len) == 1000);
        REQUIRE(bf->get(key1.data, key1.len) == 100);

	bf->set(key1.data, key1.len, 100);
	std::cout << "bf(key1) == " << bf->get(key1.data, key1.len) << std::endl;
	REQUIRE(bf->get(key1.data, key1.len) == 200);

	bf->set(key1.data, key1.len, -200);
	std::cout << "bf(key1) == " << bf->get(key1.data, key1.len) << std::endl;
	REQUIRE(bf->get(key1.data, key1.len) == 0);	

	bf->set(key2.data, key1.len, -1000);
	std::cout << "bf(key2) == " << bf->get(key2.data, key2.len) << std::endl;
	REQUIRE(bf->get(key2.data, key2.len) == 0);

	delete bf;
}