keithlisp/lisp_string.c

47 lines
1.3 KiB
C

#include "lisp_string.h"
lisp_string* lisp_string_create(char* str) {
int len = strlen(str);
lisp_string* lstr = dbg_malloc(len + sizeof(int));
*((int*) lstr) = len;
strcpy(lstr + sizeof(int), str);
return lstr;
}
lisp_string* lisp_string_create_raw(char* buf, int len) {
lisp_string* lstr = dbg_malloc(len + sizeof(int));
*((int*) lstr) = len;
memcpy(lstr + sizeof(int), buf, len);
return lstr;
}
lisp_string* lisp_string_alloc(int len) {
lisp_string* lstr = dbg_malloc(len + sizeof(int));
*((int*) lstr) = len;
return lstr;
}
lisp_string* lisp_string_copy(lisp_string* lstr) {
return lisp_string_create_raw(lisp_string_data(lstr), lisp_string_len(lstr));
}
int lisp_string_cmp(lisp_string* a_lstr, lisp_string* b_lstr) {
if (a_lstr == NULL || b_lstr == NULL)
return (a_lstr > b_lstr) - (a_lstr < b_lstr);
int len_a = lisp_string_len(a_lstr);
int len_b = lisp_string_len(b_lstr);
char* data_a = lisp_string_data(a_lstr);
char* data_b = lisp_string_data(b_lstr);
if (len_a > 0 && len_b > 0) {
int cmp = memcmp(data_a, data_b, len_a > len_b ? len_b : len_a);
if (cmp != 0)
return cmp;
}
return (len_a > len_b) - (len_a < len_b);
}
void lisp_string_print(lisp_string* lstr) {
char* buf = lisp_string_data(lstr);
int len = lisp_string_len(lstr);
while (len--)
putchar(*(buf++));
}