diff options
| author | Federico Angelilli <code@fedang.net> | 2024-06-09 00:31:31 +0200 |
|---|---|---|
| committer | Federico Angelilli <code@fedang.net> | 2024-06-09 00:31:31 +0200 |
| commit | 236cdea323d34fe731c9bc5dfd30ef832b9fd39a (patch) | |
| tree | 486cb2b836df56a99d5863a76632963805bfffcb | |
| parent | 5cb78753fe952534996722e1659318143bcca6ed (diff) | |
Refactor any_sexp
| -rw-r--r-- | any_sexp.h | 30 | ||||
| -rw-r--r-- | test/sexp.c | 9 |
2 files changed, 31 insertions, 8 deletions
@@ -150,7 +150,7 @@ void any_sexp_writer_init(any_sexp_writer_t *writer, any_sexp_putchar_t putc, vo int any_sexp_write(any_sexp_writer_t *writer, any_sexp_t sexp); -int any_sexp_fprint(any_sexp_t sexp, FILE *file); +int any_sexp_fprint(FILE *file, any_sexp_t sexp); int any_sexp_print(any_sexp_t sexp); @@ -160,9 +160,9 @@ any_sexp_t any_sexp_error(void); any_sexp_t any_sexp_nil(void); -any_sexp_t any_sexp_symbol(char *symbol, size_t length); +any_sexp_t any_sexp_symbol(const char *symbol, size_t length); -any_sexp_t any_sexp_string(char *string, size_t length); +any_sexp_t any_sexp_string(const char *string, size_t length); any_sexp_t any_sexp_number(intptr_t value); @@ -176,6 +176,8 @@ any_sexp_t any_sexp_cdr(any_sexp_t sexp); any_sexp_t any_sexp_reverse(any_sexp_t sexp); +any_sexp_t any_sexp_append(any_sexp_t a, any_sexp_t b); + any_sexp_t any_sexp_copy(any_sexp_t sexp); any_sexp_t any_sexp_copy_list(any_sexp_t sexp); @@ -522,7 +524,7 @@ int any_sexp_write(any_sexp_writer_t *writer, any_sexp_t sexp) } } -int any_sexp_fprint(any_sexp_t sexp, FILE *file) +int any_sexp_fprint(FILE *file, any_sexp_t sexp) { any_sexp_writer_t writer; any_sexp_writer_init(&writer, (any_sexp_putchar_t)fputc, file); @@ -531,7 +533,7 @@ int any_sexp_fprint(any_sexp_t sexp, FILE *file) int any_sexp_print(any_sexp_t sexp) { - return any_sexp_fprint(sexp, stdout); + return any_sexp_fprint(stdout, sexp); } #endif @@ -560,7 +562,7 @@ any_sexp_t any_sexp_nil(void) #endif } -any_sexp_t any_sexp_symbol(char *symbol, size_t length) +any_sexp_t any_sexp_symbol(const char *symbol, size_t length) { if (symbol == NULL) return ANY_SEXP_ERROR; @@ -583,7 +585,7 @@ any_sexp_t any_sexp_symbol(char *symbol, size_t length) #endif } -any_sexp_t any_sexp_string(char *string, size_t length) +any_sexp_t any_sexp_string(const char *string, size_t length) { any_sexp_t sexp = any_sexp_symbol(string, length); @@ -685,6 +687,20 @@ any_sexp_t any_sexp_reverse(any_sexp_t sexp) return prev; } +any_sexp_t any_sexp_append(any_sexp_t a, any_sexp_t b) +{ + if (ANY_SEXP_IS_NIL(a)) + return b; + + if (!ANY_SEXP_IS_CONS(a)) + return ANY_SEXP_ERROR; + + any_sexp_t tail = any_sexp_append(any_sexp_cdr(a), b); + return ANY_SEXP_IS_ERROR(tail) + ? ANY_SEXP_ERROR + : any_sexp_cons(any_sexp_car(a), tail); +} + any_sexp_t any_sexp_copy(any_sexp_t sexp) { switch (ANY_SEXP_GET_TAG(sexp)) { diff --git a/test/sexp.c b/test/sexp.c index 3adf3ab..45e74a4 100644 --- a/test/sexp.c +++ b/test/sexp.c @@ -32,7 +32,14 @@ int main() any_sexp_t pair = any_sexp_cons(any_sexp_number(1), any_sexp_number(2)); any_sexp_print(pair); - any_sexp_free_list(pair); + putchar('\n'); + + any_sexp_t ap = any_sexp_append(any_sexp_cons(any_sexp_number(3), ANY_SEXP_NIL), + any_sexp_cons(pair, ANY_SEXP_NIL)); + + any_sexp_print(ap); + putchar('\n'); + any_sexp_free_list(ap); //printf("%zu\n", sizeof(any_sexp_t)); |
