home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume25 / tcl / part12 < prev    next >
Encoding:
Text File  |  1991-11-14  |  48.6 KB  |  1,910 lines

  1. Newsgroups: comp.sources.misc
  2. From: karl@sugar.neosoft.com (Karl Lehenbauer)
  3. Subject:  v25i080:  tcl - tool command language, version 6.1, Part12/33
  4. Message-ID: <1991Nov14.203028.23994@sparky.imd.sterling.com>
  5. X-Md4-Signature: 7efc03ec6a8d962867173d087f5155e2
  6. Date: Thu, 14 Nov 1991 20:30:28 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: karl@sugar.neosoft.com (Karl Lehenbauer)
  10. Posting-number: Volume 25, Issue 80
  11. Archive-name: tcl/part12
  12. Environment: UNIX
  13.  
  14. #! /bin/sh
  15. # This is a shell archive.  Remove anything before this line, then unpack
  16. # it by saving it into a file and typing "sh file".  To overwrite existing
  17. # files, type "sh file -c".  You can also feed this as standard input via
  18. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  19. # will see the following message at the end:
  20. #        "End of archive 12 (of 33)."
  21. # Contents:  tcl6.1/tclCkalloc.c tcl6.1/tclProc.c tcl6.1/tclUnixStr.c
  22. # Wrapped by karl@one on Tue Nov 12 19:44:20 1991
  23. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  24. if test -f 'tcl6.1/tclCkalloc.c' -a "${1}" != "-c" ; then 
  25.   echo shar: Will not clobber existing file \"'tcl6.1/tclCkalloc.c'\"
  26. else
  27. echo shar: Extracting \"'tcl6.1/tclCkalloc.c'\" \(15293 characters\)
  28. sed "s/^X//" >'tcl6.1/tclCkalloc.c' <<'END_OF_FILE'
  29. X/* 
  30. X * tclCkalloc.c --
  31. X *    Interface to malloc and free that provides support for debugging problems
  32. X *    involving overwritten, double freeing memory and loss of memory.
  33. X *
  34. X * Copyright 1991 Regents of the University of California
  35. X * Permission to use, copy, modify, and distribute this
  36. X * software and its documentation for any purpose and without
  37. X * fee is hereby granted, provided that the above copyright
  38. X * notice appear in all copies.  The University of California
  39. X * makes no representations about the suitability of this
  40. X * software for any purpose.  It is provided "as is" without
  41. X * express or implied warranty.
  42. X *
  43. X * This code contributed by Karl Lehenbauer and Mark Diekhans
  44. X *
  45. X */
  46. X
  47. X#include "tclInt.h"
  48. X#include "tclUnix.h"
  49. X
  50. X#define FALSE    0
  51. X#define TRUE    1
  52. X
  53. X#ifdef TCL_MEM_DEBUG
  54. X
  55. X#define GUARD_SIZE 8
  56. X
  57. Xstruct mem_header {
  58. X        long               length;
  59. X        char              *file;
  60. X        int                line;
  61. X        struct mem_header *flink;
  62. X        struct mem_header *blink;
  63. X        unsigned char      low_guard[GUARD_SIZE];
  64. X        char               body[1];
  65. X};
  66. X
  67. Xstatic struct mem_header *allocHead = NULL;  /* List of allocated structures */
  68. X
  69. X#define GUARD_VALUE  0341
  70. X
  71. X/* static char high_guard[] = {0x89, 0xab, 0xcd, 0xef}; */
  72. X
  73. Xstatic int total_mallocs = 0;
  74. Xstatic int total_frees = 0;
  75. Xstatic int current_bytes_malloced = 0;
  76. Xstatic int maximum_bytes_malloced = 0;
  77. Xstatic int current_malloc_packets = 0;
  78. Xstatic int maximum_malloc_packets = 0;
  79. Xstatic int break_on_malloc = 0;
  80. Xstatic int trace_on_at_malloc = 0;
  81. Xstatic int  alloc_tracing = FALSE;
  82. Xstatic int  init_malloced_bodies = FALSE;
  83. X#ifdef MEM_VALIDATE
  84. X    static int  validate_memory = TRUE;
  85. X#else
  86. X    static int  validate_memory = FALSE;
  87. X#endif
  88. X
  89. X
  90. X/*
  91. X *----------------------------------------------------------------------
  92. X *
  93. X * dump_memory_info --
  94. X *     Display the global memory management statistics.
  95. X *
  96. X *----------------------------------------------------------------------
  97. X */
  98. Xstatic void
  99. Xdump_memory_info(outFile) 
  100. X    FILE *outFile;
  101. X{
  102. X        fprintf(outFile,"total mallocs             %10d\n", 
  103. X                total_mallocs);
  104. X        fprintf(outFile,"total frees               %10d\n", 
  105. X                total_frees);
  106. X        fprintf(outFile,"current packets allocated %10d\n", 
  107. X                current_malloc_packets);
  108. X        fprintf(outFile,"current bytes allocated   %10d\n", 
  109. X                current_bytes_malloced);
  110. X        fprintf(outFile,"maximum packets allocated %10d\n", 
  111. X                maximum_malloc_packets);
  112. X        fprintf(outFile,"maximum bytes allocated   %10d\n", 
  113. X                maximum_bytes_malloced);
  114. X}
  115. X
  116. X/*
  117. X *----------------------------------------------------------------------
  118. X *
  119. X * ValidateMemory --
  120. X *     Procedure to validate allocted memory guard zones.
  121. X *
  122. X *----------------------------------------------------------------------
  123. X */
  124. Xstatic void
  125. XValidateMemory (memHeaderP, file, line, nukeGuards)
  126. X    struct mem_header *memHeaderP;
  127. X    char              *file;
  128. X    int                line;
  129. X    int                nukeGuards;
  130. X{
  131. X    unsigned char *hiPtr;
  132. X    int   idx;
  133. X    int   guard_failed = FALSE;
  134. X
  135. X    for (idx = 0; idx < GUARD_SIZE; idx++)
  136. X        if (*(memHeaderP->low_guard + idx) != GUARD_VALUE) {
  137. X            guard_failed = TRUE;
  138. X            fflush (stdout);
  139. X            fprintf(stderr, "low guard byte %d is 0x%x\n", idx, 
  140. X                    *(memHeaderP->low_guard + idx) & 0xff);
  141. X        }
  142. X
  143. X    if (guard_failed) {
  144. X        dump_memory_info (stderr);
  145. X        fprintf (stderr, "low guard failed at %lx, %s %d\n",
  146. X                 memHeaderP->body, file, line);
  147. X        fflush (stderr);  /* In case name pointer is bad. */
  148. X        fprintf (stderr, "Allocated at (%s %d)\n", memHeaderP->file,
  149. X                 memHeaderP->line);
  150. X        panic ("Memory validation failure");
  151. X    }
  152. X
  153. X    hiPtr = (unsigned char *)memHeaderP->body + memHeaderP->length;
  154. X    for (idx = 0; idx < GUARD_SIZE; idx++)
  155. X        if (*(hiPtr + idx) != GUARD_VALUE) {
  156. X            guard_failed = TRUE;
  157. X            fflush (stdout);
  158. X            fprintf(stderr, "hi guard byte %d is 0x%x\n", idx, 
  159. X                    *(hiPtr+idx) & 0xff);
  160. X        }
  161. X
  162. X    if (guard_failed) {
  163. X        dump_memory_info (stderr);
  164. X        fprintf (stderr, "high guard failed at %lx, %s %d\n",
  165. X                 memHeaderP->body, file, line);
  166. X        fflush (stderr);  /* In case name pointer is bad. */
  167. X        fprintf (stderr, "Allocated at (%s %d)\n", memHeaderP->file,
  168. X                 memHeaderP->line);
  169. X        panic ("Memory validation failure");
  170. X    }
  171. X
  172. X    if (nukeGuards) {
  173. X        memset ((char *) memHeaderP->low_guard, 0, GUARD_SIZE); 
  174. X        memset ((char *) hiPtr, 0, GUARD_SIZE); 
  175. X    }
  176. X
  177. X}
  178. X
  179. X/*
  180. X *----------------------------------------------------------------------
  181. X *
  182. X * Tcl_ValidateAllMemory --
  183. X *     Validates guard regions for all allocated memory.
  184. X *
  185. X *----------------------------------------------------------------------
  186. X */
  187. Xvoid
  188. XTcl_ValidateAllMemory (file, line)
  189. X    char  *file;
  190. X    int    line;
  191. X{
  192. X    struct mem_header *memScanP;
  193. X
  194. X    for (memScanP = allocHead; memScanP != NULL; memScanP = memScanP->flink)
  195. X        ValidateMemory (memScanP, file, line, FALSE);
  196. X
  197. X}
  198. X
  199. X/*
  200. X *----------------------------------------------------------------------
  201. X *
  202. X * Tcl_DumpActiveMemory --
  203. X *     Displays all allocated memory to stderr.
  204. X *
  205. X * Results:
  206. X *     Return TCL_ERROR if an error accessing the file occures, `errno' 
  207. X *     will have the file error number left in it.
  208. X *----------------------------------------------------------------------
  209. X */
  210. Xint
  211. XTcl_DumpActiveMemory (fileName)
  212. X    char *fileName;
  213. X{
  214. X    FILE              *fileP;
  215. X    struct mem_header *memScanP;
  216. X    char              *address;
  217. X
  218. X    fileP = fopen (fileName, "w");
  219. X    if (fileP == NULL)
  220. X        return TCL_ERROR;
  221. X
  222. X    for (memScanP = allocHead; memScanP != NULL; memScanP = memScanP->flink) {
  223. X        address = &memScanP->body [0];
  224. X        fprintf (fileP, "%8lx - %8lx  %7d @ %s %d\n", address,
  225. X                 address + memScanP->length - 1, memScanP->length,
  226. X                 memScanP->file, memScanP->line);
  227. X    }
  228. X    fclose (fileP);
  229. X    return TCL_OK;
  230. X}
  231. X
  232. X/*
  233. X *----------------------------------------------------------------------
  234. X *
  235. X * Tcl_DbCkalloc - debugging ckalloc
  236. X *
  237. X *        Allocate the requested amount of space plus some extra for
  238. X *        guard bands at both ends of the request, plus a size, panicing 
  239. X *        if there isn't enough space, then write in the guard bands
  240. X *        and return the address of the space in the middle that the
  241. X *        user asked for.
  242. X *
  243. X *        The second and third arguments are file and line, these contain
  244. X *        the filename and line number corresponding to the caller.
  245. X *        These are sent by the ckalloc macro; it uses the preprocessor
  246. X *        autodefines __FILE__ and __LINE__.
  247. X *
  248. X *----------------------------------------------------------------------
  249. X */
  250. Xchar *
  251. XTcl_DbCkalloc(size, file, line)
  252. X    unsigned int size;
  253. X    char        *file;
  254. X    int          line;
  255. X{
  256. X    struct mem_header *result;
  257. X
  258. X    if (validate_memory)
  259. X        Tcl_ValidateAllMemory (file, line);
  260. X
  261. X    result = (struct mem_header *)malloc((unsigned)size + 
  262. X                              sizeof(struct mem_header) + GUARD_SIZE);
  263. X    if (result == NULL) {
  264. X        fflush(stdout);
  265. X        dump_memory_info(stderr);
  266. X        panic("unable to alloc %d bytes, %s line %d", size, file, 
  267. X              line);
  268. X    }
  269. X
  270. X    /*
  271. X     * Fill in guard zones and size.  Link into allocated list.
  272. X     */
  273. X    result->length = size;
  274. X    result->file = file;
  275. X    result->line = line;
  276. X    memset ((char *) result->low_guard, GUARD_VALUE, GUARD_SIZE);
  277. X    memset (result->body + size, GUARD_VALUE, GUARD_SIZE);
  278. X    result->flink = allocHead;
  279. X    result->blink = NULL;
  280. X    if (allocHead != NULL)
  281. X        allocHead->blink = result;
  282. X    allocHead = result;
  283. X
  284. X    total_mallocs++;
  285. X    if (trace_on_at_malloc && (total_mallocs >= trace_on_at_malloc)) {
  286. X        (void) fflush(stdout);
  287. X        fprintf(stderr, "reached malloc trace enable point (%d)\n",
  288. X                total_mallocs);
  289. X        fflush(stderr);
  290. X        alloc_tracing = TRUE;
  291. X        trace_on_at_malloc = 0;
  292. X    }
  293. X
  294. X    if (alloc_tracing)
  295. X        fprintf(stderr,"ckalloc %lx %d %s %d\n", result->body, size, 
  296. X                file, line);
  297. X
  298. X    if (break_on_malloc && (total_mallocs >= break_on_malloc)) {
  299. X        break_on_malloc = 0;
  300. X        (void) fflush(stdout);
  301. X        fprintf(stderr,"reached malloc break limit (%d)\n", 
  302. X                total_mallocs);
  303. X        fprintf(stderr, "program will now enter C debugger\n");
  304. X        (void) fflush(stderr);
  305. X        kill (getpid(), SIGINT);
  306. X    }
  307. X
  308. X    current_malloc_packets++;
  309. X    if (current_malloc_packets > maximum_malloc_packets)
  310. X        maximum_malloc_packets = current_malloc_packets;
  311. X    current_bytes_malloced += size;
  312. X    if (current_bytes_malloced > maximum_bytes_malloced)
  313. X        maximum_bytes_malloced = current_bytes_malloced;
  314. X
  315. X    if (init_malloced_bodies)
  316. X        memset (result->body, 0xff, (int) size);
  317. X
  318. X    return result->body;
  319. X}
  320. X
  321. X/*
  322. X *----------------------------------------------------------------------
  323. X *
  324. X * Tcl_DbCkfree - debugging ckfree
  325. X *
  326. X *        Verify that the low and high guards are intact, and if so
  327. X *        then free the buffer else panic.
  328. X *
  329. X *        The guards are erased after being checked to catch duplicate
  330. X *        frees.
  331. X *
  332. X *        The second and third arguments are file and line, these contain
  333. X *        the filename and line number corresponding to the caller.
  334. X *        These are sent by the ckfree macro; it uses the preprocessor
  335. X *        autodefines __FILE__ and __LINE__.
  336. X *
  337. X *----------------------------------------------------------------------
  338. X */
  339. X
  340. Xint
  341. XTcl_DbCkfree(ptr, file, line)
  342. X    char *  ptr;
  343. X    char     *file;
  344. X    int       line;
  345. X{
  346. X    struct mem_header *memp = 0;  /* Must be zero for size calc */
  347. X
  348. X    /*
  349. X     * Since header ptr is zero, body offset will be size
  350. X     */
  351. X    memp = (struct mem_header *)(((char *) ptr) - (int)memp->body);
  352. X
  353. X    if (alloc_tracing)
  354. X        fprintf(stderr, "ckfree %lx %ld %s %d\n", memp->body, 
  355. X                memp->length, file, line);
  356. X
  357. X    if (validate_memory)
  358. X        Tcl_ValidateAllMemory (file, line);
  359. X
  360. X    ValidateMemory (memp, file, line, TRUE);
  361. X
  362. X    total_frees++;
  363. X    current_malloc_packets--;
  364. X    current_bytes_malloced -= memp->length;
  365. X
  366. X    /*
  367. X     * Delink from allocated list
  368. X     */
  369. X    if (memp->flink != NULL)
  370. X        memp->flink->blink = memp->blink;
  371. X    if (memp->blink != NULL)
  372. X        memp->blink->flink = memp->flink;
  373. X    if (allocHead == memp)
  374. X        allocHead = memp->flink;
  375. X    free((char *) memp);
  376. X    return 0;
  377. X}
  378. X
  379. X/*
  380. X *----------------------------------------------------------------------
  381. X *
  382. X * MemoryCmd --
  383. X *     Implements the TCL memory command:
  384. X *       memory info
  385. X *       memory display
  386. X *       break_on_malloc count
  387. X *       trace_on_at_malloc count
  388. X *       trace on|off
  389. X *       validate on|off
  390. X *
  391. X * Results:
  392. X *     Standard TCL results.
  393. X *
  394. X *----------------------------------------------------------------------
  395. X */
  396. X    /* ARGSUSED */
  397. Xstatic int
  398. XMemoryCmd (clientData, interp, argc, argv)
  399. X    char       *clientData;
  400. X    Tcl_Interp *interp;
  401. X    int         argc;
  402. X    char      **argv;
  403. X{
  404. X    char *fileName;
  405. X
  406. X    if (argc < 2) {
  407. X    Tcl_AppendResult(interp, "wrong # args:  should be \"",
  408. X        argv[0], " option [args..]\"", (char *) NULL);
  409. X    return TCL_ERROR;
  410. X    }
  411. X
  412. X    if (strcmp(argv[1],"trace") == 0) {
  413. X        if (argc != 3) 
  414. X            goto bad_suboption;
  415. X        alloc_tracing = (strcmp(argv[2],"on") == 0);
  416. X        return TCL_OK;
  417. X    }
  418. X    if (strcmp(argv[1],"init") == 0) {
  419. X        if (argc != 3)
  420. X            goto bad_suboption;
  421. X        init_malloced_bodies = (strcmp(argv[2],"on") == 0);
  422. X        return TCL_OK;
  423. X    }
  424. X    if (strcmp(argv[1],"validate") == 0) {
  425. X        if (argc != 3)
  426. X             goto bad_suboption;
  427. X        validate_memory = (strcmp(argv[2],"on") == 0);
  428. X        return TCL_OK;
  429. X    }
  430. X    if (strcmp(argv[1],"trace_on_at_malloc") == 0) {
  431. X        if (argc != 3) 
  432. X            goto argError;
  433. X        if (Tcl_GetInt(interp, argv[2], &trace_on_at_malloc) != TCL_OK)
  434. X                return TCL_ERROR;
  435. X         return TCL_OK;
  436. X    }
  437. X    if (strcmp(argv[1],"break_on_malloc") == 0) {
  438. X        if (argc != 3) 
  439. X            goto argError;
  440. X        if (Tcl_GetInt(interp, argv[2], &break_on_malloc) != TCL_OK)
  441. X                return TCL_ERROR;
  442. X        return TCL_OK;
  443. X    }
  444. X
  445. X    if (strcmp(argv[1],"info") == 0) {
  446. X        dump_memory_info(stdout);
  447. X        return TCL_OK;
  448. X    }
  449. X    if (strcmp(argv[1],"active") == 0) {
  450. X        if (argc != 3) {
  451. X        Tcl_AppendResult(interp, "wrong # args:  should be \"",
  452. X            argv[0], " active file", (char *) NULL);
  453. X        return TCL_ERROR;
  454. X    }
  455. X        fileName = argv [2];
  456. X        if (fileName [0] == '~')
  457. X            if ((fileName = Tcl_TildeSubst (interp, fileName)) == NULL)
  458. X                return TCL_ERROR;
  459. X        if (Tcl_DumpActiveMemory (fileName) != TCL_OK) {
  460. X        Tcl_AppendResult(interp, "error accessing ", argv[2], 
  461. X            (char *) NULL);
  462. X        return TCL_ERROR;
  463. X    }
  464. X    return TCL_OK;
  465. X    }
  466. X    Tcl_AppendResult(interp, "bad option \"", argv[1],
  467. X        "\":  should be info, init, active, break_on_malloc, ",
  468. X        "trace_on_at_malloc, trace, or validate", (char *) NULL);
  469. X    return TCL_ERROR;
  470. X
  471. XargError:
  472. X    Tcl_AppendResult(interp, "wrong # args:  should be \"", argv[0],
  473. X        " ", argv[1], "count\"", (char *) NULL);
  474. X    return TCL_ERROR;
  475. X
  476. Xbad_suboption:
  477. X    Tcl_AppendResult(interp, "wrong # args:  should be \"", argv[0],
  478. X        " ", argv[1], " on|off\"", (char *) NULL);
  479. X    return TCL_ERROR;
  480. X}
  481. X
  482. X/*
  483. X *----------------------------------------------------------------------
  484. X *
  485. X * Tcl_InitMemory --
  486. X *     Initialize the memory command.
  487. X *
  488. X *----------------------------------------------------------------------
  489. X */
  490. Xvoid
  491. XTcl_InitMemory(interp)
  492. X    Tcl_Interp *interp;
  493. X{
  494. XTcl_CreateCommand (interp, "memory", MemoryCmd, (ClientData)NULL, 
  495. X                  (void (*)())NULL);
  496. X}
  497. X
  498. X#else
  499. X
  500. X
  501. X/*
  502. X *----------------------------------------------------------------------
  503. X *
  504. X * Tcl_Ckalloc --
  505. X *     Interface to malloc when TCL_MEM_DEBUG is disabled.  It does check
  506. X *     that memory was actually allocated.
  507. X *
  508. X *----------------------------------------------------------------------
  509. X */
  510. XVOID *
  511. XTcl_Ckalloc (size)
  512. X    unsigned int size;
  513. X{
  514. X        char *result;
  515. X
  516. X        result = malloc(size);
  517. X        if (result == NULL) 
  518. X                panic("unable to alloc %d bytes", size);
  519. X        return result;
  520. X}
  521. X
  522. X/*
  523. X *----------------------------------------------------------------------
  524. X *
  525. X * TckCkfree --
  526. X *     Interface to free when TCL_MEM_DEBUG is disabled.  Done here rather
  527. X *     in the macro to keep some modules from being compiled with 
  528. X *     TCL_MEM_DEBUG enabled and some with it disabled.
  529. X *
  530. X *----------------------------------------------------------------------
  531. X */
  532. Xvoid
  533. XTcl_Ckfree (ptr)
  534. X    VOID *ptr;
  535. X{
  536. X        free (ptr);
  537. X}
  538. X
  539. X/*
  540. X *----------------------------------------------------------------------
  541. X *
  542. X * Tcl_InitMemory --
  543. X *     Dummy initialization for memory command, which is only available 
  544. X *     if TCL_MEM_DEBUG is on.
  545. X *
  546. X *----------------------------------------------------------------------
  547. X */
  548. X    /* ARGSUSED */
  549. Xvoid
  550. XTcl_InitMemory(interp)
  551. X    Tcl_Interp *interp;
  552. X{
  553. X}
  554. X
  555. X#endif
  556. X
  557. END_OF_FILE
  558. if test 15293 -ne `wc -c <'tcl6.1/tclCkalloc.c'`; then
  559.     echo shar: \"'tcl6.1/tclCkalloc.c'\" unpacked with wrong size!
  560. fi
  561. # end of 'tcl6.1/tclCkalloc.c'
  562. fi
  563. if test -f 'tcl6.1/tclProc.c' -a "${1}" != "-c" ; then 
  564.   echo shar: Will not clobber existing file \"'tcl6.1/tclProc.c'\"
  565. else
  566. echo shar: Extracting \"'tcl6.1/tclProc.c'\" \(14709 characters\)
  567. sed "s/^X//" >'tcl6.1/tclProc.c' <<'END_OF_FILE'
  568. X/* 
  569. X * tclProc.c --
  570. X *
  571. X *    This file contains routines that implement Tcl procedures,
  572. X *    including the "proc" and "uplevel" commands.
  573. X *
  574. X * Copyright 1987-1991 Regents of the University of California
  575. X * Permission to use, copy, modify, and distribute this
  576. X * software and its documentation for any purpose and without
  577. X * fee is hereby granted, provided that the above copyright
  578. X * notice appear in all copies.  The University of California
  579. X * makes no representations about the suitability of this
  580. X * software for any purpose.  It is provided "as is" without
  581. X * express or implied warranty.
  582. X */
  583. X
  584. X#ifndef lint
  585. Xstatic char rcsid[] = "$Header: /sprite/src/lib/tcl/RCS/tclProc.c,v 1.59 91/09/30 16:59:54 ouster Exp $ SPRITE (Berkeley)";
  586. X#endif
  587. X
  588. X#include "tclInt.h"
  589. X
  590. X/*
  591. X * Forward references to procedures defined later in this file:
  592. X */
  593. X
  594. Xstatic  int    InterpProc _ANSI_ARGS_((ClientData clientData,
  595. X            Tcl_Interp *interp, int argc, char **argv));
  596. Xstatic  void    ProcDeleteProc _ANSI_ARGS_((ClientData clientData));
  597. X
  598. X/*
  599. X *----------------------------------------------------------------------
  600. X *
  601. X * Tcl_ProcCmd --
  602. X *
  603. X *    This procedure is invoked to process the "proc" Tcl command.
  604. X *    See the user documentation for details on what it does.
  605. X *
  606. X * Results:
  607. X *    A standard Tcl result value.
  608. X *
  609. X * Side effects:
  610. X *    A new procedure gets created.
  611. X *
  612. X *----------------------------------------------------------------------
  613. X */
  614. X
  615. X    /* ARGSUSED */
  616. Xint
  617. XTcl_ProcCmd(dummy, interp, argc, argv)
  618. X    ClientData dummy;            /* Not used. */
  619. X    Tcl_Interp *interp;            /* Current interpreter. */
  620. X    int argc;                /* Number of arguments. */
  621. X    char **argv;            /* Argument strings. */
  622. X{
  623. X    register Interp *iPtr = (Interp *) interp;
  624. X    register Proc *procPtr;
  625. X    int result, argCount, i;
  626. X    char **argArray = NULL;
  627. X    Arg *lastArgPtr;
  628. X    register Arg *argPtr = NULL;    /* Initialization not needed, but
  629. X                     * prevents compiler warning. */
  630. X
  631. X    if (argc != 4) {
  632. X    Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
  633. X        " name args body\"", (char *) NULL);
  634. X    return TCL_ERROR;
  635. X    }
  636. X
  637. X    procPtr = (Proc *) ckalloc(sizeof(Proc));
  638. X    procPtr->iPtr = iPtr;
  639. X    procPtr->command = (char *) ckalloc((unsigned) strlen(argv[3]) + 1);
  640. X    strcpy(procPtr->command, argv[3]);
  641. X    procPtr->argPtr = NULL;
  642. X
  643. X    /*
  644. X     * Break up the argument list into argument specifiers, then process
  645. X     * each argument specifier.
  646. X     */
  647. X
  648. X    result = Tcl_SplitList(interp, argv[2], &argCount, &argArray);
  649. X    if (result != TCL_OK) {
  650. X    goto procError;
  651. X    }
  652. X    lastArgPtr = NULL;
  653. X    for (i = 0; i < argCount; i++) {
  654. X    int fieldCount, nameLength, valueLength;
  655. X    char **fieldValues;
  656. X
  657. X    /*
  658. X     * Now divide the specifier up into name and default.
  659. X     */
  660. X
  661. X    result = Tcl_SplitList(interp, argArray[i], &fieldCount,
  662. X        &fieldValues);
  663. X    if (result != TCL_OK) {
  664. X        goto procError;
  665. X    }
  666. X    if (fieldCount > 2) {
  667. X        ckfree((char *) fieldValues);
  668. X        Tcl_AppendResult(interp,
  669. X            "too many fields in argument specifier \"",
  670. X            argArray[i], "\"", (char *) NULL);
  671. X        result = TCL_ERROR;
  672. X        goto procError;
  673. X    }
  674. X    if ((fieldCount == 0) || (*fieldValues[0] == 0)) {
  675. X        ckfree((char *) fieldValues);
  676. X        Tcl_AppendResult(interp, "procedure \"", argv[1],
  677. X            "\" has argument with no name", (char *) NULL);
  678. X        result = TCL_ERROR;
  679. X        goto procError;
  680. X    }
  681. X    nameLength = strlen(fieldValues[0]) + 1;
  682. X    if (fieldCount == 2) {
  683. X        valueLength = strlen(fieldValues[1]) + 1;
  684. X    } else {
  685. X        valueLength = 0;
  686. X    }
  687. X    argPtr = (Arg *) ckalloc((unsigned)
  688. X        (sizeof(Arg) - sizeof(argPtr->name) + nameLength
  689. X        + valueLength));
  690. X    if (lastArgPtr == NULL) {
  691. X        procPtr->argPtr = argPtr;
  692. X    } else {
  693. X        lastArgPtr->nextPtr = argPtr;
  694. X    }
  695. X    lastArgPtr = argPtr;
  696. X    argPtr->nextPtr = NULL;
  697. X    strcpy(argPtr->name, fieldValues[0]);
  698. X    if (fieldCount == 2) {
  699. X        argPtr->defValue = argPtr->name + nameLength;
  700. X        strcpy(argPtr->defValue, fieldValues[1]);
  701. X    } else {
  702. X        argPtr->defValue = NULL;
  703. X    }
  704. X    ckfree((char *) fieldValues);
  705. X    }
  706. X
  707. X    Tcl_CreateCommand(interp, argv[1], InterpProc, (ClientData) procPtr,
  708. X        ProcDeleteProc);
  709. X    ckfree((char *) argArray);
  710. X    return TCL_OK;
  711. X
  712. X    procError:
  713. X    ckfree(procPtr->command);
  714. X    while (procPtr->argPtr != NULL) {
  715. X    argPtr = procPtr->argPtr;
  716. X    procPtr->argPtr = argPtr->nextPtr;
  717. X    ckfree((char *) argPtr);
  718. X    }
  719. X    ckfree((char *) procPtr);
  720. X    if (argArray != NULL) {
  721. X    ckfree((char *) argArray);
  722. X    }
  723. X    return result;
  724. X}
  725. X
  726. X/*
  727. X *----------------------------------------------------------------------
  728. X *
  729. X * TclGetFrame --
  730. X *
  731. X *    Given a description of a procedure frame, such as the first
  732. X *    argument to an "uplevel" or "upvar" command, locate the
  733. X *    call frame for the appropriate level of procedure.
  734. X *
  735. X * Results:
  736. X *    The return value is -1 if an error occurred in finding the
  737. X *    frame (in this case an error message is left in interp->result).
  738. X *    1 is returned if string was either a number or a number preceded
  739. X *    by "#" and it specified a valid frame.  0 is returned if string
  740. X *    isn't one of the two things above (in this case, the lookup
  741. X *    acts as if string were "1").  The variable pointed to by
  742. X *    framePtrPtr is filled in with the address of the desired frame
  743. X *    (unless an error occurs, in which case it isn't modified).
  744. X *
  745. X * Side effects:
  746. X *    None.
  747. X *
  748. X *----------------------------------------------------------------------
  749. X */
  750. X
  751. Xint
  752. XTclGetFrame(interp, string, framePtrPtr)
  753. X    Tcl_Interp *interp;        /* Interpreter in which to find frame. */
  754. X    char *string;        /* String describing frame. */
  755. X    CallFrame **framePtrPtr;    /* Store pointer to frame here (or NULL
  756. X                 * if global frame indicated). */
  757. X{
  758. X    register Interp *iPtr = (Interp *) interp;
  759. X    int level, result;
  760. X    CallFrame *framePtr;
  761. X
  762. X    if (iPtr->varFramePtr == NULL) {
  763. X    iPtr->result = "already at top level";
  764. X    return -1;
  765. X    }
  766. X
  767. X    /*
  768. X     * Parse string to figure out which level number to go to.
  769. X     */
  770. X
  771. X    result = 1;
  772. X    if (*string == '#') {
  773. X    if (Tcl_GetInt(interp, string+1, &level) != TCL_OK) {
  774. X        return -1;
  775. X    }
  776. X    if (level < 0) {
  777. X        levelError:
  778. X        Tcl_AppendResult(interp, "bad level \"", string, "\"",
  779. X            (char *) NULL);
  780. X        return -1;
  781. X    }
  782. X    } else if (isdigit(*string)) {
  783. X    if (Tcl_GetInt(interp, string, &level) != TCL_OK) {
  784. X        return -1;
  785. X    }
  786. X    level = iPtr->varFramePtr->level - level;
  787. X    } else {
  788. X    level = iPtr->varFramePtr->level - 1;
  789. X    result = 0;
  790. X    }
  791. X
  792. X    /*
  793. X     * Figure out which frame to use, and modify the interpreter so
  794. X     * its variables come from that frame.
  795. X     */
  796. X
  797. X    if (level == 0) {
  798. X    framePtr = NULL;
  799. X    } else {
  800. X    for (framePtr = iPtr->varFramePtr; framePtr != NULL;
  801. X        framePtr = framePtr->callerVarPtr) {
  802. X        if (framePtr->level == level) {
  803. X        break;
  804. X        }
  805. X    }
  806. X    if (framePtr == NULL) {
  807. X        goto levelError;
  808. X    }
  809. X    }
  810. X    *framePtrPtr = framePtr;
  811. X    return result;
  812. X}
  813. X
  814. X/*
  815. X *----------------------------------------------------------------------
  816. X *
  817. X * Tcl_UplevelCmd --
  818. X *
  819. X *    This procedure is invoked to process the "uplevel" Tcl command.
  820. X *    See the user documentation for details on what it does.
  821. X *
  822. X * Results:
  823. X *    A standard Tcl result value.
  824. X *
  825. X * Side effects:
  826. X *    See the user documentation.
  827. X *
  828. X *----------------------------------------------------------------------
  829. X */
  830. X
  831. X    /* ARGSUSED */
  832. Xint
  833. XTcl_UplevelCmd(dummy, interp, argc, argv)
  834. X    ClientData dummy;            /* Not used. */
  835. X    Tcl_Interp *interp;            /* Current interpreter. */
  836. X    int argc;                /* Number of arguments. */
  837. X    char **argv;            /* Argument strings. */
  838. X{
  839. X    register Interp *iPtr = (Interp *) interp;
  840. X    int result;
  841. X    CallFrame *savedVarFramePtr, *framePtr;
  842. X
  843. X    if (argc < 2) {
  844. X    uplevelSyntax:
  845. X    Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
  846. X        " ?level? command ?command ...?\"", (char *) NULL);
  847. X    return TCL_ERROR;
  848. X    }
  849. X
  850. X    /*
  851. X     * Find the level to use for executing the command.
  852. X     */
  853. X
  854. X    result = TclGetFrame(interp, argv[1], &framePtr);
  855. X    if (result == -1) {
  856. X    return TCL_ERROR;
  857. X    }
  858. X    argc -= (result+1);
  859. X    argv += (result+1);
  860. X
  861. X    /*
  862. X     * Modify the interpreter state to execute in the given frame.
  863. X     */
  864. X
  865. X    savedVarFramePtr = iPtr->varFramePtr;
  866. X    iPtr->varFramePtr = framePtr;
  867. X
  868. X    /*
  869. X     * Execute the residual arguments as a command.
  870. X     */
  871. X
  872. X    if (argc == 0) {
  873. X    goto uplevelSyntax;
  874. X    }
  875. X    if (argc == 1) {
  876. X    result = Tcl_Eval(interp, argv[0], 0, (char **) NULL);
  877. X    } else {
  878. X    char *cmd;
  879. X
  880. X    cmd = Tcl_Concat(argc, argv);
  881. X    result = Tcl_Eval(interp, cmd, 0, (char **) NULL);
  882. X    ckfree(cmd);
  883. X    }
  884. X    if (result == TCL_ERROR) {
  885. X    char msg[60];
  886. X    sprintf(msg, "\n    (\"uplevel\" body line %d)", interp->errorLine);
  887. X    Tcl_AddErrorInfo(interp, msg);
  888. X    }
  889. X
  890. X    /*
  891. X     * Restore the variable frame, and return.
  892. X     */
  893. X
  894. X    iPtr->varFramePtr = savedVarFramePtr;
  895. X    return result;
  896. X}
  897. X
  898. X/*
  899. X *----------------------------------------------------------------------
  900. X *
  901. X * TclFindProc --
  902. X *
  903. X *    Given the name of a procedure, return a pointer to the
  904. X *    record describing the procedure.
  905. X *
  906. X * Results:
  907. X *    NULL is returned if the name doesn't correspond to any
  908. X *    procedure.  Otherwise the return value is a pointer to
  909. X *    the procedure's record.
  910. X *
  911. X * Side effects:
  912. X *    None.
  913. X *
  914. X *----------------------------------------------------------------------
  915. X */
  916. X
  917. XProc *
  918. XTclFindProc(iPtr, procName)
  919. X    Interp *iPtr;        /* Interpreter in which to look. */
  920. X    char *procName;        /* Name of desired procedure. */
  921. X{
  922. X    Tcl_HashEntry *hPtr;
  923. X    Command *cmdPtr;
  924. X
  925. X    hPtr = Tcl_FindHashEntry(&iPtr->commandTable, procName);
  926. X    if (hPtr == NULL) {
  927. X    return NULL;
  928. X    }
  929. X    cmdPtr = (Command *) Tcl_GetHashValue(hPtr);
  930. X    if (cmdPtr->proc != InterpProc) {
  931. X    return NULL;
  932. X    }
  933. X    return (Proc *) cmdPtr->clientData;
  934. X}
  935. X
  936. X/*
  937. X *----------------------------------------------------------------------
  938. X *
  939. X * TclIsProc --
  940. X *
  941. X *    Tells whether a command is a Tcl procedure or not.
  942. X *
  943. X * Results:
  944. X *    If the given command is actuall a Tcl procedure, the
  945. X *    return value is the address of the record describing
  946. X *    the procedure.  Otherwise the return value is 0.
  947. X *
  948. X * Side effects:
  949. X *    None.
  950. X *
  951. X *----------------------------------------------------------------------
  952. X */
  953. X
  954. XProc *
  955. XTclIsProc(cmdPtr)
  956. X    Command *cmdPtr;        /* Command to test. */
  957. X{
  958. X    if (cmdPtr->proc == InterpProc) {
  959. X    return (Proc *) cmdPtr->clientData;
  960. X    }
  961. X    return (Proc *) 0;
  962. X}
  963. X
  964. X/*
  965. X *----------------------------------------------------------------------
  966. X *
  967. X * InterpProc --
  968. X *
  969. X *    When a Tcl procedure gets invoked, this routine gets invoked
  970. X *    to interpret the procedure.
  971. X *
  972. X * Results:
  973. X *    A standard Tcl result value, usually TCL_OK.
  974. X *
  975. X * Side effects:
  976. X *    Depends on the commands in the procedure.
  977. X *
  978. X *----------------------------------------------------------------------
  979. X */
  980. X
  981. Xstatic int
  982. XInterpProc(clientData, interp, argc, argv)
  983. X    ClientData clientData;    /* Record describing procedure to be
  984. X                 * interpreted. */
  985. X    Tcl_Interp *interp;        /* Interpreter in which procedure was
  986. X                 * invoked. */
  987. X    int argc;            /* Count of number of arguments to this
  988. X                 * procedure. */
  989. X    char **argv;        /* Argument values. */
  990. X{
  991. X    register Proc *procPtr = (Proc *) clientData;
  992. X    register Arg *argPtr;
  993. X    register Interp *iPtr = (Interp *) interp;
  994. X    char **args;
  995. X    CallFrame frame;
  996. X    char *value, *end;
  997. X    int result;
  998. X
  999. X    /*
  1000. X     * Set up a call frame for the new procedure invocation.
  1001. X     */
  1002. X
  1003. X    iPtr = procPtr->iPtr;
  1004. X    Tcl_InitHashTable(&frame.varTable, TCL_STRING_KEYS);
  1005. X    if (iPtr->varFramePtr != NULL) {
  1006. X    frame.level = iPtr->varFramePtr->level + 1;
  1007. X    } else {
  1008. X    frame.level = 1;
  1009. X    }
  1010. X    frame.argc = argc;
  1011. X    frame.argv = argv;
  1012. X    frame.callerPtr = iPtr->framePtr;
  1013. X    frame.callerVarPtr = iPtr->varFramePtr;
  1014. X    iPtr->framePtr = &frame;
  1015. X    iPtr->varFramePtr = &frame;
  1016. X
  1017. X    /*
  1018. X     * Match the actual arguments against the procedure's formal
  1019. X     * parameters to compute local variables.
  1020. X     */
  1021. X
  1022. X    for (argPtr = procPtr->argPtr, args = argv+1, argc -= 1;
  1023. X        argPtr != NULL;
  1024. X        argPtr = argPtr->nextPtr, args++, argc--) {
  1025. X
  1026. X    /*
  1027. X     * Handle the special case of the last formal being "args".  When
  1028. X     * it occurs, assign it a list consisting of all the remaining
  1029. X     * actual arguments.
  1030. X     */
  1031. X
  1032. X    if ((argPtr->nextPtr == NULL)
  1033. X        && (strcmp(argPtr->name, "args") == 0)) {
  1034. X        if (argc < 0) {
  1035. X        argc = 0;
  1036. X        }
  1037. X        value = Tcl_Merge(argc, args);
  1038. X        Tcl_SetVar(interp, argPtr->name, value, 0);
  1039. X        ckfree(value);
  1040. X        argc = 0;
  1041. X        break;
  1042. X    } else if (argc > 0) {
  1043. X        value = *args;
  1044. X    } else if (argPtr->defValue != NULL) {
  1045. X        value = argPtr->defValue;
  1046. X    } else {
  1047. X        Tcl_AppendResult(interp, "no value given for parameter \"",
  1048. X            argPtr->name, "\" to \"", argv[0], "\"",
  1049. X            (char *) NULL);
  1050. X        result = TCL_ERROR;
  1051. X        goto procDone;
  1052. X    }
  1053. X    Tcl_SetVar(interp, argPtr->name, value, 0);
  1054. X    }
  1055. X    if (argc > 0) {
  1056. X    Tcl_AppendResult(interp, "called \"", argv[0],
  1057. X        "\" with too many arguments", (char *) NULL);
  1058. X    result = TCL_ERROR;
  1059. X    goto procDone;
  1060. X    }
  1061. X
  1062. X    /*
  1063. X     * Invoke the commands in the procedure's body.
  1064. X     */
  1065. X
  1066. X    result = Tcl_Eval(interp, procPtr->command, 0, &end);
  1067. X    if (result == TCL_RETURN) {
  1068. X    result = TCL_OK;
  1069. X    } else if (result == TCL_ERROR) {
  1070. X    char msg[100];
  1071. X
  1072. X    /*
  1073. X     * Record information telling where the error occurred.
  1074. X     */
  1075. X
  1076. X    sprintf(msg, "\n    (procedure \"%.50s\" line %d)", argv[0],
  1077. X        iPtr->errorLine);
  1078. X    Tcl_AddErrorInfo(interp, msg);
  1079. X    } else if (result == TCL_BREAK) {
  1080. X    iPtr->result = "invoked \"break\" outside of a loop";
  1081. X    result = TCL_ERROR;
  1082. X    } else if (result == TCL_CONTINUE) {
  1083. X    iPtr->result = "invoked \"continue\" outside of a loop";
  1084. X    result = TCL_ERROR;
  1085. X    }
  1086. X
  1087. X    /*
  1088. X     * Delete the call frame for this procedure invocation (it's
  1089. X     * important to remove the call frame from the interpreter
  1090. X     * before deleting it, so that traces invoked during the
  1091. X     * deletion don't see the partially-deleted frame).
  1092. X     */
  1093. X
  1094. X    procDone:
  1095. X    iPtr->framePtr = frame.callerPtr;
  1096. X    iPtr->varFramePtr = frame.callerVarPtr;
  1097. X    TclDeleteVars(iPtr, &frame.varTable);
  1098. X    return result;
  1099. X}
  1100. X
  1101. X/*
  1102. X *----------------------------------------------------------------------
  1103. X *
  1104. X * ProcDeleteProc --
  1105. X *
  1106. X *    This procedure is invoked just before a command procedure is
  1107. X *    removed from an interpreter.  Its job is to release all the
  1108. X *    resources allocated to the procedure.
  1109. X *
  1110. X * Results:
  1111. X *    None.
  1112. X *
  1113. X * Side effects:
  1114. X *    Memory gets freed.
  1115. X *
  1116. X *----------------------------------------------------------------------
  1117. X */
  1118. X
  1119. Xstatic void
  1120. XProcDeleteProc(clientData)
  1121. X    ClientData clientData;        /* Procedure to be deleted. */
  1122. X{
  1123. X    register Proc *procPtr = (Proc *) clientData;
  1124. X    register Arg *argPtr;
  1125. X
  1126. X    ckfree((char *) procPtr->command);
  1127. X    for (argPtr = procPtr->argPtr; argPtr != NULL; ) {
  1128. X    Arg *nextPtr = argPtr->nextPtr;
  1129. X
  1130. X    ckfree((char *) argPtr);
  1131. X    argPtr = nextPtr;
  1132. X    }
  1133. X    ckfree((char *) procPtr);
  1134. X}
  1135. END_OF_FILE
  1136. if test 14709 -ne `wc -c <'tcl6.1/tclProc.c'`; then
  1137.     echo shar: \"'tcl6.1/tclProc.c'\" unpacked with wrong size!
  1138. fi
  1139. # end of 'tcl6.1/tclProc.c'
  1140. fi
  1141. if test -f 'tcl6.1/tclUnixStr.c' -a "${1}" != "-c" ; then 
  1142.   echo shar: Will not clobber existing file \"'tcl6.1/tclUnixStr.c'\"
  1143. else
  1144. echo shar: Extracting \"'tcl6.1/tclUnixStr.c'\" \(14884 characters\)
  1145. sed "s/^X//" >'tcl6.1/tclUnixStr.c' <<'END_OF_FILE'
  1146. X/* 
  1147. X * tclUnixStr.c --
  1148. X *
  1149. X *    This file contains procedures that generate strings
  1150. X *    corresponding to various UNIX-related codes, such
  1151. X *    as errno and signals.
  1152. X *
  1153. X * Copyright 1991 Regents of the University of California
  1154. X * Permission to use, copy, modify, and distribute this
  1155. X * software and its documentation for any purpose and without
  1156. X * fee is hereby granted, provided that this copyright
  1157. X * notice appears in all copies.  The University of California
  1158. X * makes no representations about the suitability of this
  1159. X * software for any purpose.  It is provided "as is" without
  1160. X * express or implied warranty.
  1161. X */
  1162. X
  1163. X#ifndef lint
  1164. Xstatic char rcsid[] = "$Header: /sprite/src/lib/tcl/RCS/tclUnixStr.c,v 1.6 91/09/30 09:07:57 ouster Exp $ SPRITE (Berkeley)";
  1165. X#endif /* not lint */
  1166. X
  1167. X#include "tclInt.h"
  1168. X#include "tclUnix.h"
  1169. X
  1170. X/*
  1171. X *----------------------------------------------------------------------
  1172. X *
  1173. X * Tcl_ErrnoId --
  1174. X *
  1175. X *    Return a textual identifier for the current errno value.
  1176. X *
  1177. X * Results:
  1178. X *    This procedure returns a machine-readable textual identifier
  1179. X *    that corresponds to the current errno value (e.g. "EPERM").
  1180. X *    The identifier is the same as the #define name in errno.h.
  1181. X *
  1182. X * Side effects:
  1183. X *    None.
  1184. X *
  1185. X *----------------------------------------------------------------------
  1186. X */
  1187. X
  1188. Xchar *
  1189. XTcl_ErrnoId()
  1190. X{
  1191. X    switch (errno) {
  1192. X#ifdef E2BIG
  1193. X    case E2BIG: return "E2BIG";
  1194. X#endif
  1195. X#ifdef EACCES
  1196. X    case EACCES: return "EACCES";
  1197. X#endif
  1198. X#ifdef EADDRINUSE
  1199. X    case EADDRINUSE: return "EADDRINUSE";
  1200. X#endif
  1201. X#ifdef EADDRNOTAVAIL
  1202. X    case EADDRNOTAVAIL: return "EADDRNOTAVAIL";
  1203. X#endif
  1204. X#ifdef EADV
  1205. X    case EADV: return "EADV";
  1206. X#endif
  1207. X#ifdef EAFNOSUPPORT
  1208. X    case EAFNOSUPPORT: return "EAFNOSUPPORT";
  1209. X#endif
  1210. X#ifdef EAGAIN
  1211. X    case EAGAIN: return "EAGAIN";
  1212. X#endif
  1213. X#ifdef EALIGN
  1214. X    case EALIGN: return "EALIGN";
  1215. X#endif
  1216. X#ifdef EALREADY
  1217. X    case EALREADY: return "EALREADY";
  1218. X#endif
  1219. X#ifdef EBADE
  1220. X    case EBADE: return "EBADE";
  1221. X#endif
  1222. X#ifdef EBADF
  1223. X    case EBADF: return "EBADF";
  1224. X#endif
  1225. X#ifdef EBADFD
  1226. X    case EBADFD: return "EBADFD";
  1227. X#endif
  1228. X#ifdef EBADMSG
  1229. X    case EBADMSG: return "EBADMSG";
  1230. X#endif
  1231. X#ifdef EBADR
  1232. X    case EBADR: return "EBADR";
  1233. X#endif
  1234. X#ifdef EBADRPC
  1235. X    case EBADRPC: return "EBADRPC";
  1236. X#endif
  1237. X#ifdef EBADRQC
  1238. X    case EBADRQC: return "EBADRQC";
  1239. X#endif
  1240. X#ifdef EBADSLT
  1241. X    case EBADSLT: return "EBADSLT";
  1242. X#endif
  1243. X#ifdef EBFONT
  1244. X    case EBFONT: return "EBFONT";
  1245. X#endif
  1246. X#ifdef EBUSY
  1247. X    case EBUSY: return "EBUSY";
  1248. X#endif
  1249. X#ifdef ECHILD
  1250. X    case ECHILD: return "ECHILD";
  1251. X#endif
  1252. X#ifdef ECHRNG
  1253. X    case ECHRNG: return "ECHRNG";
  1254. X#endif
  1255. X#ifdef ECOMM
  1256. X    case ECOMM: return "ECOMM";
  1257. X#endif
  1258. X#ifdef ECONNABORTED
  1259. X    case ECONNABORTED: return "ECONNABORTED";
  1260. X#endif
  1261. X#ifdef ECONNREFUSED
  1262. X    case ECONNREFUSED: return "ECONNREFUSED";
  1263. X#endif
  1264. X#ifdef ECONNRESET
  1265. X    case ECONNRESET: return "ECONNRESET";
  1266. X#endif
  1267. X#ifdef EDEADLK
  1268. X#ifndef EWOULDBLOCK
  1269. X    case EDEADLK: return "EDEADLK";
  1270. X#else
  1271. X#if EWOULDBLOCK != EDEADLK
  1272. X    case EDEADLK: return "EDEADLK";
  1273. X#endif /* EWOULDBLOCK != EDEADLK */
  1274. X#endif /* EWOULDBLOCK */
  1275. X#endif /* EDEADLK */
  1276. X#ifdef EDEADLOCK
  1277. X    case EDEADLOCK: return "EDEADLOCK";
  1278. X#endif
  1279. X#ifdef EDESTADDRREQ
  1280. X    case EDESTADDRREQ: return "EDESTADDRREQ";
  1281. X#endif
  1282. X#ifdef EDIRTY
  1283. X    case EDIRTY: return "EDIRTY";
  1284. X#endif
  1285. X#ifdef EDOM
  1286. X    case EDOM: return "EDOM";
  1287. X#endif
  1288. X#ifdef EDOTDOT
  1289. X    case EDOTDOT: return "EDOTDOT";
  1290. X#endif
  1291. X#ifdef EDQUOT
  1292. X    case EDQUOT: return "EDQUOT";
  1293. X#endif
  1294. X#ifdef EDUPPKG
  1295. X    case EDUPPKG: return "EDUPPKG";
  1296. X#endif
  1297. X#ifdef EEXIST
  1298. X    case EEXIST: return "EEXIST";
  1299. X#endif
  1300. X#ifdef EFAULT
  1301. X    case EFAULT: return "EFAULT";
  1302. X#endif
  1303. X#ifdef EFBIG
  1304. X    case EFBIG: return "EFBIG";
  1305. X#endif
  1306. X#ifdef EHOSTDOWN
  1307. X    case EHOSTDOWN: return "EHOSTDOWN";
  1308. X#endif
  1309. X#ifdef EHOSTUNREACH
  1310. X    case EHOSTUNREACH: return "EHOSTUNREACH";
  1311. X#endif
  1312. X#ifdef EIDRM
  1313. X    case EIDRM: return "EIDRM";
  1314. X#endif
  1315. X#ifdef EINIT
  1316. X    case EINIT: return "EINIT";
  1317. X#endif
  1318. X#ifdef EINPROGRESS
  1319. X    case EINPROGRESS: return "EINPROGRESS";
  1320. X#endif
  1321. X#ifdef EINTR
  1322. X    case EINTR: return "EINTR";
  1323. X#endif
  1324. X#ifdef EINVAL
  1325. X    case EINVAL: return "EINVAL";
  1326. X#endif
  1327. X#ifdef EIO
  1328. X    case EIO: return "EIO";
  1329. X#endif
  1330. X#ifdef EISCONN
  1331. X    case EISCONN: return "EISCONN";
  1332. X#endif
  1333. X#ifdef EISDIR
  1334. X    case EISDIR: return "EISDIR";
  1335. X#endif
  1336. X#ifdef EISNAME
  1337. X    case EISNAM: return "EISNAM";
  1338. X#endif
  1339. X#ifdef ELBIN
  1340. X    case ELBIN: return "ELBIN";
  1341. X#endif
  1342. X#ifdef EL2HLT
  1343. X    case EL2HLT: return "EL2HLT";
  1344. X#endif
  1345. X#ifdef EL2NSYNC
  1346. X    case EL2NSYNC: return "EL2NSYNC";
  1347. X#endif
  1348. X#ifdef EL3HLT
  1349. X    case EL3HLT: return "EL3HLT";
  1350. X#endif
  1351. X#ifdef EL3RST
  1352. X    case EL3RST: return "EL3RST";
  1353. X#endif
  1354. X#ifdef ELIBACC
  1355. X    case ELIBACC: return "ELIBACC";
  1356. X#endif
  1357. X#ifdef ELIBBAD
  1358. X    case ELIBBAD: return "ELIBBAD";
  1359. X#endif
  1360. X#ifdef ELIBEXEC
  1361. X    case ELIBEXEC: return "ELIBEXEC";
  1362. X#endif
  1363. X#ifdef ELIBMAX
  1364. X    case ELIBMAX: return "ELIBMAX";
  1365. X#endif
  1366. X#ifdef ELIBSCN
  1367. X    case ELIBSCN: return "ELIBSCN";
  1368. X#endif
  1369. X#ifdef ELNRNG
  1370. X    case ELNRNG: return "ELNRNG";
  1371. X#endif
  1372. X#ifdef ELOOP
  1373. X    case ELOOP: return "ELOOP";
  1374. X#endif
  1375. X#ifdef EMFILE
  1376. X    case EMFILE: return "EMFILE";
  1377. X#endif
  1378. X#ifdef EMLINK
  1379. X    case EMLINK: return "EMLINK";
  1380. X#endif
  1381. X#ifdef EMSGSIZE
  1382. X    case EMSGSIZE: return "EMSGSIZE";
  1383. X#endif
  1384. X#ifdef EMULTIHOP
  1385. X    case EMULTIHOP: return "EMULTIHOP";
  1386. X#endif
  1387. X#ifdef ENAMETOOLONG
  1388. X    case ENAMETOOLONG: return "ENAMETOOLONG";
  1389. X#endif
  1390. X#ifdef ENAVAIL
  1391. X    case ENAVAIL: return "ENAVAIL";
  1392. X#endif
  1393. X#ifdef ENET
  1394. X    case ENET: return "ENET";
  1395. X#endif
  1396. X#ifdef ENETDOWN
  1397. X    case ENETDOWN: return "ENETDOWN";
  1398. X#endif
  1399. X#ifdef ENETRESET
  1400. X    case ENETRESET: return "ENETRESET";
  1401. X#endif
  1402. X#ifdef ENETUNREACH
  1403. X    case ENETUNREACH: return "ENETUNREACH";
  1404. X#endif
  1405. X#ifdef ENFILE
  1406. X    case ENFILE: return "ENFILE";
  1407. X#endif
  1408. X#ifdef ENOANO
  1409. X    case ENOANO: return "ENOANO";
  1410. X#endif
  1411. X#if defined(ENOBUFS) && (!defined(ENOSR) || (ENOBUFS != ENOSR))
  1412. X    case ENOBUFS: return "ENOBUFS";
  1413. X#endif
  1414. X#ifdef ENOCSI
  1415. X    case ENOCSI: return "ENOCSI";
  1416. X#endif
  1417. X#ifdef ENODATA
  1418. X    case ENODATA: return "ENODATA";
  1419. X#endif
  1420. X#ifdef ENODEV
  1421. X    case ENODEV: return "ENODEV";
  1422. X#endif
  1423. X#ifdef ENOENT
  1424. X    case ENOENT: return "ENOENT";
  1425. X#endif
  1426. X#ifdef ENOEXEC
  1427. X    case ENOEXEC: return "ENOEXEC";
  1428. X#endif
  1429. X#ifdef ENOLCK
  1430. X    case ENOLCK: return "ENOLCK";
  1431. X#endif
  1432. X#ifdef ENOLINK
  1433. X    case ENOLINK: return "ENOLINK";
  1434. X#endif
  1435. X#ifdef ENOMEM
  1436. X    case ENOMEM: return "ENOMEM";
  1437. X#endif
  1438. X#ifdef ENOMSG
  1439. X    case ENOMSG: return "ENOMSG";
  1440. X#endif
  1441. X#ifdef ENONET
  1442. X    case ENONET: return "ENONET";
  1443. X#endif
  1444. X#ifdef ENOPKG
  1445. X    case ENOPKG: return "ENOPKG";
  1446. X#endif
  1447. X#ifdef ENOPROTOOPT
  1448. X    case ENOPROTOOPT: return "ENOPROTOOPT";
  1449. X#endif
  1450. X#ifdef ENOSPC
  1451. X    case ENOSPC: return "ENOSPC";
  1452. X#endif
  1453. X#ifdef ENOSR
  1454. X    case ENOSR: return "ENOSR";
  1455. X#endif
  1456. X#ifdef ENOSTR
  1457. X    case ENOSTR: return "ENOSTR";
  1458. X#endif
  1459. X#ifdef ENOSYM
  1460. X    case ENOSYM: return "ENOSYM";
  1461. X#endif
  1462. X#ifdef ENOSYS
  1463. X    case ENOSYS: return "ENOSYS";
  1464. X#endif
  1465. X#ifdef ENOTBLK
  1466. X    case ENOTBLK: return "ENOTBLK";
  1467. X#endif
  1468. X#ifdef ENOTCONN
  1469. X    case ENOTCONN: return "ENOTCONN";
  1470. X#endif
  1471. X#ifdef ENOTDIR
  1472. X    case ENOTDIR: return "ENOTDIR";
  1473. X#endif
  1474. X#ifdef ENOTEMPTY
  1475. X    case ENOTEMPTY: return "ENOTEMPTY";
  1476. X#endif
  1477. X#ifdef ENOTNAM
  1478. X    case ENOTNAM: return "ENOTNAM";
  1479. X#endif
  1480. X#ifdef ENOTSOCK
  1481. X    case ENOTSOCK: return "ENOTSOCK";
  1482. X#endif
  1483. X#ifdef ENOTTY
  1484. X    case ENOTTY: return "ENOTTY";
  1485. X#endif
  1486. X#ifdef ENOTUNIQ
  1487. X    case ENOTUNIQ: return "ENOTUNIQ";
  1488. X#endif
  1489. X#ifdef ENXIO
  1490. X    case ENXIO: return "ENXIO";
  1491. X#endif
  1492. X#ifdef EOPNOTSUPP
  1493. X    case EOPNOTSUPP: return "EOPNOTSUPP";
  1494. X#endif
  1495. X#ifdef EPERM
  1496. X    case EPERM: return "EPERM";
  1497. X#endif
  1498. X#ifdef EPFNOSUPPORT
  1499. X    case EPFNOSUPPORT: return "EPFNOSUPPORT";
  1500. X#endif
  1501. X#ifdef EPIPE
  1502. X    case EPIPE: return "EPIPE";
  1503. X#endif
  1504. X#ifdef EPROCLIM
  1505. X    case EPROCLIM: return "EPROCLIM";
  1506. X#endif
  1507. X#ifdef EPROCUNAVAIL
  1508. X    case EPROCUNAVAIL: return "EPROCUNAVAIL";
  1509. X#endif
  1510. X#ifdef EPROGMISMATCH
  1511. X    case EPROGMISMATCH: return "EPROGMISMATCH";
  1512. X#endif
  1513. X#ifdef EPROGUNAVAIL
  1514. X    case EPROGUNAVAIL: return "EPROGUNAVAIL";
  1515. X#endif
  1516. X#ifdef EPROTO
  1517. X    case EPROTO: return "EPROTO";
  1518. X#endif
  1519. X#ifdef EPROTONOSUPPORT
  1520. X    case EPROTONOSUPPORT: return "EPROTONOSUPPORT";
  1521. X#endif
  1522. X#ifdef EPROTOTYPE
  1523. X    case EPROTOTYPE: return "EPROTOTYPE";
  1524. X#endif
  1525. X#ifdef ERANGE
  1526. X    case ERANGE: return "ERANGE";
  1527. X#endif
  1528. X#if defined(EREFUSED) && (!defined(ECONNREFUSED) || (EREFUSED != ECONNREFUSED))
  1529. X    case EREFUSED: return "EREFUSED";
  1530. X#endif
  1531. X#ifdef EREMCHG
  1532. X    case EREMCHG: return "EREMCHG";
  1533. X#endif
  1534. X#ifdef EREMDEV
  1535. X    case EREMDEV: return "EREMDEV";
  1536. X#endif
  1537. X#ifdef EREMOTE
  1538. X    case EREMOTE: return "EREMOTE";
  1539. X#endif
  1540. X#ifdef EREMOTEIO
  1541. X    case EREMOTEIO: return "EREMOTEIO";
  1542. X#endif
  1543. X#ifdef EREMOTERELEASE
  1544. X    case EREMOTERELEASE: return "EREMOTERELEASE";
  1545. X#endif
  1546. X#ifdef EROFS
  1547. X    case EROFS: return "EROFS";
  1548. X#endif
  1549. X#ifdef ERPCMISMATCH
  1550. X    case ERPCMISMATCH: return "ERPCMISMATCH";
  1551. X#endif
  1552. X#ifdef ERREMOTE
  1553. X    case ERREMOTE: return "ERREMOTE";
  1554. X#endif
  1555. X#ifdef ESHUTDOWN
  1556. X    case ESHUTDOWN: return "ESHUTDOWN";
  1557. X#endif
  1558. X#ifdef ESOCKTNOSUPPORT
  1559. X    case ESOCKTNOSUPPORT: return "ESOCKTNOSUPPORT";
  1560. X#endif
  1561. X#ifdef ESPIPE
  1562. X    case ESPIPE: return "ESPIPE";
  1563. X#endif
  1564. X#ifdef ESRCH
  1565. X    case ESRCH: return "ESRCH";
  1566. X#endif
  1567. X#ifdef ESRMNT
  1568. X    case ESRMNT: return "ESRMNT";
  1569. X#endif
  1570. X#ifdef ESTALE
  1571. X    case ESTALE: return "ESTALE";
  1572. X#endif
  1573. X#ifdef ESUCCESS
  1574. X    case ESUCCESS: return "ESUCCESS";
  1575. X#endif
  1576. X#ifdef ETIME
  1577. X    case ETIME: return "ETIME";
  1578. X#endif
  1579. X#ifdef ETIMEDOUT
  1580. X    case ETIMEDOUT: return "ETIMEDOUT";
  1581. X#endif
  1582. X#ifdef ETOOMANYREFS
  1583. X    case ETOOMANYREFS: return "ETOOMANYREFS";
  1584. X#endif
  1585. X#ifdef ETXTBSY
  1586. X    case ETXTBSY: return "ETXTBSY";
  1587. X#endif
  1588. X#ifdef EUCLEAN
  1589. X    case EUCLEAN: return "EUCLEAN";
  1590. X#endif
  1591. X#ifdef EUNATCH
  1592. X    case EUNATCH: return "EUNATCH";
  1593. X#endif
  1594. X#ifdef EUSERS
  1595. X    case EUSERS: return "EUSERS";
  1596. X#endif
  1597. X#ifdef EVERSION
  1598. X    case EVERSION: return "EVERSION";
  1599. X#endif
  1600. X#ifdef EWOULDBLOCK
  1601. X    case EWOULDBLOCK: return "EWOULDBLOCK";
  1602. X#endif
  1603. X#ifdef EXDEV
  1604. X    case EXDEV: return "EXDEV";
  1605. X#endif
  1606. X#ifdef EXFULL
  1607. X    case EXFULL: return "EXFULL";
  1608. X#endif
  1609. X    }
  1610. X    return "unknown error";
  1611. X}
  1612. X
  1613. X/*
  1614. X *----------------------------------------------------------------------
  1615. X *
  1616. X * Tcl_SignalId --
  1617. X *
  1618. X *    Return a textual identifier for a signal number.
  1619. X *
  1620. X * Results:
  1621. X *    This procedure returns a machine-readable textual identifier
  1622. X *    that corresponds to sig.  The identifier is the same as the
  1623. X *    #define name in signal.h.
  1624. X *
  1625. X * Side effects:
  1626. X *    None.
  1627. X *
  1628. X *----------------------------------------------------------------------
  1629. X */
  1630. X
  1631. Xchar *
  1632. XTcl_SignalId(sig)
  1633. X    int sig;            /* Number of signal. */
  1634. X{
  1635. X    switch (sig) {
  1636. X#ifndef SIGIOT
  1637. X#ifdef SIGABRT
  1638. X    case SIGABRT: return "SIGABRT";
  1639. X#endif
  1640. X#endif /* SIGIOT */
  1641. X#ifdef SIGALRM
  1642. X    case SIGALRM: return "SIGALRM";
  1643. X#endif
  1644. X#ifdef SIGBUS
  1645. X    case SIGBUS: return "SIGBUS";
  1646. X#endif
  1647. X#ifdef SIGCHLD
  1648. X    case SIGCHLD: return "SIGCHLD";
  1649. X#endif
  1650. X#if defined(SIGCLD) && (!defined(SIGCHLD) || (SIGCLD != SIGCHLD))
  1651. X    case SIGCLD: return "SIGCLD";
  1652. X#endif
  1653. X#ifdef SIGCONT
  1654. X    case SIGCONT: return "SIGCONT";
  1655. X#endif
  1656. X#ifdef SIGEMT
  1657. X    case SIGEMT: return "SIGEMT";
  1658. X#endif
  1659. X#ifdef SIGFPE
  1660. X    case SIGFPE: return "SIGFPE";
  1661. X#endif
  1662. X#ifdef SIGHUP
  1663. X    case SIGHUP: return "SIGHUP";
  1664. X#endif
  1665. X#ifdef SIGILL
  1666. X    case SIGILL: return "SIGILL";
  1667. X#endif
  1668. X#ifdef SIGINT
  1669. X    case SIGINT: return "SIGINT";
  1670. X#endif
  1671. X#ifdef SIGIO
  1672. X    case SIGIO: return "SIGIO";
  1673. X#endif
  1674. X#ifdef SIGIOT
  1675. X    case SIGIOT: return "SIGIOT";
  1676. X#endif
  1677. X#ifdef SIGKILL
  1678. X    case SIGKILL: return "SIGKILL";
  1679. X#endif
  1680. X#ifdef SIGLOST
  1681. X    case SIGLOST: return "SIGLOST";
  1682. X#endif
  1683. X#ifdef SIGPIPE
  1684. X    case SIGPIPE: return "SIGPIPE";
  1685. X#endif
  1686. X#if defined(SIGPOLL) && (!defined(SIGIO) || (SIGPOLL != SIGIO))
  1687. X    case SIGPOLL: return "SIGPOLL";
  1688. X#endif
  1689. X#ifdef SIGPROF
  1690. X    case SIGPROF: return "SIGPROF";
  1691. X#endif
  1692. X#ifdef SIGPWR
  1693. X    case SIGPWR: return "SIGPWR";
  1694. X#endif
  1695. X#ifdef SIGQUIT
  1696. X    case SIGQUIT: return "SIGQUIT";
  1697. X#endif
  1698. X#ifdef SIGSEGV
  1699. X    case SIGSEGV: return "SIGSEGV";
  1700. X#endif
  1701. X#ifdef SIGSTOP
  1702. X    case SIGSTOP: return "SIGSTOP";
  1703. X#endif
  1704. X#ifdef SIGSYS
  1705. X    case SIGSYS: return "SIGSYS";
  1706. X#endif
  1707. X#ifdef SIGTERM
  1708. X    case SIGTERM: return "SIGTERM";
  1709. X#endif
  1710. X#ifdef SIGTRAP
  1711. X    case SIGTRAP: return "SIGTRAP";
  1712. X#endif
  1713. X#ifdef SIGTSTP
  1714. X    case SIGTSTP: return "SIGTSTP";
  1715. X#endif
  1716. X#ifdef SIGTTIN
  1717. X    case SIGTTIN: return "SIGTTIN";
  1718. X#endif
  1719. X#ifdef SIGTTOU
  1720. X    case SIGTTOU: return "SIGTTOU";
  1721. X#endif
  1722. X#ifdef SIGURG
  1723. X    case SIGURG: return "SIGURG";
  1724. X#endif
  1725. X#ifdef SIGUSR1
  1726. X    case SIGUSR1: return "SIGUSR1";
  1727. X#endif
  1728. X#ifdef SIGUSR2
  1729. X    case SIGUSR2: return "SIGUSR2";
  1730. X#endif
  1731. X#ifdef SIGVTALRM
  1732. X    case SIGVTALRM: return "SIGVTALRM";
  1733. X#endif
  1734. X#ifdef SIGWINCH
  1735. X    case SIGWINCH: return "SIGWINCH";
  1736. X#endif
  1737. X#ifdef SIGXCPU
  1738. X    case SIGXCPU: return "SIGXCPU";
  1739. X#endif
  1740. X#ifdef SIGXFSZ
  1741. X    case SIGXFSZ: return "SIGXFSZ";
  1742. X#endif
  1743. X    }
  1744. X    return "unknown signal";
  1745. X}
  1746. X
  1747. X/*
  1748. X *----------------------------------------------------------------------
  1749. X *
  1750. X * Tcl_SignalMsg --
  1751. X *
  1752. X *    Return a human-readable message describing a signal.
  1753. X *
  1754. X * Results:
  1755. X *    This procedure returns a string describing sig that should
  1756. X *    make sense to a human.  It may not be easy for a machine
  1757. X *    to parse.
  1758. X *
  1759. X * Side effects:
  1760. X *    None.
  1761. X *
  1762. X *----------------------------------------------------------------------
  1763. X */
  1764. X
  1765. Xchar *
  1766. XTcl_SignalMsg(sig)
  1767. X    int sig;            /* Number of signal. */
  1768. X{
  1769. X    switch (sig) {
  1770. X#ifndef SIGIOT
  1771. X#ifdef SIGABRT
  1772. X    case SIGABRT: return "SIGABRT";
  1773. X#endif
  1774. X#endif /* SIGIOT */
  1775. X#ifdef SIGALRM
  1776. X    case SIGALRM: return "alarm clock";
  1777. X#endif
  1778. X#ifdef SIGBUS
  1779. X    case SIGBUS: return "bus error";
  1780. X#endif
  1781. X#ifdef SIGCHLD
  1782. X    case SIGCHLD: return "child status changed";
  1783. X#endif
  1784. X#if defined(SIGCLD) && (!defined(SIGCHLD) || (SIGCLD != SIGCHLD))
  1785. X    case SIGCLD: return "child status changed";
  1786. X#endif
  1787. X#ifdef SIGCONT
  1788. X    case SIGCONT: return "continue after stop";
  1789. X#endif
  1790. X#ifdef SIGEMT
  1791. X    case SIGEMT: return "EMT instruction";
  1792. X#endif
  1793. X#ifdef SIGFPE
  1794. X    case SIGFPE: return "floating-point exception";
  1795. X#endif
  1796. X#ifdef SIGHUP
  1797. X    case SIGHUP: return "hangup";
  1798. X#endif
  1799. X#ifdef SIGILL
  1800. X    case SIGILL: return "illegal instruction";
  1801. X#endif
  1802. X#ifdef SIGINT
  1803. X    case SIGINT: return "interrupt";
  1804. X#endif
  1805. X#ifdef SIGIO
  1806. X    case SIGIO: return "input/output possible on file";
  1807. X#endif
  1808. X#ifdef SIGIOT
  1809. X    case SIGIOT: return "IOT instruction";
  1810. X#endif
  1811. X#ifdef SIGKILL
  1812. X    case SIGKILL: return "kill signal";
  1813. X#endif
  1814. X#ifdef SIGLOST
  1815. X    case SIGLOST: return "resource lost";
  1816. X#endif
  1817. X#ifdef SIGPIPE
  1818. X    case SIGPIPE: return "write on pipe with no readers";
  1819. X#endif
  1820. X#if defined(SIGPOLL) && (!defined(SIGIO) || (SIGPOLL != SIGIO))
  1821. X    case SIGPOLL: return "input/output possible on file";
  1822. X#endif
  1823. X#ifdef SIGPROF
  1824. X    case SIGPROF: return "profiling alarm";
  1825. X#endif
  1826. X#ifdef SIGPWR
  1827. X    case SIGPWR: return "power-fail restart";
  1828. X#endif
  1829. X#ifdef SIGQUIT
  1830. X    case SIGQUIT: return "quit signal";
  1831. X#endif
  1832. X#ifdef SIGSEGV
  1833. X    case SIGSEGV: return "segmentation violation";
  1834. X#endif
  1835. X#ifdef SIGSTOP
  1836. X    case SIGSTOP: return "stop";
  1837. X#endif
  1838. X#ifdef SIGSYS
  1839. X    case SIGSYS: return "bad argument to system call";
  1840. X#endif
  1841. X#ifdef SIGTERM
  1842. X    case SIGTERM: return "software termination signal";
  1843. X#endif
  1844. X#ifdef SIGTRAP
  1845. X    case SIGTRAP: return "trace trap";
  1846. X#endif
  1847. X#ifdef SIGTSTP
  1848. X    case SIGTSTP: return "stop signal from tty";
  1849. X#endif
  1850. X#ifdef SIGTTIN
  1851. X    case SIGTTIN: return "background tty read";
  1852. X#endif
  1853. X#ifdef SIGTTOU
  1854. X    case SIGTTOU: return "background tty write";
  1855. X#endif
  1856. X#ifdef SIGURG
  1857. X    case SIGURG: return "urgent I/O condition";
  1858. X#endif
  1859. X#ifdef SIGUSR1
  1860. X    case SIGUSR1: return "user-defined signal 1";
  1861. X#endif
  1862. X#ifdef SIGUSR2
  1863. X    case SIGUSR2: return "user-defined signal 2";
  1864. X#endif
  1865. X#ifdef SIGVTALRM
  1866. X    case SIGVTALRM: return "virtual time alarm";
  1867. X#endif
  1868. X#ifdef SIGWINCH
  1869. X    case SIGWINCH: return "window changed";
  1870. X#endif
  1871. X#ifdef SIGXCPU
  1872. X    case SIGXCPU: return "exceeded CPU time limit";
  1873. X#endif
  1874. X#ifdef SIGXFSZ
  1875. X    case SIGXFSZ: return "exceeded file size limit";
  1876. X#endif
  1877. X    }
  1878. X    return "unknown signal";
  1879. X}
  1880. END_OF_FILE
  1881. if test 14884 -ne `wc -c <'tcl6.1/tclUnixStr.c'`; then
  1882.     echo shar: \"'tcl6.1/tclUnixStr.c'\" unpacked with wrong size!
  1883. fi
  1884. # end of 'tcl6.1/tclUnixStr.c'
  1885. fi
  1886. echo shar: End of archive 12 \(of 33\).
  1887. cp /dev/null ark12isdone
  1888. MISSING=""
  1889. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 ; do
  1890.     if test ! -f ark${I}isdone ; then
  1891.     MISSING="${MISSING} ${I}"
  1892.     fi
  1893. done
  1894. if test "${MISSING}" = "" ; then
  1895.     echo You have unpacked all 33 archives.
  1896.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1897. else
  1898.     echo You still need to unpack the following archives:
  1899.     echo "        " ${MISSING}
  1900. fi
  1901. ##  End of shell archive.
  1902. exit 0
  1903.  
  1904. exit 0 # Just in case...
  1905. -- 
  1906. Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
  1907. Sterling Software, IMD           UUCP:     uunet!sparky!kent
  1908. Phone:    (402) 291-8300         FAX:      (402) 291-4362
  1909. Please send comp.sources.misc-related mail to kent@uunet.uu.net.
  1910.