Exemplo n.º 1
0
Arquivo: map.c Projeto: oopos/windsoul
static struct node *
expand_search(struct map *m,struct key *key)
{	
	int i;
	int s=m->size;
	struct node *old=m->buffer;

	struct node *buffer=(struct node*)memoryAlloc(m->size*2*sizeof(struct node));
	if (buffer==0) {
		return 0;
	}

	m->size*=2;
	m->freenode=0;
	m->buffer=buffer;
	init_table(m);

	for (i=0;i<s;i++) {
		if (old[i].value!=0) {
			map_search(m,old[i].key)->value = old[i].value;
		}
	}

	memoryFree(old);

	return map_search(m,key);
}
Exemplo n.º 2
0
Arquivo: map.c Projeto: oopos/windsoul
void * 
mapSearch(struct map * m,struct map_op * op)
{
	switch (op->op) {
	case MAP_SEARCH: {
		struct node *n = map_find(m,KEY(op));
		if (n==NULL) {
			return NULL;
		} else {
			return n->value;
		}
	}
	case MAP_INSERT: {
		struct node *v = map_search(m, KEY(op));
		void * ret = v->value;
		v->value = op->value;
		return ret;
	}
	case MAP_REMOVE: {
		struct node *n = map_find(m,KEY(op));
		if (n==NULL) {
			return NULL;
		} else {
			void *ret = n->value;
			n->value = NULL;
			return ret;
		}
	}
	case MAP_TRAVERSE: {
		return _findnext((struct map *)m, op);
	}
	case MAP_SLOT: {
		struct node *v = map_search(m, KEY(op));
		return (void *) &(v->value);
	}
	default:
		return NULL;
	};
}
Exemplo n.º 3
0
static void
test(struct map *m) {
	int a[MAX * 2];
	int i;
	int s = 0;
	for (i=0;i<MAX*2;i++) {
		int inc = random() % 3 + 1;
		s += inc;
		a[i] = s;
	}
	for (i=0;i<MAX * 2;i++) {
		int x = random()%(MAX*2);
		int y = random()%(MAX*2);
		int temp = a[x];
		a[x] = a[y];
		a[y] = temp;
	}
	for (i=0;i<MAX;i++) {
		map_insert(m, a[i], i);
	}
	for (i=0;i<MAX;i++) {
		int id = map_search(m,a[i]);
		assert(id == i);
	}
	for (i=0;i<MAX/2;i++) {
		map_erase(m, a[i]);
	}
	for (i=0;i<MAX/2;i++) {
		map_insert(m,a[i+MAX],i);
	}
	for (i=0;i<MAX;i++) {
		int id = map_search(m,a[i+MAX/2]);
		if (i>=MAX/2) {
			assert(id == i - MAX/2);
		} else {
			assert(id == i + MAX/2);
		}
	}
}
Exemplo n.º 4
0
Arquivo: mread.c Projeto: hlouis/mread
int
mread_poll(struct mread_pool * self , int timeout) {
	self->skip = 0;
	if (self->active >= 0) {
		struct socket * s = &self->sockets[self->active];
		if (s->status == SOCKET_READ) {
			return self->active;
		}
	}
	if (self->closed > 0 ) {
		return _report_closed(self);
	}
	if (self->queue_head >= self->queue_len) {
		if (_read_queue(self, timeout) == -1) {
			self->active = -1;
			return -1;
		}
	}
	for (;;) {
		int fd = _read_one(self);
		if (fd == -1) {
			self->active = -1;
			return -1;
		}
		if (fd == self->listen_fd) {
			struct sockaddr_in remote_addr;
			socklen_t len = sizeof(struct sockaddr_in);
			int client_fd = accept(self->listen_fd , (struct sockaddr *)&remote_addr ,  &len);
			if (client_fd >= 0) {
				printf("MREAD connect %s:%u (fd=%d)\n",inet_ntoa(remote_addr.sin_addr),ntohs(remote_addr.sin_port), client_fd);
				_add_client(self, client_fd);
			}
		} else {
			int index = map_search(self->socket_hash , fd);
			if (index >= 0) {
				self->active = index;
				struct socket * s = &self->sockets[index];
				s->status = SOCKET_POLLIN;
				return index;
			}
		}
	}
}
Exemplo n.º 5
0
void map_search(int map[21][21], int x, int y, room_rnum room) {
  int exit;
  for(exit=0;exit < 12;exit++) {
    if(dirvals[exit].x == 2)
      continue;
    int tx = x + dirvals[exit].x;
    int ty = y + dirvals[exit].y;
    if(tx > 20 || tx < 0 || ty > 20 || ty < 0)
      continue;
    if(EXITN(room, exit)) {
      struct room_direction_data *nexit = EXITN(room,exit);      
      room_rnum nroom = nexit->to_room;
      if(map[tx][ty] == 100 && !EXIT_FLAGGED(nexit, EX_CLOSED)) {
	if(ROOM_FLAGGED(nroom, ROOM_NO_MAP)) {
	  map[tx][ty] = 75;
	} else {
          map[tx][ty] = SECT(nroom);
          map_search(map,tx,ty,nroom);
        }
      }
    }
  }
}