Difference between revisions of "Source:NetHack 3.4.3/src/alloc.c"

From NetHackWiki
Jump to navigation Jump to search
m (Add headers.)
m (Automated source code upload)
Line 1: Line 1:
Below is the full text to src/alloc.c from NetHack 3.4.3. To link to a particular line, write [[alloc.c#line123|<nowiki>[[alloc.c#line123]]</nowiki>]], for example.
+
The source code file '''alloc.c''' in [[NetHack 1.4f source code|NetHack 1.4f]] is unchanged from [[NetHack 1.3d/alloc.c]].
 
+
[[Category:NetHack 1.4f source code]]
== Top of file==
 
<span id="line1">1.   /* SCCS Id: @(#)alloc.c 3.4 1995/10/04 */</span>
 
<span id="line2">2.    /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */</span>
 
<span id="line3">3.    /* NetHack may be freely redistributed.  See license for details. */</span>
 
<span id="line4">4.    </span>
 
 
 
{{NGPL}}
 
 
 
<span id="line5">5.    /* to get the malloc() prototype from system.h */</span>
 
<span id="line6">6.    #define ALLOC_C /* comment line for pre-compiled headers */</span>
 
<span id="line7">7.    /* since this file is also used in auxiliary programs, don't include all the</span>
 
<span id="line8">8.    * function declarations for all of nethack</span>
 
<span id="line9">9.    */</span>
 
<span id="line10">10.  #define EXTERN_H /* comment line for pre-compiled headers */</span>
 
<span id="line11">11.  #include "config.h"</span>
 
<span id="line12">12.  </span>
 
<span id="line13">13.  #if defined(MONITOR_HEAP) || defined(WIZARD)</span>
 
<span id="line14">14.  char *FDECL(fmt_ptr, (const genericptr,char *));</span>
 
<span id="line15">15.  #endif</span>
 
<span id="line16">16.  </span>
 
<span id="line17">17.  #ifdef MONITOR_HEAP</span>
 
<span id="line18">18.  #undef alloc</span>
 
<span id="line19">19.  #undef free</span>
 
<span id="line20">20.  extern void FDECL(free,(genericptr_t));</span>
 
<span id="line21">21.  static void NDECL(heapmon_init);</span>
 
<span id="line22">22.  </span>
 
<span id="line23">23.  static FILE *heaplog = 0;</span>
 
<span id="line24">24.  static boolean tried_heaplog = FALSE;</span>
 
<span id="line25">25.  #endif</span>
 
<span id="line26">26.  </span>
 
<span id="line27">27.  long *FDECL(alloc,(unsigned int));</span>
 
<span id="line28">28.  extern void VDECL(panic, (const char *,...)) PRINTF_F(1,2);</span>
 
<span id="line29">29.  </span>
 
<span id="line30">30.  </span>
 
 
 
== alloc ==
 
 
 
<span id="line31">31.  long *</span>
 
<span id="line32">32.  alloc(lth)</span>
 
<span id="line33">33.  register unsigned int lth;</span>
 
<span id="line34">34.  {</span>
 
<span id="line35">35.  #ifdef LINT</span>
 
<span id="line36">36.  /*</span>
 
<span id="line37">37.    * a ridiculous definition, suppressing</span>
 
<span id="line38">38.    * "possible pointer alignment problem" for (long *) malloc()</span>
 
<span id="line39">39.    * from lint</span>
 
<span id="line40">40.    */</span>
 
<span id="line41">41.  long dummy = ftell(stderr);</span>
 
<span id="line42">42.  </span>
 
<span id="line43">43.  if(lth) dummy = 0; /* make sure arg is used */</span>
 
<span id="line44">44.  return(&dummy);</span>
 
<span id="line45">45.  #else</span>
 
<span id="line46">46.  register genericptr_t ptr;</span>
 
<span id="line47">47.  </span>
 
<span id="line48">48.  ptr = malloc(lth);</span>
 
<span id="line49">49.  #ifndef MONITOR_HEAP</span>
 
<span id="line50">50.  if (!ptr) panic("Memory allocation failure; cannot get %u bytes", lth);</span>
 
<span id="line51">51.  #endif</span>
 
<span id="line52">52.  return((long *) ptr);</span>
 
<span id="line53">53.  #endif</span>
 
<span id="line54">54.  }</span>
 
<span id="line55">55.  </span>
 
<span id="line56">56.  </span>
 
 
 
== fmt_ptr ==
 
 
 
<span id="line57">57.  #if defined(MONITOR_HEAP) || defined(WIZARD)</span>
 
<span id="line58">58.  </span>
 
<span id="line59">59.  # if defined(MICRO) || defined(WIN32)</span>
 
<span id="line60">60.  /* we actually want to know which systems have an ANSI run-time library</span>
 
<span id="line61">61.    * to know which support the new %p format for printing pointers.</span>
 
<span id="line62">62.    * due to the presence of things like gcc, NHSTDC is not a good test.</span>
 
<span id="line63">63.    * so we assume microcomputers have all converted to ANSI and bigger</span>
 
<span id="line64">64.    * computers which may have older libraries give reasonable results with</span>
 
<span id="line65">65.    * the cast.</span>
 
<span id="line66">66.    */</span>
 
<span id="line67">67.  #  define MONITOR_PTR_FMT</span>
 
<span id="line68">68.  # endif</span>
 
<span id="line69">69.  </span>
 
<span id="line70">70.  # ifdef MONITOR_PTR_FMT</span>
 
<span id="line71">71.  #  define PTR_FMT "%p"</span>
 
<span id="line72">72.  #  define PTR_TYP genericptr_t</span>
 
<span id="line73">73.  # else</span>
 
<span id="line74">74.  #  define PTR_FMT "%06lx"</span>
 
<span id="line75">75.  #  define PTR_TYP unsigned long</span>
 
<span id="line76">76.  # endif</span>
 
<span id="line77">77.  </span>
 
<span id="line78">78.  /* format a pointer for display purposes; caller supplies the result buffer */</span>
 
<span id="line79">79.  char *</span>
 
<span id="line80">80.  fmt_ptr(ptr, buf)</span>
 
<span id="line81">81.  const genericptr ptr;</span>
 
<span id="line82">82.  char *buf;</span>
 
<span id="line83">83.  {</span>
 
<span id="line84">84.  Sprintf(buf, PTR_FMT, (PTR_TYP)ptr);</span>
 
<span id="line85">85.  return buf;</span>
 
<span id="line86">86.  }</span>
 
<span id="line87">87.  </span>
 
<span id="line88">88.  #endif</span>
 
<span id="line89">89.  </span>
 
 
 
== heapmon_init ==
 
 
 
<span id="line90">90.  #ifdef MONITOR_HEAP</span>
 
<span id="line91">91.  </span>
 
<span id="line92">92.  /* If ${NH_HEAPLOG} is defined and we can create a file by that name,</span>
 
<span id="line93">93.      then we'll log the allocation and release information to that file. */</span>
 
<span id="line94">94.  static void</span>
 
<span id="line95">95.  heapmon_init()</span>
 
<span id="line96">96.  {</span>
 
<span id="line97">97.  char *logname = getenv("NH_HEAPLOG");</span>
 
<span id="line98">98.  </span>
 
<span id="line99">99.  if (logname && *logname)</span>
 
<span id="line100">100.  heaplog = fopen(logname, "w");</span>
 
<span id="line101">101.  tried_heaplog = TRUE;</span>
 
<span id="line102">102.  }</span>
 
<span id="line103">103.  </span>
 
 
 
== nhalloc ==
 
 
 
<span id="line104">104.  long *</span>
 
<span id="line105">105.  nhalloc(lth, file, line)</span>
 
<span id="line106">106.  unsigned int lth;</span>
 
<span id="line107">107.  const char *file;</span>
 
<span id="line108">108.  int line;</span>
 
<span id="line109">109.  {</span>
 
<span id="line110">110.  long *ptr = alloc(lth);</span>
 
<span id="line111">111.  char ptr_address[20];</span>
 
<span id="line112">112.  </span>
 
<span id="line113">113.  if (!tried_heaplog) heapmon_init();</span>
 
<span id="line114">114.  if (heaplog)</span>
 
<span id="line115">115.  (void) fprintf(heaplog, "+%5u %s %4d %s\n", lth,</span>
 
<span id="line116">116.  fmt_ptr((genericptr_t)ptr, ptr_address),</span>
 
<span id="line117">117.  line, file);</span>
 
<span id="line118">118.  /* potential panic in alloc() was deferred til here */</span>
 
<span id="line119">119.  if (!ptr) panic("Cannot get %u bytes, line %d of %s",</span>
 
<span id="line120">120.  lth, line, file);</span>
 
<span id="line121">121.  </span>
 
<span id="line122">122.  return ptr;</span>
 
<span id="line123">123.  }</span>
 
<span id="line124">124.  </span>
 
 
 
== nhfree ==
 
 
 
<span id="line125">125.  void</span>
 
<span id="line126">126.  nhfree(ptr, file, line)</span>
 
<span id="line127">127.  genericptr_t ptr;</span>
 
<span id="line128">128.  const char *file;</span>
 
<span id="line129">129.  int line;</span>
 
<span id="line130">130.  {</span>
 
<span id="line131">131.  char ptr_address[20];</span>
 
<span id="line132">132.  </span>
 
<span id="line133">133.  if (!tried_heaplog) heapmon_init();</span>
 
<span id="line134">134. if (heaplog)</span>
 
<span id="line135">135.  (void) fprintf(heaplog, "-      %s %4d %s\n",</span>
 
<span id="line136">136.  fmt_ptr((genericptr_t)ptr, ptr_address),</span>
 
<span id="line137">137.  line, file);</span>
 
<span id="line138">138.  </span>
 
<span id="line139">139.  free(ptr);</span>
 
<span id="line140">140.  }</span>
 
<span id="line141">141.  </span>
 
<span id="line142">142.  #endif /* MONITOR_HEAP */</span>
 
<span id="line143">143.  </span>
 
<span id="line144">144.  /*alloc.c*/</span>
 
[[Category:source code]]
 

Revision as of 20:36, 3 September 2006

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