local void init_players() { Player *p; Link *link; pd->Lock(); FOR_EACH_PLAYER(p) { PData *pdata = PPDATA(p, pdata_key); pdata->vars = HashAlloc(); } pd->Unlock(); }
local int cmd_players(int argc, char *argv[]) { players_hash = HashAlloc(); walk_db(players_get_names, FALSE); printf(" this database contains information about these players:\n"); printf(" %-18.18s %-17s\n", "player name", "records / bytes"); HashEnum(players_hash, players_print_names, NULL); HashFree(players_hash); return 0; }
local FlagTeam *CreateFlagTeam(Arena *a, int freq) { DEF_AD(a); FlagTeam *team = amalloc(sizeof(FlagTeam)); team->Arena = a; team->Freq = freq; team->DroppedFlags = 0; team->FlagSeconds = 0; team->Breakdown = HashAlloc(); MYGLOCK; LLAdd(ad->FlagTeams, team); MYGUNLOCK; return team; }
local int cmd_arenas(int argc, char *argv[]) { arenas_hash = HashAlloc(); walk_db(arenas_get_names, FALSE); printf(" this database contains information about these arenas:\n"); printf(" %-14.14s %-17s %-17s %-17s\n", "arena name", "player recs/bytes", " arena recs/bytes", " total recs/bytes"); HashEnum(arenas_hash, arenas_print_names, NULL); HashFree(arenas_hash); return 0; }
local void player_action(Player *p, int action, Arena *arena) { PData *pdata = PPDATA(p, pdata_key); if (action == PA_CONNECT) { FormulaVariable *var = amalloc(sizeof(FormulaVariable)); var->name = astrdup("me"); var->type = VAR_TYPE_PLAYER; var->p = p; pdata->vars = HashAlloc(); HashAdd(pdata->vars, var->name, var); } else if (action == PA_DISCONNECT) { HashEnum(pdata->vars, var_free_enum, NULL); HashFree(pdata->vars); } }
local int cmd_serials(int argc, char *argv[]) { serials_ag = argv[1]; if (!serials_ag) { puts("you must specify an arena name"); return 1; } serials_hash = HashAlloc(); walk_db(serials_get_names, FALSE); printf(" for arena %s, interval %s, these serials are defined:\n", serials_ag, get_interval_name(args.iv)); HashEnum(serials_hash, serials_print_nums, NULL); HashFree(serials_hash); return 0; }
int main(void) { int size = 0, h; char cmd, key[1024], value[1024], buf[1024]; Hash *hash; // ハッシュテーブルの生成 printf("ハッシュテーブルの大きさを入力して下さい: "); scanf("%d", &size); if (size < 1) return -1;// 入力数エラー hash = HashAlloc(size); if (hash == NULL) return -1; // メモリ確保失敗 puts("* ハッシュテーブルを操作するコマンドを入力して下さい."); puts("* データを格納:a"); puts("* キーを削除:x"); puts("* キーに対応するデータの取得:g"); puts("* ハッシュテーブルを表示:d"); puts("* ハッシュ値の表示:h"); puts("* ハッシュテーブルをクリア:c"); puts("* 終了:q"); do { printf(": "); scanf("%s", buf); cmd = buf[0]; switch (cmd) { case 'a': /* データを格納 */ printf("名前を入力して下さい:"); scanf("%s", key); printf("血液型を入力して下さい:"); scanf("%s", value); if (HashAdd(hash, key, value) == TRUE) { // hash, name, blood-type printf("%s=%sを格納しました.\n", key, value); } else { /* 衝突 */ printf("既に同じキーを持つデータが存在します.\n"); } break; case 'd': /* データを表示 */ HashDump(hash); break; case 'c': /* ハッシュテーブルをクリア */ HashClear(hash); break; case 'x': /* キーを削除 */ printf("誰を削除しますか?:"); scanf("%s", key); if(HashDelete(hash, key) == TRUE) { printf("%sを削除しました.\n", key); } else { printf("%sは登録されていません.\n", key); } break; case 'g': /* キーに対応するデータを取得 */ printf("名前を入力して下さい:"); scanf("%s", key); if (HashGet(hash, key, value) == TRUE) { printf("%sの血液型は%sです.\n", key, value); } else { printf("%sは登録されていません.\n", key); } break; case 'h': /* キーに対応するデータを取得 */ printf("名前を入力して下さい:"); scanf("%s", key); h = HashCode(hash, key); printf("%sのハッシュ値は%dです.", key, h); break; case 'q': /* 終了 */ puts("プログラムを終了します."); break; case '\n': /* 改行 */ case '\r': /* 復帰 */ break; default: /* 入力エラー */ puts("コマンドが正しくありません."); break; } } while (cmd != 'q'); HashDump(hash); // 解放前の出力 HashFree(hash); // メモリ解放 return 0; }