home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / games / volume13 / okbridge / part07 < prev    next >
Encoding:
Internet Message Format  |  1992-01-12  |  46.2 KB

  1. Path: uunet!zephyr.ens.tek.com!master!saab!billr
  2. From: billr@saab.CNA.TEK.COM (Bill Randle)
  3. Newsgroups: comp.sources.games
  4. Subject: v13i022:  okbridge - computer-mediated bridge game, Part07/07
  5. Message-ID: <2281@masterCNA.TEK.COM>
  6. Date: 10 Jan 92 16:45:26 GMT
  7. Sender: news@masterCNA.TEK.COM
  8. Lines: 1367
  9. Approved: billr@saab.CNA.TEK.COM
  10.  
  11. Submitted-by: mclegg@cs.UCSD.EDU (Matthew Clegg)
  12. Posting-number: Volume 13, Issue 22
  13. Archive-name: okbridge/Part07
  14. Environment: BSD-derived Unix, curses, sockets
  15.  
  16.  
  17.  
  18. #! /bin/sh
  19. # This is a shell archive.  Remove anything before this line, then unpack
  20. # it by saving it into a file and typing "sh file".  To overwrite existing
  21. # files, type "sh file -c".  You can also feed this as standard input via
  22. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  23. # will see the following message at the end:
  24. #        "End of archive 7 (of 7)."
  25. # Contents:  Makefile Revisions code.h display.h help.h network.h
  26. #   okbridgerc okshuffle.c ps.h scoring.h socket.c terminal.h
  27. # Wrapped by billr@saab on Fri Jan 10 08:31:30 1992
  28. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  29. if test -f 'Makefile' -a "${1}" != "-c" ; then 
  30.   echo shar: Will not clobber existing file \"'Makefile'\"
  31. else
  32. echo shar: Extracting \"'Makefile'\" \(2756 characters\)
  33. sed "s/^X//" >'Makefile' <<'END_OF_FILE'
  34. X# makefile for Okbridge 1.5
  35. X#
  36. X# Matthew Clegg.
  37. X#
  38. X
  39. X# In general the okbridge program can be compiled simply by
  40. X# typing 'make'.  If you are planning to install okbridge in
  41. X# a public directory, then you may want to first change the
  42. X# values of the variables OKBRIDGE_DIR and OKBRIDGE_HELPFILE.
  43. X# Then, type 'make install'.
  44. X
  45. XOKBRIDGE_DIR = /usr/local/games
  46. XOKBRIDGE_HELPFILE = /usr/local/games/okbridge.help
  47. X
  48. X# If you are compiling this program on a machine which is
  49. X# running IBM's AIX operating system, then uncomment the
  50. X# next line:
  51. X#MACHINE_FLAGS = -DAIX
  52. X#
  53. X# If you are running on an HP/UX system, you may need to uncomment
  54. X# the following line:
  55. X#MACHINE_FLAGS = -DHPUX
  56. X#
  57. X# If you are compiling this program on a machine which does not
  58. X# have strcasecmp and strncasecmp, then you will need to uncomment
  59. X# the following line (this is not necessary if you are using
  60. X# SunOS or a recent version of Ultrix):
  61. X#STRCASECMP = -DNO_STRCASECMP
  62. X#
  63. X# The following flags may be useful if you have modified the okbridge
  64. X# program and you need assistance debugging it:
  65. X#
  66. X# Uncomment the following line to test the program in LOOPBACK_MODE.
  67. X# CFLAGS = -g -DLOGFILE -DLOOPBACK_MODE -DDEBUG $(STRCASECMP) $(MACHINE_FLAGS)
  68. X# CFLAGS = -g -DDEBUG -DLOGFILE $(STRCASECMP) $(MACHINE_FLAGS)
  69. X# CFLAGS = -g -DDEBUG $(STRCASECMP) $(MACHINE_FLAGS)
  70. XCFLAGS = -g $(STRCASECMP) $(MACHINE_FLAGS)
  71. X
  72. XOBJ = bridge.o input.o display.o terminal.o network.o help.o ps.o socket.o\
  73. X      scoring.o email.o code.o startup.o
  74. X
  75. XSHUFFLEOBJ = okshuffle.o email.o code.o
  76. X
  77. XTALLYOBJ = oktally.o email.o code.o
  78. X
  79. X
  80. X
  81. Xall:    okbridge okshuffle oktally
  82. X
  83. Xokbridge:    $(OBJ)
  84. X    $(CC) -o okbridge $(OBJ) -lcurses -ltermcap
  85. X
  86. Xokshuffle:    $(SHUFFLEOBJ) globals.h
  87. X    $(CC) -o okshuffle $(SHUFFLEOBJ)
  88. X
  89. Xoktally:    $(TALLYOBJ) globals.h
  90. X    $(CC) -o oktally $(TALLYOBJ)
  91. X
  92. Xinstall:    okbridge
  93. X    install okbridge $(OKBRIDGE_DIR)
  94. X    install okshuffle $(OKBRIDGE_DIR)
  95. X    install oktally $(OKBRIDGE_DIR)
  96. X    install -c -m 644 okbridge.help $(OKBRIDGE_HELPFILE)
  97. X
  98. Xclean:
  99. X    rm -f *.o 
  100. X    rm -f tmp*
  101. X    rm -f okbridge okshuffle oktally core tags TAGS
  102. X
  103. Xdistrib:    clean
  104. X        rm -f helpfile.h 
  105. X        rm -f *~
  106. X        csh -f < MakeDistrib
  107. X
  108. Xbridge.o:    bridge.c globals.h ps.h display.h input.h network.h\
  109. X        terminal.h help.h scoring.h
  110. X
  111. Xcode.o:        code.h code.c
  112. X
  113. Xdisplay.o:    display.h display.c globals.h terminal.h
  114. X
  115. Xemail.o:    email.h email.c code.h
  116. X
  117. Xhelp.o:        help.h help.c globals.h ps.h input.h terminal.h helpfile.h
  118. X
  119. Xinput.o:    input.h input.c globals.h ps.h network.h terminal.h display.h\
  120. X        help.h input.h
  121. X
  122. Xnetwork.o:    network.h network.c globals.h socket.c
  123. X
  124. Xps.o:        ps.h ps.c
  125. X
  126. Xsocket.o:    socket.c
  127. X
  128. Xscoring.o:    scoring.h scoring.c globals.h
  129. X
  130. Xstartup.o:    globals.h
  131. X
  132. Xterminal.o:    terminal.h terminal.c
  133. X
  134. Xhelpfile.h:
  135. X        echo 'char *help_file_name="'$(OKBRIDGE_HELPFILE)'";' \
  136. X        > helpfile.h
  137. X
  138. END_OF_FILE
  139. if test 2756 -ne `wc -c <'Makefile'`; then
  140.     echo shar: \"'Makefile'\" unpacked with wrong size!
  141. fi
  142. # end of 'Makefile'
  143. fi
  144. if test -f 'Revisions' -a "${1}" != "-c" ; then 
  145.   echo shar: Will not clobber existing file \"'Revisions'\"
  146. else
  147. echo shar: Extracting \"'Revisions'\" \(2853 characters\)
  148. sed "s/^X//" >'Revisions' <<'END_OF_FILE'
  149. XThis file notes the changes that have been made for each revision
  150. Xof okbridge.  My apologies for not starting this list earlier.
  151. X
  152. X1.5Q
  153. X  - Added some code to allow version 1.5P to compile correctly
  154. X    under AIX.
  155. X
  156. X1.5Q
  157. X  - Modified the '/claim' command so that if the number of tricks is omitted,
  158. X    then all remaining tricks are claimed.
  159. X  - Added '^T' control key to force the program into TALK mode when
  160. X    it is expecting a bid or play.
  161. X  - Added some code to allow version 1.5P to compile correctly
  162. X    under AIX.
  163. X  - Corrected the bug which causes the program to crash when a client
  164. X    attempts to occupy the seat taken by the server.
  165. X  - Corrected some array sizes in code.c, thus fixing the 
  166. X    "north terminal problem".
  167. X
  168. X1.5P
  169. X  - Writes the Zhang log file even if all players pass.
  170. X  - Added the -R command line option for rubber bridge.
  171. X  - Changed the names of shuffle and tally to okshuffle and oktally.
  172. X  - Added the -d parameter to the shuffle command for printing the date
  173. X    to the deals file.
  174. X  - Writes the date to both types of log files.
  175. X  - Accepts the -s parameter on the tally command for skipping deals.
  176. X  - Accepts "-" as a filename parameter on the tally command for
  177. X    specifying standard input.
  178. X
  179. X1.5N
  180. X  - Added the -z option for generating log files in the format used
  181. X    by S. Zhang's okbd program.
  182. X  - Improved the error handling when an incompatible client 
  183. X    is recognized.
  184. X  - Screen refreshes now handled properly during review of the hand.
  185. X
  186. X1.5M released Dec. 8, 1991
  187. X  - Added the -r, -l and -L parameters to the command line which emulate
  188. X    the /REPLAY, /LOAD and /LOG commands, respectively.
  189. X  - fixed a bug in the network code having to do with handling connection
  190. X    requests after one of the players has disconnected.
  191. X  - Incorporated Zhenjun Wu's code for computing IMP scores.
  192. X  - Added the /REVIEW command for reviewing the bidding.
  193. X  - Added the /DEFAULT command for disabling default inputs.
  194. X  - Added control-character equivalents for the /BELL, /DEFAULTS,
  195. X    /PROMPT and /REVIEW commands.
  196. X  - Introduces the 'okb' shell script by Charles Wen for making
  197. X    the startup of okbridge more user friendly.
  198. X
  199. X1.5L 
  200. X  - There was no version 1.5L released.
  201. X
  202. X1.5K
  203. X  - Modified the coding of the email duplicate files so that the initial
  204. X    message supplied by the '-m' parameter to the shuffle command appears
  205. X    in plaintext in the deal file.
  206. X  - "Unfixed" the "bug" in IMP scoring which was "fixed" in version 1.5J
  207. X
  208. X1.5J released Nov 1, 1991
  209. X  - Fixed a bug in the IMP scoring which causes the scores to be off by 1.
  210. X  - Added the '-m' parameter to the shuffle command for recording an
  211. X    initial message.
  212. X  - Eliminated use of the more modern 'long random()' function in favor
  213. X    of the older 'int rand()'.  At least one user pointed out that
  214. X    'long random()' is not available on his system.
  215. END_OF_FILE
  216. if test 2853 -ne `wc -c <'Revisions'`; then
  217.     echo shar: \"'Revisions'\" unpacked with wrong size!
  218. fi
  219. # end of 'Revisions'
  220. fi
  221. if test -f 'code.h' -a "${1}" != "-c" ; then 
  222.   echo shar: Will not clobber existing file \"'code.h'\"
  223. else
  224. echo shar: Extracting \"'code.h'\" \(3523 characters\)
  225. sed "s/^X//" >'code.h' <<'END_OF_FILE'
  226. X/* code.h
  227. X ! 
  228. X ! Copyright (C) 1990,1991 by Matthew Clegg
  229. X ! 
  230. X ! This program may be copied and distributed freely.  Please do not
  231. X ! charge money for this program or for any program derived from it.
  232. X ! If you modify this program, then include a notice stating plainly
  233. X ! that your program is derived from the okbridge program and is not
  234. X ! the same as the official okbridge program.
  235. X !
  236. X ! I welcome any suggestions for improvement to okbridge, and 
  237. X ! I would be especially happy to receive improved source code.
  238. X ! If you have comments or suggestions, or if you would like to
  239. X ! join the okbridge mailing list, then write to
  240. X !
  241. X !   mclegg@cs.ucsd.edu
  242. X !
  243. X *
  244. X * This file provides definitions for a module which implements a
  245. X * very simple cipher that is used to encode crucial parts of the
  246. X * email duplicate files.  The purpose of the cipher is to allow
  247. X * email duplicate files to be manipulated easily without revealing
  248. X * their contents.  For details about how the cipher is implemented,
  249. X * see the file code.c.
  250. X *
  251. X*/
  252. X
  253. Xtypedef struct Encoded_File_Struct Encoded_File;
  254. X
  255. Xextern int codefile_line_no;
  256. X    /* The number of lines that have been read from the current
  257. X           coded file. */
  258. X
  259. Xextern int Reset_Encoded_File ();
  260. X/*
  261. Xextern int Reset_Encoded_File (filename, check_string, ef)
  262. X    char *filename, check_string; Encoded_File **ef; */
  263. X/* Opens the named file for input.  Returns a pointer to a structure
  264. X   describing the opened file.  If an error occurs in opening the
  265. X   file, returns -1, in which case the system error code is stored
  266. X   in errno.  Reads lines from the file until a line is found which
  267. X   matches check_string.  If the check_string is not found, then
  268. X   returns 1.  Else, reads the cipher_encoding from the following line.
  269. X   Allocates a new Encoded_File structure and stores its location in ef.
  270. X   Returns 0 on success.
  271. X*/
  272. X
  273. Xextern int Read_Encoded_Line ();
  274. X/*
  275. Xextern int Read_Encoded_Line (ef, buf, buflen)
  276. X    Encoded_File *ef; char *buf; int buflen; */
  277. X/* Reads a line of up to buflen characters from the encoded file ef
  278. X   into buf.  If the first character of the line is '!', then strips
  279. X   that character and applies the decoding algorithm to the remainder
  280. X   of the line.  Otherwise, just copies the line from the input file
  281. X   to the buffer.  Returns the number of characters read or -1 if
  282. X   the end of file is reached.
  283. X*/
  284. X
  285. Xextern int Rewrite_Encoded_File ();
  286. X/*
  287. Xextern int Rewrite_Encoded_File (filename, check_string, ef)
  288. X    char *filename, *check_string; Encoded_File **ef; */
  289. X/* Opens the named file for output.  Returns a pointer to a structure
  290. X   describing the opened file.  If an error occurs in opening the file,
  291. X   then returns -1, in which case the system error code is stored
  292. X   in errno.  Invents a permutation for the new encoded file.
  293. X   Writes the check_string as the first line of the new file,
  294. X   and the permutation as the second line.  Returns 0 to indicate
  295. X   success.
  296. X*/
  297. X
  298. Xextern int Write_Encoded_Line ();
  299. X/*
  300. Xextern int Write_Encoded_Line (ef, buf)
  301. X    Encoded_File ef; char *buf; */
  302. X/* Writes the encoded version of the string from buf to the encoded
  303. X   file ef.  Returns 0 on success or 1 if the system reports an error.
  304. X*/
  305. X
  306. Xextern int Write_Unencoded_Line ();
  307. X/* 
  308. Xextern int Write_Unencoded_Line (ef, buf)
  309. X    Encoded_File *ef; char *buf; */
  310. X/* Writes the unencoded line in buf to the file ef. */
  311. X
  312. Xextern void Close_Encoded_File ();
  313. X/*
  314. Xvoid Close_Encoded_File (ef)
  315. X    Encoded_File *ef; */
  316. X/* Closes the file associated to ef and disposes of the memory
  317. X   associated to ef. */
  318. X
  319. END_OF_FILE
  320. if test 3523 -ne `wc -c <'code.h'`; then
  321.     echo shar: \"'code.h'\" unpacked with wrong size!
  322. fi
  323. # end of 'code.h'
  324. fi
  325. if test -f 'display.h' -a "${1}" != "-c" ; then 
  326.   echo shar: Will not clobber existing file \"'display.h'\"
  327. else
  328. echo shar: Extracting \"'display.h'\" \(5944 characters\)
  329. sed "s/^X//" >'display.h' <<'END_OF_FILE'
  330. X/* display.h
  331. X ! 
  332. X ! Copyright (C) 1990,1991 by Matthew Clegg
  333. X ! 
  334. X ! This program may be copied and distributed freely.  Please do not
  335. X ! charge money for this program or for any program derived from it.
  336. X ! If you modify this program, then include a notice stating plainly
  337. X ! that your program is derived from the okbridge program and is not
  338. X ! the same as the official okbridge program.
  339. X !
  340. X ! I welcome any suggestions for improvement to okbridge, and 
  341. X ! I would be especially happy to receive improved source code.
  342. X ! If you have comments or suggestions, or if you would like to
  343. X ! join the okbridge mailing list, then write to
  344. X !
  345. X !   mclegg@cs.ucsd.edu
  346. X !
  347. X *
  348. X * The DISPLAY module for the bridge program is responsible for
  349. X * presenting the information regarding various aspects of the
  350. X * game to the screen.  The organization of the screen is embedded
  351. X * within this module, and there are entry points for giving
  352. X * updates to the screen at each step of the game.
  353. X *
  354. X * This module does not make any calls to the operating system
  355. X * directly.  Instead, all of its output functions are channeled
  356. X * through the TERMINAL module.
  357. X *
  358. X */
  359. Xextern Initialize_Display ();
  360. X/* Should be called once when the program starts up. */
  361. Xextern Reset_Display ();
  362. X/* Redraws the main features of the screen.  Used in the process
  363. X   of doing a 'refresh'. */
  364. Xextern Refresh_Display ();
  365. X/* Updates the entire screen. */
  366. X/* The scoring display gives information about the following attributes
  367. X * for each side:
  368. X *
  369. X * -- The number of tricks taken in the current hand.
  370. X * -- The current 'above the line' score.
  371. X * -- The current 'below the line' score.
  372. X * -- The vulnerabilities of each side.
  373. X *
  374. X * Nov. 3, 1990: The scoring display routines have now been revised to
  375. X *  present the display in the Chicago-scoring format as well as in the
  376. X *  rubber-scoring format.  The decision is made by inspecting the
  377. X *  variable rubber_scoring defined in globals.h.
  378. X */
  379. Xextern Display_Tricks_Taken      ();
  380. Xextern Display_Above_Line_Points ();
  381. Xextern Display_Below_Line_Points ();
  382. Xextern Display_Vulnerabilities   ();
  383. X/* The bidding display is given as four columns, similar to that found
  384. X * in many bridge books.  At the top of each column is printed the
  385. X * corresponding input parameter string to identify the bidder.
  386. X *
  387. X * Before bidding can begin, the bidding display must be initialized.
  388. X * Then, for each bid, that bid must be shown on the display.  And after
  389. X * the bids have been made, the contract must be displayed.  Thus,
  390. X * we have the following procedures:
  391. X *
  392. X * Display_Bidding_Board:  Called to initialize the bidding display.
  393. X *   This procedure should be called once at the beginning of the bidding.
  394. X *
  395. X * Display_Hand_for_Bidding: Called to show what the local player is
  396. X *   holding.  This procedure should be called once after the call to
  397. X *   Display_Bidding_Board.
  398. X *
  399. X * Display_Bidder:  Called to show whose turn it is to bid now.
  400. X *
  401. X * Display_Bid:  Called to show a player's bid.  The current round of
  402. X *   bidding and the player who has bid are passed as input parameters,
  403. X *   but the actual bid is read from the global variable 'bids'.
  404. X *
  405. X * Clear_Bidding_Board:  Called to erase the bidding display.  This should
  406. X *   be called once after the auction has concluded.
  407. X *
  408. X * Display_Contract:  To be called after the auction is over.  This
  409. X *   procedure displays the contract which has been determined by the
  410. X *   bidding.
  411. X */
  412. Xextern Display_Bidding_Board ();
  413. Xextern Display_Hand_for_Bidding ();
  414. Xextern Display_Bidder ();
  415. Xextern Display_Bid ();
  416. Xextern Clear_Bidding_Board ();
  417. Xextern Display_Contract ();
  418. X/* The playing board is a separate display which runs during the play
  419. X * of the hands.  In the center of the screen is displayed a large square
  420. X * which is supposed to represent the tabletop, and the cards which are
  421. X * played are shown on this table top.
  422. X *
  423. X * The playing proceeds also in a series of stages.  First, there is an
  424. X * initial call to draw the playing board.  Then, in each trick there are
  425. X * calls to show the cards which have been played.  At the end of each
  426. X * trick, there is a final call to clear the cards from the playing board.
  427. X * And after all of the tricks have been played, the playing board is
  428. X * cleared.  Thus, we have the following procedures:
  429. X *
  430. X * Display_Playing_Board:  called initially to draw the playing board.
  431. X *
  432. X * Display_Hand:  called at the beginning of each trick to display the
  433. X *   contents of the (local) player's hand.  The player whose hand is to
  434. X *   be displayed is passed as input, mainly as an aid to debugging.
  435. X *
  436. X * Display_Player: called before each card is played to display whose
  437. X *   it is to play next.
  438. X *
  439. X * Display_Play:  called after each card has been played to display the
  440. X *   card on the tabletop.  The player and the card are passed as input.
  441. X *
  442. X * Clear_Hand:  called intermittently to erase a player's hand from
  443. X *   the display.
  444. X *
  445. X * Clear_Plays:  called at the end of each trick to clear the cards from
  446. X *   the tabletop.
  447. X *
  448. X * Clear_Playing_Board:  called after all of the tricks have been played
  449. X *   to clear the 'playing board' from the screen.
  450. X *
  451. X */
  452. Xextern Display_Playing_Board ();
  453. Xextern Display_Hand ();
  454. Xextern Display_Player ();
  455. Xextern Display_Play ();
  456. Xextern Clear_Plays  ();
  457. Xextern Clear_Hand ();
  458. Xextern Clear_Playing_Board ();
  459. X/* One line of the display is reserved for displaying special messages about
  460. X * the status of the game.  The following two procedures are given for
  461. X * manipulating this display.
  462. X */
  463. Xextern Display_Status ();
  464. Xextern Clear_Status_Display ();
  465. X/* The bottom part of the screen is used for the exchange of comments
  466. X * between the players.  The following procedures are used for managing
  467. X * this part of the display.
  468. X */
  469. Xextern Refresh_Player_Comments ();
  470. Xextern Initialize_Player_Comments ();
  471. Xextern Display_Player_Comment ();
  472. X
  473. Xextern Suspend_Comment_Display ();
  474. Xextern Continue_Comment_Display ();
  475. X
  476. END_OF_FILE
  477. if test 5944 -ne `wc -c <'display.h'`; then
  478.     echo shar: \"'display.h'\" unpacked with wrong size!
  479. fi
  480. # end of 'display.h'
  481. fi
  482. if test -f 'help.h' -a "${1}" != "-c" ; then 
  483.   echo shar: Will not clobber existing file \"'help.h'\"
  484. else
  485. echo shar: Extracting \"'help.h'\" \(2491 characters\)
  486. sed "s/^X//" >'help.h' <<'END_OF_FILE'
  487. X/* help.h -- help functions for the bridge program.
  488. X ! 
  489. X ! Copyright (C) 1990,1991 by Matthew Clegg
  490. X ! 
  491. X ! This program may be copied and distributed freely.  Please do not
  492. X ! charge money for this program or for any program derived from it.
  493. X ! If you modify this program, then include a notice stating plainly
  494. X ! that your program is derived from the okbridge program and is not
  495. X ! the same as the official okbridge program.
  496. X !
  497. X ! I welcome any suggestions for improvement to okbridge, and 
  498. X ! I would be especially happy to receive improved source code.
  499. X ! If you have comments or suggestions, or if you would like to
  500. X ! join the okbridge mailing list, then write to
  501. X !
  502. X !   mclegg@cs.ucsd.edu
  503. X !
  504. X *
  505. X * This file contains the interface for a help procedure for the
  506. X * bridge program.  The help function is organized as a series of topics,
  507. X * headed by a main topic.  All of the help information is stored in a
  508. X * single file, organized as a list of topics.  The first entry in the
  509. X * file is interpreted to be the main topic, i.e., it is the entry which
  510. X * is displayed if no particular keyword is given.  Each topic entry
  511. X * has a header line which contains an identifying keyword and a 
  512. X * descriptive phrase.  This is followed by the body of the entry
  513. X * and is terminated by an end-of-entry line.  The format of the header
  514. X * line is simply
  515. X *  <keyword> <phrase>
  516. X * where <keyword> is any text string not containing white space characters.
  517. X * The body of the entry consists simply of a series of text lines.
  518. X * These are displayed in order on the screen.  However, a line beginning
  519. X * with the circumflex '^' character is displayed at the beginning of a
  520. X * new page.  A help entry is terminated by a line containing just the
  521. X * two characters '--'.  The last entry in the file need not have this
  522. X * terminator.  The help file may also contain comment lines.  These
  523. X * begin with the pound sign '#' character.
  524. X */
  525. Xextern initialize_help_system ();
  526. X/* Called once at the beginning of the program to read the file of help
  527. X * topics.
  528. X */
  529. Xextern display_help ();
  530. X/* void display_help (char *topic); */
  531. X/* Displays help on the given topic.  This consists of looking up the
  532. X * help file associated to this topic and displaying the contents of this
  533. X * file on the screen.  If the topic string is empty, then displays first
  534. X * the contents of the main topic file, and then displays a list of the
  535. X * topics.  If there is no help on the given topic, then displays a list
  536. X * of topics.
  537. X */
  538. END_OF_FILE
  539. if test 2491 -ne `wc -c <'help.h'`; then
  540.     echo shar: \"'help.h'\" unpacked with wrong size!
  541. fi
  542. # end of 'help.h'
  543. fi
  544. if test -f 'network.h' -a "${1}" != "-c" ; then 
  545.   echo shar: Will not clobber existing file \"'network.h'\"
  546. else
  547. echo shar: Extracting \"'network.h'\" \(2299 characters\)
  548. sed "s/^X//" >'network.h' <<'END_OF_FILE'
  549. X/* network.h
  550. X ! 
  551. X ! Copyright (C) 1990,1991 by Matthew Clegg
  552. X ! 
  553. X ! This program may be copied and distributed freely.  Please do not
  554. X ! charge money for this program or for any program derived from it.
  555. X ! If you modify this program, then include a notice stating plainly
  556. X ! that your program is derived from the okbridge program and is not
  557. X ! the same as the official okbridge program.
  558. X !
  559. X ! I welcome any suggestions for improvement to okbridge, and 
  560. X ! I would be especially happy to receive improved source code.
  561. X ! If you have comments or suggestions, or if you would like to
  562. X ! join the okbridge mailing list, then write to
  563. X !
  564. X !   mclegg@cs.ucsd.edu
  565. X !
  566. X *
  567. X * This is the interface between the network and the bridge program.
  568. X * It is expected that this part of the program may have to be
  569. X * totally re-written for each different port.  Therefore, the
  570. X * interface has been made as simple as possible.
  571. X *
  572. X * The input and output of this module consists simply of character
  573. X * strings.  However, we assume tacitly that the calling procedures
  574. X * attach the name of the player at the beginning of each transmission.
  575. X *
  576. X * We assume that the network module implements a 'broadcast' model
  577. X * of communication, where every message is transmitted to each of
  578. X * the three other players.  We assume also that the network
  579. X * connections are reliable, in the sense that once a connection is
  580. X * established between two players, it remains intact until the
  581. X * end of the game.  However, we do not make any assumptions about
  582. X * the order in which we may receive the messages.
  583. X */
  584. Xextern initialize_network ();
  585. X/* void initialize_network (char *name); */
  586. X/* To be called once at the beginning of the program. 'name' is the
  587. X   name used by the player. */
  588. Xextern send_message ();
  589. X/* void send_message (char *message); */
  590. Xextern int message_available ();
  591. X/* int message_available (void); */
  592. Xextern receive_message ();
  593. X/* void receive_message (char *message); */
  594. Xextern reset_network ();
  595. X/* void reset_network (void); */
  596. X/* To be called once at the end of the program.  Resets the
  597. X   communications network. */
  598. Xextern Close_Network_Connection ();
  599. X/* void Close_Network_Connection (char *player_name); */
  600. X/* Closes the connection the named player.  Allows the connection to
  601. X   be re-established. */
  602. END_OF_FILE
  603. if test 2299 -ne `wc -c <'network.h'`; then
  604.     echo shar: \"'network.h'\" unpacked with wrong size!
  605. fi
  606. # end of 'network.h'
  607. fi
  608. if test -f 'okbridgerc' -a "${1}" != "-c" ; then 
  609.   echo shar: Will not clobber existing file \"'okbridgerc'\"
  610. else
  611. echo shar: Extracting \"'okbridgerc'\" \(3042 characters\)
  612. sed "s/^X//" >'okbridgerc' <<'END_OF_FILE'
  613. X# .okbridgerc
  614. X# 
  615. X# This is an example startup file for the okbridge program.
  616. X# When okbridge first starts up, it searches for the .okbridgerc
  617. X# startup file.  The current working directory is first searched,
  618. X# and if this fails, then the home directory is searched.
  619. X#
  620. X# Comment lines in the .okbridgerc file begin with a pound sign '#'.
  621. X# Noncomment lines contain a keyword and a value associated to that
  622. X# keyword.  The possible keyword, value pairs are described below.
  623. X#
  624. X#
  625. X#  BELL        ON | OFF
  626. X#    When requesting input (a bid or a play), the terminal's
  627. X#    bell is rung by default.  However, this can be disabled
  628. X#    by specifying 'BELL OFF'.  This has the same effect as the
  629. X#    '/BELL OFF' command.
  630. X# BELL OFF
  631. X
  632. X
  633. X# HELPFILE    <directory-name>
  634. X#   This field specifies the location of the okbridge help file.
  635. X# HELPFILE /usr/local/games/okbridge.help
  636. X#   LOG        <filename>
  637. X#    If this statement is present in the startup file, then
  638. X#    the hands will automatically be logged to the given filename.
  639. X#
  640. XLOG okbridge.log
  641. X
  642. X#  NAME        <local-player-name>
  643. X#    This field specifies the name that will be used to identify
  644. X#    the local player to the other players.
  645. X#
  646. X# NAME matt
  647. X
  648. X#  POSITION    NORTH | EAST | SOUTH | WEST
  649. X#    This field specifies the local player's position.
  650. X#
  651. XPOSITION north
  652. X
  653. X#  PORT        <positive-integer>
  654. X#    This field specifies the internet port number that will be
  655. X#    used for communications with the server.
  656. X#
  657. X# PORT 1122
  658. X
  659. X#  PROMPT     NO | YES
  660. X#    The value of this field is only relevant in hands where the
  661. X#    local player is the dummy.  In this case, the dummy is
  662. X#    ordinarily prompted to press RETURN at the end of each trick.
  663. X#    This allows the dummy to see the cards that are played as they
  664. X#    are played.  However, if 'PROMPT NO' is specified, then the
  665. X#    dummy will not be prompted.
  666. X# PROMPT NO
  667. X
  668. X#  SCORING    RUBBER | CHICAGO | DUPLICATE | EMAIL | IMP
  669. X#    This field is only relevant if the local player is north.
  670. X#    In this case, the SCORING field determines the type of scoring
  671. X#    that will be used by default in the game.
  672. XSCORING EMAIL
  673. X
  674. X#  SERVER    ME | <internet-name-or-number>
  675. X#    If the value of this field is 'ME', then the local player
  676. X#    will assume the role of server.  If the value of this field
  677. X#    is anything else, then it is interpreted as an internet name
  678. X#    or number of the machine where the server is running.
  679. X# SERVER reciprocity
  680. X
  681. X# The following two options are only relevant if the position is
  682. X# north and the scoring mode is email.  In this case, these commands
  683. X# can be used to automatically load and store email duplicate boards.
  684. X#
  685. X#   LOAD        <filename>
  686. X#        Causes the boards stored in the email duplicate file
  687. X#        named <filename> to be automatically loaded at the beginning
  688. X#        of the program.
  689. X#
  690. X#   REPLAY      <filename>
  691. X#        Also causes the boards stored in the email duplicate file
  692. X#        named <filename> to be automatically loaded at the beginning
  693. X#        of the program.  After they have been played, the boards along
  694. X#        with the results of play are automatically saved back to the
  695. X#        same file.
  696. END_OF_FILE
  697. if test 3042 -ne `wc -c <'okbridgerc'`; then
  698.     echo shar: \"'okbridgerc'\" unpacked with wrong size!
  699. fi
  700. # end of 'okbridgerc'
  701. fi
  702. if test -f 'okshuffle.c' -a "${1}" != "-c" ; then 
  703.   echo shar: Will not clobber existing file \"'okshuffle.c'\"
  704. else
  705. echo shar: Extracting \"'okshuffle.c'\" \(4633 characters\)
  706. sed "s/^X//" >'okshuffle.c' <<'END_OF_FILE'
  707. X/* shuffle.c -- generate shuffles for use in email duplicate play.
  708. X ! 
  709. X ! Copyright (C) 1991 by Matthew Clegg
  710. X ! 
  711. X ! This program may be copied and distributed freely.  Please do not
  712. X ! charge money for this program or for any program derived from it.
  713. X ! If you modify this program, then include a notice stating plainly
  714. X ! that your program is derived from the okbridge program and is not
  715. X ! the same as the official okbridge program.
  716. X !
  717. X ! I welcome any suggestions for improvement to okbridge, and 
  718. X ! I would be especially happy to receive improved source code.
  719. X ! If you have comments or suggestions, or if you would like to
  720. X ! join the okbridge mailing list, then write to
  721. X !
  722. X !   mclegg@cs.ucsd.edu
  723. X !
  724. X *
  725. X * Format of command:
  726. X *   
  727. X *   shuffle [nboards] [-d] [-m initial-message]
  728. X *
  729. X * where
  730. X *   nboards 
  731. X *     is the number of boards to generate.  If omitted, nboards
  732. X *     defaults to 4.
  733. X *
  734. X *   initial-message
  735. X *     is a message which will be displayed to each of the players
  736. X *     as soon as the first board is loaded from the file.
  737. X *
  738. X *   -d
  739. X *     is a flag indicating that the date should be written to the
  740. X *     deals file.
  741. X *
  742. X * Writes the encoded boards to standard output.
  743. X *
  744. X */
  745. X
  746. X#include <stdio.h>
  747. X#include <sys/types.h>
  748. X#include <sys/time.h>
  749. X
  750. X#define _BRIDGE_
  751. X
  752. X#include "globals.h"
  753. X#include "email.h"
  754. X
  755. Xint dealer_list [16] =
  756. X{PLAYER_NORTH, PLAYER_EAST, PLAYER_SOUTH, PLAYER_WEST,
  757. X PLAYER_NORTH, PLAYER_EAST, PLAYER_SOUTH, PLAYER_WEST,
  758. X PLAYER_NORTH, PLAYER_EAST, PLAYER_SOUTH, PLAYER_WEST,
  759. X PLAYER_NORTH, PLAYER_EAST, PLAYER_SOUTH, PLAYER_WEST};
  760. X
  761. Xint ns_vulnerability_list [16] =
  762. X{0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1};
  763. X
  764. Xint ew_vulnerability_list [16] =
  765. X{0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0};
  766. X
  767. Xextern char *malloc ();
  768. X
  769. Xchar *strdup (s)
  770. X     char *s;
  771. X{
  772. X  char *p, *q;
  773. X
  774. X  p = q = malloc (strlen(s) + 1);
  775. X  while (*s)
  776. X    *(q++) = *(s++);
  777. X  *q = '\0';
  778. X  return (p);
  779. X
  780. X};
  781. X
  782. Xstatic shuffle_the_deck (cards)
  783. X    deal cards;
  784. X/* Using the algorithm suggested by Douglas Foxvog.  Thanks, Doug! */
  785. X{
  786. X    int i, t, c;
  787. X    deal shuffle;
  788. X    for (i = 0; i < 52; i++) 
  789. X        shuffle [i] = i;
  790. X    for (i = 0; i < 51; i++) {
  791. X        c = (rand () / 97) % (52 - i);
  792. X        t = shuffle[i+c]; 
  793. X        shuffle[i+c] = shuffle[i];
  794. X        shuffle[i] = t;
  795. X    };
  796. X    for (i = 0; i < 52; i++)
  797. X        cards[shuffle[i]] = (i % 4);
  798. X        
  799. X};
  800. X
  801. Xstatic void parameter_error (msg)
  802. X     char *msg;
  803. X{
  804. X  fprintf (stderr, "shuffle: error in parameters: %s\n", msg);
  805. X  fprintf (stderr, "shuffle: usage: shuffle [nboards] [-m initial_message]\n");
  806. X  exit (1);
  807. X};
  808. X
  809. Xmain (argc, argv)
  810. X     int argc; char *argv[];
  811. X{
  812. X  int i, j, nboards, know_nboards, print_date;
  813. X  struct Email_Duplicate_struct *board_list;
  814. X  Email_Board *current_board;
  815. X  Email_Comment *ec;
  816. X  char *initial_message, error_buf[80], date_buffer[80];
  817. X  deal new_deal;
  818. X  time_t time_value;
  819. X
  820. X  nboards = 4;
  821. X  know_nboards = 0;
  822. X  print_date = 0;
  823. X  initial_message = NULL;
  824. X  for (i = 1; i < argc; i++) {
  825. X    if (!strcmp(argv[i], "-d"))
  826. X      print_date = 1;
  827. X    else if (!strcmp(argv[i], "-m")) {
  828. X      i++;
  829. X      if (i < argc)
  830. X    initial_message = strdup (argv[i]);
  831. X      else
  832. X    parameter_error ("initial_message missing");
  833. X    } else if (!know_nboards) {
  834. X      nboards = atoi (argv[i]);
  835. X      know_nboards = 1;
  836. X      if (nboards <= 0) {
  837. X    sprintf (error_buf, "expected integer nboards, but got %s", argv[i]);
  838. X    parameter_error (error_buf);
  839. X      };
  840. X    } else
  841. X      parameter_error ("too many parameters");
  842. X  };
  843. X
  844. X  srand (time(NULL));
  845. X  if (print_date) {
  846. X    time (&time_value);
  847. X    sprintf (date_buffer, "THIS HAND WAS SHUFFLED ON %s", ctime(&time_value));
  848. X    if (date_buffer[strlen(date_buffer)-1] == '\n')
  849. X      date_buffer[strlen(date_buffer)-1] = '\0';
  850. X  };
  851. X
  852. X  board_list = New_Email_Duplicate_Struct ();
  853. X  for (i = 0; i < nboards; i++) {
  854. X    j = i % 16;
  855. X    shuffle_the_deck (new_deal);
  856. X    current_board = Add_Email_Board (board_list, new_deal);
  857. X    current_board->dealer = dealer_list[j];
  858. X    current_board->ns_vulnerable = ns_vulnerability_list[j];
  859. X    current_board->ew_vulnerable = ew_vulnerability_list[j];
  860. X    if (print_date) {
  861. X      ec = (Email_Comment *) malloc(sizeof(Email_Comment));
  862. X      current_board->pre_script = ec;
  863. X      current_board->pre_script->comment = date_buffer;
  864. X      current_board->pre_script->next = NULL;
  865. X    };
  866. X  };
  867. X
  868. X  current_board = board_list->board_list;
  869. X  if ((current_board != NULL) && (initial_message != NULL)) {
  870. X    ec = (Email_Comment *) malloc (sizeof(Email_Comment));
  871. X    ec->next = current_board->pre_script;
  872. X    current_board->pre_script = ec;
  873. X    current_board->pre_script->comment = initial_message;
  874. X  };
  875. X
  876. X  Write_Email_Duplicate_File ("-", 1, board_list);
  877. X    
  878. X
  879. X};
  880. END_OF_FILE
  881. if test 4633 -ne `wc -c <'okshuffle.c'`; then
  882.     echo shar: \"'okshuffle.c'\" unpacked with wrong size!
  883. fi
  884. # end of 'okshuffle.c'
  885. fi
  886. if test -f 'ps.h' -a "${1}" != "-c" ; then 
  887.   echo shar: Will not clobber existing file \"'ps.h'\"
  888. else
  889. echo shar: Extracting \"'ps.h'\" \(3663 characters\)
  890. sed "s/^X//" >'ps.h' <<'END_OF_FILE'
  891. X/* ps.h -- "parse-string" data structure.
  892. X ! 
  893. X ! Copyright (C) 1990,1991 by Matthew Clegg
  894. X ! 
  895. X ! This program may be copied and distributed freely.  Please do not
  896. X ! charge money for this program or for any program derived from it.
  897. X ! If you modify this program, then include a notice stating plainly
  898. X ! that your program is derived from the okbridge program and is not
  899. X ! the same as the official okbridge program.
  900. X !
  901. X ! I welcome any suggestions for improvement to okbridge, and 
  902. X ! I would be especially happy to receive improved source code.
  903. X ! If you have comments or suggestions, or if you would like to
  904. X ! join the okbridge mailing list, then write to
  905. X !
  906. X !   mclegg@cs.ucsd.edu
  907. X !
  908. X *
  909. X * This file defines a data structure for handling strings which are
  910. X * to be parsed.  The crucial aspect of a such a data structure is that
  911. X * it permit the current character to be read without advancing the
  912. X * input pointer.
  913. X *
  914. X * The lifetime of a parse string can be described crudely as follows:
  915. X *   Create the parse string
  916. X *   Repeat:
  917. X *     Copy data into the parse string (from memory or from a file).
  918. X *     Read the data out of the parse string.
  919. X *   End.
  920. X *
  921. X * Thus, we provide procedures for handling each of these steps and for
  922. X * giving some additional information about the string.
  923. X */
  924. Xtypedef char *parse_string;
  925. X#define PS_SIZE        0
  926. X#define PS_LENGTH    1
  927. X#define PS_POS        2
  928. X#define PS_OFFSET    3
  929. Xextern parse_string ps_alloc ();
  930. X/* parse_string ps_alloc (int n); */
  931. X/* Returns a parse_string which can hold up to n bytes of text. */
  932. X/* void ps_reset(parse_string ps); */
  933. X/* Clears a parse_string so that new data can be copied into it. */
  934. X#define ps_reset(ps)    (ps[PS_LENGTH]=ps[PS_POS]=0;)
  935. Xextern ps_put ();
  936. X/* void ps_put (parse_string ps, char ch); */
  937. X/* Adds the character ch to the parse_string ps. */
  938. Xextern ps_copy ();
  939. X/* void ps_copy (parse_string ps, char *s); */
  940. X/* Copies the string s to the parse_string ps.
  941. X   Resets ps before doing the copy. */
  942. Xextern ps_read ();
  943. X/* void ps_read (parse_string ps, FILE *fp); */
  944. X/* Copies the next text line from the file fp to the parse_string ps.
  945. X * Resets ps before doing the copy.
  946. X */
  947. X/* char ps_scan (parse_string ps); */
  948. X/* Returns the current character in the parse_string ps.
  949. X * Does not advance the pointer in ps.
  950. X */
  951. X#define ps_scan(ps)    ((ps[PS_POS] < ps[PS_LENGTH]) ? ps [PS_OFFSET + ps[PS_POS]] : '\0')
  952. Xextern int ps_matches ();
  953. X/* int ps_matches (parse_string ps, char *key); */
  954. X/* Returns TRUE if the next sequence of characters in the parse string
  955. X * matches key.  If so, then advances the pointer in the parse string
  956. X * past key.  Otherwise, returns FALSE.
  957. X */
  958. Xextern int ps_matches_ic ();
  959. X/* int ps_matches_ic (parse_string ps, char *key); */
  960. X/* Returns TRUE if the next sequence of characters in the parse string
  961. X * matches key, after both are converted to upper case.  If so, then
  962. X * advances the pointer in the parse string past key.
  963. X */
  964. X/* int ps_next (parse_string ps); */
  965. X/* Advances the pointer in the parse_string ps to the next character.
  966. X *  Returns the character which the read head has just moved past.
  967. X */
  968. X/* #define ps_next(ps)    (ps[PS_POS]++) */
  969. X#define ps_next(ps) ((ps[PS_POS] < ps[PS_LENGTH]) ? ps[PS_OFFSET+ps[PS_POS]++] : '\0')
  970. X/* int ps_size  (parse_string ps); */
  971. X/* Returns the number of characters allocated for text in ps. */
  972. X#define ps_size(ps)    (ps[PS_SIZE])
  973. X/* int ps_length (parse_string ps); */
  974. X/* Returns the number of characters of text currently used in ps. */
  975. X#define ps_length(ps)    (ps[PS_LENGTH])
  976. X/* int ps_pos (parse_string ps); */
  977. X/* Returns the index of the current character in ps. */
  978. X#define ps_pos(ps)    (ps[PS_POS])
  979. END_OF_FILE
  980. if test 3663 -ne `wc -c <'ps.h'`; then
  981.     echo shar: \"'ps.h'\" unpacked with wrong size!
  982. fi
  983. # end of 'ps.h'
  984. fi
  985. if test -f 'scoring.h' -a "${1}" != "-c" ; then 
  986.   echo shar: Will not clobber existing file \"'scoring.h'\"
  987. else
  988. echo shar: Extracting \"'scoring.h'\" \(3427 characters\)
  989. sed "s/^X//" >'scoring.h' <<'END_OF_FILE'
  990. X/* scoring.h -- scoring functions for the bridge program.
  991. X ! 
  992. X ! Copyright (C) 1990,1991 by Matthew Clegg
  993. X ! 
  994. X ! This program may be copied and distributed freely.  Please do not
  995. X ! charge money for this program or for any program derived from it.
  996. X ! If you modify this program, then include a notice stating plainly
  997. X ! that your program is derived from the okbridge program and is not
  998. X ! the same as the official okbridge program.
  999. X !
  1000. X ! I welcome any suggestions for improvement to okbridge, and 
  1001. X ! I would be especially happy to receive improved source code.
  1002. X ! If you have comments or suggestions, or if you would like to
  1003. X ! join the okbridge mailing list, then write to
  1004. X !
  1005. X !   mclegg@cs.ucsd.edu
  1006. X !
  1007. X *
  1008. X * This file defines the functions used for computing scores.
  1009. X * We provide functions for scoring according to the rules of
  1010. X * rubber bridge as well as according to the rules of Chicago style
  1011. X * bridge.  Instead of being passed parameters, these functions
  1012. X * obtain most of their information from the global variables
  1013. X * defined in globals.h.
  1014. X *
  1015. X * I would like to thank Tom Kronmiller for supplying the code
  1016. X * for scoring according to the Chicago rules.  Thanks Tom!
  1017. X */
  1018. X
  1019. Xextern int Rubber_score_above ();
  1020. X/* int Rubber_score_above (int extra); */
  1021. X/* Computes the above-the-line score for the current contract assuming
  1022. X * that 'extra' many tricks below the required number were taken.
  1023. X * Returns the score.
  1024. X */
  1025. X
  1026. Xextern int Rubber_score_below ();
  1027. X/* int Rubber_score_below (void); */
  1028. X/* Computes the below-the-line score for the current contract,
  1029. X * assuming that it was made.
  1030. X */
  1031. X
  1032. Xextern int Rubber_score_set ();
  1033. X/* int Rubber_score_set (int down); */
  1034. X/* Computes the penalty score for the current contract assuming that
  1035. X * 'down' too few tricks were taken.  Returns the score.
  1036. X */
  1037. X
  1038. Xextern int Chicago_score_made ();
  1039. X/* int Chicago_score_made (int extra, int vulnerable); */
  1040. X/* Computes the score for the current contract assuming that it was made
  1041. X * and that an additional 'extra' tricks were taken.  'vulnerable' is a
  1042. X * boolean flag which indicates whether the declaring team was
  1043. X * vulnerable.  Part_score is the 'part score' of the declaring team.
  1044. X * The scoring is the same as for rubber bridge, except that bidding and
  1045. X * making a game is worth 300 nonvulnerable or 500 vulnerable.
  1046. X * Returns the score.
  1047. X *
  1048. X * Based on code written by Tom Kronmiller
  1049. X */
  1050. X
  1051. Xextern int Chicago_score_set ();
  1052. X/* int Chicago_score_set (int down, int vulnerable); */
  1053. X/* Computes the score for the current contract assuming that it was
  1054. X * set and that 'down' too few tricks were taken.  'vulnerable' is
  1055. X * a boolean flag which indicates whether the declaring team was
  1056. X * vulnerable.  Returns the score.
  1057. X *
  1058. X * Based on code written by Tom Kronmiller
  1059. X */
  1060. X
  1061. Xextern int Duplicate_score_made ();
  1062. X/* int Duplicate_score_made (int extra, int vulnerable); */
  1063. X/* Computes the score for the current contract assuming that it was made
  1064. X * and that an additional 'extra' tricks were taken.  'vulnerable' is a
  1065. X * boolean flag which indicates whether the declaring team was
  1066. X * vulnerable.  Returns the score.
  1067. X */
  1068. X
  1069. Xextern int Duplicate_score_set ();
  1070. X/* int Duplicate_score_set (int down, int vulnerable); */
  1071. X/* Computes the score for the current contract assuming that it was
  1072. X * set and that 'down' too few tricks were taken.  'vulnerable' is
  1073. X * a boolean flag which indicates whether the declaring team was
  1074. X * vulnerable.  Returns the score.
  1075. X */
  1076. X
  1077. X
  1078. END_OF_FILE
  1079. if test 3427 -ne `wc -c <'scoring.h'`; then
  1080.     echo shar: \"'scoring.h'\" unpacked with wrong size!
  1081. fi
  1082. # end of 'scoring.h'
  1083. fi
  1084. if test -f 'socket.c' -a "${1}" != "-c" ; then 
  1085.   echo shar: Will not clobber existing file \"'socket.c'\"
  1086. else
  1087. echo shar: Extracting \"'socket.c'\" \(3577 characters\)
  1088. sed "s/^X//" >'socket.c' <<'END_OF_FILE'
  1089. X/* socket.c -- routines for establishing socket connections
  1090. X *             over the Internet.
  1091. X ! 
  1092. X ! Copyright (C) 1990 by Jarkko Oikarinen
  1093. X ! 
  1094. X ! This program may be copied and distributed freely.  You may modify 
  1095. X ! this program if you like, but we request that you give the modified 
  1096. X ! version a different name.  Also, we would appreciate hearing about 
  1097. X ! any improvements that have been made to the program.
  1098. X ! 
  1099. X ! If you have any questions or comments, then please contact 
  1100. X ! Matthew Clegg at "clegg@tolsun.Oulu.FI".
  1101. X !
  1102. X *
  1103. X *
  1104. X */
  1105. X
  1106. X#include <ctype.h>
  1107. X#include <sys/errno.h>
  1108. X#include <sys/types.h>
  1109. X#include <sys/socket.h>
  1110. X#include <netinet/in.h>
  1111. X#include <netdb.h>
  1112. X#include <stdio.h>
  1113. X#include <sys/time.h>
  1114. X
  1115. X
  1116. X#define RETRY_LIMIT 60
  1117. X
  1118. X
  1119. Xextern int errno;
  1120. Xextern char *sys_errlist[];
  1121. X
  1122. Xchar socket_error [80];
  1123. X
  1124. Xint client_init(host, portnum)
  1125. Xchar *host;
  1126. Xint portnum;
  1127. X/* Attempts to establish a connection with the host identified by the
  1128. X * string 'host' at port 'portnum'.  If the connection is established,
  1129. X * then returns the socket number.  Otherwise, returns -1 and places
  1130. X * an error message in socket_error.
  1131. X */
  1132. X{
  1133. X  int sock, tryagain = 1, notrys;
  1134. X  static struct hostent *hp;
  1135. X  static struct sockaddr_in server;
  1136. X  int server_avail;
  1137. X
  1138. X
  1139. X  notrys = 0;
  1140. X  while (notrys < RETRY_LIMIT) {
  1141. X  /* FIX:  jtrim@duorion.cair.du.edu -- 3/4/89 
  1142. X     and jto@tolsun.oulu.fi -- 3/7/89 */
  1143. X
  1144. X    sock = socket(AF_INET, SOCK_STREAM, 0);
  1145. X/*
  1146. X    sprintf (socket_error, "Assigned socket %d", sock);
  1147. X    Display_Player_Comment ("DEBUG", socket_error);
  1148. X    restore_cursor ();
  1149. X*/
  1150. X    if (sock < 0) {
  1151. X      sprintf (socket_error, "error opening socket: %s",
  1152. X           sys_errlist [errno]);
  1153. X      return (-1);
  1154. X    }
  1155. X    server.sin_family = AF_INET;
  1156. X    
  1157. X    /* MY FIX -- jtrim@duorion.cair.du.edu   (2/10/89) */
  1158. X    if ( isdigit(*host))
  1159. X      {
  1160. X    server.sin_addr.s_addr = inet_addr(host);
  1161. X      }
  1162. X    else
  1163. X      { 
  1164. X    hp = gethostbyname(host);
  1165. X    if (hp == 0) {
  1166. X      sprintf(socket_error, "%s: unknown host\n", host);
  1167. X      return (-1);
  1168. X    }
  1169. X#ifdef HPUX
  1170. X    strncpy(&server.sin_addr, hp->h_addr, hp->h_length);
  1171. X#else
  1172. X    bcopy(hp->h_addr, &server.sin_addr, hp->h_length);
  1173. X#endif
  1174. X      }
  1175. X    server.sin_port = htons(portnum);
  1176. X    /* End Fix */
  1177. X    
  1178. X    server_avail = connect(sock, (struct sockaddr *) &server, sizeof(server));
  1179. X    if (server_avail) {
  1180. X            close (sock);
  1181. X        sprintf (socket_error, "connection error: %s", 
  1182. X             sys_errlist [errno]);
  1183. X/*            printf ("client_init: %s\n", socket_error); */
  1184. X        notrys++;
  1185. X        if (errno == EINTR) return;
  1186. X        sleep (10);
  1187. X    } else
  1188. X      return(sock);
  1189. X  };
  1190. X};
  1191. X
  1192. X
  1193. Xint open_port(portnum)
  1194. Xint portnum;
  1195. X/* Opens a socket port for listening.  If successful, returns the
  1196. X * number of socket which has been established.  If unsuccessful,
  1197. X * returns -1 and places an error string in socket_error.
  1198. X */
  1199. X{
  1200. X  int sock, length;
  1201. X  static struct sockaddr_in server;
  1202. X  /* At first, open a new socket */
  1203. X  sock = socket(AF_INET, SOCK_STREAM, 0);
  1204. X  if (sock < 0) {
  1205. X    sprintf (socket_error, "error opening socket: %s",
  1206. X         sys_errlist[errno]);
  1207. X    return(-1);
  1208. X  }
  1209. X
  1210. X  /* Bind a port to listen for new connections */
  1211. X  server.sin_family = AF_INET;
  1212. X  server.sin_addr.s_addr = INADDR_ANY;
  1213. X  server.sin_port = htons(portnum);
  1214. X/*  for (length = 0; length < 10; length++) { */
  1215. X    if (bind(sock, (struct sockaddr *) (&server), sizeof(server))) {
  1216. X      sprintf (socket_error, "error binding stream socket: %s",
  1217. X           sys_errlist[errno]);
  1218. X/*      if (length >= 9) */
  1219. X    return(-1);
  1220. X/*      sleep(10); */
  1221. X    };
  1222. X/*
  1223. X    else
  1224. X      break;
  1225. X  }
  1226. X*/
  1227. X  listen(sock, 3);
  1228. X  return(sock);
  1229. X}
  1230. X
  1231. END_OF_FILE
  1232. if test 3577 -ne `wc -c <'socket.c'`; then
  1233.     echo shar: \"'socket.c'\" unpacked with wrong size!
  1234. fi
  1235. # end of 'socket.c'
  1236. fi
  1237. if test -f 'terminal.h' -a "${1}" != "-c" ; then 
  1238.   echo shar: Will not clobber existing file \"'terminal.h'\"
  1239. else
  1240. echo shar: Extracting \"'terminal.h'\" \(2076 characters\)
  1241. sed "s/^X//" >'terminal.h' <<'END_OF_FILE'
  1242. X/* terminal
  1243. X ! 
  1244. X ! Copyright (C) 1990,1991 by Matthew Clegg
  1245. X ! 
  1246. X ! This program may be copied and distributed freely.  Please do not
  1247. X ! charge money for this program or for any program derived from it.
  1248. X ! If you modify this program, then include a notice stating plainly
  1249. X ! that your program is derived from the okbridge program and is not
  1250. X ! the same as the official okbridge program.
  1251. X !
  1252. X ! I welcome any suggestions for improvement to okbridge, and 
  1253. X ! I would be especially happy to receive improved source code.
  1254. X ! If you have comments or suggestions, or if you would like to
  1255. X ! join the okbridge mailing list, then write to
  1256. X !
  1257. X !   mclegg@cs.ucsd.edu
  1258. X !
  1259. X *
  1260. X * The TERMINAL module serves as one of the main interfaces to the
  1261. X * operating system, the other interface being the NETWORK module.
  1262. X * This module provides primitives for outputting text to the screen
  1263. X * and reading characters from the keyboard.  We assume that
  1264. X * the screen has at least 24 lines and 80 columns, that the cursor
  1265. X * is addressable, and that it is possible to check in advance whether
  1266. X * or not a character is available from the keyboard.
  1267. X */
  1268. Xextern Initialize_Terminal ();
  1269. X/* To be called once at the beginning of the program. */
  1270. Xextern print ();
  1271. X/* void print (int row, int col, char *message); */
  1272. X/* (1,1) specifies the upper left corner of the screen. */
  1273. Xextern int char_avail ();
  1274. X/* int char_avail (void); */
  1275. X/* Returns TRUE if a character is available from the keyboard. */
  1276. Xextern int input_char ();
  1277. X/* int input_char (void); */
  1278. X/* Returns the next input character from the keyboard. */
  1279. Xextern set_cursor ();
  1280. X/* void set_cursor (int row, int col); */
  1281. X/* Places the cursor at the specified (row, col). */
  1282. Xextern clear_screen ();
  1283. X/* void clear_screen (void); */
  1284. X/* Clears the screen and places the cursor in the upper left corner. */
  1285. Xextern ring_bell ();
  1286. X/* void ring_bell (void); */
  1287. X/* Rings the terminal's bell */
  1288. X
  1289. Xextern Reset_Terminal ();
  1290. X/* void Reset_Terminal (void); */
  1291. X/* To be called at the end of the program to reset the terminal to its
  1292. X   initial operating mode. */
  1293. END_OF_FILE
  1294. if test 2076 -ne `wc -c <'terminal.h'`; then
  1295.     echo shar: \"'terminal.h'\" unpacked with wrong size!
  1296. fi
  1297. # end of 'terminal.h'
  1298. fi
  1299. echo shar: End of archive 7 \(of 7\).
  1300. cp /dev/null ark7isdone
  1301. MISSING=""
  1302. for I in 1 2 3 4 5 6 7 ; do
  1303.     if test ! -f ark${I}isdone ; then
  1304.     MISSING="${MISSING} ${I}"
  1305.     fi
  1306. done
  1307. if test "${MISSING}" = "" ; then
  1308.     echo You have unpacked all 7 archives.
  1309.     rm -f ark[1-9]isdone
  1310.     echo creating input.c from input.c.aa and input.c.ab
  1311.     cat input.c.aa input.c.ab >input.c
  1312.     rm -f input.c.aa input.c.ab
  1313. else
  1314.     echo You still need to unpack the following archives:
  1315.     echo "        " ${MISSING}
  1316. fi
  1317. ##  End of shell archive.
  1318. exit 0
  1319.