File Coverage

lib/String/Mask/XS.xs
Criterion Covered Total %
statement 50 50 100.0
branch 35 42 83.3
condition n/a
subroutine n/a
pod n/a
total 85 92 92.3


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