]>
cvs.zerfleddert.de Git - micropolis/blob - src/tcl/tclcmdil.c
4 * This file contains the top-level command routines for most of
5 * the Tcl built-in commands whose names begin with the letters
6 * I through L. It contains only commands in the generic core
7 * (i.e. those that don't depend much upon UNIX facilities).
9 * Copyright 1987-1991 Regents of the University of California
10 * Permission to use, copy, modify, and distribute this
11 * software and its documentation for any purpose and without
12 * fee is hereby granted, provided that the above copyright
13 * notice appear in all copies. The University of California
14 * makes no representations about the suitability of this
15 * software for any purpose. It is provided "as is" without
16 * express or implied warranty.
20 static char rcsid
[] = "$Header: /user6/ouster/tcl/RCS/tclCmdIL.c,v 1.84 91/12/06 10:42:36 ouster Exp $ SPRITE (Berkeley)";
26 * Global absolute file name:
29 char *TCL_Library
= TCL_LIBRARY
;
32 * Forward declarations for procedures defined in this file:
35 static int SortCompareProc
_ANSI_ARGS_((CONST VOID
*first
,
39 *----------------------------------------------------------------------
43 * This procedure is invoked to process the "if" Tcl command.
44 * See the user documentation for details on what it does.
47 * A standard Tcl result.
50 * See the user documentation.
52 *----------------------------------------------------------------------
58 ClientData dummy
, /* Not used. */
59 Tcl_Interp
*interp
, /* Current interpreter. */
60 int argc
, /* Number of arguments. */
61 char **argv
/* Argument strings. */
64 char *condition
, *ifPart
, *elsePart
, *cmd
, *name
;
71 Tcl_AppendResult(interp
, "wrong # args: should be \"", name
,
72 " bool ?then? command ?else? ?command?\"", (char *) NULL
);
78 if ((**argv
== 't') && (strncmp(*argv
, "then", strlen(*argv
)) == 0)) {
91 if ((**argv
== 'e') && (strncmp(*argv
, "else", strlen(*argv
)) == 0)) {
102 clause
= "\"then\" clause";
103 result
= Tcl_ExprBoolean(interp
, condition
, &value
);
104 if (result
!= TCL_OK
) {
105 if (result
== TCL_ERROR
) {
107 sprintf(msg
, "\n (\"if\" test line %d)", interp
->errorLine
);
108 Tcl_AddErrorInfo(interp
, msg
);
114 clause
= "\"else\" clause";
119 result
= Tcl_Eval(interp
, cmd
, 0, (char **) NULL
);
120 if (result
== TCL_ERROR
) {
122 sprintf(msg
, "\n (%s line %d)", clause
, interp
->errorLine
);
123 Tcl_AddErrorInfo(interp
, msg
);
129 *----------------------------------------------------------------------
133 * This procedure is invoked to process the "incr" Tcl command.
134 * See the user documentation for details on what it does.
137 * A standard Tcl result.
140 * See the user documentation.
142 *----------------------------------------------------------------------
148 ClientData dummy
, /* Not used. */
149 Tcl_Interp
*interp
, /* Current interpreter. */
150 int argc
, /* Number of arguments. */
151 char **argv
/* Argument strings. */
155 char *oldString
, *result
;
158 if ((argc
!= 2) && (argc
!= 3)) {
159 Tcl_AppendResult(interp
, "wrong # args: should be \"", argv
[0],
160 " varName ?increment?\"", (char *) NULL
);
164 oldString
= Tcl_GetVar(interp
, argv
[1], TCL_LEAVE_ERR_MSG
);
165 if (oldString
== NULL
) {
168 if (Tcl_GetInt(interp
, oldString
, &value
) != TCL_OK
) {
169 Tcl_AddErrorInfo(interp
,
170 "\n (reading value of variable to increment)");
178 if (Tcl_GetInt(interp
, argv
[2], &increment
) != TCL_OK
) {
179 Tcl_AddErrorInfo(interp
,
180 "\n (reading increment)");
185 sprintf(newString
, "%d", value
);
186 result
= Tcl_SetVar(interp
, argv
[1], newString
, TCL_LEAVE_ERR_MSG
);
187 if (result
== NULL
) {
190 interp
->result
= result
;
195 *----------------------------------------------------------------------
199 * This procedure is invoked to process the "info" Tcl command.
200 * See the user documentation for details on what it does.
203 * A standard Tcl result.
206 * See the user documentation.
208 *----------------------------------------------------------------------
214 ClientData dummy
, /* Not used. */
215 Tcl_Interp
*interp
, /* Current interpreter. */
216 int argc
, /* Number of arguments. */
217 char **argv
/* Argument strings. */
220 register Interp
*iPtr
= (Interp
*) interp
;
228 Tcl_HashSearch search
;
231 Tcl_AppendResult(interp
, "wrong # args: should be \"", argv
[0],
232 " option ?arg arg ...?\"", (char *) NULL
);
236 length
= strlen(argv
[1]);
237 if ((c
== 'a') && (strncmp(argv
[1], "args", length
)) == 0) {
239 Tcl_AppendResult(interp
, "wrong # args: should be \"",
240 argv
[0], " args procname\"", (char *) NULL
);
243 procPtr
= TclFindProc(iPtr
, argv
[2]);
244 if (procPtr
== NULL
) {
246 Tcl_AppendResult(interp
, "\"", argv
[2],
247 "\" isn't a procedure", (char *) NULL
);
250 for (argPtr
= procPtr
->argPtr
; argPtr
!= NULL
;
251 argPtr
= argPtr
->nextPtr
) {
252 Tcl_AppendElement(interp
, argPtr
->name
, 0);
255 } else if ((c
== 'b') && (strncmp(argv
[1], "body", length
)) == 0) {
257 Tcl_AppendResult(interp
, "wrong # args: should be \"", argv
[0],
258 " body procname\"", (char *) NULL
);
261 procPtr
= TclFindProc(iPtr
, argv
[2]);
262 if (procPtr
== NULL
) {
265 iPtr
->result
= procPtr
->command
;
267 } else if ((c
== 'c') && (strncmp(argv
[1], "cmdcount", length
) == 0)
270 Tcl_AppendResult(interp
, "wrong # args: should be \"", argv
[0],
271 " cmdcount\"", (char *) NULL
);
274 sprintf(iPtr
->result
, "%d", iPtr
->cmdCount
);
276 } else if ((c
== 'c') && (strncmp(argv
[1], "commands", length
) == 0)
279 Tcl_AppendResult(interp
, "wrong # args: should be \"", argv
[0],
280 " commands [pattern]\"", (char *) NULL
);
283 for (hPtr
= Tcl_FirstHashEntry(&iPtr
->commandTable
, &search
);
284 hPtr
!= NULL
; hPtr
= Tcl_NextHashEntry(&search
)) {
285 char *name
= Tcl_GetHashKey(&iPtr
->commandTable
, hPtr
);
286 if ((argc
== 3) && !Tcl_StringMatch(name
, argv
[2])) {
289 Tcl_AppendElement(interp
, name
, 0);
292 } else if ((c
== 'd') && (strncmp(argv
[1], "default", length
)) == 0) {
294 Tcl_AppendResult(interp
, "wrong # args: should be \"",
295 argv
[0], " default procname arg varname\"",
299 procPtr
= TclFindProc(iPtr
, argv
[2]);
300 if (procPtr
== NULL
) {
303 for (argPtr
= procPtr
->argPtr
; ; argPtr
= argPtr
->nextPtr
) {
304 if (argPtr
== NULL
) {
305 Tcl_AppendResult(interp
, "procedure \"", argv
[2],
306 "\" doesn't have an argument \"", argv
[3],
307 "\"", (char *) NULL
);
310 if (strcmp(argv
[3], argPtr
->name
) == 0) {
311 if (argPtr
->defValue
!= NULL
) {
312 if (Tcl_SetVar((Tcl_Interp
*) iPtr
, argv
[4],
313 argPtr
->defValue
, 0) == NULL
) {
315 Tcl_AppendResult(interp
,
316 "couldn't store default value in variable \"",
317 argv
[4], "\"", (char *) NULL
);
322 if (Tcl_SetVar((Tcl_Interp
*) iPtr
, argv
[4], "", 0)
331 } else if ((c
== 'e') && (strncmp(argv
[1], "exists", length
) == 0)) {
334 Tcl_AppendResult(interp
, "wrong # args: should be \"", argv
[0],
335 " exists varName\"", (char *) NULL
);
338 p
= Tcl_GetVar((Tcl_Interp
*) iPtr
, argv
[2], 0);
341 * The code below handles the special case where the name is for
342 * an array: Tcl_GetVar will reject this since you can't read
343 * an array variable without an index.
350 if (strchr(argv
[2], '(') != NULL
) {
355 if (iPtr
->varFramePtr
== NULL
) {
356 hPtr
= Tcl_FindHashEntry(&iPtr
->globalTable
, argv
[2]);
358 hPtr
= Tcl_FindHashEntry(&iPtr
->varFramePtr
->varTable
, argv
[2]);
363 varPtr
= (Var
*) Tcl_GetHashValue(hPtr
);
364 if (varPtr
->flags
& VAR_UPVAR
) {
365 varPtr
= (Var
*) Tcl_GetHashValue(varPtr
->value
.upvarPtr
);
367 if (!(varPtr
->flags
& VAR_ARRAY
)) {
373 } else if ((c
== 'g') && (strncmp(argv
[1], "globals", length
) == 0)) {
377 Tcl_AppendResult(interp
, "wrong # args: should be \"", argv
[0],
378 " globals [pattern]\"", (char *) NULL
);
381 for (hPtr
= Tcl_FirstHashEntry(&iPtr
->globalTable
, &search
);
382 hPtr
!= NULL
; hPtr
= Tcl_NextHashEntry(&search
)) {
383 varPtr
= (Var
*) Tcl_GetHashValue(hPtr
);
384 if (varPtr
->flags
& VAR_UNDEFINED
) {
387 name
= Tcl_GetHashKey(&iPtr
->globalTable
, hPtr
);
388 if ((argc
== 3) && !Tcl_StringMatch(name
, argv
[2])) {
391 Tcl_AppendElement(interp
, name
, 0);
394 } else if ((c
== 'l') && (strncmp(argv
[1], "level", length
) == 0)
397 if (iPtr
->varFramePtr
== NULL
) {
400 sprintf(iPtr
->result
, "%d", iPtr
->varFramePtr
->level
);
403 } else if (argc
== 3) {
407 if (Tcl_GetInt(interp
, argv
[2], &level
) != TCL_OK
) {
411 if (iPtr
->varFramePtr
== NULL
) {
413 Tcl_AppendResult(interp
, "bad level \"", argv
[2],
414 "\"", (char *) NULL
);
417 level
+= iPtr
->varFramePtr
->level
;
419 for (framePtr
= iPtr
->varFramePtr
; framePtr
!= NULL
;
420 framePtr
= framePtr
->callerVarPtr
) {
421 if (framePtr
->level
== level
) {
425 if (framePtr
== NULL
) {
428 iPtr
->result
= Tcl_Merge(framePtr
->argc
, framePtr
->argv
);
429 iPtr
->freeProc
= (Tcl_FreeProc
*) free
;
432 Tcl_AppendResult(interp
, "wrong # args: should be \"", argv
[0],
433 " level [number]\"", (char *) NULL
);
435 } else if ((c
== 'l') && (strncmp(argv
[1], "library", length
) == 0)
438 Tcl_AppendResult(interp
, "wrong # args: should be \"", argv
[0],
439 " library\"", (char *) NULL
);
443 interp
->result
= TCL_Library
;
446 interp
->result
= "there is no Tcl library at this installation";
449 } else if ((c
== 'l') && (strncmp(argv
[1], "locals", length
) == 0)
454 Tcl_AppendResult(interp
, "wrong # args: should be \"", argv
[0],
455 " locals [pattern]\"", (char *) NULL
);
458 if (iPtr
->varFramePtr
== NULL
) {
461 for (hPtr
= Tcl_FirstHashEntry(&iPtr
->varFramePtr
->varTable
, &search
);
462 hPtr
!= NULL
; hPtr
= Tcl_NextHashEntry(&search
)) {
463 varPtr
= (Var
*) Tcl_GetHashValue(hPtr
);
464 if (varPtr
->flags
& (VAR_UNDEFINED
|VAR_UPVAR
)) {
467 name
= Tcl_GetHashKey(&iPtr
->varFramePtr
->varTable
, hPtr
);
468 if ((argc
== 3) && !Tcl_StringMatch(name
, argv
[2])) {
471 Tcl_AppendElement(interp
, name
, 0);
474 } else if ((c
== 'p') && (strncmp(argv
[1], "procs", length
)) == 0) {
476 Tcl_AppendResult(interp
, "wrong # args: should be \"", argv
[0],
477 " procs [pattern]\"", (char *) NULL
);
480 for (hPtr
= Tcl_FirstHashEntry(&iPtr
->commandTable
, &search
);
481 hPtr
!= NULL
; hPtr
= Tcl_NextHashEntry(&search
)) {
482 char *name
= Tcl_GetHashKey(&iPtr
->commandTable
, hPtr
);
484 cmdPtr
= (Command
*) Tcl_GetHashValue(hPtr
);
485 if (!TclIsProc(cmdPtr
)) {
488 if ((argc
== 3) && !Tcl_StringMatch(name
, argv
[2])) {
491 Tcl_AppendElement(interp
, name
, 0);
494 } else if ((c
== 's') && (strncmp(argv
[1], "script", length
) == 0)) {
496 Tcl_AppendResult(interp
, "wrong # args: should be \"",
497 argv
[0], " script\"", (char *) NULL
);
500 if (iPtr
->scriptFile
!= NULL
) {
501 interp
->result
= iPtr
->scriptFile
;
504 } else if ((c
== 't') && (strncmp(argv
[1], "tclversion", length
) == 0)) {
506 Tcl_AppendResult(interp
, "wrong # args: should be \"",
507 argv
[0], " tclversion\"", (char *) NULL
);
512 * Note: TCL_VERSION below is expected to be set with a "-D"
513 * switch in the Makefile.
516 strcpy(iPtr
->result
, TCL_VERSION
);
518 } else if ((c
== 'v') && (strncmp(argv
[1], "vars", length
)) == 0) {
519 Tcl_HashTable
*tablePtr
;
523 Tcl_AppendResult(interp
, "wrong # args: should be \"",
524 argv
[0], " vars [pattern]\"", (char *) NULL
);
527 if (iPtr
->varFramePtr
== NULL
) {
528 tablePtr
= &iPtr
->globalTable
;
530 tablePtr
= &iPtr
->varFramePtr
->varTable
;
532 for (hPtr
= Tcl_FirstHashEntry(tablePtr
, &search
);
533 hPtr
!= NULL
; hPtr
= Tcl_NextHashEntry(&search
)) {
534 varPtr
= (Var
*) Tcl_GetHashValue(hPtr
);
535 if (varPtr
->flags
& VAR_UNDEFINED
) {
538 name
= Tcl_GetHashKey(tablePtr
, hPtr
);
539 if ((argc
== 3) && !Tcl_StringMatch(name
, argv
[2])) {
542 Tcl_AppendElement(interp
, name
, 0);
546 Tcl_AppendResult(interp
, "bad option \"", argv
[1],
547 "\": should be args, body, commands, cmdcount, default, ",
548 "exists, globals, level, library, locals, procs, ",
549 "script, tclversion, or vars",
556 *----------------------------------------------------------------------
560 * This procedure is invoked to process the "join" Tcl command.
561 * See the user documentation for details on what it does.
564 * A standard Tcl result.
567 * See the user documentation.
569 *----------------------------------------------------------------------
575 ClientData dummy
, /* Not used. */
576 Tcl_Interp
*interp
, /* Current interpreter. */
577 int argc
, /* Number of arguments. */
578 char **argv
/* Argument strings. */
587 } else if (argc
== 3) {
588 joinString
= argv
[2];
590 Tcl_AppendResult(interp
, "wrong # args: should be \"", argv
[0],
591 " list ?joinString?\"", (char *) NULL
);
595 if (Tcl_SplitList(interp
, argv
[1], &listArgc
, &listArgv
) != TCL_OK
) {
598 for (i
= 0; i
< listArgc
; i
++) {
600 Tcl_AppendResult(interp
, listArgv
[0], (char *) NULL
);
602 Tcl_AppendResult(interp
, joinString
, listArgv
[i
], (char *) NULL
);
605 ckfree((char *) listArgv
);
610 *----------------------------------------------------------------------
614 * This procedure is invoked to process the "lindex" Tcl command.
615 * See the user documentation for details on what it does.
618 * A standard Tcl result.
621 * See the user documentation.
623 *----------------------------------------------------------------------
629 ClientData dummy
, /* Not used. */
630 Tcl_Interp
*interp
, /* Current interpreter. */
631 int argc
, /* Number of arguments. */
632 char **argv
/* Argument strings. */
636 int index
, size
, parenthesized
, result
;
639 Tcl_AppendResult(interp
, "wrong # args: should be \"", argv
[0],
640 " list index\"", (char *) NULL
);
643 if (Tcl_GetInt(interp
, argv
[2], &index
) != TCL_OK
) {
649 for (p
= argv
[1] ; index
>= 0; index
--) {
650 result
= TclFindElement(interp
, p
, &element
, &p
, &size
,
652 if (result
!= TCL_OK
) {
659 if (size
>= TCL_RESULT_SIZE
) {
660 interp
->result
= (char *) ckalloc((unsigned) size
+1);
661 interp
->freeProc
= (Tcl_FreeProc
*) free
;
664 memcpy((VOID
*) interp
->result
, (VOID
*) element
, size
);
665 interp
->result
[size
] = 0;
667 TclCopyAndCollapse(size
, element
, interp
->result
);
673 *----------------------------------------------------------------------
677 * This procedure is invoked to process the "linsert" Tcl command.
678 * See the user documentation for details on what it does.
681 * A standard Tcl result.
684 * See the user documentation.
686 *----------------------------------------------------------------------
692 ClientData dummy
, /* Not used. */
693 Tcl_Interp
*interp
, /* Current interpreter. */
694 int argc
, /* Number of arguments. */
695 char **argv
/* Argument strings. */
698 char *p
, *element
, savedChar
;
699 int i
, index
, count
, result
, size
;
702 Tcl_AppendResult(interp
, "wrong # args: should be \"", argv
[0],
703 " list index element ?element ...?\"", (char *) NULL
);
706 if (Tcl_GetInt(interp
, argv
[2], &index
) != TCL_OK
) {
711 * Skip over the first "index" elements of the list, then add
712 * all of those elements to the result.
717 for (count
= 0, p
= argv
[1]; (count
< index
) && (*p
!= 0); count
++) {
718 result
= TclFindElement(interp
, p
, &element
, &p
, &size
, (int *) NULL
);
719 if (result
!= TCL_OK
) {
724 Tcl_AppendResult(interp
, argv
[1], (char *) NULL
);
729 if (element
!= argv
[1]) {
730 while ((*end
!= 0) && !isspace(*end
)) {
736 Tcl_AppendResult(interp
, argv
[1], (char *) NULL
);
741 * Add the new list elements.
744 for (i
= 3; i
< argc
; i
++) {
745 Tcl_AppendElement(interp
, argv
[i
], 0);
749 * Append the remainder of the original list.
753 Tcl_AppendResult(interp
, " ", p
, (char *) NULL
);
759 *----------------------------------------------------------------------
763 * This procedure is invoked to process the "list" Tcl command.
764 * See the user documentation for details on what it does.
767 * A standard Tcl result.
770 * See the user documentation.
772 *----------------------------------------------------------------------
778 ClientData dummy
, /* Not used. */
779 Tcl_Interp
*interp
, /* Current interpreter. */
780 int argc
, /* Number of arguments. */
781 char **argv
/* Argument strings. */
785 Tcl_AppendResult(interp
, "wrong # args: should be \"", argv
[0],
786 " arg ?arg ...?\"", (char *) NULL
);
789 interp
->result
= Tcl_Merge(argc
-1, argv
+1);
790 interp
->freeProc
= (Tcl_FreeProc
*) free
;
795 *----------------------------------------------------------------------
799 * This procedure is invoked to process the "llength" Tcl command.
800 * See the user documentation for details on what it does.
803 * A standard Tcl result.
806 * See the user documentation.
808 *----------------------------------------------------------------------
814 ClientData dummy
, /* Not used. */
815 Tcl_Interp
*interp
, /* Current interpreter. */
816 int argc
, /* Number of arguments. */
817 char **argv
/* Argument strings. */
824 Tcl_AppendResult(interp
, "wrong # args: should be \"", argv
[0],
825 " list\"", (char *) NULL
);
828 for (count
= 0, p
= argv
[1]; *p
!= 0 ; count
++) {
829 result
= TclFindElement(interp
, p
, &element
, &p
, (int *) NULL
,
831 if (result
!= TCL_OK
) {
838 sprintf(interp
->result
, "%d", count
);
843 *----------------------------------------------------------------------
847 * This procedure is invoked to process the "lrange" Tcl command.
848 * See the user documentation for details on what it does.
851 * A standard Tcl result.
854 * See the user documentation.
856 *----------------------------------------------------------------------
862 ClientData notUsed
, /* Not used. */
863 Tcl_Interp
*interp
, /* Current interpreter. */
864 int argc
, /* Number of arguments. */
865 char **argv
/* Argument strings. */
868 int first
, last
, result
;
869 char *begin
, *end
, c
, *dummy
;
873 Tcl_AppendResult(interp
, "wrong # args: should be \"", argv
[0],
874 " list first last\"", (char *) NULL
);
877 if (Tcl_GetInt(interp
, argv
[2], &first
) != TCL_OK
) {
883 if ((*argv
[3] == 'e') && (strncmp(argv
[3], "end", strlen(argv
[3])) == 0)) {
886 if (Tcl_GetInt(interp
, argv
[3], &last
) != TCL_OK
) {
887 Tcl_ResetResult(interp
);
888 Tcl_AppendResult(interp
,
889 "expected integer or \"end\" but got \"",
890 argv
[3], "\"", (char *) NULL
);
899 * Extract a range of fields.
902 for (count
= 0, begin
= argv
[1]; count
< first
; count
++) {
903 result
= TclFindElement(interp
, begin
, &dummy
, &begin
, (int *) NULL
,
905 if (result
!= TCL_OK
) {
912 for (count
= first
, end
= begin
; (count
<= last
) && (*end
!= 0);
914 result
= TclFindElement(interp
, end
, &dummy
, &end
, (int *) NULL
,
916 if (result
!= TCL_OK
) {
922 * Chop off trailing spaces.
925 while (isspace(end
[-1])) {
930 Tcl_SetResult(interp
, begin
, TCL_VOLATILE
);
936 *----------------------------------------------------------------------
940 * This procedure is invoked to process the "lreplace" Tcl command.
941 * See the user documentation for details on what it does.
944 * A standard Tcl result.
947 * See the user documentation.
949 *----------------------------------------------------------------------
955 ClientData notUsed
, /* Not used. */
956 Tcl_Interp
*interp
, /* Current interpreter. */
957 int argc
, /* Number of arguments. */
958 char **argv
/* Argument strings. */
961 char *p1
, *p2
, *element
, savedChar
, *dummy
;
962 int i
, first
, last
, count
, result
, size
;
965 Tcl_AppendResult(interp
, "wrong # args: should be \"", argv
[0],
966 " list first last ?element element ...?\"", (char *) NULL
);
969 if (Tcl_GetInt(interp
, argv
[2], &first
) != TCL_OK
) {
972 if (TclGetListIndex(interp
, argv
[3], &last
) != TCL_OK
) {
982 Tcl_AppendResult(interp
, "first index must not be greater than second",
988 * Skip over the elements of the list before "first".
993 for (count
= 0, p1
= argv
[1]; (count
< first
) && (*p1
!= 0); count
++) {
994 result
= TclFindElement(interp
, p1
, &element
, &p1
, &size
,
996 if (result
!= TCL_OK
) {
1001 Tcl_AppendResult(interp
, "list doesn't contain element ",
1002 argv
[2], (char *) NULL
);
1007 * Skip over the elements of the list up through "last".
1010 for (p2
= p1
; (count
<= last
) && (*p2
!= 0); count
++) {
1011 result
= TclFindElement(interp
, p2
, &dummy
, &p2
, (int *) NULL
,
1013 if (result
!= TCL_OK
) {
1019 * Add the elements before "first" to the result. Be sure to
1020 * include quote or brace characters that might terminate the
1021 * last of these elements.
1025 if (element
!= argv
[1]) {
1026 while ((*p1
!= 0) && !isspace(*p1
)) {
1032 Tcl_AppendResult(interp
, argv
[1], (char *) NULL
);
1036 * Add the new list elements.
1039 for (i
= 4; i
< argc
; i
++) {
1040 Tcl_AppendElement(interp
, argv
[i
], 0);
1044 * Append the remainder of the original list.
1048 if (*interp
->result
== 0) {
1049 Tcl_SetResult(interp
, p2
, TCL_VOLATILE
);
1051 Tcl_AppendResult(interp
, " ", p2
, (char *) NULL
);
1058 *----------------------------------------------------------------------
1062 * This procedure is invoked to process the "lsearch" Tcl command.
1063 * See the user documentation for details on what it does.
1066 * A standard Tcl result.
1069 * See the user documentation.
1071 *----------------------------------------------------------------------
1077 ClientData notUsed
, /* Not used. */
1078 Tcl_Interp
*interp
, /* Current interpreter. */
1079 int argc
, /* Number of arguments. */
1080 char **argv
/* Argument strings. */
1088 Tcl_AppendResult(interp
, "wrong # args: should be \"", argv
[0],
1089 " list pattern\"", (char *) NULL
);
1092 if (Tcl_SplitList(interp
, argv
[1], &listArgc
, &listArgv
) != TCL_OK
) {
1096 for (i
= 0; i
< listArgc
; i
++) {
1097 if (Tcl_StringMatch(listArgv
[i
], argv
[2])) {
1102 sprintf(interp
->result
, "%d", match
);
1103 ckfree((char *) listArgv
);
1108 *----------------------------------------------------------------------
1112 * This procedure is invoked to process the "lsort" Tcl command.
1113 * See the user documentation for details on what it does.
1116 * A standard Tcl result.
1119 * See the user documentation.
1121 *----------------------------------------------------------------------
1127 ClientData notUsed
, /* Not used. */
1128 Tcl_Interp
*interp
, /* Current interpreter. */
1129 int argc
, /* Number of arguments. */
1130 char **argv
/* Argument strings. */
1137 Tcl_AppendResult(interp
, "wrong # args: should be \"", argv
[0],
1138 " list\"", (char *) NULL
);
1141 if (Tcl_SplitList(interp
, argv
[1], &listArgc
, &listArgv
) != TCL_OK
) {
1144 qsort((VOID
*) listArgv
, listArgc
, sizeof (char *), SortCompareProc
);
1145 interp
->result
= Tcl_Merge(listArgc
, listArgv
);
1146 interp
->freeProc
= (Tcl_FreeProc
*) free
;
1147 ckfree((char *) listArgv
);
1152 * The procedure below is called back by qsort to determine
1153 * the proper ordering between two elements.
1159 CONST VOID
*second
/* Elements to be compared. */
1162 return strcmp(*((char **) first
), *((char **) second
));