-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrpmsetcmp.c
115 lines (113 loc) · 2.83 KB
/
rpmsetcmp.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
#include <stdlib.h>
#include <assert.h>
#include "rpmset.h"
#include "rpmsetcmp-common.h"
#include "setstring.h"
#define CACHE_MINLEN 128
#define STACK_MAXV1 1024
#define STACK_MAXV2 1280
#define xmalloc malloc
#define vmalloc(n) xmalloc((n) * 4)
int rpmsetcmp(const char *Ps, size_t Plen, const char *Rs, size_t Rlen)
{
size_t Pn, Rn;
int Pbpp, Rbpp;
if (unlikely(Plen < CACHE_MINLEN)) {
Pn = setstring_decinit(Ps, Plen, &Pbpp);
if (unlikely(!Pn))
return -3;
uint32_t Pv[Pn+SENTINELS];
Pn = setstring_decode(Ps, Plen, Pbpp, Pv);
if (unlikely(!Pn))
return -3;
Rn = setstring_decinit(Rs, Rlen, &Rbpp);
if (unlikely(!Rn))
return -4;
if (unlikely(Pbpp > Rbpp))
Pn = downsample(Pv, Pn, Pv, Pbpp - Rbpp);
install_sentinels(Pv, Pn);
if (likely(Rn < STACK_MAXV1)) {
uint32_t Rv[Rn];
Rn = setstring_decode(Rs, Rlen, Rbpp, Rv);
if (unlikely(!Rn))
return -4;
if (unlikely(Rbpp > Pbpp))
Rn = downsample(Rv, Rn, Rv, Rbpp - Pbpp);
return setcmploop(Pv, Pn, Rv, Rn);
}
uint32_t *Rv = vmalloc(Rn);
Rn = setstring_decode(Rs, Rlen, Rbpp, Rv);
int ret;
if (unlikely(!Rn))
ret = -4;
else {
if (unlikely(Rbpp > Pbpp))
Rn = downsample(Rv, Rn, Rv, Rbpp - Pbpp);
ret = setcmploop(Pv, Pn, Rv, Rn);
}
free(Rv);
return ret;
}
const uint32_t *Pv;
Pn = cache_decode(Ps, Plen, &Pv);
if (unlikely(!Pn))
return -3;
Pbpp = *Ps - 'a' + 7;
Rn = setstring_decinit(Rs, Rlen, &Rbpp);
if (unlikely(!Rn))
return -4;
if (likely(Rbpp >= Pbpp)) {
if (likely(Rn < STACK_MAXV1)) {
uint32_t Rv[Rn];
Rn = setstring_decode(Rs, Rlen, Rbpp, Rv);
if (unlikely(!Rn))
return -4;
if (unlikely(Rbpp > Pbpp))
Rn = downsample(Rv, Rn, Rv, Rbpp - Pbpp);
return setcmploop(Pv, Pn, Rv, Rn);
}
uint32_t *Rv = vmalloc(Rn);
Rn = setstring_decode(Rs, Rlen, Rbpp, Rv);
int ret;
if (unlikely(!Rn))
ret = -4;
else {
if (unlikely(Rbpp > Pbpp))
Rn = downsample(Rv, Rn, Rv, Rbpp - Pbpp);
ret = setcmploop(Pv, Pn, Rv, Rn);
}
free(Rv);
return ret;
}
if (likely(Rn < STACK_MAXV1)) {
uint32_t Rv[Rn];
Rn = setstring_decode(Rs, Rlen, Rbpp, Rv);
if (unlikely(!Rn))
return -4;
if (Pn + Rn < STACK_MAXV2) {
uint32_t Pw[Pn+SENTINELS];
Pn = downsample(Pv, Pn, Pw, Pbpp - Rbpp);
install_sentinels(Pw, Pn);
return setcmploop(Pw, Pn, Rv, Rn);
}
uint32_t *Pw = vmalloc(Pn + SENTINELS);
Pn = downsample(Pv, Pn, Pw, Pbpp - Rbpp);
install_sentinels(Pw, Pn);
int ret = setcmploop(Pw, Pn, Rv, Rn);
free(Pw);
return ret;
}
uint32_t *Rv = vmalloc(Rn + Pn + SENTINELS);
Rn = setstring_decode(Rs, Rlen, Rbpp, Rv);
int ret;
if (unlikely(!Rn))
ret = -4;
else {
uint32_t *Pw = Rv + Rn;
Pn = downsample(Pv, Pn, Pw, Pbpp - Rbpp);
install_sentinels(Pw, Pn);
ret = setcmploop(Pw, Pn, Rv, Rn);
}
free(Rv);
return ret;
}