lpc4/lib/
lpc4/lib/doc/efun/
lpc4/lib/doc/lfun/
lpc4/lib/doc/operators/
lpc4/lib/doc/simul_efuns/
lpc4/lib/doc/types/
lpc4/lib/etc/
lpc4/lib/include/
lpc4/lib/include/arpa/
lpc4/lib/obj/d/
lpc4/lib/save/
lpc4/lib/secure/
lpc4/lib/std/
lpc4/lib/std/living/
#ifndef STRALLOC_H
#define STRALLOC_H
#include "interpret.h"

struct shared
{
#ifndef STRALLOC_GC
  int refs;
#ifdef DEBUG
  int extra_ref;
#endif
#endif
  char *next;
  int size;
  char str[1]; /* Must be last */
};

#define REFERENCE(X,Y) (BASEOF(X,shared,str)Y)

#define BASE(X) REFERENCE(X,)
#define SIZE(X) REFERENCE(X,->size)
#define REFS(X) REFERENCE(X,->refs)
#define STR(X) REFERENCE(X,->str)
#define XREF(X) REFERENCE(X,->extra_ref)
#define NEXT(X) REFERENCE(X,->next)
#define MEMORY_SIZE(X) (SIZE(X)+sizeof(shared)-1)

#ifndef DEBUG
#define my_strlen2(u) ((u).string->size)
#define my_strlen(s) my_strlen2(((s)->u))

#ifdef STRALLOC_GC
#define copy_shared_string(str) (str)
#define free_string(str) 
#else
#define copy_shared_string(str) (REFS(str)++,str)

#ifdef STRALLOC_REFS
#define free_string(X) { char *str=(X); if(!--REFS(str))  really_free_string(str); }
#else
#define free_string(X) --REFS(str)
#endif /* STRALLOC_REFS */

#endif /* STRALLOC_GC */

#else
int my_strlen2(const union storage_union u);
int my_strlen(const struct svalue *s);
void free_string PROT((char *));
char *copy_shared_string PROT((char *));
#endif /* DEBUG */

char *make_shared_string PROT((const char *));
INLINE int my_strcmp(const struct svalue *a,const struct svalue *b);
INLINE int my_string_is_equal(const struct svalue *a,const struct svalue *b) ATTRIBUTE((const));

char *findstring(const char *);
char *make_shared_binary_string(const char *str,int len);
char *debug_findstring(const char *foo);
char *begin_shared_string(int len);
char *end_shared_string(char *s);
char *add_string_status PROT((int verbose));
void uninit_strings(void);
void stralloc_gc(int);
extern int ref_cycle;
void not_backend_stralloc_gc();
#define strptr2(u) (&((u).string->str[0]))
#define strptr(s) (&((s)->u.string->str[0]))
#endif /* STRALLOC_H */