81 lines
1.6 KiB
C
81 lines
1.6 KiB
C
#include <merror.h>
|
|
#include <stdlib.h>
|
|
|
|
#include "lex.h"
|
|
|
|
/* init a empty string buffer */
|
|
inline void string_init(struct string *string)
|
|
{
|
|
string->len = 0;
|
|
string->size = 0;
|
|
string->allocated = true;
|
|
string->str = NULL;
|
|
}
|
|
|
|
/* free a string buffer */
|
|
inline void string_free(struct string *string)
|
|
{
|
|
if (string->allocated && string->str)
|
|
free(string->str);
|
|
}
|
|
|
|
/* clone a string buffer */
|
|
inline int string_clone(struct string *dst, const struct string *const src)
|
|
{
|
|
dst->len = src->len;
|
|
dst->size = src->len;
|
|
dst->allocated = src->allocated;
|
|
|
|
/// bss strings do not need to be
|
|
/// malloced or copied
|
|
if (src->allocated == false) {
|
|
dst->str = src->str;
|
|
return M_SUCCESS;
|
|
}
|
|
|
|
dst->str = malloc(sizeof(char) * src->len);
|
|
if (dst->str == NULL) {
|
|
PERROR("cannot alloc");
|
|
return M_ERROR;
|
|
}
|
|
memcpy(dst->str, src->str, sizeof(char) * src->len);
|
|
return M_SUCCESS;
|
|
}
|
|
|
|
/* moves a string */
|
|
inline void string_move(struct string *dst, struct string *src)
|
|
{
|
|
dst->len = src->len;
|
|
dst->size = src->len;
|
|
dst->allocated = src->allocated;
|
|
dst->str = src->str;
|
|
|
|
// delete ptr in src
|
|
src->str = NULL;
|
|
}
|
|
|
|
/* pushes a char onto a string */
|
|
int string_push(struct string *string, char c)
|
|
{
|
|
if (string->len >= string->size) {
|
|
int len = string->size ? string->size * 2 : 8;
|
|
char *new = realloc(string->str, sizeof(char) + len);
|
|
if (new == NULL) {
|
|
PERROR("cannot realloc");
|
|
return M_ERROR;
|
|
}
|
|
string->size = len;
|
|
string->str = new;
|
|
}
|
|
string->str[string->len++] = c;
|
|
return M_SUCCESS;
|
|
}
|
|
|
|
void string_bss(struct string *string, char *src)
|
|
{
|
|
int len = strlen(src);
|
|
string->str = src;
|
|
string->len = len;
|
|
string->size = len;
|
|
string->allocated = false;
|
|
}
|