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); }
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; }; }
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); } } }
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; } } } }
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); } } } } }