/
adblock.c
142 lines (118 loc) · 3.64 KB
/
adblock.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#include <Python.h>
#include "structmember.h"
#include "ad_block_client.h"
typedef struct {
PyObject_HEAD
AdBlockClient * client;
} AdBlock;
static void
AdBlock_dealloc(AdBlock* self)
{
delete self->client;
Py_TYPE(self)->tp_free((PyObject*)self);
}
static PyObject *
AdBlock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
AdBlock *self;
self = (AdBlock *)type->tp_alloc(type, 0);
return (PyObject *)self;
}
static int
AdBlock_init(AdBlock *self, PyObject *args, PyObject *kwds)
{
self->client = new AdBlockClient;
return 0;
}
static PyObject *
AdBlock_parse(AdBlock* self, PyObject *args)
{
const char *data;
if (!PyArg_ParseTuple(args, "s", &data))
return NULL;
self->client->parse(data);
Py_RETURN_NONE;
}
static PyObject *
AdBlock_matches(AdBlock* self, PyObject *args)
{
const char *url, *domain;
if (!PyArg_ParseTuple(args, "ss", &url, &domain))
return NULL;
if (self->client->matches(url, FONoFilterOption, domain)) {
Py_RETURN_TRUE;
} else {
Py_RETURN_FALSE;
}
}
static PyMethodDef AdBlock_methods[] = {
{"parse", (PyCFunction)AdBlock_parse, METH_VARARGS,
"Parse adblock data string, like the content of an easylist."
},
{"matches", (PyCFunction)AdBlock_matches, METH_VARARGS,
"matches an url, returns True if it should be filtered."
},
{NULL} /* Sentinel */
};
static PyTypeObject AdBlockType = {
PyVarObject_HEAD_INIT(NULL, 0)
"adblock.AdBlock", /* tp_name */
sizeof(AdBlock), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)AdBlock_dealloc, /* tp_dealloc */
0, /* tp_print */
0, /* tp_getattr */
0, /* tp_setattr */
0, /* tp_reserved */
0, /* tp_repr */
0, /* tp_as_number */
0, /* tp_as_sequence */
0, /* tp_as_mapping */
0, /* tp_hash */
0, /* tp_call */
0, /* tp_str */
0, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT |
Py_TPFLAGS_BASETYPE, /* tp_flags */
"Adblock objects", /* tp_doc */
0, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
0, /* tp_iter */
0, /* tp_iternext */
AdBlock_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
0, /* tp_dict */
0, /* tp_descr_get */
0, /* tp_descr_set */
0, /* tp_dictoffset */
(initproc)AdBlock_init, /* tp_init */
0, /* tp_alloc */
AdBlock_new, /* tp_new */
};
static PyModuleDef adblockmodule = {
PyModuleDef_HEAD_INIT,
"adblock",
"Module to speed up ad filtering.",
-1,
NULL, NULL, NULL, NULL, NULL
};
PyMODINIT_FUNC
PyInit__adblock(void)
{
PyObject* m;
AdBlockType.tp_new = PyType_GenericNew;
if (PyType_Ready(&AdBlockType) < 0)
return NULL;
m = PyModule_Create(&adblockmodule);
if (m == NULL)
return NULL;
Py_INCREF(&AdBlockType);
PyModule_AddObject(m, "AdBlock", (PyObject *)&AdBlockType);
return m;
}