/builds/xfbs/passgen/src/pattern/special.c
Line | Count | Source (jump to first uncovered line) |
1 | | #include "passgen/pattern/special.h" |
2 | | #include "passgen/assert.h" |
3 | | #include "passgen/util/utf8.h" |
4 | | #include <assert.h> |
5 | | #include <stdbool.h> |
6 | | #include <stdlib.h> |
7 | | |
8 | 10 | #define PARAMETERS_INITIAL_SIZE 16 |
9 | 8 | #define PARAMETERS_MULTIPLIER 2 |
10 | | |
11 | | void passgen_pattern_special_init( |
12 | | passgen_pattern_special *special, |
13 | 135 | uint32_t kind) { |
14 | 135 | special->parameters_len = 0; |
15 | 135 | special->parameters_cap = 0; |
16 | 135 | special->parameters = NULL; |
17 | 135 | |
18 | 135 | switch(kind) { |
19 | 41 | case 'm': |
20 | 41 | special->kind = PASSGEN_PATTERN_SPECIAL_MARKOV; |
21 | 41 | break; |
22 | 49 | case 'w': |
23 | 49 | special->kind = PASSGEN_PATTERN_SPECIAL_WORDLIST; |
24 | 49 | break; |
25 | 45 | case 'p': |
26 | 45 | special->kind = PASSGEN_PATTERN_SPECIAL_PRESET; |
27 | 45 | break; |
28 | 0 | default: |
29 | 0 | passgen_assert(false); |
30 | 0 | break; |
31 | 135 | } |
32 | 135 | } |
33 | | |
34 | 135 | void passgen_pattern_special_free(passgen_pattern_special *special) { |
35 | 135 | free(special->parameters); |
36 | 135 | } |
37 | | |
38 | | void passgen_pattern_special_push( |
39 | | passgen_pattern_special *special, |
40 | 190 | int32_t codepoint) { |
41 | 190 | if(special->parameters_cap == 0) { |
42 | 10 | special->parameters_cap = PARAMETERS_INITIAL_SIZE; |
43 | 10 | special->parameters = malloc(special->parameters_cap); |
44 | 10 | } |
45 | 190 | |
46 | 190 | // always leave enough space for a full UTF8 character (4 bytes) plus a |
47 | 190 | // NULL. |
48 | 190 | if((special->parameters_len + 5) >= special->parameters_cap) { |
49 | 8 | special->parameters_cap *= PARAMETERS_MULTIPLIER; |
50 | 8 | special->parameters = |
51 | 8 | realloc(special->parameters, special->parameters_cap); |
52 | 8 | } |
53 | 190 | |
54 | 190 | int bytes = passgen_utf8_encode_codepoint( |
55 | 190 | (uint8_t *) &special->parameters[special->parameters_len], |
56 | 190 | codepoint); |
57 | 190 | |
58 | 190 | passgen_assert(bytes > 0); |
59 | 190 | special->parameters_len += bytes; |
60 | 190 | |
61 | 190 | assert(special->parameters_len < special->parameters_cap); |
62 | 190 | |
63 | 190 | // always NULL-terminate the string. |
64 | 190 | special->parameters[special->parameters_len] = 0; |
65 | 190 | } |