⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tst-filter.c

📁 linux平台或者windwos平台通用xml 解析器
💻 C
字号:
/* iksemel (XML parser for Jabber)** Copyright (C) 2000-2003 Gurer Ozen <madcat@e-kolay.net>** This code is free software; you can redistribute it and/or** modify it under the terms of GNU Lesser General Public License.*/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <locale.h>#include <assert.h>#include "iksemel.h"struct {	iksfilter *f;	char *xml;	int nr;	iksFilterHook *hook[20];	int nr_hook;	iksFilterHook *call[20];	int nr_call;} tester;voiddocument (char *xml){	tester.nr++;	tester.xml = xml;	tester.nr_hook = 0;}voidhook (iksFilterHook *hk){	tester.hook[tester.nr_hook++] = hk;}voiddebug (void){	int i;	printf ("Filter test %d:\n", tester.nr);	if (tester.nr_hook) {		puts ("Expected hook order:");		for (i = 0; i < tester.nr_hook; i++) {			printf (" ");			tester.hook[i] (NULL, NULL);		}	} else {		puts("No hooks expected.");	}	if (tester.nr_call) {		puts ("Hook order:");		for (i = 0; i < tester.nr_call; i++) {			printf (" ");			tester.call[i] (NULL, NULL);		}	} else {		puts("No hooks called.");	}	exit (1);}voidtest (void){	iksparser *prs;	iks *x;	int i;	tester.nr_call = 0;	prs = iks_dom_new (&x);	iks_parse (prs, tester.xml, strlen (tester.xml), 1);	iks_parser_delete (prs);	iks_filter_packet (tester.f, iks_packet (x));	iks_delete (x);	if (tester.nr_call != tester.nr_hook) debug ();	for (i = 0; i < tester.nr_hook; i++) {		if (tester.call[i] != tester.hook[i]) debug ();	}}#define DEBUG(x) if (NULL == pak) { puts ( (x) ); return IKS_FILTER_PASS; }inton_msg (void *user_data, ikspak *pak){	DEBUG ("on_msg");	assert (IKS_PAK_MESSAGE == pak->type);	tester.call[tester.nr_call++] = on_msg;	return IKS_FILTER_PASS;}inton_iq (void *user_data, ikspak *pak){	DEBUG ("on_iq");	assert (IKS_PAK_IQ == pak->type);	tester.call[tester.nr_call++] = on_iq;	return IKS_FILTER_PASS;}inton_iq_result (void *user_data, ikspak *pak){	DEBUG ("on_iq_result");	assert (IKS_PAK_IQ == pak->type);	assert (IKS_TYPE_RESULT == pak->subtype);	tester.call[tester.nr_call++] = on_iq_result;	return IKS_FILTER_PASS;}inton_iq_result_id_auth (void *user_data, ikspak *pak){	DEBUG ("on_iq_result_id_auth");	assert (IKS_PAK_IQ == pak->type);	assert (IKS_TYPE_RESULT == pak->subtype);	assert (iks_strcmp (pak->id, "auth") == 0);	tester.call[tester.nr_call++] = on_iq_result_id_auth;	return IKS_FILTER_PASS;}inton_id_auth (void *user_data, ikspak *pak){	DEBUG ("on_id_auth");	assert (iks_strcmp (pak->id, "auth") == 0);	tester.call[tester.nr_call++] = on_id_auth;	return IKS_FILTER_PASS;}inton_from_patrician (void *user_data, ikspak *pak){	DEBUG ("on_from_patrician");	assert (iks_strcmp (pak->from->partial, "patrician@morpork.gov") == 0);	tester.call[tester.nr_call++] = on_from_patrician;	return IKS_FILTER_PASS;}inton_msg_chat_from_patrician (void *user_data, ikspak *pak){	DEBUG ("on_msg_chat_from_patrician");	assert (pak->type == IKS_PAK_MESSAGE);	assert (pak->subtype == IKS_TYPE_CHAT);	assert (iks_strcmp (pak->from->partial, "patrician@morpork.gov") == 0);	tester.call[tester.nr_call++] = on_msg_chat_from_patrician;	return IKS_FILTER_PASS;}inton_id_albatros (void *user_data, ikspak *pak){	DEBUG ("on_id_albatros");	assert (iks_strcmp (pak->id, "albatros") == 0);	tester.call[tester.nr_call++] = on_id_albatros;	return IKS_FILTER_PASS;}inton_from_dean (void *user_data, ikspak *pak){	DEBUG ("on_from_dean");	assert (iks_strcmp (pak->from->partial, "dean@unseen.edu") == 0);	tester.call[tester.nr_call++] = on_from_dean;	return IKS_FILTER_PASS;}intmain (int argc, char *argv[]){	tester.f = iks_filter_new ();	iks_filter_add_rule (tester.f, on_msg, 0,		IKS_RULE_TYPE, IKS_PAK_MESSAGE,		IKS_RULE_DONE);	iks_filter_add_rule (tester.f, on_iq, 0,		IKS_RULE_TYPE, IKS_PAK_IQ,		IKS_RULE_DONE);	iks_filter_add_rule (tester.f, on_iq_result, 0,		IKS_RULE_TYPE, IKS_PAK_IQ,		IKS_RULE_SUBTYPE, IKS_TYPE_RESULT,		IKS_RULE_DONE);	iks_filter_add_rule (tester.f, on_iq_result_id_auth, 0,		IKS_RULE_TYPE, IKS_PAK_IQ,		IKS_RULE_SUBTYPE, IKS_TYPE_RESULT,		IKS_RULE_ID, "auth",		IKS_RULE_DONE);	iks_filter_add_rule (tester.f, on_id_auth, 0,		IKS_RULE_ID, "auth",		IKS_RULE_DONE);	iks_filter_add_rule (tester.f, on_from_dean, 0,		IKS_RULE_FROM_PARTIAL, "dean@unseen.edu",		IKS_RULE_DONE);	iks_filter_add_rule (tester.f, on_from_patrician, 0,		IKS_RULE_FROM_PARTIAL, "patrician@morpork.gov",		IKS_RULE_DONE);	iks_filter_add_rule (tester.f, on_msg_chat_from_patrician, 0,		IKS_RULE_TYPE, IKS_PAK_MESSAGE,		IKS_RULE_SUBTYPE, IKS_TYPE_CHAT,		IKS_RULE_FROM_PARTIAL, "patrician@morpork.gov",		IKS_RULE_DONE);	iks_filter_add_rule (tester.f, on_id_albatros, 0,		IKS_RULE_ID, "albatros",		IKS_RULE_DONE);	document ("<message from='dean@unseen.edu' id='1234'><body>Born to Rune.</body></message>");	hook (on_from_dean);	hook (on_msg);	test ();	document ("<presence from='librarian@unseen.edu' show='away'/>");	test ();	document ("<message from='rincewind@unseen.edu' type='chat' id='albatros'><body>yaaargh</body></message>");	hook (on_id_albatros);	hook (on_msg);	test ();	document ("<iq type='get' from='rincewind@unseen.edu'><query xmlns='jabber:time'/></iq>");	hook (on_iq);	test ();	document ("<message from='patrician@morpork.gov'><body>so you admit it?</body></message>");	hook (on_from_patrician);	hook (on_msg);	test ();	document ("<iq type='result' from='rincewind@unseen.edu'><query xmlns='jabber:version'><name>cabbar</name><version>1.0</version></query></iq>");	hook (on_iq_result);	hook (on_iq);	test ();	document ("<presence from='dean@unseen.edu/psi' type='unavailable'/>");	hook (on_from_dean);	test ();	document ("<message from='patrician@morpork.gov' type='chat' id='albatros'><body>hmm</body></message>");	hook (on_id_albatros);	hook (on_msg_chat_from_patrician);	hook (on_from_patrician);	hook (on_msg);	test ();	document ("<iq type='result' id='auth'/>");	hook (on_iq_result_id_auth);	hook (on_id_auth);	hook (on_iq_result);	hook (on_iq);	test ();	iks_filter_delete (tester.f);	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -