/* 
   ADS.H   -    Definitions of the AutoCAD functions for Applications 
                This takes the place of xlacad.h (from LISP) and contains
                the changes to the function definitions to make them
                compatible with the application interface.


   Copyright (C) 1989, 1990, 1991, 1992, 1993, 1994 by Autodesk, Inc.
 
   Permission to use, copy, modify, and distribute this software in 
   object code form for any purpose and without fee is hereby granted, 
   provided that the above copyright notice appears in all copies and 
   that both that copyright notice and the limited warranty and 
   restricted rights notice below appear in all supporting 
   documentation.
 
   AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS.  
   AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF 
   MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE.  AUTODESK, INC.
   DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE 
   UNINTERRUPTED OR ERROR FREE.
 
   Use, duplication, or disclosure by the U.S. Government is subject to 
   restrictions set forth in FAR 52.227-19 (Commercial Computer 
   Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii) 
   (Rights in Technical Data and Computer Software), as applicable.
    
   .

*/

#ifndef _ads_h
#define _ads_h 1

/* There is a clash between the alignment required within structures for
   ADS and that required for members within Zortech structs and classes.
   ADS requires byte alignment (-a1) while 32-bit Zortech requires 4-byte
   alignment (-a4).  To work around this clash the alignment is set to one
   at the top of this header file and restored to four at the bottom so
   that ADS structures are byte-aligned. */
#ifdef __ZTC__
#pragma ZTC align 1
#endif
#ifdef _MSC_VER
#ifndef RADPACK
#define RADPACK	1
#endif
#endif

/* Ensure that C++ modules use the right linking conventions when calling
   functions contained in C. */
#ifdef __cplusplus
    extern /*MSG0*/"C" {
#endif

#include "adsdef.h"

#if defined(RADPACK)
#pragma pack(1)
#endif /* RADPACK */

/*  Tricky macro for declaration of function types with optional
    prototype (i.e., declaration of argument types).  The way the
    macro "_()" is defined, the following declaration:

       int fcn _((int i, char c));

    will expand into either

       int fcn (int i, char c);
       or
       int fcn ();

    depending on whether the symbol PROTOTYPES is defined.  Thanks to
    Bob Elman for this idea.  */

#ifndef _
#ifdef PROTOTYPES
#define   _(x)  x
#else
#define   _(x)  ()
#endif /* PROTOTYPES */
#endif

/* External function definitions accessible from applications */

/* The following functions are only supported in Rx ADS */
#ifdef ACRXAPP
void           acrx_abort _((char * format, ...));
char*          ads_getappname _(());
#endif  /* ACRXAPP */

/* The following functions are not supported in Rx ADS */
#ifndef ACRXAPP
/* General abort mechanism.  Return RSABORT to Lisp. */
void           ads_abort _((const char *str));
/* ADS exit() function used for transparent exit of programs */
void           ads_exit _((int status));
/* Link back to host with request code */
int            ads_link _((int cbc));
/* Application initialization  function */
void           ads_init _((int argc, char *argv[]));
#endif  /* !ACRXAPP */


/* The following need only be defined explicitly for Rx ADS on Solaris */
/* They actually get exported as malloc() and free() for NT ADSRX apps */
/* See rx/api/stub_c.cc for details.                                */
#if defined(ACRXAPP) && defined(solaris)

#ifndef _SIZE_T
#define	_SIZE_T
/* so far, both solaris and NT define size_t as unsigned int.  We continue
   to use a typedef, however, in case some platform does not  */
typedef unsigned int	size_t;
#endif

extern void *ads_malloc(size_t sz);
extern void ads_free(void *);
extern int ads__msize(void *);
extern void *ads_realloc(void *, size_t ns);
extern void *ads_calloc(size_t sz1, size_t sz2);

#endif  /* defined(ACRXAPP) && defined(solaris) */


/* The following functions are supported in traditional ADS and Rx ADS */
#if    UNIX && !_AWINNT_
int            ads_command ();
#else  /* UNIX && !_AWINNT_ */
int            ads_command _((int rtype, ...));
#endif /* UNIX && !_AWINNT_ */
int            ads_cmd _((const struct resbuf *rbp));

/* General failure (prints message) mechanism */
void           ads_fail _((const char *str));

/* Register an ADS function handler */
int            ads_regfunc _((int (*fhdl) (void), int fcode));

/* Get a new result buffer */
struct resbuf *ads_newrb _((int v));

/* Release a result buffer as well as those linked to it */
int            ads_relrb _((struct resbuf *rb));

/* Check for a console break */
int            ads_usrbrk _((void));


/* Define an external subroutine in AutoLISP */
int            ads_defun _((const char *sname, short funcno));

/* Define help for that external subroutine */
int            ads_setfunhelp _((char* pszFunctionName, 
                            char* pszHelpfile, char* pszTopic, int iCmd));

/* Undefine an external subroutine in AutoLISP */
int            ads_undef _((const char *sname, short funcno));

/* Unitilies for external subroutine interface */
int            ads_getfuncode _((void));
struct resbuf *ads_getargs _((void));

/* Return the specified type as a result of external subroutine */
int            ads_retlist _((const struct resbuf *rbuf));
int            ads_retval _((const struct resbuf *rbuf));
int            ads_retpoint _((const ads_point pt));
int            ads_retstr _((const char *s));
int            ads_retname _((const ads_name aname, int type));
int            ads_retint _((int ival));
int            ads_retreal _((ads_real rval));
int            ads_rett _((void));
int            ads_retnil _((void));
int            ads_retvoid _((void));


/* AutoCAD Entity access routines */

int            ads_entdel _((const ads_name ent));
struct resbuf *ads_entgetx _((const ads_name ent, const struct resbuf *args));
struct resbuf *ads_entget _((const ads_name ent));
int            ads_entlast _((ads_name result));
int            ads_entnext _((const ads_name ent, ads_name result));
int            ads_entupd _((const ads_name ent));
int            ads_entmod _((const struct resbuf *ent));
int            ads_entmake _((const struct resbuf *ent));
int            ads_entsel _((const char *str, ads_name entres,
                             ads_point ptres));
int            ads_nentsel _((const char *str, ads_name entres,
                              ads_point ptres, ads_point xformres[4],
                              struct resbuf **refstkres));
int            ads_nentselp _((const char *str, ads_name entres,
                              ads_point ptres, int pickflag,
                              ads_matrix xformres,
                              struct resbuf **refstkres));
int            ads_ssget _((const char *str, const void *pt1,
                            const void *pt2, const struct resbuf *filter,
                            ads_name ss));
int            ads_ssgetfirst _((struct resbuf** gset, struct resbuf** pset));
int            ads_sssetfirst _((const ads_name gset, const ads_name pset));
int            ads_ssfree _((const ads_name sname));
int            ads_sslength _((const ads_name sname, long *len));
int            ads_ssadd _((const ads_name ename, const ads_name sname,
                            ads_name result));
int            ads_ssdel _((const ads_name ename, const ads_name ss));
int            ads_ssmemb _((const ads_name ename, const ads_name ss));
int            ads_ssname _((const ads_name ss, long i, ads_name entres));
int            ads_ssnamex _((struct resbuf **rbpp, const ads_name ss,
                              const long i));


/* Extended Entity data utilities */
int            ads_xdroom _((const ads_name ent, long *result));
int            ads_xdsize _((const struct resbuf *rb, long *result));

/* AutoCAD table access routines */
struct resbuf *ads_tblnext _((const char *tblname, int rewind));
struct resbuf *ads_tblsearch _((const char *tblname, const char *sym,
                                int setnext));

int		ads_namedobjdict _((ads_name result));
struct resbuf *ads_dictsearch _((const ads_name tblname, const char* sym, int setnext));
struct resbuf *ads_dictnext _((const ads_name tblname, int rewind));
int	       ads_tblobjname(const char *tblname, const char *sym, ads_name result);



/* Drawing database utilities */
int            ads_handent _((const char *handle, ads_name entres));
int            ads_trans _((const ads_point pt, const struct resbuf *from,
                            const struct resbuf *to, int disp,
                            ads_point result));

/* General AutoCAD utility routines */
int            ads_angtos _((ads_real v, int unit, int prec, char *str));
int            ads_cvunit _((ads_real value, const char *oldunit,
                             const char *newunit, ads_real *result));
int            ads_wcmatch _((const char *string, const char *pattern));
int            ads_rtos _((ads_real val, int unit, int prec, char *str));
int            ads_angtof _((const char *str, int unit, ads_real *v));
int            ads_distof _((const char *str, int unit, ads_real *v));
int            ads_setvar _((const char *sym, const struct resbuf *val));
int            ads_initget _((int val, const char *kwl));

int            ads_getsym _((const char *sname, struct resbuf **value));
int            ads_putsym _((const char *sname, struct resbuf *value));

int            ads_help _((char* szFilename, char* szTopic, int iCmd));
/*  These values are identical to those for the WinHelp() call in the 
    Microsoft Windows(tm) SDK.  If you are using ads_help() to call AutoCAD 
    platform-independent Help these are the only values available to you.  
    If you are using ads_help() to call WinHelp() you can include the Windows 
    header file winuser.h and use the full WinHelp() API.  */
#define HELP_CONTENTS     0x0003L  /* display first topic */
#define HELP_HELPONHELP   0x0004L  /* Display help on using help */
#define HELP_PARTIALKEY   0x0105L  /* Display Search dialog */

struct resbuf  *ads_loaded _((void));
int            ads_xload _((const char *app));
int            ads_xunload _((const char *app));
struct resbuf  *ads_arxloaded _((void));
int            ads_arxload _((const char *app));
int            ads_arxunload _((const char *app));

#if    UNIX && !_AWINNT_ && !defined(__cplusplus)
struct resbuf *ads_buildlist ();
int            ads_printf ();
#else  /* UNIX && !_AWINNT_ && !defined(__cplusplus) */
struct resbuf *ads_buildlist _((int rtype, ...));
int            ads_printf _((const char *format, ...));
#endif /* UNIX && !_AWINNT_ && !defined(__cplusplus) */
int            ads_invoke _((const struct resbuf *args,
                             struct resbuf **result));
int            ads_inters _((const ads_point from1, const ads_point to1,
                             const ads_point from2, const ads_point to2,
                             int teston, ads_point result));

/* Functions that get system variables */
int            ads_getvar _((const char *sym, struct resbuf *result));
int            ads_findfile _((const char *fname, char *result));

/* Functions that get/set environment variables */
int            ads_agetenv _((const char *sym, char  *var));
int            ads_asetenv _((const char *sym, const char *val));
/*  Synonyms  */
#define        ads_getenv(s, v)  ads_agetenv(s, v)
#define        ads_setenv(s, v)  ads_asetenv(s, v)

/* Functions that get/set configurations  variables */
int            ads_agetcfg _((const char *sym, char  *var));
int            ads_asetcfg _((const char *sym, const char *val));
/*  Synonyms  */
#define        ads_getcfg(s, v)  ads_agetcfg(s, v)
#define        ads_setcfg(s, v)  ads_asetcfg(s, v)

/* Function to test a table name */
int            ads_snvalid _((const char *tbstr, int pipetest));

/* Function to save a string ensuring no buffer overflow if, */
/* when converted, characters expand to \U+ sequences */
char *         ads_xstrsave _((char *pSource, char **pDest));

/* Function to uppercase a table name */
int            ads_xstrcase _((char *str));

/* Function that gets a string */
int            ads_getstring _((int cronly, const char *prompt, char *result));

/* Functions that pass AutoCAD a single string  */
int            ads_menucmd _((const char *str));
int            ads_prompt _((const char *str));
int            ads_alert _((const char *str));

/* Functions to register an application with AutoCAD */
int            ads_regapp _((const char *appname));
int            ads_regappx _((const char *appname, int xsave12));

/* Functions used to get user input  */
int            ads_getangle _((const ads_point pt, const char *prompt,
                               ads_real *result));
int            ads_getcorner _((const ads_point pt, const char *prompt,
                                ads_point result));
int            ads_getdist _((const ads_point pt, const char *prompt,
                              ads_real *result));
int            ads_getorient _((const ads_point pt, const char *prompt,
                                ads_real *result));
int            ads_getpoint _((const ads_point pt, const char *prompt,
                               ads_point result));
int            ads_getint _((const char *prompt, int *result));
int            ads_getkword _((const char *prompt, char *result));
int            ads_getreal _((const char *prompt, ads_real *result));
int            ads_getinput _((char *str));
int            ads_vports _((struct resbuf **vlist));

/* Functions for screen flipping */
int            ads_textscr _((void));
int            ads_graphscr _((void));
int            ads_textpage _((void));

/* Graphics related functions */
int            ads_grclear _((void));
int            ads_redraw _((const ads_name ent, int mode));
int            ads_osnap _((const ads_point pt, const char *mode,
                            ads_point result));
int            ads_grread _((int track, int *type, struct resbuf *result));
int            ads_grtext _((int box, const char *text, int hl));
int            ads_grdraw _((const ads_point from, const ads_point to,
                             int color, int hl));
int            ads_grvecs _((const struct resbuf *vlist, ads_matrix mat));
int            ads_xformss _((const ads_name ssname,
                              ads_matrix genmat));
int            ads_draggen _((const ads_name ss, const char *pmt, int cursor,
                              int (*scnf) _((ads_point pt, ads_matrix mt)),
                              ads_point p));
int            ads_setview _((const struct resbuf *view, int vport));


/* Geometry utilities */
ads_real       ads_angle _((const ads_point pt1, const ads_point pt2));
ads_real       ads_distance _((const ads_point pt1, const ads_point pt2));
void           ads_polar _((const ads_point pt, ads_real angle,
                            ads_real dist, ads_point ptres));

/* Functions that put up standard dialogs for user input */
int            ads_getfiled _((const char *title, const char *defawlt,
                               const char *ext, int flags,
                               struct resbuf *result));

int            ads_textbox _((const struct resbuf *args,
                              ads_point pt1, ads_point pt2));

/*  Function to retrieve or establish AutoCAD's tablet transformation: */
int            ads_tablet  _((const struct resbuf *args,
                              struct resbuf **result));

/* Functions to support ADS / ADI communications */
int            ads_recfgport _((int *idvc, int iotype, int baudrate,
                                int parity, int databits, int stopbits,
                                int hhflag, char *devname));
void           ads_adiinfo   _((void *dsinfoptr));
void           ads_dscfg     _((void *dspktptr));
void           ads_dsxqt     _((void *dspktptr));
void           ads_dispt     _((void *dspktptr));
void           ads_adistart  _((void *dsactptr));
void           ads_adiend    _((void *dsactptr));

#ifdef WIN
/* Call before termination to clean up Windows, DDE, memory, etc */
void           adsi_machexit(int exitval);
void           adsi_farcq(struct farclb *fclb, int retcode);

#endif

/* Functions for character handling */
int            ads_isalpha _((int c));
int            ads_isupper _((int c));
int            ads_islower _((int c));
int            ads_isdigit _((int c));
int            ads_isxdigit _((int c));
int            ads_isspace _((int c));
int            ads_ispunct _((int c));
int            ads_isalnum _((int c));
int            ads_isprint _((int c));
int            ads_isgraph _((int c));
int            ads_iscntrl _((int c));
int            ads_toupper _((int c));
int            ads_tolower _((int c));

/* Function for retrieving the localized or the language independent
   name of a command. */
int            ads_getcname _((const char *cmd, char **result));

/* When you want something that's explicitly a pointer type and not an array
   type, use ads_pointp and ads_namep.  Remember that if your function takes an
   *array* of points, it still declares ads_point[] foo; */
typedef ads_real *ads_pointp;
typedef long     *ads_namep;

/* Define macros to copy them.  NOTE that the result is the SECOND argument,
   consistent with ADS usage.  The standard C ones require <string.h> */
#ifdef __STDC__
#define ads_name_set(from, to)  (memcpy(to, from, sizeof(ads_name)))
#define ads_point_set(from,to)  (memcpy(to, from, sizeof(ads_point)))
#else
#define ads_name_set(from, to)  (*(to)= *(from), (to)[1]=(from)[1])
#define ads_point_set(from, to) (*(to)= *(from), (to)[1]=(from)[1], (to)[2]=(from)[2])
#endif  /* !__STDC__ */

/* Define null value for ads_names.  These values are NOT guaranteed valid;
   that is, there is no actual guarantee (such as C gives with NULL) that the
   system will never under any circumstances generate the values as valid data.
   The correct values will be created as part of the Lisp reinitialization
   project, if we go through with that one, and will then be inserted here.
   */
#define ads_name_clear(name)    name[0] = name[1] = 0
#define ads_name_nil(name)      (name[0] == 0 && name[1] == 0)
#define ads_name_equal(name1, name2)  (name1[0]==name2[0] \
                                       && name1[1]==name2[1])

#ifdef RADPACK
#pragma pack( )
#endif

#ifdef __cplusplus
    }
#endif

/* Restore the 32-bit Zortech C++ alignment to a 4-byte boundary (except
   when building the Zortech ADS library, which requires 1-byte alignment:
   P386 is defined when building the library). */
#ifndef P386
#ifdef __ZTC__
#pragma ZTC align 4
#endif
#endif

#endif  /* !_ads_h */
