/*
 * include stuff for x11 discuss program
 */

/* Compiler- and machine-specific code
 * %!$@# broken compilers!!!
 */
#if defined(mips) && !defined(__GNUC__)
#define const
#endif

#define ALLOCA 0

#if defined(__GNUC__)

#if defined(__vax__) && defined(INLINE)
static inline int _Istrlen (const char * s) {
    const char *s1;
    s1 = s;
    do {
	s1++;
    } while (*s1);
    return (s1 - s);
}
#define strlen(s) _Istrlen(s)

static inline void _Imemmove (const void *src, void *dest, unsigned size) {
    while (size > 65535) {
	asm ("movc3 65535,(%1),(%2)"
	     : "=m" (*(void *)0)
	     : "r" (src), "r" (dest));
	size -= 65535;
    }
    asm ("movc3 %1,(%2),(%3)"
	 : "=m" (*(void *)0)
	 : "g" (size), "r" (src), "r" (dest));
}
#define memcpy(a,b,c) _Imemmove(a,b,c)
/*#define memmove(a,b,c) _Imemmove(a,b,c)*/

static inline void _Ibzero (void *ptr, unsigned len) {
    char *cp = ptr;
    int n = len;
    while (n >= 0)
	cp[n--] = '\0';
}
#define bzero(p,l) _Ibzero(p,l)

static inline char * _Istrdup (const char *s) {
    unsigned len = strlen (s) + 1;
    char *s1 = malloc (len);
    bcopy (s, s1, len);
    return s1;
}
#define strdup(s) _Istrdup(s)

static inline void * _Icalloc (unsigned num, unsigned size) {
    void *area;
    area = malloc (num * size);
    if (area)
	bzero (area, num * size);
    return area;
}
#define calloc(n,s) _Icalloc(n,s)

static inline char * _Istrchr (const char *s, int c) {
    while (*s) {
	if (*s == c)
	    return (char *) s;
	s++;
    }
    return (char *) NULL;
}
#define strchr(s,c) _Istrchr(s,c)

static inline char * _Istrrchr (const char *s, int c) {
    char *s1 = NULL;
    while (*s) {
	if (*s == c)
	    s1 = (char *) s;
	s++;
    }
    return s1;
}
#define strrchr(s,c) _Istrrchr(s,c)
#endif /* __vax__ */

#undef alloca
#undef abs
#undef index
#undef rindex
#define alloca(x) __builtin_alloca(x)
#define abs(x) __builtin_abs(x)
#define index(s,c) strchr(s,c)
#define rindex(s,c) strrchr(s,c)
void *alloca (int);
#undef ALLOCA
#define ALLOCA 1

#endif /* __GNUC__ */

#if defined(__HIGHC__)
pragma on(READ_ONLY_STRINGS);
#define alloca(x) _Alloca(x)
/*pragma on(alloca);*/
#undef ALLOCA
#define ALLOCA 1
#endif

#if defined(mips) && !defined (__GNUC__)
#undef ALLOCA
#define ALLOCA 1
extern char *alloc ();
#endif

#if ! ALLOCA
??!error "This code requires that alloca() be available.  You lose."
#endif /* ! ALLOCA */
/* end compiler-specific code */

/* Generic stuff.  */
extern void XtAppMainLoop (struct _XtAppStruct *);

char *strdup(const char *source);
void *calloc(unsigned, unsigned), *malloc(unsigned);

extern struct _XtAppStruct * app_context;
extern struct _WidgetRec * toplevel;
extern const char *whoami, **argv;
extern char const version[];

extern struct _WidgetRec * big_w;

extern struct _WidgetRec * box;
extern struct _WidgetRec * cmd_box;
extern struct _WidgetRec * set_up_a_button_box();

extern struct _XDisplay *dpy;
extern int screen;

void delete_mtg_from_list (struct _WidgetRec * w);
void delete_all_meetings (void);

struct button_info;

#ifdef __DISCUSS_H__
struct button_info {
    name_blk nb;
    mtg_info mtg;
    struct _WidgetRec * button;
    char *label;		/* Primary_Name (second_name, nth_name) */
    int error;
};
#endif

extern int vert_bbox;
extern int n_mtgs;
extern int one_win;
extern struct button_info *meeting_list;

int select_mtg (struct _WidgetRec * w, caddr_t close, caddr_t call);

extern Widget XtCreateManagedWidget (const char *name,
				     WidgetClass widget_class,
				     Widget parent,
				     const Arg * args,
				     Cardinal num_args);

extern void XtSetValues (Widget w, const Arg * args, Cardinal num_args);

extern Widget XtCreatePopupShell (const char *name,
				  WidgetClass widget_class,
				  Widget parent,
				  ArgList args,
				  Cardinal num_args);


#define XDSC_CURSOR XC_trek
