/* G K E R M I T . H  --  GNU Kermit header  */
/*
  Author:
    Frank da Cruz
    Originally at:
      The Kermit Project
      Columbia University
      612 West 115th Street
      New York NY 10025-7799  USA
      http://www.columbia.edu/kermit/
      kermit@columbia.edu
    As of October 2011:
      The New Open-Source Kermit Project
      Bronx NY
      http://kermitproject.org
      kermit@kermitproject.org
    Most recent update:
      Mon Nov 15 08:24:28 2021

  Copyright (C) 1999, 2021
  The Trustees of Columbia University in the City of New York.
  Issued under the GNU General Public License as it existed in 1999.

  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 2 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.
*/

#ifndef _GKERMIT_H
#define _GKERMIT_H

/* __APPLE__ items from Kenji Rikitake 31 May 2021 */

#include <stdio.h>
#include <errno.h>                      /* Added in G-Kermit 2.0 */
#ifndef __APPLE__                       /* macOS with Xcode has not malloc.h */
#include <malloc.h>                     /* Added in G-Kermit 2.0 */
#endif /* __APPLE__ */
#include <string.h>                     /* Added in G-Kermit 2.0 */
#include <stdlib.h>                     /* Added in G-Kermit 2.0 */

/* unistd.h might be needed for sleep() prototype */

#ifndef NEEDUNISTD
 #ifdef __APPLE__
  #define NEEDUNISTD
 #else
  #ifdef __NetBSD__
   #define NEEDUNISTD
 #endif /* __NetBSD__ */
 #endif /* __APPLE__ */
#endif /* NEEDUNISTD */
#ifdef NEEDUNISTD
 #include <unistd.h>
#endif /* NEEDUNISTD */

/* Kermit protocol definitions */

#define MAXTRY 10			/* Packet retry limit */

#ifndef SMALL				/* Define small systems here */
#ifdef pdp11				/* PDP-11 (64K address space) */
#define SMALL
#endif /* pdp11 */
#endif /* SMALL */

#ifdef SMALL				/* Buffer sizes for small systems */

#define MAXSP 4000
#define MAXRP 4000
#define DEFRP 1000
#define MAXPATHLEN 255
#define DEVNAMLEN 64
#define MAXRECORD 255

#else  /* 32-bit and 64-bit platforms... */

#ifndef MAXSP
#define MAXSP 9000			/* Maximum send packet size */
#endif /* MAXSP */

#ifndef MAXRP				/* Maximum receive packet size */
#define MAXRP 9000
#endif /* MAXRP */

#ifndef DEFRP				/* Default receive packet size */
#define DEFRP 4000
#endif /* DEFRP */

#endif /* SMALL */

#define CTTNAM  "/dev/tty"		/* Default terminal name */

/* Sizes for file/device-name and file i/o buffers */

#ifndef MAXPATHLEN			/* Maximum file specification length */
#define MAXPATHLEN 1024
#endif /* MAXPATHLEN */

#ifndef MAXNAMLEN			/* Maximum file name length */
#define MAXNAMLEN 256
#endif /* MAXNAMLEN */

#ifndef DEVNAMLEN			/* Maximum device name length */
#define DEVNAMLEN 1024
#endif /* DEVNAMLEN */

#ifndef MAXRECORD			/* Text file input buffer length */
#define MAXRECORD 4080
#endif /* MAXRECORD */

#ifdef __STDC__
#define VOID void
#else
#define VOID int
#endif /* __STDC__ */

/* SVORPOSIX = System V or POSIX */

#ifndef SVORPOSIX
#ifdef POSIX
#define SVORPOSIX
#else
#ifdef SYSV
#define SVORPOSIX
#endif /* SYSV */
#endif /* POSIX */
#endif /* SVORPOSIX */

/* Signal type */

#ifndef SIG_V
#ifndef SIG_I
#ifdef SVORPOSIX
#define SIG_V
#else
#define SIG_I
#endif /* SVORPOSIX */
#endif /* SIG_I */
#endif /* SIG_V */

#ifdef SIG_I
#define SIGRETURN return(0)
#ifndef SIGTYP
#define SIGTYP int
#endif /* SIGTYP */
#else
#ifdef SIG_V
#define SIGRETURN return
#ifndef SIGTYP
#define SIGTYP void
#endif /* SIGTYP */
#endif /* SIG_V */
#endif /* SIG_I */

/* WHATAMI bit definitions */

#define WMI_FMODE   2			/* File transfer mode */
#define WMI_FNAME   4			/* File name conversion */
#define WMI_STREAM  8			/* I have a reliable transport */
#define WMI_CLEAR  16			/* I have a clear channel */
#define WMI_FLAG   32			/* Flag that WHATAMI field is valid */
#define WMI2_XMODE  1			/* Transfer mode auto(0)/manual(1) */
#define WMI2_RECU   2			/* Transfer is recursive */
#define WMI2_FLAG  32			/* Flag that WHATAMI2 field is valid */

/* Data types */

#ifndef CHAR
#define CHAR unsigned char
#endif /* CHAR */

#ifndef ULONG
#define ULONG unsigned long
#endif /* ULONG */

/* Pointer and character constants */

#ifndef NULL
#define NULL 0				/* NULL pointer */
#endif /* NULL */

#define NUL '\000'			/* ASCII NUL character */
#define LF  '\012'			/* ASCII Linefeed */
#define CR  '\015'			/* ASCII Carriage Return */
#define SP  '\040'			/* ASCII space character */
#define DEL 127				/* ASCII DEL */

/* Macros */

#define tochar(ch)  ((ch) + SP )	/* Number to character */
#define xunchar(ch) ((ch) - SP )	/* Character to number */
#define ctl(ch)     ((ch) ^ 64 )	/* Controllify/Uncontrollify */
#define zgetc(a) (((--zincnt)>=0) ? ((int)(*zinptr++) & 0xff) : zfillbuf(a))

/* Function prototype macro works for both ANSI and K&R C */

#ifdef __STDC__
#define _MYPROTOTYPE( func, parms ) func parms
#else
#define _MYPROTOTYPE( func, parms ) func()
#endif /* __STDC__ */

/* Function prototypes */

_MYPROTOTYPE( SIGTYP doexit, (int) );
_MYPROTOTYPE( VOID sysinit, (void) );
_MYPROTOTYPE( char dopar, (char) );
_MYPROTOTYPE( VOID tmsg, (char *) );
_MYPROTOTYPE( VOID tmsgl, (char *) );
_MYPROTOTYPE( int ttopen, (char *) );
_MYPROTOTYPE( int ttpkt, (int) );
_MYPROTOTYPE( int ttres, (void) );
_MYPROTOTYPE( int ttinl, (char *, int, int, char, char, int) );
_MYPROTOTYPE( int ttol, (char *, int) );
_MYPROTOTYPE( int ttchk, (void) );
_MYPROTOTYPE( int ttflui, (void) );
_MYPROTOTYPE( long zchki, (char *) );
_MYPROTOTYPE( int zchko, (char *) );
_MYPROTOTYPE( int zopeni, (char *) );
_MYPROTOTYPE( int zopeno, (char *) );
_MYPROTOTYPE( int zclosi, (void) );
_MYPROTOTYPE( int zcloso, (int) );
_MYPROTOTYPE( int zfillbuf, (int) );
_MYPROTOTYPE( VOID zltor, (char *, char *, int) );
_MYPROTOTYPE( int zrtol, (char *, char *, int, int) );
_MYPROTOTYPE( int zbackup, (char *) );

_MYPROTOTYPE( int input, (void) );	/* Input to state machine (like lex) */
_MYPROTOTYPE( VOID nxtpkt, (void) );	/* Increment packet number */
_MYPROTOTYPE( int ack, (void) );	/* Send empty Acknowledgment */
_MYPROTOTYPE( int ack1, (char *) );	/* Send data-bearing Acknowledgment */
_MYPROTOTYPE( int nak, (void) );	/* Send Negative acknowledgement */
_MYPROTOTYPE( VOID tinit, (void) );	/* Transaction initialization */
_MYPROTOTYPE( VOID errpkt, (char *) );	/* Send error packet */
_MYPROTOTYPE( int sinit, (char) );	/* Send S packet */
_MYPROTOTYPE( int sfile, (void) );	/* Send File header packet */
_MYPROTOTYPE( int sdata, (void) );	/* Send Data packet */
_MYPROTOTYPE( int seof, (char *) );	/* Send EOF packet */
_MYPROTOTYPE( int seot, (void) );	/* Send EOT packet */
_MYPROTOTYPE( int resend, (void) );	/* Resend a packet */
_MYPROTOTYPE( int decode, (int) );	/* Decode packet data field */
_MYPROTOTYPE( int encstr, (char *) );	/* Encode a memory string */
_MYPROTOTYPE( int gattr, (char *) );	/* Get incoming file attributes */
_MYPROTOTYPE( int sattr, (void) );	/* Send file attributes */
_MYPROTOTYPE( VOID ginit, (void) );	/* Transaction initialization */
_MYPROTOTYPE( int scmd, (char, char *) ); /* Send command to Kermit server */
_MYPROTOTYPE( VOID rinit, (void) );	/* Receive initialization */
_MYPROTOTYPE( int gnfile, (void) );	/* Get next filename */
_MYPROTOTYPE( int rcvfil, (void) );	/* Receive incoming file */
_MYPROTOTYPE( VOID spar, (char *) );	/* Set parameters from other Kermit */
_MYPROTOTYPE( char *rpar, (void) );	/* Tell parameters to other Kermit */
_MYPROTOTYPE( VOID usage, (void) );	/* Give usage message */
_MYPROTOTYPE( int gwart, (void) );	/* State table switcher */

/* Externs */

#ifdef ERRNO_H
#include <errno.h>
#else
extern int errno;
#endif /* ERRNO_H */
#ifndef _GKERMIT_C
extern int debug;
#endif /* _GKERMIT_C */

#endif /* _GKERMIT_H */

/* End gkermit.h */
