Add String module
This commit is contained in:
parent
7107699bc5
commit
961b3297f5
63
src/String.c
Normal file
63
src/String.c
Normal file
@ -0,0 +1,63 @@
|
||||
#include "String.h"
|
||||
#include <string.h>
|
||||
|
||||
String * String_new(const char * s)
|
||||
{
|
||||
String * new_st = (String *)malloc(sizeof(String));
|
||||
size_t size = strlen(s);
|
||||
if (size != 0u)
|
||||
{
|
||||
char * smem = (char *)malloc(size);
|
||||
memcpy(smem, s, size);
|
||||
new_st->value = smem;
|
||||
}
|
||||
else
|
||||
{
|
||||
new_st->value = NULL;
|
||||
}
|
||||
new_st->size = size;
|
||||
return new_st;
|
||||
}
|
||||
|
||||
String * String_plus(const String * st, const char * s)
|
||||
{
|
||||
String * new_st = (String *)malloc(sizeof(String));
|
||||
size_t size1 = st->size;
|
||||
size_t size2 = strlen(s);
|
||||
size_t size = size1 + size2;
|
||||
char * smem = (char *)malloc(size);
|
||||
memcpy(smem, st->value, size1);
|
||||
memcpy(&smem[size1], s, size2);
|
||||
new_st->value = smem;
|
||||
new_st->size = size;
|
||||
return new_st;
|
||||
}
|
||||
|
||||
String * String_concat(String * st, const char * s)
|
||||
{
|
||||
size_t size2 = strlen(s);
|
||||
size_t size = st->size + size2;
|
||||
char * smem = NULL;
|
||||
if (size != 0u)
|
||||
{
|
||||
smem = (char *)malloc(size);
|
||||
memcpy(smem, st->value, st->size);
|
||||
memcpy(&smem[st->size], s, size2);
|
||||
}
|
||||
if (st->value != NULL)
|
||||
{
|
||||
free(st->value);
|
||||
}
|
||||
st->value = smem;
|
||||
st->size = size;
|
||||
return st;
|
||||
}
|
||||
|
||||
void String_free(String * st)
|
||||
{
|
||||
if (st->value != NULL)
|
||||
{
|
||||
free(st->value);
|
||||
}
|
||||
free(st);
|
||||
}
|
19
src/String.h
Normal file
19
src/String.h
Normal file
@ -0,0 +1,19 @@
|
||||
#ifndef STRING_H
|
||||
#define STRING_H
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char * value;
|
||||
size_t size;
|
||||
} String;
|
||||
|
||||
String * String_new(const char * s);
|
||||
String * String_plus(const String * st, const char * s);
|
||||
String * String_concat(String * st, const char * s);
|
||||
static inline char * String_cstr(const String * st) { return st->value; }
|
||||
static inline size_t String_size(const String * st) { return st->size; }
|
||||
void String_free(String * st);
|
||||
|
||||
#endif
|
Loading…
x
Reference in New Issue
Block a user