ldmud-3.2.9/doc/
ldmud-3.2.9/doc/efun/
ldmud-3.2.9/mud/
ldmud-3.2.9/mud/heaven7/
ldmud-3.2.9/mud/heaven7/lib/
ldmud-3.2.9/mud/lp-245/
ldmud-3.2.9/mud/lp-245/banish/
ldmud-3.2.9/mud/lp-245/doc/
ldmud-3.2.9/mud/lp-245/doc/examples/
ldmud-3.2.9/mud/lp-245/doc/sefun/
ldmud-3.2.9/mud/lp-245/log/
ldmud-3.2.9/mud/lp-245/obj/Go/
ldmud-3.2.9/mud/lp-245/players/lars/
ldmud-3.2.9/mud/lp-245/room/death/
ldmud-3.2.9/mud/lp-245/room/maze1/
ldmud-3.2.9/mud/lp-245/room/sub/
ldmud-3.2.9/mud/lp-245/secure/
ldmud-3.2.9/mud/morgengrauen/
ldmud-3.2.9/mud/morgengrauen/lib/
ldmud-3.2.9/mud/sticklib/
ldmud-3.2.9/mud/sticklib/src/
ldmud-3.2.9/mudlib/uni-crasher/
ldmud-3.2.9/pkg/
ldmud-3.2.9/pkg/debugger/
ldmud-3.2.9/pkg/diff/
ldmud-3.2.9/pkg/misc/
ldmud-3.2.9/src/autoconf/
ldmud-3.2.9/src/bugs/
ldmud-3.2.9/src/bugs/MudCompress/
ldmud-3.2.9/src/bugs/b-020916-files/
ldmud-3.2.9/src/bugs/doomdark/
ldmud-3.2.9/src/bugs/ferrycode/ferry/
ldmud-3.2.9/src/bugs/ferrycode/obj/
ldmud-3.2.9/src/bugs/psql/
ldmud-3.2.9/src/done/
ldmud-3.2.9/src/done/order_alist/
ldmud-3.2.9/src/done/order_alist/obj/
ldmud-3.2.9/src/done/order_alist/room/
ldmud-3.2.9/src/gcc/
ldmud-3.2.9/src/gcc/2.7.0/
ldmud-3.2.9/src/gcc/2.7.1/
ldmud-3.2.9/src/hosts/
ldmud-3.2.9/src/hosts/GnuWin32/
ldmud-3.2.9/src/hosts/amiga/NetIncl/
ldmud-3.2.9/src/hosts/amiga/NetIncl/netinet/
ldmud-3.2.9/src/hosts/amiga/NetIncl/sys/
ldmud-3.2.9/src/hosts/i386/
ldmud-3.2.9/src/hosts/msdos/byacc/
ldmud-3.2.9/src/hosts/msdos/doc/
ldmud-3.2.9/src/hosts/os2/
ldmud-3.2.9/src/hosts/win32/
ldmud-3.2.9/src/util/
ldmud-3.2.9/src/util/erq/
ldmud-3.2.9/src/util/indent/hosts/next/
ldmud-3.2.9/src/util/xerq/
ldmud-3.2.9/src/util/xerq/lpc/
ldmud-3.2.9/src/util/xerq/lpc/www/
#ifndef STRALLOC_H_
#define STRALLOC_H_ 1

#include "driver.h"
#include "strfuns.h"
#ifdef MALLOC_smalloc
#include "smalloc.h"
#endif
#if defined(DEBUG) && !defined(NO_REF_STRING)
#include "main.h" /* for dprintf*() */
#endif

/* --- Macros --- */

#define SHSTR_OVERHEAD  (sizeof(StrRefCount) + sizeof(char *))
  /* Overhead of a shared string, used in interpret:apply_low()
   * for a heuristic.
   */

#define SHSTR_NEXT(str) \
  (*(char **)((char *) (str) - sizeof(StrRefCount) - sizeof(char *)))

  /* char* SHSTR_NEXT(char*): return the pointer to the next string
   * in the same hash chain.
   */

#define SHSTR_REFS(str) \
  (*(StrRefCount *)((char *) (str) - sizeof(StrRefCount)))

  /* ushort SHSTR_REFS(char*): return the number of refs to this string.
   */

#define SHSTR_BLOCK(str) \
  ((char *)(str) - sizeof(StrRefCount) - sizeof(char *))

  /* char* SHSTR_BLOCK(char*): return a pointer to the first byte
   * of the memory area of this string.
   */

#ifdef MALLOC_smalloc

#define shstr_malloced_length(str) ( *( \
        (p_uint *)(str-sizeof(char*)-sizeof(StrRefCount))\
        - SMALLOC_OVERHEAD) - SMALLOC_OVERHEAD )
#else

#define malloc_size_mask() (~0)

#define shstr_malloced_length(str) (\
        (sizeof(char*) + sizeof(char *) + sizeof(StrRefCount) +\
        strlen(str) + 1 + sizeof(char *) - 1) / sizeof(char *) - 1)

#endif

/* --- Prototypes --- */
extern void init_shared_strings(void);

extern char  *findstring(const char *s);
extern char  *make_shared_string(const char *str);
extern void   deref_string(char *str);
extern void   free_string(char *str);
extern mp_int add_string_status(strbuf_t *sbuf, Bool verbose);
extern void   string_dinfo_status(svalue_t *svp, int value);

#ifdef GC_SUPPORT

extern void clear_shared_string_refs(void);
extern void note_shared_string_table_ref(void);
extern void walk_shared_strings(void (*func)(char *, char *) );

#endif /* GC_SUPPORT */

#ifdef CHECK_STRINGS

extern void check_string_table (void);
extern void ref_shadow_string (char *s);

#ifdef GC_SUPPORT

extern void mark_shadow_string_ref (char *s);
extern void inc_shadow_string_ref (char *s);

#endif /* GC_SUPPORT */

#endif /* CHECK_STRINGS */


/* --- Inline functions --- */

#if !defined(NO_REF_STRING)

extern mp_uint stralloc_allocd_strings;
extern mp_uint stralloc_allocd_bytes;

static INLINE char *ref_string(char * str) /* TODO: UNUSED */;

static INLINE char *
ref_string(char *str)
{
    stralloc_allocd_strings++;
    stralloc_allocd_bytes += shstr_malloced_length(str);
    if (SHSTR_REFS(str))
    {
        SHSTR_REFS(str)++;
#ifdef DEBUG
        if (!SHSTR_REFS(str))
            dprintf2(2, "DEBUG: ref_string(): %x '%s' refcount reaches max!\n"
                    , (p_int)str, (p_int)str);
    }
    else
    {
        dprintf2(2, "DEBUG: ref_string(): %x '%s' has 0 refs.\n"
                , (p_int)str, (p_int)str);
#endif
    }
#ifdef CHECK_STRINGS
    ref_shadow_string(str);
#endif
    return str;
}
#endif

#endif /* STRALLOC_H_ */