#include <linux/ioctl.h>
#include <linux/cdev.h>

/*
 * Macros to help debugging
 */

#undef PDEBUG             /* undef it, just in case */
#ifdef PSTACKDEV_DEBUG
#  ifdef __KERNEL__
     /* This one if debugging is on, and kernel space */
#    define PDEBUG(fmt, args...) printk( KERN_DEBUG "pstackdev: " fmt, ## args)
#  else
     /* This one for user space */
#    define PDEBUG(fmt, args...) fprintf(stderr, fmt, ## args)
#  endif
#else
#  define PDEBUG(fmt, args...) /* not debugging: nothing */
#endif

#undef PDEBUGG
#define PDEBUGG(fmt, args...) /* nothing: it's a placeholder */

#define PSTACKDEV_MAJOR 120   /* dynamic major by default */

#define PSTACKDEV_DEVS 16    /* pstackdev0 through pstackdev3 */
#define PSTACKDEV_MAXELEMENTS 100
#define PSTACKDEV_RECSIZE 1000

struct pstackdevrec {
	int size;
	char data[0];
};

struct pstackinfo {
	int recsize;
	int maxelements;
};

struct pstackdev_item {
	void *data;
	int size;
	struct pstackdev_item *next;
};

struct pstackdev_dev {
	struct pstackdev_item *top;
	size_t size;              /* Number of items in the stack */
	struct pstackinfo info;
	struct semaphore sem;     /* Mutual exclusion */
	struct cdev cdev;
};

extern struct pstackdev_dev *pstackdev_devices;

extern struct file_operations pstackdev_fops;

/*
 * The different configurable parameters
 */
extern int pstackdev_major;     /* main.c */
extern int pstackdev_devs;
extern int pstackdev_maxelements;
extern int pstackdev_recsize;

/*
 * Prototypes for shared functions
 */
/*
int pstackdev_trim(struct pstackdev_dev *dev);
struct pstackdev_dev *pstackdev_follow(struct pstackdev_dev *dev, int n);
*/


#ifdef PSTACKDEV_DEBUG
#  define PSTACKDEV_USE_PROC
#endif

/*
 * Ioctl definitions
 */

/* Use '>' as magic number */
#define PSTACKDEV_IOC_MAGIC  '>'

#define PSTACKDEV_IOCFREE    _IO(PSTACKDEV_IOC_MAGIC, 0)
#define PSTACKDEV_IOCINIT    _IOW(PSTACKDEV_IOC_MAGIC, 1,struct pstackinfo *)
#define PSTACKDEV_IOC_MAXNR 1

