Difference between revisions of "Source:NetHack 1.4f/unixunix.c"

From NetHackWiki
Jump to navigation Jump to search
m (Automated source code upload)
 
m (Semi-redirect to 1.3d versions)
Line 1: Line 1:
Below is the full text to '''unixunix.c''' from the [[NetHack 1.4f source code|source code]] of [[NetHack 1.4f]]. To link to a particular line, write [[NetHack 1.4f/unixunix.c#line123|<nowiki>[[NetHack 1.4f/unixunix.c#line123]]</nowiki>]], for example.
+
The source code file '''unixunix.c''' in [[NetHack 1.4f source code|NetHack 1.4f]] is unchanged from [[NetHack 1.3d/unixunix.c]].
 
+
[[Category:NetHack 1.4f source code]]
'''Warning!''' This is the source code from an old release. For the latest release, see [[Source code]]
 
 
 
{{CWI}}
 
<span id="line1">1.   /* SCCS Id: @(#)unixunix.c 1.3 87/07/14</span>
 
<span id="line2">2.    /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */</span>
 
<span id="line3">3.    /* hack.unix.c - version 1.0.3 */</span>
 
<span id="line4">4.    </span>
 
<span id="line5">5.    /* This file collects some Unix dependencies; pager.c contains some more */</span>
 
<span id="line6">6.    </span>
 
<span id="line7">7.    /*</span>
 
<span id="line8">8.    * The time is used for:</span>
 
<span id="line9">9.    * - seed for rand()</span>
 
<span id="line10">10.    * - year on tombstone and yymmdd in record file</span>
 
<span id="line11">11.    * - phase of the moon (various monsters react to NEW_MOON or FULL_MOON)</span>
 
<span id="line12">12.    * - night and midnight (the undead are dangerous at midnight)</span>
 
<span id="line13">13.    * - determination of what files are "very old"</span>
 
<span id="line14">14.    */</span>
 
<span id="line15">15.  </span>
 
<span id="line16">16.  #include <stdio.h></span>
 
<span id="line17">17.  #include <errno.h></span>
 
<span id="line18">18.  #include "hack.h" /* mainly for index() which depends on BSD */</span>
 
<span id="line19">19.  </span>
 
<span id="line20">20.  #include <sys/types.h> /* for time_t and stat */</span>
 
<span id="line21">21.  #include <sys/stat.h></span>
 
<span id="line22">22.  #ifdef BSD</span>
 
<span id="line23">23.  #include <sys/time.h></span>
 
<span id="line24">24.  #else</span>
 
<span id="line25">25.  #include <time.h></span>
 
<span id="line26">26.  #endif</span>
 
<span id="line27">27.  </span>
 
<span id="line28">28.  extern char *getenv();</span>
 
<span id="line29">29.  extern time_t time();</span>
 
<span id="line30">30.  </span>
 
<span id="line31">31.  setrandom()</span>
 
<span id="line32">32.  {</span>
 
<span id="line33">33.  (void) srand((int) time ((time_t *) 0));</span>
 
<span id="line34">34.  }</span>
 
<span id="line35">35.  </span>
 
<span id="line36">36.  struct tm *</span>
 
<span id="line37">37.  getlt()</span>
 
<span id="line38">38.  {</span>
 
<span id="line39">39.  time_t date;</span>
 
<span id="line40">40.  struct tm *localtime();</span>
 
<span id="line41">41.  </span>
 
<span id="line42">42.  (void) time(&date);</span>
 
<span id="line43">43.  return(localtime(&date));</span>
 
<span id="line44">44.  }</span>
 
<span id="line45">45.  </span>
 
<span id="line46">46.  getyear()</span>
 
<span id="line47">47.  {</span>
 
<span id="line48">48.  return(1900 + getlt()->tm_year);</span>
 
<span id="line49">49.  }</span>
 
<span id="line50">50.  </span>
 
<span id="line51">51.  char *</span>
 
<span id="line52">52.  getdate()</span>
 
<span id="line53">53.  {</span>
 
<span id="line54">54.  static char datestr[7];</span>
 
<span id="line55">55.  register struct tm *lt = getlt();</span>
 
<span id="line56">56.  </span>
 
<span id="line57">57.  (void) sprintf(datestr, "%2d%2d%2d",</span>
 
<span id="line58">58.  lt->tm_year, lt->tm_mon + 1, lt->tm_mday);</span>
 
<span id="line59">59.  if(datestr[2] == ' ') datestr[2] = '0';</span>
 
<span id="line60">60.  if(datestr[4] == ' ') datestr[4] = '0';</span>
 
<span id="line61">61.  return(datestr);</span>
 
<span id="line62">62.  }</span>
 
<span id="line63">63.  </span>
 
<span id="line64">64.  phase_of_the_moon() /* 0-7, with 0: new, 4: full */</span>
 
<span id="line65">65.  { /* moon period: 29.5306 days */</span>
 
<span id="line66">66.  /* year: 365.2422 days */</span>
 
<span id="line67">67.  register struct tm *lt = getlt();</span>
 
<span id="line68">68.  register int epact, diy, golden;</span>
 
<span id="line69">69.  </span>
 
<span id="line70">70.  diy = lt->tm_yday;</span>
 
<span id="line71">71.  golden = (lt->tm_year % 19) + 1;</span>
 
<span id="line72">72.  epact = (11 * golden + 18) % 30;</span>
 
<span id="line73">73.  if ((epact == 25 && golden > 11) || epact == 24)</span>
 
<span id="line74">74.  epact++;</span>
 
<span id="line75">75.  </span>
 
<span id="line76">76.  return( (((((diy + epact) * 6) + 11) % 177) / 22) & 7 );</span>
 
<span id="line77">77.  }</span>
 
<span id="line78">78.  </span>
 
<span id="line79">79.  night()</span>
 
<span id="line80">80.  {</span>
 
<span id="line81">81.  register int hour = getlt()->tm_hour;</span>
 
<span id="line82">82.  </span>
 
<span id="line83">83.  return(hour < 6 || hour > 21);</span>
 
<span id="line84">84.  }</span>
 
<span id="line85">85.  </span>
 
<span id="line86">86.  midnight()</span>
 
<span id="line87">87.  {</span>
 
<span id="line88">88.  return(getlt()->tm_hour == 0);</span>
 
<span id="line89">89.  }</span>
 
<span id="line90">90.  </span>
 
<span id="line91">91.  struct stat buf, hbuf;</span>
 
<span id="line92">92.  </span>
 
<span id="line93">93.  gethdate(name) char *name; {</span>
 
<span id="line94">94.  /* old version - for people short of space */</span>
 
<span id="line95">95.  /*</span>
 
<span id="line96">96.  /* register char *np;</span>
 
<span id="line97">97.  /* if(stat(name, &hbuf))</span>
 
<span id="line98">98.  /* error("Cannot get status of %s.",</span>
 
<span id="line99">99.  /* (np = rindex(name, '/')) ? np+1 : name);</span>
 
<span id="line100">100.  /*</span>
 
<span id="line101">101.  /* version using PATH from: seismo!gregc@ucsf-cgl.ARPA (Greg Couch) */</span>
 
<span id="line102">102.  </span>
 
<span id="line103">103.  </span>
 
<span id="line104">104.  /*</span>
 
<span id="line105">105.  * The problem with  #include <sys/param.h>  is that this include file</span>
 
<span id="line106">106.  * does not exist on all systems, and moreover, that it sometimes includes</span>
 
<span id="line107">107.  * <sys/types.h> again, so that the compiler sees these typedefs twice.</span>
 
<span id="line108">108.  */</span>
 
<span id="line109">109.  #define MAXPATHLEN 1024</span>
 
<span id="line110">110.  </span>
 
<span id="line111">111.  register char *np, *path;</span>
 
<span id="line112">112.  char filename[MAXPATHLEN+1];</span>
 
<span id="line113">113.  if (index(name, '/') != NULL || (path = getenv("PATH")) == NULL)</span>
 
<span id="line114">114.  path = "";</span>
 
<span id="line115">115.  </span>
 
<span id="line116">116.  for (;;) {</span>
 
<span id="line117">117.  if ((np = index(path, ':')) == NULL)</span>
 
<span id="line118">118.  np = path + strlen(path); /* point to end str */</span>
 
<span id="line119">119.  if (np - path <= 1) /* %% */</span>
 
<span id="line120">120.  (void) strcpy(filename, name);</span>
 
<span id="line121">121.  else {</span>
 
<span id="line122">122.  (void) strncpy(filename, path, np - path);</span>
 
<span id="line123">123.  filename[np - path] = '/';</span>
 
<span id="line124">124.  (void) strcpy(filename + (np - path) + 1, name);</span>
 
<span id="line125">125.  }</span>
 
<span id="line126">126.  if (stat(filename, &hbuf) == 0)</span>
 
<span id="line127">127.  return;</span>
 
<span id="line128">128.  if (*np == '\0')</span>
 
<span id="line129">129.  break;</span>
 
<span id="line130">130.  path = np + 1;</span>
 
<span id="line131">131.  }</span>
 
<span id="line132">132.  error("Cannot get status of %s.",</span>
 
<span id="line133">133.  (np = rindex(name, '/')) ? np+1 : name);</span>
 
<span id="line134">134.  }</span>
 
<span id="line135">135.  </span>
 
<span id="line136">136.  uptodate(fd) {</span>
 
<span id="line137">137.  if(fstat(fd, &buf)) {</span>
 
<span id="line138">138.  pline("Cannot get status of saved level? ");</span>
 
<span id="line139">139.  return(0);</span>
 
<span id="line140">140.  }</span>
 
<span id="line141">141.  if(buf.st_mtime < hbuf.st_mtime) {</span>
 
<span id="line142">142.  pline("Saved level is out of date. ");</span>
 
<span id="line143">143.  return(0);</span>
 
<span id="line144">144.  }</span>
 
<span id="line145">145.  return(1);</span>
 
<span id="line146">146.  }</span>
 
<span id="line147">147.  </span>
 
<span id="line148">148.  /* see whether we should throw away this xlock file */</span>
 
<span id="line149">149.  veryold(fd) {</span>
 
<span id="line150">150.  register int i;</span>
 
<span id="line151">151.  time_t date;</span>
 
<span id="line152">152.  </span>
 
<span id="line153">153.  if(fstat(fd, &buf)) return(0); /* cannot get status */</span>
 
<span id="line154">154.  if(buf.st_size != sizeof(int)) return(0); /* not an xlock file */</span>
 
<span id="line155">155.  (void) time(&date);</span>
 
<span id="line156">156.  if(date - buf.st_mtime < 3L*24L*60L*60L) { /* recent */</span>
 
<span id="line157">157.  extern int errno;</span>
 
<span id="line158">158.  int lockedpid; /* should be the same size as hackpid */</span>
 
<span id="line159">159.  </span>
 
<span id="line160">160.  if(read(fd, (char *)&lockedpid, sizeof(lockedpid)) !=</span>
 
<span id="line161">161.  sizeof(lockedpid))</span>
 
<span id="line162">162.  /* strange ... */</span>
 
<span id="line163">163.  return(0);</span>
 
<span id="line164">164.  </span>
 
<span id="line165">165.  /* From: Rick Adams <seismo!rick></span>
 
<span id="line166">166.  /* This will work on 4.1cbsd, 4.2bsd and system 3? & 5.</span>
 
<span id="line167">167.  /* It will do nothing on V7 or 4.1bsd. */</span>
 
<span id="line168">168.  if(!(kill(lockedpid, 0) == -1 && errno == ESRCH))</span>
 
<span id="line169">169.  return(0);</span>
 
<span id="line170">170.  }</span>
 
<span id="line171">171.  (void) close(fd);</span>
 
<span id="line172">172.  for(i = 1; i <= MAXLEVEL; i++) { /* try to remove all */</span>
 
<span id="line173">173.  glo(i);</span>
 
<span id="line174">174.  (void) unlink(lock);</span>
 
<span id="line175">175.  }</span>
 
<span id="line176">176.  glo(0);</span>
 
<span id="line177">177.  if(unlink(lock)) return(0); /* cannot remove it */</span>
 
<span id="line178">178.  return(1); /* success! */</span>
 
<span id="line179">179.  }</span>
 
<span id="line180">180.  </span>
 
<span id="line181">181.  getlock()</span>
 
<span id="line182">182.  {</span>
 
<span id="line183">183.  extern int errno, hackpid, locknum;</span>
 
<span id="line184">184.  register int i = 0, fd;</span>
 
<span id="line185">185.  </span>
 
<span id="line186">186.  (void) fflush(stdout);</span>
 
<span id="line187">187.  </span>
 
<span id="line188">188.  /* we ignore QUIT and INT at this point */</span>
 
<span id="line189">189.  if (link(HLOCK, LLOCK) == -1) {</span>
 
<span id="line190">190.  register int errnosv = errno;</span>
 
<span id="line191">191.  </span>
 
<span id="line192">192.  perror(HLOCK);</span>
 
<span id="line193">193.  printf("Cannot link %s to %s\n", LLOCK, HLOCK);</span>
 
<span id="line194">194.  switch(errnosv) {</span>
 
<span id="line195">195.  case ENOENT:</span>
 
<span id="line196">196.      printf("Perhaps there is no (empty) file %s ?\n", HLOCK);</span>
 
<span id="line197">197.      break;</span>
 
<span id="line198">198.  case EACCES:</span>
 
<span id="line199">199.      printf("It seems you don't have write permission here.\n");</span>
 
<span id="line200">200.      break;</span>
 
<span id="line201">201.  case EEXIST:</span>
 
<span id="line202">202.      printf("(Try again or rm %s.)\n", LLOCK);</span>
 
<span id="line203">203.      break;</span>
 
<span id="line204">204.  default:</span>
 
<span id="line205">205.      printf("I don't know what is wrong.");</span>
 
<span id="line206">206.  }</span>
 
<span id="line207">207.  getret();</span>
 
<span id="line208">208.  error("");</span>
 
<span id="line209">209.  /*NOTREACHED*/</span>
 
<span id="line210">210.  }</span>
 
<span id="line211">211.  </span>
 
<span id="line212">212.  regularize(lock);</span>
 
<span id="line213">213.  glo(0);</span>
 
<span id="line214">214.  if(locknum > 25) locknum = 25;</span>
 
<span id="line215">215.  </span>
 
<span id="line216">216.  do {</span>
 
<span id="line217">217.  if(locknum) lock[0] = 'a' + i++;</span>
 
<span id="line218">218.  </span>
 
<span id="line219">219.  if((fd = open(lock, 0)) == -1) {</span>
 
<span id="line220">220.  if(errno == ENOENT) goto gotlock;    /* no such file */</span>
 
<span id="line221">221.  perror(lock);</span>
 
<span id="line222">222.  (void) unlink(LLOCK);</span>
 
<span id="line223">223.  error("Cannot open %s", lock);</span>
 
<span id="line224">224.  }</span>
 
<span id="line225">225.  </span>
 
<span id="line226">226.  if(veryold(fd)) /* if true, this closes fd and unlinks lock */</span>
 
<span id="line227">227.  goto gotlock;</span>
 
<span id="line228">228.  (void) close(fd);</span>
 
<span id="line229">229.  } while(i < locknum);</span>
 
<span id="line230">230.  </span>
 
<span id="line231">231.  (void) unlink(LLOCK);</span>
 
<span id="line232">232.  error(locknum ? "Too many hacks running now."</span>
 
<span id="line233">233.        : "There is a game in progress under your name.");</span>
 
<span id="line234">234.  gotlock:</span>
 
<span id="line235">235.  fd = creat(lock, FMASK);</span>
 
<span id="line236">236.  if(unlink(LLOCK) == -1)</span>
 
<span id="line237">237.  error("Cannot unlink %s.", LLOCK);</span>
 
<span id="line238">238.  if(fd == -1) {</span>
 
<span id="line239">239.  error("cannot creat lock file.");</span>
 
<span id="line240">240.  } else {</span>
 
<span id="line241">241.  if(write(fd, (char *) &hackpid, sizeof(hackpid))</span>
 
<span id="line242">242.      != sizeof(hackpid)){</span>
 
<span id="line243">243.  error("cannot write lock");</span>
 
<span id="line244">244.  }</span>
 
<span id="line245">245.  if(close(fd) == -1) {</span>
 
<span id="line246">246.  error("cannot close lock");</span>
 
<span id="line247">247.  }</span>
 
<span id="line248">248.  }</span>
 
<span id="line249">249.  } </span>
 
<span id="line250">250.  </span>
 
<span id="line251">251.  #ifdef MAIL</span>
 
<span id="line252">252.  </span>
 
<span id="line253">253.  /*</span>
 
<span id="line254">254.  * Notify user when new mail has arrived. [Idea from Merlyn Leroy, but</span>
 
<span id="line255">255.  * I don't know the details of his implementation.]</span>
 
<span id="line256">256.  * { Later note: he disliked my calling a general mailreader and felt that</span>
 
<span id="line257">257.  *  hack should do the paging itself. But when I get mail, I want to put it</span>
 
<span id="line258">258.  *  in some folder, reply, etc. - it would be unreasonable to put all these</span>
 
<span id="line259">259.  *  functions in hack. }</span>
 
<span id="line260">260.  * The mail daemon '2' is at present not a real monster, but only a visual</span>
 
<span id="line261">261.  * effect. Thus, makemon() is superfluous. This might become otherwise,</span>
 
<span id="line262">262.  * however. The motion of '2' is less restrained than usual: diagonal moves</span>
 
<span id="line263">263.  * from a DOOR are possible. He might also use SDOOR's. Also, '2' is visible</span>
 
<span id="line264">264.  * in a ROOM, even when you are Blind.</span>
 
<span id="line265">265.  * Its path should be longer when you are Telepat-hic and Blind.</span>
 
<span id="line266">266.  *</span>
 
<span id="line267">267.  * Interesting side effects:</span>
 
<span id="line268">268.  * - You can get rich by sending yourself a lot of mail and selling</span>
 
<span id="line269">269.  *   it to the shopkeeper. Unfortunately mail isn't very valuable.</span>
 
<span id="line270">270.  * - You might die in case '2' comes along at a critical moment during</span>
 
<span id="line271">271.  *   a fight and delivers a scroll the weight of which causes you to</span>
 
<span id="line272">272.  *   collapse.</span>
 
<span id="line273">273.  *</span>
 
<span id="line274">274.  * Possible extensions:</span>
 
<span id="line275">275.  * - Open the file MAIL and do fstat instead of stat for efficiency.</span>
 
<span id="line276">276.  *   (But sh uses stat, so this cannot be too bad.)</span>
 
<span id="line277">277.  * - Examine the mail and produce a scroll of mail called "From somebody".</span>
 
<span id="line278">278.  * - Invoke MAILREADER in such a way that only this single letter is read.</span>
 
<span id="line279">279.  *</span>
 
<span id="line280">280.  * - Make him lose his mail when a Nymph steals the letter.</span>
 
<span id="line281">281.  * - Do something to the text when the scroll is enchanted or cancelled.</span>
 
<span id="line282">282.  */</span>
 
<span id="line283">283.  #include "mkroom.h"</span>
 
<span id="line284">284.  static struct stat omstat,nmstat;</span>
 
<span id="line285">285.  static char *mailbox;</span>
 
<span id="line286">286.  static long laststattime;</span>
 
<span id="line287">287.  </span>
 
<span id="line288">288.  getmailstatus() {</span>
 
<span id="line289">289.  if(!(mailbox = getenv("MAIL")))</span>
 
<span id="line290">290.  return;</span>
 
<span id="line291">291.  if(stat(mailbox, &omstat)){</span>
 
<span id="line292">292.  #ifdef PERMANENT_MAILBOX</span>
 
<span id="line293">293.  pline("Cannot get status of MAIL=%s .", mailbox);</span>
 
<span id="line294">294.  mailbox = 0;</span>
 
<span id="line295">295.  #else</span>
 
<span id="line296">296.  omstat.st_mtime = 0;</span>
 
<span id="line297">297.  #endif</span>
 
<span id="line298">298.  }</span>
 
<span id="line299">299.  }</span>
 
<span id="line300">300.  </span>
 
<span id="line301">301.  ckmailstatus() {</span>
 
<span id="line302">302.  if(!mailbox</span>
 
<span id="line303">303.  #ifdef MAILCKFREQ</span>
 
<span id="line304">304.      || moves < laststattime + MAILCKFREQ</span>
 
<span id="line305">305.  #endif</span>
 
<span id="line306">306.  )</span>
 
<span id="line307">307.  return;</span>
 
<span id="line308">308.  laststattime = moves;</span>
 
<span id="line309">309.  if(stat(mailbox, &nmstat)){</span>
 
<span id="line310">310.  #ifdef PERMANENT_MAILBOX</span>
 
<span id="line311">311.  pline("Cannot get status of MAIL=%s anymore.", mailbox);</span>
 
<span id="line312">312.  mailbox = 0;</span>
 
<span id="line313">313.  #else</span>
 
<span id="line314">314.  nmstat.st_mtime = 0;</span>
 
<span id="line315">315.  #endif</span>
 
<span id="line316">316.  } else if(nmstat.st_mtime > omstat.st_mtime) {</span>
 
<span id="line317">317.  if(nmstat.st_size)</span>
 
<span id="line318">318.  newmail();</span>
 
<span id="line319">319.  getmailstatus(); /* might be too late ... */</span>
 
<span id="line320">320.  }</span>
 
<span id="line321">321.  }</span>
 
<span id="line322">322.  </span>
 
<span id="line323">323.  newmail() {</span>
 
<span id="line324">324.  /* produce a scroll of mail */</span>
 
<span id="line325">325.  register struct obj *obj;</span>
 
<span id="line326">326.  register struct monst *md;</span>
 
<span id="line327">327.  extern char plname[];</span>
 
<span id="line328">328.  extern struct obj *mksobj(), *addinv();</span>
 
<span id="line329">329.  extern struct monst *makemon();</span>
 
<span id="line330">330.  extern struct permonst pm_mail_daemon;</span>
 
<span id="line331">331.  </span>
 
<span id="line332">332.  obj = mksobj(SCR_MAIL);</span>
 
<span id="line333">333.  if(md = makemon(&pm_mail_daemon, u.ux, u.uy)) /* always succeeds */</span>
 
<span id="line334">334.  mdrush(md,0);</span>
 
<span id="line335">335.  </span>
 
<span id="line336">336.  pline("\"Hello, %s! I have some mail for you.\"", plname);</span>
 
<span id="line337">337.  if(md) {</span>
 
<span id="line338">338.  if(dist(md->mx,md->my) > 2)</span>
 
<span id="line339">339.  pline("\"Catch!\"");</span>
 
<span id="line340">340.  more();</span>
 
<span id="line341">341.  </span>
 
<span id="line342">342.  /* let him disappear again */</span>
 
<span id="line343">343.  mdrush(md,1);</span>
 
<span id="line344">344.  mondead(md);</span>
 
<span id="line345">345.  }</span>
 
<span id="line346">346.  </span>
 
<span id="line347">347.  obj = addinv(obj);</span>
 
<span id="line348">348.  (void) identify(obj); /* set known and do prinv() */</span>
 
<span id="line349">349.  }</span>
 
<span id="line350">350.  </span>
 
<span id="line351">351.  /* make md run through the cave */</span>
 
<span id="line352">352.  mdrush(md,away)</span>
 
<span id="line353">353.  register struct monst *md;</span>
 
<span id="line354">354.  boolean away;</span>
 
<span id="line355">355.  {</span>
 
<span id="line356">356.  register int uroom = inroom(u.ux, u.uy);</span>
 
<span id="line357">357.  if(uroom >= 0) {</span>
 
<span id="line358">358.  register int tmp = rooms[uroom].fdoor;</span>
 
<span id="line359">359.  register int cnt = rooms[uroom].doorct;</span>
 
<span id="line360">360.  register int fx = u.ux, fy = u.uy;</span>
 
<span id="line361">361.  while(cnt--) {</span>
 
<span id="line362">362.  if(dist(fx,fy) < dist(doors[tmp].x, doors[tmp].y)){</span>
 
<span id="line363">363.  fx = doors[tmp].x;</span>
 
<span id="line364">364.  fy = doors[tmp].y;</span>
 
<span id="line365">365.  }</span>
 
<span id="line366">366.  tmp++;</span>
 
<span id="line367">367.  }</span>
 
<span id="line368">368.  tmp_at(-1, md->data->mlet); /* open call */</span>
 
<span id="line369">369.  if(away) { /* interchange origin and destination */</span>
 
<span id="line370">370.  unpmon(md);</span>
 
<span id="line371">371.  tmp = fx; fx = md->mx; md->mx = tmp;</span>
 
<span id="line372">372.  tmp = fy; fy = md->my; md->my = tmp;</span>
 
<span id="line373">373.  }</span>
 
<span id="line374">374.  while(fx != md->mx || fy != md->my) {</span>
 
<span id="line375">375.  register int dx,dy,nfx = fx,nfy = fy,d1,d2;</span>
 
<span id="line376">376.  </span>
 
<span id="line377">377.  tmp_at(fx,fy);</span>
 
<span id="line378">378.  d1 = DIST(fx,fy,md->mx,md->my);</span>
 
<span id="line379">379.  for(dx = -1; dx <= 1; dx++) for(dy = -1; dy <= 1; dy++)</span>
 
<span id="line380">380.      if(dx || dy) {</span>
 
<span id="line381">381.  d2 = DIST(fx+dx,fy+dy,md->mx,md->my);</span>
 
<span id="line382">382.  if(d2 < d1) {</span>
 
<span id="line383">383.      d1 = d2;</span>
 
<span id="line384">384.      nfx = fx+dx;</span>
 
<span id="line385">385.      nfy = fy+dy;</span>
 
<span id="line386">386.  }</span>
 
<span id="line387">387.      }</span>
 
<span id="line388">388.  if(nfx != fx || nfy != fy) {</span>
 
<span id="line389">389.      fx = nfx;</span>
 
<span id="line390">390.      fy = nfy;</span>
 
<span id="line391">391.  } else {</span>
 
<span id="line392">392.      if(!away) {</span>
 
<span id="line393">393.  md->mx = fx;</span>
 
<span id="line394">394.  md->my = fy;</span>
 
<span id="line395">395.      }</span>
 
<span id="line396">396.      break;</span>
 
<span id="line397">397.  } </span>
 
<span id="line398">398.  }</span>
 
<span id="line399">399.  tmp_at(-1,-1); /* close call */</span>
 
<span id="line400">400.  }</span>
 
<span id="line401">401.  if(!away)</span>
 
<span id="line402">402.  pmon(md);</span>
 
<span id="line403">403.  }</span>
 
<span id="line404">404.  </span>
 
<span id="line405">405.  readmail() {</span>
 
<span id="line406">406.  #ifdef DEF_MAILREADER /* This implies that UNIX is defined */</span>
 
<span id="line407">407.  register char *mr = 0;</span>
 
<span id="line408">408.  more();</span>
 
<span id="line409">409.  if(!(mr = getenv("MAILREADER")))</span>
 
<span id="line410">410.  mr = DEF_MAILREADER;</span>
 
<span id="line411">411.  if(child(1)){</span>
 
<span id="line412">412.  execl(mr, mr, (char *) 0);</span>
 
<span id="line413">413.  exit(1);</span>
 
<span id="line414">414.  }</span>
 
<span id="line415">415.  #else</span>
 
<span id="line416">416.  (void) page_file(mailbox, FALSE);</span>
 
<span id="line417">417.  #endif</span>
 
<span id="line418">418.  /* get new stat; not entirely correct: there is a small time</span>
 
<span id="line419">419.    window where we do not see new mail */</span>
 
<span id="line420">420.  getmailstatus();</span>
 
<span id="line421">421.  }</span>
 
<span id="line422">422.  #endif /* MAIL /**/</span>
 
<span id="line423">423.  </span>
 
<span id="line424">424.  regularize(s) /* normalize file name - we don't like ..'s or /'s */</span>
 
<span id="line425">425.  register char *s;</span>
 
<span id="line426">426.  {</span>
 
<span id="line427">427.  register char *lp;</span>
 
<span id="line428">428.  </span>
 
<span id="line429">429.  while((lp = index(s, '.')) || (lp = index(s, '/')))</span>
 
<span id="line430">430.  *lp = '_';</span>
 
<span id="line431">431.  }</span>
 
[[Category:NetHack 1.4f source code|unixunix.c]]
 

Revision as of 20:53, 3 September 2006

The source code file unixunix.c in NetHack 1.4f is unchanged from NetHack 1.3d/unixunix.c.