| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
#define PERL_NO_GET_CONTEXT // we'll define thread context if necessary (faster) |
|
2
|
|
|
|
|
|
|
#include "EXTERN.h" // globals/constant import locations |
|
3
|
|
|
|
|
|
|
#include "perl.h" // Perl symbols, structures and constants definition |
|
4
|
|
|
|
|
|
|
#include "XSUB.h" // xsubpp functions and macros |
|
5
|
|
|
|
|
|
|
#include // rand() |
|
6
|
|
|
|
|
|
|
#include |
|
7
|
|
|
|
|
|
|
|
|
8
|
18
|
|
|
|
|
|
static char* replace_char_start (char* str, char * mask_char, size_t length) { |
|
9
|
18
|
50
|
|
|
|
|
if (length == 0) return str; |
|
10
|
18
|
|
|
|
|
|
int i = 0; |
|
11
|
178
|
100
|
|
|
|
|
while(i < length) { |
|
12
|
160
|
|
|
|
|
|
int pos = (strlen(str) - 1) - i; |
|
13
|
160
|
100
|
|
|
|
|
if (str[pos] != '.' && str[pos] != '@') { |
|
|
|
100
|
|
|
|
|
|
|
14
|
146
|
|
|
|
|
|
str[pos] = *mask_char; |
|
15
|
|
|
|
|
|
|
} |
|
16
|
160
|
|
|
|
|
|
i++; |
|
17
|
|
|
|
|
|
|
} |
|
18
|
18
|
|
|
|
|
|
return str; |
|
19
|
|
|
|
|
|
|
} |
|
20
|
|
|
|
|
|
|
|
|
21
|
18
|
|
|
|
|
|
static char* replace_char_end (char* str, char * mask_char, size_t length) { |
|
22
|
18
|
50
|
|
|
|
|
if (length == 0) return str; |
|
23
|
18
|
|
|
|
|
|
int i = 0; |
|
24
|
174
|
100
|
|
|
|
|
while(i < length) { |
|
25
|
156
|
50
|
|
|
|
|
if (str[i] != '.' && str[i] != '@') { |
|
|
|
100
|
|
|
|
|
|
|
26
|
154
|
|
|
|
|
|
str[i] = *mask_char; |
|
27
|
|
|
|
|
|
|
} |
|
28
|
156
|
|
|
|
|
|
i++; |
|
29
|
|
|
|
|
|
|
} |
|
30
|
18
|
|
|
|
|
|
return str; |
|
31
|
|
|
|
|
|
|
} |
|
32
|
|
|
|
|
|
|
|
|
33
|
10
|
|
|
|
|
|
static char* replace_char_middle (char* str, char * mask_char, size_t length) { |
|
34
|
10
|
50
|
|
|
|
|
if (length == 0) return str; |
|
35
|
10
|
|
|
|
|
|
int half = floor(length / 2); |
|
36
|
10
|
|
|
|
|
|
str = replace_char_start(str, mask_char, length - half); |
|
37
|
10
|
|
|
|
|
|
str = replace_char_end(str, mask_char, half); |
|
38
|
10
|
|
|
|
|
|
return str; |
|
39
|
|
|
|
|
|
|
} |
|
40
|
|
|
|
|
|
|
|
|
41
|
4
|
|
|
|
|
|
static char* replace_char_email (char* str, char * mask_char, size_t length) { |
|
42
|
4
|
50
|
|
|
|
|
if (length == 0) return str; |
|
43
|
4
|
|
|
|
|
|
int pos = (strlen(str) - 1); |
|
44
|
40
|
100
|
|
|
|
|
while ( str[pos] != '@' ) { |
|
45
|
36
|
100
|
|
|
|
|
if (str[pos] != '.') { |
|
46
|
32
|
|
|
|
|
|
str[pos] = *mask_char; |
|
47
|
|
|
|
|
|
|
} |
|
48
|
36
|
|
|
|
|
|
pos--; |
|
49
|
|
|
|
|
|
|
} |
|
50
|
4
|
|
|
|
|
|
pos--; |
|
51
|
36
|
100
|
|
|
|
|
while(length > 0) { |
|
52
|
32
|
50
|
|
|
|
|
if (str[pos] != '.' && str[pos] != '@') { |
|
|
|
50
|
|
|
|
|
|
|
53
|
32
|
|
|
|
|
|
str[pos] = *mask_char; |
|
54
|
|
|
|
|
|
|
} |
|
55
|
32
|
|
|
|
|
|
pos--; |
|
56
|
32
|
|
|
|
|
|
length--; |
|
57
|
|
|
|
|
|
|
} |
|
58
|
4
|
|
|
|
|
|
return str; |
|
59
|
|
|
|
|
|
|
} |
|
60
|
|
|
|
|
|
|
|
|
61
|
30
|
|
|
|
|
|
static char * mask_string (char * str, char * pos, double len, char * mask_char) { |
|
62
|
30
|
100
|
|
|
|
|
if (strcmp(pos, "end") == 0) { |
|
63
|
8
|
|
|
|
|
|
return replace_char_end(str, mask_char, strlen(str) - len); |
|
64
|
22
|
100
|
|
|
|
|
} else if (strcmp(pos, "middle") == 0) { |
|
65
|
10
|
|
|
|
|
|
return replace_char_middle(str, mask_char, strlen(str) - len); |
|
66
|
12
|
100
|
|
|
|
|
} else if (strcmp(pos, "email") == 0) { |
|
67
|
4
|
|
|
|
|
|
return replace_char_email(str, mask_char, len); |
|
68
|
|
|
|
|
|
|
} |
|
69
|
8
|
|
|
|
|
|
return replace_char_start(str, mask_char, strlen(str) - len);; |
|
70
|
|
|
|
|
|
|
} |
|
71
|
|
|
|
|
|
|
|
|
72
|
|
|
|
|
|
|
MODULE = String::Mask::XS PACKAGE = String::Mask::XS |
|
73
|
|
|
|
|
|
|
PROTOTYPES: ENABLE |
|
74
|
|
|
|
|
|
|
|
|
75
|
|
|
|
|
|
|
char * |
|
76
|
|
|
|
|
|
|
mask(...) |
|
77
|
|
|
|
|
|
|
CODE: |
|
78
|
30
|
|
|
|
|
|
char * str = SvPV_nolen(ST(0)); |
|
79
|
30
|
100
|
|
|
|
|
char * pos = items > 1 ? SvPV_nolen(ST(1)) : "start"; |
|
80
|
30
|
100
|
|
|
|
|
double len = items > 2 ? SvIV(ST(2)) : floor(strlen(str) / 2); |
|
81
|
30
|
100
|
|
|
|
|
char * mask_char = items > 3 ? SvPV_nolen(ST(3)) : "*"; |
|
82
|
30
|
|
|
|
|
|
RETVAL = mask_string(str, pos, len, mask_char); |
|
83
|
|
|
|
|
|
|
OUTPUT: |
|
84
|
|
|
|
|
|
|
RETVAL |