diff --git a/src/ccmeta.leg b/src/ccmeta.leg index 5c8bada..34ab3d1 100644 --- a/src/ccmeta.leg +++ b/src/ccmeta.leg @@ -3,7 +3,7 @@ # Copyright (c) 2016-2021 Ian Piumarta and other contributors (see AUTHORS) # All rights reserved (see LICENSE) # -# Last edited: 2023-03-22 16:55:04 by piumarta on zora-10.local +# Last edited: 2023-03-22 17:00:49 by piumarta on zora-10.local %{ /* compile: leg -o ccmeta.c ccmeta.leg @@ -1294,6 +1294,55 @@ typedef enum { language lang = C, printLang = C; +oop clone(oop obj) +{ + switch(getType(obj)) { + case Undefined: + case Integer: + case Float: + case Function: + case Symbol: + return obj; + case String: + return makeString(get(obj, String, value)); + case Map: { + struct Pair *elements= malloc(sizeof(struct Pair) * get(obj, Map, capacity)); + memcpy(elements, get(obj, Map, elements), sizeof(struct Pair) * get(obj, Map, capacity)); + oop map= malloc(sizeof(*obj)); + memcpy(map, obj, sizeof(*obj)); + set(map, Map, elements, elements); + return map; + } + } + return obj; +} + +oop treeCopy(oop obj) +{ + switch(getType(obj)) { + case Undefined: + case Integer: + case Float: + case Function: + case Symbol: + return obj; + case String: + return makeString(get(obj, String, value)); + case Map: { + struct Pair *elements= malloc(sizeof(struct Pair) * get(obj, Map, size)); + memcpy(elements, get(obj, Map, elements), sizeof(struct Pair) * get(obj, Map, size)); + oop map= malloc(sizeof(*obj)); + memcpy(map, obj, sizeof(*obj)); + for (int i = 0; i