diff --git a/cross.mk b/cross.mk index 8dec173..89b37ac 100644 --- a/cross.mk +++ b/cross.mk @@ -1,7 +1,7 @@ DESTDIR = /usr/local/retrobsd MACHINE = mips -CC = gcc +CC = gcc -m32 AS = $(CC) -x assembler-with-cpp LD = ld diff --git a/etc/.gitignore b/etc/.gitignore index c447476..c602e3a 100644 --- a/etc/.gitignore +++ b/etc/.gitignore @@ -1,3 +1,4 @@ phones remote termcap +termcap.full diff --git a/etc/ttys b/etc/ttys index 80edd05..55106e4 100644 --- a/etc/ttys +++ b/etc/ttys @@ -1,16 +1,16 @@ # # name getty type status comments # -console "/libexec/getty std.default" vt100 on secure #special +console "/libexec/getty std.default" xterm on secure #special # Enable some of these for additional logins. Do NOT enable the same one as the # console port, or strange things will happen. You can turn off the console port # if you would rather use the getty on the real tty - it's up to you. -tty0 "/libexec/getty std.default" vt100 off secure -tty1 "/libexec/getty std.default" vt100 off secure -tty2 "/libexec/getty std.default" vt100 off secure -tty3 "/libexec/getty std.default" vt100 off secure -tty4 "/libexec/getty std.default" vt100 off secure -tty5 "/libexec/getty std.default" vt100 off secure -ttyUSB0 "/libexec/getty std.default" vt100 off secure +tty0 "/libexec/getty std.default" xterm off secure +tty1 "/libexec/getty std.default" xterm off secure +tty2 "/libexec/getty std.default" xterm off secure +tty3 "/libexec/getty std.default" xterm off secure +tty4 "/libexec/getty std.default" xterm off secure +tty5 "/libexec/getty std.default" xterm off secure +ttyUSB0 "/libexec/getty std.default" xterm off secure diff --git a/include/curses.h b/include/curses.h index 0370865..28bf21c 100644 --- a/include/curses.h +++ b/include/curses.h @@ -181,6 +181,10 @@ int waddstr (WINDOW *, char *); int wgetstr (WINDOW *, char *); int wdeleteln (WINDOW *); void mvcur(int ly, int lx, int y, int x); +void overwrite(WINDOW *win1, WINDOW *win2); +void wclrtobot(WINDOW *win); +int mvprintw(int y, int x, char *fmt, ...); +int mvwprintw(WINDOW *win, int y, int x, char *fmt, ...); /* * Used to be in unctrl.h. diff --git a/rootfs.manifest b/rootfs.manifest index 47cc8d6..d4b2244 100644 --- a/rootfs.manifest +++ b/rootfs.manifest @@ -417,13 +417,21 @@ file /games/canfield file /games/cfscores file /games/factor file /games/fish +file /games/fortune +file /games/hangman +file /games/mille +file /games/monop file /games/morse file /games/number file /games/ppt file /games/primes +file /games/quiz file /games/rain +file /games/robots file /games/rogue file /games/sail +file /games/snake +file /games/snscore file /games/teachgammon file /games/trek file /games/worm @@ -433,13 +441,52 @@ file /games/wump # # Files: /games/lib # +default +filemode 0444 dir /games/lib file /games/lib/adventure.dat -mode 0444 file /games/lib/battle_strings -mode 0444 file /games/lib/cfscores mode 0666 +file /games/lib/fortunes.dat +file /games/lib/cards.pck +file /games/lib/robots_roll +mode 0666 +file /games/lib/snakerawscores +mode 0666 +dir /games/lib/quiz.k +file /games/lib/quiz.k/africa +file /games/lib/quiz.k/america +file /games/lib/quiz.k/areas +file /games/lib/quiz.k/arith +file /games/lib/quiz.k/asia +file /games/lib/quiz.k/babies +file /games/lib/quiz.k/bard +file /games/lib/quiz.k/chinese +file /games/lib/quiz.k/collectives +file /games/lib/quiz.k/ed +file /games/lib/quiz.k/elements +file /games/lib/quiz.k/europe +file /games/lib/quiz.k/greek +file /games/lib/quiz.k/inca +file /games/lib/quiz.k/index +file /games/lib/quiz.k/latin +file /games/lib/quiz.k/locomotive +file /games/lib/quiz.k/midearth +file /games/lib/quiz.k/morse +file /games/lib/quiz.k/murders +file /games/lib/quiz.k/poetry +file /games/lib/quiz.k/posneg +file /games/lib/quiz.k/pres +file /games/lib/quiz.k/province +file /games/lib/quiz.k/seq-easy +file /games/lib/quiz.k/seq-hard +file /games/lib/quiz.k/sexes +file /games/lib/quiz.k/sov +file /games/lib/quiz.k/spell +file /games/lib/quiz.k/state +file /games/lib/quiz.k/trek +file /games/lib/quiz.k/ucc # # Files: /include @@ -627,9 +674,12 @@ file /libexec/smlrc default filemode 0444 dir /share +dir /share/dict dir /share/misc file /share/emg.keys file /share/re.help +file /share/dict/words +file /share/misc/more.help # # Files: /share/example @@ -716,16 +766,26 @@ file /share/man/cat5/crontab.0 file /share/man/cat5/ranlib.0 file /share/man/cat6/adventure.0 file /share/man/cat6/arithmetic.0 +file /share/man/cat6/atc.0 file /share/man/cat6/backgammon.0 file /share/man/cat6/banner.0 file /share/man/cat6/battlestar.0 file /share/man/cat6/bcd.0 file /share/man/cat6/canfield.0 +file /share/man/cat6/crib.0 +file /share/man/cat6/cribbage.0 file /share/man/cat6/fish.0 +file /share/man/cat6/fortune.0 +file /share/man/cat6/hangman.0 +file /share/man/cat6/mille.0 +file /share/man/cat6/monop.0 file /share/man/cat6/number.0 +file /share/man/cat6/quiz.0 file /share/man/cat6/rain.0 +file /share/man/cat6/robots.0 file /share/man/cat6/rogue.0 file /share/man/cat6/sail.0 +file /share/man/cat6/snake.0 file /share/man/cat6/trek.0 file /share/man/cat6/worm.0 file /share/man/cat6/worms.0 diff --git a/share/dict/words b/share/dict/words new file mode 100644 index 0000000..b810c33 --- /dev/null +++ b/share/dict/words @@ -0,0 +1,25486 @@ +a +AAA +AAAS +aardvark +Aarhus +Aaron +ABA +Ababa +aback +abacus +abalone +abandon +abase +abash +abate +abbas +abbe +abbey +abbot +Abbott +abbreviate +abc +abdicate +abdomen +abdominal +abduct +Abe +abed +Abel +Abelian +Abelson +Aberdeen +Abernathy +aberrant +aberrate +abet +abetted +abetting +abeyance +abeyant +abhor +abhorred +abhorrent +abide +Abidjan +Abigail +abject +abjure +ablate +ablaze +able +ablution +abnegation +Abner +abnormal +Abo +aboard +abode +abolish +abolition +abominable +abominate +aboriginal +aborigine +aborning +abort +abound +about +above +aboveboard +aboveground +abovementioned +abrade +Abraham +Abram +Abramson +abrasion +abrasive +abreact +abreast +abridge +abridgment +abroad +abrogate +abrupt +abscess +abscissa +abscissae +abscond +absent +absentee +absenteeism +absentia +absentminded +absinthe +absolute +absolution +absolve +absorb +absorbent +absorption +absorptive +abstain +abstention +abstinent +abstract +abstractor +abstruse +absurd +absurdum +abuilding +abundant +abusable +abuse +abusive +abut +abutted +abutting +abysmal +abyss +Abyssinia +AC +acacia +academia +academic +academician +academy +Acadia +acanthus +Acapulco +accede +accelerate +accelerometer +accent +accentual +accentuate +accept +acceptant +acceptor +access +accessible +accession +accessory +accident +accidental +accipiter +acclaim +acclamation +acclimate +accolade +accommodate +accompaniment +accompanist +accompany +accomplice +accomplish +accord +accordant +accordion +accost +account +accountant +accouter +Accra +accredit +accreditation +accretion +accrual +accrue +acculturate +accumulate +accuracy +accurate +accusation +accusative +accusatory +accuse +accustom +ace +acerbic +acerbity +acetaminophen +acetate +acetic +acetone +acetylene +Achaean +ache +achieve +Achilles +aching +achromatic +acid +acidic +acidify +acidulate +acidulous +Ackerman +Ackley +acknowledge +acknowledgeable +ACM +acme +acolyte +acorn +acoustic +acquaint +acquaintance +acquiesce +acquiescent +acquire +acquisition +acquisitive +acquit +acquittal +acquitting +acre +acreage +acrid +acrimonious +acrimony +acrobacy +acrobat +acrobatic +acronym +acrophobia +acrophobic +acropolis +across +acrylate +acrylic +act +Actaeon +actinic +actinide +actinium +actinolite +actinometer +activate +Acton +actor +actress +actual +actuarial +actuate +acuity +acumen +acupuncture +acute +acyclic +ad +Ada +adage +adagio +Adair +Adam +adamant +Adamson +adapt +adaptation +adaptive +add +addend +addenda +addendum +addict +Addis +Addison +addition +additive +addle +address +addressee +Addressograph +adduce +Adelaide +Adele +Adelia +Aden +adenine +adenoma +adenosine +adept +adequacy +adequate +adhere +adherent +adhesion +adhesive +adiabatic +adieu +adipic +Adirondack +adjacent +adject +adjectival +adjoin +adjoint +adjourn +adjudge +adjudicate +adjunct +adjust +adjutant +Adkins +Adler +Adlerian +administer +administrable +administrate +administratrix +admiral +admiralty +admiration +admire +admissible +admission +admit +admittance +admitted +admitting +admix +admixture +admonish +admonition +ado +adobe +adolescent +Adolph +Adolphus +Adonis +adopt +adoption +adoptive +adoration +adore +adorn +adposition +adrenal +adrenalin +adrenaline +Adrian +Adriatic +Adrienne +adrift +adroit +adsorb +adsorbate +adsorption +adsorptive +adulate +adult +adulterate +adulterous +adultery +advance +advantage +advantageous +advent +adventitious +adventure +adventurous +adverb +adverbial +adversary +adverse +advert +advertise +advice +advisable +advise +advisee +advisor +advisory +advocacy +advocate +Aegean +aegis +Aeneas +Aeneid +aeolian +Aeolus +aerate +aerial +aerie +Aerobacter +aerobic +aerodynamic +aerofoil +aerogene +aeronautic +aerosol +aerospace +Aeschylus +Aesop +aesthete +aesthetic +afar +affable +affair +affect +affectate +affectionate +afferent +affiance +affidavit +affiliate +affine +affirm +affirmation +affirmative +affix +afflict +affluent +afford +afforest +afforestation +affricate +affront +Afghan +Afghanistan +aficionado +afield +afire +aflame +afloat +afoot +aforementioned +aforesaid +aforethought +afraid +afreet +afresh +Africa +Afrikaans +Afrikaner +afro +aft +afterbirth +aftereffect +afterglow +afterimage +afterlife +aftermath +afternoon +afterthought +afterward +afterword +again +against +Agamemnon +agar +agate +Agatha +agave +age +Agee +agenda +agent +agglomerate +agglutinate +agglutinin +aggravate +aggregate +aggression +aggressive +aggressor +aggrieve +aghast +agile +agitate +agleam +Agnes +Agnew +agnomen +agnostic +ago +agog +agone +agony +agouti +agrarian +agree +agreeable +agreeing +agribusiness +Agricola +agricultural +agriculture +agrimony +agronomist +agronomy +ague +Agway +ah +ahead +ahem +Ahmedabad +ahoy +aid +Aida +aide +Aides +Aiken +ail +ailanthus +aile +aileron +aim +ain't +Ainu +air +airborne +airbrush +aircraft +airdrop +airedale +Aires +airfare +airfield +airflow +airframe +airlift +airline +airlock +airmail +airman +airmass +airmen +airpark +airplane +airport +airspeed +airstrip +airtight +airway +airy +aisle +Aitken +ajar +Ajax +AK +Akers +akin +Akron +AL +ala +Alabama +Alabamian +alabaster +alacrity +Aladdin +alai +Alameda +Alamo +alan +alarm +Alasdair +Alaska +Alastair +alb +alba +albacore +Albania +Albany +albatross +albeit +Alberich +Albert +Alberta +Alberto +albino +Albrecht +Albright +album +albumin +Albuquerque +Alcestis +alchemist +alchemy +Alcmena +Alcoa +alcohol +alcoholic +Alcott +alcove +Aldebaran +aldehyde +Alden +alder +alderman +aldermen +Aldrich +aldrin +ale +Alec +Aleck +aleph +alert +Aleutian +alewife +Alex +Alexander +Alexandra +Alexandre +Alexandria +Alexei +Alexis +alfalfa +alfonso +Alfred +Alfredo +alfresco +alga +algae +algaecide +algal +algebra +algebraic +Algenib +Alger +Algeria +Algiers +alginate +Algol +Algonquian +Algonquin +algorithm +algorithmic +Alhambra +Ali +alia +alias +alibi +Alice +Alicia +alien +alienate +alight +align +alike +alimentary +alimony +aliphatic +aliquot +Alison +Alistair +alive +alizarin +alkali +alkaline +alkaloid +all +Allah +Allan +allay +allegate +allege +Allegheny +allegiant +allegoric +allegory +Allegra +allegro +allele +allemand +Allen +Allentown +allergic +allergy +alleviate +alley +alleyway +alliance +alligator +Allis +Allison +alliterate +allmsgs +allocable +allocate +allot +allotropic +allotted +allotting +allow +allowance +alloy +allspice +Allstate +allude +allure +allusion +allusive +alluvial +alluvium +ally +allyl +Allyn +alma +Almaden +almagest +almanac +almighty +almond +almost +aloe +aloft +aloha +alone +along +alongside +aloof +aloud +alp +alpaca +alpenstock +Alpert +alpha +alphabet +alphabetic +alphanumeric +Alpheratz +Alphonse +alpine +already +Alsatian +also +Alsop +Altair +altar +alter +alterate +altercate +altern +alternate +althea +although +altimeter +altitude +alto +altogether +Alton +altruism +altruist +alum +alumina +aluminate +alumna +alumnae +alumni +alumnus +alundum +Alva +Alvarez +alveolar +alveoli +alveolus +Alvin +alway +alyssum +A&M +am +AMA +Amadeus +amalgam +amalgamate +amanita +amanuensis +amaranth +Amarillo +amass +amateur +amateurish +amatory +amaze +Amazon +ambassador +amber +ambiance +ambidextrous +ambient +ambiguity +ambiguous +ambition +ambitious +ambivalent +amble +ambrose +ambrosia +ambrosial +ambulant +ambulatory +ambuscade +ambush +Amelia +ameliorate +amen +amend +amende +Amerada +America +Americana +americium +Ames +amethyst +amethystine +Amharic +Amherst +ami +amicable +amid +amide +amidst +amigo +amino +aminobenzoic +amiss +amity +Amman +Ammerman +ammeter +ammo +ammonia +ammoniac +ammonite +ammonium +ammunition +amnesia +amnesiac +amnesty +amniocentesis +amniotic +Amoco +amoeba +amoebae +amoeboid +amok +among +amongst +amoral +amorphous +amort +Amos +amount +amp +amperage +ampere +ampersand +Ampex +amphetamine +amphibian +amphibious +amphibole +amphibology +amphioxis +ample +amplify +amplitude +amply +amputate +amra +Amsterdam +Amtrak +amulet +amuse +amy +amygdaloid +an +ana +Anabaptist +Anabel +anachronism +anachronistic +anaconda +Anacreon +anaerobic +anaglyph +anagram +Anaheim +Analects +analeptic +analgesic +analogous +analogue +analogy +analyses +analysis +analyst +analytic +anamorphic +anaphora +anaphoric +anaplasmosis +anarch +anarchic +anarchy +Anastasia +anastigmat +anastigmatic +anastomosis +anastomotic +anathema +Anatole +anatomic +anatomist +anatomy +ancestor +ancestral +ancestry +anchor +anchorage +anchorite +anchovy +ancient +ancillary +and +Andalusia +Andean +Andersen +Anderson +Andes +andesine +andesite +Andorra +Andover +Andre +Andrea +Andrei +Andrew +androgen +Andromache +Andromeda +Andy +anecdotal +anecdote +anemone +anent +anew +angel +Angela +Angeles +angelfish +angelic +Angelica +Angelina +Angeline +Angelo +anger +Angie +angiosperm +angle +Angles +Anglican +Anglo +Anglophobia +Angola +Angora +angry +angst +angstrom +anguish +angular +Angus +anharmonic +Anheuser +anhydride +anhydrite +anhydrous +ani +aniline +animadversion +animadvert +animal +animate +animism +animist +animosity +anion +anionic +anise +aniseikonic +anisotropic +anisotropy +Anita +Ankara +ankle +Ann +Anna +annal +Annale +Annalen +Annapolis +Anne +anneal +annelid +Annette +annex +Annie +annihilate +anniversary +annotate +announce +annoy +annoyance +annual +annuity +annul +annular +annuli +annulled +annulling +annulus +annum +annunciate +anode +anodic +anoint +anomalous +anomaly +anomie +anonymity +anonymous +anorexia +anorthic +anorthite +anorthosite +another +Anselm +Anselmo +ANSI +answer +ant +antacid +Antaeus +antagonism +antagonist +antarctic +Antarctica +Antares +ante +anteater +antebellum +antecedent +antedate +antelope +antenna +antennae +anterior +anthem +anther +anthology +Anthony +anthracite +anthracnose +anthropocentric +anthropogenic +anthropoid +anthropology +anthropomorphic +anthropomorphism +anti +antic +anticipate +anticipatory +anticonvulsant +Antietam +antigen +Antigone +antigorite +Antilles +antimony +Antioch +antipasto +antipathy +antiperspirant +antiphonal +antipodal +antipode +antiquarian +antiquary +antiquated +antique +antiquity +antisemite +antisemitic +antithetic +antivenin +antler +Antoine +Antoinette +Anton +Antonio +Antony +antonym +Antwerp +anus +anvil +anxiety +anxious +any +anybody +anybody'd +anyhow +anyone +anyplace +anything +anyway +anywhere +aorta +A&P +apache +apart +apartheid +apathetic +apathy +apatite +ape +aperiodic +aperture +apex +aphasia +aphasic +aphelion +aphid +aphorism +aphrodisiac +Aphrodite +apiary +apical +apices +apiece +aplomb +apocalypse +apocalyptic +Apocrypha +apocryphal +apogee +Apollo +Apollonian +apologetic +apologia +apology +apoplectic +apoplexy +apostasy +apostate +apostle +apostolic +apostrophe +apothecary +apothegm +apotheosis +Appalachia +appall +appanage +apparatus +apparel +apparent +apparition +appeal +appear +appearance +appeasable +appease +appellant +appellate +append +appendage +appendices +appendix +appertain +appetite +Appian +applaud +applause +apple +Appleby +applejack +Appleton +appliance +applicable +applicant +applicate +applique +apply +appoint +appointe +appointee +apport +apposite +apposition +appraisal +appraise +appreciable +appreciate +apprehend +apprehension +apprehensive +apprentice +apprise +approach +approbation +appropriable +appropriate +approval +approve +approximable +approximant +approximate +apricot +April +apron +apropos +apse +apt +aptitude +aqua +aquarium +Aquarius +aquatic +aqueduct +aqueous +aquifer +Aquila +Aquinas +AR +Arab +arabesque +Arabia +Arabic +Araby +Arachne +arachnid +Arapaho +arbiter +arbitrage +arbitrary +arbitrate +arboreal +arborescent +arboretum +arbutus +arc +arcade +Arcadia +arcana +arcane +arccos +arccosine +arch +archae +archaic +archaism +archangel +archbishop +archdiocese +archenemy +archery +archetype +archetypical +archfool +Archibald +Archimedes +archipelago +architect +architectonic +architectural +architecture +archival +archive +arcing +arclength +arcsin +arcsine +arctan +arctangent +arctic +Arcturus +Arden +ardent +arduous +are +area +areaway +areawide +arena +arenaceous +aren't +Arequipa +Ares +Argentina +Argentine +Argentinian +argillaceous +arginine +Argive +argo +argon +Argonaut +Argonne +argot +argue +argument +argumentation +argumentative +Argus +arhat +aria +Ariadne +Arianism +arid +Aries +arise +arisen +aristocracy +aristocrat +aristocratic +Aristotelean +Aristotelian +Aristotle +arithmetic +Arizona +ark +Arkansan +Arkansas +Arlen +Arlene +Arlington +arm +armada +armadillo +Armageddon +armament +Armata +armature +armchair +Armco +Armenia +armful +armhole +armillaria +armistice +armload +armoire +Armonk +Armour +armpit +Armstrong +army +Arnold +aroma +aromatic +arose +around +arousal +arouse +ARPA +arpeggio +arrack +Arragon +arraign +arrange +arrangeable +array +arrear +arrest +Arrhenius +arrival +arrive +arrogant +arrogate +arrow +arrowhead +arrowroot +arroyo +arsenal +arsenate +arsenic +arsenide +arsine +arson +art +Artemis +artemisia +arterial +arteriole +arteriolosclerosis +arteriosclerosis +artery +artful +arthritis +arthropod +Arthur +artichoke +article +articulate +articulatory +Artie +artifact +artifice +artificial +artillery +artisan +artistry +Arturo +artwork +arty +Aruba +arum +aryl +a's +as +asbestos +ascend +ascendant +ascension +ascent +ascertain +ascetic +ascii +ascomycetes +ascribe +ascription +aseptic +ash +ashame +ashen +Asher +Asheville +Ashland +Ashley +ashman +ashmen +Ashmolean +ashore +ashram +ashtray +ashy +Asia +Asiatic +aside +Asilomar +asinine +ask +askance +askew +asleep +asocial +asparagine +asparagus +aspartic +aspect +aspen +asperity +aspersion +asphalt +aspheric +asphyxiate +aspidistra +aspirant +aspirate +aspire +aspirin +asplenium +ass +assai +assail +assailant +Assam +assassin +assassinate +assault +assay +assemblage +assemble +assent +assert +assess +assessor +asset +assiduity +assiduous +assign +assignation +assignee +assimilable +assimilate +assist +assistant +associable +associate +assonant +assort +assuage +assume +assumption +assurance +assure +Assyria +Assyriology +Astarte +astatine +aster +asteria +asterisk +asteroid +asteroidal +asthma +astigmat +astigmatic +ASTM +astonish +Astor +Astoria +astound +astraddle +astral +astray +astride +astringent +astrologer +astrology +astronaut +astronautic +astronomer +astronomic +astronomy +astrophysical +astrophysicist +astrophysics +astute +Asuncion +asunder +asylum +asymmetry +asymptomatic +asymptote +asymptotic +asynchronous +asynchrony +at +Atalanta +atavism +atavistic +Atchison +ate +Athabascan +atheism +atheist +Athena +Athenian +Athens +athlete +athletic +athwart +Atkins +Atkinson +Atlanta +atlantes +atlantic +Atlantis +atlas +atmosphere +atmospheric +atoll +atom +atomic +atonal +atone +atonic +atop +Atreus +atrocious +atrocity +atrophic +atrophy +Atropos +AT&T +attach +attache +attack +attain +attainder +attempt +attend +attendant +attendee +attention +attentive +attenuate +attest +attestation +attic +Attica +attire +attitude +Attlee +attorney +attract +attribute +attribution +attributive +attrition +attune +Atwater +Atwood +atypic +Auberge +Aubrey +auburn +Auckland +auction +auctioneer +audacious +audacity +audible +audience +audio +audiotape +audiovisual +audit +audition +auditor +auditorium +auditory +Audrey +Audubon +Auerbach +Aug +Augean +auger +augite +augment +augmentation +augur +august +Augusta +Augustine +Augustus +auk +aunt +auntie +aura +aural +Aurelius +aureomycin +auric +Auriga +aurochs +aurora +Auschwitz +auspice +auspices +auspicious +austenite +austere +Austin +austral +Australia +Australis +australite +Austria +authentic +authenticate +author +authoritarian +authoritative +autism +autistic +auto +autobiography +autochthonous +autoclave +autocollimate +autocorrelate +autocracy +autocrat +autocratic +autograph +automat +automata +automate +automatic +automaton +automobile +automorphism +automotive +autonomic +autonomous +autonomy +autopilot +autopsy +autosuggestible +autotransformer +autumn +autumnal +auxiliary +auxin +avail +avalanche +avarice +avaricious +Ave +avenge +Aventine +avenue +aver +average +Avernus +averred +averring +averse +aversion +avert +Avery +Avesta +avian +aviary +aviate +aviatrix +avid +Avignon +avionic +Avis +Aviv +avocado +avocate +avocet +Avogadro +avoid +avoidance +Avon +avow +avowal +await +awake +awaken +award +aware +awash +away +awe +awesome +awful +awhile +awkward +awl +awn +awoke +awry +ax +axe +axial +axiology +axiom +axiomatic +axis +axisymmetric +axle +axolotl +axon +aye +Ayers +Aylesbury +AZ +azalea +Azerbaijan +azimuth +azimuthal +Azores +Aztec +Aztecan +azure +b +babbitt +babble +Babcock +babe +Babel +baboon +baby +Babylon +babysat +babysit +babysitting +baccalaureate +baccarat +bacchanalian +Bacchus +Bach +bachelor +bacilli +bacillus +back +backboard +backbone +backdrop +backfill +backgammon +background +backhand +backlash +backlog +backorder +backpack +backpedal +backplane +backplate +backscatter +backside +backslash +backslide +backspace +backstage +backstitch +backstop +backtrack +backup +backward +backwash +backwater +backwood +backyard +bacon +bacteria +bacterial +bacterium +bad +bade +Baden +badge +badinage +badland +badminton +Baffin +baffle +bag +bagatelle +baggage +bagging +baggy +Baghdad +Bagley +bagpipe +bah +Bahama +Bahrein +bail +Bailey +bailiff +bainite +Baird +bait +Baja +bake +Bakelite +Bakersfield +bakery +Bakhtiari +baklava +Baku +balance +Balboa +balcony +bald +baldpate +Baldwin +baldy +bale +baleen +baleful +Balfour +Bali +Balinese +balk +Balkan +balky +ball +ballad +Ballard +ballast +ballerina +ballet +balletomane +ballfield +balloon +ballot +ballroom +ballyhoo +balm +balmy +balsa +balsam +Baltic +Baltimore +Baltimorean +balustrade +Balzac +bam +Bamako +Bamberger +Bambi +bamboo +ban +Banach +banal +banana +Banbury +band +bandage +bandgap +bandit +bandpass +bandstand +bandstop +bandwagon +bandwidth +bandy +bane +baneberry +baneful +bang +bangkok +Bangladesh +bangle +Bangor +Bangui +banish +banister +banjo +bank +bankrupt +bankruptcy +bannock +banquet +banshee +bantam +banter +Bantu +Bantus +baobab +baptism +baptismal +Baptist +Baptiste +baptistery +bar +barb +Barbados +Barbara +barbarian +barbaric +barbarism +barbarous +barbecue +barbell +barber +barberry +barbital +barbiturate +Barbour +barbudo +Barcelona +Barclay +bard +bare +bareback +barefaced +barefoot +barfly +bargain +barge +baritone +barium +bark +barkeep +barley +Barlow +barn +Barnabas +barnacle +Barnard +Barnes +Barnet +Barnett +Barney +Barnhard +barnstorm +Barnum +barnyard +barometer +baron +baroness +baronet +baronial +barony +baroque +Barr +barrack +barracuda +barrage +barre +barrel +barren +Barrett +barrette +barricade +barrier +Barrington +barrow +Barry +Barrymore +Barstow +bartend +bartender +barter +Barth +Bartholomew +Bartlett +Bartok +Barton +barycentric +baryon +basal +basalt +basaltic +base +baseball +baseband +baseboard +Basel +baseline +baseman +basemen +baseplate +basepoint +bash +bashaw +bashful +basic +basidiomycetes +basil +basilar +basilica +basilisk +basin +basis +bask +basket +basketball +basketry +basophilic +Basque +bass +Bassett +bassi +bassinet +basso +bassoon +basswood +bastard +baste +bastion +bat +Batavia +batch +Batchelder +bate +bateau +Bateman +bater +bath +bathe +bathos +bathrobe +bathroom +bathtub +Bathurst +batik +baton +Bator +batt +battalion +Battelle +batten +battery +battle +battlefield +battlefront +battleground +batwing +bauble +baud +Baudelaire +Bauer +Bauhaus +Bausch +bauxite +Bavaria +bawd +bawdy +bawl +Baxter +bay +bayberry +Bayda +Bayesian +Baylor +bayonet +Bayonne +bayou +Bayport +Bayreuth +bazaar +be +beach +beachhead +beacon +bead +beadle +beady +beagle +beak +beam +bean +bear +bearberry +beard +Beardsley +bearish +beast +beastie +beat +beaten +beater +beatific +beatify +beatitude +beatnik +Beatrice +beau +Beaujolais +Beaumont +Beauregard +beauteous +beautiful +beautify +beauty +beaux +beaver +bebop +becalm +became +because +Bechtel +beck +becket +Beckman +beckon +Becky +become +bed +bedazzle +bedbug +bedevil +bedfast +bedfellow +Bedford +bedim +bedimmed +bedimming +bedlam +bedpost +bedraggle +bedridden +bedrock +bedroom +bedside +bedspread +bedspring +bedstraw +bedtime +bee +Beebe +beebread +beech +Beecham +beechwood +beef +beefsteak +beefy +beehive +been +beep +beer +beeswax +beet +Beethoven +beetle +befall +befallen +befell +befit +befitting +befog +befogging +before +beforehand +befoul +befriend +befuddle +beg +began +begat +beget +begetting +beggar +beggary +begging +begin +beginner +beginning +begonia +begot +begotten +begrudge +beguile +begun +behalf +behave +behead +beheld +behind +behold +beige +Beijing +being +Beirut +bel +Bela +belate +belch +Belfast +belfry +Belgian +Belgium +Belgrade +belie +belief +believe +belittle +Belize +bell +Bella +belladonna +Bellamy +Bellatrix +bellboy +belle +bellflower +bellhop +bellicose +belligerent +Bellingham +Bellini +bellman +bellmen +bellow +bellum +bellwether +belly +bellyache +bellyaching +bellyful +Belmont +Beloit +belong +belove +below +Belshazzar +belt +Beltsville +beluga +belvedere +BEMA +bemadden +beman +bemoan +bemuse +Ben +Benares +bench +benchmark +bend +Bendix +beneath +Benedict +Benedictine +benediction +Benedikt +benefactor +benefice +beneficent +beneficial +beneficiary +benefit +Benelux +benevolent +Bengal +Bengali +benight +benign +Benjamin +Bennett +Bennington +Benny +Benson +bent +Bentham +benthic +Bentley +Benton +Benz +Benzedrine +benzene +Beograd +Beowulf +beplaster +bequeath +bequest +berate +Berea +bereave +bereft +Berenices +Beresford +beret +berg +bergamot +Bergen +Bergland +Berglund +Bergman +Bergson +Bergstrom +beribbon +beriberi +Berkeley +berkelium +Berkowitz +Berkshire +Berlin +Berlioz +Berlitz +Berman +Bermuda +Bern +Bernadine +Bernard +Bernardino +Bernardo +berne +Bernet +Bernhard +Bernice +Bernie +Berniece +Bernini +Bernoulli +Bernstein +Berra +berry +berserk +Bert +berth +Bertha +Bertie +Bertram +Bertrand +Berwick +beryl +beryllium +beseech +beset +besetting +beside +besiege +besmirch +besotted +bespeak +bespectacled +bespoke +Bess +Bessel +Bessemer +Bessie +best +bestial +bestiary +bestir +bestirring +bestow +bestowal +bestseller +bestselling +bestubble +bet +beta +betatron +betel +Betelgeuse +beth +bethel +Bethesda +Bethlehem +bethought +betide +betoken +betony +betray +betrayal +betroth +betrothal +Betsey +Betsy +Bette +bettor +Betty +between +betwixt +bevel +beverage +Beverly +bevy +bewail +beware +bewhisker +bewilder +bewitch +bey +beyond +bezel +Bhagavadgita +bhoy +Bhutan +Bialystok +bianco +bias +biaxial +bib +bibb +Bible +biblical +bibliography +bibliophile +bicameral +bicarbonate +bicep +bichromate +bicker +biconcave +biconnected +bicycle +bid +bidden +biddy +bide +bidiagonal +bidirectional +bien +biennial +biennium +bifocal +bifurcate +big +bigamy +Bigelow +Biggs +bighorn +bigot +bigotry +biharmonic +bijection +bijective +bijouterie +bike +bikini +bilabial +bilateral +bilayer +Bilbao +bile +bilge +bilharziasis +bilinear +bilingual +bilk +bill +billboard +billet +billfold +billiard +Billie +Billiken +billion +billionth +billow +billy +Biltmore +bimetallic +bimetallism +Bimini +bimodal +bimolecular +bimonthly +bin +binary +binaural +bind +bindery +bindle +bindweed +bing +binge +Bingham +Binghamton +bingle +Bini +binocular +binomial +binuclear +biochemic +biography +biology +biometry +biopsy +biota +biotic +biotite +bipartisan +bipartite +bipedal +biplane +bipolar +biracial +birch +bird +birdbath +birdcage +birdie +birdseed +birdwatch +birefringent +Birgit +Birmingham +birth +birthday +birthplace +birthrate +birthright +biscuit +bisect +bisexual +bishop +bishopric +Bismarck +Bismark +bismuth +bison +bisque +Bissau +bistable +bistate +bit +bitch +bite +bitnet +bitt +bitten +bittern +bitternut +bitterroot +bittersweet +bitumen +bituminous +bitwise +bivalve +bivariate +bivouac +biz +bizarre +Bizet +blab +black +blackball +blackberry +blackbird +blackboard +blackbody +Blackburn +blacken +Blackfeet +Blackfoot +blackguard +blackjack +blackmail +Blackman +blackout +blacksmith +Blackstone +blacktop +Blackwell +bladder +bladdernut +bladderwort +blade +Blaine +Blair +Blake +blame +blameworthy +blanc +blanch +Blanchard +Blanche +bland +blandish +blank +blanket +blare +blaspheme +blasphemous +blasphemy +blast +blastula +blat +blatant +blather +Blatz +blaze +blazon +bleach +bleak +bleary +bleat +bled +bleed +Bleeker +blemish +blend +Blenheim +bless +blest +blew +blight +blimp +blind +blindfold +blink +Blinn +blip +bliss +blissful +blister +blithe +blitz +blitzkrieg +blizzard +bloat +blob +bloc +Bloch +block +blockade +blockage +blockhouse +blocky +bloke +Blomberg +Blomquist +blond +blonde +blood +bloodbath +bloodhound +bloodletting +bloodline +bloodroot +bloodshed +bloodshot +bloodstain +bloodstone +bloodstream +bloody +bloom +Bloomfield +Bloomington +bloop +blossom +blot +blotch +blouse +blow +blowfish +blown +blowup +blubber +bludgeon +blue +blueback +blueberry +bluebill +bluebird +bluebonnet +bluebook +bluebush +bluefish +bluegill +bluegrass +bluejacket +blueprint +bluestocking +bluet +bluff +bluish +Blum +Blumenthal +blunder +blunderbuss +blunt +blur +blurb +blurry +blurt +blush +bluster +blustery +blutwurst +Blvd +Blythe +BMW +boa +boar +board +boardinghouse +boast +boastful +boat +boathouse +boatload +boatman +boatmen +boatswain +boatyard +bob +Bobbie +bobbin +bobble +bobby +bobcat +bobolink +Boca +bock +bode +bodhisattva +bodice +Bodleian +body +bodybuilder +bodybuilding +bodyguard +Boeing +Boeotia +bog +bogey +bogeyman +bogeymen +bogging +boggle +boggy +Bogota +bogus +bogy +Bohemia +Bohr +boil +Bois +Boise +boisterous +bold +boldface +bole +boletus +bolivar +Bolivia +bolo +Bologna +bolometer +Bolshevik +Bolshevism +Bolshevist +Bolshoi +bolster +bolt +Bolton +Boltzmann +bomb +bombard +bombast +bombastic +Bombay +bombproof +bon +bona +bonanza +Bonaparte +Bonaventure +bond +bondage +bondsman +bondsmen +bone +bonfire +bong +bongo +Boniface +bonito +Bonn +bonnet +Bonneville +Bonnie +bonus +bony +bonze +boo +booby +boogie +book +bookbind +bookcase +bookend +bookie +bookish +bookkeep +booklet +bookmark +bookplate +bookseller +bookshelf +bookshelves +bookstore +bookworm +booky +boolean +boom +boomerang +boon +Boone +boor +boorish +boost +boot +Bootes +booth +bootleg +bootlegger +bootlegging +bootstrap +bootstrapping +booty +booze +bop +borate +borax +Bordeaux +bordello +Borden +border +borderland +borderline +bore +boreal +Borealis +Boreas +boredom +Borg +boric +Boris +born +borne +Borneo +boron +borosilicate +borough +Borroughs +borrow +Bosch +Bose +bosom +boson +bosonic +Bosporus +boss +bossy +Boston +Boswell +botanic +botanist +botany +botch +botfly +both +bothersome +Botswana +bottle +bottlecap +bottleneck +bottom +bottommost +botulin +botulism +Boucher +bouffant +bough +bought +bouillabaisse +bouillon +boulder +boulevard +bounce +bouncy +bound +boundary +bountiful +bounty +bouquet +Bourbaki +bourbon +bourgeois +bourgeoisie +bourn +boustrophedon +bout +boutique +bovine +bow +Bowditch +Bowdoin +bowel +Bowen +bowerbird +bowfin +bowie +bowl +bowline +bowman +bowmen +bowstring +box +boxcar +boxwood +boxy +boy +boyar +Boyce +boycott +Boyd +boyish +Boyle +Boylston +BP +brace +bracelet +bracken +bracket +brackish +bract +brad +Bradbury +Bradford +Bradley +Bradshaw +Brady +brae +brag +Bragg +bragging +Brahmaputra +Brahms +Brahmsian +braid +Braille +brain +Brainard +brainchild +brainstorm +brainwash +brainy +brake +brakeman +brakemen +bramble +bran +branch +brand +Brandeis +Brandenburg +brandish +Brandon +Brandt +brandy +brandywine +Braniff +brant +brash +Brasilia +brass +brassiere +brassy +bratwurst +Braun +bravado +brave +bravery +bravo +bravura +brawl +bray +brazen +brazier +Brazil +Brazilian +Brazzaville +breach +bread +breadboard +breadfruit +breadroot +breadth +break +breakage +breakaway +breakdown +breakfast +breakneck +breakoff +breakpoint +breakthrough +breakup +breakwater +bream +breast +breastplate +breastwork +breath +breathe +breathtaking +breathy +breccia +bred +breech +breed +breeze +breezy +Bremen +bremsstrahlung +Brenda +Brendan +Brennan +Brenner +Brent +Brest +brethren +Breton +Brett +breve +brevet +brevity +brew +brewery +Brewster +Brian +briar +bribe +bribery +Brice +brick +brickbat +bricklayer +bricklaying +bridal +bride +bridegroom +bridesmaid +bridge +bridgeable +bridgehead +Bridgeport +Bridget +Bridgetown +Bridgewater +bridgework +bridle +Brie +brief +briefcase +brig +brigade +brigadier +brigand +brigantine +Briggs +Brigham +bright +brighten +Brighton +brilliant +Brillouin +brim +brimful +brimstone +Brindisi +brindle +brine +bring +brink +brinkmanship +briny +Brisbane +brisk +bristle +bristlecone +bristly +Bristol +Britain +Britannic +Britannica +britches +British +Briton +Brittany +Britten +brittle +broach +broad +broadcast +broaden +broadloom +broadminded +broadside +Broadway +brocade +broccoli +brochure +Brock +brockle +Broglie +broil +broke +broken +brokerage +Bromfield +bromide +bromine +Bromley +bronchi +bronchial +bronchiolar +bronchiole +bronchitis +bronchus +bronco +Brontosaurus +Bronx +bronze +bronzy +brood +broody +brook +Brooke +Brookhaven +Brookline +Brooklyn +brookside +broom +broomcorn +broth +brothel +brother +brought +brouhaha +brow +browbeaten +brown +Browne +Brownell +Brownian +brownie +brownish +browse +Bruce +brucellosis +Bruckner +Bruegel +bruise +bruit +Brumidi +brunch +brunette +Brunhilde +Bruno +Brunswick +brunt +brush +brushfire +brushstroke +brushwork +brushy +brusque +Brussels +brutal +brute +Bryan +Bryant +Bryce +Bryn +bryophyta +bryophyte +bryozoa +b's +BSTJ +BTL +bub +bubble +bubonic +buccaneer +Buchanan +Bucharest +Buchenwald +Buchwald +buck +buckaroo +buckboard +bucket +bucketful +buckeye +buckhorn +buckle +Buckley +Bucknell +buckshot +buckskin +buckthorn +buckwheat +bucolic +bud +Budapest +Budd +Buddha +Buddhism +Buddhist +buddy +budge +budget +budgetary +Budweiser +Buena +Buenos +buff +buffalo +buffet +bufflehead +buffoon +bug +bugaboo +bugeyed +bugging +buggy +bugle +Buick +build +buildup +built +builtin +Bujumbura +bulb +bulblet +bulbous +Bulgaria +bulge +bulk +bulkhead +bulky +bull +bulldog +bulldoze +bullet +bulletin +bullfinch +bullfrog +bullhead +bullhide +bullish +bullock +bullrush +bullseye +bullwhack +bully +bullyboy +bulrush +bulwark +bum +bumble +bumblebee +bump +bumpkin +bumptious +bumpy +bun +bunch +Bundestag +bundle +Bundoora +bundy +bungalow +bungle +bunk +bunkmate +bunny +Bunsen +bunt +Bunyan +buoy +buoyant +burbank +Burch +burden +burdensome +burdock +bureau +bureaucracy +bureaucrat +bureaucratic +buret +burette +burg +burgeon +burgess +burgher +burglar +burglarproof +burglary +Burgundian +Burgundy +burial +Burke +burl +burlap +burlesque +burley +Burlington +burly +Burma +Burmese +burn +Burnett +Burnham +burnish +burnout +Burnside +burnt +burp +Burr +burro +Burroughs +burrow +bursitis +burst +bursty +Burt +Burton +Burtt +Burundi +bury +bus +busboy +Busch +bush +bushel +bushland +bushmaster +Bushnell +bushwhack +bushy +business +businessman +businessmen +businesswoman +businesswomen +busload +buss +bust +bustard +bustle +busy +busywork +but +butadiene +butane +butch +butchery +butene +buteo +butler +butt +butte +butterball +buttercup +butterfat +Butterfield +butterfly +buttermilk +butternut +butterscotch +buttery +buttock +button +buttonhole +buttonweed +buttress +Buttrick +butyl +butyrate +butyric +buxom +Buxtehude +Buxton +buy +buzz +buzzard +buzzing +buzzword +buzzy +by +bye +bygone +bylaw +byline +bypass +bypath +byproduct +Byrd +Byrne +byroad +Byron +Byronic +bystander +byte +byway +byword +Byzantine +Byzantium +c +CA +cab +cabal +cabana +cabaret +cabbage +cabdriver +cabin +cabinet +cabinetmake +cabinetry +cable +Cabot +cacao +cachalot +cache +caching +cackle +CACM +cacophonist +cacophonous +cacophony +cacti +cactus +cadaver +cadaverous +caddis +caddy +cadent +cadenza +cadet +Cadillac +cadmium +cadre +Cady +Caesar +Caesarian +cafe +cafeteria +cage +cagey +Cahill +cahoot +caiman +Cain +Caine +cairn +Cairo +cajole +Cajun +cake +Cal +calabash +Calais +calamitous +calamity +calamus +calcareous +calcify +calcite +calcium +calculable +calculate +calculi +calculus +Calcutta +Calder +caldera +Caldwell +Caleb +calendar +calendrical +calf +calfskin +Calgary +Calhoun +caliber +calibrate +calibre +calico +California +californium +caliper +caliph +caliphate +calisthenic +Calkins +call +calla +Callaghan +Callahan +calligraph +calligraphy +calliope +Callisto +callosity +callous +callus +calm +caloric +calorie +calorimeter +Calumet +calumniate +calumny +Calvary +calve +Calvert +Calvin +calypso +calyx +cam +camaraderie +camber +Cambodia +Cambrian +cambric +Cambridge +Camden +came +camel +camelback +camellia +camelopard +Camelot +Camembert +cameo +camera +cameraman +cameramen +Cameron +Cameroon +Cameroun +camilla +Camille +Camino +camouflage +camp +campaign +campanile +Campbell +campfire +campground +campion +campsite +campus +can +Canaan +Canada +Canadian +canal +canary +Canaveral +Canberra +cancel +cancellate +cancelled +cancelling +cancer +cancerous +candela +candelabra +candid +candidacy +candidate +Candide +candle +candlelight +candlestick +candlewick +candy +cane +Canfield +canine +Canis +canister +canker +cankerworm +canna +cannabis +cannel +cannery +cannibal +cannister +cannon +cannonball +cannot +canny +canoe +canoeist +Canoga +canon +canonic +Canopus +canopy +can't +cant +Cantabrigian +cantaloupe +canteen +Canterbury +canterelle +canticle +cantilever +cantle +canto +canton +Cantonese +cantor +canvas +canvasback +canvass +canyon +cap +capacious +capacitance +capacitate +capacitive +capacitor +capacity +cape +capella +caper +Capetown +capillary +Capistrano +capita +capital +capitol +Capitoline +capitulate +capo +caprice +capricious +Capricorn +capsize +capstan +capstone +capsule +captain +captaincy +caption +captious +captivate +captive +captor +capture +capuchin +Caputo +capybara +car +carabao +Caracas +caramel +carapace +caravan +caraway +carbide +carbine +carbohydrate +Carboloy +carbon +carbonaceous +carbonate +Carbondale +Carbone +carbonic +Carboniferous +carbonium +carbonyl +carborundum +carboxy +carboxylic +carboy +carbuncle +carcass +carcinogen +carcinogenic +carcinoma +card +cardamom +cardboard +cardiac +Cardiff +cardigan +cardinal +cardioid +cardiology +cardiovascular +care +careen +career +carefree +careful +caress +caret +caretaker +careworn +Carey +Cargill +cargo +cargoes +Carib +Caribbean +caribou +caricature +Carl +Carla +Carleton +Carlin +Carlisle +Carlo +carload +Carlsbad +Carlson +Carlton +Carlyle +Carmela +Carmen +Carmichael +carmine +carnage +carnal +carnation +carne +Carnegie +carney +carnival +carob +carol +Carolina +Caroline +Carolingian +Carolinian +Carolyn +carouse +carousel +carp +carpal +Carpathia +carpenter +carpentry +carpet +carpetbag +carpetbagger +carpetbagging +carport +Carr +carrageen +Carrara +carrel +carriage +Carrie +carrion +Carroll +carrot +Carruthers +carry +carryover +Carson +cart +carte +cartel +Cartesian +Carthage +cartilage +cartilaginous +cartographer +cartography +carton +cartoon +cartridge +cartwheel +Caruso +carve +carven +Casanova +casbah +cascade +cascara +case +casebook +casein +casework +Casey +cash +cashew +cashier +cashmere +casino +cask +casket +Cassandra +cassava +casserole +cassette +Cassiopeia +Cassius +cassock +cast +castanet +caste +casteth +castigate +Castillo +castle +castor +castrate +Castro +casual +casualty +cat +cataclysmic +cataleptic +Catalina +catalogue +Catalonia +catalpa +catalysis +catalyst +catalytic +catapult +cataract +catastrophe +catastrophic +catatonia +catatonic +catawba +catbird +catch +catchup +catchword +catchy +catechism +categoric +category +catenate +cater +caterpillar +catfish +catharsis +cathedral +Catherine +Catherwood +catheter +cathode +cathodic +catholic +Cathy +cation +cationic +catkin +catnip +Catskill +catsup +cattail +cattle +cattleman +cattlemen +catwalk +Caucasian +Caucasus +Cauchy +caucus +caudal +caught +cauliflower +caulk +causal +causate +cause +caustic +caution +cautionary +cautious +cavalcade +cavalier +cavalry +cave +caveat +caveman +cavemen +Cavendish +cavern +cavernous +caviar +cavil +cavilling +Caviness +cavort +caw +cayenne +Cayley +Cayuga +CBS +CDC +cease +ceasefire +Cecil +Cecilia +Cecropia +cedar +cede +cedilla +Cedric +ceil +celandine +Celanese +Celebes +celebrant +celebrate +celebratory +celebrity +celerity +celery +celesta +celestial +Celia +cell +cellar +cellophane +cellular +celluloid +cellulose +Celsius +Celt +Celtic +cement +cemetery +Cenozoic +censor +censorial +censure +census +cent +centaur +centenary +centennial +centerline +centerpiece +centigrade +centipede +central +centrex +centric +centrifugal +centrifugate +centrifuge +centripetal +centrist +centroid +centum +century +Cepheus +ceramic +ceramium +Cerberus +cereal +cerebellum +cerebral +cerebrate +ceremonial +ceremonious +ceremony +Ceres +cereus +cerise +cerium +CERN +certain +certainty +certificate +certify +certiorari +certitude +cerulean +Cervantes +cervix +Cesare +cesium +cessation +cession +Cessna +cetacean +cetera +Cetus +Ceylon +Cezanne +cf +Chablis +Chad +Chadwick +chafe +chaff +chagrin +chain +chair +chairlady +chairman +chairmen +chairperson +chairwoman +chairwomen +chaise +chalcedony +chalcocite +chalice +chalk +chalkline +chalky +challenge +Chalmers +chamber +chamberlain +chambermaid +chameleon +chamfer +chamois +chamomile +champ +champagne +Champaign +champion +Champlain +chance +chancel +chancellor +chancery +chancy +chandelier +Chandigarh +chandler +Chang +change +changeable +changeover +channel +chanson +chant +chantey +Chantilly +chantry +Chao +chaos +chaotic +chap +chaparral +chapati +chapel +chaperon +chaperone +chaplain +Chaplin +Chapman +chapter +char +character +characteristic +charcoal +charcuterie +chard +charge +chargeable +chariot +charisma +charismatic +charitable +charity +Charlemagne +Charles +Charleston +Charley +Charlie +Charlotte +Charlottesville +charm +Charon +chart +Charta +Chartres +chartreuse +chartroom +Charybdis +chase +chasm +chassis +chaste +chastise +chastity +chat +chateau +chateaux +Chatham +Chattanooga +chattel +chatty +Chaucer +chauffeur +Chauncey +Chautauqua +chauvinism +chauvinist +chaw +cheap +cheat +cheater +check +checkbook +checkerberry +checkerboard +checklist +checkout +checkpoint +checksum +checksummed +checksumming +checkup +Cheddar +cheek +cheekbone +cheeky +cheer +cheerful +cheerleader +cheery +cheese +cheesecake +cheesecloth +cheesemaking +cheesy +cheetah +chef +chelate +Chelsea +chemic +chemise +chemisorb +chemisorption +chemist +chemistry +chemotherapy +Chen +Cheney +chenille +cherish +Cherokee +cherry +chert +cherub +cherubim +Cheryl +Chesapeake +Cheshire +chess +chest +Chester +Chesterton +chestnut +chevalier +Chevrolet +chevron +chevy +chew +chewy +Cheyenne +chi +Chiang +chianti +chic +Chicago +Chicagoan +chicanery +Chicano +chick +chickadee +chicken +chickpea +chickweed +chicory +chide +chief +chiefdom +chieftain +chiffon +chigger +chignon +chilblain +child +childbearing +childbirth +childish +childrearing +children +Chile +chili +chill +chilly +chime +chimera +chimeric +Chimique +chimney +chimpanzee +chin +china +Chinaman +Chinamen +Chinatown +chinch +chinchilla +chine +Chinese +chink +Chinook +chinquapin +chintz +chintzy +chip +chipboard +chipmunk +Chippendale +chiropractor +chirp +chisel +Chisholm +chit +chitin +chitinous +chiton +chivalrous +chivalry +chive +Chloe +chlorate +chlordane +chloride +chlorine +chloroform +chlorophyll +chloroplast +chloroplatinate +chock +chocolate +Choctaw +choice +choir +choirmaster +choke +chokeberry +cholera +cholesterol +choline +cholinesterase +chomp +Chomsky +chondrite +choose +choosy +chop +Chopin +choppy +chopstick +choral +chorale +chord +chordal +chordata +chordate +chore +choreograph +choreography +chorine +chortle +chorus +choryza +chose +chosen +Chou +chow +chowder +Chris +Christ +christen +Christendom +Christensen +Christenson +Christian +Christiana +Christianson +Christie +Christina +Christine +Christmas +Christoffel +Christoph +Christopher +Christy +chromate +chromatic +chromatin +chromatogram +chromatograph +chromatography +chrome +chromic +chromium +chromosomal +chromosome +chromosphere +chronic +chronicle +chronograph +chronography +chronology +chrysalis +chrysanthemum +Chrysler +chrysolite +chub +chubby +chuck +chuckle +chuckwalla +chuff +chug +chugging +chum +chummy +chump +Chungking +chunk +chunky +church +churchgoer +churchgoing +Churchill +Churchillian +churchman +churchmen +churchwoman +churchwomen +churchyard +churn +chute +chutney +CIA +cicada +Cicero +Ciceronian +cider +cigar +cigarette +cilia +ciliate +cinch +Cincinnati +cinder +Cinderella +Cindy +cinema +cinematic +Cinerama +cinnabar +cinnamon +cinquefoil +cipher +circa +circadian +Circe +circle +circlet +circuit +circuitous +circuitry +circulant +circular +circulate +circulatory +circumcircle +circumcise +circumcision +circumference +circumferential +circumflex +circumlocution +circumpolar +circumscribe +circumscription +circumspect +circumsphere +circumstance +circumstantial +circumvent +circumvention +circus +cistern +cit +citadel +citation +cite +citizen +citizenry +citrate +citric +Citroen +citron +citrus +city +cityscape +citywide +civet +civic +civil +civilian +clad +cladophora +claim +claimant +Claire +clairvoyant +clam +clamber +clammy +clamp +clamshell +clan +clandestine +clang +clank +clannish +clap +clapboard +Clapeyron +Clara +Clare +Claremont +Clarence +Clarendon +claret +clarify +clarinet +clarity +Clark +Clarke +clash +clasp +class +classic +classificatory +classify +classmate +classroom +classy +clatter +clattery +Claude +Claudia +Claudio +Claus +clause +Clausen +Clausius +claustrophobia +claustrophobic +clavicle +claw +clay +Clayton +clean +cleanse +cleanup +clear +clearance +clearheaded +Clearwater +cleat +cleavage +cleave +clef +cleft +Clemens +clement +Clemson +clench +clergy +clergyman +clergymen +cleric +clerk +Cleveland +clever +cliche +click +client +clientele +cliff +cliffhang +Clifford +Clifton +climactic +climate +climatic +climatology +climax +climb +clime +clinch +cling +clinic +clinician +clink +Clint +Clinton +Clio +clip +clipboard +clique +clitoris +Clive +cloaca +cloacal +cloak +cloakroom +clobber +clock +clockwatcher +clockwise +clockwork +clod +cloddish +clog +clogging +cloister +clomp +clone +clonic +close +closet +closeup +closure +clot +cloth +clothbound +clothe +clothesbrush +clotheshorse +clothesline +clothesman +clothesmen +clothier +Clotho +cloture +cloud +cloudburst +cloudy +clout +clove +clown +clownish +cloy +club +clubhouse +clubroom +cluck +clue +Cluj +clump +clumsy +clung +cluster +clutch +clutter +Clyde +Clytemnestra +CO +co +coach +coachman +coachmen +coachwork +coadjutor +coagulable +coagulate +coal +coalesce +coalescent +coalition +coarse +coarsen +coast +coastal +coastline +coat +Coates +coattail +coauthor +coax +coaxial +cob +cobalt +Cobb +cobble +cobblestone +Cobol +cobra +cobweb +coca +cocaine +coccidiosis +cochineal +cochlea +Cochran +Cochrane +cock +cockatoo +cockcrow +cockeye +cockfight +cockle +cocklebur +cockleshell +cockpit +cockroach +cocksure +cocktail +cocky +coco +cocoa +coconut +cocoon +cod +coda +Coddington +coddle +code +codebreak +codeposit +codetermine +codeword +codex +codfish +codicil +codify +codomain +codon +codpiece +Cody +coed +coeditor +coeducation +coefficient +coequal +coerce +coercible +coercion +coercive +coevolution +coexist +coexistent +coextensive +cofactor +coffee +coffeecup +coffeepot +coffer +Coffey +coffin +Coffman +cog +cogent +cogitate +cognac +cognate +cognition +cognitive +cognoscenti +Cohen +cohere +coherent +cohesion +cohesive +Cohn +cohomology +cohort +cohosh +coiffure +coil +coin +coinage +coincide +coincident +coincidental +coke +col +cola +colander +colatitude +Colby +cold +coldhearted +Cole +Coleman +Coleridge +Colette +coleus +Colgate +colic +colicky +coliform +coliseum +collaborate +collage +collagen +collapse +collapsible +collar +collarbone +collard +collate +collateral +colleague +collect +collectible +collector +college +collegian +collegiate +collet +collide +collie +Collier +collimate +collinear +Collins +collision +collocate +colloidal +Colloq +colloquia +colloquial +colloquium +colloquy +collude +collusion +cologne +Colombia +Colombo +colon +colonel +colonial +colonist +colonnade +colony +Colorado +colorate +coloratura +colorimeter +colossal +Colosseum +colossi +colossus +colt +coltish +coltsfoot +Columbia +columbine +Columbus +column +columnar +colza +coma +Comanche +comatose +comb +combat +combatant +combatted +combinate +combinatorial +combinatoric +combine +combustible +combustion +come +comeback +comedian +comedy +comestible +comet +cometary +cometh +comfort +comic +Cominform +comma +command +commandant +commandeer +commando +commemorate +commend +commendation +commendatory +commensal +commensurable +commensurate +comment +commentary +commentator +commerce +commercial +commingle +commiserate +commissariat +commissary +commission +commit +committable +committal +committed +committee +committeeman +committeemen +committeewoman +committeewomen +committing +commodious +commodity +commodore +common +commonality +commonplace +commonweal +commonwealth +commotion +communal +commune +communicable +communicant +communicate +communion +communique +commutate +commute +compact +compactify +Compagnie +companion +companionway +company +comparative +comparator +compare +comparison +compartment +compass +compassion +compassionate +compatible +compatriot +compel +compellable +compelled +compelling +compendia +compendium +compensable +compensate +compensatory +compete +competent +competition +competitive +competitor +compilation +compile +complacent +complain +complainant +complaint +complaisant +complement +complementarity +complementary +complementation +complete +completion +complex +complexion +compliant +complicate +complicity +compliment +complimentary +compline +comply +component +componentry +comport +compose +composite +composition +compositor +compost +composure +compote +compound +comprehend +comprehensible +comprehension +comprehensive +compress +compressible +compression +compressive +compressor +comprise +compromise +Compton +comptroller +compulsion +compulsive +compulsory +compunction +computation +compute +comrade +con +Conakry +Conant +concatenate +concave +conceal +concede +conceit +conceive +concentrate +concentric +concept +conception +conceptual +concern +concert +concerti +concertina +concertmaster +concerto +concession +concessionaire +conch +concierge +conciliate +conciliatory +concise +concision +conclave +conclude +conclusion +conclusive +concoct +concomitant +concord +concordant +concourse +concrete +concretion +concubine +concur +concurred +concurrent +concurring +concussion +condemn +condemnate +condemnatory +condensate +condense +condensible +condescend +condescension +condiment +condition +condolence +condominium +condone +conduce +conducive +conduct +conductance +conductor +conduit +cone +coneflower +Conestoga +coney +confabulate +confect +confectionery +confederacy +confederate +confer +conferee +conference +conferrable +conferred +conferring +confess +confession +confessor +confidant +confidante +confide +confident +confidential +configuration +configure +confine +confirm +confirmation +confirmatory +confiscable +confiscate +confiscatory +conflagrate +conflict +confluent +confocal +conform +conformal +conformance +conformation +confound +confrere +confront +confrontation +Confucian +Confucius +confuse +confusion +confute +congeal +congener +congenial +congenital +congest +congestion +congestive +conglomerate +Congo +Congolese +congratulate +congratulatory +congregate +congress +congressional +congressman +congressmen +congresswoman +congresswomen +congruent +conic +conifer +coniferous +conjectural +conjecture +conjoin +conjoint +conjugacy +conjugal +conjugate +conjunct +conjuncture +conjure +Conklin +Conley +conn +Connally +connect +Connecticut +connector +Conner +Connie +connivance +connive +connoisseur +Connors +connotation +connotative +connote +connubial +conquer +conqueror +conquest +conquistador +Conrad +Conrail +consanguine +consanguineous +conscience +conscientious +conscionable +conscious +conscript +conscription +consecrate +consecutive +consensus +consent +consequent +consequential +conservation +conservatism +conservative +conservator +conservatory +conserve +consider +considerate +consign +consignee +consignor +consist +consistent +consolation +console +consolidate +consonant +consonantal +consort +consortium +conspecific +conspicuous +conspiracy +conspirator +conspiratorial +conspire +constant +Constantine +Constantinople +constellate +consternate +constipate +constituent +constitute +constitution +constitutive +constrain +constraint +constrict +constrictor +construal +construct +constructible +constructor +construe +consul +consular +consulate +consult +consultant +consultation +consultative +consume +consummate +consumption +consumptive +contact +contagion +contagious +contain +contaminant +contaminate +contemplate +contemporaneous +contemporary +contempt +contemptible +contemptuous +contend +content +contention +contentious +contest +contestant +context +contextual +contiguity +contiguous +continent +continental +contingent +continua +continual +continuant +continuation +continue +continuity +continuo +continuous +continuum +contort +contour +contraband +contrabass +contraception +contraceptive +contract +contractor +contractual +contradict +contradictory +contradistinct +contradistinguish +contraindicate +contralateral +contralto +contrapositive +contraption +contrariety +contrary +contrast +contravariant +contravene +contravention +contretemps +contribute +contribution +contributor +contributory +contrite +contrition +contrivance +contrive +control +controllable +controlled +controller +controlling +controversial +controversy +controvertible +contumacy +contusion +conundrum +Convair +convalesce +convalescent +convect +convene +convenient +convent +convention +converge +convergent +conversant +conversation +converse +conversion +convert +convertible +convex +convey +conveyance +conveyor +convict +convince +convivial +convocate +convoke +convolute +convolution +convolve +convoy +convulse +convulsion +convulsive +Conway +cony +coo +cook +cookbook +Cooke +cookery +cookie +cooky +cool +coolant +Cooley +coolheaded +Coolidge +coon +coop +cooperate +coordinate +Coors +coot +cop +cope +Copeland +Copenhagen +Copernican +Copernicus +copious +coplanar +copolymer +copperas +Copperfield +copperhead +coppery +copra +coprinus +coprocessor +coproduct +copter +copulate +copy +copybook +copyright +copywriter +coquette +coquina +coral +coralberry +coralline +corbel +Corbett +Corcoran +cord +cordage +cordial +cordite +cordon +corduroy +core +Corey +coriander +Corinth +Corinthian +Coriolanus +cork +corkscrew +cormorant +corn +cornbread +cornea +Cornelia +Cornelius +Cornell +cornerstone +cornet +cornfield +cornflower +cornish +cornmeal +cornstarch +cornucopia +Cornwall +corny +corolla +corollary +corona +Coronado +coronary +coronate +coroner +coronet +coroutine +Corp +corpora +corporal +corporate +corporeal +corps +corpse +corpsman +corpsmen +corpulent +corpus +corpuscle +corpuscular +corral +corralled +correct +corrector +correlate +correspond +correspondent +corridor +corrigenda +corrigendum +corrigible +corroborate +corroboree +corrode +corrodible +corrosion +corrosive +corrugate +corrupt +corruptible +corruption +corsage +corset +Corsica +cortege +cortex +Cortez +cortical +Cortland +corundum +coruscate +Corvallis +corvette +Corvus +cos +cosec +coset +Cosgrove +cosh +cosine +cosmetic +cosmic +cosmology +cosmopolitan +cosmos +cosponsor +Cossack +cost +Costa +Costello +costume +cosy +cot +cotangent +coterie +cotillion +cotman +cotoneaster +cotta +cottage +cotton +cottonmouth +cottonseed +cottontail +cottonwood +cottony +Cottrell +cotty +cotyledon +couch +cougar +cough +could +couldn't +coulomb +Coulter +council +councilman +councilmen +councilwoman +councilwomen +counsel +counselor +count +countdown +countenance +counteract +counterargument +counterattack +counterbalance +counterclockwise +counterexample +counterfeit +counterflow +counterintuitive +counterman +countermand +countermeasure +countermen +counterpart +counterpoint +counterpoise +counterproductive +counterproposal +counterrevolution +counterrevolutionary +countersink +countersunk +counterthreat +countervail +counterweight +countrify +country +countryman +countrymen +countryside +countrywide +county +countywide +coup +coupe +couple +couplet +coupon +courage +courageous +courier +course +court +courteous +courtesan +courtesy +courthouse +courtier +Courtney +courtroom +courtyard +couscous +cousin +couturier +covalent +covariant +covariate +covary +cove +coven +covenant +Coventry +cover +coverage +coverall +coverlet +covert +covet +covetous +cow +Cowan +coward +cowardice +cowbell +cowbird +cowboy +cowhand +cowherd +cowhide +cowl +cowlick +cowman +cowmen +coworker +cowpea +cowpoke +cowpony +cowpox +cowpunch +cowry +cowslip +cox +coxcomb +coy +coyly +coyote +coypu +cozen +cozy +CPA +cpu +crab +crabapple +crack +crackle +crackpot +cradle +craft +craftsman +craftsmen +craftspeople +craftsperson +crafty +crag +craggy +Craig +cram +Cramer +cramp +crampon +cranberry +Crandall +crane +Cranford +crania +cranium +crank +crankcase +crankshaft +cranky +cranny +Cranston +crap +crappie +crash +crass +crate +crater +cravat +crave +craven +craw +Crawford +crawl +crawlspace +crayfish +crayon +craze +crazy +creak +creaky +cream +creamery +creamy +crease +create +creature +creche +credent +credential +credenza +credible +credit +creditor +credo +credulity +credulous +creed +creedal +creek +creekside +creep +creepy +cremate +crematory +Creole +Creon +creosote +crepe +crept +crescendo +crescent +cress +crest +crestfallen +Crestview +Cretaceous +Cretan +Crete +cretin +cretinous +crevice +crew +crewcut +crewel +crewman +crewmen +crib +cribbage +cricket +crime +Crimea +criminal +crimp +crimson +cringe +crinkle +crinoid +cripple +crises +crisis +crisp +Crispin +criss +crisscross +criteria +criterion +critic +critique +critter +croak +Croatia +crochet +crock +crockery +Crockett +crocodile +crocodilian +crocus +croft +Croix +Cromwell +Cromwellian +crone +crony +crook +croon +crop +cropland +crore +Crosby +cross +crossarm +crossbar +crossbill +crosscut +crosshatch +crosslink +crossover +crosspoint +crossroad +crosstalk +crosswalk +crossway +crosswise +crossword +crosswort +crotch +crotchety +crouch +croupier +crow +crowbait +crowbar +crowberry +crowd +crowfoot +Crowley +crown +croydon +CRT +crucial +crucible +crucifix +crucifixion +crucify +crud +cruddy +crude +cruel +cruelty +Cruickshank +cruise +crumb +crumble +crummy +crump +crumple +crunch +crunchy +crupper +crusade +crush +Crusoe +crust +crustacean +crusty +crutch +crux +Cruz +cry +cryogenic +cryostat +crypt +cryptanalysis +cryptanalyst +cryptanalytic +cryptic +crypto +cryptogram +cryptographer +cryptography +crystal +crystalline +crystallite +crystallographer +crystallography +c's +csnet +CT +cub +Cuba +cubby +cubbyhole +cube +cubic +cubicle +cubit +cuckoo +cucumber +cud +cuddle +cuddly +cudgel +cue +cuff +cufflink +cuisine +Culbertson +culinary +cull +culminate +culpa +culpable +culprit +cult +cultivable +cultivar +cultivate +cultural +culture +Culver +culvert +Cumberland +cumbersome +cumin +Cummings +Cummins +cumulate +cumulus +Cunard +cuneiform +cunning +Cunningham +CUNY +cup +cupboard +cupful +Cupid +cupidity +cupric +cuprous +cur +curate +curb +curbside +curd +curdle +cure +curfew +curia +curie +curio +curiosity +curious +curium +curl +curlew +curlicue +curmudgeon +Curran +currant +current +curricula +curricular +curriculum +curry +curse +cursive +cursor +cursory +curt +curtail +curtain +Curtis +curtsey +curvaceous +curvature +curve +curvilinear +Cushing +cushion +Cushman +cusp +Custer +custodial +custodian +custody +custom +customary +customhouse +cut +cutaneous +cutback +cute +cutlass +cutler +cutlet +cutoff +cutout +cutover +cutset +cutthroat +cuttlebone +cuttlefish +cutworm +Cuvier +Cuzco +Cyanamid +cyanate +cyanic +cyanide +cybernetic +cycad +Cyclades +cycle +cyclic +cyclist +cyclone +cyclopean +Cyclops +cyclorama +cyclotomic +cyclotron +cygnet +Cygnus +cylinder +cylindric +cymbal +cynic +Cynthia +cypress +Cyprian +Cypriot +Cyprus +Cyril +Cyrillic +Cyrus +cyst +cysteine +cytochemistry +cytolysis +cytoplasm +cytosine +CZ +czar +czarina +Czech +Czechoslovakia +Czerniak +d +dab +dabble +Dacca +dachshund +dactyl +dactylic +dad +Dada +daddy +Dade +Daedalus +daemon +daffodil +daffy +dagger +daguerreotype +Dahl +dahlia +Dahomey +Dailey +Daimler +dainty +dairy +Dairylea +dairyman +dairymen +dais +daisy +Dakar +Dakota +dal +dale +Daley +Dalhousie +Dallas +dally +Dalton +Daly +Dalzell +dam +damage +Damascus +damask +dame +damn +damnation +Damocles +Damon +damp +dampen +damsel +damselfly +Dan +Dana +Danbury +dance +dandelion +dandy +Dane +dang +danger +dangerous +dangle +Daniel +Danielson +Danish +dank +Danny +Dante +Danube +Danubian +Danzig +Daphne +dapper +dapple +Dar +dare +Darius +dark +darken +darkle +Darlene +darling +darn +DARPA +Darrell +Darry +d'art +dart +Dartmouth +Darwin +Darwinian +dash +dashboard +dastard +data +database +date +dateline +dater +Datsun +datum +datura +daub +Daugherty +daughter +daunt +dauphin +dauphine +Dave +davenport +David +Davidson +Davies +Davis +Davison +davit +Davy +dawdle +dawn +Dawson +day +daybed +daybreak +daydream +daylight +daytime +Dayton +Daytona +daze +dazzle +DC +de +deacon +deaconess +deactivate +dead +deaden +deadhead +deadline +deadlock +deadwood +deaf +deafen +deal +deallocate +dealt +dean +Deane +Deanna +dear +Dearborn +dearie +dearth +death +deathbed +deathward +debacle +debar +debarring +debase +debate +debater +debauch +debauchery +Debbie +Debby +debenture +debilitate +debility +debit +debonair +Deborah +Debra +debrief +debris +debt +debtor +debug +debugged +debugger +debugging +debunk +Debussy +debut +debutante +Dec +decade +decadent +decal +decant +decapitate +decapod +decathlon +Decatur +decay +Decca +decease +decedent +deceit +deceitful +deceive +decelerate +December +decennial +decent +deception +deceptive +decertify +decibel +decide +deciduous +decile +decimal +decimate +decipher +decision +decisive +deck +declaim +declamation +declamatory +declaration +declarative +declarator +declaratory +declare +declassify +declination +decline +declivity +decode +decolletage +decollimate +decompile +decomposable +decompose +decomposition +decompress +decompression +decontrol +decontrolled +decontrolling +deconvolution +deconvolve +decor +decorate +decorous +decorticate +decorum +decouple +decoy +decrease +decree +decreeing +decrement +decry +decrypt +decryption +dedicate +deduce +deducible +deduct +deductible +Dee +deed +deem +deep +deepen +deer +Deere +deerskin +deerstalker +deface +default +defeat +defecate +defect +defector +defend +defendant +defensible +defensive +defer +deferent +deferrable +deferred +deferring +defiant +deficient +deficit +define +definite +definition +definitive +deflate +deflater +deflect +deflector +defocus +defoliate +deforest +deforestation +deform +deformation +defraud +defray +defrost +deft +defunct +defy +degas +degassing +degeneracy +degenerate +degradation +degrade +degrease +degree +degum +degumming +dehumidify +dehydrate +deify +deign +Deimos +Deirdre +deity +deja +deject +Del +Delaney +Delano +Delaware +delay +delectable +delectate +delegable +delegate +delete +deleterious +deletion +Delft +Delhi +Delia +deliberate +delicacy +delicate +delicatessen +delicious +delicti +delight +delightful +Delilah +delimit +delimitation +delineament +delineate +delinquent +deliquesce +deliquescent +delirious +delirium +deliver +deliverance +delivery +deliveryman +deliverymen +dell +Della +Delmarva +delouse +Delphi +Delphic +delphine +delphinium +Delphinus +delta +deltoid +delude +deluge +delusion +delusive +deluxe +delve +demagnify +demagogue +demand +demarcate +demark +demean +demented +dementia +demerit +Demeter +demi +demigod +demijohn +demiscible +demise +demit +demitted +demitting +democracy +democrat +democratic +demodulate +demographer +demography +demolish +demolition +demon +demoniac +demonic +demonstrable +demonstrate +demote +demountable +Dempsey +demultiplex +demur +demure +demurred +demurrer +demurring +demystify +den +denature +dendrite +dendritic +Deneb +Denebola +deniable +denial +denigrate +denizen +Denmark +Dennis +Denny +denominate +denotation +denotative +denote +denouement +denounce +dense +densitometer +dent +dental +dentistry +dentition +Denton +denture +denudation +denude +denumerable +denunciate +Denver +deny +deodorant +deoxyribonucleic +deoxyribose +depart +departure +depend +dependent +depict +deplane +deplete +depletion +deplore +deploy +deport +deportation +deportee +depose +deposit +depositary +deposition +depositor +depository +depot +deprave +deprecate +deprecatory +depreciable +depreciate +depredation +depress +depressant +depressible +depression +depressive +depressor +deprivation +deprive +depth +deputation +depute +deputy +derail +derange +derate +derby +Derbyshire +dereference +deregulate +Derek +derelict +deride +derision +derisive +derivate +derive +dermatology +derogate +derogatory +derrick +derriere +dervish +Des +descant +Descartes +descend +descendant +descendent +descent +describe +description +descriptive +descriptor +desecrate +desecrater +desegregate +desert +deserve +desiccant +desiccate +desiderata +desideratum +design +designate +desire +desirous +desist +desk +Desmond +desolate +desolater +desorption +despair +desperado +desperate +despicable +despise +despite +despoil +despond +despondent +despot +despotic +dessert +destinate +destine +destiny +destitute +destroy +destruct +destructor +desuetude +desultory +detach +detail +detain +d'etat +detect +detector +detent +detente +detention +deter +detergent +deteriorate +determinacy +determinant +determinate +determine +deterred +deterrent +deterring +detest +detestation +detonable +detonate +detour +detoxify +detract +detractor +detriment +detritus +Detroit +deuce +deus +deuterate +deuterium +deuteron +devastate +develop +deviant +deviate +device +devil +devilish +devious +devise +devisee +devoid +devolve +Devon +Devonshire +devote +devotee +devotion +devour +devout +dew +dewar +dewdrop +Dewey +Dewitt +dewy +dexter +dexterity +dextrose +dextrous +dey +Dhabi +dharma +diabase +diabetes +diabetic +diabolic +diachronic +diacritic +diadem +diagnosable +diagnose +diagnosis +diagnostic +diagnostician +diagonal +diagram +diagrammatic +diagrammed +diagramming +dial +dialect +dialectic +dialogue +dialup +dialysis +diamagnetic +diamagnetism +diameter +diamond +Diana +Diane +Dianne +diaper +diaphanous +diaphragm +diary +diathermy +diathesis +diatom +diatomaceous +diatomic +diatonic +diatribe +dibble +dice +dichloride +dichondra +dichotomy +dick +dickcissel +dickens +Dickerson +dickey +Dickinson +Dickson +dicotyledon +dicta +dictate +dictatorial +diction +dictionary +dictum +did +didactic +diddle +didn't +Dido +die +Diebold +Diego +diehard +dieldrin +dielectric +diem +dieresis +diesel +diet +dietary +dietetic +diethylstilbestrol +dietician +Dietrich +diety +Dietz +diffeomorphic +diffeomorphism +differ +different +differentiable +differential +differentiate +difficult +difficulty +diffident +diffract +diffractometer +diffuse +diffusible +diffusion +diffusive +difluoride +dig +digamma +digest +digestible +digestion +digestive +digging +digit +digital +digitalis +dignify +dignitary +dignity +digram +digress +digression +dihedral +dilapidate +dilatation +dilate +dilatory +dilemma +dilettante +diligent +dill +Dillon +dilogarithm +diluent +dilute +dilution +dim +dime +dimension +dimethyl +diminish +diminuendo +diminution +diminutive +dimorphic +dimorphism +dimple +din +Dinah +dine +ding +dinghy +dingo +dingy +dinnertime +dinnerware +dinosaur +dint +diocesan +diocese +Diocletian +diode +Diogenes +Dionysian +Dionysus +Diophantine +diopter +diorama +diorite +dioxide +dip +diphtheria +diphthong +diploid +diploidy +diploma +diplomacy +diplomat +diplomatic +dipole +Dirac +dire +direct +director +directorate +directory +directrices +directrix +dirge +Dirichlet +dirt +dirty +Dis +disaccharide +disambiguate +disastrous +disburse +disc +discern +discernible +disciple +disciplinary +discipline +discoid +discomfit +discordant +discovery +discreet +discrepant +discrete +discretion +discretionary +discriminable +discriminant +discriminate +discriminatory +discus +discuss +discussant +discussion +disdain +disdainful +disembowel +disgruntle +disgustful +dish +dishevel +dishwasher +dishwater +disjunct +disk +dismal +dismissal +Disney +Disneyland +disparage +disparate +dispel +dispelled +dispelling +dispensable +dispensary +dispensate +dispense +dispersal +disperse +dispersible +dispersion +dispersive +disposable +disposal +disputant +dispute +disquietude +disquisition +disrupt +disruption +disruptive +dissemble +disseminate +dissension +dissertation +dissident +dissipate +dissociate +dissuade +distaff +distal +distant +distillate +distillery +distinct +distinguish +distort +distraught +distribution +distributive +distributor +district +disturb +disturbance +disulfide +disyllable +ditch +dither +ditto +ditty +diurnal +diva +divalent +divan +dive +diverge +divergent +diverse +diversify +diversion +diversionary +divert +divest +divestiture +divide +dividend +divination +divine +divisible +division +divisive +divisor +divorce +divorcee +divulge +Dixie +dixieland +Dixon +dizzy +Djakarta +DNA +Dnieper +do +Dobbin +Dobbs +doberman +dobson +docile +dock +docket +dockside +dockyard +doctor +doctoral +doctorate +doctrinaire +doctrinal +doctrine +document +documentary +documentation +DOD +Dodd +doddering +dodecahedra +dodecahedral +dodecahedron +dodge +dodo +Dodson +doe +doesn't +d'oeuvre +doff +dog +dogbane +dogberry +Doge +dogfish +dogging +doggone +doghouse +dogleg +dogma +dogmatic +dogmatism +dogmatist +dogtooth +dogtrot +dogwood +Doherty +Dolan +dolce +doldrum +dole +doleful +doll +dollar +dollop +dolly +dolomite +dolomitic +Dolores +dolphin +dolt +doltish +domain +dome +Domenico +Domesday +domestic +domesticate +domicile +dominant +dominate +domineer +Domingo +Dominic +Dominican +Dominick +dominion +Dominique +domino +don +Donahue +Donald +Donaldson +donate +done +Doneck +donkey +Donna +Donnelly +Donner +donnybrook +donor +Donovan +don't +doodle +Dooley +Doolittle +doom +doomsday +door +doorbell +doorkeep +doorkeeper +doorknob +doorman +doormen +doorstep +doorway +dopant +dope +Doppler +Dora +Dorado +Dorcas +Dorchester +Doreen +Doria +Doric +Doris +dormant +dormitory +dormouse +Dorothea +Dorothy +dorsal +Dorset +Dortmund +dosage +dose +dosimeter +dossier +Dostoevsky +dot +dote +double +Doubleday +doubleheader +doublet +doubleton +doubloon +doubt +doubtful +douce +Doug +dough +Dougherty +doughnut +Douglas +Douglass +dour +douse +dove +dovekie +dovetail +Dow +dowager +dowel +dowitcher +Dowling +down +downbeat +downcast +downdraft +Downey +downfall +downgrade +downhill +downplay +downpour +downright +downside +downslope +downspout +downstairs +downstream +downtown +downtrend +downtrodden +downturn +downward +downwind +downy +dowry +Doyle +doze +dozen +Dr +drab +drably +Draco +Draconian +draft +draftee +draftsman +draftsmen +draftsperson +drafty +drag +dragging +dragnet +dragon +dragonfly +dragonhead +dragoon +drain +drainage +drake +dram +drama +dramatic +dramatist +dramaturgy +drank +drape +drapery +drastic +draught +Dravidian +draw +drawback +drawbridge +drawl +drawn +drawstring +drayman +dread +dreadful +dreadnought +dream +dreamboat +dreamt +dreamy +dreary +dredge +dreg +drench +dress +dressmake +dressy +drew +Drexel +Dreyfuss +drib +dribble +drift +driftwood +drill +drink +drip +drippy +Driscoll +drive +driven +driveway +drizzle +drizzly +droll +dromedary +drone +drool +droop +droopy +drop +drophead +droplet +dropout +drosophila +dross +drought +drove +drown +drowse +drowsy +drub +drudge +drudgery +drug +drugging +drugstore +druid +drum +drumhead +drumlin +Drummond +drunk +drunkard +drunken +drupe +Drury +dry +dryad +Dryden +d's +du +dual +Duane +dub +Dubhe +dubious +dubitable +Dublin +ducat +duchess +duck +duckbilled +duckling +duckweed +duct +ductile +ductwork +dud +Dudley +due +duel +duet +duff +duffel +Duffy +dug +Dugan +dugong +dugout +duke +dulcet +dull +dully +dulse +Duluth +duly +Duma +dumb +dumbbell +dumbly +dummy +dump +dumpling +dumpster +Dumpty +dumpy +dun +Dunbar +Duncan +dunce +dune +Dunedin +dung +dungeon +Dunham +dunk +Dunkirk +Dunlap +Dunlop +Dunn +duodenal +duodenum +duopolist +duopoly +dupe +duplex +duplicable +duplicate +duplicity +DuPont +Duquesne +durable +durance +Durango +duration +Durer +duress +Durham +during +Durkee +Durkin +Durrell +Durward +Dusenberg +Dusenbury +dusk +dusky +Dusseldorf +dust +dustbin +dusty +Dutch +dutchess +Dutchman +Dutchmen +dutiable +dutiful +Dutton +duty +dwarf +dwarves +dwell +dwelt +Dwight +dwindle +Dwyer +dyad +dyadic +dye +dyeing +dyestuff +dying +Dyke +Dylan +dynamic +dynamism +dynamite +dynamo +dynast +dynastic +dynasty +dyne +dysentery +dyspeptic +dysplasia +dysprosium +dystrophy +e +each +Eagan +eager +eagle +ear +eardrum +earl +earmark +earn +earnest +earphone +earring +earshot +earsplitting +earth +earthen +earthenware +Earthman +Earthmen +earthmover +earthmoving +earthquake +earthworm +earthy +earwig +ease +easel +east +eastbound +eastern +easternmost +Eastland +Eastman +eastward +Eastwood +easy +easygoing +eat +eaten +eater +Eaton +eave +eavesdrop +eavesdropping +ebb +Eben +ebony +ebullient +eccentric +Eccles +ecclesiastic +echelon +echidna +echinoderm +echo +echoes +echolocation +eclat +eclectic +eclipse +ecliptic +eclogue +Ecole +ecology +econometric +economic +economist +economy +ecosystem +ecstasy +ecstatic +ectoderm +ectopic +Ecuador +ecumenic +ecumenist +Ed +Eddie +eddy +edelweiss +edematous +Eden +Edgar +edge +Edgerton +edgewise +edgy +edible +edict +edifice +edify +Edinburgh +Edison +edit +Edith +edition +editor +editorial +Edmonds +Edmondson +Edmonton +Edmund +Edna +EDT +Eduardo +educable +educate +Edward +Edwardian +Edwardine +Edwin +Edwina +eel +eelgrass +EEOC +e'er +eerie +eerily +efface +effaceable +effect +effectual +effectuate +effeminate +efferent +effete +efficacious +efficacy +efficient +Effie +effloresce +efflorescent +effluent +effluvia +effluvium +effort +effusion +effusive +eft +e.g +egalitarian +Egan +egg +egghead +eggplant +eggshell +ego +egocentric +egotism +egotist +egregious +egress +egret +Egypt +Egyptian +Egyptology +eh +Ehrlich +eider +eidetic +eigenfunction +eigenspace +eigenstate +eigenvalue +eigenvector +eight +eighteen +eighteenth +eightfold +eighth +eightieth +eighty +eightyfold +Eileen +Einstein +Einsteinian +einsteinium +Eire +Eisenhower +Eisner +either +ejaculate +eject +ejector +eke +Ekstrom +Ektachrome +el +elaborate +Elaine +elan +elapse +elastic +elastomer +elate +Elba +elbow +elder +eldest +Eldon +Eleanor +Eleazar +elect +elector +electoral +electorate +Electra +electress +electret +electric +electrician +electrify +electro +electrocardiogram +electrocardiograph +electrode +electroencephalogram +electroencephalograph +electroencephalography +electrolysis +electrolyte +electrolytic +electron +electronic +electrophoresis +electrophorus +elegant +elegiac +elegy +element +elementary +Elena +elephant +elephantine +elevate +eleven +elevenfold +eleventh +elfin +Elgin +Eli +elicit +elide +eligible +Elijah +eliminable +eliminate +Elinor +Eliot +Elisabeth +Elisha +elision +elite +Elizabeth +Elizabethan +elk +Elkhart +ell +Ella +Ellen +Elliot +Elliott +ellipse +ellipsis +ellipsoid +ellipsoidal +ellipsometer +elliptic +Ellis +Ellison +Ellsworth +Ellwood +elm +Elmer +Elmhurst +Elmira +Elmsford +Eloise +elongate +elope +eloquent +else +Elsevier +elsewhere +Elsie +Elsinore +Elton +eluate +elucidate +elude +elusive +elute +elution +elver +elves +Ely +Elysee +elysian +em +emaciate +emacs +emanate +emancipate +Emanuel +emasculate +embalm +embank +embarcadero +embargo +embargoes +embark +embarrass +embassy +embattle +embed +embeddable +embedded +embedder +embedding +embellish +ember +embezzle +embitter +emblazon +emblem +emblematic +embodiment +embody +embolden +emboss +embouchure +embower +embrace +embraceable +embrittle +embroider +embroidery +embroil +embryo +embryology +embryonic +emcee +emendable +emerald +emerge +emergent +emeriti +emeritus +Emerson +Emery +emetic +emigrant +emigrate +emigre +emigree +Emil +Emile +Emilio +Emily +eminent +emirate +emissary +emission +emissive +emit +emittance +emitted +emitter +emitting +emma +Emmanuel +Emmett +emolument +Emory +emotion +empathic +empathy +emperor +emphases +emphasis +emphatic +emphysema +emphysematous +empire +empiric +emplace +employ +employee +emporium +empower +empress +empty +emptyhanded +emulate +emulsify +emulsion +en +enamel +encapsulate +encephalitis +enchantress +enclave +encomia +encomium +encore +encroach +encryption +encumber +encumbrance +encyclopedic +end +endemic +endgame +Endicott +endoderm +endogamous +endogamy +endogenous +endometrial +endometriosis +endomorphism +endorse +endosperm +endothelial +endothermic +endow +endpoint +endure +enemy +energetic +energy +enervate +enfant +enforceable +enforcible +Eng +engage +Engel +engine +engineer +England +Englander +Engle +Englewood +English +Englishman +Englishmen +enhance +Enid +enigma +enigmatic +enjoinder +enlargeable +enmity +Enoch +enol +enormity +enormous +Enos +enough +enquire +enquiry +Enrico +enrollee +ensconce +ensemble +enstatite +entendre +enter +enterprise +entertain +enthalpy +enthusiasm +enthusiast +enthusiastic +entice +entire +entirety +entity +entomology +entourage +entranceway +entrant +entrepreneur +entrepreneurial +entropy +entry +enumerable +enumerate +enunciable +enunciate +envelop +envelope +enviable +envious +environ +envoy +envy +enzymatic +enzyme +enzymology +Eocene +eohippus +eosine +EPA +epaulet +ephemeral +ephemerides +ephemeris +Ephesian +Ephesus +Ephraim +epic +epicure +Epicurean +epicycle +epicyclic +epidemic +epidemiology +epidermic +epidermis +epigenetic +epigram +epigrammatic +epigraph +epilepsy +epileptic +epilogue +epimorphism +Epiphany +epiphany +epiphyseal +epiphysis +epiphyte +epiphytic +episcopal +Episcopalian +episcopate +episode +episodic +epistemology +epistle +epistolatory +epitaph +epitaxial +epitaxy +epithelial +epithelium +epithet +epitome +epoch +epochal +eponymous +epoxy +epsilon +Epsom +Epstein +equable +equal +equanimity +equate +equatorial +equestrian +equidistant +equilateral +equilibrate +equilibria +equilibrium +equine +equinoctial +equinox +equip +equipoise +equipotent +equipped +equipping +equitable +equitation +equity +equivalent +equivocal +equivocate +era +eradicable +eradicate +erasable +erase +Erasmus +Erastus +erasure +Erato +Eratosthenes +erbium +ERDA +ere +erect +erg +ergative +ergodic +Eric +Erich +Erickson +Ericsson +Erie +Erik +Erlenmeyer +ermine +Ernest +Ernestine +Ernie +Ernst +erode +erodible +Eros +erosible +erosion +erosive +erotic +erotica +err +errand +errant +errantry +errata +erratic +erratum +Errol +erroneous +error +ersatz +Erskine +erudite +erudition +erupt +eruption +Ervin +Erwin +e's +escadrille +escalate +escapade +escape +escapee +escarpment +escheat +Escherichia +eschew +escort +escritoire +escrow +escutcheon +Eskimo +Esmark +esophagi +esoteric +especial +espionage +esplanade +Esposito +espousal +espouse +esprit +esquire +essay +Essen +essence +essential +Essex +EST +establish +estate +esteem +Estella +ester +Estes +Esther +estimable +estimate +Estonia +estop +estoppal +estrange +estrogen +estrous +estrus +estuarine +estuary +et +eta +etc +etch +eternal +eternity +Ethan +ethane +ethanol +Ethel +ether +ethereal +ethernet +ethic +Ethiopia +ethnic +ethnography +ethnology +ethnomusicology +ethology +ethos +ethyl +ethylene +etiology +etiquette +Etruria +Etruscan +etude +etymology +eucalyptus +Eucharist +Euclid +Euclidean +eucre +Eugene +Eugenia +eugenic +euglena +eukaryote +eukaryotic +Euler +Eulerian +eulogy +Eumenides +Eunice +euphemism +euphemist +euphonious +euphony +euphorbia +euphoria +euphoric +Euphrates +Eurasia +eureka +Euridyce +Euripides +Europa +Europe +European +europium +Eurydice +eutectic +Euterpe +euthanasia +eutrophication +Eva +evacuate +evade +evaluable +evaluate +evanescent +evangel +evangelic +Evans +Evanston +Evansville +evaporate +evasion +evasive +eve +Evelyn +even +evenhanded +evensong +event +eventful +eventide +eventual +eventuate +Eveready +Everett +Everglade +evergreen +Everhart +everlasting +every +everybody +everyday +everyman +everyone +everything +everywhere +evict +evident +evidential +evil +evildoer +evince +eviscerate +evocable +evocate +evoke +evolution +evolutionary +evolve +evzone +ewe +ex +exacerbate +exact +exactitude +exaggerate +exalt +exaltation +exam +examination +examine +example +exasperate +exasperater +excavate +exceed +excel +excelled +excellent +excelling +excelsior +except +exception +excerpt +excess +excessive +exchange +exchangeable +exchequer +excisable +excise +excision +excitation +excitatory +excite +exciton +exclaim +exclamation +exclamatory +exclude +exclusion +exclusionary +exclusive +excommunicate +excoriate +excrement +excrescent +excrete +excretion +excretory +excruciate +exculpate +exculpatory +excursion +excursus +excusable +excuse +exec +execrable +execrate +execute +execution +executive +executor +executrix +exegesis +exegete +exemplar +exemplary +exemplify +exempt +exemption +exercisable +exercise +exert +Exeter +exfoliate +exhale +exhaust +exhaustible +exhaustion +exhaustive +exhibit +exhibition +exhibitor +exhilarate +exhort +exhortation +exhumation +exhume +exigent +exile +exist +existent +existential +exit +exodus +exogamous +exogamy +exogenous +exonerate +exorbitant +exorcise +exorcism +exorcist +exoskeleta +exoskeleton +exothermic +exotic +exotica +expand +expanse +expansible +expansion +expansive +expatiate +expatriate +expect +expectant +expectation +expectorant +expectorate +expedient +expedite +expedition +expeditious +expel +expellable +expelled +expelling +expend +expenditure +expense +expensive +experience +experiential +experiment +experimentation +expert +expertise +expiable +expiate +expiration +expire +expiry +explain +explanation +explanatory +expletive +explicable +explicate +explicit +explode +exploit +exploitation +exploration +exploratory +explore +explosion +explosive +exponent +exponential +exponentiate +export +exportation +expose +exposit +exposition +expositor +expository +exposure +expound +express +expressible +expression +expressive +expressway +expropriate +expulsion +expunge +expurgate +exquisite +extant +extemporaneous +extempore +extend +extendible +extensible +extension +extensive +extensor +extent +extenuate +exterior +exterminate +external +extinct +extinguish +extirpate +extol +extolled +extoller +extolling +extort +extra +extracellular +extract +extractor +extracurricular +extradite +extradition +extralegal +extramarital +extramural +extraneous +extraordinary +extrapolate +extraterrestrial +extraterritorial +extravagant +extravaganza +extrema +extremal +extreme +extremum +extricable +extricate +extrinsic +extroversion +extrovert +extrude +extrusion +extrusive +exuberant +exudate +exude +exult +exultant +exultation +Exxon +eye +eyeball +eyebright +eyebrow +eyeful +eyeglass +eyelash +eyelet +eyelid +eyepiece +eyesight +eyesore +eyewitness +Ezekiel +Ezra +f +FAA +Faber +Fabian +fable +fabric +fabricate +fabulous +facade +face +faceplate +facet +facetious +facial +facile +facilitate +facsimile +fact +factious +facto +factor +factorial +factory +factual +faculty +fad +fade +fadeout +faery +Fafnir +fag +Fahey +Fahrenheit +faience +fail +failsafe +failsoft +failure +fain +faint +fair +Fairchild +Fairfax +Fairfield +fairgoer +Fairport +fairway +fairy +faith +faithful +fake +falcon +falconry +Falkland +fall +fallacious +fallacy +fallen +fallible +falloff +Fallopian +fallout +fallow +Falmouth +false +falsetto +falsify +Falstaff +falter +fame +familial +familiar +familism +family +famine +famish +famous +fan +fanatic +fanciful +fancy +fanfare +fanfold +fang +fangled +Fanny +fanout +fantasia +fantasist +fantastic +fantasy +fantod +far +farad +Faraday +Farber +farce +farcical +fare +farewell +farfetched +Fargo +farina +Farkas +Farley +farm +farmhouse +Farmington +farmland +Farnsworth +faro +Farrell +farsighted +farther +farthest +fascicle +fasciculate +fascinate +fascism +fascist +fashion +fast +fasten +fastidious +fat +fatal +fate +fateful +father +fathom +fatigue +Fatima +fatten +fatty +fatuous +faucet +Faulkner +fault +faulty +faun +fauna +faunal +Faust +Faustian +Faustus +fawn +fay +Fayette +Fayetteville +faze +FBI +FCC +FDA +Fe +fealty +fear +fearful +fearsome +feasible +feast +feat +feather +featherbed +featherbedding +featherbrain +feathertop +featherweight +feathery +feature +Feb +febrile +February +fecal +feces +feckless +fecund +fed +federal +federate +Fedora +fee +feeble +feed +feedback +feel +Feeney +feet +feign +feint +feisty +Feldman +feldspar +Felice +Felicia +felicitous +felicity +feline +Felix +fell +fellow +felon +felonious +felony +felsite +felt +female +feminine +feminism +feminist +femoral +femur +fence +fencepost +fend +fennec +fennel +Fenton +fenugreek +Ferber +Ferdinand +Ferguson +Fermat +ferment +fermentation +Fermi +fermion +fermium +fern +Fernando +fernery +ferocious +ferocity +Ferreira +Ferrer +ferret +ferric +ferris +ferrite +ferroelectric +ferromagnet +ferromagnetic +ferrous +ferruginous +ferrule +ferry +fertile +fervent +fervid +fescue +fest +festival +festive +festoon +fetal +fetch +fete +fetid +fetish +fetter +fettle +fetus +feud +feudal +feudatory +fever +feverish +few +fiance +fiancee +fiasco +fiat +fib +fiberboard +Fiberglas +Fibonacci +fibration +fibrin +fibrosis +fibrous +fiche +fickle +fiction +fictitious +fictive +fiddle +fiddlehead +fiddlestick +fide +fidelity +fidget +fiducial +fief +fiefdom +field +fieldstone +fieldwork +fiend +fiendish +fierce +fiery +fiesta +fife +FIFO +fifteen +fifteenth +fifth +fiftieth +fifty +fiftyfold +fig +figaro +fight +figural +figurate +figure +figurine +Fiji +Fijian +filament +filamentary +filamentous +filbert +filch +file +filet +filial +filibuster +filigree +Filipino +fill +fillet +fillip +filly +film +filmdom +filmmake +filmstrip +filmy +filter +filth +filthy +filtrate +fin +final +finale +finance +financial +financier +finch +find +fine +finery +finesse +finessing +finger +fingerling +fingernail +fingerprint +fingertip +finial +finicky +finish +finite +finitude +fink +Finland +Finley +Finn +Finnegan +Finnish +finny +fir +fire +firearm +fireboat +firebreak +firebug +firecracker +firefly +firehouse +firelight +fireman +firemen +fireplace +firepower +fireproof +fireside +Firestone +firewall +firewood +firework +firm +firmware +first +firsthand +fiscal +Fischbein +Fischer +fish +fisherman +fishermen +fishery +fishmonger +fishpond +fishy +Fisk +Fiske +fissile +fission +fissure +fist +fisticuff +fit +Fitch +Fitchburg +fitful +Fitzgerald +Fitzpatrick +Fitzroy +five +fivefold +fix +fixate +fixture +Fizeau +fizzle +fjord +FL +flabbergast +flack +flag +flagellate +flageolet +flagging +Flagler +flagpole +flagrant +Flagstaff +flagstone +flail +flair +flak +flake +flaky +flam +flamboyant +flame +flamingo +flammable +flan +Flanagan +Flanders +flange +flank +flannel +flap +flare +flash +flashback +flashlight +flashy +flask +flat +flatbed +flathead +flatiron +flatland +flatten +flattery +flatulent +flatus +flatworm +flaunt +flautist +flaw +flax +flaxen +flaxseed +flea +fleabane +fleawort +fleck +fled +fledge +fledgling +flee +fleece +fleeing +fleet +Fleming +flemish +flesh +fleshy +fletch +Fletcher +flew +flex +flexible +flexural +flexure +flick +flight +flimsy +flinch +fling +flint +flintlock +flinty +flip +flipflop +flippant +flirt +flirtation +flirtatious +flit +Flo +float +floc +flocculate +flock +floe +flog +flogging +flood +floodgate +floodlight +floodlit +floodwater +floor +floorboard +flop +floppy +flora +floral +Florence +Florentine +florican +florid +Florida +Floridian +florin +florist +floruit +flotation +flotilla +flounce +flounder +flour +flourish +floury +flout +flow +flowchart +flowerpot +flowery +flown +Floyd +flu +flub +fluctuate +flue +fluent +fluff +fluffy +fluid +fluke +flung +flunk +flunky +fluoresce +fluorescein +fluorescent +fluoridate +fluoride +fluorine +fluorite +fluorocarbon +fluorspar +flurry +flush +fluster +flute +flutter +flux +fly +flycatcher +flyer +Flynn +flyway +FM +FMC +foal +foam +foamflower +foamy +fob +focal +foci +focus +focussed +fodder +foe +fog +Fogarty +fogging +foggy +fogy +foible +foil +foist +fold +foldout +Foley +foliage +foliate +folic +folio +folk +folklore +folksinger +folksinging +folksong +folksy +folktale +follicle +follicular +follow +followeth +folly +Fomalhaut +foment +fond +fondle +font +Fontaine +Fontainebleau +food +foodstuff +fool +foolhardy +foolish +foolproof +foolscap +foot +footage +football +footbridge +Foote +footfall +foothill +foothold +footman +footmen +footnote +footpad +footpath +footprint +footstep +footstool +footwear +footwork +fop +foppish +for +forage +foraminifera +foray +forbade +forbear +forbearance +Forbes +forbid +forbidden +forbidding +forbore +forborne +force +forceful +forcible +ford +Fordham +fore +foreign +forensic +forest +forestry +forever +forfeit +forfeiture +forfend +forgather +forgave +forge +forgery +forget +forgetful +forgettable +forgetting +forgive +forgiven +forgo +forgone +forgot +forgotten +fork +forklift +forlorn +form +formal +formaldehyde +formant +format +formate +formatted +formatting +formic +Formica +formidable +Formosa +formula +formulae +formulaic +formulate +forsake +forsaken +forsook +forswear +forswore +forsworn +Forsythe +fort +forte +Fortescue +forth +forthcome +forthcoming +forthright +forthwith +fortieth +fortify +fortin +fortiori +fortitude +fortnight +fortran +fortress +fortuitous +fortunate +fortune +forty +fortyfold +forum +forward +forwent +Foss +fossil +fossiliferous +foster +fosterite +fought +foul +foulmouth +found +foundation +foundling +foundry +fount +fountain +fountainhead +four +fourfold +Fourier +foursome +foursquare +fourteen +fourteenth +fourth +fovea +fowl +fox +foxglove +Foxhall +foxhole +foxhound +foxtail +foxtrot +foxy +foyer +FPC +fractal +fraction +fractionate +fractious +fracture +fragile +fragment +fragmentary +fragmentation +fragrant +frail +frailty +frambesia +frame +framework +Fran +franc +franca +France +Frances +franchise +Francine +Francis +Franciscan +Francisco +francium +franco +Francoise +frangipani +frank +Frankel +Frankfort +Frankfurt +frankfurter +franklin +frantic +Franz +Fraser +fraternal +fraternity +Frau +fraud +fraudulent +fraught +fray +Frazier +frazzle +freak +freakish +freckle +Fred +Freddie +Freddy +Frederic +Frederick +Fredericksburg +Fredericton +Fredholm +Fredrickson +free +freeboot +freedman +freedmen +freedom +freehand +freehold +freeing +freeload +freeman +freemen +Freeport +freestone +freethink +Freetown +freeway +freewheel +freeze +freight +French +Frenchman +Frenchmen +frenetic +frenzy +freon +frequent +fresco +frescoes +fresh +freshen +freshman +freshmen +freshwater +Fresnel +Fresno +fret +Freud +Freudian +Frey +Freya +friable +friar +fricative +Frick +friction +Friday +fridge +Friedman +Friedrich +friend +Friesland +frieze +frigate +Frigga +fright +frighten +frightful +frigid +Frigidaire +frill +frilly +fringe +Frisian +frisky +fritillary +fritter +Fritz +frivolity +frivolous +frizzle +frizzy +fro +frock +frog +frolic +frolicked +frolicking +from +frond +front +frontage +frontal +frontier +frontiersman +frontiersmen +frost +frostbite +frostbitten +frosty +froth +frothy +frown +frowzy +froze +frozen +fructose +Fruehauf +frugal +fruit +fruitful +fruition +frustrate +frustrater +frustum +fry +Frye +f's +Ft +FTC +Fuchs +Fuchsia +fudge +fuel +fugal +fugitive +fugue +Fuji +Fujitsu +Fulbright +fulcrum +fulfill +full +fullback +Fullerton +fully +fulminate +fulsome +Fulton +fum +fumarole +fumble +fume +fumigant +fumigate +fun +function +functionary +functor +functorial +fund +fundamental +fundraiser +fundraising +funeral +funerary +funereal +fungal +fungi +fungible +fungicide +fungoid +fungus +funk +funky +funnel +funny +fur +furbish +furious +furl +furlong +furlough +Furman +furnace +furnish +furniture +furrier +furrow +furry +further +furthermore +furthermost +furthest +furtive +fury +furze +fuse +fuselage +fusible +fusiform +fusillade +fusion +fuss +fussy +fusty +futile +future +fuzz +fuzzy +g +GA +gab +gabardine +gabble +gabbro +Gaberones +gable +Gabon +Gabriel +Gabrielle +gad +gadfly +gadget +gadgetry +gadolinium +gadwall +Gaelic +gaff +gaffe +gag +gage +gagging +gaggle +gagwriter +gaiety +Gail +gaillardia +gain +Gaines +Gainesville +gainful +gait +Gaithersburg +gal +gala +galactic +galactose +Galapagos +Galatea +Galatia +galaxy +Galbreath +gale +Galen +galena +galenite +Galilean +Galilee +Galileo +gall +Gallagher +gallant +gallantry +gallberry +gallery +galley +gallinule +gallium +gallivant +gallon +gallonage +gallop +Galloway +gallows +gallstone +Gallup +gallus +Galois +Galt +galvanic +galvanism +galvanometer +Galveston +Galway +gam +Gambia +gambit +gamble +gambol +game +gamecock +gamesmanship +gamete +gamin +gamma +gamut +gander +Gandhi +Gandhian +gang +Ganges +gangland +gangling +ganglion +gangplank +gangster +gangway +gannet +Gannett +gantlet +gantry +Ganymede +GAO +gap +gape +gar +garage +garb +garbage +garble +Garcia +garden +gardenia +Gardner +Garfield +gargantuan +gargle +Garibaldi +garish +garland +garlic +garner +garnet +garnish +Garrett +garrison +Garrisonian +garrulous +Garry +garter +Garth +Garvey +Gary +gas +Gascony +gaseous +gases +gash +gasify +gasket +gaslight +gasoline +gasp +Gaspee +gassy +Gaston +gastrointestinal +gastronome +gastronomic +gastronomy +gate +gatekeeper +Gates +gateway +gather +Gatlinburg +gator +gauche +gaucherie +gaudy +gauge +gaugeable +Gauguin +Gaul +gauleiter +Gaulle +gaunt +gauntlet +gaur +gauss +Gaussian +Gautama +gauze +gauzy +gave +gavel +Gavin +gavotte +gawk +gawky +gay +Gaylord +gaze +gazebo +gazelle +gazette +gazpacho +GE +gear +gecko +gee +geese +Gegenschein +Geiger +Geigy +geisha +gel +gelable +gelatin +gelatine +gelatinous +geld +gem +geminate +Gemini +Geminid +Gemma +gemsbok +gemstone +gender +gene +genealogy +genera +general +generate +generic +generosity +generous +Genesco +genesis +genetic +Geneva +Genevieve +genial +genie +genii +genital +genitive +genius +Genoa +genotype +genre +gent +genteel +gentian +gentile +gentle +gentleman +gentlemen +gentlewoman +gentlewomen +gentry +genuflect +genuine +genus +geocentric +geochemical +geochemistry +geochronology +geode +geodesic +geodesy +geodetic +geoduck +Geoffrey +geographer +geography +geology +geometer +geometrician +geophysical +geophysics +geopolitic +George +Georgetown +Georgia +geothermal +Gerald +Geraldine +geranium +Gerard +Gerber +gerbil +Gerhard +Gerhardt +geriatric +germ +German +germane +Germanic +germanium +Germantown +Germany +germicidal +germicide +germinal +germinate +Gerry +Gershwin +Gertrude +gerund +gerundial +gerundive +gestalt +Gestapo +gestation +gesticulate +gestural +gesture +get +getaway +Getty +Gettysburg +geyser +Ghana +Ghanian +ghastly +Ghent +gherkin +ghetto +ghost +ghoul +ghoulish +Giacomo +giant +giantess +gibberellin +gibberish +gibbet +gibbon +gibbous +Gibbs +gibby +gibe +giblet +Gibraltar +Gibson +giddap +giddy +Gideon +Gifford +gift +gig +gigacycle +gigahertz +gigantic +gigavolt +gigawatt +gigging +giggle +Gil +gila +gilbert +Gilbertson +Gilchrist +gild +Gilead +Giles +gill +Gillespie +Gillette +Gilligan +Gilmore +gilt +gimbal +Gimbel +gimlet +gimpy +gin +Gina +ginger +gingham +ginkgo +ginmill +Ginn +Gino +Ginsberg +Ginsburg +ginseng +Giovanni +giraffe +gird +girdle +girl +girlie +girlish +girt +girth +gist +Giuliano +Giuseppe +give +giveaway +given +giveth +gizmo +gizzard +gjetost +glacial +glaciate +glacier +glacis +glad +gladden +gladdy +glade +gladiator +gladiolus +Gladstone +Gladys +glamor +glamorous +glamour +glance +gland +glandular +glans +glare +Glasgow +glass +glassine +glassware +glasswort +glassy +Glaswegian +glaucoma +glaucous +glaze +gleam +glean +Gleason +glee +gleeful +glen +Glenda +Glendale +Glenn +glib +glibly +Glidden +glide +glimmer +glimpse +glint +glissade +glisten +glitch +glitter +gloat +glob +global +globe +globular +globule +globulin +glom +glomerular +gloom +gloomy +Gloria +Gloriana +glorify +glorious +glory +gloss +glossary +glossolalia +glossy +glottal +glottis +Gloucester +glove +glow +glucose +glue +gluey +glum +glut +glutamate +glutamic +glutamine +gluten +glutinous +glutton +gluttonous +gluttony +glyceride +glycerin +glycerinate +glycerine +glycerol +glycine +glycogen +glycol +glyph +GM +GMT +gnarl +gnash +gnat +gnaw +gneiss +gnome +gnomon +gnomonic +gnostic +GNP +gnu +go +Goa +goad +goal +goat +gob +gobble +gobbledygook +Gobi +goblet +god +Goddard +goddess +godfather +Godfrey +godhead +godkin +godmother +godparent +godsend +godson +Godwin +godwit +goes +Goethe +Goff +gog +goggle +Gogh +gogo +gold +Goldberg +golden +goldeneye +goldenrod +goldenseal +goldfinch +goldfish +Goldman +goldsmith +Goldstein +Goldstine +Goldwater +Goleta +golf +Goliath +golly +gonad +gonadotropic +gondola +gone +gong +Gonzales +Gonzalez +goober +good +goodbye +Goode +Goodman +Goodrich +goodwill +Goodwin +goody +Goodyear +goof +goofy +goose +gooseberry +GOP +gopher +Gordian +Gordon +gore +Goren +gorge +gorgeous +gorgon +Gorham +gorilla +Gorky +gorse +Gorton +gory +gosh +goshawk +gosling +gospel +gossamer +gossip +got +Gotham +Gothic +gotten +Gottfried +Goucher +Gouda +gouge +Gould +gourd +gourmet +gout +govern +governance +governess +governor +gown +GPO +grab +grace +graceful +gracious +grackle +grad +gradate +grade +gradient +gradual +graduate +Grady +Graff +graft +graham +grail +grain +grainy +grammar +grammarian +grammatic +gramophone +granary +grand +grandchild +grandchildren +granddaughter +grandeur +grandfather +grandiloquent +grandiose +grandma +grandmother +grandnephew +grandniece +grandpa +grandparent +grandson +grandstand +granite +granitic +granny +granola +grant +grantee +grantor +granular +granulate +granule +Granville +grape +grapefruit +grapevine +graph +grapheme +graphic +graphite +grapple +grasp +grass +grasshopper +grassland +grassy +grata +grate +grateful +grater +gratify +gratis +gratitude +gratuitous +gratuity +grave +gravel +graven +gravestone +graveyard +gravid +gravitate +gravitometer +graviton +gravy +Grayson +graze +grease +greasy +great +greatcoat +greater +grebe +Grecian +Greece +greed +greedy +Greek +green +Greenbelt +Greenberg +Greenblatt +Greenbriar +Greene +greenery +Greenfield +greengrocer +greenhouse +greenish +Greenland +Greensboro +greensward +greenware +Greenwich +greenwood +Greer +greet +Greg +gregarious +Gregg +Gregory +gremlin +grenade +Grendel +Grenoble +grep +Gresham +Greta +Gretchen +grew +grey +greyhound +greylag +grid +griddle +gridiron +gridlock +grief +grievance +grieve +grievous +griffin +Griffith +grill +grille +grillwork +grim +grimace +Grimaldi +grime +Grimm +grimy +grin +grind +grindstone +grip +gripe +grippe +grisly +grist +gristmill +Griswold +grit +gritty +grizzle +grizzly +groan +groat +grocer +grocery +groggy +groin +grommet +groom +groove +grope +grosbeak +gross +Grosset +Grossman +Grosvenor +grotesque +Groton +grotto +grottoes +grouch +grouchy +ground +groundhog +groundsel +groundskeep +groundwork +group +groupoid +grouse +grout +grove +grovel +Grover +grow +growl +grown +grownup +growth +grub +grubby +grudge +gruesome +gruff +grumble +Grumman +grump +grumpy +grunt +Gruyere +gryphon +g's +GSA +GU +Guam +guanidine +guanine +guano +guarantee +guaranteeing +guaranty +guard +guardhouse +Guardia +guardian +Guatemala +gubernatorial +Guelph +Guenther +guerdon +guernsey +guerrilla +guess +guesswork +guest +guffaw +Guggenheim +Guiana +guidance +guide +guidebook +guideline +guidepost +guignol +guild +guildhall +guile +Guilford +guillemot +guillotine +guilt +guilty +guinea +Guinevere +guise +guitar +Gujarat +Gujarati +gulch +gules +gulf +gull +Gullah +gullet +gullible +gully +gulp +gum +gumbo +gumdrop +gummy +gumption +gumshoe +gun +Gunderson +gunfight +gunfire +gunflint +gunk +gunky +gunman +gunmen +gunnery +gunny +gunplay +gunpoint +gunpowder +gunshot +gunsling +Gunther +gurgle +Gurkha +guru +Gus +gush +gusset +gust +Gustafson +Gustav +Gustave +Gustavus +gusto +gusty +gut +Gutenberg +Guthrie +gutsy +guttural +guy +Guyana +guzzle +Gwen +Gwyn +gym +gymnasium +gymnast +gymnastic +gymnosperm +gyp +gypsite +gypsum +gypsy +gyrate +gyrfalcon +gyro +gyrocompass +gyroscope +h +ha +Haag +Haas +habeas +haberdashery +Haberman +Habib +habit +habitant +habitat +habitation +habitual +habituate +hacienda +hack +hackberry +Hackett +hackle +hackmatack +hackney +hacksaw +had +Hadamard +Haddad +haddock +Hades +Hadley +hadn't +Hadrian +hadron +hafnium +Hagen +Hager +haggard +haggis +haggle +hagiography +Hagstrom +Hague +Hahn +Haifa +haiku +hail +hailstone +hailstorm +Haines +hair +haircut +hairdo +hairpin +hairspring +hairy +Haiti +Haitian +Hal +halcyon +hale +Haley +half +halfback +halfhearted +halftone +halfway +halibut +halide +Halifax +halite +hall +hallelujah +Halley +hallmark +hallow +Halloween +hallucinate +hallucinatory +hallucinogen +hallucinogenic +hallway +halma +halo +halocarbon +halogen +Halpern +Halsey +Halstead +halt +halvah +halve +Halverson +ham +Hamal +Hamburg +hamburger +Hamilton +hamlet +Hamlin +hammerhead +hammock +Hammond +hamper +Hampshire +Hampton +hamster +hamstrung +Han +Hancock +hand +handbag +handbook +handclasp +handcuff +Handel +handful +handgun +handhold +handicap +handicapped +handicapper +handicapping +handicraft +handicraftsman +handicraftsmen +handiwork +handkerchief +handle +handleable +handlebar +handline +handmade +handmaiden +handout +handpicked +handprint +handset +handshake +handsome +handspike +handstand +handwaving +handwrite +handwritten +handy +handyman +handymen +Haney +Hanford +hang +hangable +hangar +hangdog +hangman +hangmen +hangnail +hangout +hangover +hank +Hankel +Hanley +Hanlon +Hanna +Hannah +Hannibal +Hanoi +Hanover +Hanoverian +Hans +Hansel +Hansen +hansom +Hanson +Hanukkah +hap +haphazard +haploid +haploidy +haplology +happen +happenstance +happy +Hapsburg +harangue +harass +Harbin +harbinger +Harcourt +hard +hardbake +hardboard +hardboiled +hardbound +hardcopy +hardcover +harden +hardhat +hardhearted +Hardin +hardscrabble +hardtack +hardtop +hardware +hardwire +hardwood +hardworking +hardy +hare +harebrained +harelip +harem +hark +harken +Harlan +Harlem +Harley +harm +harmful +Harmon +harmonic +harmonica +harmonious +harmony +harness +Harold +harp +harpoon +harpsichord +harpy +Harriet +Harriman +Harrington +Harris +Harrisburg +Harrison +harrow +harry +harsh +harshen +hart +Hartford +Hartley +Hartman +Harvard +harvest +harvestman +Harvey +has +hash +hashish +hasn't +hasp +hassle +hast +haste +hasten +Hastings +hasty +hat +hatch +hatchery +hatchet +hatchway +hate +hateful +hater +Hatfield +hath +Hathaway +hatred +Hatteras +Hattie +Hattiesburg +Haugen +haughty +haul +haulage +haunch +haunt +Hausa +Hausdorff +Havana +have +haven +haven't +haversack +Havilland +havoc +haw +Hawaii +Hawaiian +hawk +Hawkins +Hawley +hawthorn +Hawthorne +hay +Hayden +Haydn +Hayes +hayfield +Haynes +haystack +hayward +hazard +hazardous +haze +hazel +hazelnut +hazy +he +head +headache +headboard +headcount +headdress +headland +headlight +headline +headlong +headman +headmaster +headmen +headphone +headquarter +headroom +headset +headsman +headsmen +headstand +headstone +headstrong +headwall +headwater +headway +headwind +heady +heal +Healey +health +healthful +healthy +Healy +heap +hear +heard +hearken +hearsay +hearse +Hearst +heart +heartbeat +heartbreak +hearten +heartfelt +hearth +heartland +heartrending +heartthrob +hearty +heat +heater +heath +heathen +heathenish +Heathkit +heave +heaven +heavenward +heavy +heavyset +heavyweight +Hebe +hebephrenic +Hebraic +Hebrew +Hebrides +Hecate +hecatomb +heck +heckle +Heckman +hectic +hector +Hecuba +he'd +hedge +hedgehog +hedonism +hedonist +heed +heel +heft +hefty +Hegelian +hegemony +Heidegger +Heidelberg +heifer +heigh +height +heighten +Heine +Heinrich +Heinz +heir +heiress +Heisenberg +held +Helen +Helena +Helene +Helga +helical +helicopter +heliocentric +heliotrope +helium +helix +he'll +hell +hellbender +hellebore +Hellenic +Hellespont +hellfire +hellgrammite +hellish +hello +helm +helmet +Helmholtz +helmsman +helmsmen +Helmut +help +helpful +helpmate +Helsinki +Helvetica +hem +hematite +Hemingway +hemisphere +hemispheric +hemlock +hemp +Hempstead +hen +henbane +hence +henceforth +henchman +henchmen +Henderson +Hendrick +Hendrickson +henequen +Henley +henpeck +Henri +Henrietta +henry +hepatica +hepatitis +Hepburn +heptane +her +Hera +Heraclitus +herald +herb +herbarium +Herbert +herbicide +herbivore +herbivorous +Herculean +Hercules +herd +herdsman +herdsmen +here +hereabout +hereafter +hereby +hereditary +heredity +Hereford +herein +hereinabove +hereinafter +hereinbelow +hereof +heresy +heretic +hereto +heretofore +hereunder +hereunto +herewith +heritable +heritage +Herkimer +Herman +Hermann +hermaphrodite +hermaphroditic +hermeneutic +Hermes +hermetic +hermit +hermitage +Hermite +hermitian +Hermosa +Hernandez +hernia +hero +Herodotus +heroes +heroic +heroin +heroine +heroism +heron +herpes +herpetology +Herr +herringbone +Herschel +herself +Hershel +Hershey +hertz +Hertzog +hesitant +hesitate +hesitater +Hesperus +Hess +Hesse +Hessian +Hester +heterocyclic +heterodyne +heterogamous +heterogeneity +heterogeneous +heterosexual +heterostructure +heterozygous +Hetman +Hettie +Hetty +Heublein +heuristic +Heusen +Heuser +hew +Hewett +Hewitt +Hewlett +hewn +hex +hexachloride +hexadecimal +hexafluoride +hexagon +hexagonal +hexameter +hexane +hey +heyday +hi +Hiatt +hiatus +Hiawatha +hibachi +Hibbard +hibernate +Hibernia +hick +Hickey +Hickman +hickory +hid +hidalgo +hidden +hide +hideaway +hidebound +hideous +hideout +hierarchal +hierarchic +hierarchy +hieratic +hieroglyphic +Hieronymus +hifalutin +Higgins +high +highball +highboy +highfalutin +highhanded +highland +highlight +highroad +hightail +highway +highwayman +highwaymen +hijack +hike +hilarious +hilarity +Hilbert +Hildebrand +hill +hillbilly +Hillcrest +Hillel +hillman +hillmen +hillock +hillside +hilltop +hilly +hilt +Hilton +hilum +him +Himalaya +himself +hind +Hindi +hindmost +hindquarters +hindrance +hindsight +Hindu +Hindustan +Hines +hinge +Hinman +hint +hinterland +hip +hippie +hippo +Hippocrates +Hippocratic +hippodrome +hippopotamus +hippy +hipster +Hiram +hire +hireling +Hiroshi +Hiroshima +Hirsch +hirsute +his +Hispanic +hiss +histamine +histidine +histochemic +histochemistry +histogram +histology +historian +historic +historiography +history +histrionic +hit +Hitachi +hitch +Hitchcock +hither +hitherto +Hitler +hive +ho +hoagie +Hoagland +hoagy +hoar +hoard +hoarfrost +hoarse +hoax +hob +Hobart +Hobbes +hobble +Hobbs +hobby +hobbyhorse +hobo +Hoboken +hoc +hock +hockey +hodge +hodgepodge +Hodges +Hodgkin +hoe +Hoff +Hoffman +hog +hogan +hogging +hoi +Hokan +Holbrook +Holcomb +hold +holden +holdover +holdup +hole +holeable +holiday +Holland +hollandaise +holler +Hollerith +Hollingsworth +Hollister +hollow +Holloway +hollowware +holly +hollyhock +Hollywood +Holm +Holman +Holmdel +Holmes +holmium +holocaust +Holocene +hologram +holography +Holst +Holstein +holster +holt +Holyoke +holystone +Hom +homage +home +homebound +homebuilder +homebuilding +homecoming +homeland +homemade +homemake +homeobox +homeomorph +homeomorphic +homeopath +homeopathic +homeowner +Homeric +homesick +homespun +homestead +homeward +homework +homicidal +homicide +homily +hominid +homo +homogenate +homogeneity +homogeneous +homologous +homologue +homology +homomorphic +homomorphism +homonym +homophobia +homosexual +homotopy +homozygous +homunculus +Honda +hondo +Honduras +hone +honest +honesty +honey +honeybee +honeycomb +honeydew +honeymoon +honeysuckle +Honeywell +hong +honk +honky +Honolulu +honoraria +honorarium +honorary +honoree +honorific +Honshu +hooch +hood +hoodlum +hoof +hoofmark +hoofprint +hook +hookup +hookworm +hooligan +hoop +hoopla +hoosegow +Hoosier +hoot +Hoover +hooves +hop +hope +hopeful +Hopi +Hopkins +Hopkinsian +hopple +hopscotch +Horace +Horatio +horde +horehound +horizon +horizontal +hormonal +hormone +horn +hornbeam +hornblende +Hornblower +hornet +hornmouth +hornpipe +horntail +hornwort +horny +horology +horoscope +Horowitz +horrendous +horrible +horrid +horrify +horror +horse +horseback +horsedom +horseflesh +horsefly +horsehair +horseman +horsemen +horseplay +horsepower +horseshoe +horsetail +horsewoman +horsewomen +horticulture +Horton +Horus +hose +hosiery +hospice +hospitable +hospital +host +hostage +hostelry +hostess +hostile +hostler +hot +hotbed +hotbox +hotel +hotelman +hotfoot +hothead +hothouse +hotrod +Hottentot +Houdaille +Houdini +hough +Houghton +hound +hour +hourglass +house +houseboat +housebreak +housebroken +housefly +household +housekeep +housemate +housewife +housewives +housework +Houston +hove +hovel +hover +how +Howard +howdy +Howe +Howell +however +howl +howsoever +howsomever +hoy +hoyden +hoydenish +Hoyt +Hrothgar +h's +hub +Hubbard +Hubbell +hubbub +hubby +hubcap +Huber +Hubert +hubris +huck +huckleberry +huckster +huddle +Hudson +hue +huff +Huffman +hug +huge +hugging +Huggins +Hugh +Hughes +Hugo +huh +hulk +hull +hullaballoo +hullabaloo +hum +human +humane +humanitarian +humble +Humboldt +humdrum +humerus +humid +humidify +humidistat +humiliate +humility +Hummel +hummingbird +hummock +humorous +hump +humpback +Humphrey +humpty +humus +Hun +hunch +hunchback +hundred +hundredfold +hundredth +hung +Hungarian +Hungary +hungry +hunk +hunt +Huntington +Huntley +Huntsville +Hurd +hurdle +hurl +hurley +Huron +hurrah +hurray +hurricane +hurry +Hurst +hurt +hurtle +hurty +Hurwitz +husband +husbandman +husbandmen +husbandry +hush +husky +hustle +Huston +hut +hutch +Hutchins +Hutchinson +Hutchison +Huxley +Huxtable +huzzah +hyacinth +Hyades +hyaline +Hyannis +hybrid +Hyde +hydra +hydrangea +hydrant +hydrate +hydraulic +hydride +hydro +hydrocarbon +hydrochemistry +hydrochloric +hydrochloride +hydrocyanic +hydrodynamic +hydroelectric +hydrofluoric +hydrogen +hydrogenate +hydrology +hydrolysis +hydrometer +hydronium +hydrophilic +hydrophobia +hydrophobic +hydrophone +hydrosphere +hydrostatic +hydrothermal +hydrous +hydroxide +hydroxy +hydroxyl +hydroxylate +hyena +hygiene +hygrometer +hygroscopic +hying +Hyman +hymen +hymn +hymnal +hyper +hyperbola +hyperbolic +hyperboloid +hyperboloidal +hypertensive +hyperthermia +hyphen +hyphenate +hypnosis +hypnotic +hypoactive +hypochlorite +hypochlorous +hypocrisy +hypocrite +hypocritic +hypocycloid +hypodermic +hypophyseal +hypotenuse +hypothalamic +hypothalamus +hypothalmus +hypothermia +hypotheses +hypothesis +hypothetic +hypothyroid +hypotonic +hysterectomy +hysteresis +hysteria +hysteric +hysteron +i +IA +iambic +Ian +Iberia +ibex +ibid +ibis +IBM +Ibn +Icarus +ICC +ice +iceberg +icebox +icecap +iceland +Icelandic +iceman +ichneumon +icicle +icky +icon +iconoclasm +iconoclast +iconography +icosahedra +icosahedral +icosahedron +icy +I'd +id +Ida +Idaho +idea +ideal +ideate +idempotent +identical +identify +identity +ideogram +ideolect +ideology +idetic +idiocy +idiom +idiomatic +idiosyncrasy +idiosyncratic +idiot +idiotic +idle +idly +idol +idolatry +idyll +idyllic +i.e +IEEE +if +iffy +Ifni +igloo +igneous +ignite +ignition +ignoble +ignominious +ignominy +ignoramus +ignorant +ignore +Igor +ii +iii +Ike +IL +ileum +iliac +Iliad +I'll +ill +illegal +illegible +illegitimacy +illegitimate +illicit +illimitable +Illinois +illiteracy +illiterate +illogic +illume +illuminate +illumine +illusion +illusionary +illusive +illusory +illustrate +illustrious +Ilona +Ilyushin +I'm +image +imagen +imagery +imaginary +imaginate +imagine +imbalance +imbecile +imbibe +Imbrium +imbroglio +imbrue +imbue +imitable +imitate +immaculate +immanent +immaterial +immature +immeasurable +immediacy +immediate +immemorial +immense +immerse +immersion +immigrant +immigrate +imminent +immiscible +immobile +immobility +immoderate +immodest +immodesty +immoral +immortal +immovable +immune +immunoelectrophoresis +immunology +immutable +imp +impact +impair +impale +impalpable +impart +impartation +impartial +impassable +impasse +impassion +impassive +impatient +impeach +impeccable +impedance +impede +impediment +impel +impelled +impeller +impelling +impend +impenetrable +imperate +imperceivable +imperceptible +imperfect +imperial +imperil +imperious +imperishable +impermeable +impermissible +impersonal +impersonate +impertinent +imperturbable +impervious +impetuous +impetus +impiety +impinge +impious +impish +implacable +implant +implantation +implausible +implement +implementation +implementer +implementor +implicant +implicate +implicit +implore +impolite +impolitic +imponderable +import +important +importation +importunate +importune +impose +imposition +impossible +impost +imposture +impotent +impound +impoverish +impracticable +impractical +imprecate +imprecise +impregnable +impregnate +impresario +impress +impressible +impression +impressive +imprimatur +imprint +imprison +improbable +impromptu +improper +impropriety +improve +improvident +improvisate +improvise +imprudent +impudent +impugn +impulse +impulsive +impunity +impure +imputation +impute +in +inability +inaccessible +inaccuracy +inaccurate +inaction +inactivate +inactive +inadequacy +inadequate +inadmissible +inadvertent +inadvisable +inalienable +inalterable +inane +inanimate +inappeasable +inapplicable +inappreciable +inapproachable +inappropriate +inapt +inaptitude +inarticulate +inasmuch +inattention +inattentive +inaudible +inaugural +inaugurate +inauspicious +inauthentic +inboard +inborn +inbred +inbreed +Inc +Inca +incalculable +incandescent +incant +incantation +incapable +incapacitate +incapacity +incarcerate +incarnate +incautious +incendiary +incense +incentive +inception +inceptor +incessant +incest +incestuous +inch +inchoate +inchworm +incident +incidental +incinerate +incipient +incise +incisive +incisor +incite +inclement +inclination +incline +inclose +include +inclusion +inclusive +incognito +incoherent +incombustible +income +incommensurable +incommensurate +incommunicable +incommutable +incomparable +incompatible +incompetent +incomplete +incompletion +incomprehensible +incomprehension +incompressible +incomputable +inconceivable +inconclusive +incondensable +incongruity +incongruous +inconsequential +inconsiderable +inconsiderate +inconsistent +inconsolable +inconspicuous +inconstant +incontestable +incontrollable +incontrovertible +inconvenient +inconvertible +incorporable +incorporate +incorrect +incorrigible +incorruptible +increasable +increase +incredible +incredulity +incredulous +increment +incriminate +incubate +incubi +incubus +inculcate +inculpable +incumbent +incur +incurred +incurrer +incurring +incursion +indebted +indecent +indecipherable +indecision +indecisive +indecomposable +indeed +indefatigable +indefensible +indefinable +indefinite +indelible +indelicate +indemnity +indent +indentation +indenture +independent +indescribable +indestructible +indeterminable +indeterminacy +indeterminate +index +India +Indiana +Indianapolis +indicant +indicate +indices +indict +Indies +indifferent +indigene +indigenous +indigent +indigestible +indigestion +indignant +indignation +indignity +indigo +Indira +indirect +indiscernible +indiscoverable +indiscreet +indiscretion +indiscriminate +indispensable +indispose +indisposition +indisputable +indissoluble +indistinct +indistinguishable +indium +individual +individuate +indivisible +Indo +Indochina +Indochinese +indoctrinate +Indoeuropean +indolent +indomitable +Indonesia +indoor +indorse +indubitable +induce +inducible +induct +inductance +inductee +inductor +indulge +indulgent +Indus +industrial +industrious +industry +indwell +indy +inebriate +inedible +ineducable +ineffable +ineffective +ineffectual +inefficacy +inefficient +inelastic +inelegant +ineligible +ineluctable +inept +inequality +inequitable +inequity +inequivalent +ineradicable +inert +inertance +inertia +inertial +inescapable +inessential +inestimable +inevitable +inexact +inexcusable +inexhaustible +inexorable +inexpedient +inexpensive +inexperience +inexpert +inexpiable +inexplainable +inexplicable +inexplicit +inexpressible +inextinguishable +inextricable +infallible +infamous +infamy +infant +infanticide +infantile +infantry +infantryman +infantrymen +infarct +infatuate +infeasible +infect +infectious +infelicitous +infelicity +infer +inference +inferential +inferior +infernal +inferno +inferred +inferring +infertile +infest +infestation +infidel +infield +infighting +infiltrate +infima +infimum +infinite +infinitesimal +infinitive +infinitude +infinitum +infinity +infirm +infirmary +infix +inflame +inflammable +inflammation +inflammatory +inflate +inflater +inflationary +inflect +inflexible +inflict +inflorescent +inflow +influence +influent +influential +influenza +influx +info +inform +informal +informant +information +informative +infra +infract +infrared +infrastructure +infrequent +infringe +infuriate +infuse +infusible +infusion +infusoria +ingather +ingenious +ingenuity +ingenuous +Ingersoll +ingest +ingestible +ingestion +inglorious +ingot +ingrained +Ingram +ingrate +ingratiate +ingratitude +ingredient +ingrown +inhabit +inhabitant +inhabitation +inhalation +inhale +inharmonious +inhere +inherent +inherit +inheritance +inheritor +inhibit +inhibition +inhibitor +inhibitory +inholding +inhomogeneity +inhomogeneous +inhospitable +inhuman +inhumane +inimical +inimitable +iniquitous +iniquity +initial +initiate +inject +injudicious +Injun +injunct +injure +injurious +injury +injustice +ink +inkling +inlaid +inland +inlay +inlet +Inman +inmate +inn +innard +innate +innermost +innkeeper +innocent +innocuous +innovate +innuendo +innumerable +inoculate +inoperable +inoperative +inopportune +inordinate +inorganic +input +inputting +inquest +inquire +inquiry +inquisition +inquisitive +inquisitor +inroad +insane +insatiable +inscribe +inscription +inscrutable +insect +insecticide +insectivore +insectivorous +insecure +inseminate +insensible +insensitive +inseparable +insert +inset +inshore +inside +insidious +insight +insightful +insignia +insignificant +insincere +insinuate +insipid +insist +insistent +insofar +insolate +insolent +insoluble +insolvable +insolvent +insomnia +insomniac +insouciant +inspect +inspector +inspiration +inspire +instable +install +installation +instant +instantaneous +instantiate +instar +instead +instep +instigate +instill +instillation +instinct +instinctual +institute +institution +instruct +instructor +instrument +instrumentation +insubordinate +insubstantial +insufferable +insufficient +insular +insulate +insulin +insult +insuperable +insupportable +insuppressible +insurance +insure +insurgent +insurmountable +insurrect +intact +intake +intangible +integer +integrable +integral +integrand +integrate +integrity +integument +intellect +intellectual +intelligent +intelligentsia +intelligible +intemperance +intemperate +intend +intendant +intense +intensify +intensive +intent +intention +inter +intercalate +intercept +interception +interceptor +intercom +interdict +interdigitate +interest +interfere +interference +interferometer +interferon +interim +interior +interject +interlude +intermediary +intermit +intermittent +intern +internal +internescine +Interpol +interpolate +interpolatory +interpret +interpretation +interpretive +interregnum +interrogate +interrogatory +interrupt +interruptible +interruption +intersect +intersperse +interstice +interstitial +interval +intervene +intervenor +intervention +interviewee +intestate +intestinal +intestine +intimacy +intimal +intimate +intimater +intimidate +into +intolerable +intolerant +intonate +intone +intoxicant +intoxicate +intra +intractable +intransigent +intransitive +intrepid +intricacy +intricate +intrigue +intrinsic +introduce +introduction +introductory +introit +introject +introspect +introversion +introvert +intrude +intrusion +intrusive +intuit +intuition +intuitive +inundate +inure +invade +invalid +invalidate +invaluable +invariable +invariant +invasion +invasive +invective +inveigh +inveigle +invent +invention +inventive +inventor +inventory +Inverness +inverse +inversion +invert +invertebrate +invertible +invest +investigate +investigatory +investor +inveterate +inviable +invidious +invigorate +invincible +inviolable +inviolate +invisible +invitation +invite +invitee +invocable +invocate +invoice +invoke +involuntary +involute +involution +involutorial +involve +invulnerable +inward +Io +iodate +iodide +iodinate +iodine +ion +ionic +ionosphere +ionospheric +iota +Iowa +ipecac +ipsilateral +ipso +IQ +IR +Ira +Iran +Iranian +Iraq +Iraqi +irate +ire +Ireland +Irene +iridium +iris +Irish +Irishman +Irishmen +irk +irksome +Irma +iron +ironbound +ironic +ironside +ironstone +ironwood +irony +Iroquois +irradiate +irrational +Irrawaddy +irreclaimable +irreconcilable +irreconciliable +irrecoverable +irredeemable +irredentism +irredentist +irreducible +irrefutable +irregular +irrelevant +irremediable +irremovable +irreparable +irreplaceable +irrepressible +irreproachable +irreproducible +irresistible +irresolute +irresolution +irresolvable +irrespective +irresponsible +irretrievable +irreverent +irreversible +irrevocable +irrigate +irritable +irritant +irritate +irruption +IRS +Irvin +Irvine +Irving +Irwin +i's +is +Isaac +Isaacson +Isabel +Isabella +Isadore +Isaiah +isentropic +Isfahan +Ising +isinglass +Isis +Islam +Islamabad +Islamic +island +isle +islet +isn't +isochronal +isochronous +isocline +isolate +Isolde +isomer +isomorph +isomorphic +isopleth +isotherm +isotope +isotropy +Israel +Israeli +Israelite +issuant +issue +Istanbul +isthmus +Istvan +it +Italian +italic +Italy +itch +itchy +it'd +item +iterate +Ithaca +itinerant +itinerary +it'll +Ito +itself +IT&T +ITT +iv +Ivan +Ivanhoe +I've +Iverson +ivory +ivy +ix +Izvestia +j +jab +Jablonsky +jack +jackal +jackanapes +jackass +jackboot +jackdaw +jacket +Jackie +jackknife +Jackman +jackpot +Jackson +Jacksonville +Jacky +JACM +Jacob +Jacobean +Jacobi +Jacobian +Jacobite +Jacobsen +Jacobson +Jacobus +Jacqueline +Jacques +jade +Jaeger +jag +jagging +jaguar +Jaime +Jakarta +jake +jalopy +jam +Jamaica +jamboree +James +Jamestown +Jan +Jane +Janeiro +Janet +jangle +Janice +janissary +janitor +janitorial +Janos +Jansenist +January +Janus +Japan +Japanese +jar +jargon +Jarvin +Jason +jasper +jaundice +jaunty +Java +java +javelin +jaw +jawbone +jay +jazz +jazzy +jealous +jealousy +jean +Jeannie +Jed +jeep +Jeff +Jefferson +Jeffrey +Jehovah +jejune +jejunum +jelly +jellyfish +Jenkins +Jennie +Jennifer +Jennings +jenny +Jensen +jeopard +jeopardy +Jeremiah +Jeremy +Jeres +Jericho +jerk +jerky +Jeroboam +Jerome +jerry +jersey +Jerusalem +jess +Jesse +Jessica +Jessie +jest +Jesuit +Jesus +jet +jetliner +jettison +Jew +jewel +Jewell +jewelry +Jewett +Jewish +jibe +jiffy +jig +jigging +jiggle +jigsaw +Jill +jilt +Jim +Jimenez +Jimmie +jimmy +jingle +jinx +jitter +jitterbug +jittery +jive +Jo +Joan +Joanna +Joanne +Joaquin +job +jobholder +jock +jockey +jockstrap +jocose +jocular +jocund +Joe +Joel +joey +jog +jogging +joggle +Johann +Johanna +Johannes +Johannesburg +Johansen +Johanson +John +Johnny +Johnsen +Johnson +Johnston +Johnstown +join +joint +joke +Joliet +Jolla +jolly +jolt +Jon +Jonas +Jonathan +Jones +jonquil +Jordan +Jorge +Jorgensen +Jorgenson +Jose +Josef +Joseph +Josephine +Josephson +Josephus +Joshua +Josiah +joss +jostle +jot +joule +jounce +journal +journalese +journey +journeyman +journeymen +joust +Jovanovich +Jove +jovial +Jovian +jowl +jowly +joy +Joyce +joyful +joyous +joyride +joystick +Jr +j's +Juan +Juanita +jubilant +jubilate +Judaica +Judaism +Judas +Judd +Jude +judge +judicable +judicatory +judicature +judicial +judiciary +judicious +Judith +judo +Judson +Judy +jug +jugate +juggernaut +jugging +juggle +Jugoslavia +juice +juicy +juju +jujube +juke +jukebox +Jukes +julep +Jules +Julia +Julie +Juliet +Julio +Julius +July +jumble +jumbo +jump +jumpy +junco +junction +junctor +juncture +June +Juneau +Jung +Jungian +jungle +junior +juniper +junk +junkerdom +junketeer +junky +Juno +junta +Jupiter +Jura +Jurassic +jure +juridic +jurisdiction +jurisprudent +jurisprudential +juror +jury +just +justice +justiciable +justify +Justine +Justinian +jut +jute +Jutish +Jutland +juvenile +juxtapose +juxtaposition +k +Kabuki +Kabul +Kaddish +Kafka +Kafkaesque +Kahn +kaiser +Kajar +Kalamazoo +kale +kaleidescope +kaleidoscope +kalmia +Kalmuk +Kamchatka +kamikaze +Kampala +Kampuchea +Kane +kangaroo +Kankakee +Kannada +Kansas +Kant +kaolin +kaolinite +Kaplan +kapok +kappa +Karachi +Karamazov +karate +Karen +Karl +karma +Karol +Karp +karyatid +Kashmir +Kaskaskia +Kate +Katharine +Katherine +Kathleen +Kathy +Katie +Katmandu +Katowice +katydid +Katz +Kauffman +Kaufman +kava +Kay +kayo +kazoo +Keaton +Keats +keddah +keel +keelson +keen +Keenan +keep +keeshond +keg +Keith +Keller +Kelley +Kellogg +kelly +kelp +Kelsey +Kelvin +Kemp +ken +Kendall +Kennan +Kennecott +Kennedy +kennel +Kenneth +Kenney +keno +Kensington +Kent +Kenton +Kentucky +Kenya +Kenyon +Kepler +kept +kerchief +Kermit +kern +kernel +Kernighan +kerosene +Kerouac +Kerr +kerry +kerygma +Kessler +kestrel +ketch +ketchup +keto +ketone +ketosis +Kettering +kettle +Kevin +key +keyboard +Keyes +keyhole +Keynes +Keynesian +keynote +keypunch +keystone +keyword +khaki +khan +Khartoum +Khmer +Khrushchev +kibbutzim +kibitz +kick +kickback +kickoff +kid +Kidde +kiddie +kidnap +kidnapped +kidnapping +kidney +Kieffer +Kiev +Kiewit +Kigali +Kikuyu +Kilgore +Kilimanjaro +kill +killdeer +killjoy +kilohm +Kim +Kimball +Kimberly +kimono +kin +kind +kindergarten +kindle +kindred +kinematic +kinesic +kinetic +king +kingbird +kingdom +kingfisher +kinglet +kingpin +Kingsbury +Kingsley +Kingston +kink +kinkajou +kinky +Kinney +Kinshasha +kinsman +kinsmen +kiosk +Kiowa +Kipling +Kirby +Kirchner +Kirchoff +kirk +Kirkland +Kirkpatrick +Kirov +kiss +kit +Kitakyushu +kitchen +kitchenette +kite +kitten +kittenish +kittle +kitty +kiva +kivu +Kiwanis +kiwi +Klan +Klaus +klaxon +kleenex +Klein +Kline +Klux +klystron +knack +Knapp +knapsack +Knauer +knead +knee +kneecap +kneel +knelt +knew +knick +Knickerbocker +knife +knight +Knightsbridge +knit +knives +knob +knobby +knock +knockdown +knockout +knoll +Knossos +knot +Knott +knotty +know +knoweth +knowhow +knowledge +knowledgeable +Knowles +Knowlton +known +Knox +Knoxville +knuckle +knuckleball +Knudsen +Knudson +knurl +Knutsen +Knutson +koala +Kobayashi +Koch +Kochab +Kodachrome +kodak +Kodiak +Koenig +Koenigsberg +kohlrabi +koinonia +kola +kolkhoz +kombu +Kong +Konrad +Koppers +Koran +Korea +kosher +Kovacs +Kowalewski +Kowalski +Kowloon +kraft +Krakatoa +Krakow +Kramer +Krause +kraut +Krebs +Kremlin +Kresge +Krieger +krill +Krishna +Kristin +Kronecker +Krueger +Kruger +krummholz +Kruse +krypton +KS +k's +Ku +kudo +kudzu +Kuhn +kulak +Kumar +kumquat +Kurd +Kurt +Kuwait +kwashiorkor +KY +Kyle +Kyoto +l +la +lab +Laban +label +labia +labial +labile +lability +labium +laboratory +laborious +labour +Labrador +labradorite +labyrinth +lac +lace +lacerate +Lacerta +lacewing +Lachesis +lachrymose +lack +lackadaisic +lackey +laconic +lacquer +lacrosse +lactate +lactose +lacuna +lacunae +lacustrine +lacy +lad +laden +ladle +lady +ladybird +ladybug +ladyfern +Lafayette +lag +lager +lagging +lagoon +Lagos +Lagrange +Lagrangian +Laguerre +Lahore +laid +Laidlaw +lain +lair +laissez +laity +lake +Lakehurst +lakeside +lakh +lam +lama +Lamar +Lamarck +lamb +lambda +lambert +lame +lamellar +lament +lamentation +laminar +laminate +lamp +lampblack +lamplight +lampoon +lamprey +Lana +Lancashire +Lancaster +lance +Lancelot +lancet +land +landau +landfill +landhold +Landis +landlady +landlocked +landlord +landlubber +landmark +landmass +landowner +landowning +landscape +landslide +lane +Lang +Lange +Langley +Langmuir +language +languid +languish +langur +Lanka +lanky +Lansing +lantern +lanthanide +lanthanum +Lao +Laocoon +Laos +Laotian +lap +lapel +lapelled +lapidary +Laplace +lappet +lapse +Laramie +larceny +larch +lard +Laredo +Lares +large +largemouth +largesse +lariat +lark +Larkin +larkspur +Larry +Lars +Larsen +Larson +larva +larvae +larval +laryngeal +larynges +larynx +lascar +lascivious +lase +lash +lass +lasso +last +Laszlo +latch +late +latent +later +latera +lateral +Lateran +laterite +latex +lath +lathe +Lathrop +Latin +Latinate +latitude +latitudinal +latitudinary +Latrobe +latter +lattice +latus +Latvia +laud +laudanum +laudatory +Lauderdale +Laue +laugh +laughingstock +Laughlin +laughter +launch +launder +laundry +laura +laureate +laurel +Lauren +Laurent +Laurentian +Laurie +Lausanne +lava +lavabo +lavatory +lavender +lavish +Lavoisier +law +lawbreaker +lawbreaking +lawful +lawgiver +lawgiving +lawmake +lawman +lawmen +lawn +Lawrence +lawrencium +Lawson +lawsuit +lawyer +lax +laxative +lay +layette +layman +laymen +layoff +layout +layperson +Layton +layup +Lazarus +laze +lazy +lazybones +lea +leach +leachate +lead +leaden +leadeth +leadsman +leadsmen +leaf +leaflet +leafy +league +leak +leakage +leaky +lean +Leander +leap +leapfrog +leapt +Lear +learn +lease +leasehold +leash +least +leather +leatherback +leatherneck +leatherwork +leathery +leave +leaven +Leavenworth +Lebanese +Lebanon +lebensraum +Lebesgue +lecher +lechery +lectern +lectionary +lecture +led +ledge +lee +leech +Leeds +leek +leer +leery +Leeuwenhoek +leeward +leeway +left +leftmost +leftover +leftward +lefty +leg +legacy +legal +legate +legatee +legato +legend +legendary +Legendre +legerdemain +legging +leggy +leghorn +legible +legion +legislate +legislature +legitimacy +legitimate +legume +leguminous +Lehigh +Lehman +Leibniz +Leigh +Leighton +Leila +leisure +leitmotif +leitmotiv +Leland +lemma +lemming +lemon +lemonade +Lemuel +lemur +Len +Lena +lend +length +lengthen +lengthwise +lengthy +lenient +Lenin +Leningrad +Lennox +Lenny +Lenore +lens +lent +Lenten +lenticular +lentil +Leo +Leon +Leona +Leonard +Leonardo +Leone +Leonid +leonine +leopard +Leopold +leper +lepidolite +lepidopterist +leprosy +Leroy +Lesbian +lesion +Leslie +Lesotho +less +lessee +lessen +lesson +lessor +lest +Lester +let +lethal +lethargy +Lethe +Letitia +letterhead +letterman +lettermen +lettuce +leucine +Lev +levee +level +lever +leverage +Levi +leviathan +Levin +Levine +Levis +levitate +Leviticus +Levitt +levity +levulose +levy +lew +lewd +lewis +lexical +lexicographer +lexicography +lexicon +Lexington +Leyden +liable +liaison +liana +liar +libation +libel +libelous +liberal +liberate +Liberia +libertarian +libertine +liberty +libidinous +libido +Libra +librarian +library +librate +librettist +libretto +Libreville +Libya +lice +licensable +licensee +licensor +licentious +lichen +lick +licorice +lid +lie +Lieberman +Liechtenstein +lien +lieu +lieutenant +life +lifeblood +lifeboat +lifeguard +lifelong +lifespan +lifestyle +lifetime +LIFO +lift +ligament +ligand +ligature +Ligget +Liggett +light +lighten +lightface +lightfooted +lighthearted +lighthouse +lightning +lightproof +lightweight +lignite +lignum +like +likeable +liken +likewise +Lila +lilac +Lilian +Lillian +Lilliputian +Lilly +lilt +lily +lim +Lima +limb +limbic +limbo +lime +limelight +limerick +limestone +limit +limitate +limnology +limousine +limp +limpet +limpid +limpkin +Lin +linchpin +Lincoln +Lind +Linda +Lindberg +Lindbergh +linden +Lindholm +Lindquist +Lindsay +Lindsey +Lindstrom +line +lineage +lineal +linear +linebacker +lineman +linemen +linen +lineprinter +lineup +linger +lingerie +lingo +lingua +lingual +linguist +liniment +link +linkage +Linnaeus +linoleic +linoleum +Linotype +linseed +lint +Linton +Linus +lion +Lionel +lioness +lip +lipid +Lippincott +Lipschitz +Lipscomb +lipstick +Lipton +liquefaction +liquefy +liqueur +liquid +liquidate +liquor +Lisa +Lisbon +Lise +lisle +lisp +Lissajous +list +listen +lit +litany +literacy +literal +literary +literate +literature +lithe +lithic +lithium +lithograph +lithography +lithology +lithosphere +lithospheric +Lithuania +litigant +litigate +litigious +litmus +litterbug +littermate +little +littleneck +Littleton +Litton +littoral +liturgic +liturgy +live +liven +Livermore +Liverpool +Liverpudlian +liverwort +livery +livestock +liveth +livid +Livingston +livre +Liz +lizard +Lizzie +llama +Lloyd +lo +load +loaf +loam +loamy +loan +loanword +loath +loathe +loathsome +loaves +lob +lobar +lobby +lobe +Lobelia +loblolly +lobo +lobscouse +lobster +lobular +lobule +local +locale +locate +loch +loci +lock +Locke +Lockhart +Lockheed +Lockian +locknut +lockout +locksmith +lockup +Lockwood +locomote +locomotion +locomotive +locomotor +locomotory +locoweed +locus +locust +locutor +lodestone +lodge +lodgepole +Lodowick +Loeb +l'oeil +loess +loft +lofty +log +Logan +logarithm +logarithmic +loge +loggerhead +logging +logic +logician +login +logistic +logjam +loin +loincloth +Loire +Lois +loiter +Loki +Lola +loll +lollipop +lolly +Lomb +Lombard +Lombardy +Lome +London +lone +lonesome +long +longevity +Longfellow +longhand +longhorn +longish +longitude +longitudinal +longleg +longstanding +longtime +longue +longwinded +look +lookout +lookup +loom +Loomis +loon +loop +loophole +loose +looseleaf +loosen +loosestrife +loot +lop +lope +Lopez +lopseed +lopsided +loquacious +loquacity +loquat +lord +lordosis +lore +Lorelei +Loren +Lorenz +Lorinda +loris +Lorraine +lorry +losable +lose +loss +lossy +lost +lot +lotion +Lotte +lottery +Lottie +lotus +Lou +loud +loudspeaker +loudspeaking +Louis +Louisa +Louise +Louisiana +Louisville +lounge +Lounsbury +Lourdes +louse +lousewort +lousy +Louvre +love +lovebird +Lovelace +Loveland +lovelorn +low +lowboy +lowdown +Lowe +Lowell +lowland +Lowry +lox +loy +loyal +loyalty +lozenge +l's +LSI +LTV +Lubbock +Lubell +lubricant +lubricate +lubricious +lubricity +Lucas +Lucerne +Lucia +Lucian +lucid +Lucifer +Lucille +Lucius +luck +lucky +lucrative +lucre +Lucretia +Lucretius +lucy +ludicrous +Ludlow +Ludwig +Lufthansa +Luftwaffe +lug +luge +luger +luggage +lugging +lugubrious +Luis +luke +lukewarm +lull +lullaby +lulu +lumbago +lumbar +lumber +lumberjack +lumberman +lumbermen +lumen +luminance +luminary +luminescent +luminosity +luminous +lummox +lump +lumpish +Lumpur +lumpy +lunacy +lunar +lunary +lunate +lunatic +lunch +luncheon +lunchroom +lunchtime +Lund +Lundberg +Lundquist +lung +lunge +lupine +Lura +lurch +lure +lurid +lurk +Lusaka +luscious +lush +lust +lustful +lustrous +lusty +lutanist +lute +lutetium +Luther +Lutheran +Lutz +lux +luxe +Luxembourg +luxuriant +luxuriate +luxurious +luxury +Luzon +L'vov +lycee +lycopodium +Lydia +lye +lying +Lykes +Lyle +Lyman +lymph +lymphocyte +lymphoma +lynch +Lynchburg +Lynn +lynx +Lyon +Lyra +lyre +lyrebird +lyric +Lysenko +lysergic +lysine +m +ma +Mabel +Mac +macabre +Macadamia +macaque +MacArthur +Macassar +macaw +Macbeth +MacDonald +MacDougall +mace +Macedon +Macedonia +macerate +MacGregor +Mach +machete +Machiavelli +machination +machine +machinery +machismo +macho +macintosh +mack +MacKenzie +mackerel +Mackey +Mackinac +Mackinaw +mackintosh +MacMahon +MacMillan +Macon +macro +macromolecular +macromolecule +macrophage +macroscopic +macrostructure +mad +Madagascar +madam +Madame +madcap +madden +Maddox +made +Madeira +Madeleine +Madeline +madhouse +Madhya +Madison +madman +madmen +Madonna +Madras +Madrid +madrigal +Madsen +madstone +Mae +maelstrom +maestro +Mafia +Mafioso +magazine +Magdalene +Magellanic +magenta +Maggie +maggot +maggoty +magi +magic +magician +magisterial +magistrate +magma +magna +magnanimity +magnanimous +magnate +magnesia +magnesite +magnesium +magnet +magnetic +magnetite +magneto +magnetron +magnificent +magnify +magnitude +magnolia +magnum +Magnuson +Magog +magpie +Magruder +maharaja +Maharashtra +Mahayana +Mahayanist +mahogany +Mahoney +maid +maiden +maidenhair +maidservant +Maier +mail +mailbox +mailman +mailmen +maim +main +Maine +mainframe +mainland +mainline +mainstay +mainstream +maintain +maintenance +maitre +majestic +majesty +major +Majorca +make +makeshift +makeup +Malabar +maladapt +maladaptive +maladjust +maladroit +malady +Malagasy +malaise +malaprop +malaria +malarial +Malawi +Malay +Malaysia +Malcolm +malconduct +malcontent +Malden +maldistribute +Maldive +male +maledict +malevolent +malfeasant +malformation +malformed +malfunction +Mali +malice +malicious +malign +malignant +mall +mallard +malleable +mallet +Mallory +mallow +malnourished +malnutrition +malocclusion +Malone +Maloney +malposed +malpractice +Malraux +malt +Malta +Maltese +Malthus +Malthusian +Malton +maltose +maltreat +maltster +mambo +mamma +mammal +mammalian +mammary +mammoth +man +mana +manage +manageable +managerial +Managua +Manama +manatee +Manchester +Manchuria +mandamus +mandarin +mandate +mandatory +mandible +mandrake +mandrel +mandrill +mane +maneuver +Manfred +manganese +mange +mangel +mangle +mango +mangrove +mangy +Manhattan +manhole +mania +maniac +maniacal +manic +manicure +manifest +manifestation +manifesto +manifold +manikin +Manila +manioc +manipulable +manipulate +Manitoba +mankind +Manley +Mann +manna +mannequin +mannitol +manometer +manor +manpower +manse +manservant +Mansfield +mansion +manslaughter +mantel +mantelpiece +mantic +mantis +mantissa +mantle +mantrap +manual +Manuel +manufacture +manumission +manumit +manumitted +manure +manuscript +Manville +many +manzanita +Mao +Maori +map +maple +mar +marathon +maraud +marble +Marc +Marceau +Marcel +Marcello +march +Marcia +Marco +Marcus +Marcy +Mardi +mare +Margaret +margarine +Margery +margin +marginal +marginalia +Margo +Marguerite +maria +Marianne +Marie +Marietta +marigold +marijuana +Marilyn +marimba +Marin +marina +marinade +marinate +marine +Marino +Mario +Marion +marionette +marital +maritime +marjoram +Marjorie +Marjory +mark +market +marketeer +marketplace +marketwise +Markham +Markov +Markovian +marksman +marksmen +Marlboro +Marlborough +Marlene +marlin +Marlowe +marmalade +marmoset +marmot +maroon +marque +marquee +marquess +Marquette +marquis +marriage +marriageable +Marrietta +Marriott +marrow +marrowbone +marry +Marseilles +marsh +Marsha +marshal +Marshall +marshland +marshmallow +marshy +marsupial +mart +marten +martensite +Martha +martial +Martian +martin +Martinez +martingale +martini +Martinique +Martinson +Marty +martyr +martyrdom +marvel +marvelous +Marvin +Marx +Mary +Maryland +marzipan +mascara +masculine +maser +Maseru +mash +mask +masochism +masochist +mason +Masonic +Masonite +masonry +masque +masquerade +mass +Massachusetts +massacre +massage +masseur +Massey +massif +massive +mast +masterful +mastermind +masterpiece +mastery +mastic +mastiff +mastodon +mat +match +matchbook +matchmake +mate +Mateo +mater +material +materiel +maternal +maternity +math +mathematic +mathematician +Mathews +Mathewson +Mathias +Mathieu +Matilda +matinal +matinee +matins +Matisse +matriarch +matriarchal +matriarchy +matrices +matriculate +matrilineal +matrimonial +matrimony +matrix +matroid +matron +Matson +Matsumoto +matte +Matthew +mattock +mattress +Mattson +maturate +mature +maudlin +maul +Maureen +Maurice +Mauricio +Maurine +Mauritania +Mauritius +mausoleum +mauve +maverick +Mavis +maw +mawkish +Mawr +max +maxim +maxima +maximal +Maximilian +maximum +Maxine +maxwell +Maxwellian +may +Maya +mayapple +maybe +Mayer +Mayfair +Mayflower +mayfly +mayhem +Maynard +Mayo +mayonnaise +mayor +mayoral +mayst +Mazda +maze +mazurka +MBA +Mbabane +McAdams +McAllister +McBride +McCabe +McCall +McCallum +McCann +McCarthy +McCarty +McCauley +McClain +McClellan +McClure +McCluskey +McConnel +McConnell +McCormick +McCoy +McCracken +McCullough +McDaniel +McDermott +McDonald +McDonnell +McDougall +McDowell +McElroy +McFadden +McFarland +McGee +McGill +McGinnis +McGovern +McGowan +McGrath +McGraw +McGregor +McGuire +McHugh +McIntosh +McIntyre +McKay +McKee +McKenna +McKenzie +McKeon +McKesson +McKinley +McKinney +McKnight +McLaughlin +McLean +McLeod +McMahon +McMillan +McMullen +McNally +McNaughton +McNeil +McNulty +McPherson +MD +me +mead +meadow +meadowland +meadowlark +meadowsweet +meager +meal +mealtime +mealy +mean +meander +meaningful +meant +meantime +meanwhile +measle +measure +meat +meaty +Mecca +mechanic +mechanism +mechanist +mecum +medal +medallion +meddle +Medea +Medford +media +medial +median +mediate +medic +medicate +Medici +medicinal +medicine +medico +mediocre +mediocrity +meditate +Mediterranean +medium +medlar +medley +Medusa +meek +meet +meetinghouse +Meg +megabit +megabyte +megahertz +megalomania +megalomaniac +megalopolis +megaton +megavolt +megawatt +megaword +megohm +Meier +Meiji +meiosis +Meistersinger +Mekong +Mel +melamine +melancholy +Melanesia +melange +Melanie +melanin +melanism +melanoma +Melbourne +Melcher +meld +melee +Melinda +meliorate +Melissa +Mellon +mellow +melodic +melodious +melodrama +melodramatic +melody +melon +Melpomene +melt +meltdown +Melville +Melvin +member +membrane +memento +memo +memoir +memorabilia +memorable +memoranda +memorandum +memorial +memory +Memphis +men +menace +menagerie +menarche +mend +mendacious +mendacity +Mendel +mendelevium +Mendelian +Mendelssohn +Menelaus +menfolk +menhaden +menial +meningitis +meniscus +Menlo +Mennonite +menopausal +menopause +Menorca +menstrual +menstruate +mensurable +mensuration +mental +mention +mentor +menu +Menzies +meow +Mephistopheles +mercantile +Mercator +Mercedes +mercenary +mercer +merchandise +merchant +merciful +Merck +mercurial +mercuric +mercury +mercy +mere +Meredith +meretricious +merganser +merge +meridian +meridional +meringue +merit +meritorious +Merle +merlin +mermaid +Merriam +Merrill +Merrimack +merriment +Merritt +merry +merrymake +Mervin +mesa +mescal +mescaline +mesenteric +mesh +mesmeric +mesoderm +meson +Mesopotamia +Mesozoic +mesquite +mess +message +messenger +Messiah +messiah +messianic +messieurs +Messrs +messy +mestizo +met +metabole +metabolic +metabolism +metabolite +metal +metallic +metalliferous +metallography +metalloid +metallurgic +metallurgist +metallurgy +metalwork +metamorphic +metamorphism +metamorphose +metamorphosis +metaphor +metaphoric +metazoa +metazoan +Metcalf +mete +meteor +meteoric +meteorite +meteoritic +meteorology +meter +methacrylate +methane +methanol +methionine +method +methodic +methodology +Methuen +Methuselah +methyl +methylene +meticulous +metier +metonymy +metric +metro +metronome +metropolis +metropolitan +mettle +mettlesome +Metzler +mew +Mexican +Mexico +Meyer +mezzanine +mezzo +mi +Miami +miaow +miasma +miasmal +mica +mice +Michael +Michaelangelo +Michel +Michelangelo +Michele +Michelin +Michelson +michigan +Mickelson +Mickey +Micky +micro +microbe +microbial +microcosm +micrography +micron +Micronesia +microscopy +mid +Midas +midband +midday +middle +Middlebury +middleman +middlemen +Middlesex +Middleton +Middletown +middleweight +midge +midget +midland +midmorn +midnight +midpoint +midrange +midscale +midsection +midshipman +midshipmen +midspan +midst +midstream +midterm +midway +midweek +Midwest +Midwestern +midwife +midwinter +midwives +midyear +mien +miff +mig +might +mightn't +mighty +mignon +migrant +migrate +migratory +Miguel +mike +mila +Milan +milch +mild +mildew +Mildred +mile +mileage +Miles +milestone +milieu +militant +militarism +militarist +military +militate +militia +militiaman +militiamen +milk +milkweed +milky +mill +Millard +millenarian +millenia +millennia +millennium +millet +Millie +Millikan +millinery +million +millionaire +millionfold +millionth +millipede +millstone +milord +milt +Milton +Miltonic +Milwaukee +mimeograph +mimesis +mimetic +Mimi +mimic +mimicked +mimicking +mimicry +mimosa +min +minaret +mince +mincemeat +mind +Mindanao +mindful +mine +minefield +mineral +mineralogy +Minerva +minestrone +minesweeper +mingle +mini +miniature +minicomputer +minim +minima +minimal +minimax +minimum +minion +ministerial +ministry +mink +Minneapolis +Minnesota +Minnie +minnow +Minoan +minor +Minos +minot +Minotaur +Minsk +Minsky +minstrel +minstrelsy +mint +minuend +minuet +minus +minuscule +minute +minuteman +minutemen +minutiae +Miocene +Mira +miracle +miraculous +mirage +Miranda +mire +Mirfak +Miriam +mirror +mirth +misanthrope +misanthropic +miscegenation +miscellaneous +miscellany +mischievous +miscible +miscreant +miser +misery +misnomer +misogynist +misogyny +miss +misshapen +missile +mission +missionary +Mississippi +Mississippian +missive +Missoula +Missouri +Missy +mist +mistletoe +mistress +misty +MIT +Mitchell +mite +miterwort +mitigate +mitochondria +mitosis +mitral +mitre +mitt +mitten +mix +mixture +mixup +Mizar +MN +mnemonic +MO +moan +moat +mob +mobcap +Mobil +mobile +mobility +mobster +moccasin +mocha +mock +mockernut +mockery +mockingbird +mockup +modal +mode +model +modem +moderate +modern +modest +Modesto +modesty +modicum +modify +modish +modular +modulate +module +moduli +modulo +modulus +Moe +Moen +Mogadiscio +Moghul +Mohammed +Mohammedan +Mohawk +Mohr +moiety +Moines +moire +Moiseyev +moist +moisten +moisture +molal +molar +molasses +mold +Moldavia +moldboard +moldy +mole +molecular +molecule +molehill +molest +Moliere +Moline +Moll +Mollie +mollify +mollusk +Molly +mollycoddle +Moloch +molt +molten +Moluccas +molybdate +molybdenite +molybdenum +moment +momenta +momentary +momentous +momentum +mommy +Mona +Monaco +monad +monadic +monarch +monarchic +monarchy +Monash +monastery +monastic +monaural +Monday +monel +monetarism +monetary +money +moneymake +moneywort +Mongolia +mongoose +monic +Monica +monies +monitor +monitory +monk +monkey +monkeyflower +monkish +Monmouth +Monoceros +monochromator +monocular +monogamous +monogamy +monolith +monologist +monologue +monomer +monomeric +monomial +Monongahela +monopoly +monotonous +monotreme +monoxide +Monroe +Monrovia +Monsanto +monsieur +monsoon +monster +monstrosity +monstrous +Mont +montage +Montague +Montana +Montclair +monte +Montenegrin +Monterey +Monteverdi +Montevideo +Montgomery +month +Monticello +Montmartre +Montpelier +Montrachet +Montreal +Monty +monument +moo +mooch +mood +moody +moon +moonbeam +Mooney +moonlight +moonlit +moor +Moore +Moorish +moose +moot +mop +moraine +moral +morale +Moran +morass +moratorium +Moravia +morbid +more +morel +Moreland +moreover +Moresby +Morgan +morgen +morgue +Moriarty +moribund +Morley +Mormon +morn +Moroccan +Morocco +moron +morose +morpheme +morphemic +morphine +morphism +morphology +morphophonemic +Morrill +morris +Morrison +Morrissey +Morristown +morrow +Morse +morsel +mort +mortal +mortar +mortem +mortgage +mortgagee +mortgagor +mortician +mortify +mortise +Morton +mortuary +mosaic +Moscow +Moser +Moses +Moslem +mosque +mosquito +mosquitoes +moss +mossy +most +mot +motel +motet +moth +mother +motherland +motif +motion +motivate +motive +motley +motor +motorcade +motorcar +motorcycle +Motorola +mottle +motto +mould +Moulton +mound +mount +mountain +mountaineer +mountainous +mountainside +mountaintop +mountebank +mourn +mournful +mouse +mousse +moustache +mousy +mouth +mouthful +mouthpart +mouthpiece +Mouton +move +movie +mow +Moyer +Mozart +mozzarella +MPH +Mr +Mrs +Ms +m's +Mt +mu +much +mucilage +muck +mucosa +mucus +mud +Mudd +muddle +muddlehead +muddy +mudguard +mudhole +mudsling +Mueller +Muenster +muezzin +muff +muffin +muffle +mug +mugging +muggy +mugho +Muir +Mukden +mukluk +mulatto +mulberry +mulch +mulct +mule +mulish +mull +mullah +mullein +Mullen +mulligan +mulligatawny +mullion +multi +Multics +multifarious +multinomial +multiple +multiplet +multiplex +multiplexor +multiplicand +multiplication +multiplicative +multiplicity +multitude +multitudinous +mum +mumble +Mumford +mummify +mummy +munch +Muncie +mundane +mung +Munich +municipal +munificent +munition +Munson +muon +Muong +mural +murder +murderous +muriatic +Muriel +murk +murky +murmur +Murphy +Murray +murre +Muscat +muscle +Muscovite +Muscovy +muscular +musculature +muse +museum +mush +mushroom +mushy +music +musicale +musician +musicology +musk +Muskegon +muskellunge +musket +muskmelon +muskox +muskoxen +muskrat +musky +muslim +muslin +mussel +must +mustache +mustachio +mustang +mustard +mustn't +musty +mutagen +mutandis +mutant +mutate +mutatis +mute +mutilate +mutineer +mutiny +mutt +mutter +mutton +mutual +mutuel +Muzak +Muzo +muzzle +my +Mycenae +Mycenaean +mycobacteria +mycology +mycoplasma +mycorrhiza +myel +myeline +myeloid +Myers +mylar +mynah +Mynheer +myocardial +myocardium +myofibril +myoglobin +myopia +myopic +myosin +Myra +myriad +Myron +myrrh +myrtle +myself +Mysore +mysterious +mystery +mystic +mystify +mystique +myth +mythic +mythology +n +NAACP +nab +Nabisco +Nadine +nadir +nag +Nagasaki +nagging +Nagoya +Nagy +naiad +nail +Nair +Nairobi +naive +naivete +Nakayama +naked +name +nameable +nameplate +namesake +Nan +Nancy +Nanette +Nanking +nanosecond +Nantucket +Naomi +nap +napkin +Naples +Napoleon +Napoleonic +Narbonne +narcissist +narcissus +narcosis +narcotic +Narragansett +narrate +narrow +narrowminded +narwhal +nary +NASA +nasal +nascent +Nash +Nashua +Nashville +Nassau +nasturtium +nasty +Nat +natal +Natalie +Natchez +Nate +Nathan +Nathaniel +nation +nationwide +native +NATO +natty +natural +nature +naturopath +naughty +nausea +nauseate +nauseum +nautical +nautilus +Navajo +naval +nave +navel +navigable +navigate +navy +nawab +nay +Nazarene +Nazareth +Nazi +Nazism +NBC +NBS +NC +NCAA +NCO +NCR +ND +Ndjamena +ne +Neal +Neanderthal +Neapolitan +near +nearby +nearsighted +neat +neater +neath +Nebraska +Nebuchadnezzar +nebula +nebulae +nebular +nebulous +necessary +necessitate +necessity +neck +necklace +neckline +necktie +necromancer +necromancy +necromantic +necropsy +necrosis +necrotic +nectar +nectareous +nectarine +nectary +Ned +nee +need +needful +needham +needle +needlepoint +needn't +needy +nefarious +Neff +negate +neglect +negligee +negligent +negligible +negotiable +negotiate +Negro +Negroes +Negroid +Nehru +neigh +Neil +neither +Nell +Nellie +Nelsen +Nelson +nematocyst +nematode +nemesis +neo +neoclassic +neodymium +neolithic +neologism +neon +neonatal +neonate +neophyte +neoprene +neoteny +Nepal +nepenthe +nephew +nepotism +nepotistic +Neptune +neptunium +nereid +Nero +nerve +nervous +Ness +nest +nestle +Nestor +net +nether +Netherlands +netherworld +nettle +nettlesome +network +Neumann +neural +neuralgia +neurasthenic +neuritis +neuroanatomic +neuroanatomy +neuroanotomy +neurology +neuromuscular +neuron +neuronal +neuropathology +neurophysiology +neuropsychiatric +neuroses +neurosis +neurotic +neuter +neutral +neutrino +neutron +neutronium +Neva +Nevada +neve +nevertheless +Nevins +new +Newark +Newbold +newborn +Newcastle +newcomer +newel +Newell +newfound +Newfoundland +newline +newlywed +Newman +Newport +newsboy +newscast +newsletter +newsman +newsmen +newspaper +newspaperman +newspapermen +newsreel +newsstand +Newsweek +newt +newton +Newtonian +next +Nguyen +NH +niacin +Niagara +Niamey +nib +nibble +Nibelung +Nicaragua +nice +nicety +niche +Nicholas +Nicholls +Nichols +Nicholson +nichrome +nick +nickel +nickname +Nicodemus +Nicosia +nicotinamide +nicotine +niece +Nielsen +Nielson +Nietzsche +nifty +Niger +Nigeria +niggardly +nigger +niggle +nigh +night +nightcap +nightclub +nightdress +nightfall +nightgown +nighthawk +nightingale +nightmare +nightmarish +nightshade +nightshirt +nighttime +NIH +nihilism +nihilist +Nikko +Nikolai +nil +Nile +nilpotent +nimble +nimbus +NIMH +Nina +nine +ninebark +ninefold +nineteen +nineteenth +ninetieth +ninety +ninetyfold +Nineveh +ninth +Niobe +niobium +nip +nipple +Nippon +nirvana +nit +nitpick +nitrate +nitric +nitride +nitrite +nitrogen +nitrogenous +nitroglycerine +nitrous +nitty +Nixon +NJ +NM +NNE +NNW +no +NOAA +Noah +nob +Nobel +nobelium +noble +nobleman +noblemen +noblesse +nobody +nobody'd +nocturnal +nocturne +nod +nodal +node +nodular +nodule +Noel +Noetherian +noise +noisemake +noisome +noisy +Nolan +Noll +nolo +nomad +nomadic +nomenclature +nominal +nominate +nominee +nomogram +nomograph +non +nonce +nonchalant +nondescript +none +nonetheless +nonogenarian +nonsensic +noodle +nook +noon +noontime +noose +nor +Nora +Nordhoff +Nordic +Nordstrom +Noreen +Norfolk +norm +Norma +normal +normalcy +Norman +Normandy +normative +Norris +Norse +north +Northampton +northbound +northeast +northeastern +northerly +northern +northernmost +northland +Northrop +Northrup +Northumberland +northward +northwest +northwestern +Norton +Norwalk +Norway +Norwegian +Norwich +nose +nosebag +nosebleed +nostalgia +nostalgic +Nostradamus +Nostrand +nostril +nosy +not +notary +notate +notch +note +notebook +noteworthy +nothing +notice +noticeable +notify +notion +notocord +notoriety +notorious +Notre +Nottingham +notwithstanding +Nouakchott +nought +noun +nourish +nouveau +Nov +nova +novae +Novak +novel +novelty +November +novice +novitiate +novo +Novosibirsk +now +nowaday +nowhere +nowise +noxious +nozzle +NRC +nroff +n's +NSF +NTIS +nu +nuance +Nubia +nubile +nucleant +nuclear +nucleate +nuclei +nucleic +nucleoli +nucleolus +nucleon +nucleotide +nucleus +nuclide +nude +nudge +nudibranch +nugatory +nugget +nuisance +null +nullify +Nullstellensatz +numb +numbly +numerable +numeral +numerate +numeric +numerology +numerous +numinous +numismatic +numismatist +nun +nuptial +nurse +nursery +nurturant +nurture +nut +nutate +nutcrack +nuthatch +nutmeg +nutria +nutrient +nutrition +nutritious +nutritive +nutshell +nuzzle +NV +NW +NY +NYC +nylon +nymph +nymphomania +nymphomaniac +Nyquist +NYU +o +oaf +oak +oaken +Oakland +Oakley +oakwood +oar +oases +oasis +oat +oatcake +oath +oatmeal +obduracy +obdurate +obedient +obeisant +obelisk +Oberlin +obese +obey +obfuscate +obfuscatory +obituary +object +objectify +objector +objet +oblate +obligate +obligatory +oblige +oblique +obliterate +oblivion +oblivious +oblong +obnoxious +oboe +oboist +O'Brien +obscene +obscure +obsequious +obsequy +observant +observation +observatory +observe +obsess +obsession +obsessive +obsidian +obsolescent +obsolete +obstacle +obstetric +obstetrician +obstinacy +obstinate +obstruct +obstruent +obtain +obtrude +obtrusive +obtuse +obverse +obviate +obvious +ocarina +occasion +occident +occidental +occipital +occlude +occlusion +occlusive +occult +occultate +occupant +occupation +occupy +occur +occurred +occurrent +occurring +ocean +Oceania +oceanic +oceanographer +oceanography +oceanside +ocelot +o'clock +O'Connell +O'Connor +Oct +octagon +octagonal +octahedra +octahedral +octahedron +octal +octane +octant +octave +Octavia +octennial +octet +octile +octillion +October +octogenarian +octopus +octoroon +ocular +odd +oddball +ode +O'Dell +Odessa +Odin +odious +odium +odometer +O'Donnell +odorous +O'Dwyer +Odysseus +odyssey +oedipal +Oedipus +oenology +o'er +oersted +of +off +offal +offbeat +Offenbach +offend +offensive +offer +offertory +offhand +office +officeholder +officemate +official +officialdom +officiate +officio +officious +offload +offprint +offsaddle +offset +offsetting +offshoot +offshore +offspring +offstage +oft +often +oftentimes +Ogden +ogle +ogre +ogress +oh +O'Hare +Ohio +ohm +ohmic +ohmmeter +oil +oilcloth +oilman +oilmen +oilseed +oily +oint +Ojibwa +OK +okapi +okay +Okinawa +Oklahoma +okra +Olaf +Olav +old +olden +Oldenburg +Oldsmobile +oldster +Olduvai +oldy +oleander +O'Leary +olefin +oleomargarine +olfactory +Olga +oligarchic +oligarchy +Oligocene +oligoclase +oligopoly +Olin +olive +Olivetti +Olivia +Olivier +olivine +Olsen +Olson +Olympia +Olympic +Omaha +Oman +ombudsman +ombudsperson +omega +omelet +omen +omicron +ominous +omission +omit +omitted +omitting +omnibus +omnipotent +omnipresent +omniscient +omnivore +omnivorous +on +once +oncology +oncoming +one +Oneida +O'Neill +onerous +oneself +onetime +oneupmanship +ongoing +onion +onlooker +onlooking +only +onomatopoeia +onomatopoeic +Onondaga +onrush +onrushing +onset +onslaught +Ontario +onto +ontogeny +ontology +onus +onward +onyx +oocyte +oodles +ooze +opacity +opal +opalescent +opaque +OPEC +Opel +open +opera +operable +operand +operant +operate +operatic +operetta +operon +Ophiucus +opiate +opinion +opinionate +opium +opossum +Oppenheimer +opponent +opportune +opposable +oppose +opposite +opposition +oppress +oppression +oppressive +oppressor +opprobrium +opt +opthalmic +opthalmology +optic +optima +optimal +optimism +optimist +optimum +option +optoacoustic +optoisolate +optometrist +optometry +opulent +opus +or +oracle +oracular +oral +orange +orangeroot +orangutan +orate +oratoric +oratorio +oratory +orb +orbit +orbital +Orca +orchard +orchestra +orchestral +orchestrate +orchid +orchis +ordain +ordeal +order +ordinal +ordinance +ordinary +ordinate +ordnance +ore +oregano +Oregon +Oresteia +Orestes +organ +organdy +organic +organismic +organometallic +orgasm +orgiastic +orgy +orient +oriental +orifice +origami +origin +original +originate +Orin +Orinoco +oriole +Orion +Orkney +Orlando +Orleans +ornament +ornamentation +ornate +ornery +ornithology +orography +Orono +orphan +orphanage +Orpheus +Orphic +Orr +Ortega +orthant +orthicon +orthoclase +orthodontic +orthodontist +orthodox +orthodoxy +orthogonal +orthography +orthonormal +orthopedic +orthophosphate +orthorhombic +Orville +Orwell +Orwellian +o's +Osaka +Osborn +Osborne +Oscar +oscillate +oscillatory +oscilloscope +Osgood +O'Shea +Oshkosh +osier +Osiris +Oslo +osmium +osmosis +osmotic +osprey +osseous +ossify +ostensible +ostentation +ostentatious +osteology +osteopath +osteopathic +osteopathy +osteoporosis +ostracism +ostracod +Ostrander +ostrich +O'Sullivan +Oswald +Othello +other +otherwise +otherworld +otiose +Otis +Ott +Ottawa +otter +Otto +Ottoman +Ouagadougou +ouch +ought +oughtn't +ounce +our +ourselves +oust +out +outermost +outlandish +outlawry +outrageous +ouvre +ouzel +ouzo +ova +oval +ovary +ovate +oven +ovenbird +over +overt +overture +Ovid +oviduct +oviform +oviparous +ovipositor +ovoviviparous +ovulate +ovum +ow +owe +Owens +owl +owlet +owly +own +ox +oxalate +oxalic +oxbow +oxcart +oxen +oxeye +Oxford +oxidant +oxidate +oxide +Oxnard +Oxonian +oxygen +oxygenate +oyster +Ozark +ozone +p +pa +Pablo +Pabst +pace +pacemake +pacesetting +pacific +pacifism +pacifist +pacify +pack +package +Packard +packet +pact +pad +paddle +paddock +paddy +padlock +padre +paean +pagan +page +pageant +pageantry +paginate +pagoda +paid +pail +pain +Paine +painful +painstaking +paint +paintbrush +pair +pairwise +Pakistan +Pakistani +pal +palace +palaeontology +palate +Palatine +palazzi +palazzo +pale +paleoanthropology +Paleolithic +Paleozoic +Palermo +Palestine +palette +palfrey +palindrome +palindromic +palisade +pall +palladia +Palladian +palladium +pallet +palliate +pallid +palm +palmate +palmetto +Palmolive +Palmyra +Palo +Palomar +palp +palpate +palsy +Pam +Pamela +pampa +pamper +pamphlet +pan +panacea +panama +Panamanian +pancake +Pancho +pancreas +pancreatic +panda +Pandanus +pandemic +pandemonium +pander +Pandora +pane +panel +pang +Pangaea +panhandle +panic +panicked +panicking +panicky +panicle +panjandrum +panoply +panorama +panoramic +pansy +pant +pantaloon +pantheism +pantheist +pantheon +panther +pantomime +pantomimic +pantothenic +pantry +panty +Paoli +pap +papa +papacy +papal +papaw +paper +paperback +paperweight +paperwork +papery +papillary +papoose +Pappas +pappy +paprika +Papua +papyri +papyrus +par +parabola +parabolic +paraboloid +paraboloidal +parachute +parade +paradigm +paradigmatic +paradise +paradox +paradoxic +paraffin +paragon +paragonite +paragraph +Paraguay +Paraguayan +parakeet +paralinguistic +parallax +parallel +parallelepiped +parallelogram +paralysis +paralytic +paramagnet +paramagnetic +parameter +paramilitary +paramount +Paramus +paranoia +paranoiac +paranoid +paranormal +parapet +paraphernalia +paraphrase +parapsychology +parasite +parasitic +parasol +parasympathetic +paratroop +paraxial +parboil +parcel +parch +pardon +pare +paregoric +parent +parentage +parental +parentheses +parenthesis +parenthetic +Pareto +pariah +parimutuel +Paris +parish +parishioner +Parisian +park +parka +Parke +Parkinson +parkish +parkland +parkway +parlance +parlay +parley +parliament +parliamentarian +parliamentary +Parmesan +parochial +parody +parole +parolee +paroxysm +parquet +Parr +Parrish +parrot +parry +parse +Parsi +Parsifal +parsimonious +parsimony +parsley +parsnip +parson +parsonage +part +partake +Parthenon +Parthia +partial +participant +participate +participle +particle +particular +particulate +partisan +partition +partner +partook +partridge +party +parvenu +Pasadena +Pascal +paschal +pasha +Paso +pass +passage +passageway +Passaic +passarine +passband +passbook +passe +passenger +passerby +passim +passion +passionate +passivate +passive +Passover +passport +password +past +paste +pasteboard +pastel +pasteup +Pasteur +pastiche +pastime +pastor +pastoral +pastry +pasture +pasty +pat +Patagonia +patch +patchwork +patchy +pate +patent +patentee +pater +paternal +paternoster +Paterson +path +pathbreaking +pathetic +pathogen +pathogenesis +pathogenic +pathology +pathos +pathway +patient +patina +patio +patois +patriarch +patriarchal +patriarchy +Patrice +Patricia +patrician +Patrick +patrilineage +patrilineal +patrimonial +patrimony +patriot +patriotic +patristic +patrol +patrolled +patrolling +patrolman +patrolmen +patron +patronage +patroness +Patsy +pattern +Patterson +Patti +Patton +patty +paucity +Paul +Paula +Paulette +Pauli +Pauline +Paulo +Paulsen +Paulson +Paulus +paunch +paunchy +pauper +pause +pavanne +pave +pavilion +Pavlov +Pavlovian +paw +pawn +pawnbroker +pawnshop +pawpaw +Pawtucket +pax +pay +paycheck +payday +payload +paymaster +Payne +payoff +payroll +Paz +PBS +PDP +pea +Peabody +peace +peaceable +peaceful +peacemake +peacetime +peach +Peachtree +peacock +peafowl +peahen +peak +peaky +peal +Peale +peanut +pear +Pearce +pearl +pearlite +pearlstone +Pearson +peasant +Pease +peat +pebble +pecan +peccary +peck +Pecos +pectoral +pectoralis +peculate +peculiar +pecuniary +pedagogic +pedagogue +pedagogy +pedal +pedant +pedantic +pedantry +peddle +pedestal +pedestrian +pediatric +pediatrician +pedigree +pediment +Pedro +pee +peek +peel +peep +peephole +peepy +peer +peg +Pegasus +pegboard +pegging +Peggy +pejorative +Peking +pelagic +Pelham +pelican +pellagra +pellet +pellucid +Peloponnese +pelt +peltry +pelvic +pelvis +Pembroke +pemmican +pen +penal +penalty +penance +penates +pence +penchant +pencil +pencilled +pend +pendant +pendulous +pendulum +Penelope +penetrable +penetrate +penguin +Penh +penicillin +peninsula +peninsular +penis +penitent +penitential +penitentiary +penman +penmen +Penn +penna +pennant +Pennsylvania +penny +pennyroyal +Penrose +Pensacola +pension +pensive +pent +pentagon +pentagonal +pentagram +pentane +Pentateuch +pentatonic +Pentecost +pentecostal +penthouse +penultimate +penumbra +penumbral +penurious +penury +peon +peony +people +Peoria +pep +peppercorn +peppergrass +peppermint +pepperoni +peppery +peppy +Pepsi +PepsiCo +peptide +per +perceive +percent +percentage +percentile +percept +perceptible +perception +perceptive +perceptual +perch +perchance +perchlorate +Percival +percolate +percussion +percussive +Percy +perdition +peregrine +peremptory +perennial +Perez +perfect +perfectible +perfidious +perfidy +perforate +perforce +perform +performance +perfume +perfumery +perfunctory +perfusion +Pergamon +perhaps +Periclean +Pericles +peridotite +perigee +perihelion +peril +Perilla +perilous +perimeter +period +periodic +peripatetic +peripheral +periphery +periphrastic +periscope +perish +peritectic +periwinkle +perjure +perjury +perk +Perkins +perky +Perle +permafrost +permalloy +permanent +permeable +permeate +Permian +permissible +permission +permissive +permit +permitted +permitting +permutation +permute +pernicious +peroxide +perpendicular +perpetrate +perpetual +perpetuate +perpetuity +perplex +perquisite +Perry +persecute +persecution +persecutory +Perseid +Persephone +Perseus +perseverant +persevere +Pershing +Persia +persiflage +persimmon +persist +persistent +person +persona +personage +personal +personify +personnel +perspective +perspicacious +perspicacity +perspicuity +perspicuous +perspiration +perspire +persuade +persuasion +persuasive +pert +pertain +Perth +pertinacious +pertinent +perturb +perturbate +Peru +perusal +peruse +Peruvian +pervade +pervasion +pervasive +perverse +perversion +pervert +pessimal +pessimism +pessimist +pessimum +pest +peste +pesticide +pestilent +pestilential +pestle +pet +petal +Pete +peter +Petersburg +Petersen +Peterson +petiole +petit +petite +petition +petrel +petri +petrify +petrochemical +petroglyph +petrol +petroleum +petrology +petticoat +petty +petulant +petunia +Peugeot +pew +pewee +pewter +pfennig +Pfizer +pH +phage +phagocyte +phalanger +phalanges +phalanx +phalarope +phantasm +phantasy +phantom +pharmaceutic +pharmacist +pharmacology +pharmacopoeia +pharmacy +phase +Ph.D +PhD +pheasant +Phelps +phenol +phenolic +phenomena +phenomenal +phenomenology +phenomenon +phenotype +phenyl +phenylalanine +pheromone +phi +Phil +Philadelphia +philanthrope +philanthropic +philanthropy +philharmonic +Philip +Philippine +Philistine +Phillip +philodendron +philology +philosoph +philosophic +philosophy +Phipps +phloem +phlox +phobic +Phobos +phoebe +Phoenicia +phoenix +phon +phone +phoneme +phonemic +phonetic +phonic +phonograph +phonology +phonon +phony +phosgene +phosphate +phosphide +phosphine +phosphite +phosphor +phosphoresce +phosphorescent +phosphoric +phosphorous +phosphorus +phosphorylate +photo +photogenic +photography +photolysis +photolytic +photometry +photon +phrase +phrasemake +phraseology +phthalate +phycomycetes +phyla +Phyllis +phylogenetic +phylogeny +phylum +physic +physician +physiochemical +physiognomy +physiology +physiotherapist +physiotherapy +physique +phytoplankton +pi +pianissimo +pianist +piano +pianoforte +piazza +pica +Picasso +picayune +Piccadilly +piccolo +pick +pickaxe +pickerel +Pickering +picket +Pickett +Pickford +pickle +Pickman +pickoff +pickup +picky +picnic +picnicked +picnicker +picnicking +picofarad +picojoule +picosecond +Pict +pictorial +picture +picturesque +piddle +pidgin +pie +piece +piecemeal +piecewise +Piedmont +pier +pierce +Pierre +Pierson +pietism +piety +piezoelectric +pig +pigeon +pigeonberry +pigeonfoot +pigeonhole +pigging +piggish +piggy +pigment +pigmentation +pigpen +pigroot +pigskin +pigtail +pike +Pilate +pile +pilewort +pilfer +pilferage +pilgrim +pilgrimage +pill +pillage +pillar +pillory +pillow +Pillsbury +piloerection +pilot +pimp +pimple +pin +pinafore +pinball +pincer +pinch +pincushion +pine +pineapple +Pinehurst +ping +pinhead +pinhole +pinion +pink +pinkie +pinkish +pinnacle +pinnate +pinniped +pinochle +pinpoint +pinscher +Pinsky +pint +pintail +pinto +pinwheel +pinxter +pion +pioneer +Piotr +pious +pip +pipe +pipeline +pipette +pipetting +pipsissewa +piquant +pique +piracy +Piraeus +pirate +pirogue +pirouette +pirouetting +Piscataway +Pisces +piss +pistachio +pistol +pistole +piston +pit +pitch +pitchblende +pitchfork +pitchstone +piteous +pitfall +pith +pithy +pitiable +pitiful +pitman +Pitney +Pitt +Pittsburgh +Pittsfield +Pittston +pituitary +pity +Pius +pivot +pivotal +pixel +pixy +Pizarro +pizza +pizzicato +Pl +placate +placater +place +placeable +placebo +placeholder +placemat +placenta +placental +placid +plagiarism +plagiarist +plagioclase +plague +plaguey +plaid +plain +Plainfield +plaintiff +plaintive +plait +plan +planar +Planck +plane +planeload +planet +planetaria +planetarium +planetary +planetesimal +planetoid +plank +plankton +planoconcave +planoconvex +plant +plantain +plantation +plaque +plasm +plasma +plasmid +plasmon +plaster +plastic +plastisol +plastron +plat +plate +plateau +platelet +platen +platform +platinum +platitude +platitudinous +Plato +platonic +Platonism +Platonist +platoon +Platte +platypus +plaudit +plausible +play +playa +playback +playboy +playful +playground +playhouse +playmate +playoff +playpen +playroom +plaything +playtime +playwright +playwriting +plaza +plea +plead +pleasant +please +pleasure +pleat +plebeian +plebian +plebiscite +plectrum +pledge +Pleiades +Pleistocene +plenary +plenipotentiary +plenitude +plentiful +plenty +plenum +plethora +pleura +pleural +pleurisy +Plexiglas +pliable +pliant +plight +Pliny +Pliocene +plod +plop +plot +plover +plow +plowman +plowmen +plowshare +ploy +pluck +plucky +plug +plugboard +pluggable +plugging +plum +plumage +plumb +plumbago +plumbate +plume +plummet +plump +plunder +plunge +plunk +pluperfect +plural +plus +plush +plushy +Plutarch +Pluto +pluton +plutonium +ply +Plymouth +plyscore +plywood +PM +pneumatic +pneumococcus +pneumonia +Po +poach +POBox +pocket +pocketbook +pocketful +Pocono +pod +podge +podia +podium +Poe +poem +poesy +poet +poetic +poetry +pogo +pogrom +poi +poignant +Poincare +poinsettia +point +pointwise +poise +poison +poisonous +Poisson +poke +pokerface +pol +Poland +polar +polarimeter +Polaris +polariscope +polariton +polarogram +polarograph +polarography +Polaroid +polaron +pole +polecat +polemic +police +policeman +policemen +policewoman +policy +polio +poliomyelitis +polis +polish +Politburo +polite +politic +politician +politicking +politico +Polk +polka +polkadot +poll +Pollard +pollen +pollinate +pollock +polloi +pollutant +pollute +pollution +Pollux +pollywog +polo +polonaise +polonium +polopony +polyandrous +polyandry +polygamous +polygamy +polygon +polygonal +polygynous +polygyny +polyhedra +polyhedral +polyhedron +Polyhymnia +polymer +polymerase +polymeric +polymorph +polymorphic +Polynesia +polynomial +Polyphemus +polyphony +polyploidy +polysaccharide +polysemous +polysemy +polytechnic +polytope +polytypy +pomade +pomegranate +pomelo +pomology +Pomona +pomp +pompadour +pompano +Pompeii +pompey +pompon +pomposity +pompous +Ponce +Ponchartrain +poncho +pond +ponder +ponderosa +ponderous +pong +pont +Pontiac +pontiff +pontific +pontificate +pontification +pony +pooch +poodle +pooh +pool +Poole +poop +poor +pop +pope +popish +poplar +poplin +poppy +populace +popular +populate +populism +populist +populous +porcelain +porch +porcine +porcupine +pore +pork +pornographer +pornography +porosity +porous +porphyry +porpoise +porridge +port +portage +portal +Porte +portend +portent +portentous +porterhouse +portfolio +Portia +portico +portland +portmanteau +Porto +portrait +portraiture +portray +portrayal +Portsmouth +Portugal +Portuguese +portulaca +posable +pose +Poseidon +poseur +posey +posh +posit +position +positive +positron +Posner +posse +posseman +possemen +possess +possession +possessive +possessor +possible +possum +post +postage +postal +postcard +postcondition +postdoctoral +posterior +posteriori +posterity +postfix +postgraduate +posthumous +postlude +postman +postmark +postmaster +postmen +postmodern +postmortem +postmultiply +postoperative +postorder +postpone +postposition +postprocess +postprocessor +postscript +postulate +posture +postwar +posy +pot +potable +potash +potassium +potato +potatoes +potbelly +potboil +potent +potentate +potential +potentiometer +pothole +potion +potlatch +Potomac +potpourri +potsherd +pottery +Potts +pouch +Poughkeepsie +poultice +poultry +pounce +pound +pour +pout +poverty +pow +powder +powderpuff +powdery +Powell +power +powerful +powerhouse +Poynting +ppm +PR +practicable +practical +practice +practise +practitioner +Pradesh +Prado +praecox +pragmatic +pragmatism +pragmatist +Prague +prairie +praise +praiseworthy +praline +pram +prance +prank +praseodymium +Pratt +Pravda +pray +prayerful +pre +preach +preachy +Precambrian +precarious +precedent +precept +precess +precinct +precious +precipice +precipitable +precipitate +precipitous +precise +precision +preclude +precocious +precocity +predacious +predatory +predecessor +predicament +predicate +predict +predictor +predilect +preempt +preemption +preemptive +preemptor +preen +prefab +prefatory +prefect +prefecture +prefer +preference +preferential +preferred +preferring +pregnant +prehensile +prejudice +preliminary +prelude +premier +premiere +premise +premium +premonition +Prentice +prep +preparation +preparative +preparator +preparatory +prepare +preponderant +preponderate +preposterous +prerogative +Presbyterian +Prescott +prescription +prescriptive +presentation +preservation +preside +president +presidential +press +pressure +prestidigitate +prestige +prestigious +presto +Preston +presume +presumption +presumptive +pretentious +Pretoria +pretty +prevail +prevalent +prevention +preventive +previous +prexy +prey +Priam +price +prick +prickle +pride +priest +priestess +Priestley +prig +priggish +prim +prima +primacy +primal +primary +primate +prime +primeval +primitive +primordial +primp +primrose +prince +princess +Princeton +principal +Principia +principle +print +printmake +printout +prior +priori +priory +Priscilla +prism +prismatic +prison +prissy +pristine +Pritchard +privacy +private +privet +privilege +privy +prize +prizewinning +pro +probabilist +probate +probationary +probe +problem +problematic +probosces +proboscis +procaine +procedural +procedure +proceed +process +procession +processor +proclaim +proclamation +proclivity +procrastinate +procreate +procrustean +Procrustes +Procter +proctor +procure +Procyon +prod +prodigal +prodigious +prodigy +produce +producible +product +Prof +profane +profess +profession +professor +professorial +proffer +proficient +profile +profit +profiteer +profligate +profound +profundity +profuse +profusion +progenitor +progeny +prognosis +prognosticate +programmable +programmatic +programmed +programmer +programming +progress +progression +progressive +prohibit +prohibition +prohibitive +prohibitory +project +projectile +projector +prokaryote +prokaryotic +Prokofieff +prolate +proletariat +proliferate +prolific +proline +prolix +prologue +prolong +prolongate +prolusion +prom +promenade +Promethean +Prometheus +promethium +prominent +promiscuity +promiscuous +promise +promote +promotion +prompt +promptitude +promulgate +prone +prong +pronghorn +pronominal +pronoun +pronounce +pronounceable +pronto +pronunciation +proof +proofread +prop +propaganda +propagandist +propagate +propane +propel +propellant +propelled +propeller +propelling +propensity +proper +property +prophecy +prophesy +prophet +prophetic +propionate +propitiate +propitious +proponent +proportion +proportionate +propos +proposal +propose +proposition +proprietary +proprietor +propriety +proprioception +proprioceptive +propulsion +propyl +propylene +prorate +prorogue +prosaic +proscenium +prosciutto +proscribe +proscription +prose +prosecute +prosecution +prosecutor +proselyte +Proserpine +prosodic +prosody +prosopopoeia +prospect +prospector +prospectus +prosper +prosperous +prostaglandin +prostate +prosthetic +prostitute +prostitution +prostrate +protactinium +protagonist +protean +protease +protect +protector +protectorate +protege +protein +proteolysis +proteolytic +protest +protestant +protestation +prothonotary +Protista +proto +protocol +proton +Protophyta +protoplasm +protoplasmic +prototype +prototypic +Protozoa +protozoan +protract +protractor +protrude +protrusion +protrusive +protuberant +proud +Proust +prove +proven +provenance +Provence +proverb +proverbial +provide +provident +providential +province +provincial +provision +proviso +provocateur +provocation +provocative +provoke +provost +prow +prowess +prowl +proximal +proximate +proximity +proxy +prude +prudent +prudential +prudish +prune +prurient +Prussia +prussic +pry +p's +psalm +psalter +pseudo +pseudonym +pseudonymous +psi +psych +psyche +psychiatric +psychiatrist +psychiatry +psychic +psycho +psychoacoustic +psychoanalysis +psychoanalyst +psychoanalytic +psychobiology +psychology +psychometry +psychopath +psychopathic +psychophysic +psychophysiology +psychopomp +psychoses +psychosis +psychosomatic +psychotherapeutic +psychotherapist +psychotherapy +psychotic +psyllium +PTA +ptarmigan +pterodactyl +Ptolemaic +Ptolemy +pub +puberty +pubescent +public +publication +publish +Puccini +puck +puckish +pudding +puddingstone +puddle +puddly +pueblo +puerile +Puerto +puff +puffball +puffery +puffin +puffy +pug +Pugh +puissant +puke +Pulaski +Pulitzer +pull +pullback +pulley +Pullman +pullover +pulmonary +pulp +pulpit +pulsar +pulsate +pulse +pulverable +puma +pumice +pummel +pump +pumpkin +pumpkinseed +pun +punch +punctilio +punctilious +punctual +punctuate +puncture +pundit +punditry +pungent +Punic +punish +punitive +Punjab +Punjabi +punk +punky +punster +punt +puny +pup +pupa +pupae +pupal +pupate +pupil +puppet +puppeteer +puppy +puppyish +Purcell +purchasable +purchase +Purdue +pure +puree +purgation +purgative +purgatory +purge +purify +Purina +purine +Puritan +puritanic +purl +purloin +purple +purport +purpose +purposeful +purposive +purr +purse +purslane +pursuant +pursue +pursuit +purvey +purveyor +purview +pus +Pusan +Pusey +push +pushbutton +pushout +pushover +pushpin +pushy +pussy +pussycat +put +putative +putdown +Putnam +putrefaction +putrefy +putrid +putt +putty +puzzle +PVC +Pygmalion +pygmy +pyknotic +Pyle +Pyongyang +pyracanth +pyramid +pyramidal +pyre +Pyrex +pyridine +pyridoxine +pyrimidine +pyrite +pyroelectric +pyrolyse +pyrolysis +pyrometer +pyrophosphate +pyrotechnic +pyroxene +pyroxenite +Pyrrhic +Pythagoras +Pythagorean +python +q +Qatar +QED +q's +qua +quack +quackery +quad +quadrangle +quadrangular +quadrant +quadratic +quadrature +quadrennial +quadric +quadriceps +quadrilateral +quadrille +quadrillion +quadripartite +quadrivium +quadrupedal +quadruple +quadruplet +quadrupole +quaff +quagmire +quahog +quail +quaint +quake +Quakeress +qualify +qualitative +quality +qualm +quandary +quanta +Quantico +quantify +quantile +quantitative +quantity +quantum +quarantine +quark +quarrel +quarrelsome +quarry +quarryman +quarrymen +quart +quarterback +quartermaster +quartet +quartic +quartile +quarto +quartz +quartzite +quasar +quash +quasi +quasiparticle +quaternary +quatrain +quaver +quay +queasy +Quebec +queen +Queensland +queer +quell +quench +quern +querulous +query +quest +question +questionnaire +quetzal +queue +queueing +Quezon +quibble +Quichua +quick +quicken +quickie +quicklime +quicksand +quicksilver +quickstep +quid +quiescent +quiet +quietus +quill +quillwort +quilt +quince +quinine +Quinn +quint +quintessence +quintessential +quintet +quintic +quintillion +quintuplet +quintus +quip +quipped +quipping +Quirinal +quirk +quirky +quirt +quit +quite +Quito +quitter +quitting +quiver +Quixote +quixotic +quiz +quizzed +quizzes +quizzical +quizzing +quo +quod +quonset +quorum +quota +quotation +quote +quotient +r +rabat +rabbet +rabbi +rabbinate +rabbinical +rabbit +rabble +rabid +rabies +Rabin +raccoon +race +racemose +racetrack +raceway +Rachel +Rachmaninoff +racial +rack +racket +racketeer +rackety +racy +radar +Radcliffe +radial +radian +radiant +radiate +radical +radices +radii +radio +radioactive +radioastronomy +radiocarbon +radiochemical +radiochemistry +radiography +radiology +radiometer +radiophysics +radiosonde +radiotherapy +radish +radium +radius +radix +radon +Rae +Rafael +Rafferty +raffia +raffish +raft +rag +rage +ragging +ragout +Ragusan +ragweed +raid +rail +railbird +railhead +raillery +railroad +railway +rain +rainbow +raincoat +raindrop +rainfall +rainstorm +rainwater +rainy +raise +raisin +raj +rajah +rake +rakish +Raleigh +rally +Ralph +Ralston +ram +Ramada +Raman +ramble +rambunctious +ramify +Ramo +ramp +rampage +rampant +rampart +ramrod +Ramsey +ramshackle +ran +ranch +rancho +rancid +rancorous +Rand +Randall +Randolph +random +randy +rang +range +rangeland +Rangoon +rangy +Ranier +rank +Rankin +Rankine +rankle +ransack +ransom +rant +Raoul +rap +rapacious +rapacity +rape +Raphael +rapid +rapier +rapport +rapprochement +rapt +raptor +raptorial +rapture +rare +rarefy +Raritan +rasa +rascal +rash +Rasmussen +rasp +raspberry +raster +Rastus +rat +rata +rate +rater +rather +ratify +ratio +ratiocinate +rationale +rattail +rattle +rattlesnake +raucous +Raul +raunchy +ravage +rave +ravel +raven +ravenous +ravine +ravish +raw +rawboned +rawhide +Rawlinson +ray +Rayleigh +Raymond +Raytheon +raze +razor +razorback +RCA +R&D +Rd +re +reach +reactant +reactionary +read +readout +ready +Reagan +real +realm +realtor +realty +ream +reap +rear +reason +reave +reb +Rebecca +rebel +rebellion +rebellious +rebuke +rebuttal +recalcitrant +receipt +receive +receptacle +reception +receptive +receptor +recess +recessive +recherche +Recife +recipe +recipient +reciprocal +reciprocate +reciprocity +recital +recitative +reck +reckon +reclamation +recline +recluse +reclusive +recompense +reconcile +recondite +reconnaissance +recovery +recriminate +recrudescent +recruit +rectangle +rectangular +rectifier +rectify +rectilinear +rectitude +rector +rectory +recumbent +recuperate +recursion +recusant +recuse +red +redact +redactor +redbird +redbud +redcoat +redden +reddish +redemption +redemptive +redhead +Redmond +redneck +redolent +redound +redpoll +redshank +redstart +Redstone +redtop +reduce +reducible +reductio +redundant +redwood +reed +reedbuck +reedy +reef +reek +reel +Reese +refectory +refer +referee +refereeing +referenda +referendum +referent +referential +referral +referred +referring +reflect +reflectance +reflector +reflexive +reformatory +refract +refractometer +refractory +refrain +refrigerate +refuge +refugee +refusal +refutation +refute +regal +regalia +regard +regatta +regent +regime +regimen +regiment +regimentation +Regina +Reginald +region +Regis +registrable +registrant +registrar +registration +registry +regress +regression +regressive +regret +regretful +regrettable +regretted +regretting +regular +regulate +regulatory +Regulus +regurgitate +rehabilitate +rehearsal +Reich +Reid +reign +Reilly +reimbursable +reimburse +rein +reindeer +reinforce +Reinhold +reinstate +reject +rejoice +rejoinder +relaxation +releasable +relevant +reliant +relic +relict +relief +relieve +religion +religiosity +religious +relinquish +reliquary +relish +reluctant +remainder +remand +Rembrandt +remediable +remedy +remembrance +Remington +reminisce +reminiscent +remit +remittance +remnant +remonstrate +remorse +remorseful +remote +removal +remunerate +Rena +renaissance +renal +Renault +rend +render +rendezvous +rendition +Rene +renewal +rennet +Renoir +renounce +renovate +renown +Rensselaer +rent +rental +renunciate +rep +repairman +repairmen +reparation +repartee +repeater +repel +repelled +repellent +repelling +repentant +repertoire +repertory +repetitious +repetitive +replenish +replete +replica +replicate +reportorial +repository +reprehensible +representative +repression +repressive +reprieve +reprimand +reprisal +reprise +reproach +reptile +reptilian +republican +repudiate +repugnant +repulsion +repulsive +reputation +repute +require +requisite +requisition +rescind +rescue +resemblant +resemble +resentful +reserpine +reservation +reservoir +resident +residential +residual +residuary +residue +residuum +resignation +resilient +resiny +resist +resistant +resistible +resistive +resistor +resonate +resorcinol +resourceful +respect +respectful +respiration +respirator +respiratory +resplendent +respond +respondent +response +responsible +responsive +rest +restaurant +restaurateur +restful +restitution +restive +restoration +restorative +restraint +restroom +result +resultant +resume +resumption +resurgent +resurrect +resuscitate +ret +retain +retaliate +retaliatory +retard +retardant +retardation +retch +retention +retentive +reticent +reticulate +reticulum +retina +retinal +retinue +retiree +retribution +retrieval +retrieve +retroactive +retrofit +retrofitted +retrofitting +retrograde +retrogress +retrogressive +retrorocket +retrospect +retrovision +returnee +Reub +Reuben +Reuters +rev +revel +revelation +revelatory +revelry +revenge +revenue +rever +reverberate +revere +reverend +reverent +reverie +reversal +reversible +revert +revisable +revisal +revival +revive +revocable +revoke +revolution +revolutionary +revolve +revulsion +revved +revving +Rex +Reykjavik +Reynolds +rhapsodic +rhapsody +Rhea +Rhenish +rhenium +rheology +rheostat +rhesus +rhetoric +rhetorician +rheum +rheumatic +rheumatism +Rhine +rhinestone +rhino +rhinoceros +rhizome +rho +Rhoda +Rhode +Rhodes +Rhodesia +rhodium +rhododendron +rhodolite +rhodonite +rhombi +rhombic +rhombus +rhubarb +rhyme +rhythm +rhythmic +RI +rib +ribald +ribbon +riboflavin +ribonucleic +ribose +ribosome +Rica +rice +rich +Richard +Richardson +Richfield +Richmond +Richter +rick +rickets +Rickettsia +rickety +rickshaw +Rico +ricochet +ricotta +rid +riddance +ridden +riddle +ride +ridge +ridgepole +Ridgway +ridicule +ridiculous +Riemann +Riemannian +rife +riffle +rifle +rifleman +riflemen +rift +rig +Riga +Rigel +rigging +Riggs +right +righteous +rightful +rightmost +rightward +rigid +rigorous +Riley +rill +rilly +rim +rime +rimy +Rinehart +ring +ringlet +ringside +rink +rinse +Rio +Riordan +riot +riotous +rip +riparian +ripe +ripen +Ripley +ripoff +ripple +rise +risen +risible +risk +risky +Ritchie +rite +Ritter +ritual +Ritz +rival +rivalry +riven +river +riverbank +riverfront +riverine +riverside +rivet +Riviera +rivulet +Riyadh +RNA +roach +road +roadbed +roadblock +roadhouse +roadrunner +roadside +roadster +roadway +roam +roar +roast +rob +robbery +robbin +robe +Robert +Roberta +Roberto +Robertson +robin +Robinson +robot +robotics +robust +Rochester +rock +rockabye +rockaway +rockbound +Rockefeller +rocket +Rockford +Rockies +Rockland +Rockwell +rocky +rococo +rod +rode +rodent +rodeo +Rodgers +Rodney +Rodriguez +roe +roebuck +Roentgen +Roger +rogue +roguish +roil +roister +Roland +role +roll +rollback +rollick +Rollins +Roman +romance +Romanesque +Romania +Romano +romantic +Rome +Romeo +romp +Romulus +Ron +Ronald +rondo +Ronnie +rood +roof +rooftop +rooftree +rook +rookie +rooky +room +roomful +roommate +roomy +Roosevelt +Rooseveltian +roost +root +rootstock +rope +ropy +Rosa +Rosalie +rosary +rose +rosebud +rosebush +Roseland +rosemary +Rosen +Rosenberg +Rosenblum +Rosenthal +Rosenzweig +Rosetta +rosette +Ross +roster +rostrum +rosy +rot +Rotarian +rotary +rotate +ROTC +rote +rotenone +Roth +Rothschild +rotogravure +rotor +rototill +rotten +rotund +rotunda +rouge +rough +roughcast +roughen +roughish +roughneck +roughshod +roulette +round +roundabout +roundhead +roundhouse +roundoff +roundtable +roundup +roundworm +rouse +Rousseau +roustabout +rout +route +routine +rove +row +rowboat +rowdy +Rowe +Rowena +Rowland +Rowley +Roxbury +Roy +royal +royalty +Royce +RPM +r's +RSVP +Ruanda +rub +Rubaiyat +rubbery +rubbish +rubble +rubdown +Rube +Ruben +rubicund +rubidium +Rubin +rubric +ruby +ruckus +rudder +ruddy +rude +rudiment +rudimentary +Rudolf +Rudolph +Rudy +Rudyard +rue +rueful +ruffian +ruffle +rufous +Rufus +rug +ruin +ruination +ruinous +rule +rum +Rumania +rumble +rumen +Rumford +ruminant +ruminate +rummage +rummy +rump +rumple +rumpus +run +runabout +runaway +rundown +rune +rung +Runge +runic +runneth +runny +Runnymede +runoff +runt +runty +runway +Runyon +rupee +rupture +rural +ruse +rush +Rushmore +rusk +Russ +Russell +russet +Russia +Russo +russula +rust +rustic +rustle +rustproof +rusty +rut +rutabaga +Rutgers +Ruth +ruthenium +Rutherford +ruthless +rutile +Rutland +Rutledge +rutty +Rwanda +Ryan +Rydberg +Ryder +rye +s +sa +sabbath +sabbatical +Sabina +Sabine +sable +sabotage +sabra +sac +saccharine +sachem +Sachs +sack +sacral +sacrament +Sacramento +sacred +sacrifice +sacrificial +sacrilege +sacrilegious +sacristan +sacrosanct +sad +sadden +saddle +saddlebag +Sadie +sadism +sadist +Sadler +safari +safe +safeguard +safekeeping +safety +saffron +sag +saga +sagacious +sagacity +sage +sagebrush +sagging +Saginaw +sagittal +Sagittarius +sago +saguaro +Sahara +said +Saigon +sail +sailboat +sailfish +sailor +saint +sake +Sal +salaam +salacious +salad +salamander +salami +salary +sale +Salem +Salerno +salesgirl +Salesian +saleslady +salesman +salesmen +salesperson +salient +Salina +saline +Salisbury +Salish +saliva +salivary +salivate +Salk +Salle +sallow +sally +salmon +salmonberry +salmonella +salon +saloon +saloonkeep +salsify +salt +saltbush +Salton +saltwater +salty +salubrious +salutary +salutation +salute +salutory +Salvador +salvage +salvageable +salvation +Salvatore +salve +salvo +Sam +samarium +samba +same +Sammy +Samoa +samovar +sample +Sampson +Samson +Samuel +Samuelson +samurai +San +Sana +sanatoria +sanatorium +Sanborn +Sanchez +Sancho +sanctify +sanctimonious +sanction +sanctity +sanctuary +sand +sandal +sandalwood +sandbag +sandblast +Sandburg +sanderling +Sanderson +sandhill +Sandia +sandman +sandpaper +sandpile +sandpiper +Sandra +sandstone +Sandusky +sandwich +sandy +sane +Sanford +sang +sangaree +sanguinary +sanguine +sanguineous +Sanhedrin +sanicle +sanitarium +sanitary +sanitate +sank +sans +Sanskrit +Santa +Santayana +Santiago +Santo +Sao +sap +sapiens +sapient +sapling +saponify +sapphire +Sappho +sappy +saprophyte +saprophytic +sapsucker +Sara +Saracen +Sarah +Saran +Sarasota +Saratoga +sarcasm +sarcastic +sarcoma +sarcophagus +sardine +Sardinia +sardonic +Sargent +sari +sarong +sarsaparilla +sarsparilla +sash +sashay +sashimi +Saskatchewan +Saskatoon +sassafras +sat +satan +satanic +satellite +satiable +satiate +satiety +satin +satire +satiric +satisfaction +satisfactory +satisfy +saturable +saturate +saturater +Saturday +Saturn +Saturnalia +saturnine +satyr +sauce +saucepan +saucy +Saud +Saudi +sauerkraut +Saul +Sault +sauna +Saunders +saunter +sausage +saute +sauterne +savage +savagery +savanna +Savannah +savant +save +Saviour +Savonarola +savoy +Savoyard +savvy +saw +sawbelly +sawdust +sawfish +sawfly +sawmill +sawtimber +sawtooth +sawyer +sax +saxifrage +Saxon +Saxony +saxophone +say +SC +scab +scabbard +scabious +scabrous +scad +scaffold +Scala +scalar +scald +scale +scallop +scalp +scaly +scam +scamp +scan +scandal +scandalous +Scandinavia +scandium +scant +scanty +scapegoat +scapula +scapular +scar +Scarborough +scarce +scare +scarecrow +scarf +scarface +scarify +Scarlatti +scarlet +scarp +Scarsdale +scarves +scary +scat +scathe +scathing +scatterbrain +scattergun +scaup +scavenge +scenario +scene +scenery +scenic +scent +sceptic +Schaefer +Schafer +Schantz +schedule +Scheherazade +schelling +schema +schemata +schematic +scheme +Schenectady +scherzo +Schiller +schism +schist +schizoid +schizomycetes +schizophrenia +schizophrenic +Schlesinger +schlieren +Schlitz +Schloss +Schmidt +Schmitt +Schnabel +schnapps +Schneider +Schoenberg +Schofield +scholar +scholastic +school +schoolbook +schoolboy +schoolgirl +schoolgirlish +schoolhouse +schoolmarm +schoolmaster +schoolmate +schoolroom +schoolteacher +schoolwork +schoolyard +schooner +Schottky +Schroeder +Schroedinger +Schubert +Schultz +Schulz +Schumacher +Schumann +Schuster +Schuyler +Schuylkill +Schwab +Schwartz +Schweitzer +Sci +sciatica +science +scientific +scientist +scimitar +scintillate +scion +scissor +sclerosis +sclerotic +SCM +scoff +scold +scoop +scoot +scope +scopic +scops +scorch +score +scoreboard +scorecard +scoria +scorn +scornful +Scorpio +scorpion +Scot +scotch +Scotia +Scotland +Scotsman +Scotsmen +Scott +Scottish +Scottsdale +Scotty +scoundrel +scour +scourge +scout +scowl +scrabble +scraggly +scram +scramble +Scranton +scrap +scrapbook +scrape +scrappy +scratch +scratchy +scrawl +scrawny +scream +screech +screechy +screed +screen +screenful +screenplay +screw +screwball +screwbean +screwdriver +screwworm +screwy +scribble +scribe +Scribners +scrim +scrimmage +Scripps +script +scription +scriptural +scripture +scriptwriter +scriven +scroll +scrooge +scrotum +scrounge +scrub +scrubby +scruffy +scrumptious +scruple +scrupulosity +scrupulous +scrutable +scrutiny +scuba +scud +scuff +scuffle +scull +sculpin +sculpt +sculptor +sculptural +sculpture +scum +scurrilous +scurry +scurvy +scuttle +scutum +Scylla +scythe +Scythia +SD +SE +sea +seabed +seaboard +Seaborg +seacoast +seafare +seafood +Seagram +seagull +seahorse +seal +sealant +seam +seaman +seamen +seamstress +seamy +Sean +seance +seaport +seaquake +sear +search +searchlight +seashell +seashore +seaside +season +seasonal +seat +seater +Seattle +seaward +seawater +seaweed +seaworthy +sebaceous +Sebastian +sec +secant +secede +secession +seclude +seclusion +second +secondary +secondhand +secrecy +secret +secretarial +secretariat +secretary +secrete +secretion +secretive +sect +sectarian +section +sector +secular +secure +sedan +sedate +sedentary +seder +sedge +sediment +sedimentary +sedimentation +sedition +seditious +seduce +seduction +seductive +sedulous +see +seeable +seed +seedbed +seedling +seedy +seeing +seek +seem +seen +seep +seepage +seersucker +seethe +seething +segment +segmentation +Segovia +segregant +segregate +Segundo +Seidel +seismic +seismograph +seismography +seismology +seize +seizure +seldom +select +selectman +selectmen +selector +Selectric +Selena +selenate +selenite +selenium +self +selfadjoint +selfish +Selfridge +Selkirk +sell +sellout +Selma +seltzer +selves +Selwyn +semantic +semaphore +semblance +semester +semi +seminal +seminar +seminarian +seminary +Seminole +Semiramis +Semite +Semitic +semper +sen +senate +senatorial +send +Seneca +Senegal +senescent +senile +senior +senor +Senora +senorita +sensate +sense +sensible +sensitive +sensor +sensory +sensual +sensuous +sent +sentence +sentential +sentient +sentiment +sentinel +sentry +Seoul +sepal +separable +separate +sepia +Sepoy +sept +septa +septate +September +septennial +septic +septillion +septuagenarian +septum +sepulchral +seq +sequel +sequent +sequential +sequester +sequestration +sequin +sequitur +Sequoia +sera +seraglio +serape +seraphim +Serbia +serenade +serendipitous +serendipity +serene +serf +serge +sergeant +Sergei +serial +seriatim +sericulture +series +serif +serine +serious +sermon +serology +Serpens +serpent +serpentine +serum +servant +serve +service +serviceable +serviceberry +serviceman +servicemen +serviette +servile +servitor +servitude +servo +servomechanism +sesame +session +set +setback +Seth +Seton +setscrew +settle +setup +seven +sevenfold +seventeen +seventeenth +seventh +seventieth +seventy +seventyfold +sever +several +severalfold +severalty +severe +Severn +Seville +sew +sewage +Seward +sewerage +sewn +sex +Sextans +sextet +sextic +sextillion +sexton +sextuple +sextuplet +sexual +sexy +Seychelle +Seymour +sforzando +shabby +shack +shackle +shad +shadbush +shade +shadflower +shadow +shadowy +shady +Shafer +Shaffer +shaft +shag +shagbark +shagging +shaggy +shah +shake +shakeable +shakedown +shaken +Shakespeare +Shakespearean +Shakespearian +shako +shaky +shale +shall +shallot +shallow +shalom +sham +shaman +shamble +shame +shameface +shameful +shampoo +shamrock +Shanghai +shank +Shannon +shan't +Shantung +shanty +shape +Shapiro +shard +share +sharecrop +sharecropper +shareholder +Shari +shark +Sharon +sharp +Sharpe +sharpen +sharpshoot +Shasta +shatter +shatterproof +Shattuck +shave +shaven +shaw +shawl +Shawnee +shay +she +Shea +sheaf +shear +Shearer +sheath +sheathe +sheave +shebang +she'd +shed +Shedir +Sheehan +sheen +sheep +sheepherder +sheepskin +sheer +sheet +Sheffield +sheik +Sheila +Shelby +Sheldon +shelf +she'll +shell +Shelley +shellfish +shelter +Shelton +shelve +Shenandoah +shenanigan +Shepard +shepherd +shepherdess +Sheppard +Sheraton +sherbet +Sheridan +sheriff +Sherlock +Sherman +Sherrill +sherry +Sherwin +Sherwood +shibboleth +shield +shift +shifty +shill +Shiloh +shim +shimmy +shin +shinbone +shine +shingle +Shinto +shiny +ship +shipboard +shipbuild +shipbuilding +shiplap +Shipley +shipload +shipman +shipmate +shipmen +shipshape +shipwreck +shipyard +shire +shirk +Shirley +shirt +shirtmake +shish +shitepoke +shiv +Shiva +shiver +shivery +Shmuel +shoal +shock +Shockley +shod +shoddy +shoe +shoehorn +shoelace +shoemake +shoestring +shoji +shone +shoo +shoofly +shook +shoot +shop +shopkeep +shopworn +shore +shorebird +shorefront +shoreline +short +shortage +shortcake +shortcoming +shortcut +shorten +shortfall +shorthand +shortish +shortsighted +shortstop +Shoshone +shot +shotbush +shotgun +should +shoulder +shouldn't +shout +shove +shovel +show +showboat +showcase +showdown +showman +showmen +shown +showpiece +showplace +showroom +showy +shrank +shrapnel +shred +Shreveport +shrew +shrewd +shrewish +shriek +shrift +shrike +shrill +shrilly +shrimp +shrine +shrink +shrinkage +shrive +shrivel +shroud +shrove +shrub +shrubbery +shrug +shrugging +shrunk +shrunken +Shu +shuck +shudder +shuddery +shuffle +shuffleboard +Shulman +shun +shunt +shut +shutdown +shutoff +shutout +shuttle +shuttlecock +shy +Shylock +shyly +sial +SIAM +Siamese +Sian +sib +Siberia +sibilant +Sibley +sibling +sibyl +sic +Sicilian +Sicily +sick +sickbed +sicken +sickish +sickle +sicklewort +sickroom +side +sidearm +sideband +sideboard +sidecar +sidelight +sideline +sidelong +sideman +sidemen +sidereal +siderite +sidesaddle +sideshow +sidestep +sidestepped +sidestepping +sidetrack +sidewalk +sidewall +sideway +sidewinder +sidewise +sidle +Sidney +siege +Siegel +Siegfried +Sieglinda +Siegmund +Siemens +Siena +sienna +sierra +siesta +sieve +sift +sigh +sight +sightsee +sightseeing +sightseer +sigma +Sigmund +sign +signal +signature +signboard +signet +significant +signify +Signor +Signora +signpost +Sikh +Sikkim +Sikorsky +silage +silane +Silas +silent +silhouette +silica +silicate +siliceous +silicic +silicide +silicon +silicone +silicosis +silk +silken +silkworm +silky +sill +silly +silo +silt +siltation +siltstone +silty +silver +Silverman +silversmith +silverware +silvery +sima +simian +similar +simile +similitude +Simla +simmer +Simmons +Simon +Simonson +simper +simple +simplectic +simpleminded +simpleton +simplex +simplicial +simplicity +simplify +simplistic +simply +Simpson +Sims +simulate +simulcast +simultaneity +simultaneous +sin +Sinai +Sinbad +since +sincere +Sinclair +sine +sinew +sinewy +sinful +sing +singable +Singapore +singe +single +singlehanded +singleminded +singlet +singleton +singsong +singular +sinh +sinister +sinistral +sink +sinkhole +Sino +Sinology +sinter +sinuous +sinus +sinusoid +sinusoidal +Sioux +sip +sir +sire +siren +Sirius +sis +sisal +siskin +sister +Sistine +Sisyphean +Sisyphus +sit +site +situ +situate +situs +siva +six +sixfold +sixgun +sixteen +sixteenth +sixth +sixtieth +sixty +sixtyfold +size +sizzle +skat +skate +skateboard +skater +skeet +skein +skeleta +skeletal +skeleton +skeptic +sketch +sketchbook +sketchpad +sketchy +skew +ski +skid +skiddy +skiff +skill +skillet +skillful +skim +skimp +skimpy +skin +skindive +skinflint +skinny +skintight +skip +skipjack +Skippy +skirmish +skirt +skit +skittle +Skopje +skulk +skull +skullcap +skullduggery +skunk +sky +Skye +skyhook +skyjack +skylark +skylight +skyline +skyrocket +skyscrape +skyward +skywave +skyway +slab +slack +slacken +sladang +slag +slain +slake +slam +slander +slanderous +slang +slant +slap +slapdash +slapstick +slash +slat +slate +slater +slaughter +slaughterhouse +Slav +slave +slavery +Slavic +slavish +Slavonic +slay +sleazy +sled +sledge +sledgehammer +sleek +sleep +sleepwalk +sleepy +sleet +sleety +sleeve +sleigh +sleight +slender +slept +sleuth +slew +slice +slick +slid +slide +slight +slim +slime +slimy +sling +slingshot +slink +slip +slippage +slippery +slipshod +slit +slither +sliver +slivery +Sloan +Sloane +slob +Slocum +sloe +slog +slogan +sloganeer +slogging +sloop +slop +slope +sloppy +slosh +slot +sloth +slothful +slouch +slough +Slovakia +sloven +Slovenia +slow +slowdown +sludge +slug +slugging +sluggish +sluice +slum +slumber +slump +slung +slunk +slur +slurp +slurry +slush +slushy +sly +smack +small +Smalley +smallish +smallpox +smalltime +smart +smash +smattering +smear +smell +smelly +smelt +smile +smirk +smite +smith +smithereens +Smithfield +Smithson +smithy +smitten +smog +smoke +smokehouse +smokescreen +smokestack +smoky +smolder +smooch +smooth +smoothbore +smote +smother +Smucker +smudge +smudgy +smug +smuggle +smut +smutty +Smyrna +Smythe +snack +snafu +snag +snagging +snail +snake +snakebird +snakebite +snakeroot +snap +snapback +snapdragon +snappish +snappy +snapshot +snare +snark +snarl +snatch +snazzy +sneak +sneaky +sneer +sneeze +snell +snick +Snider +sniff +sniffle +snifter +snigger +snip +snipe +snippet +snippy +snivel +snob +snobbery +snobbish +snook +snoop +snoopy +snore +snorkel +snort +snotty +snout +snow +snowball +snowbank +snowfall +snowflake +snowshoe +snowstorm +snowy +snub +snuff +snuffle +snug +snuggle +snuggly +Snyder +so +soak +soap +soapstone +soapsud +soapy +soar +sob +sober +sobriety +sobriquet +Soc +soccer +sociable +social +societal +Societe +society +socioeconomic +sociolinguistic +sociology +sociometry +sock +socket +sockeye +Socrates +Socratic +sod +soda +sodden +sodium +sofa +soffit +Sofia +soft +softball +softcover +soften +software +softwood +soggy +soignee +soil +soiree +sojourn +Sol +solace +solar +sold +solder +soldier +soldiery +sole +solecism +solemn +solenoid +solicit +solicitation +solicitor +solicitous +solicitude +solid +solidarity +solidify +soliloquy +solipsism +solitary +soliton +solitude +solo +Solomon +Solon +solstice +soluble +solute +solution +solvate +solve +solvent +soma +somal +Somali +Somalia +somatic +somber +sombre +some +somebody +somebody'll +someday +somehow +someone +someone'll +someplace +Somers +somersault +Somerset +Somerville +something +sometime +somewhat +somewhere +sommelier +Sommerfeld +somnolent +son +sonant +sonar +sonata +song +songbag +songbird +songbook +songful +sonic +sonnet +sonny +Sonoma +Sonora +sonorant +sonority +sonorous +Sony +soon +soot +sooth +soothe +soothsay +soothsayer +sop +sophia +Sophie +sophism +sophisticate +sophistry +Sophoclean +Sophocles +sophomore +sophomoric +soprano +sora +sorb +sorcery +sordid +sore +Sorensen +Sorenson +sorghum +sorority +sorption +sorrel +sorrow +sorrowful +sorry +sort +sortie +sou +souffle +sough +sought +soul +soulful +sound +soundproof +soup +soupy +sour +sourberry +source +sourdough +sourwood +Sousa +soutane +south +Southampton +southbound +southeast +southeastern +southern +southernmost +Southey +southland +southpaw +southward +southwest +southwestern +souvenir +sovereign +sovereignty +soviet +sovkhoz +sow +sowbelly +sowbug +sown +soy +soya +soybean +spa +space +spacecraft +spacesuit +spacetime +spacious +spade +spaghetti +Spain +spalding +span +spandrel +spangle +Spaniard +spaniel +Spanish +spar +spare +sparge +spark +sparkle +Sparkman +sparky +sparling +sparrow +sparse +Sparta +spartan +spasm +spasmodic +spastic +spat +spate +spatial +spatlum +spatterdock +spatula +Spaulding +spavin +spawn +spay +speak +speakeasy +spear +spearhead +spearmint +spec +special +speciate +specie +species +specific +specify +specimen +specious +speck +speckle +spectacle +spectacular +spectator +Spector +spectra +spectral +spectrogram +spectrograph +spectrography +spectrometer +spectrophotometer +spectroscope +spectroscopic +spectroscopy +spectrum +specular +speculate +sped +speech +speed +speedboat +speedometer +speedup +speedwell +speedy +spell +spellbound +Spencer +Spencerian +spend +spent +sperm +spermatophyte +spermatozoa +spermatozoon +Sperry +spew +sphagnum +sphalerite +sphere +spheric +spheroid +spheroidal +spherule +sphinx +sphygmomanometer +Spica +spice +spicebush +spicy +spider +spiderwort +spidery +Spiegel +spigot +spike +spikenard +spiky +spill +spillover +spilt +spin +spinach +spinal +spindle +spindly +spine +spinel +spinnaker +spinneret +spinodal +spinoff +spinster +spiny +spiral +spire +spirit +spiritual +Spiro +spirochaete +Spirogyra +spit +spite +spiteful +spitfire +spittle +spitz +splash +splashy +splat +splay +spleen +spleenwort +splendid +splenetic +splice +spline +splint +splintery +split +splotch +splotchy +splurge +splutter +spoil +spoilage +Spokane +spoke +spoken +spokesman +spokesmen +spokesperson +sponge +spongy +sponsor +spontaneity +spontaneous +spoof +spook +spooky +spool +spoon +spoonful +sporadic +spore +sport +sportsman +sportsmen +sportswear +sportswriter +sportswriting +sporty +spot +spotlight +spotty +spouse +spout +Sprague +sprain +sprang +sprawl +spray +spread +spree +sprig +sprightly +spring +springboard +springe +Springfield +springtail +springtime +springy +sprinkle +sprint +sprite +sprocket +Sproul +sprout +spruce +sprue +sprung +spud +spume +spumoni +spun +spunk +spunky +spur +spurge +spurious +spurn +spurt +sputnik +sputter +spy +spyglass +squabble +squad +squadron +squalid +squall +squamous +squander +square +squash +squashberry +squashy +squat +squatted +squatter +squatting +squaw +squawbush +squawk +squawroot +squeak +squeaky +squeal +squeamish +squeegee +squeeze +squelch +Squibb +squid +squill +squint +squire +squirm +squirmy +squirrel +squirt +squishy +Sri +s's +SSE +SST +SSW +St +stab +stabile +stable +stableman +stablemen +staccato +stack +Stacy +stadia +stadium +staff +Stafford +stag +stage +stagecoach +stagnant +stagnate +stagy +Stahl +staid +stain +stair +staircase +stairway +stairwell +stake +stalactite +stalagmite +stale +stalemate +Staley +Stalin +stalk +stall +stallion +stalwart +stamen +Stamford +stamina +staminate +stammer +stamp +stampede +Stan +stance +stanch +stanchion +stand +standard +standby +standeth +Standish +standoff +standpoint +standstill +Stanford +Stanhope +stank +Stanley +stannic +stannous +Stanton +stanza +staph +staphylococcus +staple +Stapleton +star +starboard +starch +starchy +stardom +stare +starfish +stargaze +stark +Starkey +starlet +starlight +starling +Starr +starry +start +startle +startup +starvation +starve +stash +stasis +state +Staten +stater +stateroom +statesman +statesmen +statewide +static +stationarity +stationary +stationery +stationmaster +statistician +Statler +stator +statuary +statue +statuesque +statuette +stature +status +statute +statutory +Stauffer +staunch +Staunton +stave +stay +stead +steadfast +steady +steak +steal +stealth +stealthy +steam +steamboat +steamy +stearate +stearic +Stearns +steed +steel +Steele +steelmake +steely +Steen +steep +steepen +steeple +steeplebush +steeplechase +steer +steeve +Stefan +Stegosaurus +stein +Steinberg +Steiner +stella +stellar +stem +stench +stencil +stenographer +stenography +stenotype +step +stepchild +Stephanie +stephanotis +Stephen +Stephenson +stepmother +steppe +steprelation +stepson +stepwise +steradian +stereo +stereography +stereoscopy +sterile +sterling +stern +sternal +Sternberg +Sterno +sternum +steroid +stethoscope +Stetson +Steuben +Steve +stevedore +Steven +Stevenson +stew +steward +stewardess +Stewart +stick +stickle +stickleback +stickpin +sticktight +sticky +stiff +stiffen +stifle +stigma +stigmata +stile +stiletto +still +stillbirth +stillwater +stilt +stimulant +stimulate +stimulatory +stimuli +stimulus +sting +stingray +stingy +stink +stinkbug +stinkpot +stinky +stint +stipend +stipple +stipulate +stir +Stirling +stirrup +stitch +stoat +stochastic +stock +stockade +stockbroker +stockholder +Stockholm +stockpile +stockroom +Stockton +stocky +stodgy +stoic +stoichiometry +stoke +Stokes +stole +stolen +stolid +stomach +stomp +stone +stonecrop +Stonehenge +stonewall +stoneware +stonewort +stony +stood +stooge +stool +stoop +stop +stopband +stopcock +stopgap +stopover +stoppage +stopwatch +storage +store +storefront +storehouse +storekeep +storeroom +Storey +stork +storm +stormbound +stormy +story +storyboard +storyteller +storytelling +stout +stove +stow +stowage +stowaway +strabismic +strabismus +straddle +strafe +straggle +straight +straightaway +straighten +straightforward +straightway +strain +strait +strand +strange +strangle +strangulate +strap +strata +stratagem +strategic +strategist +strategy +Stratford +stratify +stratosphere +stratospheric +Stratton +stratum +stratus +Strauss +straw +strawberry +strawflower +stray +streak +stream +streamline +streamside +street +streetcar +strength +strengthen +strenuous +streptococcus +streptomycin +stress +stressful +stretch +strewn +striate +stricken +Strickland +strict +stricture +stride +strident +strife +strike +strikebreak +string +stringent +stringy +strip +stripe +striptease +strive +striven +strobe +stroboscopic +strode +stroke +stroll +Strom +Stromberg +strong +stronghold +strongroom +strontium +strop +strophe +strove +struck +structural +structure +struggle +strum +strung +strut +strychnine +Stuart +stub +stubble +stubborn +stubby +stucco +stuck +stud +Studebaker +student +studio +studious +study +stuff +stuffy +stultify +stumble +stump +stumpage +stumpy +stun +stung +stunk +stunt +stupa +stupefy +stupendous +stupid +stupor +Sturbridge +sturdy +sturgeon +Sturm +stutter +Stuttgart +Stuyvesant +Stygian +style +styli +stylish +stylites +stylus +stymie +styrene +Styrofoam +Styx +suave +sub +subject +subjunctive +sublimate +subliminal +submersible +submit +submittal +submitted +submitting +subpoena +subrogation +subservient +subsidiary +subsidy +subsist +subsistent +substantial +substantiate +substantive +substituent +substitute +substitution +substitutionary +substrate +subsume +subterfuge +subterranean +subtle +subtlety +subtly +subtrahend +suburb +suburbia +subversive +subvert +succeed +success +successful +succession +successive +successor +succinct +succubus +succumb +such +suck +suckle +sucrose +suction +sud +Sudan +Sudanese +sudden +sudorific +suds +sue +suet +suey +Suez +suffer +suffice +sufficient +suffix +suffocate +Suffolk +suffrage +suffragette +suffuse +sugar +sugary +suggest +suggestible +suggestion +suggestive +suicidal +suicide +suit +suitcase +suite +suitor +sukiyaki +sulfa +sulfanilamide +sulfate +sulfide +sulfite +sulfonamide +sulfur +sulfuric +sulfurous +sulk +sulky +sullen +Sullivan +sully +sulphur +sultan +sultry +sum +sumac +Sumatra +Sumeria +summand +summary +summate +summertime +summit +summitry +summon +Sumner +sumptuous +Sumter +sun +sunbeam +sunbonnet +sunburn +sunburnt +Sunday +sunder +sundew +sundial +sundown +sundry +sunfish +sunflower +sung +sunglasses +sunk +sunken +sunlight +sunlit +sunny +Sunnyvale +sunrise +sunscreen +sunset +sunshade +sunshine +sunshiny +sunspot +suntan +suntanned +suntanning +SUNY +sup +super +superannuate +superb +superbly +supercilious +superficial +superfluity +superfluous +superintendent +superior +superlative +superlunary +supernatant +supersede +superstition +superstitious +supervene +supervisory +supine +supplant +supple +supplementary +supplicant +supplicate +supply +support +supposable +suppose +supposition +suppress +suppressible +suppression +suppressor +supra +supranational +supremacy +supreme +supremum +surah +surcease +surcharge +sure +surefire +surety +surf +surface +surfactant +surfeit +surge +surgeon +surgery +surgical +surjection +surjective +surly +surmise +surmount +surname +surpass +surplus +surprise +surreal +surrender +surreptitious +surrey +surrogate +surround +surtax +surtout +surveillant +survey +surveyor +survival +survive +survivor +Sus +Susan +Susanne +susceptance +susceptible +sushi +Susie +suspect +suspend +suspense +suspension +suspensor +suspicion +suspicious +Sussex +sustain +sustenance +Sutherland +Sutton +suture +Suzanne +suzerain +suzerainty +Suzuki +svelte +Svetlana +SW +swab +swabby +swag +Swahili +swain +swallow +swallowtail +swam +swami +swamp +swampland +swampy +swan +swank +swanky +Swanson +swap +swarm +swart +Swarthmore +Swarthout +swarthy +swastika +swat +swatch +swath +swathe +sway +Swaziland +swear +sweat +sweatband +sweater +sweatpants +sweatshirt +sweatshop +sweatsocks +sweaty +Swede +Sweden +Swedish +Sweeney +sweep +sweepstake +sweet +sweetbread +sweeten +sweetheart +sweetie +sweetish +swell +swelt +swelter +Swenson +swept +swerve +swidden +swift +swig +swigging +swill +swim +swimsuit +swindle +swine +swing +swingable +swingy +swipe +swirl +swirly +swish +swishy +swiss +switch +switchback +switchblade +switchboard +switchgear +switchman +switchmen +Switzer +Switzerland +swivel +swizzle +swollen +swoop +sword +swordfish +swordplay +swordtail +swore +sworn +swum +swung +sybarite +Sybil +sycamore +sycophant +sycophantic +Sydney +syenite +Sykes +syllabi +syllabic +syllabify +syllable +syllabus +syllogism +syllogistic +Sylow +sylvan +Sylvania +Sylvester +Sylvia +symbiont +symbiosis +symbiote +symbiotic +symbol +symbolic +symmetry +sympathetic +sympathy +symphonic +symphony +symplectic +symposia +symposium +symptom +symptomatic +synagogue +synapse +synaptic +synchronism +synchronous +synchrony +synchrotron +syncopate +syndic +syndicate +syndrome +synecdoche +synergism +synergistic +synergy +Synge +synod +synonym +synonymous +synonymy +synopses +synopsis +synoptic +syntactic +syntax +synthesis +synthetic +syphilis +syphilitic +Syracuse +Syria +syringa +syringe +syrinx +syrup +syrupy +system +systematic +systemic +systemwide +syzygy +Szilard +t +TA +tab +tabernacle +table +tableau +tableaux +tablecloth +tableland +tablespoon +tablespoonful +tablet +tabletop +tabloid +taboo +tabu +tabula +tabular +tabulate +tachinid +tachometer +tachyon +tacit +taciturn +Tacitus +tack +tackle +tacky +Tacoma +tact +tactful +tactic +tactile +tactual +tad +tadpole +taffeta +taffy +taft +tag +tagging +Tahiti +Tahoe +taiga +tail +tailgate +taillight +tailor +tailspin +tailwind +taint +Taipei +Taiwan +take +taken +takeoff +takeover +talc +talcum +tale +talent +talisman +talismanic +talk +talkative +talkie +talky +tall +Tallahassee +tallow +tally +tallyho +Talmud +Talmudic +talon +talus +tam +tamale +tamarack +tamarind +tamarisk +tambourine +tame +Tamil +Tammany +tamp +Tampa +tampon +tan +tanager +Tanaka +Tananarive +tandem +tang +Tanganyika +tangent +tangential +tangerine +tangible +tangle +tango +tangy +tanh +tank +tankard +tannin +tansy +tantalum +Tantalus +tantamount +Tantric +tantrum +Tanya +Tanzania +tao +tap +tapa +tape +taper +tapestry +tapeworm +tapioca +tapir +tapis +tappa +tappet +taproot +tar +tara +tarantara +tarantula +Tarbell +tardy +target +tariff +tarnish +taro +tarpaper +tarpaulin +tarpon +tarry +Tarrytown +tarsier +tart +tartar +Tartary +Tarzan +task +taskmaster +Tasmania +Tass +tassel +taste +tasteful +tasting +tasty +tat +tate +tater +tattle +tattler +tattletale +tattoo +tatty +tau +taught +taunt +Taurus +taut +tautology +tavern +taverna +tawdry +tawny +tax +taxa +taxation +taxi +taxicab +taxidermist +taxidermy +taxied +taxiway +taxon +taxonomic +taxonomist +taxonomy +taxpayer +taxpaying +Taylor +tea +teacart +teach +teacup +teahouse +teak +teakettle +teakwood +teal +team +teammate +teamster +teamwork +teapot +tear +teardrop +tearful +tease +teasel +teaspoon +teaspoonful +teat +tech +technetium +technic +technician +Technion +technique +technology +tectonic +tecum +Ted +Teddy +tedious +tedium +tee +teeing +teem +teen +teenage +teensy +teet +teeth +teethe +teetotal +Teflon +Tegucigalpa +Teheran +Tehran +tektite +Tektronix +Tel +telecommunicate +teleconference +Teledyne +Telefunken +telegram +telegraph +telegraphy +telekinesis +telemeter +teleology +teleost +telepathic +telepathy +telephone +telephonic +telephony +telephoto +telephotography +teleprinter +teleprocessing +teleprompter +telescope +telescopic +teletype +teletypesetting +teletypewrite +televise +television +Telex +tell +telltale +tellurium +temerity +temper +tempera +temperance +temperate +temperature +tempest +tempestuous +template +temple +Templeton +tempo +temporal +temporary +tempt +temptation +temptress +ten +tenable +tenacious +tenacity +tenant +tend +tendency +tenderfoot +tenderhearted +tenderloin +tendon +tenebrous +tenement +tenet +tenfold +Tenneco +Tennessee +Tenney +tennis +Tennyson +tenon +tenor +tense +tensile +tension +tensor +tenspot +tent +tentacle +tentative +tenth +tenuous +tenure +tepee +tepid +teratogenic +teratology +terbium +tercel +Teresa +term +termcap +terminable +terminal +terminate +termini +terminology +terminus +termite +tern +ternary +Terpsichore +terpsichorean +Terra +terrace +terrain +terramycin +terrapin +Terre +terrestrial +terrible +terrier +terrific +terrify +territorial +territory +terror +terry +terse +tertiary +Tess +tessellate +test +testament +testamentary +testate +testes +testicle +testicular +testify +testimonial +testimony +testosterone +testy +tetanus +tete +tether +tetrachloride +tetrafluoride +tetragonal +tetrahedra +tetrahedral +tetrahedron +tetravalent +Teutonic +TEX +Texaco +Texan +Texas +text +textbook +textile +Textron +textual +textural +texture +Thai +Thailand +Thalia +thallium +thallophyte +than +thank +thankful +thanksgiving +that +thatch +that'd +that'll +thaw +Thayer +the +Thea +theatric +Thebes +thee +theft +their +theism +theist +Thelma +them +thematic +theme +themselves +then +thence +thenceforth +theocracy +theocratic +Theodore +Theodosian +theologian +theology +theorem +theoretic +theoretician +theorist +theory +therapeutic +therapist +therapy +there +thereabouts +thereafter +thereat +thereby +there'd +therefor +therefore +therefrom +therein +there'll +thereof +thereon +Theresa +thereto +theretofore +thereunder +thereupon +therewith +thermal +thermionic +thermistor +thermo +Thermofax +thermophilic +thermostat +thesaurus +these +theses +Theseus +thesis +thespian +Thessalonian +Thessaly +theta +Thetis +they +they'd +they'll +they're +they've +thiamin +thick +thicken +thicket +thickish +thief +thieves +thieving +thigh +thimble +thimbleful +Thimbu +thin +thine +thing +think +thinnish +thiocyanate +thiouracil +third +thirdhand +thirst +thirsty +thirteen +thirteenth +thirtieth +thirty +thirtyfold +this +this'll +thistle +thistledown +thither +Thomas +Thomistic +Thompson +Thomson +thong +Thor +thoracic +thorax +Thoreau +thoriate +thorium +thorn +Thornton +thorny +thorough +thoroughbred +thoroughfare +thoroughgoing +Thorpe +Thorstein +those +thou +though +thought +thoughtful +thousand +thousandfold +thousandth +Thrace +Thracian +thrall +thrash +thread +threadbare +threat +threaten +three +threefold +threesome +threonine +thresh +threshold +threw +thrice +thrift +thrifty +thrill +thrips +thrive +throat +throaty +throb +throes +thrombosis +throne +throng +throttle +through +throughout +throughput +throw +throwback +thrown +thrum +thrush +thrust +Thruway +Thuban +thud +thug +thuggee +Thule +thulium +thumb +thumbnail +thumbprint +thump +thunder +thunderclap +thundercloud +thunderflower +thunderous +thundershower +thunderstorm +Thurman +Thursday +thus +thwack +thwart +thy +thyme +thymine +thymus +thyratron +thyroglobulin +thyroid +thyroidal +thyronine +thyrotoxic +thyroxine +thyself +ti +Tiber +tibet +Tibetan +tibia +tic +tick +ticket +tickle +ticklish +tid +tidal +tidbit +tide +tideland +tidewater +tidy +tie +Tientsin +tier +Tiffany +tift +tiger +tight +tighten +tightwad +tigress +Tigris +til +tilde +tile +till +tilt +tilth +Tim +timber +timberland +timbre +time +timeout +timepiece +timeshare +timetable +timeworn +Timex +timid +Timon +timothy +tin +Tina +tincture +tinder +tine +tinfoil +tinge +tingle +tinker +tinkle +tinny +tinsel +tint +tintype +tiny +Tioga +tip +tipoff +Tipperary +tipple +tippy +tipsy +tiptoe +tirade +Tirana +tire +tiresome +tissue +tit +Titan +titanate +titanic +titanium +tithe +tithing +titian +titillate +title +titmice +titmouse +Tito +titrate +titular +Titus +tizzy +TN +TNT +to +toad +toady +toast +tobacco +Tobago +Toby +toccata +today +today'll +Todd +toddle +toddy +toe +TOEFL +toehold +toenail +toffee +tofu +tog +together +togging +toggle +Togo +togs +toil +toilet +toilsome +tokamak +token +Tokyo +told +Toledo +tolerable +tolerant +tolerate +toll +tollbooth +tollgate +tollhouse +Tolstoy +toluene +Tom +tomahawk +tomato +tomatoes +tomb +tombstone +tome +Tomlinson +Tommie +tommy +tomography +tomorrow +Tompkins +ton +tonal +tone +tong +tongue +Toni +tonic +tonight +tonk +tonnage +tonsil +tonsillitis +tony +too +toodle +took +tool +toolkit +toolmake +toolsmith +toot +tooth +toothache +toothbrush +toothpaste +toothpick +toothy +tootle +top +topaz +topcoat +Topeka +topgallant +topheavy +topic +topmost +topnotch +topocentric +topography +topology +toponym +toponymy +topple +topsoil +Topsy +tor +torah +torch +tore +tori +torn +tornado +toroid +toroidal +Toronto +torpedo +torpedoes +torpid +torpor +torque +torr +Torrance +torrent +torrential +torrid +torsion +torso +tort +tortoise +tortoiseshell +tortuous +torture +torus +tory +Toshiba +toss +tot +total +totalitarian +tote +totem +totemic +toto +touch +touchdown +touchstone +touchy +tough +tour +tournament +tousle +tout +tow +toward +towboat +towel +tower +towhead +towhee +town +townhouse +Townsend +townsman +townsmen +toxic +toxicology +toxin +toy +Toyota +trace +traceable +tracery +trachea +tracheae +track +trackage +tract +tractor +Tracy +trade +trademark +tradeoff +tradesman +tradesmen +tradition +traffic +trafficked +trafficker +trafficking +trag +tragedian +tragedy +tragic +tragicomic +trail +trailblazer +trailblazing +trailhead +trailside +train +trainee +trainload +trainman +trainmen +traipse +trait +traitor +traitorous +trajectory +tram +trammel +tramp +trample +tramway +trance +tranquil +tranquillity +trans +transact +transalpine +transatlantic +transceiver +transcend +transcendent +transcendental +transconductance +transcontinental +transcribe +transcript +transcription +transducer +transduction +transect +transept +transfer +transferee +transference +transferor +transferral +transferred +transferring +transfinite +transfix +transform +transformation +transfusable +transfuse +transfusion +transgress +transgression +transgressor +transient +transistor +transit +Transite +transition +transitive +transitory +translate +transliterate +translucent +transmissible +transmission +transmit +transmittable +transmittal +transmittance +transmitted +transmitter +transmitting +transmutation +transmute +transoceanic +transom +transonic +transpacific +transparent +transpiration +transpire +transplant +transplantation +transport +transportation +transposable +transpose +transposition +transship +transshipping +transudate +Transvaal +transversal +transverse +transvestite +Transylvania +trap +trapezium +trapezoid +trapezoidal +trash +trashy +Trastevere +trauma +traumatic +travail +travel +travelogue +traversable +traversal +traverse +travertine +travesty +Travis +trawl +tray +treacherous +treachery +tread +treadle +treadmill +treason +treasonous +treasure +treasury +treat +treatise +treaty +treble +tree +treetop +trefoil +trek +trellis +tremble +tremendous +tremolo +tremor +tremulous +trench +trenchant +trencherman +trenchermen +trend +trendy +Trenton +trepidation +trespass +tress +trestle +Trevelyan +triable +triad +trial +triangle +triangular +triangulate +Triangulum +Trianon +Triassic +triatomic +tribal +tribe +tribesman +tribesmen +tribulate +tribunal +tribune +tributary +tribute +Triceratops +Trichinella +trichloroacetic +trichloroethane +trichrome +trick +trickery +trickle +trickster +tricky +trident +tridiagonal +triennial +trifle +trifluoride +trig +trigonal +trigonometry +trigram +trilingual +trill +trillion +trillium +trilobite +trilogy +trim +trimer +trimester +Trinidad +trinitarian +trinity +trinket +trio +triode +trioxide +trip +tripartite +tripe +triphammer +triphenylphosphine +triple +triplet +Triplett +triplex +triplicate +triploid +triploidy +tripod +tripoli +triptych +trisodium +Tristan +tristate +trisyllable +trite +tritium +triton +triumph +triumphal +triumphant +triune +trivalent +trivia +trivial +trivium +Trobriand +trod +trodden +troff +troglodyte +troika +Trojan +troll +trolley +trollop +trombone +trompe +troop +trophic +trophy +tropic +tropopause +troposphere +tropospheric +trot +trouble +troubleshoot +troublesome +trough +trounce +troupe +trouser +trout +Troutman +troy +truant +truce +truck +truckload +truculent +trudge +Trudy +true +truffle +truism +Truk +truly +Truman +Trumbull +trump +trumpery +trumpet +truncate +trundle +trunk +trunkful +truss +trust +trustee +trustful +trustworthy +trusty +truth +truthful +TRW +try +trypsin +trytophan +t's +tsar +tsarina +tset +tsunami +TTL +TTY +tty +tub +tuba +tube +tuberculin +tuberculosis +tuberous +tubular +tubule +tuck +Tucson +Tudor +Tuesday +tuff +tuft +tug +tugboat +tugging +tuition +Tulane +tularemia +tulip +tulle +Tulsa +tum +tumble +tumbrel +tumult +tumultuous +tun +tuna +tundra +tune +tuneful +tung +tungstate +tungsten +tunic +Tunis +Tunisia +tunnel +tupelo +tuple +turban +turbid +turbidity +turbinate +turbine +turbofan +turbojet +turbulent +turf +Turin +Turing +turk +turkey +Turkish +turmeric +turmoil +turn +turnabout +turnaround +turnery +turnip +turnkey +turnoff +turnout +turnover +turnpike +turnstone +turntable +turpentine +turpitude +turquoise +turret +turtle +turtleback +turtleneck +turvy +Tuscaloosa +Tuscan +Tuscany +Tuscarora +tusk +Tuskegee +tussle +tussock +Tutankhamen +tutelage +Tutenkhamon +tutor +tutorial +Tuttle +tutu +tuxedo +TV +TVA +TWA +twaddle +twain +tweak +tweed +tweedy +tweeze +twelfth +twelve +twelvefold +twentieth +twenty +twentyfold +twice +twiddle +twig +twigging +twilight +twill +twin +twine +twinge +twinkle +twirl +twirly +twist +twisty +twit +twitch +twitchy +two +twofold +Twombly +twosome +TWX +TX +Tyburn +tycoon +tying +tyke +Tyler +tympanum +type +typeface +typescript +typeset +typesetter +typesetting +typewrite +typewritten +typhoid +Typhon +typhoon +typhus +typic +typify +typo +typographer +typography +typology +tyrannic +tyrannicide +Tyrannosaurus +tyranny +tyrant +tyrosine +Tyson +Tzeltal +u +ubiquitous +ubiquity +UCLA +Uganda +ugh +ugly +UK +Ukraine +Ukrainian +Ulan +ulcer +ulcerate +Ullman +ulna +Ulster +ulterior +ultimate +ultimatum +ultra +Ulysses +umber +umbilical +umbilici +umbilicus +umbra +umbrage +umbrella +umpire +UN +un +unanimity +unanimous +unary +unbeknownst +unchristian +uncle +uncouth +unction +unctuous +under +underclassman +underclassmen +underivable +underived +underling +undulate +UNESCO +ungulate +uniaxial +unicorn +unidimensional +unidirectional +uniform +unify +unilateral +unimodal +uninominal +union +uniplex +unipolar +uniprocessor +unique +Uniroyal +unisex +unison +unit +unital +unitarian +unitary +unite +unity +Univac +univalent +univariate +universal +universe +Unix +unkempt +unruly +until +unwieldy +up +upbeat +upbraid +upbring +upcome +update +updraft +upend +upgrade +upheaval +upheld +uphill +uphold +upholster +upholstery +upkeep +upland +uplift +upon +upperclassman +upperclassmen +uppercut +uppermost +upraise +upright +uprise +upriver +uproar +uproarious +uproot +upset +upsetting +upshot +upside +upsilon +upslope +upstage +upstair +upstand +upstart +upstate +upstater +upstream +upsurge +upswing +uptake +Upton +uptown +uptrend +upturn +upward +upwell +upwind +uracil +urania +uranium +Uranus +uranyl +urban +Urbana +urbane +urbanite +urchin +Urdu +urea +uremia +urethane +urethra +urge +urgent +Uri +urinal +urinary +urinate +urine +Uris +urn +urology +Urquhart +Ursa +Ursula +Ursuline +Uruguay +urushiol +U.S +u's +us +U.S.A +USA +usable +USAF +usage +USC +USC&GS +USDA +use +useful +USGS +usher +USIA +USN +USPS +USSR +usual +usurer +usurious +usurp +usurpation +usury +UT +Utah +utensil +uterine +uterus +Utica +utile +utilitarian +utility +utmost +utopia +utopian +Utrecht +utter +utterance +uttermost +v +VA +vacant +vacate +vacationland +vaccinate +vaccine +vacillate +vacua +vacuo +vacuolate +vacuole +vacuous +vacuum +vade +Vaduz +vagabond +vagary +vagina +vaginal +vagrant +vague +Vail +vain +vainglorious +vale +valedictorian +valedictory +valent +valentine +Valerie +Valery +valet +valeur +Valhalla +valiant +valid +validate +valine +Valkyrie +Valletta +valley +Valois +Valparaiso +valuate +value +valve +vamp +vampire +van +vanadium +Vance +Vancouver +vandal +Vandenberg +Vanderbilt +Vanderpoel +vane +vanguard +vanilla +vanish +vanity +vanquish +vantage +variable +variac +Varian +variant +variate +variegate +variety +various +varistor +Varitype +varnish +varsity +vary +vascular +vase +vasectomy +vasoconstriction +Vasquez +vassal +Vassar +vast +vat +Vatican +vaudeville +Vaudois +Vaughan +Vaughn +vault +veal +vector +vectorial +Veda +vee +veer +veery +Vega +vegetable +vegetarian +vegetate +vehement +vehicle +vehicular +veil +vein +velar +Velasquez +veldt +Vella +vellum +velocity +velours +velvet +velvety +venal +vend +vendetta +vendible +vendor +veneer +venerable +venerate +venereal +Venetian +venetian +Veneto +Venezuela +vengeance +vengeful +venial +Venice +venison +venom +venomous +venous +vent +ventilate +ventral +ventricle +ventriloquism +ventriloquist +venture +venturesome +venturi +Venus +Venusian +Vera +veracious +veracity +veranda +verandah +verb +verbal +verbatim +verbena +verbiage +verbose +verdant +Verde +Verdi +verdict +verge +veridic +verify +verisimilitude +veritable +verity +Verlag +vermeil +vermiculite +vermilion +vermin +Vermont +vermouth +Verna +vernacular +vernal +Verne +vernier +Vernon +Verona +Veronica +versa +Versailles +versatec +versatile +verse +version +versus +vertebra +vertebrae +vertebral +vertebrate +vertex +vertical +vertices +vertigo +verve +very +vesicular +vesper +vessel +vest +vestal +vestibule +vestige +vestigial +vestry +Vesuvius +vet +vetch +veteran +veterinarian +veterinary +veto +vex +vexation +vexatious +vi +via +viaduct +vial +vibrant +vibrate +vibrato +viburnum +vicar +vicarious +vice +viceroy +Vichy +vicinal +vicinity +vicious +vicissitude +Vicksburg +Vicky +victim +victor +Victoria +victorious +victory +victrola +victual +Vida +video +videotape +vie +Vienna +Viennese +Vientiane +Viet +Vietnam +Vietnamese +view +viewpoint +vigil +vigilant +vigilante +vignette +vigorous +vii +viii +Viking +Vikram +vile +vilify +villa +village +villain +villainous +villein +vinaigrette +Vincent +Vinci +vindicate +vindictive +vine +vinegar +vineyard +Vinson +vintage +vintner +vinyl +viola +violate +violent +violet +violin +viper +viral +Virgil +virgin +virginal +Virginia +Virgo +virgule +virile +virtual +virtue +virtuosi +virtuosity +virtuoso +virtuous +virulent +virus +visa +visage +viscera +visceral +viscid +viscoelastic +viscometer +viscosity +viscount +viscous +vise +Vishnu +visible +Visigoth +vision +visionary +visit +visitation +visitor +visor +vista +visual +vita +vitae +vital +vitamin +vitiate +Vito +vitreous +vitrify +vitriol +vitriolic +vitro +viva +vivace +vivacious +vivacity +Vivaldi +Vivian +vivid +vivify +viviparous +vivisection +vivo +vixen +viz +Vladimir +Vladivostok +vocable +vocabularian +vocabulary +vocal +vocalic +vocate +vociferous +vodka +Vogel +vogue +voice +voiceband +void +volatile +volcanic +volcanism +volcano +volcanoes +vole +volition +Volkswagen +volley +volleyball +Volstead +volt +Volta +voltage +voltaic +Voltaire +Volterra +voltmeter +voluble +volume +volumetric +voluminous +voluntary +volunteer +voluptuous +Volvo +vomit +von +voodoo +voracious +voracity +vortex +vortices +vorticity +Voss +votary +vote +votive +vouch +vouchsafe +Vought +vow +vowel +voyage +Vreeland +v's +vs +VT +Vulcan +vulgar +vulnerable +vulpine +vulture +vying +w +WA +Waals +Wabash +WAC +wack +wacke +wacky +Waco +wad +waddle +wade +wadi +Wadsworth +wafer +waffle +wag +wage +wagging +waggle +Wagner +wagoneer +wagonload +wah +Wahl +wail +wainscot +Wainwright +waist +waistcoat +waistline +wait +Waite +waitress +waive +wake +Wakefield +wakeful +waken +wakerobin +wakeup +Walcott +Walden +Waldo +Waldorf +Waldron +wale +Walgreen +walk +walkie +walkout +walkover +walkway +wall +walla +wallaby +Wallace +wallboard +Waller +wallet +Wallis +wallop +wallow +wallpaper +wally +walnut +Walpole +walrus +Walsh +Walt +Walter +Waltham +Walton +waltz +wan +wand +wander +wane +Wang +wangle +want +wanton +wapato +wapiti +Wappinger +war +warble +Warburton +ward +warden +wardrobe +wardroom +ware +warehouse +warehouseman +warehousemen +warfare +warhead +Waring +warm +warmhearted +warmish +warmonger +warmth +warmup +warn +warp +warplane +warrant +warranty +warren +warrior +Warsaw +wart +wartime +warty +Warwick +wary +was +wash +washbasin +washboard +washbowl +Washburn +Washington +washout +washy +wasn't +wasp +waspish +Wasserman +wast +wastage +waste +wastebasket +wasteful +wasteland +wastewater +wasting +wastrel +Watanabe +watch +watchband +watchdog +watchful +watchmake +watchman +watchmen +watchword +watchworks +water +Waterbury +watercourse +watercress +waterfall +waterfowl +waterfront +Watergate +waterhole +Waterhouse +waterline +Waterloo +Waterman +watermelon +waterproof +watershed +waterside +watertight +Watertown +waterway +watery +Watkins +Watson +watt +wattage +wattle +wave +waveform +wavefront +waveguide +wavelength +wavenumber +wavy +wax +waxen +waxwing +waxwork +waxy +way +waybill +waylaid +waylay +Wayne +wayside +wayward +we +weak +weaken +weal +wealth +wealthy +wean +weapon +weaponry +wear +wearisome +weary +weasel +weather +weatherbeaten +weatherproof +weatherstrip +weatherstripping +weave +web +Webb +weber +Webster +WECo +we'd +wed +wedge +wedlock +Wednesday +wee +weed +weedy +week +weekday +weekend +weep +Wehr +Wei +Weierstrass +weigh +weight +weighty +Weinberg +Weinstein +weir +weird +Weiss +Welch +welcome +weld +Weldon +welfare +we'll +well +wellbeing +Weller +Welles +Wellesley +wellington +wellwisher +welsh +welt +Wendell +Wendy +went +wept +we're +were +weren't +Werner +wert +Werther +Wesley +Wesleyan +west +westbound +Westchester +westerly +western +westernmost +Westfield +Westinghouse +Westminster +Weston +westward +wet +wetland +we've +Weyerhauser +whack +whale +whalebone +Whalen +wham +wharf +Wharton +wharves +what +what'd +whatever +Whatley +whatnot +what're +whatsoever +wheat +Wheatstone +whee +wheedle +wheel +wheelbarrow +wheelbase +wheelchair +wheelhouse +wheeze +wheezy +Whelan +whelk +Wheller +whelm +whelp +when +whence +whenever +where +whereabout +whereas +whereby +where'd +wherefore +wherein +whereof +whereon +where're +wheresoever +whereupon +wherever +wherewith +whet +whether +whey +which +whichever +whiff +whig +while +whim +whimper +whimsey +whimsic +whimsy +whine +whinny +whip +whiplash +Whippany +whippet +Whipple +whipsaw +whir +whirl +whirligig +whirlpool +whirlwind +whisk +whisper +whistle +whistleable +whit +Whitaker +Whitcomb +white +whiteface +Whitehall +whitehead +Whitehorse +whiten +whitetail +whitewash +whither +whitish +Whitlock +Whitman +Whitney +Whittaker +Whittier +whittle +whiz +whizzing +who +whoa +who'd +whodunit +whoever +whole +wholehearted +wholesale +wholesome +who'll +wholly +whom +whomever +whomsoever +whoop +whoopee +whoosh +whop +whore +whorl +whose +whosoever +whup +why +WI +Wichita +wick +wicket +wide +widen +widespread +widgeon +widget +widow +width +widthwise +wield +wiener +Wier +wife +wig +wigging +Wiggins +wiggle +wiggly +Wightman +wigmake +wigwam +Wilbur +Wilcox +wild +wildcat +wildcatter +wildebeest +wilderness +wildfire +wildflower +wildlife +wile +Wiley +Wilfred +wilful +Wilhelm +Wilhelmina +Wilkes +Wilkie +Wilkins +Wilkinson +will +Willa +Willard +willful +William +Williamsburg +Williamson +Willie +Willis +Willoughby +willow +willowy +Wilma +Wilmington +Wilshire +Wilson +wilt +wily +win +wince +winch +Winchester +wind +windbag +windblown +windbreak +windfall +windmill +window +windowpane +windowsill +windshield +Windsor +windstorm +windsurf +windswept +windup +windward +windy +wine +winemake +winemaster +winery +wineskin +Winfield +wing +wingback +wingbeat +wingman +wingmen +wingspan +wingspread +wingtip +Winifred +wink +winkle +Winnetka +Winnie +Winnipeg +Winnipesaukee +winnow +wino +Winslow +winsome +Winston +winter +wintergreen +wintertime +Winthrop +wintry +winy +wipe +wire +wireman +wiremen +wiry +Wisconsin +wisdom +wise +wiseacre +wisecrack +wisenheimer +wish +wishbone +wishful +wishy +wisp +wispy +wistful +wit +witch +witchcraft +with +withal +withdraw +withdrawal +withdrawn +withdrew +withe +wither +withheld +withhold +within +without +withstand +withstood +withy +witness +Witt +Wittgenstein +witty +wive +wizard +wobble +woe +woebegone +woeful +wok +woke +Wolcott +wold +wolf +Wolfe +Wolff +Wolfgang +wolfish +wolve +wolverine +woman +womb +wombat +women +won +wonder +wonderful +wonderland +wondrous +Wong +won't +wont +woo +wood +Woodard +Woodbury +woodcarver +woodchuck +woodcock +woodcut +wooden +woodgrain +woodhen +woodland +Woodlawn +woodlot +woodpeck +woodrow +woodruff +woodshed +woodside +Woodstock +woodward +woodwind +woodwork +woody +woodyard +wool +woolgather +Woolworth +Wooster +wop +Worcester +Worcestershire +word +Wordsworth +wordy +wore +work +workbench +workbook +workday +workforce +workhorse +workload +workman +workmen +workout +workpiece +workplace +worksheet +workshop +workspace +workstation +worktable +world +worldwide +worm +wormy +worn +worrisome +worry +worse +worsen +worship +worshipful +worst +worth +Worthington +worthwhile +worthy +Wotan +would +wouldn't +wound +wove +woven +wow +wrack +wraith +wrangle +wrap +wraparound +wrapup +wrasse +wrath +wrathful +wreak +wreath +wreathe +wreck +wreckage +wren +wrench +wrest +wrestle +wretch +wriggle +wright +Wrigley +wring +wrinkle +wrist +wristband +wristwatch +writ +write +writeup +writhe +writhing +written +wrong +wrongdoer +wrongdoing +wrongful +Wronskian +wrote +wrought +wry +w's +Wu +Wuhan +WV +WY +Wyandotte +Wyatt +Wyeth +Wylie +Wyman +Wyner +wynn +Wyoming +wysiwyg +x +Xavier +xenon +xenophobia +xerography +xerox +Xerxes +Xhosa +xi +x's +xylem +xylene +xylophone +y +yacht +yachtsman +yachtsmen +yah +yak +Yakima +Yale +Yalta +yam +Yamaha +yang +yank +Yankee +Yankton +Yaounde +yap +yapping +Yaqui +yard +yardage +yardstick +Yarmouth +yarmulke +yarn +yarrow +Yates +yaw +yawl +yawn +ye +yea +Yeager +yeah +year +yearbook +yearn +yeast +yeasty +Yeats +yell +yellow +yellowish +Yellowknife +Yellowstone +yelp +Yemen +yen +yeoman +yeomanry +yeomen +yeshiva +yesterday +yesteryear +yet +yew +Yiddish +yield +yin +yip +yipping +YMCA +yodel +Yoder +yoga +yoghurt +yogi +yogurt +yoke +yokel +Yokohama +Yokuts +yolk +yon +yond +Yonkers +yore +York +Yorkshire +Yorktown +Yosemite +Yost +you +you'd +you'll +young +youngish +youngster +Youngstown +your +you're +yourself +yourselves +youth +youthful +you've +yow +Ypsilanti +y's +ytterbium +yttrium +Yucatan +yucca +yuck +Yugoslav +Yugoslavia +yuh +Yuki +Yukon +yule +Yves +Yvette +YWCA +z +Zachary +zag +zagging +Zagreb +Zaire +Zambia +Zan +Zanzibar +zap +zazen +zeal +Zealand +zealot +zealous +zebra +Zeiss +Zellerbach +Zen +zenith +zero +zeroes +zeroth +zest +zesty +zeta +Zeus +Ziegler +zig +zigging +zigzag +zigzagging +zilch +zillion +Zimmerman +zinc +zing +zinnia +Zion +zip +zircon +zirconium +zither +zloty +zodiac +zodiacal +Zoe +Zomba +zombie +zone +zoo +zoology +zoom +zooplankton +Zorn +Zoroaster +Zoroastrian +zounds +z's +zucchini +Zulu +Zurich +zygote diff --git a/src/games/Makefile b/src/games/Makefile index 62d2ae2..af8d2d5 100644 --- a/src/games/Makefile +++ b/src/games/Makefile @@ -11,10 +11,9 @@ CFLAGS += -Werror -Wall -Os # Programs that live in subdirectories, and have makefiles of their own. # -SUBDIR = adventure backgammon battlestar rogue sail trek -# TODO: atc boggle btlgammon cribbage -# fortune hangman hunt mille monop phantasia quiz robots -# sail snake warp +SUBDIR = adventure atc backgammon battlestar boggle btlgammon \ + cribbage fortune hangman mille monop quiz robots rogue \ + sail snake trek # C programs that live in the current directory and do not need # explicit make lines. diff --git a/src/games/atc/.gitignore b/src/games/atc/.gitignore new file mode 100644 index 0000000..8130118 --- /dev/null +++ b/src/games/atc/.gitignore @@ -0,0 +1,2 @@ +atc +y.tab.h diff --git a/src/games/atc/Makefile b/src/games/atc/Makefile index 285e11c..90735f0 100644 --- a/src/games/atc/Makefile +++ b/src/games/atc/Makefile @@ -5,26 +5,37 @@ # # @(#)Makefile 5.1.2 (2.11BSD) 1999/10/25 # +TOPSRC = $(shell cd ../../..; pwd) +include $(TOPSRC)/target.mk +#include $(TOPSRC)/cross.mk -DESTDIR = -CFLAGS = -O -DSYSV -DDEST=\"${DESTDIR}/usr/games/lib/atc/\" -YFLAGS = -d -LIBS = -ll -lm -lcurses -ltermcap -OBJS = extern.o grammar.o input.o lex.o list.o log.o main.o tunable.o \ - graphics.o update.o +CFLAGS = -Os -g -Werror -Wall +CFLAGS += -DBSD -DDEST=\"/games/lib/atc/\" +#CFLAGS += -DSYSV -DDEST=\"games/\" +YFLAGS = -d +LEX = lex +LIBS = -lm -lcurses -ltermcap -lc +OBJS = extern.o grammar.o input.o lex.o list.o log.o main.o tunable.o \ + graphics.o update.o +MAN = atc.0 +MANSRC = atc.6 -all: atc +all: atc $(MAN) -atc: ${OBJS} - ${CC} ${OBJS} ${LIBS} -o $@ +atc: $(OBJS) + $(CC) $(LDFLAGS) -o atc.elf $(OBJS) $(LIBS) + $(OBJDUMP) -S atc.elf > atc.dis + $(SIZE) atc.elf + $(ELF2AOUT) atc.elf $@ && rm atc.elf + +${MAN}: ${MANSRC} + ${MANROFF} $< > $@ clean: - rm -f *.o core atc grammar.c y.tab.h y.tab.c lex.yy.c lex.c + rm -f *.o *.0 *.elf atc ${MAN} *.elf *.dis tags *~ grammar.c lex.c y.tab.h -install: - -[ -d ${DESTDIR}/usr/games/lib/atc ] || mkdir ${DESTDIR}/usr/games/lib/atc - chmod 700 ${DESTDIR}/usr/games/lib/atc - chown games.bin ${DESTDIR}/usr/games/lib/atc - (cd games; install -c -o games -g bin -m 600 * ${DESTDIR}/usr/games/lib/atc) - install -s -o games -g bin -m 4700 atc ${DESTDIR}/usr/games/hide/atc - (cd ${DESTDIR}/usr/games; rm -f atc; ln -s dm atc; chown games.bin atc) +install: all + install atc $(DESTDIR)/games/ + mkdir -p ${DESTDIR}/games/lib/atc + cp -p games/* ${DESTDIR}/games/lib/atc + cp ${MAN} $(DESTDIR)/share/man/cat6/ diff --git a/src/games/atc/atc.6 b/src/games/atc/atc.6 new file mode 100644 index 0000000..f43a52b --- /dev/null +++ b/src/games/atc/atc.6 @@ -0,0 +1,597 @@ +.\" Copyright (c) 1990, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" This code is derived from software contributed to Berkeley by +.\" Ed James. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)atc.6 8.1 (Berkeley) 5/31/93 +.\" +. \" XP - exdented paragraph +.de XP +.RT +.if \\n(1T .sp \\n(PDu +.ne 1.1 +.if !\\n(IP .nr IP +1 +.in +\\n(I\\n(IRu +.ti -\\n(I\\n(IRu +.. +.\" Copyright (c) 1986 Ed James. All rights reserved. +.\" +.TH ATC 6 "May 31, 1993" +.UC +.SH NAME +atc \- air traffic controller game +.SH SYNOPSIS +.B atc +-[u?lstp] [-[gf] game_name] [-r random seed] +.SH DESCRIPTION +.LP +.I Atc +lets you try your hand at the nerve wracking duties of the air traffic +controller without endangering the lives of millions of +travelers each year. +Your responsibilities require you to direct the flight of jets +and prop planes into and out of the flight arena and airports. +The speed (update time) and frequency of the planes depend on the +difficulty of the chosen arena. +.SH OPTIONS +.LP +.TP 8 +.B \-u +Print the usage line and exit. +.TP +.B \-? +Same as +.B \-u. +.TP +.B \-l +Print a list of available games and exit. +The first game name printed is the default game. +.TP +.B \-s +Print the score list (formerly the Top Ten list). +.TP +.B \-t +Same as +.B \-s. +.TP +.B \-p +Print the path to the special directory where +.I atc +expects to find its private files. This is used during the +installation of the program. +.TP +.B "\-g game" +Play the named game. If the game listed is not one of the +ones printed from the +.B \-l +option, the default game is played. +.TP +.B "\-f game" +Same as +.B \-g. +.TP +.B "\-r seed" +Set the random seed. The purpose of this flag is questionable. +.SH GOALS +.LP +Your goal in +.I atc +is to keep the game going as long as possible. +There is no winning state, except to beat the times of other players. +You will need to: launch planes at airports (by instructing them to +increase their altitude); land planes at airports (by instructing them to +go to altitude zero when exactly over the airport); and maneuver planes +out of exit points. +.LP +Several things will cause the end of the game. +Each plane has a destination (see information area), and +sending a plane to the wrong destination is an error. +Planes can run out of fuel, or can collide. Collision is defined as +adjacency in any of the three dimensions. A plane leaving the arena +in any other way than through its destination exit is an error as well. +.LP +Scores are sorted in order of the number of planes safe. The other +statistics are provided merely for fun. There is no penalty for +taking longer than another player (except in the case of ties). +.LP +Suspending a game is not permitted. If you get a talk message, tough. +When was the last time an Air Traffic Controller got called away to +the phone? +.SH "THE DISPLAY" +.LP +Depending on the terminal you run +.I atc +on, the screen will be divided into 4 areas. +It should be stressed that the terminal driver portion of the +game was designed to be reconfigurable, so the display format can vary +depending the version you are playing. The descriptions here are based +on the ascii version +of the game. The game rules and input format, however, +should remain consistent. +Control-L redraws the screen, should it become muddled. +.SS RADAR +.IP +The first screen area is the radar display, showing the relative locations +of the planes, airports, standard entry/exit points, radar +beacons, and "lines" which simply serve to aid you in guiding +the planes. +.IP +Planes are shown as a single letter with an altitude. If +the numerical altitude is a single digit, then it represents +thousands of feet. +Some distinction is made between the prop +planes and the jets. On ascii terminals, prop planes are +represented by a upper case letter, jets by a lower case letter. +.IP +Airports are shown as a number and some indication of the direction +planes must be going to land at the airport. +On ascii terminals, this is one of '^', '>', '<', and 'v', to indicate +north (0 degrees), east (90), west (270) and south (180), respectively. +The planes will also +take off in this direction. +.IP +Beacons are represented as circles or asterisks and a number. +Their purpose is to offer a place of easy reference to the plane pilots. +See 'the delay command' under the input section of this manual. +.IP +Entry/exit points are displayed as numbers along the border of the +radar screen. Planes will enter the arena from these points without +warning. These points have a direction associated with them, and +planes will always enter the arena from this direction. On the +ascii version of +.I atc, +this direction is not displayed. It will become apparent +what this direction is as the game progresses. +.IP +Incoming planes will always enter at the same altitude: 7000 feet. +For a plane to successfully depart through an entry/exit point, +it must be flying at 9000 feet. +It is not necessary for the planes to be flying in any particular +direction when they leave the arena (yet). +.SS "INFORMATION AREA" +.IP +The second area of the display is the information area, which lists +the time (number of updates since start), and the number of planes you +have directed safely out of the arena. +Below this is a list of planes currently in the air, followed by a +blank line, and then a list of planes on the ground (at airports). +Each line lists the plane name and its current altitude, +an optional asterisk indicating low fuel, the plane's destination, +and the plane's current command. Changing altitude is not considered +to be a command and is therefore not displayed. The following are +some possible information lines: +.IP + B4*A0: Circle @ b1 +.br + g7 E4: 225 +.IP +The first example shows a prop plane named 'B' that is flying at 4000 +feet. It is low on fuel (note the '*'). It's destination is +Airport #0. +The next command it expects +to do is circle when it reaches Beacon #1. +The second example shows a jet named 'g' at 7000 feet, destined for +Exit #4. It is just now executing a turn to 225 degrees (South-West). +.SS "INPUT AREA" +.IP +The third area of the display is the input area. It is here that +your input is reflected. See the INPUT heading of this manual +for more details. +.SS "AUTHOR AREA" +.IP +This area is used simply to give credit where credit is due. :-) +.SH INPUT +.LP +A command completion interface is built into +the game. At any time, typing '?' will list possible input characters. +Typing a backspace (your erase character) backs up, erasing the last part +of the command. When a command is complete, a return enters it, and +any semantic checking is done at that time. If no errors are detected, +the command is sent to the appropriate plane. If an error is discovered +during the check, the offending statement will be underscored and a +(hopefully) descriptive message will be printed under it. +.LP +The command syntax is broken into two parts: +.I "Immediate Only" +and +.I Delayable +commands. +.I "Immediate Only" +commands happen on the next +update. +.I Delayable +commands also happen on the next update unless they +are followed by an optional predicate called the +.I Delay +command. +.LP +In the following tables, the syntax +.B [0\-9] +means any single digit, and +.B +refers to the keys around the 's' key, namely ``wedcxzaq''. +In absolute references, 'q' refers to North-West or 315 degrees, and 'w' +refers to North, or 0 degrees. +In relative references, 'q' refers to -45 degrees or 45 degrees left, and 'w' +refers to 0 degrees, or no change in direction. +.LP +All commands start with a plane letter. This indicates the recipient +of the command. Case is ignored. +.SS "IMMEDIATE ONLY COMMANDS" +.RS +.B "\- a Altitude:" +.RS +Affect a plane's altitude (and take off). +.RE +.RS +.B "\- [0\-9] Number:" +.RS +Go to the given altitude (thousands of feet). +.RE +.B "\- c/+ Climb:" +.RS +Relative altitude change. +.RE +.RS +.B "\- [0\-9] Number:" +.RS +Difference in thousands of feet. +.RE +.RE +.B "\- d/\- Descend:" +.RS +Relative altitude change. +.RE +.RS +.B "\- [0\-9] Number:" +.RS +Difference in thousands of feet. +.RE +.RE +.RE +.B "\- m Mark:" +.RS +Display in highlighted mode. Command is displayed normally. +.RE +.B "\- i Ignore:" +.RS +Do not display highlighted. Command is displayed as a +line of dashes if there is no command. +.RE +.B "\- u Unmark:" +.RS +Same as ignore, but if a delayed command is processed, +the plane will become marked. This is useful if you want +to forget about a plane during part, but not all, of its +journey. +.RE +.RE +.SS "DELAYABLE COMMANDS" +.RS +.B "\- c Circle:" +.RS +Have the plane circle (clockwise by default). +.RE +.RS +.B "\- l Left:" +.RS +Circle counterclockwise. +.RE +.B "\- r Right:" +.RS +Circle clockwise. +.RE +.RE +.B "\- t Turn:" +.RS +Change direction. +.RE +.RS +.B "\- l Left:" +.RS +Turn counterclockwise (45 degrees by default). +.RE +.RS +.B "\- Direction:" +.RS +Turn ccw the given number of degrees. +Zero degrees is no turn. A ccw turn +of -45 degrees is 45 cw. +.RE +.RE +.B "\- r Right:" +.RS +Turn clockwise (45 degrees by default). +.RE +.RS +.B "\- Direction:" +.RS +Same as turn left . +.RE +.RE +.B "\- L Left 90:" +.RS +Turn counterclockwise 90 degrees. +.RE +.B "\- R Right 90:" +.RS +Turn clockwise 90 degrees. +.RE +.B "\- Direction:" +.RS +Turn to the absolute compass heading given. +The shortest turn will be taken. +.RE +.B "\- t Towards:" +.RS +Turn towards a beacon, airport or exit. The turn is +just an estimate. +.RE +.RS +.B "\- b/* Beacon:" +.RS +Turn towards the beacon. +.RE +.RS +.B "\- [0-9] Number:" +.RS +The beacon number. +.RE +.RE +.B "\- e Exit:" +.RS +Turn towards the exit. +.RE +.RS +.B "\- [0-9] Number:" +.RS +The exit number. +.RE +.RE +.B "\- a Airport:" +.RS +Turn towards the airport. +.RE +.RS +.B "\- [0-9] Number:" +.RS +The airport number. +.RE +.RE +.RE +.RE +.RE +.SS THE DELAY COMMAND +.LP +The +.B Delay +(a/@) +command may be appended to any +.B Delayable +command. It allows the controller to instruct a plane to do an action +when the plane reaches a particular beacon (or other objects in future +versions). +.sp +.RS +.B "\- a/@ At:" +.RS +Do the given delayable command when the plane reaches the given beacon. +.RE +.RS +.B "\- b/* Beacon:" +.RS +This is redundant to allow for expansion. +.RE +.RS +.B "\- [0-9] Number:" +.RS +The beacon number. +.RE +.RE +.RE +.RE +.SS "MARKING, UNMARKING AND IGNORING" +.LP +Planes are +.B marked +when they enter the arena. This means they are displayed in highlighted +mode on the radar display. A plane may also be either +.B unmarked +or +.B ignored. +An +.B unmarked +plane is drawn in unhighlighted mode, and a line of dashes is displayed in +the command field of the information area. The plane will remain this +way until a mark command has been issued. Any other command will be issued, +but the command line will return to a line of dashes when the command +is completed. +.LP +An +.B ignored +plane is treated the same as an unmarked plane, except that it will +automatically switch to +.B marked +status when a delayed command has been processed. This is useful if +you want to forget about a plane for a while, but its flight path has +not yet been completely set. +.LP +As with all of the commands, marking, unmarking and ignoring will take effect +at the beginning of the next update. Do not be surprised if the plane does +not immediately switch to unhighlighted mode. +.SS EXAMPLES +.RS +.TP 16 +atlab1 +a: turn left at beacon #1 +.TP 16 +cc +C: circle +.TP 16 +gtte4ab2 +g: turn towards exit #4 at beacon #2 +.TP 16 +ma+2 +m: altitude: climb 2000 feet +.TP 16 +stq +S: turn to 315 +.TP 16 +xi +x: ignore +.RE +.SH "OTHER INFORMATION" +.LP +Jets move every update; prop planes move every other update. +.LP +All planes turn a most 90 degrees per movement. +.LP +Planes enter at 7000 feet and leave at 9000 feet. +.LP +Planes flying at an altitude of 0 crash if they are not over an airport. +.LP +Planes waiting at airports can only be told to take off (climb in altitude). +.SH "NEW GAMES" +.LP +The +.B Game_List +file lists the currently available play fields. New field description +file names must be placed in this file to be 'playable'. If a player +specifies a game not in this file, his score will not be logged. +.LP +The game field description files are broken into two parts. The first +part is the definition section. Here, the four tunable game parameters +must be set. These variables are set with the syntax: +.IP +variable = number; +.LP +Variable may be one of: +.B update, +indicating the number of seconds between forced updates; +.B newplane, +indicating (about) the number of updates between new plane entries; +.B width, +indicating the width of the play field; and +.B height, +indicating the height of the play field. +.LP +The second part of the field description files describes the locations +of the exits, the beacons, the airports and the lines. +The syntax is as follows: +.IP +beacon: (x y) ... ; +.br +airport: (x y direction) ... ; +.br +exit: (x y direction) ... ; +.br +line: [ (x1 y1) (x2 y2) ] ... ; +.LP +For beacons, a simple x, y coordinate pair is used (enclosed in parenthesis). +Airports and exits require a third value, a direction, which is one +of +.B wedcxzaq. +For airports, this is the direction that planes must be going to take +off and land, and for exits, this is the direction that planes will going +when they +.B enter +the arena. This may not seem intuitive, but as there is no restriction on +direction of exit, this is appropriate. +Lines are slightly different, since they need two coordinate pairs to +specify the line endpoints. These endpoints must be enclosed in +square brackets. +.LP +All statements are semi-colon (;) terminated. Multiple item statements +accumulate. Each definition must occur exactly once, before any +item statements. Comments begin with a hash (#) symbol +and terminate with a newline. +The coordinates are between zero and width-1 and height-1 +inclusive. All of the exit coordinates must lie on the borders, and +all of the beacons and airports must lie inside of the borders. +Line endpoints may be anywhere within the field, so long as +the lines are horizontal, vertical or +.B "exactly diagonal." +.SS "FIELD FILE EXAMPLE" +.RS +.sp +.nf +.TA 1i 1i +.ta 1i 1i +# This is the default game. + +update = 5; +newplane = 5; +width = 30; +height = 21; + +exit: ( 12 0 x ) ( 29 0 z ) ( 29 7 a ) ( 29 17 a ) + ( 9 20 e ) ( 0 13 d ) ( 0 7 d ) ( 0 0 c ) ; + +beacon: ( 12 7 ) ( 12 17 ) ; + +airport: ( 20 15 w ) ( 20 18 d ) ; + +line: [ ( 1 1 ) ( 6 6 ) ] + [ ( 12 1 ) ( 12 6 ) ] + [ ( 13 7 ) ( 28 7 ) ] + [ ( 28 1 ) ( 13 16 ) ] + [ ( 1 13 ) ( 11 13 ) ] + [ ( 12 8 ) ( 12 16 ) ] + [ ( 11 18 ) ( 10 19 ) ] + [ ( 13 17 ) ( 28 17 ) ] + [ ( 1 7 ) ( 11 7 ) ] ; +.fi +.RE +.SH FILES +.LP +Files are kept in a special directory. See the OPTIONS for a way to +print this path out. +.TP 16 +.B ATC_score +Where the scores are kept. +.TP 16 +.B Game_List +The list of playable games. +.SH AUTHOR +.LP +Ed James, UC Berkeley: edjames@ucbvax.berkeley.edu, ucbvax!edjames +.LP +This game is based on someone's description of the overall flavor +of a game written for some unknown PC many years ago, maybe. +.SH BUGS +.LP +The screen sometimes refreshes after you have quit. +.LP +Yet Another Curses Bug was discovered during the development of this game. +If your curses library clrtobot.o is version 5.1 or earlier, +you will have erase problems with the backspace operator in the input +window. diff --git a/src/games/atc/extern.c b/src/games/atc/extern.c index 203ee8b..94376e2 100644 --- a/src/games/atc/extern.c +++ b/src/games/atc/extern.c @@ -12,7 +12,7 @@ char GAMES[] = "Game_List", LOG[] = "ATC_scores"; -int clock, safe_planes, start_time, test_mode; +int clocktick, safe_planes, start_time, test_mode; char *file; diff --git a/src/games/atc/extern.h b/src/games/atc/extern.h index c4ef642..3590f1c 100644 --- a/src/games/atc/extern.h +++ b/src/games/atc/extern.h @@ -9,7 +9,7 @@ extern char GAMES[], LOG[], *file; -extern int clock, safe_planes, start_time, test_mode; +extern int clocktick, safe_planes, start_time, test_mode; extern FILE *filein, *fileout; @@ -22,3 +22,29 @@ extern struct sgttyb tty_start, tty_new; extern DISPLACEMENT displacement[MAXDIR]; extern PLANE *findplane(), *newplane(); + +int dir_no(int ch); +void ioclrtoeol(int pos); +void iomove(int pos); +void ioaddstr(int pos, char *str); +void ioclrtobot(void); +int getAChar(void); +void done_screen(void); +void redraw(void); +void ioerror(int pos, int len, char *str); +int number(int l); +void loser(PLANE *p, char *s); +void init_gr(void); +int yyparse(void); +void setup_screen(C_SCREEN *scp); +int addplane(void); +void log_score(int list_em); +void quit(int sig); +void update(int sig); +int getcommand(void); +void planewin(void); +int name(PLANE *p); +void erase_all(void); +void append(LIST *l, PLANE *p); +void delete(LIST *l, PLANE *p); +void draw_all(void); diff --git a/src/games/atc/grammar.y b/src/games/atc/grammar.y index 519bfd7..5290f5e 100644 --- a/src/games/atc/grammar.y +++ b/src/games/atc/grammar.y @@ -27,12 +27,15 @@ int errors = 0; int line = 1; + +int yylex(void); +int yyerror(char *s); %} %% file: bunch_of_defs { if (checkdefs() < 0) return (errors); } bunch_of_lines - { + { if (sp->num_exits + sp->num_airports < 2) yyerror("Need at least 2 airports and/or exits."); return (errors); @@ -83,7 +86,7 @@ hdef: else if ($3 < 3) return (yyerror("'height' is too small.")); else - sp->height = $3; + sp->height = $3; } ; @@ -95,7 +98,7 @@ wdef: else if ($3 < 3) return (yyerror("'width' is too small.")); else - sp->width = $3; + sp->width = $3; } ; @@ -133,7 +136,7 @@ Bpoint: + REALLOC) * sizeof (BEACON)); else sp->beacon = (BEACON *) realloc(sp->beacon, - (sp->num_beacons + REALLOC) * + (sp->num_beacons + REALLOC) * sizeof (BEACON)); if (sp->beacon == NULL) return (yyerror("No memory available.")); @@ -159,11 +162,11 @@ Epoint: if (sp->num_exits % REALLOC == 0) { if (sp->exit == NULL) - sp->exit = (EXIT *) malloc((sp->num_exits + + sp->exit = (EXIT *) malloc((sp->num_exits + REALLOC) * sizeof (EXIT)); else sp->exit = (EXIT *) realloc(sp->exit, - (sp->num_exits + REALLOC) * + (sp->num_exits + REALLOC) * sizeof (EXIT)); if (sp->exit == NULL) return (yyerror("No memory available.")); @@ -196,7 +199,7 @@ Apoint: + REALLOC) * sizeof(AIRPORT)); else sp->airport = (AIRPORT *) realloc(sp->airport, - (sp->num_airports + REALLOC) * + (sp->num_airports + REALLOC) * sizeof(AIRPORT)); if (sp->airport == NULL) return (yyerror("No memory available.")); @@ -223,7 +226,7 @@ Lline: { if (sp->num_lines % REALLOC == 0) { if (sp->line == NULL) - sp->line = (LINE *) malloc((sp->num_lines + + sp->line = (LINE *) malloc((sp->num_lines + REALLOC) * sizeof (LINE)); else sp->line = (LINE *) realloc(sp->line, @@ -242,14 +245,14 @@ Lline: ; %% -check_edge(x, y) +void check_edge(x, y) { - if (!(x == 0) && !(x == sp->width - 1) && + if (!(x == 0) && !(x == sp->width - 1) && !(y == 0) && !(y == sp->height - 1)) yyerror("edge value not on edge."); } -check_point(x, y) +void check_point(x, y) { if (x < 1 || x >= sp->width - 1) yyerror("X value out of range."); @@ -257,7 +260,7 @@ check_point(x, y) yyerror("Y value out of range."); } -check_linepoint(x, y) +void check_linepoint(x, y) { if (x < 0 || x >= sp->width) yyerror("X value out of range."); @@ -265,7 +268,7 @@ check_linepoint(x, y) yyerror("Y value out of range."); } -check_line(x1, y1, x2, y2) +void check_line(x1, y1, x2, y2) { int d1, d2; @@ -279,7 +282,7 @@ check_line(x1, y1, x2, y2) yyerror("Bad line endpoints."); } -yyerror(s) +int yyerror(char *s) { fprintf(stderr, "\"%s\": line %d: %s\n", file, line, s); errors++; @@ -287,7 +290,7 @@ yyerror(s) return (errors); } -check_edir(x, y, dir) +void check_edir(x, y, dir) { int bad = 0; @@ -299,7 +302,7 @@ check_edir(x, y, dir) y = 2; else if (y != 0) y = 1; - + switch (x * 10 + y) { case 00: if (dir != 3) bad++; break; case 01: if (dir < 1 || dir > 3) bad++; break; @@ -318,11 +321,11 @@ check_edir(x, y, dir) yyerror("Bad direction for entrance at exit."); } -check_adir(x, y, dir) +void check_adir(x, y, dir) { } -checkdefs() +int checkdefs() { int err = 0; diff --git a/src/games/atc/graphics.c b/src/games/atc/graphics.c index f655f89..d72a0b9 100644 --- a/src/games/atc/graphics.c +++ b/src/games/atc/graphics.c @@ -22,7 +22,7 @@ WINDOW *radar, *cleanradar, *credit, *input, *planes; -getAChar() +int getAChar() { #ifdef BSD return (getchar()); @@ -35,7 +35,7 @@ getAChar() #endif } -erase_all() +void erase_all() { PLANE *pp; @@ -49,7 +49,7 @@ erase_all() } } -draw_all() +void draw_all() { PLANE *pp; @@ -68,19 +68,37 @@ draw_all() fflush(stdout); } -init_gr() +void init_gr() { static char buffer[BUFSIZ]; initscr(); setbuf(stdout, buffer); input = newwin(INPUT_LINES, COLS - PLANE_COLS, LINES - INPUT_LINES, 0); - credit = newwin(INPUT_LINES, PLANE_COLS, LINES - INPUT_LINES, + credit = newwin(INPUT_LINES, PLANE_COLS, LINES - INPUT_LINES, COLS - PLANE_COLS); planes = newwin(LINES - INPUT_LINES, PLANE_COLS, 0, COLS - PLANE_COLS); } -setup_screen(scp) +void draw_line(w, x, y, lx, ly, s) + WINDOW *w; + char *s; +{ + int dx, dy; + + dx = SGN(lx - x); + dy = SGN(ly - y); + for (;;) { + wmove(w, y, x * 2); + waddstr(w, s); + if (x == lx && y == ly) + break; + x += dx; + y += dy; + } +} + +void setup_screen(scp) C_SCREEN *scp; { register int i, j; @@ -164,32 +182,14 @@ setup_screen(scp) wmove(radar, scp->airport[i].y, scp->airport[i].x * 2); waddstr(radar, str); } - + overwrite(radar, cleanradar); wrefresh(radar); wrefresh(credit); fflush(stdout); } -draw_line(w, x, y, lx, ly, s) - WINDOW *w; - char *s; -{ - int dx, dy; - - dx = SGN(lx - x); - dy = SGN(ly - y); - for (;;) { - wmove(w, y, x * 2); - waddstr(w, s); - if (x == lx && y == ly) - break; - x += dx; - y += dy; - } -} - -ioclrtoeol(pos) +void ioclrtoeol(pos) { wmove(input, 0, pos); wclrtoeol(input); @@ -197,14 +197,14 @@ ioclrtoeol(pos) fflush(stdout); } -iomove(pos) +void iomove(pos) { wmove(input, 0, pos); wrefresh(input); fflush(stdout); } -ioaddstr(pos, str) +void ioaddstr(pos, str) char *str; { wmove(input, 0, pos); @@ -213,14 +213,14 @@ ioaddstr(pos, str) fflush(stdout); } -ioclrtobot() +void ioclrtobot() { wclrtobot(input); wrefresh(input); fflush(stdout); } -ioerror(pos, len, str) +void ioerror(pos, len, str) char *str; { int i; @@ -234,7 +234,7 @@ ioerror(pos, len, str) fflush(stdout); } -quit() +void quit(int sig) { int c, y, x; #ifdef BSD @@ -271,10 +271,9 @@ quit() wmove(input, y, x); wrefresh(input); fflush(stdout); - return; } -planewin() +void planewin() { PLANE *pp; char *command(); @@ -289,7 +288,7 @@ planewin() #ifdef SYSV wclrtobot(planes); #endif - wprintw(planes, "Time: %-4d Safe: %d", clock, safe_planes); + wprintw(planes, "Time: %-4d Safe: %d", clocktick, safe_planes); wmove(planes, 2, 0); waddstr(planes, "pl dt comm"); @@ -317,7 +316,7 @@ planewin() fflush(stdout); } -loser(p, s) +void loser(p, s) PLANE *p; char *s; { @@ -351,7 +350,7 @@ loser(p, s) exit(0); } -redraw() +void redraw() { clear(); refresh(); @@ -370,7 +369,7 @@ redraw() } -done_screen() +void done_screen() { clear(); refresh(); diff --git a/src/games/atc/include.h b/src/games/atc/include.h index 084a3e5..66e3858 100644 --- a/src/games/atc/include.h +++ b/src/games/atc/include.h @@ -8,11 +8,20 @@ */ #include +#include #include -#ifdef SYSV +#include +#include +#include #include +#include +#include +#include +#ifdef SYSV +#include #endif #include +#include #ifdef BSD #include @@ -21,25 +30,17 @@ #endif #ifdef SYSV -#include -#include -#include -#include +#include #endif #include #include - #include -#ifdef SYSV -#define index strchr -#define rindex strrchr #define bcopy(a,b,c) memcpy((b), (a), (c)) #define bzero(a,b) memset((a), '\0', (b)) -#define srandom srand -#define random rand -#define sgttyb termio +#ifdef SYSV +#define sgttyb termios #define sg_erase c_cc[2] #define sg_kill c_cc[3] #endif diff --git a/src/games/atc/input.c b/src/games/atc/input.c index 7a31b54..6965900 100644 --- a/src/games/atc/input.c +++ b/src/games/atc/input.c @@ -6,11 +6,6 @@ * * For more info on this and all of my stuff, mail edjames@berkeley.edu. */ - -#ifndef lint -static char sccsid[] = "@(#)input.c 1.2 (Berkeley) 10/22/87"; -#endif not lint - #include "include.h" #define MAXRULES 6 @@ -56,8 +51,8 @@ typedef struct { #define NUMSTATES NUMELS(st) -char *setplane(), *circle(), *left(), *right(), *Left(), *Right(), - *beacon(), *ex_it(), *climb(), *descend(), *setalt(), *setrelalt(), +char *setplane(), *circle(), *left(), *right(), *Left(), *Right(), + *beacon(), *ex_it(), *climb(), *descend(), *setalt(), *setrelalt(), *benum(), *to_dir(), *rel_dir(), *delayb(), *mark(), *unmark(), *airport(), *turn(), *ignore(); @@ -67,17 +62,17 @@ RULE state0[] = { { ALPHATOKEN, 1, "%c:", setplane}, { CRTOKEN, -1, "", NULL }, #endif { HELPTOKEN, 12, " [a-z]", NULL }}, - state1[] = { { 't', 2, " turn", turn }, - { 'a', 3, " altitude:", NULL }, + state1[] = { { 't', 2, " turn", turn }, + { 'a', 3, " altitude:", NULL }, { 'c', 4, " circle", circle }, { 'm', 7, " mark", mark }, { 'u', 7, " unmark", unmark }, { 'i', 7, " ignore", ignore }, { HELPTOKEN, 12, " tacmui", NULL }}, - state2[] = { { 'l', 6, " left", left }, - { 'r', 6, " right", right }, + state2[] = { { 'l', 6, " left", left }, + { 'r', 6, " right", right }, { 'L', 4, " left 90", Left }, - { 'R', 4, " right 90", Right }, + { 'R', 4, " right 90", Right }, { 't', 11, " towards", NULL }, { 'w', 4, " to 0", to_dir }, { 'e', 4, " to 45", to_dir }, @@ -88,14 +83,14 @@ RULE state0[] = { { ALPHATOKEN, 1, "%c:", setplane}, { 'a', 4, " to 270", to_dir }, { 'q', 4, " to 315", to_dir }, { HELPTOKEN, 12, " lrLRt", NULL }}, - state3[] = { { '+', 10, " climb", climb }, - { 'c', 10, " climb", climb }, - { '-', 10, " descend", descend }, - { 'd', 10, " descend", descend }, + state3[] = { { '+', 10, " climb", climb }, + { 'c', 10, " climb", climb }, + { '-', 10, " descend", descend }, + { 'd', 10, " descend", descend }, { NUMTOKEN, 7, " %c000 feet", setalt }, { HELPTOKEN, 12, " +-cd[0-9]", NULL }}, - state4[] = { { '@', 9, " at", NULL }, - { 'a', 9, " at", NULL }, + state4[] = { { '@', 9, " at", NULL }, + { 'a', 9, " at", NULL }, { RETTOKEN, -1, "", NULL }, #ifdef SYSV { CRTOKEN, -1, "", NULL }, @@ -113,9 +108,9 @@ RULE state0[] = { { ALPHATOKEN, 1, "%c:", setplane}, { 'z', 4, " 225", rel_dir }, { 'a', 4, " 270", rel_dir }, { 'q', 4, " 315", rel_dir }, - { RETTOKEN, -1, "", NULL }, + { RETTOKEN, -1, "", NULL }, #ifdef SYSV - { CRTOKEN, -1, "", NULL }, + { CRTOKEN, -1, "", NULL }, #endif { HELPTOKEN, 12, " @a",NULL }}, state7[] = { { RETTOKEN, -1, "", NULL }, @@ -130,7 +125,7 @@ RULE state0[] = { { ALPHATOKEN, 1, "%c:", setplane}, { HELPTOKEN, 12, " b*", NULL }}, state10[] = { { NUMTOKEN, 7, " %c000 ft", setrelalt}, { HELPTOKEN, 12, " [0-9]", NULL }}, - state11[] = { { 'b', 8, " beacon #", beacon }, + state11[] = { { 'b', 8, " beacon #", beacon }, { '*', 8, " beacon #", beacon }, { 'e', 8, " exit #", ex_it }, { 'a', 8, " airport #", airport }, @@ -153,7 +148,7 @@ int level; int tval; int dest_type, dest_no, dir; -pop() +int pop() { if (level == 0) return (-1); @@ -167,7 +162,7 @@ pop() return (0); } -rezero() +void rezero() { iomove(0); @@ -179,7 +174,7 @@ rezero() strcpy(T_STR, ""); } -push(ruleno, ch) +void push(ruleno, ch) { int newstate, newpos; @@ -200,7 +195,77 @@ push(ruleno, ch) strcpy(T_STR, ""); } -getcommand() +int gettoken() +{ + while ((tval = getAChar()) == REDRAWTOKEN || tval == SHELLTOKEN) + { + if (tval == SHELLTOKEN) + { +#ifdef BSD + struct itimerval itv; + itv.it_value.tv_sec = 0; + itv.it_value.tv_usec = 0; + setitimer(ITIMER_REAL, &itv, NULL); +#endif +#ifdef SYSV + int aval; + aval = alarm(0); +#endif + if (fork() == 0) /* child */ + { + char *shell, *base, *getenv(), *strrchr(); + + setuid(getuid()); /* turn off setuid bit */ + done_screen(); + + /* run user's favorite shell */ + if ((shell = getenv("SHELL")) != NULL) + { + base = strrchr(shell, '/'); + if (base == NULL) + base = shell; + else + base++; + execl(shell, base, (char*)0); + } + else + execl("/bin/sh", "sh", (char*)0); + + exit(0); /* oops */ + } + + wait(0); +#ifdef BSD + ioctl(fileno(stdin), TIOCSETP, &tty_new); + itv.it_value.tv_sec = 0; + itv.it_value.tv_usec = 1; + itv.it_interval.tv_sec = sp->update_secs; + itv.it_interval.tv_usec = 0; + setitimer(ITIMER_REAL, &itv, NULL); +#endif +#ifdef SYSV + ioctl(fileno(stdin), TCSETAW, &tty_new); + alarm(aval); +#endif + } + redraw(); + } + + if (isdigit(tval)) + return (NUMTOKEN); + else if (isalpha(tval)) + return (ALPHATOKEN); + else + return (tval); +} + +void noise() +{ + putchar('\07'); + fflush(stdout); +} + +int getcommand() { int c, i, done; char *s, *(*func)(); @@ -235,7 +300,7 @@ getcommand() return (1); /* forced update */ dest_type = T_NODEST; - + for (i = 0; i < level; i++) { func = st[stack[i].state].rule[stack[i].rule].func; if (func != NULL) @@ -258,76 +323,6 @@ getcommand() return (0); } -noise() -{ - putchar('\07'); - fflush(stdout); -} - -gettoken() -{ - while ((tval = getAChar()) == REDRAWTOKEN || tval == SHELLTOKEN) - { - if (tval == SHELLTOKEN) - { -#ifdef BSD - struct itimerval itv; - itv.it_value.tv_sec = 0; - itv.it_value.tv_usec = 0; - setitimer(ITIMER_REAL, &itv, NULL); -#endif -#ifdef SYSV - int aval; - aval = alarm(0); -#endif - if (fork() == 0) /* child */ - { - char *shell, *base, *getenv(), *strrchr(); - - setuid(getuid()); /* turn off setuid bit */ - done_screen(); - - /* run user's favorite shell */ - if ((shell = getenv("SHELL")) != NULL) - { - base = strrchr(shell, '/'); - if (base == NULL) - base = shell; - else - base++; - execl(shell, base, 0); - } - else - execl("/bin/sh", "sh", 0); - - exit(0); /* oops */ - } - - wait(0); -#ifdef BSD - ioctl(fileno(stdin), TIOCSETP, &tty_new); - itv.it_value.tv_sec = 0; - itv.it_value.tv_usec = 1; - itv.it_interval.tv_sec = sp->update_secs; - itv.it_interval.tv_usec = 0; - setitimer(ITIMER_REAL, &itv, NULL); -#endif -#ifdef SYSV - ioctl(fileno(stdin), TCSETAW, &tty_new); - alarm(aval); -#endif - } - redraw(); - } - - if (isdigit(tval)) - return (NUMTOKEN); - else if (isalpha(tval)) - return (ALPHATOKEN); - else - return (tval); -} - char * setplane(c) { @@ -604,10 +599,9 @@ ignore(c) return (NULL); } -dir_no(ch) - char ch; +int dir_no(ch) { - int dir; + int dir = 0; switch (ch) { case 'w': dir = 0; break; diff --git a/src/games/atc/lex.l b/src/games/atc/lex.l index dde6315..d0b0520 100644 --- a/src/games/atc/lex.l +++ b/src/games/atc/lex.l @@ -8,9 +8,13 @@ * For more info on this and all of my stuff, mail edjames@berkeley.edu. */ +#define YY_NO_INPUT +#define YY_SKIP_YYWRAP #include "y.tab.h" +#define yywrap() 0 extern int line; %} +%option nounput %% [0-9]+ { yylval.ival = atoi(yytext); return(ConstOp); } height { return(HeightOp); } diff --git a/src/games/atc/list.c b/src/games/atc/list.c index 5498e59..d9d6f4f 100644 --- a/src/games/atc/list.c +++ b/src/games/atc/list.c @@ -15,7 +15,7 @@ newplane() return ((PLANE *) calloc(1, sizeof (PLANE))); } -append(l, p) +void append(l, p) LIST *l; PLANE *p; { @@ -53,13 +53,13 @@ append(l, p) } } -delete(l, p) +void delete(l, p) LIST *l; PLANE *p; { if (l->head == NULL) loser(p, "deleted a non-existant plane! Get help!"); - + if (l->head == p && l->tail == p) l->head = l->tail = NULL; else if (l->head == p) { diff --git a/src/games/atc/log.c b/src/games/atc/log.c index cf92d85..9f96c4e 100644 --- a/src/games/atc/log.c +++ b/src/games/atc/log.c @@ -6,14 +6,9 @@ * * For more info on this and all of my stuff, mail edjames@berkeley.edu. */ - -#ifndef lint -static char sccsid[] = "@(#)log.c 1.4 (Berkeley) 12/26/87"; -#endif not lint - #include "include.h" -compar(a, b) +int compar(a, b) SCORE *a, *b; { if (b->planes == a->planes) @@ -51,16 +46,14 @@ timestr(t) return (s); } -log_score(list_em) +void log_score(list_em) { register int i, fd, num_scores = 0, good, changed = 0, found = 0; struct passwd *pw; FILE *fp; - char *cp, logstr[BUFSIZ], *index(), *rindex(); + char *cp, logstr[BUFSIZ]; SCORE score[100], thisscore; -#ifdef SYSV struct utsname name; -#endif strcpy(logstr, SPECIAL_DIR); strcat(logstr, LOG); @@ -69,16 +62,16 @@ log_score(list_em) fd = open(logstr, O_CREAT|O_RDWR, 0644); if (fd < 0) { perror(logstr); - return (-1); + return; } /* - * This is done to take advantage of stdio, while still + * This is done to take advantage of stdio, while still * allowing a O_CREAT during the open(2) of the log file. */ fp = fdopen(fd, "r+"); if (fp == NULL) { perror(logstr); - return (-1); + return; } #ifdef BSD if (flock(fileno(fp), LOCK_EX) < 0) @@ -88,14 +81,14 @@ log_score(list_em) #endif { perror("flock"); - return (-1); + return; } for (;;) { good = fscanf(fp, "%s %s %s %d %d %d", - score[num_scores].name, - score[num_scores].host, + score[num_scores].name, + score[num_scores].host, score[num_scores].game, - &score[num_scores].planes, + &score[num_scores].planes, &score[num_scores].time, &score[num_scores].real_time); if (good != 6 || ++num_scores >= NUM_SCORES) @@ -103,32 +96,24 @@ log_score(list_em) } if (!test_mode && !list_em) { if ((pw = (struct passwd *) getpwuid(getuid())) == NULL) { - fprintf(stderr, + fprintf(stderr, "getpwuid failed for uid %d. Who are you?\n", getuid()); - return (-1); + return; } strcpy(thisscore.name, pw->pw_name); -#ifdef BSD - if (gethostname(thisscore.host, sizeof (thisscore.host)) < 0) { - perror("gethostname"); - return (-1); - } -#endif -#ifdef SYSV uname(&name); strcpy(thisscore.host, name.sysname); -#endif - cp = rindex(file, '/'); + cp = strrchr(file, '/'); if (cp == NULL) { fprintf(stderr, "log: where's the '/' in %s?\n", file); - return (-1); + return; } cp++; strcpy(thisscore.game, cp); - thisscore.time = clock; + thisscore.time = clocktick; thisscore.planes = safe_planes; thisscore.real_time = time(0) - start_time; @@ -153,7 +138,7 @@ log_score(list_em) if (num_scores < NUM_SCORES) num_scores++; bcopy(&score[i], - &score[num_scores - 1], + &score[num_scores - 1], sizeof (score[i])); bcopy(&thisscore, &score[i], sizeof (score[i])); @@ -163,7 +148,7 @@ log_score(list_em) } } if (!found && !changed && num_scores < NUM_SCORES) { - bcopy(&thisscore, &score[num_scores], + bcopy(&thisscore, &score[num_scores], sizeof (score[num_scores])); num_scores++; changed++; @@ -178,7 +163,7 @@ log_score(list_em) rewind(fp); for (i = 0; i < num_scores; i++) fprintf(fp, "%s %s %s %d %d %d\n", - score[i].name, score[i].host, + score[i].name, score[i].host, score[i].game, score[i].planes, score[i].time, score[i].real_time); } else { @@ -196,11 +181,11 @@ log_score(list_em) /* lock will evaporate upon close */ #endif fclose(fp); - printf("%2s: %-8s %-8s %-18s %4s %9s %4s\n", "#", "name", "host", + printf("%2s: %-8s %-8s %-18s %4s %9s %4s\n", "#", "name", "host", "game", "time", "real time", "planes safe"); puts("-------------------------------------------------------------------------------"); for (i = 0; i < num_scores; i++) { - cp = index(score[i].host, '.'); + cp = strchr(score[i].host, '.'); if (cp != NULL) *cp = '\0'; printf("%2d: %-8s %-8s %-18s %4d %9s %4d\n", i + 1, @@ -209,5 +194,4 @@ log_score(list_em) score[i].planes); } putchar('\n'); - return (0); } diff --git a/src/games/atc/main.c b/src/games/atc/main.c index 24218d7..a104595 100644 --- a/src/games/atc/main.c +++ b/src/games/atc/main.c @@ -9,169 +9,7 @@ #include "include.h" -main(ac, av) - char *av[]; -{ - int seed; - int f_usage = 0, f_list = 0, f_showscore = 0; - int f_printpath = 0; - char *file = NULL; - char *name, *ptr; -#ifdef BSD - struct itimerval itv; -#endif - extern int update(), quit(), log_score(); - extern char *default_game(), *okay_game(); - - start_time = seed = time(0); - - name = *av++; - while (*av) { -#ifndef SAVEDASH - if (**av == '-') - *++*av; - else - break; -#endif - ptr = *av++; - while (*ptr) { - switch (*ptr) { - case '?': - case 'u': - f_usage++; - break; - case 'l': - f_list++; - break; - case 's': - case 't': - f_showscore++; - break; - case 'p': - f_printpath++; - break; - case 'r': - seed = atoi(*av); - av++; - break; - case 'f': - case 'g': - file = *av; - av++; - break; - default: - fprintf(stderr, "Unknown option '%c'\n", *ptr, - name); - f_usage++; - break; - } - ptr++; - } - } - srandom(seed); - - if (f_usage) - fprintf(stderr, - "Usage: %s -[u?lstp] [-[gf] game_name] [-r random seed]\n", - name); - if (f_showscore) - log_score(1); - if (f_list) - list_games(); - if (f_printpath) { - char buf[100]; - - strcpy(buf, SPECIAL_DIR); - buf[strlen(buf) - 1] = '\0'; - puts(buf); - } - - if (f_usage || f_showscore || f_list || f_printpath) - exit(0); - - if (file == NULL) - file = default_game(); - else - file = okay_game(file); - - if (file == NULL || read_file(file) < 0) - exit(1); - - init_gr(); - setup_screen(sp); - - addplane(); - - signal(SIGINT, quit); - signal(SIGQUIT, quit); -#ifdef BSD - signal(SIGTSTP, SIG_IGN); - signal(SIGSTOP, SIG_IGN); -#endif - signal(SIGHUP, log_score); - signal(SIGTERM, log_score); - -#ifdef BSD - ioctl(fileno(stdin), TIOCGETP, &tty_start); - bcopy(&tty_start, &tty_new, sizeof(tty_new)); - tty_new.sg_flags |= CBREAK; - tty_new.sg_flags &= ~ECHO; - ioctl(fileno(stdin), TIOCSETP, &tty_new); -#endif - -#ifdef SYSV - ioctl(fileno(stdin), TCGETA, &tty_start); - bcopy(&tty_start, &tty_new, sizeof(tty_new)); - tty_new.c_lflag &= ~ICANON; - tty_new.c_lflag &= ~ECHO; - tty_new.c_cc[VMIN] = 1; - tty_new.c_cc[VTIME] = 0; - ioctl(fileno(stdin), TCSETAW, &tty_new); -#endif - - signal(SIGALRM, update); - -#ifdef BSD - itv.it_value.tv_sec = 0; - itv.it_value.tv_usec = 1; - itv.it_interval.tv_sec = sp->update_secs; - itv.it_interval.tv_usec = 0; - setitimer(ITIMER_REAL, &itv, NULL); -#endif -#ifdef SYSV - alarm(sp->update_secs); -#endif - - for (;;) { - if (getcommand() != 1) - planewin(); - else { -#ifdef BSD - itv.it_value.tv_sec = 0; - itv.it_value.tv_usec = 0; - setitimer(ITIMER_REAL, &itv, NULL); -#endif -#ifdef SYSV - alarm(0); -#endif - - update(); - -#ifdef BSD - itv.it_value.tv_sec = sp->update_secs; - itv.it_value.tv_usec = 0; - itv.it_interval.tv_sec = sp->update_secs; - itv.it_interval.tv_usec = 0; - setitimer(ITIMER_REAL, &itv, NULL); -#endif -#ifdef SYSV - alarm(sp->update_secs); -#endif - } - } -} - -read_file(s) +int read_file(s) char *s; { extern FILE *yyin; @@ -252,7 +90,7 @@ okay_game(s) return (ret); } -list_games() +int list_games() { FILE *fp; char line[256], games[256]; @@ -277,3 +115,162 @@ list_games() } return (0); } + +int main(ac, av) + char *av[]; +{ + int seed; + int f_usage = 0, f_list = 0, f_showscore = 0; + int f_printpath = 0; + char *file = NULL; + char *name, *ptr; +#ifdef BSD + struct itimerval itv; +#endif + + start_time = seed = time(0); + + name = *av++; + while (*av) { +#ifndef SAVEDASH + if (**av == '-') + (*av)++; + else + break; +#endif + ptr = *av++; + while (*ptr) { + switch (*ptr) { + case '?': + case 'u': + f_usage++; + break; + case 'l': + f_list++; + break; + case 's': + case 't': + f_showscore++; + break; + case 'p': + f_printpath++; + break; + case 'r': + seed = atoi(*av); + av++; + break; + case 'f': + case 'g': + file = *av; + av++; + break; + default: + fprintf(stderr, "Unknown option '%c'\n", *ptr); + f_usage++; + break; + } + ptr++; + } + } + srandom(seed); + + if (f_usage) + fprintf(stderr, + "Usage: %s -[u?lstp] [-[gf] game_name] [-r random seed]\n", + name); + if (f_showscore) + log_score(1); + if (f_list) + list_games(); + if (f_printpath) { + char buf[100]; + + strcpy(buf, SPECIAL_DIR); + buf[strlen(buf) - 1] = '\0'; + puts(buf); + } + + if (f_usage || f_showscore || f_list || f_printpath) + exit(0); + + if (file == NULL) + file = default_game(); + else + file = okay_game(file); + + if (file == NULL || read_file(file) < 0) + exit(1); + + init_gr(); + setup_screen(sp); + + addplane(); + + signal(SIGINT, quit); + signal(SIGQUIT, quit); +#ifdef BSD + signal(SIGTSTP, SIG_IGN); + signal(SIGSTOP, SIG_IGN); +#endif + signal(SIGHUP, log_score); + signal(SIGTERM, log_score); + +#ifdef BSD + ioctl(fileno(stdin), TIOCGETP, &tty_start); + bcopy(&tty_start, &tty_new, sizeof(tty_new)); + tty_new.sg_flags |= CBREAK; + tty_new.sg_flags &= ~ECHO; + ioctl(fileno(stdin), TIOCSETP, &tty_new); +#endif + +#ifdef SYSV + ioctl(fileno(stdin), TCGETA, &tty_start); + bcopy(&tty_start, &tty_new, sizeof(tty_new)); + tty_new.c_lflag &= ~ICANON; + tty_new.c_lflag &= ~ECHO; + tty_new.c_cc[VMIN] = 1; + tty_new.c_cc[VTIME] = 0; + ioctl(fileno(stdin), TCSETAW, &tty_new); +#endif + + signal(SIGALRM, update); + +#ifdef BSD + itv.it_value.tv_sec = 0; + itv.it_value.tv_usec = 1; + itv.it_interval.tv_sec = sp->update_secs; + itv.it_interval.tv_usec = 0; + setitimer(ITIMER_REAL, &itv, NULL); +#endif +#ifdef SYSV + alarm(sp->update_secs); +#endif + + for (;;) { + if (getcommand() != 1) + planewin(); + else { +#ifdef BSD + itv.it_value.tv_sec = 0; + itv.it_value.tv_usec = 0; + setitimer(ITIMER_REAL, &itv, NULL); +#endif +#ifdef SYSV + alarm(0); +#endif + + update(0); + +#ifdef BSD + itv.it_value.tv_sec = sp->update_secs; + itv.it_value.tv_usec = 0; + itv.it_interval.tv_sec = sp->update_secs; + itv.it_interval.tv_usec = 0; + setitimer(ITIMER_REAL, &itv, NULL); +#endif +#ifdef SYSV + alarm(sp->update_secs); +#endif + } + } +} diff --git a/src/games/atc/update.c b/src/games/atc/update.c index cd8713a..9d9d84b 100644 --- a/src/games/atc/update.c +++ b/src/games/atc/update.c @@ -6,24 +6,29 @@ * * For more info on this and all of my stuff, mail edjames@berkeley.edu. */ - -#if !defined(lint) && defined(DOSCCS) -static char sccsid[] = "@(#)update.c 1.3.1 (2.11BSD) 1999/10/25"; -#endif - #include "include.h" -update() +int too_close(p1, p2, dist) + PLANE *p1, *p2; +{ + if (ABS(p1->altitude - p2->altitude) <= dist && + ABS(p1->xpos - p2->xpos) <= dist && ABS(p1->ypos - p2->ypos) <= dist) + return (1); + else + return (0); +} + +void update(int sig) { int i, dir_diff, unclean; - PLANE *pp, *p1, *p2, *p; + PLANE *pp, *p1, *p2; sigset_t set, oset; sigemptyset(&set); sigaddset(&set, SIGINT); (void)sigprocmask(SIG_BLOCK, &set, &oset); - clock++; + clocktick++; erase_all(); /* put some planes in the air */ @@ -42,7 +47,7 @@ update() /* do altitude change and basic movement */ for (pp = air.head; pp != NULL; pp = pp->next) { /* type 0 only move every other turn */ - if (pp->plane_type == 0 && clock & 1) + if (pp->plane_type == 0 && clocktick & 1) continue; pp->fuel--; @@ -117,10 +122,10 @@ update() if (pp->xpos == sp->airport[i].x && pp->ypos == sp->airport[i].y) { if (pp->dest_type == T_AIRPORT) - loser(pp, + loser(pp, "landed at the wrong airport."); else - loser(pp, + loser(pp, "landed instead of exited."); } loser(pp, "crashed on the ground."); @@ -131,10 +136,10 @@ update() if (pp->xpos == sp->exit[i].x && pp->ypos == sp->exit[i].y) { if (pp->dest_type == T_EXIT) - loser(pp, + loser(pp, "exited via the wrong exit."); else - loser(pp, + loser(pp, "exited instead of landed."); } loser(pp, "illegally left the flight arena."); @@ -174,20 +179,35 @@ update() (void)sigprocmask(SIG_SETMASK, &oset, NULL); } +int dir_deg(d) +{ + switch (d) { + case 0: return (0); + case 1: return (45); + case 2: return (90); + case 3: return (135); + case 4: return (180); + case 5: return (225); + case 6: return (270); + case 7: return (315); + default: + return (-1); + } +} + char * command(pp) PLANE *pp; { static char buf[50], *bp, *comm_start; - char *index(); buf[0] = '\0'; bp = buf; - (void)sprintf(bp, "%c%d%c%c%d: ", name(pp), pp->altitude, + (void)sprintf(bp, "%c%d%c%c%d: ", name(pp), pp->altitude, (pp->fuel < LOWFUEL) ? '*' : ' ', (pp->dest_type == T_AIRPORT) ? 'A' : 'E', pp->dest_no); - comm_start = bp = index(buf, '\0'); + comm_start = bp = strchr(buf, '\0'); if (pp->altitude == 0) (void)sprintf(bp, "Holding @ A%d", pp->orig_no); else if (pp->new_dir >= MAXDIR || pp->new_dir < 0) @@ -195,19 +215,19 @@ command(pp) else if (pp->new_dir != pp->dir) (void)sprintf(bp, "%d", dir_deg(pp->new_dir)); - bp = index(buf, '\0'); + bp = strchr(buf, '\0'); if (pp->delayd) (void)sprintf(bp, " @ B%d", pp->delayd_no); - bp = index(buf, '\0'); - if (*comm_start == '\0' && + bp = strchr(buf, '\0'); + if (*comm_start == '\0' && (pp->status == S_UNMARKED || pp->status == S_IGNORED)) strcpy(bp, "---------"); return (buf); } /* char */ -name(p) +int name(p) PLANE *p; { if (p->plane_type == 0) @@ -216,17 +236,17 @@ name(p) return ('a' + p->plane_no); } -number(l) +int number(l) { if (l < 'a' && l > 'z' && l < 'A' && l > 'Z') return (-1); else if (l >= 'a' && l <= 'z') return (l - 'a'); - else + else return (l - 'A'); } -next_plane() +int next_plane() { static int last_plane = -1; PLANE *pp; @@ -254,7 +274,7 @@ next_plane() return (last_plane); } -addplane() +int addplane() { PLANE p, *pp, *p1; int i, num_starts, close, rnd, rnd2, pnum; @@ -337,29 +357,3 @@ findplane(n) return (pp); return (NULL); } - -too_close(p1, p2, dist) - PLANE *p1, *p2; -{ - if (ABS(p1->altitude - p2->altitude) <= dist && - ABS(p1->xpos - p2->xpos) <= dist && ABS(p1->ypos - p2->ypos) <= dist) - return (1); - else - return (0); -} - -dir_deg(d) -{ - switch (d) { - case 0: return (0); - case 1: return (45); - case 2: return (90); - case 3: return (135); - case 4: return (180); - case 5: return (225); - case 6: return (270); - case 7: return (315); - default: - return (-1); - } -} diff --git a/src/games/boggle/.gitignore b/src/games/boggle/.gitignore new file mode 100644 index 0000000..3b54c6b --- /dev/null +++ b/src/games/boggle/.gitignore @@ -0,0 +1,3 @@ +bogdict +boggle +comp diff --git a/src/games/boggle/Makefile b/src/games/boggle/Makefile index b3179aa..16ac5b9 100644 --- a/src/games/boggle/Makefile +++ b/src/games/boggle/Makefile @@ -5,28 +5,36 @@ # # @(#)Makefile 5.3 (Berkeley) 9/7/85 # -DESTDIR= -CC = /bin/cc -SEPFLAG= -i -CFLAGS = -O +TOPSRC = $(shell cd ../../..; pwd) +include $(TOPSRC)/target.mk +#include $(TOPSRC)/cross.mk -all: boggle bogdict +CFLAGS += -O +OBJS = boggle.o +MAN = boggle.0 +MANSRC = boggle.6 -bogdict: comp sfile - -if [ -f /usr/local/lib/w2a ]; \ - then dict=/usr/local/lib/w2a; \ - else dict=/usr/dict/words; fi; \ - sed -f sfile $$dict | uniq | ./comp >bogdict +all: boggle bogdict ${MAN} -install: all - install -s boggle ${DESTDIR}/usr/games/boggle - install -m 644 bogdict ${DESTDIR}/usr/games/lib/bogdict +boggle: ${OBJS} + $(CC) $(LDFLAGS) -o $@.elf $(OBJS) $(LIBS) + $(OBJDUMP) -S $@.elf > $@.dis + $(SIZE) $@.elf + $(ELF2AOUT) $@.elf $@ && rm $@.elf -boggle: boggle.c - cc ${SEPFLAG} -o boggle ${CFLAGS} boggle.c +bogdict: comp sfile + sed -f sfile ../../../share/dict/words | uniq | ./comp > bogdict -comp: comp.c - cc ${SEPFLAG} -o comp ${CFLAGS} comp.c +comp: comp.c + cc -O comp.c -o comp + +${MAN}: ${MANSRC} + ${MANROFF} $< > $@ clean: - rm -f bogdict boggle comp *.o + rm -f *.o core boggle comp bogdict + +install: + install boggle $(DESTDIR)/games/ + install -m 644 bogdict $(DESTDIR)/games/lib/bogdict + cp ${MAN} $(DESTDIR)/share/man/cat6/ diff --git a/src/games/boggle/boggle.c b/src/games/boggle/boggle.c index c56553e..eaa0046 100644 --- a/src/games/boggle/boggle.c +++ b/src/games/boggle/boggle.c @@ -3,15 +3,6 @@ * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. */ - -#if !defined(lint) && defined(DOSCCS) -char copyright[] = -"@(#) Copyright (c) 1980 Regents of the University of California.\n\ - All rights reserved.\n"; - -static char sccsid[] = "@(#)boggle.c 5.1.1 (2.11BSD) 1997/10/2"; -#endif - #include #include #include @@ -19,7 +10,11 @@ static char sccsid[] = "@(#)boggle.c 5.1.1 (2.11BSD) 1997/10/2"; #include #include #include +#include +#include #include +#include +#include /* basic parameters */ #define N 4 @@ -62,7 +57,7 @@ long logloc; char logbuff[100] = {"inst\t"}; /* dictionary interface */ -char defname[] = "/usr/games/lib/bogdict"; +char defname[] = "/games/lib/bogdict"; char *dictname = &defname[0]; FILE *dict; @@ -89,14 +84,13 @@ char *cube [BSIZE] = { "anedvz", "pinesh", "abilyt", "gkyleu" }; - /* storage for words found */ int ubotch, ustart, wcount; char *word [MAXWORDS]; char *freesp; char space[10000]; -endline () +void endline () { if (column != 0) { putchar('\n'); @@ -104,7 +98,7 @@ endline () } } -timeout () +void timeout () { if (*timept > 0) { signal (SIGALRM, timeout); @@ -113,7 +107,7 @@ timeout () putchar('\007'); } -interrupt () +void interrupt () { signal(SIGINT, interrupt); if (delct++ >= 1) @@ -121,7 +115,7 @@ interrupt () timept = &zero; } -goodbye (stat) +void goodbye (stat) int stat; { if (master != 0) { @@ -134,19 +128,13 @@ int stat; exit(stat); } -clearscreen () +void clearscreen () { stty (fileno(stdin), &tempttyb); printf("\n\f\r"); } -compare (a, b) -char **a, **b; -{ - return(wordcomp(*a, *b)); -} - -wordcomp (p, q) +int wordcomp (p, q) register char *p, *q; { if (*p=='0' && *q!='0') @@ -161,7 +149,13 @@ register char *p, *q; return(*p-*q); } -printinst () +int compare (a, b) +char **a, **b; +{ + return(wordcomp(*a, *b)); +} + +void printinst () { stty (fileno(stdin), &tempttyb); printf("instructions?"); @@ -177,10 +171,10 @@ printinst () printf(" This program is intended for people wishing to sharpen their\n"); printf("skills at Boggle. If you invoke the program with 4 arguments of 4\n"); printf("letters each, (e.g. \"boggle appl epie moth erhd\") the program forms the\n"); - printf("obvious Boggle grid and lists all the words from /usr/dict/words found\n"); + printf("obvious Boggle grid and lists all the words from /share/dict/words found\n"); printf("therein. If you invoke the program without arguments, it will generate\n"); printf("a board for you, let you enter words for 3 minutes, and then tell you\n"); - printf("how well you did relative to /usr/dict/words.\n"); + printf("how well you did relative to /share/dict/words.\n"); printf(" In interactive play, enter your words separated by spaces, tabs,\n"); printf("or newlines. A bell will ring when there is 2:00, 1:00, 0:10, 0:02,\n"); printf("0:01, and 0:00 time left. You may complete any word started before the\n"); @@ -198,7 +192,7 @@ printinst () stty (fileno(stdin), &tempttyb); } -setup () +void setup () { register int i, j; int rd, cd, k; @@ -229,7 +223,7 @@ setup () level[1] = &stack[1]; } -makelists () +void makelists () { register int i, c; for (i=0; i<26; i++) @@ -241,7 +235,7 @@ makelists () } } -genboard () +void genboard () { register int i, j; for (i=0; i=10 ? '*' : '0'+ways; } -aputword (ways) +void aputword (ways) int ways; { /* store (wbuff, ways) in next slot in space */ @@ -333,16 +327,7 @@ int ways; word[++wcount] = freesp; } -tputword (ways) -int ways; -{ - /* print (wbuff, ways) on terminal */ - wbuff[wlength+1] = '0'; - wbuff[0] = ways>=10 ? '*' : '0'+ways; - outword(&wbuff[0]); -} - -outword (p) +void outword (p) register char *p; { register int newcol; @@ -371,7 +356,16 @@ register char *p; } } -printdiff () +void tputword (ways) +int ways; +{ + /* print (wbuff, ways) on terminal */ + wbuff[wlength+1] = '0'; + wbuff[0] = ways>=10 ? '*' : '0'+ways; + outword(&wbuff[0]); +} + +void printdiff () { register int c, d, u; char both, donly, uonly; @@ -423,7 +417,7 @@ printdiff () } } -numways (leaf, last) +int numways (leaf, last) register struct frame *leaf; struct frame *last; { @@ -444,8 +438,9 @@ struct frame *last; return(count); } -evalboard (getword, putword) -int (*getword)(), (*putword)(); +int evalboard (getword, putword) +int (*getword)(); +void (*putword)(); { register struct frame *top; register int l, q; @@ -461,7 +456,7 @@ int (*getword)(), (*putword)(); if (!(*getword) ()) break; top = level[l+1]; - + while (1) { level[l+1] = lastparent = top; /* wbuff[1]...wbuff[l] have been matched */ @@ -501,7 +496,7 @@ int (*getword)(), (*putword)(); return(found); } -main (argc, argv) +int main (argc, argv) int argc; char **argv; { @@ -516,13 +511,13 @@ char **argv; goodbye(0); signal (SIGINT, interrupt); timein = time(0L); - if (argv[0][0] != 'a' && (logfile = open("/usr/games/lib/boglog", 1)) >= 0) { + if (argv[0][0] != 'a' && (logfile = open("/games/lib/boglog", 1)) >= 0) { p = &logbuff[5]; q = getlogin(); - while (*p++ = *q++); + while ((*p++ = *q++)); p[-1] = '\t'; q = ctime(&timein); - while (*p++ = *q++); + while ((*p++ = *q++)); logloc = lseek(logfile, 0L, 2); write(logfile, &logbuff[0], p-&logbuff[1]); } @@ -612,11 +607,12 @@ char **argv; evalboard(getdword, aputword); p = freesp; while ((i = read(pipefd[0], freesp, 512)) != 0) { - if (i < 0) + if (i < 0) { if (errno != EINTR) break; else i = 0; + } freesp += i; } close(pipefd[0]); diff --git a/src/games/boggle/comp.c b/src/games/boggle/comp.c index 874f0a2..d61eec6 100644 --- a/src/games/boggle/comp.c +++ b/src/games/boggle/comp.c @@ -3,35 +3,27 @@ * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. */ - -#ifndef lint -char copyright[] = -"@(#) Copyright (c) 1980 Regents of the University of California.\n\ - All rights reserved.\n"; -#endif not lint - -#ifndef lint -static char sccsid[] = "@(#)comp.c 5.1 (Berkeley) 5/30/85"; -#endif not lint - #include + #define MAX ' ' char new[MAX], old[MAX]; -main () +int main () { register int i, j; + old[0] = '\0'; while (fgets(&new[0], MAX, stdin) != NULL) { for (i=0; i= MAX) { fprintf(stderr, "long word\n"); - exit(1); + return 1; } putc(i, stdout); for (j=0; (old[j]=new[j]) != '\n'; j++); old[j] = '\0'; fputs(&old[i], stdout); } + return 0; } diff --git a/src/games/btlgammon/.gitignore b/src/games/btlgammon/.gitignore new file mode 100644 index 0000000..af6974d --- /dev/null +++ b/src/games/btlgammon/.gitignore @@ -0,0 +1 @@ +btlgammon diff --git a/src/games/btlgammon/Makefile b/src/games/btlgammon/Makefile index d0724c0..1ddaf11 100644 --- a/src/games/btlgammon/Makefile +++ b/src/games/btlgammon/Makefile @@ -1,36 +1,23 @@ -# @(#)Makefile 4.2 (Berkeley) 9/7/85 +# @(#)Makefile 4.2 (Berkeley) 9/7/85 # -DESTDIR= -CFLAGS= -O -SEPFLAG= -i +TOPSRC = $(shell cd ../../..; pwd) +include $(TOPSRC)/target.mk +#include $(TOPSRC)/cross.mk -btlgammon: btlgammon.c - cc ${SEPFLAG} ${CFLAGS} -o btlgammon btlgammon.c +CFLAGS = -O +OBJS = btlgammon.o -install: btlgammon backrules - install -s btlgammon ${DESTDIR}/usr/games/btlgammon - install -c backrules ${DESTDIR}/usr/games/lib/backrules +all: btlgammon + +btlgammon: ${OBJS} + $(CC) $(LDFLAGS) -o $@.elf $(OBJS) $(LIBS) + $(OBJDUMP) -S $@.elf > $@.dis + $(SIZE) $@.elf + $(ELF2AOUT) $@.elf $@ && rm $@.elf clean: - rm -f a.out core *.s *.o btlgammon - -depend: - cat x.c - for i in btlgammon; do \ - (echo $$i: $$i.c >>makedep; \ - /bin/grep '^#[ ]*include' x.c $$i.c | sed \ - -e 's,<\(.*\)>,"/usr/include/\1",' \ - -e 's/:[^"]*"\([^"]*\)".*/: \1/' \ - -e 's/\.c//' >>makedep); done - echo '/^# DO NOT DELETE THIS LINE/+2,$$d' >eddep - echo '$$r makedep' >>eddep - echo 'w' >>eddep - cp Makefile Makefile.bak - ed - Makefile < eddep - rm eddep makedep x.c - echo '# DEPENDENCIES MUST END AT END OF FILE' >> Makefile - echo '# IF YOU PUT STUFF HERE IT WILL GO AWAY' >> Makefile - echo '# see make depend above' >> Makefile - -# DO NOT DELETE THIS LINE -- make depend uses it + rm -f *.o core btlgammon +install: + install btlgammon $(DESTDIR)/games/ + install -m 644 backrules $(DESTDIR)/games/lib/backrules diff --git a/src/games/btlgammon/btlgammon.c b/src/games/btlgammon/btlgammon.c index e1acba8..c3c62e1 100644 --- a/src/games/btlgammon/btlgammon.c +++ b/src/games/btlgammon/btlgammon.c @@ -1,18 +1,18 @@ - -static char sccsid[] = " backgammon.c 4.1 82/10/24 "; - /* -** The game of Backgammon -*/ - -#include + * The game of Backgammon + */ +#include +#include +#include +#include +#include #define WHITE 0 #define BROWN 1 #define NIL (-1) #define MAXGMOV 10 #define MAXIMOVES 1000 -#define RULES "/usr/games/lib/backrules" +#define RULES "/games/lib/backrules" char level; /*'b'=beginner, 'i'=intermediate, 'e'=expert*/ @@ -30,19 +30,19 @@ int goodmoves[MAXGMOV]; int probmoves[MAXGMOV]; int brown[] = { /* brown position table */ - 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, - 0, 0, 0, 0, 3, 0, 5, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, + 0, 0, 0, 0, 3, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; int white[] = { /* white position table */ - 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, - 0, 0, 0, 0, 3, 0, 5, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, + 0, 0, 0, 0, 3, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; int probability[] = { - 0, 11, 12, 13, 14, 15, 16, + 0, 11, 12, 13, 14, 15, 16, 06, 05, 04, 03, 02, 01 }; @@ -51,9 +51,541 @@ struct { int mov[4]; } moves[MAXIMOVES]; -main() +int piececount(player,startrow,endrow) +int *player,startrow,endrow; { - int go[5], tvec[2]; + int sum; + + sum=0; + while(startrow <= endrow) + sum += player[startrow++]; + return(sum); +} + +int play(player,playee,pos) +int *player,*playee,pos[]; +{ + int k, n, die, ipos; + + for(k=0; k < player[0]; k++){ /*blots on player[0] must be moved first*/ + if(pos[k] == NIL) + break; + if(pos[k] != 0){ + fprintf(stdout, "Stone on bar must be moved first.\n"); + return(NIL); + } + } + for(k = 0; (ipos=pos[k]) != NIL; k++){ + die = k?die2:die1; + n = 25-ipos-die; + if(player[ipos] == 0) + goto badmove; + if(n > 0 && playee[n] >= 2) + goto badmove; + if(n <= 0){ + if(piececount(player,0,18) != 0) + goto badmove; + if((ipos+die) != 25 && piececount(player,19,24-die)!=0) + goto badmove; + } + player[ipos]--; + player[ipos+die]++; + } + for(k = 0; pos[k] != NIL; k++){ + die = k?die2:die1; + n = 25-pos[k]-die; + if(n>0 && playee[n]==1){ + playee[n]=0; + playee[0]++; + } + } + return(0); + +badmove: + fprintf(stdout, "Move %d illegal.\n", ipos); + while(k--){ + die=k?die2:die1; + player[pos[k]]++; + player[pos[k]+die]--; + } + return(NIL); +} + +void moverecord(mover) +int *mover; +{ + int t; + + if(imoves < MAXIMOVES) { + for(t = 0; t <= 3; t++) + moves[imoves].pos[t] = NIL; + switch(count) { + case 4: + moves[imoves].pos[3]=m; + moves[imoves].mov[3]=die1; + + case 3: + moves[imoves].pos[2]=l; + moves[imoves].mov[2]=die1; + + case 2: + moves[imoves].pos[1]=j; + moves[imoves].mov[1]=die2; + + case 1: + moves[imoves].pos[0]=i; + moves[imoves].mov[0]=die1; + imoves++; + } + } + switch(count) { + case 4: + break; + + case 3: + mover[l]++; + mover[l+die1]--; + break; + + case 2: + mover[j]++; + mover[j+die2]--; + break; + + case 1: + mover[i]++; + mover[i+die1]--; + } +} + +void movegen(mover,movee) +int *mover,*movee; +{ + int k; + + for(i = 0; i <= 24; i++){ + count = 0; + if(mover[i] == 0) + continue; + if((k=25-i-die1) > 0 && movee[k] >= 2) { + if(mover[0] > 0) + break; + } else + continue; + if(k <= 0){ + if(piececount(mover, 0, 18) != 0) + break; + if((i+die1) != 25 && piececount(mover,19,i-1) != 0) + break; + } + mover[i]--; + mover[i+die1]++; + count = 1; + for(j = 0; j <= 24; j++){ + if(mover[j]==0) + continue; + if((k=25-j-die2) > 0 && movee[k] >= 2) { + if(mover[0] > 0) + break; + } else + continue; + if(k <= 0){ + if(piececount(mover,0,18) != 0) + break; + if((j+die2) != 25 && piececount(mover,19,j-1) != 0) + break; + } + mover[j]--; + mover[j+die2]++; + count = 2; + if(die1 != die2){ + moverecord(mover); + if(mover[0] > 0) + break; + else + continue; + } + for(l = 0; l <= 24; l++){ + if(mover[l] == 0) + continue; + if((k=25-l-die1) > 0 && movee[k] >= 2) { + if(mover[0] > 0) + break; + } else + continue; + if(k <= 0){ + if(piececount(mover, 0, 18) != 0) + break; + if((l+die2) != 25 && piececount(mover,19,l-1) != 0) + break; + } + mover[l]--; + mover[l+die1]++; + count=3; + for(m=0;m<=24;m++){ + if(mover[m]==0) + continue; + if((k=25-m-die1) >= 0 && movee[k] >= 2) { + if(mover[0] > 0) + break; + } else + continue; + if(k <= 0){ + if(piececount(mover,0,18) != 0) + break; + if((m+die2) != 25 && piececount(mover,19,m-1) != 0) + break; + } + count=4; + moverecord(mover); + if(mover[0] > 0) + break; + } + if(count == 3) + moverecord(mover); + else{ + mover[l]++; + mover[l+die1]--; + } + if(mover[0] > 0) + break; + } + if(count == 2) + moverecord(mover); + else{ + mover[j]++; + mover[j+die1]--; + } + if(mover[0] > 0) + break; + } + if(count == 1) + moverecord(mover); + else{ + mover[i]++; + mover[i+die1]--; + } + if(mover[0] > 0) + break; + } +} + +int getprob(player,playee,start,finish) +int *player,*playee,start,finish; +{ /*returns the probability (times 102) that any + pieces belonging to 'player' and lying between + his points 'start' and 'finish' will be hit + by a piece belonging to playee + */ + int k, n, sum; + + sum = 0; + for(; start <= finish; start++){ + if(player[start] == 1){ + for(k = 1; k <= 12; k++){ + if((n=25-start-k) < 0) + break; + if(playee[n] != 0) + sum += probability[k]; + } + } + } + return(sum); +} + +int eval(player,playee,k,prob) +int *player,*playee,k,*prob; +{ + int newtry[31], newother[31], *r, *q, *p, n, sum, first; + int ii, lastwhite, lastbrown; + + *prob = sum = 0; + r = player+25; + p = newtry; + q = newother; + while(player6) { + for(sum = 1000; lastwhite > 6; lastwhite--) + sum = sum-lastwhite*newtry[25-lastwhite]; + } + for(first = 0; first < 25; first++) + if(newother[first] != 0) /*find other's first piece*/ + break; + q = newtry+25; + for(p = newtry+1; p < q;) /* blocked points are good */ + if(*p++ > 1) + sum++; + if(first > 5) { /* only stress removing pieces if */ + /* homeboard cannot be hit */ + q = newtry+31; + p=newtry+25; + for(n = 6; p < q; n--) + sum += *p++ * n; /*remove pieces, but just barely*/ + } + if(level != 'b'){ + r = newtry+25-first; /*singles past this point can't be hit*/ + for(p = newtry+7; p < r; ) + if(*p++ == 1) /*singles are bad after 1st 6 points if they can be hit*/ + sum--; + q = newtry+3; + for(p = newtry; p < q; ) /*bad to be on 1st three points*/ + sum -= *p++; + } + + for(n = 1; n <= 4; n++) + *prob += n*getprob(newtry,newother,6*n-5,6*n); + return(sum); +} + +int strategy(player,playee) +int *player,*playee; +{ + int k, n, nn, bestval, moveval, prob; + + n = 0; + if(imoves == 0) + return(NIL); + goodmoves[0] = NIL; + bestval = -32000; + for(k = 0; k < imoves; k++){ + if((moveval=eval(player,playee,k,&prob)) < bestval) + continue; + if(moveval > bestval){ + bestval = moveval; + n = 0; + } + if(n1){ + nn=n; + n=0; + prob=32000; + for(k = 0; k < nn; k++){ + if((moveval=probmoves[k]) > prob) + continue; + if(moveval>4)%n]); +} + +void prtmov(k) +int k; +{ + int n; + + if(k == NIL) + fprintf(stdout, "No move possible\n"); + else for(n = 0; n < 4; n++){ + if(moves[k].pos[n] == NIL) + break; + fprintf(stdout, " %d, %d",25-moves[k].pos[n],moves[k].mov[n]); + } + fprintf(stdout, "\n"); +} + +void update(player,playee,k) +int *player,*playee,k; +{ + int n,t; + + for(n = 0; n < 4; n++){ + if(moves[k].pos[n] == NIL) + break; + player[moves[k].pos[n]]--; + player[moves[k].pos[n]+moves[k].mov[n]]++; + t=25-moves[k].pos[n]-moves[k].mov[n]; + if(t>0 && playee[t]==1){ + playee[0]++; + playee[t]--; + } + } +} + +int nextmove(player,playee) +int *player,*playee; +{ + int k; + + imoves=0; + movegen(player,playee); + if(die1!=die2){ + k=die1; + die1=die2; + die2=k; + movegen(player,playee); + } + if(imoves==0){ + fprintf(stdout, "no move possible.\n"); + return(NIL); + } + k = strategy(player, playee); /*select kth possible move*/ + prtmov(k); + update(player,playee,k); + return(0); +} + +void pmoves() +{ + int i1, i2; + + fprintf(stdout, "Possible moves are:\n"); + for(i1 = 0; i1 < imoves; i1++){ + fprintf(stdout, "\n%d",i1); + for (i2 = 0; i2<4; i2++){ + if(moves[i1].pos[i2] == NIL) + break; + fprintf(stdout, "%d, %d",moves[i1].pos[i2],moves[i1].mov[i2]); + } + } + fprintf(stdout, "\n"); +} + +void roll(who) +{ + register int n; + char s[10]; + + if(who == BROWN && nobroll) { + fprintf(stdout, "Roll? "); + gets(s); + n = sscanf(s, "%d%d", &die1, &die2); + if(n != 2 || die1 < 1 || die1 > 6 || die2 < 1 || die2 > 6) + fprintf(stdout, "Illegal - I'll do it!\n"); + else + return; + } + die1 = ((rand()>>8) % 6) + 1; + die2 = ((rand()>>8) % 6) + 1; +} + +void instructions() +{ + register int fd, r; + char buf[BUFSIZ]; + + if((fd = open(RULES, 0)) < 0) { + fprintf(stderr, "back: cannot open %s\n", RULES); + return; + } + while((r = read(fd, buf, BUFSIZ)) > 0) + write(1, buf, r); +} + +void numline(upcol,downcol,start,fin) +int *upcol,*downcol,start,fin; +{ + int k, n; + + for(k = start; k <= fin; k++){ + if((n = upcol[k]) != 0 || (n = downcol[25-k]) != 0) + fprintf(stdout, "%4d", n); + else + fprintf(stdout, " "); + } +} + +void colorline(upcol,c1,downcol,c2,start,fin) +int *upcol,*downcol,start,fin; +char c1,c2; +{ + int k; + char c; + + for(k = start; k <= fin; k++){ + c = ' '; + if(upcol[k] != 0) + c = c1; + if(downcol[25-k] != 0) + c = c2; + fprintf(stdout, " %c",c); + } +} + +void prtbrd() +{ + int k; + static char undersc[]="______________________________________________________"; + + fprintf(stdout, "White's Home\n"); + for(k = 1; k <= 6; k++) + fprintf(stdout, "%4d",k); + fprintf(stdout, " "); + for(k = 7; k <= 12; k++) + fprintf(stdout, "%4d",k); + fprintf(stdout, "\n%s\n",undersc); + numline(brown, white, 1, 6); + fprintf(stdout, " "); + numline(brown, white, 7, 12); + putchar('\n'); + colorline(brown, 'B', white, 'W', 1, 6); + fprintf(stdout, " "); + colorline(brown, 'B', white, 'W', 7, 12); + putchar('\n'); + if(white[0] != 0) + fprintf(stdout, "%28dW\n",white[0]); + else + putchar('\n'); + if(brown[0] != 0) + fprintf(stdout, "%28dB\n", brown[0]); + else + putchar('\n'); + colorline(white, 'W', brown, 'B', 1, 6); + fprintf(stdout, " "); + colorline(white, 'W', brown, 'B', 7, 12); + fprintf(stdout, "\n"); + numline(white, brown, 1, 6); + fprintf(stdout, " "); + numline(white, brown, 7, 12); + fprintf(stdout, "\n%s\n",undersc); + for(k = 24; k >= 19; k--) + fprintf(stdout, "%4d",k); + fprintf(stdout, " "); + for(k = 18; k >= 13; k--) + fprintf(stdout, "%4d",k); + fprintf(stdout, "\nBrown's Home\n\n\n\n\n"); +} + +int main() +{ + int go[6], tvec[2]; int k, n, pid, ret, rpid, t; char s[100]; @@ -193,525 +725,3 @@ retry: } goto whitesmv; } - -play(player,playee,pos) -int *player,*playee,pos[]; -{ - int k, n, die, ipos; - - for(k=0; k < player[0]; k++){ /*blots on player[0] must be moved first*/ - if(pos[k] == NIL) - break; - if(pos[k] != 0){ - fprintf(stdout, "Stone on bar must be moved first.\n"); - return(NIL); - } - } - for(k = 0; (ipos=pos[k]) != NIL; k++){ - die = k?die2:die1; - n = 25-ipos-die; - if(player[ipos] == 0) - goto badmove; - if(n > 0 && playee[n] >= 2) - goto badmove; - if(n <= 0){ - if(piececount(player,0,18) != 0) - goto badmove; - if((ipos+die) != 25 && piececount(player,19,24-die)!=0) - goto badmove; - } - player[ipos]--; - player[ipos+die]++; - } - for(k = 0; pos[k] != NIL; k++){ - die = k?die2:die1; - n = 25-pos[k]-die; - if(n>0 && playee[n]==1){ - playee[n]=0; - playee[0]++; - } - } - return(0); - -badmove: - fprintf(stdout, "Move %d illegal.\n", ipos); - while(k--){ - die=k?die2:die1; - player[pos[k]]++; - player[pos[k]+die]--; - } - return(NIL); -} -nextmove(player,playee) -int *player,*playee; -{ - int k; - - imoves=0; - movegen(player,playee); - if(die1!=die2){ - k=die1; - die1=die2; - die2=k; - movegen(player,playee); - } - if(imoves==0){ - fprintf(stdout, "no move possible.\n"); - return(NIL); - } - k=strategy(player,playee); /*select kth possible move*/ - prtmov(k); - update(player,playee,k); - return(0); -} -prtmov(k) -int k; -{ - int n; - - if(k == NIL) - fprintf(stdout, "No move possible\n"); - else for(n = 0; n < 4; n++){ - if(moves[k].pos[n] == NIL) - break; - fprintf(stdout, " %d, %d",25-moves[k].pos[n],moves[k].mov[n]); - } - fprintf(stdout, "\n"); -} -update(player,playee,k) -int *player,*playee,k; -{ - int n,t; - - for(n = 0; n < 4; n++){ - if(moves[k].pos[n] == NIL) - break; - player[moves[k].pos[n]]--; - player[moves[k].pos[n]+moves[k].mov[n]]++; - t=25-moves[k].pos[n]-moves[k].mov[n]; - if(t>0 && playee[t]==1){ - playee[0]++; - playee[t]--; - } - } -} -piececount(player,startrow,endrow) -int *player,startrow,endrow; -{ - int sum; - - sum=0; - while(startrow <= endrow) - sum += player[startrow++]; - return(sum); -} -pmoves() -{ - int i1, i2; - - fprintf(stdout, "Possible moves are:\n"); - for(i1 = 0; i1 < imoves; i1++){ - fprintf(stdout, "\n%d",i1); - for (i2 = 0; i2<4; i2++){ - if(moves[i1].pos[i2] == NIL) - break; - fprintf(stdout, "%d, %d",moves[i1].pos[i2],moves[i1].mov[i2]); - } - } - fprintf(stdout, "\n"); -} - -roll(who) -{ - register n; - char s[10]; - - if(who == BROWN && nobroll) { - fprintf(stdout, "Roll? "); - gets(s); - n = sscanf(s, "%d%d", &die1, &die2); - if(n != 2 || die1 < 1 || die1 > 6 || die2 < 1 || die2 > 6) - fprintf(stdout, "Illegal - I'll do it!\n"); - else - return; - } - die1 = ((rand()>>8) % 6) + 1; - die2 = ((rand()>>8) % 6) + 1; -} - -movegen(mover,movee) -int *mover,*movee; -{ - int k; - - for(i = 0; i <= 24; i++){ - count = 0; - if(mover[i] == 0) - continue; - if((k=25-i-die1) > 0 && movee[k] >= 2) - if(mover[0] > 0) - break; - else - continue; - if(k <= 0){ - if(piececount(mover, 0, 18) != 0) - break; - if((i+die1) != 25 && piececount(mover,19,i-1) != 0) - break; - } - mover[i]--; - mover[i+die1]++; - count = 1; - for(j = 0; j <= 24; j++){ - if(mover[j]==0) - continue; - if((k=25-j-die2) > 0 && movee[k] >= 2) - if(mover[0] > 0) - break; - else - continue; - if(k <= 0){ - if(piececount(mover,0,18) != 0) - break; - if((j+die2) != 25 && piececount(mover,19,j-1) != 0) - break; - } - mover[j]--; - mover[j+die2]++; - count = 2; - if(die1 != die2){ - moverecord(mover); - if(mover[0] > 0) - break; - else - continue; - } - for(l = 0; l <= 24; l++){ - if(mover[l] == 0) - continue; - if((k=25-l-die1) > 0 && movee[k] >= 2) - if(mover[0] > 0) - break; - else - continue; - if(k <= 0){ - if(piececount(mover, 0, 18) != 0) - break; - if((l+die2) != 25 && piececount(mover,19,l-1) != 0) - break; - } - mover[l]--; - mover[l+die1]++; - count=3; - for(m=0;m<=24;m++){ - if(mover[m]==0) - continue; - if((k=25-m-die1) >= 0 && movee[k] >= 2) - if(mover[0] > 0) - break; - else - continue; - if(k <= 0){ - if(piececount(mover,0,18) != 0) - break; - if((m+die2) != 25 && piececount(mover,19,m-1) != 0) - break; - } - count=4; - moverecord(mover); - if(mover[0] > 0) - break; - } - if(count == 3) - moverecord(mover); - else{ - mover[l]++; - mover[l+die1]--; - } - if(mover[0] > 0) - break; - } - if(count == 2) - moverecord(mover); - else{ - mover[j]++; - mover[j+die1]--; - } - if(mover[0] > 0) - break; - } - if(count == 1) - moverecord(mover); - else{ - mover[i]++; - mover[i+die1]--; - } - if(mover[0] > 0) - break; - } -} -moverecord(mover) -int *mover; -{ - int t; - - if(imoves < MAXIMOVES) { - for(t = 0; t <= 3; t++) - moves[imoves].pos[t] = NIL; - switch(count) { - case 4: - moves[imoves].pos[3]=m; - moves[imoves].mov[3]=die1; - - case 3: - moves[imoves].pos[2]=l; - moves[imoves].mov[2]=die1; - - case 2: - moves[imoves].pos[1]=j; - moves[imoves].mov[1]=die2; - - case 1: - moves[imoves].pos[0]=i; - moves[imoves].mov[0]=die1; - imoves++; - } - } - switch(count) { - case 4: - break; - - case 3: - mover[l]++; - mover[l+die1]--; - break; - - case 2: - mover[j]++; - mover[j+die2]--; - break; - - case 1: - mover[i]++; - mover[i+die1]--; - } -} - -strategy(player,playee) -int *player,*playee; -{ - int k, n, nn, bestval, moveval, prob; - - n = 0; - if(imoves == 0) - return(NIL); - goodmoves[0] = NIL; - bestval = -32000; - for(k = 0; k < imoves; k++){ - if((moveval=eval(player,playee,k,&prob)) < bestval) - continue; - if(moveval > bestval){ - bestval = moveval; - n = 0; - } - if(n1){ - nn=n; - n=0; - prob=32000; - for(k = 0; k < nn; k++){ - if((moveval=probmoves[k]) > prob) - continue; - if(moveval>4)%n]); -} - -eval(player,playee,k,prob) -int *player,*playee,k,*prob; -{ - int newtry[31], newother[31], *r, *q, *p, n, sum, first; - int ii, lastwhite, lastbrown; - - *prob = sum = 0; - r = player+25; - p = newtry; - q = newother; - while(player6) { - for(sum = 1000; lastwhite > 6; lastwhite--) - sum = sum-lastwhite*newtry[25-lastwhite]; - } - for(first = 0; first < 25; first++) - if(newother[first] != 0) /*find other's first piece*/ - break; - q = newtry+25; - for(p = newtry+1; p < q;) /* blocked points are good */ - if(*p++ > 1) - sum++; - if(first > 5) { /* only stress removing pieces if */ - /* homeboard cannot be hit */ - q = newtry+31; - p=newtry+25; - for(n = 6; p < q; n--) - sum += *p++ * n; /*remove pieces, but just barely*/ - } - if(level != 'b'){ - r = newtry+25-first; /*singles past this point can't be hit*/ - for(p = newtry+7; p < r; ) - if(*p++ == 1) /*singles are bad after 1st 6 points if they can be hit*/ - sum--; - q = newtry+3; - for(p = newtry; p < q; ) /*bad to be on 1st three points*/ - sum -= *p++; - } - - for(n = 1; n <= 4; n++) - *prob += n*getprob(newtry,newother,6*n-5,6*n); - return(sum); -} -instructions() -{ - register fd, r; - char buf[BUFSIZ]; - - if((fd = open(RULES, 0)) < 0) { - fprintf(stderr, "back: cannot open %s\n", RULES); - return; - } - while(r = read(fd, buf, BUFSIZ)) - write(1, buf, r); -} - -getprob(player,playee,start,finish) -int *player,*playee,start,finish; -{ /*returns the probability (times 102) that any - pieces belonging to 'player' and lying between - his points 'start' and 'finish' will be hit - by a piece belonging to playee - */ - int k, n, sum; - - sum = 0; - for(; start <= finish; start++){ - if(player[start] == 1){ - for(k = 1; k <= 12; k++){ - if((n=25-start-k) < 0) - break; - if(playee[n] != 0) - sum += probability[k]; - } - } - } - return(sum); -} -prtbrd() -{ - int k; - static char undersc[]="______________________________________________________"; - - fprintf(stdout, "White's Home\n%s\r",undersc); - for(k = 1; k <= 6; k++) - fprintf(stdout, "%4d",k); - fprintf(stdout, " "); - for(k = 7; k <= 12; k++) - fprintf(stdout, "%4d",k); - putchar('\n'); - numline(brown, white, 1, 6); - fprintf(stdout, " "); - numline(brown, white, 7, 12); - putchar('\n'); - colorline(brown, 'B', white, 'W', 1, 6); - fprintf(stdout, " "); - colorline(brown, 'B', white, 'W', 7, 12); - putchar('\n'); - if(white[0] != 0) - fprintf(stdout, "%28dW\n",white[0]); - else - putchar('\n'); - if(brown[0] != 0) - fprintf(stdout, "%28dB\n", brown[0]); - else - putchar('\n'); - colorline(white, 'W', brown, 'B', 1, 6); - fprintf(stdout, " "); - colorline(white, 'W', brown, 'B', 7, 12); - fprintf(stdout, "\n%s\r",undersc); - numline(white, brown, 1, 6); - fprintf(stdout, " "); - numline(white, brown, 7, 12); - putchar('\n'); - for(k = 24; k >= 19; k--) - fprintf(stdout, "%4d",k); - fprintf(stdout, " "); - for(k = 18; k >= 13; k--) - fprintf(stdout, "%4d",k); - fprintf(stdout, "\nBrown's Home\n\n\n\n\n"); -} -numline(upcol,downcol,start,fin) -int *upcol,*downcol,start,fin; -{ - int k, n; - - for(k = start; k <= fin; k++){ - if((n = upcol[k]) != 0 || (n = downcol[25-k]) != 0) - fprintf(stdout, "%4d", n); - else - fprintf(stdout, " "); - } -} -colorline(upcol,c1,downcol,c2,start,fin) -int *upcol,*downcol,start,fin; -char c1,c2; -{ - int k; - char c; - - for(k = start; k <= fin; k++){ - c = ' '; - if(upcol[k] != 0) - c = c1; - if(downcol[25-k] != 0) - c = c2; - fprintf(stdout, " %c",c); - } -} diff --git a/src/games/cribbage/.gitignore b/src/games/cribbage/.gitignore new file mode 100644 index 0000000..4e4ed63 --- /dev/null +++ b/src/games/cribbage/.gitignore @@ -0,0 +1 @@ +cribbage diff --git a/src/games/cribbage/Makefile b/src/games/cribbage/Makefile index d0d3525..c12729b 100644 --- a/src/games/cribbage/Makefile +++ b/src/games/cribbage/Makefile @@ -7,45 +7,36 @@ # # make file for cribbage # -HDRS= cribbage.h deck.h cribcur.h -OBJS= extern.o crib.o support.o cards.o score.o io.o -CFILES= extern.c crib.c support.c cards.c score.c io.c -TOBJS= test.o cards.o score.o io.o extern.o -MAN= crib.0 -SEPFLAG= -i -CFLAGS= -O -DESTDIR= +TOPSRC = $(shell cd ../../..; pwd) +include $(TOPSRC)/target.mk +#include $(TOPSRC)/cross.mk +#CFLAGS = -O -Werror -DCROSS -all: cribbage ${MAN} +OBJS = extern.o crib.o support.o cards.o score.o io.o +TOBJS = test.o cards.o score.o io.o extern.o +MAN = cribbage.0 +MANSRC = cribbage.6 +LIBS = -lcurses -ltermcap -lc -cribbage: ${OBJS} - ${CC} ${SEPFLAG} ${CFLAGS} -o cribbage ${OBJS} -lcurses -ltermlib +all: cribbage ${MAN} crib.0 -all: cribbage ${MAN} +cribbage: ${OBJS} + $(CC) $(LDFLAGS) -o $@.elf $(OBJS) $(LIBS) + $(OBJDUMP) -S $@.elf > $@.dis + $(SIZE) $@.elf + $(ELF2AOUT) $@.elf $@ && rm $@.elf -crib.o io.o support.o: cribcur.h +crib.0: cribbage.n macro + nroff cribbage.n > $@ -test: ${TOBJS} - ${CC} ${SEPFLAG} ${CFLAGS} -o test ${TOBJS} -lcurses -ltermlib - -crib.0: cribbage.n macro - nroff cribbage.n > crib.0 - -tags: ${HDRS} ${CFILES} - ctags -u $? - ed - tags < :ctfix - sort tags -o tags +${MAN}: ${MANSRC} + ${MANROFF} $< > $@ clean: - rm -f ${OBJS} ? a.out core crib.0 cribbage errs + rm -f *.o core cribbage ${MAN} *.dis -crib.o: deck.h cribbage.h cribcur.h -support.o: deck.h cribbage.h cribcur.h -test.o: deck.h -cards.o: deck.h -score.o: deck.h -io.o: deck.h cribcur.h - -install: cribbage crib.0 - install -s cribbage $(DESTDIR)/usr/games - install -m 644 crib.0 $(DESTDIR)/usr/games/lib/crib.instr +install: all + install cribbage $(DESTDIR)/games/ + install -m 644 crib.0 $(DESTDIR)/games/lib/crib.instr + cp ${MAN} $(DESTDIR)/share/man/cat6/ + cp crib.0 $(DESTDIR)/share/man/cat6/ diff --git a/src/games/cribbage/cards.c b/src/games/cribbage/cards.c index e7805b3..a3e9a39 100644 --- a/src/games/cribbage/cards.c +++ b/src/games/cribbage/cards.c @@ -3,21 +3,14 @@ * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. */ - -#ifndef lint -static char sccsid[] = "@(#)cards.c 5.1 (Berkeley) 5/30/85"; -#endif not lint - #include +#include #include "deck.h" - /* * initialize a deck of cards to contain one of each type */ - -makedeck( d ) - +void makedeck( d ) CARD d[]; { register int i, j, k; @@ -35,15 +28,11 @@ makedeck( d ) } } - - /* * given a deck of cards, shuffle it -- i.e. randomize it * see Knuth, vol. 2, page 125 */ - -shuffle( d ) - +void shuffle( d ) CARD d[]; { register int j, k; @@ -57,27 +46,19 @@ shuffle( d ) } } - - /* * return true if the two cards are equal... */ - -eq( a, b ) - +int eq( a, b ) CARD a, b; { return( ( a.rank == b.rank ) && ( a.suit == b.suit ) ); } - - /* * isone returns TRUE if a is in the set of cards b */ - -isone( a, b, n ) - +BOOLEAN isone( a, b, n ) CARD a, b[]; int n; { @@ -89,16 +70,12 @@ isone( a, b, n ) return( FALSE ); } - - /* * remove the card a from the deck d of n cards */ - -remove( a, d, n ) - - CARD a, d[]; - int n; +void cremove( a, d, n ) + CARD a, d[]; + int n; { register int i, j; @@ -109,15 +86,13 @@ remove( a, d, n ) if( j < n ) d[j].suit = d[j].rank = EMPTY; } - - /* * sorthand: * Sort a hand of n cards */ -sorthand(h, n) -register CARD h[]; -int n; +void sorthand(h, n) + register CARD h[]; + int n; { register CARD *cp, *endp; CARD c; @@ -131,4 +106,3 @@ int n; *cp = c; } } - diff --git a/src/games/cribbage/crib.c b/src/games/cribbage/crib.c index e853239..87ad237 100644 --- a/src/games/cribbage/crib.c +++ b/src/games/cribbage/crib.c @@ -3,120 +3,36 @@ * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. */ - -#ifndef lint -char copyright[] = -"@(#) Copyright (c) 1980 Regents of the University of California.\n\ - All rights reserved.\n"; -#endif not lint - -#ifndef lint -static char sccsid[] = "@(#)crib.c 5.1 (Berkeley) 5/30/85"; -#endif not lint - -# include +# include # include # include "deck.h" # include "cribbage.h" # include "cribcur.h" +# define LOGFILE "/games/lib/criblog" +# define INSTRCMD "more /games/lib/crib.instr" -# define LOGFILE "/usr/games/lib/criblog" -# define INSTRCMD "more /usr/games/lib/crib.instr" - - -main(argc, argv) -int argc; -char *argv[]; +/* + * gamescore: + * Print out the current game score + */ +void gamescore() { - register char *p; - BOOLEAN playing; - char *s; /* for reading arguments */ - char bust; /* flag for arg reader */ - FILE *f; - FILE *fopen(); - char *getline(); - int bye(); + extern int Lastscore[]; - while (--argc > 0) { - if ((*++argv)[0] != '-') { - fprintf(stderr, "\n\ncribbage: usage is 'cribbage [-eqr]'\n"); - exit(1); - } - bust = FALSE; - for (s = argv[0] + 1; *s != NULL; s++) { - switch (*s) { - case 'e': - explain = TRUE; - break; - case 'q': - quiet = TRUE; - break; - case 'r': - rflag = TRUE; - break; - default: - fprintf(stderr, "\n\ncribbage: usage is 'cribbage [-eqr]'\n"); - exit(2); - break; - } - if (bust) - break; - } - } - - initscr(); - signal(SIGINT, bye); - crmode(); - noecho(); - Playwin = subwin(stdscr, PLAY_Y, PLAY_X, 0, 0); - Tablewin = subwin(stdscr, TABLE_Y, TABLE_X, 0, PLAY_X); - Compwin = subwin(stdscr, COMP_Y, COMP_X, 0, TABLE_X + PLAY_X); - Msgwin = subwin(stdscr, MSG_Y, MSG_X, Y_MSG_START, SCORE_X + 1); - leaveok(Playwin, TRUE); - leaveok(Tablewin, TRUE); - leaveok(Compwin, TRUE); - clearok(stdscr, FALSE); - - if (!quiet) { - msg("Do you need instructions for cribbage? "); - if (getuchar() == 'Y') { - endwin(); - fflush(stdout); - system(INSTRCMD); - crmode(); - noecho(); - clear(); - refresh(); - msg("For the rules of this program, do \"man cribbage\""); - } - } - playing = TRUE; - do { - wclrtobot(Msgwin); - msg(quiet ? "L or S? " : "Long (to 121) or Short (to 61)? "); - if (glimit == SGAME) - glimit = (getuchar() == 'L' ? LGAME : SGAME); - else - glimit = (getuchar() == 'S' ? SGAME : LGAME); - game(); - msg("Another game? "); - playing = (getuchar() == 'Y'); - } while (playing); - - if ((f = fopen(LOGFILE, "a")) != NULL) { - fprintf(f, "Won %5.5d, Lost %5.5d\n", cgames, pgames); - fclose(f); - } - - bye(); + if (pgames || cgames) { + mvprintw(SCORE_Y + 1, SCORE_X + 28, "Games: %3d", pgames); + mvprintw(SCORE_Y + 7, SCORE_X + 28, "Games: %3d", cgames); + } + Lastscore[0] = -1; + Lastscore[1] = -1; } /* * makeboard: * Print out the initial board on the screen */ -makeboard() +void makeboard() { mvaddstr(SCORE_Y + 0, SCORE_X, "+---------------------------------------+"); mvaddstr(SCORE_Y + 1, SCORE_X, "| Score: 0 YOU |"); @@ -131,19 +47,345 @@ makeboard() } /* - * gamescore: - * Print out the current game score + * deal cards to both players from deck */ -gamescore() +int deal( mycrib ) { - extern int Lastscore[]; + register int i, j; - if (pgames || cgames) { - mvprintw(SCORE_Y + 1, SCORE_X + 28, "Games: %3d", pgames); - mvprintw(SCORE_Y + 7, SCORE_X + 28, "Games: %3d", cgames); - } - Lastscore[0] = -1; - Lastscore[1] = -1; + j = 0; + for( i = 0; i < FULLHAND; i++ ) { + if( mycrib ) { + phand[i] = deck[j++]; + chand[i] = deck[j++]; + } + else { + chand[i] = deck[j++]; + phand[i] = deck[j++]; + } + } + return( j ); +} + +/* + * prcrib: + * Print out the turnover card with crib indicator + */ +void prcrib(mycrib, blank) +BOOLEAN mycrib, blank; +{ + register int y, cardx; + + if (mycrib) + cardx = CRIB_X; + else + cardx = 0; + + mvaddstr(CRIB_Y, cardx + 1, "CRIB"); + prcard(stdscr, CRIB_Y + 1, cardx, turnover, blank); + + if (mycrib) + cardx = 0; + else + cardx = CRIB_X; + + for (y = CRIB_Y; y <= CRIB_Y + 5; y++) + mvaddstr(y, cardx, " "); +} + +/* + * discard: + * Handle players discarding into the crib... + * Note: we call cdiscard() after prining first message so player doesn't wait + */ +void discard(mycrib) +BOOLEAN mycrib; +{ + register char *prompt; + CARD crd; + + prcrib(mycrib, TRUE); + prompt = (quiet ? "Discard --> " : "Discard a card --> "); + cdiscard(mycrib); /* puts best discard at end */ + crd = phand[infrom(phand, FULLHAND, prompt)]; + cremove(crd, phand, FULLHAND); + prhand(phand, FULLHAND, Playwin, FALSE); + crib[0] = crd; +/* next four lines same as last four except for cdiscard() */ + crd = phand[infrom(phand, FULLHAND - 1, prompt)]; + cremove(crd, phand, FULLHAND - 1); + prhand(phand, FULLHAND, Playwin, FALSE); + crib[1] = crd; + crib[2] = chand[4]; + crib[3] = chand[5]; + chand[4].rank = chand[4].suit = chand[5].rank = chand[5].suit = EMPTY; +} + +/* + * cut: + * Cut the deck and set turnover. Actually, we only ASK the + * player what card to turn. We do a random one, anyway. + */ +BOOLEAN cut(mycrib, pos) +BOOLEAN mycrib; +int pos; +{ + register int i, cardx; + BOOLEAN win = FALSE; + + if (mycrib) { + if (!rflag) { /* random cut */ + msg(quiet ? "Cut the deck? " : + "How many cards down do you wish to cut the deck? "); + getlin(); + } + i = (rand() >> 4) % (CARDS - pos); + turnover = deck[i + pos]; + addmsg(quiet ? "You cut " : "You cut the "); + msgcard(turnover, FALSE); + endmsg(); + if (turnover.rank == JACK) { + msg("I get two for his heels"); + win = chkscr(&cscore,2 ); + } + } + else { + i = (rand() >> 4) % (CARDS - pos) + pos; + turnover = deck[i]; + addmsg(quiet ? "I cut " : "I cut the "); + msgcard(turnover, FALSE); + endmsg(); + if (turnover.rank == JACK) { + msg("You get two for his heels"); + win = chkscr(&pscore, 2); + } + } + makeknown(&turnover, 1); + prcrib(mycrib, FALSE); + return win; +} + +static CARD Table[14]; + +static int Tcnt; + +/* + * prtable: + * Print out the table with the current score + */ +void prtable(score) +int score; +{ + prhand(Table, Tcnt, Tablewin, FALSE); + mvwprintw(Tablewin, (Tcnt + 2) * 2, Tcnt + 1, "%2d", score); + wrefresh(Tablewin); +} + +/* + * peg: + * Handle all the pegging... + */ +BOOLEAN peg(mycrib) +BOOLEAN mycrib; +{ + static CARD ch[CINHAND], ph[CINHAND]; + CARD crd; + register int i, j, k; + register int l; + register int cnum, pnum, sum; + register BOOLEAN myturn, mego, ugo, last, played; + + cnum = pnum = CINHAND; + for (i = 0; i < CINHAND; i++) { /* make copies of hands */ + ch[i] = chand[i]; + ph[i] = phand[i]; + } + Tcnt = 0; /* index to table of cards played */ + sum = 0; /* sum of cards played */ + mego = ugo = FALSE; + myturn = !mycrib; + for (;;) { + last = TRUE; /* enable last flag */ + prhand(ph, pnum, Playwin, FALSE); + prhand(ch, cnum, Compwin, TRUE); + prtable(sum); + if (myturn) { /* my tyrn to play */ + if (!anymove(ch, cnum, sum)) { /* if no card to play */ + if (!mego && cnum) { /* go for comp? */ + msg("GO"); + mego = TRUE; + } + if (anymove(ph, pnum, sum)) /* can player move? */ + myturn = !myturn; + else { /* give him his point */ + msg(quiet ? "You get one" : "You get one point"); + if (chkscr(&pscore, 1)) + return TRUE; + sum = 0; + mego = ugo = FALSE; + Tcnt = 0; + } + } + else { + played = TRUE; + j = -1; + k = 0; + for (i = 0; i < cnum; i++) { /* maximize score */ + l = pegscore(ch[i], Table, Tcnt, sum); + if (l > k) { + k = l; + j = i; + } + } + if (j < 0) /* if nothing scores */ + j = cchose(ch, cnum, sum); + crd = ch[j]; + cremove(crd, ch, cnum--); + sum += VAL(crd.rank); + Table[Tcnt++] = crd; + if (k > 0) { + addmsg(quiet ? "I get %d playing " : + "I get %d points playing ", k); + msgcard(crd, FALSE); + endmsg(); + if (chkscr(&cscore, k)) + return TRUE; + } + myturn = !myturn; + } + } + else { + if (!anymove(ph, pnum, sum)) { /* can player move? */ + if (!ugo && pnum) { /* go for player */ + msg("You have a GO"); + ugo = TRUE; + } + if (anymove(ch, cnum, sum)) /* can computer play? */ + myturn = !myturn; + else { + msg(quiet ? "I get one" : "I get one point"); + do_wait(); + if (chkscr(&cscore, 1)) + return TRUE; + sum = 0; + mego = ugo = FALSE; + Tcnt = 0; + } + } + else { /* player plays */ + played = FALSE; + if (pnum == 1) { + crd = ph[0]; + msg("You play your last card"); + } + else + for (;;) { + prhand(ph, pnum, Playwin, FALSE); + crd = ph[infrom(ph, pnum, "Your play: ")]; + if (sum + VAL(crd.rank) <= 31) + break; + else + msg("Total > 31 -- try again"); + } + makeknown(&crd, 1); + cremove(crd, ph, pnum--); + i = pegscore(crd, Table, Tcnt, sum); + sum += VAL(crd.rank); + Table[Tcnt++] = crd; + if (i > 0) { + msg(quiet ? "You got %d" : "You got %d points", i); + if (chkscr(&pscore, i)) + return TRUE; + } + myturn = !myturn; + } + } + if (sum >= 31) { + if (!myturn) + do_wait(); + sum = 0; + mego = ugo = FALSE; + Tcnt = 0; + last = FALSE; /* disable last flag */ + } + if (!pnum && !cnum) + break; /* both done */ + } + prhand(ph, pnum, Playwin, FALSE); + prhand(ch, cnum, Compwin, TRUE); + prtable(sum); + if (last) { + if (played) { + msg(quiet ? "I get one for last" : "I get one point for last"); + do_wait(); + if (chkscr(&cscore, 1)) + return TRUE; + } else { + msg(quiet ? "You get one for last" : + "You get one point for last"); + if (chkscr(&pscore, 1)) + return TRUE; + } + } + return FALSE; +} + +/* + * score: + * Handle the scoring of the hands + */ +BOOLEAN score(mycrib) +BOOLEAN mycrib; +{ + sorthand(crib, CINHAND); + if (mycrib) { + if (plyrhand(phand, "hand")) + return TRUE; + if (comphand(chand, "hand")) + return TRUE; + do_wait(); + if (comphand(crib, "crib")) + return TRUE; + } + else { + if (comphand(chand, "hand")) + return TRUE; + if (plyrhand(phand, "hand")) + return TRUE; + if (plyrhand(crib, "crib")) + return TRUE; + } + return FALSE; +} + +/* + * playhand: + * Do up one hand of the game + */ +BOOLEAN playhand(mycrib) +BOOLEAN mycrib; +{ + register int deckpos; + extern char Msgbuf[]; + + werase(Compwin); + + knownum = 0; + deckpos = deal(mycrib); + sorthand(chand, FULLHAND); + sorthand(phand, FULLHAND); + makeknown(chand, FULLHAND); + prhand(phand, FULLHAND, Playwin, FALSE); + discard(mycrib); + if (cut(mycrib, deckpos)) + return TRUE; + if (peg(mycrib)) + return TRUE; + werase(Tablewin); + wrefresh(Tablewin); + if (score(mycrib)) + return TRUE; + return FALSE; } /* @@ -151,7 +393,7 @@ gamescore() * Play one game up to glimit points. Actually, we only ASK the * player what card to turn. We do a random one, anyway. */ -game() +void game() { register int i, j; BOOLEAN flag; @@ -167,7 +409,7 @@ game() if (!rflag) { /* player cuts deck */ msg(quiet ? "Cut for crib? " : "Cut to see whose crib it is -- low card wins? "); - getline(); + getlin(); } i = (rand() >> 4) % CARDS; /* random cut */ do { /* comp cuts deck */ @@ -240,348 +482,86 @@ game() gamescore(); } -/* - * playhand: - * Do up one hand of the game - */ -playhand(mycrib) -BOOLEAN mycrib; +int main(argc, argv) +int argc; +char *argv[]; { - register int deckpos; - extern char Msgbuf[]; + register char *p; + BOOLEAN playing; + char *s; /* for reading arguments */ + char bust; /* flag for arg reader */ + FILE *f; - werase(Compwin); - - knownum = 0; - deckpos = deal(mycrib); - sorthand(chand, FULLHAND); - sorthand(phand, FULLHAND); - makeknown(chand, FULLHAND); - prhand(phand, FULLHAND, Playwin, FALSE); - discard(mycrib); - if (cut(mycrib, deckpos)) - return TRUE; - if (peg(mycrib)) - return TRUE; - werase(Tablewin); - wrefresh(Tablewin); - if (score(mycrib)) - return TRUE; - return FALSE; -} - - - -/* - * deal cards to both players from deck - */ - -deal( mycrib ) -{ - register int i, j; - - j = 0; - for( i = 0; i < FULLHAND; i++ ) { - if( mycrib ) { - phand[i] = deck[j++]; - chand[i] = deck[j++]; + while (--argc > 0) { + if ((*++argv)[0] != '-') { + fprintf(stderr, "\n\ncribbage: usage is 'cribbage [-eqr]'\n"); + exit(1); } - else { - chand[i] = deck[j++]; - phand[i] = deck[j++]; - } - } - return( j ); -} - -/* - * discard: - * Handle players discarding into the crib... - * Note: we call cdiscard() after prining first message so player doesn't wait - */ -discard(mycrib) -BOOLEAN mycrib; -{ - register char *prompt; - CARD crd; - - prcrib(mycrib, TRUE); - prompt = (quiet ? "Discard --> " : "Discard a card --> "); - cdiscard(mycrib); /* puts best discard at end */ - crd = phand[infrom(phand, FULLHAND, prompt)]; - remove(crd, phand, FULLHAND); - prhand(phand, FULLHAND, Playwin, FALSE); - crib[0] = crd; -/* next four lines same as last four except for cdiscard() */ - crd = phand[infrom(phand, FULLHAND - 1, prompt)]; - remove(crd, phand, FULLHAND - 1); - prhand(phand, FULLHAND, Playwin, FALSE); - crib[1] = crd; - crib[2] = chand[4]; - crib[3] = chand[5]; - chand[4].rank = chand[4].suit = chand[5].rank = chand[5].suit = EMPTY; -} - -/* - * cut: - * Cut the deck and set turnover. Actually, we only ASK the - * player what card to turn. We do a random one, anyway. - */ -cut(mycrib, pos) -BOOLEAN mycrib; -int pos; -{ - register int i, cardx; - BOOLEAN win = FALSE; - - if (mycrib) { - if (!rflag) { /* random cut */ - msg(quiet ? "Cut the deck? " : - "How many cards down do you wish to cut the deck? "); - getline(); - } - i = (rand() >> 4) % (CARDS - pos); - turnover = deck[i + pos]; - addmsg(quiet ? "You cut " : "You cut the "); - msgcard(turnover, FALSE); - endmsg(); - if (turnover.rank == JACK) { - msg("I get two for his heels"); - win = chkscr(&cscore,2 ); - } - } - else { - i = (rand() >> 4) % (CARDS - pos) + pos; - turnover = deck[i]; - addmsg(quiet ? "I cut " : "I cut the "); - msgcard(turnover, FALSE); - endmsg(); - if (turnover.rank == JACK) { - msg("You get two for his heels"); - win = chkscr(&pscore, 2); - } - } - makeknown(&turnover, 1); - prcrib(mycrib, FALSE); - return win; -} - -/* - * prcrib: - * Print out the turnover card with crib indicator - */ -prcrib(mycrib, blank) -BOOLEAN mycrib, blank; -{ - register int y, cardx; - - if (mycrib) - cardx = CRIB_X; - else - cardx = 0; - - mvaddstr(CRIB_Y, cardx + 1, "CRIB"); - prcard(stdscr, CRIB_Y + 1, cardx, turnover, blank); - - if (mycrib) - cardx = 0; - else - cardx = CRIB_X; - - for (y = CRIB_Y; y <= CRIB_Y + 5; y++) - mvaddstr(y, cardx, " "); -} - -/* - * peg: - * Handle all the pegging... - */ - -static CARD Table[14]; - -static int Tcnt; - -peg(mycrib) -BOOLEAN mycrib; -{ - static CARD ch[CINHAND], ph[CINHAND]; - CARD crd; - register int i, j, k; - register int l; - register int cnum, pnum, sum; - register BOOLEAN myturn, mego, ugo, last, played; - - cnum = pnum = CINHAND; - for (i = 0; i < CINHAND; i++) { /* make copies of hands */ - ch[i] = chand[i]; - ph[i] = phand[i]; - } - Tcnt = 0; /* index to table of cards played */ - sum = 0; /* sum of cards played */ - mego = ugo = FALSE; - myturn = !mycrib; - for (;;) { - last = TRUE; /* enable last flag */ - prhand(ph, pnum, Playwin, FALSE); - prhand(ch, cnum, Compwin, TRUE); - prtable(sum); - if (myturn) { /* my tyrn to play */ - if (!anymove(ch, cnum, sum)) { /* if no card to play */ - if (!mego && cnum) { /* go for comp? */ - msg("GO"); - mego = TRUE; - } - if (anymove(ph, pnum, sum)) /* can player move? */ - myturn = !myturn; - else { /* give him his point */ - msg(quiet ? "You get one" : "You get one point"); - if (chkscr(&pscore, 1)) - return TRUE; - sum = 0; - mego = ugo = FALSE; - Tcnt = 0; - } - } - else { - played = TRUE; - j = -1; - k = 0; - for (i = 0; i < cnum; i++) { /* maximize score */ - l = pegscore(ch[i], Table, Tcnt, sum); - if (l > k) { - k = l; - j = i; - } - } - if (j < 0) /* if nothing scores */ - j = cchose(ch, cnum, sum); - crd = ch[j]; - remove(crd, ch, cnum--); - sum += VAL(crd.rank); - Table[Tcnt++] = crd; - if (k > 0) { - addmsg(quiet ? "I get %d playing " : - "I get %d points playing ", k); - msgcard(crd, FALSE); - endmsg(); - if (chkscr(&cscore, k)) - return TRUE; - } - myturn = !myturn; + bust = FALSE; + for (s = argv[0] + 1; *s != 0; s++) { + switch (*s) { + case 'e': + explain = TRUE; + break; + case 'q': + quiet = TRUE; + break; + case 'r': + rflag = TRUE; + break; + default: + fprintf(stderr, "\n\ncribbage: usage is 'cribbage [-eqr]'\n"); + exit(2); + break; } + if (bust) + break; } - else { - if (!anymove(ph, pnum, sum)) { /* can player move? */ - if (!ugo && pnum) { /* go for player */ - msg("You have a GO"); - ugo = TRUE; - } - if (anymove(ch, cnum, sum)) /* can computer play? */ - myturn = !myturn; - else { - msg(quiet ? "I get one" : "I get one point"); - do_wait(); - if (chkscr(&cscore, 1)) - return TRUE; - sum = 0; - mego = ugo = FALSE; - Tcnt = 0; - } - } - else { /* player plays */ - played = FALSE; - if (pnum == 1) { - crd = ph[0]; - msg("You play your last card"); - } - else - for (;;) { - prhand(ph, pnum, Playwin, FALSE); - crd = ph[infrom(ph, pnum, "Your play: ")]; - if (sum + VAL(crd.rank) <= 31) - break; - else - msg("Total > 31 -- try again"); - } - makeknown(&crd, 1); - remove(crd, ph, pnum--); - i = pegscore(crd, Table, Tcnt, sum); - sum += VAL(crd.rank); - Table[Tcnt++] = crd; - if (i > 0) { - msg(quiet ? "You got %d" : "You got %d points", i); - if (chkscr(&pscore, i)) - return TRUE; - } - myturn = !myturn; - } - } - if (sum >= 31) { - if (!myturn) - do_wait(); - sum = 0; - mego = ugo = FALSE; - Tcnt = 0; - last = FALSE; /* disable last flag */ - } - if (!pnum && !cnum) - break; /* both done */ } - prhand(ph, pnum, Playwin, FALSE); - prhand(ch, cnum, Compwin, TRUE); - prtable(sum); - if (last) - if (played) { - msg(quiet ? "I get one for last" : "I get one point for last"); - do_wait(); - if (chkscr(&cscore, 1)) - return TRUE; - } - else { - msg(quiet ? "You get one for last" : - "You get one point for last"); - if (chkscr(&pscore, 1)) - return TRUE; - } - return FALSE; -} -/* - * prtable: - * Print out the table with the current score - */ -prtable(score) -int score; -{ - prhand(Table, Tcnt, Tablewin, FALSE); - mvwprintw(Tablewin, (Tcnt + 2) * 2, Tcnt + 1, "%2d", score); - wrefresh(Tablewin); -} + initscr(); + signal(SIGINT, bye); + crmode(); + noecho(); + Playwin = subwin(stdscr, PLAY_Y, PLAY_X, 0, 0); + Tablewin = subwin(stdscr, TABLE_Y, TABLE_X, 0, PLAY_X); + Compwin = subwin(stdscr, COMP_Y, COMP_X, 0, TABLE_X + PLAY_X); + Msgwin = subwin(stdscr, MSG_Y, MSG_X, Y_MSG_START, SCORE_X + 1); + leaveok(Playwin, TRUE); + leaveok(Tablewin, TRUE); + leaveok(Compwin, TRUE); + clearok(stdscr, FALSE); -/* - * score: - * Handle the scoring of the hands - */ -score(mycrib) -BOOLEAN mycrib; -{ - sorthand(crib, CINHAND); - if (mycrib) { - if (plyrhand(phand, "hand")) - return TRUE; - if (comphand(chand, "hand")) - return TRUE; - do_wait(); - if (comphand(crib, "crib")) - return TRUE; + if (!quiet) { + msg("Do you need instructions for cribbage? "); + if (getuchar() == 'Y') { + endwin(); + fflush(stdout); + system(INSTRCMD); + crmode(); + noecho(); + clear(); + refresh(); + msg("For the rules of this program, do \"man cribbage\""); + } } - else { - if (comphand(chand, "hand")) - return TRUE; - if (plyrhand(phand, "hand")) - return TRUE; - if (plyrhand(crib, "crib")) - return TRUE; + playing = TRUE; + do { + wclrtobot(Msgwin); + msg(quiet ? "L or S? " : "Long (to 121) or Short (to 61)? "); + if (glimit == SGAME) + glimit = (getuchar() == 'L' ? LGAME : SGAME); + else + glimit = (getuchar() == 'S' ? SGAME : LGAME); + game(); + msg("Another game? "); + playing = (getuchar() == 'Y'); + } while (playing); + + if ((f = fopen(LOGFILE, "a")) != NULL) { + fprintf(f, "Won %5.5d, Lost %5.5d\n", cgames, pgames); + fclose(f); } - return FALSE; + + bye(0); } diff --git a/src/games/cribbage/cribbage.h b/src/games/cribbage/cribbage.h index 9c0d793..4744abd 100644 --- a/src/games/cribbage/cribbage.h +++ b/src/games/cribbage/cribbage.h @@ -5,6 +5,7 @@ * * @(#)cribbage.h 5.1 (Berkeley) 5/30/85 */ +# include extern CARD deck[ CARDS ]; /* a deck */ extern CARD phand[ FULLHAND ]; /* player's hand */ @@ -30,5 +31,32 @@ extern BOOLEAN rflag; /* if all cuts random */ extern BOOLEAN quiet; /* if suppress random mess */ extern BOOLEAN playing; /* currently playing game */ -extern char expl[]; /* string for explanation */ +extern char explstr[]; /* string for explanation */ +char *getlin(void); +void bye(int sig); +void msg(char *fmt, ...); +void addmsg(char *fmt, ...); +BOOLEAN msgcard(CARD c, BOOLEAN brief); +void endmsg(void); +int getuchar(void); +void makedeck(CARD d[]); +void shuffle(CARD d[]); +void sorthand(CARD h[], int n); +void makeknown(CARD h[], int n); +void prhand(CARD h[], int n, WINDOW *win, BOOLEAN blank); +void prcard(WINDOW *win, int y, int x, CARD c, BOOLEAN blank); +void cdiscard(BOOLEAN mycrib); +int infrom(CARD hand[], int n, char *prompt); +void cremove(CARD a, CARD d[], int n); +BOOLEAN chkscr(int *scr, int inc); +BOOLEAN anymove(CARD hand[], int n, int sum); +int scorehand(CARD hand[], CARD starter, int n, BOOLEAN crb, BOOLEAN do_explain); +int number(int lo, int hi, char *prompt); +void do_wait(void); +int adjust(CARD cb[], CARD tnv); +int pegscore(CARD crd, CARD tbl[], int n, int sum); +int cchose(CARD h[], int n, int s); +BOOLEAN plyrhand(CARD hand[], char *s); +BOOLEAN comphand(CARD h[], char *s); +BOOLEAN isone(CARD a, CARD b[], int n); diff --git a/src/games/cribbage/deck.h b/src/games/cribbage/deck.h index c600be2..f820dc7 100644 --- a/src/games/cribbage/deck.h +++ b/src/games/cribbage/deck.h @@ -10,7 +10,6 @@ * define structure of a deck of cards and other related things */ - #define CARDS 52 /* number cards in deck */ #define RANKS 13 /* number ranks in deck */ #define SUITS 4 /* number suits in deck */ @@ -43,16 +42,14 @@ #define VAL(c) ( (c) < 9 ? (c)+1 : 10 ) /* val of rank */ - #ifndef TRUE -# define TRUE 1 -# define FALSE 0 +# define TRUE (1) +# define FALSE (0) #endif -typedef struct { - int rank; - int suit; - } CARD; - -typedef char BOOLEAN; +typedef struct { + int rank; + int suit; +} CARD; +typedef int BOOLEAN; diff --git a/src/games/cribbage/extern.c b/src/games/cribbage/extern.c index 4914957..d3511a8 100644 --- a/src/games/cribbage/extern.c +++ b/src/games/cribbage/extern.c @@ -3,21 +3,15 @@ * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. */ - -#ifndef lint -static char sccsid[] = "@(#)extern.c 5.1 (Berkeley) 5/30/85"; -#endif not lint - -# include # include "deck.h" # include "cribbage.h" -bool explain = FALSE; /* player mistakes explained */ -bool iwon = FALSE; /* if comp won last game */ -bool quiet = FALSE; /* if suppress random mess */ -bool rflag = FALSE; /* if all cuts random */ +BOOLEAN explain = FALSE; /* player mistakes explained */ +BOOLEAN iwon = FALSE; /* if comp won last game */ +BOOLEAN quiet = FALSE; /* if suppress random mess */ +BOOLEAN rflag = FALSE; /* if all cuts random */ -char expl[128]; /* explanation */ +char explstr[128]; /* explanation */ int cgames = 0; /* number games comp won */ int cscore = 0; /* comp score in this game */ diff --git a/src/games/cribbage/io.c b/src/games/cribbage/io.c index 4808d95..68f4651 100644 --- a/src/games/cribbage/io.c +++ b/src/games/cribbage/io.c @@ -3,32 +3,38 @@ * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. */ - -#ifndef lint -static char sccsid[] = "@(#)io.c 5.1 (Berkeley) 5/30/85"; -#endif not lint - -# include # include # include +# include +# include +# include +# include # include "deck.h" # include "cribbage.h" # include "cribcur.h" -# define LINESIZE 128 +# define LINESIZE 128 # ifdef CTRL # undef CTRL # endif -# define CTRL(X) ('X' - 'A' + 1) +# define CTRL(X) ('X' - 'A' + 1) -# ifndef erasechar() -# define erasechar() _tty.sg_erase -# endif erasechar() +# ifdef CROSS +# define erasechar() ('H' & 31) +# endif -# ifndef killchar() -# define killchar() _tty.sg_kill -# endif killchar() +# ifndef killchar +# define killchar() ('U' & 31) +# endif + +# ifndef erasechar +# define erasechar() _tty.sg_erase +# endif + +# ifndef killchar +# define killchar() _tty.sg_kill +# endif char linebuf[ LINESIZE ]; @@ -45,32 +51,14 @@ char *suitname[ SUITS ] = { "SPADES", "HEARTS", "DIAMONDS", char *suitchar[ SUITS ] = { "S", "H", "D", "C" }; - - -/* - * msgcard: - * Call msgcrd in one of two forms - */ -msgcard(c, brief) -CARD c; -BOOLEAN brief; -{ - if (brief) - return msgcrd(c, TRUE, (char *) NULL, TRUE); - else - return msgcrd(c, FALSE, " of ", FALSE); -} - - - /* * msgcrd: * Print the value of a card in ascii */ -msgcrd(c, brfrank, mid, brfsuit) -CARD c; -char *mid; -BOOLEAN brfrank, brfsuit; +BOOLEAN msgcrd(c, brfrank, mid, brfsuit) + CARD c; + char *mid; + BOOLEAN brfrank, brfsuit; { if (c.rank == EMPTY || c.suit == EMPTY) return FALSE; @@ -87,15 +75,29 @@ BOOLEAN brfrank, brfsuit; return TRUE; } +/* + * msgcard: + * Call msgcrd in one of two forms + */ +BOOLEAN msgcard(c, brief) + CARD c; + BOOLEAN brief; +{ + if (brief) + return msgcrd(c, TRUE, (char *) NULL, TRUE); + else + return msgcrd(c, FALSE, " of ", FALSE); +} + /* * printcard: * Print out a card. */ -printcard(win, cardno, c, blank) -WINDOW *win; -int cardno; -CARD c; -BOOLEAN blank; +void printcard(win, cardno, c, blank) + WINDOW *win; + int cardno; + CARD c; + BOOLEAN blank; { prcard(win, cardno * 2, cardno, c, blank); } @@ -104,11 +106,11 @@ BOOLEAN blank; * prcard: * Print out a card on the window at the specified location */ -prcard(win, y, x, c, blank) -WINDOW *win; -int y, x; -CARD c; -BOOLEAN blank; +void prcard(win, y, x, c, blank) + WINDOW *win; + int y, x; + CARD c; + BOOLEAN blank; { if (c.rank == EMPTY) return; @@ -129,11 +131,11 @@ BOOLEAN blank; * prhand: * Print a hand of n cards */ -prhand(h, n, win, blank) -CARD h[]; -int n; -WINDOW *win; -BOOLEAN blank; +void prhand(h, n, win, blank) + CARD h[]; + int n; + WINDOW *win; + BOOLEAN blank; { register int i; @@ -143,17 +145,96 @@ BOOLEAN blank; wrefresh(win); } +/* + * incard: + * Inputs a card in any format. It reads a line ending with a CR + * and then parses it. + */ +BOOLEAN incard(crd) + CARD *crd; +{ + register int i; + int rnk, sut; + char *line, *p, *p1; + BOOLEAN retval; + retval = FALSE; + rnk = sut = EMPTY; + if (!(line = getlin())) + goto gotit; + p = p1 = line; + while(*p1 != ' ' && *p1 != 0) + ++p1; + *p1++ = 0; + if(*p == 0) + goto gotit; + /* IMPORTANT: no real card has 2 char first name */ + if( strlen(p) == 2 ) { /* check for short form */ + rnk = EMPTY; + for( i = 0; i < RANKS; i++ ) { + if( *p == *rankchar[i] ) { + rnk = i; + break; + } + } + if( rnk == EMPTY ) goto gotit; /* it's nothing... */ + ++p; /* advance to next char */ + sut = EMPTY; + for( i = 0; i < SUITS; i++ ) { + if( *p == *suitchar[i] ) { + sut = i; + break; + } + } + if( sut != EMPTY ) retval = TRUE; + goto gotit; + } + rnk = EMPTY; + for( i = 0; i < RANKS; i++ ) { + if( !strcmp( p, rankname[i] ) || !strcmp( p, rankchar[i] ) ) { + rnk = i; + break; + } + } + if( rnk == EMPTY ) goto gotit; + p = p1; + while(*p1 != ' ' && *p1 != 0) + ++p1; + *p1++ = 0; + if(*p == 0) + goto gotit; + if(! strcmp("OF", p)) { + p = p1; + while(*p1 != ' ' && *p1 != 0) + ++p1; + *p1++ = 0; + if(*p == 0) + goto gotit; + } + sut = EMPTY; + for( i = 0; i < SUITS; i++ ) { + if( !strcmp( p, suitname[i] ) || !strcmp( p, suitchar[i] ) ) { + sut = i; + break; + } + } + if( sut != EMPTY ) + retval = TRUE; +gotit: + (*crd).rank = rnk; + (*crd).suit = sut; + return( retval ); +} /* * infrom: * reads a card, supposedly in hand, accepting unambigous brief * input, returns the index of the card found... */ -infrom(hand, n, prompt) -CARD hand[]; -int n; -char *prompt; +int infrom(hand, n, prompt) + CARD hand[]; + int n; + char *prompt; { register int i, j; CARD crd; @@ -202,90 +283,35 @@ char *prompt; /* NOTREACHED */ } - - /* - * incard: - * Inputs a card in any format. It reads a line ending with a CR - * and then parses it. + * readchar: + * Reads and returns a character, checking for gross input errors */ -incard(crd) -CARD *crd; +int readchar() { - char *getline(); - register int i; - int rnk, sut; - char *line, *p, *p1; - BOOLEAN retval; + register int cnt, y, x; + auto char c; - retval = FALSE; - rnk = sut = EMPTY; - if (!(line = getline())) - goto gotit; - p = p1 = line; - while( *p1 != ' ' && *p1 != NULL ) ++p1; - *p1++ = NULL; - if( *p == NULL ) goto gotit; - /* IMPORTANT: no real card has 2 char first name */ - if( strlen(p) == 2 ) { /* check for short form */ - rnk = EMPTY; - for( i = 0; i < RANKS; i++ ) { - if( *p == *rankchar[i] ) { - rnk = i; - break; - } - } - if( rnk == EMPTY ) goto gotit; /* it's nothing... */ - ++p; /* advance to next char */ - sut = EMPTY; - for( i = 0; i < SUITS; i++ ) { - if( *p == *suitchar[i] ) { - sut = i; - break; - } - } - if( sut != EMPTY ) retval = TRUE; - goto gotit; - } - rnk = EMPTY; - for( i = 0; i < RANKS; i++ ) { - if( !strcmp( p, rankname[i] ) || !strcmp( p, rankchar[i] ) ) { - rnk = i; - break; - } - } - if( rnk == EMPTY ) goto gotit; - p = p1; - while( *p1 != ' ' && *p1 != NULL ) ++p1; - *p1++ = NULL; - if( *p == NULL ) goto gotit; - if( !strcmp( "OF", p ) ) { - p = p1; - while( *p1 != ' ' && *p1 != NULL ) ++p1; - *p1++ = NULL; - if( *p == NULL ) goto gotit; - } - sut = EMPTY; - for( i = 0; i < SUITS; i++ ) { - if( !strcmp( p, suitname[i] ) || !strcmp( p, suitchar[i] ) ) { - sut = i; - break; - } - } - if( sut != EMPTY ) retval = TRUE; -gotit: - (*crd).rank = rnk; - (*crd).suit = sut; - return( retval ); +over: + cnt = 0; + while (read(0, &c, 1) <= 0) + if (cnt++ > 100) /* if we are getting infinite EOFs */ + bye(0); /* quit the game */ + if (c == CTRL(L)) { + wrefresh(curscr); + goto over; + } + if (c == '\r') + return '\n'; + else + return c; } - - /* * getuchar: * Reads and converts to upper case */ -getuchar() +int getuchar() { register int c; @@ -301,18 +327,17 @@ getuchar() * Reads in a decimal number and makes sure it is between "lo" and * "hi" inclusive. */ -number(lo, hi, prompt) -int lo, hi; -char *prompt; +int number(lo, hi, prompt) + int lo, hi; + char *prompt; { - char *getline(); register char *p; register int sum; sum = 0; for (;;) { msg(prompt); - if(!(p = getline()) || *p == NULL) { + if(!(p = getlin()) || *p == 0) { msg(quiet ? "Not a number" : "That doesn't look like a number"); continue; } @@ -326,7 +351,7 @@ char *prompt; ++p; } - if (*p != ' ' && *p != '\t' && *p != NULL) + if (*p != ' ' && *p != '\t' && *p != 0) sum = lo - 1; if (sum >= lo && sum <= hi) return sum; @@ -338,22 +363,46 @@ char *prompt; } } -/* - * msg: - * Display a message at the top of the screen. - */ char Msgbuf[BUFSIZ] = { '\0' }; int Mpos = 0; static int Newpos = 0; -/* VARARGS1 */ -msg(fmt, args) -char *fmt; -int args; +/* + * doadd: + * Perform an add onto the message buffer + */ +void doadd(char *fmt, va_list ap) { - doadd(fmt, &args); +#ifdef CROSS + vsnprintf(Msgbuf, BUFSIZ, fmt, ap); +#else + static FILE junk; + + /* + * Do the printf into Msgbuf + */ + junk._flag = _IOWRT + _IOSTRG; + junk._ptr = &Msgbuf[Newpos]; + junk._cnt = BUFSIZ - 1; + _doprnt(fmt, ap, &junk); + putc('\0', &junk); +#endif + Newpos = strlen(Msgbuf); +} + +/* + * msg: + * Display a message at the top of the screen. + */ +void msg(char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + doadd(fmt, ap); + va_end(ap); endmsg(); } @@ -362,21 +411,22 @@ int args; * Add things to the current message */ /* VARARGS1 */ -addmsg(fmt, args) -char *fmt; -int args; +void addmsg(char *fmt, ...) { - doadd(fmt, &args); + va_list ap; + + va_start(ap, fmt); + doadd(fmt, ap); + va_end(ap); } +int Lineno = 0; + /* * endmsg: * Display a new msg. */ - -int Lineno = 0; - -endmsg() +void endmsg() { register int len; register char *mp, *omp; @@ -423,31 +473,27 @@ endmsg() } /* - * doadd: - * Perform an add onto the message buffer + * wait_for + * Sit around until the guy types the right key */ -doadd(fmt, args) -char *fmt; -int *args; +void wait_for(ch) + register int ch; { - static FILE junk; + register int c; - /* - * Do the printf into Msgbuf - */ - junk._flag = _IOWRT + _IOSTRG; - junk._ptr = &Msgbuf[Newpos]; - junk._cnt = 32767; - _doprnt(fmt, args, &junk); - putc('\0', &junk); - Newpos = strlen(Msgbuf); + if (ch == '\n') + while ((c = readchar()) != '\n') + continue; + else + while (readchar() != ch) + continue; } /* * do_wait: * Wait for the user to type ' ' before doing anything else */ -do_wait() +void do_wait() { register int line; static char prompt[] = { '-', '-', 'M', 'o', 'r', 'e', '-', '-', '\0' }; @@ -466,53 +512,11 @@ do_wait() } /* - * wait_for - * Sit around until the guy types the right key - */ -wait_for(ch) -register char ch; -{ - register char c; - - if (ch == '\n') - while ((c = readchar()) != '\n') - continue; - else - while (readchar() != ch) - continue; -} - -/* - * readchar: - * Reads and returns a character, checking for gross input errors - */ -readchar() -{ - register int cnt, y, x; - auto char c; - -over: - cnt = 0; - while (read(0, &c, 1) <= 0) - if (cnt++ > 100) /* if we are getting infinite EOFs */ - bye(); /* quit the game */ - if (c == CTRL(L)) { - wrefresh(curscr); - goto over; - } - if (c == '\r') - return '\n'; - else - return c; -} - -/* - * getline: + * getlin: * Reads the next line up to '\n' or EOF. Multiple spaces are * compressed to one space; a space is inserted before a ',' */ -char * -getline() +char *getlin() { register char *sp; register int c, oy, ox; @@ -564,7 +568,7 @@ getline() * bye: * Leave the program, cleaning things up as we go. */ -bye() +void bye(int sig) { signal(SIGINT, SIG_IGN); mvcur(0, COLS - 1, LINES - 1, 0); diff --git a/src/games/cribbage/score.c b/src/games/cribbage/score.c index ff8c942..20094ca 100644 --- a/src/games/cribbage/score.c +++ b/src/games/cribbage/score.c @@ -3,23 +3,18 @@ * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. */ - -#ifndef lint -static char sccsid[] = "@(#)score.c 5.1 (Berkeley) 5/30/85"; -#endif not lint - #include +#include +#include #include "deck.h" #include "cribbage.h" - /* * the following arrays give the sum of the scores of the (50 2)*48 = 58800 * hands obtainable for the crib given the two cards whose ranks index the * array. the two arrays are for the case where the suits are equal and * not equal respectively */ - long crbescr[ 169 ] = { -10000, 271827, 278883, 332319, 347769, 261129, 250653, 253203, 248259, 243435, 256275, 237435, 231051, -10000, -10000, 412815, 295707, 349497, @@ -66,90 +61,13 @@ long crbnescr[ 169 ] = { static int ichoose2[ 5 ] = { 0, 0, 2, 6, 12 }; static int pairpoints, runpoints; /* globals from pairuns */ - -/* - * scorehand: - * Score the given hand of n cards and the starter card. - * n must be <= 4 - */ -scorehand(hand, starter, n, crb, do_explain) -register CARD hand[]; -CARD starter; -int n; -BOOLEAN crb; /* true if scoring crib */ -BOOLEAN do_explain; /* true if must explain this hand */ -{ - CARD h[(CINHAND + 1)]; - register int i, k; - register int score; - register BOOLEAN flag; - char buf[32]; - - expl[0] = NULL; /* initialize explanation */ - score = 0; - flag = TRUE; - k = hand[0].suit; - for (i = 0; i < n; i++) { /* check for flush */ - flag = (flag && (hand[i].suit == k)); - if (hand[i].rank == JACK) /* check for his nibs */ - if (hand[i].suit == starter.suit) { - score++; - if (do_explain) - strcat(expl, "His Nobs"); - } - h[i] = hand[i]; - } - - if (flag && n >= CINHAND) { - if (do_explain && expl[0] != NULL) - strcat(expl, ", "); - if (starter.suit == k) { - score += 5; - if (do_explain) - strcat(expl, "Five-flush"); - } - else if (!crb) { - score += 4; - if (do_explain && expl[0] != NULL) - strcat(expl, ", Four-flush"); - else - strcpy(expl, "Four-flush"); - } - } - - if (do_explain && expl[0] != NULL) - strcat(expl, ", "); - h[n] = starter; - sorthand(h, n + 1); /* sort by rank */ - i = 2 * fifteens(h, n + 1); - score += i; - if (do_explain) - if (i > 0) { - sprintf(buf, "%d points in fifteens", i); - strcat(expl, buf); - } - else - strcat(expl, "No fifteens"); - i = pairuns(h, n + 1); - score += i; - if (do_explain) - if (i > 0) { - sprintf(buf, ", %d points in pairs, %d in runs", pairpoints, - runpoints); - strcat(expl, buf); - } - else - strcat(expl, ", No pairs/runs"); - return score; -} - /* * fifteens: * Return number of fifteens in hand of n cards */ -fifteens(hand, n) -register CARD hand[]; -int n; +int fifteens(hand, n) + register CARD hand[]; + int n; { register int *sp, *np; register int i; @@ -183,19 +101,15 @@ int n; return sums[14]; } - - /* * pairuns returns the number of points in the n card sorted hand * due to pairs and runs * this routine only works if n is strictly less than 6 * sets the globals pairpoints and runpoints appropriately */ - -pairuns( h, n ) - - CARD h[]; - int n; +int pairuns( h, n ) + CARD h[]; + int n; { register int i; int runlength, runmult, lastmult, curmult; @@ -260,18 +174,91 @@ pairuns( h, n ) return( pairpoints + runpoints ); } +/* + * scorehand: + * Score the given hand of n cards and the starter card. + * n must be <= 4 + */ +int scorehand(hand, starter, n, crb, do_explain) + register CARD hand[]; + CARD starter; + int n; + BOOLEAN crb; /* true if scoring crib */ + BOOLEAN do_explain; /* true if must explain this hand */ +{ + CARD h[(CINHAND + 1)]; + register int i, k; + register int score; + register BOOLEAN flag; + char buf[32]; + explstr[0] = 0; /* initialize explanation */ + score = 0; + flag = TRUE; + k = hand[0].suit; + for (i = 0; i < n; i++) { /* check for flush */ + flag = (flag && (hand[i].suit == k)); + if (hand[i].rank == JACK) /* check for his nibs */ + if (hand[i].suit == starter.suit) { + score++; + if (do_explain) + strcat(explstr, "His Nobs"); + } + h[i] = hand[i]; + } + + if (flag && n >= CINHAND) { + if (do_explain && explstr[0] != 0) + strcat(explstr, ", "); + if (starter.suit == k) { + score += 5; + if (do_explain) + strcat(explstr, "Five-flush"); + } + else if (!crb) { + score += 4; + if (do_explain && explstr[0] != 0) + strcat(explstr, ", Four-flush"); + else + strcpy(explstr, "Four-flush"); + } + } + + if (do_explain && explstr[0] != 0) + strcat(explstr, ", "); + h[n] = starter; + sorthand(h, n + 1); /* sort by rank */ + i = 2 * fifteens(h, n + 1); + score += i; + if (do_explain) { + if (i > 0) { + sprintf(buf, "%d points in fifteens", i); + strcat(explstr, buf); + } else + strcat(explstr, "No fifteens"); + } + i = pairuns(h, n + 1); + score += i; + if (do_explain) { + if (i > 0) { + sprintf(buf, ", %d points in pairs, %d in runs", pairpoints, + runpoints); + strcat(explstr, buf); + } + else + strcat(explstr, ", No pairs/runs"); + } + return score; +} /* * pegscore tells how many points crd would get if played after * the n cards in tbl during pegging */ - -pegscore( crd, tbl, n, sum ) - - CARD crd, tbl[]; - int n; - int sum; +int pegscore( crd, tbl, n, sum ) + CARD crd, tbl[]; + int n; + int sum; { BOOLEAN got[ RANKS ]; register int i, j, scr; @@ -302,17 +289,13 @@ pegscore( crd, tbl, n, sum ) else return( scr ); } - - /* * adjust takes a two card hand that will be put in the crib * and returns an adjusted normalized score for the number of * points such a crib will get. */ - -adjust( cb, tnv ) - - CARD cb[], tnv; +int adjust( cb, tnv ) + CARD cb[], tnv; { int i, c0, c1; long scr; @@ -332,6 +315,3 @@ adjust( cb, tnv ) } return( (scr + 29400)/58800 ); } - - - diff --git a/src/games/cribbage/support.c b/src/games/cribbage/support.c index 867ad01..54d815d 100644 --- a/src/games/cribbage/support.c +++ b/src/games/cribbage/support.c @@ -3,33 +3,58 @@ * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. */ - -#ifndef lint -static char sccsid[] = "@(#)support.c 5.1 (Berkeley) 5/30/85"; -#endif not lint - -#include +#include #include "deck.h" #include "cribbage.h" #include "cribcur.h" - #define NTV 10 /* number scores to test */ /* score to test reachability of, and order to test them in */ int tv[ NTV ] = { 8, 7, 9, 6, 11, 12, 13, 14, 10, 5 }; +/* + * anysumto returns the index (0 <= i < n) of the card in hand that brings + * the s up to t, or -1 if there is none + */ +int anysumto( hand, n, s, t ) + CARD hand[]; + int n; + int s, t; +{ + register int i; + + for( i = 0; i < n; i++ ) { + if( s + VAL( hand[i].rank ) == t ) return( i ); + } + return( -1 ); +} + +/* + * return the number of cards in h having the given rank value + */ +int numofval( h, n, v ) + CARD h[]; + int n; + int v; +{ + register int i, j; + + j = 0; + for( i = 0; i < n; i++ ) { + if( VAL( h[i].rank ) == v ) ++j; + } + return( j ); +} /* * computer chooses what to play in pegging... * only called if no playable card will score points */ - -cchose( h, n, s ) - - CARD h[]; - int n; - int s; +int cchose( h, n, s ) + CARD h[]; + int n; + int s; { register int i, j, l; @@ -79,15 +104,13 @@ cchose( h, n, s ) return( j ); } - - /* * plyrhand: * Evaluate and score a player hand or crib */ -plyrhand(hand, s) -CARD hand[]; -char *s; +BOOLEAN plyrhand(hand, s) + CARD hand[]; + char *s; { register int i, j; register BOOLEAN win; @@ -110,7 +133,7 @@ char *s; msg("You should have taken %d, not %d!", i, j); } if (explain) - msg("Explanation: %s", expl); + msg("Explanation: %s", explstr); do_wait(); } else @@ -122,9 +145,9 @@ char *s; * comphand: * Handle scoring and displaying the computers hand */ -comphand(h, s) -CARD h[]; -char *s; +BOOLEAN comphand(h, s) + CARD h[]; + char *s; { register int j; @@ -134,39 +157,17 @@ char *s; return chkscr(&cscore, j); } -/* - * chkscr: - * Add inc to scr and test for > glimit, printing on the scoring - * board while we're at it. - */ - int Lastscore[2] = {-1, -1}; -chkscr(scr, inc) -int *scr, inc; -{ - BOOLEAN myturn; - - myturn = (scr == &cscore); - if (inc != 0) { - prpeg(Lastscore[myturn], '.', myturn); - Lastscore[myturn] = *scr; - *scr += inc; - prpeg(*scr, PEG, myturn); - refresh(); - } - return (*scr >= glimit); -} - /* * prpeg: * Put out the peg character on the score board and put the * score up on the board. */ -prpeg(score, peg, myturn) -register int score; -char peg; -BOOLEAN myturn; +void prpeg(score, peg, myturn) + register int score; + char peg; + BOOLEAN myturn; { register int y, x; @@ -198,13 +199,32 @@ BOOLEAN myturn; mvprintw(SCORE_Y + (myturn ? 7 : 1), SCORE_X + 10, "%3d", score); } +/* + * chkscr: + * Add inc to scr and test for > glimit, printing on the scoring + * board while we're at it. + */ +BOOLEAN chkscr(scr, inc) + int *scr, inc; +{ + BOOLEAN myturn; + + myturn = (scr == &cscore); + if (inc != 0) { + prpeg(Lastscore[myturn], '.', myturn); + Lastscore[myturn] = *scr; + *scr += inc; + prpeg(*scr, PEG, myturn); + refresh(); + } + return (*scr >= glimit); +} + /* * cdiscard -- the computer figures out what is the best discard for * the crib and puts the best two cards at the end */ - -cdiscard( mycrib ) - +void cdiscard( mycrib ) BOOLEAN mycrib; { CARD d[ CARDS ], h[ FULLHAND ], cb[ 2 ]; @@ -217,7 +237,7 @@ cdiscard( mycrib ) makedeck( d ); nc = CARDS; for( i = 0; i < knownum; i++ ) { /* get all other cards */ - remove( known[i], d, nc-- ); + cremove( known[i], d, nc-- ); } for( i = 0; i < 15; i++ ) sums[i] = 0L; ns = 0; @@ -226,8 +246,8 @@ cdiscard( mycrib ) for( j = i + 1; j < FULLHAND; j++ ) { cb[1] = chand[j]; for( k = 0; k < FULLHAND; k++ ) h[k] = chand[k]; - remove( chand[i], h, FULLHAND ); - remove( chand[j], h, FULLHAND - 1 ); + cremove( chand[i], h, FULLHAND ); + cremove( chand[j], h, FULLHAND - 1 ); for( k = 0; k < nc; k++ ) { sums[ns] += scorehand( h, d[k], CINHAND, TRUE, FALSE ); if( mycrib ) sums[ns] += adjust( cb, d[k] ); @@ -239,20 +259,16 @@ cdiscard( mycrib ) j = 0; for( i = 1; i < 15; i++ ) if( sums[i] > sums[j] ) j = i; for( k = 0; k < FULLHAND; k++ ) h[k] = chand[k]; - remove( h[ undo1[j] ], chand, FULLHAND ); - remove( h[ undo2[j] ], chand, FULLHAND - 1 ); + cremove( h[ undo1[j] ], chand, FULLHAND ); + cremove( h[ undo2[j] ], chand, FULLHAND - 1 ); chand[4] = h[ undo1[j] ]; chand[5] = h[ undo2[j] ]; } - - /* * returns true if some card in hand can be played without exceeding 31 */ - -anymove( hand, n, sum ) - +BOOLEAN anymove( hand, n, sum ) CARD hand[]; int n; int sum; @@ -267,57 +283,10 @@ anymove( hand, n, sum ) return( sum + VAL( j ) <= 31 ); } - - -/* - * anysumto returns the index (0 <= i < n) of the card in hand that brings - * the s up to t, or -1 if there is none - */ - -anysumto( hand, n, s, t ) - - CARD hand[]; - int n; - int s, t; -{ - register int i; - - for( i = 0; i < n; i++ ) { - if( s + VAL( hand[i].rank ) == t ) return( i ); - } - return( -1 ); -} - - - - -/* - * return the number of cards in h having the given rank value - */ - -numofval( h, n, v ) - - CARD h[]; - int n; - int v; -{ - register int i, j; - - j = 0; - for( i = 0; i < n; i++ ) { - if( VAL( h[i].rank ) == v ) ++j; - } - return( j ); -} - - - /* * makeknown remembers all n cards in h for future recall */ - -makeknown( h, n ) - +void makeknown( h, n ) CARD h[]; int n; { @@ -327,4 +296,3 @@ makeknown( h, n ) known[ knownum++ ] = h[i]; } } - diff --git a/src/games/cribbage/test.c b/src/games/cribbage/test.c index 44f2f61..70bb045 100644 --- a/src/games/cribbage/test.c +++ b/src/games/cribbage/test.c @@ -3,17 +3,6 @@ * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. */ - -#ifndef lint -char copyright[] = -"@(#) Copyright (c) 1980 Regents of the University of California.\n\ - All rights reserved.\n"; -#endif not lint - -#ifndef lint -static char sccsid[] = "@(#)test.c 5.1 (Berkeley) 5/30/85"; -#endif not lint - #include #include "deck.h" @@ -34,7 +23,7 @@ main( argc, argv ) int i, j, is, n, sum, sum2; CARD ic, jc; CARD d[ CARDS]; - extern char expl[]; + extern char explstr[]; printf( "Assuming cards are same suit\n" ); if( argc == 2 ) { @@ -57,8 +46,8 @@ main( argc, argv ) hand[1] = jc; for( k = 0; k < CARDS; k++ ) d[k] = deck[k]; n = CARDS; - remove( ic, d, n-- ); - remove( jc, d, n-- ); + cremove( ic, d, n-- ); + cremove( jc, d, n-- ); sum = 0; sum2 = 0; for( k = 0; k < n - 1; k++ ) { /* 3rd card */ @@ -90,7 +79,7 @@ main( argc, argv ) hand[3].suit = 0; hand[4].suit = 0; printf("scorehand of hand = %d\n", scorehand(hand, hand[4], CINHAND, FALSE, TRUE)); - printf("\t%s\n", expl); + printf("\t%s\n", explstr); hand[0].rank = 0; hand[1].rank = 1; hand[2].rank = 2; @@ -102,7 +91,7 @@ main( argc, argv ) hand[3].suit = 0; hand[4].suit = 0; printf("scorehand of crib = %d\n", scorehand(hand, hand[4], CINHAND, TRUE, TRUE)); - printf("\t%s\n", expl); + printf("\t%s\n", explstr); hand[0].rank = 0; hand[1].rank = 1; hand[2].rank = 2; @@ -114,7 +103,7 @@ main( argc, argv ) hand[3].suit = 0; hand[4].suit = 1; printf("scorehand of hand = %d\n", scorehand(hand, hand[4], CINHAND, FALSE, TRUE)); - printf("\t%s\n", expl); + printf("\t%s\n", explstr); hand[0].rank = 0; hand[1].rank = 1; hand[2].rank = 2; @@ -126,6 +115,6 @@ main( argc, argv ) hand[3].suit = 0; hand[4].suit = 1; printf("scorehand of crib = %d\n", scorehand(hand, hand[4], CINHAND, TRUE, TRUE)); - printf("\t%s\n", expl); + printf("\t%s\n", explstr); # endif } diff --git a/src/games/fortune/.gitignore b/src/games/fortune/.gitignore new file mode 100644 index 0000000..ce43652 --- /dev/null +++ b/src/games/fortune/.gitignore @@ -0,0 +1 @@ +fortune diff --git a/src/games/fortune/Makefile b/src/games/fortune/Makefile index cedde4e..e133edc 100644 --- a/src/games/fortune/Makefile +++ b/src/games/fortune/Makefile @@ -1,72 +1,45 @@ -FORTUNES= scene obscene -SOURCE= fortune.c strfile.h strfile.c rnd.c unstr.c $(FORTUNES) -TFILES= Troff.mac Troff.sed Do_troff -LIBDIR= /usr/games/lib -BINDIR= /usr/games -OWN= arnold -GRP= arpa -DEFS= -SEPFLAG= -i -CFLAGS= -O $(DEFS) -SFLAGS= -r -TDEV= -Pver -TROFF= ditroff $(TDEV) -DESTDIR= +TOPSRC = $(shell cd ../../..; pwd) +include $(TOPSRC)/target.mk +#include $(TOPSRC)/cross.mk -all: fortune strfile unstr fortunes.dat +CFLAGS += -O -Werror -Wall +LIBS = -lc -fortune: fortune.o rnd.o - $(CC) ${SEPFLAG} $(CFLAGS) -o fortune fortune.o rnd.o +OBJS = fortune.o +MAN = fortune.0 +MANSRC = fortune.6 -strfile: strfile.o rnd.o - $(CC) ${SEPFLAG} $(CFLAGS) -o strfile strfile.o rnd.o +all: fortune $(MAN) fortunes.dat -unstr: unstr.o - $(CC) ${SEPFLAG} $(CFLAGS) -o unstr unstr.o +fortune: $(OBJS) + $(CC) $(LDFLAGS) -o fortune.elf $(OBJS) $(LIBS) + $(OBJDUMP) -S fortune.elf > fortune.dis + $(SIZE) fortune.elf + $(ELF2AOUT) fortune.elf $@ && rm fortune.elf -fortune.o strfile.o unstr.o: strfile.h +strfile: strfile.o + $(CC) $(LDFLAGS) -o strfile strfile.o -fortunes.dat: fortunes strfile - ./strfile $(SFLAGS) fortunes +unstr: unstr.o + $(CC) $(LDFLAGS) -o unstr unstr.o -fortunes: $(FORTUNES) - cp scene fortunes - echo "%-" >> fortunes - cat obscene >> fortunes +fortunes.dat: #fortunes strfile + ./strfile -r fortunes -lint: - lint -hxb $(DEFS) fortune.c rnd.c 2>&1 > fortune.lint - lint -hxb $(DEFS) strfile.c rnd.c 2>&1 > strfile.lint - lint -hxb $(DEFS) unstr.c 2>&1 > unstr.lint +fortunes: scene obscene + cp scene fortunes + echo "%-" >> fortunes + cat obscene >> fortunes -install: all install.data - install -s -m 4711 -o daemon fortune $(DESTDIR)$(BINDIR) +$(MAN): $(MANSRC) + $(MANROFF) $< > $@ -install.data: fortunes.dat - install -m 600 -o daemon fortunes.dat $(DESTDIR)$(LIBDIR) +clean: + rm -f *.o *.0 *.elf $(MAN) fortune strfile unstr fortunes *.elf *.dis tags *~ -troff: troff.scene troff.obscene +install: all + install fortune $(DESTDIR)/games/ + cp $(MAN) $(DESTDIR)/share/man/cat6/ + cp fortunes.dat $(DESTDIR)/games/lib/ -troff.scene: - ./Do_troff scene $(TROFF) - -troff.obscene: - ./Do_troff obscene $(TROFF) - -clean: sort.clean - rm -f fortune fortunes fortunes.dat strfile unstr ? core *.o - -sort: sort.scene sort.obscene - -sort.scene: strfile unstr - strfile -oi scene - mv scene Oscene - unstr -o scene - -sort.obscene: strfile unstr - strfile -oi obscene - mv obscene Oobscene - unstr -o obscene - -sort.clean: - rm -f Oscene Oobscene +#$(OBJS): fortune.h diff --git a/src/games/fortune/Makefile.orig b/src/games/fortune/Makefile.orig new file mode 100644 index 0000000..cedde4e --- /dev/null +++ b/src/games/fortune/Makefile.orig @@ -0,0 +1,72 @@ +FORTUNES= scene obscene +SOURCE= fortune.c strfile.h strfile.c rnd.c unstr.c $(FORTUNES) +TFILES= Troff.mac Troff.sed Do_troff +LIBDIR= /usr/games/lib +BINDIR= /usr/games +OWN= arnold +GRP= arpa +DEFS= +SEPFLAG= -i +CFLAGS= -O $(DEFS) +SFLAGS= -r +TDEV= -Pver +TROFF= ditroff $(TDEV) +DESTDIR= + +all: fortune strfile unstr fortunes.dat + +fortune: fortune.o rnd.o + $(CC) ${SEPFLAG} $(CFLAGS) -o fortune fortune.o rnd.o + +strfile: strfile.o rnd.o + $(CC) ${SEPFLAG} $(CFLAGS) -o strfile strfile.o rnd.o + +unstr: unstr.o + $(CC) ${SEPFLAG} $(CFLAGS) -o unstr unstr.o + +fortune.o strfile.o unstr.o: strfile.h + +fortunes.dat: fortunes strfile + ./strfile $(SFLAGS) fortunes + +fortunes: $(FORTUNES) + cp scene fortunes + echo "%-" >> fortunes + cat obscene >> fortunes + +lint: + lint -hxb $(DEFS) fortune.c rnd.c 2>&1 > fortune.lint + lint -hxb $(DEFS) strfile.c rnd.c 2>&1 > strfile.lint + lint -hxb $(DEFS) unstr.c 2>&1 > unstr.lint + +install: all install.data + install -s -m 4711 -o daemon fortune $(DESTDIR)$(BINDIR) + +install.data: fortunes.dat + install -m 600 -o daemon fortunes.dat $(DESTDIR)$(LIBDIR) + +troff: troff.scene troff.obscene + +troff.scene: + ./Do_troff scene $(TROFF) + +troff.obscene: + ./Do_troff obscene $(TROFF) + +clean: sort.clean + rm -f fortune fortunes fortunes.dat strfile unstr ? core *.o + +sort: sort.scene sort.obscene + +sort.scene: strfile unstr + strfile -oi scene + mv scene Oscene + unstr -o scene + +sort.obscene: strfile unstr + strfile -oi obscene + mv obscene Oobscene + unstr -o obscene + +sort.clean: + rm -f Oscene Oobscene diff --git a/src/games/fortune/fortune.6 b/src/games/fortune/fortune.6 index 150456f..97a000b 100644 --- a/src/games/fortune/fortune.6 +++ b/src/games/fortune/fortune.6 @@ -40,8 +40,8 @@ often used for potentially offensive ones. .B \-a Choose from either list of adages. .PP -..The user may specify a file of adages. -..This file must be created by strfile(6), +.. The user may specify a file of adages. +.. This file must be created by strfile(6), ..and be given by the user as ...it file. ..Only one such file may be named, diff --git a/src/games/fortune/fortune.c b/src/games/fortune/fortune.c index 6253dea..97dae60 100644 --- a/src/games/fortune/fortune.c +++ b/src/games/fortune/fortune.c @@ -1,21 +1,31 @@ /* $Header: fortune.c,v 1.10 85/11/01 15:19:49 arnold Exp $ */ -# include -# include -# include -# include "strfile.h" +#include +#ifdef CROSS +# include +#else +# include +#endif +#include +#include +#include +#include +#include "strfile.h" -# define TRUE 1 -# define FALSE 0 -# define bool short +#define TRUE 1 +#define FALSE 0 -# define MINW 6 /* minimum wait if desired */ -# define CPERS 20 /* # of chars for each sec */ -# define SLEN 160 /* # of chars in short fortune */ +#define MINW 6 /* minimum wait if desired */ +#define CPERS 20 /* # of chars for each sec */ +#define SLEN 160 /* # of chars in short fortune */ -# define FORTFILE "/usr/games/lib/fortunes.dat" +#ifdef CROSS +# define FORTFILE "/usr/local/games/fortunes.dat" +#else +# define FORTFILE "/games/lib/fortunes.dat" +#endif -bool Wflag = FALSE, /* wait desired after fortune */ +int Wflag = FALSE, /* wait desired after fortune */ Sflag = FALSE, /* short fortune desired */ Lflag = FALSE, /* long fortune desired */ Oflag = FALSE, /* offensive fortunes only */ @@ -41,70 +51,11 @@ FILE *Inf; /* input file */ STRFILE Tbl; /* input table */ -time_t time(); - -main(ac, av) -int ac; -char *av[]; -{ - register char c; - register int nchar = 0; - register int i; - - getargs(ac, av); - if ((Inf = fopen(Fortfile, "r+")) == NULL) { - perror(Fortfile); - exit(-1); - } - fread((char *) &Tbl, sizeof Tbl, 1, Inf); /* NOSTRICT */ - if (Tbl.str_longlen <= SLEN && Lflag) { - puts("Sorry, no long strings in this file"); - exit(0); - } - if (Tbl.str_shortlen > SLEN && Sflag) { - puts("Sorry, no short strings in this file"); - exit(0); - } - - /* - * initialize the pointer to the first -o fortune if need be. - */ - if (Tbl.str_delims[2] == 0) - Tbl.str_delims[2] = Tbl.str_delims[0]; - - do { - getfort(); - } while ((Sflag && !is_short()) || (Lflag && !is_long())); - - fseek(Inf, Seekpts[0], 0); - while (c = getc(Inf)) { - nchar++; - putchar(c); - } - fflush(stdout); - fseek(Inf, 0L, 0); -#ifdef LOCK_EX - /* - * if we can, we exclusive lock, but since it isn't very - * important, we just punt if we don't have easy locking - * available. - */ - flock(fileno(Inf), LOCK_EX); -#endif LOCK_EX - fwrite(&Tbl, 1, sizeof Tbl, Inf); -#ifdef LOCK_EX - flock(fileno(Inf), LOCK_UN); -#endif LOCK_EX - if (Wflag) - sleep(max((int) nchar / CPERS, MINW)); - exit(0); -} - /* * is_short: * Return TRUE if fortune is "short". */ -is_short() +int is_short() { register int nchar; @@ -121,7 +72,7 @@ is_short() * is_long: * Return TRUE if fortune is "long". */ -is_long() +int is_long() { register int nchar; @@ -137,9 +88,7 @@ is_long() /* * This routine evaluates the arguments on the command line */ -getargs(ac, av) -register int ac; -register char *av[]; +void getargs(int ac, char **av) { register int i; register char *sp; @@ -182,9 +131,9 @@ register char *av[]; * few numbers to avoid any non- * randomness in startup */ - srnd(time(NULL) + getpid()); + srandom(time(NULL) + getpid()); for (j = 0; j < 20; j++) - (void) rnd(100); + (void) random(); break; default: printf("unknown flag: '%c'\n", *sp); @@ -202,7 +151,7 @@ register char *av[]; * getfort: * Get the fortune data file's seek pointer for the next fortune. */ -getfort() +void getfort() { register int fortune; @@ -216,7 +165,7 @@ getfort() Tbl.str_delims[2] = Tbl.str_delims[0]; if (Aflag) { - if (rnd(Tbl.str_numstr) < Tbl.str_delims[0]) + if (random() % Tbl.str_numstr < Tbl.str_delims[0]) fortune = Tbl.str_delims[1]++; else fortune = Tbl.str_delims[2]++; @@ -227,11 +176,70 @@ getfort() fortune = Tbl.str_delims[1]++; fseek(Inf, (long)(sizeof Seekpts[0]) * fortune + sizeof Tbl, 0); - fread((char *) Seekpts, (sizeof Seekpts[0]), 2, Inf); + if (fread((char *) Seekpts, (sizeof Seekpts[0]), 2, Inf) != 2) { + puts("Error reading data from strings file"); + exit(0); + } } -max(i, j) -register int i, j; +int max(int i, int j) { return (i >= j ? i : j); } + +int main(int ac, char **av) +{ + register char c; + register int nchar = 0; + + getargs(ac, av); + if ((Inf = fopen(Fortfile, "r+")) == NULL) { + perror(Fortfile); + exit(-1); + } + if (fread((char *) &Tbl, sizeof Tbl, 1, Inf) != 1) { + puts("Error reading strings file"); + exit(0); + } + if (Tbl.str_longlen <= SLEN && Lflag) { + puts("Sorry, no long strings in this file"); + exit(0); + } + if (Tbl.str_shortlen > SLEN && Sflag) { + puts("Sorry, no short strings in this file"); + exit(0); + } + + /* + * initialize the pointer to the first -o fortune if need be. + */ + if (Tbl.str_delims[2] == 0) + Tbl.str_delims[2] = Tbl.str_delims[0]; + + do { + getfort(); + } while ((Sflag && !is_short()) || (Lflag && !is_long())); + + fseek(Inf, Seekpts[0], 0); + while ((c = getc(Inf))) { + nchar++; + putchar(c); + } + fflush(stdout); + fseek(Inf, 0L, 0); +#ifdef LOCK_EX + /* + * if we can, we exclusive lock, but since it isn't very + * important, we just punt if we don't have easy locking + * available. + */ + flock(fileno(Inf), LOCK_EX); +#endif + fwrite(&Tbl, 1, sizeof Tbl, Inf); +#ifdef LOCK_EX + flock(fileno(Inf), LOCK_UN); +#endif + if (Wflag) + sleep(max((int) nchar / CPERS, MINW)); + exit(0); +} diff --git a/src/games/fortune/fortunes.dat b/src/games/fortune/fortunes.dat new file mode 100644 index 0000000..869c7d7 Binary files /dev/null and b/src/games/fortune/fortunes.dat differ diff --git a/src/games/fortune/rnd.c b/src/games/fortune/rnd.c index 946b460..e43c352 100644 --- a/src/games/fortune/rnd.c +++ b/src/games/fortune/rnd.c @@ -1,13 +1,14 @@ /* * code for when the good (berkeley) random number generator is around */ +#include -rnd(num) +int rnd(int num) { return (random() % num); } -srnd(num) +void srnd(int num) { srandom(num); } @@ -38,7 +39,7 @@ static char sccsid[] = "@(#)random.c 4.2 (Berkeley) 83/01/02"; * zeroeth element of the array is the type of R.N.G. being used (small * integer); the remainder of the array is the state information for the * R.N.G. Thus, 32 bytes of state information will give 7 longs worth of - * state information, which will allow a degree seven polynomial. (Note: the + * state information, which will allow a degree seven polynomial. (Note: the * zeroeth word of state information also has some other information stored * in it -- see setstate() for details). * The random number generation technique is a linear feedback shift register @@ -120,13 +121,13 @@ static int seps[ MAX_TYPES ] = { SEP_0, SEP_1, SEP_2, */ static long randtbl[ DEG_3 + 1 ] = { TYPE_3, - 0x9a319039, 0x32d9c024, 0x9b663182, 0x5da1f342, - 0xde3b81e0, 0xdf0a6fb5, 0xf103bc02, 0x48f340fb, - 0x7449e56b, 0xbeb1dbb0, 0xab5c5918, 0x946554fd, - 0x8c2e680f, 0xeb3d799f, 0xb11ee0b7, 0x2d436b86, - 0xda672e2a, 0x1588ca88, 0xe369735d, 0x904f35f7, - 0xd7158fd6, 0x6fa6f051, 0x616e6b96, 0xac94efdc, - 0x36413f93, 0xc622c298, 0xf5a42ab8, 0x8a88d77b, + 0x9a319039, 0x32d9c024, 0x9b663182, 0x5da1f342, + 0xde3b81e0, 0xdf0a6fb5, 0xf103bc02, 0x48f340fb, + 0x7449e56b, 0xbeb1dbb0, 0xab5c5918, 0x946554fd, + 0x8c2e680f, 0xeb3d799f, 0xb11ee0b7, 0x2d436b86, + 0xda672e2a, 0x1588ca88, 0xe369735d, 0x904f35f7, + 0xd7158fd6, 0x6fa6f051, 0x616e6b96, 0xac94efdc, + 0x36413f93, 0xc622c298, 0xf5a42ab8, 0x8a88d77b, 0xf5ad9d0e, 0x8999220b, 0x27fb47b9 }; /* @@ -344,7 +345,7 @@ long random() { long i; - + if( rand_type == TYPE_0 ) { i = state[0] = ( state[0]*1103515245 + 12345 )&0x7fffffff; } @@ -362,4 +363,4 @@ random() return( i ); } -#endif NO_RANDOM +#endif /* NO_RANDOM */ diff --git a/src/games/fortune/strfile.c b/src/games/fortune/strfile.c index 00ce2aa..b607b3d 100644 --- a/src/games/fortune/strfile.c +++ b/src/games/fortune/strfile.c @@ -1,6 +1,16 @@ -# include -# include -# include "strfile.h" +#include +#ifdef CROSS +# include +# include +#else +# include +# include +#endif +#include +#include +#include +#include +#include "strfile.h" /* * This program takes a file composed of strings seperated by @@ -18,7 +28,7 @@ * the run. * v - Verbose. Give summary of data processed. (Default) * o - order the strings in alphabetic order - * i - if ordering, ignore case + * i - if ordering, ignore case * r - randomize the order of the strings * * Ken Arnold Sept. 7, 1978 -- @@ -31,10 +41,10 @@ * Added ordering options. */ -# define TRUE 1 -# define FALSE 0 +#define TRUE 1 +#define FALSE 0 -# define DELIM_CH '-' +#define DELIM_CH '-' typedef struct { char first; @@ -71,13 +81,187 @@ STRFILE Tbl; /* statistics table */ STR *Firstch; /* first chars of each string */ -char *fgets(), *malloc(), *strcpy(), *strcat(); +/* + * This routine evaluates arguments from the command line + */ +void getargs(int ac, char **av) +{ + register char *sp; + register int i; + register int bad, j; -long ftell(); + bad = 0; + for (i = 1; i < ac; i++) + if (*av[i] == '-' && av[i][1]) { + for (sp = &av[i][1]; *sp; sp++) + switch (*sp) { + case 'c': /* new delimiting char */ + if ((Delimch = *++sp) == '\0') { + --sp; + Delimch = *av[++i]; + } + if (Delimch <= 0 || Delimch > '~' || + Delimch == DELIM_CH) { + printf("bad delimiting character: '\\%o\n'", + Delimch); + bad++; + } + break; + case 's': /* silent */ + Sflag++; + break; + case 'v': /* verbose */ + Sflag = 0; + break; + case 'o': /* order strings */ + Oflag++; + break; + case 'i': /* ignore case in ordering */ + Iflag++; + break; + case 'r': /* ignore case in ordering */ + Rflag++; + break; + default: /* unknown flag */ + bad++; + printf("bad flag: '%c'\n", *sp); + break; + } + } + else if (*av[i] == '-') { + for (j = 0; Usage[j]; j++) + puts(Usage[j]); + exit(0); + } + else if (Infile) + (void) strcpy(Outfile, av[i]); + else + Infile = av[i]; + if (!Infile) { + bad++; + puts("No input file name"); + } + if (*Outfile == '\0' && !bad) { + (void) strcpy(Outfile, Infile); + (void) strcat(Outfile, ".dat"); + } + if (bad) { + puts("use \"strfile -\" to get usage"); + exit(-1); + } +} -main(ac, av) -int ac; -char **av; +/* + * do_order: + * Order the strings alphabetically (possibly ignoring case). + */ +void do_order(long *seekpts, FILE *outf) +{ + register int i; + register long *lp; + register STR *fp; + extern int cmp_str(); + + (void) fflush(outf); + Sort_1 = fopen(Outfile, "r"); + Sort_2 = fopen(Outfile, "r"); + Seekpts = seekpts; + qsort((char *) Firstch, Tbl.str_numstr, sizeof *Firstch, cmp_str); + i = Tbl.str_numstr; + lp = seekpts; + fp = Firstch; + while (i--) + *lp++ = fp++->pos; + (void) fclose(Sort_1); + (void) fclose(Sort_2); + Tbl.str_flags |= STR_ORDERED; +} + +/* + * cmp_str: + * Compare two strings in the file + */ +int cmp_str(STR *p1, STR *p2) +{ + register int c1, c2; + + c1 = p1->first; + c2 = p2->first; + if (c1 != c2) + return c1 - c2; + + (void) fseek(Sort_1, p1->pos, 0); + (void) fseek(Sort_2, p2->pos, 0); + + while (!isalnum(c1 = getc(Sort_1)) && c1 != '\0') + continue; + while (!isalnum(c2 = getc(Sort_2)) && c2 != '\0') + continue; + + while (c1 != '\0' && c2 != '\0') { + if (Iflag) { + if (isupper(c1)) + c1 = tolower(c1); + if (isupper(c2)) + c2 = tolower(c2); + } + if (c1 != c2) + return c1 - c2; + c1 = getc(Sort_1); + c2 = getc(Sort_2); + } + return c1 - c2; +} + +/* + * randomize: + * Randomize the order of the string table. We must be careful + * not to randomize across delimiter boundaries. All + * randomization is done within each block. + */ +void randomize(long *seekpts) +{ + register int cnt, i, j, start; + register long tmp; + register long *origsp; + + Tbl.str_flags |= STR_RANDOM; + srandom(time((long *) NULL) + getpid()); + origsp = seekpts; + for (j = 0; j <= Delim; j++) { + + /* + * get the starting place for the block + */ + + if (j == 0) + start = 0; + else + start = Tbl.str_delims[j - 1]; + + /* + * get the ending point + */ + + if (j == Delim) + cnt = Tbl.str_numstr; + else + cnt = Tbl.str_delims[j]; + + /* + * move things around randomly + */ + + for (seekpts = &origsp[start]; cnt > start; cnt--, seekpts++) { + i = random() % (cnt - start); + tmp = seekpts[0]; + seekpts[0] = seekpts[i]; + seekpts[i] = tmp; + } + } +} + +int main(int ac, char **av) { register char *sp, dc; register long *lp; @@ -206,189 +390,3 @@ char **av; } exit(0); } - -/* - * This routine evaluates arguments from the command line - */ -getargs(ac, av) -register int ac; -register char **av; -{ - register char *sp; - register int i; - register int bad, j; - - bad = 0; - for (i = 1; i < ac; i++) - if (*av[i] == '-' && av[i][1]) { - for (sp = &av[i][1]; *sp; sp++) - switch (*sp) { - case 'c': /* new delimiting char */ - if ((Delimch = *++sp) == '\0') { - --sp; - Delimch = *av[++i]; - } - if (Delimch <= 0 || Delimch > '~' || - Delimch == DELIM_CH) { - printf("bad delimiting character: '\\%o\n'", - Delimch); - bad++; - } - break; - case 's': /* silent */ - Sflag++; - break; - case 'v': /* verbose */ - Sflag = 0; - break; - case 'o': /* order strings */ - Oflag++; - break; - case 'i': /* ignore case in ordering */ - Iflag++; - break; - case 'r': /* ignore case in ordering */ - Rflag++; - break; - default: /* unknown flag */ - bad++; - printf("bad flag: '%c'\n", *sp); - break; - } - } - else if (*av[i] == '-') { - for (j = 0; Usage[j]; j++) - puts(Usage[j]); - exit(0); - } - else if (Infile) - (void) strcpy(Outfile, av[i]); - else - Infile = av[i]; - if (!Infile) { - bad++; - puts("No input file name"); - } - if (*Outfile == '\0' && !bad) { - (void) strcpy(Outfile, Infile); - (void) strcat(Outfile, ".dat"); - } - if (bad) { - puts("use \"strfile -\" to get usage"); - exit(-1); - } -} - -/* - * do_order: - * Order the strings alphabetically (possibly ignoring case). - */ -do_order(seekpts, outf) -long *seekpts; -FILE *outf; -{ - register int i; - register long *lp; - register STR *fp; - extern int cmp_str(); - - (void) fflush(outf); - Sort_1 = fopen(Outfile, "r"); - Sort_2 = fopen(Outfile, "r"); - Seekpts = seekpts; - qsort((char *) Firstch, Tbl.str_numstr, sizeof *Firstch, cmp_str); - i = Tbl.str_numstr; - lp = seekpts; - fp = Firstch; - while (i--) - *lp++ = fp++->pos; - (void) fclose(Sort_1); - (void) fclose(Sort_2); - Tbl.str_flags |= STR_ORDERED; -} - -/* - * cmp_str: - * Compare two strings in the file - */ -cmp_str(p1, p2) -STR *p1, *p2; -{ - register int c1, c2; - - c1 = p1->first; - c2 = p2->first; - if (c1 != c2) - return c1 - c2; - - (void) fseek(Sort_1, p1->pos, 0); - (void) fseek(Sort_2, p2->pos, 0); - - while (!isalnum(c1 = getc(Sort_1)) && c1 != '\0') - continue; - while (!isalnum(c2 = getc(Sort_2)) && c2 != '\0') - continue; - - while (c1 != '\0' && c2 != '\0') { - if (Iflag) { - if (isupper(c1)) - c1 = tolower(c1); - if (isupper(c2)) - c2 = tolower(c2); - } - if (c1 != c2) - return c1 - c2; - c1 = getc(Sort_1); - c2 = getc(Sort_2); - } - return c1 - c2; -} - -/* - * randomize: - * Randomize the order of the string table. We must be careful - * not to randomize across delimiter boundaries. All - * randomization is done within each block. - */ -randomize(seekpts) -register long *seekpts; -{ - register int cnt, i, j, start; - register long tmp; - register long *origsp; - - Tbl.str_flags |= STR_RANDOM; - srnd(time((long *) NULL) + getpid()); - origsp = seekpts; - for (j = 0; j <= Delim; j++) { - - /* - * get the starting place for the block - */ - - if (j == 0) - start = 0; - else - start = Tbl.str_delims[j - 1]; - - /* - * get the ending point - */ - - if (j == Delim) - cnt = Tbl.str_numstr; - else - cnt = Tbl.str_delims[j]; - - /* - * move things around randomly - */ - - for (seekpts = &origsp[start]; cnt > start; cnt--, seekpts++) { - i = rnd(cnt - start); - tmp = seekpts[0]; - seekpts[0] = seekpts[i]; - seekpts[i] = tmp; - } - } -} diff --git a/src/games/hangman/.gitignore b/src/games/hangman/.gitignore new file mode 100644 index 0000000..2469edc --- /dev/null +++ b/src/games/hangman/.gitignore @@ -0,0 +1 @@ +hangman diff --git a/src/games/hangman/Makefile b/src/games/hangman/Makefile index 99bd640..4c08ea3 100644 --- a/src/games/hangman/Makefile +++ b/src/games/hangman/Makefile @@ -1,22 +1,28 @@ -OBJS= endgame.o extern.o getguess.o getword.o main.o playgame.o \ - prdata.o prman.o prword.o setup.o -CFILES= endgame.c extern.c getguess.c getword.c main.c playgame.c \ - prdata.c prman.c prword.c setup.c -HDRS= hangman.h -CFLAGS= -O -LDFLAGS= -SEPFLAG= -i +TOPSRC = $(shell cd ../../..; pwd) +include $(TOPSRC)/target.mk +#include $(TOPSRC)/cross.mk -all: hangman +CFLAGS += -Werror -Wall -tags: $(HDRS) $(CFILES) - ctags $(HDRS) $(CFILES) +OBJS = endgame.o extern.o getguess.o getword.o main.o playgame.o \ + prdata.o prman.o prword.o setup.o +MAN = hangman.0 +LIBS = -lcurses -ltermcap -lc -install: hangman - install -s hangman $(DESTDIR)/usr/games/hangman - -hangman: $(OBJS) - $(CC) ${SEPFLAG} $(LDFLAGS) -o hangman $(OBJS) -lcurses -ltermlib +all: hangman $(MAN) + +hangman: $(OBJS) + $(CC) $(LDFLAGS) -o $@.elf $(OBJS) $(LIBS) + $(OBJDUMP) -S $@.elf > $@.dis + $(SIZE) $@.elf + $(ELF2AOUT) $@.elf $@ && rm $@.elf + +$(MAN): hangman.6 + nroff -man $< > $@ clean: - rm -f $(OBJS) hangman ? core + rm -f *.o core hangman *.0 *.dis + +install: all + install hangman $(DESTDIR)/games/ + install -m 644 $(MAN) $(DESTDIR)/share/man/cat6/ diff --git a/src/games/hangman/endgame.c b/src/games/hangman/endgame.c index 4bbe4cb..7a531d4 100644 --- a/src/games/hangman/endgame.c +++ b/src/games/hangman/endgame.c @@ -1,9 +1,10 @@ -# include "hangman.h" +#include "hangman.h" /* * endgame: * Do what's necessary at the end of the game */ +void endgame() { register char ch; @@ -24,7 +25,7 @@ endgame() leaveok(stdscr, FALSE); refresh(); if ((ch = readch()) == 'n') - die(); + die(0); else if (ch == 'y') break; mvaddstr(MESGY + 2, MESGX, "Please type 'y' or 'n'"); diff --git a/src/games/hangman/extern.c b/src/games/hangman/extern.c index 4b4fc47..7d3227f 100644 --- a/src/games/hangman/extern.c +++ b/src/games/hangman/extern.c @@ -1,4 +1,4 @@ -# include "hangman.h" +#include "hangman.h" bool Guessed[26]; diff --git a/src/games/hangman/getguess.c b/src/games/hangman/getguess.c index 3aa31b0..531dba0 100644 --- a/src/games/hangman/getguess.c +++ b/src/games/hangman/getguess.c @@ -1,9 +1,41 @@ -# include "hangman.h" +#include +#include "hangman.h" + +#ifndef CTRL +# define CTRL(c) (c & 037) +#endif + +/* + * readch; + * Read a character from the input + */ +int +readch() +{ + register int cnt; + auto char ch; + + cnt = 0; + for (;;) { + if (read(0, &ch, sizeof ch) <= 0) + { + if (++cnt > 100) + die(0); + } + else if (ch == CTRL('L')) { + wrefresh(curscr); + mvcur(0, 0, curscr->_cury, curscr->_curx); + } + else + return ch; + } +} /* * getguess: * Get another guess */ +void getguess() { register int i; @@ -23,8 +55,8 @@ getguess() else break; } - else if (ch == CTRL(D)) - die(); + else if (ch == CTRL('D')) + die(0); else mvprintw(MESGY, MESGX, "Not a valid guess: '%s'", unctrl(ch)); @@ -43,28 +75,3 @@ getguess() if (!correct) Errors++; } - -/* - * readch; - * Read a character from the input - */ -readch() -{ - register int cnt, r; - auto char ch; - - cnt = 0; - for (;;) { - if (read(0, &ch, sizeof ch) <= 0) - { - if (++cnt > 100) - die(); - } - else if (ch == CTRL(L)) { - wrefresh(curscr); - mvcur(0, 0, curscr->_cury, curscr->_curx); - } - else - return ch; - } -} diff --git a/src/games/hangman/getword.c b/src/games/hangman/getword.c index b28c0ce..0fb6545 100644 --- a/src/games/hangman/getword.c +++ b/src/games/hangman/getword.c @@ -1,15 +1,26 @@ -# include "hangman.h" +#include +#include +#include "hangman.h" -# if pdp11 -# define RN (((off_t) rand() << 16) | (off_t) rand()) -# else -# define RN rand() -# endif +/* + * abs: + * Return the absolute value of an integer + */ +off_t +offabs(i) +off_t i; +{ + if (i < 0) + return -(off_t) i; + else + return (off_t) i; +} /* * getword: * Get a valid word out of the dictionary file */ +void getword() { register FILE *inf; @@ -17,7 +28,7 @@ getword() inf = Dict; for (;;) { - fseek(inf, abs(RN % Dict_size), 0); + fseek(inf, offabs(random() % Dict_size), 0); if (fgets(Word, BUFSIZ, inf) == NULL) continue; if (fgets(Word, BUFSIZ, inf) == NULL) @@ -39,17 +50,3 @@ cont: ; } *gp = '\0'; } - -/* - * abs: - * Return the absolute value of an integer - */ -off_t -abs(i) -off_t i; -{ - if (i < 0) - return -(off_t) i; - else - return (off_t) i; -} diff --git a/src/games/hangman/hangman.h b/src/games/hangman/hangman.h index 78af604..05011e4 100644 --- a/src/games/hangman/hangman.h +++ b/src/games/hangman/hangman.h @@ -1,26 +1,30 @@ -# include -# include -# include -# include -# include +#include +#include +#include +#include +#include +#include -# define MINLEN 6 -# define MAXERRS 7 -# define DICT "/usr/dict/words" - -# define MESGY 12 -# define MESGX 0 -# define PROMPTY 11 -# define PROMPTX 0 -# define KNOWNY 10 -# define KNOWNX 1 -# define NUMBERY 4 -# define NUMBERX (COLS - 1 - 26) -# define AVGY 5 -# define AVGX (COLS - 1 - 26) -# define GUESSY 2 -# define GUESSX (COLS - 1 - 26) +#define MINLEN 6 +#define MAXERRS 7 +#ifdef CROSS +# define DICT "/usr/local/share/dict/words" +#else +# define DICT "/share/dict/words" +#endif +#define MESGY 12 +#define MESGX 0 +#define PROMPTY 11 +#define PROMPTX 0 +#define KNOWNY 10 +#define KNOWNX 1 +#define NUMBERY 4 +#define NUMBERX (COLS - 1 - 26) +#define AVGY 5 +#define AVGX (COLS - 1 - 26) +#define GUESSY 2 +#define GUESSX (COLS - 1 - 26) typedef struct { short y, x; @@ -41,6 +45,15 @@ extern FILE *Dict; extern off_t Dict_size; -int die(); +void die(int); -off_t abs(); +off_t offabs(off_t); +void prman(void); +void prword(void); +void prdata(void); +void setup(void); +void playgame(void); +void getword(void); +void getguess(void); +void endgame(void); +int readch(void); diff --git a/src/games/hangman/main.c b/src/games/hangman/main.c index 5a03d83..3bfc280 100644 --- a/src/games/hangman/main.c +++ b/src/games/hangman/main.c @@ -1,9 +1,22 @@ -# include "hangman.h" +#include +#include "hangman.h" + +/* + * die: + * Die properly. + */ +void die(int sig) +{ + mvcur(0, COLS - 1, LINES - 1, 0); + endwin(); + putchar('\n'); + exit(0); +} /* * This game written by Ken Arnold. */ -main() +int main() { initscr(); signal(SIGINT, die); @@ -15,15 +28,3 @@ main() } /* NOTREACHED */ } - -/* - * die: - * Die properly. - */ -die() -{ - mvcur(0, COLS - 1, LINES - 1, 0); - endwin(); - putchar('\n'); - exit(0); -} diff --git a/src/games/hangman/playgame.c b/src/games/hangman/playgame.c index d0ca809..74166e1 100644 --- a/src/games/hangman/playgame.c +++ b/src/games/hangman/playgame.c @@ -1,9 +1,11 @@ -# include "hangman.h" +#include +#include "hangman.h" /* * playgame: * play a game */ +void playgame() { register bool *bp; diff --git a/src/games/hangman/prdata.c b/src/games/hangman/prdata.c index 8874bca..1bdcd2b 100644 --- a/src/games/hangman/prdata.c +++ b/src/games/hangman/prdata.c @@ -1,9 +1,10 @@ -# include "hangman.h" +#include "hangman.h" /* * prdata: * Print out the current guesses */ +void prdata() { register bool *bp; diff --git a/src/games/hangman/prman.c b/src/games/hangman/prman.c index 4d1d976..eaba163 100644 --- a/src/games/hangman/prman.c +++ b/src/games/hangman/prman.c @@ -1,10 +1,11 @@ -# include "hangman.h" +#include "hangman.h" /* * prman: * Print out the man appropriately for the give number * of incorrect guesses. */ +void prman() { register int i; diff --git a/src/games/hangman/prword.c b/src/games/hangman/prword.c index 1770028..29a8072 100644 --- a/src/games/hangman/prword.c +++ b/src/games/hangman/prword.c @@ -1,9 +1,10 @@ -# include "hangman.h" +#include "hangman.h" /* * prword: * Print out the current state of the word */ +void prword() { move(KNOWNY, KNOWNX + sizeof "Word: "); diff --git a/src/games/hangman/setup.c b/src/games/hangman/setup.c index bda8511..73353e2 100644 --- a/src/games/hangman/setup.c +++ b/src/games/hangman/setup.c @@ -1,9 +1,13 @@ -# include "hangman.h" +#include +#include +#include +#include "hangman.h" /* * setup: * Set up the strings on the screen. */ +void setup() { register char **sp; @@ -24,7 +28,7 @@ setup() addstr(*sp); } - srand(time(NULL) + getpid()); + srandom(time(NULL) + getpid()); if ((Dict = fopen(DICT, "r")) == NULL) { perror(DICT); endwin(); diff --git a/src/games/mille/.gitignore b/src/games/mille/.gitignore new file mode 100644 index 0000000..712ad3d --- /dev/null +++ b/src/games/mille/.gitignore @@ -0,0 +1 @@ +mille diff --git a/src/games/mille/Makefile b/src/games/mille/Makefile index 4f40253..2a7bccb 100644 --- a/src/games/mille/Makefile +++ b/src/games/mille/Makefile @@ -1,75 +1,32 @@ # # mille bourne game makefile # -HEADERS=mille.h -CFILES= comp.c end.c extern.c init.c mille.c misc.c move.c print.c \ - roll.c save.c types.c varpush.c -OBJS= comp.o end.o extern.o init.o mille.o misc.o move.o print.o \ - roll.o save.o types.o varpush.o -POBJS= comp.po end.po extern.po init.po mille.po misc.po move.po \ - roll.po print.po save.po types.po varpush.po -# CRL= /jb/ingres/arnold/=lib/=curses/crlib -# CRL= =curses/screen/libcurses.a -CRL= -# L= -ltermlib -L= -lcurses -ltermlib -LIBS= ${CRL} ${L} -DEFS= -CFLAGS= -O ${DEFS} -SEPFLAG= -i -LDFLAGS= -DESTDIR= -BINDIR= /usr/games -.SUFFIXES: .po .i +TOPSRC = $(shell cd ../../..; pwd) +include $(TOPSRC)/target.mk +#include $(TOPSRC)/cross.mk +#CFLAGS = -O -DCROSS -Werror -Wall -.c.po: - rm -f x.c ; ln $*.c x.c - ${CC} ${CFLAGS} -p -c x.c - mv x.o $*.po +CFLAGS += -Werror -Wall -.c.i: - ${CC} ${LDFLAGS} -P $*.c +OBJS = comp.o end.o extern.o init.o mille.o misc.o move.o print.o \ + roll.o save.o types.o varpush.o +MAN = mille.0 +LIBS = -lcurses -ltermcap -lc -a.out: ${OBJS} ${CRL} - ${CC} ${SEPFLAG} ${LDFLAGS} ${OBJS} ${LIBS} +all: mille $(MAN) -mille: ${OBJS} ${CRL} - ${CC} ${SEPFLAG} ${CFLAGS} -o mille ${OBJS} ${LIBS} +mille: $(OBJS) + $(CC) $(LDFLAGS) -o $@.elf $(OBJS) $(LIBS) + $(OBJDUMP) -S $@.elf > $@.dis + $(SIZE) $@.elf + $(ELF2AOUT) $@.elf $@ && rm $@.elf -install: mille - install -s mille ${DESTDIR}${BINDIR} - -pmb: ${POBJS} ../pcrlib - ${CC} ${SEPFLAG} ${CFLAGS} -p -o pmb ${POBJS} ../pcrlib -ltermlib - -mille.po: mille.c - rm -f x.c ; ln mille.c x.c - ${CC} ${CFLAGS} -DPROF -p -c x.c - mv x.o mille.po - -table: table.o extern.o - ${CC} ${SEPFLAG} ${CFLAGS} -i -o table table.o extern.o - -readdump: readdump.o extern.o varpush.o - ${CC} ${SEPFLAG} ${CFLAGS} -i -o readdump readdump.o extern.o varpush.o - -ctags: - ctags ${HEADERS} ${CFILES} - ed - tags < :ctfix - sort tags -o tags - -lint: - lint -hxb ${DEFS} ${CFILES} ${L} > lint.out - -mille.ar: - ar ruv mille.ar Makefile tags ${HEADERS} ${CFILES} - -tar: - tar rvf /dev/rmt0 Makefile tags :ctfix ${HEADERS} ${CFILES} - -lpr: - pr Makefile ${HEADERS} ${CFILES} tags | lpr ; lpq +$(MAN): mille.6 + nroff -man $< > $@ clean: - rm -f ${OBJS} ${POBJS} core ? a.out errs mille lint.out mille.ar \ - tags pmb + rm -f *.o core mille *.0 *.dis + +install: all + install mille $(DESTDIR)/games/ + install -m 644 $(MAN) $(DESTDIR)/share/man/cat6/ diff --git a/src/games/mille/comp.c b/src/games/mille/comp.c index c5faa90..c0f5d3e 100644 --- a/src/games/mille/comp.c +++ b/src/games/mille/comp.c @@ -1,11 +1,12 @@ -# include "mille.h" +#include "mille.h" /* * @(#)comp.c 1.1 (Berkeley) 4/1/82 */ -# define V_VALUABLE 40 +#define V_VALUABLE 40 +void calcmove() { register CARD card; @@ -33,7 +34,8 @@ calcmove() switch (card) { case C_STOP: case C_CRASH: case C_FLAT: case C_EMPTY: - if (playit[i] = canplay(pp, op, card)) + playit[i] = canplay(pp, op, card); + if (playit[i]) canstop = TRUE; goto norm; case C_LIMIT: @@ -350,6 +352,7 @@ play_it: mvprintw(MOVE_Y + 2, MOVE_X, "%16s", C_name[pp->hand[Card_no]]); } +int onecard(pp) register PLAY *pp; { @@ -382,6 +385,7 @@ register PLAY *pp; return FALSE; } +int canplay(pp, op, card) register PLAY *pp, *op; register CARD card; diff --git a/src/games/mille/end.c b/src/games/mille/end.c index 34ca469..2c58d58 100644 --- a/src/games/mille/end.c +++ b/src/games/mille/end.c @@ -8,10 +8,11 @@ * print out the score as if it was final, and add the totals for * the end-of-games points to the user who deserves it (if any). */ +void finalscore(pp) -reg PLAY *pp; { +PLAY *pp; { - reg int temp, tot, num; + int temp, tot, num; if (pp->was_finished == Finished) return; @@ -45,13 +46,14 @@ reg PLAY *pp; { } } -# ifdef EXTRAP +#ifdef EXTRAP static int Last_tot[2]; /* last tot used for extrapolate */ /* * print out the score as if it was final, and add the totals for * the end-of-games points to the user who deserves it (if any). */ +void extrapolate(pp) reg PLAY *pp; { @@ -96,6 +98,7 @@ reg PLAY *pp; { Last_tot[num] = tot; } +void undoex() { reg PLAY *pp; @@ -107,5 +110,4 @@ undoex() { pp->hand_tot -= Last_tot[i++]; } } -# endif - +#endif diff --git a/src/games/mille/extern.c b/src/games/mille/extern.c index d762c81..b16781a 100644 --- a/src/games/mille/extern.c +++ b/src/games/mille/extern.c @@ -25,7 +25,7 @@ char *C_fmt = "%-18.18s", /* format for printing cards */ "Flat Tire", "Accident", "Stop", - "Speed Limit", + "Speed Limit", "Gasoline", "Spare Tire", "Repairs", @@ -71,7 +71,7 @@ int Card_no, /* Card number for current move */ 1, /* C_RIGHT_WAY */ 0 /* C_INIT */ }; - Numneed[NUM_CARDS] = { /* number of cards needed per hand */ +int Numneed[NUM_CARDS] = { /* number of cards needed per hand */ 0, /* C_25 */ 0, /* C_50 */ 0, /* C_75 */ @@ -132,4 +132,3 @@ PLAY Player[2]; /* Player descriptions */ WINDOW *Board, /* Playing field screen */ *Miles, /* Mileage screen */ *Score; /* Score screen */ - diff --git a/src/games/mille/init.c b/src/games/mille/init.c index 32e90e9..5f3d0af 100644 --- a/src/games/mille/init.c +++ b/src/games/mille/init.c @@ -1,14 +1,15 @@ -# include "mille.h" +#include "mille.h" +#include /* * @(#)init.c 1.1 (Berkeley) 4/1/82 */ - +void init() { - reg PLAY *pp; - reg int i, j; - reg CARD card; + PLAY *pp; + int i, j; + CARD card; bzero(Numseen, sizeof Numseen); Numgos = 0; @@ -47,10 +48,11 @@ init() { End = 700; } +void shuffle() { - reg int i, r; - reg CARD temp; + int i, r; + CARD temp; for (i = 0; i < DECK_SZ; i++) { r = roll(1, DECK_SZ) - 1; @@ -65,6 +67,7 @@ shuffle() { Topcard = &Deck[DECK_SZ]; } +void newboard() { register int i; @@ -123,10 +126,11 @@ newboard() { newscore(); } +void newscore() { - reg int i, new; - register PLAY *pp; + int i, new; + register PLAY *pp = 0; static int was_full = -1; static int last_win = -1; diff --git a/src/games/mille/mille.c b/src/games/mille/mille.c index 55d9673..cdd1bf0 100644 --- a/src/games/mille/mille.c +++ b/src/games/mille/mille.c @@ -1,23 +1,38 @@ -# include "mille.h" -# include -# ifdef attron -# include -# endif attron +#include "mille.h" +#include +#include +#include +#include +#ifdef attron +# include +#endif /* * @(#)mille.c 1.3.1 (2.11BSD GTE) 1/16/95 */ -int rub(); - char _sobuf[BUFSIZ]; -main(ac, av) -reg int ac; -reg char *av[]; { +/* + * Routine to trap rubouts, and make sure they really want to + * quit. + */ +void +rub(int sig) { - reg bool restore; - double avs[3]; + signal(SIGINT, SIG_IGN); + if (getyn(REALLYPROMPT)) + die(); + signal(SIGINT, rub); +} + +int +main(ac, av) +int ac; +char *av[]; { + + bool restore; + unsigned avs[3]; if (strcmp(av[0], "a.out") == 0) { outf = fopen("q", "w"); @@ -26,8 +41,7 @@ reg char *av[]; { } restore = FALSE; - getloadavg(avs, 3); - if (avs[2] > 4.0) { + if (getloadavg(avs, 3) >= 0 && avs[2] > 400) { printf("Sorry. The load average is too high.\n"); printf("Please try again later\n"); exit(1); @@ -108,21 +122,10 @@ reg char *av[]; { } } -/* - * Routine to trap rubouts, and make sure they really want to - * quit. - */ -rub() { - - signal(SIGINT, SIG_IGN); - if (getyn(REALLYPROMPT)) - die(); - signal(SIGINT, rub); -} - /* * Time to go beddy-by */ +void die() { signal(SIGINT, SIG_IGN); @@ -132,4 +135,3 @@ die() { endwin(); exit(1); } - diff --git a/src/games/mille/mille.h b/src/games/mille/mille.h index 433e080..4053b9b 100644 --- a/src/games/mille/mille.h +++ b/src/games/mille/mille.h @@ -1,5 +1,5 @@ -# include -# include "curses.h" +#include +#include "curses.h" /* * @(#)mille.h 1.1 (Berkeley) 4/1/82 @@ -9,125 +9,117 @@ * Miscellaneous constants */ -# define unsgn unsigned -# define CARD short +#define unsgn unsigned +#define CARD short -# define ARNOLD 214 /* my uid */ +#define ARNOLD 214 /* my uid */ -# define GURP 28672 /* bad uid */ -# define MAXUSERS 35 /* max # of users for startup */ -# define HAND_SZ 7 /* number of cards in a hand */ -# define DECK_SZ 101 /* number of cards in decks */ -# define NUM_SAFE 4 /* number of saftey cards */ -# define NUM_MILES 5 /* number of milestones types */ -# define NUM_CARDS 20 /* number of types of cards */ -# define BOARD_Y 17 /* size of board screen */ -# define BOARD_X 40 -# define MILES_Y 7 /* size of mileage screen */ -# define MILES_X 80 -# define SCORE_Y 17 /* size of score screen */ -# define SCORE_X 40 -# define MOVE_Y 10 /* Where to print move prompt */ -# define MOVE_X 20 -# define ERR_Y 15 /* Where to print errors */ -# define ERR_X 5 -# define EXT_Y 4 /* Where to put Extension */ -# define EXT_X 9 +#define GURP 28672 /* bad uid */ +#define MAXUSERS 35 /* max # of users for startup */ +#define HAND_SZ 7 /* number of cards in a hand */ +#define DECK_SZ 101 /* number of cards in decks */ +#define NUM_SAFE 4 /* number of saftey cards */ +#define NUM_MILES 5 /* number of milestones types */ +#define NUM_CARDS 20 /* number of types of cards */ +#define BOARD_Y 17 /* size of board screen */ +#define BOARD_X 40 +#define MILES_Y 7 /* size of mileage screen */ +#define MILES_X 80 +#define SCORE_Y 17 /* size of score screen */ +#define SCORE_X 40 +#define MOVE_Y 10 /* Where to print move prompt */ +#define MOVE_X 20 +#define ERR_Y 15 /* Where to print errors */ +#define ERR_X 5 +#define EXT_Y 4 /* Where to put Extension */ +#define EXT_X 9 -# define PLAYER 0 -# define COMP 1 +#define PLAYER 0 +#define COMP 1 -# define W_SMALL 0 /* Small (initial) window */ -# define W_FULL 1 /* Full (final) window */ +#define W_SMALL 0 /* Small (initial) window */ +#define W_FULL 1 /* Full (final) window */ /* * Move types */ -# define M_DISCARD 0 -# define M_DRAW 1 -# define M_PLAY 2 -# define M_ORDER 3 +#define M_DISCARD 0 +#define M_DRAW 1 +#define M_PLAY 2 +#define M_ORDER 3 /* * Scores */ -# define SC_SAFETY 100 -# define SC_ALL_SAFE 300 -# define SC_COUP 300 -# define SC_TRIP 400 -# define SC_SAFE 300 -# define SC_DELAY 300 -# define SC_EXTENSION 200 -# define SC_SHUT_OUT 500 +#define SC_SAFETY 100 +#define SC_ALL_SAFE 300 +#define SC_COUP 300 +#define SC_TRIP 400 +#define SC_SAFE 300 +#define SC_DELAY 300 +#define SC_EXTENSION 200 +#define SC_SHUT_OUT 500 /* * safety descriptions */ -# define S_UNKNOWN 0 /* location of safety unknown */ -# define S_IN_HAND 1 /* safety in player's hand */ -# define S_PLAYED 2 /* safety has been played */ -# define S_GAS_SAFE 0 /* Gas safety card index */ -# define S_SPARE_SAFE 1 /* Tire safety card index */ -# define S_DRIVE_SAFE 2 /* Driveing safety card index */ -# define S_RIGHT_WAY 3 /* Right-of-Way card index */ -# define S_CONV 15 /* conversion from C_ to S_ */ +#define S_UNKNOWN 0 /* location of safety unknown */ +#define S_IN_HAND 1 /* safety in player's hand */ +#define S_PLAYED 2 /* safety has been played */ +#define S_GAS_SAFE 0 /* Gas safety card index */ +#define S_SPARE_SAFE 1 /* Tire safety card index */ +#define S_DRIVE_SAFE 2 /* Driveing safety card index */ +#define S_RIGHT_WAY 3 /* Right-of-Way card index */ +#define S_CONV 15 /* conversion from C_ to S_ */ /* * card numbers */ -# define C_INIT -1 -# define C_25 0 -# define C_50 1 -# define C_75 2 -# define C_100 3 -# define C_200 4 -# define C_EMPTY 5 -# define C_FLAT 6 -# define C_CRASH 7 -# define C_STOP 8 -# define C_LIMIT 9 -# define C_GAS 10 -# define C_SPARE 11 -# define C_REPAIRS 12 -# define C_GO 13 -# define C_END_LIMIT 14 -# define C_GAS_SAFE 15 -# define C_SPARE_SAFE 16 -# define C_DRIVE_SAFE 17 -# define C_RIGHT_WAY 18 +#define C_INIT -1 +#define C_25 0 +#define C_50 1 +#define C_75 2 +#define C_100 3 +#define C_200 4 +#define C_EMPTY 5 +#define C_FLAT 6 +#define C_CRASH 7 +#define C_STOP 8 +#define C_LIMIT 9 +#define C_GAS 10 +#define C_SPARE 11 +#define C_REPAIRS 12 +#define C_GO 13 +#define C_END_LIMIT 14 +#define C_GAS_SAFE 15 +#define C_SPARE_SAFE 16 +#define C_DRIVE_SAFE 17 +#define C_RIGHT_WAY 18 /* * prompt types */ -# define MOVEPROMPT 0 -# define REALLYPROMPT 1 -# define ANOTHERHANDPROMPT 2 -# define ANOTHERGAMEPROMPT 3 -# define SAVEGAMEPROMPT 4 -# define SAMEFILEPROMPT 5 -# define FILEPROMPT 6 -# define EXTENSIONPROMPT 7 -# define OVERWRITEFILEPROMPT 8 +#define MOVEPROMPT 0 +#define REALLYPROMPT 1 +#define ANOTHERHANDPROMPT 2 +#define ANOTHERGAMEPROMPT 3 +#define SAVEGAMEPROMPT 4 +#define SAMEFILEPROMPT 5 +#define FILEPROMPT 6 +#define EXTENSIONPROMPT 7 +#define OVERWRITEFILEPROMPT 8 -# ifdef SYSV -# define srandom(x) srand(x) -# define random() rand() - -# ifndef attron -# define erasechar() _tty.c_cc[VERASE] -# define killchar() _tty.c_cc[VKILL] -# endif -# else -# ifndef erasechar -# define erasechar() _tty.sg_erase -# define killchar() _tty.sg_kill -# endif -# endif SYSV +#ifndef erasechar +# define erasechar() _tty.c_cc[VERASE] +#endif +#ifndef killchar +# define killchar() _tty.c_cc[VKILL] +#endif typedef struct { bool coups[NUM_SAFE]; @@ -162,11 +154,11 @@ typedef struct { * macros */ -# define other(x) (1 - x) -# define nextplay() (Play = other(Play)) -# define nextwin(x) (1 - x) -# define opposite(x) (Opposite[x]) -# define issafety(x) (x >= C_GAS_SAFE) +#define other(x) (1 - x) +#define nextplay() (Play = other(Play)) +#define nextwin(x) (1 - x) +#define opposite(x) (Opposite[x]) +#define issafety(x) (x >= C_GAS_SAFE) /* * externals @@ -193,3 +185,32 @@ extern WINDOW *Board, *Miles, *Score; */ CARD getcard(); +int canplay(PLAY *pp, PLAY *op, CARD card); +int check_ext(bool forcomp); +int onecard(PLAY *pp); +int roll(int ndie, int nsides); +int isrepair(CARD card); +int safety(CARD card); +int getyn(int promptno); +int rest_f(char *file); +int readch(void); +int save(void); +int error(char *str, int arg); + +void getmove(void); +void account(CARD card); +void sort(CARD *hand); +void die(void); +void newscore(void); +void shuffle(void); +void init(void); +void newboard(void); +void prboard(void); +void domove(void); +void check_more(void); +void prompt(int promptno); +void calcmove(void); +void rub(int sig); +void prscore(bool for_real); +void finalscore(PLAY *pp); +void varpush(int file, int (*func)()); diff --git a/src/games/mille/misc.c b/src/games/mille/misc.c index 0dc04d1..322ed23 100644 --- a/src/games/mille/misc.c +++ b/src/games/mille/misc.c @@ -1,14 +1,16 @@ -#include "mille.h" +#include "mille.h" #ifndef unctrl -#include "unctrl.h" +# include "unctrl.h" #endif -# include +#include +#include +#include -# ifdef attron -# include -# define _tty cur_term->Nttyb -# endif attron +#ifdef attron +# include +# define _tty cur_term->Nttyb +#endif /* * @(#)misc.c 1.2 (Berkeley) 3/28/83 @@ -17,6 +19,7 @@ #define NUMSAFE 4 /* VARARGS1 */ +int error(str, arg) char *str; { @@ -32,7 +35,7 @@ char *str; CARD getcard() { - reg int c, c1; + int c, c1; for (;;) { while ((c = readch()) == '\n' || c == '\r' || c == ' ') @@ -69,17 +72,19 @@ getcard() clrtoeol(); refresh(); goto cont; - } - else - write(0, "", 1); + } else { + if (write(0, "", 1) != 1) + /*ignore*/; + } return c; } cont: ; } } +int check_ext(forcomp) -reg bool forcomp; { +bool forcomp; { if (End == 700) @@ -98,8 +103,8 @@ done: } } else { - reg PLAY *pp, *op; - reg int i, safe, miles; + PLAY *pp, *op; + int i, safe, miles; pp = &Player[COMP]; op = &Player[PLAYER]; @@ -119,7 +124,7 @@ done: goto extend; for (miles = 0, i = 0; i < HAND_SZ; i++) if ((safe = pp->hand[i]) <= C_200) - miles += Value[safe]; + miles += Value[safe]; if (miles + (Topcard - Deck) * 3 > 1000) goto extend; goto done; @@ -132,10 +137,11 @@ done: * Get a yes or no answer to the given question. Saves are * also allowed. Return TRUE if the answer was yes, FALSE if no. */ +int getyn(promptno) register int promptno; { - reg char c; + char c; Saved = FALSE; for (;;) { @@ -168,11 +174,24 @@ register int promptno; { } } +static void +flush_input() +{ +# ifdef TIOCFLUSH + static int ioctl_args = FREAD; + + (void) ioctl(fileno(stdin), TIOCFLUSH, &ioctl_args); +# else + fflush(stdin); +# endif +} + /* * Check to see if more games are desired. If not, and game * came from a saved file, make sure that they don't want to restore * it. Exit appropriately. */ +void check_more() { flush_input(); @@ -201,9 +220,10 @@ check_more() { die(); } +int readch() { - reg int cnt; + int cnt; static char c; for (cnt = 0; read(0, &c, 1) <= 0; cnt++) @@ -212,13 +232,21 @@ readch() return c; } -flush_input() -{ -# ifdef TIOCFLUSH - static int ioctl_args = FREAD; - - (void) ioctl(fileno(stdin), TIOCFLUSH, &ioctl_args); -# else - fflush(stdin); -# endif -} +#ifdef CROSS +/* + * define unctrl codes for each character + * + */ +char *_unctrl[] = { /* unctrl codes for ttys */ + "^@", "^A", "^B", "^C", "^D", "^E", "^F", "^G", "^H", "^I", "^J", "^K", + "^L", "^M", "^N", "^O", "^P", "^Q", "^R", "^S", "^T", "^U", "^V", "^W", + "^X", "^Y", "^Z", "^[", "^\\", "^]", "^~", "^_", + " ", "!", "\"", "#", "$", "%", "&", "'", "(", ")", "*", "+", ",", "-", + ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", + "<", "=", ">", "?", "@", "A", "B", "C", "D", "E", "F", "G", "H", "I", + "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", + "X", "Y", "Z", "[", "\\", "]", "^", "_", "`", "a", "b", "c", "d", "e", + "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", + "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~", "^?" +}; +#endif diff --git a/src/games/mille/move.c b/src/games/mille/move.c index 3be57fc..bdd604e 100644 --- a/src/games/mille/move.c +++ b/src/games/mille/move.c @@ -1,12 +1,14 @@ -#include "mille.h" +#include "mille.h" +#include +#include #ifndef unctrl -#include "unctrl.h" +# include "unctrl.h" #endif -# ifdef attron -# include -# define _tty cur_term->Nttyb -# endif attron +#ifdef attron +# include +# define _tty cur_term->Nttyb +#endif /* * @(#)move.c 1.2 (Berkeley) 3/28/83 @@ -19,136 +21,35 @@ char *Movenames[] = { "M_DISCARD", "M_DRAW", "M_PLAY", "M_ORDER" }; -domove() -{ - reg PLAY *pp; - reg int i, j; - reg bool goodplay; - - pp = &Player[Play]; - if (Play == PLAYER) - getmove(); - else - calcmove(); - Next = FALSE; - goodplay = TRUE; - switch (Movetype) { - case M_DISCARD: - if (haspicked(pp)) { - if (pp->hand[Card_no] == C_INIT) - if (Card_no == 6) - Finished = TRUE; - else - error("no card there"); - else { - if (issafety(pp->hand[Card_no])) { - error("discard a safety?"); - goodplay = FALSE; - break; - } - Discard = pp->hand[Card_no]; - pp->hand[Card_no] = C_INIT; - Next = TRUE; - if (Play == PLAYER) - account(Discard); - } - } - else - error("must pick first"); - break; - case M_PLAY: - goodplay = playcard(pp); - break; - case M_DRAW: - Card_no = 0; - if (Topcard <= Deck) - error("no more cards"); - else if (haspicked(pp)) - error("already picked"); - else { - pp->hand[0] = *--Topcard; - if (Debug) - fprintf(outf, "DOMOVE: Draw %s\n", C_name[*Topcard]); -acc: - if (Play == COMP) { - account(*Topcard); - if (issafety(*Topcard)) - pp->safety[*Topcard-S_CONV] = S_IN_HAND; - } - if (pp->hand[1] == C_INIT && Topcard > Deck) { - Card_no = 1; - pp->hand[1] = *--Topcard; - if (Debug) - fprintf(outf, "DOMOVE: Draw %s\n", C_name[*Topcard]); - goto acc; - } - pp->new_battle = FALSE; - pp->new_speed = FALSE; - } - break; - - case M_ORDER: - break; - } - /* - * move blank card to top by one of two methods. If the - * computer's hand was sorted, the randomness for picking - * between equally valued cards would be lost - */ - if (Order && Movetype != M_DRAW && goodplay && pp == &Player[PLAYER]) - sort(pp->hand); - else - for (i = 1; i < HAND_SZ; i++) - if (pp->hand[i] == C_INIT) { - for (j = 0; pp->hand[j] == C_INIT; j++) - if (j >= HAND_SZ) { - j = 0; - break; - } - pp->hand[i] = pp->hand[j]; - pp->hand[j] = C_INIT; - } - if (Topcard <= Deck) - check_go(); - if (Next) - nextplay(); -} - /* - * Check and see if either side can go. If they cannot, - * the game is over + * return whether or not the player has picked */ -check_go() { +static int +haspicked(pp) +PLAY *pp; { - reg CARD card; - reg PLAY *pp, *op; - reg int i; + int card; - for (pp = Player; pp < &Player[2]; pp++) { - op = (pp == &Player[COMP] ? &Player[PLAYER] : &Player[COMP]); - for (i = 0; i < HAND_SZ; i++) { - card = pp->hand[i]; - if (issafety(card) || canplay(pp, op, card)) { - if (Debug) { - fprintf(outf, "CHECK_GO: can play %s (%d), ", C_name[card], card); - fprintf(outf, "issafety(card) = %d, ", issafety(card)); - fprintf(outf, "canplay(pp, op, card) = %d\n", canplay(pp, op, card)); - } - return; - } - else if (Debug) - fprintf(outf, "CHECK_GO: cannot play %s\n", - C_name[card]); - } + if (Topcard <= Deck) + return TRUE; + switch (pp->hand[Card_no]) { + case C_GAS_SAFE: case C_SPARE_SAFE: + case C_DRIVE_SAFE: case C_RIGHT_WAY: + card = 1; + break; + default: + card = 0; + break; } - Finished = TRUE; + return (pp->hand[card] != C_INIT); } +static int playcard(pp) -reg PLAY *pp; +PLAY *pp; { - reg int v; - reg CARD card; + int v; + CARD card; /* * check and see if player has picked @@ -157,7 +58,7 @@ reg PLAY *pp; default: if (!haspicked(pp)) mustpick: - return error("must pick first"); + return error("must pick first", 0); case C_GAS_SAFE: case C_SPARE_SAFE: case C_DRIVE_SAFE: case C_RIGHT_WAY: break; @@ -170,16 +71,16 @@ mustpick: switch (card) { case C_200: if (pp->nummiles[C_200] == 2) - return error("only two 200's per hand"); + return error("only two 200's per hand", 0); case C_100: case C_75: if (pp->speed == C_LIMIT) - return error("limit of 50"); + return error("limit of 50", 0); case C_50: if (pp->mileage + Value[card] > End) return error("puts you over %d", End); case C_25: if (!pp->can_go) - return error("cannot move now"); + return error("cannot move now", 0); pp->nummiles[card]++; v = Value[card]; pp->total += v; @@ -190,7 +91,7 @@ mustpick: case C_GAS: case C_SPARE: case C_REPAIRS: if (pp->battle != opposite(card)) - return error("can't play \"%s\"", C_name[card]); + return error("can't play \"%s\"", (int)C_name[card]); pp->battle = card; if (pp->safety[S_RIGHT_WAY] == S_PLAYED) pp->can_go = TRUE; @@ -200,14 +101,14 @@ mustpick: if (pp->battle != C_INIT && pp->battle != C_STOP && !isrepair(pp->battle)) return error("cannot play \"Go\" on a \"%s\"", - C_name[pp->battle]); + (int)C_name[pp->battle]); pp->battle = C_GO; pp->can_go = TRUE; break; case C_END_LIMIT: if (pp->speed != C_LIMIT) - return error("not limited"); + return error("not limited", 0); pp->speed = C_END_LIMIT; break; @@ -215,10 +116,10 @@ mustpick: case C_STOP: pp = &Player[other(Play)]; if (!pp->can_go) - return error("opponent cannot go"); + return error("opponent cannot go", 0); else if (pp->safety[safety(card) - S_CONV] == S_PLAYED) protected: - return error("opponent is protected"); + return error("opponent is protected", 0); pp->battle = card; pp->new_battle = TRUE; pp->can_go = FALSE; @@ -228,7 +129,7 @@ protected: case C_LIMIT: pp = &Player[other(Play)]; if (pp->speed == C_LIMIT) - return error("opponent has limit"); + return error("opponent has limit", 0); if (pp->safety[S_RIGHT_WAY] == S_PLAYED) goto protected; pp->speed = C_LIMIT; @@ -280,7 +181,7 @@ protected: break; case C_INIT: - error("no card there"); + error("no card there", 0); Next = -1; break; } @@ -291,10 +192,137 @@ protected: return TRUE; } +/* + * Check and see if either side can go. If they cannot, + * the game is over + */ +static void +check_go() { + + CARD card; + PLAY *pp, *op; + int i; + + for (pp = Player; pp < &Player[2]; pp++) { + op = (pp == &Player[COMP] ? &Player[PLAYER] : &Player[COMP]); + for (i = 0; i < HAND_SZ; i++) { + card = pp->hand[i]; + if (issafety(card) || canplay(pp, op, card)) { + if (Debug) { + fprintf(outf, "CHECK_GO: can play %s (%d), ", C_name[card], card); + fprintf(outf, "issafety(card) = %d, ", issafety(card)); + fprintf(outf, "canplay(pp, op, card) = %d\n", canplay(pp, op, card)); + } + return; + } + else if (Debug) + fprintf(outf, "CHECK_GO: cannot play %s\n", + C_name[card]); + } + } + Finished = TRUE; +} + +void +domove() +{ + PLAY *pp; + int i, j; + bool goodplay; + + pp = &Player[Play]; + if (Play == PLAYER) + getmove(); + else + calcmove(); + Next = FALSE; + goodplay = TRUE; + switch (Movetype) { + case M_DISCARD: + if (haspicked(pp)) { + if (pp->hand[Card_no] == C_INIT) + if (Card_no == 6) + Finished = TRUE; + else + error("no card there", 0); + else { + if (issafety(pp->hand[Card_no])) { + error("discard a safety?", 0); + goodplay = FALSE; + break; + } + Discard = pp->hand[Card_no]; + pp->hand[Card_no] = C_INIT; + Next = TRUE; + if (Play == PLAYER) + account(Discard); + } + } + else + error("must pick first", 0); + break; + case M_PLAY: + goodplay = playcard(pp); + break; + case M_DRAW: + Card_no = 0; + if (Topcard <= Deck) + error("no more cards", 0); + else if (haspicked(pp)) + error("already picked", 0); + else { + pp->hand[0] = *--Topcard; + if (Debug) + fprintf(outf, "DOMOVE: Draw %s\n", C_name[*Topcard]); +acc: + if (Play == COMP) { + account(*Topcard); + if (issafety(*Topcard)) + pp->safety[*Topcard-S_CONV] = S_IN_HAND; + } + if (pp->hand[1] == C_INIT && Topcard > Deck) { + Card_no = 1; + pp->hand[1] = *--Topcard; + if (Debug) + fprintf(outf, "DOMOVE: Draw %s\n", C_name[*Topcard]); + goto acc; + } + pp->new_battle = FALSE; + pp->new_speed = FALSE; + } + break; + + case M_ORDER: + break; + } + /* + * move blank card to top by one of two methods. If the + * computer's hand was sorted, the randomness for picking + * between equally valued cards would be lost + */ + if (Order && Movetype != M_DRAW && goodplay && pp == &Player[PLAYER]) + sort(pp->hand); + else + for (i = 1; i < HAND_SZ; i++) + if (pp->hand[i] == C_INIT) { + for (j = 0; pp->hand[j] == C_INIT; j++) + if (j >= HAND_SZ) { + j = 0; + break; + } + pp->hand[i] = pp->hand[j]; + pp->hand[j] = C_INIT; + } + if (Topcard <= Deck) + check_go(); + if (Next) + nextplay(); +} + +void getmove() { - reg char c, *sp; - static char moveprompt[] = ">>:Move:"; + char c, *sp; #ifdef EXTRAP static bool last_ex = FALSE; /* set if last command was E */ @@ -340,7 +368,7 @@ getmove() Movetype = M_ORDER; goto ret; case 'Q': /* Quit */ - rub(); /* Same as a rubout */ + rub(0); /* Same as a rubout */ break; case 'W': /* Window toggle */ Window = nextwin(Window); @@ -413,39 +441,19 @@ over: } /* FALLTHROUGH */ default: - error("unknown command: %s", unctrl(c)); + error("unknown command: %s", (int)unctrl(c)); break; } } ret: leaveok(Board, TRUE); } -/* - * return whether or not the player has picked - */ -haspicked(pp) -reg PLAY *pp; { - - reg int card; - - if (Topcard <= Deck) - return TRUE; - switch (pp->hand[Card_no]) { - case C_GAS_SAFE: case C_SPARE_SAFE: - case C_DRIVE_SAFE: case C_RIGHT_WAY: - card = 1; - break; - default: - card = 0; - break; - } - return (pp->hand[card] != C_INIT); -} +void account(card) -reg CARD card; { +CARD card; { - reg CARD oppos; + CARD oppos; if (card == C_INIT) return; @@ -467,6 +475,7 @@ reg CARD card; { } } +void prompt(promptno) int promptno; { @@ -498,11 +507,12 @@ int promptno; clrtoeol(); } +void sort(hand) -reg CARD *hand; +CARD *hand; { - reg CARD *cp, *tp; - reg CARD temp; + CARD *cp, *tp; + CARD temp; cp = hand; hand += HAND_SZ; @@ -514,4 +524,3 @@ reg CARD *hand; *tp = temp; } } - diff --git a/src/games/mille/print.c b/src/games/mille/print.c index ee33619..2a63e28 100644 --- a/src/games/mille/print.c +++ b/src/games/mille/print.c @@ -7,10 +7,27 @@ # define COMP_STRT 20 # define CARD_STRT 2 +/* + * show_card: + * Show the given card if it is different from the last one shown + */ +static void +show_card(y, x, c, lc) +int y, x; +register CARD c, *lc; +{ + if (c == *lc) + return; + + mvprintw(y, x, C_fmt, C_name[c]); + *lc = c; +} + +void prboard() { - reg PLAY *pp; - reg int i, j, k, temp; + PLAY *pp; + int i, j, k, temp; for (k = 0; k < 2; k++) { pp = &Player[k]; @@ -25,8 +42,8 @@ prboard() { show_card(14, temp, pp->battle, &pp->sh_battle); show_card(16, temp, pp->speed, &pp->sh_speed); for (i = C_25; i <= C_200; i++) { - reg char *name; - reg int end; + char *name; + int end; if (pp->nummiles[i] == pp->sh_nummiles[i]) continue; @@ -57,28 +74,31 @@ prboard() { wrefresh(Score); } -/* - * show_card: - * Show the given card if it is different from the last one shown - */ -show_card(y, x, c, lc) -int y, x; -register CARD c, *lc; -{ - if (c == *lc) - return; - - mvprintw(y, x, C_fmt, C_name[c]); - *lc = c; -} - static char Score_fmt[] = "%4d"; -prscore(for_real) -reg bool for_real; { +/* + * show_score: + * Show a score value if it is different from the last time we + * showed it. + */ +static void +show_score(y, x, s, ls) +int y, x; +register int s, *ls; +{ + if (s == *ls) + return; - reg PLAY *pp; - reg int x; + mvprintw(y, x, Score_fmt, s); + *ls = s; +} + +void +prscore(for_real) +bool for_real; { + + PLAY *pp; + int x; stdscr = Score; for (pp = Player; pp < &Player[2]; pp++) { @@ -114,19 +134,3 @@ reg bool for_real; { } stdscr = Board; } - -/* - * show_score: - * Show a score value if it is different from the last time we - * showed it. - */ -show_score(y, x, s, ls) -int y, x; -register int s, *ls; -{ - if (s == *ls) - return; - - mvprintw(y, x, Score_fmt, s); - *ls = s; -} diff --git a/src/games/mille/roll.c b/src/games/mille/roll.c index c25bc4a..52b63c3 100644 --- a/src/games/mille/roll.c +++ b/src/games/mille/roll.c @@ -1,4 +1,5 @@ -# include "mille.h" +#include "mille.h" +#include /* * This routine rolls ndie nside-sided dice. @@ -7,11 +8,11 @@ * */ +int roll(ndie, nsides) -reg int ndie, nsides; { +int ndie, nsides; { - reg int tot; - extern unsigned int random(); + int tot; tot = 0; while (ndie--) diff --git a/src/games/mille/save.c b/src/games/mille/save.c index bad5a11..e176c23 100644 --- a/src/games/mille/save.c +++ b/src/games/mille/save.c @@ -1,15 +1,20 @@ -#include "mille.h" -#include -#include -#include +#include "mille.h" +#include +#include +#include +#include +#include +#include +#include +#include #ifndef unctrl -#include "unctrl.h" +# include "unctrl.h" #endif -# ifdef attron -# include -# define _tty cur_term->Nttyb -# endif attron +#ifdef attron +# include +# define _tty cur_term->Nttyb +#endif /* * @(#)save.c 1.3 (2.11BSD) 1996/3/21 @@ -17,27 +22,24 @@ typedef struct stat STAT; -extern char *ctime(); -extern int read(), write(); - /* * This routine saves the current game for use at a later date */ -extern int errno; - +int save() { - reg char *sp; - reg int outf; - reg time_t *tp; - char buf[80]; - time_t tme; - STAT junk; + char *sp; + int outf; + time_t *tp; + char buf[80]; + time_t tme; + STAT junk; tp = &tme; - if (Fromfile && getyn(SAMEFILEPROMPT)) + if (Fromfile && getyn(SAMEFILEPROMPT)) { strcpy(buf, Fromfile); - else { + sp = buf; + } else { over: prompt(FILEPROMPT); leaveok(Board, FALSE); @@ -77,7 +79,7 @@ over: return FALSE; if ((outf = creat(buf, 0644)) < 0) { - error(strerror(errno)); + error(strerror(errno), 0); return FALSE; } mvwaddstr(Score, ERR_Y, ERR_X, buf); @@ -100,13 +102,14 @@ over: * backup was made on exiting, in which case certain things must * be cleaned up before the game starts. */ +int rest_f(file) -reg char *file; { +char *file; { - reg char *sp; - reg int inf; - char buf[80]; - STAT sbuf; + char *sp; + int inf; + char buf[80]; + STAT sbuf; if ((inf = open(file, 0)) < 0) { perror(file); @@ -129,4 +132,3 @@ reg char *file; { Fromfile = file; return !On_exit; } - diff --git a/src/games/mille/types.c b/src/games/mille/types.c index 2fb9677..c6c93e0 100644 --- a/src/games/mille/types.c +++ b/src/games/mille/types.c @@ -1,17 +1,19 @@ -# include "mille.h" +#include "mille.h" /* * @(#)types.c 1.1 (Berkeley) 4/1/82 */ +int isrepair(card) -reg CARD card; { +CARD card; { return card == C_GAS || card == C_SPARE || card == C_REPAIRS || card == C_INIT; } +int safety(card) -reg CARD card; { +CARD card; { switch (card) { case C_EMPTY: @@ -34,5 +36,5 @@ reg CARD card; { return C_RIGHT_WAY; } /* NOTREACHED */ + return 0; } - diff --git a/src/games/mille/varpush.c b/src/games/mille/varpush.c index 7a45f22..a2942fc 100644 --- a/src/games/mille/varpush.c +++ b/src/games/mille/varpush.c @@ -1,18 +1,20 @@ -# include "mille.h" +#include "mille.h" +#include +#include +#include /* * @(#)varpush.c 1.1 (Berkeley) 4/1/82 */ -int read(), write(); - /* * push variables around via the routine func() on the file * channel file. func() is either read or write. */ +void varpush(file, func) -reg int file; -reg int (*func)(); { +int file; +int (*func)(); { int temp; @@ -30,13 +32,18 @@ reg int (*func)(); { (*func)(file, (char *) &Discard, sizeof Discard); (*func)(file, (char *) Player, sizeof Player); if (func == read) { - read(file, (char *) &temp, sizeof temp); + if (read(file, (char *) &temp, sizeof temp) != sizeof temp) { + perror("read"); + exit(-1); + } Topcard = &Deck[temp]; if (Debug) { char buf[80]; over: printf("Debug file:"); - gets(buf); + if (! fgets(buf, sizeof(buf), stdin)) { + exit(0); + } if ((outf = fopen(buf, "w")) == NULL) { perror(buf); goto over; @@ -47,7 +54,9 @@ over: } else { temp = Topcard - Deck; - write(file, (char *) &temp, sizeof temp); + if (write(file, (char *) &temp, sizeof temp) != sizeof temp) { + perror("write"); + exit(-1); + } } } - diff --git a/src/games/monop/.gitignore b/src/games/monop/.gitignore new file mode 100644 index 0000000..e8e2162 --- /dev/null +++ b/src/games/monop/.gitignore @@ -0,0 +1 @@ +monop diff --git a/src/games/monop/Makefile b/src/games/monop/Makefile index 09fe89d..352ab5e 100644 --- a/src/games/monop/Makefile +++ b/src/games/monop/Makefile @@ -3,85 +3,57 @@ # Program: Ken Arnold # Makefile: K.S. # -DESTDIR= -DATFILES=brd.dat mon.dat prop.dat -CFILES= monop.c cards.c execute.c getinp.c houses.c jail.c misc.c morg.c \ - print.c prop.c rent.c roll.c spec.c strcmp.c trade.c -OBJS= monop.o cards.o execute.o getinp.o houses.o jail.o misc.o morg.o \ - print.o prop.o rent.o roll.o spec.o strcmp.o trade.o strings.o -HEADERS=monop.h deck.h -BINDIR= ${DESTDIR}/usr/games -LIBDIR= ${DESTDIR}/usr/games/lib -LIB= -CFLAGS= -O -w -SEPFLAG= -i -DAT= brd.dat monop.dat prop.dat -CC= cc -XSTR= xstr -ED= ed -AS= as -RM= rm -f -CTAGS= ctags +TOPSRC = $(shell cd ../../..; pwd) +include $(TOPSRC)/target.mk +#include $(TOPSRC)/cross.mk +#CFLAGS = -DCROSS -O -# -# Be cool about compiling strings. -# -.c.o: - ${CC} -E ${CFLAGS} $*.c | ${XSTR} -c - - ${CC} -c ${CFLAGS} x.c - mv x.o $*.o +CFLAGS += -Werror -Wall +LIBS = -lc -it: monop cards.pck +OBJS = monop.o cards.o execute.o getinp.o houses.o jail.o misc.o \ + morg.o print.o prop.o rent.o roll.o spec.o trade.o +MAN = monop.0 +MANSRC = monop.6 -monop: ${OBJS} - ${CC} -o monop ${SEPFLAG} ${OBJS} ${LIB} +all: monop $(MAN) cards.pck -install: monop cards.pck - ${RM} ${BINDIR}/monop ${LIBDIR}/cards.pck - install -s monop ${BINDIR} - mv cards.pck ${LIBDIR} +monop: $(OBJS) + $(CC) $(LDFLAGS) -o monop.elf $(OBJS) $(LIBS) + $(OBJDUMP) -S monop.elf > monop.dis + $(SIZE) monop.elf + $(ELF2AOUT) monop.elf $@ && rm monop.elf -new: clean ctags monop +initdeck: initdeck.c deck.h + $(CC) -o initdeck $(LDFLAGS) $(CFLAGS) initdeck.c -strings.o: strings - ${XSTR} - ${CC} -S xs.c - ${ED} - < :rofix xs.s - ${AS} -o strings.o xs.s - ${RM} xs.s xs.c +cards.pck: #initdeck cards.inp + ./initdeck -monop.o: ${DATFILES} monop.def - ${CC} -E ${CFLAGS} monop.c | ${XSTR} -c - - ${CC} -c ${CFLAGS} x.c - mv x.o monop.o - -cards.o: deck.h - ${CC} -E ${CFLAGS} cards.c | ${XSTR} -c - - ${CC} -c ${CFLAGS} x.c - mv x.o cards.o - -newone: - ${CC} ${SEPFLAG} -o monop ${CFLAGS} ${CFILES} ${LIB} - -ctags: - ${CTAGS} ${CFILES} monop.h deck.h monop.def initdeck.c - -cards.pck: initdeck cards.inp - ./initdeck - -initdeck: initdeck.c deck.h - ${CC} -o initdeck ${CFLAGS} initdeck.c ${LIB} - -monop.tar: - tar crvf monop.tar ${CFILES} ${DATFILES} ${HEADERS} :rofix Makefile cards.inp initdeck.c monop.def monop.ext +$(MAN): $(MANSRC) + $(MANROFF) $< > $@ clean: - ${RM} ${OBJS} monop core tags x.c x.o monop.tar initdeck cards.pck errs - cp /dev/null strings + rm -f *.o *.0 *.elf $(MAN) monop initdeck *.elf *.dis tags *~ -printall: - -/usr/bin/eecs/pr monop.h deck.h monop.def monop.ext ${CFILES} ${DATFILES} | /usr/bin/lpr - -/usr/bin/lpq - -lint: - lint ${CFILES} > lint.out ; +install: all + install monop $(DESTDIR)/games/ + cp $(MAN) $(DESTDIR)/share/man/cat6/ + cp cards.pck $(DESTDIR)/games/lib/ +### +cards.o: cards.c extern.h monop.h deck.h +execute.o: execute.c extern.h monop.h deck.h +getinp.o: getinp.c +houses.o: houses.c extern.h monop.h deck.h +initdeck.o: initdeck.c deck.h +jail.o: jail.c extern.h monop.h deck.h +misc.o: misc.c extern.h monop.h deck.h +monop.o: monop.c defines.h monop.h deck.h mon.dat.h prop.dat.h brd.dat.h +morg.o: morg.c extern.h monop.h deck.h +print.o: print.c extern.h monop.h deck.h +prop.o: prop.c extern.h monop.h deck.h +rent.o: rent.c extern.h monop.h deck.h +roll.o: roll.c +spec.o: spec.c extern.h monop.h deck.h +strcmp.o: strcmp.c +trade.o: trade.c extern.h monop.h deck.h diff --git a/src/games/monop/_rofix b/src/games/monop/_rofix deleted file mode 100644 index cd5fa24..0000000 --- a/src/games/monop/_rofix +++ /dev/null @@ -1,3 +0,0 @@ -g/^[ ]*\.data/s//.text/ -w -q diff --git a/src/games/monop/brd.dat b/src/games/monop/brd.dat deleted file mode 100644 index 7af06d8..0000000 --- a/src/games/monop/brd.dat +++ /dev/null @@ -1,43 +0,0 @@ -/* name (COLOR) owner type desc cost */ - -{"=== GO ===", -1, SAFE, 0 }, -{"Mediterranean ave. (P)", -1, PRPTY, &prop[0], 60 }, -{"Community Chest i", -1, CC, cc }, -{"Baltic ave. (P)", -1, PRPTY, &prop[1], 60 }, -{"Income Tax", -1, SPEC, inc_tax }, -{"Reading RR", -1, RR, &rr[0], 200 }, -{"Oriental ave. (L)", -1, PRPTY, &prop[2], 100 }, -{"Chance i", -1, CHANCE, chance }, -{"Vermont ave. (L)", -1, PRPTY, &prop[3], 100 }, -{"Connecticut ave. (L)", -1, PRPTY, &prop[4], 120 }, -{"Just Visiting", -1, SAFE, 0 }, -{"St. Charles pl. (V)", -1, PRPTY, &prop[5], 140 }, -{"Electric Co.", -1, UTIL, &util[0], 150 }, -{"States ave. (V)", -1, PRPTY, &prop[6], 140 }, -{"Virginia ave. (V)", -1, PRPTY, &prop[7], 160 }, -{"Pennsylvania RR", -1, RR, &rr[1], 200 }, -{"St. James pl. (O)", -1, PRPTY, &prop[8], 180 }, -{"Community Chest ii", -1, CC, cc }, -{"Tennessee ave. (O)", -1, PRPTY, &prop[9], 180 }, -{"New York ave. (O)", -1, PRPTY, &prop[10], 200 }, -{"Free Parking", -1, SAFE, 0 }, -{"Kentucky ave. (R)", -1, PRPTY, &prop[11], 220 }, -{"Chance ii", -1, CHANCE, chance }, -{"Indiana ave. (R)", -1, PRPTY, &prop[12], 220 }, -{"Illinois ave. (R)", -1, PRPTY, &prop[13], 240 }, -{"B&O RR", -1, RR, &rr[2], 200 }, -{"Atlantic ave. (Y)", -1, PRPTY, &prop[14], 260 }, -{"Ventnor ave. (Y)", -1, PRPTY, &prop[15], 260 }, -{"Water Works", -1, UTIL, &util[1], 150 }, -{"Marvin Gardens (Y)", -1, PRPTY, &prop[16], 280 }, -{"GO TO JAIL", -1, SPEC, goto_jail }, -{"Pacific ave. (G)", -1, PRPTY, &prop[17], 300 }, -{"N. Carolina ave. (G)", -1, PRPTY, &prop[18], 300 }, -{"Community Chest iii", -1, CC, cc }, -{"Pennsylvania ave. (G)", -1, PRPTY, &prop[19], 320 }, -{"Short Line RR", -1, RR, &rr[3], 200 }, -{"Chance iii", -1, CHANCE, chance }, -{"Park place (D)", -1, PRPTY, &prop[20], 350 }, -{"Luxury Tax", -1, SPEC, lux_tax }, -{"Boardwalk (D)", -1, PRPTY, &prop[21], 400 }, -{"JAIL", -1, SPEC } diff --git a/src/games/monop/brd.dat.h b/src/games/monop/brd.dat.h new file mode 100644 index 0000000..b66f916 --- /dev/null +++ b/src/games/monop/brd.dat.h @@ -0,0 +1,43 @@ +/* name (COLOR) owner type desc cost */ + +{"=== GO ===", -1, SAFE, 0 }, +{"Mediterranean ave. (P)", -1, PRPTY, (char*)&prop[0], 60 }, +{"Community Chest i", -1, CC, (char*)cc }, +{"Baltic ave. (P)", -1, PRPTY, (char*)&prop[1], 60 }, +{"Income Tax", -1, SPEC, (char*)inc_tax }, +{"Reading RR", -1, RR, (char*)&rr[0], 200 }, +{"Oriental ave. (L)", -1, PRPTY, (char*)&prop[2], 100 }, +{"Chance i", -1, CHANCE, (char*)chance }, +{"Vermont ave. (L)", -1, PRPTY, (char*)&prop[3], 100 }, +{"Connecticut ave. (L)", -1, PRPTY, (char*)&prop[4], 120 }, +{"Just Visiting", -1, SAFE, 0 }, +{"St. Charles pl. (V)", -1, PRPTY, (char*)&prop[5], 140 }, +{"Electric Co.", -1, UTIL, (char*)&util[0], 150 }, +{"States ave. (V)", -1, PRPTY, (char*)&prop[6], 140 }, +{"Virginia ave. (V)", -1, PRPTY, (char*)&prop[7], 160 }, +{"Pennsylvania RR", -1, RR, (char*)&rr[1], 200 }, +{"St. James pl. (O)", -1, PRPTY, (char*)&prop[8], 180 }, +{"Community Chest ii", -1, CC, (char*)cc }, +{"Tennessee ave. (O)", -1, PRPTY, (char*)&prop[9], 180 }, +{"New York ave. (O)", -1, PRPTY, (char*)&prop[10], 200 }, +{"Free Parking", -1, SAFE, 0 }, +{"Kentucky ave. (R)", -1, PRPTY, (char*)&prop[11], 220 }, +{"Chance ii", -1, CHANCE, (char*)chance }, +{"Indiana ave. (R)", -1, PRPTY, (char*)&prop[12], 220 }, +{"Illinois ave. (R)", -1, PRPTY, (char*)&prop[13], 240 }, +{"B&O RR", -1, RR, (char*)&rr[2], 200 }, +{"Atlantic ave. (Y)", -1, PRPTY, (char*)&prop[14], 260 }, +{"Ventnor ave. (Y)", -1, PRPTY, (char*)&prop[15], 260 }, +{"Water Works", -1, UTIL, (char*)&util[1], 150 }, +{"Marvin Gardens (Y)", -1, PRPTY, (char*)&prop[16], 280 }, +{"GO TO JAIL", -1, SPEC, (char*)goto_jail }, +{"Pacific ave. (G)", -1, PRPTY, (char*)&prop[17], 300 }, +{"N. Carolina ave. (G)", -1, PRPTY, (char*)&prop[18], 300 }, +{"Community Chest iii", -1, CC, (char*)cc }, +{"Pennsylvania ave. (G)", -1, PRPTY, (char*)&prop[19], 320 }, +{"Short Line RR", -1, RR, (char*)&rr[3], 200 }, +{"Chance iii", -1, CHANCE, (char*)chance }, +{"Park place (D)", -1, PRPTY, (char*)&prop[20], 350 }, +{"Luxury Tax", -1, SPEC, (char*)lux_tax }, +{"Boardwalk (D)", -1, PRPTY, (char*)&prop[21], 400 }, +{"JAIL", -1, SPEC } diff --git a/src/games/monop/cards.c b/src/games/monop/cards.c index b61d50d..2246230 100644 --- a/src/games/monop/cards.c +++ b/src/games/monop/cards.c @@ -1,38 +1,24 @@ -# include "monop.ext" +#include "extern.h" +#include /* * These routine deal with the card decks */ -# define GOJF 'F' /* char for get-out-of-jail-free cards */ +#define GOJF 'F' /* char for get-out-of-jail-free cards */ -# ifndef DEV -static char *cardfile = "/usr/games/lib/cards.pck"; -# else +#ifdef CROSS static char *cardfile = "cards.pck"; -# endif +#else +static char *cardfile = "/games/lib/cards.pck"; +#endif static FILE *deckf; -/* - * This routine initializes the decks from the data file, - * which it opens. - */ -init_decks() { - - if ((deckf=fopen(cardfile, "r")) == NULL) { -file_err: - perror(cardfile); - exit(1); - } - if (fread(deck, sizeof (DECK), 2, deckf) != 2) - goto file_err; - set_up(&CC_D); - set_up(&CH_D); -} /* * This routine sets up the offset pointers for the given deck. */ +static void set_up(dp) DECK *dp; { @@ -56,9 +42,45 @@ DECK *dp; { dp->offsets[r1] = temp; } } + +/* + * This routine initializes the decks from the data file, + * which it opens. + */ +void +init_decks() { + + if ((deckf=fopen(cardfile, "r")) == NULL) { +file_err: + perror(cardfile); + exit(1); + } + if (fread(deck, sizeof (DECK), 2, deckf) != 2) + goto file_err; + set_up(&CC_D); + set_up(&CH_D); +} + +/* + * This routine prints out the message on the card + */ +static void +printmes() { + + reg char c; + + printline(); + fflush(stdout); + while ((c = getc(deckf)) != '\0') + putchar(c); + printline(); + fflush(stdout); +} + /* * This routine draws a card from the given deck */ +void get_card(dp) DECK *dp; { @@ -69,7 +91,8 @@ DECK *dp; { do { fseek(deckf, dp->offsets[dp->last_card], 0); - dp->last_card = ++(dp->last_card) % dp->num_cards; + dp->last_card++; + dp->last_card %= dp->num_cards; type_maj = getc(deckf); } while (dp->gojf_used && type_maj == GOJF); type_min = getc(deckf); @@ -135,11 +158,12 @@ DECK *dp; { } num_h = num_H = 0; for (op = cur_p->own_list; op; op = op->next) - if (op->sqr->type == PRPTY) - if (op->sqr->desc->houses == 5) + if (op->sqr->type == PRPTY) { + if (((PROP*)op->sqr->desc)->houses == 5) ++num_H; else - num_h += op->sqr->desc->houses; + num_h += ((PROP*)op->sqr->desc)->houses; + } num = per_h * num_h + per_H * num_H; printf("You had %d Houses and %d Hotels, so that cost you $%d\n", num_h, num_H, num); if (num == 0) @@ -154,17 +178,3 @@ DECK *dp; { } spec = FALSE; } -/* - * This routine prints out the message on the card - */ -printmes() { - - reg char c; - - printline(); - fflush(stdout); - while ((c = getc(deckf)) != '\0') - putchar(c); - printline(); - fflush(stdout); -} diff --git a/src/games/monop/cards.pck b/src/games/monop/cards.pck new file mode 100644 index 0000000..c04f17d Binary files /dev/null and b/src/games/monop/cards.pck differ diff --git a/src/games/monop/deck.h b/src/games/monop/deck.h index 3363612..cddb65c 100644 --- a/src/games/monop/deck.h +++ b/src/games/monop/deck.h @@ -11,3 +11,5 @@ struct dk_st { /* deck description structure */ }; typedef struct dk_st DECK; + +void get_card(DECK *dp); diff --git a/src/games/monop/monop.def b/src/games/monop/defines.h similarity index 91% rename from src/games/monop/monop.def rename to src/games/monop/defines.h index d7acbe2..ce271f9 100644 --- a/src/games/monop/monop.def +++ b/src/games/monop/defines.h @@ -1,5 +1,5 @@ -# include "monop.h" -# include "deck.h" +#include "monop.h" +#include "deck.h" bool fixing, /* set if fixing up debt */ trading, /* set if in process of trading */ @@ -19,7 +19,7 @@ char *name_list[MAX_PL+2], /* list of players' names */ "roll", /* 16 */ "", /* 17 */ 0 }, - *yn[] = { /* list of commands for yes/no answers */ + *yesno[] = { /* list of commands for yes/no answers */ "yes", /* 0 */ "no", /* 1 */ "quit", /* 2 */ "print", /* 3 */ "where", /* 4 */ "own holdings", /* 5 */ @@ -43,11 +43,11 @@ int player, /* current player number */ num_luck = sizeof lucky_mes / sizeof (char *), /* list of command functions */ buy_houses(), card(), do_move(), do_move(), list(), list_all(), - mortgage(), pay(), printboard(), quit(), resign(), restore(), + mortgage(), pay(), printboard(), quitgame(), resign(), restore(), rub(), save(), sell_houses(), shell_out(), trade(), unmortgage(), where(), (*func[])() = { /* array of function calls for commands */ - quit, /* quit game |* 0 *| */ + quitgame, /* quit game |* 0 *| */ printboard, /* print board |* 1 *| */ where, /* where players are |* 2 *| */ list, /* own holdings |* 3 *| */ @@ -77,13 +77,13 @@ RR_S rr[N_RR]; /* raildroad descriptions */ UTIL_S util[2]; /* utility descriptions */ MON mon[N_MON] = { /* monopoly descriptions */ -# include "mon.dat" +#include "mon.dat.h" }; PROP prop[N_PROP] = { /* typical properties */ -# include "prop.dat" +#include "prop.dat.h" }; SQUARE board[N_SQRS+1] = { /* board itself (+1 for Jail) */ -# include "brd.dat" +#include "brd.dat.h" }; diff --git a/src/games/monop/execute.c b/src/games/monop/execute.c index 3ec23f1..e537a86 100644 --- a/src/games/monop/execute.c +++ b/src/games/monop/execute.c @@ -1,24 +1,29 @@ -# include "monop.ext" -# include -# include -# include +#include "extern.h" +#include +#include +#include +#include +#include +#include +#include +#include -# define SEGSIZE 8192 +#define SEGSIZE 8192 typedef struct stat STAT; typedef struct tm TIME; -extern char etext[], /* end of text space */ +extern char __data_start[], /* beginning of data space */ rub(); -static char buf[257], - *yn_only[] = { "yes", "no"}; +static char buf[257]; static bool new_play; /* set if move on to new player */ /* * This routine executes the given command by index number */ +void execute(com_num) reg int com_num; { @@ -31,9 +36,11 @@ reg int com_num; { else if (num_doub) printf("%s rolled doubles. Goes again\n", cur_p->name); } + /* * This routine moves a piece around. */ +void do_move() { reg int r1, r2; @@ -62,30 +69,16 @@ do_move() { ret: return; } -/* - * This routine moves a normal move - */ -move(rl) -reg int rl; { - reg int old_loc; - - old_loc = cur_p->loc; - cur_p->loc = (cur_p->loc + rl) % N_SQRS; - if (cur_p->loc < old_loc && rl > 0) { - cur_p->money += 200; - printf("You pass %s and get $200\n", board[0].name); - } - show_move(); -} /* * This routine shows the results of a move */ +static void show_move() { reg SQUARE *sqp; - sqp = &board[cur_p->loc]; + sqp = &board[(int)cur_p->loc]; printf("That puts you on %s\n", sqp->name); switch (sqp->type) { case SAFE: @@ -106,7 +99,7 @@ show_move() { cur_p->money -= sqp->cost; } else if (num_play > 2) - bid(sqp); + bid(); } else if (sqp->owner == player) printf("You own it.\n"); @@ -114,18 +107,37 @@ show_move() { rent(sqp); } } + +/* + * This routine moves a normal move + */ +void +move(rl) +reg int rl; { + + reg int old_loc; + + old_loc = cur_p->loc; + cur_p->loc = (cur_p->loc + rl) % N_SQRS; + if (cur_p->loc < old_loc && rl > 0) { + cur_p->money += 200; + printf("You pass %s and get $200\n", board[0].name); + } + show_move(); +} + /* * This routine saves the current game for use at a later date */ +void save() { reg char *sp; reg int outf, num; - TIME tme, *tp; - int *dat_end, junk[18]; + time_t tme; + struct stat junk; unsgn start, end; - tp = &tme; printf("Which file do you wish to save it in? "); sp = buf; while ((*sp++=getchar()) != '\n' && !feof(stdin)) @@ -137,9 +149,8 @@ save() { /* * check for existing files, and confirm overwrite if needed */ - - if (stat(buf, junk) > -1 - && getyn("File exists. Do you wish to overwrite? ", yn_only) > 0) + if (stat(buf, &junk) >= 0 + && getyn("File exists. Do you wish to overwrite? ") > 0) return; if ((outf=creat(buf, 0644)) < 0) { @@ -147,28 +158,29 @@ save() { return; } printf("\"%s\" ", buf); - time(tp); /* get current time */ - strcpy(buf, ctime(tp)); + time(&tme); /* get current time */ + strcpy(buf, ctime(&tme)); for (sp = buf; *sp != '\n'; sp++) continue; *sp = '\0'; -# if 0 - start = (((int) etext + (SEGSIZE-1)) / SEGSIZE ) * SEGSIZE; -# else - start = 0; -# endif - end = sbrk(0); + start = (unsigned) __data_start; + end = (unsigned) sbrk(0); while (start < end) { /* write out entire data space */ num = start + 16 * 1024 > end ? end - start : 16 * 1024; - write(outf, start, num); + if (write(outf, (void*)start, num) != num) { + perror(buf); + exit(-1); + } start += num; } close(outf); printf("[%s]\n", buf); } + /* * This routine restores an old game from a file */ +void restore() { reg char *sp; @@ -181,10 +193,12 @@ restore() { clearerr(stdin); rest_f(buf); } + /* * This does the actual restoring. It returns TRUE if the * backup was successful, else false. */ +int rest_f(file) reg char *file; { @@ -203,19 +217,22 @@ reg char *file; { perror(file); exit(1); } -# if 0 - start = (((int) etext + (SEGSIZE-1)) / SEGSIZE ) * SEGSIZE; -# else - start = 0; -# endif - brk(end = start + sbuf.st_size); + start = (unsigned) __data_start; + end = start + sbuf.st_size; + if (brk((void*) end) < 0) { + perror("brk"); + exit(-1); + } while (start < end) { /* write out entire data space */ num = start + 16 * 1024 > end ? end - start : 16 * 1024; - read(inf, start, num); + if (read(inf, (void*) start, num) != num) { + perror(file); + exit(-1); + } start += num; } close(inf); - strcpy(buf, ctime(sbuf.st_mtime)); + strcpy(buf, ctime(&sbuf.st_mtime)); for (sp = buf; *sp != '\n'; sp++) continue; *sp = '\0'; diff --git a/src/games/monop/monop.ext b/src/games/monop/extern.h similarity index 72% rename from src/games/monop/monop.ext rename to src/games/monop/extern.h index e487dda..e1c9b00 100644 --- a/src/games/monop/monop.ext +++ b/src/games/monop/extern.h @@ -1,9 +1,9 @@ -# include "monop.h" -# include "deck.h" +#include "monop.h" +#include "deck.h" extern bool trading, spec, fixing, told_em; -extern char *yn[], *comlist[], *name_list[], *lucky_mes[]; +extern char *yesno[], *comlist[], *name_list[], *lucky_mes[]; extern int num_play, player, num_doub, num_luck, (*func[])(); diff --git a/src/games/monop/getinp.c b/src/games/monop/getinp.c index a300c0e..db77846 100644 --- a/src/games/monop/getinp.c +++ b/src/games/monop/getinp.c @@ -1,23 +1,41 @@ -# include -# include +#include +#include +#include -# define reg register +#define reg register -# define LINE 70 +#define LINE 70 static char buf[257]; +static int +comp(s1) +char *s1; { + + reg char *sp, *tsp, c; + + if (buf[0] != '\0') + for (sp = buf, tsp = s1; *sp; ) { + c = isupper(*tsp) ? tolower(*tsp) : *tsp; + tsp++; + if (c != *sp++) + return 0; + } + else if (*s1 != '\0') + return 0; + return 1; +} + +int getinp(prompt, list) char *prompt, *list[]; { - reg int i, n_match, match; + reg int i, n_match, match = 0; char *sp; - int plen; - for (;;) { inter: - printf(prompt); + printf("%s", prompt); for (sp = buf; (*sp=getchar()) != '\n' && !feof(stdin); ) if (*sp == -1) /* check for interupted system call */ goto inter; @@ -39,7 +57,7 @@ inter: printf(""); } else - printf(list[i]); + printf("%s", list[i]); if (list[i+1]) printf(", "); else @@ -63,21 +81,3 @@ inter: printf("Illegal response: \"%s\". Use '?' to get list of valid answers\n", buf); } } - -static -comp(s1) -char *s1; { - - reg char *sp, *tsp, c; - - if (buf[0] != '\0') - for (sp = buf, tsp = s1; *sp; ) { - c = isupper(*tsp) ? tolower(*tsp) : *tsp; - tsp++; - if (c != *sp++) - return 0; - } - else if (*s1 != '\0') - return 0; - return 1; -} diff --git a/src/games/monop/houses.c b/src/games/monop/houses.c index 8f525b8..f1fe2e2 100644 --- a/src/games/monop/houses.c +++ b/src/games/monop/houses.c @@ -1,66 +1,29 @@ -# include "monop.ext" +#include "extern.h" +#include static char *names[N_MON+2], cur_prop[80]; static MON *monops[N_MON]; -/* - * These routines deal with buying and selling houses - */ -buy_houses() { +static void +list_cur(mp) +reg MON *mp; { - reg int num_mon; - reg MON *mp; - reg OWN *op; - bool good,got_morg; - int i,p; + reg int i; + reg SQUARE *sqp; -over: - num_mon = 0; - good = TRUE; - got_morg = FALSE; - for (op = cur_p->own_list; op && op->sqr->type != PRPTY; op = op->next) - continue; - while (op) - if (op->sqr->desc->monop) { - mp = op->sqr->desc->mon_desc; - names[num_mon] = (monops[num_mon]=mp)->name; - num_mon++; - got_morg = good = FALSE; - for (i = 0; i < mp->num_in; i++) { - if (op->sqr->desc->morg) - got_morg++; - if (op->sqr->desc->houses != 5) - good++; - op = op->next; - } - if (!good || got_morg) - --num_mon; - } + for (i = 0; i < mp->num_in; i++) { + sqp = mp->sq[i]; + if (((PROP*)sqp->desc)->houses == 5) + printf("%s (H) ", sqp->name); else - op = op->next; - if (num_mon == 0) { - if (got_morg) - printf("You can't build on mortgaged monopolies.\n"); - else if (!good) - printf("You can't build any more.\n"); - else - printf("But you don't have any monopolies!!\n"); - return; - } - if (num_mon == 1) - buy_h(monops[0]); - else { - names[num_mon++] = "done"; - names[num_mon--] = 0; - if ((p=getinp("Which property do you wish to buy houses for? ", names)) == num_mon) - return; - buy_h(monops[p]); - goto over; + printf("%s (%d) ", sqp->name, ((PROP*)sqp->desc)->houses); } + putchar('\n'); } +static void buy_h(mnp) MON *mnp; { @@ -78,7 +41,7 @@ blew_it: printf("Houses will cost $%d\n", price); printf("How many houses do you wish to buy for\n"); for (i = 0; i < mp->num_in; i++) { - pp = mp->sq[i]->desc; + pp = (PROP*) mp->sq[i]->desc; over: if (pp->houses == 5) { printf("%s (H):\n", mp->sq[i]->name); @@ -106,10 +69,124 @@ err: printf("That makes the spread too wide. Try again\n"); tot += input[i]; if (tot) { printf("You asked for %d houses for $%d\n", tot, tot * price); - if (getyn("Is that ok? ", yn) == 0) { + if (getyn("Is that ok? ") == 0) { cur_p->money -= tot * price; for (tot = i = 0; i < mp->num_in; i++) - mp->sq[i]->desc->houses = temp[i]; + ((PROP*)mp->sq[i]->desc)->houses = temp[i]; + } + } +} + +/* + * These routines deal with buying and selling houses + */ +void +buy_houses() { + + reg int num_mon; + reg MON *mp; + reg OWN *op; + bool good,got_morg; + int i,p; + +over: + num_mon = 0; + good = TRUE; + got_morg = FALSE; + for (op = cur_p->own_list; op && op->sqr->type != PRPTY; op = op->next) + continue; + while (op) { + PROP *prop = (PROP*) op->sqr->desc; + if (prop->monop) { + mp = prop->mon_desc; + names[num_mon] = (monops[num_mon]=mp)->name; + num_mon++; + got_morg = good = FALSE; + for (i = 0; i < mp->num_in; i++) { + if (prop->morg) + got_morg++; + if (prop->houses != 5) + good++; + op = op->next; + } + if (!good || got_morg) + --num_mon; + } + else + op = op->next; + } + if (num_mon == 0) { + if (got_morg) + printf("You can't build on mortgaged monopolies.\n"); + else if (!good) + printf("You can't build any more.\n"); + else + printf("But you don't have any monopolies!!\n"); + return; + } + if (num_mon == 1) + buy_h(monops[0]); + else { + names[num_mon++] = "done"; + names[num_mon--] = 0; + if ((p=getinp("Which property do you wish to buy houses for? ", names)) == num_mon) + return; + buy_h(monops[p]); + goto over; + } +} + +static void +sell_h(mnp) +MON *mnp; { + + reg int i; + reg MON *mp; + reg int price; + shrt input[3],temp[3]; + int tot; + PROP *pp; + + mp = mnp; + price = mp->h_cost * 25; +blew_it: + printf("Houses will get you $%d apiece\n", price); + list_cur(mp); + printf("How many houses do you wish to sell from\n"); + for (i = 0; i < mp->num_in; i++) { + pp = (PROP*) mp->sq[i]->desc; +over: + if (pp->houses == 0) { + printf("%s (0):\n", mp->sq[i]->name); + input[i] = temp[i] = 0; + continue; + } + if (pp->houses < 5) + sprintf(cur_prop,"%s (%d): ", mp->sq[i]->name, pp->houses); + else + sprintf(cur_prop,"%s (H): ", mp->sq[i]->name); + input[i] = get_int(cur_prop); + temp[i] = pp->houses - input[i]; + if (temp[i] < 0) { + printf("That's too many. The most you can sell is %d\n", pp->houses); + goto over; + } + } + if (mp->num_in == 3 && (abs(temp[0] - temp[1]) > 1 || + abs(temp[0] - temp[2]) > 1 || abs(temp[1] - temp[2]) > 1)) { +err: printf("That makes the spread too wide. Try again\n"); + goto blew_it; + } + else if (mp->num_in == 2 && abs(temp[0] - temp[1]) > 1) + goto err; + for (tot = i = 0; i < mp->num_in; i++) + tot += input[i]; + if (tot) { + printf("You asked to sell %d houses for $%d\n",tot,tot * price); + if (getyn("Is that ok? ") == 0) { + cur_p->money += tot * price; + for (tot = i = 0; i < mp->num_in; i++) + ((PROP*)mp->sq[i]->desc)->houses = temp[i]; } } } @@ -117,6 +194,7 @@ err: printf("That makes the spread too wide. Try again\n"); /* * This routine sells houses. */ +void sell_houses() { reg int num_mon; @@ -129,15 +207,15 @@ over: num_mon = 0; good = TRUE; for (op = cur_p->own_list; op; op = op->next) - if (op->sqr->type == PRPTY && op->sqr->desc->monop) { - mp = op->sqr->desc->mon_desc; + if (op->sqr->type == PRPTY && ((PROP*)op->sqr->desc)->monop) { + mp = ((PROP*)op->sqr->desc)->mon_desc; names[num_mon] = (monops[num_mon]=mp)->name; num_mon++; good = 0; do - if (!good && op->sqr->desc->houses != 0) + if (!good && ((PROP*)op->sqr->desc)->houses != 0) good++; - while (op->next && op->sqr->desc->mon_desc == mp + while (op->next && ((PROP*)op->sqr->desc)->mon_desc == mp && (op=op->next)); if (!good) --num_mon; @@ -158,73 +236,3 @@ over: goto over; } } - -sell_h(mnp) -MON *mnp; { - - reg int i; - reg MON *mp; - reg int price; - shrt input[3],temp[3]; - int tot; - PROP *pp; - - mp = mnp; - price = mp->h_cost * 25; -blew_it: - printf("Houses will get you $%d apiece\n", price); - list_cur(mp); - printf("How many houses do you wish to sell from\n"); - for (i = 0; i < mp->num_in; i++) { - pp = mp->sq[i]->desc; -over: - if (pp->houses == 0) { - printf("%s (0):\n", mp->sq[i]->name); - input[i] = temp[i] = 0; - continue; - } - if (pp->houses < 5) - sprintf(cur_prop,"%s (%d): ",mp->sq[i]->name,pp->houses); - else - sprintf(cur_prop,"%s (H): ",mp->sq[i]->name,pp->houses); - input[i] = get_int(cur_prop); - temp[i] = pp->houses - input[i]; - if (temp[i] < 0) { - printf("That's too many. The most you can sell is %d\n", pp->houses); - goto over; - } - } - if (mp->num_in == 3 && (abs(temp[0] - temp[1]) > 1 || - abs(temp[0] - temp[2]) > 1 || abs(temp[1] - temp[2]) > 1)) { -err: printf("That makes the spread too wide. Try again\n"); - goto blew_it; - } - else if (mp->num_in == 2 && abs(temp[0] - temp[1]) > 1) - goto err; - for (tot = i = 0; i < mp->num_in; i++) - tot += input[i]; - if (tot) { - printf("You asked to sell %d houses for $%d\n",tot,tot * price); - if (getyn("Is that ok? ", yn) == 0) { - cur_p->money += tot * price; - for (tot = i = 0; i < mp->num_in; i++) - mp->sq[i]->desc->houses = temp[i]; - } - } -} - -list_cur(mp) -reg MON *mp; { - - reg int i; - reg SQUARE *sqp; - - for (i = 0; i < mp->num_in; i++) { - sqp = mp->sq[i]; - if (sqp->desc->houses == 5) - printf("%s (H) ", sqp->name); - else - printf("%s (%d) ", sqp->name, sqp->desc->houses); - } - putchar('\n'); -} diff --git a/src/games/monop/initdeck.c b/src/games/monop/initdeck.c index d0c7a3c..15ca2aa 100644 --- a/src/games/monop/initdeck.c +++ b/src/games/monop/initdeck.c @@ -1,5 +1,6 @@ -# include -# include "deck.h" +#include +#include +#include "deck.h" /* * This program initializes the card files for monopoly. @@ -12,11 +13,11 @@ * string to print, terminated with a null byte. */ -# define TRUE 1 -# define FALSE 0 +#define TRUE 1 +#define FALSE 0 -# define bool char -# define reg register +#define bool char +#define reg register char *infile = "cards.inp", /* input file */ *outfile = "cards.pck"; /* "packed" file */ @@ -27,42 +28,7 @@ DECK deck[2]; FILE *inf, *outf; -main(ac, av) -int ac; -char *av[]; { - - getargs(ac, av); - if ((inf = fopen(infile, "r")) == NULL) { - perror(infile); - exit(1); - } - count(); - /* - * allocate space for pointers. - */ - CC_D.offsets = calloc(CC_D.num_cards + 1, sizeof (long)); - CH_D.offsets = calloc(CH_D.num_cards + 1, sizeof (long)); - fseek(inf, 0L, 0); - if ((outf = fopen(outfile, "w")) == NULL) { - perror(outfile); - exit(0); - } - - fwrite(deck, sizeof (DECK), 2, outf); - fwrite(CC_D.offsets, sizeof (long), CC_D.num_cards, outf); - fwrite(CH_D.offsets, sizeof (long), CH_D.num_cards, outf); - putem(); - - fclose(inf); - fseek(outf, 0, 0L); - fwrite(deck, sizeof (DECK), 2, outf); - fwrite(CC_D.offsets, sizeof (long), CC_D.num_cards, outf); - fwrite(CH_D.offsets, sizeof (long), CH_D.num_cards, outf); - fclose(outf); - printf("There were %d com. chest and %d chance cards\n", CC_D.num_cards, CH_D.num_cards); - exit(0); -} - +void getargs(ac, av) int ac; char *av[]; { @@ -73,9 +39,11 @@ char *av[]; { outfile = av[3]; } } + /* * count the cards */ +void count() { reg bool newline; @@ -95,9 +63,11 @@ count() { newline = (c == '\n'); in_deck->num_cards++; } + /* * put strings in the file */ +void putem() { reg bool newline; @@ -138,3 +108,40 @@ putem() { } putc('\0', outf); } + +int +main(ac, av) +int ac; +char *av[]; { + + getargs(ac, av); + if ((inf = fopen(infile, "r")) == NULL) { + perror(infile); + exit(1); + } + count(); + /* + * allocate space for pointers. + */ + CC_D.offsets = calloc(CC_D.num_cards + 1, sizeof (long)); + CH_D.offsets = calloc(CH_D.num_cards + 1, sizeof (long)); + fseek(inf, 0L, 0); + if ((outf = fopen(outfile, "w")) == NULL) { + perror(outfile); + exit(0); + } + + fwrite(deck, sizeof (DECK), 2, outf); + fwrite(CC_D.offsets, sizeof (long), CC_D.num_cards, outf); + fwrite(CH_D.offsets, sizeof (long), CH_D.num_cards, outf); + putem(); + + fclose(inf); + fseek(outf, 0, 0L); + fwrite(deck, sizeof (DECK), 2, outf); + fwrite(CC_D.offsets, sizeof (long), CC_D.num_cards, outf); + fwrite(CH_D.offsets, sizeof (long), CH_D.num_cards, outf); + fclose(outf); + printf("There were %d com. chest and %d chance cards\n", CC_D.num_cards, CH_D.num_cards); + return 0; +} diff --git a/src/games/monop/jail.c b/src/games/monop/jail.c index c1309bc..4fff2cd 100644 --- a/src/games/monop/jail.c +++ b/src/games/monop/jail.c @@ -1,9 +1,10 @@ -# include "monop.ext" +#include "extern.h" /* * This routine uses a get-out-of-jail-free card to get the * player out of jail. */ +void card() { if (cur_p->loc != JAIL) { @@ -18,10 +19,12 @@ card() { cur_p->loc = 10; /* just visiting */ cur_p->in_jail = 0; } + /* * This routine returns the players get-out-of-jail-free card * to a deck. */ +void ret_card(plr) reg PLAY *plr; { @@ -31,9 +34,11 @@ reg PLAY *plr; { else CH_D.gojf_used = FALSE; } + /* * This routine deals with paying your way out of jail. */ +void pay() { if (cur_p->loc != JAIL) { @@ -45,9 +50,11 @@ pay() { cur_p->in_jail = 0; printf("That cost you $50\n"); } + /* * This routine deals with a move in jail */ +int move_jail(r1, r2) reg int r1, r2; { @@ -70,6 +77,8 @@ moveit: goto moveit; } } + +void printturn() { if (cur_p->loc != JAIL) diff --git a/src/games/monop/misc.c b/src/games/monop/misc.c index cbf0089..0acf2e7 100644 --- a/src/games/monop/misc.c +++ b/src/games/monop/misc.c @@ -1,8 +1,13 @@ -# include "monop.ext" -# include -# include +#include "extern.h" +#include +#include +#include +#include +#include +#include +#include -# define execsh(sh) execl(sh, shell_name[roll(1, num_names)-1], 0) +#define execsh(sh) execl(sh, shell_name[roll(1, num_names)-1], (char*)0) static char *shell_def = "/bin/csh", *shell_name[] = { @@ -21,26 +26,27 @@ static char *shell_def = "/bin/csh", static int num_names = sizeof shell_name / sizeof (char *);; -char *shell_in(); - /* * This routine executes a truncated set of commands until a * "yes or "no" answer is gotten. */ +int getyn(prompt) reg char *prompt; { reg int com; for (;;) - if ((com=getinp(prompt, yn)) < 2) + if ((com=getinp(prompt, yesno)) < 2) return com; else (*func[com-2])(); } + /* * This routine tells the player if he's out of money. */ +void notify() { if (cur_p->money < 0) @@ -52,19 +58,24 @@ notify() { told_em = TRUE; } } + /* * This routine switches to the next player */ +void next_play() { - player = ++player % num_play; + player++; + player %= num_play; cur_p = &play[player]; num_doub = 0; } + /* * This routine gets an integer from the keyboard after the * given prompt. */ +int get_int(prompt) reg char *prompt; { @@ -74,7 +85,7 @@ reg char *prompt; { for (;;) { inter: - printf(prompt); + printf("%s", prompt); num = 0; for (sp = buf; (*sp=getchar()) != '\n' && !feof(stdin); sp++) if (*sp == -1) /* check for interrupted system call */ @@ -95,9 +106,28 @@ inter: printf("I can't understand that\n"); } } + +/* + * This routine sets things up as if it is a new monopoly + */ +static void +is_monop(mp, pl) +reg MON *mp; +int pl; { + + reg int i; + + mp->owner = pl; + mp->num_own = mp->num_in; + for (i = 0; i < mp->num_in; i++) + ((PROP*)mp->sq[i]->desc)->monop = TRUE; + mp->name = mp->mon_n; +} + /* * This routine sets the monopoly flag from the list given. */ +void set_ownlist(pl) int pl; { @@ -146,10 +176,10 @@ int pl; { #ifdef DEBUG printf(" case PRPTY:\n"); #endif - orig = op->sqr->desc->mon_desc; + orig = ((PROP*)op->sqr->desc)->mon_desc; orig_op = op; num = 0; - while (op && op->sqr->desc->mon_desc == orig) { + while (op && ((PROP*)op->sqr->desc)->mon_desc == orig) { #ifdef DEBUG printf("iter: %d\n", num); #endif @@ -166,17 +196,17 @@ int pl; { printf("num = %d\n"); #endif if (orig == 0) { - printf("panic: bad monopoly descriptor: orig = %d\n", orig); + printf("panic: bad monopoly descriptor: orig = %p\n", orig); printf("player # %d\n", pl+1); printhold(pl); - printf("orig_op = %d\n", orig_op); + printf("orig_op = %p\n", orig_op); printf("orig_op->sqr->type = %d (PRPTY)\n", op->sqr->type); - printf("orig_op->next = %d\n", op->next); - printf("orig_op->sqr->desc = %d\n", op->sqr->desc); - printf("op = %d\n", op); + printf("orig_op->next = %p\n", op->next); + printf("orig_op->sqr->desc = %p\n", op->sqr->desc); + printf("op = %p\n", op); printf("op->sqr->type = %d (PRPTY)\n", op->sqr->type); - printf("op->next = %d\n", op->next); - printf("op->sqr->desc = %d\n", op->sqr->desc); + printf("op->next = %p\n", op->next); + printf("op->sqr->desc = %p\n", op->sqr->desc); printf("num = %d\n", num); } #ifdef DEBUG @@ -190,104 +220,64 @@ int pl; { } } } -/* - * This routine sets things up as if it is a new monopoly - */ -is_monop(mp, pl) -reg MON *mp; -int pl; { - reg char *sp; - reg int i; - - mp->owner = pl; - mp->num_own = mp->num_in; - for (i = 0; i < mp->num_in; i++) - mp->sq[i]->desc->monop = TRUE; - mp->name = mp->mon_n; -} /* * This routine sets things up as if it is no longer a monopoly */ +void isnot_monop(mp) reg MON *mp; { - reg char *sp; reg int i; mp->owner = -1; for (i = 0; i < mp->num_in; i++) - mp->sq[i]->desc->monop = FALSE; + ((PROP*)mp->sq[i]->desc)->monop = FALSE; mp->name = mp->not_m; } + /* * This routine gives a list of the current player's routine */ +void list() { - printhold(player); } + /* * This routine gives a list of a given players holdings */ +void list_all() { - reg int pl; while ((pl=getinp("Whose holdings do you want to see? ", name_list)) < num_play) printhold(pl); } + /* * This routine gives the players a chance before it exits. */ -quit() { +void +quit(int sig) { putchar('\n'); - if (getyn("Do you all really want to quit? ", yn) == 0) + if (getyn("Do you all really want to quit? ") == 0) exit(0); signal(2, quit); } -/* - * This routine copies one structure to another - */ -cpy_st(s1, s2, size) -reg int *s1, *s2, size; { - size /= 2; - while (size--) - *s1++ = *s2++; +int +quitgame() +{ + quit(0); + return 0; } -/* - * This routine forks off a shell. It uses the users login shell - */ -shell_out() { - static char *shell = NULL; - - printline(); - if (shell == NULL) - shell = shell_in(); - fflush(); - if (!fork()) { - signal(SIGINT, SIG_DFL); - execsh(shell); - } - ignoresigs(); - wait(); - resetsigs(); - putchar('\n'); - printline(); -} /* * This routine looks up the users login shell */ -# include - -struct passwd *getpwuid(); - -char *getenv(); - -char * +static char * shell_in() { reg struct passwd *pp; @@ -303,24 +293,49 @@ shell_in() { } return sp; } + /* * This routine sets things up to ignore all the signals. */ +static void ignoresigs() { - reg int i; for (i = 0; i < NSIG; i++) signal(i, SIG_IGN); } + /* * This routine sets up things as they were before. */ +static void resetsigs() { - reg int i; for (i = 0; i < NSIG; i++) signal(i, SIG_DFL); signal(2, quit); } + +/* + * This routine forks off a shell. It uses the users login shell + */ +void +shell_out() { + static char *shell = NULL; + int status; + + printline(); + if (shell == NULL) + shell = shell_in(); + fflush(stdout); + if (!fork()) { + signal(SIGINT, SIG_DFL); + execsh(shell); + } + ignoresigs(); + wait(&status); + resetsigs(); + putchar('\n'); + printline(); +} diff --git a/src/games/monop/mon.dat b/src/games/monop/mon.dat deleted file mode 100644 index cd49305..0000000 --- a/src/games/monop/mon.dat +++ /dev/null @@ -1,9 +0,0 @@ -/* name owner num_in num_own h_cost not_m mon_n sq */ -{0, -1, 2, 0, 1, "Purple", "PURPLE", {1,3}}, -{0, -1, 3, 0, 1, "Lt. Blue", "LT. BLUE", {6,8,9}}, -{0, -1, 3, 0, 2, "Violet", "VIOLET", {11,13,14}}, -{0, -1, 3, 0, 2, "Orange", "ORANGE", {16,18,19}}, -{0, -1, 3, 0, 3, "Red", "RED", {21,23,24}}, -{0, -1, 3, 0, 3, "Yellow", "YELLOW", {26,27,29}}, -{0, -1, 3, 0, 4, "Green", "GREEN", {31,32,34}}, -{0, -1, 2, 0, 4, "Dk. Blue", "DK. BLUE", {37,39}} diff --git a/src/games/monop/mon.dat.h b/src/games/monop/mon.dat.h new file mode 100644 index 0000000..fd25718 --- /dev/null +++ b/src/games/monop/mon.dat.h @@ -0,0 +1,9 @@ +/* name owner num_in num_own h_cost not_m mon_n sq */ +{0, -1, 2, 0, 1, "Purple", "PURPLE", {(SQUARE*)1,(SQUARE*)3}}, +{0, -1, 3, 0, 1, "Lt. Blue", "LT. BLUE", {(SQUARE*)6,(SQUARE*)8,(SQUARE*)9}}, +{0, -1, 3, 0, 2, "Violet", "VIOLET", {(SQUARE*)11,(SQUARE*)13,(SQUARE*)14}}, +{0, -1, 3, 0, 2, "Orange", "ORANGE", {(SQUARE*)16,(SQUARE*)18,(SQUARE*)19}}, +{0, -1, 3, 0, 3, "Red", "RED", {(SQUARE*)21,(SQUARE*)23,(SQUARE*)24}}, +{0, -1, 3, 0, 3, "Yellow", "YELLOW", {(SQUARE*)26,(SQUARE*)27,(SQUARE*)29}}, +{0, -1, 3, 0, 4, "Green", "GREEN", {(SQUARE*)31,(SQUARE*)32,(SQUARE*)34}}, +{0, -1, 2, 0, 4, "Dk. Blue", "DK. BLUE", {(SQUARE*)37,(SQUARE*)39}} diff --git a/src/games/monop/monop.c b/src/games/monop/monop.c index fd6023d..a397cbe 100644 --- a/src/games/monop/monop.c +++ b/src/games/monop/monop.c @@ -1,37 +1,14 @@ -# include "monop.def" +#include "defines.h" +#include +#include +#include +#include +#include -/* - * This program implements a monopoly game - */ -main(ac, av) -reg int ac; -reg char *av[]; { - - - srand(getpid()); - if (ac > 1) { - if (!rest_f(av[1])) - restore(); - } - else { - getplayers(); - init_players(); - init_monops(); - } - num_luck = sizeof lucky_mes / sizeof (char *); - init_decks(); - signal(2, quit); - for (;;) { - printf("\n%s (%d) (cash $%d) on %s\n", cur_p->name, player + 1, - cur_p->money, board[cur_p->loc].name); - printturn(); - force_morg(); - execute(getinp("-- Command: ", comlist)); - } -} /* * This routine gets the names of the players */ +void getplayers() { reg char *sp; @@ -64,25 +41,27 @@ over: name_list[i] = 0; for (i = 0; i < num_play; i++) for (j = i + 1; j < num_play; j++) - if (strcmp(name_list[i], name_list[j]) == 0) { + if (strcasecmp(name_list[i], name_list[j]) == 0) { if (i != num_play - 1) printf("Hey!!! Some of those are IDENTICAL!! Let's try that again....\n"); else printf("\"done\" is a reserved word. Please try again\n"); for (i = 0; i < num_play; i++) - cfree(play[i].name); - cfree(play); + free(play[i].name); + free(play); goto blew_it; } } + /* * This routine figures out who goes first */ +void init_players() { reg int i, rl, cur_max; - bool over; - int max_pl; + bool over = 0; + int max_pl = 0; again: putchar('\n'); @@ -105,9 +84,11 @@ again: cur_p = &play[max_pl]; printf("%s (%d) goes first\n", cur_p->name, max_pl + 1); } + /* * This routine initalizes the monopoly structures. */ +void init_monops() { reg MON *mp; @@ -119,3 +100,34 @@ init_monops() { mp->sq[i] = &board[(int)(mp->sq[i])]; } } + +/* + * This program implements a monopoly game + */ +int +main(ac, av) +reg int ac; +reg char *av[]; { + + + srand(getpid()); + if (ac > 1) { + if (!rest_f(av[1])) + restore(); + } + else { + getplayers(); + init_players(); + init_monops(); + } + num_luck = sizeof lucky_mes / sizeof (char *); + init_decks(); + signal(2, quit); + for (;;) { + printf("\n%s (%d) (cash $%d) on %s\n", cur_p->name, player + 1, + cur_p->money, board[(int)cur_p->loc].name); + printturn(); + force_morg(); + execute(getinp("-- Command: ", comlist)); + } +} diff --git a/src/games/monop/monop.h b/src/games/monop/monop.h index 0e53371..ab74af6 100644 --- a/src/games/monop/monop.h +++ b/src/games/monop/monop.h @@ -95,4 +95,34 @@ typedef struct prp_st PROP; typedef struct rr_st RR_S; typedef struct rr_st UTIL_S; -int cc(), chance(), lux_tax(), goto_jail(), inc_tax(); +int rest_f(char *file); +int get_int(char *prompt); +int roll(int ndie, int nsides); +int getinp(char *prompt, char *list[]); +int move_jail(int r1, int r2); +int getyn(char *prompt); +int prop_worth(PLAY *plp); + +void goto_jail(void); +void inc_tax(void); +void lux_tax(void); +void cc(void); +void chance(void); +void init_decks(void); +void quit(int sig); +void printturn(void); +void force_morg(void); +void execute(int com_num); +void move(int rl); +void notify(void); +void next_play(void); +void buy(int player, SQUARE *sqrp); +void bid(void); +void rent(SQUARE *sqp); +void ret_card(PLAY *plr); +void printhold(int pl); +void isnot_monop(MON *mp); +void printsq(int sqn, bool eoln); +void add_list(int plr, OWN **head, int op_sqr); +void del_list(int plr, OWN **head, shrt op_sqr); +void set_ownlist(int pl); diff --git a/src/games/monop/morg.c b/src/games/monop/morg.c index 6a07347..8438e53 100644 --- a/src/games/monop/morg.c +++ b/src/games/monop/morg.c @@ -1,4 +1,4 @@ -# include "monop.ext" +#include "extern.h" /* * These routines deal with mortgaging. @@ -29,11 +29,50 @@ static shrt square[MAX_PRP+2]; static int num_good,got_houses; +/* + * This routine sets up the list of mortgageable property + */ +static int +set_mlist() { + + reg OWN *op; + + num_good = 0; + for (op = cur_p->own_list; op; op = op->next) + if (! ((PROP*)op->sqr->desc)->morg) { + if (op->sqr->type == PRPTY && ((PROP*)op->sqr->desc)->houses) + got_houses++; + else { + names[num_good] = op->sqr->name; + square[num_good++] = sqnum(op->sqr); + } + } + names[num_good++] = "done"; + names[num_good--] = 0; + return num_good; +} + +/* + * This routine actually mortgages the property. + */ +static void +m(prop) +reg int prop; { + + reg int price; + + price = board[prop].cost/2; + ((PROP*)board[prop].desc)->morg = TRUE; + printf("That got you $%d\n",price); + cur_p->money += price; +} + /* * This routine is the command level response the mortgage command. * it gets the list of mortgageable property and asks which are to * be mortgaged. */ +void mortgage() { reg int prop; @@ -56,47 +95,52 @@ mortgage() { if (prop == num_good) return; m(square[prop]); - notify(cur_p); + notify(); } } + /* - * This routine sets up the list of mortgageable property + * This routine sets up the list of mortgaged property */ -set_mlist() { +static int +set_umlist() { reg OWN *op; num_good = 0; for (op = cur_p->own_list; op; op = op->next) - if (!op->sqr->desc->morg) - if (op->sqr->type == PRPTY && op->sqr->desc->houses) - got_houses++; - else { - names[num_good] = op->sqr->name; - square[num_good++] = sqnum(op->sqr); - } + if (((PROP*)op->sqr->desc)->morg) { + names[num_good] = op->sqr->name; + square[num_good++] = sqnum(op->sqr); + } names[num_good++] = "done"; names[num_good--] = 0; return num_good; } + /* - * This routine actually mortgages the property. + * This routine actually unmortgages the property */ -m(prop) +static void +unm(prop) reg int prop; { reg int price; price = board[prop].cost/2; - board[prop].desc->morg = TRUE; - printf("That got you $%d\n",price); - cur_p->money += price; + ((PROP*)board[prop].desc)->morg = FALSE; + price += price/10; + printf("That cost you $%d\n",price); + cur_p->money -= price; + set_umlist(); } + /* * This routine is the command level repsponse to the unmortgage * command. It gets the list of mortgaged property and asks which are * to be unmortgaged. */ +void unmortgage() { reg int prop; @@ -118,52 +162,11 @@ unmortgage() { unm(square[prop]); } } -/* - * This routine sets up the list of mortgaged property - */ -set_umlist() { - reg OWN *op; - - num_good = 0; - for (op = cur_p->own_list; op; op = op->next) - if (op->sqr->desc->morg) { - names[num_good] = op->sqr->name; - square[num_good++] = sqnum(op->sqr); - } - names[num_good++] = "done"; - names[num_good--] = 0; - return num_good; -} -/* - * This routine actually unmortgages the property - */ -unm(prop) -reg int prop; { - - reg int price; - - price = board[prop].cost/2; - board[prop].desc->morg = FALSE; - price += price/10; - printf("That cost you $%d\n",price); - cur_p->money -= price; - set_umlist(); -} -/* - * This routine forces the indebted player to fix his - * financial woes. - */ -force_morg() { - - told_em = fixing = TRUE; - while (cur_p->money <= 0) - fix_ex(getinp("How are you going to fix it up? ",morg_coms)); - fixing = FALSE; -} /* * This routine is a special execute for the force_morg routine */ +static void fix_ex(com_num) reg int com_num; { @@ -171,3 +174,16 @@ reg int com_num; { (*func[com_num])(); notify(); } + +/* + * This routine forces the indebted player to fix his + * financial woes. + */ +void +force_morg() { + + told_em = fixing = TRUE; + while (cur_p->money <= 0) + fix_ex(getinp("How are you going to fix it up? ",morg_coms)); + fixing = FALSE; +} diff --git a/src/games/monop/print.c b/src/games/monop/print.c index d7e27b6..1c3115a 100644 --- a/src/games/monop/print.c +++ b/src/games/monop/print.c @@ -1,11 +1,11 @@ -# include "monop.ext" +#include "extern.h" -static char buf[80], /* output buffer */ - *header = "Name Own Price Mg # Rent"; +static char *header = "Name Own Price Mg # Rent"; /* * This routine prints out the current board */ +void printboard() { reg int i; @@ -17,13 +17,14 @@ printboard() { printsq(i+N_SQRS/2, TRUE); } } + /* * This routine lists where each player is. */ +void where() { reg int i; - char *bsp; printf("%s Player\n", header); for (i = 0; i < num_play; i++) { @@ -34,9 +35,24 @@ where() { putchar('\n'); } } + +/* + * This routine prints out the mortgage flag. + */ +static void +printmorg(sqp) +reg SQUARE *sqp; { + + if (((PROP*)sqp->desc)->morg) + printf(" * "); + else + printf(" "); +} + /* * This routine prints out an individual square */ +void printsq(sqn, eoln) int sqn; reg bool eoln; { @@ -44,7 +60,6 @@ reg bool eoln; { reg int rnt; reg PROP *pp; reg SQUARE *sqp; - int i; sqp = &board[sqn]; printf("%-10.10s", sqp->name); @@ -60,7 +75,7 @@ spec: printf(" "); break; case PRPTY: - pp = sqp->desc; + pp = (PROP*) sqp->desc; if (sqp->owner < 0) { printf(" - %-8.8s %3d", pp->mon_desc->name, sqp->cost); if (!eoln) @@ -74,7 +89,7 @@ spec: if (pp->houses < 5) if (pp->houses > 0) printf("%d %4d", pp->houses, - pp->rent[pp->houses]); + pp->rent[(int)pp->houses]); else printf("0 %4d", pp->rent[0] * 2); else @@ -92,7 +107,7 @@ spec: } printf(" %d 150", sqp->owner+1); printmorg(sqp); - printf("%d", play[sqp->owner].num_util); + printf("%d", play[(int)sqp->owner].num_util); if (!eoln) printf(" "); break; @@ -106,33 +121,23 @@ spec: printf(" %d Railroad 200", sqp->owner+1); printmorg(sqp); rnt = 25; - rnt <<= play[sqp->owner].num_rr - 1; - printf("%d %4d", play[sqp->owner].num_rr, 25 << (play[sqp->owner].num_rr - 1)); + rnt <<= play[(int)sqp->owner].num_rr - 1; + printf("%d %4d", play[(int)sqp->owner].num_rr, 25 << (play[(int)sqp->owner].num_rr - 1)); break; } if (eoln) putchar('\n'); } -/* - * This routine prints out the mortgage flag. - */ -printmorg(sqp) -reg SQUARE *sqp; { - if (sqp->desc->morg) - printf(" * "); - else - printf(" "); -} /* * This routine lists the holdings of the player given */ +void printhold(pl) reg int pl; { reg OWN *op; reg PLAY *pp; - char *bsp; pp = &play[pl]; printf("%s's (%d) holdings (Total worth: $%d):\n", name_list[pl], pl+1, diff --git a/src/games/monop/prop.c b/src/games/monop/prop.c index 846f2ff..67b9eb5 100644 --- a/src/games/monop/prop.c +++ b/src/games/monop/prop.c @@ -1,9 +1,11 @@ -# include "monop.ext" +#include "extern.h" +#include /* * This routine deals with buying property, setting all the * appropriate flags. */ +void buy(player, sqrp) reg int player; reg SQUARE *sqrp; { @@ -12,77 +14,12 @@ reg SQUARE *sqrp; { sqrp->owner = player; add_list(player, &(play[player].own_list), cur_p->loc); } -/* - * This routine adds an item to the list. - */ -add_list(plr, head, op_sqr) -int plr; -OWN **head; -int op_sqr; { - reg int val; - reg OWN *tp, *last_tp; - MON *mp; - OWN *op; - - op = calloc(1, sizeof (OWN)); - op->sqr = &board[op_sqr]; - val = value(op->sqr); - last_tp = NULL; - for (tp = *head; tp && value(tp->sqr) < val; tp = tp->next) - if (val == value(tp->sqr)) { - cfree(op); - return; - } - else - last_tp = tp; - op->next = tp; - if (last_tp != NULL) - last_tp->next = op; - else - *head = op; - if (!trading) - set_ownlist(plr); -} -/* - * This routine deletes property from the list. - */ -del_list(plr, head, op_sqr) -int plr; -OWN **head; -shrt op_sqr; { - - reg int i; - reg OWN *op, *last_op; - - switch (board[op_sqr].type) { - case PRPTY: - board[op_sqr].desc->mon_desc->num_own--; - break; - case RR: - play[plr].num_rr--; - break; - case UTIL: - play[plr].num_util--; - break; - } - last_op = NULL; - for (op = *head; op; op = op->next) - if (op->sqr == &board[op_sqr]) - break; - else - last_op = op; - if (last_op == NULL) - *head = op->next; - else { - last_op->next = op->next; - cfree(op); - } -} /* * This routine calculates the value for sorting of the * given square. */ +static int value(sqp) reg SQUARE *sqp; { @@ -104,13 +41,84 @@ reg SQUARE *sqp; { case PRPTY: return 8 + (PROP *)(sqp->desc) - prop; } + return 0; } + +/* + * This routine adds an item to the list. + */ +void +add_list(plr, head, op_sqr) +int plr; +OWN **head; +int op_sqr; { + + reg int val; + reg OWN *tp, *last_tp; + OWN *op; + + op = calloc(1, sizeof (OWN)); + op->sqr = &board[op_sqr]; + val = value(op->sqr); + last_tp = NULL; + for (tp = *head; tp && value(tp->sqr) < val; tp = tp->next) + if (val == value(tp->sqr)) { + free(op); + return; + } + else + last_tp = tp; + op->next = tp; + if (last_tp != NULL) + last_tp->next = op; + else + *head = op; + if (!trading) + set_ownlist(plr); +} + +/* + * This routine deletes property from the list. + */ +void +del_list(plr, head, op_sqr) +int plr; +OWN **head; +shrt op_sqr; { + + reg OWN *op, *last_op; + + switch (board[(int)op_sqr].type) { + case PRPTY: + ((PROP*)board[(int)op_sqr].desc)->mon_desc->num_own--; + break; + case RR: + play[plr].num_rr--; + break; + case UTIL: + play[plr].num_util--; + break; + } + last_op = NULL; + for (op = *head; op; op = op->next) + if (op->sqr == &board[(int)op_sqr]) + break; + else + last_op = op; + if (last_op == NULL) + *head = op->next; + else { + last_op->next = op->next; + free(op); + } +} + /* * This routine accepts bids for the current peice * of property. */ +void bid() { - static bool in[MAX_PL]; reg int i, num_in, cur_max; char buf[80]; @@ -123,7 +131,8 @@ bid() { cur_max = 0; num_in = num_play; while (num_in > 1 || (cur_max == 0 && num_in > 0)) { - i = ++i % num_play; + i++; + i %= num_play; if (in[i]) { do { sprintf(buf, "%s: ", name_list[i]); @@ -142,19 +151,23 @@ bid() { } } if (cur_max != 0) { - while (!in[i]) - i = ++i % num_play; + while (!in[i]) { + i++; + i %= num_play; + } printf("It goes to %s (%d) for $%d\n",play[i].name,i+1,cur_max); - buy(i, &board[cur_p->loc]); + buy(i, &board[(int)cur_p->loc]); play[i].money -= cur_max; } else printf("Nobody seems to want it, so we'll leave it for later\n"); } + /* * This routine calculates the value of the property * of given player. */ +int prop_worth(plp) reg PLAY *plp; { @@ -163,9 +176,9 @@ reg PLAY *plp; { worth = 0; for (op = plp->own_list; op; op = op->next) { - if (op->sqr->type == PRPTY && op->sqr->desc->monop) - worth += op->sqr->desc->mon_desc->h_cost * 50 * - op->sqr->desc->houses; + if (op->sqr->type == PRPTY && ((PROP*)op->sqr->desc)->monop) + worth += ((PROP*)op->sqr->desc)->mon_desc->h_cost * 50 * + ((PROP*)op->sqr->desc)->houses; worth += op->sqr->cost; } return worth; diff --git a/src/games/monop/prop.dat b/src/games/monop/prop.dat.h similarity index 100% rename from src/games/monop/prop.dat rename to src/games/monop/prop.dat.h diff --git a/src/games/monop/rent.c b/src/games/monop/rent.c index 7357f8f..5da8996 100644 --- a/src/games/monop/rent.c +++ b/src/games/monop/rent.c @@ -1,33 +1,34 @@ -# include "monop.ext" +#include "extern.h" /* * This routine has the player pay rent */ +void rent(sqp) reg SQUARE *sqp; { - reg int rnt; + reg int rnt = 0; reg PROP *pp; PLAY *plp; - plp = &play[sqp->owner]; + plp = &play[(int)sqp->owner]; printf("Owned by %s\n", plp->name); - if (sqp->desc->morg) { + if (((PROP*)sqp->desc)->morg) { lucky("The thing is mortgaged. "); return; } switch (sqp->type) { case PRPTY: - pp = sqp->desc; + pp = (PROP*) sqp->desc; if (pp->monop) if (pp->houses == 0) printf("rent is %d\n", rnt=pp->rent[0] * 2); else if (pp->houses < 5) printf("with %d houses, rent is %d\n", - pp->houses, rnt=pp->rent[pp->houses]); + pp->houses, rnt=pp->rent[(int)pp->houses]); else printf("with a hotel, rent is %d\n", - rnt=pp->rent[pp->houses]); + rnt=pp->rent[(int)pp->houses]); else printf("rent is %d\n", rnt = pp->rent[0]); break; diff --git a/src/games/monop/roll.c b/src/games/monop/roll.c index b1d72a2..319f413 100644 --- a/src/games/monop/roll.c +++ b/src/games/monop/roll.c @@ -1,37 +1,16 @@ /* * This routine rolls ndie nside-sided dice. */ +#include -# define reg register - -# ifndef vax -# define MAXRAND 32767L - +int roll(ndie, nsides) int ndie, nsides; { - reg long tot; - reg unsigned n, r; + int tot; - tot = 0; - n = ndie; - while (n--) - tot += rand(); - return (int) ((tot * (long) nsides) / ((long) MAXRAND + 1)) + ndie; -} - -# else - -roll(ndie, nsides) -reg int ndie, nsides; { - - reg int tot, r; - reg double num_sides; - - num_sides = nsides; tot = 0; while (ndie--) - tot += (r = rand()) * (num_sides / 017777777777) + 1; + tot += random() % nsides + 1; return tot; } -# endif diff --git a/src/games/monop/spec.c b/src/games/monop/spec.c index b100f21..bd994e9 100644 --- a/src/games/monop/spec.c +++ b/src/games/monop/spec.c @@ -1,9 +1,10 @@ -# include "monop.ext" +#include "extern.h" static char *perc[] = { "10%", "ten percent", "%", "$200", "200", 0 }; +void inc_tax() { /* collect income tax */ reg int worth, com_num; @@ -30,20 +31,24 @@ inc_tax() { /* collect income tax */ if (worth == 200) lucky("\nIt makes no difference! "); } -goto_jail() { /* move player to jail */ +void +goto_jail() { /* move player to jail */ cur_p->loc = JAIL; } -lux_tax() { /* landing on luxury tax */ +void +lux_tax() { /* landing on luxury tax */ printf("You lose $75\n"); cur_p->money -= 75; } -cc() { /* draw community chest card */ +void +cc() { /* draw community chest card */ get_card(&CC_D); } -chance() { /* draw chance card */ +void +chance() { /* draw chance card */ get_card(&CH_D); } diff --git a/src/games/monop/strcmp.c b/src/games/monop/strcmp.c index 1c53627..189f60c 100644 --- a/src/games/monop/strcmp.c +++ b/src/games/monop/strcmp.c @@ -1,9 +1,9 @@ -# include -# include +#include +#include -# define reg register +#define reg register -# define makelower(c) (isupper(c) ? tolower(c) : c) +#define makelower(c) (isupper(c) ? tolower(c) : c) /* * Compare strings: s1>s2: >0 s1==s2: 0 s1 -static struct trd_st { /* how much to give to other player */ +struct trd_st { /* how much to give to other player */ int trader; /* trader number */ int cash; /* amount of cash */ int gojf; /* # get-out-of-jail-free cards */ @@ -15,44 +16,30 @@ static int used[MAX_PRP]; static TRADE trades[2]; -trade() { +/* + * This routine sets up the list of tradable property. + */ +static int +set_list(the_list) +reg OWN *the_list; { - reg int tradee, i; + reg int i; + reg OWN *op; - trading = TRUE; - for (i = 0; i < 2; i++) { - trades[i].cash = 0; - trades[i].gojf = FALSE; - trades[i].prop_list = NULL; - } -over: - if (num_play == 1) { - printf("There ain't no-one around to trade WITH!!\n"); - return; - } - if (num_play > 2) { - tradee = getinp("Which player do you wish to trade with? ", - name_list); - if (tradee == num_play) - return; - if (tradee == player) { - printf("You can't trade with yourself!\n"); - goto over; - } - } - else - tradee = 1 - player; - get_list(0, player); - get_list(1, tradee); - if (getyn("Do you wish a summary? ") == 0) - summate(); - if (getyn("Is the trade ok? ") == 0) - do_trade(); + i = 0; + for (op = the_list; op; op = op->next) + if (!used[i]) + list[i++] = op->sqr->name; + list[i++] = "done"; + list[i--] = 0; + return i; } + /* * This routine gets the list of things to be trader for the * player, and puts in the structure given. */ +static void get_list(struct_no, play_no) int struct_no, play_no; { @@ -101,26 +88,11 @@ once_more: } } } -/* - * This routine sets up the list of tradable property. - */ -set_list(the_list) -reg OWN *the_list; { - reg int i; - reg OWN *op; - - i = 0; - for (op = the_list; op; op = op->next) - if (!used[i]) - list[i++] = op->sqr->name; - list[i++] = "done"; - list[i--] = 0; - return i; -} /* * This routine summates the trade. */ +static void summate() { reg bool some; @@ -147,17 +119,11 @@ summate() { printf("\t-- Nothing --\n"); } } -/* - * This routine actually executes the trade. - */ -do_trade() { - move_em(&trades[0], &trades[1]); - move_em(&trades[1], &trades[0]); -} /* * This routine does a switch from one player to another */ +static void move_em(from, to) TRADE *from, *to; { @@ -178,21 +144,69 @@ TRADE *from, *to; { } set_ownlist(to->trader); } + +/* + * This routine actually executes the trade. + */ +static void +do_trade() { + + move_em(&trades[0], &trades[1]); + move_em(&trades[1], &trades[0]); +} + +void +trade() { + + reg int tradee, i; + + trading = TRUE; + for (i = 0; i < 2; i++) { + trades[i].cash = 0; + trades[i].gojf = FALSE; + trades[i].prop_list = NULL; + } +over: + if (num_play == 1) { + printf("There ain't no-one around to trade WITH!!\n"); + return; + } + if (num_play > 2) { + tradee = getinp("Which player do you wish to trade with? ", + name_list); + if (tradee == num_play) + return; + if (tradee == player) { + printf("You can't trade with yourself!\n"); + goto over; + } + } + else + tradee = 1 - player; + get_list(0, player); + get_list(1, tradee); + if (getyn("Do you wish a summary? ") == 0) + summate(); + if (getyn("Is the trade ok? ") == 0) + do_trade(); +} + /* * This routine lets a player resign */ +void resign() { - reg int i, new_own; + reg int i, new_own = 0; reg OWN *op; SQUARE *sqp; if (cur_p->money <= 0) { - switch (board[cur_p->loc].type) { + switch (board[(int)cur_p->loc].type) { case UTIL: case RR: case PRPTY: - new_own = board[cur_p->loc].owner; + new_own = board[(int)cur_p->loc].owner; break; case SPEC: case CC: @@ -219,7 +233,7 @@ resign() { } while (new_own == player); name_list[num_play] = "done"; } - if (getyn("Do you really want to resign? ", yn) != 0) + if (getyn("Do you really want to resign? ") != 0) return; if (num_play == 1) { printf("Then NOBODY wins (not even YOU!)\n"); @@ -241,10 +255,10 @@ resign() { for (op = cur_p->own_list; op; op = op->next) { sqp = op->sqr; sqp->owner = -1; - sqp->desc->morg = FALSE; - if (op->type == PRPTY) { - isnot_monop(sqp->desc->mon_desc); - sqp->desc->houses = 0; + ((PROP*)sqp->desc)->morg = FALSE; + if (op->sqr->type == PRPTY) { + isnot_monop(((PROP*)sqp->desc)->mon_desc); + ((PROP*)sqp->desc)->houses = 0; } } if (cur_p->num_gojf) @@ -253,7 +267,7 @@ resign() { for (i = player; i < num_play; i++) { name_list[i] = name_list[i+1]; if (i + 1 < num_play) - cpy_st(&play[i], &play[i+1], sizeof (PLAY)); + play[i] = play[i+1]; } name_list[num_play--] = 0; for (i = 0; i < N_SQRS; i++) diff --git a/src/games/quiz/.gitignore b/src/games/quiz/.gitignore new file mode 100644 index 0000000..fced154 --- /dev/null +++ b/src/games/quiz/.gitignore @@ -0,0 +1 @@ +quiz diff --git a/src/games/quiz/Makefile b/src/games/quiz/Makefile index c314721..4b3c2c3 100644 --- a/src/games/quiz/Makefile +++ b/src/games/quiz/Makefile @@ -1,42 +1,30 @@ # @(#)Makefile 4.2 (Berkeley) 9/7/85 # -DESTDIR= -CFLAGS= -O -SEPFLAG= -i +TOPSRC = $(shell cd ../../..; pwd) +include $(TOPSRC)/target.mk +#include $(TOPSRC)/cross.mk +#CFLAGS = -O -DCROSS -Werror -Wall -quiz: quiz.c - cc ${SEPFLAG} ${CFLAGS} -o quiz quiz.c +CFLAGS += -Werror -Wall -install: quiz quiz.k - install -s quiz ${DESTDIR}/usr/games/quiz - cp -r quiz.k ${DESTDIR}/usr/games/lib +OBJS = quiz.o +MAN = quiz.0 + +all: quiz $(MAN) + +quiz: $(OBJS) + $(CC) $(LDFLAGS) -o $@.elf $(OBJS) $(LIBS) + $(OBJDUMP) -S $@.elf > $@.dis + $(SIZE) $@.elf + $(ELF2AOUT) $@.elf $@ && rm $@.elf + +$(MAN): quiz.6 + nroff -man $< > $@ clean: - rm -f a.out core *.s *.o quiz + rm -f *.o core quiz *.0 *.dis -depend: - cat x.c - for i in quiz; do \ - (echo $$i: $$i.c >>makedep; \ - /bin/grep '^#[ ]*include' x.c $$i.c | sed \ - -e 's,<\(.*\)>,"/usr/include/\1",' \ - -e 's/:[^"]*"\([^"]*\)".*/: \1/' \ - -e 's/\.c//' >>makedep); done - echo '/^# DO NOT DELETE THIS LINE/+2,$$d' >eddep - echo '$$r makedep' >>eddep - echo 'w' >>eddep - cp Makefile Makefile.bak - ed - Makefile < eddep - rm eddep makedep x.c - echo '# DEPENDENCIES MUST END AT END OF FILE' >> Makefile - echo '# IF YOU PUT STUFF HERE IT WILL GO AWAY' >> Makefile - echo '# see make depend above' >> Makefile - -# DO NOT DELETE THIS LINE -- make depend uses it - -quiz: quiz.c -quiz: /usr/include/stdio.h -quiz: /usr/include/signal.h -# DEPENDENCIES MUST END AT END OF FILE -# IF YOU PUT STUFF HERE IT WILL GO AWAY -# see make depend above +install: all + install quiz $(DESTDIR)/games/ + install -m 644 $(MAN) $(DESTDIR)/share/man/cat6/ + cp -r quiz.k ${DESTDIR}/games/lib diff --git a/src/games/quiz/quiz.c b/src/games/quiz/quiz.c index 51da296..6e910d3 100644 --- a/src/games/quiz/quiz.c +++ b/src/games/quiz/quiz.c @@ -1,8 +1,10 @@ - -static char sccsid[] = " quiz.c 4.2 85/01/09 "; - #include #include +#include +#include +#include +#include + #define NF 10 #define NL 300 #define NC 200 @@ -24,8 +26,11 @@ int nc = 0; char line[150]; char response[100]; char *tmp[NF]; -int select[NF]; +int choice[NF]; +int string(int s); + +int readline() { char *t; @@ -57,18 +62,34 @@ loop: char *eu; char *ev; -cmp(u,v) -char *u,*v; + +int +fold(c) +char c; { - int x; - eu = u; - ev = v; - x = disj(1); - if(x!=1) - return(x); - return(eat(1,0)); + if(c<'A'||c>'Z') + return(c); + return(c|040); } +int +eat(s,c) +char c; +{ + if(*ev!=c) + return(2); + if(s==0) { + ev++; + return(1); + } + if(fold(*eu)!=fold(c)) + return(0); + eu++; + ev++; + return(1); +} + +int disj(s) { int t, x; @@ -83,7 +104,7 @@ disj(s) case 0: case ']': case '}': - return(t|x&s); + return t | (x & s); case '|': ev++; t |= s; @@ -108,6 +129,7 @@ disj(s) } } +int string(s) { int x; @@ -152,44 +174,26 @@ string(s) } } -eat(s,c) -char c; +int +cmp(u,v) +char *u,*v; { - if(*ev!=c) - return(2); - if(s==0) { - ev++; - return(1); - } - if(fold(*eu)!=fold(c)) - return(0); - eu++; - ev++; - return(1); -} - -fold(c) -char c; -{ - if(c<'A'||c>'Z') - return(c); - return(c|040); -} - -publish(t) -char *t; -{ - ev = t; - pub1(1); + int x; + eu = u; + ev = v; + x = disj(1); + if(x!=1) + return(x); + return(eat(1,0)); } +void pub1(s) { for(;;ev++){ switch(*ev) { case '|': s = 0; - ev; continue; case ']': case '}': @@ -199,7 +203,6 @@ pub1(s) case '{': ev++; pub1(s); - ev; continue; case '\\': if(*++ev=='\n') @@ -211,6 +214,15 @@ pub1(s) } } +void +publish(t) +char *t; +{ + ev = t; + pub1(1); +} + +int segment(u,w) char *u, *w[]; { @@ -240,8 +252,15 @@ char *u, *w[]; } } printf("Too many facts about one thing\n"); + return 0; } +void +badinfo(){ + printf("Bad info %s\n",line); +} + +int perm(u,m,v,n,p) int p[]; char *u[], *v[]; @@ -263,18 +282,20 @@ uloop: ; return(1); } +int find(u,m) char *u[]; { int n; while(readline()){ n = segment(line,tmp); - if(perm(u,m,tmp+1,n-1,select)) + if(perm(u,m,tmp+1,n-1,choice)) return(1); } return(0); } +void readindex() { xx[0] = nc = 0; @@ -288,139 +309,17 @@ readindex() } } +void talloc() { int i; - char *malloc(); for(i=0;i1&&*argv[1]=='-') { - switch(argv[1][1]) { - case 'i': - if(argc>2) - info = argv[2]; - argc -= 2; - argv += 2; - goto loop; - case 't': - tflag = 1; - argc--; - argv++; - goto loop; - } - } - input = fopen(info,"r"); - if(input==NULL) { - printf("No info\n"); - exit(0); - } - talloc(); - if(argc<=2) - instruct(info); - signal(SIGINT,done); - argv[argc] = 0; - if(find(&argv[1],argc-1)==0) - dunno(); - fclose(input); - input = fopen(tmp[0],"r"); - if(input==NULL) - dunno(); - readindex(); - if(!tflag || na>nl) - na = nl; - stdout->_flag |= _IONBF; - for(;;) { - i = next(); - fseek(input,xx[i]+0L,0); - z = xx[i+1]-xx[i]; - for(j=0;j1) badinfo(); - if(x==1) { - printf("Right!\n"); - if(count==0) rights++; - if(++score[i]>=1 && nar&&t[-1]==' ') - *--t = '\n'; - break; - } - } - *t = 0; - return(t-r); -} - -next() -{ - int flag; - inc = inc*3125&077777; - ptr = (inc>>2)%na; - flag = 0; - while(score[ptr]>0) - if(++ptr>=na) { - ptr = 0; - if(flag) done(); - flag = 1; - } - return(ptr); -} - -done() +void +done(int sig) { printf("\nRights %d, wrongs %d, ", rights, wrongs); if(guesses) @@ -428,9 +327,10 @@ done() printf("score %d%%\n",100*rights/(rights+wrongs)); exit(0); } -instruct(info) + +void +instruct(char *info) { - char *t; int i, n; printf("Subjects:\n\n"); while(readline()) { @@ -466,12 +366,141 @@ instruct(info) exit(0); } -badinfo(){ - printf("Bad info %s\n",line); -} - +void dunno() { printf("I don't know about that\n"); exit(0); } + +int +next() +{ + int flag; + inc = inc*3125&077777; + ptr = (inc>>2)%na; + flag = 0; + while(score[ptr]>0) + if(++ptr>=na) { + ptr = 0; + if(flag) done(0); + flag = 1; + } + return(ptr); +} + +int +query(r) +char *r; +{ + char *t; + for(t=r;;t++) { + if(read(0,t,1)==0) + done(0); + if(*t==' '&&(t==r||t[-1]==' ')) + t--; + if(*t=='\n') { + while(t>r&&t[-1]==' ') + *--t = '\n'; + break; + } + } + *t = 0; + return(t-r); +} + +int +main(argc,argv) +char *argv[]; +{ + int j, i, x, z, count; + char *indexfile, *p; + time_t tvec; + char inputfile[100]; + +#ifdef CROSS + indexfile = "/usr/local/games/quiz.k/index"; +#else + indexfile = "/games/lib/quiz.k/index"; +#endif + time(&tvec); + inc = (tvec & 077774) | 01; +loop: + if(argc>1&&*argv[1]=='-') { + switch(argv[1][1]) { + case 'i': + if(argc>2) + indexfile = argv[2]; + argc -= 2; + argv += 2; + goto loop; + case 't': + tflag = 1; + argc--; + argv++; + goto loop; + } + } + input = fopen(indexfile,"r"); + if(input==NULL) { + printf("No indexfile\n"); + exit(0); + } + talloc(); + if(argc<=2) + instruct(indexfile); + signal(SIGINT,done); + argv[argc] = 0; + if(find(&argv[1],argc-1)==0) + dunno(); + fclose(input); + + strcpy(inputfile, indexfile); + p = strrchr(inputfile, '/'); + if (! p) + dunno(); + strcpy(p+1, tmp[0]); + input = fopen(inputfile,"r"); + if(input==NULL) + dunno(); + readindex(); + if(!tflag || na>nl) + na = nl; + setbuf(stdout, NULL); + for(;;) { + i = next(); + fseek(input,xx[i]+0L,0); + z = xx[i+1]-xx[i]; + for(j=0;j1) badinfo(); + if(x==1) { + printf("Right!\n"); + if(count==0) rights++; + if(++score[i]>=1 && na1 > lint.out +OBJS = extern.o init_field.o main.o make_level.o move.o \ + move_robs.o play_level.o query.o rnd_pos.o score.o \ + flush_in.o +MAN = robots.0 +LIBS = -lcurses -ltermcap -lc -install: robots - install -s -m 4711 -o daemon robots ${DESTDIR}/usr/games - install -c -m 644 -o daemon /dev/null ${DESTDIR}/usr/games/lib/robots_roll +all: robots $(MAN) + +robots: $(OBJS) + $(CC) $(LDFLAGS) -o $@.elf $(OBJS) $(LIBS) + $(OBJDUMP) -S $@.elf > $@.dis + $(SIZE) $@.elf + $(ELF2AOUT) $@.elf $@ && rm $@.elf + +$(MAN): robots.6 + nroff -man $< > $@ clean: - rm -f a.out core *.o robots lint.out errs + rm -f *.o core robots *.0 *.dis + +install: all + install robots $(DESTDIR)/games/ + install -m 644 $(MAN) $(DESTDIR)/share/man/cat6/ + install -c -m 644 /dev/null ${DESTDIR}/games/lib/robots_roll +### +extern.o: extern.c robots.h +flush_in.o: flush_in.c +init_field.o: init_field.c robots.h +main.o: main.c robots.h +make_level.o: make_level.c robots.h +move.o: move.c robots.h +move_robs.o: move_robs.c robots.h +play_level.o: play_level.c robots.h +query.o: query.c robots.h +rnd_pos.o: rnd_pos.c robots.h +score.o: score.c robots.h diff --git a/src/games/robots/extern.c b/src/games/robots/extern.c index 1a4c103..bfb4042 100644 --- a/src/games/robots/extern.c +++ b/src/games/robots/extern.c @@ -3,12 +3,7 @@ * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. */ - -#ifndef lint -static char sccsid[] = "@(#)extern.c 5.1 (Berkeley) 5/30/85"; -#endif not lint - -# include "robots.h" +#include "robots.h" bool Dead; /* Player is now dead */ bool Full_clear = TRUE; /* Lots of junk for init_field to clear */ diff --git a/src/games/robots/flush_in.c b/src/games/robots/flush_in.c index 9d4842d..e9b4c2d 100644 --- a/src/games/robots/flush_in.c +++ b/src/games/robots/flush_in.c @@ -3,22 +3,18 @@ * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. */ - -#ifndef lint -static char sccsid[] = "@(#)flush_in.c 5.1 (Berkeley) 5/30/85"; -#endif not lint - -# include +#include /* * flush_in: * Flush all pending input. */ +void flush_in() { -# ifdef TIOCFLUSH +#ifdef TIOCFLUSH ioctl(fileno(stdin), TIOCFLUSH, NULL); -# else TIOCFLUSH +#else crmode(); -# endif TIOCFLUSH +#endif } diff --git a/src/games/robots/init_field.c b/src/games/robots/init_field.c index a72c717..78cafcf 100644 --- a/src/games/robots/init_field.c +++ b/src/games/robots/init_field.c @@ -3,23 +3,17 @@ * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. */ - -#ifndef lint -static char sccsid[] = "@(#)init_field.c 5.1 (Berkeley) 5/30/85"; -#endif not lint - -# include "robots.h" +#include "robots.h" /* * init_field: * Lay down the initial pattern whih is constant across all levels, * and initialize all the global variables. */ +void init_field() { register int i; - register WINDOW *wp; - register int j; static bool first = TRUE; static char *desc[] = { "Directions:", diff --git a/src/games/robots/main.c b/src/games/robots/main.c index df15f7a..0b3e8b8 100644 --- a/src/games/robots/main.c +++ b/src/games/robots/main.c @@ -3,21 +3,71 @@ * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. */ +#include "robots.h" +#include +#include +#include +#include +#include -#ifndef lint -char copyright[] = -"@(#) Copyright (c) 1980 Regents of the University of California.\n\ - All rights reserved.\n"; -#endif not lint +#ifndef CROSS +static int +fputchar(int c) +{ + return putchar(c); +} +#endif -#ifndef lint -static char sccsid[] = "@(#)main.c 5.1 (Berkeley) 5/30/85"; -#endif not lint +/* + * quit: + * Leave the program elegantly. + */ +void +quit(int sig) +{ + mvcur(0, COLS - 1, LINES - 1, 0); +#ifndef CROSS + if (CE) { + tputs(CE, 1, fputchar); + endwin(); + } else +#endif + { + endwin(); + putchar('\n'); + } + exit(0); + /* NOTREACHED */ +} -# include "robots.h" -# include -# include +/* + * another: + * See if another game is desired + */ +int +another() +{ + register int y; +#ifdef FANCY + if ((Stand_still || Pattern_roll) && !Newscore) + return TRUE; +#endif + + if (query("Another game?")) { + if (Full_clear) { + for (y = 1; y <= Num_scores; y++) { + move(y, 1); + clrtoeol(); + } + refresh(); + } + return TRUE; + } + return FALSE; +} + +int main(ac, av) int ac; char **av; @@ -37,10 +87,12 @@ char **av; if (isdigit(av[0][0])) Max_per_uid = atoi(av[0]); else { - setuid(getuid()); - setgid(getgid()); + if (setuid(getuid()) < 0) + /*ignore*/; + if (setgid(getgid()) < 0) + /*ignore*/; Scorefile = av[0]; -# ifdef FANCY +#ifdef FANCY sp = rindex(Scorefile, '/'); if (sp == NULL) sp = Scorefile; @@ -50,7 +102,7 @@ char **av; Stand_still = TRUE; if (Pattern_roll || Stand_still) Teleport = TRUE; -# endif +#endif } else for (sp = &av[0][1]; *sp; sp++) @@ -116,52 +168,6 @@ char **av; refresh(); score(); } while (another()); - quit(); -} - -/* - * quit: - * Leave the program elegantly. - */ -quit() -{ - extern int _putchar(); - - mvcur(0, COLS - 1, LINES - 1, 0); - if (CE) { - tputs(CE, 1, _putchar); - endwin(); - } - else { - endwin(); - putchar('\n'); - } - exit(0); - /* NOTREACHED */ -} - -/* - * another: - * See if another game is desired - */ -another() -{ - register int y; - -#ifdef FANCY - if ((Stand_still || Pattern_roll) && !Newscore) - return TRUE; -#endif - - if (query("Another game?")) { - if (Full_clear) { - for (y = 1; y <= Num_scores; y++) { - move(y, 1); - clrtoeol(); - } - refresh(); - } - return TRUE; - } - return FALSE; + quit(0); + return 0; } diff --git a/src/games/robots/make_level.c b/src/games/robots/make_level.c index 56204b4..0f5b9cd 100644 --- a/src/games/robots/make_level.c +++ b/src/games/robots/make_level.c @@ -3,23 +3,19 @@ * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. */ - -#ifndef lint -static char sccsid[] = "@(#)make_level.c 5.1 (Berkeley) 5/30/85"; -#endif not lint - -# include "robots.h" +#include "robots.h" +#include /* * make_level: * Make the current level */ +void make_level() { register int i; register COORD *cp; - register WINDOW *wp; - register int x, *endp; + register int x; reset_count(); for (i = 1; i < Y_FIELDSIZE; i++) diff --git a/src/games/robots/move.c b/src/games/robots/move.c index 80b6230..1ad7dd7 100644 --- a/src/games/robots/move.c +++ b/src/games/robots/move.c @@ -3,25 +3,138 @@ * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. */ +#include "robots.h" +#include -#ifndef lint -static char sccsid[] = "@(#)move.c 5.1 (Berkeley) 5/30/85"; -#endif not lint +#define ESC '\033' -# include "robots.h" -# include +/* + * eaten: + * Player would get eaten at this place + */ +int +eaten(pos) +register COORD *pos; +{ + register int x, y; -# define ESC '\033' + for (y = pos->y - 1; y <= pos->y + 1; y++) { + if (y <= 0 || y >= Y_FIELDSIZE) + continue; + for (x = pos->x - 1; x <= pos->x + 1; x++) { + if (x <= 0 || x >= X_FIELDSIZE) + continue; + if (Field[y][x] == 1) + return TRUE; + } + } + return FALSE; +} + +/* + * must_telep: + * Must I teleport; i.e., is there anywhere I can move without + * being eaten? + */ +int +must_telep() +{ + register int x, y; + static COORD newpos; + +#ifdef FANCY + if (Stand_still && Num_robots > 1 && eaten(&My_pos)) + return TRUE; +#endif + + for (y = -1; y <= 1; y++) { + newpos.y = My_pos.y + y; + if (newpos.y <= 0 || newpos.y >= Y_FIELDSIZE) + continue; + for (x = -1; x <= 1; x++) { + newpos.x = My_pos.x + x; + if (newpos.x <= 0 || newpos.x >= X_FIELDSIZE) + continue; + if (Field[newpos.y][newpos.x] > 0) + continue; + if (!eaten(&newpos)) + return FALSE; + } + } + return TRUE; +} + +/* + * do_move: + * Execute a move + */ +int +do_move(dy, dx) +int dy, dx; +{ + static COORD newpos; + + newpos.y = My_pos.y + dy; + newpos.x = My_pos.x + dx; + if (newpos.y <= 0 || newpos.y >= Y_FIELDSIZE || + newpos.x <= 0 || newpos.x >= X_FIELDSIZE || + Field[newpos.y][newpos.x] > 0 || eaten(&newpos)) { + if (Running) { + Running = FALSE; + leaveok(stdscr, FALSE); + move(My_pos.y, My_pos.x); + refresh(); + } + else { + putchar(CTRL('G')); + reset_count(); + } + return FALSE; + } + else if (dy == 0 && dx == 0) + return TRUE; + mvaddch(My_pos.y, My_pos.x, ' '); + My_pos = newpos; + mvaddch(My_pos.y, My_pos.x, PLAYER); + if (!jumping()) + refresh(); + return TRUE; +} + +/* + * reset_count: + * Reset the count variables + */ +void +reset_count() +{ + Count = 0; + Running = FALSE; + leaveok(stdscr, FALSE); + refresh(); +} + +/* + * jumping: + * See if we are jumping, i.e., we should not refresh. + */ +int +jumping() +{ + return (Jump && (Count || Running || Waiting)); +} /* * get_move: * Get and execute a move from the player */ +void get_move() { register int c; - register int y, x, lastmove; - static COORD newpos; +#ifdef FANCY + register int lastmove = 0; +#endif if (Waiting) return; @@ -122,7 +235,7 @@ over: case 'q': case 'Q': if (query("Really quit?")) - quit(); + quit(0); refresh(); break; case 'w': @@ -142,13 +255,13 @@ teleport: refresh(); flush_in(); goto ret; - case CTRL(L): + case CTRL('L'): wrefresh(curscr); break; case EOF: break; default: - putchar(CTRL(G)); + putchar(CTRL('G')); reset_count(); fflush(stdout); break; @@ -159,114 +272,3 @@ ret: if (--Count == 0) leaveok(stdscr, FALSE); } - -/* - * must_telep: - * Must I teleport; i.e., is there anywhere I can move without - * being eaten? - */ -must_telep() -{ - register int x, y; - static COORD newpos; - -#ifdef FANCY - if (Stand_still && Num_robots > 1 && eaten(&My_pos)) - return TRUE; -#endif - - for (y = -1; y <= 1; y++) { - newpos.y = My_pos.y + y; - if (newpos.y <= 0 || newpos.y >= Y_FIELDSIZE) - continue; - for (x = -1; x <= 1; x++) { - newpos.x = My_pos.x + x; - if (newpos.x <= 0 || newpos.x >= X_FIELDSIZE) - continue; - if (Field[newpos.y][newpos.x] > 0) - continue; - if (!eaten(&newpos)) - return FALSE; - } - } - return TRUE; -} - -/* - * do_move: - * Execute a move - */ -do_move(dy, dx) -int dy, dx; -{ - static COORD newpos; - - newpos.y = My_pos.y + dy; - newpos.x = My_pos.x + dx; - if (newpos.y <= 0 || newpos.y >= Y_FIELDSIZE || - newpos.x <= 0 || newpos.x >= X_FIELDSIZE || - Field[newpos.y][newpos.x] > 0 || eaten(&newpos)) { - if (Running) { - Running = FALSE; - leaveok(stdscr, FALSE); - move(My_pos.y, My_pos.x); - refresh(); - } - else { - putchar(CTRL(G)); - reset_count(); - } - return FALSE; - } - else if (dy == 0 && dx == 0) - return TRUE; - mvaddch(My_pos.y, My_pos.x, ' '); - My_pos = newpos; - mvaddch(My_pos.y, My_pos.x, PLAYER); - if (!jumping()) - refresh(); - return TRUE; -} - -/* - * eaten: - * Player would get eaten at this place - */ -eaten(pos) -register COORD *pos; -{ - register int x, y; - - for (y = pos->y - 1; y <= pos->y + 1; y++) { - if (y <= 0 || y >= Y_FIELDSIZE) - continue; - for (x = pos->x - 1; x <= pos->x + 1; x++) { - if (x <= 0 || x >= X_FIELDSIZE) - continue; - if (Field[y][x] == 1) - return TRUE; - } - } - return FALSE; -} - -/* - * reset_count: - * Reset the count variables - */ -reset_count() -{ - Count = 0; - Running = FALSE; - leaveok(stdscr, FALSE); - refresh(); -} - -/* - * jumping: - * See if we are jumping, i.e., we should not refresh. - */ -jumping() -{ - return (Jump && (Count || Running || Waiting)); -} diff --git a/src/games/robots/move_robs.c b/src/games/robots/move_robs.c index 3fd782c..2c7a4f1 100644 --- a/src/games/robots/move_robs.c +++ b/src/games/robots/move_robs.c @@ -3,34 +3,45 @@ * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. */ +#include "robots.h" +#include +#include +#include -#ifndef lint -static char sccsid[] = "@(#)move_robs.c 5.1 (Berkeley) 5/30/85"; -#endif not lint - -# include "robots.h" -# include +/* + * sign: + * Return the sign of the number + */ +static int +sign(n) +int n; +{ + if (n < 0) + return -1; + else if (n > 0) + return 1; + else + return 0; +} /* * move_robots: * Move the robots around */ +void move_robots(was_sig) -bool was_sig; +int was_sig; { register COORD *rp; - register int y, x; - register int mindist, d; - static COORD newpos; if (Real_time) signal(SIGALRM, move_robots); -# ifdef DEBUG +#ifdef DEBUG move(Min.y, Min.x); addch(inch()); move(Max.y, Max.x); addch(inch()); -# endif DEBUG +#endif for (rp = Robots; rp < &Robots[MAXROBOTS]; rp++) { if (rp->y < 0) continue; @@ -81,17 +92,17 @@ bool was_sig; if (was_sig) { refresh(); if (Dead || Num_robots <= 0) - longjmp(End_move); + longjmp(End_move, 1); } -# ifdef DEBUG +#ifdef DEBUG standout(); move(Min.y, Min.x); addch(inch()); move(Max.y, Max.x); addch(inch()); standend(); -# endif DEBUG +#endif if (Real_time) alarm(3); } @@ -100,6 +111,7 @@ bool was_sig; * add_score: * Add a score to the overall point total */ +void add_score(add) int add; { @@ -107,18 +119,3 @@ int add; move(Y_SCORE, X_SCORE); printw("%d", Score); } - -/* - * sign: - * Return the sign of the number - */ -sign(n) -int n; -{ - if (n < 0) - return -1; - else if (n > 0) - return 1; - else - return 0; -} diff --git a/src/games/robots/play_level.c b/src/games/robots/play_level.c index 32be7c1..f016c4d 100644 --- a/src/games/robots/play_level.c +++ b/src/games/robots/play_level.c @@ -3,21 +3,17 @@ * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. */ - -#ifndef lint -static char sccsid[] = "@(#)play_level.c 5.2 (Berkeley) 9/23/85"; -#endif not lint - -# include "robots.h" +#include "robots.h" +#include /* * play_level: * Let the player play the current level */ +void play_level() { register COORD *cp; - register int y, x, bonus; move(My_pos.y, My_pos.x); addch(PLAYER); @@ -29,14 +25,14 @@ play_level() addch(ROBOT); } refresh(); -# ifdef DEBUG +#ifdef DEBUG standout(); move(Min.y, Min.x); addch(inch()); move(Max.y, Max.x); addch(inch()); standend(); -# endif DEBUG +#endif setjmp(End_move); flush_in(); while (!Dead && Num_robots > 0) { diff --git a/src/games/robots/query.c b/src/games/robots/query.c index 2624829..973a247 100644 --- a/src/games/robots/query.c +++ b/src/games/robots/query.c @@ -3,17 +3,13 @@ * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. */ - -#ifndef lint -static char sccsid[] = "@(#)query.c 5.1 (Berkeley) 5/30/85"; -#endif not lint - -# include "robots.h" +#include "robots.h" /* * query: * Ask a question and get a yes or no answer. Default is "no". */ +int query(prompt) char *prompt; { diff --git a/src/games/robots/rnd_pos.c b/src/games/robots/rnd_pos.c index 9706e0d..0c13e59 100644 --- a/src/games/robots/rnd_pos.c +++ b/src/games/robots/rnd_pos.c @@ -3,14 +3,17 @@ * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. */ +#include "robots.h" +#include -#ifndef lint -static char sccsid[] = "@(#)rnd_pos.c 5.1 (Berkeley) 5/30/85"; -#endif not lint +#define IS_SAME(p,y,x) ((p).y != -1 && (p).y == y && (p).x == x) -# include "robots.h" - -# define IS_SAME(p,y,x) ((p).y != -1 && (p).y == y && (p).x == x) +static int +rnd(range) +int range; +{ + return random() % range; +} /* * rnd_pos: @@ -21,7 +24,6 @@ rnd_pos() { static COORD pos; static int call = 0; - register int i = 0; do { pos.y = rnd(Y_FIELDSIZE - 1) + 1; @@ -31,11 +33,3 @@ rnd_pos() call++; return &pos; } - -rnd(range) -int range; -{ - unsigned int rand(); - - return rand() % range; -} diff --git a/src/games/robots/robots.h b/src/games/robots/robots.h index de93fd4..94bab24 100644 --- a/src/games/robots/robots.h +++ b/src/games/robots/robots.h @@ -6,44 +6,53 @@ * @(#)robots.h 5.1 (Berkeley) 5/30/85 */ -# include -# include +#include +#include + +#ifndef flushok +# define flushok(win, ok) /* empty */ +#endif /* * miscellaneous constants */ -# define Y_FIELDSIZE 23 -# define X_FIELDSIZE 60 -# define Y_SIZE 24 -# define X_SIZE 80 -# define MAXLEVELS 4 -# define MAXROBOTS (MAXLEVELS * 10) -# define ROB_SCORE 10 -# define S_BONUS (60 * ROB_SCORE) -# define Y_SCORE 21 -# define X_SCORE (X_FIELDSIZE + 9) -# define Y_PROMPT (Y_FIELDSIZE - 1) -# define X_PROMPT (X_FIELDSIZE + 2) -# define MAXSCORES (Y_SIZE - 2) -# define MAXNAME 16 -# define MS_NAME "Ten" -# define SCOREFILE "/usr/games/lib/robots_roll" +#define Y_FIELDSIZE 23 +#define X_FIELDSIZE 60 +#define Y_SIZE 24 +#define X_SIZE 80 +#define MAXLEVELS 4 +#define MAXROBOTS (MAXLEVELS * 10) +#define ROB_SCORE 10 +#define S_BONUS (60 * ROB_SCORE) +#define Y_SCORE 21 +#define X_SCORE (X_FIELDSIZE + 9) +#define Y_PROMPT (Y_FIELDSIZE - 1) +#define X_PROMPT (X_FIELDSIZE + 2) +#define MAXSCORES (Y_SIZE - 2) +#define MAXNAME 16 +#define MS_NAME "Ten" + +#ifdef CROSS +# define SCOREFILE "/usr/local/games/robots_roll" +#else +# define SCOREFILE "/games/lib/robots_roll" +#endif /* * characters on screen */ -# define ROBOT '+' -# define HEAP '*' -# define PLAYER '@' +#define ROBOT '+' +#define HEAP '*' +#define PLAYER '@' /* * pseudo functions */ -# undef CTRL -# define CTRL(X) ('X' - 'A' + 1) +#undef CTRL +#define CTRL(x) (x - 'A' + 1) /* * type definitions @@ -77,7 +86,19 @@ extern jmp_buf End_move; /* * functions types */ +COORD *rnd_pos(void); -int quit(), cmp_sc(), move_robots(); +void quit(int sig); +void move_robots(int was_sig); +void show_score(void); +void init_field(void); +void make_level(void); +void play_level(void); +void score(void); +void reset_count(void); +void flush_in(void); +void add_score(int add); +void get_move(void); -COORD *rnd_pos(); +int query(char *prompt); +int jumping(void); diff --git a/src/games/robots/score.c b/src/games/robots/score.c index 31e0ed7..172a3ec 100644 --- a/src/games/robots/score.c +++ b/src/games/robots/score.c @@ -3,13 +3,12 @@ * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. */ - -#ifndef lint -static char sccsid[] = "@(#)score.c 5.1 (Berkeley) 5/30/85"; -#endif not lint - -# include "robots.h" -# include +#include "robots.h" +#include +#include +#include +#include +#include typedef struct { int s_uid; @@ -25,11 +24,37 @@ int Max_per_uid = MAX_PER_UID; static SCORE Top[MAXSCORES]; +/* + * cmp_sc: + * Compare two scores. + */ +static int +cmp_sc(a1, a2) +const void *a1, *a2; +{ + const SCORE *s1 = a1; + const SCORE *s2 = a2; + + return s2->s_score - s1->s_score; +} + +static void +set_name(scp) +register SCORE *scp; +{ + register PASSWD *pp; + + if ((pp = getpwuid(scp->s_uid)) == NULL) + pp->pw_name = "???"; + strncpy(scp->s_name, pp->pw_name, MAXNAME); +} + /* * score: * Post the player's score, if reasonable, and then print out the * top list. */ +void score() { register int inf; @@ -44,9 +69,12 @@ score() return; } - if (read(inf, &max_uid, sizeof max_uid) == sizeof max_uid) - read(inf, Top, sizeof Top); - else { + if (read(inf, &max_uid, sizeof max_uid) == sizeof max_uid) { + if (read(inf, Top, sizeof Top) != sizeof Top) { + perror("Error reading top scores"); + exit(-1); + } + } else { for (scp = Top; scp < &Top[MAXSCORES]; scp++) scp->s_score = -1; max_uid = Max_per_uid; @@ -101,36 +129,23 @@ score() if (Newscore) { lseek(inf, 0L, 0); - write(inf, &max_uid, sizeof max_uid); - write(inf, Top, sizeof Top); + if (write(inf, &max_uid, sizeof max_uid) != sizeof max_uid) { + perror("Error writing max uid"); + exit(-1); + } + if (write(inf, Top, sizeof Top) != sizeof Top) { + perror("Error writing top scores"); + exit(-1); + } } close(inf); } -set_name(scp) -register SCORE *scp; -{ - register PASSWD *pp; - - if ((pp = getpwuid(scp->s_uid)) == NULL) - pp->pw_name = "???"; - strncpy(scp->s_name, pp->pw_name, MAXNAME); -} - -/* - * cmp_sc: - * Compare two scores. - */ -cmp_sc(s1, s2) -register SCORE *s1, *s2; -{ - return s2->s_score - s1->s_score; -} - /* * show_score: * Show the score list for the '-s' option. */ +void show_score() { register SCORE *scp; @@ -145,11 +160,18 @@ show_score() for (scp = Top; scp < &Top[MAXSCORES]; scp++) scp->s_score = -1; - read(inf, &max_score, sizeof max_score); - read(inf, Top, sizeof Top); + if (read(inf, &max_score, sizeof max_score) != sizeof max_score) { + perror("Error reading max scores"); + exit(-1); + } + if (read(inf, Top, sizeof Top) != sizeof Top) { + perror("Error reading top scores"); + exit(-1); + } close(inf); inf = 1; for (scp = Top; scp < &Top[MAXSCORES]; scp++) if (scp->s_score >= 0) - printf("%d\t%d\t%.*s\n", inf++, scp->s_score, sizeof scp->s_name, scp->s_name); + printf("%d\t%d\t%.*s\n", inf++, scp->s_score, + (int)sizeof scp->s_name, scp->s_name); } diff --git a/src/games/snake/.gitignore b/src/games/snake/.gitignore new file mode 100644 index 0000000..1ebd43a --- /dev/null +++ b/src/games/snake/.gitignore @@ -0,0 +1,2 @@ +snake +snscore diff --git a/src/games/snake/Makefile b/src/games/snake/Makefile index 18588cf..7b06988 100644 --- a/src/games/snake/Makefile +++ b/src/games/snake/Makefile @@ -5,37 +5,39 @@ # # @(#)Makefile 5.1.1 (2.11BSD GTE) 1/16/95 # -DESTDIR= -CFLAGS= -O -DCHECKBUSY -LIBS= -lm -ltermcap -BIN= $(DESTDIR)/usr/games -LIB= $(DESTDIR)/usr/games/lib -USER= daemon -UTILS= snscore busy -OBJS= snake.o move.o -ALL= snake ${UTILS} -SEPFLAG= -i +TOPSRC = $(shell cd ../../..; pwd) +include $(TOPSRC)/target.mk +#include $(TOPSRC)/cross.mk +#CFLAGS = -O -g -DCROSS -all: ${ALL} +CFLAGS += -Werror -Wall -snake: $(OBJS) - cc ${SEPFLAG} $(OBJS) -o snake $(LIBS) +OBJS = snake.o move.o +MAN = snake.0 +LIBS = -lm -ltermcap -lc -snake.o move.o:snake.h +all: snake snscore $(MAN) -snscore: snscore.c - cc ${SEPFLAG} $(CFLAGS) snscore.c -o snscore +snake: $(OBJS) + $(CC) $(LDFLAGS) -o $@.elf $(OBJS) $(LIBS) + $(OBJDUMP) -S $@.elf > $@.dis + $(SIZE) $@.elf + $(ELF2AOUT) $@.elf $@ && rm $@.elf -busy: busy.c - cc ${SEPFLAG} $(CFLAGS) busy.c -o busy +snscore: snscore.o + $(CC) $(LDFLAGS) -o $@.elf snscore.o $(LIBS) + $(OBJDUMP) -S $@.elf > $@.dis + $(SIZE) $@.elf + $(ELF2AOUT) $@.elf $@ && rm $@.elf -install: all - install -s -m 4755 -o ${USER} snake ${BIN}/snake - install -s -m 755 -o ${USER} snscore ${BIN}/snscore - install -s -m 755 -o ${USER} busy ${LIB}/busy - cat /dev/null >> $(LIB)/snakerawscores - chmod 644 $(LIB)/snakerawscores - chown $(USER) $(LIB)/snakerawscores +$(MAN): snake.6 + nroff -man $< > $@ clean: - rm -f *.o ${ALL} + rm -f *.o core snake snscore *.0 *.dis + +install: all + install snake $(DESTDIR)/games/ + install snscore $(DESTDIR)/games/ + install -m 644 $(MAN) $(DESTDIR)/share/man/cat6/ + install -c -m 644 /dev/null ${DESTDIR}/games/lib/snakerawscores diff --git a/src/games/snake/busy.c b/src/games/snake/busy.c deleted file mode 100644 index 4467ea9..0000000 --- a/src/games/snake/busy.c +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 1980 Regents of the University of California. - * All rights reserved. The Berkeley software License Agreement - * specifies the terms and conditions for redistribution. - */ - -#if defined(DOSCCS) && !defined(lint) -static char sccsid[] = "@(#)busy.c 5.1.2 (2.11BSD GTE) 1/16/95"; -#endif - -/* - * busy: print an indication of how busy the system is for games. - */ -#ifndef MAX -# define MAX 30 -#endif - -#include -main(argc, argv) -char **argv; -{ - double la[3]; - double max; - - getloadavg(la, 3); - max = la[0]; - if (la[1] > max) max = la[1]; - if (la[2] > max) max = la[2]; - if (argc > 1) - printf("1=%g, 5=%g, 15=%g, max=%g\n", la[0], la[1], la[2], max); - if (max > MAX) - printf("100\n"); /* incredibly high, no games allowed */ - else - printf("0\n"); - exit(0); -} diff --git a/src/games/snake/move.c b/src/games/snake/move.c index c0138c1..56f6848 100644 --- a/src/games/snake/move.c +++ b/src/games/snake/move.c @@ -4,10 +4,6 @@ * specifies the terms and conditions for redistribution. */ -#if !defined(lint) && defined(DOSCCS) -static char sccsid[] = "@(#)move.c 5.1.1 (2.11BSD) 1997/3/28"; -#endif - /************************************************************************* * * MOVE LIBRARY @@ -31,9 +27,9 @@ static char sccsid[] = "@(#)move.c 5.1.1 (2.11BSD) 1997/3/28"; * home() home. * ll() move to lower left corner of screen. * cr() carriage return (no line feed). - * printf() just like standard printf, but keeps track + * print() just like standard printf, but keeps track * of cursor position. (Uses pstring). - * aprintf() same as printf, but first argument is &point. + * aprint() same as print, but first argument is &point. * (Uses pstring). * pstring(s) output the string of printing characters. * However, '\r' is interpreted to mean return @@ -59,137 +55,146 @@ static char sccsid[] = "@(#)move.c 5.1.1 (2.11BSD) 1997/3/28"; * same(&p1,&p2) returns 1 if p1 and p2 are the same point. * point(&p,x,y) return point set to x,y. * - * baudrate(x) returns the baudrate of the terminal. * delay(t) causes an approximately constant delay * independent of baudrate. * Duration is ~ t/20 seconds. * ******************************************************************************/ - #include "snake.h" +#include +#include +#include +#include +#include int CMlength; int NDlength; int BSlength; int delaystr[10]; -short ospeed; static char str[80]; -move(sp) +int +outch(c) +{ + return putchar(c); +} + +void +putpad(str) +char *str; +{ + if (str) + tputs(str, 1, outch); +} + +void +bs() +{ + if (cursor.col > 0) { + putpad(BS); + cursor.col--; + } +} + +void +nd() +{ + putpad(ND); + cursor.col++; + if (cursor.col == COLUMNS+1) { + cursor.line++; + cursor.col = 0; + if (cursor.line >= LINES)cursor.line=LINES-1; + } +} + +void +right(sp) struct point *sp; { - int distance; - int tabcol,ct; + if (sp->col < cursor.col) + print("ERROR:right() can't move left\n"); + while (sp->col > cursor.col) { + nd(); + } +} + +void +cr() +{ + outch('\r'); + cursor.col = 0; +} + +void +ll() +{ + int l; struct point z; - if (sp->line <0 || sp->col <0 || sp->col > COLUMNS){ - printf("move to [%d,%d]?",sp->line,sp->col); + l = lcnt + 2; + if (LL != NULL && LINES==l) { + putpad(LL); + cursor.line = LINES-1; + cursor.col = 0; return; } - if (sp->line >= LINES){ - move(point(&z,sp->col,LINES-1)); - while(sp->line-- >= LINES)putchar('\n'); - return; - } - - if (CM != 0) { - char *cmstr = tgoto(CM, sp->col, sp->line); - - CMlength = strlen(cmstr); - if(cursor.line == sp->line){ - distance = sp->col - cursor.col; - if(distance == 0)return; /* Already there! */ - if(distance > 0){ /* Moving to the right */ - if(distance*NDlength < CMlength){ - right(sp); - return; - } - if(TA){ - ct=sp->col&7; - tabcol=(cursor.col|7)+1; - do{ - ct++; - tabcol=(tabcol|7)+1; - } - while(tabcolcol); - if(ctcol < CMlength){ - cr(); - right(sp); - return; - } - /* No more optimizations on same row. */ - } - distance = sp->col - cursor.col; - distance = distance > 0 ? - distance*NDlength : -distance * BSlength; -if(distance < 0)printf("ERROR: distance is negative: %d",distance); - distance += abs(sp->line - cursor.line); - if(distance >= CMlength){ - putpad(cmstr); - cursor.line = sp->line; - cursor.col = sp->col; - return; - } - } - - /* - * If we get here we have a terminal that can't cursor - * address but has local motions or one which can cursor - * address but can get there quicker with local motions. - */ - gto(sp); + z.col = 0; + z.line = l-1; + move(&z); } + +void +up() +{ + putpad(UP); + cursor.line--; +} + +void +down() +{ + putpad(DO); + cursor.line++; + if (cursor.line >= LINES)cursor.line=LINES-1; +} + +void gto(sp) struct point *sp; { - - int distance,f,tfield,j; + int distance, f; if (cursor.line > LINES || cursor.line <0 || cursor.col <0 || cursor.col > COLUMNS) - printf("ERROR: cursor is at %d,%d\n", + print("ERROR: cursor is at %d,%d\n", cursor.line,cursor.col); if (sp->line > LINES || sp->line <0 || sp->col <0 || sp->col > COLUMNS) - printf("ERROR: target is %d,%d\n",sp->line,sp->col); - tfield = (sp->col) >> 3; - if (sp->line == cursor.line){ - if (sp->col > cursor.col)right(sp); + print("ERROR: target is %d,%d\n",sp->line,sp->col); + if (sp->line == cursor.line) { + if (sp->col > cursor.col) + right(sp); else{ distance = (cursor.col -sp->col)*BSlength; - if (((TA) && - (distance > tfield+((sp->col)&7)*NDlength) - ) || - (((cursor.col)*NDlength) < distance) - ){ + if (cursor.col*NDlength < distance) { cr(); right(sp); - } - else{ - while(cursor.col > sp->col) bs(); + } else { + while(cursor.col > sp->col) + bs(); } } return; } /*must change row */ - if (cursor.col - sp->col > (cursor.col >> 3)){ + if (cursor.col - sp->col > (cursor.col >> 3)) { if (cursor.col == 0)f = 0; else f = -1; } else f = cursor.col >> 3; - if (((sp->line << 1) + 1 < cursor.line - f) && (HO != 0)){ + if (((sp->line << 1) + 1 < cursor.line - f) && (HO != 0)) { /* * home quicker than rlf: * (sp->line + f > cursor.line - sp->line) @@ -199,11 +204,11 @@ struct point *sp; gto(sp); return; } - if (((sp->line << 1) > cursor.line + LINES+1 + f) && (LL != 0)){ + if (((sp->line << 1) > cursor.line + LINES+1 + f) && (LL != 0)) { /* home,rlf quicker than lf - * (LINES+1 - sp->line + f < sp->line - cursor.line) + * (LINES+1 - sp->line + f < sp->line - cursor.line) */ - if (cursor.line > f + 1){ + if (cursor.line > f + 1) { /* is home faster than wraparound lf? * (cursor.line + 20 - sp->line > 21 - sp->line + f) */ @@ -219,71 +224,26 @@ struct point *sp; gto(sp); /*can recurse since cursor.line = sp->line */ } -right(sp) -struct point *sp; +void +home() { - int field,tfield; - int tabcol,strlength; + struct point z; - if (sp->col < cursor.col) - printf("ERROR:right() can't move left\n"); - if(TA){ /* If No Tabs: can't send tabs because ttydrive - * loses count with control characters. - */ - field = cursor.col >> 3; -/* - * This code is useful for a terminal which wraps around on backspaces. - * (Mine does.) Unfortunately, this is not specified in termcap, and - * most terminals don't work that way. (Of course, most terminals - * have addressible cursors, too). - */ - if (BW && (CM == 0) && - ((sp->col << 1) - field > (COLUMNS - 8) << 1 ) - ){ - if (cursor.line == 0){ - outch('\n'); - } - outch('\r'); - cursor.col = COLUMNS + 1; - while(cursor.col > sp->col)bs(); - if (cursor.line != 0) outch('\n'); - return; - } - - tfield = sp->col >> 3; - - while (field < tfield){ - putpad(TA); - cursor.col = ++field << 3; - } - tabcol = (cursor.col|7) + 1; - strlength = (tabcol - sp->col)*BSlength + 1; - /* length of sequence to overshoot */ - if (((sp->col - cursor.col)*NDlength > strlength) && - (tabcol < COLUMNS) - ){ - /* - * Tab past and backup - */ - putpad(TA); - cursor.col = (cursor.col | 7) + 1; - while(cursor.col > sp->col)bs(); - } - } - while (sp->col > cursor.col){ - nd(); + if (HO != 0) { + putpad(HO); + cursor.col = cursor.line = 0; + return; } + z.col = z.line = 0; + move(&z); } -cr(){ - outch('\r'); - cursor.col = 0; -} - -clear(){ +void +clear() +{ int i; - if (CL){ + if (CL) { putpad(CL); cursor.col=cursor.line=0; } else { @@ -295,100 +255,66 @@ clear(){ } } -home(){ +void +move(sp) +struct point *sp; +{ struct point z; - if(HO != 0){ - putpad(HO); - cursor.col = cursor.line = 0; + if (sp->line <0 || sp->col <0 || sp->col > COLUMNS) { + print("move to [%d,%d]?",sp->line,sp->col); return; } - z.col = z.line = 0; - move(&z); -} - -ll(){ - int j,l; - struct point z; - - l = lcnt + 2; - if(LL != NULL && LINES==l){ - putpad(LL); - cursor.line = LINES-1; - cursor.col = 0; + if (sp->line >= LINES) { + move(point(&z,sp->col,LINES-1)); + while(sp->line-- >= LINES)putchar('\n'); return; } - z.col = 0; - z.line = l-1; - move(&z); -} - -up(){ - putpad(UP); - cursor.line--; -} - -down(){ - putpad(DO); - cursor.line++; - if (cursor.line >= LINES)cursor.line=LINES-1; -} -bs(){ - if (cursor.col > 0){ - putpad(BS); - cursor.col--; - } -} - -nd(){ - putpad(ND); - cursor.col++; - if (cursor.col == COLUMNS+1){ - cursor.line++; - cursor.col = 0; - if (cursor.line >= LINES)cursor.line=LINES-1; - } + if (sp->line == cursor.line) { + if (sp->col == cursor.col) + return; + if (sp->col == cursor.col-1) { + bs(); + return; + } + } + if (sp->line == cursor.line+1) { + if (sp->col == cursor.col) { + down(); + return; + } + if (sp->col == cursor.col-1) { + down(); + bs(); + return; + } + } + char *cmstr = tgoto(CM, sp->col, sp->line); + putpad(cmstr); + cursor.line = sp->line; + cursor.col = sp->col; } +void pch(c) { outch(c); - if(++cursor.col >= COLUMNS && AM) { - cursor.col = 0; - ++cursor.line; + if (++cursor.col >= COLUMNS) { + cursor.col = -1; + cursor.line = -1; } } -aprintf(ps,st,v0,v1,v2,v3,v4,v5,v6,v7,v8,v9) -struct point *ps; -char *st; -int v0,v1,v2,v3,v4,v5,v6,v7,v8,v9; - -{ - struct point p; - - p.line = ps->line+1; p.col = ps->col+1; - move(&p); - sprintf(str,st,v0,v1,v2,v3,v4,v5,v6,v7,v8,v9); - pstring(str); -} - -printf(st,v0,v1,v2,v3,v4,v5,v6,v7,v8,v9) -char *st; -int v0,v1,v2,v3,v4,v5,v6,v7,v8,v9; -{ - sprintf(str,st,v0,v1,v2,v3,v4,v5,v6,v7,v8,v9); - pstring(str); -} - +void pstring(s) -char *s;{ +char *s; +{ struct point z; int stcol; stcol = cursor.col; - while (s[0] != '\0'){ - switch (s[0]){ + while (s[0] != '\0') { + switch (s[0]) { case '\n': move(point(&z,0,cursor.line+1)); break; @@ -403,106 +329,107 @@ char *s;{ case '\b': bs(); break; - case CTRL(g): - outch(CTRL(g)); + case CTRL('g'): + outch(CTRL('g')); break; default: - if (s[0] < ' ')break; + if (s[0] < ' ') + break; pch(s[0]); } s++; } } +void +aprint(struct point *ps, char *fmt, ...) +{ + va_list ap; + struct point p; + + p.line = ps->line+1; + p.col = ps->col+1; + move(&p); + va_start(ap, fmt); + vsprintf(str, fmt, ap); + va_end(ap); + pstring(str); +} + +void +print(char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + vsprintf(str, fmt, ap); + va_end(ap); + pstring(str); +} + +void pchar(ps,ch) struct point *ps; -char ch;{ +char ch; +{ struct point p; - p.col = ps->col + 1; p.line = ps->line + 1; - if ( - (p.col >= 0) && - (p.line >= 0) && - ( - ( - (p.line < LINES) && - (p.col < COLUMNS) - ) || - ( - (p.col == COLUMNS) && - (p.line < LINES-1) - ) - ) - ){ + + p.col = ps->col + 1; + p.line = ps->line + 1; + if (p.col < 0 || p.line < 0) + return; + if ((p.line < LINES && p.col < COLUMNS) || + (p.col == COLUMNS && p.line < LINES-1)) { move(&p); pch(ch); } } - -outch(c) -{ - putchar(c); -} - -putpad(str) -char *str; -{ - if (str) - tputs(str, 1, outch); -} -baudrate() -{ - - switch (orig.sg_ospeed){ - case B300: - return(300); - case B1200: - return(1200); - case B4800: - return(4800); - case B9600: - return(9600); - default: - return(0); - } -} +void delay(t) int t; { - int k,j; - - k = baudrate() * t / 300; - for(j=0;j +#include +#include +#include +#include +#include +#include /* * If CHECKBUSY is defined, the file BUSY must be executable @@ -33,21 +31,33 @@ static char sccsid[] = "@(#)snake.c 5.1.1 (2.11BSD) 1997/7/29"; * If BUSY does not exist, snake won't play. */ #ifndef BUSY -#define BUSY "/usr/games/lib/busy" +#ifdef CROSS +#define BUSY "/usr/local/games/busy" +#else +#define BUSY "/games/lib/busy" +#endif #endif /* * This is the data file for scorekeeping. */ #ifndef SNAKERAWSCORES -#define SNAKERAWSCORES "/usr/games/lib/snakerawscores" +#ifdef CROSS +#define SNAKERAWSCORES "/usr/local/games/snakerawscores" +#else +#define SNAKERAWSCORES "/games/lib/snakerawscores" +#endif #endif /* * If it exists, a log is kept here. Otherwise it isn't. */ #ifndef LOGFILE -#define LOGFILE "/usr/games/lib/snake.log" +#ifdef CROSS +#define LOGFILE "/usr/local/games/snake.log" +#else +#define LOGFILE "/games/lib/snake.log" +#endif #endif #define PENALTY 10 /* % penalty for invoking spacewarp */ @@ -79,104 +89,552 @@ char stri[BSIZE]; char *p; char ch, savec; char *kl, *kr, *ku, *kd; -int fast=1; int repeat=1; long tv; char *tn; -main(argc,argv) -int argc; -char **argv; +int mx [8] = { + 0, 1, 1, 1, 0,-1,-1,-1 +}; + +int my [8] = { + -1,-1, 0, 1, 1, 1, 0,-1 +}; + +float absv[8]= { + 1, 1.4, 1, 1.4, 1, 1.4, 1, 1.4 +}; + +int oldw = 0; + +void +drawbox() { - int i,k; + register int i; + struct point p; + + p.line = -1; + for (i= 0; icol = sp->line = -1; /* impossible */ + do { + issame = 0; + p.col = random() % ccnt; + p.line = random() % lcnt; + + /* make sure it's not on top of something else */ + if (p.line == 0 && p.col <5) issame++; + if(same(&p, &you)) issame++; + if(same(&p, &money)) issame++; + if(same(&p, &finish)) issame++; + for (i=0; i<5; i++) + if(same(&p, &snake[i])) issame++; + + } while (issame); + *sp = p; +} + +/* + * Flush typeahead to keep from buffering a bunch of chars and then + * overshooting. This loses horribly at 9600 baud, but works nicely + * if the terminal gets behind. + */ +void +flushi() +{ +#ifdef CROSS + ioctl(0, TCSETAW, &newtty); +#else + ioctl(0, TIOCSETP, &newtty); +#endif +//#ifdef TIOCFLUSH +// ioctl(0, TIOCFLUSH, NULL); +//#endif +} + +void +winnings(won) +int won; +{ + struct point p; + + p.line = p.col = 1; + if(won>0){ + move(&p); + print("$%d",won); + } +} + +void +spacewarp(w) +int w; +{ + struct point p; int j; - long time(); - int stop(); - char stdbuf[BUFSIZ]; - argcount = argc; - argval = argv; - penalty = loot = 0; - getcap(); - ccnt -= 2; lcnt -= 2; /* compensate for border */ - busy(); - time(&tv); + randm(&you); + point(&p,COLUMNS/2 - 8,LINES/2 - 1); + if (p.col < 0) + p.col = 0; + if (p.line < 0) + p.line = 0; + if (w) { + sprintf(str,"BONUS!!!"); + loot = loot - penalty; + penalty = 0; + } else { + sprintf(str,"SPACE WARP!!!"); + penalty += loot/PENALTY; + } + for(j=0;j<3;j++){ + clear(); + delay(5); + aprint(&p,str); + delay(10); + } + setup(); + winnings(cashvalue); +} - for (i=1; icol < 4) && (sp->line == 0)){ + winnings(cashvalue); + if((you.line == 0) && (you.col < 4)) pchar(&you,ME); + return(5); } - /* - * chunk is the amount of money the user gets for each $. - * The formula below tries to be fair for various screen sizes. - * We only pay attention to the smaller of the 2 edges, since - * that seems to be the bottleneck. - * This formula is a hyperbola which includes the following points: - * (24, $25) (original scoring algorithm) - * (12, $40) (experimentally derived by the "feel") - * (48, $15) (a guess) - * This will give a 4x4 screen $99/shot. We don't allow anything - * smaller than 4x4 because there is a 3x3 game where you can win - * an infinite amount of money. - */ - if (i < 12) i = 12; /* otherwise it isn't fair */ - /* - * Compensate for border. This really changes the game since - * the screen is two squares smaller but we want the default - * to be $25, and the high scores on small screens were a bit - * much anyway. - */ - i += 2; - chunk = (675.0 / (i+6)) + 2.5; /* min screen edge */ + if (same(sp,&you)) { + pchar(sp,ME); + return(1); + } + pchar(sp,' '); + return(0); +} - signal (SIGINT, stop); - putpad(TI); /* String to begin programs that use cm */ - putpad(KS); /* Put terminal in keypad transmit mode */ +int +stretch(ps) +struct point *ps; +{ + struct point p; - random(&finish); - random(&you); - random(&money); - random(&snake[0]); + point(&p,you.col,you.line); + if(abs(ps->col-you.col) < 6){ + if(you.line < ps->line){ + for (p.line = you.line+1;p.line <= ps->line;p.line++) + pchar(&p,'v'); + delay(10); + for (;p.line > you.line;p.line--) + removep(&p); + } else { + for (p.line = you.line-1;p.line >= ps->line;p.line--) + pchar(&p,'^'); + delay(10); + for (;p.line < you.line;p.line++) + removep(&p); + } + return(1); + } else if(abs(ps->line-you.line) < 3){ + p.line = you.line; + if(you.col < ps->col){ + for (p.col = you.col+1;p.col <= ps->col;p.col++) + pchar(&p,'>'); + delay(10); + for (;p.col > you.col;p.col--) + removep(&p); + } else { + for (p.col = you.col-1;p.col >= ps->col;p.col--) + pchar(&p,'<'); + delay(10); + for (;p.col < you.col;p.col++) + removep(&p); + } + return(1); + } + return(0); +} - if ((orig.sg_ospeed < B9600) || - ((! CM) && (! TA))) fast=0; - for(i=1;i<6;i++) - chase (&snake[i], &snake[i-1]); +void +snap() +{ + struct point p; + + if(you.line < 3){ + pchar(point(&p,you.col,0),'-'); + } + if(you.line > lcnt-4){ + pchar(point(&p,you.col,lcnt-1),'_'); + } + if(you.col < 10){ + pchar(point(&p,0,you.line),'('); + } + if(you.col > ccnt-10){ + pchar(point(&p,ccnt-1,you.line),')'); + } + if (! stretch(&money)) { + if (! stretch(&finish)) + delay(10); + } + if(you.line < 3){ + point(&p,you.col,0); + removep(&p); + } + if(you.line > lcnt-4){ + point(&p,you.col,lcnt-1); + removep(&p); + } + if(you.col < 10){ + point(&p,0,you.line); + removep(&p); + } + if(you.col > ccnt-10){ + point(&p,ccnt-1,you.line); + removep(&p); + } + fflush(stdout); +} + +void +win(ps) +struct point *ps; +{ + struct point x; + int j,k; + int boxsize; /* actually diameter of box, not radius */ + + boxsize = 10; + point(&x,ps->col,ps->line); + for(j=1;j 1 && (rawscores=open(SNAKERAWSCORES,2))>=0) { + /* Figure out what happened in the past */ + if (read(rawscores, &allbscore, sizeof(short)) < 0 || + read(rawscores, &allbwho, sizeof(short)) < 0 || + lseek(rawscores, ((long)uid)*sizeof(short), 0) < 0 || + read(rawscores, &oldbest, sizeof(short)) < 0) { + print("Error reading scores\n"); + } + if (flag) + return (score > oldbest ? 1 : 0); + + /* Update this jokers best */ + if (score > oldbest) { + if (lseek(rawscores, ((long)uid)*sizeof(short), 0) < 0 || + write(rawscores, &score, sizeof(short)) < 0) { + print("Error writing scores\n"); + } + print("You bettered your previous best of $%d\n", oldbest); + } else + print("Your best to date is $%d\n", oldbest); + + /* See if we have a new champ */ + p = getpwuid(allbwho); + if (p == NULL || score > allbscore) { + if (lseek(rawscores, (long)0, 0) < 0 || + write(rawscores, &score, sizeof(short)) < 0 || + write(rawscores, &uid, sizeof(short)) < 0) { + print("Error writing scores.\n"); + } + if (p != NULL) + print("You beat %s's old record of $%d!\n", p->pw_name, allbscore); + else + print("You set a new record!\n"); + } else + print("The highest is %s with $%d\n", p->pw_name, allbscore); + close(rawscores); + } else + if (!flag) + print("Unable to post score.\n"); + return (1); +} + +void +chase (np, sp) +struct point *sp, *np; +{ + /* this algorithm has bugs; otherwise the + snake would get too good */ + struct point d; + int w, i, wt[8]; + double sqrt(), v1, v2, vp, max; + point(&d,you.col-sp->col,you.line-sp->line); + v1 = sqrt( (double) (d.col*d.col + d.line*d.line) ); + w=0; + max=0; + for(i=0; i<8; i++) + { + vp = d.col*mx[i] + d.line*my[i]; + v2 = absv[i]; + if (v1>0) + vp = ((double)vp)/(v1*v2); + else vp=1.0; + if (vp>max) + { + max=vp; + w=i; + } + } + for(i=0; i<8; i++) + { + point(&d,sp->col+mx[i],sp->line+my[i]); + wt[i]=0; + if (d.col<0 || d.col>=ccnt || d.line<0 || d.line>=lcnt) + continue; + if (d.line == 0 && d.col < 5) continue; + if (same(&d,&money)) continue; + if (same(&d,&finish)) continue; + wt[i]= i==w ? loot/10 : 1; + if (i==oldw) wt [i] += loot/20; + } + for(w=i=0; i<8; i++) + w+= wt[i]; + vp = random() % w; + for(i=0; i<8; i++) + if (vp col+mx[w],sp->line+my[w]); +} + +void +surround(ps) +struct point *ps; +{ + struct point x; + int j; + + if(ps->col == 0)ps->col++; + if(ps->line == 0)ps->line++; + if(ps->line == LINES -1)ps->line--; + if(ps->col == COLUMNS -1)ps->col--; + aprint(point(&x,ps->col-1,ps->line-1),"/*\\\r* *\r\\*/"); + for (j=0;j<20;j++){ + pchar(ps,'@'); + delay(1); + pchar(ps,' '); + delay(1); + } + if (post(cashvalue,1)) { + aprint(point(&x,ps->col-1,ps->line-1)," \ro.o\r\\_/"); + delay(6); + aprint(point(&x,ps->col-1,ps->line-1)," \ro.-\r\\_/"); + delay(6); + } + aprint(point(&x,ps->col-1,ps->line-1)," \ro.o\r\\_/"); +} + +int +pushsnake() +{ + int i, bonus; + int issame = 0; + + /* + * My manual says times doesn't return a value. Furthermore, the + * snake should get his turn every time no matter if the user is + * on a fast terminal with typematic keys or not. + * So I have taken the call to times out. + */ + for(i=4; i>=0; i--) + if (same(&snake[i], &snake[5])) + issame++; + if (!issame) + pchar(&snake[5],' '); + for(i=4; i>=0; i--) + snake[i+1]= snake[i]; + chase(&snake[0], &snake[1]); + pchar(&snake[1],SNAKETAIL); + pchar(&snake[0],SNAKEHEAD); + for(i=0; i<6; i++) + { + if (same(&snake[i],&you)) + { + surround(&you); + i = (cashvalue) % 10; + bonus = random() % 10; + ll(); + print("%d\n", bonus); + delay(30); + if (bonus == i) { + spacewarp(1); + logit("bonus"); + flushi(); + return(1); + } + if ( loot >= penalty ){ + print("You and your $%d have been eaten\n",cashvalue); + } else { + print("The snake ate you. You owe $%d.\n",-cashvalue); + } + logit("eaten"); + length(moves); + done(); + } + } + return(0); } /* Main command loop */ +void mainloop() { int j, k; for (;;) { - int c,lastc,match; + int c, lastc = 0, match; + /* Hask to place cursor over the player position. */ + you.col++; you.line++; move(&you); + you.col--; you.line--; + fflush(stdout); if (((c = getchar() & 0177) <= '9') && (c >= '0')) { ungetc(c,stdin); @@ -188,7 +646,7 @@ mainloop() if (c == '.') { c = lastc; } - if ((Klength > 0) && + if ((Klength > 0) && (c == *KL || c == *KR || c == *KU || c == *KD)) { savec = c; match = 0; @@ -218,7 +676,7 @@ mainloop() if (match == 0) { ungetc(c,stdin); ch = savec; - /* Oops! + /* Oops! * This works if we figure it out on second character. */ break; @@ -229,11 +687,11 @@ mainloop() } c = ch; } - if (!fast) flushi(); + flushi(); lastc = c; switch (c){ - case CTRL(z): - case CTRL(c): + case CTRL('z'): + case CTRL('c'): suspend(); continue; case EOT: @@ -251,11 +709,13 @@ mainloop() j = read(0,stri,BSIZE); stri[j] = 0; if (fork() == 0) { - setuid(getuid()); - system(stri); + if (setuid(getuid()) < 0) + /*ignore*/; + if (system(stri) < 0) + /*ignore*/; } else wait(0); - printf("READY?\n"); + print("READY?\n"); fflush(stdout); raw(); c = getchar(); @@ -263,7 +723,7 @@ mainloop() putpad(KS); putpad(TI); point(&cursor,0,lcnt-1); - case CTRL(l): + case CTRL('l'): setup(); winnings(cashvalue); continue; @@ -318,597 +778,185 @@ mainloop() case 'h': case '\b': if (you.col >0) { - if((fast)||(k == 1)) - pchar(&you,' '); + pchar(&you,' '); you.col--; - if((fast) || (k == repeat) || - (you.col == 0)) - pchar(&you,ME); + pchar(&you,ME); } break; case 'f': case 'l': case ' ': if (you.col < ccnt-1) { - if((fast)||(k == 1)) - pchar(&you,' '); + pchar(&you,' '); you.col++; - if((fast) || (k == repeat) || - (you.col == ccnt-1)) - pchar(&you,ME); + pchar(&you,ME); } break; - case CTRL(p): + case CTRL('p'): case 'e': case 'k': case 'i': if (you.line > 0) { - if((fast)||(k == 1)) - pchar(&you,' '); + pchar(&you,' '); you.line--; - if((fast) || (k == repeat) || - (you.line == 0)) - pchar(&you,ME); + pchar(&you,ME); } break; - case CTRL(n): + case CTRL('n'): case 'c': case 'j': case LF: case 'm': if (you.line+1 < lcnt) { - if((fast)||(k == 1)) - pchar(&you,' '); + pchar(&you,' '); you.line++; - if((fast) || (k == repeat) || - (you.line == lcnt-1)) - pchar(&you,ME); + pchar(&you,ME); } break; } - if (same(&you,&money)) - { - char xp[20]; - struct point z; + if (same(&you,&money)) { loot += 25; if(k < repeat) pchar(&you,' '); do { - random(&money); - } while (money.col == finish.col && money.line == finish.line || - money.col < 5 && money.line == 0 || - money.col == you.col && money.line == you.line); + randm(&money); + } while ((money.col == finish.col && money.line == finish.line) || + (money.col < 5 && money.line == 0) || + (money.col == you.col && money.line == you.line)); pchar(&money,TREASURE); winnings(cashvalue); continue; } - if (same(&you,&finish)) - { + if (same(&you,&finish)) { win(&finish); ll(); cook(); - printf("You have won with $%d.\n",cashvalue); + print("You have won with $%d.\n",cashvalue); fflush(stdout); logit("won"); post(cashvalue,0); length(moves); - done(0); + done(); } - if (pushsnake())break; + if (pushsnake()) + break; } fflush(stdout); } } -setup(){ /* - * setup the board - */ - int i; - - clear(); - pchar(&you,ME); - pchar(&finish,GOAL); - pchar(&money,TREASURE); - for(i=1; i<6; i++) { - pchar(&snake[i],SNAKETAIL); - } - pchar(&snake[0], SNAKEHEAD); - drawbox(); - fflush(stdout); -} - -drawbox() -{ - register int i; - struct point p; - - p.line = -1; - for (i= 0; icol = sp->line = -1; /* impossible */ - do { - issame = 0; - p.col = ((rand()>>8) & 0377)% ccnt; - p.line = ((rand()>>8) & 0377)% lcnt; - - /* make sure it's not on top of something else */ - if (p.line == 0 && p.col <5) issame++; - if(same(&p, &you)) issame++; - if(same(&p, &money)) issame++; - if(same(&p, &finish)) issame++; - for (i=0; i<5; i++) - if(same(&p, &snake[i])) issame++; - - } while (issame); - *sp = p; -} - +void busy() { - FILE *pip, *popen(); - char c; - int b,r; - float a; - #ifdef CHECKBUSY if (! strcmp (argval[0], "test")) return; + FILE *pip; if ((access(BUSY,1) != 0) || (pip = popen(BUSY,"r")) == NULL){ - printf("Sorry, no snake just now.\n"); + print("Sorry, no snake just now.\n"); + done(); + } + int b; + if (fscanf(pip, "%d", &b) != 1) { + print("Sorry, busy file damaged.\n"); done(); } - fscanf(pip,"%d",&b); pclose(pip); if (b > 20) { - printf("Sorry, the system is too heavily loaded right now.\n"); + print("Sorry, the system is too heavily loaded right now.\n"); done(); } - nice(b); + if (nice(b) < 0) + /*ignore*/; #endif } -post(iscore, flag) -int iscore, flag; +void +stop(int sig) { - short score = iscore; - int rawscores; - short uid; - short oldbest=0; - short allbwho=0, allbscore=0; - struct passwd *p, *getpwuid(); - - /* - * Neg uid, 0, and 1 cannot have scores recorded. - */ - if ((uid=getuid()) > 1 && (rawscores=open(SNAKERAWSCORES,2))>=0) { - /* Figure out what happened in the past */ - read(rawscores, &allbscore, sizeof(short)); - read(rawscores, &allbwho, sizeof(short)); - lseek(rawscores, ((long)uid)*sizeof(short), 0); - read(rawscores, &oldbest, sizeof(short)); - if (flag) return (score > oldbest ? 1 : 0); - - /* Update this jokers best */ - if (score > oldbest) { - lseek(rawscores, ((long)uid)*sizeof(short), 0); - write(rawscores, &score, sizeof(short)); - printf("You bettered your previous best of $%d\n", oldbest); - } else - printf("Your best to date is $%d\n", oldbest); - - /* See if we have a new champ */ - p = getpwuid(allbwho); - if (p == NULL || score > allbscore) { - lseek(rawscores, (long)0, 0); - write(rawscores, &score, sizeof(short)); - write(rawscores, &uid, sizeof(short)); - if (p != NULL) - printf("You beat %s's old record of $%d!\n", p->pw_name, allbscore); - else - printf("You set a new record!\n"); - } else - printf("The highest is %s with $%d\n", p->pw_name, allbscore); - close(rawscores); - } else - if (!flag) - printf("Unable to post score.\n"); - return (1); -} - -/* - * Flush typeahead to keep from buffering a bunch of chars and then - * overshooting. This loses horribly at 9600 baud, but works nicely - * if the terminal gets behind. - */ -flushi() -{ - stty(0, &new); -} -int mx [8] = { - 0, 1, 1, 1, 0,-1,-1,-1}; -int my [8] = { - -1,-1, 0, 1, 1, 1, 0,-1}; -float absv[8]= { - 1, 1.4, 1, 1.4, 1, 1.4, 1, 1.4 -}; -int oldw=0; -chase (np, sp) -struct point *sp, *np; -{ - /* this algorithm has bugs; otherwise the - snake would get too good */ - struct point d; - int w, i, wt[8]; - double sqrt(), v1, v2, vp, max; - point(&d,you.col-sp->col,you.line-sp->line); - v1 = sqrt( (double) (d.col*d.col + d.line*d.line) ); - w=0; - max=0; - for(i=0; i<8; i++) - { - vp = d.col*mx[i] + d.line*my[i]; - v2 = absv[i]; - if (v1>0) - vp = ((double)vp)/(v1*v2); - else vp=1.0; - if (vp>max) - { - max=vp; - w=i; - } - } - for(i=0; i<8; i++) - { - point(&d,sp->col+mx[i],sp->line+my[i]); - wt[i]=0; - if (d.col<0 || d.col>=ccnt || d.line<0 || d.line>=lcnt) - continue; - if (d.line == 0 && d.col < 5) continue; - if (same(&d,&money)) continue; - if (same(&d,&finish)) continue; - wt[i]= i==w ? loot/10 : 1; - if (i==oldw) wt [i] += loot/20; - } - for(w=i=0; i<8; i++) - w+= wt[i]; - vp = (( rand() >> 6 ) & 01777) %w; - for(i=0; i<8; i++) - if (vp col+mx[w],sp->line+my[w]); -} - -spacewarp(w) -int w;{ - struct point p; - int j; - - random(&you); - point(&p,COLUMNS/2 - 8,LINES/2 - 1); - if (p.col < 0) - p.col = 0; - if (p.line < 0) - p.line = 0; - if (w) { - sprintf(str,"BONUS!!!"); - loot = loot - penalty; - penalty = 0; - } else { - sprintf(str,"SPACE WARP!!!"); - penalty += loot/PENALTY; - } - for(j=0;j<3;j++){ - clear(); - delay(5); - aprintf(&p,str); - delay(10); - } - setup(); - winnings(cashvalue); -} -snap() -{ - struct point p; - int i; - - if(you.line < 3){ - pchar(point(&p,you.col,0),'-'); - } - if(you.line > lcnt-4){ - pchar(point(&p,you.col,lcnt-1),'_'); - } - if(you.col < 10){ - pchar(point(&p,0,you.line),'('); - } - if(you.col > ccnt-10){ - pchar(point(&p,ccnt-1,you.line),')'); - } - if (! stretch(&money)) if (! stretch(&finish)) delay(10); - if(you.line < 3){ - point(&p,you.col,0); - remove(&p); - } - if(you.line > lcnt-4){ - point(&p,you.col,lcnt-1); - remove(&p); - } - if(you.col < 10){ - point(&p,0,you.line); - remove(&p); - } - if(you.col > ccnt-10){ - point(&p,ccnt-1,you.line); - remove(&p); - } - fflush(stdout); -} -stretch(ps) -struct point *ps;{ - struct point p; - - point(&p,you.col,you.line); - if(abs(ps->col-you.col) < 6){ - if(you.line < ps->line){ - for (p.line = you.line+1;p.line <= ps->line;p.line++) - pchar(&p,'v'); - delay(10); - for (;p.line > you.line;p.line--) - remove(&p); - } else { - for (p.line = you.line-1;p.line >= ps->line;p.line--) - pchar(&p,'^'); - delay(10); - for (;p.line < you.line;p.line++) - remove(&p); - } - return(1); - } else if(abs(ps->line-you.line) < 3){ - p.line = you.line; - if(you.col < ps->col){ - for (p.col = you.col+1;p.col <= ps->col;p.col++) - pchar(&p,'>'); - delay(10); - for (;p.col > you.col;p.col--) - remove(&p); - } else { - for (p.col = you.col-1;p.col >= ps->col;p.col--) - pchar(&p,'<'); - delay(10); - for (;p.col < you.col;p.col++) - remove(&p); - } - return(1); - } - return(0); -} - -surround(ps) -struct point *ps;{ - struct point x; - int i,j; - - if(ps->col == 0)ps->col++; - if(ps->line == 0)ps->line++; - if(ps->line == LINES -1)ps->line--; - if(ps->col == COLUMNS -1)ps->col--; - aprintf(point(&x,ps->col-1,ps->line-1),"/*\\\r* *\r\\*/"); - for (j=0;j<20;j++){ - pchar(ps,'@'); - delay(1); - pchar(ps,' '); - delay(1); - } - if (post(cashvalue,1)) { - aprintf(point(&x,ps->col-1,ps->line-1)," \ro.o\r\\_/"); - delay(6); - aprintf(point(&x,ps->col-1,ps->line-1)," \ro.-\r\\_/"); - delay(6); - } - aprintf(point(&x,ps->col-1,ps->line-1)," \ro.o\r\\_/"); -} -win(ps) -struct point *ps; -{ - struct point x; - int j,k; - int boxsize; /* actually diameter of box, not radius */ - - boxsize = fast ? 10 : 4; - point(&x,ps->col,ps->line); - for(j=1;j=0; i--) - if (same(&snake[i], &snake[5])) - issame++; - if (!issame) - pchar(&snake[5],' '); - for(i=4; i>=0; i--) - snake[i+1]= snake[i]; - chase(&snake[0], &snake[1]); - pchar(&snake[1],SNAKETAIL); - pchar(&snake[0],SNAKEHEAD); - for(i=0; i<6; i++) - { - if (same(&snake[i],&you)) - { - surround(&you); - i = (cashvalue) % 10; - bonus = ((rand()>>8) & 0377)% 10; - ll(); - printf("%d\n", bonus); - delay(30); - if (bonus == i) { - spacewarp(1); - logit("bonus"); - flushi(); - return(1); - } - if ( loot >= penalty ){ - printf("You and your $%d have been eaten\n",cashvalue); - } else { - printf("The snake ate you. You owe $%d.\n",-cashvalue); - } - logit("eaten"); - length(moves); - done(); - } - } - return(0); -} - -remove(sp) -struct point *sp; -{ - int j; - - if (same(sp,&money)) { - pchar(sp,TREASURE); - return(2); - } - if (same(sp,&finish)) { - pchar(sp,GOAL); - return(3); - } - if (same(sp,&snake[0])) { - pchar(sp,SNAKEHEAD); - return(4); - } - for(j=1;j<6;j++){ - if(same(sp,&snake[j])){ - pchar(sp,SNAKETAIL); - return(4); - } - } - if ((sp->col < 4) && (sp->line == 0)){ - winnings(cashvalue); - if((you.line == 0) && (you.col < 4)) pchar(&you,ME); - return(5); - } - if (same(sp,&you)) { - pchar(sp,ME); - return(1); - } - pchar(sp,' '); - return(0); -} -winnings(won) -int won; -{ - struct point p; - - p.line = p.col = 1; - if(won>0){ - move(&p); - printf("$%d",won); - } -} - -stop(){ - signal(SIGINT,1); + signal(SIGINT, SIG_IGN); ll(); length(moves); done(); } -suspend() +int +main(argc,argv) +int argc; +char **argv; { - char *sh; + int i; + char stdbuf[BUFSIZ]; - cook(); -#ifdef SIGTSTP - kill(getpid(), SIGTSTP); -#else - sh = getenv("SHELL"); - if (sh == NULL) - sh = "/bin/sh"; - system(sh); -#endif - raw(); - setup(); - winnings(cashvalue); -} + argcount = argc; + argval = argv; + penalty = loot = 0; + getcap(); + ccnt -= 2; lcnt -= 2; /* compensate for border */ + busy(); + time(&tv); -length(num) -int num; -{ - printf("You made %d moves.\n",num); -} - -logit(msg) -char *msg; -{ - FILE *logfile; - long t; - - if ((logfile=fopen(LOGFILE, "a")) != NULL) { - time(&t); - fprintf(logfile, "%s $%d %dx%d %s %s", getlogin(), cashvalue, lcnt, ccnt, msg, ctime(&t)); - fclose(logfile); + for (i=1; i -# include -# include -# include -# include -# include +#include +#include +#include +#include +#include +#include +#ifdef CROSS +# include +# define sgttyb termio +#else +# include +#endif #define ESC '\033' @@ -20,30 +25,49 @@ struct tbuffer { } tbuffer; char *CL, *UP, *DO, *ND, *BS, - *HO, *CM, - *TA, *LL, + *HO, *CM, *LL, *KL, *KR, *KU, *KD, *TI, *TE, *KS, *KE; int LINES, COLUMNS; /* physical screen size. */ int lcnt, ccnt; /* user's idea of screen size */ char xBC, PC; -int AM, BW; +int BW; char tbuf[1024], tcapbuf[128]; -char *tgetstr(), *tgoto(); int Klength; /* length of KX strings */ int chunk; /* amount of money given at a time */ + #ifdef debug -#define cashvalue (loot-penalty)/25 +# define cashvalue (loot-penalty)/25 #else -#define cashvalue chunk*(loot-penalty)/25 +# define cashvalue chunk*(loot-penalty)/25 #endif struct point { int col, line; }; struct point cursor; -struct sgttyb orig, new; +struct sgttyb origtty, newtty; #ifdef TIOCLGET struct ltchars olttyc, nlttyc; #endif -struct point *point(); + +#undef CTRL +#define CTRL(x) (x - 'A' + 1) + +struct point *point(struct point *ps, int x, int y); + +void print(char *fmt, ...); +void aprint(struct point *ps, char *fmt, ...); +void move(struct point *sp); +void stop(int sig); +void pchar(struct point *ps, char ch); +void putpad(char *str); +void clear(void); +void delay(int t); +void cook(void); +void raw(void); +void ll(void); +void done(void); +void getcap(void); + +int same(struct point *sp1, struct point *sp2); diff --git a/src/games/snake/snscore.c b/src/games/snake/snscore.c index 66f8032..d7f802d 100644 --- a/src/games/snake/snscore.c +++ b/src/games/snake/snscore.c @@ -3,18 +3,18 @@ * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. */ - -#ifndef lint -static char sccsid[] = "@(#)snscore.c 5.1 (Berkeley) 5/30/85"; -#endif not lint - #include +#include +#include #include -char *recfile = "/usr/games/lib/snakerawscores"; -#define MAXPLAYERS 256 -struct passwd *getpwuid(); -char *malloc(); +#ifdef CROSS +char *recfile = "/usr/local/games/snakerawscores"; +#else +char *recfile = "/games/lib/snakerawscores"; +#endif + +#define MAXPLAYERS 256 struct player { short uids; @@ -22,12 +22,11 @@ struct player { char *name; } players[MAXPLAYERS], temp; -main() +int main() { - char buf[80], cp; short uid, score; FILE *fd; - int noplayers; + int noplayers = 0; int i, j, notsorted; short whoallbest, allbest; char *q; @@ -39,10 +38,13 @@ main() exit(1); } printf("Snake players scores to date\n"); - fread(&whoallbest, sizeof(short), 1, fd); - fread(&allbest, sizeof(short), 1, fd); + if (! fread(&whoallbest, sizeof(short), 1, fd) || + ! fread(&allbest, sizeof(short), 1, fd)) { + printf("error reading scores\n"); + exit(2); + } for (uid=2;;uid++) { - if(fread(&score, sizeof(short), 1, fd) == 0) + if(! fread(&score, sizeof(short), 1, fd)) break; if (score > 0) { if (noplayers > MAXPLAYERS) { diff --git a/src/libcurses/cr_tty.c b/src/libcurses/cr_tty.c index 057c8b7..7d5c979 100644 --- a/src/libcurses/cr_tty.c +++ b/src/libcurses/cr_tty.c @@ -109,6 +109,8 @@ zap() SE = UE; } } + if (DO && !NL) + NL = DO; } int diff --git a/src/libcurses/mvprintw.c b/src/libcurses/mvprintw.c index 1766cff..a13fa53 100644 --- a/src/libcurses/mvprintw.c +++ b/src/libcurses/mvprintw.c @@ -11,20 +11,29 @@ * */ int -mvprintw(y, x, fmt, args) - reg int y, x; - char *fmt; - int args; +mvprintw(int y, int x, char *fmt, ...) { - return move(y, x) == OK ? _sprintw(stdscr, fmt, &args) : ERR; + va_list args; + int ret; + + if (move(y, x) != OK) + return ERR; + va_start (args, fmt); + ret = _sprintw (stdscr, fmt, args); + va_end (args); + return ret; } int -mvwprintw(win, y, x, fmt, args) - reg WINDOW *win; - reg int y, x; - char *fmt; - int args; +mvwprintw(WINDOW *win, int y, int x, char *fmt, ...) { - return wmove(win, y, x) == OK ? _sprintw(win, fmt, &args) : ERR; + va_list args; + int ret; + + if (wmove(win, y, x) != OK) + return ERR; + va_start (args, fmt); + ret = _sprintw (win, fmt, args); + va_end (args); + return ret; } diff --git a/src/libtermlib/termcap/.gitignore b/src/libtermlib/termcap/.gitignore index 4809e2a..1d367c5 100644 --- a/src/libtermlib/termcap/.gitignore +++ b/src/libtermlib/termcap/.gitignore @@ -1 +1 @@ -termcap +termcap.full diff --git a/src/libtermlib/termcap/Makefile b/src/libtermlib/termcap/Makefile index 6a3e4f2..cfbf888 100644 --- a/src/libtermlib/termcap/Makefile +++ b/src/libtermlib/termcap/Makefile @@ -11,11 +11,12 @@ # DESTDIR = ../../.. -termcap: reorder termcap.src +termcap.full: reorder termcap.src ex - termcap.src < reorder -install: termcap - install -c -m 444 termcap ${DESTDIR}/etc/termcap +install: termcap.small termcap.full + install -c -m 444 termcap.small ${DESTDIR}/etc/termcap + install -c -m 444 termcap.full ${DESTDIR}/etc/termcap.full tabset: FRC rm -fr ${DESTDIR}/usr/share/tabset @@ -24,6 +25,6 @@ tabset: FRC install -c -m 444 tabset/* ${DESTDIR}/usr/share/tabset clean: - rm -f termcap + rm -f termcap.full FRC: diff --git a/src/libtermlib/termcap/reorder b/src/libtermlib/termcap/reorder index 8964771..da20d3f 100644 --- a/src/libtermlib/termcap/reorder +++ b/src/libtermlib/termcap/reorder @@ -36,5 +36,5 @@ $r termcap.local /|h19-g|/;.,/^[^ ]/-m9 /|5620|/;.,/^[^ ]/-m9 /^s/;.,/^#/-m9 -w! termcap +w! termcap.full q diff --git a/src/libtermlib/termcap/termcap.small b/src/libtermlib/termcap/termcap.small new file mode 100644 index 0000000..e4e3356 --- /dev/null +++ b/src/libtermlib/termcap/termcap.small @@ -0,0 +1,100 @@ +# Copyright (c) 1980, 1985, 1989 The Regents of the University of California. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. All advertising materials mentioning features or use of this software +# must display the following acknowledgement: +# This product includes software developed by the University of +# California, Berkeley and its contributors. +# 4. Neither the name of the University nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# @(#)termcap.src 5.88 (Berkeley) 4/30/91 +# $FreeBSD$ +# +cons25|ansi|ansi80x25:\ + :am:bs:NP:ms:pt:AX:eo:bw:ut:km:\ + :co#80:li#25:pa#64:Co#8:it#8:\ + :al=\E[L:cd=\E[J:ce=\E[K:cl=\E[H\E[J:cm=\E[%i%d;%dH:\ + :dc=\E[P:dl=\E[M:do=\E[B:bt=\E[Z:ho=\E[H:ic=\E[@:cb=\E[1K:\ + :nd=\E[C:rs=\Ec:so=\E[7m:se=\E[27m:up=\E[A:cr=^M:ta=^I:\ + :AF=\E[3%dm:AB=\E[4%dm:op=\E[39;49m:sc=\E7:rc=\E8:\ + :k1=\E[M:k2=\E[N:k3=\E[O:k4=\E[P:k5=\E[Q:k6=\E[R:k7=\E[S:k8=\E[T:\ + :k9=\E[U:k;=\E[V:F1=\E[W:F2=\E[X:K2=\E[E:nw=\E[E:ec=\E[%dX:\ + :kb=^H:kh=\E[H:ku=\E[A:kd=\E[B:kl=\E[D:kr=\E[C:le=^H:sf=\E[S:sr=\E[T:\ + :kN=\E[G:kP=\E[I:@7=\E[F:kI=\E[L:kD=\177:kB=\E[Z:\ + :IC=\E[%d@:DC=\E[%dP:SF=\E[%dS:SR=\E[%dT:AL=\E[%dL:DL=\E[%dM:\ + :DO=\E[%dB:LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:cv=\E[%i%dd:ch=\E[%i%d`:\ + :mb=\E[5m:md=\E[1m:mr=\E[7m:me=\E[m:bl=^G:\ + :ve=\E[=S:vi=\E[=1S:vs=\E[=2S: + +vt100|dec-vt100|vt100-am|vt100am|dec vt100:\ + :do=2\E[B:co#80:li#24:cl=50\E[H\E[J:sf=2*\ED:\ + :le=^H:bs:am:cm=5\E[%i%d;%dH:nd=2\E[C:up=2\E[A:\ + :ce=3\E[K:cd=50\E[J:so=2\E[7m:se=2\E[m:us=2\E[4m:ue=2\E[m:\ + :md=2\E[1m:mr=2\E[7m:mb=2\E[5m:me=2\E[m:\ + :is=\E>\E[?1;3;4;5l\E[?7;8h\E[1;24r\E[24;1H:\ + :if=/usr/share/tabset/vt100:nw=2\EE:ho=\E[H:\ + :as=2\E(0:ae=2\E(B:\ + :ac=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||:\ + :rs=\E>\E[?1;3;4;5l\E[?7;8h:ks=\E[?1h\E=:ke=\E[?1l\E>:\ + :ku=\EOA:kd=\EOB:kr=\EOC:kl=\EOD:kb=\177:\ + :k0=\EOy:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:k5=\EOt:\ + :k6=\EOu:k7=\EOv:k8=\EOl:k9=\EOw:k;=\EOx:@8=\EOM:\ + :K1=\EOq:K2=\EOr:K3=\EOs:K4=\EOp:K5=\EOn:pt:sr=2*\EM:xn:\ + :sc=2\E7:rc=2\E8:cs=5\E[%i%d;%dr:UP=2\E[%dA:DO=2\E[%dB:RI=2\E[%dC:\ + :LE=2\E[%dD:ct=2\E[3g:st=2\EH:ta=^I:ms:bl=^G:cr=^M:eo:it#8:\ + :RA=\E[?7l:SA=\E[?7h:po=\E[5i:pf=\E[4i: + +# $XTermId: termcap,v 1.78 2009/11/09 00:24:26 tom Exp $ +# +xterm|linux|modern xterm:\ + :@7=\EOF:@8=\EOM:F1=\E[23~:F2=\E[24~:K2=\EOE:Km=\E[M:\ + :k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:k5=\E[15~:k6=\E[17~:\ + :k7=\E[18~:k8=\E[19~:k9=\E[20~:k;=\E[21~:kI=\E[2~:\ + :kN=\E[6~:kP=\E[5~:kd=\EOB:kh=\EOH:kl=\EOD:kr=\EOC:ku=\EOA:\ + :tc=xterm-basic: +# +# This chunk is used for building the VT220/Sun/PC keyboard variants. +xterm-basic|modern xterm common:\ + :am:bs:km:mi:ms:ut:xn:AX:\ + :Co#8:co#80:kn#12:li#24:pa#64:\ + :AB=\E[4%dm:AF=\E[3%dm:AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:\ + :DO=\E[%dB:LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:ae=\E(B:al=\E[L:\ + :as=\E(0:bl=^G:cd=\E[J:ce=\E[K:cl=\E[H\E[2J:\ + :cm=\E[%i%d;%dH:cs=\E[%i%d;%dr:ct=\E[3g:dc=\E[P:dl=\E[M:do=\E[B:\ + :ei=\E[4l:ho=\E[H:im=\E[4h:is=\E[!p\E[?3;4l\E[4l\E>:\ + :kD=\E[3~:kb=^H:ke=\E[?1l\E>:ks=\E[?1h\E=:le=^H:md=\E[1m:\ + :me=\E[m:ml=\El:mr=\E[7m:mu=\Em:nd=\E[C:op=\E[39;49m:\ + :rc=\E8:rs=\E[!p\E[?3;4l\E[4l\E>:sc=\E7:se=\E[27m:sf=^J:\ + :so=\E[7m:sr=\EM:st=\EH:\ + :ue=\E[24m:up=\E[A:us=\E[4m:ve=\E[?12l\E[?25h:vi=\E[?25l:vs=\E[?12;25h: +# +# This should work for the commonly used "color xterm" variations (XFree86 +# xterm, color_xterm, nxterm, rxvt). Note that it does not set 'bce', so for +# XFree86 and rxvt, some applications that use colors will be less efficient, +# and in a few special cases (with "smart" optimization) the wrong color will +# be painted in spots. +xterm-color|generic "ANSI" color xterm:\ + :Co#8:NC@:pa#64:\ + :AB=\E[4%dm:AF=\E[3%dm:ac=:op=\E[m:tc=xterm-r6: diff --git a/tools/virtualmips/pic32_dev_uart.c b/tools/virtualmips/pic32_dev_uart.c index 091fa24..8b26308 100644 --- a/tools/virtualmips/pic32_dev_uart.c +++ b/tools/virtualmips/pic32_dev_uart.c @@ -137,9 +137,9 @@ void *dev_pic32_uart_access (cpu_mips_t * cpu, struct vdevice *dev, #endif switch (offset) { case PIC32_U1TXREG & 0xff: /* Transmit */ - /* Skip ^M. */ - if ((char) (*data) != '\r') - vtty_put_char (d->vtty, (char) (*data)); + /* Don't skip ^M. */ + vtty_put_char (d->vtty, (char) (*data)); + if ((d->mode & PIC32_UMODE_ON) && (d->sta & PIC32_USTA_UTXEN) && (d->output == 0)) { /*