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