Check-in Lasker-2.2.3 tar ball from samba.org
authorH.G. Muller <h.g.muller@hccnet.nl>
Mon, 18 Jan 2010 12:16:33 +0000 (13:16 +0100)
committerH.G. Muller <h.g.muller@hccnet.nl>
Mon, 18 Jan 2010 12:16:33 +0000 (13:16 +0100)
755 files changed:
lasker-2.2.3/COPYING [new file with mode: 0644]
lasker-2.2.3/CVS/Entries [new file with mode: 0644]
lasker-2.2.3/CVS/Repository [new file with mode: 0644]
lasker-2.2.3/CVS/Root [new file with mode: 0644]
lasker-2.2.3/README [new file with mode: 0644]
lasker-2.2.3/bots/CVS/Entries [new file with mode: 0644]
lasker-2.2.3/bots/CVS/Repository [new file with mode: 0644]
lasker-2.2.3/bots/CVS/Root [new file with mode: 0644]
lasker-2.2.3/bots/mamer/CVS/Entries [new file with mode: 0644]
lasker-2.2.3/bots/mamer/CVS/Repository [new file with mode: 0644]
lasker-2.2.3/bots/mamer/CVS/Root [new file with mode: 0644]
lasker-2.2.3/bots/mamer/Command.cc [new file with mode: 0644]
lasker-2.2.3/bots/mamer/Command.hh [new file with mode: 0644]
lasker-2.2.3/bots/mamer/CommandEntry.cc [new file with mode: 0644]
lasker-2.2.3/bots/mamer/CommandEntry.hh [new file with mode: 0644]
lasker-2.2.3/bots/mamer/Game.cc [new file with mode: 0644]
lasker-2.2.3/bots/mamer/Game.hh [new file with mode: 0644]
lasker-2.2.3/bots/mamer/Makefile [new file with mode: 0644]
lasker-2.2.3/bots/mamer/Mamer.cc [new file with mode: 0644]
lasker-2.2.3/bots/mamer/Mamer.hh [new file with mode: 0644]
lasker-2.2.3/bots/mamer/Player.cc [new file with mode: 0644]
lasker-2.2.3/bots/mamer/Player.hh [new file with mode: 0644]
lasker-2.2.3/bots/mamer/Storage.cc [new file with mode: 0644]
lasker-2.2.3/bots/mamer/Storage.hh [new file with mode: 0644]
lasker-2.2.3/bots/mamer/Tourney.cc [new file with mode: 0644]
lasker-2.2.3/bots/mamer/Tourney.hh [new file with mode: 0644]
lasker-2.2.3/bots/mamer/TourneyParameters.cc [new file with mode: 0644]
lasker-2.2.3/bots/mamer/TourneyParameters.hh [new file with mode: 0644]
lasker-2.2.3/bots/mamer/TourneyPlayers.cc [new file with mode: 0644]
lasker-2.2.3/bots/mamer/TourneyPlayers.hh [new file with mode: 0644]
lasker-2.2.3/bots/mamer/User.cc [new file with mode: 0644]
lasker-2.2.3/bots/mamer/User.hh [new file with mode: 0644]
lasker-2.2.3/bots/mamer/bin/CVS/Entries [new file with mode: 0644]
lasker-2.2.3/bots/mamer/bin/CVS/Repository [new file with mode: 0644]
lasker-2.2.3/bots/mamer/bin/CVS/Root [new file with mode: 0644]
lasker-2.2.3/bots/mamer/bin/cleaner.pl [new file with mode: 0755]
lasker-2.2.3/bots/mamer/bin/hindex.pl [new file with mode: 0755]
lasker-2.2.3/bots/mamer/bin/rank.pl [new file with mode: 0755]
lasker-2.2.3/bots/mamer/command_list.h [new file with mode: 0644]
lasker-2.2.3/bots/mamer/config.h [new file with mode: 0644]
lasker-2.2.3/bots/mamer/data/CVS/Entries [new file with mode: 0644]
lasker-2.2.3/bots/mamer/data/CVS/Repository [new file with mode: 0644]
lasker-2.2.3/bots/mamer/data/CVS/Root [new file with mode: 0644]
lasker-2.2.3/bots/mamer/data/managers [new file with mode: 0644]
lasker-2.2.3/bots/mamer/help/CVS/Entries [new file with mode: 0644]
lasker-2.2.3/bots/mamer/help/CVS/Repository [new file with mode: 0644]
lasker-2.2.3/bots/mamer/help/CVS/Root [new file with mode: 0644]
lasker-2.2.3/bots/mamer/help/about [new file with mode: 0644]
lasker-2.2.3/bots/mamer/help/addchaos [new file with mode: 0644]
lasker-2.2.3/bots/mamer/help/addtotourney [new file with mode: 0644]
lasker-2.2.3/bots/mamer/help/announce [new file with mode: 0644]
lasker-2.2.3/bots/mamer/help/chaos [new file with mode: 0644]
lasker-2.2.3/bots/mamer/help/close [new file with mode: 0644]
lasker-2.2.3/bots/mamer/help/create [new file with mode: 0644]
lasker-2.2.3/bots/mamer/help/delete [new file with mode: 0644]
lasker-2.2.3/bots/mamer/help/finger [new file with mode: 0644]
lasker-2.2.3/bots/mamer/help/forfeit [new file with mode: 0644]
lasker-2.2.3/bots/mamer/help/help [new file with mode: 0644]
lasker-2.2.3/bots/mamer/help/index [new file with mode: 0644]
lasker-2.2.3/bots/mamer/help/join [new file with mode: 0644]
lasker-2.2.3/bots/mamer/help/keep [new file with mode: 0644]
lasker-2.2.3/bots/mamer/help/listmanagers [new file with mode: 0644]
lasker-2.2.3/bots/mamer/help/listplayers [new file with mode: 0644]
lasker-2.2.3/bots/mamer/help/listtourneys [new file with mode: 0644]
lasker-2.2.3/bots/mamer/help/listtourneyvars [new file with mode: 0644]
lasker-2.2.3/bots/mamer/help/loadedusers [new file with mode: 0644]
lasker-2.2.3/bots/mamer/help/manager_commands [new file with mode: 0644]
lasker-2.2.3/bots/mamer/help/manager_help [new file with mode: 0644]
lasker-2.2.3/bots/mamer/help/manager_level [new file with mode: 0644]
lasker-2.2.3/bots/mamer/help/messman [new file with mode: 0644]
lasker-2.2.3/bots/mamer/help/open [new file with mode: 0644]
lasker-2.2.3/bots/mamer/help/performance [new file with mode: 0644]
lasker-2.2.3/bots/mamer/help/rating [new file with mode: 0644]
lasker-2.2.3/bots/mamer/help/setcommandlevel [new file with mode: 0644]
lasker-2.2.3/bots/mamer/help/setmanagerlevel [new file with mode: 0644]
lasker-2.2.3/bots/mamer/help/setres [new file with mode: 0644]
lasker-2.2.3/bots/mamer/help/setstat [new file with mode: 0644]
lasker-2.2.3/bots/mamer/help/settourneyvar [new file with mode: 0644]
lasker-2.2.3/bots/mamer/help/showcommands [new file with mode: 0644]
lasker-2.2.3/bots/mamer/help/showhelpfile [new file with mode: 0644]
lasker-2.2.3/bots/mamer/help/shutdown [new file with mode: 0644]
lasker-2.2.3/bots/mamer/help/swiss [new file with mode: 0644]
lasker-2.2.3/bots/mamer/help/upset [new file with mode: 0644]
lasker-2.2.3/bots/mamer/help/user_commands [new file with mode: 0644]
lasker-2.2.3/bots/mamer/help/who [new file with mode: 0644]
lasker-2.2.3/bots/mamer/help/withdraw [new file with mode: 0644]
lasker-2.2.3/bots/mamer/link.cc [new file with mode: 0644]
lasker-2.2.3/bots/mamer/link.hh [new file with mode: 0644]
lasker-2.2.3/bots/mamer/linklist.hh [new file with mode: 0644]
lasker-2.2.3/bots/mamer/logs/CVS/Entries [new file with mode: 0644]
lasker-2.2.3/bots/mamer/logs/CVS/Repository [new file with mode: 0644]
lasker-2.2.3/bots/mamer/logs/CVS/Root [new file with mode: 0644]
lasker-2.2.3/bots/mamer/main.cc [new file with mode: 0644]
lasker-2.2.3/bots/mamer/mamer.config [new file with mode: 0644]
lasker-2.2.3/bots/mamer/template/CVS/Entries [new file with mode: 0644]
lasker-2.2.3/bots/mamer/template/CVS/Repository [new file with mode: 0644]
lasker-2.2.3/bots/mamer/template/CVS/Root [new file with mode: 0644]
lasker-2.2.3/bots/mamer/template/template.cc [new file with mode: 0644]
lasker-2.2.3/bots/mamer/template/template.hh [new file with mode: 0644]
lasker-2.2.3/bots/mamer/types.h [new file with mode: 0644]
lasker-2.2.3/data/CVS/Entries [new file with mode: 0644]
lasker-2.2.3/data/CVS/Repository [new file with mode: 0644]
lasker-2.2.3/data/CVS/Root [new file with mode: 0644]
lasker-2.2.3/data/admin/CVS/Entries [new file with mode: 0644]
lasker-2.2.3/data/admin/CVS/Repository [new file with mode: 0644]
lasker-2.2.3/data/admin/CVS/Root [new file with mode: 0644]
lasker-2.2.3/data/admin/accounts [new file with mode: 0644]
lasker-2.2.3/data/admin/acheckhelp [new file with mode: 0644]
lasker-2.2.3/data/admin/aconfig [new file with mode: 0644]
lasker-2.2.3/data/admin/addaccounts [new file with mode: 0644]
lasker-2.2.3/data/admin/addcomment [new file with mode: 0644]
lasker-2.2.3/data/admin/addplayer [new file with mode: 0644]
lasker-2.2.3/data/admin/adjud_info [new file with mode: 0644]
lasker-2.2.3/data/admin/adjudicate [new file with mode: 0644]
lasker-2.2.3/data/admin/admin [new file with mode: 0644]
lasker-2.2.3/data/admin/admin_hierarchy [new file with mode: 0644]
lasker-2.2.3/data/admin/adump [new file with mode: 0644]
lasker-2.2.3/data/admin/ahelp [new file with mode: 0644]
lasker-2.2.3/data/admin/amotd [new file with mode: 0755]
lasker-2.2.3/data/admin/anews [new file with mode: 0644]
lasker-2.2.3/data/admin/announce [new file with mode: 0644]
lasker-2.2.3/data/admin/annunreg [new file with mode: 0644]
lasker-2.2.3/data/admin/areload [new file with mode: 0644]
lasker-2.2.3/data/admin/asetadmin [new file with mode: 0644]
lasker-2.2.3/data/admin/asetblitz [new file with mode: 0644]
lasker-2.2.3/data/admin/asetbughouse [new file with mode: 0644]
lasker-2.2.3/data/admin/asetemail [new file with mode: 0644]
lasker-2.2.3/data/admin/asethandle [new file with mode: 0644]
lasker-2.2.3/data/admin/asetlight [new file with mode: 0644]
lasker-2.2.3/data/admin/asetmaxplayer [new file with mode: 0644]
lasker-2.2.3/data/admin/asetpasswd [new file with mode: 0644]
lasker-2.2.3/data/admin/asetrealname [new file with mode: 0644]
lasker-2.2.3/data/admin/asetstd [new file with mode: 0644]
lasker-2.2.3/data/admin/asetv [new file with mode: 0644]
lasker-2.2.3/data/admin/asetwild [new file with mode: 0644]
lasker-2.2.3/data/admin/ban [new file with mode: 0644]
lasker-2.2.3/data/admin/buglist [new file with mode: 0644]
lasker-2.2.3/data/admin/canewsd [new file with mode: 0644]
lasker-2.2.3/data/admin/canewse [new file with mode: 0644]
lasker-2.2.3/data/admin/canewsf [new file with mode: 0644]
lasker-2.2.3/data/admin/canewsi [new file with mode: 0644]
lasker-2.2.3/data/admin/canewsp [new file with mode: 0644]
lasker-2.2.3/data/admin/canewst [new file with mode: 0644]
lasker-2.2.3/data/admin/chkgame [new file with mode: 0644]
lasker-2.2.3/data/admin/chkip [new file with mode: 0644]
lasker-2.2.3/data/admin/chkpl [new file with mode: 0644]
lasker-2.2.3/data/admin/chksc [new file with mode: 0644]
lasker-2.2.3/data/admin/chkts [new file with mode: 0644]
lasker-2.2.3/data/admin/cmuzzle [new file with mode: 0644]
lasker-2.2.3/data/admin/cnewsd [new file with mode: 0644]
lasker-2.2.3/data/admin/cnewse [new file with mode: 0644]
lasker-2.2.3/data/admin/cnewsf [new file with mode: 0644]
lasker-2.2.3/data/admin/cnewsi [new file with mode: 0644]
lasker-2.2.3/data/admin/cnewsp [new file with mode: 0644]
lasker-2.2.3/data/admin/cnewst [new file with mode: 0644]
lasker-2.2.3/data/admin/createanews [new file with mode: 0644]
lasker-2.2.3/data/admin/filter [new file with mode: 0644]
lasker-2.2.3/data/admin/finger [new file with mode: 0644]
lasker-2.2.3/data/admin/ftell [new file with mode: 0644]
lasker-2.2.3/data/admin/hideinfo [new file with mode: 0644]
lasker-2.2.3/data/admin/lists [new file with mode: 0644]
lasker-2.2.3/data/admin/muzzle [new file with mode: 0644]
lasker-2.2.3/data/admin/nuke [new file with mode: 0644]
lasker-2.2.3/data/admin/pose [new file with mode: 0644]
lasker-2.2.3/data/admin/projects [new file with mode: 0644]
lasker-2.2.3/data/admin/quota [new file with mode: 0644]
lasker-2.2.3/data/admin/raisedead [new file with mode: 0644]
lasker-2.2.3/data/admin/register [new file with mode: 0644]
lasker-2.2.3/data/admin/remplayer [new file with mode: 0644]
lasker-2.2.3/data/admin/rerank [new file with mode: 0644]
lasker-2.2.3/data/admin/server_com [new file with mode: 0644]
lasker-2.2.3/data/admin/showcomment [new file with mode: 0644]
lasker-2.2.3/data/admin/shutdown [new file with mode: 0644]
lasker-2.2.3/data/admin/summon [new file with mode: 0644]
lasker-2.2.3/data/boards/CVS/Entries [new file with mode: 0644]
lasker-2.2.3/data/boards/CVS/Repository [new file with mode: 0644]
lasker-2.2.3/data/boards/CVS/Root [new file with mode: 0644]
lasker-2.2.3/data/boards/wild/CVS/Entries [new file with mode: 0644]
lasker-2.2.3/data/boards/wild/CVS/Repository [new file with mode: 0644]
lasker-2.2.3/data/boards/wild/CVS/Root [new file with mode: 0644]
lasker-2.2.3/data/book/CVS/Entries [new file with mode: 0644]
lasker-2.2.3/data/book/CVS/Repository [new file with mode: 0644]
lasker-2.2.3/data/book/CVS/Root [new file with mode: 0644]
lasker-2.2.3/data/book/changes.txt [new file with mode: 0644]
lasker-2.2.3/data/book/eco000.idx [new file with mode: 0644]
lasker-2.2.3/data/book/eco999.idx [new file with mode: 0755]
lasker-2.2.3/data/book/fen.doc [new file with mode: 0644]
lasker-2.2.3/data/book/long001.idx [new file with mode: 0644]
lasker-2.2.3/data/book/long999.idx [new file with mode: 0755]
lasker-2.2.3/data/book/nic000.idx [new file with mode: 0644]
lasker-2.2.3/data/book/nic999.idx [new file with mode: 0755]
lasker-2.2.3/data/book/opening.doc [new file with mode: 0644]
lasker-2.2.3/data/com_help/CVS/Entries [new file with mode: 0644]
lasker-2.2.3/data/com_help/CVS/Repository [new file with mode: 0644]
lasker-2.2.3/data/com_help/CVS/Root [new file with mode: 0644]
lasker-2.2.3/data/help/CVS/Entries [new file with mode: 0644]
lasker-2.2.3/data/help/CVS/Repository [new file with mode: 0644]
lasker-2.2.3/data/help/CVS/Root [new file with mode: 0644]
lasker-2.2.3/data/help/_help [new file with mode: 0755]
lasker-2.2.3/data/help/abort [new file with mode: 0755]
lasker-2.2.3/data/help/abuser [new file with mode: 0755]
lasker-2.2.3/data/help/accept [new file with mode: 0755]
lasker-2.2.3/data/help/addlist [new file with mode: 0755]
lasker-2.2.3/data/help/addresses [new file with mode: 0755]
lasker-2.2.3/data/help/adjourn [new file with mode: 0755]
lasker-2.2.3/data/help/adjournments [new file with mode: 0755]
lasker-2.2.3/data/help/adjud_info [new file with mode: 0755]
lasker-2.2.3/data/help/adjudication [new file with mode: 0755]
lasker-2.2.3/data/help/adm-info [new file with mode: 0755]
lasker-2.2.3/data/help/adm-new [new file with mode: 0755]
lasker-2.2.3/data/help/adm_info [new file with mode: 0755]
lasker-2.2.3/data/help/adm_new [new file with mode: 0755]
lasker-2.2.3/data/help/admins [new file with mode: 0755]
lasker-2.2.3/data/help/alias [new file with mode: 0755]
lasker-2.2.3/data/help/allobservers [new file with mode: 0755]
lasker-2.2.3/data/help/analysis [new file with mode: 0755]
lasker-2.2.3/data/help/assess [new file with mode: 0755]
lasker-2.2.3/data/help/backward [new file with mode: 0755]
lasker-2.2.3/data/help/bell [new file with mode: 0755]
lasker-2.2.3/data/help/best [new file with mode: 0755]
lasker-2.2.3/data/help/blitz [new file with mode: 0755]
lasker-2.2.3/data/help/bname [new file with mode: 0644]
lasker-2.2.3/data/help/boards [new file with mode: 0755]
lasker-2.2.3/data/help/bsetup [new file with mode: 0644]
lasker-2.2.3/data/help/busy [new file with mode: 0755]
lasker-2.2.3/data/help/censor [new file with mode: 0755]
lasker-2.2.3/data/help/chan_1 [new file with mode: 0755]
lasker-2.2.3/data/help/channel [new file with mode: 0755]
lasker-2.2.3/data/help/clearmessages [new file with mode: 0755]
lasker-2.2.3/data/help/clrsquare [new file with mode: 0644]
lasker-2.2.3/data/help/cls [new file with mode: 0755]
lasker-2.2.3/data/help/cls_info [new file with mode: 0755]
lasker-2.2.3/data/help/computers [new file with mode: 0755]
lasker-2.2.3/data/help/courtesyabort [new file with mode: 0755]
lasker-2.2.3/data/help/credit [new file with mode: 0755]
lasker-2.2.3/data/help/cshout [new file with mode: 0755]
lasker-2.2.3/data/help/date [new file with mode: 0755]
lasker-2.2.3/data/help/decline [new file with mode: 0755]
lasker-2.2.3/data/help/draw [new file with mode: 0755]
lasker-2.2.3/data/help/eco [new file with mode: 0755]
lasker-2.2.3/data/help/eggo [new file with mode: 0755]
lasker-2.2.3/data/help/etiquette [new file with mode: 0755]
lasker-2.2.3/data/help/examine [new file with mode: 0755]
lasker-2.2.3/data/help/fics-lingo [new file with mode: 0755]
lasker-2.2.3/data/help/fics_lingo [new file with mode: 0755]
lasker-2.2.3/data/help/ficsfaq [new file with mode: 0755]
lasker-2.2.3/data/help/finger [new file with mode: 0755]
lasker-2.2.3/data/help/fixes [new file with mode: 0755]
lasker-2.2.3/data/help/flag [new file with mode: 0755]
lasker-2.2.3/data/help/flip [new file with mode: 0755]
lasker-2.2.3/data/help/fmessage [new file with mode: 0755]
lasker-2.2.3/data/help/formula [new file with mode: 0755]
lasker-2.2.3/data/help/forward [new file with mode: 0755]
lasker-2.2.3/data/help/ftp-hints [new file with mode: 0755]
lasker-2.2.3/data/help/ftp_hints [new file with mode: 0755]
lasker-2.2.3/data/help/games [new file with mode: 0755]
lasker-2.2.3/data/help/getgi [new file with mode: 0755]
lasker-2.2.3/data/help/getpi [new file with mode: 0755]
lasker-2.2.3/data/help/glicko [new file with mode: 0755]
lasker-2.2.3/data/help/gm_game [new file with mode: 0755]
lasker-2.2.3/data/help/gnotify [new file with mode: 0644]
lasker-2.2.3/data/help/goboard [new file with mode: 0755]
lasker-2.2.3/data/help/gonum [new file with mode: 0755]
lasker-2.2.3/data/help/handle [new file with mode: 0755]
lasker-2.2.3/data/help/handles [new file with mode: 0755]
lasker-2.2.3/data/help/hbest [new file with mode: 0755]
lasker-2.2.3/data/help/help [new file with mode: 0755]
lasker-2.2.3/data/help/highlight [new file with mode: 0755]
lasker-2.2.3/data/help/history [new file with mode: 0755]
lasker-2.2.3/data/help/hrank [new file with mode: 0755]
lasker-2.2.3/data/help/inchannel [new file with mode: 0755]
lasker-2.2.3/data/help/index [new file with mode: 0755]
lasker-2.2.3/data/help/inetchesslib [new file with mode: 0755]
lasker-2.2.3/data/help/interfaces [new file with mode: 0755]
lasker-2.2.3/data/help/intro0 [new file with mode: 0755]
lasker-2.2.3/data/help/intro1 [new file with mode: 0755]
lasker-2.2.3/data/help/intro2 [new file with mode: 0755]
lasker-2.2.3/data/help/intro3 [new file with mode: 0755]
lasker-2.2.3/data/help/intro4 [new file with mode: 0755]
lasker-2.2.3/data/help/intro5 [new file with mode: 0755]
lasker-2.2.3/data/help/intro6 [new file with mode: 0755]
lasker-2.2.3/data/help/intro7 [new file with mode: 0755]
lasker-2.2.3/data/help/intro_basics [new file with mode: 0644]
lasker-2.2.3/data/help/intro_general [new file with mode: 0755]
lasker-2.2.3/data/help/intro_information [new file with mode: 0755]
lasker-2.2.3/data/help/intro_moving [new file with mode: 0755]
lasker-2.2.3/data/help/intro_playing [new file with mode: 0755]
lasker-2.2.3/data/help/intro_settings [new file with mode: 0755]
lasker-2.2.3/data/help/intro_special [new file with mode: 0755]
lasker-2.2.3/data/help/intro_talking [new file with mode: 0755]
lasker-2.2.3/data/help/intro_welcome [new file with mode: 0755]
lasker-2.2.3/data/help/iset [new file with mode: 0644]
lasker-2.2.3/data/help/it [new file with mode: 0755]
lasker-2.2.3/data/help/jkill [new file with mode: 0755]
lasker-2.2.3/data/help/journal [new file with mode: 0644]
lasker-2.2.3/data/help/jsave [new file with mode: 0644]
lasker-2.2.3/data/help/kibitz [new file with mode: 0755]
lasker-2.2.3/data/help/kiblevel [new file with mode: 0644]
lasker-2.2.3/data/help/lag [new file with mode: 0755]
lasker-2.2.3/data/help/lecture1 [new file with mode: 0755]
lasker-2.2.3/data/help/lightning [new file with mode: 0644]
lasker-2.2.3/data/help/limits [new file with mode: 0755]
lasker-2.2.3/data/help/lists [new file with mode: 0755]
lasker-2.2.3/data/help/llogons [new file with mode: 0755]
lasker-2.2.3/data/help/logons [new file with mode: 0755]
lasker-2.2.3/data/help/ltell [new file with mode: 0644]
lasker-2.2.3/data/help/mailmess [new file with mode: 0755]
lasker-2.2.3/data/help/mailmoves [new file with mode: 0755]
lasker-2.2.3/data/help/mailoldmoves [new file with mode: 0755]
lasker-2.2.3/data/help/mailstored [new file with mode: 0755]
lasker-2.2.3/data/help/match [new file with mode: 0755]
lasker-2.2.3/data/help/messages [new file with mode: 0755]
lasker-2.2.3/data/help/mexamine [new file with mode: 0755]
lasker-2.2.3/data/help/moretime [new file with mode: 0755]
lasker-2.2.3/data/help/motd.std [new file with mode: 0755]
lasker-2.2.3/data/help/motd_help [new file with mode: 0755]
lasker-2.2.3/data/help/moves [new file with mode: 0755]
lasker-2.2.3/data/help/newrating [new file with mode: 0755]
lasker-2.2.3/data/help/news [new file with mode: 0755]
lasker-2.2.3/data/help/next [new file with mode: 0755]
lasker-2.2.3/data/help/noplay [new file with mode: 0644]
lasker-2.2.3/data/help/notes [new file with mode: 0644]
lasker-2.2.3/data/help/notify [new file with mode: 0755]
lasker-2.2.3/data/help/observe [new file with mode: 0755]
lasker-2.2.3/data/help/oldmoves [new file with mode: 0755]
lasker-2.2.3/data/help/open [new file with mode: 0755]
lasker-2.2.3/data/help/partner [new file with mode: 0755]
lasker-2.2.3/data/help/password [new file with mode: 0755]
lasker-2.2.3/data/help/pause [new file with mode: 0755]
lasker-2.2.3/data/help/pending [new file with mode: 0755]
lasker-2.2.3/data/help/play [new file with mode: 0755]
lasker-2.2.3/data/help/prefresh [new file with mode: 0755]
lasker-2.2.3/data/help/private [new file with mode: 0755]
lasker-2.2.3/data/help/promote [new file with mode: 0755]
lasker-2.2.3/data/help/pstat [new file with mode: 0755]
lasker-2.2.3/data/help/ptell [new file with mode: 0755]
lasker-2.2.3/data/help/ptime [new file with mode: 0755]
lasker-2.2.3/data/help/qtell [new file with mode: 0755]
lasker-2.2.3/data/help/quit [new file with mode: 0755]
lasker-2.2.3/data/help/rank [new file with mode: 0755]
lasker-2.2.3/data/help/ratings [new file with mode: 0755]
lasker-2.2.3/data/help/refresh [new file with mode: 0755]
lasker-2.2.3/data/help/register [new file with mode: 0755]
lasker-2.2.3/data/help/register.dist [new file with mode: 0755]
lasker-2.2.3/data/help/register.email [new file with mode: 0755]
lasker-2.2.3/data/help/remote [new file with mode: 0644]
lasker-2.2.3/data/help/resign [new file with mode: 0755]
lasker-2.2.3/data/help/revert [new file with mode: 0755]
lasker-2.2.3/data/help/rmatch [new file with mode: 0644]
lasker-2.2.3/data/help/say [new file with mode: 0755]
lasker-2.2.3/data/help/seek [new file with mode: 0755]
lasker-2.2.3/data/help/servers [new file with mode: 0755]
lasker-2.2.3/data/help/set [new file with mode: 0755]
lasker-2.2.3/data/help/shout [new file with mode: 0755]
lasker-2.2.3/data/help/shout_abuse [new file with mode: 0755]
lasker-2.2.3/data/help/shout_quota [new file with mode: 0755]
lasker-2.2.3/data/help/showlist [new file with mode: 0755]
lasker-2.2.3/data/help/simabort [new file with mode: 0755]
lasker-2.2.3/data/help/simadjourn [new file with mode: 0755]
lasker-2.2.3/data/help/simallabort [new file with mode: 0755]
lasker-2.2.3/data/help/simalladjourn [new file with mode: 0755]
lasker-2.2.3/data/help/simgames [new file with mode: 0755]
lasker-2.2.3/data/help/simmatch [new file with mode: 0755]
lasker-2.2.3/data/help/simnext [new file with mode: 0755]
lasker-2.2.3/data/help/simopen [new file with mode: 0755]
lasker-2.2.3/data/help/simpass [new file with mode: 0755]
lasker-2.2.3/data/help/simprev [new file with mode: 0755]
lasker-2.2.3/data/help/simuls [new file with mode: 0755]
lasker-2.2.3/data/help/smoves [new file with mode: 0755]
lasker-2.2.3/data/help/soapbox [new file with mode: 0755]
lasker-2.2.3/data/help/sought [new file with mode: 0755]
lasker-2.2.3/data/help/sourcecode [new file with mode: 0755]
lasker-2.2.3/data/help/sposition [new file with mode: 0755]
lasker-2.2.3/data/help/standard [new file with mode: 0644]
lasker-2.2.3/data/help/statistics [new file with mode: 0755]
lasker-2.2.3/data/help/stored [new file with mode: 0755]
lasker-2.2.3/data/help/style [new file with mode: 0755]
lasker-2.2.3/data/help/sublist [new file with mode: 0755]
lasker-2.2.3/data/help/switch [new file with mode: 0755]
lasker-2.2.3/data/help/takeback [new file with mode: 0755]
lasker-2.2.3/data/help/teamgames [new file with mode: 0755]
lasker-2.2.3/data/help/tell [new file with mode: 0755]
lasker-2.2.3/data/help/time [new file with mode: 0755]
lasker-2.2.3/data/help/timeseal [new file with mode: 0755]
lasker-2.2.3/data/help/todo [new file with mode: 0755]
lasker-2.2.3/data/help/toggle [new file with mode: 0644]
lasker-2.2.3/data/help/tomove [new file with mode: 0755]
lasker-2.2.3/data/help/totals [new file with mode: 0755]
lasker-2.2.3/data/help/tournset [new file with mode: 0755]
lasker-2.2.3/data/help/unalias [new file with mode: 0755]
lasker-2.2.3/data/help/uncensor [new file with mode: 0755]
lasker-2.2.3/data/help/unexamine [new file with mode: 0755]
lasker-2.2.3/data/help/unnotify [new file with mode: 0755]
lasker-2.2.3/data/help/unobserve [new file with mode: 0755]
lasker-2.2.3/data/help/unpause [new file with mode: 0755]
lasker-2.2.3/data/help/unseek [new file with mode: 0755]
lasker-2.2.3/data/help/untimed [new file with mode: 0644]
lasker-2.2.3/data/help/uptime [new file with mode: 0755]
lasker-2.2.3/data/help/uscf_faq [new file with mode: 0755]
lasker-2.2.3/data/help/variables [new file with mode: 0755]
lasker-2.2.3/data/help/whenshut [new file with mode: 0755]
lasker-2.2.3/data/help/whisper [new file with mode: 0755]
lasker-2.2.3/data/help/who [new file with mode: 0755]
lasker-2.2.3/data/help/wild [new file with mode: 0755]
lasker-2.2.3/data/help/withdraw [new file with mode: 0755]
lasker-2.2.3/data/help/wname [new file with mode: 0644]
lasker-2.2.3/data/help/xtell [new file with mode: 0755]
lasker-2.2.3/data/help/znotify [new file with mode: 0755]
lasker-2.2.3/data/messages/CVS/Entries [new file with mode: 0644]
lasker-2.2.3/data/messages/CVS/Repository [new file with mode: 0644]
lasker-2.2.3/data/messages/CVS/Root [new file with mode: 0644]
lasker-2.2.3/data/messages/admotd [new file with mode: 0755]
lasker-2.2.3/data/messages/login [new file with mode: 0755]
lasker-2.2.3/data/messages/logout [new file with mode: 0755]
lasker-2.2.3/data/messages/logout.fancy [new file with mode: 0755]
lasker-2.2.3/data/messages/motd [new file with mode: 0755]
lasker-2.2.3/data/messages/unregistered [new file with mode: 0755]
lasker-2.2.3/data/messages/welcome [new file with mode: 0755]
lasker-2.2.3/data/stats/CVS/Entries [new file with mode: 0644]
lasker-2.2.3/data/stats/CVS/Repository [new file with mode: 0644]
lasker-2.2.3/data/stats/CVS/Root [new file with mode: 0644]
lasker-2.2.3/data/stats/newratings_data [new file with mode: 0755]
lasker-2.2.3/data/usage/CVS/Entries [new file with mode: 0644]
lasker-2.2.3/data/usage/CVS/Repository [new file with mode: 0644]
lasker-2.2.3/data/usage/CVS/Root [new file with mode: 0644]
lasker-2.2.3/data/usage/abort [new file with mode: 0755]
lasker-2.2.3/data/usage/accept [new file with mode: 0755]
lasker-2.2.3/data/usage/acheckhelp [new file with mode: 0644]
lasker-2.2.3/data/usage/aconfig [new file with mode: 0644]
lasker-2.2.3/data/usage/addcomment [new file with mode: 0755]
lasker-2.2.3/data/usage/addlist [new file with mode: 0755]
lasker-2.2.3/data/usage/addplayer [new file with mode: 0755]
lasker-2.2.3/data/usage/adjourn [new file with mode: 0755]
lasker-2.2.3/data/usage/adjudicate [new file with mode: 0755]
lasker-2.2.3/data/usage/admin [new file with mode: 0755]
lasker-2.2.3/data/usage/adump [new file with mode: 0644]
lasker-2.2.3/data/usage/ahelp [new file with mode: 0755]
lasker-2.2.3/data/usage/alias [new file with mode: 0755]
lasker-2.2.3/data/usage/allobservers [new file with mode: 0755]
lasker-2.2.3/data/usage/anews [new file with mode: 0755]
lasker-2.2.3/data/usage/announce [new file with mode: 0755]
lasker-2.2.3/data/usage/annunreg [new file with mode: 0755]
lasker-2.2.3/data/usage/areload [new file with mode: 0644]
lasker-2.2.3/data/usage/asetadmin [new file with mode: 0755]
lasker-2.2.3/data/usage/asetblitz [new file with mode: 0755]
lasker-2.2.3/data/usage/asetbughouse [new file with mode: 0755]
lasker-2.2.3/data/usage/asetclock [new file with mode: 0755]
lasker-2.2.3/data/usage/asetemail [new file with mode: 0755]
lasker-2.2.3/data/usage/asethandle [new file with mode: 0755]
lasker-2.2.3/data/usage/asetlight [new file with mode: 0755]
lasker-2.2.3/data/usage/asetmaxplayer [new file with mode: 0755]
lasker-2.2.3/data/usage/asetpasswd [new file with mode: 0755]
lasker-2.2.3/data/usage/asetrealname [new file with mode: 0755]
lasker-2.2.3/data/usage/asetstd [new file with mode: 0755]
lasker-2.2.3/data/usage/asetsuicide [new file with mode: 0755]
lasker-2.2.3/data/usage/asetv [new file with mode: 0755]
lasker-2.2.3/data/usage/asetwild [new file with mode: 0755]
lasker-2.2.3/data/usage/assess [new file with mode: 0755]
lasker-2.2.3/data/usage/backward [new file with mode: 0755]
lasker-2.2.3/data/usage/bell [new file with mode: 0755]
lasker-2.2.3/data/usage/best [new file with mode: 0755]
lasker-2.2.3/data/usage/bname [new file with mode: 0755]
lasker-2.2.3/data/usage/boards [new file with mode: 0755]
lasker-2.2.3/data/usage/bsetup [new file with mode: 0755]
lasker-2.2.3/data/usage/bugwho [new file with mode: 0755]
lasker-2.2.3/data/usage/canewsd [new file with mode: 0644]
lasker-2.2.3/data/usage/canewse [new file with mode: 0644]
lasker-2.2.3/data/usage/canewsf [new file with mode: 0755]
lasker-2.2.3/data/usage/canewsi [new file with mode: 0755]
lasker-2.2.3/data/usage/canewsp [new file with mode: 0644]
lasker-2.2.3/data/usage/canewst [new file with mode: 0644]
lasker-2.2.3/data/usage/cbest [new file with mode: 0755]
lasker-2.2.3/data/usage/chkgame [new file with mode: 0755]
lasker-2.2.3/data/usage/chkip [new file with mode: 0755]
lasker-2.2.3/data/usage/chkpl [new file with mode: 0755]
lasker-2.2.3/data/usage/chksc [new file with mode: 0755]
lasker-2.2.3/data/usage/chkts [new file with mode: 0755]
lasker-2.2.3/data/usage/clearmessages [new file with mode: 0755]
lasker-2.2.3/data/usage/clrsquare [new file with mode: 0755]
lasker-2.2.3/data/usage/cnewsd [new file with mode: 0644]
lasker-2.2.3/data/usage/cnewse [new file with mode: 0644]
lasker-2.2.3/data/usage/cnewsf [new file with mode: 0755]
lasker-2.2.3/data/usage/cnewsi [new file with mode: 0755]
lasker-2.2.3/data/usage/cnewsp [new file with mode: 0644]
lasker-2.2.3/data/usage/cnewst [new file with mode: 0644]
lasker-2.2.3/data/usage/copygame [new file with mode: 0755]
lasker-2.2.3/data/usage/crank [new file with mode: 0755]
lasker-2.2.3/data/usage/cshout [new file with mode: 0755]
lasker-2.2.3/data/usage/date [new file with mode: 0755]
lasker-2.2.3/data/usage/decline [new file with mode: 0755]
lasker-2.2.3/data/usage/draw [new file with mode: 0755]
lasker-2.2.3/data/usage/eco [new file with mode: 0755]
lasker-2.2.3/data/usage/examine [new file with mode: 0755]
lasker-2.2.3/data/usage/finger [new file with mode: 0755]
lasker-2.2.3/data/usage/flag [new file with mode: 0755]
lasker-2.2.3/data/usage/flip [new file with mode: 0755]
lasker-2.2.3/data/usage/fmessage [new file with mode: 0755]
lasker-2.2.3/data/usage/follow [new file with mode: 0755]
lasker-2.2.3/data/usage/forward [new file with mode: 0755]
lasker-2.2.3/data/usage/ftell [new file with mode: 0755]
lasker-2.2.3/data/usage/games [new file with mode: 0755]
lasker-2.2.3/data/usage/getgi [new file with mode: 0644]
lasker-2.2.3/data/usage/getpi [new file with mode: 0644]
lasker-2.2.3/data/usage/ginfo [new file with mode: 0755]
lasker-2.2.3/data/usage/goboard [new file with mode: 0755]
lasker-2.2.3/data/usage/handles [new file with mode: 0755]
lasker-2.2.3/data/usage/hbest [new file with mode: 0755]
lasker-2.2.3/data/usage/help [new file with mode: 0755]
lasker-2.2.3/data/usage/hideinfo [new file with mode: 0755]
lasker-2.2.3/data/usage/history [new file with mode: 0755]
lasker-2.2.3/data/usage/hrank [new file with mode: 0755]
lasker-2.2.3/data/usage/inchannel [new file with mode: 0755]
lasker-2.2.3/data/usage/info [new file with mode: 0755]
lasker-2.2.3/data/usage/iset [new file with mode: 0644]
lasker-2.2.3/data/usage/it [new file with mode: 0755]
lasker-2.2.3/data/usage/jkill [new file with mode: 0755]
lasker-2.2.3/data/usage/journal [new file with mode: 0755]
lasker-2.2.3/data/usage/jsave [new file with mode: 0755]
lasker-2.2.3/data/usage/kibitz [new file with mode: 0755]
lasker-2.2.3/data/usage/limits [new file with mode: 0755]
lasker-2.2.3/data/usage/llogons [new file with mode: 0755]
lasker-2.2.3/data/usage/logons [new file with mode: 0755]
lasker-2.2.3/data/usage/ltell [new file with mode: 0644]
lasker-2.2.3/data/usage/mailhelp [new file with mode: 0755]
lasker-2.2.3/data/usage/mailmess [new file with mode: 0755]
lasker-2.2.3/data/usage/mailmoves [new file with mode: 0755]
lasker-2.2.3/data/usage/mailoldmoves [new file with mode: 0755]
lasker-2.2.3/data/usage/mailstored [new file with mode: 0755]
lasker-2.2.3/data/usage/match [new file with mode: 0755]
lasker-2.2.3/data/usage/messages [new file with mode: 0755]
lasker-2.2.3/data/usage/mexamine [new file with mode: 0755]
lasker-2.2.3/data/usage/moretime [new file with mode: 0755]
lasker-2.2.3/data/usage/moves [new file with mode: 0755]
lasker-2.2.3/data/usage/news [new file with mode: 0755]
lasker-2.2.3/data/usage/next [new file with mode: 0755]
lasker-2.2.3/data/usage/nuke [new file with mode: 0755]
lasker-2.2.3/data/usage/observe [new file with mode: 0755]
lasker-2.2.3/data/usage/oldmoves [new file with mode: 0755]
lasker-2.2.3/data/usage/oldpstat [new file with mode: 0755]
lasker-2.2.3/data/usage/open [new file with mode: 0755]
lasker-2.2.3/data/usage/partner [new file with mode: 0755]
lasker-2.2.3/data/usage/password [new file with mode: 0755]
lasker-2.2.3/data/usage/pause [new file with mode: 0755]
lasker-2.2.3/data/usage/pending [new file with mode: 0755]
lasker-2.2.3/data/usage/pfollow [new file with mode: 0755]
lasker-2.2.3/data/usage/play [new file with mode: 0755]
lasker-2.2.3/data/usage/pobserve [new file with mode: 0755]
lasker-2.2.3/data/usage/pose [new file with mode: 0755]
lasker-2.2.3/data/usage/prefresh [new file with mode: 0755]
lasker-2.2.3/data/usage/primary [new file with mode: 0755]
lasker-2.2.3/data/usage/promote [new file with mode: 0755]
lasker-2.2.3/data/usage/pstat [new file with mode: 0644]
lasker-2.2.3/data/usage/ptell [new file with mode: 0755]
lasker-2.2.3/data/usage/ptime [new file with mode: 0755]
lasker-2.2.3/data/usage/qtell [new file with mode: 0644]
lasker-2.2.3/data/usage/quit [new file with mode: 0755]
lasker-2.2.3/data/usage/quota [new file with mode: 0755]
lasker-2.2.3/data/usage/raisedead [new file with mode: 0755]
lasker-2.2.3/data/usage/rank [new file with mode: 0755]
lasker-2.2.3/data/usage/refresh [new file with mode: 0755]
lasker-2.2.3/data/usage/rematch [new file with mode: 0755]
lasker-2.2.3/data/usage/remplayer [new file with mode: 0755]
lasker-2.2.3/data/usage/rerank [new file with mode: 0755]
lasker-2.2.3/data/usage/resign [new file with mode: 0755]
lasker-2.2.3/data/usage/resume [new file with mode: 0755]
lasker-2.2.3/data/usage/revert [new file with mode: 0755]
lasker-2.2.3/data/usage/rmatch [new file with mode: 0644]
lasker-2.2.3/data/usage/say [new file with mode: 0755]
lasker-2.2.3/data/usage/seek [new file with mode: 0755]
lasker-2.2.3/data/usage/set [new file with mode: 0755]
lasker-2.2.3/data/usage/shout [new file with mode: 0755]
lasker-2.2.3/data/usage/showcomment [new file with mode: 0755]
lasker-2.2.3/data/usage/showlist [new file with mode: 0755]
lasker-2.2.3/data/usage/shutdown [new file with mode: 0755]
lasker-2.2.3/data/usage/simabort [new file with mode: 0755]
lasker-2.2.3/data/usage/simadjourn [new file with mode: 0755]
lasker-2.2.3/data/usage/simallabort [new file with mode: 0755]
lasker-2.2.3/data/usage/simalladjourn [new file with mode: 0755]
lasker-2.2.3/data/usage/simgames [new file with mode: 0755]
lasker-2.2.3/data/usage/simmatch [new file with mode: 0755]
lasker-2.2.3/data/usage/simnext [new file with mode: 0755]
lasker-2.2.3/data/usage/simopen [new file with mode: 0755]
lasker-2.2.3/data/usage/simpass [new file with mode: 0755]
lasker-2.2.3/data/usage/simprev [new file with mode: 0755]
lasker-2.2.3/data/usage/smoves [new file with mode: 0755]
lasker-2.2.3/data/usage/smposition [new file with mode: 0755]
lasker-2.2.3/data/usage/sought [new file with mode: 0755]
lasker-2.2.3/data/usage/sposition [new file with mode: 0755]
lasker-2.2.3/data/usage/statistics [new file with mode: 0755]
lasker-2.2.3/data/usage/stored [new file with mode: 0755]
lasker-2.2.3/data/usage/style [new file with mode: 0755]
lasker-2.2.3/data/usage/sublist [new file with mode: 0755]
lasker-2.2.3/data/usage/summon [new file with mode: 0755]
lasker-2.2.3/data/usage/switch [new file with mode: 0755]
lasker-2.2.3/data/usage/takeback [new file with mode: 0755]
lasker-2.2.3/data/usage/tell [new file with mode: 0755]
lasker-2.2.3/data/usage/time [new file with mode: 0755]
lasker-2.2.3/data/usage/toggle [new file with mode: 0644]
lasker-2.2.3/data/usage/tomove [new file with mode: 0755]
lasker-2.2.3/data/usage/tournset [new file with mode: 0644]
lasker-2.2.3/data/usage/unalias [new file with mode: 0755]
lasker-2.2.3/data/usage/unexamine [new file with mode: 0755]
lasker-2.2.3/data/usage/unobserve [new file with mode: 0755]
lasker-2.2.3/data/usage/unpause [new file with mode: 0755]
lasker-2.2.3/data/usage/unseek [new file with mode: 0755]
lasker-2.2.3/data/usage/uptime [new file with mode: 0755]
lasker-2.2.3/data/usage/ustat [new file with mode: 0755]
lasker-2.2.3/data/usage/variables [new file with mode: 0755]
lasker-2.2.3/data/usage/whenshut [new file with mode: 0755]
lasker-2.2.3/data/usage/whisper [new file with mode: 0755]
lasker-2.2.3/data/usage/who [new file with mode: 0755]
lasker-2.2.3/data/usage/withdraw [new file with mode: 0755]
lasker-2.2.3/data/usage/wname [new file with mode: 0755]
lasker-2.2.3/data/usage/xkibitz [new file with mode: 0755]
lasker-2.2.3/data/usage/xtell [new file with mode: 0755]
lasker-2.2.3/data/usage/xwhisper [new file with mode: 0755]
lasker-2.2.3/data/usage/znotify [new file with mode: 0755]
lasker-2.2.3/doc/CREDITS [new file with mode: 0644]
lasker-2.2.3/doc/CVS/Entries [new file with mode: 0644]
lasker-2.2.3/doc/CVS/Repository [new file with mode: 0644]
lasker-2.2.3/doc/CVS/Root [new file with mode: 0644]
lasker-2.2.3/doc/Changelog [new file with mode: 0644]
lasker-2.2.3/doc/README_LEGAL [new file with mode: 0644]
lasker-2.2.3/doc/README_Nash [new file with mode: 0644]
lasker-2.2.3/games/CVS/Entries [new file with mode: 0644]
lasker-2.2.3/games/CVS/Repository [new file with mode: 0644]
lasker-2.2.3/games/CVS/Root [new file with mode: 0644]
lasker-2.2.3/games/history/CVS/Entries [new file with mode: 0644]
lasker-2.2.3/games/history/CVS/Repository [new file with mode: 0644]
lasker-2.2.3/games/history/CVS/Root [new file with mode: 0644]
lasker-2.2.3/scripts/CVS/Entries [new file with mode: 0644]
lasker-2.2.3/scripts/CVS/Repository [new file with mode: 0644]
lasker-2.2.3/scripts/CVS/Root [new file with mode: 0644]
lasker-2.2.3/scripts/spool_sendmail [new file with mode: 0755]
lasker-2.2.3/scripts/start_chessd [new file with mode: 0755]
lasker-2.2.3/src/.cvsignore [new file with mode: 0644]
lasker-2.2.3/src/CVS/Entries [new file with mode: 0644]
lasker-2.2.3/src/CVS/Repository [new file with mode: 0644]
lasker-2.2.3/src/CVS/Root [new file with mode: 0644]
lasker-2.2.3/src/Makefile.in [new file with mode: 0644]
lasker-2.2.3/src/acconfig.h [new file with mode: 0644]
lasker-2.2.3/src/adminproc.c [new file with mode: 0644]
lasker-2.2.3/src/algcheck.c [new file with mode: 0644]
lasker-2.2.3/src/autoconfig.h.in [new file with mode: 0644]
lasker-2.2.3/src/board.c [new file with mode: 0644]
lasker-2.2.3/src/board.h [new file with mode: 0644]
lasker-2.2.3/src/command.c [new file with mode: 0644]
lasker-2.2.3/src/command.h [new file with mode: 0644]
lasker-2.2.3/src/command_list.h [new file with mode: 0644]
lasker-2.2.3/src/common.h [new file with mode: 0644]
lasker-2.2.3/src/comproc.c [new file with mode: 0644]
lasker-2.2.3/src/comproc.h [new file with mode: 0644]
lasker-2.2.3/src/config.c [new file with mode: 0644]
lasker-2.2.3/src/config.h [new file with mode: 0644]
lasker-2.2.3/src/configure [new file with mode: 0755]
lasker-2.2.3/src/configure.in [new file with mode: 0644]
lasker-2.2.3/src/crypt-md5.c [new file with mode: 0644]
lasker-2.2.3/src/crypt-md5c.c [new file with mode: 0644]
lasker-2.2.3/src/crypt-misc.c [new file with mode: 0644]
lasker-2.2.3/src/crypt.c [new file with mode: 0644]
lasker-2.2.3/src/eco.c [new file with mode: 0644]
lasker-2.2.3/src/fics_addplayer.c [new file with mode: 0644]
lasker-2.2.3/src/ficsmain.c [new file with mode: 0644]
lasker-2.2.3/src/ficsmain.h [new file with mode: 0644]
lasker-2.2.3/src/findstatic.pl [new file with mode: 0755]
lasker-2.2.3/src/follow.c [new file with mode: 0644]
lasker-2.2.3/src/formula.c [new file with mode: 0644]
lasker-2.2.3/src/formula.h [new file with mode: 0644]
lasker-2.2.3/src/gamedb.c [new file with mode: 0644]
lasker-2.2.3/src/gamedb.h [new file with mode: 0644]
lasker-2.2.3/src/gamedb_old.c [new file with mode: 0644]
lasker-2.2.3/src/gameproc.c [new file with mode: 0644]
lasker-2.2.3/src/gameproc.h [new file with mode: 0644]
lasker-2.2.3/src/gics.c [new file with mode: 0644]
lasker-2.2.3/src/gics.h [new file with mode: 0644]
lasker-2.2.3/src/globals.h [new file with mode: 0644]
lasker-2.2.3/src/help.c [new file with mode: 0644]
lasker-2.2.3/src/includes.h [new file with mode: 0644]
lasker-2.2.3/src/install-sh [new file with mode: 0755]
lasker-2.2.3/src/iset.c [new file with mode: 0644]
lasker-2.2.3/src/iset.h [new file with mode: 0644]
lasker-2.2.3/src/journal.h [new file with mode: 0644]
lasker-2.2.3/src/lists.c [new file with mode: 0644]
lasker-2.2.3/src/lists.h [new file with mode: 0644]
lasker-2.2.3/src/makerank.c [new file with mode: 0644]
lasker-2.2.3/src/malloc.c [new file with mode: 0644]
lasker-2.2.3/src/malloc.h [new file with mode: 0644]
lasker-2.2.3/src/matchproc.c [new file with mode: 0644]
lasker-2.2.3/src/matchproc.h [new file with mode: 0644]
lasker-2.2.3/src/md5.h [new file with mode: 0644]
lasker-2.2.3/src/mkproto.awk [new file with mode: 0644]
lasker-2.2.3/src/movecheck.c [new file with mode: 0644]
lasker-2.2.3/src/movecheck.h [new file with mode: 0644]
lasker-2.2.3/src/multicol.c [new file with mode: 0644]
lasker-2.2.3/src/multicol.h [new file with mode: 0644]
lasker-2.2.3/src/network.c [new file with mode: 0644]
lasker-2.2.3/src/network.h [new file with mode: 0644]
lasker-2.2.3/src/news.c [new file with mode: 0644]
lasker-2.2.3/src/news.h [new file with mode: 0644]
lasker-2.2.3/src/newvers.sh [new file with mode: 0755]
lasker-2.2.3/src/obsproc.c [new file with mode: 0644]
lasker-2.2.3/src/obsproc.h [new file with mode: 0644]
lasker-2.2.3/src/parsers/.cvsignore [new file with mode: 0644]
lasker-2.2.3/src/parsers/CVS/Entries [new file with mode: 0644]
lasker-2.2.3/src/parsers/CVS/Repository [new file with mode: 0644]
lasker-2.2.3/src/parsers/CVS/Root [new file with mode: 0644]
lasker-2.2.3/src/parsers/README [new file with mode: 0644]
lasker-2.2.3/src/parsers/genparser.c [new file with mode: 0644]
lasker-2.2.3/src/parsers/genparser.h [new file with mode: 0644]
lasker-2.2.3/src/parsers/genstruct.pl [new file with mode: 0755]
lasker-2.2.3/src/parsers/parser.c [new file with mode: 0644]
lasker-2.2.3/src/pending.c [new file with mode: 0644]
lasker-2.2.3/src/pending.h [new file with mode: 0644]
lasker-2.2.3/src/playerdb.c [new file with mode: 0644]
lasker-2.2.3/src/playerdb.h [new file with mode: 0644]
lasker-2.2.3/src/playerdb_old.c [new file with mode: 0644]
lasker-2.2.3/src/ratings.c [new file with mode: 0644]
lasker-2.2.3/src/ratings.h [new file with mode: 0644]
lasker-2.2.3/src/reload.c [new file with mode: 0644]
lasker-2.2.3/src/seekproc.c [new file with mode: 0755]
lasker-2.2.3/src/setup.c [new file with mode: 0644]
lasker-2.2.3/src/shutdown.c [new file with mode: 0644]
lasker-2.2.3/src/talkproc.c [new file with mode: 0644]
lasker-2.2.3/src/talkproc.h [new file with mode: 0644]
lasker-2.2.3/src/tdb/CVS/Entries [new file with mode: 0644]
lasker-2.2.3/src/tdb/CVS/Repository [new file with mode: 0644]
lasker-2.2.3/src/tdb/CVS/Root [new file with mode: 0644]
lasker-2.2.3/src/tdb/spinlock.c [new file with mode: 0644]
lasker-2.2.3/src/tdb/spinlock.h [new file with mode: 0644]
lasker-2.2.3/src/tdb/tdb.c [new file with mode: 0644]
lasker-2.2.3/src/tdb/tdb.h [new file with mode: 0644]
lasker-2.2.3/src/timeseal.c [new file with mode: 0644]
lasker-2.2.3/src/utils.c [new file with mode: 0644]
lasker-2.2.3/src/utils.h [new file with mode: 0644]
lasker-2.2.3/src/variable.c [new file with mode: 0644]
lasker-2.2.3/src/variable.h [new file with mode: 0644]
lasker-2.2.3/src/vers.h [new file with mode: 0644]
lasker-2.2.3/testplay/CVS/Entries [new file with mode: 0644]
lasker-2.2.3/testplay/CVS/Repository [new file with mode: 0644]
lasker-2.2.3/testplay/CVS/Root [new file with mode: 0644]
lasker-2.2.3/testplay/play2.pl [new file with mode: 0755]
lasker-2.2.3/tests/CVS/Entries [new file with mode: 0644]
lasker-2.2.3/tests/CVS/Repository [new file with mode: 0644]
lasker-2.2.3/tests/CVS/Root [new file with mode: 0644]
lasker-2.2.3/tests/setup.exp [new file with mode: 0755]
lasker-2.2.3/tests/test1.exp [new file with mode: 0755]
lasker-2.2.3/timeseal/CVS/Entries [new file with mode: 0644]
lasker-2.2.3/timeseal/CVS/Repository [new file with mode: 0644]
lasker-2.2.3/timeseal/CVS/Root [new file with mode: 0644]
lasker-2.2.3/timeseal/README [new file with mode: 0644]
lasker-2.2.3/timeseal/timeseal_decoder-Linux-ELF-2.4 [new file with mode: 0755]
lasker-2.2.3/web/CVS/Entries [new file with mode: 0644]
lasker-2.2.3/web/CVS/Repository [new file with mode: 0644]
lasker-2.2.3/web/CVS/Root [new file with mode: 0644]
lasker-2.2.3/web/index.html [new file with mode: 0644]

diff --git a/lasker-2.2.3/COPYING b/lasker-2.2.3/COPYING
new file mode 100644 (file)
index 0000000..a43ea21
--- /dev/null
@@ -0,0 +1,339 @@
+                   GNU GENERAL PUBLIC LICENSE
+                      Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                          675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                           Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+\f
+                   GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+\f
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+\f
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+\f
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                           NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                    END OF TERMS AND CONDITIONS
+\f
+       Appendix: How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) 19yy  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) 19yy name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/lasker-2.2.3/CVS/Entries b/lasker-2.2.3/CVS/Entries
new file mode 100644 (file)
index 0000000..64fe199
--- /dev/null
@@ -0,0 +1,12 @@
+/COPYING/1.2/Wed Jun 12 01:03:49 2002//
+/README/1.3/Thu Jun 13 04:19:09 2002//
+D/data////
+D/doc////
+D/scripts////
+D/src////
+D/timeseal////
+D/web////
+D/tests////
+D/bots////
+D/games////
+D/testplay////
diff --git a/lasker-2.2.3/CVS/Repository b/lasker-2.2.3/CVS/Repository
new file mode 100644 (file)
index 0000000..ab59128
--- /dev/null
@@ -0,0 +1 @@
+lasker
diff --git a/lasker-2.2.3/CVS/Root b/lasker-2.2.3/CVS/Root
new file mode 100644 (file)
index 0000000..c42ba94
--- /dev/null
@@ -0,0 +1 @@
+/home/cvs
diff --git a/lasker-2.2.3/README b/lasker-2.2.3/README
new file mode 100644 (file)
index 0000000..7fad5ae
--- /dev/null
@@ -0,0 +1,168 @@
+Introduction
+------------
+
+This is an enhanced version of the 'lasker' internet chess server. I
+started to enhance Lasker when I needed a working chess server for a
+local school. You can get the original 'lasker' release from
+http://chessd.sourceforge.net/ and you can get my enhanced version
+from http://chess.samba.org/
+
+Here is a list of some of the new features in this version:
+
+     - lots and lots of bugs fixed
+     - timeseal support added (see timeseal/README for details)
+     - server configuration via 'aconfig' command instead of config.h
+     - added multi-part command parsing (commands separated by ';')
+     - enhanced aliases
+     - build/install process fixed
+     - fixed help system
+     - transparent server reload (upgrade without disturbing connections or games)
+
+
+Installation
+------------
+
+First you need to configure and compile the chessd server. Do
+something like the following:
+
+         cd src
+         ./configure --prefix=/usr/local
+         make
+
+Then to install the server run "make install". That will install a
+basic skeleton installation in /usr/local/chessd. 
+
+Setting up
+----------
+
+Next you will want to launch your chess server using the command:
+     bin/chessd -f -p 5000
+while in the chessd/ directory. This will launch the chess server
+using the skeleton data you installed above.
+
+I highly recommend creating a separate account on your machine to run
+the chess daemon. This user should own all files in the chessd
+directory.
+
+After you launch chessd for the first time you will need to login as
+the special user 'admin'. That username will be recognised as the
+server administrator and you will be logged in with the rather unusual
+combination of a head administrator who is also an unregistered
+player.
+
+The first thing you will want to do as the admin user is create a
+proper 'admin' account with a password. Use the command 'addplayer'
+while logged in as the admin user to create the admin account. You
+will be told the password. Then you should immediately logout and log
+back in using the admin password you have just been given. You will
+probably want to change this password using the 'asetpass' command. 
+
+You may also find the following commands useful:
+    ahelp addplayer
+    ahelp asetpass
+    ahelp commands
+
+
+Securing your server
+--------------------
+
+The source code for this chess server has been hacked on by dozens of
+people over the years. It almost certainly has exploitable buffer
+overruns or other security holes. If you are like me then you won't
+like the idea of running an insecure program like that on your server.
+
+To make it a lot more secure you can choose to run the chess server in
+a chroot jail. This makes it much harder for an attacker to gain a
+foothold on your server. It won't prevent them from crashing the
+chessd process but it will prevent them from gaining access to other
+parts of the system.
+
+To run chessd in a chroot jail you need to do the following:
+
+   1) chessd needs to be setuid root. I know this sounds bizarre, but
+      it needs root privileges to use the chroot() system
+      call. Immediately after the chroot chessd will permanently lose
+      its root privileges and instead become the user that launched
+      chessd. To make chessd setuid root do this as root:
+             chown root chessd
+             chmod u+s chessd
+
+   2) pass the command line option -R to tell chessd that it should
+      chroot to the current directory. So to launch chessd you can use
+      this:
+               chessd -p 5000 -T /usr/local/bin/timeseal_decoder -R /usr/local/chessd
+
+      You may also like to look at the start_chessd script in the
+      scripts directory. This is the script I use to keep chessd
+      always running on my machine.
+
+If you do use the -R option then I also recommend that you don't place
+any of the chess server binaries (or any other binaries or libraries)
+inside the chessd directory. That will increase the security of your
+server a little.
+
+
+Email spool
+-----------
+
+This chess server does not send emails directly, instead it puts
+outgoing emails in the spool/ directory and waits for some external
+program or script to deliver them. I designed it this way as it makes
+it possible to send email from a chess server in a chroot jail, and
+offers more flexibility in how email is handled (as that tends to vary
+a lot between systems).
+
+If you run sendmail then the sample script in scripts/spool_sendmail
+might be good enough. Just run this script at startup and it will send
+all spooled mail every minute.
+
+
+Server reload
+-------------
+
+This version of chessd supports reloading the server code without
+having to shutdown the server or disturb any games that are in
+progress. This allows for on the fly upgrades, hopefully without the
+users even noticing that the system is being upgraded.
+
+In order to support this functionality I had to make the source code
+rather more Linux specific than it was previously, but I think that is
+worth it for the functionality. It would be possible to port the code
+to many other platforms, but I have not yet done so.
+
+To reload the server use the command 'areload'. You must be at the
+ADMIN_GOD admin level to issue this command.
+
+Updates
+-------
+
+Updates will be available on http://chess.samba.org/
+
+You may wish to use the cvs version to enable you to update more
+easily. I will only be doing tar ball releases occasionally.
+
+License
+-------
+
+This chess server release is under the GNU General Public License,
+which is the license used by the original chess server written by
+Richard Nash. Various parts of the server are under different
+licenses, depending on who wrote what part, but I believe that all of
+the licenses are compatible with the GPL.
+
+The reason I chose the GPL for this release is that I don't want this
+code to become proprietary again. This has happened at least 3 times
+in the past with this source code and while I'm sure there were very
+good reasons at the time, it does mean that the freely available chess
+servers have not benefited from the considerable development that has
+happened over the past seven years. 
+
+I also chose the GPL because it allows me to incorporate source code
+from other GPLd projects. This saved me quite a lot of time, and is
+sure to be useful again.
+
+
+--------------------------------
+Andrew Tridgell
+tridge@chess.samba.org June 2002
+--------------------------------
diff --git a/lasker-2.2.3/bots/CVS/Entries b/lasker-2.2.3/bots/CVS/Entries
new file mode 100644 (file)
index 0000000..e8df309
--- /dev/null
@@ -0,0 +1 @@
+D/mamer////
diff --git a/lasker-2.2.3/bots/CVS/Repository b/lasker-2.2.3/bots/CVS/Repository
new file mode 100644 (file)
index 0000000..99f0fee
--- /dev/null
@@ -0,0 +1 @@
+lasker/bots
diff --git a/lasker-2.2.3/bots/CVS/Root b/lasker-2.2.3/bots/CVS/Root
new file mode 100644 (file)
index 0000000..c42ba94
--- /dev/null
@@ -0,0 +1 @@
+/home/cvs
diff --git a/lasker-2.2.3/bots/mamer/CVS/Entries b/lasker-2.2.3/bots/mamer/CVS/Entries
new file mode 100644 (file)
index 0000000..b3af5b5
--- /dev/null
@@ -0,0 +1,34 @@
+/Command.cc/1.9/Tue Jul  2 00:05:19 2002//
+/Command.hh/1.5/Thu Sep 10 19:58:31 1998//
+/CommandEntry.cc/1.15/Tue Jul  2 00:05:19 2002//
+/CommandEntry.hh/1.11/Thu Sep 10 19:58:31 1998//
+/Game.cc/1.4/Tue Jul  2 00:05:19 2002//
+/Game.hh/1.5/Tue Jul  2 00:05:19 2002//
+/Makefile/1.8/Fri Sep 11 15:47:50 1998//
+/Mamer.cc/1.19/Tue Jul  2 00:05:19 2002//
+/Mamer.hh/1.13/Tue Jul  2 00:05:19 2002//
+/Player.cc/1.4/Thu Sep 10 19:57:17 1998//
+/Player.hh/1.4/Tue Jul  2 00:02:40 2002//
+/Storage.cc/1.1/Thu Sep 10 19:57:17 1998//
+/Storage.hh/1.1/Thu Sep 10 19:58:41 1998//
+/Tourney.cc/1.12/Tue Jul  2 00:02:40 2002//
+/Tourney.hh/1.12/Tue Jul  2 00:02:40 2002//
+/TourneyParameters.cc/1.2/Thu Sep 10 19:57:17 1998//
+/TourneyParameters.hh/1.3/Thu Sep 10 19:58:41 1998//
+/TourneyPlayers.cc/1.7/Thu Sep 10 19:57:17 1998//
+/TourneyPlayers.hh/1.6/Thu Sep 10 19:58:41 1998//
+/User.cc/1.10/Thu Sep 10 19:57:17 1998//
+/User.hh/1.8/Thu Sep 10 19:58:41 1998//
+/command_list.h/1.2/Wed Oct  8 21:03:08 1997//
+/config.h/1.5/Thu Sep 10 19:58:20 1998//
+/link.cc/1.5/Thu Sep 10 19:57:17 1998//
+/link.hh/1.2/Wed Apr 15 16:56:34 1998//
+/linklist.hh/1.3/Thu Sep 10 19:58:41 1998//
+/main.cc/1.4/Thu Sep 10 19:57:17 1998//
+/mamer.config/1.1/Thu Sep 10 19:59:41 1998//
+/types.h/1.11/Thu Sep 10 19:58:20 1998//
+D/bin////
+D/data////
+D/help////
+D/logs////
+D/template////
diff --git a/lasker-2.2.3/bots/mamer/CVS/Repository b/lasker-2.2.3/bots/mamer/CVS/Repository
new file mode 100644 (file)
index 0000000..d93f63a
--- /dev/null
@@ -0,0 +1 @@
+lasker/bots/mamer
diff --git a/lasker-2.2.3/bots/mamer/CVS/Root b/lasker-2.2.3/bots/mamer/CVS/Root
new file mode 100644 (file)
index 0000000..c42ba94
--- /dev/null
@@ -0,0 +1 @@
+/home/cvs
diff --git a/lasker-2.2.3/bots/mamer/Command.cc b/lasker-2.2.3/bots/mamer/Command.cc
new file mode 100644 (file)
index 0000000..62f0b00
--- /dev/null
@@ -0,0 +1,156 @@
+//--------------------------------------------------------------------------
+// Command.cc - Source file for the Command class
+//
+// Matthew E. Moses
+//
+// $Revision: 1.9 $
+// $Date: 2002/07/02 00:05:19 $
+//
+// $Author: tridge $
+// $Locker:  $
+//
+// $Log: Command.cc,v $
+// Revision 1.9  2002/07/02 00:05:19  tridge
+// got rid of a bunch of RCS tags now that its in CVS
+//
+// Revision 1.8  1998/09/10 19:57:17  mlong
+// lots of little bug fixes and a few new features
+//
+// Revision 1.7  1998/04/15 16:56:17  mlong
+// *** empty log message ***
+//
+// Revision 1.6  1998/02/12 18:43:26  mlong
+// *** empty log message ***
+//
+// Revision 1.5  1997/05/15 18:27:53  chess
+// added pending and TourneyPlayers support
+// added HandleGetPlayerInfo & HandleGetGameInfo
+//
+// Revision 1.4  1997/04/13 03:14:35  chess
+// command class changed to have a parameter list.
+//
+// Revision 1.3  1997/04/07 22:21:49  chess
+// *** empty log message ***
+//
+// Revision 1.2  1996/10/03 18:11:10  moses
+// made sure string are null termindated
+//
+// Revision 1.1  1996/10/01  20:14:43  moses
+// Initial revision
+//
+//
+//--------------------------------------------------------------------------
+
+#include "Command.hh"
+
+//- constructor -----------------------------------------------------------
+Command::Command() {
+    name = alias = description = NULL;
+    managerLevel = USER;
+    userFunction = 0;
+    tournFunction = 0;
+} //- End of constructor
+
+Command::Command(char *n, char *a, ranks m, char *d, char *paramTypeList, USERFP u) {
+    name = new char[strlen(n)+1];
+
+    if(NULL == name) return;
+    memset(name, '\0', strlen(n));
+    strncpy(name, n, strlen(n));
+    name[strlen(n)] = '\0';
+
+    memset(parameterList, '\0', MAXNUMPARAMS);
+    strncpy(parameterList, paramTypeList, strlen(paramTypeList));
+    parameterList[strlen(paramTypeList)] = '\0';
+
+    alias = new char[strlen(a)+1];
+    if(NULL == alias) return;
+    memset(alias, '\0', strlen(a));
+    strncpy(alias, a, strlen(a));
+    alias[strlen(a)] = '\0';
+
+    managerLevel = m;
+
+    description = new char[strlen(d)+1];
+    if(NULL == description) return;
+    memset(description, '\0', strlen(d));
+    strncpy(description, d, strlen(d));
+    description[strlen(d)] = '\0';
+
+    userFunction = u;
+} //- End of constructor
+
+Command::Command(char *n, char *a, ranks m, char *d, char *paramTypeList, TOURNFP t) {
+    name = new char[strlen(n)+1];
+    if(NULL == name) return;
+    memset(name, '\0', strlen(n));
+    strncpy(name, n, strlen(n));
+    name[strlen(n)] = '\0';
+
+    memset(parameterList, '\0', MAXNUMPARAMS);
+    strncpy(parameterList, paramTypeList, strlen(paramTypeList));
+    parameterList[strlen(paramTypeList)] = '\0';
+
+    alias = new char[strlen(a)+1];
+    if(NULL == alias) return;
+    memset(alias, '\0', strlen(a));
+    strncpy(alias, a, strlen(a));
+    alias[strlen(a)] = '\0';
+
+    managerLevel = m;
+
+    description = new char[strlen(d)+1];
+    if(NULL == description) return;
+    memset(description, '\0', strlen(d));
+    strncpy(description, d, strlen(d));
+    description[strlen(d)] = '\0';
+
+    tournFunction = t;
+} //- End of constructor
+
+//- deconstructor ---------------------------------------------------------
+Command::~Command() {
+    if(NULL != name)
+       delete [] name;
+
+    if(NULL != alias)
+       delete [] alias;
+    
+    if(NULL != description)
+       delete [] description;
+} //- End of deconstructor
+
+//- IsCommand ------------------------------------------------------
+int Command::IsCommand(char *comm) {
+  int length = strlen(comm);
+  if((0 == strncasecmp(comm, name, MIN(length, (int)strlen(name)))) ||
+     (0 == strncasecmp(comm, alias, MIN(length, (int)strlen(alias)))))
+    return(1);
+  
+  return(0);
+} //- End of IsCommand
+
+//- GetCommandName ------------------------------------------------
+char *Command::GetCommandName() {
+  return name;
+} //- End of GetCommandName 
+
+//- GetCommandDescription ------------------------------------------------
+char *Command::GetCommandDescription() {
+  return description;
+} //- End of GetCommandDescription 
+
+//- GetCommandAlias ------------------------------------------------
+char *Command::GetCommandAlias() {
+  return alias;
+} //- End of GetCommandAlias 
+
+//- GetManagerLevel -----------------------------------------------
+ranks Command::GetManagerLevel() {
+  return managerLevel;
+} //- End of GetManagerLevel
+
+//- SetManagerLevel -----------------------------------------------
+void Command::SetManagerLevel(ranks newvalue) {
+  managerLevel = newvalue;
+} //- end of SetManagerLevel
diff --git a/lasker-2.2.3/bots/mamer/Command.hh b/lasker-2.2.3/bots/mamer/Command.hh
new file mode 100644 (file)
index 0000000..4312d93
--- /dev/null
@@ -0,0 +1,77 @@
+//--------------------------------------------------------------------------
+// Command.hh - Class header for the Command class
+//
+// Matthew E. Moses
+//
+// $Revision: 1.5 $
+// $Date: 1998/09/10 19:58:31 $
+//
+// $Author: mlong $
+// $Locker:  $
+//
+// $Log: Command.hh,v $
+// Revision 1.5  1998/09/10 19:58:31  mlong
+// *** empty log message ***
+//
+// Revision 1.4  1997/05/15 18:29:12  chess
+//  added pending and TourneyPlayers support
+// added HandleGetPlayerInfo & HandleGetGameInfo
+//
+// Revision 1.3  1997/04/13 03:21:32  chess
+// constructor changed to accomodate the params list
+//
+// Revision 1.2  1997/04/07 22:21:43  chess
+// *** empty log message ***
+//
+// Revision 1.1  1996/10/01 20:14:43  moses
+// Initial revision
+//
+//
+//--------------------------------------------------------------------------
+
+#ifndef _COMMAND_
+#define _COMMAND_
+
+extern "C" {
+    #include <stdlib.h>
+    #include <string.h>
+}
+
+#include "link.hh"
+#include "types.h"
+#include "User.hh"
+
+class Command : public Link {
+public:
+  Command();
+  Command(char *, char *, ranks, char *, char *, USERFP);
+  Command(char *, char *, ranks, char *, char *, TOURNFP);
+  ~Command();
+  
+  int IsCommand(char *);
+  ranks GetManagerLevel();
+  void SetManagerLevel(ranks);
+  char *GetCommandName();
+  char *GetCommandAlias();
+  char *GetCommandDescription();
+
+ private:
+    
+ public:
+    USERFP  userFunction;
+    TOURNFP tournFunction;
+
+  char parameterList[MAXNUMPARAMS];
+  param_list params;
+  reasons badUsage;
+
+ private:
+    char *name;
+    char *alias;
+    ranks managerLevel;
+    char *description;
+
+};
+
+#endif
diff --git a/lasker-2.2.3/bots/mamer/CommandEntry.cc b/lasker-2.2.3/bots/mamer/CommandEntry.cc
new file mode 100644 (file)
index 0000000..c9b25f0
--- /dev/null
@@ -0,0 +1,1148 @@
+//--------------------------------------------------------------------------
+// CommandEntry.cc - Source file for the CommandEntry
+//
+// Matthew E. Moses & Michael A. Long
+//
+// $Log: CommandEntry.cc,v $
+// Revision 1.15  2002/07/02 00:05:19  tridge
+// got rid of a bunch of RCS tags now that its in CVS
+//
+// Revision 1.14  2002/07/02 00:02:40  tridge
+// - fixed compile on g++ 2.96
+// - updated for lasker 'rmatch'
+//
+// Revision 1.13  1998/09/10 19:57:17  mlong
+// lots of little bug fixes and a few new features
+//
+// Revision 1.12  1998/06/18 18:41:30  mlong
+// prepairing for yet another move.
+//
+// Revision 1.11  1998/06/08 20:41:17  mlong
+// changes to the list tournies function
+//
+// Revision 1.10  1998/04/29 15:23:19  mlong
+// prepairing for the move to daimi
+// new sorting routine.
+//
+// Revision 1.9  1998/04/18 18:46:04  mlong
+// fixed delete bug &
+// added delete tourney function
+//
+// Revision 1.5  1997/10/08 21:03:35  chess
+// preparing for move to oracle machine at eworks.
+//
+// Revision 1.4  1997/05/15 18:27:53  chess
+// added Player and TourneyPlayers support
+// added HandleGetPlayerInfo & HandleGetGameInfo
+//
+// Revision 1.3  1997/04/13 03:14:35  chess
+// commands to do user statistic manipulationn added:
+// setinfo - sets a whole line of information
+// setstat - sets a particular stat
+// addabuse - adds (or deletes) abuse points.
+//
+// Revision 1.2  1997/03/21 15:32:36  moses
+// added the shutdown command.
+//
+// Revision 1.1  1996/10/01  20:14:43  moses
+// Initial revision
+//
+//--------------------------------------------------------------------------
+
+#include "CommandEntry.hh"
+#include "Mamer.hh"
+
+extern Mamer gMamer;
+
+//- AddAbuse -------------------------------------------------------
+int CommandEntry::AddAbuse(User *user, param_list params) {
+    User *u = NULL;
+    char name[MAX_WORD_SIZE];
+    int needToDelete=0;
+
+    if(params[0].type == TYPE_WORD) {
+      strcpy(name, params[0].val.word);
+    }
+    
+    u = gMamer.FindUser(name);
+    if(u == NULL) {
+      u = new User();
+      u->LoadPlayer(gMamer.userFilePath, name);  // Loads the player info into memory and saves current info to disk
+      needToDelete = 1;
+    }
+    
+    if((u->GetManagerLevel() >= user->GetManagerLevel()) &&
+       (user->GetManagerLevel() != PRESIDENT)) {
+      if(needToDelete) delete u;
+      gMamer.TellUser(NoPermissions, user->name);
+      return 0;
+    }
+
+    if(u != NULL) {
+      if(params[1].type == TYPE_INT) {
+       u->AddAbuse(params[1].val.integer);
+      } else {
+       u->AddAbuse(10);
+      }
+      u->SavePlayer(gMamer.userFilePath);
+      if(u->GetAbuse() >= MAX_CHAOS_POINTS)
+       gMamer.XServerCom("%s %s%s", "+ censor", u->name, "\n");
+      gMamer.TellUser(ChangedAbuse, user->name, u->name, u->GetAbuse());
+    } else {
+      gMamer.TellUser(NotFound, user->name, name);
+    }
+    if(needToDelete) delete u;
+
+    return(1);
+} //- End of AddAbuse
+
+//- FingerUser -------------------------------------------------------
+int CommandEntry::FingerUser(User *user, param_list params) {
+    User *u = NULL;
+    int notFound=1;
+    char name[32];
+
+    memset(name, '\0', 32);
+    if(params[0].type == TYPE_WORD) {
+      strncpy(name, params[0].val.word, MIN(31, (int)strlen(params[0].val.word)));
+    } else {
+      strcpy(name, user->name);
+    }
+    
+    u = gMamer.FindUser(name);
+    if(u != NULL) notFound = 0;
+    
+    if(notFound) { 
+      u = new User();
+      notFound = u->LoadPlayer(gMamer.userFilePath, name);
+      notFound = !notFound;
+    }
+    if(!notFound) {
+      gMamer.XServerCom("%s %s %s%s%s", "qtell", user->name, "\\n", u->name, "'s Stats:\\n\\n");
+      gMamer.XServerCom("%-17s %5s %4s %4s %3s %3s %3s %3s %5s %6s%-17s %4s %3s %3s %3s %3s %3s %3s %5s %6s",
+                       "Name", " Tnys", "  W ", "  L ", " D ", "1st", "2nd", "3rd", "Chaos", "Rating\\n",
+                       "-----------------", "-----", "----", "----", "---", "---", "---", "---", "-----","------\\n");
+      gMamer.XServerCom("%-17s %5ld %4ld %4ld %3ld %3ld %3ld %3ld %5d %6.2f %s",
+                       u->name, u->GetPlayedTourneys(), u->GetWins(), u->GetLosses(), u->GetDraws(),
+                       u->GetFirsts(), u->GetSeconds(), u->GetThirds(), u->GetAbuse(), u->GetRating(), "\\n");
+      if(u->GetManagerLevel() > USER) {
+       gMamer.XServerCom("%s %d %s %d %s", "\\nManager Level:", u->GetManagerLevel(), 
+                                           "    Managed Tourneys:", u->GetManagedTourneys(), "\\n");
+      }
+      gMamer.XServerCom("%s", "\n");
+    } else {
+      gMamer.TellUser(NotFound, user->name, name);
+    }
+    if(notFound) delete u;
+
+    return(1);
+} //- End of FingerUser
+
+//- ListRank ----------------------------------------------------------
+int CommandEntry::ListRank(User *user, param_list params) {
+  float rating=0;
+  int start=0, i=0, end=0, tourneys=0, counter=0;
+  char filename[128], name[32], name2[32];
+  FILE *theFile;
+
+  memset(name, '\0', 32);
+  memset(name2, '\0', 32);
+  switch (params[0].type) {
+  case TYPE_WORD:
+    strcpy(name, params[0].val.word);
+    break;
+  case TYPE_INT:
+    start = params[0].val.integer;
+    if(start <= 0) {start = 1;}
+    break;
+  default:
+    strcpy(name, user->name);
+    break;
+  }
+  
+  sprintf(filename, "%s/rank", gMamer.dataFilePath);
+  if(params[0].type != TYPE_INT) {
+    if((theFile = fopen(filename, "r"))) {
+      while(fscanf(theFile, "%s %d %f", name2, &tourneys, &rating) > 0) {
+       if(!(strncasecmp(name2, name, strlen(name)))) {
+         start = i+1;
+         break;
+       }
+       i++;
+      }
+      fclose(theFile);
+    } else {
+      gMamer.TellUser(NotFound, user->name, filename);
+      return(0);
+    }
+  }
+  if(!(start)) {
+    gMamer.TellUser(NotFound, user->name, name);
+    return(1);
+  }
+  start = start - 10;
+  end = start + 20;
+  if(start <= 0) {start = 1; end = 21;}
+  gMamer.XServerCom("%s %s %s %s%s %-5s %-18s %5s %6s %5s %-18s %5s %6s", "qtell", user->name, "\\n", gMamer.username, 
+                   "'s Rankings:\\n\\n", "Rank", "Name", "Trnys", "Rating\\n", 
+                   "-----", "------------------", "-----", "------\n");
+  gMamer.XServerCom("%s %s %s", "qtell", user->name, "\\n");
+  if(!(theFile = fopen(filename, "r"))) { return(0); }
+  i = 1; counter = 1;
+  while(fscanf(theFile, "%s %d %f", name2, &tourneys, &rating) > 0) {
+    if((i >= start) && (i < end)) {
+      if(i == start) { counter = 1; }
+      gMamer.XServerCom(" %-5d %-18s %5d %6.2f\\n", i, name2, tourneys, rating);
+      if(((counter % 10) == 0) && (counter > 0)) {
+       gMamer.XServerCom("%s", "\n");
+       if(i != (end -1)) {
+         gMamer.XServerCom("%s %s %s", "qtell", user->name, "\\n");
+       }
+      }
+    }
+    if(i > end) { break; }
+    i++; counter++;
+  }
+  fclose(theFile);
+  
+  if(i <= end) { gMamer.XServerCom("%s", "\n"); }
+
+  return(1);
+}
+
+//- ListManagers ------------------------------------------------------
+int CommandEntry::ListManagers(User *user, param_list params) {
+    int i=1, needToDelete=0;
+    long last;
+    char filename[256], manager[NAMELEN], date[16];
+    User *u=NULL, *newUser = NULL;
+    struct tm *tmpDate;
+    FILE *theFile;
+
+    i = params[0].type; // just to get rid of the compiler messages
+    sprintf(filename, "%s/managers", gMamer.dataFilePath);
+    if((theFile = fopen(filename, "r"))) {
+      gMamer.XServerCom("%s %s %s %s%s", "qtell", user->name, "\\n", gMamer.username, "'s Manager List:\\n\\n");
+      gMamer.XServerCom("%2s%-18s %3s %4s %-8s%2s%-18s %3s %4s %-8s%s",
+                       "","Name","Lvl","Tnys","Last", "","Name","Lvl","Tnys","Last", "\\n");
+      gMamer.XServerCom("  %-18s %3s %4s %-8s%2s%-18s %3s %4s %-8s%s",
+                       "-----------------", "---", "----", "--------", "",
+                       "-----------------", "---", "----", "--------", "", "\\n");
+      i=1;
+      memset(date, '\0', 64);
+      gMamer.XServerCom("\n%s %s ", "qtell", user->name);
+      while(fscanf(theFile, "%s", manager) > 0) {
+       needToDelete = 0;
+       u = gMamer.FindUser(manager);
+       if(u == NULL) {
+         needToDelete = 1;
+         newUser = new User();
+         u = newUser;
+       }
+       if(0 != u->LoadPlayer(gMamer.userFilePath, manager)) {
+         last = u->GetLast();
+         if(last) {
+           tmpDate = localtime(&last);   
+           sprintf(date, "%02d/%02d/%02d", tmpDate->tm_mon+1, tmpDate->tm_mday, tmpDate->tm_year);
+         } else {
+           sprintf(date, "none");
+         }
+       } else {
+         sprintf(date, "%s", "none");
+       }
+       gMamer.XServerCom("%2s%-18s %3d %4d %8s%s",
+                         ((gMamer.UserIsLoaded(manager)) ? "+" : " "),
+                         manager, u->GetManagerLevel(), u->GetManagedTourneys(), date, (i%2)==0 ? "\\n":"");
+       if(((i % 20) == 0) && (i > 0)) {
+         i = 0;
+         gMamer.XServerCom("%s %s %s %s", "\n", "qtell", user->name, "\\n");
+       }
+       i++;
+       if(needToDelete) {
+         u = NULL;
+         delete(newUser);        
+       }
+      }
+      fclose(theFile);
+      gMamer.XServerCom("%s", "\n");
+      
+      return(1);
+    }    
+    gMamer.TellUser(NotFound, user->name, filename);
+    return(0);
+}
+
+//- LoadedUsers -------------------------------------------------------
+int CommandEntry::LoadedUsers(User *user, param_list params) {
+  User *u = NULL;
+  LinkListIter<User> userIter(gMamer.userList);
+  int i, count=0;
+  
+  i = params[0].type;
+  i = 1;
+  
+  gMamer.XServerCom("qtell %s \\nLoaded Users:\\n\\n", user->name);
+  while((u = userIter.Next())) {
+    count++;
+    gMamer.XServerCom("  %18s%s", u->name, (i%3)==0 ? "\\n":"");
+    if(((i % 30) == 0) && (i > 0)) {
+      i = 0;
+      gMamer.XServerCom("%s %s %s %s", "\n", "qtell", user->name, "\\n");
+    }    
+    i++;
+  }
+  gMamer.XServerCom("%sTotal: %i%s", "\\n", count, "\n");
+  
+  return(1);
+} //- End of LoadedUser
+
+//- SetCommandLevel ----------------------------------------------------
+int CommandEntry::SetCommandLevel(User *user, param_list params) {
+  Command *c = NULL;
+
+  c = gMamer.FindCommand(params[0].val.word, user->name);
+
+  if(c != NULL) {
+    if((c->GetManagerLevel() <= user->GetManagerLevel()) && 
+       (params[1].val.integer <= user->GetManagerLevel())) {
+      c->SetManagerLevel((ranks)params[1].val.integer);
+      gMamer.TellUser(ChangedCommandLevel, user->name, params[0].val.word, params[1].val.integer);
+    } else
+      gMamer.TellUser(NoPermissions, user->name);
+  } else 
+    return 0;
+  
+  return 1;
+}
+
+//- SetInfo -------------------------------------------------------
+int CommandEntry::SetInfo(User *user, param_list params) {
+    User *u = NULL;
+    int notFound=1, i;
+    char name[32];
+
+    memset(name, '\0', 32);
+    if(params[0].type == TYPE_WORD) { 
+      strncpy(name, params[0].val.word, MIN(31, (int)strlen(params[0].val.word))); 
+    }
+
+    u = gMamer.FindUser(name);
+    if(u != NULL) notFound = 0;
+
+    if(notFound) {
+      u = new User();
+      u->LoadPlayer(gMamer.userFilePath, name);
+    }
+
+    if(u != NULL) {
+      if((u->GetManagerLevel() >= user->GetManagerLevel()) &&
+        (user->GetManagerLevel() != PRESIDENT)) {
+       if(notFound) delete u;
+       gMamer.TellUser(NoPermissions, user->name);
+       return 0;
+      }
+      for(i=1; i<=7; i++)
+       u->SetStatistic(i, params[i].val.integer);
+      u->SavePlayer(gMamer.userFilePath);
+      gMamer.TellUser(ChangedInfo, user->name, u->name);
+    } else {
+      gMamer.TellUser(NotFound, user->name, name);
+    }
+    if(notFound) delete u;
+
+    return(1);
+} //- End of SetInfo
+
+//- SetManagerLevel -------------------------------------------------------
+int CommandEntry::SetManagerLevel(User *user, param_list params) {
+  User *u = NULL;
+  int notFound=1, new_level=1, length=0, i=0;
+  char name[32];
+  
+  if(params[0].type == TYPE_WORD) { 
+    length = strlen(params[0].val.word);
+    memset(name, '\0', 32);
+    while((i < 31) && (i < length)) {
+      name[i] = tolower(params[0].val.word[i]);
+      i++;
+    }
+  }
+  new_level = params[1].val.integer;
+  
+  u = gMamer.FindUser(name);
+  if(u != NULL) notFound = 0;
+  
+  if(notFound) {
+    u = new User();
+    u->LoadPlayer(gMamer.userFilePath, name);
+  }
+  if(((u->GetManagerLevel() >= user->GetManagerLevel()) ||
+      (new_level >= user->GetManagerLevel())) &&
+     (user->GetManagerLevel() != PRESIDENT)) {
+    if(notFound) delete u;
+    gMamer.TellUser(NoPermissions, user->name);
+    return 0;
+  }
+
+  if(u != NULL) {
+    u->ChangeManagerLevel(new_level);
+    u->SavePlayer(gMamer.userFilePath);
+    gMamer.TellUser(ChangedManagerLevel, user->name, u->name, new_level);
+  } else {
+    gMamer.TellUser(NotFound, user->name, name);
+  }
+  if(notFound) delete u;
+  
+  if(new_level > 0)
+    return(1);
+  else
+    return -1;
+} //- End of SetManagerLevel
+
+
+//- SetStat -------------------------------------------------------
+int CommandEntry::SetStat(User *user, param_list params) {
+    User *u = NULL;
+    int notFound=1, new_value, i, ret=0, size=0, counter=0;
+    char which_stat[64], name[32];
+    strings statAliases[] = {
+      {"tourneys", 1}, {"tnys", 1},
+      {"wins", 2},
+      {"losses", 3}, {"lose", 3},
+      {"draws", 4},
+      {"firsts", 5}, {"1sts", 5},
+      {"seconds", 6}, {"2nds", 6},
+      {"thirds", 7}, {"3rds", 7},
+      {"abuse", 8}, 
+      {"rating", 9},
+      {"managedtourneys", 10},
+      {NULL}
+    };
+
+    memset(which_stat, '\0', 64);
+    if(params[0].type == TYPE_WORD) { strcpy(name, params[0].val.word); }
+    if(params[1].type == TYPE_WORD) { strncpy(which_stat, params[1].val.word, MIN(63, strlen(params[1].val.word))); }    
+    size = strlen(which_stat);
+    new_value = params[2].val.integer;
+
+    u = gMamer.FindUser(name);
+    if(u != NULL) notFound = 0;    
+
+    if(notFound) { 
+      u = new User(); 
+      u->LoadPlayer(gMamer.userFilePath, name);
+    }
+    if(u != NULL) {
+      if((u->GetManagerLevel() >= user->GetManagerLevel()) &&
+        (user->GetManagerLevel() != PRESIDENT)) {
+       if(notFound) delete u;
+       gMamer.TellUser(NoPermissions, user->name);
+       return 0;
+      }
+      i=0;
+      while(statAliases[i].string != NULL) {
+       if (!(strncasecmp(statAliases[i].string, which_stat, MIN(size, (int)strlen(statAliases[i].string))))) {
+         counter++;
+         if(counter > 1) break;
+       }       
+       i++;
+      }
+      if(counter > 1) {
+       gMamer.TellUser(CanNotChange, user->name, u->name, which_stat, new_value);
+      } else if(counter == 0) {
+       gMamer.TellUser(NotFound, user->name, which_stat);
+      } else {
+       i=0;
+       while(statAliases[i].string != NULL) {
+         if (!(strncasecmp(statAliases[i].string, which_stat, MIN(size, (int)strlen(statAliases[i].string))))) {
+           ret = u->SetStatistic(statAliases[i].number, new_value);
+           memset(which_stat, '\0', 64);
+           strcpy(which_stat, statAliases[i].string);
+           break;
+         }
+         i++;
+       }
+       u->SavePlayer(gMamer.userFilePath);
+       if(ret)
+         gMamer.TellUser(ChangedInfo, user->name, u->name, which_stat, new_value);
+       else 
+         gMamer.TellUser(NotFound, user->name, which_stat);
+      }
+    } else {
+      gMamer.TellUser(NotFound, user->name, name);
+    }
+    if(notFound) delete u;
+
+    return(1);
+} //- End of SetStat
+
+//- ShowCommands --------------------------------------------
+int CommandEntry::ShowCommands(User *user, param_list params) {
+  Command *c = NULL;
+  LinkListIter<Command> commIter(gMamer.commandList);
+  char *command;
+  int i;
+
+  if(params[0].type == TYPE_WORD) {
+    command = params[0].val.word;
+    while((c = commIter.Next())) if(1 == c->IsCommand(command)) break;
+    if(c == NULL) {
+      gMamer.TellUser(NotFound, user->name, command);
+      return 0;
+    }
+    gMamer.XServerCom("qtell %s %s Notes: %-16s | %-5s | %3d | %s \n", 
+           user->name, gMamer.username, c->GetCommandName(), 
+           c->GetCommandAlias(), c->GetManagerLevel(), c->GetCommandDescription());
+    return(1);
+  }
+  gMamer.XServerCom("qtell %s %s's Command List:\\n\\n", user->name, gMamer.username);
+  i = 0;
+  while((c = commIter.Next())) {
+    gMamer.XServerCom(" %-16s | %-5s | %3d | %s\\n",
+           c->GetCommandName(), c->GetCommandAlias(), c->GetManagerLevel(), c->GetCommandDescription());
+    if((!(i % 9)) && (i > 0)) {
+        i = 0;
+        gMamer.XServerCom("%s", "\n");
+        gMamer.XServerCom("qtell %s \\n", user->name);
+    }
+    i++;
+  }
+  gMamer.XServerCom("%s", "\n");
+  return(1);
+}
+
+//- ShowHelp -----------------------------------------------
+int CommandEntry::ShowHelp(User *user, param_list params) {
+  int i=1;
+  char tmpBuffer[1024], request[128], filename[256];
+  FILE *theFile;
+
+  memset(request, '\0', 128);
+  if(params[0].type == TYPE_WORD) { 
+    strcpy(request, params[0].val.word);
+  } else { 
+    strcpy(request, "index"); 
+  }
+  sprintf(filename, "%s/%s", gMamer.helpFilePath, request);
+  if((theFile = fopen(filename, "r"))) {
+    gMamer.XServerCom("qtell %s \\nThe %s Help File:\\n\\n", user->name, request);
+    i=1;
+    memset(filename, '\0', 256);
+    while(fgets(filename, 79, theFile)) {    /* Just reusing the variable filename could be any char [] */      
+      memset(tmpBuffer, '\0', 1024);
+      strcpy(tmpBuffer, gMamer.s_and_r(filename, "\n", "\\n"));
+      gMamer.XServerCom("%s", tmpBuffer);
+      if(((i % 10) == 0) && (i > 0)) {
+       i = 0;
+       gMamer.XServerCom("\nqtell %s \\n", user->name);
+      }
+      i++;
+      memset(filename, '\0', 256);
+    }
+    fclose(theFile);
+    gMamer.XServerCom("\n");
+    
+    return(1);
+  }
+  gMamer.TellUser(NotFound, user->name, request);
+  return(0);
+}//- End of ShowHelp
+
+//- CreateTourney ------------------------------------------------------------
+int CommandEntry::CreateTourney(User *user, param_list params) {
+  Tourney *t = NULL;
+  int num = gMamer.GenerateTourneyNumber();
+
+  params[0].type = params[0].type;  // Just to stop the annoying unused variable messages during compile.
+  t = new Tourney(num, user, &(gMamer.tourneyParams));
+  gMamer.tourneyList.Append(t);
+  gMamer.XServerCom("%s %s %s %d %s", "xtell", user->name, "Created tourney number: ", t->number, "\n");  
+  return(1);
+}//- End CreateTourney
+
+//- OpenTourney ------------------------------------------------------------
+int CommandEntry::OpenTourney(User *user, param_list params) {
+  Tourney *tourn = NULL;
+
+  tourn = gMamer.FindTourney(params[0].val.integer);
+  if(NULL != tourn) {
+    if(tourn->Open()) {
+      tourn->Announce();
+      return(1);
+    }
+  }
+  gMamer.TellUser(NotFound, user->name, "tourney");  
+  return(0);
+}//- End OpenTourney
+
+//- AnnounceTourney ----------------------------------------------------------
+int CommandEntry::AnnounceTourney(User *user, param_list params) {
+  Tourney *tourn = NULL;
+
+  tourn = gMamer.FindTourney(params[0].val.integer);
+  if(NULL != tourn) {
+    if(tourn->GetStatus() == OPEN) {
+      tourn->Announce();
+      return(1);
+    } else {
+      gMamer.TellUser(TourneyNotOpen, user->name, params[0].val.integer);
+      return 0;
+    }
+  } else {
+    gMamer.TellUser(NotFound, user->name, "tourney");  
+    return(0);
+  }
+}//- AnnounceTourney ---------------------------------------------------------
+
+//- KeepTourney ------------------------------------------------------------
+int CommandEntry::KeepTourney(User *user, param_list params) {
+  Tourney *t = NULL;
+
+  t = gMamer.FindTourney(params[0].val.integer);
+  if(NULL != t) {
+    if(params[1].type != TYPE_NULL) 
+      if(params[1].type == TYPE_WORD) {
+       if(strncasecmp("y", params[1].val.word, 1) == 0) {
+         t->SetPersist(1);
+         gMamer.TellUser(WillKeepTourney, user->name, params[0].val.integer);
+       } else {
+         t->SetPersist(0);
+         gMamer.TellUser(NotKeepTourney, user->name, params[0].val.integer);
+       }
+      } else if(params[1].type == TYPE_INT) {
+       t->SetPersist(params[1].val.integer);
+       if(params[1].val.integer)
+         gMamer.TellUser(WillKeepTourney, user->name, params[0].val.integer);
+       else
+         gMamer.TellUser(NotKeepTourney, user->name, params[0].val.integer);
+      } else {
+       gMamer.TellUser(NotFound, user->name, "tourney");  
+       return(0);
+      }
+    return(1);
+  }
+
+  gMamer.TellUser(NotFound, user->name, "tourney");  
+  return(0);
+}//- End KeepTourney
+
+//- DeleteTourney ------------------------------------------------------------
+int CommandEntry::DeleteTourney(User *user, param_list params) {
+  Tourney *t = NULL;
+  TourneyPlayers *tp = NULL;
+
+  t = gMamer.FindTourney(params[0].val.integer);
+  if(NULL != t) {
+    if(t->GetStatus() != DONE) {
+      LinkListIter<TourneyPlayers> playerIter(t->playerList);
+      playerIter.Reset();
+      while((tp = playerIter.Next())) {
+       gMamer.XServerCom("%s %s %d%s", "tournset", tp->name, 0, "\n");
+       gMamer.XServerCom("tell %s Tourney#%d has been deleted.%s", tp->name, t->number, "\n");
+      }
+      gMamer.XServerCom("%s %d %s%d %s", "tell", gMamer.channelNumber, 
+                       "Tourney #", params[0].val.integer, "has been deleted.\n"); 
+    }
+    gMamer.tourneyList.Delete(t);  // delete the tourney
+    return(1);
+  }
+  
+  gMamer.TellUser(NotFound, user->name, "tourney");  
+  return(0);
+}//- End DeleteTourney
+
+//- CloseTourney ------------------------------------------------------------
+int CommandEntry::CloseTourney(User *user, param_list params) {
+  Tourney *tourn = NULL;
+
+  tourn = gMamer.FindTourney(params[0].val.integer);
+  if(NULL != tourn) {
+    if(tourn->GetPlayerCount() >= MINIMUM_PLAYERS) {
+      if(tourn->GetStatus() == OPEN) {      
+       tourn->CloseAndStart();
+       gMamer.XServerCom("qtell %s %s Notes: %s %d %s", 
+                         user->name,gMamer.username,"Tourney #", 
+                         tourn->number, " is now closed.\n");
+       return(1);
+      } else {
+       gMamer.TellUser(TourneyNotOpen, user->name, tourn->number);
+      }
+    } else {
+      gMamer.TellUser(NotEnoughPlayers, user->name, tourn->number);
+    }
+  } else {
+    gMamer.TellUser(TourneyNotFound, user->name, params[0].val.integer);
+  }
+    
+  return(0);
+}//- End CloseTourney
+
+int CommandEntry::ListTourneys(User *user, param_list params) {
+  Tourney *t = NULL;
+  LinkListIter<Tourney> tournIter(gMamer.tourneyList);
+  int notourneys = 1, Tstatus=0, i=3;
+  long stDate, enDate, timeNow;
+  struct tm *start, *end;
+  char outStart[128], outEnd[128], outStatus[128];  
+
+  params[0].type = params[0].type;  // Just to stop the annoying unused var messages in compile.
+  while((t = tournIter.Next())) notourneys = 0;
+
+  if(notourneys == 0) {
+    gMamer.XServerCom("qtell %s %s Notes: \\n", user->name, gMamer.username);
+    gMamer.XServerCom(" %3s %3s %3s %4s %3s %2s %4s %9s %6s %-14s %-14s\\n", 
+                     "No.","Rds","Sty", "Time", "Inc", "Md", "Vrnt", "Rtng Rnge", "Status","  Started at  ", "   Ended at   ");
+    gMamer.XServerCom(" %3s %3s %3s %4s %3s %2s %4s %9s %6s %-14s %-14s\\n", 
+                     "---","---","---", "----", "---", "--", "----", "---------", "------","--------------", "--------------");
+    tournIter.Reset();
+    while((t = tournIter.Next())) {
+      stDate = t->GetStartDate();
+      enDate = t->GetEndDate();
+      Tstatus = t->GetStatus();
+      if((Tstatus == DONE) && (t->GetPersist() == 0)){
+       timeNow = time(0);
+       if((timeNow - enDate) > KEEP_TOURNEY_TIME) {
+         gMamer.tourneyList.Delete(t);
+         continue;
+       }
+      }
+      if(stDate > 0) {
+       start = localtime(&stDate);
+       sprintf(outStart, "%02d:%02d %02d/%02d/%02d", 
+               start->tm_hour, start->tm_min, start->tm_mon+1, start->tm_mday, start->tm_year);
+      } else { strcpy(outStart, "n/a"); }      
+      if(enDate > 0) {
+       end = localtime(&enDate);
+       sprintf(outEnd, "%02d:%02d %02d/%02d/%02d", 
+               end->tm_hour, end->tm_min, end->tm_mon+1, end->tm_mday, end->tm_year);
+      } else { strcpy(outEnd, "n/a"); }
+      if(Tstatus == NEW)
+       sprintf(outStatus, "%s", "new");
+      else if(Tstatus == OPEN) 
+       sprintf(outStatus, "%s", "open");
+      else if(Tstatus == CLOSED)
+       sprintf(outStatus, "%s", "closed");
+      else if(Tstatus == DONE)
+       sprintf(outStatus, "%s", "done");
+      else
+       memset(outStatus, '\0', 128);
+
+      gMamer.XServerCom(" %3d %3d %3c %4d %3d %2c %4c %4d-%4d %6s %-14s %-14s\\n", 
+                       t->number, t->params.rounds, t->params.style, t->params.time, t->params.inc, 
+                       t->params.mode, t->params.variant, t->params.ratingLow, t->params.ratingHigh, 
+                       outStatus, outStart, outEnd);
+      if(((i % 12) == 0) && (i > 0)) {
+       i = 0;
+       gMamer.XServerCom("%s %s %s %s", "\n", "qtell", user->name, "\\n");
+      }
+      i++;      
+    }
+    gMamer.XServerCom("%s", "\n");
+  } else {
+    gMamer.XServerCom("qtell %s %s Notes: %s", user->name, gMamer.username, "No tourneys right now.\n");    
+  }
+
+  return (1);
+}
+
+//- JoinTourney ------------------------------------------------------------
+int CommandEntry::JoinTourney(User *user, param_list params) {
+  Tourney *tourn = NULL;
+  Player *newEntry = NULL;
+
+  tourn = gMamer.FindTourney(params[0].val.integer);
+  
+  if(NULL != tourn) {    
+    newEntry = new Player(user->name, params[0].val.integer);
+    gMamer.pendingList.Append(newEntry);
+    gMamer.XServerCom("getpi %s%s", user->name, "\n");
+    return(1);
+  }
+
+  gMamer.TellUser(TourneyNotFound, user->name, params[0].val.integer);
+  return(0);
+}
+
+//- AddToTourney ------------------------------------------------------------
+int CommandEntry::AddToTourney(User *user, param_list params) {
+  Tourney *tourn = NULL;
+  Player *newEntry = NULL;
+
+  tourn = gMamer.FindTourney(params[1].val.integer);
+  
+  if(NULL != tourn) {
+    newEntry = new Player(params[0].val.word, params[1].val.integer);
+    gMamer.pendingList.Append(newEntry);
+    gMamer.XServerCom("getpi %s%s", params[0].val.word, "\n");
+    return(1);
+  }
+
+  gMamer.TellUser(TourneyNotFound, user->name,  params[1].val.integer);
+  return(0);
+}
+
+//- RemoveFromTourney ------------------------------------------------------------
+int CommandEntry::RemoveFromTourney(User *user, param_list params) {
+  Tourney *tourn = NULL;
+  TourneyPlayers *tp=NULL;
+  char name[NAMELEN], reason[64];
+  int num=0;
+  User *u=NULL;
+  int chaosPointsEarned=0, needToDelete=0;
+
+  memset(name, '\0', NAMELEN);
+  memset(reason, '\0', 64);
+  if(params[0].type == TYPE_INT) {  // if we are withdrawing ourselves
+    tourn = gMamer.FindTourney(params[0].val.integer);
+    strcpy(name, user->name);
+    u = user;
+    num = params[0].val.integer;
+    strcpy(reason, "withdrew");
+  } else {  // if a manager is forfeiting us
+    tourn = gMamer.FindTourney(params[1].val.integer);
+    strcpy(name, params[0].val.word);
+    u = gMamer.FindUser(params[0].val.word);
+    num = params[1].val.integer;
+    strcpy(reason, "was forfeited");
+  }
+
+  if(NULL == tourn) {
+    gMamer.TellUser(TourneyNotFound, user->name, num);
+    return 0;
+  }
+  if(tourn->GetStatus() == DONE) {
+    gMamer.TellUser(TourneyDone, user->name, num);
+    return 0;
+  }
+  tp = tourn->GetPlayer(name);   //Get the players info
+  if(tp == NULL) {
+    gMamer.TellUser(NotFound, user->name, name, num);// Player is not found in this tourney
+    return 0;
+  }
+
+  gMamer.XServerCom("%s %s %d%s", "tournset", name, 0, "\n");
+  if(tourn->IsNotClosed()) { //If we get past this check it will cost the user chaos points
+    tourn->playerList.Delete(tp);
+    tourn->CalculateAverage();
+    gMamer.TellUser(PlayerRemoved, user->name, name, num);
+    gMamer.XServerCom("%s %d %s %s %s%d %d%s\n","tell", gMamer.channelNumber, name, reason, "from tourney #", 
+                     tourn->number, tourn->GetPlayerCount(), " player(s) now");
+    return 0; 
+  } // otherwise tourney is closed and started
+
+  chaosPointsEarned = tourn->RemovePlayer(name);  // RemovePlayer will return the number of rounds
+  if(chaosPointsEarned >= 0) {                    // that were disturbed
+    if(NULL == u) {
+      u = new User(gMamer.userFilePath, name);  // Make a new user - this will create a file but there
+      needToDelete = 1;                         // should already be one cause they are in the tourney
+    }
+    u->AddAbuse(chaosPointsEarned * PENALTY_PER_ROUND);  // add the choas points and save them
+    u->SavePlayer(gMamer.userFilePath);
+    if(u->GetAbuse() >= MAX_CHAOS_POINTS)
+      gMamer.XServerCom("%s %s%s", "+ censor", u->name, "\n");
+    if(needToDelete) delete(u);                 // we created a new user so we should delete him here
+    gMamer.TellUser(PlayerRemoved, user->name, name, num);
+    gMamer.XServerCom("%s %d %s %s %s%d\n","tell",gMamer.channelNumber,name, reason,
+                     "from tourney #", tourn->number);
+    return 1;
+  }
+  return 1;
+}
+
+//- ListTourneyGames ------------------------------------------------------------
+int CommandEntry::ListTourneyGames(User *user, param_list params) {
+  Tourney *t = NULL;
+  TourneyPlayers *white, *black;
+  int i = 0;
+  Game *g = NULL;
+  
+  t = gMamer.FindTourney(params[0].val.integer);
+  if(NULL != t) {
+    LinkListIter<Game> gameIter(t->gameList);
+    gameIter.Reset();
+    gMamer.XServerCom("%s %s %s %d %s",  "qtell", user->name, "Tourney Games for Round #", t->GetRound(), "\\n\\n");
+    gMamer.XServerCom("%3s %18s %6s %6s %2s %-18s %6s %6s %s",
+                     "", "White", "[SCR ]", "[Rtng]", "vs", "Black", "[SCR ]", "[Rtng]",
+                      "\\n---------------------------------------------------------------------------\\n");
+    while((g = gameIter.Next())) {
+      if(!(i % 10) && (i>0)) {
+        gMamer.XServerCom("\nqtell %s %s", user->name, "\\n");
+      }
+
+      white = t->GetPlayer(g->whiteName);
+      black = t->GetPlayer(g->blackName);
+
+      if(g->gameNumber > 0) {
+       gMamer.XServerCom("%3d %18s [%4.1f] [%4i] vs %-18s [%4.1f] [%4i] %3i%s",
+                         i+1, g->whiteName, white->score, white->rating,
+                         g->blackName, black->score, black->rating, g->gameNumber, "\\n");
+      } else {
+       gMamer.XServerCom("%3d %18s [%4.1f] [%4i] vs %-18s [%4.1f] [%4i] none%s",
+                         i+1, g->whiteName, white->score, white->rating,
+                         g->blackName, black->score, black->rating, "\\n");
+      }
+      i++;
+    }
+    gMamer.XServerCom("%s", "\\n\n");
+    return(1);
+  }
+
+  gMamer.TellUser(TourneyNotFound, user->name, params[0].val.integer);
+  return(0);
+}//- End of ListTourneyGames
+
+//- ListTourneyPlayers ------------------------------------------------------------
+int CommandEntry::ListTourneyPlayers(User *user, param_list params) {
+  Tourney *t = NULL;
+  Player *p = NULL, *opp=NULL;
+  TourneyPlayers *tp = NULL;
+  char color, result;
+  int i = 0, counter = 0;
+
+  t = gMamer.FindTourney(params[0].val.integer);
+  if(NULL != t) {
+    if(t->GetPlayerCount() == 0) {
+      gMamer.TellUser(NoPlayers, user->name, params[0].val.integer);
+      return 0;
+    }
+    t->SortPlayers();
+    gMamer.XServerCom("%s %s %s %s %d %s %d %s %3s %-17s %6s %5s %6s %-6s %-7s %s %3s %-17s %6s %5s %6s %6s %-7s %s", 
+                     "qtell", user->name, "Tourney Players:", "Round", t->GetRound(), "of", t->params.rounds, 
+                     "\\n\\n", "", "Name", "Rating", "Score", "Perfrm", "Upset ", "Results", "\\n",
+                     "", "-----------------", "------", "-----", "------", "------", "-------", "\\n");
+    LinkListIter<TourneyPlayers> playerIter(t->playerList);
+    playerIter.Reset();
+    while((tp = playerIter.Next())) { counter++; }  // count the number of players
+    for(i=1; i<=counter; i++) {
+      p = t->GetSortPlayer(i);
+      tp = t->GetPlayer(p->name);
+      if(tp->activeFlag > 0) 
+       gMamer.XServerCom("%3d %s%-17s [%4d]  %3.1f  [%4d] [%4d] ", 
+                         i, ((tp->location == ONLINE) ? "+" : "-"), 
+                         tp->name, tp->rating, tp->score, tp->perform, tp->upset);
+      else 
+       gMamer.XServerCom("%3d %s%-17s [%4s]  %3.1f  [%4d] [%4d] ", 
+                         i, ((tp->location == ONLINE) ? "+" : "-"), 
+                         tp->name, "forf", tp->score, tp->perform, tp->upset);
+      LinkListIter<Player> opponentIter(tp->opponentList);  // List of opponents this player has had
+      opponentIter.Reset();
+      while((opp = opponentIter.Next())) {
+       p = t->GetSortPlayer(opp->name);
+       if(opp->value) { color = 'w'; } else { color = 'b'; }
+       if(opp->floatValue == 1.0) {
+         result = '+';
+       } else if(opp->floatValue == 0.5) { 
+         result = '='; 
+       } else if(opp->floatValue == 0.0) { 
+         result = '-'; 
+       } else {
+         result = '*'; 
+       }
+       gMamer.XServerCom("%c%-0.2d%c ", result, p->value, color);
+      }
+      if(((i % 9) == 0) && (i > 0)) {
+       gMamer.XServerCom("%s %s %s %s", "\n", "qtell", user->name, "\\n");
+      } else {
+       gMamer.XServerCom("%s", "\\n");
+      }
+    }
+    gMamer.XServerCom("%-24s %6.1f %s", "\\n     Average Rating", t->GetAverageRating(), "\\n\n");
+    return(1);
+  }
+
+  gMamer.TellUser(TourneyNotFound, user->name, params[0].val.integer);
+  return(0);
+}//- End of ListTourneyPlayers
+
+//- ListTourneyVars -----------------------------------------------------
+int CommandEntry::ListTourneyVars(User *user, param_list params) {
+  Tourney *tourn = NULL;
+
+  tourn = gMamer.FindTourney(params[0].val.integer);
+
+  if(NULL != tourn) {
+    gMamer.XServerCom("%s %s %s", "qtell", user->name, "\\n");
+    gMamer.XServerCom(" %18s %4d %s", "(T)ime: ", tourn->params.time, "\\n");
+    gMamer.XServerCom(" %18s %4d %s", "(I)ncrement: ", tourn->params.inc, "\\n");
+    gMamer.XServerCom(" %18s %4d %s", "(R)ounds: ", tourn->params.rounds, "\\n");
+    gMamer.XServerCom(" %18s %4d %s", "Max (P)layers: ", tourn->params.maxPlayers, "\\n");
+    gMamer.XServerCom(" %18s %4c %s", "(M)ode: ", tourn->params.mode, "(r)ated or (u)nrated\\n");
+    gMamer.XServerCom(" %18s %4c %s", "(S)tyle: ", tourn->params.style, "(s)wiss or (r)oundrobin\\n");
+    gMamer.XServerCom(" %18s %4c %s","(V)ariant: ",tourn->params.variant, "(w)ild, (r)egular, (b)ug, or (s)uicide\\n");
+    if(tourn->params.variant == 'w')
+      gMamer.XServerCom(" %18s %4d %s", 
+                       "(W)ild Type: ", 
+                       tourn->params.wild, "(0), (1), (2), (3), (4), (5), (8), (9)8a, (10)fr\\n");
+    gMamer.XServerCom(" %18s %4d %s", "Rating (L)ow: ", tourn->params.ratingLow, "\\n");
+    gMamer.XServerCom(" %18s %4d %s", "Rating (H)igh: ", tourn->params.ratingHigh, "\\n\\n");
+    gMamer.XServerCom(" %18s %-18s %s", "Manager: ", tourn->manager, "\\n\n");
+  } else {
+    gMamer.TellUser(NotFound, user->name, "tourney");
+  }
+
+  return 1;
+}//- End ListTourneyVars
+
+//- MessageManagers -----------------------------------------------------
+int CommandEntry::MessageManagers(User *user, param_list params) {
+    int i, level, tourneys;
+    long last;
+    char filename[256], manager[NAMELEN];
+    FILE *theFile;
+    
+    i = 1;
+    level = params[0].type;
+    sprintf(filename, "%s/managers", gMamer.dataFilePath);
+    if((theFile = fopen(filename, "r"))) {
+      while(fscanf(theFile, "%s %d %d %ld", manager, &level, &tourneys, &last) > 0) {
+       gMamer.XServerCom("%s %s %s %s", "message", manager, params[0].val.string, "\n");
+      }
+      fclose(theFile);
+      
+      return(1);
+    }
+    gMamer.TellUser(NotFound, user->name, "Manager List");
+    return(0);
+}//- MessageManagers
+
+//- SetResult ------------------------------------------------------------
+int CommandEntry::SetResult(User *user, param_list params) {
+  Tourney *t;
+  int result, return_val = 0;
+  char answer[128];
+
+  t = gMamer.FindTourney(params[0].val.integer);
+  
+  if(NULL != t) {
+    switch (params[3].type) {    // try and set the result
+    case TYPE_INT:
+      switch(params[3].val.integer) {
+        case 1: result = 1; break;
+        case 0: result = 0; break;
+
+      }
+      break;
+    case TYPE_WORD:
+      if(!strcmp("=", params[3].val.word)) { result = 2;
+      } else if(!strcmp("draw", params[3].val.word)) { result = 2;
+      } else if(!strcmp("win", params[3].val.word)) { result = 1;
+      } else if(!strcmp("white", params[3].val.word)) {        result = 1;
+      } else if(!strcmp("loss", params[3].val.word)) { result = 0;
+      } else if(!strcmp("black", params[3].val.word)) {        result = 0;
+      } else { 
+       gMamer.TellUser(GameResultNotFound, user->name, params[3].val.word); 
+       return 0;
+      }
+      break;
+    default:
+      gMamer.TellUser(GameResultNotFound, user->name, params[3].val.string); 
+      return 0;
+      break;
+    }
+    return_val = t->SetGameResult(params[1].val.word, params[2].val.word, result);
+  }
+  switch (return_val) {
+  case 0:
+    sprintf(answer, "a game with %s as white and %s as black", params[1].val.word, params[2].val.word);
+    gMamer.TellUser(NotFound, user->name, answer);
+    break;
+  default:
+    gMamer.TellUser(GameResultSet, user->name, params[1].val.word, params[2].val.word, result);
+    switch (result) {
+    case 1:
+      sprintf(answer, "1-0");
+      break;
+    case 0:
+      sprintf(answer, "0-1");
+      break;
+    default:
+      sprintf(answer, "1/2-1/2");
+      break;
+    }
+    gMamer.XServerCom("%s %d The game %s vs. %s in tourney #%d has been set %s by %s\n", "tell", gMamer.channelNumber,
+                     params[1].val.word, params[2].val.word, t->number, answer, user->name);
+    break;
+  }
+  return return_val;
+}//- End of SetResult
+
+//- SetTourneyVariable -----------------------------------------------------
+int CommandEntry::SetTourneyVariable(User *user, param_list params) {
+  Tourney *tourn = NULL;
+  int i=0;
+  char which_var[16];
+  strings varAliases[] = {
+    {"time", 0},      {"t", 0}, {"inc", 1},        {"i", 1}, {"rounds", 2}, {"r", 2},
+    {"style", 3},     {"s", 3}, {"variant", 4},    {"v", 4}, {"mode", 5},   {"m", 5},
+    {"wild", 6}, {"w", 6},
+    {"ratingLow", 7}, {"l", 7}, {"ratingHigh", 8}, {"h", 8}, {"maxplayers", 9}, {"p", 9}, {NULL} };
+
+  tourn = gMamer.FindTourney(params[0].val.integer);   // what tourney are we talking about
+  if(NULL == tourn) {
+    gMamer.TellUser(NotFound, user->name, "tourney");  // wrong tourney number
+    return 0;
+  }
+  if(FALSE == tourn->IsNotClosed()) {
+    gMamer.TellUser(TourneyClosed, user->name, params[0].val.integer);
+    return 0;
+  }
+  if(TRUE == tourn->IsNotNew()) {
+    if((0 != strncasecmp(params[1].val.word, "rounds", strlen(params[1].val.word))) &&  // even if it is open
+       (0 != strncasecmp(params[1].val.word, "r", strlen(params[1].val.word))) &&       // we can still change rounds
+       (0 != strncasecmp(params[1].val.word, "maxplayers", strlen(params[1].val.word))) &&   // or max players
+       (0 != strncasecmp(params[1].val.word, "p", strlen(params[1].val.word))) &&   // 
+       (0 != strncasecmp(params[1].val.word, "style", strlen(params[1].val.word))) &&   // or style (rr) to (ss)
+       (0 != strncasecmp(params[1].val.word, "s", strlen(params[1].val.word)))) {
+      gMamer.TellUser(TourneyNotNew, user->name, params[0].val.integer);
+      return(0);
+    }
+  }
+  if(strcasecmp(user->name, tourn->manager) != 0) {
+    gMamer.TellUser(NoPermissions, user->name, params[0].val.integer);
+    return(0);
+  }
+  while(varAliases[i].string != NULL) {
+    if (!(strcasecmp(varAliases[i].string, params[1].val.word))) {   //lets check the vars
+      if(strlen(varAliases[i].string) == 1)
+       strcpy(which_var, varAliases[i-1].string);                   
+      else                                                       //copy the whole word
+       strcpy(which_var, varAliases[i].string);
+      
+      if((varAliases[i].number <= 2) || (varAliases[i].number >= 6)) 
+       if(params[2].type == TYPE_INT) {                     // if var is one that should be int
+         tourn->SetVariable(varAliases[i].number, params[2].val.integer);
+         gMamer.TellUser(ChangedInfo, user->name, which_var, params[2].val.integer);
+         return 1;
+       } else {
+         gMamer.TellUser(CanNotChange, user->name, which_var, params[2].val.word);
+         return 0;
+       }
+      else 
+       if(params[2].type == TYPE_WORD) {
+         tourn->SetVariable(varAliases[i].number, params[2].val.word);
+         gMamer.TellUser(ChangedInfo, user->name, which_var, params[2].val.word);
+         return 1;
+       } else {
+         gMamer.TellUser(CanNotChange, user->name, which_var, params[2].val.integer);
+         return 0;
+       }
+    }
+    i++;
+  }
+
+  gMamer.TellUser(NotFound, user->name, params[1].val.word);  // Bad Variable  
+  return 0;
+}
+
+//- ShutdownCommand ----------------------------------------------------------
+int CommandEntry::Shutdown(User *user, param_list params) {
+  int i;
+
+  i = params[0].type;
+  i = user->GetManagerLevel();
+
+  gMamer.Shutdown();
+  exit(0);
+  
+  return(1);
+} //- end of Shutdown
diff --git a/lasker-2.2.3/bots/mamer/CommandEntry.hh b/lasker-2.2.3/bots/mamer/CommandEntry.hh
new file mode 100644 (file)
index 0000000..d1f36bf
--- /dev/null
@@ -0,0 +1,98 @@
+//--------------------------------------------------------------------------
+// CommandEntry.hh - Class definition for CommandEntry
+//
+// Matthew E. Moses
+//
+// $Revision: 1.11 $
+// $Date: 1998/09/10 19:58:31 $
+//
+// $Author: mlong $
+// $Locker:  $
+//
+// $Log: CommandEntry.hh,v $
+// Revision 1.11  1998/09/10 19:58:31  mlong
+// *** empty log message ***
+//
+// Revision 1.10  1998/06/18 18:41:52  mlong
+// prepairing for yet another move.
+//
+// Revision 1.9  1998/04/29 15:24:07  mlong
+// prepairing for the move to daimi
+// new sorting routine.
+//
+// Revision 1.8  1998/04/18 18:46:31  mlong
+// fixed delete bug and
+// added delete tourney function
+//
+// Revision 1.7  1998/02/12 18:44:25  mlong
+// *** empty log message ***
+//
+// Revision 1.6  1997/10/28 21:03:48  mlong
+// *** empty log message ***
+//
+// Revision 1.5  1997/10/23 20:13:37  mlong
+// *** empty log message ***
+//
+// Revision 1.5  1997/10/23 19:56:12  chess
+// *** empty log message ***
+//
+// Revision 1.4  1997/05/15 18:29:12  chess
+//  added pending and TourneyPlayers support
+// added HandleGetPlayerInfo & HandleGetGameInfo
+//
+// Revision 1.3  1997/04/13 03:21:32  chess
+// new commands added SetInfo SetStat AddAbuse
+//
+// Revision 1.2  1997/03/21 15:32:36  moses
+// added the shutdown command.
+//
+// Revision 1.1  1996/10/01  20:14:43  moses
+// Initial revision
+//
+//--------------------------------------------------------------------------
+
+#ifndef _UserCommands_
+#define _UserCommands_
+
+#include "types.h"
+#include "User.hh"
+#include "Tourney.hh"
+
+class CommandEntry {
+ public:
+  int AddAbuse(User *, param_list);
+  int AnnounceTourney(User *, param_list);
+  int CreateTourney(User *, param_list);
+  int CloseTourney(User *, param_list);
+  int DeleteTourney(User *, param_list);
+  int FingerUser(User *, param_list);
+  int JoinTourney(User *, param_list);
+  int KeepTourney(User *, param_list);
+  int AddToTourney(User *, param_list);
+  int RemoveFromTourney(User *, param_list);
+  int ListRank(User *, param_list);
+  int ListManagers(User *, param_list);
+  int ListTourneys(User *, param_list);
+  int ListTourneyPlayers(User *, param_list);
+  int ListTourneyGames(User *, param_list);
+  int ListTourneyVars(User *, param_list);
+  int LoadedUsers(User *, param_list);
+  int MessageManagers(User *, param_list);
+  int OpenTourney(User *, param_list);
+  int SetCommandLevel(User *, param_list);
+  int SetInfo(User *, param_list);
+  int SetManagerLevel(User *, param_list);
+  int SetResult(User *, param_list);
+  int SetStat(User *, param_list);
+  int SetTourneyVariable(User *, param_list);
+  int ShowCommands(User *, param_list);
+  int ShowHelp(User *, param_list);
+  int Shutdown(User *, param_list);
+  int Withdraw(User *, param_list);
+
+};
+
+#endif
+
+
+
diff --git a/lasker-2.2.3/bots/mamer/Game.cc b/lasker-2.2.3/bots/mamer/Game.cc
new file mode 100644 (file)
index 0000000..8ab9ff8
--- /dev/null
@@ -0,0 +1,59 @@
+//--------------------------------------------------------------------------
+// Game.cc - Source file for the Game class
+//
+// Matthew E. Moses && Michael A. Long
+//
+// $Revision: 1.4 $
+// $Date: 2002/07/02 00:05:19 $
+//
+// $Author: tridge $
+// $Locker:  $
+//
+// $Log: Game.cc,v $
+// Revision 1.4  2002/07/02 00:05:19  tridge
+// got rid of a bunch of RCS tags now that its in CVS
+//
+// Revision 1.3  1998/09/10 19:57:17  mlong
+// lots of little bug fixes and a few new features
+//
+// Revision 1.2  1998/04/29 15:23:19  mlong
+// prepairing for the move to daimi
+// new sorting routine.
+//
+// Revision 1.1  1997/07/18 15:42:13  chess
+// Initial revision
+//
+//
+//--------------------------------------------------------------------------
+
+#include "Game.hh"
+
+//- Constructor -----------------------------------------------------------
+Game::Game(char *wn, char *bn, int t, int i, int r, char v) {
+  strcpy(whiteName, wn);
+  strcpy(blackName, bn);
+  time = t;
+  inc = i;
+  rated = r;
+  variation = v;
+
+  gameNumber = -1;
+}
+
+//- DeConstructor ---------------------------------------------------------
+Game::~Game() {
+}
+
+//- IsGame -----------------------------------------------------------------
+int Game::IsGame(char *whiteUser, char *blackUser, int t, int i, int r, char v) {
+    if(
+       (0 == strcasecmp(whiteUser, whiteName)) && 
+       (0 == strcasecmp(blackUser, blackName)) &&
+       (time == t) &&
+       (inc == i) &&
+       (rated == r) &&
+       (variation == v))
+        return(1);
+    else
+        return(0);
+} //- End of IsGame
diff --git a/lasker-2.2.3/bots/mamer/Game.hh b/lasker-2.2.3/bots/mamer/Game.hh
new file mode 100644 (file)
index 0000000..5247cdb
--- /dev/null
@@ -0,0 +1,87 @@
+//--------------------------------------------------------------------------
+// Game.hh - Class header for the Game class
+//
+// Matthew E. Moses & Michael A. Long
+//
+// $Revision: 1.5 $
+// $Date: 2002/07/02 00:05:19 $
+//
+// $Log: Game.hh,v $
+// Revision 1.5  2002/07/02 00:05:19  tridge
+// got rid of a bunch of RCS tags now that its in CVS
+//
+// Revision 1.4  2002/07/02 00:02:40  tridge
+// - fixed compile on g++ 2.96
+// - updated for lasker 'rmatch'
+//
+// Revision 1.3  1998/09/10 19:58:41  mlong
+// lots of little bug fixes and a few new features.
+//
+// Revision 1.2  1998/04/29 15:24:07  mlong
+// prepairing for the move to daimi
+// new sorting routine.
+//
+// Revision 1.1  1997/07/18 15:42:58  chess
+// Initial revision
+//
+//
+//--------------------------------------------------------------------------
+
+#ifndef _Game_
+#define _Game_
+
+#include <fstream.h>
+#include <iostream.h>
+
+extern "C" {
+#include <sys/param.h>
+#include <sys/types.h>
+
+#include <ctype.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <sys/stat.h>
+
+#include <time.h>
+#include <unistd.h>
+}
+
+#include "config.h"
+#include "User.hh"
+#include "link.hh"
+#include "linklist.hh"
+
+class Game : public Link {
+public:
+
+  Game(char *, char *, int, int, int, char);
+  ~Game();
+  
+int IsGame(char *, char *, int, int, int, char);
+
+private:
+
+public:
+
+  char whiteName[NAMELEN];
+  char blackName[NAMELEN];
+  int rated;
+  int time;
+  int inc;
+  char variation;
+  int gameNumber;
+
+private:
+
+};
+
+
+#endif
+
+
+
+
+
+
diff --git a/lasker-2.2.3/bots/mamer/Makefile b/lasker-2.2.3/bots/mamer/Makefile
new file mode 100644 (file)
index 0000000..0bc956a
--- /dev/null
@@ -0,0 +1,136 @@
+#!make
+#
+# $Revision: 1.8 $
+# $Author: mlong $
+#
+# $Date: 1998/09/11 15:47:50 $
+# 
+# $Locker:  $
+#
+
+ifeq (${USE_INSURE}, 1)
+        CFLAGS = -Wall -ggdb
+        C++FLAGS = -Wall -ggdb
+        CC = insure
+        C++ = insure
+else
+        ifeq (${USE_CHECKER}, 1)
+             CFLAGS = -Wall ##-ggdb
+             CC = checker -gcc
+             C++ = checker -g++
+        else
+             CFLAGS = -Wall -ggdb
+            C++FLAGS = -Wall -ggdb
+             CC = gcc
+             C++ = g++
+        endif
+endif
+
+
+#DEFINES = -DSUN
+
+#LDFLAGS = -lsocket -lnls -lnsl
+
+MAMER=mamer
+MAMER-HEADERS = config.h Mamer.hh User.hh Tourney.hh link.hh linklist.hh\
+       Command.hh CommandEntry.hh TourneyParameters.hh TourneyPlayers.hh\
+       Game.hh Player.hh Storage.hh
+MAMER-SRCS = main.cc Mamer.cc User.cc Tourney.cc link.cc Command.cc\
+       CommandEntry.cc TourneyParameters.cc TourneyPlayers.cc\
+       Game.cc Player.cc Storage.cc
+MAMER-OBJS = main.o Mamer.o User.o Tourney.o link.o Command.o \
+       CommandEntry.o TourneyParameters.o TourneyPlayers.o\
+       Game.o Player.o Storage.o
+
+HEADERS = $(MAMER-HEADERS)
+SRCS = $(MAMER-SRCS)
+OBJS = $(MAMER-OBJS)
+
+default:: $(MAMER)
+
+all:: $(MAMER)
+
+# Object file rules
+%.o: %.cc 
+       $(C++) $(DEFINES) $(C++FLAGS) -c $<
+
+%.o: %.c
+       $(CC) $(DEFINES) $(CFLAGS) -c $<
+
+$(MAMER): $(MAMER-OBJS)
+       $(C++) $(C++FLAGS) -o bin/$@ $(MAMER-OBJS) $(LDFLAGS)
+
+clean:
+       rm -f $(OBJS) bin/mamer *~ #*
+
+count:
+       wc -l $(HEADERS) $(SRCS)
+
+tar:
+       make clean
+       (cd ..; tar -cf mamer.tar mamer; gzip -f mamer.tar; mv mamer.tar.gz mamer)
+
+bak:
+       mv bin/mamer bin/mamer_bak
+
+# File Dependencies
+
+main.o: main.cc\
+       Mamer.hh\
+       config.h
+
+Mamer.o: Mamer.cc\
+       Mamer.hh\
+       User.hh\
+       Tourney.hh\
+       config.h\
+       link.hh\
+       linklist.hh\
+       CommandEntry.hh\
+       TourneyParameters.hh\
+       Player.hh\
+       Game.hh\
+       Storage.hh
+
+User.o: User.cc\
+       User.hh\
+       config.h\
+       link.hh
+
+Tourney.o: Tourney.cc\
+       Tourney.hh\
+       config.h\
+       link.hh\
+       TourneyParameters.hh\
+       TourneyPlayers.hh\
+       Player.hh\
+       Game.hh\
+       Storage.hh
+
+Command.o: Command.cc\
+       Command.hh\
+       config.h\
+       link.hh\
+       types.h\
+       Game.hh
+
+CommandEntry.o: CommandEntry.cc\
+       CommandEntry.hh\
+       User.hh\
+       types.h\
+       Game.hh
+
+TourneyParameters.o: TourneyParameters.cc\
+       TourneyParameters.hh
+
+TourneyPlayers.o: TourneyPlayers.cc\
+       TourneyPlayers.hh
+
+Storage.o: Storage.cc\
+       Storage.hh
+
+Player.o: Player.cc\
+       Player.hh
+
+Game.o: Game.cc\
+       Game.hh
diff --git a/lasker-2.2.3/bots/mamer/Mamer.cc b/lasker-2.2.3/bots/mamer/Mamer.cc
new file mode 100644 (file)
index 0000000..38bfd59
--- /dev/null
@@ -0,0 +1,2032 @@
+//--------------------------------------------------------------------------
+// Mamer.cc - Source file for the Mamer class
+//
+// Matthew E. Moses & Michael A. Long
+//
+// $Revision: 1.19 $
+// $Date: 2002/07/02 00:05:19 $
+//
+//--------------------------------------------------------------------------
+
+#include "Mamer.hh"
+
+extern void HandleSignals(int);
+
+//- Constructor ------------------------------------------------------------
+Mamer::Mamer() {
+    time_t theTime;
+    struct tm *timeStruct;
+
+    theTime = time((time_t *)NULL);
+    timeStruct = localtime(&theTime);
+
+    loggedInFlag = FALSE;
+
+    memset(configFilename, '\0', MAXPATHLEN);
+    strncpy(configFilename, CONFIG_FILENAME, MIN(strlen(CONFIG_FILENAME), MAXPATHLEN));
+
+    channelNumber = DEFAULT_CHANNEL;
+    memset(hostname, '\0', 256);
+    strncpy(hostname, DEFAULT_HOSTNAME, MIN(strlen(DEFAULT_HOSTNAME), 256));
+    portNumber = DEFAULT_PORT;
+    
+    debugLevel = 0;
+
+    memset(username, '\0', 80);
+    memset(password, '\0', 80);
+    strncpy(username, DEFAULT_USERNAME, MIN(strlen(DEFAULT_USERNAME), 80));
+    strncpy(password, DEFAULT_PASSWORD, MIN(strlen(DEFAULT_PASSWORD), 80));
+
+    sprintf(logFilename, "%s/%s.%04d%02d%02d", 
+           DEFAULT_PATH, DEFAULT_LOG_FILE,
+           1900 + timeStruct->tm_year, timeStruct->tm_mon + 1, 
+           timeStruct->tm_mday);
+
+    sprintf(userFilePath, "%s/%s", DEFAULT_PATH, DEFAULT_USER_PATH);
+    sprintf(dataFilePath, "%s/%s", DEFAULT_PATH, DEFAULT_DATA_PATH);
+    sprintf(homeFilePath, "%s", DEFAULT_PATH);
+
+    tourneyParams.time = DEFAULT_TIME;
+    tourneyParams.inc = DEFAULT_INCREMENT;
+    tourneyParams.mode = 'r';
+    tourneyParams.style = 's';
+    tourneyParams.variant = 'r';
+    tourneyParams.rounds = DEFAULT_ROUNDS;
+    tourneyParams.ratingHigh = 9999;
+    tourneyParams.ratingLow = 0;
+    tourneyParams.maxPlayers = DEFAULT_MAX_PLAYERS;
+
+} //- End of Mamer
+
+//- Deconstructor ----------------------------------------------------------
+Mamer::~Mamer() {
+    User *u = NULL;
+    Tourney *t = NULL;
+    Command *c = NULL;
+
+    while(0 != (u = userList.Head()))
+       userList.Delete();
+
+    while(0 != (t = tourneyList.Head()))
+       tourneyList.Delete();
+
+    while(0 != (c = commandList.Head()))
+       commandList.Delete();
+
+} //- End of ~Mamer
+
+//- Initialize -------------------------------------------------------------
+int Mamer::Initialize(int argc, char **argv) {
+    struct stat statBuffer;
+    char c;
+
+    LoadConfigurationFile();
+
+    while(EOF != (c = getopt(argc, argv, 
+                            "d:D:c:C:s:S:p:P:u:U:l:L:hHa:A:n:N:"))) {
+       switch(c) {
+        case 'd':
+        case 'D':
+           debugLevel = atoi(optarg);
+           break;
+        case 'c':
+        case 'C':
+           channelNumber = atoi(optarg);
+           break;
+        case 's':
+        case 'S':
+          memset(hostname, '\0', 256);
+          strncpy(hostname, optarg, MIN(strlen(optarg), 256));
+          break;
+        case 'n':
+        case 'N':
+           portNumber = atoi(optarg);
+           break;
+        case 'u':
+        case 'U':
+          memset(userFilePath, '\0', MAXPATHLEN);
+           strncpy(userFilePath, optarg, MIN(strlen(optarg), MAXPATHLEN));
+           break;
+        case 'l':
+        case 'L':
+          memset(userFilePath, '\0', MAXPATHLEN);
+           strncpy(logFilename, optarg, MIN(strlen(optarg), MAXPATHLEN));
+           break;
+        case 'a':
+        case 'A':
+          memset(username, '\0', 80);
+           strncpy(username, optarg, MIN(strlen(optarg), 80));
+           break;
+        case 'p':
+        case 'P':
+          memset(password, '\0', 80);
+           strncpy(password, optarg, MIN(strlen(optarg), 80));
+           break;
+        case 'h':
+        case 'H':
+        default:
+           Usage();
+           exit(0);
+       }
+    }
+
+    if(-1 == stat(userFilePath, &statBuffer)) {
+       switch(errno) {
+        case ENOENT:
+           if(-1 == mkdir(userFilePath, S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IWGRP|S_IXGRP|S_IROTH|S_IXOTH)) {
+               perror("create user file path");
+               return(0);
+           }
+       }
+    }
+
+    if(10 <= debugLevel)
+       DumpConfiguration();
+
+    signal(SIGPIPE, SIG_IGN);
+    signal(SIGTERM, HandleSignals);
+    signal(SIGKILL, HandleSignals);
+    signal(SIGUSR1, HandleSignals);
+    signal(SIGUSR2, HandleSignals);
+
+    BuildCommandList();
+
+    return(1);
+} //- End of Initialize
+
+//- s_and_r - Search and Replace a string within a string ------------
+char *Mamer::s_and_r(char *s, char *tofind, char *toreplace) {
+  char    *toReturn = NULL;
+  int     currSize = 0;
+  char    *return_offset;
+  char    *replace_offset;
+  int     find_len;
+  int     toreplace_len;
+  register int    x;
+  
+  /* if nothing to look at, and nothing to replace.... return nothing */
+  if ( s == NULL || tofind == NULL)
+    return NULL;
+  
+  find_len = strlen(tofind);
+  if ( toreplace != NULL )
+    toreplace_len = strlen(toreplace);
+  else
+    toreplace_len = 0;      /* allow us to have nothing to replace... acts the same a delstring */
+  
+  currSize = (strlen(s) * 2) + 100;       /* add the 100 in case s is small */
+  toReturn = (char*)malloc(currSize);
+  return_offset = toReturn;
+  while ( *s != '\0' ) {
+    if ( *s == *tofind && strncmp(s, tofind, MIN(find_len, (int)strlen(s))) == 0 ) {
+      /* if the first letter matches, and so does the rest.. */
+      /* copy in the replace string */
+      replace_offset = toreplace;
+      for ( x = 0; x < toreplace_len; x++ ) {
+        *return_offset = *replace_offset;
+        return_offset++;
+        replace_offset++;
+      }
+      /* and move up the current position in s to just past the find string */
+      s += find_len;
+    } else { /* it doesn't match.... just copy to the return and continue */
+      *return_offset = *s;
+      return_offset++;
+      s++;
+    }
+  }
+  *return_offset = '\0';
+
+  return toReturn;
+}
+
+//- OpenServerConnection ---------------------------------------------------
+int Mamer::OpenServerConnection(void) {
+    struct sockaddr_in socketAddr;
+    struct hostent     *hostEntry = NULL;
+//    char               mesg[MAXPATHLEN] = {'\0'};
+    unsigned long      inAddr;
+
+    //- Check is we have a decimal notation host address
+    socketAddr.sin_family = AF_INET;
+    if((unsigned long)INADDR_NONE != (inAddr = inet_addr(hostname)))
+       socketAddr.sin_addr.s_addr = inAddr;
+    else { //- Try to query a namserver to get an address
+       if(NULL == (hostEntry = gethostbyname(hostname))) {
+           cerr << "ERROR: can't resolve hostname '" << hostname
+               << "'." << endl;
+           cerr << endl;
+           return(0);
+       }
+
+       bcopy(hostEntry->h_addr, (char *)&socketAddr.sin_addr, 
+             hostEntry->h_length);
+    }
+
+    serverSocket = socket(AF_INET, SOCK_STREAM, 0);
+    if(0 > serverSocket) {
+       cerr << "ERROR: can't create TCP socket." << endl;
+       cerr << endl;
+       return(0);
+    }
+
+    socketAddr.sin_port = htons(portNumber);
+    if(0 > connect(serverSocket, (struct sockaddr *)&socketAddr, 
+                  sizeof(struct sockaddr_in))) {
+       cerr << "ERROR: can't create connection to server '"
+            << hostname << "' on port " << portNumber << "." << endl;
+       cerr << "     " << strerror(errno) << endl;
+       cerr << endl;
+       return(0);
+    }
+
+    return(1);
+} //- End of OpenServerConnection
+
+//- ListenLoop -------------------------------------------------------------
+void Mamer::ListenLoop(void) {
+    struct timeval timeout;
+    char           readBuffer[4096], writeBuffer[4096], commandBuffer[4096], channelCmpStr[16];
+    char           *p = NULL, *buffer = NULL, *tmpBuffer = NULL;
+    fd_set         fdMask;
+    long           size = 0;
+    int            i = 0, j = 0;
+
+    sprintf(channelCmpStr, "(%d): ", channelNumber);
+    buffer = new char[4096];
+    if(NULL == buffer) {
+       cerr << "ERROR: problems allocating memory" << endl;
+       cerr << endl;
+       return;
+    }
+
+    tmpBuffer = new char[4096];
+    if(NULL == tmpBuffer) {
+       cerr << "ERROR: problems allocating memory" << endl;
+       cerr << endl;
+       return;
+    }
+
+    timeout.tv_sec = timeout.tv_usec = 0;
+
+    while(1) {
+       FD_ZERO(&fdMask);
+       FD_SET(serverSocket, &fdMask);
+
+#ifdef HPUX
+       select(serverSocket + 3, (int *)&fdMask, (int *)0, (int *)0, &timeout);
+#else
+       select(serverSocket + 3, &fdMask, (fd_set *)0, (fd_set *)0, &timeout);
+#endif
+
+       if(FD_ISSET(serverSocket, &fdMask)) {
+           size = 0;
+           memset(readBuffer, '\0', 4096);
+           memset(writeBuffer, '\0', 4096);
+           size = read(serverSocket, readBuffer, (sizeof(readBuffer) - 1));
+
+           if(size > 0) {
+               //- fix newlines/linefeeds
+               memset(buffer, '\0', 4096);
+               strncpy(buffer, readBuffer, size);
+               buffer[size] = '\0';
+
+               if(NULL != (strstr(buffer, "\n\r\\   "))) {
+                 strcpy(tmpBuffer, s_and_r(buffer, "\n\r\\   ", ""));
+                 memset(buffer, '\0', 4096);
+                 strcpy(buffer, tmpBuffer);
+                 size = strlen(buffer);
+               }
+               
+               if(NULL != (strstr(buffer, "\r\n\\   "))) {
+                 strcpy(tmpBuffer, s_and_r(buffer, "\r\n\\   ", ""));
+                 memset(buffer, '\0', 4096);
+                 strcpy(buffer, tmpBuffer);
+                 size = strlen(buffer);
+               }
+               
+               if(NULL != (strstr(buffer, "\n\r "))) {
+                 strcpy(tmpBuffer, s_and_r(buffer, "\n\r   ", ""));
+                 memset(buffer, '\0', 4096);
+                 strcpy(buffer, tmpBuffer);
+                 size = strlen(buffer);
+               }
+                   
+               if((FALSE == loggedInFlag) && 
+                  (NULL != strstr(buffer, "login:"))) {
+                   sprintf(writeBuffer, "%s\n", username);
+                   write(serverSocket, writeBuffer, strlen(writeBuffer));
+               } else if((FALSE == loggedInFlag) &&
+                         (NULL != strstr(buffer, "password:"))) {
+                 sprintf(writeBuffer,
+                         "%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s %d\n",
+                         password, 
+                         "set prompt %",
+                         "set pinform 1",
+                         "set ginform 1",
+                         "set mamer 1",
+                         "set shout 0",
+                         "set cshout 0",
+                         "set seek 0",
+                         "set open 0",
+                         "admin",
+                         "set tell 0",
+                         "+ channel ",
+                         channelNumber
+                         );
+                 write(serverSocket, writeBuffer, strlen(writeBuffer));
+                 FILE *theFile;
+                 char manager[NAMELEN], filename[128];
+                 sprintf(filename, "%s/managers", dataFilePath);
+                 if((theFile = fopen(filename, "r"))) {
+                   while(fscanf(theFile, "%s", manager) > 0) {
+                     XServerCom("qtell %s %s %s %s", 
+                                manager, "Howdy, ", username, " is here!\n");
+                   }
+                 }
+                 fclose(theFile);
+                 
+                 loggedInFlag = TRUE;
+               }
+               else if(TRUE == loggedInFlag) {
+                 i = 0;
+                 while(i < size) {
+                   while(('\r' == buffer[i]) ||
+                         ('\n' == buffer[i]) ||
+                         ('%' == buffer[i]) ||
+                         (' ' == buffer[i]))
+                     i++;                  
+                   j = 0;
+                   while(('\r' != buffer[i]) &&
+                         ('\n' != buffer[i]) &&
+                         (i < size))
+                     commandBuffer[j++] = buffer[i++];
+                   commandBuffer[j] = '\0';
+                   
+                   if(NULL != (p = strstr(commandBuffer, channelCmpStr)))
+                     HandleChannel(commandBuffer);
+                   else if(NULL != (p = strstr(commandBuffer, "tells you:")))
+                     HandleTell(commandBuffer);
+                   else if(NULL != (p = strstr(commandBuffer, "has connected")))
+                     HandleConnect(commandBuffer);
+                   else if(NULL != (p = strstr(commandBuffer, "has disconnected")))
+                     HandleDisconnect(commandBuffer);
+                   else if(0 == strncmp(commandBuffer, "{Game ", 6))
+                     HandleGame(commandBuffer);
+                   else if(0 == strncmp(commandBuffer, "*qtell ", 7))
+                     HandleQtell(commandBuffer);
+                   else if(0 == strncmp(commandBuffer, "*getgi ", 7))
+                     HandleGameInfo(commandBuffer);
+                   else if(0 == strncmp(commandBuffer, "*getpi ", 7))
+                     HandlePlayerInfo(commandBuffer);
+                   else {
+                     /*
+                     cout << "Unsupported: " << commandBuffer << endl;
+                     cout << endl;
+                     */
+                   }
+                   
+                   while(('\r' == buffer[i]) ||
+                         ('\n' == buffer[i]) ||
+                         ('%' == buffer[i]) ||
+                         (' ' == buffer[i]))
+                     i++;
+                 }
+               }
+           } else {
+             if((errno == EINTR) || (errno == EAGAIN) || (errno == EIO) ||
+                (errno == EBADF) || (errno == EINVAL) || (errno == EFAULT)) {
+               switch (errno) {
+               case EINTR:
+                 printf("Error = %s\n", "EINTR");
+                 break;
+               case EAGAIN:
+                 printf("Error = %s\n", "EAGAIN");
+                 break;
+               case EIO:
+                 printf("Error = %s\n", "EIO");
+                 break;
+               case EBADF:
+                 printf("Error = %s\n", "EBADF");
+                 break;
+               case EINVAL:
+                 printf("Error = %s\n", "EINVAL");
+                 break;
+               case EFAULT:
+                 printf("Error = %s\n", "EFAULT");
+                 break;
+               default:
+                 break;
+               }
+             }
+             break;
+           }
+       }
+       sleep(1);
+    } //- end while(1)
+    
+    if(NULL != buffer)
+      delete [] buffer;
+    
+    if(NULL != tmpBuffer)
+      delete [] tmpBuffer;
+    
+} //- End of ListenLoop
+
+//- Start of GivePlace ----------------------------
+int Mamer::GivePlace(int i, Tourney *t) {
+  TourneyPlayers *tp = NULL, *place = NULL;
+  User *u = NULL;
+  Player *opp = NULL;
+  LinkListIter<TourneyPlayers> playerIter(t->playerList);
+  float score=0.0;
+  int counter=0;
+  char placeName[7];
+
+  memset(placeName, '\0', 7);
+  switch(i) {
+  case 1:
+    strcpy(placeName, "First");
+    break;
+  case 2:
+    strcpy(placeName, "Second");
+    break;
+  case 3:
+    strcpy(placeName, "Third");
+    break;
+  default:
+    break;
+  }
+
+  XServerCom("%s %i %s %s %s%i %s ", "tell", channelNumber, "Tourney Results:", placeName, 
+            "place in tourney #", t->number, "goes to: ");
+
+  opp = t->GetSortPlayer(i);
+  place = t->GetPlayer(opp->name);
+  score = place->score;
+
+  while((tp = playerIter.Next())) {
+    if(tp->score == score) {
+      XServerCom("%s ", tp->name);
+      counter++;
+      u = FindUser(tp->name);
+      if(u == NULL) {
+       CheckUser(tp->name);
+       u = FindUser(tp->name);
+      }
+      //      if(NULL != u) 
+      u->AddStat(i);  // Adds a first/second/third place finish to everyone with the same score as the 1st
+    }
+  }
+  XServerCom("\n");
+
+  return counter;
+}
+
+//- Start of AnnounceTourneyEnd
+void Mamer::AnnounceTourneyEnd(Tourney *t) {
+  TourneyPlayers *tp = NULL;
+  int first=0, second=0, third=0;
+  int numberOfPlayers = 0;
+
+  t->EndTourney();
+  t->SortPlayers();
+  t->SetEndDate();
+  
+  LinkListIter<TourneyPlayers> playerIter(t->playerList);
+
+  while((tp = playerIter.Next())) { 
+    if((tp->activeFlag) && (strcasecmp(tp->name, "_BYE_") != 0))
+      numberOfPlayers++;
+  }
+
+  first = GivePlace(1, t);  //first = number of people tied for first
+
+  if(numberOfPlayers >= 5) {
+    if(first == 1)  { second = GivePlace(2, t); }
+    if(first == 2)  { third = GivePlace(3, t);  }
+    if(numberOfPlayers >= 7) {
+      if(second == 1) { third = GivePlace(3, t);  }
+    }
+  }
+}
+
+//- savePlayerData --------------------------------------------------------------
+void Mamer::savePlayerData(Tourney *t) {
+  LinkListIter<TourneyPlayers> playerIter(t->playerList);
+  TourneyPlayers *tp = NULL, *tmpOpp = NULL;
+  User *u = NULL, *manager=NULL;
+  Player *opp;
+  int w, d, l;
+  float r, tourn_expect=0.0, pre_expect=0.0, delta = 0.0;
+
+  manager = FindUser(t->manager);  // save the manager info
+  if(manager == NULL) {
+    manager = new User(userFilePath, t->manager);  // manager isn't online
+    manager->SetLast(time(0));               // so we have to load him/her
+    manager->AddManagedTourney();
+    manager->SavePlayer(userFilePath);
+    delete(manager);
+  } else {  // manager is online
+    manager->SetLast(time(0));
+    manager->AddManagedTourney();
+    manager->SavePlayer(userFilePath);
+  }
+
+  while((tp = playerIter.Next())) {
+    tourn_expect = 0.0;
+    u = FindUser(tp->name);
+    if(u == NULL) {
+      User *newUser = NULL;
+      newUser = new User(userFilePath, tp->name);
+      u = newUser;
+    }
+    if(debugLevel >= 5)
+      cout << "savePlayerData::" << tp->name << " " << u->name << endl;
+    r = u->GetRating();
+    w = u->GetWins();
+    l = u->GetLosses();
+    d = u->GetDraws();
+    pre_expect = ((float)w + (0.5 * (float)d)) / r;
+    
+    LinkListIter<Player> opponentIter(tp->opponentList);  // List of opponents this player has had
+    while((opp = opponentIter.Next())) { 
+      tmpOpp = t->GetPlayer(opp->name);   // need the player's information to do tourn_expect
+      delta = (float)(((tp->rating != 0) ? tp->rating : 1600) - 
+                     ((tmpOpp->rating != 0) ? tmpOpp->rating : 1600));  // difference in rating
+      tourn_expect = tourn_expect + (1 / (1+pow(10,(delta/400.0))));
+      u->AddStat(opp->floatValue); 
+    }
+    u->AddPlayedTourney();
+    if(tp->activeFlag) {   // If I didn't withdraw or get forfeited reduce my abuse points
+      u->AddAbuse(-1 * t->GetRound());  // This will be the # of rounds played because the tourney is DONE
+      XServerCom("%s %s %d%s", "tournset", tp->name, 0, "\n");
+    }
+    u->CalculateRating(tourn_expect, pre_expect);
+    u->SavePlayer(userFilePath);    
+  }
+} //- End of savePlayerData ------------------------------------------
+
+//- Shutdown --------------------------------------------------------------
+void Mamer::Shutdown(void) {
+  LinkListIter<User> userIter(userList);
+  User *u = NULL;
+  
+  while((u = userIter.Next())) {
+    //    u->SavePlayer(userFilePath);
+    userList.Delete(u);        
+  }
+  
+  write(serverSocket, "exit\n", 5);
+  close(serverSocket);
+  exit(0);
+} //- End of Shutdown
+
+//- Usage -----------------------------------------------------------------
+void Mamer::Usage(void) {
+    cerr << "Usage: mamer [-c channel] [-s server] [-n port number] " << endl;
+    cerr << "             [-d debug level] [-u users database filename] " 
+        << endl;
+    cerr << "             [-l log filename] [-a mamer account name] " << endl;
+    cerr << "             [-p mamer password] [-h help] " << endl;
+    cerr << endl;
+    cerr << "\t-h show usage information." << endl;
+    cerr << "\t-c sets which channel mamer should work on.\n\t   (default = "
+        << channelNumber << ")" << endl;
+    cerr << "\t-s sets the server hostname that mamer connects to.\n\t"
+        << "   (default = " << hostname << ")" << endl;
+    cerr << "\t-n sets the port number on the server to connect to.\n\t"
+        << "   (default = " << portNumber << ")" << endl;
+    cerr << "\t-a sets the username for the account to mamer logs in as.\n\t"
+        << "   (default = " << username << ")" << endl;
+    cerr << "\t-p sets the password for the mamer account.\n\t"
+        << "   (default = " << password << ")" << endl;
+    cerr << "\t-d sets the debugging level.  This determines how much of "
+        << "the\n\t   activity of mamer is written to the logs." << endl;
+    cerr << "\t-u set the location of the users database file.\n\t"
+         << "   (default = " << userFilePath << ")" << endl;
+    cerr << "\t-l sets the location of the log file.\n\t   (default = "
+        << logFilename << ")" << endl;
+    cerr << endl;
+} //- End of Usage
+
+//- LoadConfigurationFile -------------------------------------------------
+void Mamer::LoadConfigurationFile(void) {
+    struct stat statBuffer;
+    int length=0;
+
+    if(-1 != stat(configFilename, &statBuffer)) {
+       char    *buffer = NULL;
+       fstream theFile(configFilename, ios::in);
+       
+       buffer = new char[MAXPATHLEN + 80];
+       if(NULL == buffer)
+           return;
+
+       memset(buffer, '\0', MAXPATHLEN + 80);
+       
+       while(theFile.good()) {
+         theFile.getline(buffer, MAXPATHLEN + 80 - 1, '\n');
+         
+         if(buffer[0] == '#') continue;
+         length = strlen(buffer);
+         
+         if(length >= 4) {
+           if(0 == strncasecmp(buffer, "HOST", 4)) {
+             buffer += 4;
+             while(isspace(buffer[0])) buffer++;
+             
+             memset(hostname, '\0', MAXPATHLEN);
+             strncpy(hostname, buffer, MIN(length, MAXPATHLEN));
+           } else if(0 == strncasecmp(buffer, "DATA", 4)) {
+             buffer += 4;
+             while(isspace(buffer[0])) buffer++;
+             
+             memset(dataFilePath, '\0', MAXPATHLEN);
+             strncpy(dataFilePath, buffer, MIN(length, MAXPATHLEN));
+           } else if(0 == strncasecmp(buffer, "HOME", 4)) {
+             buffer += 4;
+             while(isspace(buffer[0])) buffer++;
+             
+             memset(homeFilePath, '\0', MAXPATHLEN);
+             strncpy(homeFilePath, buffer, MIN(length, MAXPATHLEN));
+           } else if(0 == strncasecmp(buffer, "HELP", 4)) {
+             buffer += 4;
+             while(isspace(buffer[0])) buffer++;
+             
+             memset(helpFilePath, '\0', MAXPATHLEN);
+             strncpy(helpFilePath, buffer, MIN(length, MAXPATHLEN));
+           } else if(0 == strncasecmp(buffer, "USER", 4)) {
+             buffer += 4;
+             while(isspace(buffer[0])) buffer++;
+             
+             memset(username, '\0', 80);
+             strncpy(username, buffer, MIN(length, 80));
+           } else if(0 == strncasecmp(buffer, "PASS", 4)) {
+             buffer += 4;
+             while(isspace(buffer[0])) buffer++;
+             
+             memset(password, '\0', 80);
+             strncpy(password, buffer, MIN(length, 80));
+           } else if(0 == strncasecmp(buffer, "PORT", 4)) {
+             buffer += 4;
+             while(isspace(buffer[0])) buffer++;
+             
+             portNumber = atoi(buffer);
+           } else if(0 == strncasecmp(buffer, "CHAN", 4)) {
+             buffer += 4;
+             while(isspace(buffer[0])) buffer++;
+             
+             channelNumber = atoi(buffer);
+           } else if(0 == strncasecmp(buffer, "DBUG", 4)) {
+             buffer += 4;
+             while(isspace(buffer[0])) buffer++;
+             
+             debugLevel = atoi(buffer);
+           }
+         }
+         if(length >= 3) {
+           if(0 == strncasecmp(buffer, "LOG", 3)) {
+             buffer += 3;
+             while(isspace(buffer[0])) buffer++;
+             
+             memset(logFilename, '\0', MAXPATHLEN);
+             strncpy(logFilename, buffer, MIN(length, MAXPATHLEN));
+           } else if((strlen(buffer) > 3) && (0 == strncasecmp(buffer, "UDB", 3))) {
+             buffer += 3;
+             while(isspace(buffer[0])) buffer++;
+             
+             memset(userFilePath, '\0', MAXPATHLEN);
+             strncpy(userFilePath, buffer, MIN(length, MAXPATHLEN));
+           }
+         }
+       } //- theFile.good()
+    }
+    else {
+       switch(errno) {
+        case EACCES:
+           cerr << "ERROR: permission denied for configuration file '" 
+                << configFilename << "' using compiled defaults." << endl;
+           cerr << endl;
+           break;
+        case ENOENT:
+           cerr << "WARNING: configuration file '" << configFilename
+                << "' doesn't exist, using " << endl;
+           cerr << "         compiled defaults." << endl;
+           cerr << endl;
+           break;
+       }
+    }
+
+} //- End of LoadConfigurationFile
+
+//- DumpConfiguration -----------------------------------------------------
+void Mamer::DumpConfiguration(void) {
+    cout << "Mamer Configuration" << endl;
+    cout << "-------------------" << endl;
+    cout << "Hostname : " << hostname << endl;
+    cout << "Port     : " << portNumber << endl;
+    cout << "Channel  : " << channelNumber << endl;
+    cout << endl;
+    cout << "Username : " << username << endl;
+    cout << "Password : " << password << endl;
+    cout << endl;
+    cout << "Home Path: " << homeFilePath << endl;
+    cout << "Data Path: " << dataFilePath << endl;
+    cout << "Help Path: " << helpFilePath << endl;
+    cout << "User File: " << userFilePath << endl;
+    cout << "Log File : " << logFilename << endl;
+    cout << endl;
+    cout << "Debug Lvl: " << debugLevel << endl;
+    cout << endl;
+
+} //- End of DumpConfiguration
+
+//- HandleQtell ------------------------------------------------------------
+int Mamer::HandleQtell(char *message) {
+  char name[NAMELEN];
+  int isOnline;  // Opposite of what is returned in qtell report
+  
+  sscanf(message, "*qtell %s %d*", name, &isOnline); 
+  isOnline = !isOnline;
+
+  User *u = NULL;
+  u = FindUser(name);
+
+  if(isOnline) {
+    if(NULL == u) {
+      CheckUser(name);
+    }
+  }
+    
+  return 1;
+}
+
+//- HandleTell ------------------------------------------------------------
+int Mamer::HandleTell(char *message) {
+    char *p = NULL, *q = NULL, *command = NULL, *tmpCom=NULL;
+    char user[32] = {'\0'};
+    int  i=0, pos = 0, tmp=0, len = 0, ret = 0, tellSize=12;  /* size of " tells you:" */
+
+    //- Parse apart tell message
+    //- <user> tells you: <mesg>
+    //- <user>(*) tells you: <mesg>
+    //- <user>(TM)(GM)(*)..... tells you: <mesg>
+    if((p = strstr(message, "(")) && (q = strstr(message, " tells you:")) && (strlen(p) > strlen(q))) {      
+      tmp = strlen(p) - strlen(q);       /* get the diff to add back in later */
+      pos = strlen(message) - strlen(p);
+      memset(user, '\0', 32);
+      strncpy(user, message, MIN(pos, 31));
+      pos += (tellSize + tmp);
+    } else {
+      p = strstr(message, " tells you:");
+      pos = strlen(message) - strlen(p);
+      memset(user, '\0', 32);
+      strncpy(user, message, MIN(pos, 31));
+      pos += tellSize;
+    }
+
+    CheckUser(user);
+
+    len = strlen(&(message[pos]));
+    command = new char[len + 1]; memset(command, '\0', (len + 1));
+    tmpCom = new char[len + 1];  memset(tmpCom, '\0', (len + 1));
+    if(NULL == command) {
+       cerr << "ERROR: problems allocating memory" << endl;
+       cerr << endl;
+       return(ret);
+    }
+    strncpy(command, &(message[pos]), len);
+    command[len] = '\0';
+    while((command[i] != '\0') && (command[i] != ' ')) tmpCom[i] = command[i++];
+    tmpCom[i] = '\0';
+
+    Command *comm = NULL;
+    comm = FindCommand(tmpCom, user);
+    if(comm == NULL) {
+      if(NULL != command)
+       delete [] command;
+      if(NULL != tmpCom)
+       delete [] tmpCom;
+      return 0;
+    }
+
+    if(10 <= debugLevel) {
+      cout << "Tell Msg: " << message << endl;
+      cout << "User is: " << user << " Command is: " << command<< "\n" << endl;
+    }
+    
+    if(ParseParams(comm, command) == COM_BADPARAMETERS) {
+      TellUser(comm, user);
+      if(NULL != command)
+       delete [] command;
+      if(NULL != tmpCom)
+       delete [] tmpCom;
+      return 0;
+    }
+
+    if(NULL != comm) {
+       User *u = NULL;
+       u = FindUser(user);
+       if(NULL == u) {
+         CheckUser(user);  // This should never happen because we did it above.
+         u = FindUser(user);
+         if(NULL == u)
+           abort();
+       }
+       if((u->GetManagerLevel()) >= (comm->GetManagerLevel())) {
+         ret = (this->*(comm->userFunction))(u, comm->params);
+         if(debugLevel >= 5)
+           cout << comm->GetCommandName() << " return value " << ret << endl;
+         if(((ret == 2) && (!(strcasecmp(comm->GetCommandName(), "setres")))) ||
+            ((ret == 1) && (!(strcasecmp(comm->GetCommandName(), "withdraw")))) ||
+            ((ret == 1) && (!(strcasecmp(comm->GetCommandName(), "forfeit"))))) {
+           NextRound();
+         } else if ((ret != 0) && (!(strcasecmp(comm->GetCommandName(), "setmanagerlevel")))) {
+           AdjustManagerList(ret, comm->params[0].val.word);
+         }
+       } else {
+         TellUser(NoPermissions, user);
+       }
+    }
+
+    if(NULL != command)
+       delete [] command;
+    if(NULL != tmpCom)
+       delete [] tmpCom;
+
+    return(ret);
+} //- End of HandleTell
+
+//- HandleChannel ------------------------------------------------------------
+int Mamer::HandleChannel(char *message) {
+    char *q, *p = NULL, channel[8], mess[1024];
+    char user[NAMELEN] = {'\0'};
+    int  pos = 0, index=0;
+    char *hilist[] = {"hi ", "hello ", "howdy ", "aloha ", "hola ", "bonjour ", "tag ", NULL };
+    char *thanklist[] = {"thanks ", "thank you ", "thanx ", "gracias ", NULL };
+    char *byelist[] = {"bye ", "later ", "caio ", "adios ", "hasta la vista ", NULL };
+    char *swearlist[] = {"fuck", "shit", "god damn", "asshole", "cunt", "cock", "bullshit", "nigger", "asswipe", NULL };
+
+    //- Parse apart channel message
+    //- <user>(1): <mesg>
+    //- <user>(*)(24): <mesg>
+    //- <user>(TM)(49): <mesg>
+    if((p = strchr(message, '('))) {
+      pos = strlen(message) - strlen(p);
+      memset(user, '\0', NAMELEN);
+      strncpy(user, message, MIN(pos, NAMELEN-1));
+    } else
+      return 0;
+
+    if(0 == strcasecmp(user, username)) return 1;
+    CheckUser(user);
+    p = strchr(message, ':');
+    while(*p != '(') p--;
+    q = channel; p++;
+    while(*p != ')') { *q++ = *p++; }
+    *q = '\0';
+
+    p = strchr(message, ':'); p++;
+    q = mess;
+    while(*p != '\0') { *q++ = *p++; }
+    *q = '\0';
+
+    if(debugLevel >= 5)
+      printf("%s %s %s\n", user, channel, mess);
+  
+    mess[strlen(mess)] = '\0';
+    stolower(mess);
+
+    pos = 0;
+    index=0;
+    while (swearlist[index] != NULL) {
+      if (strstr(mess, swearlist[index])) {
+       printf("ABUSE - %s %s\n", user, mess);
+       XServerCom("%s %s\n", "+ c49muzzle", user);
+       pos = 1;
+      }
+      index++;
+    }
+    if ((strstr(mess, username)) && (pos == 0)) {
+      pos = 0;
+      index = 0;
+      while (hilist[index] != NULL) {
+       if (strstr(mess, hilist[index])) {
+         XServerCom("%s %s Hi %s :-)\n", "tell", channel, user);
+         pos = 1;
+       }
+       index++;
+      }
+      index = 0;
+      if(pos == 0)
+       while (thanklist[index] != NULL) {
+         if (strstr(mess, thanklist[index])) {
+           XServerCom("%s %s You're welcome %s!\n", "tell", channel, user);
+           pos = 1;
+         }
+         index++;
+       }
+      index = 0;
+      if(pos == 0) 
+       while (byelist[index] != NULL) {
+         if (strstr(mess, byelist[index])) {
+           XServerCom("%s %s Sad to see you going, %s :(\n", "tell", channel, user);
+           pos = 1;
+         }
+         index++;
+       }
+    }
+    if (strstr(mess, "tourn"))
+      XServerCom("%s %s %s %s %s\n", 
+                "tell", channel, "To see a list of tourneys type: tell", username, "lt");
+
+    return(1);
+} //- End of HandleChannel
+
+//- HandleConnect ------------------------------------------------------------
+int Mamer::HandleConnect(char *message) {
+    char *p = NULL, *reg = NULL, user[80] = {'\0'}, output[256] = {'\0'}, tmp[32] = {'\0'};
+    Tourney *t = NULL;
+    TourneyPlayers *tp = NULL;
+    LinkListIter<Tourney> tourneyIter(tourneyList);
+    int announceConnect = 0;
+
+    //- Parse apart connect message
+    //- [<user> (R: 123.123.123.123) has connected.]
+    if(5 <= debugLevel)
+      cout << "\nConnect Msg: " << message << endl;
+
+    if((p = strstr(message, " (U:"))) { return(1); }
+    if(!(p = strstr(message, " (R: "))) { return(1); }
+    strncpy(user, &(message[1]), MIN(strlen(message) - strlen(p) - 1, 79));
+    reg = strstr(message, " (R: ");
+    if(reg) {  //If this is a registered user
+      CheckUser(user);
+      while((t = tourneyIter.Next())) {
+       if((tp = t->GetPlayer(user))) {
+         tp->location = ONLINE;
+         announceConnect = 1;
+       }
+      }
+      if(announceConnect) {  // If the player arriving is in a tourney tell us he is arriving.
+       announceConnect = 0;
+       sprintf(output, "%s %d %s %s", "tell", channelNumber, user, "has connected.  Entered in tourney(s):");
+       tourneyIter.Reset();
+       while((t = tourneyIter.Next())) {
+         if(t->GetStatus() != DONE) {
+           if((tp = t->GetPlayer(user))) {
+             sprintf(tmp, " %d", t->number);
+             strcat(output, tmp);
+             announceConnect = 1;
+           }
+         }
+       }
+       if(announceConnect) {
+         XServerCom("%s %s %d%s", "tournset", user, 1, "\n");
+         XServerCom("%s%s", output, "\n");
+       }
+      }
+    } else {
+      if(15 <= debugLevel) {
+       cout << "\nConnect Msg: " << message << endl;
+       cout << "Ignoring User: " << user << endl;
+      }
+    }
+    return(1);
+} //- End of HandleConnect
+
+//- HandleDisconnect --------------------------------------------------------
+int Mamer::HandleDisconnect(char *message) {
+  char *p = NULL, user[80] = {'\0'}, output[256] = {'\0'}, tmp[32] = {'\0'};
+  Tourney *t = NULL;
+  TourneyPlayers *tp = NULL;
+  LinkListIter<Tourney> tourneyIter(tourneyList);
+  int announceDisconnect = 0;
+  
+  //- Parse apart disconnect message
+  //- [<user> has disconnected.]
+  p = strstr(message, " has disconnected.");
+  strncpy(user, &(message[1]), MIN(strlen(message) - strlen(p) - 1, 79));
+  
+  if(10 <= debugLevel) {
+    cout << "Disconnect Msg: " << message << endl;
+    cout << "User is: " << user << "\n" << endl;
+  }
+  
+  LinkListIter<User> userIter(userList);
+  User *u = NULL;  
+  while((u = userIter.Next()))
+    if(1 == u->IsUser(user))
+      break;
+
+  if(NULL != u) {
+    tourneyIter.Reset();
+    while((t = tourneyIter.Next())) {
+      if((tp = t->GetPlayer(user))) {
+       tp->location = GONE;
+       announceDisconnect = 1;
+      }
+    }
+    if(announceDisconnect) {  // If the player arriving is in a tourney tell us he is arriving.
+      announceDisconnect = 0;
+      sprintf(output, "%s %d %s %s", "tell", channelNumber, user, "has disconnected.  Entered in tourney(s):");
+      tourneyIter.Reset();
+      while((t = tourneyIter.Next())) {
+       if(t->GetStatus() != DONE) {
+         if((tp = t->GetPlayer(user))) {
+           sprintf(tmp, " %d", t->number);
+           strcat(output, tmp);
+           announceDisconnect = 1;
+         }
+       }
+      }
+      if(announceDisconnect) {
+       XServerCom("%s %s %d%s", "tournset", user, 1, "\n");
+       XServerCom("%s%s", output, "\n");
+      }
+    }
+    u->SavePlayer(userFilePath);
+    userList.Delete(u);
+  }
+  
+  return(1);
+} //- End of HandleDisconnect
+
+//- AdjustManagerList ----------------------
+void Mamer::AdjustManagerList(int value, char *name) {
+  Storage *tmp=NULL, *newName=NULL;
+  LinkListIter<Storage> managerIter(storageList);
+  FILE *theFile=NULL;
+  char filename[128], manager[NAMELEN];
+  int added=0, needToAdd=1;
+
+  memset(filename, '\0', 128);
+  sprintf(filename, "%s/managers", dataFilePath);
+  theFile = fopen(filename, "r");
+  if(theFile == NULL) return;
+
+  memset(manager, '\0', NAMELEN);
+  while(fscanf(theFile, "%s", manager) > 0) {  // build the temporary list
+    tmp = new Storage(manager, 0);
+    storageList.Append(tmp);
+    tmp = NULL;
+    memset(manager, '\0', NAMELEN);
+  }
+  fclose(theFile);
+
+  switch(value) {
+  case -1:
+    managerIter.Reset();  // remove a manager from the list that is printed later
+    while((tmp = managerIter.Next()))
+      if(strlen(tmp->name) == strlen(name)) 
+       if(0 == (strcasecmp(tmp->name, name)))
+         storageList.Delete(tmp);
+    XServerCom("%s %s\n", "- mamermgr", name);
+    break;
+  case 1:
+    newName = new Storage(name, 0);
+    added = 0;   // Add a user to the manager list that is later printed
+    needToAdd = 1;
+    managerIter.Reset();  // Got through the list see if the name is there
+    while((tmp = managerIter.Next()))
+      if(strlen(tmp->name) == strlen(newName->name))
+       if(0 == strcasecmp(tmp->name, newName->name)) { 
+         needToAdd = 0; 
+         break; 
+       }
+    if(needToAdd) {        // If its not there we have to add it
+      managerIter.Reset();
+      while((tmp = managerIter.Next()))               // if the name in the list is > new name
+       if((strncasecmp(tmp->name, newName->name, MIN(strlen(tmp->name), strlen(newName->name)))) > 0) { 
+         added = 1;
+         storageList.Insert(tmp, newName);         // insert the new name before the list name
+         break;
+       }
+      if(!added) storageList.Append(newName);
+      XServerCom("%s %s\n", "+ mamermgr", name);
+    }
+    break;
+  default:
+    break;
+  }
+  theFile = fopen(filename, "w");
+  if(!theFile) return;
+  managerIter.Reset();    // Lets write the new manager file
+  while((tmp = managerIter.Next())) {
+    fprintf(theFile, "%s\n", tmp->name);
+    storageList.Delete(tmp);
+  }
+  fclose(theFile);
+  //  if(newName != NULL) delete(newName);
+}
+
+//- UserIsLoaded --------------------------
+int Mamer::UserIsLoaded(char *uname) {
+  User *u = NULL;
+  LinkListIter<User> userIter(userList);
+  
+  while((u = userIter.Next())) {
+    if(0 == strcasecmp(u->name, uname))
+      return 1;
+  }
+  
+  return 0;
+}//- end UserIsLoaded ------------------------------------------------------
+
+/* this function checks if the user is loaded and if not loads the user */
+//- CheckUser ---------------------------------------------------------------
+void Mamer::CheckUser(char *user) {
+  if(!UserIsLoaded(user)) {
+    if(debugLevel >= 5) 
+      cout << "CheckUser - Adding User:" << user << ":" << endl;
+
+    User *newUser = NULL;
+    newUser = new User(userFilePath, user);
+    if(NULL != newUser)
+      userList.Append(newUser);
+  }
+}//- end of CheckUser -----------------------------------------------------
+
+//- HandleGame ------------------------------------------------------------
+int Mamer::HandleGame(char *message) {
+  char *p, *q, user1[NAMELEN], user2[NAMELEN], action[256], result[8], tmp[256];
+  int gameNumber, clocktime, inc, rated, isPrivate, result_code, moreGames=1, moreRounds=1, madeMoreGames=0, gameType=-2;
+  Tourney *t = NULL;
+  Game *g = NULL;
+  TourneyPlayers *tp = NULL;
+
+  // {Game 8 (Blammor vs. Havard) Blammor resigns} 0-1
+
+  sscanf(message, "{Game %d (%s vs. %s", &gameNumber, user1, user2);
+  user2[strlen(user2)-1] = '\0';
+
+  if((p = strchr(message, ')'))) {
+    q = action; p++; p++;
+    while((*p != '\0') && (*p != '}')) { *q++ = *p++; }
+    *q = '\0';
+  } else { return 0; }
+
+  memset(result, '\0', 8);
+  if((p = strchr(message, '}')) && 
+     ((strstr(message, ") Creating ") == NULL) && (strstr(message, ") Continuing ") == NULL))) {
+    //    sscanf(p, "} %s [%d %d %d %d", result, &clocktime, &inc, &rated, &isPrivate);
+    sscanf(p, "} %s [%d %d %d %d %d", result, &clocktime, &inc, &rated, &isPrivate, &gameType);
+    
+    if(!strcmp(result, "1-0")) { result_code = 1;
+    } else if(!strcmp(result, "0-1")) { result_code = 0;
+    } else if(!strcmp(result, "1/2-1/2")) { result_code = 2;
+    } else { result_code = -1; }
+    
+    if(debugLevel >= 5)
+      //      printf("\nGame #%d %s vs. %s  action=%s  result=%s time=%d inc=%d rated=%d private=%d\n", 
+      //            gameNumber, user1, user2, action, result, clocktime, inc, rated, isPrivate);
+      printf("\nGame #%d %s vs. %s  action=%s  result=%s time=%d inc=%d rated=%d private=%d gameType=%d\n", 
+            gameNumber, user1, user2, action, result, clocktime, inc, rated, isPrivate, gameType);
+    
+    LinkListIter<Tourney> tourneyIter(tourneyList);
+    tourneyIter.Reset();
+    while((t = tourneyIter.Next())) {
+      if(t->GetStatus() != CLOSED) continue;
+      LinkListIter<Game> gameIter(t->gameList);
+      gameIter.Reset();
+      while((g = gameIter.Next())) {
+       if(g->IsGame(user1, user2, clocktime, inc, rated, 'r')) { //- There is room to add isPrivate later
+         XServerCom("%s %i %s %s %s %s%i %s %s %s\n", "tell", channelNumber, g->whiteName, "vs.", g->blackName,
+                    "a game in tourney #", t->number, "just ended. ", action, result);
+         if(strcmp(result, "*") == 0) {
+           g->gameNumber = -1;
+           continue;
+         }
+         moreGames = t->SetGameResult(user1, user2, result_code);  //- SetGameResult deletes the game for us
+         if(moreGames == 2) {
+           moreRounds = (t->GetRoundsRemaining());
+           LinkListIter<TourneyPlayers> playerIter(t->playerList);
+           playerIter.Reset();
+           if(moreRounds) {
+             madeMoreGames = t->MakeAssignments();
+             while((tp = playerIter.Next())) {
+               sprintf(tmp, "%s tells you: listplayers %d\n", tp->name, t->number);
+               HandleTell(tmp);
+             }
+             if(madeMoreGames) {
+               t->TellThemWhoTheyPlay();
+             } else {          // tourney over!
+               AnnounceTourneyEnd(t);
+               savePlayerData(t);
+             }
+           } else {          // tourney over!
+             /*
+             while((tp = playerIter.Next())) {
+               sprintf(tmp, "%s tells you: listplayers %d\n", tp->name, t->number);
+               HandleTell(tmp);
+             }
+             */
+             AnnounceTourneyEnd(t);
+             savePlayerData(t);
+           }
+         }
+         break;
+       }
+      }
+    }
+  } else { 
+    XServerCom("%s %s %s", "getgi", user1, "\n"); 
+  }
+  return(1);
+} //- End of HandleGame
+
+//- HandleGameInfo ----------------------------------------------------------
+int Mamer::HandleGameInfo(char *message) {
+  char white[NAMELEN], black[NAMELEN], player[NAMELEN];
+  int gameNumber, gameTime, inc, rated, isPrivate;
+  Tourney *t=NULL;
+  Game *g=NULL;
+  
+  sscanf(message, "*getgi %s %s %s %d %d %d %d %d*", player, white, black,
+        &gameNumber, &gameTime, &inc, &rated, &isPrivate);
+
+  gameTime = gameTime / 600;  // Values for getgi are in micro and nano seconds
+  inc = inc / 10;
+
+  LinkListIter<Tourney> tourneyIter(tourneyList);
+  tourneyIter.Reset();
+  while((t = tourneyIter.Next())) {
+    if(t->GetStatus() != CLOSED) continue;
+    LinkListIter<Game> gameIter(t->gameList);
+    gameIter.Reset();
+    while((g = gameIter.Next())) {
+      if(g->IsGame(white, black, gameTime, inc, rated, 'r')) { //- There is room to add isPrivate later
+       if(g->gameNumber < 0){
+         XServerCom("%s %i %s %s %s %s%i %s\n", "tell", channelNumber, white, "vs.", black, 
+                    "a game in tourney #", t->number, "just started.");
+       } else {
+         XServerCom("%s %i %s %s %s %s%i %s\n", "tell", channelNumber, white, "vs.", black, 
+                    "a game in tourney #", t->number, "just Restarted.");
+       }
+       g->gameNumber = gameNumber;
+      }
+    }
+  }
+  return(1);
+} //- End of HandleGameInfo
+
+//- HandlePlayerInfo --------------------------------------------------------
+int Mamer::HandlePlayerInfo(char *message) {
+  char player[NAMELEN];
+  int ratings[6], return_from_AddPlayer, tourneyNumber;
+  Tourney *t = NULL;
+  Player *p = NULL;
+
+  sscanf(message, "*getpi %s %d %d %d %d %d %d*",    // Scan in the info
+        player, &ratings[0], &ratings[2], &ratings[3], &ratings[1], &ratings[4], &ratings[5]);
+  
+  if(debugLevel >=15)
+    printf("Get Player Info: %s blitz=%d stand=%d light=%d wild=%d bug=%d suicide=%d\n",
+          player, ratings[2], ratings[3], ratings[1], ratings[0], ratings[4], ratings[5]);
+
+  p = FindPending(player);
+
+  if(p != NULL) {
+    tourneyNumber = p->value;       // find out which tourney we want
+    t = FindTourney(tourneyNumber); // Get the tourney.  If its in the list it should be valid
+  } else {
+    return 0;
+  } //Check for valid tourney is done in CommandEntry::JoinTourney
+
+  return_from_AddPlayer = t->AddPlayer(player, ratings[t->GetVariant()], 0.0);
+  TellUser(JoinedTourney, player, return_from_AddPlayer);
+  if(return_from_AddPlayer == 1)
+    XServerCom("%s %s %d%s", "tournset", player, 1, "\n");
+  pendingList.Delete(p);   //This is safe cause to get here we had to find a Player p
+
+  return 1;
+} //- End of HandlePlayerInfo
+
+//- FindPending ---------------------------------------------------------------
+Player *Mamer::FindPending(char *user) {
+    Player *p = NULL;
+    LinkListIter<Player> pendingIter(pendingList);
+
+    while((p = pendingIter.Next()))
+        if(1 == p->IsPlayer(user))
+            break;
+
+    return(p);
+} //- End of FindPending
+
+//- FindUser ---------------------------------------------------------------
+User *Mamer::FindUser(char *user) {
+    User *u = NULL;
+    LinkListIter<User> userIter(userList);
+
+    //    printf("FindUser: %18s\n", user);
+
+    while((u = userIter.Next()))
+       if(1 == u->IsUser(user))
+           break;
+
+    return(u);
+} //- End of FindUser
+
+//- FindTourney ------------------------------------------------------------
+Tourney *Mamer::FindTourney(int tourn) {
+    Tourney *t = NULL;
+    LinkListIter<Tourney> tourneyIter(tourneyList);
+
+    while((t = tourneyIter.Next())) {
+       if(1 == t->IsTourney(tourn))
+           break;
+    }
+    return(t);
+} //- End of FindUser
+
+//- FindCommand ---------------------------------------------------------------
+Command *Mamer::FindCommand(char *comm, char *user) {
+    Command *c = NULL, *cnull=NULL;
+    LinkListIter<Command> commIter(commandList);
+    int commandsFound=0;
+    char* output = NULL;
+
+    output = new char[MAX_LINE_SIZE];
+    memset(output, '\0', MAX_LINE_SIZE);
+    commIter.Reset();
+    while((c = commIter.Next())) {
+      if(c->IsCommand(comm)) {
+       commandsFound++;
+       if((int)(strlen(output) + strlen(c->GetCommandName())) < (MAX_LINE_SIZE - 1))
+         sprintf(output, "%s %s", output, c->GetCommandName());
+      }
+    }
+    output[strlen(output)] = '\0';
+
+    commIter.Reset();
+    while((c = commIter.Next())) 
+      if(1 == c->IsCommand(comm))
+       break;
+
+    switch (commandsFound) {
+    case 0:
+      TellUser(BadCommand, user);
+      return(cnull);
+    case 1:
+      return(c);
+    default:
+      TellUser(MultiCommand, user, output);
+      return(cnull);
+    }
+} //- End of FindUser
+
+/*
+  Parameter string format
+  w - a word 
+  o - an optional word 
+  d - integer
+  p - optional integer
+  i - word or integer
+  n - optional word or integer
+  s - string to end
+  t - optional string to end
+
+  If the parameter option is given in lower case then the parameter is 
+  converted to lower case before being passsed to the function. If it is
+  in upper case, then the parameter is passed as typed.
+
+  Calling these Appends adds commands to the link list.  They are called with:
+   1)   the text command Mamer should look for
+   2)  an alias or substitute for that text
+   3)  the manager level one needs to be to execute this command
+   4)  a BRIEF description of the command's function
+   5)  the parameter types for each parameter (see comments above)
+   6)  what code to use when telling the user they did something wrong (see TellUser)
+   7)  and the function pointer to the CommandEntry.cc code that is this command */
+
+//- BuildCommandList ---------------------------------------------------------
+void Mamer::BuildCommandList(void) {
+    commandList.Append(new Command("addchaos", "ac", MANAGER, "Adds (or subs) chaos points.",
+                                  "wp", (USERFP)&Mamer::AddAbuse));
+
+    commandList.Append(new Command("announce", "ann", DIRECTOR, "Announce the tournament to the working channel.",
+                                  "d", (USERFP)&Mamer::AnnounceTourney));
+
+    commandList.Append(new Command("addtotourney", "att", VICE, "Add a user to a tourney.", 
+                                  "Wd", (USERFP)&Mamer::AddToTourney));
+
+    commandList.Append(new Command("create", "cr", DIRECTOR, "Creates a new tournament.",
+                                  "", (USERFP)&Mamer::CreateTourney));
+
+    commandList.Append(new Command("close", "cl", DIRECTOR, "Closes and starts a tournament.",
+                                  "d", (USERFP)&Mamer::CloseTourney));
+
+    commandList.Append(new Command("delete", "del", DIRECTOR, "Deletes a tournament.",
+                                  "d", (USERFP)&Mamer::DeleteTourney));
+
+    commandList.Append(new Command("finger", "fi", USER, "Displays the stats for a user.",
+                                  "O", (USERFP)&Mamer::FingerUser));
+
+    commandList.Append(new Command("forfeit", "fo", DIRECTOR, "Remove a user from a tourney.", 
+                                  "wd", (USERFP)&Mamer::RemoveFromTourney));
+
+    commandList.Append(new Command("join", "j", USER, "Request to enter a tourney.", 
+                                  "d", (USERFP)&Mamer::JoinTourney));
+
+    commandList.Append(new Command("keep", "k", MANAGER, "Keep a tourney in memory.", 
+                                  "di", (USERFP)&Mamer::KeepTourney));
+
+    commandList.Append(new Command("listmanagers", "lm", USER, "Displays the Managers list.",
+                                  "", (USERFP)&Mamer::ListManagers));
+
+    commandList.Append(new Command("listtourneys", "lt", USER, "Displays the tournament list.",
+                                  "", (USERFP)&Mamer::ListTourneys));
+
+    commandList.Append(new Command("listtourneyvars", "vars", USER, "Displays the tournament variables.",
+                                  "d", (USERFP)&Mamer::ListTourneyVars));
+
+    commandList.Append(new Command("listtourneygames", "games", USER, "Displays the tournament games.",
+                                  "d", (USERFP)&Mamer::ListTourneyGames));
+
+    commandList.Append(new Command("listplayers", "lp", USER, "Displays the players in the tourney.",
+                                  "d", (USERFP)&Mamer::ListTourneyPlayers));
+
+    commandList.Append(new Command("listrank", "rank", USER, "Displays player rank.",
+                                  "n", (USERFP)&Mamer::ListRank));
+
+    commandList.Append(new Command("loadedusers", "lu", MANAGER, "Displays the loaded users.",
+                                  "", (USERFP)&Mamer::LoadedUsers));
+
+    commandList.Append(new Command("messman", "mm", VICE, "Message all of the Managers.",
+                                  "s", (USERFP)&Mamer::MessageManagers));
+
+    commandList.Append(new Command("open", "ot", DIRECTOR, "Opens the tournament to players.",
+                                  "d", (USERFP)&Mamer::OpenTourney));
+
+    commandList.Append(new Command("setcommandlevel", "setcl", VICE, "Set the level required to execute a command.",
+                                  "wd", (USERFP)&Mamer::SetCommandLevel));
+
+    commandList.Append(new Command("setinfo", "si", VICE, "Set a user's finger info.",
+                                  "Wddddddd", (USERFP)&Mamer::SetInfo));
+
+    commandList.Append(new Command("setmanagerlevel", "sml", VICE, "Sets manager's level.",
+                                  "Wd", (USERFP)&Mamer::SetManagerLevel));
+
+    commandList.Append(new Command("setres", "sr", DIRECTOR, "Sets the result of a game.",
+                                  "dWWi", (USERFP)&Mamer::SetResult));
+
+    commandList.Append(new Command("setstat", "ss", VICE, "Sets a specific finger stat.",
+                                  "Wwd", (USERFP)&Mamer::SetStat));
+
+    commandList.Append(new Command("settourneyvar", "stv", DIRECTOR, "Sets a Tourney's Variables.",
+                                  "dwi", (USERFP)&Mamer::SetTourneyVariable));
+
+    commandList.Append(new Command("showcommands", "sc", USER, "List commands and descripts.",
+                                  "o", (USERFP)&Mamer::ShowCommands));
+
+    commandList.Append(new Command("showhelpfile", "shf", USER, "Shows a help file.",
+                                  "o", (USERFP)&Mamer::ShowHelp));
+
+    commandList.Append(new Command("help", "help", USER, "Shows a help file.",
+                                  "o", (USERFP)&Mamer::ShowHelp));
+
+    commandList.Append(new Command("shutdown", "sd", VICE, "Shuts down Mamer.",
+                                  "", (USERFP)&Mamer::Shutdown));
+
+    commandList.Append(new Command("who", "who", USER, "Displays the tournament games.",
+                                  "d", (USERFP)&Mamer::ListTourneyPlayers));
+
+    commandList.Append(new Command("withdraw", "with", USER, "Remove yourself from a tourney.", 
+                                  "d", (USERFP)&Mamer::RemoveFromTourney));
+
+} //- End of BuildCommandList
+
+//- NextRound -------------------------
+void Mamer::NextRound() {
+  int moreGames=0, moreRounds=1, madeMoreGames=0;
+  Tourney *t = NULL;
+  Game *g = NULL;
+  
+  LinkListIter<Tourney> tourneyIter(tourneyList);
+  tourneyIter.Reset();
+  while((t = tourneyIter.Next())) {
+    if(t->GetStatus() != CLOSED) continue;
+    moreRounds = (t->GetRoundsRemaining());
+    moreGames = 0;
+    LinkListIter<Game> gameIter(t->gameList);
+    gameIter.Reset();
+    while((g = gameIter.Next())) moreGames++;
+
+    if(moreGames == 0) {
+      if(debugLevel >= 10)
+       cout << "No more games!  Next Round Please!  From Next Round" << endl;
+      cerr << "No more games!  Next Round Please!  From Next Round" << endl;
+      if(moreRounds) {
+       madeMoreGames = t->MakeAssignments();
+       if(madeMoreGames) 
+         t->TellThemWhoTheyPlay();
+       else {    // tourney over!
+         cerr << "Coulnd't make any more games.  End of Tourney.  From Next Round" << endl;
+         AnnounceTourneyEnd(t);
+         savePlayerData(t);
+       }
+      } else {                 // tourney over!
+       cerr << "No more rounds.  End of Tourney.  From Next Round" << endl;
+       AnnounceTourneyEnd(t);
+       savePlayerData(t);
+      }
+    }
+  }
+} //- End of NextRound
+
+//- XServerCom ---------------------------------------------
+int Mamer::XServerCom(char *fmt, ...)
+{
+  va_list argptr;
+  char buffer[1024];
+  int count;
+
+  va_start(argptr, fmt);
+  count = vsprintf(buffer, fmt, argptr);
+  write(serverSocket, buffer, strlen(buffer));
+  va_end(argptr);
+
+  /* returns number of elements written */
+  return (count);
+}
+//- End of XServerCom
+
+//- TellUser ------------------------------------------------
+void Mamer::TellUser(reasons reason, char *name) {
+  switch (reason) {
+  case NoPermissions:
+    XServerCom("qtell %s %s notes: Sorry you do not have permission to do that.\n", name, username);
+    break;
+  case BadCommand:
+    XServerCom("qtell %s %s notes: Command not found.\n", name, username);
+    break;
+  default:
+    break;
+  }
+}//- End of TellUser
+
+//- TellUser ------------------------------------------------
+void Mamer::TellUser(reasons reason, char *name, int number) {
+  switch (reason) {
+  case JoinedTourney:
+    switch (number) {
+    case 0:
+      XServerCom("qtell %s %s notes: %s\n", name, username, 
+                "Can not join\\nYour rating does not fit into current limits. <check tourney vars>");  
+      break;
+    case 1:
+      XServerCom("qtell %s %s notes: %s\n", name, username, "You joined the tournament.");  
+      break;
+    case 2:
+      XServerCom("qtell %s %s notes: %s\n", name, username, "You are already in this tourney.");
+      break;
+    case 3:
+      XServerCom("qtell %s %s notes: %s\n", name, username, "You can not join.  Tourney is not open.");  
+      break;
+    default:
+      break;
+    }
+    break;
+  case NotEnoughPlayers:
+    XServerCom("qtell %s %s notes: Tourney#%d %s\n", name, username, number, "does not have enough players.");
+    break;
+  case NoPlayers:
+    XServerCom("qtell %s %s notes: Tourney#%d %s\n", name, username, number, "has no players.");
+    break;
+  case WillKeepTourney:
+    XServerCom("qtell %s %s notes: Tourney#%d %s\n", name, username, number, "will be kept.");
+    break;
+  case NotKeepTourney:
+    XServerCom("qtell %s %s notes: Tourney#%d %s\n", name, username, number, "will not be kept.");
+    break;
+  case TourneyNotFound:
+    XServerCom("qtell %s %s notes: %s%d %s\n", name, username, "Tourney #", number, "not found.");
+    break;
+  case NotFound:
+    XServerCom("qtell %s %s notes: %s%d\n", name, username, "Player not found in tourney #", number);
+    break;
+  case GameResultNotFound:
+    XServerCom("qtell %s %s notes: %s%d\n", name, username, "Can not set result to ", number);
+    break;
+  case NoPermissions:
+    XServerCom("qtell %s %s notes: You don't have change permissions for tourney #%d.\n", name, username, number);
+    break;
+  case TourneyNotNew:
+    XServerCom("qtell %s %s notes: %s  %s%d %s\n", name, username, "Can not do that right now.", 
+              "Tourney #", number, "is not new.");
+    break;
+  case TourneyNotOpen:
+    XServerCom("qtell %s %s notes: %s  %s%d %s\n", name, username, "Can not do that right now.", 
+              "Tourney #", number, "is not open.");
+    break;
+  case TourneyNotClosed:
+    XServerCom("qtell %s %s notes: %s  %s%d %s\n", name, username, "Can not do that right now.", 
+              "Tourney #", number, "is not closed.");
+    break;
+  case TourneyDone:
+    XServerCom("qtell %s %s notes: %s  %s%d %s\n", name, username, "Can not do that anymore.", 
+              "Tourney #", number, "is done.");
+    break;
+  case TourneyClosed:
+    XServerCom("qtell %s %s notes: %s  %s%d %s\n", name, username, "Can not do that anymore.", 
+              "Tourney #", number, "is closed.");
+    break;
+  case TourneyDeleted:
+    XServerCom("qtell %s %s Notes: %s %s%d %s\n", name, username, "\\n", "Tourney #",
+              number, " has been deleted.");
+    break;    
+  default:
+    break;
+  }
+}//- End of TellUser
+
+//- TellUser ------------------------------------------------
+void Mamer::TellUser(Command *comm, char *name) {
+  char line[512];
+  int i, length=strlen(comm->parameterList);
+
+  sprintf(line, "qtell %s %s notes: Usage: %s ", name, username, comm->GetCommandName());
+
+  for(i=0; i<length; i++) {
+    switch (comm->parameterList[i]) {
+    case 'w':
+      strcat(line, "<word> ");
+      break;
+    case 'o':
+      strcat(line, "<optional word> ");
+      break;
+    case 'd':
+      strcat(line, "<integer> ");
+      break;
+    case 'p':
+      strcat(line, "<optional int> ");
+      break;
+    case 'i':
+      strcat(line, "<word or int> ");
+      break;
+    case 'n':
+      strcat(line, "<optional word or int> ");
+      break;
+    case 's':
+      strcat(line, "<string> ");
+      break;
+    case 't':
+      strcat(line, "<optional string> ");
+      break;
+    default:
+      break;
+    }
+  }
+  strcat(line, "\n");
+  write(serverSocket, line, strlen(line));
+}//- End of TellUser
+
+//- TellUser ------------------------------------------------
+void Mamer::TellUser(reasons reason, char *name, char *request) {
+  switch (reason) {
+  case NotFound:
+    XServerCom("qtell %s %s notes: Sorry %s is not found.\n", name, username, request);
+    break;
+  case GenericTell:
+    XServerCom("qtell %s %s notes: %s\n", name, username, request);
+    break;
+  case ChangedInfo:
+    XServerCom("qtell %s %s notes: Changed the info for %s.\n", name, username, request);
+    break;
+  case GameResultNotFound:
+    XServerCom("qtell %s %s notes: %s %s\n", name, username, "Can not set result to", request);
+    break;
+  case MultiCommand:
+    XServerCom("qtell %s %s notes: Ambiguous Command Matches:\\n %s\n", name, username, request);
+    break;
+  default:
+    break;
+  }
+}//- End of TellUser
+
+//- TellUser ------------------------------------------------
+void Mamer::TellUser(reasons reason, char *name, char *who, char *which, int new_value) {
+  switch (reason) {
+  case ChangedInfo:
+    XServerCom("qtell %s %s notes: Changed the %s stat for %s to %d.\n", name, username, which, who, new_value);
+    break;  
+  case GameResultSet:
+    switch (new_value) {
+    case 1:
+      XServerCom("qtell %s %s notes: The game %s(w) vs. %s(b) has been set to 1-0\n", name, username, who, which);
+      break;
+    case 0:
+      XServerCom("qtell %s %s notes: The game %s(w) vs. %s(b) has been set to 0-1\n", name, username, who, which);
+      break;
+    default:
+      XServerCom("qtell %s %s notes: The game %s(w) vs. %s(b) has been set to 1/2-1/2\n", name, username, who, which);
+      break;
+    }
+    break;
+  default:
+    break;
+  }
+}//- End of TellUser
+
+//- TellUser ------------------------------------------------
+void Mamer::TellUser(reasons reason, char *name, char *which, char *new_value) {
+  switch (reason) {
+  case CanNotChange:
+    XServerCom("qtell %s %s notes: Can not change the %s var to %s.\n", name, username, which, new_value);
+    break;
+  case ChangedInfo:
+   XServerCom("qtell %s %s notes: Changed %s to %s.\n", name, username, which, new_value);
+    break;  
+  default:
+    break;
+  }
+}//- End of TellUser
+
+
+//- TellUser ------------------------------------------------
+void Mamer::TellUser(reasons reason, char *name, char *uname, int new_value) {
+  switch (reason) {
+  case ChangedManagerLevel:
+    XServerCom("qtell %s %s notes: %s's Manager Level has been changed to %d\n", name, username, uname,new_value);
+    break;
+  case ChangedCommandLevel:
+    XServerCom("qtell %s %s notes: The %s command's manager Level has been changed to %d\n",name,username,uname, new_value);
+    break;
+  case PlayerRemoved:
+    XServerCom("qtell %s %s notes: %s Has been removed from tourney #%i\n", name, username, uname, new_value);
+    break;
+  case NotFound:
+    XServerCom("qtell %s %s notes: %s Is not found in tourney #%i\n", name, username, uname, new_value);
+    break;
+  case ChangedAbuse:
+    XServerCom("qtell %s %s notes: %s's Chaos Points have been changed to %d\n",name, username, uname, new_value);
+    break;
+  case CanNotChange:
+    XServerCom("qtell %s %s notes: Can Not Change the %s stat to %d.\n", name, username, uname, new_value);
+    break;
+  case ChangedInfo:
+    XServerCom("qtell %s %s notes: Changed %s to %d.\n", name, username, uname, new_value);
+    break;  
+  default:
+    break;
+  }
+}//- End of TellUser
+
+//- ParseParams ----------------------------------------------
+int Mamer::ParseParams(Command *comm, char *parameters) {
+  int i, parlen;
+  int paramLower;
+  char c;
+
+  for (i = 0; i < MAXNUMPARAMS; i++)
+    comm->params[i].type = TYPE_NULL;       /* Set all parameters to NULL */
+  parlen = strlen(comm->parameterList);
+  parameters = eatWhite(parameters);      /* remove and spaces before the command */
+  parameters = eatWord(parameters);       /* remove the command itself */
+  for (i = 0; i < parlen; i++) {
+    c = comm->parameterList[i];
+    if (isupper(c)) {
+      paramLower = 0;
+      c = tolower(c);
+    } else {
+      paramLower = 1;
+    }
+    switch (c) {
+    case 'w':
+    case 'o':                   /* word or optional word */
+      parameters = eatWhite(parameters);
+      if (!*parameters)
+        return (c == 'o' ? COM_OK : COM_BADPARAMETERS);
+      comm->params[i].val.word = parameters;
+      comm->params[i].type = TYPE_WORD;
+      parameters = eatWord(parameters);
+      if (*parameters != '\0') {
+       *parameters = '\0';
+       parameters++;
+      }
+      if (paramLower)
+        stolower(comm->params[i].val.word);
+      break;
+
+    case 'd':
+    case 'p':                   /* optional or required integer */
+      parameters = eatWhite(parameters);
+      if (!*parameters)
+        return (c == 'p' ? COM_OK : COM_BADPARAMETERS);
+      if (sscanf(parameters, "%d", &comm->params[i].val.integer) != 1)
+        return COM_BADPARAMETERS;
+      comm->params[i].type = TYPE_INT;
+      parameters = eatWord(parameters);
+      if (*parameters != '\0') {
+        *parameters = '\0';
+        parameters++;
+      }
+      break;
+
+    case 'i':
+    case 'n':                   /* optional or required word or integer */
+      parameters = eatWhite(parameters);
+      if (!*parameters)
+        return (c == 'n' ? COM_OK : COM_BADPARAMETERS);
+      if (sscanf(parameters, "%d", &comm->params[i].val.integer) != 1) {
+        comm->params[i].val.word = parameters;
+        comm->params[i].type = TYPE_WORD;
+      } else {
+        comm->params[i].type = TYPE_INT;
+      }
+      parameters = eatWord(parameters);
+      if (*parameters != '\0') {
+       *parameters = '\0';
+       parameters++;
+      }
+      if (comm->params[i].type == TYPE_WORD)
+        if (paramLower)
+          stolower(comm->params[i].val.word);
+      break;
+
+    case 's':
+    case 't':                   /* optional or required string to end */
+      if (!*parameters)
+        return (c == 't' ? COM_OK : COM_BADPARAMETERS);
+      comm->params[i].val.string = parameters;
+      comm->params[i].type = TYPE_STRING;
+      while (*parameters)
+        parameters = nextWord(parameters);
+      if (paramLower)
+        stolower(comm->params[i].val.string);
+      break;
+    }
+  }
+  if (*parameters)
+    return COM_BADPARAMETERS;
+  else
+    return COM_OK;
+} //- End ParseParams ------------------
+
+//- isWhiteSpace -------------------------------------------
+int Mamer::isWhiteSpace (int c) {
+  if ((c < ' ') || (c == '\b') || (c == '\n') ||
+      (c == '\t') || (c == ' ')) {      /* white */
+    return 1;
+  } else {
+    return 0;
+  }
+} //- End isWhiteSpace -------
+
+//- getWord ------------------------------------------------
+char *Mamer::getWord (char *str) {
+  int i;
+  static char word[MAX_WORD_SIZE];
+
+  i = 0;
+  while (*str && !isWhiteSpace(*str)) {
+    word[i] = *str;
+    str++;
+    i++;
+    if (i == MAX_WORD_SIZE) {
+      i = i - 1;
+      break;
+    }
+  }
+  word[i] = '\0';
+  return word;
+} //- End getWord -------------
+
+//- eatWord -------------------------------------------
+char *Mamer::eatWord (char *str) {
+  while (*str && !isWhiteSpace(*str))
+    str++;
+  return str;
+} //- eatWord ----
+
+//- eatWhite ------------------------------------------
+char *Mamer::eatWhite (char *str) {
+  while (*str && isWhiteSpace(*str))
+    str++;
+  return str;
+} //- eatWhite --------
+
+//- eatTailWhite -------------------------------------------
+char *Mamer::eatTailWhite (char *str) {
+  int len;
+  if (str == NULL)
+    return NULL;
+
+  len = strlen(str);
+  while (len > 0 && isWhiteSpace(str[len - 1]))
+    len--;
+  str[len] = '\0';
+  return (str);
+} //- End of eatTailWhite -----------
+
+//- nextWord -----------------------------------------------
+char *Mamer::nextWord(char *str) {
+  return eatWhite(eatWord(str));
+} //- End of nextWord
+
+char *Mamer::stolower(char *str) {
+  int i;
+
+  if (!str)
+    return NULL;
+  for (i = 0; str[i]; i++) {
+    if (isupper(str[i])) {
+      str[i] = tolower(str[i]);
+    }
+  }
+  return str;
+}
+
+//- GenerateTourneyNumber ----------------------------------------------
+int Mamer::GenerateTourneyNumber(void) {
+  Tourney *t = NULL;
+  int maxT = 0, used=0, i, count=0;
+  LinkListIter<Tourney> tourneyIter(tourneyList);
+  
+  if(NULL != tourneyList.Head()) {    
+    while((t = tourneyIter.Next()))
+      count++;
+    
+    for(i=1; i<=count; i++) {
+      used = 0;
+      tourneyIter.Reset();
+      while((t = tourneyIter.Next())) {
+       if(i == t->number)
+         used = 1;
+       if(t->number > maxT)
+         maxT = t->number;     
+      }
+      if(!used) 
+       return i;
+    }
+    return(maxT + 1);
+  }
+  
+  return(1);
+}
+
+
+// $Log: Mamer.cc,v $
+// Revision 1.19  2002/07/02 00:05:19  tridge
+// got rid of a bunch of RCS tags now that its in CVS
+//
+// Revision 1.18  2002/07/02 00:02:40  tridge
+// - fixed compile on g++ 2.96
+// - updated for lasker 'rmatch'
+//
+// Revision 1.17  1998/09/10 19:57:17  mlong
+// lots of little bug fixes and a few new features
+//
+// Revision 1.16  1998/08/04 21:02:13  mlong
+// changes to correct a few bugs including the this->* change that
+// correctly uses the function pointers now
+//
+// Revision 1.15  1998/06/18 18:41:30  mlong
+// prepairing for yet another move.
+//
+// Revision 1.14  1998/06/04 19:55:00  mlong
+// quick change to the load config file stuff to
+// allow for a commented out line
+//
+// Revision 1.13  1998/04/29 15:23:19  mlong
+// prepairing for the move to daimi
+// new sorting routine.
+//
+// Revision 1.12  1998/04/18 18:46:04  mlong
+// fixed delete bug &
+// added delete tourney function
+//
+// Revision 1.11  1998/04/17 00:14:37  mlong
+// fixes to the setres working with the Link delete method
+//
+// Revision 1.7  1997/10/22 19:47:38  mlong
+// fixed bug for parsing tells into user and command.
+//
+// Revision 1.6  1997/10/08 21:03:35  chess
+// preparing for move to oracle machine at eworks.
+//
+// Revision 1.5  1997/05/15 18:27:53  chess
+// added Player and TourneyPlayers support
+// added HandleGetPlayerInfo & HandleetGameInfo
+//
+// Revision 1.4  1997/04/13 03:14:35  chess
+// commands to do user stats manipulation added
+// also TellUser function added to make for easier reporting and bug checking
+// also added ParseParams that takes the commands parameter list definition
+// and parses out the input from the user to determine if the paramters
+// supplied are correct.  If so it then sends those params to the
+// command.
+//
+// Revision 1.3  1997/03/21 15:31:04  moses
+// added the cleanup of commands
+// added the cleanup of tourneys
+// added the mamer shutdown command
+//
+// Revision 1.2  1996/10/01  20:14:43  moses
+// Changes to incorparte the new usage of the command list
+//
+// Revision 1.1  1996/09/30  20:52:48  moses
+// Initial revision
+//
diff --git a/lasker-2.2.3/bots/mamer/Mamer.hh b/lasker-2.2.3/bots/mamer/Mamer.hh
new file mode 100644 (file)
index 0000000..a8b8cab
--- /dev/null
@@ -0,0 +1,205 @@
+//--------------------------------------------------------------------------
+// Mamer.hh - Class header for the Mamer class
+//
+// Matthew E. Moses & Michael A. Long
+//
+// $Revision: 1.13 $
+// $Date: 2002/07/02 00:05:19 $
+//
+// $Log: Mamer.hh,v $
+// Revision 1.13  2002/07/02 00:05:19  tridge
+// got rid of a bunch of RCS tags now that its in CVS
+//
+// Revision 1.12  2002/07/02 00:02:40  tridge
+// - fixed compile on g++ 2.96
+// - updated for lasker 'rmatch'
+//
+// Revision 1.11  1998/09/10 19:58:41  mlong
+// lots of little bug fixes and a few new features.
+//
+// Revision 1.10  1998/06/18 18:41:52  mlong
+// prepairing for yet another move.
+//
+// Revision 1.9  1998/04/29 15:24:07  mlong
+// prepairing for the move to daimi
+// new sorting routine.
+//
+// Revision 1.8  1998/04/18 18:46:31  mlong
+// fixed delete bug and
+// added delete tourney function
+//
+// Revision 1.5  1997/05/15 18:29:12  chess
+//  added pending and TourneyPlayers support
+// added HandleGetPlayerInfo & HandleGetGameInfo
+//
+// Revision 1.4  1997/04/13 03:21:32  chess
+// TellUser and ParseParams added
+//
+// Revision 1.3  1997/03/21 15:31:49  moses
+// added some defines to support the solaris sun compile
+//
+// Revision 1.2  1996/10/01 20:14:43  moses
+// Changes to support the new command list,
+// to correctly have the commands, I had to derive this class from the
+// CommandEntry class
+//
+// Revision 1.1  1996/09/30  20:52:48  moses
+// Initial revision
+//
+//--------------------------------------------------------------------------
+
+#ifndef _MAMER_
+#define _MAMER_
+
+#include <fstream.h>
+#include <iostream.h>
+
+extern "C" {
+#include <sys/param.h>
+#include <sys/types.h>
+#include <sys/time.h>
+
+#include <ctype.h>
+#include <errno.h>
+#include <math.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <sys/signal.h>
+#include <sys/stat.h>
+
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netdb.h>
+#include <arpa/inet.h>
+
+#include <time.h>
+#include <unistd.h>
+#include <stdarg.h>
+}
+
+#ifdef SUN
+#define INADDR_NONE -1
+#endif
+
+#include "config.h"
+#include "link.hh"
+#include "linklist.hh"
+#include "User.hh"
+#include "Tourney.hh"
+#include "Command.hh"
+#include "CommandEntry.hh"
+#include "Player.hh"
+#include "Game.hh"
+#include "Storage.hh"
+#include "types.h"
+
+extern char *optarg;
+extern int optind;
+
+#define TRUE 1
+#define FALSE 0
+
+//#define MAX(X,Y) ((X) > (Y) ? (X) : (Y))
+//#define MIN(X,Y) ((X) < (Y) ? (X) : (Y))
+
+class Mamer : public CommandEntry {
+ public:
+
+  Mamer();
+  ~Mamer();
+  
+  int Initialize(int argc, char **argv);
+  char *s_and_r(char *, char *, char *);
+  int OpenServerConnection(void);
+  void ListenLoop(void);
+  void Shutdown(void);
+  int GivePlace(int, Tourney *);
+  void AnnounceTourneyEnd(Tourney *);
+  void savePlayerData(Tourney *);
+  
+  void DumpConfiguration(void);
+  
+  int XServerCom(char *, ...);
+  void TellUser(reasons, char *);
+  void TellUser(Command *, char *);
+  void TellUser(reasons, char *, char *);
+  void TellUser(reasons, char *, int);
+  void TellUser(reasons, char *, char *, int);
+  void TellUser(reasons, char *, char *, char *);
+  void TellUser(reasons, char *, char *, char *, int);
+
+#define MAX_WORD_SIZE 1024
+#define MAX_LINE_SIZE 1024
+
+  int UserIsLoaded(char *);
+  int ParseParams(Command *, char *);
+  int isWhiteSpace(int);
+  char *getWord(char *);
+  char *eatWord(char *);
+  char *eatWhite(char *);
+  char *eatTailWhite(char *);
+  char *nextWord(char *);
+  char *stolower(char *);
+
+  int GenerateTourneyNumber(void);
+
+  Tourney *FindTourney(int);
+  User    *FindUser(char *);
+  Command *FindCommand(char *, char *);
+
+private:
+  void Usage(void);
+  void LoadConfigurationFile(void);
+  void BuildCommandList(void);
+  void CheckUser(char *);
+  void AdjustManagerList(int, char *);
+  
+  int HandleQtell(char *);
+  int HandleTell(char *);
+  int HandleChannel(char *);
+  int HandleConnect(char *);
+  int HandleDisconnect(char *);
+  int HandleGame(char *);
+  int HandleGameInfo(char *);
+  int HandlePlayerInfo(char *);
+  
+  void NextRound();
+
+  Player  *FindPending(char *);
+  
+public:
+  char configFilename[MAXPATHLEN];
+  
+  char hostname[256];
+  int  portNumber;
+  int  channelNumber;
+  char username[80];
+  char password[80];
+  
+  int serverSocket;
+  
+  int  debugLevel;
+
+  char logFilename[MAXPATHLEN];  
+  char dataFilePath[MAXPATHLEN];
+  char homeFilePath[MAXPATHLEN];
+  char userFilePath[MAXPATHLEN];
+  char helpFilePath[MAXPATHLEN];
+  
+  short loggedInFlag;
+  
+  long countOfTourneysSinceRestart;
+  
+  TourneyParameters tourneyParams;
+  
+  LinkList<Tourney> tourneyList;
+  LinkList<Player>  pendingList;
+  LinkList<User>    userList;
+  LinkList<Command> commandList;
+  LinkList<Storage> storageList;
+};
+
+#endif
diff --git a/lasker-2.2.3/bots/mamer/Player.cc b/lasker-2.2.3/bots/mamer/Player.cc
new file mode 100644 (file)
index 0000000..b6fd181
--- /dev/null
@@ -0,0 +1,78 @@
+//--------------------------------------------------------------------------
+// Player.cc - Source file for the Player class
+//
+// Matthew E. Moses && Michael A. Long
+//
+// $Revision: 1.4 $
+// $Date: 1998/09/10 19:57:17 $
+//
+// $Author: mlong $
+// $Locker:  $
+//
+// $Log: Player.cc,v $
+// Revision 1.4  1998/09/10 19:57:17  mlong
+// lots of little bug fixes and a few new features
+//
+// Revision 1.3  1998/02/12 18:44:04  mlong
+// ..\7f
+//
+// Revision 1.2  1997/10/08 21:03:35  chess
+// preparing for move to oracle machine at eworks.
+//
+// Revision 1.1  1997/05/16 03:22:36  chess
+// Initial revision
+//
+// Revision 1.1  1997/05/14 17:00:30  chess
+// Initial revision
+//
+//
+//--------------------------------------------------------------------------
+
+// static char RCSid[] = "$Id: Player.cc,v 1.4 1998/09/10 19:57:17 mlong Exp $";
+
+#include "Player.hh"
+
+//- Constructor -----------------------------------------------------------
+Player::Player(char *n, int wt) {
+  strcpy(name, n);
+  value = wt;
+}
+
+//- Constructor -----------------------------------------------------------
+Player::Player(char *n, float wt) {
+  strcpy(name, n);
+  floatValue = wt;
+}
+
+//- Constructor -----------------------------------------------------------
+Player::Player(char *n, double wt) {
+  strcpy(name, n);
+  floatValue = wt;
+}
+
+//- Constructor -----------------------------------------------------------
+Player::Player(char *n, float f, int i) {
+  strcpy(name, n);
+  floatValue = f;
+  value = i;
+}
+
+//- Constructor -----------------------------------------------------------
+Player::Player(char *n, float f, int i, int r) {
+  strcpy(name, n);
+  floatValue = f;
+  value = i;
+  rating = r;
+}
+
+//- DeConstructor ---------------------------------------------------------
+Player::~Player() {
+}
+
+//- IsPlayer -----------------------------------------------------------------
+int Player::IsPlayer(char *user) {
+    if(0 == strcasecmp(user, name))
+        return(1);
+    else
+        return(0);
+} //- End of IsPlayer
diff --git a/lasker-2.2.3/bots/mamer/Player.hh b/lasker-2.2.3/bots/mamer/Player.hh
new file mode 100644 (file)
index 0000000..917c905
--- /dev/null
@@ -0,0 +1,91 @@
+//--------------------------------------------------------------------------
+// Player.hh - Class header for the Player class
+//
+// Matthew E. Moses & Michael A. Long
+//
+// $Revision: 1.4 $
+// $Date: 2002/07/02 00:02:40 $
+//
+// $Author: tridge $
+// $Locker:  $
+//
+// $Log: Player.hh,v $
+// Revision 1.4  2002/07/02 00:02:40  tridge
+// - fixed compile on g++ 2.96
+// - updated for lasker 'rmatch'
+//
+// Revision 1.3  1998/02/12 18:44:25  mlong
+// *** empty log message ***
+//
+// Revision 1.2  1997/11/11 16:48:06  chess
+// *** empty log message ***
+//
+// Revision 1.2  1997/10/23 19:56:12  chess
+// *** empty log message ***
+//
+// Revision 1.1  1997/05/16 03:22:36  chess
+// Initial revision
+//
+//
+//
+//--------------------------------------------------------------------------
+
+#ifndef _Player_
+#define _Player_
+
+#include <fstream.h>
+#include <iostream.h>
+
+extern "C" {
+#include <sys/param.h>
+#include <sys/types.h>
+
+#include <ctype.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <sys/stat.h>
+
+#include <time.h>
+#include <unistd.h>
+}
+
+#include "config.h"
+#include "User.hh"
+#include "link.hh"
+#include "linklist.hh"
+
+class Player : public Link {
+public:
+
+  Player(char *, int);
+  Player(char *, float);
+  Player(char *, double);
+  Player(char *, float, int);
+  Player(char *, float, int, int);
+  ~Player();
+  
+int IsPlayer(char *);
+
+private:
+
+public:
+
+  char name[NAMELEN];
+  int  value;
+  double floatValue;
+  int rating;
+
+private:
+
+};
+
+
+#endif
+
+
+
+
+
+
diff --git a/lasker-2.2.3/bots/mamer/Storage.cc b/lasker-2.2.3/bots/mamer/Storage.cc
new file mode 100644 (file)
index 0000000..ebd3f4c
--- /dev/null
@@ -0,0 +1,58 @@
+//--------------------------------------------------------------------------
+// Storage.cc - Source file for the Storage class
+//
+// Matthew E. Moses && Michael A. Long
+//
+// $Revision: 1.1 $
+// $Date: 1998/09/10 19:57:17 $
+//
+// $Author: mlong $
+// $Locker:  $
+//
+// $Log: Storage.cc,v $
+// Revision 1.1  1998/09/10 19:57:17  mlong
+// Initial revision
+//
+//
+//--------------------------------------------------------------------------
+
+// static char RCSid[] = "$Id: Storage.cc,v 1.1 1998/09/10 19:57:17 mlong Exp $";
+
+#include "Storage.hh"
+
+//- Constructor -----------------------------------------------------------
+Storage::Storage(char *n, int wt) {
+  strcpy(name, n);
+  value = wt;
+}
+
+//- Constructor -----------------------------------------------------------
+Storage::Storage(char *n, float wt) {
+  strcpy(name, n);
+  floatValue = wt;
+}
+
+//- Constructor -----------------------------------------------------------
+Storage::Storage(char *n, double wt) {
+  strcpy(name, n);
+  floatValue = wt;
+}
+
+//- Constructor -----------------------------------------------------------
+Storage::Storage(char *n, float f, int i) {
+  strcpy(name, n);
+  floatValue = f;
+  value = i;
+}
+
+//- Constructor -----------------------------------------------------------
+Storage::Storage(char *n, float f, int i, int r) {
+  strcpy(name, n);
+  floatValue = f;
+  value = i;
+  rating = r;
+}
+
+//- DeConstructor ---------------------------------------------------------
+Storage::~Storage() {
+}
diff --git a/lasker-2.2.3/bots/mamer/Storage.hh b/lasker-2.2.3/bots/mamer/Storage.hh
new file mode 100644 (file)
index 0000000..efb5394
--- /dev/null
@@ -0,0 +1,87 @@
+//--------------------------------------------------------------------------
+// Storage.hh - Class header for the Storage class
+//
+// Matthew E. Moses & Michael A. Long
+//
+// $Revision: 1.1 $
+// $Date: 1998/09/10 19:58:41 $
+//
+// $Author: mlong $
+// $Locker:  $
+//
+// $Log: Storage.hh,v $
+// Revision 1.1  1998/09/10 19:58:41  mlong
+// Initial revision
+//
+// Revision 1.3  1998/02/12 18:44:25  mlong
+// *** empty log message ***
+//
+// Revision 1.2  1997/11/11 16:48:06  chess
+// *** empty log message ***
+//
+// Revision 1.2  1997/10/23 19:56:12  chess
+// *** empty log message ***
+//
+// Revision 1.1  1997/05/16 03:22:36  chess
+// Initial revision
+//
+//
+//
+//--------------------------------------------------------------------------
+
+#ifndef _Storage_
+#define _Storage_
+
+#include <fstream.h>
+#include <iostream.h>
+
+extern "C" {
+#include <sys/param.h>
+#include <sys/types.h>
+
+#include <ctype.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <sys/stat.h>
+
+#include <time.h>
+#include <unistd.h>
+}
+
+#include "config.h"
+#include "User.hh"
+#include "link.hh"
+#include "linklist.hh"
+
+class Storage : public Link {
+public:
+
+  Storage(char *, int);
+  Storage(char *, float);
+  Storage(char *, double);
+  Storage(char *, float, int);
+  Storage(char *, float, int, int);
+  ~Storage();
+private:
+
+public:
+
+  char name[NAMELEN];
+  int  value;
+  double floatValue;
+  int rating;
+
+private:
+
+};
+
+
+#endif
+
+
+
+
+
+
diff --git a/lasker-2.2.3/bots/mamer/Tourney.cc b/lasker-2.2.3/bots/mamer/Tourney.cc
new file mode 100644 (file)
index 0000000..0532f44
--- /dev/null
@@ -0,0 +1,1014 @@
+//--------------------------------------------------------------------------
+// Tourney.cc - Source file for Tourney class
+//
+// Matthew E. Moses
+//
+// $Revision: 1.12 $
+// $Date: 2002/07/02 00:02:40 $
+//
+// $Author: tridge $
+// $Locker:  $
+//
+// $Log: Tourney.cc,v $
+// Revision 1.12  2002/07/02 00:02:40  tridge
+// - fixed compile on g++ 2.96
+// - updated for lasker 'rmatch'
+//
+// Revision 1.11  1998/09/10 19:57:17  mlong
+// lots of little bug fixes and a few new features
+//
+// Revision 1.10  1998/04/29 15:23:19  mlong
+// prepairing for the move to daimi
+// new sorting routine.
+//
+// Revision 1.9  1998/04/18 20:05:14  mlong
+// fixed BYE bug
+//
+// Revision 1.8  1998/04/18 18:46:04  mlong
+// fixed delete bug &
+// added delete tourney function
+//
+// Revision 1.4  1997/10/08 21:03:35  chess
+// preparing for move to oracle machine at eworks.
+//
+// Revision 1.3  1997/05/15 18:27:53  chess
+// added pending and TourneyPlayers support
+// added HandleGetPlayerInfo & HandleGetGameInfo
+//
+// Revision 1.2  1996/10/01 20:14:43  moses
+// Added a new method IsTourney
+//
+// Revision 1.1  1996/09/30  20:52:48  moses
+// Initial revision
+//
+//--------------------------------------------------------------------------
+
+//static char RCSid[] = "$Id: Tourney.cc,v 1.12 2002/07/02 00:02:40 tridge Exp $";
+
+#include "Tourney.hh"
+#include "Mamer.hh"
+
+extern Mamer gMamer;
+
+//- Constructor ------------------------------------------------------------
+Tourney::Tourney() {
+} //- End of Tourney
+
+Tourney::Tourney(int n,User *u, TourneyParameters *tp) {
+  InitTourney(n, u, tp->time, tp->inc, tp->mode, tp->style, tp->rounds, tp->variant, tp->ratingLow, tp->ratingHigh);
+}
+
+Tourney::Tourney(int n, User *u, TourneyParameters *tp, int t, int i, char m, char s, int r) {
+  InitTourney(n, u, t, i, m, s, r, tp->variant, tp->ratingLow, tp->ratingHigh);
+}
+
+Tourney::Tourney(int n, User *u, TourneyParameters *tp, int t, int i, char m, char s, int r, char v) {
+  InitTourney(n, u, t, i, m, s, r, v, tp->ratingLow, tp->ratingHigh);
+}
+
+void Tourney::InitTourney(int n, User *u, int t, int i, char m, char s, int r, char v, int rl, int rh) {
+  number = n;
+  strncpy(manager, u->name, NAMELEN - 1);
+  managerLevel = u->GetManagerLevel();
+  averageRating = 0;
+  params.time = t;
+  params.inc = i;
+  params.mode = m;
+  params.style = s;
+  params.rounds = r;
+  params.variant = v;
+  params.wild = 10;
+  params.ratingLow = rl;
+  params.ratingHigh = rh;
+  params.currentRound = 0;
+  params.maxPlayers = DEFAULT_MAX_PLAYERS;
+
+  startDate = 0;
+  endDate = 0;
+  persist = 0;
+  lastCshouted = 0;
+
+  status = NEW;
+}
+
+//- Deconstructor ---------------------------------------------------------
+Tourney::~Tourney() {
+
+} //- End of ~Tourney
+
+//- IsTourney -------------------------------------------------------------
+int Tourney::IsTourney(int tourn) {
+    if(tourn == number)
+       return(1);
+    else
+       return(0);
+} //- End of IsTourney
+
+//- IsNotNew-------------------------------------------------------------
+short Tourney::IsNotNew(void) {
+  if(NEW != status)
+    return(TRUE);
+  return(FALSE);
+}
+
+//- IsNotClosed-------------------------------------------------------------
+short Tourney::IsNotClosed(void) {
+  if(CLOSED != status)
+    return(TRUE);
+  return(FALSE);
+}
+
+//- AddPlayer ----------------------------------------------------------
+int Tourney::AddPlayer(char *name, int rating, float score) {
+  TourneyPlayers *newPlayer = NULL, *tp = NULL;
+  Player *newSortPlayer = NULL;
+
+  if (status != OPEN) return 3;   // If we are not open then we can't enter the tourney
+  
+  tp = GetPlayer(name);
+
+  if(tp != NULL) return(2);   // if we are already in the tourney we can't enter it again/
+
+  if(rating >= params.ratingLow && rating <= params.ratingHigh && status == OPEN) {
+
+    newPlayer = new TourneyPlayers(name, rating, score);
+    newSortPlayer = new Player(name, 0);
+
+    playerList.Append(newPlayer);
+    SortPlayers();
+    gMamer.XServerCom("%s %i %s %s%i%s %s%i %i %s%s", "tell", gMamer.channelNumber, name, "(", rating, ")", 
+                     "has joined tourney #", number, GetPlayerCount(), "players now.", "\n");
+    CalculateAverage();
+    if(GetPlayerCount() >= params.maxPlayers)
+      CloseAndStart();
+    return(1);   // we entered the tourney
+  } else 
+    return(0); // sucks to be us cause our rating doesn't fit the params
+}
+
+//- RemovePlayer ----------------------------------------------------------
+int Tourney::RemovePlayer(char *name) {
+  TourneyPlayers *tp = NULL, *p=NULL;
+  Player *opp=NULL;
+  int roundsRemaining=0;
+
+  tp = GetPlayer(name);
+  printf("forfeiting %s\n", tp->name);
+  if(tp == NULL) return -1; // Player not in THIS tourney
+
+  tp->activeFlag = 0;
+
+  roundsRemaining = GetRoundsRemaining();
+
+  // This code will go through a forfeited players list and give him a loss for current opponent
+  // with a quick modification it will give losses for all games played as well...
+  LinkListIter<Player> opponentIter(tp->opponentList);  // List of opponents this player has had
+  opponentIter.Reset();
+  while((opp = opponentIter.Next())) {
+    if(strcmp("_BYE_", opp->name) != 0) {  // If I am not _BYE_
+      p = GetPlayer(opp->name);
+      if(opp->floatValue == -1) {  // floatValue stores the game result for this player
+       if(opp->value) {  // if player leaving was white
+         SetGameResult(tp->name, opp->name, 0);
+       } else {
+         SetGameResult(opp->name, tp->name, 1);
+       }
+       roundsRemaining++;
+      }
+    }
+  }
+  
+  LinkListIter<TourneyPlayers> playerIter(playerList);
+  playerIter.Reset();
+  while((p = playerIter.Next())) {
+    if(strcmp(p->name, "_BYE_") == 0)  { 
+      if(p->activeFlag != 0)
+       p->activeFlag = 0;
+      else
+       p->activeFlag = 1;
+      break;
+    }
+  }
+
+  SortPlayers();
+
+  return roundsRemaining;
+}
+
+//- GetPlayer ----------------------------------------------------------
+TourneyPlayers *Tourney::GetPlayer(char *name) {
+  LinkListIter<TourneyPlayers> playerIter(playerList);
+  TourneyPlayers *tp = NULL;
+  
+  playerIter.Reset();
+  while((tp = playerIter.Next()))
+    if(!strcasecmp(tp->name, name))  
+      return tp;
+  
+  return NULL;
+}
+
+//- GetRound ----------------------------------------------------------
+int Tourney::GetRound() {
+  return params.currentRound;
+}//- end of GetRound --------------------------------------------------
+
+//- GetRoundsRemaining ------------------------------------------------
+int Tourney::GetRoundsRemaining() {
+  return (params.rounds - params.currentRound);
+}//- end of GetRoundsRemaining -----------------------------------------
+
+//- SortPlayers ----------------------------------
+void Tourney::SortPlayers() {
+  Player          *temp=NULL, *s=NULL;
+  TourneyPlayers  *tp = NULL;
+  int             i=0, added=0;
+
+  LinkListIter<TourneyPlayers> playerIter(playerList);
+  LinkListIter<Player> sortIter(sortList);
+
+  sortIter.Reset();
+  while((s = sortIter.Next())) sortList.Delete(s);
+
+  i=0;
+  while((tp = playerIter.Next())) {
+    (tp->activeFlag) ? tp->sortValue = (tp->score + tp->rating/10000.0) : tp->sortValue = -1.0;
+    tp->ClearWhites();
+    tp->ClearBlacks();
+    if((status == OPEN) && (i < (GetPlayerCount()/2)))
+      (i % 2) ? tp->AddWhite() : tp->AddBlack();
+    i++;
+  }
+
+  playerIter.Reset();
+  while((tp = playerIter.Next())) {
+    added=0;
+    sortIter.Reset();
+    temp = new Player(tp->name, tp->sortValue);
+    while((s = sortIter.Next())) {
+      if(tp->sortValue > s->floatValue) {
+       sortList.Insert(s, temp);
+       added = 1;
+       break;
+      }
+    }
+    if(!added)
+      sortList.Append(temp);
+  }
+
+  i = 1;
+  sortIter.Reset();
+  while((s = sortIter.Next())) { 
+    s->value = i;
+    if(gMamer.debugLevel >= 10) printf("%4d %-18s\n", s->value, s->name); 
+    i++;
+  }
+}//- end of Sort Players ----------------------
+
+//- GetSortValueCount -------------------------------------------------------
+int Tourney::GetSortValueCount(double value) {
+  LinkListIter<TourneyPlayers> playerIter(playerList);
+  int count=0;
+  TourneyPlayers *tp=NULL;
+  Player *s=NULL;
+
+  while((tp = playerIter.Next())) {
+    if(tp->sortValue == value) {
+      s = GetSortPlayer(tp->name);
+      if(s->value != 0)
+       count++;
+    }
+  }
+  
+  return count;
+}
+
+//- GetSortPlayer ----------
+Player *Tourney::GetSortPlayer(char *name) {
+  Player *p = NULL;
+  LinkListIter<Player> sortIter(sortList);
+
+  while((p = sortIter.Next())) {
+    if(strcasecmp(p->name, name) == 0) {
+      return p;
+    }
+  }
+
+  return p;
+}//- end of GetSortPlayer -----<