summaryrefslogtreecommitdiffstats
path: root/lib.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2017-04-16 22:26:12 -0700
committerKaz Kylheku <kaz@kylheku.com>2017-04-16 22:26:12 -0700
commit307ddfe0bbb4ad7997cccbda5abb750b599b10be (patch)
tree824d8242bdac63f8234a596af1b71e2cb0bed9db /lib.c
parent8b50725da4d58aa77ba61c4270c5407438b2209d (diff)
downloadtxr-307ddfe0bbb4ad7997cccbda5abb750b599b10be.tar.gz
txr-307ddfe0bbb4ad7997cccbda5abb750b599b10be.tar.bz2
txr-307ddfe0bbb4ad7997cccbda5abb750b599b10be.zip
New buffer data type.
Work in progress. * gc.c (finalize): Add cast to switch expression so gcc flags when we are missing one of the enumerations. Handle new BUF enum to free dynamic buffers. (mark_obj): Mark len and size fields of buf, in case they aren't just nil or integers. * hash.c (hash_buf): New static function. (equal_hash): Route BUF type to hash_buf. * lib.c (buf_s): New symbol variable. (code2type): Handle BUF. (equal): Handle BUF using memcmp on the data. (obj_init): Intern buf symbol and initialize buf_s. * lib.h (type_t): New enum member BUF. (struct buf): New type. (union obj): New member b, of struct buf type. (buf_s): Declared.
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/lib.c b/lib.c
index d20dca2c..99e59351 100644
--- a/lib.c
+++ b/lib.c
@@ -85,7 +85,7 @@ val package_s, system_package_s, keyword_package_s, user_package_s;
val null_s, t, cons_s, str_s, chr_s, fixnum_s, sym_s, pkg_s, fun_s, vec_s;
val lit_s, stream_s, hash_s, hash_iter_s, lcons_s, lstr_s, cobj_s, cptr_s;
val atom_s, integer_s, number_s, sequence_s, string_s;
-val env_s, bignum_s, float_s, range_s, rcons_s;
+val env_s, bignum_s, float_s, range_s, rcons_s, buf_s;
val var_s, expr_s, regex_s, chset_s, set_s, cset_s, wild_s, oneplus_s;
val nongreedy_s;
val quote_s, qquote_s, unquote_s, splice_s;
@@ -172,6 +172,7 @@ static val code2type(int code)
case BGNUM: return bignum_s;
case FLNUM: return float_s;
case RNG: return range_s;
+ case BUF: return buf_s;
}
return nil;
}
@@ -2495,6 +2496,14 @@ val equal(val left, val right)
return nil;
}
break;
+ case BUF:
+ if (type(right) == BUF) {
+ cnum ll = c_num(left->b.len);
+ cnum rl = c_num(right->b.len);
+ if (ll == rl && memcmp(left->b.data, right->b.data, ll) == 0)
+ return t;
+ }
+ break;
case COBJ:
if (left->co.ops->equalsub) {
val lsub = left->co.ops->equalsub(left);
@@ -9647,6 +9656,7 @@ static void obj_init(void)
float_s = intern(lit("float"), user_package);
range_s = intern(lit("range"), user_package);
rcons_s = intern(lit("rcons"), user_package);
+ buf_s = intern(lit("buf"), user_package);
var_s = intern(lit("var"), system_package);
expr_s = intern(lit("expr"), system_package);
regex_s = intern(lit("regex"), user_package);