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