Пример #1
0
/*
 * Get the current value of a server option
 * in a text buffer.
 *
 * This is called when a client requests
 * to see the current server parameter list.
 */
int Parser_list_option(int *ind, char *buf)
{
    int i = *ind, option_count;
    option_desc *opts;

    opts = Get_option_descs(&option_count);

    if (i < 0 || i >= option_count)
	return -1;

    if (opts[i].defaultValue == NULL)
	return 0;

    if ((opts[i].flags & OPT_VISIBLE) == 0)
	return 0;

    switch (opts[i].type) {
    case valInt:
	sprintf(buf, "%s:%d", opts[i].name, *(int *)opts[i].variable);
	break;
    case valReal:
	sprintf(buf, "%s:%g", opts[i].name, *(double *)opts[i].variable);
	break;
    case valBool:
	sprintf(buf, "%s:%s", opts[i].name,
		*(bool *)opts[i].variable ? "yes" : "no");
	break;
    case valIPos:
	sprintf(buf, "%s:%d,%d", opts[i].name,
		((ipos_t *)opts[i].variable)->x,
		((ipos_t *)opts[i].variable)->y);
	break;
    case valString:
	sprintf(buf, "%s:%s", opts[i].name, *(char **)opts[i].variable);
	break;
    case valList:
	{
	    list_t list = *(list_t *)opts[i].variable;

	    sprintf(buf, "%s:", opts[i].name);
	    if (list) {
		list_iter_t iter;

		for (iter = List_begin(list);
		     iter != List_end(list);
		     LI_FORWARD(iter)) {
		    char *str = (char *)LI_DATA(iter);

		    if (iter != List_begin(list))
			strlcat(buf, ",", MSG_LEN);
		    if (strlcat(buf, str, MSG_LEN) >= MSG_LEN)
			break;
		}
	    }
	}
	break;
    default:
	return 0;
    }
    return 1;
}
Пример #2
0
void TestData_list_uint_test(TestData _test)
{
    uint i = 0;
    ///list _lst;
    List _lst = List_new(Vptr, malloc, free);
    List lst;
    Iterator iter;


    for (; i < _test->count; i++)
    {
        _test->data[i].uint32_var = i;
    }

    printf("push back begin test\n");

    lst = List_Init(_lst, Uint32, malloc, free);
    for (i = 0; i < _test->count; i++)
    {
        Iterator iter = List_push_back(lst, _test->data[i]);
        if (List_get_value(iter).uint32_var != _test->data[i].uint32_var)
        {
#if BIT_WIDTH == 64
            printf("data error! tmp %d data %d i %I64d count %I64d", List_get_value(iter).uint32_var, _test->data[i].uint32_var, i, _test->count);
            getchar();
            exit(0);
#else
            printf("data error! tmp %d data %d i %d count %d", List_get_value(iter).uint32_var, _test->data[i].uint32_var, i, _test->count);
            getchar();
            exit(0);
#endif
        }
    }
    i = 0;
    iter = List_begin(lst);
    while (iter)
    {
        var tmp = List_get_value(iter);
        if (tmp.uint32_var != _test->data[i].uint32_var)
        {
#if BIT_WIDTH == 64
            printf("data error! tmp %d data %d i %I64d count %I64d", tmp.uint32_var, _test->data[i].uint32_var, i, _test->count);
            getchar();
            exit(0);
#else
            printf("data error! tmp %d data %d i %d count %d", tmp.uint32_var, _test->data[i].uint32_var, i, _test->count);
            getchar();
            exit(0);
#endif
        }
        iter = List_next(iter);
        i++;
    }
    i = _test->count - 1;
    iter = List_end(lst);
    while (iter)
    {
        var tmp = List_get_value(iter);
        if (tmp.uint32_var != _test->data[i].uint32_var)
        {
#if BIT_WIDTH == 64
            printf("data error! tmp %d data %d i %I64d count %I64d", tmp.uint32_var, _test->data[i].uint32_var, i, _test->count);
            getchar();
            exit(0);
#else
            printf("data error! tmp %d data %d i %d count %d", tmp.uint32_var, _test->data[i].uint32_var, i, _test->count);
            getchar();
            exit(0);
#endif
        }
        iter = List_prev(iter);
        i--;
    }
    List_Dest(lst);
    printf("push back test end\n");
    ///
    printf("insert after test0 begin\n");
    lst = List_Init(lst, Uint32, malloc, free);
    iter = List_push_back(lst, _test->data[0]);
    for (i = 1; i < _test->count; i++)
    {
        iter = List_insert_after(lst, iter, _test->data[i]);
    }
    i = 0;
    iter = List_begin(lst);
    while (iter)
    {
        var tmp = List_get_value(iter);
        if (tmp.uint32_var != _test->data[i].uint32_var)
        {
#if BIT_WIDTH == 64
            printf("data error! tmp %d data %d i %I64d count %I64d", tmp.uint32_var, _test->data[i].uint32_var, i, _test->count);
            getchar();
            exit(0);
#else
            printf("data error! tmp %d data %d i %d count %d", tmp.uint32_var, _test->data[i].uint32_var, i, _test->count);
            getchar();
            exit(0);
#endif
        }
        iter = List_next(iter);
        i++;
    }
    List_Dest(lst);
    printf("insert after test0 end\n");
    ///
    printf("insert after test1 begin\n");
    lst = List_Init(lst, Uint32, malloc, free);
    iter = List_push_back(lst, _test->data[0]);
    List_push_back(lst, _test->data[_test->count - 1]);
    for (i = 1; i < _test->count - 1; i++)
    {
        iter = List_insert_after(lst, iter, _test->data[i]);
    }
    i = 0;
    iter = List_begin(lst);
    while (iter)
    {
        var tmp = List_get_value(iter);
        if (tmp.uint32_var != _test->data[i].uint32_var)
        {
#if BIT_WIDTH == 64
            printf("data error! tmp %d data %d i %I64d count %I64d", tmp.uint32_var, _test->data[i].uint32_var, i, _test->count);
            getchar();
            exit(0);
#else
            printf("data error! tmp %d data %d i %d count %d", tmp.uint32_var, _test->data[i].uint32_var, i, _test->count);
            getchar();
            exit(0);
#endif
        }
        iter = List_next(iter);
        i++;
    }
    List_Dest(lst);
    printf("insert after test1 end\n");
    ///
    printf("insert before test0 begin\n");
    lst = List_Init(lst, Uint32, malloc, free);
    iter = List_push_back(lst, _test->data[_test->count - 1]);
    for (i = _test->count - 2; i; i--)
    {
        iter = List_insert_before(lst, iter, _test->data[i]);
    }
    List_insert_before(lst, iter, _test->data[0]);
    i = 0;
    iter = List_begin(lst);
    while (iter)
    {
        var tmp = List_get_value(iter);
        if (tmp.uint32_var != _test->data[i].uint32_var)
        {
#if BIT_WIDTH == 64
            printf("data error! tmp %d data %d i %I64d count %I64d", tmp.uint32_var, _test->data[i].uint32_var, i, _test->count);
            getchar();
            exit(0);
#else
            printf("data error! tmp %d data %d i %d count %d", tmp.uint32_var, _test->data[i].uint32_var, i, _test->count);
            getchar();
            exit(0);
#endif
        }
        iter = List_next(iter);
        i++;
    }
    List_Dest(lst);
    printf("insert before test0 end\n");
    ///
    ///
    printf("insert before test1 begin\n");
    lst = List_Init(lst, Uint32, malloc, free);
    iter = List_push_back(lst, _test->data[0]);
    List_push_back(lst, _test->data[_test->count - 1]);
    iter = List_end(lst);
    for (i = _test->count - 2; i; i--)
    {
        iter = List_insert_before(lst, iter, _test->data[i]);
    }
    i = 0;
    iter = List_begin(lst);
    while (iter)
    {
        var tmp = List_get_value(iter);
        if (tmp.uint32_var != _test->data[i].uint32_var)
        {
#if BIT_WIDTH == 64
            printf("data error! tmp %d data %d i %I64d count %I64d", tmp.uint32_var, _test->data[i].uint32_var, i, _test->count);
            getchar();
            exit(0);
#else
            printf("data error! tmp %d data %d i %d count %d", tmp.uint32_var, _test->data[i].uint32_var, i, _test->count);
            getchar();
            exit(0);
#endif
        }
        iter = List_next(iter);
        i++;
    }
    List_Dest(lst);
    printf("insert before test1 end\n");
    ///

    printf("test succ\n");
}
Пример #3
0
static void AsteroidCollision(void)
{
    int j, radius, obj_count;
    object_t *ast;
    object_t *obj = NULL, **obj_list;
    list_t list;
    list_iter_t iter;
    double damage = 0.0;
    bool sound = false;

    list = Asteroid_get_list();
    if (!list)
	return;

    for (iter = List_begin(list); iter != List_end(list); LI_FORWARD(iter)) {
	ast = (object_t *)LI_DATA(iter);

	assert(ast->type == OBJ_ASTEROID);

	if (ast->life <= 0.0)
	    continue;

	assert(World_contains_clpos(ast->pos));

	if (NumObjs >= options.cellGetObjectsThreshold)
	    Cell_get_objects(ast->pos, ast->pl_radius / BLOCK_SZ + 1,
			     300, &obj_list, &obj_count);
	else {
	    obj_list = Obj;
	    obj_count = NumObjs;
	}

	for (j = 0; j < obj_count; j++) {
	    obj = obj_list[j];
	    assert(obj != NULL);

	    /* asteroids don't hit these objects */
	    if ((obj->type == OBJ_ITEM
		 || obj->type == OBJ_DEBRIS
		 || obj->type == OBJ_SPARK
		 || obj->type == OBJ_WRECKAGE)
		&& obj->id == NO_ID
		&& !BIT(obj->obj_status, FROMCANNON))
		continue;
	    /* don't collide while still overlapping  after breaking */
	    if (obj->type == OBJ_ASTEROID && ast->fuse > 0)
		continue;
	    /* don't collide with self */
	    if (obj == ast)
		continue;
	    /* don't collide with phased balls */
	    if (obj->type == OBJ_BALL
		&& obj->id != NO_ID
		&& Player_is_phasing(Player_by_id(obj->id)))
		continue;

	    radius = (ast->pl_radius + obj->pl_radius) * CLICK;
	    if (!in_range(OBJ_PTR(ast), obj, (double)radius))
		continue;

	    switch (obj->type) {
	    case OBJ_BALL:
		Obj_repel(ast, obj, radius);
		if (options.treasureCollisionDestroys)
		    obj->life = 0.0;
		damage = ED_BALL_HIT;
		sound = true;
		break;
	    case OBJ_ASTEROID:
		obj->life -= ASTEROID_FUEL_HIT(
		    collision_cost(ast->mass, VECTOR_LENGTH(ast->vel)),
		    WIRE_PTR(obj)->wire_size);
		damage = -collision_cost(obj->mass, VECTOR_LENGTH(obj->vel));
		Delta_mv_elastic(ast, obj);
		/* avoid doing collision twice */
		obj->fuse = timeStep;
		sound = true;
		break;
	    case OBJ_SPARK:
		obj->life = 0.0;
		Delta_mv(ast, obj);
		damage = 0.0;
		break;
	    case OBJ_DEBRIS:
	    case OBJ_WRECKAGE:
		obj->life = 0.0;
		damage = -collision_cost(obj->mass, VECTOR_LENGTH(obj->vel));
		Delta_mv(ast, obj);
		break;
	    case OBJ_MINE:
		if (!BIT(obj->obj_status, CONFUSED))
		    obj->life = 0.0;
		break;
	    case OBJ_SHOT:
	    case OBJ_CANNON_SHOT:
		obj->life = 0.0;
		Delta_mv(ast, obj);
		damage = ED_SHOT_HIT;
		sound = true;
		break;
	    case OBJ_SMART_SHOT:
	    case OBJ_TORPEDO:
	    case OBJ_HEAT_SHOT:
		obj->life = 0.0;
		Delta_mv(ast, obj);
		damage = Missile_hit_drain(MISSILE_PTR(obj));
		sound = true;
		break;
	    case OBJ_PULSE:
		obj->life = 0;
		damage = ED_LASER_HIT;
		sound = true;
		break;
	    default:
		Delta_mv(ast, obj);
		damage = 0.0;
		break;
	    }

	    if (ast->life > 0.0) {
		/* kps - this is some strange sort of hack - fix it*/
		/*if (ast->life <= ast->fuselife) {*/
		ast->life += ASTEROID_FUEL_HIT(damage,
					       WIRE_PTR(ast)->wire_size);
		/*}*/
		if (sound)
		    sound_play_sensors(ast->pos, ASTEROID_HIT_SOUND);
		if (ast->life < 0.0)
		    ast->life = 0.0;
		if (ast->life == 0.0) {
		    if ((obj->id != NO_ID
			 || (obj->type == OBJ_BALL
			     && BALL_PTR(obj)->ball_owner != NO_ID))) {
			int owner_id = ((obj->type == OBJ_BALL)
					? BALL_PTR(obj)->ball_owner
					: obj->id);
			player_t *pl = Player_by_id(owner_id);
			Handle_Scoring(SCORE_ASTEROID_KILL,pl,NULL,ast,NULL);
		    }

		    /* break; */
		}
	    }
	}
    }
}