⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tclcmdil.c

📁 tcl源码详细资料
💻 C
📖 第 1 页 / 共 2 页
字号:
    int argc;				/* Number of arguments. */    char **argv;			/* Argument strings. */{    char *joinString;    char **listArgv;    int listArgc, i;    if (argc == 2) {	joinString = " ";    } else if (argc == 3) {	joinString = argv[2];    } else {	Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],		" list ?joinString?\"", (char *) NULL);	return TCL_ERROR;    }    if (Tcl_SplitList(interp, argv[1], &listArgc, &listArgv) != TCL_OK) {	return TCL_ERROR;    }    for (i = 0; i < listArgc; i++) {	if (i == 0) {	    Tcl_AppendResult(interp, listArgv[0], (char *) NULL);	} else  {	    Tcl_AppendResult(interp, joinString, listArgv[i], (char *) NULL);	}    }    ckfree((char *) listArgv);    return TCL_OK;}/* *---------------------------------------------------------------------- * * Tcl_LindexCmd -- * *	This procedure is invoked to process the "lindex" Tcl command. *	See the user documentation for details on what it does. * * Results: *	A standard Tcl result. * * Side effects: *	See the user documentation. * *---------------------------------------------------------------------- */    /* ARGSUSED */intTcl_LindexCmd(dummy, interp, argc, argv)    ClientData dummy;			/* Not used. */    Tcl_Interp *interp;			/* Current interpreter. */    int argc;				/* Number of arguments. */    char **argv;			/* Argument strings. */{    long index;    char *p, *element;    int size, parenthesized, result;    if (argc != 3) {	Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],		" list index\"", (char *) NULL);	return TCL_ERROR;    }    if (Tcl_GetInt(interp, argv[2], &index) != TCL_OK) {	return TCL_ERROR;    }    if (index < 0) {	return TCL_OK;    }    for (p = argv[1] ; index >= 0; index--) {	result = TclFindElement(interp, p, &element, &p, &size,		&parenthesized);	if (result != TCL_OK) {	    return result;	}    }    if (size == 0) {	return TCL_OK;    }    if (size >= TCL_RESULT_SIZE) {	interp->result = (char *) ckalloc((unsigned) size+1);	interp->freeProc = (Tcl_FreeProc *) free;    }    if (parenthesized) {	memcpy((VOID *) interp->result, (VOID *) element, size);	interp->result[size] = 0;    } else {	TclCopyAndCollapse(size, element, interp->result);    }    return TCL_OK;}/* *---------------------------------------------------------------------- * * Tcl_LinsertCmd -- * *	This procedure is invoked to process the "linsert" Tcl command. *	See the user documentation for details on what it does. * * Results: *	A standard Tcl result. * * Side effects: *	See the user documentation. * *---------------------------------------------------------------------- */	/* ARGSUSED */intTcl_LinsertCmd(dummy, interp, argc, argv)    ClientData dummy;			/* Not used. */    Tcl_Interp *interp;			/* Current interpreter. */    int argc;				/* Number of arguments. */    char **argv;			/* Argument strings. */{    char *p, *element, savedChar;    int i, count, result, size;    long index;    if (argc < 4) {	Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],		" list index element ?element ...?\"", (char *) NULL);	return TCL_ERROR;    }    if (Tcl_GetInt(interp, argv[2], &index) != TCL_OK) {	return TCL_ERROR;    }    /*     * Skip over the first "index" elements of the list, then add     * all of those elements to the result.     */    size = 0;    element = argv[1];    for (count = 0, p = argv[1]; (count < index) && (*p != 0); count++) {	result = TclFindElement(interp, p, &element, &p, &size, (int *) NULL);	if (result != TCL_OK) {	    return result;	}    }    if (*p == 0) {	Tcl_AppendResult(interp, argv[1], (char *) NULL);    } else {	char *end;	end = element+size;	if (element != argv[1]) {	    while ((*end != 0) && !isspace(*end)) {		end++;	    }	}	savedChar = *end;	*end = 0;	Tcl_AppendResult(interp, argv[1], (char *) NULL);	*end = savedChar;    }    /*     * Add the new list elements.     */    for (i = 3; i < argc; i++) {	Tcl_AppendElement(interp, argv[i], 0);    }    /*     * Append the remainder of the original list.     */    if (*p != 0) {	Tcl_AppendResult(interp, " ", p, (char *) NULL);    }    return TCL_OK;}/* *---------------------------------------------------------------------- * * Tcl_ListCmd -- * *	This procedure is invoked to process the "list" Tcl command. *	See the user documentation for details on what it does. * * Results: *	A standard Tcl result. * * Side effects: *	See the user documentation. * *---------------------------------------------------------------------- */	/* ARGSUSED */intTcl_ListCmd(dummy, interp, argc, argv)    ClientData dummy;			/* Not used. */    Tcl_Interp *interp;			/* Current interpreter. */    int argc;				/* Number of arguments. */    char **argv;			/* Argument strings. */{    if (argc < 2) {	Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],		" arg ?arg ...?\"", (char *) NULL);	return TCL_ERROR;    }    interp->result = Tcl_Merge(argc-1, argv+1);    interp->freeProc = (Tcl_FreeProc *) free;    return TCL_OK;}/* *---------------------------------------------------------------------- * * Tcl_LlengthCmd -- * *	This procedure is invoked to process the "llength" Tcl command. *	See the user documentation for details on what it does. * * Results: *	A standard Tcl result. * * Side effects: *	See the user documentation. * *---------------------------------------------------------------------- */	/* ARGSUSED */intTcl_LlengthCmd(dummy, interp, argc, argv)    ClientData dummy;			/* Not used. */    Tcl_Interp *interp;			/* Current interpreter. */    int argc;				/* Number of arguments. */    char **argv;			/* Argument strings. */{    int count, result;    char *element, *p;    if (argc != 2) {	Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],		" list\"", (char *) NULL);	return TCL_ERROR;    }    for (count = 0, p = argv[1]; *p != 0 ; count++) {	result = TclFindElement(interp, p, &element, &p, (int *) NULL,		(int *) NULL);	if (result != TCL_OK) {	    return result;	}	if (*element == 0) {	    break;	}    }    sprintf(interp->result, "%d", count);    return TCL_OK;}/* *---------------------------------------------------------------------- * * Tcl_LrangeCmd -- * *	This procedure is invoked to process the "lrange" Tcl command. *	See the user documentation for details on what it does. * * Results: *	A standard Tcl result. * * Side effects: *	See the user documentation. * *---------------------------------------------------------------------- */	/* ARGSUSED */intTcl_LrangeCmd(notUsed, interp, argc, argv)    ClientData notUsed;			/* Not used. */    Tcl_Interp *interp;			/* Current interpreter. */    int argc;				/* Number of arguments. */    char **argv;			/* Argument strings. */{    long first, last;    int result, count;    char *begin, *end, c, *dummy;    if (argc != 4) {	Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],		" list first last\"", (char *) NULL);	return TCL_ERROR;    }    if (Tcl_GetInt(interp, argv[2], &first) != TCL_OK) {	return TCL_ERROR;    }    if (first < 0) {	first = 0;    }    if ((*argv[3] == 'e') && (strncmp(argv[3], "end", strlen(argv[3])) == 0)) {	last = 1000000;    } else {	if (Tcl_GetInt(interp, argv[3], &last) != TCL_OK) {	    Tcl_ResetResult(interp);	    Tcl_AppendResult(interp,		    "expected integer or \"end\" but got \"",		    argv[3], "\"", (char *) NULL);	    return TCL_ERROR;	}    }    if (first > last) {	return TCL_OK;    }    /*     * Extract a range of fields.     */    for (count = 0, begin = argv[1]; count < first; count++) {	result = TclFindElement(interp, begin, &dummy, &begin, (int *) NULL,		(int *) NULL);	if (result != TCL_OK) {	    return result;	}	if (*begin == 0) {	    break;	}    }    for (count = first, end = begin; (count <= last) && (*end != 0);	    count++) {	result = TclFindElement(interp, end, &dummy, &end, (int *) NULL,		(int *) NULL);	if (result != TCL_OK) {	    return result;	}    }    /*     * Chop off trailing spaces.     */    while (isspace(end[-1])) {	end--;    }    c = *end;    *end = 0;    Tcl_SetResult(interp, begin, TCL_VOLATILE);    *end = c;    return TCL_OK;}/* *---------------------------------------------------------------------- * * Tcl_LreplaceCmd -- * *	This procedure is invoked to process the "lreplace" Tcl command. *	See the user documentation for details on what it does. * * Results: *	A standard Tcl result. * * Side effects: *	See the user documentation. * *---------------------------------------------------------------------- */	/* ARGSUSED */intTcl_LreplaceCmd(notUsed, interp, argc, argv)    ClientData notUsed;			/* Not used. */    Tcl_Interp *interp;			/* Current interpreter. */    int argc;				/* Number of arguments. */    char **argv;			/* Argument strings. */{    char *p1, *p2, *element, savedChar, *dummy;    int i, count, result, size;    long first, last;    if (argc < 4) {	Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],		" list first last ?element element ...?\"", (char *) NULL);	return TCL_ERROR;    }    if (Tcl_GetInt(interp, argv[2], &first) != TCL_OK) {	return TCL_ERROR;    }    if (TclGetListIndex(interp, argv[3], &last) != TCL_OK) {	return TCL_ERROR;    }    if (first < 0) {	first = 0;    }    if (last < 0) {	last = 0;    }    if (first > last) {	Tcl_AppendResult(interp, "first index must not be greater than second",		(char *) NULL);	return TCL_ERROR;    }    /*     * Skip over the elements of the list before "first".     */    size = 0;    element = argv[1];    for (count = 0, p1 = argv[1]; (count < first) && (*p1 != 0); count++) {	result = TclFindElement(interp, p1, &element, &p1, &size,		(int *) NULL);	if (result != TCL_OK) {	    return result;	}    }    if (*p1 == 0) {	Tcl_AppendResult(interp, "list doesn't contain element ",		argv[2], (char *) NULL);	return TCL_ERROR;    }    /*     * Skip over the elements of the list up through "last".     */    for (p2 = p1 ; (count <= last) && (*p2 != 0); count++) {	result = TclFindElement(interp, p2, &dummy, &p2, (int *) NULL,		(int *) NULL);	if (result != TCL_OK) {	    return result;	}    }    /*     * Add the elements before "first" to the result.  Be sure to     * include quote or brace characters that might terminate the     * last of these elements.     */    p1 = element+size;    if (element != argv[1]) {	while ((*p1 != 0) && !isspace(*p1)) {	    p1++;	}    }    savedChar = *p1;    *p1 = 0;    Tcl_AppendResult(interp, argv[1], (char *) NULL);    *p1 = savedChar;    /*     * Add the new list elements.     */    for (i = 4; i < argc; i++) {	Tcl_AppendElement(interp, argv[i], 0);    }    /*     * Append the remainder of the original list.     */    if (*p2 != 0) {	if (*interp->result == 0) {	    Tcl_SetResult(interp, p2, TCL_VOLATILE);	} else {	    Tcl_AppendResult(interp, " ", p2, (char *) NULL);	}    }    return TCL_OK;}/* *---------------------------------------------------------------------- * * Tcl_LsearchCmd -- * *	This procedure is invoked to process the "lsearch" Tcl command. *	See the user documentation for details on what it does. * * Results: *	A standard Tcl result. * * Side effects: *	See the user documentation. * *---------------------------------------------------------------------- */	/* ARGSUSED */intTcl_LsearchCmd(notUsed, interp, argc, argv)    ClientData notUsed;			/* Not used. */    Tcl_Interp *interp;			/* Current interpreter. */    int argc;				/* Number of arguments. */    char **argv;			/* Argument strings. */{    int listArgc;    char **listArgv;    int i, match;    if (argc != 3) {	Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],		" list pattern\"", (char *) NULL);	return TCL_ERROR;    }    if (Tcl_SplitList(interp, argv[1], &listArgc, &listArgv) != TCL_OK) {	return TCL_ERROR;    }    match = -1;    for (i = 0; i < listArgc; i++) {	if (Tcl_StringMatch(listArgv[i], argv[2])) {	    match = i;	    break;	}    }    sprintf(interp->result, "%d", match);    ckfree((char *) listArgv);    return TCL_OK;}/* *---------------------------------------------------------------------- * * Tcl_LsortCmd -- * *	This procedure is invoked to process the "lsort" Tcl command. *	See the user documentation for details on what it does. * * Results: *	A standard Tcl result. * * Side effects: *	See the user documentation. * *---------------------------------------------------------------------- */	/* ARGSUSED */intTcl_LsortCmd(notUsed, interp, argc, argv)    ClientData notUsed;			/* Not used. */    Tcl_Interp *interp;			/* Current interpreter. */    int argc;				/* Number of arguments. */    char **argv;			/* Argument strings. */{    int listArgc;    char **listArgv;    if (argc != 2) {	Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],		" list\"", (char *) NULL);	return TCL_ERROR;    }    if (Tcl_SplitList(interp, argv[1], &listArgc, &listArgv) != TCL_OK) {	return TCL_ERROR;    }    qsort((VOID *) listArgv, listArgc, sizeof (char *), SortCompareProc);    interp->result = Tcl_Merge(listArgc, listArgv);    interp->freeProc = (Tcl_FreeProc *) free;    ckfree((char *) listArgv);    return TCL_OK;}/* * The procedure below is called back by qsort to determine * the proper ordering between two elements. */static intSortCompareProc(first, second)    CONST VOID *first, *second;		/* Elements to be compared. */{    return strcmp(*((char **) first), *((char **) second));}#elsestatic const char file_name[] = "tclCmdIL.c";#endif /* EXCLUDE_TCL */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -