lsquic_str.c revision 7d09751d
1/* Copyright (c) 2017 - 2020 LiteSpeed Technologies Inc. See LICENSE. */ 2/* 3 * lsquic_str.c 4 * 5 */ 6 7#include <stdlib.h> 8#include <string.h> 9 10#include "lsquic_str.h" 11 12 13lsquic_str_t * 14lsquic_str_new (const char *str, size_t sz) 15{ 16 lsquic_str_t *lstr; 17 char *copy; 18 19 if (str && sz) 20 { 21 copy = malloc(sz + 1); 22 if (!copy) 23 return NULL; 24 memcpy(copy, str, sz); 25 copy[sz] = '\0'; 26 } 27 else 28 copy = NULL; 29 30 lstr = malloc(sizeof(*lstr)); 31 if (!lstr) 32 { 33 free(copy); 34 return NULL; 35 } 36 lstr->str = copy; 37 lstr->len = sz; 38 39 return lstr; 40} 41 42 43void 44lsquic_str_setto (lsquic_str_t *lstr, const void *str, size_t len) 45{ 46 if (lsquic_str_len(lstr) > 0) 47 lsquic_str_d(lstr); 48 lsquic_str_append(lstr, str, len); 49} 50 51 52void 53lsquic_str_append (lsquic_str_t *lstr, const char *str, size_t len) 54{ 55 size_t newlen; 56 char *newstr; 57 58 newlen = lstr->len + len; 59 newstr = realloc(lstr->str, newlen + 1); 60 if (!newstr) 61 return; 62 63 memcpy(newstr + lstr->len, str, len); 64 newstr[newlen] = '\0'; 65 lstr->str = newstr; 66 lstr->len = newlen; 67} 68 69 70void 71lsquic_str_d (lsquic_str_t *lstr) 72{ 73 if (lstr) { 74 free(lstr->str); 75 lstr->str = NULL; 76 lstr->len = 0; 77 } 78} 79 80 81void 82lsquic_str_delete (lsquic_str_t *lstr) 83{ 84 lsquic_str_d(lstr); 85 free(lstr); 86} 87 88 89char * 90lsquic_str_prealloc (lsquic_str_t *lstr, size_t len) 91{ 92 char *str; 93 94 str = malloc(len + 1); 95 if (str) 96 lstr->str = str; 97 98 return str; 99} 100 101 102int 103lsquic_str_bcmp (const void *ap, const void *bp) 104{ 105 const lsquic_str_t *a = ap, *b = bp; 106 size_t min; 107 int rc; 108 109 min = a->len < b->len ? a->len : b->len; 110 rc = memcmp(a->str, b->str, min); 111 if (rc) 112 return rc; 113 else 114 return (a->len > b->len) - (b->len > a->len); 115} 116 117 118lsquic_str_t * 119lsquic_str_copy (lsquic_str_t *lstr_dst, const lsquic_str_t *lstr_src) 120{ 121 char *copy; 122 123 copy = malloc(lstr_src->len + 1); 124 if (!copy) 125 /* Keeping the original behavior: */ 126 return NULL; 127 128 memcpy(copy, lstr_src->str, lstr_src->len); 129 copy[lstr_src->len] = '\0'; 130 lstr_dst->str = copy; 131 lstr_dst->len = lstr_src->len; 132 return lstr_dst; 133} 134