5 #include "portability.h"
6 #include "lib/stdlib.h"
7 #include "lib/string.h"
9 #include "../include/string.h"
13 string_t*
string = calloc(
sizeof *
string, 1);
18 string->data = calloc(1, 1);
24 void string_append_charptr(
string_t*
string,
const char* concatenable) {
25 if(!
string || !concatenable)
28 size_t len =
strlen(concatenable);
30 size_t alloc_len = len +
string->length;
32 char* memory = (
char*)realloc(
string->data, alloc_len + 1);
37 memory[alloc_len] = 0;
39 string->data = memory;
47 string->length = alloc_len;
51 if(!
string || !concatenable)
54 string_append_charptr(
string, concatenable->data);
57 void string_crop(
string_t*
string,
size_t start,
size_t end) {
58 if(!
string || start >= end || end >
string->length)
61 size_t new_length = end - start;
63 char* data = calloc(new_length + 1, 1);
75 string->length = new_length;
78 void string_append_char(
string_t*
string,
char ch) {
87 data[
string->length] = ch;
88 data[
string->length + 1] = 0;
95 string_t* string_from_charptr(
const char* chars) {
102 qemu_log(
"charptr to string: %s (%x)", chars, chars);
104 string->length =
strlen(chars);
105 string->data = calloc(
string->length + 1, 1);
113 string_t* string_from_sized_charptr(
const char* chars,
size_t length) {
114 string_t*
string = calloc(
sizeof *
string, 1);
119 string->data = malloc(length + 1);
120 string->length = length;
123 string->data[
string->length] = 0;
130 if(!
string || !delimiter)
138 char* curptr =
string->data;
139 size_t delim_len =
strlen(delimiter);
141 char* el = strstr(curptr, delimiter);
143 qemu_log(
"strstr(%s, %x): %x", curptr, delimiter, el);
148 string_append_charptr(str, curptr);
150 vector_push_back(vec, (
size_t)str);
156 el = strstr(curptr, delimiter);
157 size_t len = el - curptr;
162 string_t* substring = string_from_sized_charptr(curptr, len);
164 vector_push_back(vec, (
size_t)substring);
166 curptr = el + delim_len;
172 void string_split_free(
vector_t* vec) {
176 for(
size_t i = 0; i < vec->size; i++) {
177 string_destroy((
string_t*)vec->data[i]);
192 string_append(str2, str);
197 void string_reverse(
string_t *str) {
201 size_t len = str->length;
203 for(
size_t i = 0; i < len / 2; i++) {
204 char tmp = str->data[i];
205 str->data[i] = str->data[len - i - 1];
206 str->data[len - i - 1] = tmp;
210 string_t* string_from_integer(
int number) {
212 bool is_negative =
false;
218 string_append_char(str,
'0');
230 string_append_char(str, (
char)((number % 10) +
'0'));
235 string_append_char(str,
'-');
243 void string_destroy(
string_t *
string) {
size_t strlen(const char *str)
Возращает длину строки
void * memcpy(void *restrict destination, const void *restrict source, size_t n)
Копирование непересекающихся массивов используя SSE.
int strcpy(char *dest, const char *src)
Копирование строк
char * strcat(char *destination, const char *source)
Объединение строк