summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--args.h12
-rw-r--r--eval.c5
-rw-r--r--lib.c40
-rw-r--r--lib.h1
4 files changed, 47 insertions, 11 deletions
diff --git a/args.h b/args.h
index c1455fd6..54c00bf2 100644
--- a/args.h
+++ b/args.h
@@ -130,6 +130,11 @@ INLINE int args_two_more(struct args *args, cnum index)
cdr(args->list);
}
+INLINE int args_more_nozap(struct args *args, cnum index, val list)
+{
+ return list || index < args->fill;
+}
+
void args_normalize_exact(struct args *args, cnum fill);
void args_normalize_least(struct args *args, cnum fill);
void args_normalize_fill(struct args *args, cnum minfill, cnum maxfill);
@@ -173,6 +178,13 @@ INLINE val args_get(struct args *args, cnum *arg_index)
return pop(&args->list);
}
+INLINE val args_get_nozap(struct args *args, cnum *arg_index, val *list)
+{
+ if (*arg_index < args->fill)
+ return args->arg[(*arg_index)++];
+ return pop(list);
+}
+
INLINE cnum args_count(struct args *args)
{
return args->fill + c_num(length_list(args->list));
diff --git a/eval.c b/eval.c
index 2c8490d7..e94b4c14 100644
--- a/eval.c
+++ b/eval.c
@@ -2870,11 +2870,6 @@ static val fmt_flex(val obj, val plist, struct args *args)
return do_format_field(fmt_tostring(obj), n, sep, range_ix, plist, nil);
}
-static val fmt_join(struct args *args)
-{
- return cat_str(args_get_list(args), lit(""));
-}
-
val subst_vars(val forms, val env, val filter)
{
list_collect_decl(out, iter);
diff --git a/lib.c b/lib.c
index 6180d87a..ef3d511c 100644
--- a/lib.c
+++ b/lib.c
@@ -4101,7 +4101,7 @@ static void cat_str_init(struct cat_str *cs, val sep, wchar_t *onech)
}
}
-static void cat_str_measure(struct cat_str *cs, val item, val more_p)
+static void cat_str_measure(struct cat_str *cs, val item, int more_p)
{
if (!item)
return;
@@ -4143,7 +4143,7 @@ static void cat_str_alloc(struct cat_str *cs)
cs->ptr = cs->str = chk_wmalloc(cs->total);
}
-static void cat_str_append(struct cat_str *cs, val item, val more_p)
+static void cat_str_append(struct cat_str *cs, val item, int more_p)
{
if (!item)
return;
@@ -4176,12 +4176,12 @@ val cat_str(val list, val sep)
cat_str_init(&cs, sep, onech);
for (iter = list; iter != nil; iter = cdr(iter))
- cat_str_measure(&cs, car(iter), cdr(iter));
+ cat_str_measure(&cs, car(iter), cdr(iter) != nil);
cat_str_alloc(&cs);
for (iter = list; iter != nil; iter = cdr(iter))
- cat_str_append(&cs, car(iter), cdr(iter));
+ cat_str_append(&cs, car(iter), cdr(iter) != nil);
return cat_str_get(&cs);
}
@@ -4197,7 +4197,7 @@ static val vscat(val sep, va_list vl1, va_list vl2)
for (item = va_arg(vl1, val); item != nao; item = next)
{
next = va_arg(vl1, val);
- cat_str_measure(&cs, item, tnil(next != nao));
+ cat_str_measure(&cs, item, next != nao);
}
cat_str_alloc(&cs);
@@ -4205,7 +4205,7 @@ static val vscat(val sep, va_list vl1, va_list vl2)
for (item = va_arg(vl2, val); item != nao; item = next)
{
next = va_arg(vl2, val);
- cat_str_append(&cs, item, tnil(next != nao));
+ cat_str_append(&cs, item, next != nao);
}
return cat_str_get(&cs);
@@ -4223,6 +4223,34 @@ val scat(val sep, ...)
return ret;
}
+val fmt_join(struct args *args)
+{
+ cnum index;
+ val iter;
+ int more;
+ struct cat_str cs;
+
+ cat_str_init(&cs, nil, 0);
+
+ for (index = 0, iter = args->list, more = args_more_nozap(args, index, iter);
+ more;)
+ {
+ val item = args_get_nozap(args, &index, &iter);
+ cat_str_measure(&cs, item, more = args_more_nozap(args, index, iter));
+ }
+
+ cat_str_alloc(&cs);
+
+ for (index = 0, iter = args->list, more = args_more_nozap(args, index, iter);
+ more;)
+ {
+ val item = args_get_nozap(args, &index, &iter);
+ cat_str_append(&cs, item, more = args_more_nozap(args, index, iter));
+ }
+
+ return cat_str_get(&cs);
+}
+
val split_str_keep(val str, val sep, val keep_sep)
{
keep_sep = default_null_arg(keep_sep);
diff --git a/lib.h b/lib.h
index 87a5f266..3daba32b 100644
--- a/lib.h
+++ b/lib.h
@@ -852,6 +852,7 @@ val replace_str(val str_in, val items, val from, val to);
val sub_str(val str_in, val from_num, val to_num);
val cat_str(val list, val sep);
val scat(val sep, ...);
+val fmt_join(struct args *args);
val split_str(val str, val sep);
val split_str_keep(val str, val sep, val keep_sep);
val spl(val sep, val arg1, val arg2);