From f2c8dc167c0c2bc09c91fab9ab84e2012233a30c Mon Sep 17 00:00:00 2001 From: Sam Stevens Date: Sat, 21 Jun 2014 22:48:47 +0100 Subject: [PATCH] join can now operate on strings. added vstrcat, but never used. --- functions.c | 37 ++++++++++++++++++++++++++++++------- util.c | 29 ++++++++++++++++++++++++++++- util.h | 3 ++- 3 files changed, 60 insertions(+), 9 deletions(-) diff --git a/functions.c b/functions.c index 0601cd7..9df2dab 100644 --- a/functions.c +++ b/functions.c @@ -258,17 +258,40 @@ lval* builtin_eval(lenv* env, lval* val){ } lval* builtin_join(lenv* env, lval* val){ LASSERT_MIN_ARG_COUNT("join", val, val, 1); + + BOOL string = TRUE; + size_t totalStringLength = 0; for(int i = 0; i < val->cell_count; i++) { - LASSERT_TYPE("join", val, val->cell_list[i], LVAL_Q_EXPR); + if (val->cell_list[i]->type != LVAL_STR) { + string = FALSE; + break; + } else { + totalStringLength += strlen(val->cell_list[i]->data.str); + } } - lval* x = lval_pop(val,0); - - while(val->cell_count > 0) { - x = lval_join(x, lval_pop(val, 0)); + if (string) { + char* newStr = calloc(totalStringLength+1, sizeof(char)); + for(int i = 0; i < val->cell_count; i++) { + strcat(newStr, val->cell_list[i]->data.str); + } + + lval* newVal = lval_str(newStr); + lval_delete(val); + return newVal; + } else { //Not string, join lists + for(int i = 0; i < val->cell_count; i++) { + LASSERT_TYPE("join", val, val->cell_list[i], LVAL_Q_EXPR); + } + + lval* x = lval_pop(val,0); + + while(val->cell_count > 0) { + x = lval_join(x, lval_pop(val, 0)); + } + + return x; } - - return x; } lval* builtin_head(lenv* env, lval* val){ LASSERT_ARG_COUNT("head", val, val, 1); diff --git a/util.c b/util.c index 91b517e..80d2499 100644 --- a/util.c +++ b/util.c @@ -1,12 +1,39 @@ #include #include +#include #include "util.h" -char * strdup(char* s) { +char * strdup(const char* s) { if (s == NULL) return NULL; char *d = calloc(strlen (s) + 1, sizeof(char)); if (d == NULL) return NULL; strcpy (d,s); return d; } + +char* vstrcat(int n, ...) { + va_list va; + + char** strings = calloc(n, sizeof(char*)); + size_t stringLength = 0; + + va_start(va, n); + + for(int i = 0; i