/* $Id: nifty.h,v 3.3 1994/05/14 12:37:26 ppessi Exp $
 *
 * nifty.h -- useful macros, etc.
 *
 * Authors: Chris Newman, ppessi <Pekka.Pessi@hut.fi>
 *
 * Copyright (c) 1993 AmiTCP/IP Group, <amitcp-group@hut.fi>
 *                    Helsinki University of Technology, Finland.
 *                    All rights reserved.
 *
 * See file COPYING for conditions to copy, modify and use this program.
 *
 * Copyright 1988, Chris Newman
 * All Rights Reserved
 * Permission is granted to copy, modify, and use this as long
 * as this notice remains intact.  This is a nifty program.
 *
 * Some of these #defines were swiped from various places
 *
 * DISCLAIMER: the author (and maintainer) of this program is not responsible
 * for any damage or other problems caused by it.
 */

#ifndef NIFTY_H
#define NIFTY_H

#define PROGNAME "Napsaterm"

extern const char ProgName[];

#ifndef NAPSA_CONFIG_H
#include "config.h"
#endif

/* types */
#define	Boolean int
typedef	char    BOOLEAN;
typedef	unsigned short ushort;
typedef	unsigned char  uchar;

/* constants */
#undef CTRL
#define CTRL(a) ((a) & 0x1f)
#define CTRL8(a) ((a) & 0x1f | 0x80)
#define	ESC	'\033'
#define	DEL	'\177'

/* bound and limit macros */
#define	SLIMIT(a, b)	    ((a) >= (b) ? ((a) = (b) - 1) : (a))
#define	SLIMITCK(a, b)	    if ((a) >= (b)) (a) = (b) - 1
#define	MAXBOUND(a, b)	    ((a) > (b) ? (a) = (b): (a))
#define	MAXBOUNDCK(a, b)    if ((a) > (b)) (a) = (b)
#define	MINBOUND(a, b)	    ((a) < (b) ? (a) = (b): (a))
#define	MINBOUNDCK(a, b)    if ((a) < (b)) (a) = (b)
#define	BOUNDS(a, l, h)	    ((a) < (l) ? (a) = (l) : ((a) > (h) ? (a) = (h) : (a)))
#define	BOUNDSCK(a, l, h)   if ((a) < (l)) (a) = (l); else if ((a) > (h)) (a) = (h)

/* useful macros */
#undef ABS
#undef MIN
#undef MAX
#define	ABS(a)	    ((a) < 0 ? -(a) : (a))
#define	MAX(a, b)   ((a) > (b) ? (a) : (b))
#define	MIN(a, b)   ((a) < (b) ? (a) : (b))
#define	XSWAP(a, b) ((a) ^= (b), (b) ^= (a), (a) ^= (b))
#define SWAP(a, b)  {register int xxx = a; a = b; b = xxx;}
#define	XOR(a, b)   ( ((a) ? 1 : 0) ^ ((b) ? 1 : 0) )

/* case macros */
#define	ISDIGIT	     '0': case '1': case '2': case '3': case '4': case '5': \
      case '6': case '7': case '8': case '9'
#define	ISUPPER	     'A': case 'B': case 'C': case 'D': case 'E': case 'F': \
      case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': \
      case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': \
      case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z'
#define	ISLOWER	     'a': case 'b': case 'c': case 'd': case 'e': case 'f': \
      case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': \
      case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': \
      case 'u': case 'v': case 'w': case 'x': case 'y': case 'z'
#define	ISALPHA	    ISUPPER: case ISLOWER
#define	PRINTABLE    ' ': case '!': case '"': case '#': case '$': case '%': \
      case '&': case'\'': case '(': case ')': case '*': case '+': case ',': \
      case '-': case '.': case '/': case ':': case ';': case ISDIGIT: \
      case '<': case '=': case '>': case '?': case '@': case ISUPPER: \
      case '[': case'\\': case ']': case '^': case '_': case '`': \
      case ISLOWER: case '{': case '|': case '}': case '~'

/*
 * General prototypes
 */
void ClipClose(void);		/* clip.c */
int  ClipCut(char * string);
long ClipPaste(char * buf, long max);

char *itos(long);		/* misc.c */
int lstrncmp(register char * str1, register char * str2, register int len);
void udelay(unsigned long val);

extern char MEMORY_ERROR_MSG[];	/* napsaterm.c */
extern BOOLEAN started_from_workbench;

int write_to_tty(char * buf, int count);
void amigainit(void);
void amigaquit(void);

void vtreport(void);		/* emulate.c */
void vtstyle(int c);
void terminalMode(int num, int private, int on);
int decode_escapes(int c);
void termout(char * text, int count);

void waitToEnd(void);		/* wimp.c */
void setnewtitle(void);
void perror(const char *banner);
void herror(const char *banner, const char *error);
void fatalError(const char *s, ...); 

/* Added by RKNOP for tek4010.c */
#ifdef TEKTRONICS
extern int tekmode;
extern long tekwinmask;
void set_tekmode(unsigned short);
void vt100_tek(void);
void tek_vt100(void);
void graph_clear(void);
char *tekout(char *,char *);	/* Returns new pointer to where in */
				              /* stream we stopped */
void tekpoll(void);
void closetekwin(void);

#define TEK_POINT 0
#define TEK_VECTOR 1
#define TEK_INCR 2
#define TEK_ALPHA 3
#define TEK_GIN 4
#define TEK_BLOCK 5

#endif
/* End of RKNOP added */

#define DEBUG(x) puts(x)
#endif
