示例#1
0
void Interpreter_Clear(Interpreter *pinterpreter)
{
    int i, size;
    Instruction *pinstruction = NULL;
    ScriptVariant *pvariant = NULL;

    pp_context_destroy(&(pinterpreter->theContext));

    StackedSymbolTable_Clear(&(pinterpreter->theSymbolTable));
    Parser_Clear(&(pinterpreter->theParser));
    if(pinterpreter->theInstructionList.solidlist)
    {
        size = pinterpreter->theInstructionList.size;
        for(i = 0; i < size; i++)
        {
            Instruction_Clear(pinterpreter->theInstructionList.solidlist[i]);
            free((void *)pinterpreter->theInstructionList.solidlist[i]);
            pinterpreter->theInstructionList.solidlist[i] = NULL;
        }
    }
    else
    {
        FOREACH(
            pinterpreter->theInstructionList,
            pinstruction = (Instruction *)List_Retrieve(&(pinterpreter->theInstructionList));
            Instruction_Clear(pinstruction);
            free((void *)pinstruction);
            pinstruction = NULL;
        );
    }
示例#2
0
文件: models.c 项目: DCurrent/openbor
s_model *findmodel(char *modelname)
{
    s_model *temp = NULL;
    assert(modellist);
    makelowercp(modelname);
    if(List_FindByName(modellist, convertbuf))
    {
        temp = List_Retrieve(modellist);
    }
    return temp;
}
示例#3
0
void ob_termtrans()
{
    int i, size;
    if(NULL == transList)
    {
        return;
    }
    PFOREACH(
        transList,
        free(List_Retrieve(transList));
    );
示例#4
0
文件: models.c 项目: DCurrent/openbor
void deleteModel(char *modelname)
{
    s_model *temp;
    assert(modellist);
    assert(modelname);
    makelowercp(modelname);
    if(List_FindByName(modellist, convertbuf) && (temp = List_Retrieve(modellist)))
    {
        List_Remove(modellist);
        free(temp);
    }
}
示例#5
0
void SymbolTable_Clear(SymbolTable * stable) {
	Symbol *psymbol = NULL;
	int i, size;
	FOREACH(stable->SymbolList, psymbol = (Symbol *) List_Retrieve(&(stable->SymbolList)); if(psymbol) {
		ScriptVariant_Clear(&(psymbol->var)); free(psymbol);}
	) ;
示例#6
0
文件: Stack.c 项目: marstau/shinsango
void *Stack_Top(const Stack *stack)
{
    return List_Retrieve(stack);
}
示例#7
0
int main() {

	List list, list2;
	size_t dummy = 0x1234;
	int i = 0;

	Node *test;

	List_Init(&list);
	assert(list.last == NULL);
	assert(list.first == NULL);
	assert(list.size == 0);
	assert(list.index == 0);


	List_InsertAfter(&list, (void *) dummy, int2str(++i));
	assert(list.current == list.first);
	assert(list.current == list.last);
	assert(list.last != NULL);
	assert(list.first != NULL);
	assert(list.last->next == NULL);
	assert(list.first->prev == NULL);

	assert(list.size == i);
	assert(eq(list.current->name, "1"));

	List_InsertAfter(&list, (void *) dummy, int2str(++i));
	assert(list.current->prev == list.first);
	assert(list.current == list.last);
	assert(list.last->next == NULL);
	assert(list.first->prev == NULL);
	assert(list.size == i);
	assert(eq(list.current->name, "2"));

	List_InsertAfter(&list, (void *) dummy, int2str(++i));
	assert(list.current->prev->prev == list.first);
	assert(list.current == list.last);
	assert(list.last->next == NULL);
	assert(list.first->prev == NULL);
	assert(list.size == i);
	assert(eq(list.current->name, "3"));

	List_Remove(&list);
	assert(list.current->prev == list.first);
	assert(list.current == list.last);
	assert(list.last->next == NULL);
	assert(list.first->prev == NULL);
	assert(list.size == i - 1);
	assert(eq(list.current->name, "2"));

	List_InsertBefore(&list, (void *) dummy, int2str(++i));
	assert(list.current != list.last);
	assert(list.current->next == list.last);

	assert(list.last->next == NULL);
	assert(list.first->prev == NULL);
	assert(list.size == i - 1);
	assert(eq(list.current->name, "4"));
	assert(eq(list.last->name, "2"));

	List_GotoFirst(&list);
	List_InsertBefore(&list, (void *) dummy, int2str(++i));
	assert(list.current == list.first);
	assert(list.last->next == NULL);
	assert(list.first->prev == NULL);
	assert(list.size == i - 1);
	assert(eq(list.current->name, "5"));
	assert(eq(list.last->name, "2"));

	List_InsertAfter(&list, (void *) dummy, int2str(++i));
	assert(list.current == list.first->next);
	assert(list.current->prev == list.first);
	assert(list.current->next->prev == list.current);
	assert(list.last->next == NULL);
	assert(list.first->prev == NULL);
	assert(list.size == i - 1);
	assert(eq(list.current->name, "6"));
	assert(eq(list.last->name, "2"));

	List_GotoFirst(&list);
	assert(list.current == list.first);
	test = list.first->next;
	List_Remove(&list);
	assert(list.first == test);
	assert(list.current == list.first);
	assert(list.last->next == NULL);
	assert(list.first->prev == NULL);
	assert(list.size == i - 2);
	//assert(eq(list.current->name, "7"));
	assert(eq(list.last->name, "2"));

	List_GotoFirst(&list);
	assert(list.current == list.first);

	List_Copy(&list2, &list);
	assert(list2.size == list.size);
	assert(list2.current == list2.first);
	assert(eq(list2.last->name, "2"));

	List_GotoLast(&list);
	assert(list.current == list.last);

	List_Copy(&list2, &list);
	assert(list2.current == list2.last);
	assert(list2.size == list.size);
	assert(list2.index == list.index);
	assert(list2.index == 0);
	assert(eq(list2.last->name, "2"));
	assert(eq(list2.last->name, list.last->name));
	assert(eq(list2.first->name, list.first->name));
	assert(eq(list2.current->name, list.current->name));
	assert(eq(list2.current->prev->name, list.current->prev->name));
	assert(list2.current->next == list.current->next);
	assert(list.current->next == 0);
	List_GotoFirst(&list);
	assert(!eq(list2.current->name, list.current->name));
	List_GotoFirst(&list2);
	assert(eq(list2.current->name, list.current->name));
	assert(list.current == list.first);
	assert(list.current->prev == NULL);
	assert(list2.current->prev == NULL);


	List_InsertAfter(&list, (void *) 0xDEADBEEF, int2str(++i));
	assert(list.first->next->value == (void *) 0xDEADBEEF);
	assert(list.current = list.first->next);

	List_InsertAfter(&list, (void *) dummy, int2str(++i));

	List_InsertBefore(&list, (void *) dummy, int2str(++i));
	List_InsertBefore(&list, (void *) dummy, int2str(++i));
	List_InsertBefore(&list, (void *) dummy, int2str(++i));
	assert(list.size == i - 2);	// i = 11
	List_GotoFirst(&list);
	List_GotoNext(&list);
	List_GotoPrevious(&list);

	List_GotoLast(&list);

	test = list.last;
	assert(list.current == list.last);

	List_Remove(&list);
	assert(list.last != test);
	assert(list.current == list.last);

	List_Remove(&list);
	assert(list.current == list.last);

	List_Remove(&list);
	assert(list.current == list.last);

	List_Remove(&list);

	assert(list.current == list.last);
	assert(list.size == i - 6);

	List_GotoPrevious(&list);
	List_GotoPrevious(&list);
	List_GotoPrevious(&list);

	assert(List_Retrieve(&list) == (void *) 0xDEADBEEF);
	List_Remove(&list);
	assert(!List_Includes(&list, (void *) 0xDEADBEEF));
	assert(list.size == i - 7);

	List_GotoLast(&list);
	List_InsertAfter(&list, (void *) 0xDEADBEEF, int2str(++i));

#ifdef USE_INDEX
	List_CreateIndices(&list);
	assert(list.mindices);
	assert(List_GetIndex(&list) == list.size - 1);
	assert(List_GetNodeIndex(&list, list.first) == 0);
	assert(List_GetNodeIndex(&list, list.last->prev) == list.size - 2);
	assert(List_GetNodeIndex(&list, list.last->prev->prev) == list.size - 3);
	assert(list.mindices[ptrhash((void *) 0xDEADBEEF)]);
#endif
	assert(List_Includes(&list, (void *) 0xDEADBEEF));

	assert(list.current == list.last);
	assert(List_Retrieve(&list) == (void *) 0xDEADBEEF);

	List_Update(&list, (void *) 0xDEADC0DE);
	assert(list.current == list.last);
	assert(List_Retrieve(&list) == (void *) 0xDEADC0DE);
	assert(!List_Includes(&list, (void *) 0xDEADBEEF));
	assert(List_Includes(&list, (void *) 0xDEADC0DE));
#ifdef USE_INDEX
	assert(list.mindices);
	assert(list.mindices[ptrhash((void *) 0xDEADC0DE)]);
#endif
	List_Remove(&list);
	assert(!List_Includes(&list, (void *) 0xDEADC0DE));
#ifdef USE_INDEX
	assert(list.mindices);
	assert(ptrhash((void *) dummy) != ptrhash((void *) 0xDEADC0DE));
	assert(ptrhash((void *) dummy) != ptrhash((void *) 0xDEADBEEF));
	// disable temporary
	assert(list.mindices[ptrhash((void *) 0xDEADC0DE)]);
	assert(list.mindices[ptrhash((void *) 0xDEADC0DE)]->nodes[0] == NULL);
	assert(list.mindices[ptrhash((void *) 0xDEADC0DE)]->used == 0);
	// dead beef was updated, so used must be still 1
	assert(list.mindices[ptrhash((void *) 0xDEADBEEF)]);
	assert(list.mindices[ptrhash((void *) 0xDEADBEEF)]->nodes[0] == NULL);
	assert(list.mindices[ptrhash((void *) 0xDEADBEEF)]->used == 1);
#endif

	List_Clear(&list);
	assert(list.size == 0);
	List_Init(&list);
	i = 0;

	List_InsertBefore(&list, (void *) dummy, int2str(++i));
	List_InsertBefore(&list, (void *) dummy, int2str(++i));
	List_InsertBefore(&list, (void *) dummy, int2str(++i));
	assert(list.size == 3);
	List_Remove(&list);
	List_Remove(&list);
	List_Remove(&list);
	List_Remove(&list);
	List_GotoFirst(&list);

	List_Clear(&list);

	// testing the order of removal is equivalent to gotonext
	List_Init(&list);
	List_InsertAfter(&list, (void *) 1, NULL);
	List_InsertAfter(&list, (void *) 2, NULL);
	List_InsertAfter(&list, (void *) 3, NULL);
	List_InsertAfter(&list, (void *) 4, NULL);
	List_GotoFirst(&list);
	assert(list.current->value == (void *) 1);
	List_GotoNext(&list);
	assert(list.current->value == (void *) 2);
	List_GotoNext(&list);
	assert(list.current->value == (void *) 3);
	List_GotoNext(&list);
	assert(list.current->value == (void *) 4);
	assert(list.current == list.last);
	List_GotoFirst(&list);
	assert(list.current->value == (void *) 1);
	List_Remove(&list);
	assert(list.current->value == (void *) 2);
	List_Remove(&list);
	assert(list.current->value == (void *) 3);
	List_Remove(&list);
	assert(list.current->value == (void *) 4);
	assert(list.current == list.last);
	List_Remove(&list);
	assert(list.current == list.last);
	assert(list.current == list.first);
	assert(list.current == NULL);


	freemem();
	return 0;
}