/*
cain.h
$Id$
Declares my local functions
*/

#include <stdio.h> /* for FILE */

extern void FATAL(const char *, const char *, ...);
extern const char *cash(long, int, int, int);
extern const char *cash_words(long);
extern long atocash(const char *, int);
extern const char *num_word(int);
extern long expr(const char *str);
extern char *cgetline(FILE *fp, char *buf);
extern char *sgetline(FILE *fp, char *buf);
extern char *xgetline(FILE *fp, char *buf, size_t *linenum);
extern void xgetline_cchar(char c);
extern int xputline(FILE *, const char *);
extern int initarg(int argc, char **argv);
extern int initarge(int argc, char **argv);
extern int getarg(const char *opts);
extern char *xoptarg;

typedef struct _stack
{
    char *str;
    struct _stack *next;
} STACK;

extern STACK *LIFO_put(STACK *, const char *);
extern STACK *FIFO_put(STACK *, const char *);
extern STACK *STACK_pop(STACK *);
extern void   STACK_clear(STACK *);

#define LIFO_pop(stack) STACK_pop(stack)
#define FIFO_pop(stack) STACK_pop(stack)

typedef struct _memory
{
    long unsigned magic;
    size_t length;
    size_t index;
    char *usermem;
} MEMORY;

extern MEMORY * MEM_alloc(size_t);
extern MEMORY * MEM_realloc(MEMORY *, size_t);
extern void     MEM_free(MEMORY *);
MEMORY        * MEM_copy(MEMORY *, const char *);
MEMORY        * MEM_extend(MEMORY *, const char *);
MEMORY        * MEM_putc(MEMORY *, const char);
#define         MEM_size(mem) mem->length
#define         MEM_MAGIC (long unsigned) 0xdcai
#define         MEM_CHUNK 1024
