1/*- 2 * Copyright (c) 1992, 1993, 1994 3 * The Regents of the University of California. All rights reserved. 4 * Copyright (c) 1992, 1993, 1994, 1995, 1996 5 * Keith Bostic. All rights reserved. 6 * Copyright (c) 1995 7 * George V. Neville-Neil. All rights reserved. 8 * 9 * See the LICENSE file for redistribution information. 10 */ 11 12#include "config.h" 13 14#ifndef lint 15static const char sccsid[] = "@(#)ex_tcl.c 8.10 (Berkeley) 9/15/96"; 16#endif /* not lint */ 17 18#include <sys/types.h> 19#include <sys/queue.h> 20 21#include <bitstring.h> 22#include <limits.h> 23#include <stdio.h> 24#include <string.h> 25#include <termios.h> 26#include <unistd.h> 27 28#include "../common/common.h" 29 30#ifdef HAVE_TCL_INTERP 31#include <tcl.h> 32#endif 33 34/* 35 * ex_tcl -- :[line [,line]] tcl [command] 36 * Run a command through the tcl interpreter. 37 * 38 * PUBLIC: int ex_tcl __P((SCR*, EXCMD *)); 39 */ 40int 41ex_tcl(sp, cmdp) 42 SCR *sp; 43 EXCMD *cmdp; 44{ 45#ifdef HAVE_TCL_INTERP 46 CHAR_T *p; 47 GS *gp; 48 size_t len; 49 char buf[128]; 50 51 /* Initialize the interpreter. */ 52 gp = sp->gp; 53 if (gp->tcl_interp == NULL && tcl_init(gp)) 54 return (1); 55 56 /* Skip leading white space. */ 57 if (cmdp->argc != 0) 58 for (p = cmdp->argv[0]->bp, 59 len = cmdp->argv[0]->len; len > 0; --len, ++p) 60 if (!isblank(*p)) 61 break; 62 if (cmdp->argc == 0 || len == 0) { 63 ex_emsg(sp, cmdp->cmd->usage, EXM_USAGE); 64 return (1); 65 } 66 67 (void)snprintf(buf, sizeof(buf), 68 "set viScreenId %d\nset viStartLine %lu\nset viStopLine %lu", 69 sp->id, cmdp->addr1.lno, cmdp->addr2.lno); 70 if (Tcl_Eval(gp->tcl_interp, buf) == TCL_OK && 71 Tcl_Eval(gp->tcl_interp, cmdp->argv[0]->bp) == TCL_OK) 72 return (0); 73 74 msgq(sp, M_ERR, "Tcl: %s", ((Tcl_Interp *)gp->tcl_interp)->result); 75 return (1); 76#else 77 msgq(sp, M_ERR, "302|Vi was not loaded with a Tcl interpreter"); 78 return (1); 79#endif /* HAVE_TCL_INTERP */ 80} 81