47 lines
1.3 KiB
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++));
|
||
|
}
|