#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++)); }