List *ListCopy(List *in, int deep) { ListItem *item, *outitem; List *out; out = ListInit(); item = in->first; while (item != NULL) { outitem = (ListItem *)lt_malloc_incontext(sizeof(ListItem), out->memory_context); outitem->prev = out->last; outitem->next = NULL; outitem->DataSize = item->DataSize; if (item->copyable != 0) { outitem->data = (void *)lt_malloc_incontext(outitem->DataSize, out->memory_context); memcpy(outitem->data, item->data, outitem->DataSize); } else { if ((deep!=0)&&(item->DataType == DATATYPE_LIST)) outitem->data = ListCopy((List *)item->data,1); else if ((deep!=0)&&(item->DataType == DATATYPE_DICT)) outitem->data = DictCopy((Dict *)item->data,1); else outitem->data = item->data ; } outitem->copyable = item->copyable; outitem->DataType = item->DataType; if (out->first == NULL) out->first = outitem; if (out->last != NULL) out->last->next = outitem; out->last = outitem; out->length++; item = item->next; } return out; }
Permanent* NewPermanent(MTGCard* source,MTGPlayer* own) { Permanent* p = (Permanent*) calloc(1,sizeof(Permanent)); p->name = source->name; p->subtypes = source->subtypes; p->abilities = ListCopy(source->abilities); if (source->subtypes.is_planeswalker) p->loyalty = source->loyalty; else if (source->subtypes.is_creature){ p->power = p->sourcePower = source->power; p->toughness = p->sourceToughness = source->toughness; p->has_summoning_sickness = true; } p->equipment = InitList(); p->source = source; p->owner = own; p->controller = own; return p; }
Dict *DictCopy(Dict *in, int deep) { int hash; DictItem *item, *outitem; Dict *out; out = DictInit(in->HashSize); if (out==NULL) return NULL; item = in->first; while (item != NULL) { outitem = (DictItem *)lt_malloc_incontext(sizeof(DictItem), out->memory_context); if (outitem==NULL) return NULL; outitem->prev = out->last; outitem->next = NULL; outitem->key = (char *)lt_malloc_incontext((strlen(item->key)+1)*sizeof(char), out->memory_context); if (outitem->key==NULL) return NULL; strcpy(outitem->key, item->key); outitem->DataSize = item->DataSize; if (item->copyable != 0) { outitem->data = (void *)lt_malloc_incontext(outitem->DataSize, out->memory_context); if (outitem->data==NULL) return NULL; memcpy(outitem->data, item->data, outitem->DataSize); outitem->MallocedByUs = 1; } else { if ((deep!=0)&&(item->DataType == DATATYPE_LIST)) outitem->data = ListCopy((List *)item->data,1); else if ((deep!=0)&&(item->DataType == DATATYPE_DICT)) outitem->data = DictCopy((Dict *)item->data,1); else outitem->data = item->data ; outitem->MallocedByUs = 0; } outitem->copyable = item->copyable; outitem->DataType = item->DataType; if (out->first == NULL) out->first = outitem; if (out->last != NULL) out->last->next = outitem; out->last = outitem; out->length++; hash = DictHash(item->key, in->HashSize); out->HashTable[hash] = outitem; item = item->next; } return out; }