1/* expect.h - include file for using the expect library, libexpect.a 2from C or C++ (i.e., without Tcl) 3 4Written by: Don Libes, libes@cme.nist.gov, NIST, 12/3/90 5 6Design and implementation of this program was paid for by U.S. tax 7dollars. Therefore it is public domain. However, the author and NIST 8would appreciate credit if this program or parts of it are used. 9*/ 10 11#ifndef _EXPECT_H 12#define _EXPECT_H 13 14#include <stdio.h> 15#include <setjmp.h> 16 17/* 18 * tcl.h -- 19 * 20 * This header file describes the externally-visible facilities 21 * of the Tcl interpreter. 22 * 23 * Copyright (c) 1987-1994 The Regents of the University of California. 24 * Copyright (c) 1994-1997 Sun Microsystems, Inc. 25 * Copyright (c) 1993-1996 Lucent Technologies. 26 * Copyright (c) 1998-1999 Scriptics Corporation. 27 * 28 * See the file "license.terms" for information on usage and redistribution 29 * of this file, and for a DISCLAIMER OF ALL WARRANTIES. 30 * 31 * RCS: @(#) $Id: expect.h,v 5.33 2010/08/31 22:20:27 andreas_kupries Exp $ 32 */ 33 34#ifndef _TCL 35#define _TCL 36 37#ifndef __WIN32__ 38# if defined(_WIN32) || defined(WIN32) 39# define __WIN32__ 40# endif 41#endif 42 43#ifdef __WIN32__ 44# ifndef STRICT 45# define STRICT 46# endif 47# ifndef USE_PROTOTYPE 48# define USE_PROTOTYPE 1 49# endif 50# ifndef HAS_STDARG 51# define HAS_STDARG 1 52# endif 53# ifndef USE_PROTOTYPE 54# define USE_PROTOTYPE 1 55# endif 56 57/* 58 * Under Windows we need to call Tcl_Alloc in all cases to avoid competing 59 * C run-time library issues. 60 */ 61 62# ifndef USE_TCLALLOC 63# define USE_TCLALLOC 1 64# endif 65#endif /* __WIN32__ */ 66 67/* 68 * The following definitions set up the proper options for Macintosh 69 * compilers. We use this method because there is no autoconf equivalent. 70 */ 71 72#ifdef MAC_TCL 73# ifndef HAS_STDARG 74# define HAS_STDARG 1 75# endif 76# ifndef USE_TCLALLOC 77# define USE_TCLALLOC 1 78# endif 79# ifndef NO_STRERROR 80# define NO_STRERROR 1 81# endif 82#endif 83 84/* 85 * Utility macros: STRINGIFY takes an argument and wraps it in "" (double 86 * quotation marks), JOIN joins two arguments. 87 */ 88 89#define VERBATIM(x) x 90#ifdef _MSC_VER 91# define STRINGIFY(x) STRINGIFY1(x) 92# define STRINGIFY1(x) #x 93# define JOIN(a,b) JOIN1(a,b) 94# define JOIN1(a,b) a##b 95#else 96# ifdef RESOURCE_INCLUDED 97# define STRINGIFY(x) STRINGIFY1(x) 98# define STRINGIFY1(x) #x 99# define JOIN(a,b) JOIN1(a,b) 100# define JOIN1(a,b) a##b 101# else 102# ifdef __STDC__ 103# define STRINGIFY(x) #x 104# define JOIN(a,b) a##b 105# else 106# define STRINGIFY(x) "x" 107# define JOIN(a,b) VERBATIM(a)VERBATIM(b) 108# endif 109# endif 110#endif 111 112/* 113 * A special definition used to allow this header file to be included 114 * in resource files so that they can get obtain version information from 115 * this file. Resource compilers don't like all the C stuff, like typedefs 116 * and procedure declarations, that occur below. 117 */ 118 119#ifndef RESOURCE_INCLUDED 120 121#ifndef BUFSIZ 122#include <stdio.h> 123#endif 124 125/* 126 * Definitions that allow Tcl functions with variable numbers of 127 * arguments to be used with either varargs.h or stdarg.h. TCL_VARARGS 128 * is used in procedure prototypes. TCL_VARARGS_DEF is used to declare 129 * the arguments in a function definiton: it takes the type and name of 130 * the first argument and supplies the appropriate argument declaration 131 * string for use in the function definition. TCL_VARARGS_START 132 * initializes the va_list data structure and returns the first argument. 133 */ 134 135#if defined(__STDC__) || defined(HAS_STDARG) 136# include <stdarg.h> 137 138# define TCL_VARARGS(type, name) (type name, ...) 139# define TCL_VARARGS_DEF(type, name) (type name, ...) 140# define TCL_VARARGS_START(type, name, list) (va_start(list, name), name) 141#else 142# include <varargs.h> 143 144# ifdef __cplusplus 145# define TCL_VARARGS(type, name) (type name, ...) 146# define TCL_VARARGS_DEF(type, name) (type va_alist, ...) 147# else 148# define TCL_VARARGS(type, name) () 149# define TCL_VARARGS_DEF(type, name) (va_alist) 150# endif 151# define TCL_VARARGS_START(type, name, list) \ 152 (va_start(list), va_arg(list, type)) 153#endif 154 155/* 156 * Macros used to declare a function to be exported by a DLL. 157 * Used by Windows, maps to no-op declarations on non-Windows systems. 158 * The default build on windows is for a DLL, which causes the DLLIMPORT 159 * and DLLEXPORT macros to be nonempty. To build a static library, the 160 * macro STATIC_BUILD should be defined. 161 */ 162 163#ifdef STATIC_BUILD 164# define DLLIMPORT 165# define DLLEXPORT 166#else 167# if defined(__WIN32__) && (defined(_MSC_VER) || (defined(__GNUC__) && defined(__declspec))) 168# define DLLIMPORT __declspec(dllimport) 169# define DLLEXPORT __declspec(dllexport) 170# else 171# define DLLIMPORT 172# define DLLEXPORT 173# endif 174#endif 175 176/* 177 * These macros are used to control whether functions are being declared for 178 * import or export. If a function is being declared while it is being built 179 * to be included in a shared library, then it should have the DLLEXPORT 180 * storage class. If is being declared for use by a module that is going to 181 * link against the shared library, then it should have the DLLIMPORT storage 182 * class. If the symbol is beind declared for a static build or for use from a 183 * stub library, then the storage class should be empty. 184 * 185 * The convention is that a macro called BUILD_xxxx, where xxxx is the 186 * name of a library we are building, is set on the compile line for sources 187 * that are to be placed in the library. When this macro is set, the 188 * storage class will be set to DLLEXPORT. At the end of the header file, the 189 * storage class will be reset to DLLIMPORt. 190 */ 191 192#undef TCL_STORAGE_CLASS 193#ifdef BUILD_tcl 194# define TCL_STORAGE_CLASS DLLEXPORT 195#else 196# ifdef USE_TCL_STUBS 197# define TCL_STORAGE_CLASS 198# else 199# define TCL_STORAGE_CLASS DLLIMPORT 200# endif 201#endif 202 203/* 204 * Definitions that allow this header file to be used either with or 205 * without ANSI C features like function prototypes. */ 206 207#undef _ANSI_ARGS_ 208#undef CONST 209 210#if ((defined(__STDC__) || defined(SABER)) && !defined(NO_PROTOTYPE)) || defined(__cplusplus) || defined(USE_PROTOTYPE) 211# define _USING_PROTOTYPES_ 1 212# define _ANSI_ARGS_(x) x 213# define CONST const 214#else 215# define _ANSI_ARGS_(x) () 216# define CONST 217#endif 218 219#ifdef __cplusplus 220# define EXTERN extern "C" TCL_STORAGE_CLASS 221#else 222# define EXTERN extern TCL_STORAGE_CLASS 223#endif 224 225/* 226 * Macro to use instead of "void" for arguments that must have 227 * type "void *" in ANSI C; maps them to type "char *" in 228 * non-ANSI systems. 229 */ 230#ifndef __WIN32__ 231#ifndef VOID 232# ifdef __STDC__ 233# define VOID void 234# else 235# define VOID char 236# endif 237#endif 238#else /* __WIN32__ */ 239/* 240 * The following code is copied from winnt.h 241 */ 242#ifndef VOID 243#define VOID void 244typedef char CHAR; 245typedef short SHORT; 246typedef long LONG; 247#endif 248#endif /* __WIN32__ */ 249 250/* 251 * Miscellaneous declarations. 252 */ 253 254#ifndef NULL 255#define NULL 0 256#endif 257 258typedef struct Tcl_RegExp_ *Tcl_RegExp; 259 260/* 261 * These function have been renamed. The old names are deprecated, but we 262 * define these macros for backwards compatibilty. 263 */ 264 265#define Tcl_Ckalloc Tcl_Alloc 266#define Tcl_Ckfree Tcl_Free 267#define Tcl_Ckrealloc Tcl_Realloc 268#define Tcl_Return Tcl_SetResult 269#define Tcl_TildeSubst Tcl_TranslateFileName 270 271#endif /* RESOURCE_INCLUDED */ 272 273#undef TCL_STORAGE_CLASS 274#define TCL_STORAGE_CLASS DLLIMPORT 275 276#endif /* _TCL */ 277 278/* 279 * end of tcl.h definitions 280 */ 281 282 283/* 284 * regexp definitions - from tcl8.0/tclRegexp.h 285 */ 286 287/* 288 * Definitions etc. for regexp(3) routines. 289 * 290 * Caveat: this is V8 regexp(3) [actually, a reimplementation thereof], 291 * not the System V one. 292 * 293 * RCS: @(#) $Id: expect.h,v 5.33 2010/08/31 22:20:27 andreas_kupries Exp $ 294 */ 295 296#ifndef _REGEXP 297#define _REGEXP 1 298 299#ifdef BUILD_tcl 300# undef TCL_STORAGE_CLASS 301# define TCL_STORAGE_CLASS DLLEXPORT 302#endif 303 304/* 305 * NSUBEXP must be at least 10, and no greater than 117 or the parser 306 * will not work properly. 307 */ 308 309#define NSUBEXP 20 310 311typedef struct regexp { 312 char *startp[NSUBEXP]; 313 char *endp[NSUBEXP]; 314 char regstart; /* Internal use only. */ 315 char reganch; /* Internal use only. */ 316 char *regmust; /* Internal use only. */ 317 int regmlen; /* Internal use only. */ 318 char program[1]; /* Unwarranted chumminess with compiler. */ 319} regexp; 320 321EXTERN regexp *TclRegComp _ANSI_ARGS_((char *exp)); 322EXTERN int TclRegExec _ANSI_ARGS_((regexp *prog, char *string, char *start)); 323EXTERN void TclRegSub _ANSI_ARGS_((regexp *prog, char *source, char *dest)); 324EXTERN void exp_TclRegError _ANSI_ARGS_((char *msg)); 325EXTERN char *TclGetRegError _ANSI_ARGS_((void)); 326 327# undef TCL_STORAGE_CLASS 328# define TCL_STORAGE_CLASS DLLIMPORT 329 330#endif /* REGEXP */ 331 332 333/* 334 * end of regexp definitions 335 */ 336 337 338/* 339 * finally - expect-specific definitions 340 */ 341 342#include "expect_comm.h" 343 344enum exp_type { 345 exp_end = 0, /* placeholder - no more cases */ 346 exp_glob, /* glob-style */ 347 exp_exact, /* exact string */ 348 exp_regexp, /* regexp-style, uncompiled */ 349 exp_compiled, /* regexp-style, compiled */ 350 exp_null, /* matches binary 0 */ 351 exp_bogus /* aid in reporting compatibility problems */ 352}; 353 354struct exp_case { /* case for expect command */ 355 char *pattern; 356 regexp *re; 357 enum exp_type type; 358 int value; /* value to be returned upon match */ 359}; 360 361EXTERN char *exp_buffer; /* buffer of matchable chars */ 362EXTERN char *exp_buffer_end; /* one beyond end of matchable chars */ 363EXTERN char *exp_match; /* start of matched string */ 364EXTERN char *exp_match_end; /* one beyond end of matched string */ 365EXTERN int exp_match_max; /* bytes */ 366EXTERN int exp_timeout; /* seconds */ 367EXTERN int exp_full_buffer; /* if true, return on full buffer */ 368EXTERN int exp_remove_nulls; /* if true, remove nulls */ 369 370EXTERN int exp_pty_timeout; /* see Cray hooks in source */ 371EXTERN int exp_pid; /* process-id of spawned process */ 372EXTERN int exp_autoallocpty; /* if TRUE, we do allocation */ 373EXTERN int exp_pty[2]; /* master is [0], slave is [1] */ 374EXTERN char *exp_pty_slave_name; /* name of pty slave device if we */ 375 /* do allocation */ 376EXTERN char *exp_stty_init; /* initial stty args */ 377EXTERN int exp_ttycopy; /* copy tty parms from /dev/tty */ 378EXTERN int exp_ttyinit; /* set tty parms to sane state */ 379EXTERN int exp_console; /* redirect console */ 380 381#ifdef HAVE_SIGLONGJMP 382EXTERN sigjmp_buf exp_readenv; /* for interruptable read() */ 383#else 384EXTERN jmp_buf exp_readenv; /* for interruptable read() */ 385#endif /* HAVE_SIGLONGJMP */ 386 387EXTERN int exp_reading; /* whether we can longjmp or not */ 388#define EXP_ABORT 1 /* abort read */ 389#define EXP_RESTART 2 /* restart read */ 390 391EXTERN int exp_is_debugging; 392EXTERN int exp_loguser; 393 394EXTERN void (*exp_close_in_child)(); /* procedure to close files in child */ 395EXTERN void exp_slave_control _ANSI_ARGS_((int,int)); 396EXTERN int exp_logfile_all; 397EXTERN FILE *exp_debugfile; 398EXTERN FILE *exp_logfile; 399extern void exp_debuglog _ANSI_ARGS_(TCL_VARARGS(char *,fmt)); 400extern void exp_errorlog _ANSI_ARGS_(TCL_VARARGS(char *,fmt)); 401 402EXTERN int exp_disconnect _ANSI_ARGS_((void)); 403EXTERN FILE *exp_popen _ANSI_ARGS_((char *command)); 404EXTERN void (*exp_child_exec_prelude) _ANSI_ARGS_((void)); 405 406#ifndef EXP_DEFINE_FNS 407EXTERN int exp_spawnl _ANSI_ARGS_(TCL_VARARGS(char *,file)); 408EXTERN int exp_expectl _ANSI_ARGS_(TCL_VARARGS(int,fd)); 409EXTERN int exp_fexpectl _ANSI_ARGS_(TCL_VARARGS(FILE *,fp)); 410#endif 411 412EXTERN int exp_spawnv _ANSI_ARGS_((char *file, char *argv[])); 413EXTERN int exp_expectv _ANSI_ARGS_((int fd, struct exp_case *cases)); 414EXTERN int exp_fexpectv _ANSI_ARGS_((FILE *fp, struct exp_case *cases)); 415 416EXTERN int exp_spawnfd _ANSI_ARGS_((int fd)); 417 418#endif /* _EXPECT_H */ 419