Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | Merging with the current TOT. Very few conflicts, mostly in the generated files. |
|---|---|
| Timelines: | family | ancestors | descendants | both | macosx-8-4-branch |
| Files: | files | file ages | folders |
| SHA1: |
f469a31a06ac17104991c4c670511eeb |
| User & Date: | wolfsuit 2002-02-05 02:21:57.000 |
Context
|
2002-02-17
| ||
| 19:25 | Saving my prefs... check-in: 016ba87769 user: wolfsuit tags: macosx-8-4-branch | |
|
2002-02-05
| ||
| 02:21 | Merging with the current TOT. Very few conflicts, mostly in the generated files. check-in: f469a31a06 user: wolfsuit tags: macosx-8-4-branch | |
|
2001-12-12
| ||
| 02:34 | Removing all the versioned library folders from the install phase of the Tcl library target. check-in: 321a4c43f0 user: wolfsuit tags: macosx-8-4-branch | |
Changes
Changes to ChangeLog.
1 2 3 4 5 6 7 | 2001-10-12 Jeff Hobbs <jeffh@ActiveState.com> * library/encoding/ebcdic.enc: * tools/encoding/ebcdic.txt: EBCDIC charset mapping. [Patch #219323] (nijtmans) * library/encoding/tis-620.enc: | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 |
2002-02-04 Jim Ingham <jingham@apple.com>
* Merge with the current TOT.
2002-02-04 Andreas Kupries <andreas_kupries@users.sourceforge.net>
* doc/open.n: Fixed [Bug 511540], added cross-reference to 'pid'
as the command to use to retrieve the pid of a command pipeline
created via 'open'.
2002-02-01 Jeff Hobbs <jeffh@ActiveState.com>
* generic/tclCmdMZ.c (Tcl_RegexpObjCmd): handle quirky about case
earlier to avoid shimmering problem.
2002-02-01 Andreas Kupries <andreas_kupries@users.sourceforge.net>
* tests/io.test: io-39.22 split into two tests, one platform
dependent, the other not. -eofchar is not empty on the windows
platform.
2002-02-01 Vince Darley <vincentdarley@users.sourceforge.net>
* generic/tclTest.c: fix to picky windows compiler problem
with the 'MainLoop' function declaration.
2002-01-31 Andreas Kupries <andreas_kupries@users.sourceforge.net>
* win/tclWinFCmd.c: TIP 27: Applied patch fixing CONST warnings on
behalf of Don Porter <dgp@users.sourceforge.net>.
2002-01-30 Don Porter <dgp@users.sourceforge.net>
* generic/tcl.decls:
* generic/tcl.h:
* generic/tclInt.h: For each interface identified in the TIP 27
changes below as a POTENTIAL INCOMPATIBILITY, the source of the
incompatibility has been parameterized so that it can be
removed. When compiling extension code against the Tcl header
files, use the compiler flag -DUSE_NON_CONST to remove the
irresolvable source incompatibilities introduced by the TIP 27
changes. Resolvable changes are left for extension authors to
resolve.
* generic/tclDecls.h: make genstubs
2002-01-30 Vince Darley <vincentdarley@users.sourceforge.net>
* doc/FileSystem.3: added documentation for 3 public
functions which had been overlooked. Fixes [Bug 507701].
* unix/mkLinks: make mklinks
2002-01-29 Jeff Hobbs <jeffh@ActiveState.com>
* tests/regexpComp.test:
* generic/tclCompCmds.c (TclCompileRegexpCmd): enhanced to support
-nocase and -- options.
2002-01-28 Mo DeJong <mdejong@users.sourceforge.net>
* unix/tcl.m4 (SC_LOAD_TCLCONFIG):
* win/tcl.m4 (SC_LOAD_TCLCONFIG): Set TCL_LIB_SPEC,
TCL_STUB_LIB_SPEC, and TCL_STUB_LIB_PATH to the
values of TCL_BUILD_LIB_SPEC, TCL_BUILD_STUB_LIB_SPEC,
and TCL_BUILD_STUB_LIB_PATH when tclConfig.sh is loaded
from the build directory. A Tcl extension should
make use of the non-build versions of these variables
since they will work in both cases. This modification
was described in TIP 34.
2002-01-28 Jeff Hobbs <jeffh@ActiveState.com>
* win/tclWinReg.c (regConnectRegistryProc,RecursiveDeleteKey)
(DeleteKey,GetKeyNames,GetType,GetValue,OpenSubKey,SetValue):
redid the CONSTification as previous changes caused failing tests.
* tests/regexpComp.test (new):
* generic/tclInt.h:
* generic/tclBasic.c: added TclCompileRegexpCmd entry
* generic/tclCompCmds.c (TclCompileStringCmd): corrected to return
TCL_OUT_LINE_COMPILE instead of TCL_ERROR for parsing errors, so
it only throws the error for runtime compile, in case the user
modifies 'string'.
(TclCompileRegexpCmd): first try at a byte-compiled regexp
command. It handles static strings and ^$ bounded static strings.
(TclCompileAppendCmd): made TclPushVarName call always use
TCL_CREATE_VAR as numWords is always > 2 at that point.
* generic/tclExecute.c (TclExecuteByteCode:INST_LIST): correct
possibly dangerous decr in macro call.
* win/tclWinInit.c (TclpFindVariable): CONSTification touch-up
* win/tclWinReg.c (OpenSubKey): corrected bug introduced in
CONSTification that dropped pointer reference.
* ChangeLog.2000 (new file):
* ChangeLog: broke changes from 2000 into ChangeLog.2000 to reduce
size of the main ChangeLog.
2002-01-28 David Gravereaux <davygrvy@pobox.com>
* generic/tclPlatDecls.h: Added preprocessor logic to force a
typedef of TCHAR when __STDC__ is defined when using the uncommon
-Za compiler switch with the microsoft compiler.
2002-01-27 Don Porter <dgp@users.sourceforge.net>
* doc/package.n: Documented global namespace context for script
evaluation by [package require].
2002-01-27 Daniel Steffen <das@users.sourceforge.net>
* generic/tclInt.decls:
* generic/tclIntPlatDecls.h:
* mac/tclMacChan.c:
* mac/tclMacFCmd.c:
* mac/tclMacFile.c:
* mac/tclMacInit.c:
* mac/tclMacLoad.c:
* mac/tclMacResource.c:
* mac/tclMacSock.c: TIP 27 CONSTification induced changes
* tests/event.test:
* tests/main.test: added catches/constraints to test that
use features that don't exist on the mac.
2002-01-25 Mo DeJong <mdejong@users.sourceforge.net>
Make -eofchar and -translation options read only for
server sockets. [Bug 496733]
* generic/tclIO.c (Tcl_GetChannelOption, Tcl_SetChannelOption):
Instead of returning nothing for the -translation option
on a server socket, always return "auto". Return the empty
string enclosed in quotes for the -eofchar option on
a server socket. Fixup -eofchar usage message so that
it matches the implementation.
* tests/io.test: Add -eofchar tests and -translation tests
to ensure options are read only on server sockets.
* tests/socket.test: Update tests to account for -eofchar
and -translation option changes.
2002-01-25 Don Porter <dgp@users.sourceforge.net>
* compat/strstr.c (strstr):
* generic/tclCmdAH.c (Tcl_FormatObjCmd):
* generic/tclCmdIL.c (InfoNameOfExecutableCmd):
* generic/tclEnv.c (ReplaceString):
* generic/tclFileName.c (ExtractWinRoot):
* generic/tclIO.c (FlushChannel,Tcl_BadChannelOption):
* generic/tclStringObj.c (AppendUnicodeToUtfRep):
* generic/tclThreadTest.c (TclCreateThread):
* generic/tclUtf.c (Tcl_UtfPrev):
* mac/tclMacFCmd.c (TclpObjListVolumes):
* mac/tclMacResource.c (TclMacRegisterResourceFork,
BuildResourceForkList):
* win/tclWinInit.c (AppendEnvironment): Sought out and eliminated
instances of CONST-casting that are no longer needed after the
TIP 27 effort.
* Following is [Patch 501006]
* generic/tclInt.decls (Tcl_AddInterpResolvers, Tcl_Export,
Tcl_FindNamespace, Tcl_GetInterpResolvers, Tcl_ForgetImport,
Tcl_Import, Tcl_RemoveInterpResolvers):
* generic/tclNamesp.c (Tcl_Export, Tcl_Import, Tcl_ForgetImport,
Tcl_FindNamespace):
* generic/tclResolve.c (Tcl_AddInterpResolvers,Tcl_GetInterpResolvers,
Tcl_RemoveInterpResolvers): Updated APIs in generic/tclResolve.c
and generic/tclNamesp.c according to the guidelines of TIP 27.
* generic/tclIntDecls.h: make genstubs
* Following is [Patch 505630]
* doc/AddErrorInfo.3:
* generic/tcl.decls (Tcl_LogCommandInfo):
* generic/tclBasic.c (Tcl_LogCommandInfo): Updated interfaces
of generic/tclBasic.cc according to TIP 27.
* generic/tclDecls.h: make genstubs
* Following is [Patch 506818]
* doc/Hash.3:
* generic/tcl.decls (Tcl_HashStats):
* generic/tclHash.c (Tcl_HashStats): Updated APIs of generic/tclHash.c
according to guidelines of TIP 27.
* generic/tclDecls.h: make genstubs
* generic/tclVar.c (Tcl_ArrayObjCmd): Updated callers.
* Following is [Patch 506807]
* doc/ObjectType.3:
* generic/tcl.decls (Tcl_GetObjType):
* generic/tclObj.c (Tcl_GetObjType): Updated APIs of generic/tclObj.c
according to guidelines of TIP 27.
* generic/tclDecls.h: make genstubs
* Following is [Patch 507304]
* doc/Encoding.3:
* generic/tcl.decls (Tcl_WinUtfToTChar,Tcl_WinTCharToUtf):
* win/tclWin32Dll.c (Tcl_WinUtfToTChar,Tcl_WinTCharToUtf):
Updated interfaces in win/tclWin32Dll.c according to TIP 27.
* generic/tclPlatDecls.h: make genstubs
* generic/tclIOUtil.c (TclpNativeToNormalized):
* win/tclWinFCmd.c (TclpObjNormalizePath):
* win/tclWinFile.c (TclpFindExecutable,TclpMatchInDirectory,
NativeIsExec,NativeStat):
* win/tclWinLoad.c (TclpLoadFile):
* win/tclWinPipe.c (TclpOpenFile,ApplicationType):
* win/tclWinReg.c (regConnectRegistryProc,RecursiveDeleteKey,DeleteKey,
GetKeyNames,GetType,GetValue,OpenSubKey,SetValue):
* win/tclWinSerial.c (SerialSetOptionProc): Update callers.
* Following is [Patch 505072]
* doc/Concat.3:
* doc/Encoding.3:
* doc/Filesystem.3:
* doc/Macintosh.3:
* doc/OpenFileChnl.3
* doc/SetResult.3:
* doc/SetVar.3:
* doc/SplitList.3:
* doc/SplitPath.3:
* doc/Translate.3:
* generic/tcl.h (Tcl_FSMatchInDirectoryProc):
* generic/tclInt.h (TclpMatchInDirectory):
* generic/tcl.decls (Tcl_Concat,Tcl_GetStringResult,Tcl_GetVar,
Tcl_GetVar2,Tcl_JoinPath,Tcl_Merge,Tcl_OpenCommandChannel,Tcl_SetVar,
Tcl_SetVar2,Tcl_SplitList,Tcl_SplitPath,Tcl_TranslateFileName,
Tcl_ExternalToUtfDString,Tcl_GetEncodingName,Tcl_UtfToExternalDString,
Tcl_GetDefaultEncodingDir,Tcl_SetDefaultEncodingDir,
Tcl_FSMatchInDirectory,Tcl_MacEvalResource,Tcl_MacFindResource):
* generic/tclInt.decls (TclCreatePipeline,TclGetEnv,TclpGetCwd,
TclpCreateProcess):
* mac/tclMacFile.c (TclpGetCwd):
* generic/tclEncoding.c (Tcl_GetDefaultEncodingDir,
Tcl_SetDefaultEncodingDir,Tcl_GetEncodingName,
Tcl_ExternalToUtfDString,Tcl_UtfToExternalDString, OpenEncodingFile,
LoadEscapeEncoding):
* generic/tclFileName.c (DoTildeSubst,Tcl_JoinPath,Tcl_SplitPath,
Tcl_TranslateFileName):
* generic/tclIOUtil.c (Tcl_FSMatchInDirectory):
* generic/tclPipe.c (FileForRedirect,TclCreatePipeline,
Tcl_OpenCommandChannel):
* generic/tclResult.c (Tcl_GetStringResult):
* generic/tclUtil.c (Tcl_Concat,Tcl_SplitList,Tcl_Merge):
* generic/tclVar.c (Tcl_GetVar,Tcl_GetVar2,Tcl_SetVar,Tcl_SetVar2):
* mac/tclMacResource.c (Tcl_MacEvalResource,Tcl_MacFindResource):
Updated interfaces of generic/tclEncoding, generic/tclFilename.c,
generic/tclIOUtil.c, generic/tclPipe.c, generic/tclResult.c,
generic/tclUtil.c, generic/tclVar.c and mac/tclMacResource.c according
to TIP 27. Tcl_TranslateFileName rewritten as wrapper around
VFS-aware version.
***POTENTIAL INCOMPATIBILITY***
Includes source incompatibilities: argv arguments of Tcl_Concat,
Tcl_JoinPath, Tcl_OpenCommandChannel, Tcl_Merge; argvPtr arguments of
Tcl_SplitList and Tcl_SplitPath.
* generic/tclDecls.h:
* generic/tclIntDecls.h: make genstubs
* generic/tclCkalloc.c (MemoryCmd):
* generic/tclClock.c (FormatClock):
* generic/tclCmdAH.c (Tcl_CaseObjCmd,Tcl_EncodingObjCmd,Tcl_FileObjCmd):
* generic/tclCmdIL.c (InfoLibraryCmd,InfoPatchLevelCmd,
InfoTclVersionCmd):
* generic/tclCompCmds.c (TclCompileForeachCmd):
* generic/tclCompCmds.h (TclCompileForeachCmd):
* generic/tclCompile.c (TclFindCompiledLocal):
* generic/tclEnv.c (TclSetupEnv,TclSetEnv,Tcl_PutEnv,TclGetEnv,
EnvTraceProc):
* generic/tclEvent.c (Tcl_BackgroundError):
* generic/tclIO.c (Tcl_BadChannelOption,Tcl_SetChannelOption):
* generic/tclIOCmd.c (Tcl_ExecObjCmd,Tcl_OpenObjCmd):
* generic/tclIOSock.c (TclSockGetPort):
* generic/tclIOUtil.c (SetFsPathFromAny):
* generic/tclLink.c (LinkTraceProc):
* generic/tclMain.c (Tcl_Main):
* generic/tclNamesp.c (TclTeardownNamespace):
* generic/tclProc.c (TclCreateProc):
* generic/tclTest.c (TestregexpObjCmd,TesttranslatefilenameCmd,
TestchmodCmd,GetTimesCmd,TestsetCmd,TestOpenFileChannelProc1,
TestOpenFileChannelProc2,TestOpenFileChannelProc3,AsyncHandlerProc,
TestpanicCmd):
* generic/tclThreadTest.c (ThreadErrorProc,ThreadEventProc):
* generic/tclUtil.c (TclPrecTraceProc):
* mac/tclMacFCmd.c (GetFileSpecs):
* mac/tclMacFile.c (TclpMatchInDirectory):
* mac/tclMacInit.c (TclpInitLibraryPath,Tcl_SourceRCFile):
* mac/tclMacOSA.c (tclOSAStore,tclOSALoad):
* mac/tclMacResource.c (Tcl_MacEvalResource):
* unix/tclUnixFCmd.c (TclpObjNormalizePath):
* unix/tclUnixFile.c (TclpMatchInDirectory,TclpGetUserHome,TclpGetCwd,
TclpReadLink):
* unix/tclUnixInit.c (TclpInitLibraryPath,TclpSetVariables,
Tcl_SourceRCFile):
* unix/tclUnixPipe.c (TclpOpenFile,TclpCreateTempFile,
TclpCreateProcess):
* win/tclWinFile.c (TclpGetCwd,TclpMatchInDirectory):
* win/tclWinInit.c (TclpInitLibraryPath,Tcl_SourceRCFile,
TclpSetVariables):
* win/tclWinPipe.c (TclpCreateProcess): Updated callers.
2002-01-24 Don Porter <dgp@users.sourceforge.net>
* generic/tclIOUtil.c (SetFsPathFromAny): Corrected tilde-substitution
of pathnames where > 1 separator follows the ~. [Bug 504950]
2002-01-24 Jeff Hobbs <jeffh@ActiveState.com>
* library/http/pkgIndex.tcl:
* library/http/http.tcl: don't add port in default case to handle
broken servers. http bumped to 2.4.1 [Bug #504508]
2002-01-23 Andreas Kupries <andreas_kupries@users.sourceforge.net>
* unix/mkLinks: Regenerated.
* doc/CrtChannel.3:
* doc/ChnlStack.3: Moved documentation for 'Tcl_GetTopChannel'
from 'CrtChannel' to 'ChnlStack'. Added documentation of
'Tcl_GetStackedChannel'. Bug #506147 reported by Mark Patton
<msp@users.sourceforge.net>.
2002-01-23 Don Porter <dgp@users.sourceforge.net>
* win/tclWinFile.c (NativeAccess,NativeStat,NativeIsExec,
TclpGetUserHome):
* win/tclWinPort.h (TclWinSerialReopen):
* win/tclWinSerial.c (TclWinSerialReopen):
* win/tclWinSock.c (Tcl_OpenTcpServer): Corrections to earlier
TIP 27 changes. Thanks to Andreas Kupries for the feedback.
* generic/tclPlatDecls.h: make genstubs
* doc/GetHostName.3:
* doc/GetOpnFl.3:
* doc/OpenTcp.3:
* tcl.decls (Tcl_GetHostName,Tcl_GetOpenFile,Tcl_OpenTcpClient,
Tcl_OpenTclServer):
* mac/tclMacSock.c (CreateSocket,Tcl_OpenTcpClient,Tcl_OpenTcpServer,
Tcl_GetHostName,GetHostFromString):
* unix/tclUnixChan.c (CreateSocket,CreateSocketAddress,
Tcl_OpenTcpClient,Tcl_OpenTcpServer,Tcl_GetOpenFile):
* unix/tclUnixSock.c (Tcl_GetHostName):
* win/tclWinSock.c (CreateSocket,CreateSocketAddress,
Tcl_OpenTcpClient,Tcl_OpenTcpServer,Tcl_GetHostName):
Updated socket interfaces according to TIP 27.
* generic/tclCmdIL.c (InfoHostnameCmd): Updated callers.
* generic/tclDecls.h: make genstubs
2002-01-21 David Gravereaux <davygrvy@pobox.com>
* generic/tclLoadNone.c: TclpLoadFile() didn't match proto of
typedef Tcl_FSLoadFileProc. OK'd by vincentdarley.
[Patch #502488]
2002-01-21 Andreas Kupries <andreas_kupries@users.sourceforge.net>
* generic/tclIO.c (WriteChars): Fix for SF #506297, reported by
Martin Forssen <ruric@users.sourceforge.net>. The encoding
chosen in the script exposing the bug writes out three intro
characters when TCL_ENCODING_START is set, but does not consume
any input as TCL_ENCODING_END is cleared. As some output was
generated the enclosing loop calls UtfToExternal again, again
with START set. Three more characters in the out and still no
use of input ... To break this infinite loop we remove
TCL_ENCODING_START from the set of flags after the first call
(no condition is required, the later calls remove an unset flag,
which is a no-op). This causes the subsequent calls to
UtfToExternal to consume and convert the actual input.
2002-01-21 Don Porter <dgp@users.sourceforge.net>
* generic/tclTest.c: Converted declarations of TestReport file system
to more portable form. [Bug 501417].
* generic/tcl.decls (Tcl_TraceCommand,Tcl_UntraceCommand,
Tcl_CommandTraceInfo):
* generic/tclCmdMZ.c (Tcl_TraceCommand,Tcl_UntraceCommand,
Tcl_CommandTraceInfo): Updated APIs in generic/tclCmdMZ.c
according to the guidelines of TIP 27.
* generic/tclDecls.h: make genstubs
2002-01-18 Don Porter <dgp@users.sourceforge.net>
* win/tclWinChan.c:
* win/tclWinFCmd.c:
* win/tclWinFile.c: Overlooked callers of Tcl_FSGetNativePath
* win/tclWinDde.c:
* win/tclWinReg.c: Overlooked callers of Tcl_GetIndexFromObj
2002-01-18 Daniel Steffen <das@users.sourceforge.net>
* generic/tclThreadTest.c:
* mac/tclMacChan.c:
* mac/tclMacFCmd.c:
* mac/tclMacFile.c:
* mac/tclMacLoad.c:
* mac/tclMacResource.c: TIP 27 CONSTification broke the mac
build in a number of places.
2002-01-17 Andreas Kupries <andreas_kupries@users.sourceforge.net>
* generic/tclIOCmd.c (Tcl_GetsObjCmd): Fixed bug #504642 as
reported by Brian Griffin <bgriffin@users.sourceforge.net>,
using his patch. Before the patch the generic I/O layer held an
unannounced reference to the interp result to store the read
line into. This unfortunately has disastrous results if the
channel driver executes a tcl script to perform its operation,
this freeing the interp result. In that case we are
dereferencing essentially a dangling reference. It is not truly
dangling because the object is in the free list, but this only
causes us to smash the free list and have the error occur later
somewhere else. The patch simply creates a new object for the
line and later sets it into the interp result when we are done
with reading.
2002-01-16 Mo DeJong <mdejong@users.sourceforge.net>
* unix/tcl.m4 (SC_LOAD_TCLCONFIG):
* win/tcl.m4 (SC_LOAD_TCLCONFIG): Subst TCL_DBGX
into TCL_STUB_LIB_FILE and TCL_STUB_LIB_FLAG
variables so that an extension does not need
to subst TCL_DBGX into its makefile. [Tk Bug 504356]
2002-01-16 Don Porter <dgp@users.sourceforge.net>
* doc/FileSystem.3:
* doc/GetCwd.3:
* doc/GetIndex.3:
* generic/tcl.decls (Tcl_GetIndexFromObj, Tcl_GetIndexFromObjStruct,
Tcl_GetCwd, Tcl_FSFileAttrStrings, Tcl_FSGetNativePath,
Tcl_FSGetTranslatedStringPath):
* generic/tcl.h (Tcl_FSFileAttrStringsProc):
* generic/tclFCmd.c (TclFileAttrsCmd):
* generic/tclIOUtil.c (Tcl_GetCwd,NativeFileAttrStrings,
Tcl_FSFileAttrStrings,Tcl_FSGetTranslatedStringPath,
Tcl_FSGetNativePath):
* generic/tclIndexObj.c (Tcl_GetIndexFromObj,Tcl_GetIndexFromObjStruct):
More TIP 27 updates in tclIOUtil.c and tclIndexObj.c that were
overlooked before. [Patch 504671]
***POTENTIAL INCOMPATIBILITY***
Includes a source incompatibility in the tablePtr arguments of
the Tcl_GetIndexFromObj* routines.
* generic/tclDecls.h: make genstubs
* generic/tclBinary.c (Tcl_BinaryObjCmd):
* generic/tclClock.c (Tcl_ClockObjCmd):
* generic/tclCmdAH.c (Tcl_EncodingObjCmd, Tcl_FileObjCmd):
* generic/tclCmdIL.c (Tcl_InfoObjCmd,Tcl_LsearchObjCmd,Tcl_LsortObjCmd):
* generic/tclCmdMZ.c (Tcl_TraceObjCmd,Tcl_RegexpObjCmd,Tcl_RegsubObjCmd,
Tcl_StringObjCmd,Tcl_SubstObjCmd,Tcl_SwitchObjCmd,
TclTraceCommandObjCmd,TclTraceVariableObjCmd):
* generic/tclCompCmds.c (TclCompileStringCmd):
* generic/tclEvent.c (Tcl_UpdateObjCmd):
* generic/tclFileName.c (Tcl_GlobObjCmd):
* generic/tclIO.c (Tcl_FileEventObjCmd):
* generic/tclIOCmd.c (Tcl_SeekObjCmd,Tcl_ExecObjCmd,Tcl_SocketObjCmd,
Tcl_FcopyObjCmd):
* generic/tclInterp.c (Tcl_InterpObjCmd,SlaveObjCmd):
* generic/tclNamesp.c (Tcl_NamespaceObjCmd):
* generic/tclPkg.c (Tcl_PackageObjCmd):
* generic/tclTest.c (Tcltest_Init,TestencodingObjCmd,TestgetplatformCmd,
TestlocaleCmd,TestregexpObjCmd,TestsaveresultCmd,
TestGetIndexFromObjStructObjCmd,TestReportFileAttrStrings):
* generic/tclTestObj.c (TestindexObjCmd,TeststringObjCmd):
* generic/tclTimer.c (Tcl_AfterObjCmd):
* generic/tclVar.c (Tcl_ArrayObjCmd):
* mac/tclMacFCmd.c (SetFileFinderAttributes):
* unix/tclUnixChan.c (TclpOpenFileChannel):
* unix/tclUnixFCmd.c (tclpFileAttrStrings):
* unix/tclUnixFile.c (TclpObjAccess,TclpObjChdir,TclpObjStat,
TclpObjLstat):
* win/tclWinFCmd.c (tclpFileAttrStrings): Updated callers.
* doc/RegExp.3:
* doc/Utf.3:
* generic/tcl.decls:
* generic/tclInt.decls:
* generic/tclRegexp.c:
* generic/tclUtf.c: Updated APIs in generic/tclUtf.c and
generic/tclRegexp.c according to the guidelines of TIP 27.
[Patch 471509]
* generic/regc_locale.c (element,cclass):
* generic/tclCmdMZ.c (Tcl_StringObjCmd):
* generic/tclFileName.c (TclpGetNativePathType,SplitMacPath):
* generic/tclIO.c (ReadChars):
* mac/tclMacLoad.c (TclpLoadFile):
* win/tclWinFile.c (TclpGetUserHome): Updated callers.
* generic/tclDecls.h:
* generic/tclIntDecls.h: make genstubs
* doc/ParseCmd.3 (Tcl_ParseVar):
* generic/tcl.decls (Tcl_ParseVar):
* generic/tclParse.c (Tcl_ParseVar):
* generic/tclTest.c (TestparsevarObjCmd): Updated APIs in
generic/tclParse.c according to the guidelines of TIP 27. Updated
callers. [Patch 501046]
* generic/tclDecls.h: make genstubs
* generic/tcl.decls (Tcl_RecordAndEval):
* generic/tclDecls.h: make genstubs
* generic/tclHistory.c (Tcl_RecordAndEval): Updated APIs in
generic/tclHistory.c according to the guidelines of TIP 27.
[Patch 504091]
* doc/CrtSlave.3:
* generic/tcl.decls (Tcl_CreateAlias, Tcl_CreateAliasObj,
Tcl_CreateSlave, Tcl_GetAlias, Tcl_GetAliasObj, Tcl_GetSlave):
* generic/tclInterp.c (Tcl_CreateAlias, Tcl_CreateAliasObj,
Tcl_CreateSlave, Tcl_GetAlias, Tcl_GetAliasObj, Tcl_GetSlave):
Updated APIs in the file generic/tclInterp.c according to the
guidelines of TIP 27. [Patch 501371]
***POTENTIAL INCOMPATIBILITY***
Includes a source incompatibility in the targetCmdPtr arguments of
the Tcl_GetAlias* routines.
* generic/tclDecls.h: make genstubs
2002-01-15 Don Porter <dgp@users.sourceforge.net>
* doc/SetErrno.3 (Tcl_ErrnoMsg): Corrected documentation for
Tcl_ErrnoMsg; it takes an integer argument. Thanks to Georgios
Petasis. [Bug 468183]
* doc/AddErrInfo.3 (Tcl_PosixError):
* doc/Eval.3 (Tcl_EvalFile):
* doc/FileSystem.c (Tcl_FSOpenFileChannel,Tcl_FSOpenFileChannelProc):
* doc/OpenFileChnl.3 (Tcl_OpenFileChannel):
* doc/SetErrno.3 (Tcl_ErrnoId,Tcl_ErrnoMsg):
* doc/Signal.3 (Tcl_SignalId,Tcl_SignalMsg):
* generic/tcl.decls (Tcl_ErrnoId,TclErrnoMsg,Tcl_EvalFile,
Tcl_OpenFileChannel,Tcl_PosixError,Tcl_SignalId,Tcl_SignalMsg,
Tcl_FSOpenFileChannel):
* generic/tcl.h (Tcl_FSOpenFileChannelProc):
* generic/tclIO.c (FlushChannel):
* generic/tclIOUtil.c (Tcl_OpenFileChannel,Tcl_EvalFile,TclGetOpenMode,
Tcl_PosixError,Tcl_FSOpenFileChannel):
* generic/tclInt.decls (TclGetOpenMode):
* generic/tclInt.h (TclOpenFileChannelProc_,TclGetOpenMode,
TclpOpenFileChannel):
* generic/tclPipe.c (TclCleanupChildren):
* generic/tclPosixStr.c (Tcl_ErrnoId,Tcl_ErrnoMsg,Tcl_SignalId,
Tcl_SignalMsg):
* generic.tclTest.c (PretendTclpOpenFileChannel,
TestOpenFileChannelProc1,TestOpenFileChannelProc2,
TestOpenFileChannelProc3,TestReportOpenFileChannel):
* mac/tclMacChan.c (TclpOpenFileChannel):
* unix/tclUnixChan.c (TclpOpenFileChannel):
* win/tclWinChan.c (TclpOpenFileChannel): Updated APIs in
generic/tclIOUtil.c and generic/tclPosixStr.c according to the
guidelines of TIP 27. Updated callers. [Patch 499196]
* generic/tclDecls.h:
* generic/tclIntDecls.h: make genstubs
* doc/CrtChannel.3:
* doc/OpenFileChnl.3:
* generic/tcl.decls:
* generic/tclIO.h:
* generic/tclIO.c (DoWrite, Tcl_RegisterChannel, Tcl_GetChannel,
Tcl_CreateChannel, Tcl_GetChannelName, CloseChannel, Tcl_Write,
Tcl_WriteRaw, Tcl_Ungets, Tcl_BadChannelOption, Tcl_GetChannelOption,
Tcl_SetChannelOption, Tcl_GetChannelNamesEx, Tcl_ChannelName):
Updated APIs in the file generic/tclIO.c according to the guidelines
of TIP 27. Several minor documentation corrections as well.
[Patch 503565]
* generic/tclDecls.h: make genstubs
* generic/tcl.h (Tcl_DriverOutputProc, Tcl_DriverGetOptionProc,
Tcl_DriverSetOptionProc):
* generic/tclIOGT.c (TransformOutputProc, TransformGetOptionProc,
TransformSetOptionProc):
* mac/tclMacChan.c (FileOutput, StdIOOutput):
* man/tclMacSock.c (TcpGetOptionProc, TcpOutput):
* unix/tclUnixChan.c (FileOutputProc, TcpGetOptionProc, TcpOutputProc,
TtyGetOptionProc, TtySetOptionProc):
* unix/tclUnixPipe.c (PipeOuputProc):
* win/tclWinChan.c (FileOutputProc):
* win/tclWinConsole.c (ConsleOutputProc):
* win/tclWinPipe.c (PipeOuputProc):
* win/tclWinSerial.c (SerialOutputProc, SerialGetOptionProc,
SerialSetOptionProc):
* win/tclWinSock.c (TcpGetOptionProc, TcpOutput): Updated channel
driver interface according to the guidelines of TIP 27. See also
[Bug 500348].
* doc/CrtChannel.3:
* generic/tcl.h:
* generic/tclIO.c:
* generic/tclIO.h:
* generic/tclInt.h:
* tools/checkLibraryDoc.tcl:
Moved Tcl_EolTranslation enum declaration from generic/tcl.h to
generic/tclInt.h (renamed to TclEolTranslation). It is not used
anywhere in Tcl's public interface.
2002-01-14 Don Porter <dgp@users.sourceforge.net>
* doc/GetIndex.3:
* doc/WrongNumArgs.3:
* generic/tcl.decls (Tcl_GetIndexFromObj, Tcl_GetIndexFromObjStruct,
Tcl_WrongNumArgs):
* generic/tclIndexObj.c (Tcl_GetIndexFromObj, Tcl_GetIndexFromObjStruct,
Tcl_WrongNumArgs): Updated APIs in the file generic/tclIndexObj.c
according to the guidelines of TIP 27. [Patch 501491]
* generic/tclDecls.h: make genstubs
2002-01-11 Mo DeJong <mdejong@users.sourceforge.net>
* unix/configure: Regen.
* unix/configure.in:
* win/configure: Regen.
* win/configure.in: Use ${libdir} instead of ${exec_prefix}/lib
to properly support the --libdir option to configure. [Bug 489370]
2002-01-11 Andreas Kupries <andreas_kupries@users.sourceforge.net>
* win/tclWinSerial.c (SerialSetOptionProc): Applied patch for SF
bug #500348 supplied by Rolf Schroedter
<schroedter@users.sourceforge.net>. The function modified the
contents of the the 'value' string and now does not do this
anymore. This is a followup to the change made on 2001-12-17.
2002-01-11 David Gravereaux <davygrvy@pobox.com>
* win/makefile.vc: Removed -GD compiler option. It was intended
for future use, but MS is again changing the future at their whim.
The D4002 warning was harmless though, but someone using VC .NET
logged it as a concern. [Bug #501565]
2002-01-11 Mo DeJong <mdejong@users.sourceforge.net>
* unix/Makefile.in: Burn Tcl build directory
into tcltest executable to avoid crashes caused
by ld loading a previously installed version
of the tcl shared library. [Bug 218110]
2002-01-10 Don Porter <dgp@users.sourceforge.net>,
Kevin Kenny <kennykb@users.sourceforge.net>
* unix/tclLoadDld.c (TclpLoadFile): syntax error: unbalanced
parens. Kevin notes that it's far from clear that this file is
ever included in an actual build; Linux without dlopen appears to
be a nonexistent configuration.
2002-01-08 Don Porter <dgp@users.sourceforge.net>,
Kevin Kenny <kennykb@users.sourceforge.net>
* doc/StaticPkg.3 (Tcl_StaticPackage):
* generic/tcl.decls (Tcl_StaticPackage):
* generic/tclDecls.h (Tcl_StaticPackage):
* generic/tclInt.decls (TclGuessPackageName):
* generic/tclInt.h (TclGuessPackageName):
* generic/tclLoad.c (Tcl_StaticPackage):
* generic/tclLoadNone.c (TclGuessPackageName):
* mac/tclMacLoad.c (TclGuessPackageName):
* unix/tclLoadAout.c (TclGuessPackageName):
* unix/tclLoadDl.c (TclGuessPackageName):
* unix/tclLoadDld.c (TclGuessPackageName):
* unix/tclLoadDyld.c (TclGuessPackageName):
* unix/tclLoadNext.c (TclGuessPackageName):
* unix/tclLoadOSF.c (TclGuessPackageName):
* unix/tclLoadShl.c (TclGuessPackageName):
* win/tclWinLoad.c (TclGuessPackageName): Updated APIs in
the files */tcl*Load*.c according to the guidelines of TIP 27.
[Patch 501096]
2002-01-09 Don Porter <dgp@users.sourceforge.net>
* generic/tclTest.c (MainLoop):
* tests/main.test (Tcl_Main-1.{3,4,5,6}): Corrected some non-portable
tests from the new Tcl_Main changes. Thanks to Kevin Kenny.
2002-01-07 Don Porter <dgp@users.sourceforge.net>
* generic/tclEvent.c (TclInExit):
* generic/tclIOUtil.c (SetFsPathFromAbsoluteNormalized,
SetFsPathFromAny,Tcl_FSNewNativePath,DupFsPathInternalRep):
* generic/tclListObj.c (TclLsetList,TclLsetFlat): Added some type
casts to satisfy picky compilers.
* generic/tclMain.c: Bug fix: neglected the NULL case in
TclGetStartupScriptFileName(). Broke Tk/wish.
2002-01-05 Don Porter <dgp@users.sourceforge.net>
* doc/Tcl_Main.3:
* generic/tclMain.c: Substantial rewrite and expanded documentation
of Tcl_Main to correct a number of bugs and flaws:
* Interactive Tcl_Main can now enter a main loop, exit
that loop and continue interactive operations. The loop
may even exit in the midst of interactive command typing
without loss of the partial command. [Bugs 486453, 474131]
* Tcl_Main now gracefully handles deletion of its master
interpreter.
* Interactive Tcl_Main can now operate with non-blocking stdin
* Interactive Tcl_Main can now detect EOF on stdin even in
mid-command. [Bug 491341]
* Added VFS-aware internal routines for managing the
startup script selection.
* Tcl variable 'tcl_interactive' is now linked to C variable
'tty' so that one can disable/enable interactive prompts
at the script level when there is no startup script. This
is meant for use by the test suite.
* Consistent use of the Tcl libraries standard channels as
returned by Tcl_GetStdChannel(); as opposed to the channels
named 'stdin', 'stdout', and 'stderr' in the master interp,
which can be different or unavailable.
* Tcl_Main now calls Tcl_Exit() if evaluation of [exit] in the
master interpreter returns, assuring Tcl_Main does not return.
* Documented Tcl_Main's absence from public stub table
* Documented that Tcl_Main does not return.
* Documented Tcl variables set by Tcl_Main.
* All prompts are done from a single procedure, Prompt.
* Use of Tcl_Obj-enabled interfaces everywhere.
* generic/tclInt.decls (TclGetStartupScriptPath,
TclSetStartupScriptPath): New internal VFS-aware routines for
managing the startup script of Tcl_Main.
* generic/tclIntDecls.h:
* generic/tclStubInit.c: make genstubs
* generic/tclTest.c (TestsetmainloopCmd,TestexitmainloopCmd,
Tcltest_Init,TestinterpdeleteCmd):
* tests/main.test (new): Added new file to test suite that
thoroughly tests generic/tclMain.c; added some new test commands
for testing Tcl_SetMainLoop().
2002-01-04 Don Porter <dgp@users.sourceforge.net>
* generic/tclThreadJoin.c (TclRememberJoinableThread,TclJoinThread):
Replaced Tcl_Alloc and Tcl_Free calls with ckalloc and ckfree so that
memory debugging is supported.
2002-01-04 Daniel Steffen <das@users.sourceforge.net>
* mac/tclMacTime.c (TclpGetTZName): fix for daylight savings TZName bug
2002-01-03 Don Porter <dgp@users.sourceforge.net>
* doc/FileSystem.3:
* generic/tclIOUtil.c: Updated some old uses of "fileName" to
new VFS terminology, "pathPtr".
2002-01-03 Donal K. Fellows <fellowsd@cs.man.ac.uk>
* tests/basic.test (basic-39.4): Greatly simplified test while
still leaving it so that it crashes when run without the fix to
the [foreach] implementation.
* generic/tclCmdAH.c (Tcl_ForeachObjCmd): Stopped Bug #494348 from
happening by not trying to be so clever with cacheing; if nothing
untoward is happening anyway, the less efficient technique will
only add a few instruction cycles (one function call and a few
derefs/assigns per list per iteration, with no change in the
number of tests) and if something odd *is* going on, the code is
now far more robust.
* tests/basic.test (basic-39.4): Reproducable script from Bug #494348
2002-01-02 Donal K. Fellows <fellowsd@cs.man.ac.uk>
* tests/util.test (Wrapper_Tcl_StringMatch,util-5.*): Rewrote so
the test is performed with the right internal function since
[string match] no longer uses Tcl_StringCaseMatch internally.
* tests/string.test (string-11.51):
* generic/tclUtf.c (Tcl_UniCharCaseMatch):
* generic/tclUtil.c (Tcl_StringCaseMatch): Fault with matching
case-insensitive non-ASCII patterns containing upper case
characters. [Bug #233257]
2001-12-28 Jeff Hobbs <jeffh@ActiveState.com>
* library/init.tcl: make sure env(COMSPEC) on Windows is executed
with the right case, as it may otherwise fail inexplicably.
2001-12-28 Don Porter <dgp@users.sourceforge.net>
* generic/tclCkalloc.c (MemoryCmd, TclFinalizeMemorySubsystem):
Added the [memory onexit] command, intended to replace [checkmem].
* doc/DumpActiveMemory.3:
* doc/memory.n: Updated documentation for [memory] and related
matters. [Bug 487677]
* mac/tclMacBOAMain.c (Tcl_Main, CheckmemCmd): Removed all the
machinery for the [checkmem] command that is completely duplicated
by code in generic/tclCkalloc.c.
* generic/tclBinary.c:
* generic/tclListObj.c:
* generic/tclObj.c:
* generic/tclStringObj.c: Removed references to [checkmem] in
comments, referencing [memory active] instead, since it is
documented.
2001-12-28 Daniel Steffen <das@users.sourceforge.net>
* mac/tclMacInit.c:
* mac/tclMacTclCode.r: synced up tclInit features to unix/win:
implemented TclSetPreInitScript support, use of existing tclInit
proc if defined, check of default encoding dir if set. Changed
script library resource names to lowercase (i.e. same as
corresponding files). Used Tcl_JoinPath instead of string append.
Check that system encoding could be loaded before utf translating
the LibraryPath.
* mac/tclMacApplication.r:
* mac/tclMacLibrary.r:
* mac/tclMacOSA.r:
* mac/tclMacResource.r: minor version resources cleanup
2001-12-21 Mo DeJong <mdejong@users.sourceforge.net>
* unix/tcl.m4 (SC_PATH_TCLCONFIG, SC_PATH_TKCONFIG):
Search for config file using exec_prefix instead of
prefix when no --with-tcl or --with-tk argument is used. [Bug 492418]
2001-12-21 Daniel Steffen <das@users.sourceforge.net>
* unix/tcl.m4: fixed incorrect SHLIB_LD_LIBS
setting for MacOSX / Darwin.
* unix/configure: Regen.
* unix/mkLinks.tcl: improved case-insensitive
filesystem support.
* unix/mkLinks: Regen.
2001-12-19 Don Porter <dgp@users.sourceforge.net>
* unix/Makefile.in (dist): corrected use of eolFix.tcl on
working files. It should operate on distributed files. [Bug 495120]
2001-12-19 David Gravereaux <davygrvy@pobox.com>
* tools/tcl.wse.in: Fix for #495120. tcl.wse.in was
stored in cvs with improper <eol>. This resulted in
corrupted <eol> when checked-out on translating CVS
clients such as windows (CRCRLF) and mac (CRCR).
2001-12-19 Mo DeJong <mdejong@users.sourceforge.net>
* unix/configure:
* unix/tcl.m4 (SC_CONFIG_CFLAGS): Update
SunOS 5.[0-6] target so that correct linker
options are passed to gcc or ld. [Tk Bug 220863]
2001-12-19 Mo DeJong <mdejong@users.sourceforge.net>
* unix/README: Update to account for changes
in the unix/dltest directory, the way autoconf
is run, and the new "make shell" target.
2001-12-19 Mo DeJong <mdejong@users.sourceforge.net>
* unix/Makefile.in: Rename dltest to dlpkgs to
fix problem where lib files were not getting
built because dltest/ directory already existed.
2001-12-19 Jeff Hobbs <jeffh@ActiveState.com>
* win/tclWinSerial.c (SerialCheckProc): corrected time
calculations to be unsigned. (schroedter)
2001-12-18 Mo DeJong <mdejong@users.sourceforge.net>
* unix/Makefile.in: Define new dltest target that
simply does a cd to dltest/ before running make.
There is no need for the separate configure
script that was previously being used.
* unix/configure: Regen.
* unix/configure.in: Subst into dltest/Makefile.
* unix/dltest/Makefile.in: Define LIBS using
DL_LIBS, LIBS, and MATH_LIBS variables instead
of TCL_LIBS variable from tclConfig.sh.
* unix/dltest/README: Update readme to account for new
configure free implementation.
* unix/dltest/configure: Removed.
* unix/dltest/configure.in: Removed.
2001-12-18 Donal K. Fellows <fellowsd@cs.man.ac.uk>
* generic/tcl.h (TCL_STUB_MAGIC): Added cast to force type to be
an int and get rid of a persistent and pointless warning with
SunPro compiler.
* generic/tclCkalloc.c (Tcl_AttemptDbCkalloc,Tcl_AttemptDbCkrealloc):
* generic/tcl.decls (Tcl_AttemptDbCkalloc,Tcl_AttemptDbCkrealloc):
Made the file parameters to these functions into CONST char *,
like they always should have been to match the other Tcl*Db* API
functions.
2001-12-17 Andreas Kupries <andreas_kupries@users.sourceforge.net>
* Applied #219311 on behalf of Rolf Schroedter
<schroedter@users.sourceforge.net> to prevent fcopy on serial
ports from flooding the event queue.
2001-12-11 Miguel Sofer <msofer@users.sourceforge.net>
* doc/CrtInterp.3:
* generic/tclBasic.c: docs and comments corrections [Bug 493412]
Bug & patch by Don Porter.
2001-12-14 Donal K. Fellows <fellowsd@cs.man.ac.uk>
* win/tclWinNotify.c (Tcl_FinalizeNotifier): Stop Tcl on Windows
from crashing when shutdown from a non-Tcl thread. Fixes Bug
#217982 [orig. 5804] reported by Hugh Vu and Gene Leache. I'm
not convinced that the shutdown process is right even with this,
but it was definitely wrong without...
2001-12-13 Andreas Kupries <andreas_kupries@users.sourceforge.net>
* win/tclWinSock.c (TcpGetOptionProc): Fix for tcl bug item
#478565 reported by an unknown person. Bypasses all calls to
"gethostbyaddr" for address "0.0.0.0" to prevent delays on
Win/NT.
2001-12-12 Jeff Hobbs <jeffh@ActiveState.com>
* doc/Preserve.3: doc'd TCL_DYNAMIC use. [Patch #483989] (porter)
2001-12-12 Andreas Kupries <andreas_kupries@users.sourceforge.net>
* generic/tclIO.c (Tcl_GetsObj): Applied patch for bug #491341 as
provided by Don Porter <dgp@users.sourceforge.net>. Fixes the
assumption of having an empty Tcl_Obj to work with.
2001-12-11 Miguel Sofer <msofer@users.sourceforge.net>
* generic/tclCompCmds.c:
* generic/tclCompile.c:
* generic/tclExecute.c: consistency patch, to make all
instructions that pop a variable number of Tcl_Obj's off the
execution stack take the number of popped objects as first
operand. Modified *only* the new instructions
INST_LIST_INDEX_MULTI and INST_LSET_FLAT, so this has no effect
on bytecodes generated up to tcl8.4a3 inclusive.
* generic/tclExecute.c: fix debug messages in INST_LSET_LIST.
* generic/tclCompCmds.c (TclCompileLindexCmd):
* generic/tclCompExpr.c (CompileMathFuncCall): removed the last
two overestimates of the necessary stack depth for bytecodes in
the fix of [Bug 483611].
2001-12-10 Andreas Kupries <andreas_kupries@users.sourceforge.net>
* unix/tclUnixPipe.c (TclpCreateProcess): Applied Don Porter's
patch fixing bug #437489.
2001-12-10 Miguel Sofer <msofer@users.sourceforge.net>
* generic/tclEvent.c:
* tests/event.test: fix background error reporting in the absence
of a bgerror proc [Bug 219142].
2001-12-10 Don Porter <dgp@users.sourceforge.net>
* doc/Access.3:
* doc/CrtChannel.3:
* doc/DString.3:
* doc/ExprLong.3:
* doc/FileSystem.3:
* doc/GetStdChan.3:
* doc/OpenFileChnl.3:
* doc/StdChannels.3:
* doc/TCL_MEM_DEBUG.3:
* doc/Tcl_Main.3:
* doc/Utf.3:
* doc/file.n:
* doc/tclsh.1: Several typo and formatting corrections discovered
during conversion to TMML. Thanks to Joe English. [Patch 490514]
* unix/mkLinks: 'make mklinks'
2001-12-10 Miguel Sofer <msofer@users.sourceforge.net>
* generic/tclCompCmds.c:
* generic/tclCompExpr.c:
* generic/tclCompile.c:
* generic/tclCompile.h:
* generic/tclExecute.c:
* generic/tclProc.c: fixed the calculation of the maximal stack
depth required by bytecodes [Bug 483611].
2001-12-07 Miguel Sofer <msofer@users.sourceforge.net>
* generic/tclVar.c:
* tests/trace.test: restored consistency in refCount accounting by
array traces [Bug #4484339], submitted by Don Porter.
2001-12-06 Donal K. Fellows <fellowsd@cs.man.ac.uk>
* tests/parseExpr.test, tests/for.test, tests/expr.test:
* tests/expr-old.test, tests/compile.test, tests/compExpr.test
* tests/compExpr-old.test: Kept up to date with syntax errors.
* generic/tclParseExpr.c (ParsePrimaryExpr): Rewrote to give even
better syntax errors in the fairly common case of an identifier
without decorations by guessing based on the currently available
functions. Also made messages consistent between memdebug and
ordinary builds.
2001-12-05 Miguel Sofer <msofer@users.sourceforge.net>
* generic/tclVar.c:
* tests/trace.test: new algorithm for [array get], safe when there
are traces that modify the array [Bug #449893].
2001-12-04 Donal K. Fellows <fellowsd@cs.man.ac.uk>
* tests/compExpr-old.test, tests/compExpr.test, tests/compile.test:
* tests/expr-old.test, tests/expr.test, tests/for.test:
* tests/while.test, tests/if.test: Rewrite to handle more specific
syntax errors.
* tests/parseExpr.test: Rewrite to get rid of dup test numbers and
handle more specific syntax errors.
* generic/tclParseExpr.c (LogSyntaxError): Added a detail message
argument to help explain what the syntax error is.
(Tcl_ParseExpr, ParseCondExpr, ParsePrimaryExpr): Added detail
messages.
(UNKNOWN_CHAR): New lexeme for characters that are always illegal
in expressions outside strings.
2001-12-03 Donal K. Fellows <fellowsd@cs.man.ac.uk>
* doc/expr.n: Various documentation improvements in relation to
the function calls. Includes fix for Bug #487704 submitted by
Devin Eyre.
2001-12-03 David Gravereaux <davygrvy@pobox.com>
* win/makefile.vc: Some install target bugs repaired along with
$(TCLSTUBLIB) added to the dependencies rather than implicit through
the dde and reg extensions which don't happen to always require it
for some build types.
2001-11-30 Miguel Sofer <msofer@users.sourceforge.net>
* generic/tclVar.c: Tcl_Preserve'ing VarTrace structures to avoid
memory corruption. Patch for [Bug: 484334] provided by Don Porter
2001-11-29 Miguel Sofer <msofer@users.sourceforge.net>
* tests/namespace.test: modified namespace-41.2, added 41.3
{knownbug} after discussion with Don Porter and Kevin Kenny.
2001-11-29 Miguel Sofer <msofer@users.sourceforge.net>
* tests/namespace.test: added namespace-41.2, a simpler test for
[Bug: 231259]
2001-11-29 Donal K. Fellows <fellowsd@cs.man.ac.uk>
* generic/tclBinary.c (BINARY_SCAN_MAX_CACHE, Tcl_BinaryObjCmd,
ScanNumber): Added caching scheme to reduce number of object
allocations when doing scans of large repetitive binary strings.
See comments in file for reasoning behind implementation.
Suggested by Miguel Sofer in Patch #429916, but independently
implemented.
2001-11-28 Donal K. Fellows <fellowsd@cs.man.ac.uk>
* doc/regsub.n, doc/regexp.n: Converted dangling references to
METASYNTAX section into references to the re_syntax manual page.
2001-11-27 D. Richard Hipp <drh@hwaci.com>
* win/tclWinFCmd.c: Fix a coredump in the filename normalizer
code for Win95/98.
2001-11-27 David Gravereaux <davygrvy@pobox.com>
* win/makefile.vc: Removed the Tk reference for the 'winhelp' target.
Converge at install will need to be the solution for Tk and all other
extensions.
2001-11-27 Donal K. Fellows <fellowsd@cs.man.ac.uk>
* tests/cmdAH.test (cmdAH-24.2): Made test less sensitive to OS
preemption, but perfection isn't practical [Bug 463189, reported
by Don Porter.]
* tests/switch.test (switch-9.*): Added tests to exercise more of
the argument checking. (switch-7.2,switch-7.3): Test changed
behaviour slightly.
* generic/tclCmdMZ.c (Tcl_SwitchObjCmd): Reworked argument parsing
to be stricter about what it accepts. This should make uses of
the [switch] command be more maintainable. [Bug 475397, reported
by Don Porter.]
2001-11-26 Don Porter <dgp@users.sourceforge.net>
* generic/tclIntPlatDecls.h: 'make genstubs' after changes
in 2001-11-23 commit from Daniel Steffen.
2001-11-24 Mo DeJong <mdejong@users.sourceforge.net>
* unix/Makefile.in: Add comments to better describe
TCL_EXE and when it should be available.
* win/Makefile.in: Add TCL_EXE variable to be used
by rules like `make genstubs`. Don't set TCL_LIBRARY
before running `make genstubs` since we will be running
with a tclsh from the PATH not the one we build.
2001-11-24 Mo DeJong <mdejong@users.sourceforge.net>
* win/configure: Regen.
* win/tcl.m4 (SC_CONFIG_CFLAGS): Add comctl32.lib
to wish link libs. This change was originally added
to Tk on 2001-11-09 but was not committed to Tcl.
2001-11-23 Daniel Steffen <das@users.sourceforge.net>
* unix/Makefile.in:
* unix/configure.in:
* unix/install-sh:
* unix/mkLinks:
* unix/mkLinks.tcl:
* unix/tclLoadDyld.c:
* unix/tclMtherr.c: Mac OSX support: build system, dynamic code loading
and support for case-insensitive filesystems in mkLinks (patch #435258)
2001-11-23 Daniel Steffen <das@users.sourceforge.net>
Up-port to 8.4 of mac code changes for 8.3.3 & various new
changes for 8.4, some already backported to 8.3.4 (patch #435658)
* generic/tclObj.c: added #include to fix missing prototype errors
* generic/tcl.h: MAC_TCL: addition of ConditionalMacros.h and use of
DLLIMPORT and DLLEXPORT like on other platforms. ( => no longer need
the .exp files and can remove use of #pragma export that never worked
well)
removed line continuation in #if clause as this breaks the mac
resource compiler (note that *.r files include tcl.h)
* mac/tclMacFile.c: fixed bug in permission checking code
* mac/tclMacLoad.c: corrected utf8 handling, comparison of
package names to code fragment names changed to only match on the
length of package name, this allows for fragment names with version
numbers appended
* mac/tclMacInt.h:
* generic/tclInt.h:
* mac/tclMacTime.c:
* generic/tclIOUtil.c: moved declaration of TclpGetGMTOffset()
* mac/tclMacShLib.exp:
* mac/tclMacOSA.exp:
* mac/tclMacMSLPrefix.h: removed files
* unix/Makefile.in: removed reference to .exp files
* mac/MW_TclBuildLibHeader.h:
* mac/MW_TclBuildLibHeader.pch:
* mac/MW_TclHeaderCommon.h:
* mac/MW_TclStaticHeader.h:
* mac/MW_TclStaticHeader.pch: new precompiled header files
* mac/MW_TclAppleScriptHeader.pch:
* mac/MW_TclHeader.pch:
* mac/MW_TclTestHeader.pch:
* mac/tclMacCommonPch.h: revised precompiled header handling: now
include a common header file 'MW_TclHeaderCommon.h' from all .pch
files, the .pch files themselves now only setup #defines (e.g.
BUILD_tcl, STATIC_BUILD, TCL_DEBUG, TCL_THREADS) like in makefiles on
other platforms.
* mac/tclMac.h:
* mac/tclMacPort.h:
* mac/tclMacInt.h: use of BUILD_tcl and TCL_STORAGE_CLASS like on other
platforms, standardize #include'd files to what's done on other
platforms, removed use of #pragma export.
* mac/tcltkMacBuildSupport.sea.hqx: new archive of mac build support
files & suggested build environment directory hierarchy:
'Building MacTclTk' & 'CW Pro6 changes' readme's.
projects for MoreFiles 1.5.2 static & shared libraries.
project & sources for 'pseudoCarbonSupport', see below.
included XML versions of the projects for CW Pro5 or Pro7 users.
* mac/tclMacProjects.sea.hqx: updated mac build project files:
build support for CodeWarrior Pro6, UnivIntf 3.4 & shared runtime
libraries: the MSL libraries and MoreFiles are no longer compiled into
Tcl.shlb, all non-static binaries now use the Pro6 shared runtime
libraries and MoreFiles.shlb. These shlbs are merged into the standard
Wish and TclShell, but 3rd party applications linking with Tcl.shlb or
Tk.shlb need to setup access to them. (see the "(sh-ppc)" targets
for how to do this.)
included XML versions of the projects for CW Pro5 or Pro7 users.
use compat/strtod.c instead of MSL's strtod()
use WASTE versions of MSL for tcl test target to avoid text buffer
cutoff at 32k.
Merging the full MSL.shlb and the other shlbs into Wish & TclShell
makes them a bit larger than before, use unmerged binaries to avoid
copying the shared code with every application, e.g. when deploying
numerous Wish based droplets.
Note that using CW Pro5 to compile extensions is in principle still
possible, but need to link with Pro6 runtime libraries.
Tclapplescript now loads and runs on CFM68k.
Highly experimental "pseudoCarbon" support for Tcl only on OS 8/9:
binaries in "Build:(Carbon):" link against CarbonLib instead of
InterfaceLib, however the actual code has not been carbonized! i.e. it
will not run on OSX and may not even run properly with CarbonLib.
This should in principle allow you to build & test OS9 CFM Carbon
binaries that need to link with Tcl.shlb. On OSX you can use the
native Tcl.framework, but you have to build a MachO binary as there
is no CFM glue lib for Tcl.framework.
the library pseudoCarbonSupport.shlb manually loads the symbols
from InterfaceLib that are not in CarbonLib but are needed by the
uncarbonized code in Tcl.shlb and TclShell.
* generic/tclMain.c: MAC_TCL: workaround for broken/non-standard isatty
on MW Pro6, #include <unistd.h> instead of defining isatty
* mac/tclMacPort.h: MW Pro6 changes for MSL fcntl.h, stat.h & isatty
* mac/tclMacAppInit.c: add EXTERN to InstallConsole to enable DLL
export via the TCL_STORAGE_CLASS mechanism.
* mac/tclMacFCmd.c: fix for FSpDirectoryCopy API change
* mac/tclMacLibrary.c: emit compile time error when
TCL_REGISTER_LIBRARY and USE_TCL_STUBS are both defined at the same
time in an extension, this use is not currently supported and will
result in a crash when dynamically loading the extension.
* mac/tclMacApplication.r:
* mac/tclMacLibrary.r:
* mac/tclMacOSA.r:
* mac/tclMacResource.r: fixed obsolete copyrights/dates in version
strings; updated version strings to standard usage; added support for
'(Support Libraries)' subfolder for shared runtime libraries in
unmerged binaries; commented out demo setting of "Tcl Environment
Variables"; reorganized resources among these files to avoid
multiple copies in applications and shared libraries, the script
libraries are now no longer duplicated in Tclsh but are only included
in the resources of Tcl.shlb.
* mac/tclMacChan.c:
* mac/tclMacSock.c: cast for *BlockMode
* mac/tclMacUtil.c:
* mac/tclMacMath.h: removed obsolete hypot() definition
* generic/tclIntPlatDecls.h:
* generic/tclInt.decls:
* generic/tclStubInit.c:
* mac/tclMacNotify.c:
* mac/tclMacOSA.c:
* mac/tclMacUtil.c:
* generic/tclThreadTest.c: renamed routines conflicting with standard
Apple or MoreFiles headers (at compile or link time):
GetGlobalMouse -> GetGlobalMouseTcl
FSpGetDirectoryID -> FSpGetDirectoryIDTcl
FSpOpenResFileCompat -> FSpOpenResFileCompatTcl
FSpCreateResFileCompat -> FSpCreateResFileCompatTcl
NewThread -> NewTestThread
the renamed MoreFiles *Tcl routines are just wrappers calling into the
MoreFiles DLL.
* mac/tclMacCommonPch.h:
* mac/tclMacThrd.c:
* mac/tclMacPanic.c: removed OLDROUTINENAMES define, renamed obsolete
apple API names to modern equivalents; UH3.4 support: added #include
<ControlDefinitions.h>, updated New*Proc() calls to New*UPP().
* mac/tclMacUnix.c: added missing (Tcl_Obj ***) cast to
Tcl_ListObjGetElements call
* mac/tclMacAlloc.c: modernized TclpSysAlloc() to use temporary
memory instead of system heap memory when available (MacOS
>= 7.5 and possibly earlier, use of system heap has been
discouraged for a long time and has many disadvantages, e.g. memory
isn't paged out, and errors can very easily bring the system down);
fixed crashing bug in TclpSysRealloc() and CleanUpExitProc() where
memory was being accessed after having been deallocated; fixed
memory leak in (de)allocation code (for every block ever allocated
with TclpSysAlloc, a Ptr was leaked), if temporary memory is
available, don't track allocated memory, instead use
RecoverHandle() to get Handle from Ptr, otherwise use doubly linked
list to correctly track memory and free all allocated memory; added
new option for ConfigureMemory: MEMORY_DONT_USE_TEMPMEM, disables
use of temporary memory even when it would be available, only
necessary when writing e.g. a driver (using tcl??); increased
fraction of application heap reserved for OS routines to 512K
* compat/strftime.c:
* mac/tclMacTime.c:
* mac/tclMacPort.h:
* generic/tclInt.decls:
* generic/tclIntPlatDecls.h:
* generic/tclStubInit.c: timezone support for mac via
TclpGetTZName() like on windows, using an inverse timezone table
adapted from tclDate.c to map gmtoffset in seconds gotten from
the MacOS APIs to a timezone string, as there is no good way to get
this info from MacOS. I had to make up some unusual timezones and
arbitrarily decide on the most standard of the multiple choices
available for every timezone.
* generic/tclExecute.c: workaround for a MSL bug/misfeature: for
very small floats, MSL can return errno ERANGE but a
non-zero value ( < LDBL_MIN however)
* mac/tclMacAppInit.c: support for WASTE text library using
temporary memory, setting has no effect if WASTE is not used.
* mac/tclMacPanic.c: removed duplicate code from generic/tclPanic.c
and added that file to projects instead.
* tests/all.tcl: set tcltest::singleProcess 1 as multiple processes
are not available on the mac.
* tests/cmdAH.test: access time not available on the mac, skip the
atime touch test
* tests/appendComp.test:
* tests/cmdMZ.test:
* tests/compile.test:
* tests/exec.test:
* tests/fileName.test:
* tests/lset.test:
* tests/namespace.test:
* tests/tcltest.test: added missing cleanups/tests/catches that
caused tests to fail on the mac.
* doc/tclvars.n: doc bug, env(PWD) should be env(HOME) [Bug 463834]
2001-11-21 Don Porter <dgp@users.sourceforge.net>
* tests/trace.test (trace-8.8): Corrected test for Bug 219393.
* generic/tclBasic.c (Tcl_DeleteCommandFromToken,CallCommandTraces):
* generic/tclCmdMZ>c (Tcl_UntraceCommand): Added Tcl_Preserve and
Tcl_Release calls to prevent deletion of CommandTrace structures
until all callers are done using them, preventing memory corruption.
[Bug 453805]
2001-11-20 Kevin B. Kenny <kennykb@users.sourceforge.net>
* doc/GetTime.3 (Tcl_GetTime):
* generic/tcl.decls (Tcl_GetTime):
* generic/tclClock.c (Tcl_ClockObjCmd):
* generic/tclCompile.c (TclCleanupByteCode, TclInitByteCodeObj):
* generic/tclCmdMZ.c (Tcl_TimeObjCmd):
* generic/tclUtil.c (TclpGetTime):
* generic/tclTest.c (GetTimesCmd):
* generic/tclTimer.c (Tcl_CreateTimerHandler, TimerSetupProc,
TimerCheckProc, TimerHandlerEventProc):
* mac/tclMacNotify.c (Tcl_SetTimer):
* mac/tclMacShLib.exp (Tcl_GetTime):
* mac/tclMacTime.c (Tcl_GetTime):
* unix/tclUnixChan.c (TclUnixWaitForFile):
* unix/tclUnixEvent.c (Tcl_Sleep):
* unix/tclUnixThrd.c (Tcl_ConditionWait):
* unix/tclUnixTime.c (Tcl_GetTime):
* win/tclWinNotify.c (Tcl_Sleep):
* win/tclWinTest.c (TestwinclockCmd):
* win/tclWinTime.c (TclpGetSeconds, TclpGetClicks, Tcl_GetTime):
Changed all uses of TclpGetTime to Tcl_GetTime. Added Tcl_GetTime
to the Stubs table and the library documentation. Added a
TclpGetTime in tclUtil.c for backward compatibility of
extensions. [Patch #483500, TIP#73]
* generic/tclCmdMZ.c (Tcl_TimeObjCmd): Corrected an error in the
[time] command that caused incorrect results to be returned if the
total duration of all iterations exceeded 2**31 microseconds.
[Bug #478847]
* generic/tclInt.decls:
* generic/tclInt.h:
* generic/tclStubInit.h: Reran 'make genstubs'
2001-11-20 Miguel Sofer <msofer@users.sourceforge.net>
* generic/tclBasic.c
* generic/tclCompile.h:
* generic/tclExecute.c: moving all code relative to bytecodes from
tclBasic.c to tclExecute.c - the functions RecordTracebackInfo and
Tcl_ExprObj went to tclExecute.c, and new interface function was
defined (TclCompEvalObj).
The final objective of this sequence of moves is to provide a
clean, clear-cut interface between Tcl's core and the
compiler/engine subsystem.
2001-11-20 Miguel Sofer <msofer@users.sourceforge.net>
* generic/tclBasic.c
* generic/tclCompile.h:
* generic/tclExecute.c: factoring out of common code in tclBasic.c
(new function TclInterpReady defined: it resets the interp's
result, then checks that it hasn't been deleted and that the
nesting level is acceptable). Passed the responsibility of calling
it to the *callers* of TclEvalObjvInternal.
2001-11-20 Miguel Sofer <msofer@users.sourceforge.net>
* generic/tclBasic.c
* generic/tclExecute.c: a better variant of the previous-to-last
commit (restoring numLevels computations). The managing of the
levels now has to be done by the *callers* of TclEvalObjvInternal
2001-11-20 Miguel Sofer <msofer@users.sourceforge.net>
* generic/tclExecute.c: missing variable declaration under
TCL_COMPILE_DEBUG.
2001-11-20 Miguel Sofer <msofer@users.sourceforge.net>
* generic/tclExecute.c:
* generic/tclProc.c: restoring the computations of iPtr->numLevels
to the original logic (previous to buggy modifs on 2001-11-16).
2001-11-20 Jeff Hobbs <jeffh@ActiveState.com>
* tools/eolFix.tcl (new-file):
* unix/Makefile.in: added EOL correction for Windows bat files to
dist target. [Bug #219409] (davygrvy)
* unix/tclUnixInit.c (TclpSetInitialEncodings): update of patch
from 2001-11-16 that uses the old Tcl encoding check mechanism as
a fallback to the original. Also added a TCL_DEFAULT_ENCODING
#define (defaults to iso8859-1). Tcl will first try setlocale and
nl_langinfo, and if that fails, guess based on certain LANG|LC_*
env vars. [Patch #418645]
2001-11-19 David Gravereaux <davygrvy@pobox.com>
* win/buildall.vc.bat: Added useful comments.
2001-11-19 Miguel Sofer <msofer@users.sourceforge.net>
* tests/compile.test: added a test for bug [Bug 483309]
2001-11-19 Vince Darley <vincentdarley@users.sourceforge.net>
* win/tclWinFile.c:
* win/tclWinFCmd.c:
* win/tclWin32Dll.c:
* doc/file.n:
* tests/winFCmd.test: improved speed of file normalization
for Win95/98, and clarified docs on differences in file
normalization between NT/2000 and the older operating systems.
Added test to ensure normalization is correct.
2001-11-19 Miguel Sofer <msofer@users.sourceforge.net>
* generic/tclBasic.c:
* generic/tclParse.c: Code reorganisation. Moved all evaluation
functions from tclParse.c to tclBasic.c, so that now tclParse.c
deals exclusively with parsing and all evaluations are done by
code in tclBasic.c. The functions moved are: TclEvalObjvInternal,
Tcl_EvalObjv, Tcl_LogCommandInfo, Tcl_EvalTokensStandard,
Tcl_EvalTokens, Tcl_EvalEx, Tcl_Eval, Tcl_EvalObj and
Tcl_GlobalEvalObj.
2001-11-19 Donal K. Fellows <fellowsd@cs.man.ac.uk>
* tests/trace.test (trace-8.8): Added adapted version of Bug
#219393 as new test; the test won't reliably show up the old
problem unless it is being run under something like Purify, but
something is better than nothing...
* generic/tclVar.c (Tcl_TraceVar2, Tcl_UntraceVar2): Added missing
mask bits for trace result type and a check for a nonsense flag
combination.
* generic/tclCmdMZ.c (TraceVarProc): Added missing test for NULL
when deleting a trace that doesn't cause an error.
* doc/TraceVar.3: Added documentation for change due to TIP#68.
* generic/tclCmdMZ.c (TraceVarInfo): Removed problematic errMsg
field from structure.
(TraceVarProc): Removed references to errMsg field and changed
handling of errors so that they returned a Tcl_Obj* containing the
error string. This minimizes the number of calls to the memory
management subsystem.
(TclTraceCommandObjCmd, TraceCommandProc): Removed references to
errMsg field which was never used in command traces in any case.
(Tcl_TraceObjCmd, TclTraceVariableObjCmd): Removed references to
errMsg field and made variable traces register with
TCL_TRACE_RESULT_OBJECT bit set.
* generic/tcl.h (TCL_TRACE_RESULT_DYNAMIC,TCL_TRACE_RESULT_OBJECT):
New constants to define how to handle the strings returned from
trace callbacks [TIP#68]
* generic/tclVar.c (CallTraces, Tcl_GetVar2Ex, TclGetIndexedScalar,
TclGetElementOfIndexedArray, Tcl_SetVar2Ex, TclSetIndexedScalar,
TclSetElementOfIndexedArray, Tcl_UnsetVar2, Tcl_ArrayObjCmd,
TclDeleteVars, TclDeleteCompiledLocalVars, DeleteArray,
TclVarTraceExists): Support for those new trace flags.
2001-11-19 Miguel Sofer <msofer@users.sourceforge.net>
* generic/tclCompCmds.c: patch for [Bug 483309] (petasis).
2001-11-16 Kevin B. Kenny <kennykb@users.sourceforge.net>
* generic/tclListObj.c: removed a C++-style comment that
was inadvertently left in the source code.
2001-11-16 Jeff Hobbs <jeffh@ActiveState.com>
* tests/interp.test:
* generic/tclInterp.c (SlaveObjCmd): Corrected argument checking
for '$interp alias|aliases|issafe'. [Patch #479560] (thoyts, hobbs)
* unix/tclUnixInit.c: added HAVE_LANGINFO code block.
* unix/configure: regened
* unix/configure.in: added SC_ENABLE_LANGINFO call
* unix/tcl.m4: made SHLIB_LD_LIBS='${LIBS}' for FreeBSD* (meyer)
Added modified version of Wagner patch to make use of nl_langinfo
where possible to determine Unix platform encoding, instead of the
inflexible built-in system. This is used by default when
possible, and can be disabled with --enable-langinfo=no.
[Patch #418645] (hobbs, wagner)
2001-11-16 Miguel Sofer <msofer@users.sourceforge.net>
* generic/tclCompile.h:
* generic/tclExecute.c:
* generic/tclObj.c: moved Tcl_GetCommandFromObj and all defining
code for tclCmdNameType objects to tclObj.c (from tclExecute.c).
This code has nothing to do with bytecodes.
2001-11-16 Miguel Sofer <msofer@users.sourceforge.net>
* generic/tclBasic.c:
* generic/tclCompile.h:
* generic/tclExecute.c:
* generic/tclParse.c:
* generic/tclProc.c:
* tests/stack.test: consolidation of duplicated code (in
TclExecuteByteCode and EvalObjv); renaming of EvalObjv to
TclEvalObjv as it is not static anymore; restored consistency of
level counts between compiled and directly evaled code.
[Bug 480896]
2001-11-12 David Gravereaux <davygrvy@pobox.com>
* win/makefile.vc:
* win/rules.vc: Small bug fixes.
* win/README: added some docs pointing to the docs in makefile.vc
for it's use.
2001-10-17 Kevin B. Kenny <kennykb@users.sourceforge.net>
* doc/lappend.n:
* doc/lindex.n:
* doc/linsert.n:
* doc/list.n:
* doc/llength.n:
* doc/lrange.n:
* doc/lsearch.n:
* doc/lset.n (new-file):
* doc/lsort.n:
* generic/tclBasic.c (builtInCmds, Tcl_EvalObjEx):
* generic/tclCmdIL.c (Tcl_LindexObjCmd, Tcl_LindexList):
(Tcl_LindexFlat, Tcl_LsetObjCmd):
* generic/tclCompCmds.c (Tcl_CompileLindexCmd, Tcl_CompileLsetCmd):
* generic/tclCompile.c:
* generic/tclCompile.h:
* generic/tclExecute.c (TclExecuteByteCode):
* generic/tclInt.decls:
* generic/tclInt.h:
* generic/tclIntDecls.h:
* generic/tclListObj.c (TclLsetList, TclLsetFlat, TclSetListElement):
* generic/tclObj.c (TclInitObjSubsystem):
* generic/tclStubInit.c:
* generic/tclTestObj.c (TestobjCmd):
* generic/tclUtil.c (TclGetIntForIndex, SetEndOffsetFromAny):
* generic/tclVar.c (Tcl_LappendObjCmd):
* tests/lindex.test:
* tests/lset.test (new-file):
* tests/lsetComp.test (new-file):
* tests/obj.test:
* tests/string.test:
* tests/stringComp.test:
Reference implementation of TIP's #22, #33 and #45. Adds the
ability of the [lindex] command to have multiple index arguments,
and adds the [lset] command. Both commands are byte-code compiled.
[Patch #471874] (work by Kenny, commited by Hobbs)
2001-11-12 David Gravereaux <davygrvy@pobox.com>
* win/buildall.vc.bat(new):
* win/makefile.vc: Small fix with deriving the "OriginalFilename"
string in the .rc scripts. Added a quick batchfile for building
the entire thing.
2001-11-12 Jeff Hobbs <jeffh@ActiveState.com>
* doc/FileSystem.3:
* doc/file.n:
* doc/tcltest.n: converted use of \' to more reasonable format.
2001-11-10 Mo DeJong <mdejong@users.sourceforge.net>
* unix/Makefile.in:
* win/Makefile.in: Add "make gdb" target. This target
can run tclsh inside either gdb or insight.
2001-11-10 David Gravereaux <davygrvy@pobox.com>
* win/makefile.vc: Added a check to make sure one runs the makefile
from the /win directory only.
* win/mkd.bat:
* win/rmd.bat: Changes from Llyod Lim for better stability.
[Patch #456759]
2001-11-09 David Gravereaux <davygrvy@pobox.com>
* win/makefile.vc:
* win/tcl.dsp: winhelp target fixes for non-NT systems. It
seems NMAKE under these remembers changed directories during
commands. A new tcltest feature from Peter Spjuth
<peter.spjuth@space.se> to specify a pattern file from the
commandline and redirecting output to a file when not under
NT with it's scrollback console. Then it replays it, piped
through more. Added 2 new static "configurations" to tcl.dsp.
I could keep adding more, but I think we should leave it up to
the user for customizing it.
Sticky-points left: 'profile' option.
2001-11-09 Jeff Hobbs <jeffh@ActiveState.com>
* doc/FileSystem.3:
* doc/StdChannels.3:
* doc/file.n:
* doc/tcltest.n:
* tools/man2help.tcl:
* tools/man2help2.tcl: fixed winhelp generation problems
[Patch #480268]
* unix/configure:
* unix/tcl.m4: added -lc to AIX libs, fixed path to ldAix
2001-11-09 Don Porter <dgp@users.sourceforge.net>
* tests/var.test:
* generic/tclVar.c: Corrected bug in [global] when dealing
with variable names matching :*. [Bug 480176]
2001-11-08 Mo DeJong <mdejong@users.sourceforge.net>
Fixup stack size under OSF1. [Tcl patch 474790]
* unix/configure: Regen.
* unix/tcl.m4: Add HAVE_PTHREAD_ATTR_SETSTACKSIZE define
to EXTRA_CFLAGS to adjust initial stack size.
2001-11-08 Mo DeJong <mdejong@users.sourceforge.net>
Enable thread support under FreeBSD. [Tcl bug 473708]
* unix/configure: Regen.
* unix/tcl.m4 (SC_ENABLE_THREADS): Check for pthread functions
in libc_r and enable thread support if found.
* unix/dltest/Makefile.in: Set SHLIB_LD_LIBS and use it in
the Makefile to properly link a shared library.
2001-11-08 Mo DeJong <mdejong@users.sourceforge.net>
* unix/Makefile.in:
* unix/dltest/Makefile.in:
Avoid adding libc to the LIBS variable since it
is not needed when linking with CC. If required
when linking with LD it should be done on a case
by case basis in tcl.m4.
2001-11-08 David Gravereaux <davygrvy@pobox.com>
* win/rules.vc:
* win/makefile.vc: Fixed install target to adjust for the
different build types. Added a 'linkexten' option to link the
win extensions inside the shell when built static. Placed
win/tclAppInit.c patch in SF patch DB for approval. 'profile'
option not hooked in yet. Everything else know is done.
* win/tcl.dsp(new):
* win/tcl.dsw(new): Simple MsDev stub project files that calls
makefile.vc. Will help run Tcl in the debugger easier without
confusing MsDev for where the .pdb files are.
2001-11-07 Mo DeJong <mdejong@users.sourceforge.net>
* unix/Makefile.in:
* win/Makefile.in:
Print a message indicating that the user should
run "make genstubs" when the generated tclStubInit.c
file is out of date. We can't regenerate automatically
since there may be no tclsh on the system and that
would cause bootstrap problems. [Tcl bug 465874]
2001-11-07 Mo DeJong <mdejong@users.sourceforge.net>
Define TCL_INCLUDE_SPEC in tclConfig.sh. It should be
included by extensions that need to find Tcl include
headers in the install location. The user can override
the include install dir with --includedir so we need
to record this information for extensions. [Tcl bug 421835]
* unix/configure: Regen.
* unix/configure.in: Define TCL_INCLUDE_SPEC.
* unix/tclConfig.sh.in: Define TCL_INCLUDE_SPEC.
* win/configure: Regen.
* win/configure.in: Define TCL_INCLUDE_SPEC.
* win/tclConfig.sh.in: Define TCL_INCLUDE_SPEC.
2001-11-07 David Gravereaux <davygrvy@pobox.com>
* win/rules.vc:
* win/makefile.vc: Dropped the NOMSVCRT macro and put it on the
option list instead. It makes more sense to me this way as
NOMSVCRT=0 would only be the valid setting. Fixed the dde and reg
extension for building static. Improved, but not perfected, the
winhelp target.
2001-11-07 Mo DeJong <mdejong@users.sourceforge.net>
* win/README: Change minimum VC++ version to 5.X since
4.X is known not to work.
Indicate that Mingw is required and building with Cygwin
gcc is not supported. Include instructions that indicate
how to install Mingw and what URLs folks should use to
download the supported version of Mingw.
* win/configure: Regen.
* win/configure.in: Error out if user tries to compile the
Windows version of Tcl with Cygwin gcc. Users should compile
with Mingw gcc instead.
2001-11-06 Andreas Kupries <andreas_kupries@users.sourceforge.net>
* generic/tclIO.c (ReadChars): Fixed bug #478856 reported by
Stuart Cassoff <stwo@users.sourceforge.net>. The bug caused loss
of fileevents when [read]ing less data from the channel than
buffered. Due to an empty input buffer the flag
CHANNEL_NEED_MORE_DATA was set but never reset, causing the I/O
system to wait for more data instead of using a timer to
synthesize fileevents and to flush the pending data out of the
buffers.
2001-11-06 David Gravereaux <davygrvy@pobox.com>
* win/rules.vc (new):
* win/makefile.vc: Complete over/under rewrite to support numerous
build options all from the commandline itself without needing to
edit the makefile. Now requires vcvars32.bat to be run prior to
running nmake for bootstraping the environment. Fully doc'd usage
for it is in makefile.vc. Commentary welcome. Sticky points left
are:
1) winhelp target shows errors in the converting script.
2) .rc scripts aren't getting the right #defines to build the correct
"OriginalFilename" strings. (have patch, won't commit yet)
3) Naming convention with suffixes describing the buildtype are 'tsdx'
which will need public acceptance. ie. tclsh84tsx.exe is a (t)
threaded shell (s) statically linked to the core and (x) uses
msvcrt instead of libcmt.
2001-11-04 Vince Darley <vincentdarley@users.sourceforge.net>
* library/init.tcl: made filesystem fallback proc
::tcl::CopyDirectory more robust to vagaries of non-native
filesystems.
2001-11-02 Vince Darley <vincentdarley@users.sourceforge.net>
* doc/file.n:
* generic/tclIOUtil.c: updated documentation and comments
to clarify behaviour of 'file copy' wrt soft links.
2001-10-29 Vince Darley <vincentdarley@users.sourceforge.net>
* win/tclWinFile.c: fix to '-types {f r}' bug in
TclpMatchInDirectory (which could cause a UMR, as well as
returning wrong results). Also improved API for 'stat'
to resolve [Bug#219258].
* win/tclWin32Dll.c
* win/tclWinInt.h: addition of improved stat API to internal
lookup table.
* tests/fileName.test: two new tests for the above bug.
* generic/tclIOUtil.c: some cleanup of comments and #ifdefs
2001-10-29 Donal K. Fellows <fellowsd@cs.man.ac.uk>
* unix/tclUnixFile.c (TclpMatchInDirectory): Argument to access()
was entryPtr->d_name instead of nativeEntry which failed when
trying to check access for files in other than the current
directory. [Bug 475941, reported by Georgios Petasis]
2001-10-25 Donal K. Fellows <fellowsd@cs.man.ac.uk>
* unix/tclUnixChan.c: Added stateUpdated member to struct TtyState.
(TtyCloseProc,TtySetOptionProc,TtyInit): Use stateUpdated member
of TtyState to decide whether it is necessary to reset a serial
port when Tcl closes it. Blindly resetting can cause Tcl to be
sent an unexpected SIGTSTP when it is executing in the background
[Bug 471374, reported by Chris Nelson]
2001-10-22 Andreas Kupries <andreas_kupries@users.sourceforge.net>
* doc/ObjectType.3: Minor documentation fix, reported by David
N. Welton <davidw@users.sourceforge.net> directly to me.
2001-10-22 Vince Darley <vincentdarley@users.sourceforge.net>
* win/tclWinFCmd.c: fix to stop test suite from hanging process
under some versions of WinNT. [Bug #466102] (Kevin Kenny)
2001-10-18 Jeff Hobbs <jeffh@ActiveState.com>
* tests/clock.test (clock-8.1):
* generic/tclDate.c (RelativeMonth):
* generic/tclGetDate.y (RelativeMonth): corrected off-by-one-day
error in clock scan with relative months and years during swing
hours. [Bug #413397, Patch #414024] (lavana)
2001-10-18 Vince Darley <vincentdarley@users.sourceforge.net>
* generic/tclIOUtil.c: fix to bug in Tcl_FSChdir shown up
by recent tclkit builds.
2001-10-17 Jeff Hobbs <jeffh@ActiveState.com>
* unix/tclUnixPipe.c (PipeInputProc, PipeOutputProc): do immediate
retry when error is returned with errno == EINTR.
[Bug #415131] (leger)
2001-10-16 Jeff Hobbs <jeffh@ActiveState.com>
* unix/tclLoadAout.c (TclGuessPackageName): removed unused vars
and fixed warnings. [Bug #446622] (lim)
2001-10-15 Miguel Sofer <msofer@users.sourceforge.net>
* generic/tclProc.c: changing a memcmp to strncmp to avoid a memory
error detected by purify (thanks Jeff); modify style to agrre with
the style guide.
2001-10-15 Andreas Kupries <andreas_kupries@users.sourceforge.net>
* generic/tclInt.decls (TclExpandCodeArray,TclGetInstructionTable):
Added to internal stubs table. Tclcompiler (Tclpro project)
needs them if used as loadable package under Windows. Changed
signatures. We don't want to describe compiler internal
structures in "tclInt.h".
* generic/tclCompile.h: S.a. Removed function declarations.
* generic/tclCompile.c: S.a. Adapted to changed signatures.
2001-10-15 Jeff Hobbs <jeffh@ActiveState.com>
* unix/configure:
* unix/configure.in:
* win/configure:
* win/configure.in:
* win/tcl.m4: reworked to be a little cleaner in comparison to
each other, and to AC_SUBST even empty vars for win/tclConfig.sh
* generic/tclFileName.c: minor code cleanup
* generic/tcl.h: moved #define of WIN32 to tcl.h where __WIN32__
is defined and added #ifndef check.
* doc/open.n: moved all fconfigure option docs to fconfigure.n
* doc/fconfigure.n: added serial config options
* win/tclWinChan.c:
* win/tclWinPort.h:
* win/tclWinSerial.c: added TIP #35 Windows enhancements for
serial configuration. [Patch #438509] (schroedter)
2001-10-15 Vince Darley <vincentdarley@users.sourceforge.net>
* generic/tclFCmd.c: fix to memory leak in TclFileDeleteCmd on
certain error conditions.
* doc/FileSystem.3: fix to typo.
2001-10-12 Jeff Hobbs <jeffh@ActiveState.com>
* library/encoding/ebcdic.enc:
* tools/encoding/ebcdic.txt: EBCDIC charset mapping.
[Patch #219323] (nijtmans)
* library/encoding/tis-620.enc:
|
| ︙ | ︙ | |||
173 174 175 176 177 178 179 | Tcl_(Preserve|Release) newly introduced, fixing compile error on Windows. 2001-09-27 Don Porter <dgp@users.sourceforge.net> * doc/FileSystem.3 (Tcl_FSLoadFile): * generic/tcl.decls (Tcl_FSLoadFile): | | > > > | > > > > > | > | | | | | > | 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 | Tcl_(Preserve|Release) newly introduced, fixing compile error on Windows. 2001-09-27 Don Porter <dgp@users.sourceforge.net> * doc/FileSystem.3 (Tcl_FSLoadFile): * generic/tcl.decls (Tcl_FSLoadFile): * generic/tcl.h (Tcl_FSLoadFileProc): * generic/tclInt.h (TclpLoadFile): * generic/tclIOUtil.c (Tcl_FSLoadFile): * generic/tclLoadNone.c (TclpLoadFile): * generic/tclTest.c (TestReportLoadFile): * library/ldAout.tcl: * mac/tclMacLoad.c (TclpLoadFile): * unix/tclLoadAix.c (TclpLoadFile): * unix/tclLoadAout.c (TclpLoadFile): * unix/tclLoadDl.c (TclpLoadFile): * unix/tclLoadDld.c (TclpLoadFile): * unix/tclLoadDyld.c (TclpLoadFile): * unix/tclLoadNext.c (TclpLoadFile): * unix/tclLoadOSF.c (TclpLoadFile): * unix/tclLoadShl.c (TclpLoadFile): * win/tclWinLoad.c (TclpLoadFile): * win/tclWinFCmd.c (DoRemoveJustDirectory): More CONST poisoning fixes from the 2001-09-24 TIP 27 changes. CONST-ified Tcl_FSLoadFile and TclpLoadFile. Report and patch from Kevin Kenny. [Bug 465833] * generic/tclIO.c (ChannelTimerProc): Added Tcl_Preserve() and Tcl_Release() to fix segfault introduced by the 2001-09-26 changes. [Bug 465494] * doc/TCL_MEM_DEBUG.3: Updated out-of-date reference to #define GUARD_SIZE. * doc/UpVar.3 (Tcl_UpVar,Tcl_UpVar2): * generic/tcl.decls (Tcl_UpVar,Tcl_UpVar2): * generic/tclInt.decls (TclFindProc,TclGetFrame): * generic/tclInt.h (TclFindProc,TclGetFrame,TclLookupVar, TclPrecTraceProc,TclProcInterpProc}): * generic/tclProc.c (TclGetFrame,TclFindProc): * generic/tclVar.c (Tcl_UpVar,Tcl_UpVar2,MakeUpvar): Updated APIs in generic/tclProc.c and generic/tclVar.c according to the guidelines of TIP 27. [Patch 465442] * generic/tclDecls.h: * generic/tclIntDecls.h: make genstubs 2001-09-26 Andreas Kupries <andreas_kupries@users.sourceforge.net> * doc/fileevent.n: Accepted [Patch #465279] adding an example to the fileevent manpage. Minor modifications to get a better formatting. Report and patch by David N. Welton <davidw@users.sourceforge.net>. |
| ︙ | ︙ | |||
251 252 253 254 255 256 257 | * generic/tclDecls.h: make genstubs 2001-09-25 Don Porter <dgp@users.sourceforge.net> * doc/GetInt.3: * generic/tclInt.h (TclGetLong deleted): | | > | > > > | | > | > | 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 | * generic/tclDecls.h: make genstubs 2001-09-25 Don Porter <dgp@users.sourceforge.net> * doc/GetInt.3: * generic/tclInt.h (TclGetLong deleted): * generic/tcl.decls: * generic/tclInt.decls: * generic/tclGet.c: Updated APIs in generic/tclGet.c according to the guidelines of TIP 27. [Patch 464674] * generic/tclDecls.h: * generic/tclIntDecls.h: make genstubs 2001-09-25 Miguel Sofer <msofer@users.sourceforge.net> * generic/tclVar.c: removed comments referring to unused flag TCL_PARSE_PART1. 2001-09-24 Don Porter <dgp@users.sourceforge.net> * doc/Concat.3: * doc/DString.3: * doc/SplitList.3: * generic/tclInt.h (TclCheckBadOctal): * generic/tcl.decls: * generic/tclInt.decls: * generic/tclEncoding.c (OpenEncodingFile): * generic/tclMain.c (Tcl_Main): * generic/tclUtil.c: * unix/tclLoadDl.c (TclpLoadFile): Updated APIs in generic/tclUtil.c according to the guidelines of TIP 27. [Patch 464553] * generic/tclDecls.h: * generic/tclIntDecls.h: make genstubs 2001-09-24 Andreas Kupries <andreas_kupries@users.sourceforge.net> * The change below fixes [Bug #464380]. The bug was reported by Ronnie Brunner <rbrunner@users.sourceforge.net>. He also provided the patch. |
| ︙ | ︙ | |||
446 447 448 449 450 451 452 | * generic/tclCmdMZ.c (Tcl_RegsubObjCmd): had to adjust fix from 2001-08-06 to actually duplicate the objects in certain cases. This is really a place where feather would have been essential. [Bug #461322] * generic/tclUtf.c (Tcl_UtfPrev): corrected to return the proper location when the middle of a UTF-8 byte was passed in. | | | 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 | * generic/tclCmdMZ.c (Tcl_RegsubObjCmd): had to adjust fix from 2001-08-06 to actually duplicate the objects in certain cases. This is really a place where feather would have been essential. [Bug #461322] * generic/tclUtf.c (Tcl_UtfPrev): corrected to return the proper location when the middle of a UTF-8 byte was passed in. [Tk Bug #450504] * ChangeLog.1999: * ChangeLog: broke changes from 199x into ChangeLog.1999 to reduce size of the main ChangeLog. 2001-09-13 Andreas Kupries <andreas_kupries@users.sourceforge.net> |
| ︙ | ︙ | |||
2601 2602 2603 2604 2605 2606 2607 | the library path ($tcl_libPath) are determined relative to the absolute path of the executable. When the executable is installed in or near the root directory of the file system, relative pathnames were being incorrectly generated, and in the worst case, memory access violations were crashing the program. [Bug 119416, Patch 102972] | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | < < | 4497 4498 4499 4500 4501 4502 4503 4504 4505 4506 4507 | the library path ($tcl_libPath) are determined relative to the absolute path of the executable. When the executable is installed in or near the root directory of the file system, relative pathnames were being incorrectly generated, and in the worst case, memory access violations were crashing the program. [Bug 119416, Patch 102972] ****************************************************************** *** CHANGELOG ENTRIES FOR 2000 IN "ChangeLog.2000" *** *** CHANGELOG ENTRIES FOR 1999 AND EARLIER IN "ChangeLog.1999" *** ****************************************************************** |
Added ChangeLog.2000.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 |
2000-12-14 Don Porter <dgp@users.sourceforge.net>
* generic/tclExecute.c:
* tests/expr-old.test: Re-wrote Tcl's [expr rand()] and
[expr srand($seed)] implementations, fixing a range error
on some 64-bit platforms. Added tests that detect the bug.
The rewrite changes the seed -> sequence map on 64-bit
platforms, only for seed >= 2^31, a slight incompatibility.
[Bug 121072, Patch 102781]
2000-12-10 Don Porter <dgp@users.sourceforge.net>
* library/init.tcl:
* library/msgcat/msgcat.tcl:
* library/msgcat/pkgIndex.tcl:
* library/opt/optparse.tcl:
* library/opt/pkgIndex.tcl: Where [uplevel] is used in a proc
to evaluate a Tcl built-in command in the caller's context,
the built-in commands are now fully namespace-qualified. This
prevents problems when the caller context is in a namespace where
the built-in command name has been used by a command in the
namespace. (For example, [::ns::set] might be called instead
of the intended [::set]). [Bug #119422, Patch #102545]
2000-12-09 jeff hobbs <jhobbs@interwoven.com>
* win/tclWinTime.c (CalibrationThread): added lint return value to
prevent compiler warning. [Bug #125005]
* docs/scan.n:
* tests/scan.test:
* generic/tclScan.c (Tcl_ScanObjCmd): changed %o and %x to use
strtoul instead of strtol to correctly preserve scan<>format
conversion of large integers. [Patch #102663, Bug #124600]
* generic/tclExecute.c (TclExecuteByteCode): Commited patch fixing
handling of {!<boolean>} in expressions. [Patch #102702]
2000-12-08 jeff hobbs <jhobbs@interwoven.com>
* library/init.tcl: Added support for PATHEXT variable in
auto_execok, recognizing the proper set of executable extensions
on Windows. [Patch #102719]
2000-12-08 Andreas Kupries <a.kupries@westend.com>
* generic/tclEncoding.c (LoadTableEncoding): Changed dangerous
code to something less critical. This fixes bug 119417, part A
without affecting the speed when loading encodings.
2000-12-08 Donal K. Fellows <fellowsd@cs.man.ac.uk>
* doc/open.n: Added xref to fconfigure and advice on the opening
of binary files. Should help prevent a recurrence of bugs like
#124558
2000-12-07 jeff hobbs <jhobbs@interwoven.com>
* generic/tcl.h: added note about need to updated
library/dde/pkgIndex.tcl with minor version increment.
* library/dde/pkgIndex.tcl: updated to use 84 version to reflect
the makefile. Should probably be updated to use its real version
at some point. [Patch #102560, Bug #119421]
2000-12-06 eric melski <ericm@ajubasolutions.com>
* generic/tcl.h (attemptckalloc): Fixed typo for #define of
attemptckalloc (was defined to Tcl_AttempDbCkalloc, should have
been Tcl_AttemptDbCkalloc). [Bug: 124384]
* generic/tclCkalloc.c: Added
TCL_MEM_DEBUG versions of Tcl_AttemptDbCkrealloc and
Tcl_AttemptDbCkalloc. [Bug: 124384].
2000-11-24 Donal K. Fellows <fellowsd@cs.man.ac.uk>
* generic/tclExecute.c (TclExecuteByteCode): Logical negation "!"
can now handle string booleans, provided those values are placed
in variables.
* tests/expr.test (expr-13.17): Check that [expr {!$var}] can
negate the string-versions of booleans "yes", "false", etc.
* library/tcltest/tcltest.tcl (getMatchingFiles,
getMatchingDirectories):
* tools/man2html.tcl (doDir):
* tools/man2help.tcl (doDir):
* library/package.tcl (tclPkgUnknown,tclMacPkgSearch):
* library/safe.tcl (AddSubDirs): [glob] uses -directory instead of
unsafe [file join] to fix Bug #123313
* generic/tclIndexObj.c:
* generic/tclTestObj.c (TestindexobjCmd): Changed internal
representation of index objects to fix Bug #119082; fix
shouldn't be visible to outside world...
* generic/tclTest.c (TestGetIndexFromObjStructObjCmd):
* tests/indexObj.test: (indexObj-6.*) Added to test for presence
of Bug #119082.
2000-11-23 Donal K. Fellows <fellowsd@cs.man.ac.uk>
* generic/tclCmdIL.c (Tcl_LsortObjCmd): Fixed memory leak from Bug
#119398
* library/init.tcl (unknown): Added specific level parameters to
all uplevel invokations to boost performance; didn't dare touch
the "namespace inscope" stuff though, since it looks sensitive
to me! Should fix Bug #123217, though testing is tricky...
2000-11-21 Andreas Kupries <a.kupries@westend.com>
* All of the changes below are described in TIP #7 ~ Specification
and result from the application of the patch contained
therein. Creator of the patch is Kevin Kenny
<kennykb@crd.ge.com>. The patch used here is actually a bit
different. Two MS specific constant values (format FOOui64) were
replaced with a more portable formatting of the values and an
additional cast to LONGLONG. My cross-compiling gcc was unable to
process the original form. The SF Id of the patch is 102459.
* tclWinTime.c: Add to the static data a set of variables that
manage the phase-locked techniques, including a
''CRITICAL_SECTION'' to guard them so that multi-threaded code
is stable.
* tclWinTime.c: Modify ''TclpGetSeconds'' to call ''TclpGetTime''
and return the 'seconds' portion of the result. This change is
necessary to make sure that the two times are consistent near
the rollover from one second to another.
* tclWinTime.c: Modify ''TclpGetClicks'' to use TclpGetTime to
determine the click count as a number of microseconds.
* tclWinTime.c: Modify ''TclpGetTime'' to return the time as
M*Q+B, where Q is the result of ''QueryPerformanceCounter'', and
M and B are variables maintained by the phase-locked loop to
keep the result as close as possible to the system clock. The
''TclpGetTime'' call will also launch the phase-lock management
in a separate thread the first time that it is invoked. If the
performance counter is unavailable, or if its frequency is not
one of the two common 8254-compatible rates, then
''TclpGetTime'' will return the result of ''ftime'' as it does
in Tcl 8.3.2.
* tclWinTime.c: Add the clock calibration procedure. The
calibration is somewhat complex; to save space, the reader is
referred to the reference implementation for the details of how
the time base and frequency are maintained.
* tclWinNotify.c: Modify ''Tcl_Sleep'' to test that the process
has, in fact, slept for the requisite time by calling
''TclpGetTime'' and comparing with the desired time. Otherwise,
roundoff errors may cause the process to awaken early.
* tclWinTest.c: Add a ''testwinclock'' command. This command
returns a four element list comprising the seconds and
microseconds portions of the system clock and the seconds and
microseconds portions of the Tcl clock.
* winTime.test: Add to the test suite a test that makes sure that
the Tcl clock stays within 1.1 ms of the system clock over the
duration of the test.
2000-11-21 Donal K. Fellows <fellowsd@cs.man.ac.uk>
* doc/global.n:
* doc/upvar.n:
* doc/variable.n: Improved documentation to mention that variables
so created are listed in [info locals] and added a few more
cross-links between these commands. Fixes bug #119387
2000-11-17 Donal K. Fellows <fellowsd@cs.man.ac.uk>
* tests/safe.test: (safe-4.3):
* generic/tclVar.c (TclLookupVar): Changed again. Now passes all
the tests, though one needed modifying since it required the
wrong answer. (Why on earth do we have inline modification of
argument strings? This sort of thing is horrendous to debug and
doesn't work well in a multithreaded environment!) Fixes bug
119192.
* tests/var.test: (var-1.19) If my attempts to fix the problem
aren't right yet, my attempts to describe it look pretty good to
me...
2000-11-16 Andreas Kupries <a.kupries@westend.com>
* win/tclWinPort.h (line 69): Changed reference to winsock2.h into
winsock.h. This was a leftover from a foray into using winsock
version 2 (History lesson from Scott Redman and Jeff
Hobbs). This code was no problem when compiling Tcl itself, but
could trip extensions. Fixes bug 122568.
2000-11-15 jeff hobbs <jeff.hobbs@acm.org>
* unix/Makefile.in: removed bp.c references (hasn't existed in a
long time). Corrected 'make dist' to make dist with unversioned
library directories (same as out of cvs), so make install works
correctly with either source tree.
2000-11-15 jeff hobbs <jeff.hobbs@acm.org>
* generic/tclVar.c (TclLookupVar): reverted fix below as it broke
all other array unset error reporting. Bug-119192 is still
open.
2000-11-15 Donal K. Fellows <fellowsd@cs.man.ac.uk>
* generic/tclVar.c (TclLookupVar): Changed references to part2 to
use elName instead in various error message generating spots, so
as to fix Bug-119192.
2000-11-03 David Gravereaux <davygrvy@ajubasolutions.com>
* win/.cvsignore: Removed 'configure' from the glob list now
that it's included.
2000-11-03 Jeff Hobbs <hobbs@ajubasolutions.com>
8.4a2 RELEASE
* unix/Makefile.in (install-libraries, dist):
* win/makefile.vc (install-libraries):
* win/Makefile.in (install-libraries): updated to install
unversioned library directories into versioned directories.
* tools/tcl.wse.in: updated for unversioning of library dirs
* unix/mkLinks: updated mkLinks with latest doc updates
* doc/Tcl_Main.3: added docs for Tcl_SetMainLoop
* generic/tclStubInit.c:
* generic/tclDecls.h:
* generic/tcl.decls: added Tcl_SetMainLoop proc that allows people
to set a main loop that will run for tclsh.
* generic/tcl.h: added Tcl_MainLoopProc typedef
* generic/tclMain.c (Tcl_SetMainLoop, StdinProc, Prompt): new
StdinProc and Prompt static procs and Tcl_SetMainLoop stubs proc.
The first two handle a fileevent based prompt (taken from
tkMain.c). Tcl_SetMainLoop enables the interactive setting of a
main loop procedure. This enables Tk to be a loadable package.
2000-11-02 David Gravereaux <davygrvy@ajubasolutions.com>
* generic/tclEvent.c: tclLibraryPath Tcl_Obj didn't have a way
to share its data among threads. This caused Tcl_Init() to
always fail in threads. Added a way to pass the data around
with a global char*. [BUG: 5301]
2000-11-02 Jeff Hobbs <hobbs@ajubasolutions.com>
* unix/configure:
* unix/dltest/configure:
* win/configure:
* tools/configure: checked in configure scripts so people doing
CVS checkouts aren't required to have autoconf. Changes to
configure.in in the future will require the corresponding
configure script to also be re-autoconf'ed and checked in.
* win/makefile.vc:
* win/tcl.m4: makefile fixes for Win64 support
* generic/tclIndexObj.c (Tcl_GetIndexFromObjStruct): minor cast
changes.
2000-11-01 Jeff Hobbs <hobbs@ajubasolutions.com>
* unix/tcl.m4: removed use of -lbsd and -ldl for AIX-5.
* tests/subst.test: added tests for non-zero return code handling
by subst.
* generic/tclParse.c (Tcl_EvalEx): corrected handling of non-zero,
non-error return code cases for subst. [BUG: 119829]
* generic/tclVar.c (TclVarTraceExists): Corrected excessive mem
use when info exists was called on a non-existent array element.
[BUG: 119213, 119336]
2000-10-30 David Gravereaux <davygrvy@ajubasolutions.com>
* win/configure.in:
* win/Makefile.in:
* win/makefile.vc:
* win/tcl.rc:
* win/tclsh.rc: Added logic to derive filenames better in the resource
scripts based on compile options.
2000-10-30 Jeff Hobbs <hobbs@ajubasolutions.com>
* unix/tclUnixInit.c: added default encoding map from
"ja_JP.eucJP" to "euc-jp". (takahashi)
* tests/clock.test: corrected clock-2.* test numbering
* unix/configure.in (SC_TCL_LINK_LIBS): removed code that was
commented out (it had been moved to tcl.m4's SC_TCL_LINK_LIBS
already).
* unix/tcl.m4: consolidated gettimeofday check for AIX.
2000-10-27 Jeff Hobbs <hobbs@ajubasolutions.com>
* unix/configure.in:
* unix/tcl.m4: added support for AIX-5.
* generic/tclIO.c (Tcl_NotifyChannel): removed #ifdef around code
for old channel structures, placed preserve/release around statePtr
* generic/tclIO.c (CloseChannel): the statePtr for a channel was
not being freed when the last channel in a stack was freed,
causing a mem leak.
* unix/tclUnixChan.c: updated channel types to strict
TCL_CHANNEL_VERSION_2 style to avoid compiler warnings. They work
either way, but this avoids compiler warnings (that worries people).
2000-10-27 Jennifer Hom <jenn@ajubasolutions.com>
* library/tcltest1.0/tcltest.tcl: Removed a cd into the test
directory in runAllTests that screwed up the temporary directory
setting, effectively preventing users from running tests on
multiple platforms at the same time.
2000-10-26 David Gravereaux <davygrvy@ajubasolutions.com>
* win/tclWinFile.c (TclpMatchFilesTypes): NULL was being set to
"attr" which was a DWORD. Changed NULL to zero because a 'void *'
can't be set to a DWORD to avoid the compiler warning.
2000-10-24 Jennifer Hom <jenn@ajubasolutions.com>
* tests/all.tcl: Removed support for tcltest 1.0.
* tests/tcltest.test:
* library/tcltest1.0/tcltest.tcl:
* library/tcltest1.0/pkgIndex.tcl:
* docs/tcltest.n: Moved tcltest2 code so that it's the standard
version of tcltest. Removed all tcltest2 files
(tests/tcltest2.test, library/tcltest1.0/tcltest2.tcl,
docs/tcltest2.n).
2000-10-20 Jeff Hobbs <hobbs@ajubasolutions.com>
* win/tclWinFile.c (TclpMatchFilesTypes): made the stat call only
occur when necessary (for 'glob' command). Significantly speeds
up glob command from 8.3. [BUG: 6216]
2000-10-19 Jennifer Hom <jenn@ajubasolutions.com>
* library/tcltest1.0/tcltest2.tcl:
* tests/tcltest2
* doc/tcltest2.n: Code and documentation cleanup. Modified
-verbose to take list of keywords as well as string of letters.
Removed Tcl version information from tcltest. Removed
tcltest::grep from tcltest package. Added optional 3rd directory
argument to makeFile/makeDirectory and removeFile/removeDirectory.
* tests/basic.test: Changed references to tcltest::tclVersion to
hardcoded numbers.
* generic/tcl.h: Changed reference to tcltest2.tcl and tcltest.tcl
in comments to tests/basic.test.
2000-10-06 David Gravereaux <davygrvy@ajubasolutions.com>
* win/tclWinChan.c: moved Win2K bug case test with GetStdHandle()
from TclpGetDefaultStdChannel into Tcl_MakeFileChannel to enable
a more general method in detecting invalid OS handles rather than
just a specific known case. [BUG: 5971]
2000-10-06 Jeff Hobbs <hobbs@ajubasolutions.com>
* tests/cmdAH.test: extra tests for 'file channels' that include
multiple interpreter tests and channel sharing
* generic/tclIO.c (Tcl_GetChannelNamesEx): corrected function (and
consequently 'file channels') to return channels that are actually
registered for this specific interp, rather than this thread.
* doc/CrtChannel.3: fixed spelling mistakes
2000-09-29 Jennifer Hom <jenn@ajubasolutions.com>
* library/tcltest1.0/tcltest2.tcl:
* tests/tcltest2.test:
* doc/tcltest2.n: Modified the new form of the test command to
accept both attribute-value pairs and command line options.
Updated the tests and the documentation for this new format.
Also changed the option names for the test command.
2000-09-29 Jeff Hobbs <hobbs@scriptics.com>
* win/tclWinSerial.c (SerialGetOptionProc): corrected reporting of
space parity on Windows (Eason) [Bug 6057].
* win/Makefile.in: commented use of TESTFLAGS
* unix/Makefile.in: added TESTFLAGS to test target to
conform with Windows makefile and TEA style.
* tests/stack.test: prevented possible crash on systems with low
default stacksize (Tru64, AIX) in infinite recursion test. A
solution to check remaining stack space in the core is best, but
hard to do in a cross-platform manner.
* generic/tclIOGT.c (FLUSH_DELAY): renamed DELAY define to
FLUSH_DELAY to avoid defn conflict using Tru64's cc.
2000-09-28 Jeff Hobbs <hobbs@ajubasolutions.com>
* tools/tcl.wse.in: added tclPlatDecls.h and tkPlatDecls.h to the
Windows .exe install.
* tests/fCmd.test (fCmd-6.20): corrected test to remove
c:/tcl8975@ after creating it.
* tests/fileName.test: cleaned up the testing of glob patterns for
c:/globTest (Windows) to directly create/remove directory.
2000-09-27 Jeff Hobbs <hobbs@ajubasolutions.com>
* generic/tcl.decls:
* generic/tclIO.c: updated Tcl_IsChannelShared,
Tcl_IsChannelRegistered, Tcl_CutChannel, Tcl_SpliceChannel,
Tcl_IsChannelExisting, and Tcl_ClearChannelHandlers to conform to
the new stacked channel implementation. Their stub slots were
also moved to give preference to the new 8.3.2 stub functions.
This will cause an incompatability with 8.4a1 only.
(StopCopy): fixed a bug introduced by a partial fix in 8.3.2 that
didn't set nonBlocking correctly when resetting the flags for the
write side. [Bug: 6261]
* doc/ChnlStack.3:
* doc/CrtChannel.3:
* generic/tcl.decls:
* generic/tcl.h:
* generic/tclDecls.h:
* generic/tclIO.c:
* generic/tclIO.h:
* generic/tclIOGT.c:
* generic/tclInt.decls:
* generic/tclIntDecls.h:
* generic/tclStubInit.c:
* generic/tclTest.c:
* tests/iogt.test:
* unix/Makefile.in:
* win/Makefile.in:
* win/makefile.vc:
* win/tclConfig.sh.in:
* win/tclWinChan.c:
* win/tclWinConsole.c:
* win/tclWinPipe.c:
* win/tclWinSerial.c:
* win/tclWinSock.c: Up-port of changes made in 8.3.2 to 8.4a2 code
base. Most of these changes relate to the rewrite of the stacked
channel implementation, with a few config related fixes.
Following is an asynchronous include of the applicable ChangeLog
entries from 8.3.2.
********************************************************
** START OF ASYNCHRONOUS UP-PORT LOG (8.3.2 -> 8.4a2) **
********************************************************
2000-08-07 Jeff Hobbs <hobbs@scriptics.com>
* doc/ChnlStack.3:
* doc/CrtChannel.3: updated the docs to be aware of the
TCL_CHANNEL_VERSION_2 style of Tcl channels.
* generic/tclIO.c (Tcl_CreateChannel): added assertion to verify
that the new channel versioning will be binary compatible with
older channel drivers.
2000-08-05 Jeff Hobbs <hobbs@scriptics.com>
* generic/tclIOGT.c (TclChannelTransform): fixed segfault that
would occur when transforming a channel with a proc that did not
yet exist. (Kupries)
* generic/tclTest.c (TestChannelCmd): added some lint init'ing of
statePtr and chan vars.
2000-07-26 Jeff Hobbs <hobbs@scriptics.com>
* merged core-8-3-1-io-rewrite back into core-8-3-1-branch.
The core-8-3-1-io-rewrite branch should now be considered defunct.
* generic/tclStubInit.c:
* generic/tclDecls.h:
* generic/tcl.decls:
* generic/tcl.h:
* generic/tclIO.c: moved the Tcl_Channel* macros from tcl.h to
tclIO.c and made them proper stubbed functions. These are:
Tcl_ChannelName, Tcl_ChannelVersion, Tcl_ChannelBlockModeProc,
Tcl_ChannelCloseProc, Tcl_ChannelClose2Proc, Tcl_ChannelInputProc,
Tcl_ChannelOutputProc, Tcl_ChannelSeekProc, Tcl_ChannelSetOptionProc,
Tcl_ChannelGetOptionProc, Tcl_ChannelWatchProc,
Tcl_ChannelGetHandleProc, Tcl_ChannelFlushProc,
and Tcl_ChannelHandlerProc. These should be used to access the
Tcl_ChannelType structure instead of direct pointer dereferencing.
* tests/iogt.test: added RCS string, marked tests 2.* to be
unixOnly due to underlying system differences.
2000-07-25 Andreas Kupries <a.kupries@westend.com>
* tests/iogt.test: (line 866f) New tests iogt-6.[01], highlighting
buffering trouble when stacking and unstacking transformations.
iogt-6.0 is solved, see the changes below. iogt-6.1 remains, for
now, due to the perceived complexity of solutions.
* generic/tclIO.h: (line 139f) struct Channel, added a buffer
queue, to hold data pushed back when stacking a transformation.
* generic/tclIO.c:
(line 91f, line 7434f) New internal function 'CopyBuffer'.
Derived from 'CopyAndTranslateBuffer', with translation
removed.
(line 1025f, line 1212f): Initialization of new queue.
(line 1164f, Tcl_StackChannel): Pushback of input queue.
(line 1293f, Tcl_UnstackChannel): Discard input and pushback.
(line 3748f, Tcl_ReadRaw): Modified to use data in the push back
area before going to the driver. Uses 'CopyBuffer', s.a.
(line 4702f, GetInput): Modified to use data in the push back
area before going to the driver.
(line 4867f, Tcl_Seek): Modified to take pushback of the topmost
channel in a stack into account.
(line 5620f, Tcl_InputBuffered): See above. Added
'Tcl_ChannelBuffered'. Analogue to 'Tcl_InputBuffered' but for
the buffer area in the channel.
* generic/tcl.decls: New public API 'Tcl_ChannelBuffered'. S.a.
2000-07-17 Jeff Hobbs <hobbs@scriptics.com>
* unix/Makefile.in:
* win/Makefile.in:
* win/makefile.vc: added tclIOGT.c to objects list to compile.
* generic/tclStubInit.c:
* generic/tclIntDecls.h:
* generic/tclInt.decls: commented out internal decls for
TclTestChannelCmd and TclTestChannelEventCmd as they were moved to
tclTest.c. Added new decls for TclChannelEventScriptInvoker and
TclChannelTransform.
* generic/tclIO.c (CloseChannel): stopped masking out of the
TCL_READABLE|TCL_WRITABLE bits from the state flags in
CloseChannel, instead adding extra intelligence to
CheckChannelErrors with a new CHANNEL_RAW_MODE bit for special
behavior when called from Raw channel APIs.
2000-07-13 Jeff Hobbs <hobbs@scriptics.com>
* generic/tclIO.c (StackSetBlockMode): moved set of chanPtr
outside of blockModeProc check to avoid infinite loop when
blockModeProc was NULL (Kupries). updated TransformSeekProc to
not call Tcl_Seek directly (Kupries).
* win/tclWinChan.c: updated fileChannelType to v2 channel struct
* win/tclWinConsole.c: updated consoleChannelType to v2 channel struct
* win/tclWinPipe.c: updated pipeChannelType to v2 channel struct
* win/tclWinSerial.c: updated serialChannelType to v2 channel struct
* win/tclWinSock.c: updated tcpChannelType to v2 channel struct
2000-07-11 Brent Welch <welch@ajubasolutions.com>
* win/tclConfig.sh.in (TCL_LIBS): Cleaned up unix-specific
autoconf variables.
2000-07-11 Jeff Hobbs <hobbs@scriptics.com>
* tests/iogt.test: made tests [345].0 not run by default as they
were failing in the new design, but I'm not convinced that the
returned result isn't correct.
* generic/tclDecls.h:
* generic/tclStubInit.c:
* generic/tcl.decls: added Tcl_GetTopChannel C API that returns
the current top channel of a channel stack. Tcl_GetChannel was
changed earlier to return the bottommost channel of a stack
because that is the one that is guaranteed to stay around the
longest, and this was needed to compensate for certain
operations that want to look at the state of the main channel.
Most channel APIs already compensate for grabbing the top, so it
shouldn't be needed often.
* generic/tclIO.c (Tcl_StackChannel, Tcl_UnstackChannel): Added
flushing of buffers (Kupries), removed use of DownChannel macro,
added Tcl_GetTopChannel public API to get to the top channel of
the channel stack (necessary for TLS). Rewrote Tcl_NotifyChannel
for new channel design (Kupries). Did some code cleanup in the
transform code. tclIO.c must still be broken into bits (separate
out test code and giot code, create tclIO.h).
2000-07-10 Andreas Kupries <a.kupries@westend.com>
* tests/iogt.test: Reverted some earlier changes as a fix by Jeff
revived the original and correct behaviour. IOW, the tests showed
a genuine error and I didn't see it :(.
* generic/tclIO.c (Tcl_Read|Write_Raw): Changed to directly use
the drivers and not DoRead|DoWrite. The latter use the buffering
system, encoding and eol-translation and this wreaks havoc with
the data going through the transformations. Both procedures use
CheckForchannelErrors and let it believe that there is no
background copy in progress or else stacked channels could not
be used for that.
* generic/tclIO.c (TclCopyChannel, CopyData): Moved access to the
topmost channel from the first to the second procedure to make
the decision about that at the last possible time (Callbacks can
change the stacking).
test suite: failures of iogt-[345].0
2000-07-06 Jeff Hobbs <hobbs@scriptics.com>
* tests/iogt.test: new tests for stacked channel stuff based off
new 'testchannel transform|unstack' code (Kupries IOGT extension).
* generic/tcl.decls:
* generic/tcl.h:
* generic/tclDecls.h:
* generic/tclStubsInit.c:
* generic/tclIO.c: complete rewrite of Tcl Channel code for
stacked channels. Channels are now designed to work in a more
stacked fashion with a shared ChannelState data structure.
2000-06-02 Jeff Hobbs <hobbs@scriptics.com>
* generic/tclIO.c (CloseChannel): removed the &ing out of
(TCL_READABLE|TCL_WRITABLE) from the flags, as CloseChannel does
this on the next pass through for the top channel, and it appeared
to be causing hangs by not allowing the final flush.
2000-06-01 Jeff Hobbs <hobbs@scriptics.com>
* generic/tclIO.c (CloseChannel): Rewrote CloseChannel code to
unstack a channel during the close process. Fixed a refcount bug
in Tcl_UnstackChannel. [Bug: 5623]
(CloseChannel): further extended CloseChannel in the stacked case
to effect certain operations on the next channel that would have
been done in Tcl_Close. Also added CHANNEL_CLOSED and removed
(TCL_READABLE|TCL_WRITABLE) bits from chanPtr->flags. Changed
final reset of the WatchProc to check the chanDownPtr's (next)
interestMask.
******************************************************
** END OF ASYNCHRONOUS UP-PORT LOG (8.3.2 -> 8.4a2) **
******************************************************
2000-09-20 Jeff Hobbs <hobbs@scriptics.com>
* tests/socket.test: removed doTestsWithRemoteServer constraint
from socket-12.*. It requires 'exec', not a remote server.
Cleaned up some coding errors.
2000-09-20 Jennifer Hom <jenn@ajubasolutions.com>
* library/tcltest1.0/pkgIndex.tcl: Updated to load tcltest 2.0.
* library/tcltest1.0/tcltest2.tcl: New version of tcltest.
Cleanup of command line parsing: allows users to specify command
line arguments through an environment variable named
TCLTEST_OPTIONS [RFE: 3748], does not respond to incorrect
arguments, and forces usage of entire flag name when using command
line arguments. Defines accessor procs for all tcltest
variables. Allows users to use 'return' in test scripts. Allow
users to specify whether test files should be sourced or run in a
separate process. 'all.tcl' code moved to tcltest package.
'test' proc modified to use attribute-value pairs. Allow users to
specify what return codes, output, and errors can be compared and
whether these values should be compared using regexp, glob, or
exact matching. makeDirectory & removeDirectory now operate with
respect to temporaryDirectory [Bug: 6001]. Test results from
tests run in slave interpreters are now included in test totals
[Bug: 1493]. Test files that return error values are now reported.
* tests/all.tcl: Added code to check for the tcltest version
loaded; modified to figure out which tests to run based on the
tcltest version loaded.
* tests/tcltest.test: Modified to explicitly load version 1.0 of
tcltest.
* tests/tcltest2.test: New test suite for tcltest; includes all of
the old tests plus new ones reflecting changes made for version
2.0.
* tests/cmdAH.test: Added singleTestInterp constraint to
cmdAH-31.2; this test does not run if tests aren't sourced into a
single interpreter.
* tests/socket.test: Fixed two tests that were referencing
variables outside of scope.
* tools/tcl.wse.in: Added code to install tcltest2.tcl.
* doc/tcltest2.n: New documentation for tcltest version 2.0.
Removes documentation for tcltest namespace variables. Adds
documentation for new tcltest procs.
* unix/mkLinks: Added code to link to tcltest2.n.
* generic/tcl.h: Added comment to modify tcltest2.tcl as well as
tcltest.tcl for version changes.
2000-09-19 Eric Melski <ericm@ajubasolutions.com>
* generic/tclCmdMZ.c (Tcl_RegexpObjCmd): When using -all, all
attempts after the first to match the regexp against the string
should include the TCL_REG_NOTBOL flag, to avoid erroneously
matching ^ in the middle of the string. Added code to set this
flag after the first pass through the matching loop. [Bug: 6284].
2000-09-19 David Gravereaux <davygrvy@ajubasolutions.com>
* doc/Eval.3: Added a note about the script argument to Tcl_Eval()
should be in UTF-8 or risk implied conversion errors when possible
combinations of upper ascii can be valid UTF-8 special codes.
2000-09-17 Eric Melski <ericm@ajubasolutions.com>
* tests/cmdIL.test: Added a test for fix for [Bug: 6212].
* generic/tclCmdIL.c (Tcl_LsortObjCmd): Applied patch from [Bug:
6212], which corrected an error in the handling of the -index option.
2000-09-14 Eric Melski <ericm@ajubasolutions.com>
* doc/Alloc.3: Added entries for Tcl_AttemptAlloc, Tcl_AttempRealloc.
* doc/StringObj.3: Added entry for Tcl_AttemptSetObjLength.
* generic/tclDecls.h:
* generic/tclStubInit.c: Regen'ed stubs files from new tcl.decls.
* generic/tcl.decls: Added stubs for the Tcl_Attempt* memory
allocators and for Tcl_AttemptSetObjLength.
* generic/tcl.h: Added #define's for attemptckalloc,
attemptckrealloc, which map to the Tcl_Attempt* memory allocators.
* generic/tclCkalloc.c: Added non-panic'ing versions of Tcl_Alloc,
Tcl_Realloc, etc.; these are called Tcl_AttemptAlloc,
Tcl_AttemptRealloc, etc. These are used by
Tcl_AttemptSetObjLength and the string obj append functions.
* generic/tclStringObj.c: Modified string growth algorithm to use
doubling algorithm as long as possible, and only fall back when
that fails. Added Tcl_AttemptSetObjLength, and modified
AppendUnicodeToUnicodeRep, AppendUtfToUtfRep, and
Tcl_AppendStringsToObjVA to support this.
2000-09-07 David Gravereaux <davygrvy@ajubasolutions.com>
* win/.cvsignore: changed the glob patterns a bit to exclude VC++
project conversion backups.
* win/tclWinPipe.c: Stage-1 bug fix for TR#2460 "exec leaks memory".
Added more logic around the close-down of the pipe reader thread so
as to avoid, at all cost, a TerminateThread. Most cases with exec
are fixed, but I don't consider 2460 done yet. Closing down the
read side of a pipe before the child process, doesn't really fit
the windows model. [BUG: 2460]
2000-09-07 Jeff Hobbs <hobbs@scriptics.com>
* doc/trace.n: minor doc cleanup
2000-09-06 André Pönitz <poenitz@htwm.de>
* doc/*.n: added or changed "SEE ALSO:" section
2000-09-06 Jeff Hobbs <hobbs@scriptics.com>
* win/tclWinLoad.c (TclpLoadFile): added special message for
ERROR_PROC_NOT_FOUND exception in loading a dll.
* win/tclWinError.c: changed ERROR_PROC_NOT_FOUND to map from
ESRCH (POSIX: no such process) to EINVAL because there is no good
mapping for "procedure not found".
* README:
* generic/tcl.h:
* library/tcltest1.0/tcltest.tcl:
* tools/tcl.wse.in:
* tools/tcltk-man2html.tcl:
* unix/configure.in:
* unix/tcl.spec:
* win/README.binary:
* win/configure.in: updated patchlevel to 8.4a2
* unix/tclUnixPipe.c (TclpCreateProcess): Removed WNOHANG from
Tcl_WaitPid call in error case of process creation on Unix, as it
would lead to defunct processes. [Bug: 6148]
* tests/string.test: extended string repeat tests
* generic/tclCmdMZ.c (Tcl_StringObjCmd): changed STR_REPEAT to
preallocate the full space of the final string, avoided repeated
appends.
* doc/source.n:
* doc/Eval.3: added extra note about how to safe use ^Z in code,
as it is now a cross-platform (was just Windows) EOF char.
2000-09-05 Jeff Hobbs <hobbs@scriptics.com>
* generic/tclHash.c: fixed pedantic warning of incorrectly placed
#endif
* generic/tclExecute.c (TclExecuteByteCode): INST_STR_INDEX fixed
pedantic cast warning.
Corrected support for building with -DTCL_COMPILE_STATS.
Added efficiency check of object equality.
2000-08-29 Eric Melski <ericm@ajubasolutions.com>
* generic/tclStringObj.c: Applied patch from Gerhard Hintermayer
to provide a more conservative string growth algorithm for strings
larger than one megabyte; this allows more efficient use of memory
for very large strings.
2000-08-25 Eric Melski <ericm@ajubasolutions.com>
* tests/trace.test: Extended array tracing tests.
* doc/trace.n: Clarified information about when array traces will
be fired.
* generic/tclVar.c (Tcl_ArrayObjCmd): Corrected call to CallTraces
(for TCL_TRACE_ARRAY) to only be called when the variable is
either an array or is undefined, to ensure that array traces do
not fire for scalar variables.
2000-08-24 Eric Melski <ericm@ajubasolutions.com>
* doc/man.macros: Tweaked tab settings for .SO (Standard Options)
sections, based on suggestion from Peter Spjuth.
2000-08-24 Mo DeJong <mdejong@redhat.com>
* unix/README: Update to account for removal of --enable-gcc.
* unix/configure.in:
* unix/tcl.m4 (SC_ENABLE_GCC): Remove --enable-gcc option.
* win/README: Add note about building with Cygwin.
* win/configure.in:
* win/tcl.m4 (SC_ENABLE_GCC): Remove --enable-gcc option.
Remove quick hack that provided cross compile support for
windows builds.
2000-08-24 Eric Melski <ericm@ajubasolutions.com>
Overall change: Added support for command rename/delete traces
and new trace syntax, from patch from Vince Darley. Added support
for array traces for variables. [RFE: 5048, 5967].
* doc/trace.n: Updated documentation for new syntax; flagged old
syntax as deprecated; added documentation for command
rename/delete traces and variable array traces.
* tests/trace.test: Updated tests for new trace syntax; new tests
for command rename/delete traces; new tests for array traces.
* generic/tclVar.c: Support for new trace syntax; support for
TCL_TRACE_ARRAY.
* generic/tclStubInit.c:
* generic/tclDecls.h:
* generic/tcl.decls: Stub functions for command rename/delete traces.
* generic/tcl.h:
* generic/tclInt.h:
* generic/tclBasic.c: Support for command traces.
* generic/tclCmdMZ.c (TclTraceVariableObjCmd): Patched to support
new [trace] syntax:
trace {add|remove|list} {variable|command} name ops command
Added support for command traces (rename, delete operations).
Added support for TCL_TRACE_ARRAY at Tcl level (array operation
for variable traces).
2000-08-20 Eric Melski <ericm@ajubasolutions.com>
* generic/tclVar.c: Added check for non-arrays for [array statistics]
command (patch from Mark Patton).
2000-08-19 David Gravereaux <davygrvy@ajubasolutions.com>
* generic/tclPlatDecls.h: without a previous '#include <windows.h>',
tclPlatDecls.h can't be parsed due to a missing definition of TCHAR.
Added a check to include it when not defined.
***POSSIBLE OBSCURE BUG*** could be caused when the compile flags
for the core happen to be different than a project who uses these
publics regarding -D_MBCS and -D_UNICODE. This added check might
have to be revisited later with a better understanding of the
reprocusions. I think TCHAR should be replaced with it's expansion.
2000-08-18 David Gravereaux <davygrvy@ajubasolutions.com>
* win/.cvsignore (added): provides a cleaner build environment with
graphical CVS clients.
2000-08-15 Eric Melski <ericm@ajubasolutions.com>
* library/tcltest1.0/tcltest.tcl: Set debug level in
tcltest::restoreState to 2, for consistancy with the debug level
in tcltest::saveState [Bug: 4505].
2000-08-14 Eric Melski <ericm@ajubasolutions.com>
* win/makefile.vc:
* win/Makefile.in:
* unix/Makefile.in: Added tclPlatDecls.h to the list of installed
headers, for more complete stubs support. [Bug: 5241].
* generic/tcl.h: Added #include "tclPlatDecls.h" to get
platform-specific stubs declarations (Tcl_WinTCharToUtf, etc)
[Bug: 5241].
* README: Updated link for instructions on compiling Tcl from
sources to point to correct location
(http://dev.scriptics.com/doc/... instead of
http://dev.scriptics.com/support/...).
2000-08-11 Eric Melski <ericm@ajubasolutions.com>
* generic/tclEnv.c (TclUnsetEnv): Changed declaration of length
variable from "unsigned int" to "int", to match usage when passed
to TclpFindVariable [Bug: 6126].
2000-08-10 Eric Melski <ericm@ajubasolutions.com>
* library/msgcat1.0/pkgIndex.tcl: Bumped version number to 1.2
[Bug: 6100].
* library/msgcat1.0/msgcat.tcl: Removed erroneous [package forget]
in msgcat namespace initializer. Bumped version number to 1.2
[Bug: 6100].
2000-08-10 David Gravereaux <davygrvy@ajubasolutions.com>
* generic/tclObj.c: r1.15 accidentally changed a global mutex
name tclObjMutex to ObjMutex. Put the correct name back.
2000-08-07 Eric Melski <ericm@ajubasolutions.com>
* tests/indexObj.test: Added tests using the [testwrongnumargs]
command to test Tcl_WrongNumArgs.
* generic/tclTest.c (TestWrongNumArgsObjCmd): Added test function
for the Tcl_WrongNumArgs function.
* generic/tclIndexObj.c (Tcl_WrongNumArgs): Corrected algorithm to
not insert a space before the message component when objc == 0
[Bug: 6078].
2000-07-27 Mo DeJong <mdejong@redhat.com>
* win/configure.in: TCL_STUB_LIB_FLAG should not
include ${TCL_DBGX} in win/tclConfig.sh, fix that.
2000-07-25 David Gravereaux <davygrvy@ajubasolutions.com>
* doc/Async.3:
* generic/tclAsync.c:
* generic/tclInt.decls:
* generic/tclIntPlatDecls.h:
* generic/tclStubInit.c:
* generic/tclTest.c:
* mac/tclMacPort.h:
* unix/tclUnixPort.h:
* win/tclWinInit.c: Thread-safe rewrite for tclAsync.c. Added
notifier alerting on all platforms as it was only working on Win
before. Removed older Win hacks that would end-up waking the
wrong notifier in the presence of a threaded build. All tests
pass as before. New test cases will be added soon for the new
behavior. [BUG: 5791]
2000-07-25 Eric Melski <ericm@ajubasolutions.com>
* generic/tclVar.c (CallTraces): Added check for VAR_TRACE_ACTIVE
on the array containing the variable before executing traces on
that array, to conform with normal variable traces and the
documentation, which states that while executing a trace, other
traces on that variable are disabled. [Bug: 6049].
* win/tclWinPipe.c (BuildCommandLine): Added Tcl_DStringFree call
to prevent potential memory leaks [Bug: 6041].
2000-07-24 Eric Melski <ericm@ajubasolutions.com>
* doc/msgcat.n: Added documentation about the selection of the
default locale on Windows.
2000-07-23 Joe English <jenglish@flightlab.com>
* doc/AddErrInfo.3:
* doc/ChnlStack.3:
* doc/Exit.3:
* doc/GetIndex.3:
* doc/Notifier.3:
* doc/Object.3:
* doc/RegExp.3:
* doc/SetResult.3:
* doc/SplitList.3:
* doc/Thread.3: Added missing entries to NAME section.
* doc/AddErrInfo.3:
* doc/CrtObjCmd.3:
* doc/RecEvalObj.3: Changed Tcl_EvalObj to Tcl_EvalObjEx
2000-07-21 Eric Melski <ericm@ajubasolutions.com>
* generic/tclStubInit.c:
* generic/tclObj.c:
* generic/tclInt.h:
* generic/tclHash.c:
* generic/tclDecls.h:
* generic/tcl.h:
* generic/tcl.decls:
* doc/Hash.3: Reapplied patch from Paul Duffin to extend hash tables
to allow custom key types, such as Tcl_Obj *'s, and others.
* doc/binary.n: Noted that the example in the introduction assumes a
32-bit system [Bug: 6035].
2000-07-21 Mo DeJong <mdejong@redhat.com>
* win/configure.in: Define ${prefix} and ${exec_prefix} like
unix/configure.in. Fix or add TCL_SRC_DIR, TCL_STUB_LIB_FILE,
TCL_STUB_LIB_FLAG, TCL_BUILD_STUB_LIB_SPEC, TCL_STUB_LIB_SPEC,
TCL_BUILD_STUB_LIB_PATH, TCL_STUB_LIB_PATH.
2000-07-20 Eric Melski <ericm@ajubasolutions.com>
* generic/tclStubInit.c:
* generic/tclObj.c:
* generic/tclInt.h:
* generic/tclHash.c:
* generic/tclDecls.h:
* generic/tcl.h:
* generic/tcl.decls:
* doc/Hash.3: Reverted patch from Paul Duffin to extend hash tables
to allow custom key types, such as Tcl_Obj *'s, and others; it
seems to break Tk.
2000-07-19 Eric Melski <ericm@ajubasolutions.com>
* generic/tclStubInit.c:
* generic/tclObj.c:
* generic/tclInt.h:
* generic/tclHash.c:
* generic/tclDecls.h:
* generic/tcl.h:
* generic/tcl.decls:
* doc/Hash.3: Applied patch from Paul Duffin to extend hash tables
to allow custom key types, such as Tcl_Obj *'s, and others.
* tests/pkgMkIndex.test: Added tests for pkg_compareExtension.
* library/package.tcl: Enhanced pkg_compareExtension to handle
Unixes which tack the version number on to the end of library
names (eg, foo.so.1.2); such filenames will be correctly matched.
(Patch from Vince Darley).
* win/makefile.vc: Applied patch from Don Porter to provide better
nmake support for NT/Alpha [RFE: 5938].
2000-07-18 Mo DeJong <mdejong@redhat.com>
* unix/configure.in:
* unix/tcl.m4:
* win/tcl.m4: Properly quote arguments to m4 macros. This allows
Tcl to work with the new version of autoconf.
2000-07-18 Eric Melski <ericm@ajubasolutions.com>
* tests/opt.test: Removed references to Lfirst, Lrest functions.
* library/opt0.4/optparse.tcl: Applied patch from Chris Nelson,
which replaces the [Lfirst] function with an inline [lindex ... 0]
and [Lrest] with [lrange ... 1 end], for better performance.
[RFE: 6019]
2000-07-18 Eric Melski <ericm@scriptics.com>
* compat/string.h: Fixed function prototypes for strpbrk and
strtok [Bug: 6020].
2000-07-17 David Gravereaux <davygrvy@ajubasolutions.com>
* win/tclWinChan.c: Win2K OS bug with
GetStdHandle(STD_OUTPUT_HANDLE) giving the wrong answer. This
made TclpGetDefaultStdChannel grab what it thought was a valid
native stdout handle. Added a new WriteFile() test to make sure
it's really valid. This OS bug doesn't affect the shells. Only
-subsystem:windows (aka WinMain) application that dynamically
load tclXX.dll [BUG: 5971]
2000-07-17 Eric Melski <ericm@scriptics.com>
* library/msgcat1.0/msgcat.tcl:
* doc/msgcat.n:
* tests/msgcat.test: Applied patches from Chris Nelson, to provide
the mcmset function, which allows the translator to set multiple
string translations in a single function call, rather than
requiring many calls to mcset. [RFE: 6000, 5993]. In addition,
these patches correct mcload to use utf-8 encoding on when reading
message catalog files, and provides for better default behavior
for determining the locale on a Windows system.
2000-07-17 Mo DeJong <mdejong@redhat.com>
* unix/tcl.m4 (SC_ENABLE_GCC): Don't set CC=gcc
before running AC_PROG_CC if CC is already set.
2000-07-13 André Pönitz <poenitz@mathematik.tu-chemnitz.de>
* doc/lappend.n:
* doc/lindex.n:
* doc/linsert.n:
* doc/list.n:
* doc/llength.n:
* doc/lrange.n:
* doc/lreplace.n:
* doc/lsearch.n:
* doc/lsort.n: Added SEE ALSO sections.
2000-07-07 Mo DeJong <mdejong@redhat.com>
* win/configure.in: Fix definition of
TCL_SRC_DIR so that it matches the Unix version.
* win/tclConfig.sh.in: Removed duplicate variables.
2000-07-06 Eric Melski <ericm@scriptics.com>
* tests/msgcat.test:
* library/msgcat1.0/msgcat.tcl: Applied patch from Christian
Krone, to provide extended args support for msgcat::unknown, which
is used for strings without a known translation in the current
locale [Bug: 5984].
2000-06-29 Eric Melski <ericm@scriptics.com>
* doc/msgcat.n: Doc's for mcmax function.
* library/msgcat1.0/msgcat.tcl: Applied patches from Laurent
Duperval, to add mcmax function, which computes the length of the
longest of several translated strings. Bumped version number to 1.1.
2000-06-27 Eric Melski <ericm@scriptics.com>
* tests/stringObj.test: Tweaked tests to avoid hardcoded
high-ASCII characters (which will fail in multibyte locales);
instead used \uXXXX syntax. [Bug: 3842].
2000-06-26 Eric Melski <ericm@scriptics.com>
* doc/package.n: Corrected information about [package forget]
arguments [Bug: 5418].
2000-06-23 Eric Melski <ericm@scriptics.com>
* doc/Hash.3: Added documentation patch for Tcl_Obj *'s as keys in
Tcl hash tables [RFE: 5934].
* generic/tcl.h:
* generic/tclHash.c: Applied patch from [RFE: 5934], which extends
Tcl hash tables to allow Tcl_Obj *'s as the key.
2000-06-20 Eric Melski <ericm@ajubasolutions.com>
* tests/opt.test:
* library/opt0.4/optparse.tcl: Applied patch from [Bug: 5922], which
corrected an incorrect use of [string match].
* unix/tclConfig.sh.in:
* win/tclConfig.sh.in: Applied patch from [Bug: 5921], which corrects a
typo in the comments in these files.
2000-06-19 Eric Melski <ericm@scriptics.com>
* doc/RegExp.3: Replaced instances of "Tcl_GetRegExpInfo" with
"Tcl_RegExpGetInfo", the correct name of the function [Bug: 5901].
2000-06-13 Eric Melski <ericm@scriptics.com>
* win/tcl.m4:
* win/configure.in:
* win/Makefile.in: Applied patch from [RFE: 5844], to extend
support for mingw compile environment on Windows.
* win/tclWinDde.c:
* win/tclWinInit.c:
* win/tclWinNotify.c:
* win/tclWinPipe.c:
* win/tclWinReg.c:
* win/tclWinThrd.c: Applied patch from [Bug: 5794], to fix
compiler warnings when using mingw on Windows.
2000-05-31 Jeff Hobbs <hobbs@scriptics.com>
* tests/set-old.test:
* doc/unset.n:
* generic/tclVar.c (Tcl_UnsetObjCmd): added -nocomplain and --
options to unset, to allow for a silent unset operation.
2000-05-31 Eric Melski <ericm@scriptics.com>
* generic/tclVar.c (Tcl_ArrayObjCmd): Added support for regexp and
exact matching for [array names] command. [RFE: 3684].
* doc/array.n: Added documentation for [array names
-exact/-regexp/-glob] [RFE: 3684].
* tests/set-old.test: Added tests for [array names
-exact/-regexp/-glob] [RFE: 3684].
2000-06-06 Jeff Hobbs <hobbs@scriptics.com>
8.4a1 RELEASE
* generic/tclExecute.c (TclExecuteByteCode INST_STR_CMP): added
test of iResult return from memcmp, as memcmp isn't required to
return only -1,0,1.
2000-06-03 Jeff Hobbs <hobbs@scriptics.com>
* generic/tclIndexObj.c (Tcl_GetIndexFromObjStruct): Corrected
caching of the index ptr to account for offsets != sizeof(char *).
[Bug: 5153]
2000-05-29 Sandeep Tamhankar <sandeep@scriptics.com>
* tests/http.test
* doc/http.n
* library/http2.3/http.tcl: Fixed bug 5741, where unsuccessful
geturl calls sometimes leaked memory and resources (sockets).
Also, switched around some of the logic so that http::wait never
throws an exception. This is because in an asynchronous geturl,
the command callback will probably end up doing all the error
handling anyway, and in an asynchronous situation, the user
expects to check the state when the transaction completes, as
opposed to being thrown an exception. For the http package, this
menas the user can check http::status for "error" and http::error
for the error message after doing the http::wait.
2000-05-27 Jeff Hobbs <hobbs@scriptics.com>
* tests/info.test:
* doc/info.n:
* generic/tclIOUtil.c (Tcl_EvalFile):
* generic/tclCmdIL.c (InfoScriptCmd): added ability to set the
info script return value [info script ?newFileName?]. This will
be beneficial for virtual file system programs. [Bug: 4225]
2000-05-26 Jeff Hobbs <hobbs@scriptics.com>
* generic/tclCmdMZ.c (Tcl_RegsubObjCmd): reworked to operate in
Unicode, tweaked for performance.
(Tcl_StringObjCmd) changed STR_FIRST/STR_LAST error message to
something more understandable, reworked STR_FIRST, STR_LAST,
STR_MAP, STR_MATCH, STR_RANGE, STR_REPLACE to operate in Unicode.
Removed inneffectual STR_RANGE "special" ByteArray support.
Optimized STR_MAP algorithm, especially optimized for one-pair case.
Fixed possible mem overrun in STR_INDEX bytearray case.
* generic/tclCompExpr.c: changed INST_STREQ -> INST_STR_EQ,
INST_STRNEQ -> INST_STR_NEQ
* generic/tclCompile.c: added streq, strneq, strcmp, strlen &
strmatch to the compiled stats instructionTable
* generic/tclCompile.h: added instructions INST_STR_CMP,
INST_STR_INDEX, INST_STR_MATCH
* generic/tclCompCmds.c: added byte compiler support for
[string compare|match|index].
* generic/tclExecute.c:
Changed INST_STR_(N)EQ to return an Int object and not bother
trying to reuse the top stack object.
Added INST_STR_CMP, INST_STR_INDEX, INST_STR_MATCH bytecode ops.
Extended evalstats output info with Tcl_IsShared stat info.
* generic/tclInt.h:
* generic/tclObj.c (Tcl_DbIsShared): added support for checking
result of Tcl_IsShared in evalstats (TCL_COMPILE_STATS).
* generic/tclStringObj.c (Tcl_AppendUnicodeToObj): removed dead code.
(AppendUnicodeToUnicodeRep) removed overallocation by extra
sizeof(Tcl_UniChar) multiplier.
* tests/string.test: added string map tests for the one-pair case,
corrected tests to reflect improved error messages in first/last.
Added tests against mem overrun in string index bytearray case.
2000-05-23 Eric Melski <ericm@scriptics.com>
* generic/tclInt.h: Added function prototypes for
TclCompileStringCmd and TclCompileReturnCmd.
* generic/tclCompile.h: Added definition of INST_STRLEN opcode and
updated LAST_INST_OPCODE value.
* generic/tclBasic.c: Added information about TclCompileStringCmd
and TclCompileReturnCmd to BuiltInCmds table.
* generic/tclExecute.c (TclExecuteByteCode): Added support for the
INST_STRLEN opcode.
* generic/tclCompCmds.c
(TclCompileStringCmd): Basic implementation of byte-compiled
[string] command. Not all subcommands are implemented; those
that are not an out-line compiled.
(TclCompileReturnCmd): Byte-compiled implementation of [return]
command. Only "simple" returns are byte-compiled; in particular,
if the -code, -errorinfo or -errorcode flags are used, the command
is not byte-compiled.
2000-05-22 Jeff Hobbs <hobbs@scriptics.com>
* doc/scan.n:
* doc/array.n: minor doc fixes [Bug: 5396]
* generic/tclEnv.c: cast cleanup [Bug: 5624]
* win/tclWinConsole.c: cast and header cleanup [Bug: 5625]
* win/tclWinSerial.c: cast cleanup [Bug: 5626]
* win/tclWinFCmd.c: cast cleanup [Bug: 5627]
2000-05-19 Jeff Hobbs <hobbs@scriptics.com>
* generic/tclTest.c:
* generic/tclIO.c: moved channel test commands from tclIO.c to
tclTest.c.
* generic/tclIO.h: new file, split out from tclIO.c to allow test
commands to be moved to tclTest.c.
* generic/tclStubInit.c:
* generic/tclIntDecls.h:
* generic/tclInt.decls: removed TclTestChannel*Cmd from internal
stubs table and added TclChannelEventScriptInvoker to the internal
stubs table so it can be used from the test code.
2000-05-18 Eric Melski <ericm@scriptics.com>
* tests/clock.test: Added test for "2 days 2 hours ago" style
specifications.
* generic/tclDate.c: Regenerated from tclGetDate.y.
* generic/tclGetDate.y: Tweaked grammar to properly handle the
"ago" keyword when it follows multiple relative unit specifiers,
as in "2 days 2 hours ago". [Bug: 5497].
2000-05-18 Jeff Hobbs <hobbs@scriptics.com>
* win/{tcl.m4,Makefile.in,configure.in}: added support for mingw
compile env and cross-compiling. [Bug: 5499]
* generic/tclClock.c (FormatClock): correct code to handle locale
specific return values from strftime, if any. [Bug: 3345]
* unix/tclUnixInit.c (TclpSetInitialEncodings): attempt to
correct setlocale calls for XIM support and locale issues.
[BUG: 5422 3345 4236 2522 2521]
2000-05-17 Jeff Hobbs <hobbs@scriptics.com>
* library/init.tcl (auto_import): added check to see if a valid
pattern was coming in, to avoid simple error cases [Bug: 3326]
* doc/regsub.n: correct regsub docs [Bug: 5346]
2000-05-15 Eric Melski <ericm@scriptics.com>
* library/history.tcl: Corrected an off-by-one error in HistIndex,
which was causing [history redo] to start its search at the wrong
event index. [Bug: 1269].
2000-05-10 Jeff Hobbs <hobbs@scriptics.com>
* generic/tclPosixStr.c (Tcl_SignalMsg): clarified #defines for
Linux on Sparc to compile correctly. [Bug: 5364]
* doc/namespace.n:
* tests/namespace.test:
* generic/tclNamesp.c (Tcl_NamespaceObjCmd): added 'namespace
exists' command. [Bug: 4665]
* doc/source.n:
* doc/Eval.3:
* tests/source.test:
* generic/tclIOUtil.c (Tcl_EvalFile): added explicit \32 (^Z)
eofchar (affects Tcl_EvalFile in C, "source" in Tcl). This was
implicit on Windows already, and is now cross-platform to allow
for scripted documents.
2000-05-09 Andreas Kupries <a.kupries@westend.com>
operating as proxy for David Gravereaux <davygrvy@pobox.com>
* win/tclWinThrd.c (TclpInitLock, TclpMasterLock): Added missing
initialization of joinLock.
2000-05-09 Eric Melski <ericm@scriptics.com>
* tests/lsearch.test:
* doc/lsearch.n:
* generic/tclCmdIL.c (Tcl_LsearchObjCmd): Extended [lsearch] to
support sorted list searching and typed list searching. [RFE: 4098].
2000-05-08 Jeff Hobbs <hobbs@scriptics.com>
* doc/expr.n:
* tests/expr.test:
* tests/expr-old.test: added tests for 'eq' and 'ne'
* generic/tclExecute.c:
* generic/tclCompile.h: added INST_STREQ and INST_STRNEQ opcodes
that do strict string comparisons.
* generic/tclCompExpr.c: added 'eq' and 'ne' string comparison
operators.
* generic/tclParseExpr.c (GetLexeme): added 'eq' and 'ne' expr
parse terms (string (in)equality check).
* generic/tclCmdIL.c (Tcl_LinsertObjCmd): made use of
Tcl_DuplicateObj where code was otherwise duplicated. Made
special case of inserting one element at the end work again (where
index == len).
(Tcl_LreplaceObjCmd): moved Tcl_DuplicateObj call lower and
cleaned up use of other arguments.
* generic/tclObj.c (Tcl_DuplicateObj): simplified code to call
TclInitStringRep, which the code was just duplicating in part.
* doc/Utf.3:
* generic/tclStubInit.c:
* generic/tcl.decls:
* generic/tclDecls.h:
* generic/tclUtf.c: Added new functions Tcl_UniCharNcasecmp and
Tcl_UniCharCaseMatch (unicode parallel to Tcl_StringCaseMatch)
* generic/tclUtil.c: rewrote Tcl_StringCaseMatch algorithm for
optimization and made Tcl_StringMatch just call Tcl_StringCaseMatch
* tests/string.test: extended string match tests
2000-05-08 Eric Melski <ericm@scriptics.com>
* tests/set-old.test:
* doc/array.n:
* generic/tclVar.c: Added [array statistics] command [RFE: 4557]
2000-05-06 Andreas Kupries <a.kupries@westend.com>
operating as proxy for David Gravereaux <davygrvy@pobox.com>
* tclThreadJoin.c: Fixed several places with missing a & in
arguments to calls of Tcl_Mutex(Un)lock and
Tcl_ConditionNotify functions.
2000-05-02 Jeff Hobbs <hobbs@scriptics.com>
* README:
* generic/tcl.h:
* library/init.tcl:
* library/reg1.0/pkgIndex.tcl:
* library/tcltest1.0/tcltest.tcl:
* mac/README:
* tools/tcl.hpj.in:
* tools/tcl.wse.in:
* unix/README:
* unix/configure.in:
* unix/tcl.spec:
* win/README:
* win/README.binary:
* win/configure.in:
* win/makefile.vc:
* win/tcl.m4: updated patchlevel to 8.4a1
* tests/compile.test:
* tests/init.test:
* tests/proc.test:
* tests/proc-old.test:
* tests/rename.test:
* generic/tclProc.c: reworked error return for procedures with
incorrect args to be like the C Tcl_WrongNumArgs, where a "wrong #
args: ..." message is printed out with the args list.
* unix/Makefile.in: add tclsh.ico and tcl.spec to dist target
2000-05-02 Andreas Kupries <a.kupries@westend.com>
* Overall changes:
(1) Implementation of joinable threads for all platforms.
(2) Additional API's for channels. Required to allow the
thread extension to move channels between threads.
* generic/tcl.decls (lines 1360f): Added Tcl_JoinThread,
Tcl_IsChannelShared, Tcl_IsChannelRegistered, Tcl_CutChannel,
Tcl_SpliceChannel, Tcl_IsChannelExisting and
Tcl_ClearChannelHandlers (slots 394 to 400).
* generic/tclIO.c: Implemented Tcl_IsChannelRegistered,
Tcl_IsChannelShared, Tcl_CutChannel, Tcl_SpliceChannel,
Tcl_IsChannelExisting and Tcl_ClearChannelHandlers.
Tcl_CutChannel uses code from CloseChannel. Replaced this code
by a call to Tcl_CutChannel. Replaced several code fragments
adding channels to the channel list with calls to
Tcl_SpliceChannel. Removed now unused variables from
CloseChannel and Tcl_UnstackChannel. Tcl_ClearChannelHandlers
uses code from Tcl_Close. Replaced this code by a call to
Tcl_ClearChannelHandlers. Removed now unused variables from
Tcl_Close. Added the subcommands 'cut', 'forgetch', 'splice' and
'isshared' to the test code
(TclTestChannelCmd).
* unix/tclUnixThread.c: Implemented Tcl_JoinThread using the
pthread-functionality.
* win/tclWinThrd.c: Fixed several small typos in comments.
Implemented Tcl_JoinThread using a platform independent
emulation layer (see generic/tclThreadJoin.c below). Added
'joinLock' to serialize Tcl_CreateThread and TclpExitThread to
prevent a race for joinable threads.
* mac/tclMacThrd.c: Implemented Tcl_JoinThread using a platform
independent emulation layer (see generic/tclThreadJoin.c
below). Due to the cooperative nature of threading on this
platform the race mentioned above is not present.
* generic/tclThreadJoin.c: New file. Contains a platform
independent emulation layer helping in the implementation of
joinable threads for the win and mac platforms.
* generic/tclInt.h: Added declarations for TclJoinThread,
TclRememberJoinableThread and TclSignalExitThread. These
procedures define the API of the emulation layer for joinable
threads (see generic/tclThreadJoin.c above).
* win/Makefile.in:
* win/makefile.vc: Added generic/tclTheadJoin.o to the rules.
* mac/: I don't know to which file generic/tclTheadJoin.o has to
be added to so that it compiles. Sorry.
* unix/tclUnixChan.c: #ifdef'd the thread-local list of file
channels as it prevents us from transfering channels. To restore
this we may need an extended interface to drivers in the
future. Target: 9.0. Found while testing the new transfer of
channels. The information in this list for a channel was left
behind and then crashed the system during finalization.
* generic/tclThreadTest.c: Added -joinable flag to 'testthread
create'. Added subcommand 'testthread join'.
* doc/CrtChannel.3: Added documentation for Tcl_IsChannelRegistered,
Tcl_IsChannelShared, Tcl_CutChannel, Tcl_SpliceChannel,
Tcl_IsChannelExisting and Tcl_ClearChannelHandlers.
* doc/Thread.3: Added documentation for Tcl_JoinThread.
* tests/thread.test: Added tests for joining of threads.
2000-04-27 Eric Melski <ericm@scriptics.com>
* doc/library.n: Added entries for auto_qualify and auto_import
[Bug: 1271].
* doc/Init.3: Manual entry for Tcl_Init [Bug: 1820].
* doc/expr.n: Added documentation for each of the math library
functions that expr supports [Bug: 1054].
2000-04-26 Eric Melski <ericm@scriptics.com>
* doc/memory.n: Man page for Tcl "memory" command, which is
created when TCL_MEM_DEBUG is defined at compile time.
* doc/TCL_MEM_DEBUG.3: Man page with overall information about
TCL_MEM_DEBUG usage.
* doc/DumpActiveMemory.3: Man page for Tcl_DumpActiveMemory,
Tcl_InitMemory, and Tcl_ValidateAllMemory [Bug: 1816, 1835].
* generic/tclCkalloc.c: Fixed some function headers.
* unix/mkLinks: Regen'd with new mkLinks.tcl.
* unix/mkLinks.tcl: Fixed indentation, made link setup more
intelligent (only do one existance test per man page, instead of
one per function).
* doc/library.n: Fixed .SH NAME macro to include each function
documented on the page, so that mkLinks will know about the
functions listed there, and so that the Windows help file index
will get set up correctly [Bug: 1898, 5273].
2000-04-26 Jeff Hobbs <hobbs@scriptics.com>
8.3.1 RELEASE
* README:
* mac/README:
* tools/tcl.wse.in:
* unix/README:
* unix/tcl.spec:
* win/README:
* win/README.binary: Updating URLs to reference dev.scriptics.com
2000-04-25 Jeff Hobbs <hobbs@scriptics.com>
* unix/Makefile.in:
* win/Makefile.in:
* win/makefile.vc: updated for http change and some cleanup
* library/http2.[13]: moved dir http2.1 to http2.3 to match version
* doc/Utf.3: clarified docs for Tcl_(UniChar|Utf)AtIndex
* unix/tclUnixThrd.c: removed {}s around PTHREAD_MUTEX_INITIALIZER
[Bug: 5254]
* unix/tclLoadDyld.c (TclpLoadFile): removed use of interp->result
2000-04-25 Eric Melski <ericm@scriptics.com>
* unix/mkLinks:
* doc/AddErrInfo.3: Added information about Tcl_LogCommandInfo
[Bug: 1818].
2000-04-24 Eric Melski <ericm@scriptics.com>
* unix/mkLinks:
* doc/OpenFileChnl.3: Added man entry for Tcl_Ungets [Bug: 1834].
* unix/mkLinks:
* doc/SourceRCFile.3: Man page for Tcl_SourceRCFile [Bug: 1833].
* unix/mkLinks:
* doc/ParseCmd.3: Added documentation for Tcl_ParseVar [Bug: 1828].
2000-04-24 Jeff Hobbs <hobbs@scriptics.com>
* unix/tclUnixNotfy.c (Tcl_FinalizeNotifier, NotifierThreadProc):
added write of 'q' into triggerPipe for notifier in threaded case,
so that Tcl doesn't hang when children are still running [Bug: 4139]
* unix/tclUnixThrd.c (Tcl_MutexLock): minor comment fixes.
2000-04-23 Jim Ingham <jingham@cygnus.com>
These changes make some error handling marginally better for Mac
sockets. It is still somewhat flakey, however.
* mac/tclMacSock.c (TcpClose): Add timeouts to the close - these
don't seem to be honored, however.
Use a separate PB for the release, since an async connect socket
will still be using the original buffer.
Make sure TCPRelease returns noErr before freeing the recvBuff.
If the call returns an error, then the buffer is not right.
* mac/tclMacSock.c (CreateSocket): Add timeouts to the async
create. These don't seem to trigger, however. Sigh...
* mac/tclMacSock.c (WaitForSocketEvent): If an TCP_ASYNC_CONNECT
socket errors out, then return EWOULDBLOCK & error out.
* mac/tclMacSock.c (NotifyRoutine): Added a NotifyRoutine for
experimenting with MacTCP.
2000-04-22 Jim Ingham <jingham@cygnus.com>
* library/package.tcl (tclPkgUnknown): Fixed a typo in the Mac package
search part of tclPkgUnknown.
2000-04-21 Sandeep Tamhankar <sandeep@scriptics.com>
* library/http2.1/http.tcl: Fixed a newly introduced bug where if
there's a -command callback and something goes wrong, geturl threw
an exception, called the callback, and unset the token. I changed
it so that it will not call the callback when throwing an
exception (so the caller only finds out about a given error from
one place). Also, fixed http::ncode so that it actually gives you
back the http return code (i.e. 200, 404, etc.) instead of the
first digit of the version of HTTP being used (i.e. 1).
2000-04-21 Brent Welch <welch@scriptics.com>
* library/http2.1/http.tcl: More thrashing with the "server closes
without reading post data" scenario. Reverted to the previous
filevent configuratiuon, which seems to work better with small
amounts of post data.
2000-04-20 Jeff Hobbs <hobbs@scriptics.com>
* generic/tclAlloc.c: wrapped caddr_t define to not be done on Unix
* unix/tclUnixPort.h: added Tclp*Alloc defines to allow the use of
USE_TCLALLOC on Unix. [Bug: 4731]
2000-04-19 Jeff Hobbs <hobbs@scriptics.com>
* library/dde1.1/pkgIndex.tcl:
* library/reg1.0/pkgIndex.tcl:
* win/tclWinChan.c:
* win/tclWinThrd.c: converted CRLF to LF the */tcl.hpj.in files
were not converted, as it confuses hcw locally. [Bug: 5096]
* win/Makefile.in: expanded cleanup target for help files
* doc/Thread.3: minor macro cleanup
* generic/tclFileName.c (SplitUnixPath): added support for QNX
node ids.
2000-04-18 Jeff Hobbs <hobbs@scriptics.com>
* README:
* generic/tcl.h:
* tools/tcl.wse.in:
* unix/configure.in:
* unix/tcl.spec:
* win/configure.in:
* win/README.binary: bumped version to 8.3.1
* win/tcl.hpj.in: updated copyright date
* generic/tclEnv.c: environment support for Mac OS/X
* unix/tclUnixPort.h: environment support for Mac OS/X
* unix/tclLoadDyld.c: new file for Mac OS/X dl functions
* unix/Makefile.in: added install-strip target; bindir, libdir,
mandir, includedir vars; tclLoadDyld.c target [Bug: 2527]
* unix/tclUnixChan.c (CreateSocket): force a socket back into
blocking mode (default state) after a -async connect succeeds.
[Bug: 4388]
* generic/tclEvent.c (TclInitSubsystems): Moved tclLibraryPath to
thread-local storage to prevent thread-related race condition.
[Bug: 5033]
* unix/tclAppInit.c (main): removed #ifdef TCL_TEST that sets the
library path as it was unnecessary and conflicts with move of
tclLibraryPath to thread-local storage.
2000-04-18 Scott Redman <redman@scriptics.com>
* win/Makefile.in:
* win/tcl.rc:
* win/tclsh.rc:
* win/tclsh.ico: Modified copyright dates in Windows resource
files. Added an icon for tclsh.exe.
2000-04-17 Brent Welch <welch@scriptics.com>
* generic/tcl.h, generic/tclThreadTest.c, unix/tclUnixThrd.c,
win/tclWinThread.c, mac/tclMacThread.c:
Added Tcl_CreateThreadType and TCL_RETURN_THREAD_TYPE
macros for declaring the NewThread callback proc.
2000-04-14 Jeff Hobbs <hobbs@scriptics.com>
* unix/tclUnixChan.c (TtyParseMode): Only allow setting mark/space
parity on platforms that support it [Bug: 5089]
* generic/tclBasic.c (Tcl_GetVersion): adjusted use of major/minor
to not conflict with global decl on some systems [Bug: 2882]
* doc/AppInit.3:
* doc/Async.3:
* doc/BackgdErr.3:
* doc/CrtChannel.3:
* doc/CrtInterp.3:
* doc/CrtMathFnc.3:
* doc/DString.3:
* doc/Eval.3:
* doc/ExprLong.3:
* doc/GetInt.3:
* doc/GetOpnFl.3:
* doc/Interp.3:
* doc/LinkVar.3:
* doc/OpenFileChnl.3:
* doc/OpenTcp.3:
* doc/PkgRequire.3:
* doc/RecordEval.3:
* doc/SetResult.3:
* doc/SplitList.3:
* doc/StaticPkg.3:
* doc/TraceVar.3:
* doc/Translate.3:
* doc/UpVar.3:
* doc/load.n: removed or updated references to interp->result use.
2000-04-13 Jeff Hobbs <hobbs@scriptics.com>
* doc/regexp.n: doc clarification [Bug: 5037]
* doc/update.n: typo fix [Bug: 4996]
* unix/tcl.m4 (SC_ENABLE_THREADS): enhanced the detection of
pthread_mutex_init [Bug: 4359] and (SC_CONFIG_CFLAGS) added
--enable-64bit-vis switch for Sparc VIS compilation [Bug: 4995]
2000-04-12 Jeff Hobbs <hobbs@scriptics.com>
* doc/dde.n: corrected dde poke docs. [Bug: 4991]
2000-04-11 Eric Melski <ericm@scriptics.com>
* win/tclWinPipe.c: Added "CONST" keyword to declaration of char
*native in TclpCreateTempFile, to supress compiler warnings.
2000-04-10 Brent Welch <welch@scriptics.com>
* generic/tcl.h: Fixed Tcl_CreateThread declaration.
* library/tcltest1.0/tcltest.tcl: Fixed the "mainThread"
initialization to work with either testthread or the thread extension
* unix/tclUnixThrd.c: Fixed compiler warning when compiling
with -DTCL_THREADS
2000-04-10 Eric Melski <ericm@scriptics.com>
* win/tclWinPipe.c (TclpCreateTempFile): Added conversion of
contents string from UTF to native encoding [Bug: 4030].
* tests/regexp.test: Added tests for infinite looping in [regexp
-all].
* generic/tclCmdMZ.c: Fixed infinite loop bug with [regexp -all]
[Bug: 4981].
* tests/*.test: Changed all occurances of "namespace import
::tcltest" to "namespace import -force ::tcltest" [Bug: 3948].
2000-04-09 Brent Welch <welch@scriptics.com>
* lib/httpd2.1/http.tcl: Worked on the "server closes before
reading post data" case, which unfortunately causes different
error cases on Solaris, which can read the reply, and Linux
and Windows, which cannot read anything. This is all in the
loop-back case - client and server on the same host. Also
unified the error handling so the "ioerror" status goes away
and errors are reflected in a more uniform way. Updated the
man page to document the behavior.
2000-04-09 Jeff Hobbs <hobbs@scriptics.com>
* tests/reg.test (matchexpected): corrected tests to use tcltest
constraint types to skip certain tests.
* generic/tclBasic.c (Tcl_SetCommandInfo): comment fix
* unix/tclUnixThrd.c (Tcl_CreateThread): moved TCL_THREADS ifdef
inside of func as it is declared for non-threads builds as well.
In the non-threads case, it always returns TCL_ERROR (couldn't
create thread).
2000-04-08 Andreas Kupries <a.kupries@westend.com>
* Overall change: Definition of a public API for the creation of
new threads.
* generic/tclInt.h (line 1802f): Removed the definition of
'TclpThreadCreate'. (line 793f) Removed the definition of
'Tcl_ThreadCreateProc'.
* generic/tcl.h (line 388f): Readded the definition of
'Tcl_ThreadCreateProc'. Added Win32 stuff send in by David
Graveraux <davygrvy@bigfoot.com> to that too (__stdcall,
...). Added macros for the default stacksize and allowed flags.
* generic/tcl.decls (line 1356f): Added definition of
'Tcl_CreateThread', slot 393 of the stub table. Two new
arguments in the public API, for stacksize and flags.
* win/tclWinThrd.c:
* mac/tclMacThrd.c: Renamed TclpThreadCreate to Tcl_CreateThread,
added handling of the stacksize. Flags are currently ignored.
* unix/tclUnixThrd.c: See above, but handles joinable
flag. Ignores the specified stacksize if the macro
HAVE_PTHREAD_ATTR_SETSTACKSIZE is not defined.
* generic/tclThreadTest.c (line 363): See below.
* unix/tclUnixNotfy.c (line 210): Adapted to the changes
above. Uses default stacksize and no flags now.
* unic/tcl.m4 (line 382f): Added a check for
'pthread_attr_setstacksize' to detect platforms not implementing
this feature of pthreads. If it is implemented, configure will
define the macro HAVE_PTHREAD_ATTR_SETSTACKSIZE (See
unix/tclUnixThrd.c too).
* doc/Thread.3: Added Tcl_CreateThread and its arguments to the
list of described functions. Removed stuff about not providing a
public C-API for thread-creation.
2000-04-07 Jeff Hobbs <hobbs@scriptics.com>
* doc/binary.n: clarified docs on sign extension in binary scan
[Bug: 3466]
* library/tcltest1.0/tcltest.tcl (initConstraints): removed win32s
references (no longer supported)
* tests/fCmd.test: marked test 8.1 knownBug because it is
dangerous on poorly configured systems [Bug: 3881]
and added 8.2 to keep essence of 8.1 tested.
2000-04-05 Andreas Kupries <a.kupries@westend.com>
* generic/tclIO.c (Tcl_UnstackChannel, line 1831): Forcing
interest mask to the correct value after an unstack and
re-initialization of the notifier via the watchProc. Without this
the first fileevent after an unstack will come through and be
processed, but no more. [Bug: ??].
2000-03-04 Brent Welch <welch@scriptics.com>
* {win,unix}/Makefile.in: added dependency of tclStubInit.c on
tcl.decls and tclInt.decls
* generic/tclThread.c: Tweak so this compiles w/out TCL_THREADS
* generic/{tcl.decls,tclStubInit.c}: Just touched the tcl.decls and
regenerated the tclStubInit.c file
2000-03-29 Sandeep Tamhankar <sandeep@scriptics.com>
* library/http2.1/http.tcl: For the -querychannel option,
fconfigure the socket to be binary so that we don't translate
anything while reading the data. This is because we determine the
content length of the data on the channel by using seek (to the end
of the file) and tell on the file handle, and we need the
content-length to match the amount of data actually sent, and
translation can affect the number of bytes posted.
2000-04-03 Andreas Kupries <a.kupries@westend.com>
* Overall change: Definition of public API's for the finalization
of conditions and mutexes. [Bug: 4199].
* generic/tclInt.h: Removed definitions of TclFinalizeMutex and
TclFinalizeCondition.
* generic/tcl.decls: Added declarations of Tcl_MutexFinalize and
Tcl_ConditionFinalize.
* generic/tclThread.c: Renamed TclFinalizeMutex to
Tcl_MutexFinalize. Renamed TclFinalizeCondition to
Tcl_ConditionFinalize.
* generic/tclNotify.c: Changed usage of TclFinalizeMutex to
Tcl_MutexFinalize.
* unix/tclUnixNotfy.c:
* generic/tclThreadTest.c: Changed usages of TclFinalizeCondition to
Tcl_ConditionFinalize.
* generic/tcl.h: Added empty macros for Tcl_MutexFinalize and
Tcl_ConditionFinalize, to be used when the core is compiled
without threads.
* doc/Thread.3: Added description the new API's.
2000-04-03 Jeff Hobbs <hobbs@scriptics.com>
* generic/tclCmdIL.c (InfoVarsCmd): checked for non-NULL procPtr
to prevent itcl info override crash [Bug: 4064]
* tests/foreach.test:
* tests/namespace.test:
* tests/var.test: Added lsorts to avoid random sorted return
problems. [Bug: 2682]
* tests/fileName.test: fixed 14.1 test fragility [Bug: 1482]
* tools/man2help2.tcl: fixed winhelp cross-linking error [Bug: 4156]
improved translation to winhelp [Bug: 3679]
* unix/Makefile.in (MAN_INSTALL_DIR): patch to accept --mandir
correctly [Bug: 4085]
* unix/dltest/pkg[a-e].c: Cleaned up test packages [Bug: 2293]
2000-04-03 Eric Melski <ericm@scriptics.com>
* unix/tclUnixFCmd.c (SetGroupAttribute):
* unix/tclUnixFCmd.c (SetOwnerAttribute): Added (uid_t) and (gid_t)
casts to avoid compiler warnings.
2000-03-31 Eric Melski <ericm@scriptics.com>
* generic/tclGet.c (Tcl_GetDouble): Added additional conditions to
error test (previously only errno was checked, but the return
value of strtod() should be checked as well). [Bug: 4118].
* tests/exec.test: Added test for proper conversion of UTF data
when used with "<< $dataWithUTF" on exec's.
* unix/tclUnixPipe.c (TclpCreateTempFile): Added
Tcl_UtfToExternalDString call, so that if there is UTF content in
the string it will be properly converted to the system encoding
before being written [Bug: 4030].
(TclpCreateTempFile): Added a check on the return value of tmpnam;
some systems (Linux, for example) will start to return NULL after
tmpnam has been called TMP_MAX times; not checking for this can
have bad results (overwriting temp files, core dumps, etc.)
2000-03-30 Jeff Hobbs <hobbs@scriptics.com>
* generic/tclBasic.c (Tcl_DeleteCommandFromToken): Added comments
noting the need to pair ckalloc with ckfree. [Bug: 4262]
* generic/tclInt.decls:
* generic/tclIntPlatDecls.h:
* generic/tclStubInit.c:
* win/tclWin32Dll.c: removed TclWinSynchSpawn (vestige of Win32s
support).
* win/tclWinReg.c: made use of TclWinGetPlatformId instead of
getting info again
* win/tclWinPort.h:
* win/Makefile.in:
* win/configure.in:
* win/tcl.m4: Added support for gcc/mingw on Windows [Bug: 4234]
2000-03-29 Jeff Hobbs <hobbs@scriptics.com>
* generic/tclCompile.c (TclCleanupByteCode): made ByteCode cleanup
more aware of TCL_BYTECODE_PRECOMPILED flagged structs (gen'd by
tbcload), to correctly clean them up.
* generic/tclClock.c (FormatClock): moved check for empty format
earlier, commented 0 result return value
2000-03-29 Sandeep Tamhankar <sandeep@scriptics.com>
* library/http2.1/http.tcl: Removed an unnecessary fileevent
statement from the error processing part of the Write method.
Also, fixed two potential memory leaks in wait and reset, in which
the state array wasn't being unset before throwing an exception.
Prior to this version, Brent checked in a fix to catch a
fileevent statement that was sometimes causing a stack trace when
geturl was called with -timeout. I believe Brent's fix is
necessary because TLS closes bad sockets for secure connections,
and the fileevent was trying to act on a socket that no longer
existed.
2000-03-27 Jeff Hobbs <hobbs@scriptics.com>
* tests/httpd: removed unnecessary 'puts stderr "Post Dispatch"'
* tests/namespace.test:
* generic/tclNamesp.c (Tcl_Export): added a uniq'ing test to the
export list so only one instance of each export pattern would
exist in the list.
* generic/tclExecute.c (TclExecuteByteCode): optimized case for
the empty string in ==/!= comparisons
2000-03-27 Eric Melski <ericm@scriptics.com>
* unix/tclUnixChan.c: Added (off_t) type casts in lseek() call
[Bug: 4409].
* unix/tclLoadAout.c:
* unix/tclUnixPipe.c: Added (off_t) type casts in lseek() calls
[Bug: 4410].
2000-03-22 Sandeep Tamhankar <sandeep@scriptics.com>
* library/http2.1/http.tcl: Fixed a bug where string query data
that was bigger than queryblocksize would get duplicate characters
at block boundaries.
2000-03-22 Sandeep Tamhankar <sandeep@scriptics.com>
* library/http2.1/http.tcl: Fixed bug 4463, where we were getting
a stack trace if we tried to publish a project to a good host but
a port where there was no server listening. It turned out the
problem was a stray fileevent that needed to be cleared. Also,
fixed a bug where http::code could stack trace if called on a bad
token (one which didn't represent a successful geturl) by adding
an http element to the state array in geturl.
2000-03-21 Eric Melski <ericm@scriptics.com>
* tests/clock.test: Modified some tests that were not robust with
respect to the time zone in which they were run and were thus
failing.
* doc/clock.n: Clarified meaning of -gmt with respect to -base
when used with [clock scan] (-gmt does not affect the
interpretation of -base).
2000-03-19 Sandeep Tamhankar <sandeep@scriptics.com>
* library/http2.1/http.tcl: geturl used to throw an exception when
the connection failed; I accidentally returned a token with the
error info, breaking backwards compatibility. I changed it back
to throwing an exception, but unsetting the state array first
(thus still eliminating the original memory leak problem).
2000-03-19 Sandeep Tamhankar <sandeep@scriptics.com>
* library/http2.1/http.tcl: Added -querychannel option and altered
some of Brent's modifications to allow asynchronous posts (via
-command). Also modified -queryprogress so that it calls the
query callback as <callback> <token> <total size> <current size>
to be consistent with -progress. Added -queryblocksize option
with default 8192 bytes for post blocksize. Fixed a bunch of
potential memory leaks for the case when geturl receives bad args
or can't open a socket, etc. Overall, the package really rocks
now.
* doc/http.n: Added -queryblocksize, -querychannel, and
-queryprogress. Also, changed the description of -blocksize,
which states that the -progress callback will be called for each
block, to now qualify that with an "if -progress is specified".
* tests/http.test: Added a querychannel test for synchronous and
asynchronous posts, altered the queryprogress test such that the
callback conforms to the -progress format. Also, had to use the
-queryblocksize option to do the post 16K at a time to match
Brent's expected results (and to test that -queryblocksize works).
2000-03-15 Brent Welch <welch@scriptics.com>
* library/http2.1/http.tcl: Added -queryprogress callback to
http::geturl and also changed it so that writing the post data
is event driven if the queryprogress callback or a timeout is given.
This allows a timeout to occur when writing lots of post data.
The queryprogress callback is called after each block of query
data is posted. It has the same signature as the -progress callback.
2000-03-06 Eric Melski <ericm@scriptics.com>
* library/package.tcl: Applied patch from Bug: 2570; rather than
setting geometry of slave interp to 0x0 when Tk was loaded, it now
does "wm withdraw .". Both remove the main window from the
display, but the former caused some internal structures to get
initialized to zero, which caused crashes with some extensions.
2000-03-02 Jeff Hobbs <hobbs@scriptics.com>
* library/package.tcl (tclPkgUnknown): extended to allow
recognizes changes in the auto_path while sourcing in other
pkgIndex.tcl files
* doc/FindExec.3: fixed doc for declaration of Tcl_FindExecutable
[Bug: 4275]
* generic/tclFileName.c (Tcl_TranslateFileName): Applied patch
from Newman to significantly speedup file split/join on Windows
(replaces regexp with custom parser). [Bug: 2867]
* win/README.binary: change mailing lists from @consortium.org
to @scriptics.com [Bug: 4173]
2000-02-28 Eric Melski <ericm@scriptics.com>
* tests/clock.test: Added test for ISO bases < 100000
* generic/tclDate.c: (generated on Solaris)
* generic/tclGetDate.y: Changed condition for deciding if a number
is an ISO 8601 base from number >= 100000 to numberOfDigits >= 6.
Previously it would fail to recognize 000000 as an ISO base.
2000-02-14 Eric Melski <ericm@scriptics.com>
* unix/Makefile.in: Added rpm target to generate Tcl binary RPM.
* unix/tcl.spec: RPM specification file for a Tcl binary RPM for
Linux.
2000-02-10 Jeff Hobbs <hobbs@scriptics.com>
8.3.0 RELEASE
* changes: updated for 8.3.0 release
* doc/load.n: added notes about dll load errors on Windows
* unix/README:
* unix/Makefile.in (dist): removed porting.notes and porting.old
from distribution and CVS. The information was very outdated. Now
refer to http://dev.scriptics.com/services/support/platforms.html
* tests/unixInit.test: fixed japanese LANG encoding test [Bug: 3549]
* unix/configure.in:
* unix/tcl.m4: correct CFLAG_WARNING setting,
fixed gcc config for AIX,
added -export-dynamic to LDFLAGS for FreeBSD-3+ [Bug: 2998]
* win/tclWinLoad.c (TclpLoadFile): improved error message for load
failures, could perhaps be even more intelligent.
2000-02-09 Jim Ingham <jingham@cygnus.com>
* mac/tclMacSock.c: Don't panic when you get an error closing an async
socket. This doesn't seem to hurt anything, and we return the error so
the caller can do the right thing.
New Files:
* mac/MW_TclHeader.h:
* mac/MW_TclTestHeader.h:
* mac/MW_TclTestHeader.pch:
* mac/MW_TclAppleScriptHeader.h: More convenient to use .h prefix files
in the preference panels...
The above are curtesy of Daniel Steffen (steffen@math.mq.edu.au)
2000-02-08 Eric Melski <ericm@scriptics.com>
* tests/clock.test: Added tests for "next monthname" constructs.
* generic/tclDate.c:
* generic/tclGetDate.y (Message): Added a grammar rule for "next
monthname" so that we can handle "next january" and similar
constructs (bug #4146).
2000-02-08 Jeff Hobbs <hobbs@scriptics.com>
* README:
* tools/tcl.wse.in:
* unix/configure.in:
* win/configure.in:
* win/README:
* win/README.binary:
* generic/tcl.h (TCL_RELEASE_SERIAL): Moved to 8.3.0 patchlevel
* doc/library.n:
* library/auto.tcl: fixed crufty puts code and docs [Bug: 4122]
* library/tcltest1.0/tcltest.tcl: correctly protected searchDirectory
list to allow dirnames with spaces
* unix/tcl.m4: changed all -fpic to -fPIC
* generic/tclDecls.h:
* generic/tcl.decls: change Tcl_GetOpenFile to use decl of 'int
forWriting' instead of 'int write' to avoid shadowing [Bug: 4121]
* tests/httpold.test: changed test script to source in the httpd
server procs from httpd instead of having its own set.
* tests/httpd: improved query support in test httpd to handle fix
in http.tcl. [Bug: 4089 change 2000-02-01]
* unix/README: fixed notes about --enable-shared and add note
about --disable-shared.
2000-02-07 Eric Melski <ericm@scriptics.com>
* tests/package.test:
* library/tclIndex:
* library/package.tcl: Renamed ::package namespace to ::pkg.
2000-02-03 Eric Melski <ericm@scriptics.com>
* doc/Package.n:
* doc/packagens.n: Renamed Package.n -> packagens.n because Windows
can't deal with case-sensitive names.
2000-02-02 Jeff Hobbs <hobbs@scriptics.com>
* tests/regexp.test: added tests for -all and -inline switches
* doc/regexp.n: added docs for -all and -inline switches
* generic/tclCmdMZ.c (Tcl_RegexpObjCmd): added extra comments for
new -all and -inline switches to regexp command
2000-02-01 Eric Melski <ericm@scriptics.com>
* library/init.tcl: Applied patch from rfe 1734 regarding
auto_load errors not setting error message and errorInfo properly.
2000-02-01 Jeff Hobbs <hobbs@scriptics.com>
* win/Makefile.in (install-*): reduced verbosity of install
* generic/tclFileName.c (Tcl_JoinPath): improved support for special
QNX node id prefixes in pathnames [Bug: 4053]
* library/http1.0/http.tcl:
* library/http2.1/http.tcl: The query data POSTed was newline
terminated when it shouldn't be altered [Bug: 4089]
2000-01-31 Eric Melski <ericm@scriptics.com>
* tests/package.test:
* library/tclIndex:
* library/package.tcl: Added ::package namespace and
::package::create function.
* library/init.tcl: Fixed problem with auto_load and determining
if commands were loaded.
* library/auto.tcl: "Fixed" issues with $ in files to be auto indexed.
* doc/Package.n: New man page for package::create function.
* doc/pkgMkIndex.n: Added additional information.
* doc/library.n: Added additional qualification regarding auto_mkindex.
2000-01-28 Eric Melski <ericm@scriptics.com>
* tests/pkg/magicchar2.tcl:
* tests/autoMkindex.test: Test for auto loader fix (bug #2480).
* library/init.tcl: auto_load was using [info commands $name] to
determine if a given command was available; if the command name
had * or [] it, this would fail because info commands uses
glob-style matching. This is fixed. (Bug #2480).
* tests/pkg/spacename.tcl:
* tests/pkgMkIndex.test: Tests for fix for bug #2360.
* library/package.tcl: Fixed to extract only the first element of
the list returned by auto_qualify (bug #2360).
* tests/pkg/magicchar.tcl:
* tests/autoMkindex.test: Test for fix for bug #2611.
* library/auto.tcl: Fixed the regular expression that performs $
escaping before sourcing a file to index. It was erroneously
adding \ escapes even to $'s that were already escaped,
effectively "un-escaping" those $'s. (bug #2611).
2000-01-27 Eric Melski <ericm@scriptics.com>
* tests/autoMkindex.test:
* library/auto.tcl: Applied patch (with slight modification) from
bug #2701: auto_mkIndex uses platform dependent file paths.
Added test for fix.
2000-01-27 Jennifer Hom <jenn@scriptics.com>
* library/tcltest1.0/tcltest.tcl: Changed NormalizePath to
normalizePath and exported it as a public proc. This proc
creates an absolute path given the name of the variable containing
the path to modify. The path is modified in place.
* library/tcltest1.0/pkgIndex.tcl: Added normalizePath.
* tests/all.tcl: Changed code to use normalizePath.
2000-01-27 Eric Melski <ericm@scriptics.com>
* tests/pkg/samename.tcl: test file for bug #1983
* tests/pkgMkIndex.test:
* doc/pkgMkIndex.n:
* library/package.tcl: Per rfe #4097, optimized creation of direct
load packages to bypass computing the list of commands added by
the new package. Also made direct loading the default, and added
a -lazy option.
Fixed bug #1983, dealing with pkg_mkIndex incorrectly handling
situations with two procs by the same name but in different
namespaces (ie, foo::baz and bar::baz).
2000-01-26 Eric Melski <ericm@scriptics.com>
* generic/tclNamesp.c: Undid fix for #956, which broke backwards
compatibility.
* doc/variable.n:
* doc/trace.n:
* doc/namespace.n:
* doc/info.n: Added further information about differences between
"namespace which" and "info exists".
* doc/SetErrno.3: Added descriptions of ErrnoId() and ErrnoMsg()
functions.
2000-01-25 Jeff Hobbs <hobbs@scriptics.com>
* unix/tcl.m4: modified EXTRA_CFLAGS to add -DHAVE_TZSET for
OSF1-V* and ULTRIX-4.* when not using gcc. Also added higher min
stack size for OSF1-V* when building with threads. [Bug: 4063]
* generic/tclClock.c (FormatClock): inlined resultPtr, as it
conflicted with var creation for HAVE_TZSET #def [Bug: 4063]
* generic/tclCmdIL.c (Tcl_LsortObjCmd): fixed potential leak
when calling lsort -command with bad command [Bug: 4067]
* generic/tclFileName.c (Tcl_JoinPath): added support for special
QNX node id prefixes in pathnames [Bug: 4053]
* doc/ListObj.3: clarified Tcl_ListObjGetElements docs [Bug: 4080]
* doc/glob.n: clarified Mac path separator determination docs.
* win/makefile.vc: added some support for building helpfile on Windows
2000-01-23 Jeff Hobbs <hobbs@scriptics.com>
* library/init.tcl (auto_execok): added 'start' to list of
recognized built-in commands for COMSPEC on NT. [Bug: 2858]
* unix/tclUnixPort.h: moved include of <utime.h> lower since some
systems (UTS) require sys/types.h to be included first [Bug: 4031]
* unix/tclUnixChan.c (CreateSocketAddress): changed comparison
with -1 to 0xFFFFFFFF, to ensure 32 bit comparison even on 64 bit
systems. [Bug: 3878]
* generic/tclFileName.c: improved guessing of path separator
for the Mac. (Darley)
* generic/tclInt.h:
* generic/tcl.decls: moved Tcl_ProcObjCmd to stubs table [Bug: 3827]
and removed 'register' from stub definition of
Tcl_AppendUnicodeToObj [Bug: 4038]
2000-01-21 Eric Melski <ericm@scriptics.com>
* unix/mkLinks:
* doc/GetHostName.3: Man page for Tcl_GetHostName (bug #1817).
* doc/lreplace.n: Corrected man page with respect to treatment of
empty lists, and "prettied up" the page. (bug #1705).
2000-01-20 Eric Melski <ericm@scriptics.com>
* tests/namespace.test: Added test for undefined variables with
namespace which (bug #956).
* generic/tclNamesp.c: Added check for undefined variables in
NamespaceWhichCmd (bug #956).
* tests/var.test: Added tests for corrected variable behavior
(bug #981).
* doc/upvar.n: Expanded explanation of upvar behavior with respect to
variable traces. (bugs 3917 1433 2110).
* generic/tclVar.c: Changed behavior of variable command when name
refers to an element in an array (ie, "variable foo(x)") to always
return an error, regardless of existance of that element in the
array (now behavior is consistant with docs too) (bug #981).
2000-01-20 Jeff Hobbs <hobbs@scriptics.com>
* generic/tclCmdIL.c (InfoBodyCmd): made [info body] return a
string if the body has been bytecompiled.
* generic/tclBasic.c (Tcl_EvalObjEx): added pedantic check for
originating proc body of bytecompiled code, #def'd out as the
change for [info body] should make it unnecessary
* unix/tclUnixNotfy.c (Tcl_InitNotifier): added cast for tsdPtr
* tests/set.test: added test for complex array elem name compiling
* generic/tclCompCmds.c (TclCompileSetCmd): Fixed parsing of array
elements during compiling, and slightly optimised same [Bug: 3889]
* doc/tclvars.n: added definitions for tcl_(non)wordchars
* doc/vwait.n: added notes about requirement for vwait var being
globally scoped [Bug: 3329]
* library/word.tcl: changed tcl_(non)wordchars settings to use
new unicode regexp char class escapes instead of char sequences
2000-01-14 Eric Melski <ericm@scriptics.com>
* tests/var.test: Added a test for the array multiple delete
protection in Tcl_UnsetVar2.
* generic/tclVar.c: Added protection in Tcl_UnsetVar2 against
attempts to multiply delete arrays when unsetting them (bug
#3453). This could happen if there was an unset trace on an array
element and the trace proc made a global or upvar link to the
array, and then the array was unset at the global level. See the
bug reference for more information.
* unix/tclUnixTime.c: New clock format format.
* compat/strftime.c: New clock format format.
* generic/tclGetDate.y: New clock scan format.
2000-01-13 Jeff Hobbs <hobbs@scriptics.com>
* changes: updated changes file to reflect 8.3b2 mods
* README:
* generic/tcl.h:
* tools/tcl.wse.in:
* unix/configure.in:
* unix/tcl.m4:
* win/README.binary:
* win/configure.in: updated to patchlevel 8.3b2
* generic/regexec.c: added var initialization to prevent compiler
warning
2000-01-13 Eric Melski <ericm@scriptics.com>
* tests/cmdIL.test: Added tests for lsort -dictionary with
characters that occur between Z and a in ASCII.
* generic/tclCmdIL.c: Modified DictionaryCompare function (used by
lsort -dictionary) to do upper/lower case equivalency before doing
character comparisons, instead of after. This fixes bug #1357, in
which lsort -dictionary [list ` AA c CC] and lsort -dictionary
[list AA c ` CC] gave different (and both wrong) results.
2000-01-12 Eric Melski <ericm@scriptics.com>
* tests/clock.test: Added tests for "next <day-of-week>" and
"<day-of-week>"
Added tests for "monday 1 week ago", etc, from RFE #3671.
* doc/tests/clock.test: Added numerous tests for clock scan.
* doc/generic/tclGetDate.y: Fixed some shift/reduce conflicts in
clock grammar.
* doc/doc/clock.n: Added documentation for new supported clock
scan formats and additional explanation of daylight savings time
correction algorithm.
2000-01-12 Jeff Hobbs <hobbs@scriptics.com>
* doc/file.n:
* tests/unixFCmd.test:
* unix/tclUnixFCmd.c: added support for symbolic permissions
setting in SetPermissionsAttribute (file attr $file -perm ...)
[Bug: 3970]
* generic/tclClock.c: fixed support for 64bit handling of clock
values [Bug: 1806]
* generic/tclThreadTest.c: upped a buffer size to hold double
* tests/info.test:
* generic/tclCmdIL.c: fixed 'info procs ::namesp::*' behavior (Dejong)
* generic/tclNamesp.c: made imported commands also import their
compile proc [Bug: 2100]
* tests/expr.test:
* unix/Makefile.in:
* unix/configure.in:
* unix/tcl.m4: recognize strtod bug on Tru64 v5.0 [Bug: 3378]
and added tests to prevent unnecessary chmod +x in sources while
installing, as well as more intelligent setsockopt/gethostbyname
checks [Bug: 3366, 3389]
* unix/tclUnixThrd.c: added compile time support (through use of
the TCL_THREAD_STACK_MIN define) for increasing the default stack
size for a thread. [Bug: 3797, 1966]
2000-01-11 Eric Melski <ericm@scriptics.com>
* generic/tclGetDate.y: Added comments for the Convert function.
Added a fix for daylight savings time handling for relative time
spans of days, weeks or fortnights. (bug 3441, 3868).
* generic/tclDate.c: Fixed compiler warning issues.
2000-01-10 Jeff Hobbs <hobbs@scriptics.com>
* compat/waitpid.c: use pid_t type instead of int [Bug: 3999]
* tests/utf.test: fixed test that allowed \8 as octal value
* generic/tclUtf.c: changed Tcl_UtfBackslash to not allow
non-octal digits (8,9) in \ooo substs. [Bug: 3975]
* generic/tcl.h: noted need to change win/tcl.m4 and
tools/tclSplash.bmp for minor version changes
* library/http2.1/http.tcl: trim value for $state(meta) key
* unix/tclUnixFile.c: fixed signature style on functions
* unix/Makefile.in: made sure tcl.m4 would be installed with dist
* unix/tcl.m4: added ELF support for NetBSD [Bug: 3959]
2000-01-10 Eric Melski <ericm@scriptics.com>
* generic/tclGetDate.y: Added rules for ISO 8601 formats (BUG #847):
CCYY-MM-DD
CCYYMMDD
YY-MM-DD
YYMMDD
CCYYMMDDTHHMMSS
CCYYMMDD HHMMSS
CCYYMMDDTHH:MM:SS
Fixed "clock scan <number>" to scan the number as an hour for the
current day, rather than a minute after 00:00 for the current day
(bug #2732).
2000-01-07 Eric Melski <ericm@scriptics.com>
* generic/tclClock.c: Changed switch in Tcl_ClockObjCmd to use
enumerated values instead of constants. (ie, COMMAND_SCAN instead
of 3).
|
Changes to compat/strftime.c.
1 2 3 4 5 6 7 8 9 10 | /* * strftime.c -- * * This file contains a modified version of the BSD 4.4 strftime * function. * * This file is a modified version of the strftime.c file from the BSD 4.4 * source. See the copyright notice below for details on redistribution * restrictions. The "license.terms" file does not apply to this file. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | /* * strftime.c -- * * This file contains a modified version of the BSD 4.4 strftime * function. * * This file is a modified version of the strftime.c file from the BSD 4.4 * source. See the copyright notice below for details on redistribution * restrictions. The "license.terms" file does not apply to this file. * * RCS: @(#) $Id: strftime.c,v 1.7.18.1 2002/02/05 02:21:57 wolfsuit Exp $ */ /* * Copyright (c) 1989 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without |
| ︙ | ︙ | |||
41 42 43 44 45 46 47 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #if defined(LIBC_SCCS) | | | 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #if defined(LIBC_SCCS) static char *rcsid = "$Id: strftime.c,v 1.7.18.1 2002/02/05 02:21:57 wolfsuit Exp $"; #endif /* LIBC_SCCS */ #include <time.h> #include <string.h> #include <locale.h> #include "tclInt.h" #include "tclPort.h" |
| ︙ | ︙ | |||
320 321 322 323 324 325 326 | 2, '0')) return(0); continue; case 'Y': if (!_conv((t->tm_year + TM_YEAR_BASE), 4, '0')) return(0); continue; | < < | 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 |
2, '0'))
return(0);
continue;
case 'Y':
if (!_conv((t->tm_year + TM_YEAR_BASE), 4, '0'))
return(0);
continue;
case 'Z': {
char *name = TclpGetTZName(t->tm_isdst);
if (name && !_add(name)) {
return 0;
}
continue;
}
case '%':
/*
* X311J/88-090 (4.12.3.5): if conversion char is
* undefined, behavior is undefined. Print out the
* character itself as printf(3) does.
*/
default:
|
| ︙ | ︙ |
Changes to compat/strstr.c.
1 2 3 4 5 6 7 8 9 10 11 | /* * strstr.c -- * * Source code for the "strstr" library routine. * * Copyright (c) 1988-1993 The Regents of the University of California. * Copyright (c) 1994 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | /* * strstr.c -- * * Source code for the "strstr" library routine. * * Copyright (c) 1988-1993 The Regents of the University of California. * Copyright (c) 1994 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: strstr.c,v 1.2.34.1 2002/02/05 02:21:57 wolfsuit Exp $ */ /* *---------------------------------------------------------------------- * * strstr -- * |
| ︙ | ︙ | |||
60 61 62 63 64 65 66 |
}
if (*a++ != *b++) {
break;
}
}
b = substring;
}
| | | 60 61 62 63 64 65 66 67 68 |
}
if (*a++ != *b++) {
break;
}
}
b = substring;
}
return NULL;
}
|
Changes to compat/strtod.c.
1 2 3 4 5 6 7 8 9 10 11 | /* * strtod.c -- * * Source code for the "strtod" library procedure. * * Copyright (c) 1988-1993 The Regents of the University of California. * Copyright (c) 1994 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | /* * strtod.c -- * * Source code for the "strtod" library procedure. * * Copyright (c) 1988-1993 The Regents of the University of California. * Copyright (c) 1994 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: strtod.c,v 1.3.8.1 2002/02/05 02:21:57 wolfsuit Exp $ */ #include "tcl.h" #include "tclPort.h" #ifdef NO_STDLIB_H # include "../compat/stdlib.h" #else # include <stdlib.h> #endif #include <ctype.h> #include "tclPort.h" |
| ︙ | ︙ |
Changes to doc/Access.3.
1 | '\" | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | '\" '\" Copyright (c) 1998-1999 Scriptics Corporation '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: Access.3,v 1.4.8.1 2002/02/05 02:21:57 wolfsuit Exp $ '\" .so man.macros .TH Tcl_Access 3 8.1 Tcl "Tcl Library Procedures" .BS .SH NAME Tcl_Access, Tcl_Stat \- check file permissions and other attributes .SH SYNOPSIS |
| ︙ | ︙ | |||
68 69 70 71 72 73 74 | time. .PP If \fIpath\fR exists, \fBTcl_Stat\fR returns 0 and the stat structure is filled with data. Otherwise, -1 is returned, and no stat info is given. .SH KEYWORDS | | | 68 69 70 71 72 73 74 75 | time. .PP If \fIpath\fR exists, \fBTcl_Stat\fR returns 0 and the stat structure is filled with data. Otherwise, -1 is returned, and no stat info is given. .SH KEYWORDS stat, access |
Changes to doc/AddErrInfo.3.
1 2 3 4 5 6 7 | '\" '\" Copyright (c) 1989-1993 The Regents of the University of California. '\" Copyright (c) 1994-1997 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | | 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 34 35 36 | '\" '\" Copyright (c) 1989-1993 The Regents of the University of California. '\" Copyright (c) 1994-1997 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: AddErrInfo.3,v 1.5.14.1 2002/02/05 02:21:57 wolfsuit Exp $ '\" .so man.macros .TH Tcl_AddErrorInfo 3 8.0 Tcl "Tcl Library Procedures" .BS .SH NAME Tcl_AddObjErrorInfo, Tcl_AddErrorInfo, Tcl_SetObjErrorCode, Tcl_SetErrorCode, Tcl_SetErrorCodeVA, Tcl_PosixError, Tcl_LogCommandInfo \- record information about errors .SH SYNOPSIS .nf \fB#include <tcl.h>\fR .sp \fBTcl_AddObjErrorInfo\fR(\fIinterp, message, length\fR) .sp \fBTcl_AddErrorInfo\fR(\fIinterp, message\fR) .sp \fBTcl_SetObjErrorCode\fR(\fIinterp, errorObjPtr\fR) .sp \fBTcl_SetErrorCode\fR(\fIinterp, element, element, ... \fB(char *) NULL\fR) .sp \fBTcl_SetErrorCodeVA\fR(\fIinterp, argList\fR) .sp CONST char * \fBTcl_PosixError\fR(\fIinterp\fR) .sp void \fBTcl_LogCommandInfo\fR(\fIinterp, script, command, commandLength\fR) .SH ARGUMENTS .AS Tcl_Interp *message .AP Tcl_Interp *interp in |
| ︙ | ︙ | |||
51 52 53 54 55 56 57 | This variable \fBerrorCode\fR will be set to this value. .AP char *element in String to record as one element of \fBerrorCode\fR variable. Last \fIelement\fR argument must be NULL. .AP va_list argList in An argument list which must have been initialised using \fBTCL_VARARGS_START\fR, and cleared using \fBva_end\fR. | | | | 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | This variable \fBerrorCode\fR will be set to this value. .AP char *element in String to record as one element of \fBerrorCode\fR variable. Last \fIelement\fR argument must be NULL. .AP va_list argList in An argument list which must have been initialised using \fBTCL_VARARGS_START\fR, and cleared using \fBva_end\fR. .AP "CONST char" *script in Pointer to first character in script containing command (must be <= command) .AP "CONST char" *command in Pointer to first character in command that generated the error .AP int commandLength in Number of bytes in command; -1 means use all bytes up to first NULL byte .BE .SH DESCRIPTION .PP |
| ︙ | ︙ |
Changes to doc/ChnlStack.3.
1 2 3 4 5 6 | '\" '\" Copyright (c) 1999-2000 Ajuba Solutions. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | > > > | 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 34 35 36 37 | '\" '\" Copyright (c) 1999-2000 Ajuba Solutions. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: ChnlStack.3,v 1.3.14.1 2002/02/05 02:21:57 wolfsuit Exp $ .so man.macros .TH Tcl_StackChannel 3 8.3 Tcl "Tcl Library Procedures" .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME Tcl_StackChannel, Tcl_UnstackChannel, Tcl_GetStackedChannel, Tcl_GetTopChannel \- stack an I/O channel on top of another, and undo it .SH SYNOPSIS .nf .nf \fB#include <tcl.h>\fR .sp Tcl_Channel \fBTcl_StackChannel\fR(\fIinterp, typePtr, clientData, mask, channel\fR) .sp int \fBTcl_UnstackChannel\fR(\fIinterp, channel\fR) .sp Tcl_Channel \fBTcl_GetStackedChannel\fR(\fIchannel\fR) .sp Tcl_Channel \fBTcl_GetTopChannel\fR(\fIchannel\fR) .sp .SH ARGUMENTS .AS Tcl_ChannelType .AP Tcl_Interp *interp in Interpreter for error reporting - can be NULL. .AP Tcl_ChannelType *typePtr in The new channel I/O procedures to use for \fIchannel\fP. .AP ClientData clientData in |
| ︙ | ︙ | |||
78 79 80 81 82 83 84 85 86 87 88 89 90 | .PP \fBTcl_UnstackChannel\fP reverses the process. The old channel is associated with the channel name, and the processing module added by \fBTcl_StackChannel\fR is destroyed. If there is no old channel, then \fBTcl_UnstackChannel\fP is equivalent to \fBTcl_Close\fP. If an error occurs unstacking the channel, \fBTCL_ERROR\fR is returned, otherwise \fBTCL_OK\fR is returned. .SH "SEE ALSO" Notifier(3), Tcl_CreateChannel(3), Tcl_OpenFileChannel(3), vwait(n). .SH KEYWORDS channel, compression | > > > > > > | 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | .PP \fBTcl_UnstackChannel\fP reverses the process. The old channel is associated with the channel name, and the processing module added by \fBTcl_StackChannel\fR is destroyed. If there is no old channel, then \fBTcl_UnstackChannel\fP is equivalent to \fBTcl_Close\fP. If an error occurs unstacking the channel, \fBTCL_ERROR\fR is returned, otherwise \fBTCL_OK\fR is returned. .PP \fBTcl_GetTopChannel\fR returns the top channel in the stack of channels the supplied channel is part of. .PP \fBTcl_GetStackedChannel\fR returns the channel in the stack of channels which is just below the supplied channel. .SH "SEE ALSO" Notifier(3), Tcl_CreateChannel(3), Tcl_OpenFileChannel(3), vwait(n). .SH KEYWORDS channel, compression |
Changes to doc/Concat.3.
1 2 3 4 5 6 7 | '\" '\" Copyright (c) 1989-1993 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | | 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 | '\" '\" Copyright (c) 1989-1993 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: Concat.3,v 1.3.2.1 2002/02/05 02:21:57 wolfsuit Exp $ '\" .so man.macros .TH Tcl_Concat 3 7.5 Tcl "Tcl Library Procedures" .BS .SH NAME Tcl_Concat \- concatenate a collection of strings .SH SYNOPSIS .nf \fB#include <tcl.h>\fR .sp char * \fBTcl_Concat\fR(\fIargc, argv\fR) .SH ARGUMENTS .AP int argc in Number of strings. .AP "CONST char * CONST" argv[] in Array of strings to concatenate. Must have \fIargc\fR entries. .BE .SH DESCRIPTION .PP \fBTcl_Concat\fR is a utility procedure used by several of the Tcl commands. Given a collection of strings, it concatenates |
| ︙ | ︙ |
Changes to doc/CrtChannel.3.
1 2 3 4 5 6 7 | '\" '\" Copyright (c) 1996-1997 Sun Microsystems, Inc. '\" Copyright (c) 1997-2000 Ajuba Solutions. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | | | 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 34 35 | '\" '\" Copyright (c) 1996-1997 Sun Microsystems, Inc. '\" Copyright (c) 1997-2000 Ajuba Solutions. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: CrtChannel.3,v 1.11.4.1 2002/02/05 02:21:57 wolfsuit Exp $ .so man.macros .TH Tcl_CreateChannel 3 8.3 Tcl "Tcl Library Procedures" .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME Tcl_CreateChannel, Tcl_GetChannelInstanceData, Tcl_GetChannelType, Tcl_GetChannelName, Tcl_GetChannelHandle, Tcl_GetChannelMode, Tcl_GetChannelBufferSize, Tcl_SetChannelBufferSize, Tcl_NotifyChannel, Tcl_BadChannelOption, Tcl_ChannelName, Tcl_ChannelVersion, Tcl_ChannelBlockModeProc, Tcl_ChannelCloseProc, Tcl_ChannelClose2Proc, Tcl_ChannelInputProc, Tcl_ChannelOutputProc, Tcl_ChannelSeekProc, Tcl_ChannelSetOptionProc, Tcl_ChannelGetOptionProc, Tcl_ChannelWatchProc, Tcl_ChannelGetHandleProc, Tcl_ChannelFlushProc, Tcl_ChannelHandlerProc, Tcl_IsChannelShared, Tcl_IsChannelRegistered, Tcl_CutChannel, Tcl_SpliceChannel, Tcl_IsChannelExisting, Tcl_ClearChannelHandlers, Tcl_GetChannelThread, Tcl_ChannelBuffered \- procedures for creating and manipulating channels .SH SYNOPSIS .nf \fB#include <tcl.h>\fR .sp Tcl_Channel \fBTcl_CreateChannel\fR(\fItypePtr, channelName, instanceData, mask\fR) .sp ClientData \fBTcl_GetChannelInstanceData\fR(\fIchannel\fR) .sp Tcl_ChannelType * \fBTcl_GetChannelType\fR(\fIchannel\fR) .sp CONST char * \fBTcl_GetChannelName\fR(\fIchannel\fR) .sp int \fBTcl_GetChannelHandle\fR(\fIchannel, direction, handlePtr\fR) .sp .VS 8.4 Tcl_ThreadId |
| ︙ | ︙ | |||
66 67 68 69 70 71 72 | \fBTcl_ClearChannelHandlers\fR(\fIchannel\fR) .VE .VS 8.3.2 .sp int \fBTcl_ChannelBuffered\fR(\fIchannel\fR) .sp | < < < | | 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | \fBTcl_ClearChannelHandlers\fR(\fIchannel\fR) .VE .VS 8.3.2 .sp int \fBTcl_ChannelBuffered\fR(\fIchannel\fR) .sp CONST char * \fBTcl_ChannelName\fR(\fItypePtr\fR) .sp Tcl_ChannelTypeVersion \fBTcl_ChannelVersion\fR(\fItypePtr\fR) .sp Tcl_DriverBlockModeProc * \fBTcl_ChannelBlockModeProc\fR(\fItypePtr\fR) |
| ︙ | ︙ | |||
113 114 115 116 117 118 119 | \fBTcl_ChannelFlushProc\fR(\fItypePtr\fR) .sp Tcl_DriverHandlerProc * \fBTcl_ChannelHandlerProc\fR(\fItypePtr\fR) .VE .sp .SH ARGUMENTS | | | < < < | | | 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 | \fBTcl_ChannelFlushProc\fR(\fItypePtr\fR) .sp Tcl_DriverHandlerProc * \fBTcl_ChannelHandlerProc\fR(\fItypePtr\fR) .VE .sp .SH ARGUMENTS .AS Tcl_ChannelType *channelName in .AP Tcl_ChannelType *typePtr in Points to a structure containing the addresses of procedures that can be called to perform I/O and other functions on the channel. .AP "CONST char" *channelName in The name of this channel, such as \fBfile3\fR; must not be in use by any other channel. Can be NULL, in which case the channel is created without a name. .AP ClientData instanceData in Arbitrary one-word value to be associated with this channel. This value is passed to procedures in \fItypePtr\fR when they are invoked. .AP int mask in OR-ed combination of \fBTCL_READABLE\fR and \fBTCL_WRITABLE\fR to indicate whether a channel is readable and writable. .AP Tcl_Channel channel in The channel to operate on. .AP int direction in \fBTCL_READABLE\fR means the input handle is wanted; \fBTCL_WRITABLE\fR means the output handle is wanted. .AP ClientData *handlePtr out Points to the location where the desired OS-specific handle should be stored. .AP int size in The size, in bytes, of buffers to allocate in this channel. .AP int mask in An OR-ed combination of \fBTCL_READABLE\fR, \fBTCL_WRITABLE\fR and \fBTCL_EXCEPTION\fR that indicates events that have occurred on this channel. .AP Tcl_Interp *interp in Current interpreter. (can be NULL) .AP "CONST char" *optionName in Name of the invalid option. .AP "CONST char" *optionList in Specific options list (space separated words, without "-") to append to the standard generic options list. Can be NULL for generic options error message only. .BE .SH DESCRIPTION |
| ︙ | ︙ | |||
207 208 209 210 211 212 213 | \fBTcl_ChannelType\fR structure, see the section TCL_CHANNELTYPE, below. .PP \fBTcl_CreateChannel\fR interacts with the code managing the standard channels. Once a standard channel was initialized either through a call to \fBTcl_GetStdChannel\fR or a call to \fBTcl_SetStdChannel\fR closing this standard channel will cause the next call to \fBTcl_CreateChannel\fR to make the new channel the new standard | | | 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 | \fBTcl_ChannelType\fR structure, see the section TCL_CHANNELTYPE, below. .PP \fBTcl_CreateChannel\fR interacts with the code managing the standard channels. Once a standard channel was initialized either through a call to \fBTcl_GetStdChannel\fR or a call to \fBTcl_SetStdChannel\fR closing this standard channel will cause the next call to \fBTcl_CreateChannel\fR to make the new channel the new standard channel too. See \fBTcl_StandardChannels\fR for a general treatise about standard channels and the behaviour of the Tcl library with regard to them. .PP \fBTcl_GetChannelInstanceData\fR returns the instance data associated with the channel in \fIchannel\fR. This is the same as the \fIinstanceData\fR argument in the call to \fBTcl_CreateChannel\fR that created this channel. .PP |
| ︙ | ︙ | |||
243 244 245 246 247 248 249 | .VE .PP \fBTcl_GetChannelMode\fR returns an OR-ed combination of \fBTCL_READABLE\fR and \fBTCL_WRITABLE\fR, indicating whether the channel is open for input and output. .PP \fBTcl_GetChannelBufferSize\fR returns the size, in bytes, of buffers | | | 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 | .VE .PP \fBTcl_GetChannelMode\fR returns an OR-ed combination of \fBTCL_READABLE\fR and \fBTCL_WRITABLE\fR, indicating whether the channel is open for input and output. .PP \fBTcl_GetChannelBufferSize\fR returns the size, in bytes, of buffers allocated to store input or output in \fIchannel\fR. If the value was not set by a previous call to \fBTcl_SetChannelBufferSize\fR, described below, then the default value of 4096 is returned. .PP \fBTcl_SetChannelBufferSize\fR sets the size, in bytes, of buffers that will be allocated in subsequent operations on the channel to store input or output. The \fIsize\fR argument should be between ten and one million, allowing buffers of ten bytes to one million bytes. If \fIsize\fR is |
| ︙ | ︙ | |||
265 266 267 268 269 270 271 | channel. See \fBWATCHPROC\fR below for more details. .PP \fBTcl_BadChannelOption\fR is called from driver specific set or get option procs to generate a complete error message. .VE .PP .VS 8.3.2 | < < < | 259 260 261 262 263 264 265 266 267 268 269 270 271 272 | channel. See \fBWATCHPROC\fR below for more details. .PP \fBTcl_BadChannelOption\fR is called from driver specific set or get option procs to generate a complete error message. .VE .PP .VS 8.3.2 \fBTcl_ChannelBuffered\fR returns the number of bytes of input currently buffered in the internal buffer (push back area) of the channel itself. It does not report about the data in the overall buffers for the stack of channels the supplied channel is part of. .VE .PP .VS 8.4 |
| ︙ | ︙ | |||
297 298 299 300 301 302 303 | is not allowed. .PP \fBTcl_SpliceChannel\fR adds the specified \fIchannel\fR to the (thread)global list of all channels (of the current thread). Application to a channel registered in some interpreter is not allowed. .PP \fBTcl_ClearChannelHandlers\fR removes all channelhandlers and event | | | 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 | is not allowed. .PP \fBTcl_SpliceChannel\fR adds the specified \fIchannel\fR to the (thread)global list of all channels (of the current thread). Application to a channel registered in some interpreter is not allowed. .PP \fBTcl_ClearChannelHandlers\fR removes all channelhandlers and event scripts associated with the specified \fIchannel\fR, thus shutting down all event processing for this channel. .VE .SH TCL_CHANNELTYPE .PP A channel driver provides a \fBTcl_ChannelType\fR structure that contains pointers to functions that implement the various operations on a channel; |
| ︙ | ︙ | |||
524 525 526 527 528 529 530 | The \fIoutputProc\fR field contains the address of a function called by the generic layer to transfer data from an internal buffer to the output device. \fIOutputProc\fR must match the following prototype: .PP .CS typedef int Tcl_DriverOutputProc( ClientData \fIinstanceData\fR, | | | 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 | The \fIoutputProc\fR field contains the address of a function called by the generic layer to transfer data from an internal buffer to the output device. \fIOutputProc\fR must match the following prototype: .PP .CS typedef int Tcl_DriverOutputProc( ClientData \fIinstanceData\fR, CONST char *\fIbuf\fR, int \fItoWrite\fR, int *\fIerrorCodePtr\fR); .CE .PP \fIInstanceData\fR is the same as the value passed to \fBTcl_CreateChannel\fR when the channel was created. The \fIbuf\fR argument contains an array of bytes to be written to the device, and the |
| ︙ | ︙ | |||
600 601 602 603 604 605 606 | the generic layer to set a channel type specific option on a channel. \fIsetOptionProc\fR must match the following prototype: .PP .CS typedef int Tcl_DriverSetOptionProc( ClientData \fIinstanceData\fR, Tcl_Interp *\fIinterp\fR, | | | | | | 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 | the generic layer to set a channel type specific option on a channel. \fIsetOptionProc\fR must match the following prototype: .PP .CS typedef int Tcl_DriverSetOptionProc( ClientData \fIinstanceData\fR, Tcl_Interp *\fIinterp\fR, CONST char *\fIoptionName\fR, CONST char *\fInewValue\fR); .CE .PP \fIoptionName\fR is the name of an option to set, and \fInewValue\fR is the new value for that option, as a string. The \fIinstanceData\fR is the same as the value given to \fBTcl_CreateChannel\fR when this channel was created. The function should do whatever channel type specific action is required to implement the new value of the option. .PP Some options are handled by the generic code and this function is never called to set them, e.g. \fB-blockmode\fR. Other options are specific to each channel type and the \fIsetOptionProc\fR procedure of the channel driver will get called to implement them. The \fIsetOptionProc\fR field can be NULL, which indicates that this channel type supports no type specific options. .PP If the option value is successfully modified to the new value, the function returns \fBTCL_OK\fR. It should call \fBTcl_BadChannelOption\fR which itself returns \fBTCL_ERROR\fR if the \fIoptionName\fR is unrecognized. If \fInewValue\fR specifies a value for the option that is not supported or if a system call error occurs, the function should leave an error message in the \fIresult\fR field of \fIinterp\fR if \fIinterp\fR is not NULL. The function should also call \fBTcl_SetErrno\fR to store an appropriate POSIX error code. .PP .VS 8.3.2 |
| ︙ | ︙ | |||
644 645 646 647 648 649 650 | the generic layer to get the value of a channel type specific option on a channel. \fIgetOptionProc\fR must match the following prototype: .PP .CS typedef int Tcl_DriverGetOptionProc( ClientData \fIinstanceData\fR, Tcl_Interp *\fIinterp\fR, | | | | | | | 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 | the generic layer to get the value of a channel type specific option on a channel. \fIgetOptionProc\fR must match the following prototype: .PP .CS typedef int Tcl_DriverGetOptionProc( ClientData \fIinstanceData\fR, Tcl_Interp *\fIinterp\fR, CONST char *\fIoptionName\fR, Tcl_DString *\fIoptionValue\fR); .CE .PP \fIOptionName\fR is the name of an option supported by this type of channel. If the option name is not NULL, the function stores its current value, as a string, in the Tcl dynamic string \fIoptionValue\fR. If \fIoptionName\fR is NULL, the function stores in \fIoptionValue\fR an alternating list of all supported options and their current values. On success, the function returns \fBTCL_OK\fR. It should call \fBTcl_BadChannelOption\fR which itself returns \fBTCL_ERROR\fR if the \fIoptionName\fR is unrecognized. If a system call error occurs, the function should leave an error message in the result of \fIinterp\fR if \fIinterp\fR is not NULL. The function should also call \fBTcl_SetErrno\fR to store an appropriate POSIX error code. .PP Some options are handled by the generic code and this function is never called to retrieve their value, e.g. \fB-blockmode\fR. Other options are specific to each channel type and the \fIgetOptionProc\fR procedure of the channel driver will get called to implement them. The \fIgetOptionProc\fR |
| ︙ | ︙ | |||
789 790 791 792 793 794 795 | (optional) interpreter. It is used by channel drivers when a invalid Set/Get option is requested. Its purpose is to concatenate the generic options list to the specific ones and factorize the generic options error message string. .PP It always return \fBTCL_ERROR\fR .PP | | | | | 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 |
(optional) interpreter. It is used by channel drivers when
a invalid Set/Get option is requested. Its purpose is to concatenate
the generic options list to the specific ones and factorize
the generic options error message string.
.PP
It always return \fBTCL_ERROR\fR
.PP
An error message is generated in \fIinterp\fR's result object to
indicate that a command was invoked with the a bad option
The message has the form
.CS
bad option "blah": should be one of
<...generic options...>+<...specific options...>
so you get for instance:
bad option "-blah": should be one of -blocking,
-buffering, -buffersize, -eofchar, -translation,
-peername, or -sockname
when called with \fIoptionList\fR="peername sockname"
.CE
``blah'' is the \fIoptionName\fR argument and ``<specific options>''
is a space separated list of specific option words.
The function takes good care of inserting minus signs before
each option, commas after, and an ``or'' before the last option.
.SH OLD_CHANNEL
The original (8.3.1 and below) \fBTcl_ChannelType\fR structure contains
|
| ︙ | ︙ |
Changes to doc/CrtInterp.3.
1 2 3 4 5 6 7 | '\" '\" Copyright (c) 1989-1993 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | '\" '\" Copyright (c) 1989-1993 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: CrtInterp.3,v 1.5.18.1 2002/02/05 02:21:57 wolfsuit Exp $ '\" .so man.macros .TH Tcl_CreateInterp 3 7.5 Tcl "Tcl Library Procedures" .BS .SH NAME Tcl_CreateInterp, Tcl_DeleteInterp, Tcl_InterpDeleted \- create and delete Tcl command interpreters .SH SYNOPSIS |
| ︙ | ︙ | |||
34 35 36 37 38 39 40 | \fBTcl_CreateInterp\fR creates a new interpreter structure and returns a token for it. The token is required in calls to most other Tcl procedures, such as \fBTcl_CreateCommand\fR, \fBTcl_Eval\fR, and \fBTcl_DeleteInterp\fR. Clients are only allowed to access a few of the fields of Tcl_Interp structures; see the \fBTcl_Interp\fR and \fBTcl_CreateCommand\fR man pages for details. | | | | | 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | \fBTcl_CreateInterp\fR creates a new interpreter structure and returns a token for it. The token is required in calls to most other Tcl procedures, such as \fBTcl_CreateCommand\fR, \fBTcl_Eval\fR, and \fBTcl_DeleteInterp\fR. Clients are only allowed to access a few of the fields of Tcl_Interp structures; see the \fBTcl_Interp\fR and \fBTcl_CreateCommand\fR man pages for details. The new interpreter is initialized with the built-in Tcl commands and with the variables documented in tclvars(n). To bind in additional commands, call \fBTcl_CreateCommand\fR. .PP \fBTcl_DeleteInterp\fR marks an interpreter as deleted; the interpreter will eventually be deleted when all calls to \fBTcl_Preserve\fR for it have been matched by calls to \fBTcl_Release\fR. At that time, all of the resources associated with it, including variables, procedures, and application-specific command bindings, will be deleted. After \fBTcl_DeleteInterp\fR returns any attempt to use \fBTcl_Eval\fR on the |
| ︙ | ︙ |
Changes to doc/CrtSlave.3.
1 2 3 4 5 6 | '\" '\" Copyright (c) 1995-1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | '\" '\" Copyright (c) 1995-1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: CrtSlave.3,v 1.5.12.1 2002/02/05 02:21:57 wolfsuit Exp $ '\" .so man.macros .TH Tcl_CreateSlave 3 7.6 Tcl "Tcl Library Procedures" .BS .SH NAME Tcl_IsSafe, Tcl_MakeSafe, Tcl_CreateSlave, Tcl_GetSlave, Tcl_GetMaster, Tcl_GetInterpPath, Tcl_CreateAlias, Tcl_CreateAliasObj, Tcl_GetAlias, Tcl_GetAliasObj, Tcl_ExposeCommand, Tcl_HideCommand \- manage multiple Tcl interpreters, aliases and hidden commands. .SH SYNOPSIS |
| ︙ | ︙ | |||
31 32 33 34 35 36 37 | \fBTcl_GetMaster\fR(\fIinterp\fR) .sp int \fBTcl_GetInterpPath\fR(\fIaskingInterp, slaveInterp\fR) .sp .VS int | | | | | | | | | | | 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | \fBTcl_GetMaster\fR(\fIinterp\fR) .sp int \fBTcl_GetInterpPath\fR(\fIaskingInterp, slaveInterp\fR) .sp .VS int \fBTcl_CreateAlias\fR(\fIslaveInterp, slaveCmd, targetInterp, targetCmd, argc, argv\fR) .sp int \fBTcl_CreateAliasObj\fR(\fIslaveInterp, slaveCmd, targetInterp, targetCmd, objc, objv\fR) .VE .sp int \fBTcl_GetAlias\fR(\fIinterp, slaveCmd, targetInterpPtr, targetCmdPtr, argcPtr, argvPtr\fR) .sp .VS int \fBTcl_GetAliasObj\fR(\fIinterp, slaveCmd, targetInterpPtr, targetCmdPtr, objcPtr, objvPtr\fR) .sp int \fBTcl_ExposeCommand\fR(\fIinterp, hiddenCmdName, cmdName\fR) .sp int \fBTcl_HideCommand\fR(\fIinterp, cmdName, hiddenCmdName\fR) .SH ARGUMENTS .AS Tcl_InterpDeleteProc **hiddenCmdName .AP Tcl_Interp *interp in Interpreter in which to execute the specified command. .AP "CONST char" *slaveName in Name of slave interpreter to create or manipulate. .AP int isSafe in If non-zero, a ``safe'' slave that is suitable for running untrusted code is created, otherwise a trusted slave is created. .AP Tcl_Interp *slaveInterp in Interpreter to use for creating the source command for an alias (see below). .AP "CONST char" *slaveCmd in Name of source command for alias. .AP Tcl_Interp *targetInterp in Interpreter that contains the target command for an alias. .AP "CONST char" *targetCmd in Name of target command for alias in \fItargetInterp\fR. .AP int argc in Count of additional arguments to pass to the alias command. .AP "char * CONST" *argv in Vector of strings, the additional arguments to pass to the alias command. This storage is owned by the caller. .AP int objc in Count of additional object arguments to pass to the alias object command. .AP Tcl_Object **objv in Vector of Tcl_Obj structures, the additional object argumenst to pass to the alias object command. This storage is owned by the caller. .AP Tcl_Interp **targetInterpPtr in Pointer to location to store the address of the interpreter where a target command is defined for an alias. .AP "CONST char" **targetCmdPtr out Pointer to location to store the address of the name of the target command for an alias. .AP int *argcPtr out Pointer to location to store count of additional arguments to be passed to the alias. The location is in storage owned by the caller. .AP char ***argvPtr out Pointer to location to store a vector of strings, the additional arguments |
| ︙ | ︙ | |||
157 158 159 160 161 162 163 | to the relative path between \fIaskingInterp\fR and \fIslaveInterp\fR; \fIslaveInterp\fR must be a slave of \fIaskingInterp\fR. If the computation of the relative path succeeds, \fBTCL_OK\fR is returned, else \fBTCL_ERROR\fR is returned and the \fIresult\fR field in \fIaskingInterp\fR contains the error message. .PP .VS | | | | 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 | to the relative path between \fIaskingInterp\fR and \fIslaveInterp\fR; \fIslaveInterp\fR must be a slave of \fIaskingInterp\fR. If the computation of the relative path succeeds, \fBTCL_OK\fR is returned, else \fBTCL_ERROR\fR is returned and the \fIresult\fR field in \fIaskingInterp\fR contains the error message. .PP .VS \fBTcl_CreateAlias\fR creates an object command named \fIslaveCmd\fR in \fIslaveInterp\fR that when invoked, will cause the command \fItargetCmd\fR to be invoked in \fItargetInterp\fR. The arguments specified by the strings contained in \fIargv\fR are always prepended to any arguments supplied in the invocation of \fIslaveCmd\fR and passed to \fItargetCmd\fR. This operation returns \fBTCL_OK\fR if it succeeds, or \fBTCL_ERROR\fR if it fails; in that case, an error message is left in the object result of \fIslaveInterp\fR. Note that there are no restrictions on the ancestry relationship (as created by \fBTcl_CreateSlave\fR) between \fIslaveInterp\fR and \fItargetInterp\fR. Any two interpreters can be used, without any restrictions on how they are related. |
| ︙ | ︙ |
Changes to doc/DString.3.
1 2 3 4 5 6 7 | '\" '\" Copyright (c) 1993 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | '\" '\" Copyright (c) 1993 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: DString.3,v 1.6.2.1 2002/02/05 02:21:57 wolfsuit Exp $ '\" .so man.macros .TH Tcl_DString 3 7.4 Tcl "Tcl Library Procedures" .BS .SH NAME Tcl_DStringInit, Tcl_DStringAppend, Tcl_DStringAppendElement, Tcl_DStringStartSublist, Tcl_DStringEndSublist, Tcl_DStringLength, Tcl_DStringValue, Tcl_DStringSetLength, Tcl_DStringTrunc, Tcl_DStringFree, Tcl_DStringResult, Tcl_DStringGetResult \- manipulate dynamic strings .SH SYNOPSIS .nf \fB#include <tcl.h>\fR .sp \fBTcl_DStringInit\fR(\fIdsPtr\fR) .sp CONST char * |
| ︙ | ︙ | |||
43 44 45 46 47 48 49 | \fBTcl_DStringResult\fR(\fIinterp, dsPtr\fR) .sp \fBTcl_DStringGetResult\fR(\fIinterp, dsPtr\fR) .SH ARGUMENTS .AS Tcl_DString newLength .AP Tcl_DString *dsPtr in/out Pointer to structure that is used to manage a dynamic string. | | | 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | \fBTcl_DStringResult\fR(\fIinterp, dsPtr\fR) .sp \fBTcl_DStringGetResult\fR(\fIinterp, dsPtr\fR) .SH ARGUMENTS .AS Tcl_DString newLength .AP Tcl_DString *dsPtr in/out Pointer to structure that is used to manage a dynamic string. .AP "CONST char" *string in Pointer to characters to add to dynamic string. .AP int length in Number of characters from string to add to dynamic string. If -1, add all characters up to null terminating character. .AP int newLength in New length for dynamic string, not including null terminating character. |
| ︙ | ︙ |
Changes to doc/DumpActiveMemory.3.
1 2 3 4 5 | '\" '\" Copyright (c) 1992-1999 Karl Lehenbauer and Mark Diekhans. '\" Copyright (c) 2000 by Scriptics Corporation. '\" All rights reserved. '\" | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | '\" '\" Copyright (c) 1992-1999 Karl Lehenbauer and Mark Diekhans. '\" Copyright (c) 2000 by Scriptics Corporation. '\" All rights reserved. '\" '\" RCS: @(#) $Id: DumpActiveMemory.3,v 1.4.12.1 2002/02/05 02:21:57 wolfsuit Exp $ '\" .so man.macros .TH "Tcl_DumpActiveMemory" 3 8.1 Tcl "Tcl Library Procedures" .BS .SH NAME Tcl_DumpActiveMemory, Tcl_InitMemory, Tcl_ValidateAllMemory \- Validated memory allocation interface. .SH SYNOPSIS |
| ︙ | ︙ | |||
33 34 35 36 37 38 39 | .AP int line in Line number at which the call to \fBTcl_ValidateAllMemory\fR is made (normally \fB__LINE__\fR). .BE .SH DESCRIPTION These functions provide access to Tcl memory debugging information. | | | > | | | 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | .AP int line in Line number at which the call to \fBTcl_ValidateAllMemory\fR is made (normally \fB__LINE__\fR). .BE .SH DESCRIPTION These functions provide access to Tcl memory debugging information. They are only functional when Tcl has been compiled with \fBTCL_MEM_DEBUG\fR defined at compile-time. When \fBTCL_MEM_DEBUG\fR is not defined, these functions are all no-ops. .PP \fBTcl_DumpActiveMemory\fR will output a list of all currently allocated memory to the specified file. The information output for each allocated block of memory is: starting and ending addresses (excluding guard zone), size, source file where \fBckalloc\fR was called to allocate the block and line number in that file. It is especially useful to call \fBTcl_DumpActiveMemory\fR after the Tcl interpreter has been deleted. .PP \fBTcl_InitMemory\fR adds the Tcl \fBmemory\fR command to the interpreter given by \fIinterp\fR. \fBTcl_InitMemory\fR is called by \fBTcl_Main\fR. .PP \fBTcl_ValidateAllMemory\fR forces a validation of the guard zones of all currently allocated blocks of memory. Normally validation of a block occurs when its freed, unless full validation is enabled, in which case validation of all blocks occurs when \fBckalloc\fR and \fBckfree\fR are called. This function forces the validation to occur at any point. |
| ︙ | ︙ |
Changes to doc/Encoding.3.
1 2 3 4 5 6 | '\" '\" Copyright (c) 1997-1998 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | | | | | | | 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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | '\" '\" Copyright (c) 1997-1998 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: Encoding.3,v 1.7.18.1 2002/02/05 02:21:57 wolfsuit Exp $ '\" .so man.macros .TH Tcl_GetEncoding 3 "8.1" Tcl "Tcl Library Procedures" .BS .SH NAME Tcl_GetEncoding, Tcl_FreeEncoding, Tcl_ExternalToUtfDString, Tcl_ExternalToUtf, Tcl_UtfToExternalDString, Tcl_UtfToExternal, Tcl_WinTCharToUtf, Tcl_WinUtfToTChar, Tcl_GetEncodingName, Tcl_SetSystemEncoding, Tcl_GetEncodingNames, Tcl_CreateEncoding, Tcl_GetDefaultEncodingDir, Tcl_SetDefaultEncodingDir \- procedures for creating and using encodings. .SH SYNOPSIS .nf \fB#include <tcl.h>\fR .sp Tcl_Encoding \fBTcl_GetEncoding\fR(\fIinterp, name\fR) .sp void \fBTcl_FreeEncoding\fR(\fIencoding\fR) .sp CONST char * \fBTcl_ExternalToUtfDString\fR(\fIencoding, src, srcLen, dstPtr\fR) .sp int \fBTcl_ExternalToUtf\fR(\fIinterp, encoding, src, srcLen, flags, statePtr, dst, dstLen, srcReadPtr, dstWrotePtr, dstCharsPtr\fR) .sp CONST char * \fBTcl_UtfToExternalDString\fR(\fIencoding, src, srcLen, dstPtr\fR) .sp int \fBTcl_UtfToExternal\fR(\fIinterp, encoding, src, srcLen, flags, statePtr, dst, dstLen, srcReadPtr, dstWrotePtr, dstCharsPtr\fR) .sp CONST char * \fBTcl_WinTCharToUtf\fR(\fItsrc, srcLen, dstPtr\fR) .sp CONST TCHAR * \fBTcl_WinUtfToTChar\fR(\fIsrc, srcLen, dstPtr\fR) .sp CONST char * \fBTcl_GetEncodingName\fR(\fIencoding\fR) .sp int \fBTcl_SetSystemEncoding\fR(\fIinterp, name\fR) .sp void \fBTcl_GetEncodingNames\fR(\fIinterp\fR) .sp Tcl_Encoding \fBTcl_CreateEncoding\fR(\fItypePtr\fR) .sp CONST char * \fBTcl_GetDefaultEncodingDir\fR(\fIvoid\fR) .sp void \fBTcl_SetDefaultEncodingDir\fR(\fIpath\fR) .SH ARGUMENTS |
| ︙ | ︙ | |||
120 121 122 123 124 125 126 | Filled with the number of bytes that were actually stored in the output buffer as a result of the conversion. May be NULL. .AP int *dstCharsPtr out Filled with the number of characters that correspond to the number of bytes stored in the output buffer. May be NULL. .AP Tcl_EncodingType *typePtr in Structure that defines a new type of encoding. | | | 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 | Filled with the number of bytes that were actually stored in the output buffer as a result of the conversion. May be NULL. .AP int *dstCharsPtr out Filled with the number of characters that correspond to the number of bytes stored in the output buffer. May be NULL. .AP Tcl_EncodingType *typePtr in Structure that defines a new type of encoding. .AP "CONST char" *path in A path to the location of the encoding file. .BE .SH INTRODUCTION .PP These routines convert between Tcl's internal character representation, UTF-8, and character representations used by various operating systems or file systems, such as Unicode, ASCII, or Shift-JIS. When operating on |
| ︙ | ︙ |
Changes to doc/Eval.3.
1 2 3 4 5 6 7 8 | '\" '\" Copyright (c) 1989-1993 The Regents of the University of California. '\" Copyright (c) 1994-1997 Sun Microsystems, Inc. '\" Copyright (c) 2000 Scriptics Corporation. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | '\" '\" Copyright (c) 1989-1993 The Regents of the University of California. '\" Copyright (c) 1994-1997 Sun Microsystems, Inc. '\" Copyright (c) 2000 Scriptics Corporation. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: Eval.3,v 1.9.14.1 2002/02/05 02:21:57 wolfsuit Exp $ '\" .so man.macros .TH Tcl_Eval 3 8.1 Tcl "Tcl Library Procedures" .BS .SH NAME Tcl_EvalObjEx, Tcl_EvalFile, Tcl_EvalObjv, Tcl_Eval, Tcl_EvalEx, Tcl_GlobalEval, Tcl_GlobalEvalObj, Tcl_VarEval, Tcl_VarEvalVA \- execute Tcl scripts .SH SYNOPSIS |
| ︙ | ︙ | |||
50 51 52 53 54 55 56 | Interpreter in which to execute the script. The interpreter's result is modified to hold the result or error message from the script. .AP Tcl_Obj *objPtr in A Tcl object containing the script to execute. .AP int flags in ORed combination of flag bits that specify additional options. \fBTCL_EVAL_GLOBAL\fR and \fBTCL_EVAL_DIRECT\fR are currently supported. | | | 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | Interpreter in which to execute the script. The interpreter's result is modified to hold the result or error message from the script. .AP Tcl_Obj *objPtr in A Tcl object containing the script to execute. .AP int flags in ORed combination of flag bits that specify additional options. \fBTCL_EVAL_GLOBAL\fR and \fBTCL_EVAL_DIRECT\fR are currently supported. .AP "CONST char" *fileName in Name of a file containing a Tcl script. .AP int objc in The number of objects in the array pointed to by \fIobjPtr\fR; this is also the number of words in the command. .AP Tcl_Obj **objv in Points to an array of pointers to objects; each object holds the value of a single word in the command to execute. |
| ︙ | ︙ |
Changes to doc/ExprLong.3.
1 2 3 4 5 6 7 | '\" '\" Copyright (c) 1989-1993 The Regents of the University of California. '\" Copyright (c) 1994-1997 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | '\" '\" Copyright (c) 1989-1993 The Regents of the University of California. '\" Copyright (c) 1994-1997 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: ExprLong.3,v 1.4.12.1 2002/02/05 02:21:57 wolfsuit Exp $ '\" .so man.macros .TH Tcl_ExprLong 3 7.0 Tcl "Tcl Library Procedures" .BS .SH NAME Tcl_ExprLong, Tcl_ExprDouble, Tcl_ExprBoolean, Tcl_ExprString \- evaluate an expression .SH SYNOPSIS |
| ︙ | ︙ | |||
52 53 54 55 56 57 58 | .PP These four procedures all evaluate the expression given by the \fIstring\fR argument and return the result in one of four different forms. The expression can have any of the forms accepted by the \fBexpr\fR command. Note that these procedures have been largely replaced by the object-based procedures \fBTcl_ExprLongObj\fR, \fBTcl_ExprDoubleObj\fR, | | | 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | .PP These four procedures all evaluate the expression given by the \fIstring\fR argument and return the result in one of four different forms. The expression can have any of the forms accepted by the \fBexpr\fR command. Note that these procedures have been largely replaced by the object-based procedures \fBTcl_ExprLongObj\fR, \fBTcl_ExprDoubleObj\fR, \fBTcl_ExprBooleanObj\fR, and \fBTcl_ExprObj\fR. Those object-based procedures evaluate an expression held in a Tcl object instead of a string. The object argument can retain an internal representation that is more efficient to execute. .PP The \fIinterp\fR argument refers to an interpreter used to evaluate the expression (e.g. for variables and nested Tcl |
| ︙ | ︙ |
Changes to doc/FileSystem.3.
1 2 3 4 5 6 | '\" '\" Copyright (c) 2001 Vincent Darley '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | | > > > > > > > > > | 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 34 35 36 37 38 39 40 41 42 | '\" '\" Copyright (c) 2001 Vincent Darley '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: FileSystem.3,v 1.8.2.1 2002/02/05 02:21:57 wolfsuit Exp $ '\" .so man.macros .TH Filesystem 3 8.4 Tcl "Tcl Library Procedures" .BS .SH NAME Tcl_FSRegister, Tcl_FSUnregister, Tcl_FSData, Tcl_FSMountsChanged, Tcl_FSGetFileSystemForPath, Tcl_FSGetPathType, Tcl_FSCopyFile, Tcl_FSCopyDirectory, Tcl_FSCreateDirectory, Tcl_FSDeleteFile, Tcl_FSRemoveDirectory, Tcl_FSRenameFile, Tcl_FSListVolumes, Tcl_FSEvalFile, Tcl_FSLoadFile, Tcl_FSMatchInDirectory, Tcl_FSLink, Tcl_FSLstat, Tcl_FSUtime, Tcl_FSFileAttrsGet, Tcl_FSFileAttrsSet, Tcl_FSFileAttrStrings, Tcl_FSStat, Tcl_FSAccess, Tcl_FSOpenFileChannel, Tcl_FSGetCwd, Tcl_FSChdir, Tcl_FSPathSeparator, Tcl_FSJoinPath, Tcl_FSSplitPath, Tcl_FSEqualPaths, Tcl_FSGetNormalizedPath, Tcl_FSJoinToPath, Tcl_FSConvertToPathType, Tcl_FSGetInternalRep, Tcl_FSGetTranslatedPath, Tcl_FSGetTranslatedStringPath, Tcl_FSNewNativePath, Tcl_FSGetNativePath, Tcl_FSFileSystemInfo \- procedures to interact with any filesystem .SH SYNOPSIS .nf \fB#include <tcl.h>\fR .sp int \fBTcl_FSRegister\fR(\fIclientData, fsPtr\fR) .sp int \fBTcl_FSUnregister\fR(\fIfsPtr\fR) .sp ClientData \fBTcl_FSData\fR(\fIfsPtr\fR) .sp void \fBTcl_FSMountsChanged\fR(\fIfsPtr\fR) .sp Tcl_Filesystem* \fBTcl_FSGetFileSystemForPath\fR(\fIpathObjPtr\fR) .sp Tcl_PathType \fBTcl_FSGetPathType\fR(\fIpathObjPtr\fR) .sp int \fBTcl_FSCopyFile\fR(\fIsrcPathPtr, destPathPtr\fR) .sp int \fBTcl_FSCopyDirectory\fR(\fIsrcPathPtr, destPathPtr, errorPtr\fR) .sp int |
| ︙ | ︙ | |||
42 43 44 45 46 47 48 | int \fBTcl_FSRenameFile\fR(\fIsrcPathPtr, destPathPtr\fR) .sp Tcl_Obj* \fBTcl_FSListVolumes\fR(\fIvoid\fR) .sp int | | | 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | int \fBTcl_FSRenameFile\fR(\fIsrcPathPtr, destPathPtr\fR) .sp Tcl_Obj* \fBTcl_FSListVolumes\fR(\fIvoid\fR) .sp int \fBTcl_FSEvalFile\fR(\fIinterp, pathPtr\fR) .sp int \fBTcl_FSLoadFile\fR(\fIinterp, pathPtr, sym1, sym2, proc1Ptr, proc2Ptr, clientDataPtr, unloadProcPtr\fR) .sp int \fBTcl_FSMatchInDirectory\fR(\fIinterp, result, pathPtr, pattern, types\fR) .sp |
| ︙ | ︙ | |||
65 66 67 68 69 70 71 | .sp int \fBTcl_FSFileAttrsGet\fR(\fIinterp, int index, pathPtr, objPtrRef\fR) .sp int \fBTcl_FSFileAttrsSet\fR(\fIinterp, int index, pathPtr, Tcl_Obj *objPtr\fR) .sp | | | 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | .sp int \fBTcl_FSFileAttrsGet\fR(\fIinterp, int index, pathPtr, objPtrRef\fR) .sp int \fBTcl_FSFileAttrsSet\fR(\fIinterp, int index, pathPtr, Tcl_Obj *objPtr\fR) .sp CONST char** \fBTcl_FSFileAttrStrings\fR(\fIpathPtr, objPtrRef\fR) .sp int \fBTcl_FSStat\fR(\fIpathPtr, statPtr\fR) .sp int \fBTcl_FSAccess\fR(\fIpathPtr, mode\fR) |
| ︙ | ︙ | |||
110 111 112 113 114 115 116 | .sp ClientData \fBTcl_FSGetInternalRep\fR(\fIpathPtr, fsPtr\fR) .sp Tcl_Obj* \fBTcl_FSGetTranslatedPath\fR(\fIinterp, pathPtr\fR) .sp | | | | | 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 | .sp ClientData \fBTcl_FSGetInternalRep\fR(\fIpathPtr, fsPtr\fR) .sp Tcl_Obj* \fBTcl_FSGetTranslatedPath\fR(\fIinterp, pathPtr\fR) .sp CONST char* \fBTcl_FSGetTranslatedStringPath\fR(\fIinterp, pathPtr\fR) .sp Tcl_Obj* \fBTcl_FSNewNativePath\fR(\fIfsPtr, clientData\fR) .sp CONST char* \fBTcl_FSGetNativePath\fR(\fIpathPtr\fR) .sp Tcl_Obj* \fBTcl_FSFileSystemInfo\fR(\fIpathPtr\fR) .SH ARGUMENTS .AS Tcl_Filesystem *fsPtr in .AP Tcl_Filesystem *fsPtr in Points to a structure containing the addresses of procedures that can be called to perform the various filesystem operations. .AP Tcl_Obj *pathPtr in The path represented by this object is used for the operation in question. If the object does not already have an internal \fBpath\fR representation, it will be converted to have one. .AP Tcl_Obj *srcPathPtr in As for \fBpathPtr\fR, but used for the source file for a copy or rename operation. .AP Tcl_Obj *destPathPtr in As for \fBpathPtr\fR, but used for the destination filename for a copy or rename operation. .AP "CONST char" *pattern in Only files or directories matching this pattern will be returned by \fBTcl_FSMatchInDirectory\fR. .AP GlobTypeData *types in Only files or directories matching the type descriptions contained in this structure will be returned by \fBTcl_FSMatchInDirectory\fR. It is very important that the 'directory' flag is properly handled. This parameter may be NULL. |
| ︙ | ︙ | |||
192 193 194 195 196 197 198 | Filled with the clientData value to pass to this code's unload function when it is called. .AP TclfsUnloadFileProc_ **unloadProcPtr out Filled with the function to use to unload this piece of code. .AP utimbuf *tval in The access and modification times in this structure are read and used to set those values for a given file. | | | 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 | Filled with the clientData value to pass to this code's unload function when it is called. .AP TclfsUnloadFileProc_ **unloadProcPtr out Filled with the function to use to unload this piece of code. .AP utimbuf *tval in The access and modification times in this structure are read and used to set those values for a given file. .AP "CONST char" *modeString in Specifies how the file is to be accessed. May have any of the values allowed for the \fImode\fR argument to the Tcl \fBopen\fR command. .AP int permissions in POSIX-style permission flags such as 0644. If a new file is created, these permissions will be set on the created file. .AP int *lenPtr out If non-NULL, filled with the number of elements in the split path. |
| ︙ | ︙ | |||
221 222 223 224 225 226 227 | Windows. Second, the Windows implementation of some of these functions fixes some bugs in the system level calls. Third, these function calls deal with any 'Utf to platform-native' path conversions which may be required (and may cache the results of such conversions for greater efficiency on subsequent calls). Fourth, and perhaps most importantly, all of these functions are 'virtual filesystem aware'. Any virtual filesystem which has been registered (through | | | | 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 | Windows. Second, the Windows implementation of some of these functions fixes some bugs in the system level calls. Third, these function calls deal with any 'Utf to platform-native' path conversions which may be required (and may cache the results of such conversions for greater efficiency on subsequent calls). Fourth, and perhaps most importantly, all of these functions are 'virtual filesystem aware'. Any virtual filesystem which has been registered (through \fBTcl_FSRegister\fR) may reroute file access to alternative media or access methods. This means that all of these functions (and therefore the corresponding \fBfile\fR, \fBpwd\fR, \fBcd\fR, \fBopen\fR, etc. Tcl commands) may be operate on 'files' which are not native files in the native filesystem. If appropriate vfs's have been registered, the 'files' may, to give two examples, be remote (e.g. situated on a remote ftp server) or archived (e.g. lying inside a .zip archive). Such registered filesystems provide a lookup table of functions to implement all or some of the functionality listed here. .PP The \fBTcl_FS...\fR are objectified and may cache internal representations and other path-related strings (e.g. the current working directory). One side-effect of this is that one must be careful when passing in temporary objects with a refCount of zero. Under some circumstances, the filesystem code may wish to retain a reference to the passed in object, and so one must not assume that after any of these calls return, the object still has a refCount of zero - it may have been incremented. The practical lesson to learn from this is that \fBTcl_Obj *path = Tcl_NewStringObj(...) ; Tcl_FS...(path) ; Tcl_DecrRefCount(path)\fR is wrong, and may segfault. The 'path' must have its refCount incremented before passing it in, or decrementing it. .PP \fBTcl_FSCopyFile\fR attempts to copy the file given by srcPathPtr to the path name given by destPathPtr. If the two paths given lie in the same filesystem (according to \fBTcl_FSGetFileSystemForPath\fR) then that |
| ︙ | ︙ | |||
273 274 275 276 277 278 279 | \fBTcl_FSRemoveDirectory\fR attempts to remove the directory given by pathPtr by calling the owning filesystem's 'remove directory' function. .PP \fBTcl_FSRenameFile\fR attempts to rename the file or directory given by srcPathPtr to the path name given by destPathPtr. If the two paths given lie in the same filesystem (according to | | | | | | 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 | \fBTcl_FSRemoveDirectory\fR attempts to remove the directory given by pathPtr by calling the owning filesystem's 'remove directory' function. .PP \fBTcl_FSRenameFile\fR attempts to rename the file or directory given by srcPathPtr to the path name given by destPathPtr. If the two paths given lie in the same filesystem (according to \fBTcl_FSGetFileSystemForPath\fR) then that filesystem's 'rename file' function is called (if it is non-NULL). Otherwise the function returns -1 and sets Tcl's errno to the 'EXDEV' posix error code (which signifies a ``cross-domain link''). .PP \fBTcl_FSListVolumes\fR calls each filesystem which has a non-NULL 'list volumes' function and asks them to return their list of root volumes. It accumulates the return values in a list which is returned to the caller (with a refCount of 0). .PP \fBTcl_FSEvalFile\fR reads the file given by \fIpathPtr\fR and evaluates |
| ︙ | ︙ | |||
397 398 399 400 401 402 403 | Windows), size, last access time, last modification time, and creation time. .PP If \fIpath\fR exists, \fBTcl_FSStat\fR returns 0 and the stat structure is filled with data. Otherwise, -1 is returned, and no stat info is given. .PP | | | 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 | Windows), size, last access time, last modification time, and creation time. .PP If \fIpath\fR exists, \fBTcl_FSStat\fR returns 0 and the stat structure is filled with data. Otherwise, -1 is returned, and no stat info is given. .PP \fBTcl_FSOpenFileChannel\fR opens a file specified by \fIpathPtr\fR and returns a channel handle that can be used to perform input and output on the file. This API is modeled after the \fBfopen\fR procedure of the Unix standard I/O library. The syntax and meaning of all arguments is similar to those given in the Tcl \fBopen\fR command when opening a file. If an error occurs while opening the channel, \fBTcl_OpenFileChannel\fR returns NULL and records a POSIX error code that can be |
| ︙ | ︙ | |||
498 499 500 501 502 503 504 | TCL_ERROR is returned, and an error message may be left in the interpreter. .PP \fBTcl_FSGetInternalRep\fR extracts the internal representation of a given path object, in the given filesystem. If the path object belongs to a different filesystem, we return NULL. If the internal representation is currently NULL, we attempt to generate it, by calling the filesystem's | | | 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 | TCL_ERROR is returned, and an error message may be left in the interpreter. .PP \fBTcl_FSGetInternalRep\fR extracts the internal representation of a given path object, in the given filesystem. If the path object belongs to a different filesystem, we return NULL. If the internal representation is currently NULL, we attempt to generate it, by calling the filesystem's \fBTclfsConvertToInternalProc_\fR. .PP Returns NULL or a valid internal path representation. This internal representation is cached, so that repeated calls to this function will not require additional conversions. .PP \fBTcl_FSGetTranslatedPath\fR attempts to extract the translated path from the given Tcl_Obj. |
| ︙ | ︙ | |||
540 541 542 543 544 545 546 | given path within that filesystem (which is filesystem dependent). The second element may be empty if the filesystem does not provide a further categorization of files. .PP A valid list object is returned, unless the path object is not recognized, when NULL will be returned. .PP | | > > > > > > > > > > > | 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 | given path within that filesystem (which is filesystem dependent). The second element may be empty if the filesystem does not provide a further categorization of files. .PP A valid list object is returned, unless the path object is not recognized, when NULL will be returned. .PP \fBTcl_FSGetFileSystemForPath\fR returns the a pointer to the \fBTcl_Filesystem\fR which accepts this path as valid. .PP If no filesystem will accept the path, NULL is returned. .PP \fBTcl_FSGetPathType\fR determines whether the given path is relative to the current directory, relative to the current volume, or absolute. .PP It returns one of TCL_PATH_ABSOLUTE, TCL_PATH_RELATIVE, or TCL_PATH_VOLUME_RELATIVE .PP .SH TCL_FILESYSTEM .PP A filesystem provides a \fBTcl_Filesystem\fR structure that contains pointers to functions that implement the various operations on a filesystem; these operations are invoked as needed by the generic layer, which generally occurs through the functions listed above. .PP |
| ︙ | ︙ | |||
565 566 567 568 569 570 571 572 573 574 575 576 577 578 |
\fBTcl_FSUnregister\fR removes the given filesystem structure from
the list of known filesystems, if it is known, and returns TCL_OK. If
the filesystem is not currently registered, TCL_ERROR is returned.
.PP
\fBTcl_FSData\fR will return the ClientData associated with the given
filesystem, if that filesystem is registered. Otherwise it will
return NULL.
.PP
The \fBTcl_Filesystem\fR structure contains the following fields:
.CS
typedef struct Tcl_Filesystem {
CONST char *\fItypeName\fR;
int \fIstructureLength\fR;
Tcl_FSVersion \fIversion\fR;
| > > > > > | 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 |
\fBTcl_FSUnregister\fR removes the given filesystem structure from
the list of known filesystems, if it is known, and returns TCL_OK. If
the filesystem is not currently registered, TCL_ERROR is returned.
.PP
\fBTcl_FSData\fR will return the ClientData associated with the given
filesystem, if that filesystem is registered. Otherwise it will
return NULL.
.PP
\fBTcl_FSMountsChanged\fR is used to inform the Tcl's core that
the set of mount points for the given (already registered) filesystem
have changed, and that cached file representations may therefore no
longer be correct.
.PP
The \fBTcl_Filesystem\fR structure contains the following fields:
.CS
typedef struct Tcl_Filesystem {
CONST char *\fItypeName\fR;
int \fIstructureLength\fR;
Tcl_FSVersion \fIversion\fR;
|
| ︙ | ︙ | |||
632 633 634 635 636 637 638 | filesystem table (lstat, load, unload, getcwd and chdir) for which fallbacks do in fact occur at the C level. .PP Any functions which take path names in Tcl_Obj form take those names in UTF\-8 form. The filesystem infrastructure API is designed to support efficient, cached conversion of these UTF\-8 paths to other native representations. | < < < | < | 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 | filesystem table (lstat, load, unload, getcwd and chdir) for which fallbacks do in fact occur at the C level. .PP Any functions which take path names in Tcl_Obj form take those names in UTF\-8 form. The filesystem infrastructure API is designed to support efficient, cached conversion of these UTF\-8 paths to other native representations. .SH TYPENAME .PP The \fItypeName\fR field contains a null-terminated string that identifies the type of the filesystem implemented, e.g. \fBnative\fR or \fBzip\fR or \fBvfs\fR. .PP .SH "STRUCTURE LENGTH" .PP The \fIstructureLength\fR field is generally implemented as \fIsizeof(Tcl_Filesystem)\fR, and is there to allow easier binary backwards compatibility if the size of the structure changes in a future Tcl release. .SH VERSION .PP The \fIversion\fR field should be set to \fBTCL_FILESYSTEM_VERSION_1\fR. .SH "FILESYSTEM INFRASTRUCTURE" .PP These fields contain addresses of functions which are used to associate a particular filesystem with a file path, and deal with the internal handling of path representations, for example copying and freeing such representations. .SH PATHINFILESYSTEMPROC .PP The \fIpathInFilesystemProc\fR field contains the address of a function which is called to determine whether a given path object belongs to this filesystem or not. Tcl will only call the rest of the filesystem functions with a path for which this function has returned \fBTCL_OK\fR. If the path does not belong, \fBTCL_ERROR\fR should be |
| ︙ | ︙ | |||
678 679 680 681 682 683 684 | known filesystems. .PP .CS typedef int Tcl_FSPathInFilesystemProc( Tcl_Obj *\fIpathPtr\fR, ClientData *\fIclientDataPtr\fR); .CE | < < < < < | | < | | | < < | < | | < > < | | | | | < | | < | < | < | | | | | | < | < | < | < < | < | | | | | < | < | < | | 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 | known filesystems. .PP .CS typedef int Tcl_FSPathInFilesystemProc( Tcl_Obj *\fIpathPtr\fR, ClientData *\fIclientDataPtr\fR); .CE .SH DUPINTERNALREPPROC .PP This function makes a copy of a path's internal representation, and is called when Tcl needs to duplicate a path object. If NULL, Tcl will simply not copy the internal representation, which may then need to be regenerated later. .PP .CS typedef ClientData Tcl_FSDupInternalRepProc( ClientData \fIclientData\fR); .CE .SH FREEINTERNALREPPROC Free the internal representation. This must be implemented if internal representations need freeing (i.e. if some memory is allocated when an internal representation is generated), but may otherwise be NULL. .PP .CS typedef void Tcl_FSFreeInternalRepProc( ClientData \fIclientData\fR); .CE .SH INTERNALTONORMALIZEDPROC .PP Function to convert internal representation to a normalized path. Only required if the filesystem creates pure path objects with no string/path representation. The return value is a Tcl object whose string representation is the normalized path. .PP .CS typedef Tcl_Obj* Tcl_FSInternalToNormalizedProc( ClientData \fIclientData\fR); .CE .SH CREATEINTERNALREPPROC .PP Function to take a path object, and calculate an internal representation for it, and store that native representation in the object. May be NULL if paths have no internal representation, or if the \fITcl_FSPathInFilesystemProc\fR for this filesystem always immediately creates an internal representation for paths it accepts. .PP .CS typedef ClientData Tcl_FSCreateInternalRepProc( Tcl_Obj *\fIpathPtr\fR); .CE .SH NORMALIZEPATHPROC .PP Function to normalize a path. Should be implemented for all filesystems which can have multiple string representations for the same path object. In Tcl, every 'path' must have a single unique 'normalized' string representation. Depending on the filesystem, there may be more than one unnormalized string representation which refers to that path (e.g. a relative path, a path with different character case if the filesystem is case insensitive, a path contain a reference to a home directory such as '~', etc). .PP .CS typedef int Tcl_FSNormalizePathProc( Tcl_Interp *\fIinterp\fR, Tcl_Obj *\fIpathPtr\fR, int \fInextCheckpoint\fR); .CE .SH "FILESYSTEM OPERATIONS" .PP The fields in this section of the structure contain addresses of functions which are called to carry out the basic filesystem operations. A filesystem which expects to be used with the complete standard Tcl command set must implement all of these. If some of them are not implemented, then certain Tcl commands may fail when operating on paths within that filesystem. However, in some instances this may be desirable (for example, a read-only filesystem should not implement the last four functions, and a filesystem which does not support symbolic links need not implement the \fBreadlink\fR function, etc. The Tcl core expects filesystems to behave in this way). .SH FILESYSTEMPATHTYPEPROC .PP Function to determine the type of a path in this filesystem. May be NULL, in which case no type information will be available to users of the filesystem. The 'type' is used only for informational purposes, and should be returned as the string representation of the Tcl_Obj which is returned. A typical return value might be "networked", "zip" or "ftp". .PP .CS typedef Tcl_Obj* Tcl_FSFilesystemPathTypeProc( Tcl_Obj *\fIpathPtr\fR); .CE .SH FILESYSTEMSEPARATORPROC .PP Function to return the separator character(s) for this filesystem. Must be implemented, otherwise the \fBfile separator\fR command will not function correctly. The usual return value will be a Tcl_Obj containing the string "/". .PP .CS typedef Tcl_Obj* Tcl_FSFilesystemSeparatorProc( Tcl_Obj *\fIpathPtr\fR); .CE .SH STATPROC .PP Function to process a \fBTcl_FSStat()\fR call. Must be implemented for any reasonable filesystem, since many Tcl level commands depend crucially upon it (e.g. \fBfile atime\fR, \fBfile isdirectory\fR, \fBfile size\fR, \fBglob\fR). .PP .CS typedef int Tcl_FSStatProc( Tcl_Obj *\fIpathPtr\fR, struct stat *\fIstatPtr\fR); .CE .PP The \fBTcl_FSStatProc\fR fills the stat structure \fIstatPtr\fR with information about the specified file. You do not need any access rights to the file to get this information but you need search rights to all directories named in the path leading to the file. The stat structure includes info regarding device, inode (always 0 on Windows), privilege mode, nlink (always 1 on Windows), user id (always 0 on Windows), group id (always 0 on Windows), rdev (same as device on Windows), size, last access time, last modification time, and creation time. .PP If the file represented by \fIpathPtr\fR exists, the \fBTcl_FSStatProc\fR returns 0 and the stat structure is filled with data. Otherwise, -1 is returned, and no stat info is given. .SH ACCESSPROC .PP Function to process a \fBTcl_FSAccess()\fR call. Must be implemented for any reasonable filesystem, since many Tcl level commands depend crucially upon it (e.g. \fBfile exists\fR, \fBfile readable\fR). .PP .CS typedef int Tcl_FSAccessProc( Tcl_Obj *\fIpathPtr\fR, int \fImode\fR); .CE .PP The \fBTcl_FSAccessProc\fR checks whether the process would be allowed to read, write or test for existence of the file (or other file system object) whose name is pathname. If pathname is a symbolic link, then permissions of the file referred by this symbolic link should be tested. .PP On success (all requested permissions granted), zero is returned. On error (at least one bit in mode asked for a permission that is denied, or some other error occurred), -1 is returned. .PP .SH OPENFILECHANNELPROC .PP Function to process a \fBTcl_FSOpenFileChannel()\fR call. Must be implemented for any reasonable filesystem, since any operations which require open or accessing a file's contents will use it (e.g. \fBopen\fR, \fBencoding\fR, and many Tk commands). .PP .CS typedef Tcl_Channel Tcl_FSOpenFileChannelProc( Tcl_Interp *\fIinterp\fR, Tcl_Obj *\fIpathPtr\fR, CONST char *\fImodeString\fR, int \fIpermissions\fR); .CE .PP The \fBTcl_FSOpenFileChannelProc\fR opens a file specified by \fIpathPtr\fR and returns a channel handle that can be used to perform input and output on the file. This API is modeled after the \fBfopen\fR procedure of the Unix standard I/O library. The syntax and meaning of all arguments is similar to those given in the Tcl \fBopen\fR command when opening a file. If an error occurs while opening the channel, the \fBTcl_FSOpenFileChannelProc\fR returns NULL and records a POSIX error code that can be retrieved with \fBTcl_GetErrno\fR. In addition, if \fIinterp\fR is non-NULL, the \fBTcl_FSOpenFileChannelProc\fR leaves an error message in \fIinterp\fR's result after any error. .PP The newly created channel is not registered in the supplied interpreter; to register it, use \fBTcl_RegisterChannel\fR. If one of the standard channels, \fBstdin, stdout\fR or \fBstderr\fR was previously closed, the act of creating the new channel also assigns it as a replacement for the standard channel. .SH MATCHINDIRECTORYPROC .PP Function to process a \fBTcl_FSMatchInDirectory()\fR call. If not implemented, then glob and recursive copy functionality will be lacking in the filesystem (and this may impact commands like 'encoding names' which use glob functionality internally). .PP .CS typedef int Tcl_FSMatchInDirectoryProc( Tcl_Interp* \fIinterp\fR, Tcl_Obj *\fIresult\fR, Tcl_Obj *\fIpathPtr\fR, CONST char *\fIpattern\fR, Tcl_GlobTypeData * \fItypes\fR); .CE .PP The function should return all files or directories (or other filesystem objects) which match the given pattern and accord with the \fItypes\fR specification given. The directory \fIpathPtr\fR, in which the function should search, can be assumed to be both non-NULL and non-empty. .PP The return value is a standard Tcl result indicating whether an error occurred in the matching process. Error messages are placed in interp, but on a TCL_OK result, the interpreter should not be modified, but rather results should be added to the \fIresult\fR object given (which can be assumed to be a valid Tcl list). The matches added to \fIresult\fR should include any path prefix given in \fIpathPtr\fR (this usually means they will be absolute path specifications). .SH UTIMEPROC .PP Function to process a \fBTcl_FSUtime()\fR call. Required to allow setting (not reading) of times with 'file mtime', 'file atime' and the open-r/open-w/fcopy implementation of 'file copy'. .PP .CS typedef int Tcl_FSUtimeProc( Tcl_Obj *\fIpathPtr\fR, struct utimbuf *\fItval\fR); .CE .PP The access and modification times of the file specified by \fIpathPtr\fR should be changed to the values given in the \fItval\fR structure. .PP The return value is a standard Tcl result indicating whether an error occurred in the process. .SH LINKPROC .PP Function to process a \fBTcl_FSLink()\fR call. Should be implemented only if the filesystem supports links, and may otherwise be NULL. .PP .CS typedef Tcl_Obj* Tcl_FSLinkProc( Tcl_Obj *\fIpathPtr\fR, Tcl_Obj *\fItoPtr\fR); .CE .PP If \fItoPtr\fR is NULL, the function is being asked to read the contents of a link. The result is a Tcl_Obj specifying the contents of the symbolic link given by 'path', or NULL if the symbolic link could not be read. The result is owned by the caller, which should call Tcl_DecrRefCount when the result is no longer needed. If \fItoPtr\fR is not NULL, the function should attempt to create a link. The result in this case should be \fItoPtr\fR if the link was successful and NULL otherwise. In this case the result is not owned by the caller. .SH LISTVOLUMESPROC .PP Function to list any filesystem volumes added by this filesystem. Should be implemented only if the filesystem adds volumes at the head of the filesystem, so that they can be returned by 'file volumes'. .PP .CS typedef Tcl_Obj* Tcl_FSListVolumesProc(void); .CE .PP The result should be a list of volumes added by this filesystem, or NULL (or an empty list) if no volumes are provided. The result object is considered to be owned by the filesystem (not by Tcl's core), but should be given a refCount for Tcl. Tcl will use the contents of the list and then decrement that refCount. This allows filesystems to choose whether they actually want to retain a 'master list' of volumes or not (if not, they generate the list on the fly and pass it to Tcl with a refCount of 1 and then forget about the list, if yes, then they simply increment the refCount of their master list and pass it to Tcl which will copy the contents and then decrement the count back to where it was). .PP Therefore, Tcl considers return values from this proc to be read-only. .PP .SH FILEATTRSTRINGSPROC .PP Function to list all attribute strings which are valid for this filesystem. If not implemented the filesystem will not support the \fBfile attributes\fR command. This allows arbitrary additional information to be attached to files in the filesystem. If it is not implemented, there is no need to implement the \fBget\fR and \fBset\fR methods. .PP .CS typedef CONST char** Tcl_FSFileAttrStringsProc( Tcl_Obj *\fIpathPtr\fR, Tcl_Obj** \fIobjPtrRef\fR); .CE .PP The called function may either return an array of strings, or may instead return NULL and place a Tcl list into the given objPtrRef. Tcl will take that list and first increment its refCount before using it. On completion of that use, Tcl will decrement its refCount. Hence if the list should be disposed of by Tcl when done, it should have a refCount of zero, and if the list should not be disposed of, the filesystem should ensure it retains a refCount on the object. .SH FILEATTRSGETPROC .PP Function to process a \fBTcl_FSFileAttrsGet()\fR call, used by 'file attributes'. .PP .CS typedef int Tcl_FSFileAttrsGetProc( Tcl_Interp *\fIinterp\fR, int \fIindex\fR, Tcl_Obj *\fIpathPtr\fR, Tcl_Obj **\fIobjPtrRef\fR); .CE .PP Returns a standard Tcl return code. The attribute value retrieved, which corresponds to the \fIindex\fR'th element in the list returned by the Tcl_FSFileAttrStringsProc, is a Tcl_Obj placed in objPtrRef (if TCL_OK was returned) and is likely to have a refCount of zero. Either way we must either store it somewhere (e.g. the Tcl result), or Incr/Decr its refCount to ensure it is properly freed. .SH FILEATTRSSETPROC .PP Function to process a \fBTcl_FSFileAttrsSet()\fR call, used by 'file attributes'. If the filesystem is read-only, there is no need to implement this. .PP .CS typedef int Tcl_FSFileAttrsSetProc( Tcl_Interp *\fIinterp\fR, int \fIindex\fR, Tcl_Obj *\fIpathPtr\fR, Tcl_Obj *\fIobjPtr\fR); .CE .PP The attribute value of the \fIindex\fR'th element in the list returned by the Tcl_FSFileAttrStringsProc should be set to the \fIobjPtr\fR given. .SH CREATEDIRECTORYPROC .PP Function to process a \fBTcl_FSCreateDirectory()\fR call. Should be implemented unless the FS is read-only. .PP .CS typedef int Tcl_FSCreateDirectoryProc( Tcl_Obj *\fIpathPtr\fR); .CE .PP The return value is a standard Tcl result indicating whether an error occurred in the process. If successful, a new directory should have been added to the filesystem in the location specified by \fIpathPtr\fR. .SH REMOVEDIRECTORYPROC .PP Function to process a 'Tcl_FSRemoveDirectory()' call. Should be implemented unless the FS is read-only. .PP .CS typedef int Tcl_FSRemoveDirectoryProc( Tcl_Obj *\fIpathPtr\fR, int \fIrecursive\fR, Tcl_Obj **\fIerrorPtr\fR); .CE .PP The return value is a standard Tcl result indicating whether an error occurred in the process. If successful, the directory specified by \fIpathPtr\fR should have been removed from the filesystem. If the \fIrecursive\fR flag is given, then a non-empty directory should be deleted without error. If an error does occur, the name of the file or directory which caused the error should be placed in \fIerrorPtr\fR. .SH DELETEFILEPROC .PP Function to process a \fBTcl_FSDeleteFile()\fR call. Should be implemented unless the FS is read-only. .PP .CS typedef int Tcl_FSDeleteFileProc( Tcl_Obj *\fIpathPtr\fR); .CE .PP The return value is a standard Tcl result indicating whether an error occurred in the process. If successful, the file specified by \fIpathPtr\fR should have been removed from the filesystem. .SH "FILESYSTEM EFFICIENCY" .PP .SH LSTATPROC .PP Function to process a \fBTcl_FSLstat()\fR call. If not implemented, Tcl will attempt to use the \fIstatProc\fR defined above instead. Therefore it need only be implemented if a filesystem can differentiate between \fBstat\fR and \fBlstat\fR calls. .PP .CS typedef int Tcl_FSLstatProc( Tcl_Obj *\fIpathPtr\fR, struct stat *\fIstatPtr\fR); .CE .PP The behavior of this function is very similar to that of the Tcl_FSStatProc defined above, except that if it is applied to a symbolic link, it returns information about the link, not about the target file. .PP .SH COPYFILEPROC .PP Function to process a \fBTcl_FSCopyFile()\fR call. If not implemented Tcl will fall back on open-r, open-w and fcopy as a copying mechanism. Therefore it need only be implemented if the filesystem can perform that action more efficiently. .PP .CS typedef int Tcl_FSCopyFileProc( Tcl_Obj *\fIsrcPathPtr\fR, Tcl_Obj *\fIdestPathPtr\fR); .CE .PP The return value is a standard Tcl result indicating whether an error occurred in the copying process. Note that, \fIdestPathPtr\fR is the name of the file which should become the copy of \fIsrcPathPtr\fR. It is never the name of a directory into which \fIsrcPathPtr\fR could be copied (i.e. the function is much simpler than the Tcl level 'file copy' subcommand). .SH RENAMEFILEPROC .PP Function to process a \fBTcl_FSRenameFile()\fR call. If not implemented, Tcl will fall back on a copy and delete mechanism. Therefore it need only be implemented if the filesystem can perform that action more efficiently. .PP .CS typedef int Tcl_FSRenameFileProc( Tcl_Obj *\fIsrcPathPtr\fR, Tcl_Obj *\fIdestPathPtr\fR); .CE .PP The return value is a standard Tcl result indicating whether an error occurred in the renaming process. .SH COPYDIRECTORYPROC .PP Function to process a \fBTcl_FSCopyDirectory()\fR call. If not implemented, Tcl will fall back on a recursive create-dir, file copy mechanism. Therefore it need only be implemented if the filesystem can perform that action more efficiently. .PP .CS typedef int Tcl_FSCopyDirectoryProc( Tcl_Obj *\fIsrcPathPtr\fR, Tcl_Obj *\fIdestPathPtr\fR, Tcl_Obj **\fIerrorPtr\fR); .CE .PP The return value is a standard Tcl result indicating whether an error occurred in the copying process. If an error does occur, the name of the file or directory which caused the error should be placed in \fIerrorPtr\fR. Note that, \fIdestPathPtr\fR is the name of the directory-name which should become the mirror-image of \fIsrcPathPtr\fR. It is not the name of a directory into which \fIsrcPathPtr\fR should be copied (i.e. the function is much simpler than the Tcl level 'file copy' subcommand). .SH LOADFILEPROC .PP Function to process a \fBTcl_FSLoadFile()\fR call. If not implemented, Tcl will fall back on a copy to native-temp followed by a Tcl_FSLoadFile on that temporary copy. Therefore it need only be implemented if the filesystem can load code directly, or to disable load functionality entirely. .PP .CS typedef int Tcl_FSLoadFileProc( |
| ︙ | ︙ | |||
1173 1174 1175 1176 1177 1178 1179 | a binary code file into memory and returns the addresses of two procedures within that file, if they are defined. On a successful load, the \fIclientDataPtr\fR should be filled with a token for the dynamically loaded file, and the \fIunloadProcPtr\fR should be filled in with the address of a procedure. The procedure will be called with the given clientData as its only parameter when Tcl needs to unload the file. | < < | | < < | 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 | a binary code file into memory and returns the addresses of two procedures within that file, if they are defined. On a successful load, the \fIclientDataPtr\fR should be filled with a token for the dynamically loaded file, and the \fIunloadProcPtr\fR should be filled in with the address of a procedure. The procedure will be called with the given clientData as its only parameter when Tcl needs to unload the file. .SH UNLOADFILEPROC .PP Function to unload a previously successfully loaded file. If load was implemented, then this should also be implemented, if there is any cleanup action required. .PP .CS typedef void Tcl_FSUnloadFileProc( ClientData \fIclientData\fR); .CE .SH GETCWDPROC .PP Function to process a \fBTcl_FSGetCwd()\fR call. Most filesystems need not implement this. It will usually only be called once, if 'getcwd' is called before 'chdir'. May be NULL. .PP .CS typedef Tcl_Obj* Tcl_FSGetCwdProc( Tcl_Interp *\fIinterp\fR); .CE .PP If the filesystem supports a native notion of a current working directory (which might perhaps change independent of Tcl), this function should return that cwd as the result, or NULL if the current directory could not be determined (e.g. the user does not have appropriate permissions on the cwd directory). If NULL is returned, an error message is left in the interp's result. .PP .SH CHDIRPROC .PP Function to process a \fBTcl_FSChdir()\fR call. If filesystems do not implement this, it will be emulated by a series of directory access checks. Otherwise, virtual filesystems which do implement it need only respond with a positive return result if the dirName is a valid directory in their filesystem. They need not remember the result, since that will be automatically remembered for use by GetCwd. Real filesystems should carry out the correct action (i.e. call the correct system 'chdir' api). If not implemented, then 'cd' and 'pwd' will fail inside the filesystem. .PP .CS typedef int Tcl_FSChdirProc( Tcl_Obj *\fIpathPtr\fR); .CE .PP The \fBTcl_FSChdirProc\fR changes the applications current working directory to the value specified in \fIpathPtr\fR. The function returns -1 on error or 0 on success. .SH KEYWORDS stat access filesystem vfs |
Changes to doc/GetCwd.3.
1 | '\" | | | | | 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 | '\" '\" Copyright (c) 1998-1999 Scriptics Corporation '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: GetCwd.3,v 1.2.28.1 2002/02/05 02:21:57 wolfsuit Exp $ '\" .so man.macros .TH Tcl_GetCwd 3 8.1 Tcl "Tcl Library Procedures" .BS .SH NAME Tcl_GetCwd, Tcl_Chdir \- manipulate the current working directory .SH SYNOPSIS .nf \fB#include <tcl.h>\fR .sp CONST char * \fBTcl_GetCwd\fR(\fIinterp\fR, \fIbufferPtr\fR) .sp int \fBTcl_Chdir\fR(\fIpath\fR) .SH ARGUMENTS .AS Tcl_DString *bufferPtr .AP Tcl_Interp *interp in |
| ︙ | ︙ |
Changes to doc/GetHostName.3.
1 2 3 4 | '\" '\" Copyright (c) 1998-2000 by Scriptics Corporation. '\" All rights reserved. '\" | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | '\" '\" Copyright (c) 1998-2000 by Scriptics Corporation. '\" All rights reserved. '\" '\" RCS: @(#) $Id: GetHostName.3,v 1.1.18.1 2002/02/05 02:21:57 wolfsuit Exp $ '\" .so man.macros .TH Tcl_GetHostName 3 8.3 Tcl "Tcl Library Procedures" .BS .SH NAME Tcl_GetHostName \- get the name of the local host .SH SYNOPSIS .nf \fB#include <tcl.h>\fR .sp CONST char * \fBTcl_GetHostName\fR() .SH DESCRIPTION .PP \fBTcl_GetHostName\fR is a utility procedure used by some of the Tcl commands. It returns a pointer to a string containing the name for the current machine, or an empty string if the name cannot be |
| ︙ | ︙ |
Changes to doc/GetIndex.3.
1 2 3 4 5 6 | '\" '\" Copyright (c) 1997 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | | | | 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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | '\" '\" Copyright (c) 1997 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: GetIndex.3,v 1.6.14.1 2002/02/05 02:21:57 wolfsuit Exp $ '\" .so man.macros .TH Tcl_GetIndexFromObj 3 8.1 Tcl "Tcl Library Procedures" .BS .SH NAME Tcl_GetIndexFromObj, Tcl_GetIndexFromObjStruct \- lookup string in table of keywords .SH SYNOPSIS .nf \fB#include <tcl.h>\fR .sp int \fBTcl_GetIndexFromObj\fR(\fIinterp, objPtr, tablePtr, msg, flags, indexPtr\fR) .VS .sp int \fBTcl_GetIndexFromObjStruct\fR(\fIinterp, objPtr, tablePtr, offset, msg, flags, indexPtr\fR) .VE .SH ARGUMENTS .AS "CONST char" **tablePtr .AP Tcl_Interp *interp in Interpreter to use for error reporting; if NULL, then no message is provided on errors. .AP Tcl_Obj *objPtr in/out The string value of this object is used to search through \fItablePtr\fR. The internal representation is modified to hold the index of the matching table entry. .AP "CONST char" **tablePtr in An array of null-terminated strings. The end of the array is marked by a NULL string pointer. .VS .AP int offset in The offset to add to tablePtr to get to the next string in the list. The end of the array is marked by a NULL string pointer. .VE .AP "CONST char" *msg in Null-terminated string describing what is being looked up, such as \fBoption\fR. This string is included in error messages. .AP int flags in OR-ed combination of bits providing additional information for operation. The only bit that is currently defined is \fBTCL_EXACT\fR. .AP int *indexPtr out The index of the string in \fItablePtr\fR that matches the value of |
| ︙ | ︙ |
Changes to doc/GetOpnFl.3.
1 2 3 4 5 6 | '\" '\" Copyright (c) 1996-1997 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | | 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 | '\" '\" Copyright (c) 1996-1997 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: GetOpnFl.3,v 1.3.18.1 2002/02/05 02:21:57 wolfsuit Exp $ .so man.macros .TH Tcl_GetOpenFile 3 8.0 Tcl "Tcl Library Procedures" .BS .SH NAME Tcl_GetOpenFile \- Get a standard IO File * handle from a channel. (Unix only) .SH SYNOPSIS .nf \fB#include <tcl.h>\fR .sp int \fBTcl_GetOpenFile\fR(\fIinterp, string, write, checkUsage, filePtr\fR) .sp .SH ARGUMENTS .AS Tcl_Interp checkUsage .AP Tcl_Interp *interp in Tcl interpreter from which file handle is to be obtained. .AP "CONST char" *string in String identifying channel, such as \fBstdin\fR or \fBfile4\fR. .AP int write in Non-zero means the file will be used for writing, zero means it will be used for reading. .AP int checkUsage in If non-zero, then an error will be generated if the file wasn't opened for the access indicated by \fIwrite\fR. |
| ︙ | ︙ |
Changes to doc/GetStdChan.3.
1 2 3 4 5 6 | '\" '\" Copyright (c) 1996 by Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | '\" '\" Copyright (c) 1996 by Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: GetStdChan.3,v 1.3.6.1 2002/02/05 02:21:57 wolfsuit Exp $ '\" .so man.macros .TH Tcl_GetStdChannel 3 7.5 Tcl "Tcl Library Procedures" .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME Tcl_GetStdChannel, Tcl_SetStdChannel \- procedures for retrieving and replacing the standard channels |
| ︙ | ︙ | |||
62 63 64 65 66 67 68 | \fBTcl_SetStdChannel\fR with a NULL \fIchannel\fR argument, or by calling \fBTcl_Close\fR on the channel, then the next call to \fBTcl_CreateChannel\fR will automatically set the standard channel with the newly created channel. If more than one standard channel is NULL, then the standard channels will be assigned starting with standard input, followed by standard output, with standard error being last. .PP | | | 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | \fBTcl_SetStdChannel\fR with a NULL \fIchannel\fR argument, or by calling \fBTcl_Close\fR on the channel, then the next call to \fBTcl_CreateChannel\fR will automatically set the standard channel with the newly created channel. If more than one standard channel is NULL, then the standard channels will be assigned starting with standard input, followed by standard output, with standard error being last. .PP See \fBTcl_StandardChannels\fR for a general treatise about standard channels and the behaviour of the Tcl library with regard to them. .PP .SH "SEE ALSO" Tcl_Close(3), Tcl_CreateChannel(3), Tcl_Main(3), tclsh(1) .SH KEYWORDS standard channel, standard input, standard output, standard error |
Added doc/GetTime.3.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
'\"
'\" Copyright (c) 2001 by Kevin B. Kenny.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\"
'\" RCS: @(#) $Id$
'\"
.so man.macros
.TH Tcl_GetTime 3 8.4 Tcl "Tcl Library Procedures"
.BS
.SH NAME
Tcl_GetTime \- get date and time
.SH SYNOPSIS
.nf
\fB#include <tcl.h>\fR
.sp
\fBTcl_GetTime\fR(\fI timePtr \fR)
.SH ARGUMENTS
.AS "Tcl_Time *" timePtr
.AP "Tcl_Time *" timePtr out
Points to memory in which to store the date and time information.
.BE
.SH DESCRIPTION
.PP
The \fBTcl_GetTime\fR function retrieves the current time as a
\fITcl_Time\fR structure in memory the caller provides. This
structure has the following definition:
.CS
typedef struct Tcl_Time {
long sec;
long usec;
} Tcl_Time;
.CE
.PP
On return, the \fIsec\fR member of the structure is filled in with the
number of seconds that have elapsed since the \fIepoch:\fR the epoch
is the point in time of 00:00 UTC, 1 January 1970. This number does
\fInot\fR count leap seconds \- an interval of one day advances it by
86400 seconds regardless of whether a leap second has been inserted.
.PP
The \fIusec\fR member of the structure is filled in with the number of
microseconds that have elapsed since the start of the second
designated by \fIsec\fR. The Tcl library makes every effort to keep
this number as precise as possible, subject to the limitations of the
computer system. On multiprocessor variants of Windows, this number
may be limited to the 10- or 20-ms granularity of the system clock.
(On single-processor Windows systems, the \fIusec\fR field is derived
from a performance counter and is highly precise.)
.SH "SEE ALSO"
clock
.SH KEYWORDS
date, time
|
Changes to doc/GetVersion.3.
1 2 3 4 5 6 | '\" '\" Copyright (c) 1999 Scriptics Corporation '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | '\" '\" Copyright (c) 1999 Scriptics Corporation '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: GetVersion.3,v 1.2.28.1 2002/02/05 02:21:57 wolfsuit Exp $ '\" .so man.macros .TH Tcl_GetVersion 3 7.5 Tcl "Tcl Library Procedures" .BS .SH NAME Tcl_GetVersion \- get the version of the library at runtime .SH SYNOPSIS |
| ︙ | ︙ | |||
36 37 38 39 40 41 42 | dynamically loaded Tcl library or when writing a stubs-aware extension. For instance, if you write an extension that is linked against the Tcl stubs library, it could be loaded into a program linked to an older version of Tcl than you expected. Use \fBTcl_GetVersion\fR to verify that fact, and possibly to change the behavior of your extension. .PP | | | 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | dynamically loaded Tcl library or when writing a stubs-aware extension. For instance, if you write an extension that is linked against the Tcl stubs library, it could be loaded into a program linked to an older version of Tcl than you expected. Use \fBTcl_GetVersion\fR to verify that fact, and possibly to change the behavior of your extension. .PP \fBTcl_GetVersion\fR accepts NULL for any of the arguments. For instance if you do not care about the \fIpatchLevel\fR of the library, pass a NULL for the \fIpatchLevel\fR argument. .SH KEYWORDS version, patchlevel, major, minor, alpha, beta, release |
Changes to doc/Hash.3.
1 2 3 4 5 6 7 | '\" '\" Copyright (c) 1989-1993 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | '\" '\" Copyright (c) 1989-1993 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: Hash.3,v 1.8.14.1 2002/02/05 02:21:57 wolfsuit Exp $ '\" .so man.macros .TH Tcl_Hash 3 "" Tcl "Tcl Library Procedures" .BS .SH NAME Tcl_InitHashTable, Tcl_InitCustomHashTable, Tcl_InitObjHashTable, Tcl_DeleteHashTable, Tcl_CreateHashEntry, Tcl_DeleteHashEntry, Tcl_FindHashEntry, Tcl_GetHashValue, Tcl_SetHashValue, Tcl_GetHashKey, Tcl_FirstHashEntry, Tcl_NextHashEntry, Tcl_HashStats \- procedures to manage hash tables .SH SYNOPSIS |
| ︙ | ︙ | |||
42 43 44 45 46 47 48 | .sp Tcl_HashEntry * \fBTcl_FirstHashEntry\fR(\fItablePtr, searchPtr\fR) .sp Tcl_HashEntry * \fBTcl_NextHashEntry\fR(\fIsearchPtr\fR) .sp | | | 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | .sp Tcl_HashEntry * \fBTcl_FirstHashEntry\fR(\fItablePtr, searchPtr\fR) .sp Tcl_HashEntry * \fBTcl_NextHashEntry\fR(\fIsearchPtr\fR) .sp CONST char * \fBTcl_HashStats\fR(\fItablePtr\fR) .SH ARGUMENTS .AS Tcl_HashSearch *searchPtr .AP Tcl_HashTable *tablePtr in Address of hash table structure (for all procedures but \fBTcl_InitHashTable\fR, this must have been initialized by previous call to \fBTcl_InitHashTable\fR). |
| ︙ | ︙ |
Changes to doc/InitStubs.3.
1 | '\" | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | '\" '\" Copyright (c) 1998-1999 Scriptics Corporation '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: InitStubs.3,v 1.6.4.1 2002/02/05 02:21:57 wolfsuit Exp $ '\" .so man.macros .TH Tcl_InitStubs 3 8.1 Tcl "Tcl Library Procedures" .BS .SH NAME Tcl_InitStubs \- initialize the Tcl stubs mechanism .SH SYNOPSIS |
| ︙ | ︙ |
Changes to doc/Macintosh.3.
1 2 3 4 5 6 | '\" '\" Copyright (c) 1997-1998 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | '\" '\" Copyright (c) 1997-1998 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: Macintosh.3,v 1.3.12.1 2002/02/05 02:21:57 wolfsuit Exp $ '\" .so man.macros .TH Tcl_MacSetEventProc 3 "8.1" Tcl "Tcl Library Procedures" .BS .SH NAME Tcl_MacSetEventProc, Tcl_MacConvertTextResource, Tcl_MacEvalResource, Tcl_MacFindResource, Tcl_GetOSTypeFromObj, Tcl_SetOSTypeObj, Tcl_NewOSTypeObj \- procedures to handle Macintosh resources and other Macintosh specifics .SH SYNOPSIS |
| ︙ | ︙ | |||
35 36 37 38 39 40 41 | .sp void \fBTcl_MacSetEventProc\fR(\fIprocPtr\fR) .SH ARGUMENTS .AP Tcl_Interp *interp in Interpreter to use for error reporting, or NULL if no error reporting is desired. | | | | | 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | .sp void \fBTcl_MacSetEventProc\fR(\fIprocPtr\fR) .SH ARGUMENTS .AP Tcl_Interp *interp in Interpreter to use for error reporting, or NULL if no error reporting is desired. .AP "CONST char" *resourceName in Name of TEXT resource to source, NULL if number should be used. .AP int resourceNumber in Resource id of source. .AP "CONST char" *fileName in Name of file to process. NULL if application resource. .AP Handle resource in Handle to TEXT resource. .AP long resourceType in Type of resource to load. .AP "CONST char" *resFileRef in Registered resource file reference, NULL if searching all open resource files. .AP int *releaseIt out Should we release this resource when done. .AP int newOSType in Int used to initialize the new object or set the object's value. .AP Tcl_Obj *objPtr in Object whose internal representation is to be set or retrieved. |
| ︙ | ︙ |
Changes to doc/ObjectType.3.
1 2 3 4 5 6 | '\" '\" Copyright (c) 1996-1997 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | '\" '\" Copyright (c) 1996-1997 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: ObjectType.3,v 1.3.14.1 2002/02/05 02:21:57 wolfsuit Exp $ '\" .so man.macros .TH Tcl_ObjType 3 8.0 Tcl "Tcl Library Procedures" .BS .SH NAME Tcl_RegisterObjType, Tcl_GetObjType, Tcl_AppendAllObjTypes, Tcl_ConvertToType \- manipulate Tcl object types .SH SYNOPSIS |
| ︙ | ︙ | |||
25 26 27 28 29 30 31 | .sp int \fBTcl_ConvertToType\fR(\fIinterp, objPtr, typePtr\fR) .SH ARGUMENTS .AS Tcl_ObjType *typeName in .AP Tcl_ObjType *typePtr in Points to the structure containing information about the Tcl object type. | | | | 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | .sp int \fBTcl_ConvertToType\fR(\fIinterp, objPtr, typePtr\fR) .SH ARGUMENTS .AS Tcl_ObjType *typeName in .AP Tcl_ObjType *typePtr in Points to the structure containing information about the Tcl object type. This storage must live forever, typically by being statically allocated. .AP "CONST char" *typeName in The name of a Tcl object type that \fBTcl_GetObjType\fR should look up. .AP Tcl_Interp *interp in Interpreter to use for error reporting. .AP Tcl_Obj *objPtr in For \fBTcl_AppendAllObjTypes\fR, this points to the object onto which it appends the name of each object type as a list element. For \fBTcl_ConvertToType\fR, this points to an object that |
| ︙ | ︙ |
Changes to doc/OpenFileChnl.3.
1 2 3 4 5 6 | '\" '\" Copyright (c) 1996-1997 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | < < | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | '\" '\" Copyright (c) 1996-1997 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: OpenFileChnl.3,v 1.13.4.1 2002/02/05 02:21:57 wolfsuit Exp $ .so man.macros .TH Tcl_OpenFileChannel 3 8.3 Tcl "Tcl Library Procedures" .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME Tcl_OpenFileChannel, Tcl_OpenCommandChannel, Tcl_MakeFileChannel, Tcl_GetChannel, Tcl_GetChannelNames, Tcl_GetChannelNamesEx, Tcl_RegisterChannel, Tcl_UnregisterChannel, Tcl_DetachChannel, Tcl_IsStandardChannel, Tcl_Close, Tcl_ReadChars, Tcl_Read, Tcl_GetsObj, Tcl_Gets, Tcl_WriteObj, Tcl_WriteChars, Tcl_Write, Tcl_Flush, Tcl_Seek, Tcl_Tell, Tcl_GetChannelOption, Tcl_SetChannelOption, Tcl_Eof, Tcl_InputBlocked, Tcl_InputBuffered, Tcl_OutputBuffered, Tcl_Ungets, Tcl_ReadRaw, Tcl_WriteRaw \- buffered I/O facilities using channels .SH SYNOPSIS .nf \fB#include <tcl.h>\fR .sp Tcl_Channel \fBTcl_OpenFileChannel\fR(\fIinterp, fileName, mode, permissions\fR) .sp Tcl_Channel \fBTcl_OpenCommandChannel\fR(\fIinterp, argc, argv, flags\fR) .sp Tcl_Channel |
| ︙ | ︙ | |||
53 54 55 56 57 58 59 | \fBTcl_Close\fR(\fIinterp, channel\fR) .sp .VS 8.1 int \fBTcl_ReadChars\fR(\fIchannel, readObjPtr, charsToRead, appendFlag\fR) .sp int | | | 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | \fBTcl_Close\fR(\fIinterp, channel\fR) .sp .VS 8.1 int \fBTcl_ReadChars\fR(\fIchannel, readObjPtr, charsToRead, appendFlag\fR) .sp int \fBTcl_Read\fR(\fIchannel, readBuf, bytesToRead\fR) .sp int \fBTcl_GetsObj\fR(\fIchannel, lineObjPtr\fR) .sp int \fBTcl_Gets\fR(\fIchannel, lineRead\fR) .sp |
| ︙ | ︙ | |||
76 77 78 79 80 81 82 | .sp int \fBTcl_Write\fR(\fIchannel, byteBuf, bytesToWrite\fR) .VE .VS 8.3.2 .sp int | | | | 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | .sp int \fBTcl_Write\fR(\fIchannel, byteBuf, bytesToWrite\fR) .VE .VS 8.3.2 .sp int \fBTcl_ReadRaw\fR(\fIchannel, readBuf, bytesToRead\fR) .sp int \fBTcl_WriteRaw\fR(\fIchannel, byteBuf, bytesToWrite\fR) .VE .sp int \fBTcl_Eof\fR(\fIchannel\fR) .sp int \fBTcl_Flush\fR(\fIchannel\fR) |
| ︙ | ︙ | |||
115 116 117 118 119 120 121 | int \fBTcl_SetChannelOption\fR(\fIinterp, channel, optionName, newValue\fR) .sp .SH ARGUMENTS .AS Tcl_ChannelType newClientProcPtr in .AP Tcl_Interp *interp in Used for error reporting and to look up a channel registered in it. | | | | < | | > > > > | 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 | int \fBTcl_SetChannelOption\fR(\fIinterp, channel, optionName, newValue\fR) .sp .SH ARGUMENTS .AS Tcl_ChannelType newClientProcPtr in .AP Tcl_Interp *interp in Used for error reporting and to look up a channel registered in it. .AP "CONST char" *fileName in The name of a local or network file. .AP "CONST char" *mode in Specifies how the file is to be accessed. May have any of the values allowed for the \fImode\fR argument to the Tcl \fBopen\fR command. .AP int permissions in POSIX-style permission flags such as 0644. If a new file is created, these permissions will be set on the created file. .AP int argc in The number of elements in \fIargv\fR. .AP "CONST char" **argv in Arguments for constructing a command pipeline. These values have the same meaning as the non-switch arguments to the Tcl \fBexec\fR command. .AP int flags in Specifies the disposition of the stdio handles in pipeline: OR-ed combination of \fBTCL_STDIN\fR, \fBTCL_STDOUT\fR, \fBTCL_STDERR\fR, and \fBTCL_ENFORCE_MODE\fR. If \fBTCL_STDIN\fR is set, stdin for the first child in the pipe is the pipe channel, otherwise it is the same as the standard input of the invoking process; likewise for \fBTCL_STDOUT\fR and \fBTCL_STDERR\fR. If \fBTCL_ENFORCE_MODE\fR is not set, then the pipe can redirect stdio handles to override the stdio handles for which \fBTCL_STDIN\fR, \fBTCL_STDOUT\fR and \fBTCL_STDERR\fR have been set. If it is set, then such redirections cause an error. .AP ClientData handle in Operating system specific handle for I/O to a file. For Unix this is a file descriptor, for Windows it is a HANDLE. .AP int readOrWrite in OR-ed combination of \fBTCL_READABLE\fR and \fBTCL_WRITABLE\fR to indicate what operations are valid on \fIhandle\fR. .AP "CONST char" *channelName in The name of the channel. .AP int *modePtr out Points at an integer variable that will receive an OR-ed combination of \fBTCL_READABLE\fR and \fBTCL_WRITABLE\fR denoting whether the channel is open for reading and writing. .VS 8.3 .AP "CONST char" *pattern in The pattern to match on, passed to Tcl_StringMatch, or NULL. .VE .AP Tcl_Channel channel in A Tcl channel for input or output. Must have been the return value from a procedure such as \fBTcl_OpenFileChannel\fR. .VS 8.1 br .AP Tcl_Obj *readObjPtr in/out A pointer to a Tcl Object in which to store the characters read from the channel. |
| ︙ | ︙ | |||
178 179 180 181 182 183 184 185 186 187 188 | A pointer to a Tcl object in which to store the line read from the channel. The line read will be appended to the current value of the object. .AP Tcl_DString *lineRead in/out A pointer to a Tcl dynamic string in which to store the line read from the channel. Must have been initialized by the caller. The line read will be appended to any data already in the dynamic string. .AP Tcl_Obj *writeObjPtr in A pointer to a Tcl Object whose contents will be output to the channel. .AP "CONST char" *charBuf in A buffer containing the characters to output to the channel. | > > > > > > > > > | | | < < < < < < < < < < < | 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 | A pointer to a Tcl object in which to store the line read from the channel. The line read will be appended to the current value of the object. .AP Tcl_DString *lineRead in/out A pointer to a Tcl dynamic string in which to store the line read from the channel. Must have been initialized by the caller. The line read will be appended to any data already in the dynamic string. .VS 8.3 .AP "CONST char" *input in The input to add to a channel buffer. .AP int inputLen in Length of the input .AP int addAtEnd in Flag indicating whether the input should be added to the end or beginning of the channel buffer. .VE .AP Tcl_Obj *writeObjPtr in A pointer to a Tcl Object whose contents will be output to the channel. .AP "CONST char" *charBuf in A buffer containing the characters to output to the channel. .AP "CONST char" *byteBuf in A buffer containing the bytes to output to the channel. .AP int bytesToWrite in The number of bytes to consume from \fIcharBuf\fR or \fIbyteBuf\fR and output to the channel. .VE .AP int offset in How far to move the access point in the channel at which the next input or output operation will be applied, measured in bytes from the position given by \fIseekMode\fR. May be either positive or negative. .AP int seekMode in Relative to which point to seek; used with \fIoffset\fR to calculate the new access point for the channel. Legal values are \fBSEEK_SET\fR, \fBSEEK_CUR\fR, and \fBSEEK_END\fR. .AP "CONST char" *optionName in The name of an option applicable to this channel, such as \fB\-blocking\fR. May have any of the values accepted by the \fBfconfigure\fR command. .AP Tcl_DString *optionValue in Where to store the value of an option or a list of all options and their values. Must have been initialized by the caller. .AP "CONST char" *newValue in New value for the option given by \fIoptionName\fR. .BE .SH DESCRIPTION .PP The Tcl channel mechanism provides a device-independent and platform-independent mechanism for performing buffered input and output operations on a variety of file, socket, and device |
| ︙ | ︙ | |||
312 313 314 315 316 317 318 | replacement for the standard channel. .SH TCL_GETCHANNEL .PP \fBTcl_GetChannel\fR returns a channel given the \fIchannelName\fR used to create it with \fBTcl_CreateChannel\fR and a pointer to a Tcl interpreter in \fIinterp\fR. If a channel by that name is not registered in that interpreter, | | | 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 | replacement for the standard channel. .SH TCL_GETCHANNEL .PP \fBTcl_GetChannel\fR returns a channel given the \fIchannelName\fR used to create it with \fBTcl_CreateChannel\fR and a pointer to a Tcl interpreter in \fIinterp\fR. If a channel by that name is not registered in that interpreter, the procedure returns NULL. If the \fImodePtr\fR argument is not NULL, it points at an integer variable that will receive an OR-ed combination of \fBTCL_READABLE\fR and \fBTCL_WRITABLE\fR describing whether the channel is open for reading and writing. .PP \fBTcl_GetChannelNames\fR and \fBTcl_GetChannelNamesEx\fR write the names of the registered channels to the interpreter's result as a list object. \fBTcl_GetChannelNamesEx\fR will filter these names |
| ︙ | ︙ | |||
346 347 348 349 350 351 352 | matching number of calls to \fBTcl_UnregisterChannel\fR have been made. This allows code executing outside of any interpreter to safely hold a reference to a channel that is also registered in a Tcl interpreter. .PP This procedure interacts with the code managing the standard channels. If no standard channels were initialized before the first call to \fBTcl_RegisterChannel\fR they will get initialized by that | | | 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 | matching number of calls to \fBTcl_UnregisterChannel\fR have been made. This allows code executing outside of any interpreter to safely hold a reference to a channel that is also registered in a Tcl interpreter. .PP This procedure interacts with the code managing the standard channels. If no standard channels were initialized before the first call to \fBTcl_RegisterChannel\fR they will get initialized by that call. See \fBTcl_StandardChannels\fR for a general treatise about standard channels and the behaviour of the Tcl library with regard to them. .SH TCL_UNREGISTERCHANNEL .PP \fBTcl_UnregisterChannel\fR removes a channel from the set of channels accessible in \fIinterp\fR. After this call, Tcl programs will no longer be |
| ︙ | ︙ | |||
426 427 428 429 430 431 432 | .VS 8.1 br .SH "TCL_READCHARS AND TCL_READ" .PP \fBTcl_ReadChars\fR consumes bytes from \fIchannel\fR, converting the bytes to UTF-8 based on the channel's encoding and storing the produced data in \fIreadObjPtr\fR's string representation. The return value of \fBTcl_ReadChars\fR is the number of characters, up to \fIcharsToRead\fR, | | | 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 | .VS 8.1 br .SH "TCL_READCHARS AND TCL_READ" .PP \fBTcl_ReadChars\fR consumes bytes from \fIchannel\fR, converting the bytes to UTF-8 based on the channel's encoding and storing the produced data in \fIreadObjPtr\fR's string representation. The return value of \fBTcl_ReadChars\fR is the number of characters, up to \fIcharsToRead\fR, that were stored in \fIreadObjPtr\fR. If an error occurs while reading, the return value is \-1 and \fBTcl_ReadChars\fR records a POSIX error code that can be retrieved with \fBTcl_GetErrno\fR. .PP The return value may be smaller than the value to read, indicating that less data than requested was available. This is called a \fIshort read\fR. In blocking mode, this can only happen on an end-of-file. In nonblocking mode, a short read can also occur if there is not enough input currently |
| ︙ | ︙ | |||
463 464 465 466 467 468 469 | related functions, and then written to a channel without the expense of ever converting to or from UTF-8. .PP \fBTcl_Read\fR is similar to \fBTcl_ReadChars\fR, except that it doesn't do encoding conversions, regardless of the channel's encoding. It is deprecated and exists for backwards compatibility with non-internationalized Tcl extensions. It consumes bytes from \fIchannel\fR and stores them in | | | | | 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 | related functions, and then written to a channel without the expense of ever converting to or from UTF-8. .PP \fBTcl_Read\fR is similar to \fBTcl_ReadChars\fR, except that it doesn't do encoding conversions, regardless of the channel's encoding. It is deprecated and exists for backwards compatibility with non-internationalized Tcl extensions. It consumes bytes from \fIchannel\fR and stores them in \fIreadBuf\fR, performing end-of-line translations on the way. The return value of \fBTcl_Read\fR is the number of bytes, up to \fIbytesToRead\fR, written in \fIreadBuf\fR. The buffer produced by \fBTcl_Read\fR is not NULL terminated. Its contents are valid from the zeroth position up to and excluding the position indicated by the return value. .PP \fBTcl_ReadRaw\fR is the same as \fBTcl_Read\fR but does not compensate for stacking. While \fBTcl_Read\fR (and the other functions in the API) always get their data from the topmost channel in the stack the supplied channel is part of, \fBTcl_ReadRaw\fR does |
| ︙ | ︙ | |||
501 502 503 504 505 506 507 | If the channel is in nonblocking mode, the return value can also be \-1 if no data was available or the data that was available did not contain an end-of-line character. When \-1 is returned, the \fBTcl_InputBlocked\fR procedure may be invoked to determine if the channel is blocked because of input unavailability. .PP \fBTcl_Gets\fR is the same as \fBTcl_GetsObj\fR except the resulting | | | | | | | | 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 | If the channel is in nonblocking mode, the return value can also be \-1 if no data was available or the data that was available did not contain an end-of-line character. When \-1 is returned, the \fBTcl_InputBlocked\fR procedure may be invoked to determine if the channel is blocked because of input unavailability. .PP \fBTcl_Gets\fR is the same as \fBTcl_GetsObj\fR except the resulting characters are appended to the dynamic string given by \fIlineRead\fR rather than a Tcl object. .SH "TCL_UNGETS" .PP \fBTcl_Ungets\fR is used to add data to the input queue of a channel, at either the head or tail of the queue. The pointer \fIinput\fR points to the data that is to be added. The length of the input to add is given by \fIinputLen\fR. A non-zero value of \fIaddAtEnd\fR indicates that the data is to be added at the end of queue; otherwise it will be added at the head of the queue. If \fIchannel\fR has a "sticky" EOF set, no data will be added to the input queue. \fBTcl_Ungets\fR returns \fIinputLen\fR or -1 if an error occurs. .SH "TCL_WRITECHARS, TCL_WRITEOBJ, AND TCL_WRITE" .PP \fBTcl_WriteChars\fR accepts \fIbytesToWrite\fR bytes of character data at |
| ︙ | ︙ | |||
603 604 605 606 607 608 609 | .SH TCL_TELL .PP \fBTcl_Tell\fR returns the current access point for a channel. The returned value is \-1 if the channel does not support seeking. .SH TCL_GETCHANNELOPTION .PP | | | 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 | .SH TCL_TELL .PP \fBTcl_Tell\fR returns the current access point for a channel. The returned value is \-1 if the channel does not support seeking. .SH TCL_GETCHANNELOPTION .PP \fBTcl_GetChannelOption\fR retrieves, in \fIoptionValue\fR, the value of one of the options currently in effect for a channel, or a list of all options and their values. The \fIchannel\fR argument identifies the channel for which to query an option or retrieve all options and their values. If \fIoptionName\fR is not NULL, it is the name of the option to query; the option's value is copied to the Tcl dynamic string denoted by \fIoptionValue\fR. If \fIoptionName\fR is NULL, the function stores an alternating list of option |
| ︙ | ︙ | |||
625 626 627 628 629 630 631 | for the Tcl \fBsocket\fR command. The procedure normally returns \fBTCL_OK\fR. If an error occurs, it returns \fBTCL_ERROR\fR and calls \fBTcl_SetErrno\fR to store an appropriate POSIX error code. .SH TCL_SETCHANNELOPTION .PP | | | < | 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 | for the Tcl \fBsocket\fR command. The procedure normally returns \fBTCL_OK\fR. If an error occurs, it returns \fBTCL_ERROR\fR and calls \fBTcl_SetErrno\fR to store an appropriate POSIX error code. .SH TCL_SETCHANNELOPTION .PP \fBTcl_SetChannelOption\fR sets a new value \fInewValue\fR for an option \fIoptionName\fR on \fIchannel\fR. The procedure normally returns \fBTCL_OK\fR. If an error occurs, it returns \fBTCL_ERROR\fR; in addition, if \fIinterp\fR is non-NULL, \fBTcl_SetChannelOption\fR leaves an error message in the interpreter's result. .SH TCL_EOF .PP \fBTcl_Eof\fR returns a nonzero value if \fIchannel\fR encountered |
| ︙ | ︙ |
Changes to doc/OpenTcp.3.
1 2 3 4 5 6 | '\" '\" Copyright (c) 1996-7 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | '\" '\" Copyright (c) 1996-7 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: OpenTcp.3,v 1.3.18.1 2002/02/05 02:21:57 wolfsuit Exp $ .so man.macros .TH Tcl_OpenTcpClient 3 8.0 Tcl "Tcl Library Procedures" .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME Tcl_OpenTcpClient, Tcl_MakeTcpClientChannel, Tcl_OpenTcpServer \- procedures to open channels using TCP sockets .SH SYNOPSIS |
| ︙ | ︙ | |||
27 28 29 30 31 32 33 | .SH ARGUMENTS .AS Tcl_ChannelType newClientProcPtr in .AP Tcl_Interp *interp in Tcl interpreter to use for error reporting. If non-NULL and an error occurs, an error message is left in the interpreter's result. .AP int port in A port number to connect to as a client or to listen on as a server. | | | | 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | .SH ARGUMENTS .AS Tcl_ChannelType newClientProcPtr in .AP Tcl_Interp *interp in Tcl interpreter to use for error reporting. If non-NULL and an error occurs, an error message is left in the interpreter's result. .AP int port in A port number to connect to as a client or to listen on as a server. .AP "CONST char" *host in A string specifying a host name or address for the remote end of the connection. .AP int myport in A port number for the client's end of the socket. If 0, a port number is allocated at random. .AP "CONST char" *myaddr in A string specifying the host name or address for network interface to use for the local end of the connection. If NULL, a default interface is chosen. .AP int async in If nonzero, the client socket is connected asynchronously to the server. .AP ClientData sock in Platform-specific handle for client TCP socket. |
| ︙ | ︙ |
Changes to doc/ParseCmd.3.
1 2 3 4 5 6 | '\" '\" Copyright (c) 1997 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | '\" '\" Copyright (c) 1997 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: ParseCmd.3,v 1.7.4.1 2002/02/05 02:21:57 wolfsuit Exp $ '\" .so man.macros .TH Tcl_ParseCommand 3 8.3 Tcl "Tcl Library Procedures" .BS .SH NAME Tcl_ParseCommand, Tcl_ParseExpr, Tcl_ParseBraces, Tcl_ParseQuotedString, Tcl_ParseVarName, Tcl_ParseVar, Tcl_FreeParse, Tcl_EvalTokens, Tcl_EvalTokensStandard \- parse Tcl scripts and expressions .SH SYNOPSIS |
| ︙ | ︙ | |||
26 27 28 29 30 31 32 | .sp int \fBTcl_ParseQuotedString\fR(\fIinterp, string, numBytes, parsePtr, append, termPtr\fR) .sp int \fBTcl_ParseVarName\fR(\fIinterp, string, numBytes, parsePtr, append\fR) .sp | | | 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | .sp int \fBTcl_ParseQuotedString\fR(\fIinterp, string, numBytes, parsePtr, append, termPtr\fR) .sp int \fBTcl_ParseVarName\fR(\fIinterp, string, numBytes, parsePtr, append\fR) .sp CONST char * \fBTcl_ParseVar\fR(\fIinterp, string, termPtr\fR) .sp \fBTcl_FreeParse\fR(\fIusedParsePtr\fR) .sp Tcl_Obj * \fBTcl_EvalTokens\fR(\fIinterp, tokenPtr, numTokens\fR) .sp |
| ︙ | ︙ |
Changes to doc/Preserve.3.
1 2 3 4 5 6 7 | '\" '\" Copyright (c) 1990 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | '\" '\" Copyright (c) 1990 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: Preserve.3,v 1.2.34.1 2002/02/05 02:21:58 wolfsuit Exp $ '\" .so man.macros .TH Tcl_Preserve 3 7.5 Tcl "Tcl Library Procedures" .BS .SH NAME Tcl_Preserve, Tcl_Release, Tcl_EventuallyFree \- avoid freeing storage while it's being used .SH SYNOPSIS |
| ︙ | ︙ | |||
84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | typedef void Tcl_FreeProc(char *\fIblockPtr\fR); .CE The \fIblockPtr\fR argument to \fIfreeProc\fR will be the same as the \fIclientData\fR argument to \fBTcl_EventuallyFree\fR. The type of \fIblockPtr\fR (\fBchar *\fR) is different than the type of the \fIclientData\fR argument to \fBTcl_EventuallyFree\fR for historical reasons, but the value is the same. .PP This mechanism can be used to solve the problem described above by placing \fBTcl_Preserve\fR and \fBTcl_Release\fR calls around actions that may cause undesired storage re-allocation. The mechanism is intended only for short-term use (i.e. while procedures are pending on the stack); it will not work efficiently as a mechanism for long-term reference counts. The implementation does not depend in any way on the internal structure of the objects being freed; it keeps the reference counts in a separate structure. .SH KEYWORDS free, reference count, storage | > > > > > > > > > | 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | typedef void Tcl_FreeProc(char *\fIblockPtr\fR); .CE The \fIblockPtr\fR argument to \fIfreeProc\fR will be the same as the \fIclientData\fR argument to \fBTcl_EventuallyFree\fR. The type of \fIblockPtr\fR (\fBchar *\fR) is different than the type of the \fIclientData\fR argument to \fBTcl_EventuallyFree\fR for historical reasons, but the value is the same. .PP When the \fIclientData\fR argument to \fBTcl_EventuallyFree\fR refers to storage allocated and returned by a prior call to \fBTcl_Alloc\fR or another function of the Tcl library, then the \fIfreeProc\fR argument should be given the special value of \fBTCL_DYNAMIC\fR. .PP This mechanism can be used to solve the problem described above by placing \fBTcl_Preserve\fR and \fBTcl_Release\fR calls around actions that may cause undesired storage re-allocation. The mechanism is intended only for short-term use (i.e. while procedures are pending on the stack); it will not work efficiently as a mechanism for long-term reference counts. The implementation does not depend in any way on the internal structure of the objects being freed; it keeps the reference counts in a separate structure. .SH "SEE ALSO" Tcl_Interp, Tcl_Alloc .SH KEYWORDS free, reference count, storage |
Changes to doc/RecordEval.3.
1 2 3 4 5 6 7 | '\" '\" Copyright (c) 1989-1993 The Regents of the University of California. '\" Copyright (c) 1994-1997 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | | 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 | '\" '\" Copyright (c) 1989-1993 The Regents of the University of California. '\" Copyright (c) 1994-1997 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: RecordEval.3,v 1.3.18.1 2002/02/05 02:21:58 wolfsuit Exp $ '\" .so man.macros .TH Tcl_RecordAndEval 3 7.4 Tcl "Tcl Library Procedures" .BS .SH NAME Tcl_RecordAndEval \- save command on history list before evaluating .SH SYNOPSIS .nf \fB#include <tcl.h>\fR .sp int \fBTcl_RecordAndEval\fR(\fIinterp, cmd, flags\fR) .SH ARGUMENTS .AS Tcl_Interp *interp; .AP Tcl_Interp *interp in Tcl interpreter in which to evaluate command. .AP "CONST char" *cmd in Command (or sequence of commands) to execute. .AP int flags in An OR'ed combination of flag bits. TCL_NO_EVAL means record the command but don't evaluate it. TCL_EVAL_GLOBAL means evaluate the command at global level instead of the current stack level. .BE |
| ︙ | ︙ |
Changes to doc/RegExp.3.
1 2 3 | '\" '\" Copyright (c) 1994 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | '\" '\" Copyright (c) 1994 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" Copyright (c) 1998-1999 Scriptics Corporation '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: RegExp.3,v 1.9.2.1 2002/02/05 02:21:58 wolfsuit Exp $ '\" .so man.macros .TH Tcl_RegExpMatch 3 8.1 Tcl "Tcl Library Procedures" .BS .SH NAME Tcl_RegExpMatch, Tcl_RegExpCompile, Tcl_RegExpExec, Tcl_RegExpRange, Tcl_GetRegExpFromObj, Tcl_RegExpMatchObj, Tcl_RegExpExecObj, Tcl_RegExpGetInfo \- Pattern matching with regular expressions .SH SYNOPSIS |
| ︙ | ︙ | |||
53 54 55 56 57 58 59 | can be efficiently searched. .AP Tcl_Obj *patObj in/out Refers to the object from which to get a regular expression. The compiled regular expression is cached in the object. .VE 8.1 .AP char *string in String to check for a match with a regular expression. | | > | | > | 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | can be efficiently searched. .AP Tcl_Obj *patObj in/out Refers to the object from which to get a regular expression. The compiled regular expression is cached in the object. .VE 8.1 .AP char *string in String to check for a match with a regular expression. .AP "CONST char" *pattern in String in the form of a regular expression pattern. .AP Tcl_RegExp regexp in Compiled regular expression. Must have been returned previously by \fBTcl_GetRegExpFromObj\fR or \fBTcl_RegExpCompile\fR. .AP char *start in If \fIstring\fR is just a portion of some other string, this argument identifies the beginning of the larger string. If it isn't the same as \fIstring\fR, then no \fB^\fR matches will be allowed. .AP int index in Specifies which range is desired: 0 means the range of the entire match, 1 or greater means the range that matched a parenthesized sub-expression. .VS 8.4 .AP "CONST char" **startPtr out The address of the first character in the range is stored here, or NULL if there is no such range. .AP "CONST char" **endPtr out The address of the character just after the last one in the range is stored here, or NULL if there is no such range. .VE 8.4 .VS 8.1 .AP int cflags in OR-ed combination of compilation flags. See below for more information. .AP Tcl_Obj *objPtr in/out An object which contains the string to check for a match with a regular expression. .AP int offset in |
| ︙ | ︙ |
Changes to doc/SetErrno.3.
1 2 3 4 5 6 | '\" '\" Copyright (c) 1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | | | | | 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 34 35 36 37 | '\" '\" Copyright (c) 1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: SetErrno.3,v 1.3.18.1 2002/02/05 02:21:58 wolfsuit Exp $ .so man.macros .TH Tcl_SetErrno 3 8.3 Tcl "Tcl Library Procedures" .BS .SH NAME Tcl_SetErrno, Tcl_GetErrno, Tcl_ErrnoId, Tcl_ErrnoMsg \- manipulate errno to store and retrieve error codes .SH SYNOPSIS .nf \fB#include <tcl.h>\fR .sp void \fBTcl_SetErrno\fR(\fIerrorCode\fR) .sp int \fBTcl_GetErrno\fR() .sp CONST char * \fBTcl_ErrnoId\fR() .sp CONST char * \fBTcl_ErrnoMsg\fR(\fIerrorCode\fR) .sp .SH ARGUMENTS .AS int errorCode in .AP int errorCode in A POSIX error code such as \fBENOENT\fR. .BE .SH DESCRIPTION .PP \fBTcl_SetErrno\fR and \fBTcl_GetErrno\fR provide portable access |
| ︙ | ︙ | |||
46 47 48 49 50 51 52 | via \fBerrno\fR should call \fBTcl_SetErrno\fR rather than setting \fBerrno\fR directly. .PP \fBTcl_GetErrno\fR returns the current value of \fBerrno\fR. Procedures wishing to access \fBerrno\fR should call this procedure instead of accessing \fBerrno\fR directly. .PP | | | > | > > > | | 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | via \fBerrno\fR should call \fBTcl_SetErrno\fR rather than setting \fBerrno\fR directly. .PP \fBTcl_GetErrno\fR returns the current value of \fBerrno\fR. Procedures wishing to access \fBerrno\fR should call this procedure instead of accessing \fBerrno\fR directly. .PP \fBTcl_ErrnoId\fR and \fBTcl_ErrnoMsg\fR return string representations of \fBerrno\fR values. \fBTcl_ErrnoId\fR returns a machine-readable textual identifier such as "EACCES" that corresponds to the current value of \fBerrno\fR. \fBTcl_ErrnoMsg\fR returns a human-readable string such as "permission denied" that corresponds to the value of its \fIerrorCode\fR argument. The \fIerrorCode\fR argument is typically the value returned by \fBTcl_GetErrno\fR. The strings returned by these functions are statically allocated and the caller must not free or modify them. .SH KEYWORDS errno, error code, global variables |
Changes to doc/SetResult.3.
1 2 3 4 5 6 7 | '\" '\" Copyright (c) 1989-1993 The Regents of the University of California. '\" Copyright (c) 1994-1997 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | | 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 | '\" '\" Copyright (c) 1989-1993 The Regents of the University of California. '\" Copyright (c) 1994-1997 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: SetResult.3,v 1.6.14.1 2002/02/05 02:21:58 wolfsuit Exp $ '\" .so man.macros .TH Tcl_SetResult 3 8.0 Tcl "Tcl Library Procedures" .BS .SH NAME Tcl_SetObjResult, Tcl_GetObjResult, Tcl_SetResult, Tcl_GetStringResult, Tcl_AppendResult, Tcl_AppendResultVA, Tcl_AppendElement, Tcl_ResetResult, Tcl_FreeResult \- manipulate Tcl result .SH SYNOPSIS .nf \fB#include <tcl.h>\fR .sp \fBTcl_SetObjResult\fR(\fIinterp, objPtr\fR) .sp Tcl_Obj * \fBTcl_GetObjResult\fR(\fIinterp\fR) .sp \fBTcl_SetResult\fR(\fIinterp, string, freeProc\fR) .sp CONST char * \fBTcl_GetStringResult\fR(\fIinterp\fR) .sp \fBTcl_AppendResult\fR(\fIinterp, string, string, ... , \fB(char *) NULL\fR) .sp \fBTcl_AppendResultVA\fR(\fIinterp, argList\fR) .sp \fBTcl_AppendElement\fR(\fIinterp, string\fR) |
| ︙ | ︙ |
Changes to doc/SetVar.3.
1 2 3 4 5 6 7 | '\" '\" Copyright (c) 1989-1993 The Regents of the University of California. '\" Copyright (c) 1994-1997 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | | | | | 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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | '\" '\" Copyright (c) 1989-1993 The Regents of the University of California. '\" Copyright (c) 1994-1997 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: SetVar.3,v 1.3.28.1 2002/02/05 02:21:58 wolfsuit Exp $ '\" .so man.macros .TH Tcl_SetVar 3 8.1 Tcl "Tcl Library Procedures" .BS .SH NAME Tcl_SetVar2Ex, Tcl_SetVar, Tcl_SetVar2, Tcl_ObjSetVar2, Tcl_GetVar2Ex, Tcl_GetVar, Tcl_GetVar2, Tcl_ObjGetVar2, Tcl_UnsetVar, Tcl_UnsetVar2 \- manipulate Tcl variables .SH SYNOPSIS .nf \fB#include <tcl.h>\fR .sp .VS 8.1 Tcl_Obj * \fBTcl_SetVar2Ex\fR(\fIinterp, name1, name2, newValuePtr, flags\fR) .VE .sp CONST char * \fBTcl_SetVar\fR(\fIinterp, varName, newValue, flags\fR) .sp CONST char * \fBTcl_SetVar2\fR(\fIinterp, name1, name2, newValue, flags\fR) .sp Tcl_Obj * \fBTcl_ObjSetVar2\fR(\fIinterp, part1Ptr, part2Ptr, newValuePtr, flags\fR) .sp .VS 8.1 Tcl_Obj * \fBTcl_GetVar2Ex\fR(\fIinterp, name1, name2, flags\fR) .VE .sp CONST char * \fBTcl_GetVar\fR(\fIinterp, varName, flags\fR) .sp CONST char * \fBTcl_GetVar2\fR(\fIinterp, name1, name2, flags\fR) .sp Tcl_Obj * \fBTcl_ObjGetVar2\fR(\fIinterp, part1Ptr, part2Ptr, flags\fR) .sp int \fBTcl_UnsetVar\fR(\fIinterp, varName, flags\fR) |
| ︙ | ︙ | |||
74 75 76 77 78 79 80 | May include \fB::\fR namespace qualifiers to specify a variable in a particular namespace. May refer to a scalar variable or an element of an array. If the name references an element of an array, then the name must be in writable memory: Tcl will make temporary modifications to it while looking up the name. | | | 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | May include \fB::\fR namespace qualifiers to specify a variable in a particular namespace. May refer to a scalar variable or an element of an array. If the name references an element of an array, then the name must be in writable memory: Tcl will make temporary modifications to it while looking up the name. .AP "CONST char" *newValue in New value for variable, specified as a NULL-terminated string. A copy of this value is stored in the variable. .AP Tcl_Obj *part1Ptr in Points to a Tcl object containing the variable's name. The name may include a series of \fB::\fR namespace qualifiers to specify a variable in a particular namespace. May refer to a scalar variable or an element of an array variable. |
| ︙ | ︙ |
Changes to doc/Signal.3.
1 2 3 4 5 6 | '\" '\" Copyright (c) 2001 ActiveState Tool Corp. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | | | 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 | '\" '\" Copyright (c) 2001 ActiveState Tool Corp. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: Signal.3,v 1.1.14.1 2002/02/05 02:21:58 wolfsuit Exp $ .so man.macros .TH Tcl_SignalId 3 8.3 Tcl "Tcl Library Procedures" .BS .SH NAME Tcl_SignalId, Tcl_SignalMsg \- Convert signal codes .SH SYNOPSIS .nf \fB#include <tcl.h>\fR .sp CONST char * \fBTcl_SignalId\fR(\fIsig\fR) .sp CONST char * \fBTcl_SignalMsg\fR(\fIsig\fR) .sp .SH ARGUMENTS .AP int sig in A POSIX signal number such as \fBSIGPIPE\fR. .BE |
| ︙ | ︙ |
Changes to doc/SplitList.3.
1 2 3 4 5 6 7 | '\" '\" Copyright (c) 1989-1993 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | '\" '\" Copyright (c) 1989-1993 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: SplitList.3,v 1.5.2.1 2002/02/05 02:21:58 wolfsuit Exp $ '\" .so man.macros .TH Tcl_SplitList 3 8.0 Tcl "Tcl Library Procedures" .BS .SH NAME Tcl_SplitList, Tcl_Merge, Tcl_ScanElement, Tcl_ConvertElement, Tcl_ScanCountedElement, Tcl_ConvertCountedElement \- manipulate Tcl lists .SH SYNOPSIS |
| ︙ | ︙ | |||
30 31 32 33 34 35 36 | .sp int \fBTcl_ConvertElement\fR(\fIsrc, dst, flags\fR) .sp int \fBTcl_ConvertCountedElement\fR(\fIsrc, length, dst, flags\fR) .SH ARGUMENTS | | | | | 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | .sp int \fBTcl_ConvertElement\fR(\fIsrc, dst, flags\fR) .sp int \fBTcl_ConvertCountedElement\fR(\fIsrc, length, dst, flags\fR) .SH ARGUMENTS .AS "CONST char * CONST" ***argvPtr .AP Tcl_Interp *interp out Interpreter to use for error reporting. If NULL, then no error message is left. .AP char *list in Pointer to a string with proper list structure. .AP int *argcPtr out Filled in with number of elements in \fIlist\fR. .AP "CONST char" ***argvPtr out \fI*argvPtr\fR will be filled in with the address of an array of pointers to the strings that are the extracted elements of \fIlist\fR. There will be \fI*argcPtr\fR valid entries in the array, followed by a NULL entry. .AP int argc in Number of elements in \fIargv\fR. .AP "CONST char * CONST" *argv in Array of strings to merge together into a single list. Each string will become a separate element of the list. .AP "CONST char" *src in String that is to become an element of a list. .AP int *flagsPtr in Pointer to word to fill in with information about \fIsrc\fR. The value of *\fIflagsPtr\fR must be passed to \fBTcl_ConvertElement\fR. |
| ︙ | ︙ |
Changes to doc/SplitPath.3.
1 2 3 4 5 6 | '\" '\" Copyright (c) 1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | | | | | 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 34 35 36 37 38 39 40 41 42 43 44 45 46 | '\" '\" Copyright (c) 1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: SplitPath.3,v 1.4.2.1 2002/02/05 02:21:58 wolfsuit Exp $ '\" .so man.macros .TH Tcl_SplitPath 3 7.5 Tcl "Tcl Library Procedures" .BS .SH NAME Tcl_SplitPath, Tcl_JoinPath, Tcl_GetPathType \- manipulate platform-dependent file paths .SH SYNOPSIS .nf \fB#include <tcl.h>\fR .sp \fBTcl_SplitPath\fR(\fIpath, argcPtr, argvPtr\fR) .sp CONST char * \fBTcl_JoinPath\fR(\fIargc, argv, resultPtr\fR) .sp Tcl_PathType \fBTcl_GetPathType\fR(\fIpath\fR) .SH ARGUMENTS .AS Tcl_DString ***argvPtr .AP "CONST char * CONST" *argvPtr in File path in a form appropriate for the current platform (see the \fBfilename\fR manual entry for acceptable forms for path names). .AP int *argcPtr out Filled in with number of path elements in \fIpath\fR. .AP CONST char ***argvPtr out \fI*argvPtr\fR will be filled in with the address of an array of pointers to the strings that are the extracted elements of \fIpath\fR. There will be \fI*argcPtr\fR valid entries in the array, followed by a NULL entry. .AP int argc in Number of elements in \fIargv\fR. .AP "CONST char * CONST" *argv in Array of path elements to merge together into a single path. .AP Tcl_DString *resultPtr in/out A pointer to an initialized \fBTcl_DString\fR to which the result of \fBTcl_JoinPath\fR will be appended. .BE .SH DESCRIPTION |
| ︙ | ︙ |
Changes to doc/StaticPkg.3.
1 2 3 4 5 6 | '\" '\" Copyright (c) 1995-1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | | 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 | '\" '\" Copyright (c) 1995-1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: StaticPkg.3,v 1.3.18.1 2002/02/05 02:21:58 wolfsuit Exp $ '\" .so man.macros .TH Tcl_StaticPackage 3 7.5 Tcl "Tcl Library Procedures" .BS .SH NAME Tcl_StaticPackage \- make a statically linked package available via the \fBload\fR command .SH SYNOPSIS .nf \fB#include <tcl.h>\fR .sp \fBTcl_StaticPackage\fR(\fIinterp, pkgName, initProc, safeInitProc\fR) .SH ARGUMENTS .AS Tcl_PackageInitProc *safeInitProc .AP Tcl_Interp *interp in If not NULL, points to an interpreter into which the package has already been loaded (i.e., the caller has already invoked the appropriate initialization procedure). NULL means the package hasn't yet been incorporated into any interpreter. .AP "CONST char" *pkgName in Name of the package; should be properly capitalized (first letter upper-case, all others lower-case). .AP Tcl_PackageInitProc *initProc in Procedure to invoke to incorporate this package into a trusted interpreter. .AP Tcl_PackageInitProc *safeInitProc in Procedure to call to incorporate this package into a safe interpreter |
| ︙ | ︙ |
Changes to doc/StdChannels.3.
1 2 3 4 5 6 | '\" '\" Copyright (c) 2001 by ActiveState Corporation '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | | > > | | | 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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | '\" '\" Copyright (c) 2001 by ActiveState Corporation '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: StdChannels.3,v 1.3.6.1 2002/02/05 02:21:58 wolfsuit Exp $ '\" .so man.macros .TH "Standard Channels" 3 7.5 Tcl "Tcl Library Procedures" .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME Tcl_StandardChannels \- How the Tcl library deals with the standard channels .SH DESCRIPTION .PP This page explains the initialization and use of standard channels in the Tcl library. .PP The term \fIstandard channels\fR comes out of the Unix world and refers to the three channels automatically opened by the OS for each new application. They are \fBstdin\fR, \fBstdout\fR and \fBstderr\fR. The first is the standard input an application can read from, the other two refer to writable channels, one for regular output and the other for error messages. .PP Tcl generalizes this concept in a cross-platform way and exposes standard channels to the script level. .SH APIs .PP The public API procedures dealing directly with standard channels are \fBTcl_GetStdChannel\fR and \fBTcl_SetStdChannel\fR. Additional public APIs to consider are \fBTcl_RegisterChannel\fR, \fBTcl_CreateChannel\fR and \fBTcl_GetChannel\fR. .SH "INITIALIZATION OF TCL STANDARD CHANNELS" .PP Standard channels are initialized by the Tcl library in three cases: when explicitly requested, when implicitly required before returning channel information, or when implicitly required during registration of a new channel. .PP These cases differ in how they handle unavailable platform- specific standard channels. (A channel is not ``available'' if it could not be successfully opened; for example, in a Tcl application run as a Windows NT service.) .TP 1) A single standard channel is initialized when it is explicitly specified in a call to \fBTcl_SetStdChannel\fR. The state of the other standard channels are unaffected. |
| ︙ | ︙ | |||
83 84 85 86 87 88 89 | In case of unavailable platform-specific standard channels the channel whose creation caused the initialization of the Tcl standard channels is made a normal channel. The next three Tcl channels opened by the application are designated as the Tcl standard channels. In other words, of the first four Tcl channels opened by the application the second to fourth are designated as the Tcl standard channels. .PP | | | 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | In case of unavailable platform-specific standard channels the channel whose creation caused the initialization of the Tcl standard channels is made a normal channel. The next three Tcl channels opened by the application are designated as the Tcl standard channels. In other words, of the first four Tcl channels opened by the application the second to fourth are designated as the Tcl standard channels. .PP .SH "RE-INITIALIZATION OF TCL STANDARD CHANNELS" .PP Once a Tcl standard channel is initialized through one of the methods above, closing this Tcl standard channel will cause the next call to \fBTcl_CreateChannel\fR to make the new channel the new standard channel, too. If more than one Tcl standard channel was closed \fBTcl_CreateChannel\fR will fill the empty slots in the order \fBstdin\fR, \fBstdout\fR and \fBstderr\fR. |
| ︙ | ︙ |
Changes to doc/StringObj.3.
1 2 3 4 5 6 | '\" '\" Copyright (c) 1994-1997 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | '\" '\" Copyright (c) 1994-1997 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: StringObj.3,v 1.9.8.1 2002/02/05 02:21:58 wolfsuit Exp $ '\" .so man.macros .TH Tcl_StringObj 3 8.1 Tcl "Tcl Library Procedures" .BS .SH NAME Tcl_NewStringObj, Tcl_NewUnicodeObj, Tcl_SetStringObj, Tcl_SetUnicodeObj, Tcl_GetStringFromObj, Tcl_GetString, Tcl_GetUnicode, Tcl_GetUniChar, Tcl_GetCharLength, Tcl_GetRange, Tcl_AppendToObj, Tcl_AppendUnicodeToObj, Tcl_AppendStringsToObj, Tcl_AppendStringsToObjVA, Tcl_AppendObjToObj, Tcl_SetObjLength, Tcl_ConcatObj, Tcl_AttemptSetObjLength \- manipulate Tcl objects as strings .SH SYNOPSIS |
| ︙ | ︙ | |||
29 30 31 32 33 34 35 36 37 38 39 40 41 42 | .sp char * \fBTcl_GetStringFromObj\fR(\fIobjPtr, lengthPtr\fR) .sp char * \fBTcl_GetString\fR(\fIobjPtr\fR) .sp Tcl_UniChar * \fBTcl_GetUnicode\fR(\fIobjPtr\fR) .sp Tcl_UniChar \fBTcl_GetUniChar\fR(\fIobjPtr, index\fR) .sp int | > > > | 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | .sp char * \fBTcl_GetStringFromObj\fR(\fIobjPtr, lengthPtr\fR) .sp char * \fBTcl_GetString\fR(\fIobjPtr\fR) .sp Tcl_UniChar * \fBTcl_GetUnicodeFromObj\fR(\fIobjPtr, lengthPtr\fR) .sp Tcl_UniChar * \fBTcl_GetUnicode\fR(\fIobjPtr\fR) .sp Tcl_UniChar \fBTcl_GetUniChar\fR(\fIobjPtr, index\fR) .sp int |
| ︙ | ︙ | |||
152 153 154 155 156 157 158 | representation is regenerated from the object's internal representation. The storage referenced by the returned byte pointer is owned by the object manager and should not be modified by the caller. The procedure \fBTcl_GetString\fR is used in the common case where the caller does not need the length of the string representation. .PP | > | > > > > > > > | 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 | representation is regenerated from the object's internal representation. The storage referenced by the returned byte pointer is owned by the object manager and should not be modified by the caller. The procedure \fBTcl_GetString\fR is used in the common case where the caller does not need the length of the string representation. .PP \fBTcl_GetUnicodeFromObj\fR and \fBTcl_GetUnicode\fR return an object's value as a Unicode string. This is given by the returned pointer and (for \fBTcl_GetUnicodeFromObj\fR) length, which is stored in \fIlengthPtr\fR if it is non-NULL. The storage referenced by the returned byte pointer is owned by the object manager and should not be modified by the caller. The procedure \fBTcl_GetUnicode\fR is used in the common case where the caller does not need the length of the unicode string representation. .PP \fBTcl_GetUniChar\fR returns the \fIindex\fR'th character in the object's Unicode representation. .PP \fBTcl_GetRange\fR returns a newly created object comprised of the characters between \fIfirst\fR and \fIlast\fR (inclusive) in the object's Unicode representation. If the object's Unicode representation is invalid, the Unicode representation is regenerated |
| ︙ | ︙ |
Changes to doc/TCL_MEM_DEBUG.3.
1 2 3 4 5 | '\" '\" Copyright (c) 1992-1999 Karl Lehenbauer and Mark Diekhans. '\" Copyright (c) 2000 by Scriptics Corporation. '\" All rights reserved. '\" | | | | | | 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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | '\" '\" Copyright (c) 1992-1999 Karl Lehenbauer and Mark Diekhans. '\" Copyright (c) 2000 by Scriptics Corporation. '\" All rights reserved. '\" '\" RCS: @(#) $Id: TCL_MEM_DEBUG.3,v 1.3.2.1 2002/02/05 02:21:58 wolfsuit Exp $ '\" .so man.macros .TH TCL_MEM_DEBUG 3 8.1 Tcl "Tcl Library Procedures" .BS .SH NAME TCL_MEM_DEBUG \- Compile-time flag to enable Tcl memory debugging. .SH DESCRIPTION When Tcl is compiled with \fBTCL_MEM_DEBUG\fR defined, a powerful set of memory debugging aids are included in the compiled binary. This includes C and Tcl functions which can aid with debugging memory leaks, memory allocation overruns, and other memory related errors. .SH "ENABLING MEMORY DEBUGGING" .PP To enable memory debugging, Tcl should be recompiled from scratch with \fBTCL_MEM_DEBUG\fR defined. This will also compile in a non-stub version of \fBTcl_InitMemory\fR to add the \fBmemory\fR command to Tcl. .PP \fBTCL_MEM_DEBUG\fR must be either left defined for all modules or undefined for all modules that are going to be linked together. If they are not, link errors will occur, with either \fBTclDbCkfree\fR and \fBTcl_DbCkalloc\fR or \fBTcl_Ckalloc\fR and \fBTcl_Ckfree\fR being undefined. .PP Once memory debugging support has been compiled into Tcl, the C functions \fBTcl_ValidateAllMemory\fR, and \fBTcl_DumpActiveMemory\fR, and the Tcl \fBmemory\fR command can be used to validate and examine memory usage. .SH "GUARD ZONES" .PP When memory debugging is enabled, whenever a call to \fBckalloc\fR is made, slightly more memory than requested is allocated so the memory debugging code can keep track of the allocated memory, and eight-byte ``guard zones'' are placed in front of and behind the space that will be returned to the caller. (The sizes of the guard zones are defined by the C #define \fBLOW_GUARD_SIZE\fR and #define \fBHIGH_GUARD_SIZE\fR in the file \fIgeneric/tclCkalloc.c\fR -- it can be extended if you suspect large overwrite problems, at some cost in performance.) A known pattern is written into the guard zones and, on a call to \fBckfree\fR, the guard zones of the space being freed are checked to see if either zone has been modified in any way. If one has been, the guard bytes and their new contents are identified, and a ``low guard failed'' or ``high guard failed'' message is issued. The ``guard failed'' message includes the address of the memory packet and the file name and line number of the code that called \fBckfree\fR. This allows you to detect the common sorts of one-off problems, where not enough space was allocated to contain the data written, for example. .SH "DEBUGGING DIFFICULT MEMORY CORRUPTION PROBLEMS" .PP Normally, Tcl compiled with memory debugging enabled will make it easy to isolate a corruption problem. Turning on memory validation with the memory command can help isolate difficult problems. If you suspect (or know) that corruption is occurring before the Tcl interpreter comes up far enough for you to issue commands, you can set \fBMEM_VALIDATE\fR define, recompile tclCkalloc.c and rebuild Tcl. |
| ︙ | ︙ |
Changes to doc/Tcl_Main.3.
1 2 3 4 5 6 7 8 | '\" '\" Copyright (c) 1994 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" Copyright (c) 2000 Ajuba Solutions. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | '\" '\" Copyright (c) 1994 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" Copyright (c) 2000 Ajuba Solutions. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: Tcl_Main.3,v 1.4.6.1 2002/02/05 02:21:58 wolfsuit Exp $ '\" .so man.macros .TH Tcl_Main 3 8.4 Tcl "Tcl Library Procedures" .BS .SH NAME Tcl_Main, Tcl_SetMainLoop \- main program and event loop definition for Tcl-based applications .SH SYNOPSIS |
| ︙ | ︙ | |||
45 46 47 48 49 50 51 | \fBmain\fR functions. .PP Normally each application contains a small \fBmain\fR function that does nothing but invoke \fBTcl_Main\fR. \fBTcl_Main\fR then does all the work of creating and running a \fBtclsh\fR-like application. .PP | > > > > > > > > > > > > > > > > > > > > > | | | | > | | > | > > > > | > > > > > > > < | > > | > > | > | | > | 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | \fBmain\fR functions. .PP Normally each application contains a small \fBmain\fR function that does nothing but invoke \fBTcl_Main\fR. \fBTcl_Main\fR then does all the work of creating and running a \fBtclsh\fR-like application. .PP \fBTcl_Main\fR is not provided by the public interface of Tcl's stub library. Programs that call \fBTcl_Main\fR must be linked against the standard Tcl library. Extensions (stub-enabled or not) are not intended to call \fBTcl_Main\fR. .PP \fBTcl_Main\fR and therefore all applications based upon it, like \fBtclsh\fR, use \fBTcl_GetStdChannel\fR to initialize the standard channels to their default values. See \fBTcl_StandardChannels\fR for more information. .PP \fBTcl_Main\fR supports two modes of operation, depending on the values of \fIargc\fR and \fIargv\fR. If \fIargv[1]\fR exists and does not begin with the character \fI-\fR, it is taken to be the name of a file containing a \fIstartup script\fR, which \fBTcl_Main\fR will attempt to evaluate. Otherwise, \fBTcl_Main\fR will enter an interactive mode. .PP In either mode, \fBTcl_Main\fR will define in its master interpreter the Tcl variables \fIargc\fR, \fIargv\fR, \fIargv0\fR, and \fItcl_interactive\fR, as described in the documentation for \fBtclsh\fR. .PP When it has finished its own initialization, but before it processes commands, \fBTcl_Main\fR calls the procedure given by the \fIappInitProc\fR argument. This procedure provides a ``hook'' for the application to perform its own initialization of the interpreter created by \fBTcl_Main\fR, such as defining application-specific commands. The procedure must have an interface that matches the type \fBTcl_AppInitProc\fR: .CS typedef int Tcl_AppInitProc(Tcl_Interp *\fIinterp\fR); .CE \fIAppInitProc\fR is almost always a pointer to \fBTcl_AppInit\fR; for more details on this procedure, see the documentation for \fBTcl_AppInit\fR. .PP When the \fIappInitProc\fR is finished, \fBTcl_Main\fR enters one of its two modes. If a startup script has been provided, \fBTcl_Main\fR attempts to evaluate it. Otherwise interactive operations begin, with prompts and command evaluation results written to the standard output channel, and commands read from the standard input channel and then evaluated. The prompts written to the standard output channel may be customized by defining the Tcl variables \fItcl_prompt1\fR and \fItcl_prompt2\fR as described in the documentation for \fBtclsh\fR. The prompts and command evaluation results are written to the standard output channel only if the Tcl variable \fItcl_interactive\fR in the master interpreter holds a non-zero integer value. .PP .VS 8.4 \fBTcl_SetMainLoop\fR allows setting an event loop procedure to be run. This allows, for example, Tk to be dynamically loaded and set its event loop. The event loop will run following the startup script. If you are in interactive mode, setting the main loop procedure will cause the prompt to become fileevent based and then the loop procedure is called. When the loop procedure returns in interactive mode, interactive operation will continue. The main loop procedure must have an interface that matches the type \fBTcl_MainLoopProc\fR: .CS typedef void Tcl_MainLoopProc(void); .CE .VE 8.4 .PP \fBTcl_Main\fR does not return. Normally a program based on \fBTcl_Main\fR will terminate when the \fBexit\fR command is evaluated. In interactive mode, if an EOF or channel error is encountered on the standard input channel, then \fBTcl_Main\fR itself will evaluate the \fBexit\fR command after the main loop procedure (if any) returns. In non-interactive mode, after \fBTcl_Main\fR evaluates the startup script, and the main loop procedure (if any) returns, \fBTcl_Main\fR will also evaluate the \fBexit\fR command. .SH "SEE ALSO" tclsh(1), Tcl_GetStdChannel(3), Tcl_StandardChannels(3), Tcl_AppInit(3), exit(n) .SH KEYWORDS application-specific initialization, command-line arguments, main program |
Changes to doc/TraceVar.3.
1 2 3 4 5 6 7 | '\" '\" Copyright (c) 1989-1993 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | '\" '\" Copyright (c) 1989-1993 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: TraceVar.3,v 1.4.18.1 2002/02/05 02:21:58 wolfsuit Exp $ '\" .so man.macros .TH Tcl_TraceVar 3 7.4 Tcl "Tcl Library Procedures" .BS .SH NAME Tcl_TraceVar, Tcl_TraceVar2, Tcl_UntraceVar, Tcl_UntraceVar2, Tcl_VarTraceInfo, Tcl_VarTraceInfo2 \- monitor accesses to a variable .SH SYNOPSIS |
| ︙ | ︙ | |||
39 40 41 42 43 44 45 | Name of variable. May refer to a scalar variable, to an array variable with no index, or to an array variable with a parenthesized index. If the name references an element of an array, then it must be in writable memory: Tcl will make temporary modifications to it while looking up the name. .AP int flags in | | | > | 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | Name of variable. May refer to a scalar variable, to an array variable with no index, or to an array variable with a parenthesized index. If the name references an element of an array, then it must be in writable memory: Tcl will make temporary modifications to it while looking up the name. .AP int flags in OR-ed combination of the values TCL_TRACE_READS, TCL_TRACE_WRITES, TCL_TRACE_UNSETS, TCL_TRACE_ARRAY, TCL_GLOBAL_ONLY, TCL_NAMESPACE_ONLY, TCL_TRACE_RESULT_DYNAMIC and TCL_TRACE_RESULT_OBJECT. Not all flags are used by all procedures. See below for more information. .AP Tcl_VarTraceProc *proc in Procedure to invoke whenever one of the traced operations occurs. .AP ClientData clientData in Arbitrary one-word value to pass to \fIproc\fR. .AP char *name1 in |
| ︙ | ︙ | |||
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | of any of the following values: .TP \fBTCL_GLOBAL_ONLY\fR Normally, the variable will be looked up at the current level of procedure call; if this bit is set then the variable will be looked up at global level, ignoring any active procedures. .TP \fBTCL_TRACE_READS\fR Invoke \fIproc\fR whenever an attempt is made to read the variable. .TP \fBTCL_TRACE_WRITES\fR Invoke \fIproc\fR whenever an attempt is made to modify the variable. .TP \fBTCL_TRACE_UNSETS\fR Invoke \fIproc\fR whenever the variable is unset. A variable may be unset either explicitly by an \fBunset\fR command, or implicitly when a procedure returns (its local variables are automatically unset) or when the interpreter is deleted (all variables are automatically unset). .TP \fBTCL_TRACE_ARRAY\fR Invoke \fIproc\fR whenever the array command is invoked. This gives the trace procedure a chance to update the array before array names or array get is called. Note that this is called before an array set, but that will trigger write traces. .PP Whenever one of the specified operations occurs on the variable, \fIproc\fR will be invoked. It should have arguments and result that match the type \fBTcl_VarTraceProc\fR: .CS typedef char *Tcl_VarTraceProc( | > > > > > > > > > > > > > > > > > > > > | 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 | of any of the following values: .TP \fBTCL_GLOBAL_ONLY\fR Normally, the variable will be looked up at the current level of procedure call; if this bit is set then the variable will be looked up at global level, ignoring any active procedures. .TP \fBTCL_NAMESPACE_ONLY\fR Normally, the variable will be looked up at the current level of procedure call; if this bit is set then the variable will be looked up in the current namespace, ignoring any active procedures. .TP \fBTCL_TRACE_READS\fR Invoke \fIproc\fR whenever an attempt is made to read the variable. .TP \fBTCL_TRACE_WRITES\fR Invoke \fIproc\fR whenever an attempt is made to modify the variable. .TP \fBTCL_TRACE_UNSETS\fR Invoke \fIproc\fR whenever the variable is unset. A variable may be unset either explicitly by an \fBunset\fR command, or implicitly when a procedure returns (its local variables are automatically unset) or when the interpreter is deleted (all variables are automatically unset). .TP \fBTCL_TRACE_ARRAY\fR Invoke \fIproc\fR whenever the array command is invoked. This gives the trace procedure a chance to update the array before array names or array get is called. Note that this is called before an array set, but that will trigger write traces. .VS 8.4 .TP \fBTCL_TRACE_RESULT_DYNAMIC\fR The result of invoking the \fIproc\fR is a dynamically allocated string that will be released by the Tcl library via a call to \fBckfree\fR. Must not be specified at the same time as TCL_TRACE_RESULT_OBJECT. .TP \fBTCL_TRACE_RESULT_OBJECT\fR The result of invoking the \fIproc\fR is a Tcl_Obj* (cast to a char*) with a reference count of at least one. The ownership of that reference will be transferred to the Tcl core for release (when the core has finished with it) via a call to \fBTcl_DecrRefCount\fR. Must not be specified at the same time as TCL_TRACE_RESULT_DYNAMIC. .VE 8.4 .PP Whenever one of the specified operations occurs on the variable, \fIproc\fR will be invoked. It should have arguments and result that match the type \fBTcl_VarTraceProc\fR: .CS typedef char *Tcl_VarTraceProc( |
| ︙ | ︙ | |||
130 131 132 133 134 135 136 137 138 139 140 141 142 143 | or TCL_TRACE_UNSETS will be set in \fIflags\fR to indicate which operation is being performed on the variable. The bit TCL_GLOBAL_ONLY will be set whenever the variable being accessed is a global one not accessible from the current level of procedure call: the trace procedure will need to pass this flag back to variable-related procedures like \fBTcl_GetVar\fR if it attempts to access the variable. The bit TCL_TRACE_DESTROYED will be set in \fIflags\fR if the trace is about to be destroyed; this information may be useful to \fIproc\fR so that it can clean up its own internal data structures (see the section TCL_TRACE_DESTROYED below for more details). Lastly, the bit TCL_INTERP_DESTROYED will be set if the entire interpreter is being destroyed. | > > > > > | 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 | or TCL_TRACE_UNSETS will be set in \fIflags\fR to indicate which operation is being performed on the variable. The bit TCL_GLOBAL_ONLY will be set whenever the variable being accessed is a global one not accessible from the current level of procedure call: the trace procedure will need to pass this flag back to variable-related procedures like \fBTcl_GetVar\fR if it attempts to access the variable. The bit TCL_NAMESPACE_ONLY will be set whenever the variable being accessed is a namespace one not accessible from the current level of procedure call: the trace procedure will need to pass this flag back to variable-related procedures like \fBTcl_GetVar\fR if it attempts to access the variable. The bit TCL_TRACE_DESTROYED will be set in \fIflags\fR if the trace is about to be destroyed; this information may be useful to \fIproc\fR so that it can clean up its own internal data structures (see the section TCL_TRACE_DESTROYED below for more details). Lastly, the bit TCL_INTERP_DESTROYED will be set if the entire interpreter is being destroyed. |
| ︙ | ︙ | |||
155 156 157 158 159 160 161 | The same bits are valid for \fIflags\fR as for calls to \fBTcl_TraceVar\fR. .PP \fBTcl_VarTraceInfo\fR may be used to retrieve information about traces set on a given variable. The return value from \fBTcl_VarTraceInfo\fR is the \fIclientData\fR associated with a particular trace. The trace must be on the variable specified by the \fIinterp\fR, | | | | > | 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 | The same bits are valid for \fIflags\fR as for calls to \fBTcl_TraceVar\fR. .PP \fBTcl_VarTraceInfo\fR may be used to retrieve information about traces set on a given variable. The return value from \fBTcl_VarTraceInfo\fR is the \fIclientData\fR associated with a particular trace. The trace must be on the variable specified by the \fIinterp\fR, \fIvarName\fR, and \fIflags\fR arguments (only the TCL_GLOBAL_ONLY and TCL_NAMESPACE_ONLY bits from \fIflags\fR is used; other bits are ignored) and its trace procedure must the same as the \fIproc\fR argument. If the \fIprevClientData\fR argument is NULL then the return value corresponds to the first (most recently created) matching trace, or NULL if there are no matching traces. If the \fIprevClientData\fR argument isn't NULL, then it should be the return value from a previous call to \fBTcl_VarTraceInfo\fR. In this case, the new return value will correspond to the next matching trace after the one whose \fIclientData\fR matches |
| ︙ | ︙ | |||
293 294 295 296 297 298 299 | .SH "ERROR RETURNS" .PP Under normal conditions trace procedures should return NULL, indicating successful completion. If \fIproc\fR returns a non-NULL value it signifies that an error occurred. The return value must be a pointer to a static character string | | > > > > > > > | 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 | .SH "ERROR RETURNS" .PP Under normal conditions trace procedures should return NULL, indicating successful completion. If \fIproc\fR returns a non-NULL value it signifies that an error occurred. The return value must be a pointer to a static character string containing an error message, .VS 8.4 unless (\fIexactly\fR one of) the TCL_TRACE_RESULT_DYNAMIC and TCL_TRACE_RESULT_OBJECT flags is set, which specify that the result is either a dynamic string (to be released with \fBckfree\fR) or a Tcl_Obj* (cast to char* and to be released with \fBTcl_DecrRefCount\fR) containing the error message. .VE 8.4 If a trace procedure returns an error, no further traces are invoked for the access and the traced access aborts with the given message. Trace procedures can use this facility to make variables read-only, for example (but note that the value of the variable will already have been modified before the trace procedure is called, so the trace procedure will have to restore the correct |
| ︙ | ︙ |
Changes to doc/Translate.3.
1 2 3 4 5 6 7 | '\" '\" Copyright (c) 1989-1993 The Regents of the University of California. '\" Copyright (c) 1994-1998 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | | | 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 | '\" '\" Copyright (c) 1989-1993 The Regents of the University of California. '\" Copyright (c) 1994-1998 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: Translate.3,v 1.4.18.1 2002/02/05 02:21:58 wolfsuit Exp $ '\" .so man.macros .TH Tcl_TranslateFileName 3 8.1 Tcl "Tcl Library Procedures" .BS .SH NAME Tcl_TranslateFileName \- convert file name to native form and replace tilde with home directory .SH SYNOPSIS .nf \fB#include <tcl.h>\fR .sp CONST char * \fBTcl_TranslateFileName\fR(\fIinterp\fR, \fIname\fR, \fIbufferPtr\fR) .SH ARGUMENTS .AS Tcl_DString *bufferPtr .AP Tcl_Interp *interp in Interpreter in which to report an error, if any. .AP "CONST char" *name in File name, which may start with a ``~''. .AP Tcl_DString *bufferPtr in/out If needed, this dynamic string is used to store the new file name. At the time of the call it should be uninitialized or free. The caller must eventually call \fBTcl_DStringFree\fR to free up anything stored here. .BE |
| ︙ | ︙ |
Changes to doc/Utf.3.
1 2 3 4 5 6 | '\" '\" Copyright (c) 1997 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | > | | > | 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 34 35 36 37 38 39 | '\" '\" Copyright (c) 1997 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: Utf.3,v 1.9.12.1 2002/02/05 02:21:58 wolfsuit Exp $ '\" .so man.macros .TH Utf 3 "8.1" Tcl "Tcl Library Procedures" .BS .SH NAME Tcl_UniChar, Tcl_UniCharCaseMatch, Tcl_UniCharNcasecmp, Tcl_UniCharToUtf, Tcl_UtfToUniChar, Tcl_UniCharToUtfDString, Tcl_UtfToUniCharDString, Tcl_UniCharLen, Tcl_UniCharNcmp, Tcl_UtfCharComplete, Tcl_NumUtfChars, Tcl_UtfFindFirst, Tcl_UtfFindLast, Tcl_UtfNext, Tcl_UtfPrev, Tcl_UniCharAtIndex, Tcl_UtfAtIndex, Tcl_UtfBackslash \- routines for manipulating UTF-8 strings. .SH SYNOPSIS .nf \fB#include <tcl.h>\fR .sp typedef ... Tcl_UniChar; .sp int \fBTcl_UniCharToUtf\fR(\fIch, buf\fR) .sp int \fBTcl_UtfToUniChar\fR(\fIsrc, chPtr\fR) .VS 8.4 .sp CONST char * \fBTcl_UniCharToUtfDString\fR(\fIuniStr, numChars, dstPtr\fR) .sp CONST Tcl_UniChar * \fBTcl_UtfToUniCharDString\fR(\fIsrc, len, dstPtr\fR) .VE 8.4 .sp int \fBTcl_UniCharLen\fR(\fIuniStr\fR) .sp int \fBTcl_UniCharNcmp\fR(\fIuniStr, uniStr, num\fR) .VS 8.4 |
| ︙ | ︙ | |||
50 51 52 53 54 55 56 57 | \fBTcl_UtfNcasecmp\fR(\fIsrc, src, num\fR) .sp int \fBTcl_UtfCharComplete\fR(\fIsrc, len\fR) .sp int \fBTcl_NumUtfChars\fR(\fIsrc, len\fR) .sp | > | | | | > > | > | 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | \fBTcl_UtfNcasecmp\fR(\fIsrc, src, num\fR) .sp int \fBTcl_UtfCharComplete\fR(\fIsrc, len\fR) .sp int \fBTcl_NumUtfChars\fR(\fIsrc, len\fR) .VS 8.4 .sp CONST char * \fBTcl_UtfFindFirst\fR(\fIsrc, ch\fR) .sp CONST char * \fBTcl_UtfFindLast\fR(\fIsrc, ch\fR) .sp CONST char * \fBTcl_UtfNext\fR(\fIsrc\fR) .sp CONST char * \fBTcl_UtfPrev\fR(\fIsrc, start\fR) .VE 8.4 .sp Tcl_UniChar \fBTcl_UniCharAtIndex\fR(\fIsrc, index\fR) .VS 8.4 .sp CONST char * \fBTcl_UtfAtIndex\fR(\fIsrc, index\fR) .VE 8.4 .sp int \fBTcl_UtfBackslash\fR(\fIsrc, readPtr, dst\fR) .SH ARGUMENTS .AS "CONST Tcl_UniChar" numChars in/out .AP char *buf out Buffer in which the UTF-8 representation of the Tcl_UniChar is stored. At most |
| ︙ | ︙ | |||
146 147 148 149 150 151 152 | to UTF-8, storing the result in a previously-initialized \fBTcl_DString\fR. You must specify the length of the given Unicode string. The return value is a pointer to the UTF-8 representation of the Unicode string. Storage for the return value is appended to the end of the \fBTcl_DString\fR. .PP \fBTcl_UtfToUniCharDString\fR coverts the given UTF-8 string to Unicode, | | | 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 | to UTF-8, storing the result in a previously-initialized \fBTcl_DString\fR. You must specify the length of the given Unicode string. The return value is a pointer to the UTF-8 representation of the Unicode string. Storage for the return value is appended to the end of the \fBTcl_DString\fR. .PP \fBTcl_UtfToUniCharDString\fR coverts the given UTF-8 string to Unicode, storing the result in the previously-initialized \fBTcl_DString\fR. you may either specify the length of the given UTF-8 string or "-1", in which case \fBTcl_UtfToUniCharDString\fR uses \fBstrlen\fR to calculate the length. The return value is a pointer to the Unicode representation of the UTF-8 string. Storage for the return value is appended to the end of the \fBTcl_DString\fR. The Unicode string is terminated with a Unicode NULL character. .PP |
| ︙ | ︙ |
Changes to doc/WrongNumArgs.3.
1 2 3 4 5 6 | '\" '\" Copyright (c) 1994-1997 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | '\" '\" Copyright (c) 1994-1997 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: WrongNumArgs.3,v 1.3.18.1 2002/02/05 02:21:58 wolfsuit Exp $ '\" .so man.macros .TH Tcl_WrongNumArgs 3 8.0 Tcl "Tcl Library Procedures" .BS .SH NAME Tcl_WrongNumArgs \- generate standard error message for wrong number of arguments .SH SYNOPSIS |
| ︙ | ︙ | |||
22 23 24 25 26 27 28 | Interpreter in which error will be reported: error message gets stored in its result object. .AP int objc in Number of leading arguments from \fIobjv\fR to include in error message. .AP Tcl_Obj "*CONST\ objv[]" in Arguments to command that had the wrong number of arguments. | | | 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | Interpreter in which error will be reported: error message gets stored in its result object. .AP int objc in Number of leading arguments from \fIobjv\fR to include in error message. .AP Tcl_Obj "*CONST\ objv[]" in Arguments to command that had the wrong number of arguments. .AP "CONST char" *message in Additional error information to print after leading arguments from \fIobjv\fR. This typically gives the acceptable syntax of the command. This argument may be NULL. .BE .SH DESCRIPTION .PP |
| ︙ | ︙ |
Changes to doc/expr.n.
1 2 3 4 5 6 7 | '\" '\" Copyright (c) 1993 The Regents of the University of California. '\" Copyright (c) 1994-2000 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | '\" '\" Copyright (c) 1993 The Regents of the University of California. '\" Copyright (c) 1994-2000 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: expr.n,v 1.5.14.1 2002/02/05 02:21:58 wolfsuit Exp $ '\" .so man.macros .TH expr n 8.4 Tcl "Tcl Built-In Commands" .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME expr \- Evaluate an expression |
| ︙ | ︙ | |||
201 202 203 204 205 206 207 | .PP .TP \fBabs(\fIarg\fB)\fR Returns the absolute value of \fIarg\fR. \fIArg\fR may be either integer or floating-point, and the result is returned in the same form. .TP \fBacos(\fIarg\fB)\fR | | | | | | > | | | > | | | | | | | | 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 | .PP .TP \fBabs(\fIarg\fB)\fR Returns the absolute value of \fIarg\fR. \fIArg\fR may be either integer or floating-point, and the result is returned in the same form. .TP \fBacos(\fIarg\fB)\fR Returns the arc cosine of \fIarg\fR, in the range [\fI0\fR,\fIpi\fR] radians. \fIArg\fR should be in the range [\fI-1\fR,\fI1\fR]. .TP \fBasin(\fIarg\fB)\fR Returns the arc sine of \fIarg\fR, in the range [\fI-pi/2\fR,\fIpi/2\fR] radians. \fIArg\fR should be in the range [\fI-1\fR,\fI1\fR]. .TP \fBatan(\fIarg\fB)\fR Returns the arc tangent of \fIarg\fR, in the range [\fI-pi/2\fR,\fIpi/2\fR] radians. .TP \fBatan2(\fIy, x\fB)\fR Returns the arc tangent of \fIy\fR/\fIx\fR, in the range [\fI-pi\fR,\fIpi\fR] radians. \fIx\fR and \fIy\fR cannot both be 0. If \fIx\fR is greater than \fI0\fR, this is equivalent to \fBatan(\fIy/x\fB)\fR. .TP \fBceil(\fIarg\fB)\fR Returns the smallest integer value not less than \fIarg\fR. .TP \fBcos(\fIarg\fB)\fR Returns the cosine of \fIarg\fR, measured in radians. .TP \fBcosh(\fIarg\fB)\fR Returns the hyperbolic cosine of \fIarg\fR. If the result would cause an overflow, an error is returned. .TP \fBdouble(\fIarg\fB)\fR If \fIarg\fR is a floating value, returns \fIarg\fR, otherwise converts \fIarg\fR to floating and returns the converted value. .TP \fBexp(\fIarg\fB)\fR Returns the exponential of \fIarg\fR, defined as \fIe\fR**\fIarg\fR. If the result would cause an overflow, an error is returned. .TP \fBfloor(\fIarg\fB)\fR Returns the largest integral value not greater than \fIarg\fR. .TP \fBfmod(\fIx, y\fB)\fR Returns the floating-point remainder of the division of \fIx\fR by \fIy\fR. If \fIy\fR is 0, an error is returned. .TP \fBhypot(\fIx, y\fB)\fR Computes the length of the hypotenuse of a right-angled triangle \fBsqrt(\fIx\fR*\fIx\fR+\fIy\fR*\fIy\fB)\fR. .TP \fBint(\fIarg\fB)\fR If \fIarg\fR is an integer value, returns \fIarg\fR, otherwise converts \fIarg\fR to integer by truncation and returns the converted value. .TP \fBlog(\fIarg\fB)\fR Returns the natural logarithm of \fIarg\fR. \fIArg\fR must be a positive value. .TP \fBlog10(\fIarg\fB)\fR Returns the base 10 logarithm of \fIarg\fR. \fIArg\fR must be a positive value. .TP \fBpow(\fIx, y\fB)\fR Computes the value of \fIx\fR raised to the power \fIy\fR. If \fIx\fR is negative, \fIy\fR must be an integer value. .TP \fBrand()\fR Returns a floating point number from zero to just less than one or, in mathematical terms, the range [\fI0\fR,\fI1\fR). The seed comes from the internal clock of the machine or may be set manual with the \fBsrand\fR function. .TP \fBround(\fIarg\fB)\fR If \fIarg\fR is an integer value, returns \fIarg\fR, otherwise converts \fIarg\fR to integer by rounding and returns the converted value. .TP \fBsin(\fIarg\fB)\fR Returns the sine of \fIarg\fR, measured in radians. |
| ︙ | ︙ |
Changes to doc/fconfigure.n.
1 2 3 4 5 6 | '\" '\" Copyright (c) 1995-1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | < < | 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 34 35 36 37 | '\" '\" Copyright (c) 1995-1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: fconfigure.n,v 1.5.4.1 2002/02/05 02:21:58 wolfsuit Exp $ '\" .so man.macros .TH fconfigure n 8.3 Tcl "Tcl Built-In Commands" .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME fconfigure \- Set and get options on a channel .SH SYNOPSIS .nf \fBfconfigure \fIchannelId\fR \fBfconfigure \fIchannelId\fR \fIname\fR \fBfconfigure \fIchannelId\fR \fIname value \fR?\fIname value ...\fR? .fi .BE .SH DESCRIPTION .PP The \fBfconfigure\fR command sets and retrieves options for channels. .PP \fIChannelId\fR identifies the channel for which to set or query an option and must refer to an open channel such as a Tcl standard channel (\fBstdin\fR, \fBstdout\fR, or \fBstderr\fR), the return value from an invocation of \fBopen\fR or \fBsocket\fR, or the result of a channel creation command provided by a Tcl extension. .PP If no \fIname\fR or \fIvalue\fR arguments are supplied, the command returns a list containing alternating option names and values for the channel. If \fIname\fR is supplied but no \fIvalue\fR then the command returns the current value of the given option. If one or more pairs of \fIname\fR and \fIvalue\fR are supplied, the command sets each of the named options to the corresponding \fIvalue\fR; |
| ︙ | ︙ | |||
72 73 74 75 76 77 78 | .TP \fB\-buffersize\fR \fInewSize\fR . \fINewvalue\fR must be an integer; its value is used to set the size of buffers, in bytes, subsequently allocated for this channel to store input or output. \fINewvalue\fR must be between ten and one million, allowing buffers of ten to one million bytes in size. | < | 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | .TP \fB\-buffersize\fR \fInewSize\fR . \fINewvalue\fR must be an integer; its value is used to set the size of buffers, in bytes, subsequently allocated for this channel to store input or output. \fINewvalue\fR must be between ten and one million, allowing buffers of ten to one million bytes in size. .TP \fB\-encoding\fR \fIname\fR . This option is used to specify the encoding of the channel, so that the data can be converted to and from Unicode for use in Tcl. For instance, in order for Tcl to read characters from a Japanese file in \fBshiftjis\fR and properly process and display the contents, the encoding would be set |
| ︙ | ︙ | |||
96 97 98 99 100 101 102 | write raw bytes. The Tcl \fBbinary\fR command can be used to manipulate this byte-oriented data. .PP The default encoding for newly opened channels is the same platform- and locale-dependent system encoding used for interfacing with the operating system. .RE | < | 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
write raw bytes. The Tcl \fBbinary\fR command can be used to manipulate this
byte-oriented data.
.PP
The default encoding for newly opened channels is the same platform- and
locale-dependent system encoding used for interfacing with the operating
system.
.RE
.TP
\fB\-eofchar\fR \fIchar\fR
.TP
\fB\-eofchar\fR \fB{\fIinChar outChar\fB}\fR
.
This option supports DOS file systems that use Control-z (\ex1a) as an
end of file marker. If \fIchar\fR is not an empty string, then this
|
| ︙ | ︙ | |||
157 158 159 160 161 162 163 | representation can even change from line-to-line, and all cases are translated to a newline. As the output translation mode, \fBauto\fR chooses a platform specific representation; for sockets on all platforms Tcl chooses \fBcrlf\fR, for all Unix flavors, it chooses \fBlf\fR, for the Macintosh platform it chooses \fBcr\fR and for the various flavors of Windows it chooses \fBcrlf\fR. The default setting for \fB\-translation\fR is \fBauto\fR for both input and output. | < < | 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 | representation can even change from line-to-line, and all cases are translated to a newline. As the output translation mode, \fBauto\fR chooses a platform specific representation; for sockets on all platforms Tcl chooses \fBcrlf\fR, for all Unix flavors, it chooses \fBlf\fR, for the Macintosh platform it chooses \fBcr\fR and for the various flavors of Windows it chooses \fBcrlf\fR. The default setting for \fB\-translation\fR is \fBauto\fR for both input and output. .TP \fBbinary\fR . No end-of-line translations are performed. This is nearly identical to \fBlf\fP mode, except that in addition \fBbinary\fP mode also sets the end-of-file character to the empty string (which disables it) and sets the encoding to \fBbinary\fR (which disables encoding filtering). See the description of \fB\-eofchar\fR and \fB\-encoding\fR for more information. .TP \fBcr\fR . The end of a line in the underlying file or device is represented by a single carriage return character. As the input translation mode, \fBcr\fP mode converts carriage returns to newline characters. As the output translation mode, \fBcr\fP mode translates newline characters to |
| ︙ | ︙ | |||
195 196 197 198 199 200 201 | The end of a line in the underlying file or device is represented by a single newline (linefeed) character. In this mode no translations occur during either input or output. This mode is typically used on UNIX platforms. .RE .PP | < > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > | 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 |
The end of a line in the underlying file or device is represented by a
single newline (linefeed) character. In this mode no translations occur
during either input or output. This mode is typically used on UNIX
platforms.
.RE
.PP
.SH "STANDARD CHANNELS"
.PP
The Tcl standard channels (\fBstdin\fR, \fBstdout\fR, and \fBstderr\fR)
can be configured through this command like every other channel opened
by the Tcl library. Beyond the standard options described above they
will also support any special option according to their current type.
If, for example, a Tcl application is started by the \fBinet\fR
super-server common on Unix system its Tcl standard channels will be
sockets and thus support the socket options.
.VS 8.4
.SH "SERIAL PORT CONFIGURATION OPTIONS"
.PP
If \fIchannelId\fR refers to a serial port, then the following
additional configuration options are available on Windows and
Unix systems with a POSIX serial interface:
.TP
\fB\-mode\fR \fIbaud\fB,\fIparity\fB,\fIdata\fB,\fIstop\fR
.
This option is a set of 4 comma-separated values: the baud rate, parity,
number of data bits, and number of stop bits for this serial port. The
\fIbaud\fR rate is a simple integer that specifies the connection speed.
\fIParity\fR is one of the following letters: \fBn\fR, \fBo\fR, \fBe\fR,
\fBm\fR, \fBs\fR; respectively signifying the parity options of ``none'',
``odd'', ``even'', ``mark'', or ``space''. \fIData\fR is the number of
data bits and should be an integer from 5 to 8, while \fIstop\fR is the
number of stop bits and should be the integer 1 or 2.
.TP
\fB\-handshake\fR \fItype\fR
.
(Windows and Unix). This option is used to setup automatic handshake
control. Note that not all handshake types maybe supported by your operating
system. The \fItype\fR parameter is case-independent.
If \fItype\fR is \fBnone\fR then any handshake is switched off.
\fBrtscts\fR activates hardware handshake. Hardware handshake signals
are decribed below.
For software handshake \fBxonxoff\fR the handshake characters can be redefined
with \fB-xchar\fR.
An additional hardware handshake \fBdtrdsr\fR is available only under Windows.
There is no default handshake configuration, the initial value depends
on your operating system settings.
The \fB-handshake\fR option cannot be queried.
.TP
\fB\-queue\fR
.
(Windows and Unix). The \fB-queue\fR option can only be queried.
It returns a list of two integers representing the current number
of bytes in the input and output queue respectively.
.TP
\fB\-timeout\fR \fImsec\fR
.
(Windows and Unix). This option is used to set the timeout for blocking
read operations. It specifies the maximum interval between the
receiption of two bytes in milliseconds.
For Unix systems the granularity is 100 milliseconds.
The \fB-timeout\fR option does not affect write operations or
nonblocking reads.
This option cannot be queried.
.TP
\fB\-ttycontrol\fR \fI{signal boolean signal boolean ...}\fR
.
(Windows and Unix). This option is used to setup the handshake
output lines (see below) permanently or to send a BREAK over the serial line.
The \fIsignal\fR names are case-independent.
\fB{RTS 1 DTR 0}\fR sets the RTS output to high and the DTR output to low.
The BREAK condition (see below) is enabled and disabled with \fB{BREAK 1}\fR and
\fB{BREAK 0}\fR respectively.
It's not a good idea to change the \fBRTS\fR (or \fBDTR\fR) signal
with active hardware handshake \fBrtscts\fR (or \fBdtrdsr\fR).
The result is unpredictable.
The \fB-ttycontrol\fR option cannot be queried.
.TP
\fB\-ttystatus\fR
.
(Windows and Unix). The \fB-ttystatus\fR option can only be
queried. It returns the current modem status and handshake input signals
(see below).
The result is a list of signal,value pairs with a fixed order,
e.g. \fB{CTS 1 DSR 0 RING 1 DCD 0}\fR.
The \fIsignal\fR names are returned upper case.
.TP
\fB\-xchar\fR \fI{xonChar xoffChar}\fR
.
(Windows and Unix). This option is used to query or change the software
handshake characters. Normally the operating system default should be
DC1 (0x11) and DC3 (0x13) representing the ASCII standard
XON and XOFF characters.
.TP
\fB\-pollinterval\fR \fImsec\fR
.
(Windows only). This option is used to set the maximum time between
polling for fileevents.
This affects the time interval between checking for events throughout the Tcl
interpreter (the smallest value always wins). Use this option only if
you want to poll the serial port more or less often than 10 msec
(the default).
.TP
\fB\-sysbuffer\fR \fIinSize\fR
.TP
\fB\-sysbuffer\fR \fI{inSize outSize}\fR
.
(Windows only). This option is used to change the size of Windows
system buffers for a serial channel. Especially at higher communication
rates the default input buffer size of 4096 bytes can overrun
for latent systems. The first form specifies the input buffer size,
in the second form both input and output buffers are defined.
.TP
\fB\-lasterror\fR
.
(Windows only). This option is query only.
In case of a serial communication error, \fBread\fR or \fBputs\fR
returns a general Tcl file I/O error.
\fBfconfigure -lasterror\fR can be called to get a list of error details.
See below for an explanation of the various error codes.
.SH "SERIAL PORT SIGNALS"
.PP
RS-232 is the most commonly used standard electrical interface for serial
communications. A negative voltage (-3V..-12V) define a mark (on=1) bit and
a positive voltage (+3..+12V) define a space (off=0) bit (RS-232C). The
following signals are specified for incoming and outgoing data, status
lines and handshaking. Here we are using the terms \fIworkstation\fR for
your computer and \fImodem\fR for the external device, because some signal
names (DCD, RI) come from modems. Of course your external device may use
these signal lines for other purposes.
.RS
.IP \fBTXD(output)\fR
\fBTransmitted Data:\fR Outgoing serial data.
.IP \fBRXD(input)\fR
\fBReceived Data:\fRIncoming serial data.
.IP \fBRTS(output)\fR
\fBRequest To Send:\fR This hardware handshake line informs the modem that
your workstation is ready to receive data. Your workstation may
automatically reset this signal to indicate that the input buffer is full.
.IP \fBCTS(input)\fR
\fBClear To Send:\fR The complement to RTS. Indicates that the modem is
ready to receive data.
.IP \fBDTR(output)\fR
\fBData Terminal Ready:\fR This signal tells the modem that the workstation
is ready to establish a link. DTR is often enabled automatically whenever a
serial port is opened.
.IP \fBDSR(input)\fR
\fBData Set Ready:\fR The complement to DTR. Tells the workstation that the
modem is ready to establish a link.
.IP \fBDCD(input)\fR
\fBData Carrier Detect:\fR This line becomes active when a modem detects
a "Carrier" signal.
.IP \fBRI(input)\fR
\fBRing Indicator:\fR Goes active when the modem detects an incoming call.
.IP \fBBREAK\fR
A BREAK condition is not a hardware signal line, but a logical zero on the
TXD or RXD lines for a long period of time, usually 250 to 500
milliseconds. Normally a receive or transmit data signal stays at the mark
(on=1) voltage until the next character is tranferred. A BREAK is sometimes
used to reset the communications line or change the operating mode of
cummunications hardware.
.RE
.SH "ERROR CODES (Windows only)"
.PP
A lot of different errors may occur during serial read operations or during
event polling in background. The external device may have been switched
off, the data lines may be noisy, system buffers may overrun or your mode
settings may be wrong. That's why a reliable software should always
\fBcatch\fR serial read operations. In cases of an error Tcl returns a
general file I/O error. Then \fBfconfigure -lasterror\fR may help to
locate the problem. The following error codes may be returned.
.RS
.IP \fBRXOVER:\fR
Windows input buffer overrun. The data comes faster than your scripts reads
it or your system is overloaded. Use \fBfconfigure -sysbuffer\fR to avoid a
temporary bottleneck and/or make your script faster.
.IP \fBTXFULL\fR
Windows output buffer overrun. Complement to RXOVER. This error should
practically not happen, because Tcl cares about the output buffer status.
.IP \fBOVERRUN\fR
UART buffer overrun (hardware) with data lost.
The data comes faster than the system driver receives it.
Check your advanced serial port settings to enable the FIFO (16550) buffer
and/or setup a lower(1) interrupt threshold value.
.IP \fBRXPARITY\fR
A parity error has been detected by your UART.
Wrong parity settings with \fBfconfigure -mode\fR or a noisy data line (RXD)
may cause this error.
.IP \fBFRAME\fR
A stop-bit error has been detected by your UART.
Wrong mode settings with \fBfconfigure -mode\fR or a noisy data line (RXD)
may cause this error.
.IP \fBBREAK\fR
A BREAK condition has been detected by your UART (see above).
.RE
.VE
.SH "SEE ALSO"
close(n), flush(n), gets(n), puts(n), read(n), socket(n),
Tcl_StandardChannels(3)
.SH KEYWORDS
blocking, buffering, carriage return, end of line, flushing, linemode,
newline, nonblocking, platform, translation, encoding, filter, byte array,
binary
|
Changes to doc/file.n.
1 2 3 4 5 6 7 | '\" '\" Copyright (c) 1993 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | '\" '\" Copyright (c) 1993 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: file.n,v 1.8.8.1 2002/02/05 02:21:58 wolfsuit Exp $ '\" .so man.macros .TH file n 8.3 Tcl "Tcl Built-In Commands" .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME file \- Manipulate file names and attributes |
| ︙ | ︙ | |||
88 89 90 91 92 93 94 | .VE .TP \fBfile copy \fR?\fB\-force\fR? ?\fB\-\|\-\fR? \fIsource\fR \fItarget\fR .br \fBfile copy \fR?\fB\-force\fR? ?\fB\-\|\-\fR? \fIsource\fR ?\fIsource\fR ...? \fItargetDir\fR .RS The first form makes a copy of the file or directory \fIsource\fR under | | | | > > | | | | | | | 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | .VE .TP \fBfile copy \fR?\fB\-force\fR? ?\fB\-\|\-\fR? \fIsource\fR \fItarget\fR .br \fBfile copy \fR?\fB\-force\fR? ?\fB\-\|\-\fR? \fIsource\fR ?\fIsource\fR ...? \fItargetDir\fR .RS The first form makes a copy of the file or directory \fIsource\fR under the pathname \fItarget\fR. If \fItarget\fR is an existing directory, then the second form is used. The second form makes a copy inside \fItargetDir\fR of each \fIsource\fR file listed. If a directory is specified as a \fIsource\fR, then the contents of the directory will be recursively copied into \fItargetDir\fR. Existing files will not be overwritten unless the \fB\-force\fR option is specified. When copying within a single filesystem, \fIfile copy\fR will copy soft links (i.e. the links themselves are copied, not the things they point to). Trying to overwrite a non-empty directory, overwrite a directory with a file, or a file with a directory will all result in errors even if \fI\-force\fR was specified. Arguments are processed in the order specified, halting at the first error, if any. A \fB\-\|\-\fR marks the end of switches; the argument following the \fB\-\|\-\fR will be treated as a \fIsource\fR even if it starts with a \fB\-\fR. .RE .TP \fBfile delete \fR?\fB\-force\fR? ?\fB\-\|\-\fR? \fIpathname\fR ?\fIpathname\fR ... ? . Removes the file or directory specified by each \fIpathname\fR argument. Non-empty directories will be removed only if the \fB\-force\fR option is specified. Trying to delete a non-existent file is not considered an |
| ︙ | ︙ | |||
217 218 219 220 221 222 223 | . Returns the platform-specific name of the file. This is useful if the filename is needed to pass to a platform-specific call, such as exec under Windows or AppleScript on the Macintosh. .TP \fBfile normalize \fIname\fR . | | | | | > | > | | | 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 | . Returns the platform-specific name of the file. This is useful if the filename is needed to pass to a platform-specific call, such as exec under Windows or AppleScript on the Macintosh. .TP \fBfile normalize \fIname\fR . Returns a unique normalised path representation for the file, whose string value can be used as a unique identifier for the it. A normalized path is one which has all '../', './' removed. Also it is one which is in the ``standard'' format for the native platform. On MacOS, Unix, this means the path must be free of symbolic links/aliases, and on Windows it also means means we want the long form (when running Win NT/2000/XP) or the short form (when running Win 95/98) with that form's case-dependence (which gives us a unique, case-dependent path). .TP \fBfile owned \fIname\fR . Returns \fB1\fR if file \fIname\fR is owned by the current user, \fB0\fR otherwise. .TP \fBfile pathtype \fIname\fR |
| ︙ | ︙ | |||
251 252 253 254 255 256 257 | .TP \fBfile readlink \fIname\fR . Returns the value of the symbolic link given by \fIname\fR (i.e. the name of the file it points to). If \fIname\fR isn't a symbolic link or its value cannot be read, then an error is returned. On systems that don't support symbolic links this option is undefined. | | | | 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 | .TP \fBfile readlink \fIname\fR . Returns the value of the symbolic link given by \fIname\fR (i.e. the name of the file it points to). If \fIname\fR isn't a symbolic link or its value cannot be read, then an error is returned. On systems that don't support symbolic links this option is undefined. .TP \fBfile rename \fR?\fB\-force\fR? ?\fB\-\|\-\fR? \fIsource\fR \fItarget\fR .TP \fBfile rename \fR?\fB\-force\fR? ?\fB\-\|\-\fR? \fIsource\fR ?\fIsource\fR ...? \fItargetDir\fR .RS The first form takes the file or directory specified by pathname \fIsource\fR and renames it to \fItarget\fR, moving the file if the pathname \fItarget\fR specifies a name in a different directory. If \fItarget\fR is an existing directory, then the second form is used. The second form moves each \fIsource\fR file or directory into the directory |
| ︙ | ︙ |
Changes to doc/lappend.n.
1 2 3 4 5 6 7 | '\" '\" Copyright (c) 1993 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | > | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | '\" '\" Copyright (c) 1993 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" Copyright (c) 2001 Kevin B. Kenny. All rights reserved. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: lappend.n,v 1.4.14.1 2002/02/05 02:21:58 wolfsuit Exp $ '\" .so man.macros .TH lappend n "" Tcl "Tcl Built-In Commands" .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME lappend \- Append list elements onto a variable |
| ︙ | ︙ | |||
28 29 30 31 32 33 34 | are appended as list elements rather than raw text. This command provides a relatively efficient way to build up large lists. For example, ``\fBlappend a $b\fR'' is much more efficient than ``\fBset a [concat $a [list $b]]\fR'' when \fB$a\fR is long. .SH "SEE ALSO" | | > > > > | 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | are appended as list elements rather than raw text. This command provides a relatively efficient way to build up large lists. For example, ``\fBlappend a $b\fR'' is much more efficient than ``\fBset a [concat $a [list $b]]\fR'' when \fB$a\fR is long. .SH "SEE ALSO" list(n), lindex(n), linsert(n), llength(n), .VS 8.4 lset(n) .VE lsort(n), lrange(n) .SH KEYWORDS append, element, list, variable |
Changes to doc/lindex.n.
1 2 3 4 5 6 7 | '\" '\" Copyright (c) 1993 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | > | | | < > > > > > > > > > > > > > > > > > > > | > | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > | 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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\" Copyright (c) 2001 by Kevin B. Kenny. All rights reserved.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\"
'\" RCS: @(#) $Id: lindex.n,v 1.6.14.1 2002/02/05 02:21:58 wolfsuit Exp $
'\"
.so man.macros
.TH lindex n 8.4 Tcl "Tcl Built-In Commands"
.BS
'\" Note: do not modify the .SH NAME line immediately below!
.SH NAME
lindex \- Retrieve an element from a list
.SH SYNOPSIS
\fBlindex \fIlist ?index...?\fR
.BE
.SH DESCRIPTION
.PP
.VS 8.4
The \fBlindex\fP command accepts a parameter, \fIlist\fP, which
it treats as a Tcl list. It also accepts zero or more \fIindices\fP into
the list. The indices may be presented either consecutively on the
command line, or grouped in a
Tcl list and presented as a single argument.
.PP
If no indices are presented, the command takes the form:
.CS
lindex list
.CE
or
.CS
lindex list {}
.CE
In this case, the return value of \fBlindex\fR is simply the value of the
\fIlist\fR parameter.
.PP
When presented with a single index, the \fBlindex\fR command
treats \fIlist\fR as a Tcl list and returns the
.VE
\fIindex\fR'th element from it (0 refers to the first element of the list).
In extracting the element, \fBlindex\fR observes the same rules
concerning braces and quotes and backslashes as the Tcl command
interpreter; however, variable
substitution and command substitution do not occur.
If \fIindex\fR is negative or greater than or equal to the number
of elements in \fIvalue\fR, then an empty
string is returned.
If \fIindex\fR has the value \fBend\fR, it refers to the last element
in the list, and \fBend\-\fIinteger\fR refers to the last element in
the list minus the specified integer offset.
.PP
.VS 8.4
If additional \fIindex\fR arguments are supplied, then each argument is
used in turn to select an element from the previous indexing operation,
allowing the script to select elements from sublists. The command,
.CS
lindex $a 1 2 3
.CE
or
.CS
lindex $a {1 2 3}
.CE
is synonymous with
.CS
lindex [lindex [lindex $a 1] 2] 3
.CE
.SH EXAMPLES
.CS
lindex {a b c} => a b c
lindex {a b c} {} => a b c
lindex {a b c} 0 => a
lindex {a b c} 2 => c
lindex {a b c} end => c
lindex {a b c} end-1 => b
lindex {{a b c} {d e f} {g h i}} 2 1 => h
lindex {{a b c} {d e f} {g h i}} {2 1} => h
lindex {{{a b} {c d}} {{e f} {g h}}} 1 1 0 => g
lindex {{{a b} {c d}} {{e f} {g h}}} {1 1 0} => g
.CE
.VE
.SH "SEE ALSO"
list(n), lappend(n), linsert(n), llength(n), lsearch(n),
.VS 8.4
lset(n),
.VE
lsort(n),
lrange(n), lreplace(n)
.SH KEYWORDS
element, index, list
|
Changes to doc/linsert.n.
1 2 3 4 5 6 7 | '\" '\" Copyright (c) 1993 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | > | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | '\" '\" Copyright (c) 1993 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" Copyright (c) 2001 Kevin B. Kenny. All rights reserved. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: linsert.n,v 1.5.14.1 2002/02/05 02:21:58 wolfsuit Exp $ '\" .so man.macros .TH linsert n 8.2 Tcl "Tcl Built-In Commands" .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME linsert \- Insert elements into a list |
| ︙ | ︙ | |||
24 25 26 27 28 29 30 31 32 | \fIlist\fR. Each \fIelement\fR argument will become a separate element of the new list. If \fIindex\fR is less than or equal to zero, then the new elements are inserted at the beginning of the list. If \fIindex\fR has the value \fBend\fR, or if it is greater than or equal to the number of elements in the list, then the new elements are appended to the list. \fBend\-\fIinteger\fR refers to the last element in the list minus the specified integer offset. .SH "SEE ALSO" | > > | > > | 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | \fIlist\fR. Each \fIelement\fR argument will become a separate element of the new list. If \fIindex\fR is less than or equal to zero, then the new elements are inserted at the beginning of the list. If \fIindex\fR has the value \fBend\fR, or if it is greater than or equal to the number of elements in the list, then the new elements are appended to the list. \fBend\-\fIinteger\fR refers to the last element in the list minus the specified integer offset. .SH "SEE ALSO" .VS 8.4 list(n), lappend(n), lindex(n), llength(n), lsearch(n), lset(n), lsort(n), lrange(n), lreplace(n) .VE .SH KEYWORDS element, insert, list |
Changes to doc/list.n.
1 2 3 4 5 6 7 | '\" '\" Copyright (c) 1993 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | > | | | > > > > | 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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
'\"
'\" Copyright (c) 1993 The Regents of the University of California.
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
'\" Copyright (c) 2001 Kevin B. Kenny. All rights reserved.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\"
'\" RCS: @(#) $Id: list.n,v 1.4.14.1 2002/02/05 02:21:58 wolfsuit Exp $
'\"
.so man.macros
.TH list n "" Tcl "Tcl Built-In Commands"
.BS
'\" Note: do not modify the .SH NAME line immediately below!
.SH NAME
list \- Create a list
.SH SYNOPSIS
\fBlist \fR?\fIarg arg ...\fR?
.BE
.SH DESCRIPTION
.PP
This command returns a list comprised of all the \fIarg\fRs,
or an empty string if no \fIarg\fRs are specified.
Braces and backslashes get added as necessary, so that the \fBlindex\fR command
may be used on the result to re-extract the original arguments, and also
so that \fBeval\fR may be used to execute the resulting list, with
\fIarg1\fR comprising the command's name and the other \fIarg\fRs comprising
its arguments. \fBList\fR produces slightly different results than
\fBconcat\fR: \fBconcat\fR removes one level of grouping before forming
the list, while \fBlist\fR works directly from the original arguments.
For example, the command
.CS
\fBlist a b {c d e} {f {g h}}\fR
.CE
will return
.CS
\fBa b {c d e} {f {g h}}\fR
.CE
while \fBconcat\fR with the same arguments will return
.CS
\fBa b c d e f {g h}\fR
.CE
.SH "SEE ALSO"
lappend(n), lindex(n), linsert(n), llength(n), lsearch(n),
.VS 8.4
lset(n),
.VE
lsort(n),
lrange(n), lreplace(n)
.SH KEYWORDS
element, list
|
Changes to doc/llength.n.
1 2 3 4 5 6 7 | '\" '\" Copyright (c) 1993 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | > | > | > > | 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 | '\" '\" Copyright (c) 1993 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" Copyright (c) 2001 Kevin B. Kenny. All rights reserved. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: llength.n,v 1.4.14.1 2002/02/05 02:21:58 wolfsuit Exp $ '\" .so man.macros .TH llength n "" Tcl "Tcl Built-In Commands" .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME llength \- Count the number of elements in a list .SH SYNOPSIS \fBllength \fIlist\fR .BE .SH DESCRIPTION .PP Treats \fIlist\fR as a list and returns a decimal string giving the number of elements in it. .SH "SEE ALSO" .VS 8.4 list(n), lappend(n), lindex(n), linsert(n), lsearch(n), lset(n), lsort(n), lrange(n), lreplace(n) .VE .SH KEYWORDS element, list, length |
Changes to doc/lrange.n.
1 2 3 4 5 6 7 | '\" '\" Copyright (c) 1993 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | > | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | '\" '\" Copyright (c) 1993 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" Copyright (c) 2001 Kevin B. Kenny. All rights reserved. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: lrange.n,v 1.4.14.1 2002/02/05 02:21:58 wolfsuit Exp $ '\" .so man.macros .TH lrange n 7.4 Tcl "Tcl Built-In Commands" .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME lrange \- Return one or more adjacent elements from a list |
| ︙ | ︙ | |||
32 33 34 35 36 37 38 | is returned. Note: ``\fBlrange \fIlist first first\fR'' does not always produce the same result as ``\fBlindex \fIlist first\fR'' (although it often does for simple fields that aren't enclosed in braces); it does, however, produce exactly the same results as ``\fBlist [lindex \fIlist first\fB]\fR'' .SH "SEE ALSO" | > | > > | 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | is returned. Note: ``\fBlrange \fIlist first first\fR'' does not always produce the same result as ``\fBlindex \fIlist first\fR'' (although it often does for simple fields that aren't enclosed in braces); it does, however, produce exactly the same results as ``\fBlist [lindex \fIlist first\fB]\fR'' .SH "SEE ALSO" .VS 8.4 list(n), lappend(n), lindex(n), linsert(n), llength(n), lsearch(n), lset(n), lreplace(n), lsort(n) .VE .SH KEYWORDS element, list, range, sublist |
Changes to doc/lreplace.n.
1 2 3 4 5 6 7 | '\" '\" Copyright (c) 1993 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | > | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | '\" '\" Copyright (c) 1993 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" Copyright (c) 2001 Kevin B. Kenny. All rights reserved. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: lreplace.n,v 1.6.14.1 2002/02/05 02:21:58 wolfsuit Exp $ '\" .so man.macros .TH lreplace n 7.4 Tcl "Tcl Built-In Commands" .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME lreplace \- Replace elements in a list with new elements |
| ︙ | ︙ | |||
40 41 42 43 44 45 46 | be added to the list in place of those that were deleted. Each \fIelement\fR argument will become a separate element of the list. If no \fIelement\fR arguments are specified, then the elements between \fIfirst\fR and \fIlast\fR are simply deleted. If \fIlist\fR is empty, any \fIelement\fR arguments are added to the end of the list. .SH "SEE ALSO" | > | | > | 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | be added to the list in place of those that were deleted. Each \fIelement\fR argument will become a separate element of the list. If no \fIelement\fR arguments are specified, then the elements between \fIfirst\fR and \fIlast\fR are simply deleted. If \fIlist\fR is empty, any \fIelement\fR arguments are added to the end of the list. .SH "SEE ALSO" .VS 8.4 list(n), lappend(n), lindex(n), linsert(n), llength(n), lsearch(n), lset(n), lrange(n), lsort(n) .VE .SH KEYWORDS element, list, replace |
Changes to doc/lsearch.n.
1 2 3 4 5 6 7 | '\" '\" Copyright (c) 1993 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | > | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | '\" '\" Copyright (c) 1993 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" Copyright (c) 2001 Kevin B. Kenny. All rights reserved. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: lsearch.n,v 1.7.6.1 2002/02/05 02:21:58 wolfsuit Exp $ '\" .so man.macros .TH lsearch n 8.4 Tcl "Tcl Built-In Commands" .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME lsearch \- See if a list contains a particular element |
| ︙ | ︙ | |||
75 76 77 78 79 80 81 | \fB\-sorted\fR is specified, whichever option is specified last takes precendence. If more than one of \fB\-ascii\fR, \fB\-dictionary\fR, \fB\-integer\fR and \fB\-real\fR is specified, the option specified last takes precendence. If more than one of \fB\-increasing\fR and \fB\-decreasing\fR is specified, the option specified last takes precedence. .SH "SEE ALSO" | > | | > | 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | \fB\-sorted\fR is specified, whichever option is specified last takes precendence. If more than one of \fB\-ascii\fR, \fB\-dictionary\fR, \fB\-integer\fR and \fB\-real\fR is specified, the option specified last takes precendence. If more than one of \fB\-increasing\fR and \fB\-decreasing\fR is specified, the option specified last takes precedence. .SH "SEE ALSO" .VS 8.4 list(n), lappend(n), lindex(n), linsert(n), llength(n), lset(n), lsort(n), lrange(n), lreplace(n) .VE .SH KEYWORDS list, match, pattern, regular expression, search, string |
Added doc/lset.n.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
'\"
'\" Copyright (c) 2001 by Kevin B. Kenny. All rights reserved.
'\"
'\" See the file "license.terms" for information on usage and redistribution
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
'\"
'\" RCS: @(#) $Id: lset.n,v 1.2.4.1 2002/02/05 02:21:58 wolfsuit Exp $
'\"
.so man.macros
.TH lset n 8.4 Tcl "Tcl Built-In Commands"
.BS
'\" Note: do not modify the .SH NAME line immediately below!
.SH NAME
lset \- Change an element in a list
.SH SYNOPSIS
\fBlset \fIlist ?index...? newValue\fR
.BE
.SH DESCRIPTION
.PP
The \fBlset\fP command accepts a parameter, \fIlist\fP, which
it interprets as the name of a variable containing a Tcl list.
It also accepts zero or more \fIindices\fP into
the list. The indices may be presented either consecutively on the
command line, or grouped in a
Tcl list and presented as a single argument.
Finally, it acccepts a new value for an element of \fIlist\fP.
.PP
If no indices are presented, the command takes the form:
.CS
lset list newValue
.CE
or
.CS
lset list {} newValue
.CE
In this case, \fInewValue\fP replaces the old value of the variable \fIlist\fP.
.PP
When presented with a single index, the \fBlset\fR command
treats the content of the \fIlist\fR variable as a Tcl list.
It addresses the \fIindex\fR'th element in it
(0 refers to the first element of the list).
When interpreting the list, \fBlset\fR observes the same rules
concerning braces and quotes and backslashes as the Tcl command
interpreter; however, variable
substitution and command substitution do not occur.
The command constructs a new list in which the designated element is
replaced with \fInewValue\fP. This new list is stored in the
variable \fIlist\fP, and is also the return value from the \fBlset\fP
command.
.PP
If \fIindex\fR is negative or greater than or equal to the number
of elements in \fI$list\fR, then an error occurs.
.PP
If \fIindex\fR has the value \fBend\fR, it refers to the last element
in the list, and \fBend\-\fIinteger\fR refers to the last element in
the list minus the specified integer offset.
.PP
If additional \fIindex\fR arguments are supplied, then each argument is
used in turn to address an element within a sublist designated
by the previous indexing operation,
allowing the script to alter elements in sublists. The command,
.CS
lset a 1 2 newValue
.CE
or
.CS
lset a {1 2} newValue
.CE
replaces element 2 of sublist 1 with \fInewValue\fP.
.PP
The integer appearing in each \fIindex\fR argument must be greater
than or equal to zero. The integer appearing in each \fIindex\fR
argument must be strictly less than the length of the corresponding
list. In other words, the \fBlset\fR command cannot change the size
of a list. If an index is outside the permitted range, an error is reported.
.SH EXAMPLES
In each of these examples, the initial value of \fIx\fP is:
.CS
{a b c} {d e f} {g h i}
.CE
The indicated return value also becomes the new value of \fIx\fP.
.CS
lset x {j k l} => j k l
lset x {} {j k l} => j k l
lset x 0 j => j {d e f} {g h i}
lset x 2 j => {a b c} {d e f} j
lset x end j => {a b c} {d e f} j
lset x end-1 j => {a b c} j {d e f}
lset x 2 1 j => {a b c} {d e f} {g j i}
lset x {2 1} j => {a b c} {d e f} {g j i}
lset x {2 3} j
.CE
In the following examples, the initial value of \fIx\fP is:
.CS
{{a b} {c d}} {{e f} {g h}}
.CE
The indicated return value also becomes the new value of \fIx\fP.
.CS
lset x 1 1 0 j => {{a b} {c d}} {{e f} {j h}}
lset x {1 1 0} j => {{a b} {c d}} {{e f} {j h}}
.CE
.SH "SEE ALSO"
list(n), lappend(n), lindex(n), linsert(n), llength(n), lsearch(n),
lsort(n), lrange(n), lreplace(n)
.SH KEYWORDS
element, index, list, replace, set
.VE
|
Changes to doc/lsort.n.
1 2 3 4 5 6 7 8 | '\" '\" Copyright (c) 1993 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" Copyright (c) 1999 Scriptics Corporation '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | > | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | '\" '\" Copyright (c) 1993 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" Copyright (c) 1999 Scriptics Corporation '\" Copyright (c) 2001 Kevin B. Kenny. All rights reserved. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: lsort.n,v 1.10.2.1 2002/02/05 02:21:58 wolfsuit Exp $ '\" .so man.macros .TH lsort n 8.3 Tcl "Tcl Built-In Commands" .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME lsort \- Sort the elements of a list |
| ︙ | ︙ | |||
180 181 182 183 184 185 186 |
}
% lsort -command compare \\
{{3 apple} {0x2 carrot} {1 dingo} {2 banana}}
{1 dingo} {2 banana} {0x2 carrot} {3 apple}
.CE
.SH "SEE ALSO"
| > | | > | 181 182 183 184 185 186 187 188 189 190 191 192 193 194 |
}
% lsort -command compare \\
{{3 apple} {0x2 carrot} {1 dingo} {2 banana}}
{1 dingo} {2 banana} {0x2 carrot} {3 apple}
.CE
.SH "SEE ALSO"
.VS 8.4
list(n), lappend(n), lindex(n), linsert(n), llength(n), lsearch(n),
lset(n), lrange(n), lreplace(n)
.VE
.SH KEYWORDS
element, list, order, sort
|
Changes to doc/memory.n.
1 2 3 4 5 | '\" '\" Copyright (c) 1992-1999 by Karl Lehenbauer and Mark Diekhans '\" Copyright (c) 2000 by Scriptics Corporation. '\" All rights reserved. '\" | | | > > > > > > > > > > | > > > > > > > > > > > > > > > > > > | < < < < < < < < < < < | > | < | > | < < | > > | > | 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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | '\" '\" Copyright (c) 1992-1999 by Karl Lehenbauer and Mark Diekhans '\" Copyright (c) 2000 by Scriptics Corporation. '\" All rights reserved. '\" '\" RCS: @(#) $Id: memory.n,v 1.3.14.1 2002/02/05 02:21:58 wolfsuit Exp $ '\" .so man.macros .TH memory n 8.1 Tcl "Tcl Built-In Commands" .BS .SH NAME memory \- Control Tcl memory debugging capabilities. .SH SYNOPSIS \fBmemory \fIoption \fR?\fIarg arg ...\fR? .SH DESCRIPTION .PP The \fBmemory\fR command gives the Tcl developer control of Tcl's memory debugging capabilities. The memory command has several suboptions, which are described below. It is only available when Tcl has been compiled with memory debugging enabled (when \fBTCL_MEM_DEBUG\fR is defined at compile time), and after \fBTcl_InitMemory\fR has been called. .TP \fBmemory active\fR \fIfile\fR Write a list of all currently allocated memory to the specified \fIfile\fR. .TP \fBmemory break_on_malloc\fR \fIcount\fR After the \fIcount\fR allocations have been performed, \fBckalloc\fR outputs a message to this effect and that it is now attempting to enter the C debugger. Tcl will then issue a \fISIGINT\fR signal against itself. If you are running Tcl under a C debugger, it should then enter the debugger command mode. .TP \fBmemory info\fR Returns a report containing the total allocations and frees since Tcl began, the current packets allocated (the current number of calls to \fBckalloc\fR not met by a corresponding call to \fBckfree\fR), the current bytes allocated, and the maximum number of packets and bytes allocated. .TP \fB memory init [on|off]\fR Turn on or off the pre-initialization of all allocated memory with bogus bytes. Useful for detecting the use of uninitialized values. .TP \fBmemory onexit\fR \fIfile\fR Causes a list of all allocated memory to be written to the specified \fIfile\fR during the finalization of Tcl's memory subsystem. Useful for checking that memory is properly cleaned up during process exit. .TP \fBmemory tag\fR \fIstring\fR Each packet of memory allocated by \fBckalloc\fR can have associated with it a string-valued tag. In the lists of allocated memory generated by \fBmemory active\fR and \fBmemory onexit\fR, the tag for each packet is printed along with other information about the packet. The \fBmemory tag\fR command sets the tag value for subsequent calls to \fBckalloc\fR to be \fIstring\fR. .TP \fBmemory trace [on|off]\fR .br Turns memory tracing on or off. When memory tracing is on, every call to \fBckalloc\fR causes a line of trace information to be written to \fIstderr\fR, consisting of the word \fIckalloc\fR, followed by the address returned, the amount of memory allocated, and the C filename and line number of the code performing the allocation. For example: .RS .CS ckalloc 40e478 98 tclProc.c 1406 .CE Calls to \fBckfree\fR are traced in the same manner. .RE .TP \fBmemory trace_on_at_malloc\fR \fIcount\fR Enable memory tracing after \fIcount\fR \fBckalloc\fR's have been performed. For example, if you enter \fBmemory trace_on_at_malloc 100\fR, after the 100th call to \fBckalloc\fR, memory trace information will begin being displayed for all allocations and frees. Since there can be a lot of memory activity before a problem occurs, judicious use of this option can reduce the slowdown caused by tracing (and the amount of trace information produced), if you can identify a number of allocations that occur before the problem sets in. The current number of memory allocations that have occurred since Tcl started is printed on a guard zone failure. .TP \fBmemory validate [on|off]\fR Turns memory validation on or off. When memory validation is enabled, on every call to \fBckalloc\fR or \fBckfree\fR, the guard zones are checked for every piece of memory currently in existence that was allocated by \fBckalloc\fR. This has a large performance impact and should only be used when overwrite problems are strongly suspected. The advantage of enabling memory validation is that a guard zone overwrite can be detected on the first call to \fBckalloc\fR or \fBckfree\fR after the overwrite occurred, rather than when the specific memory with the overwritten guard zone(s) is freed, which may occur long after the overwrite occurred. .SH "SEE ALSO" ckalloc, ckfree, Tcl_ValidateAllMemory, Tcl_DumpActiveMemory, TCL_MEM_DEBUG .SH KEYWORDS memory, debug |
Changes to doc/open.n.
1 2 3 4 5 6 7 | '\" '\" Copyright (c) 1993 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | < < | 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 34 | '\" '\" Copyright (c) 1993 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: open.n,v 1.12.14.1 2002/02/05 02:21:58 wolfsuit Exp $ '\" .so man.macros .TH open n 8.3 Tcl "Tcl Built-In Commands" .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME open \- Open a file-based or command pipeline channel .SH SYNOPSIS .sp \fBopen \fIfileName\fR .br \fBopen \fIfileName access\fR .br \fBopen \fIfileName access permissions\fR .BE .SH DESCRIPTION .PP This command opens a file, serial port, or command pipeline and returns a channel identifier that may be used in future invocations of commands like \fBread\fR, \fBputs\fR, and \fBclose\fR. If the first character of \fIfileName\fR is not \fB|\fR then the command opens a file: \fIfileName\fR gives the name of the file to open, and it must conform to the conventions described in the \fBfilename\fR manual entry. .PP |
| ︙ | ︙ | |||
105 106 107 108 109 110 111 | If the file exists it is truncated to zero length. .PP If a new file is created as part of opening it, \fIpermissions\fR (an integer) is used to set the permissions for the new file in conjunction with the process's file mode creation mask. \fIPermissions\fR defaults to 0666. .PP | < < < | > > > > < | < | | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 | If the file exists it is truncated to zero length. .PP If a new file is created as part of opening it, \fIpermissions\fR (an integer) is used to set the permissions for the new file in conjunction with the process's file mode creation mask. \fIPermissions\fR defaults to 0666. .PP Note that if you are going to be reading or writing binary data from the channel created by this command, you should use the \fBfconfigure\fR command to change the \fB-translation\fR option of the channel to \fBbinary\fR before transferring any binary data. This is in contrast to the ``b'' character passed as part of the equivalent of the \fIaccess\fR parameter to some versions of the C library \fIfopen()\fR function. .SH "COMMAND PIPELINES" .PP If the first character of \fIfileName\fR is ``|'' then the remaining characters of \fIfileName\fR are treated as a list of arguments that describe a command pipeline to invoke, in the same style as the arguments for \fBexec\fR. In this case, the channel identifier returned by \fBopen\fR may be used to write to the command's input pipe or read from its output pipe, depending on the value of \fIaccess\fR. If write-only access is used (e.g. \fIaccess\fR is \fBw\fR), then standard output for the pipeline is directed to the current standard output unless overridden by the command. If read-only access is used (e.g. \fIaccess\fR is \fBr\fR), standard input for the pipeline is taken from the current standard input unless overridden by the command. The id of the spawned process is accessible through the \fBpid\fR command, using the channel id returned by \fBopen\fR as argument. .VS 8.4 .SH "SERIAL COMMUNICATIONS" .PP If \fIfileName\fR refers to a serial port, then the specified serial port is opened and initialized in a platform-dependent manner. Acceptable values for the \fIfileName\fR to use to open a serial port are described in the PORTABILITY ISSUES section. .PP The \fBfconfigure\fR command can be used to query and set additional configuration options specific to serial ports. .VE .SH "PORTABILITY ISSUES" .sp .TP \fBWindows \fR(all versions) . Valid values for \fIfileName\fR to open a serial port are of the form \fBcom\fIX\fB:\fR, where \fIX\fR is a number, generally from 1 to 4. |
| ︙ | ︙ | |||
262 263 264 265 266 267 268 | .LP See the PORTABILITY ISSUES section of the \fBexec\fR command for additional information not specific to command pipelines about executing applications on the various platforms .SH "SEE ALSO" file(n), close(n), filename(n), fconfigure(n), gets(n), read(n), | | | 230 231 232 233 234 235 236 237 238 239 240 241 | .LP See the PORTABILITY ISSUES section of the \fBexec\fR command for additional information not specific to command pipelines about executing applications on the various platforms .SH "SEE ALSO" file(n), close(n), filename(n), fconfigure(n), gets(n), read(n), puts(n), exec(n), pid(n), fopen(1) .SH KEYWORDS access mode, append, create, file, non-blocking, open, permissions, pipeline, process, serial |
Changes to doc/package.n.
1 2 3 4 5 6 | '\" '\" Copyright (c) 1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | '\" '\" Copyright (c) 1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: package.n,v 1.5.14.1 2002/02/05 02:21:58 wolfsuit Exp $ '\" .so man.macros .TH package n 7.5 Tcl "Tcl Built-In Commands" .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME package \- Facilities for package loading and version control |
| ︙ | ︙ | |||
110 111 112 113 114 115 116 | If a version of \fIpackage\fR has already been provided (by invoking the \fBpackage provide\fR command), then its version number must satisfy the criteria given by \fB\-exact\fR and \fIversion\fR and the command returns immediately. Otherwise, the command searches the database of information provided by previous \fBpackage ifneeded\fR commands to see if an acceptable version of the package is available. | | > | > | 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 | If a version of \fIpackage\fR has already been provided (by invoking the \fBpackage provide\fR command), then its version number must satisfy the criteria given by \fB\-exact\fR and \fIversion\fR and the command returns immediately. Otherwise, the command searches the database of information provided by previous \fBpackage ifneeded\fR commands to see if an acceptable version of the package is available. If so, the script for the highest acceptable version number is evaluated in the global namespace; it must do whatever is necessary to load the package, including calling \fBpackage provide\fR for the package. If the \fBpackage ifneeded\fR database does not contain an acceptable version of the package and a \fBpackage unknown\fR command has been specified for the interpreter then that command is evaluated in the global namespace; when it completes, Tcl checks again to see if the package is now provided or if there is a \fBpackage ifneeded\fR script for it. If all of these steps fail to provide an acceptable version of the package, then the command returns an error. .TP \fBpackage unknown \fR?\fIcommand\fR? This command supplies a ``last resort'' command to invoke during |
| ︙ | ︙ |
Changes to doc/regexp.n.
1 2 3 4 5 6 | '\" '\" Copyright (c) 1998 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | '\" '\" Copyright (c) 1998 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: regexp.n,v 1.10.14.1 2002/02/05 02:21:58 wolfsuit Exp $ '\" .so man.macros .TH regexp n 8.3 Tcl "Tcl Built-In Commands" .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME regexp \- Match a regular expression against a string |
| ︙ | ︙ | |||
45 46 47 48 49 50 51 | element of the list is a subexpression count. The second element is a list of property names that describe various attributes of the regular expression. This switch is primarily intended for debugging purposes. .TP 15 \fB\-expanded\fR Enables use of the expanded regular expression syntax where whitespace and comments are ignored. This is the same as specifying | | | | | > | 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | element of the list is a subexpression count. The second element is a list of property names that describe various attributes of the regular expression. This switch is primarily intended for debugging purposes. .TP 15 \fB\-expanded\fR Enables use of the expanded regular expression syntax where whitespace and comments are ignored. This is the same as specifying the \fB(?x)\fR embedded option (see the \fBre_syntax\fR manual page). .TP 15 \fB\-indices\fR Changes what is stored in the \fIsubMatchVar\fRs. Instead of storing the matching characters from \fIstring\fR, each variable will contain a list of two decimal strings giving the indices in \fIstring\fR of the first and last characters in the matching range of characters. .TP 15 \fB\-line\fR Enables newline-sensitive matching. By default, newline is a completely ordinary character with no special meaning. With this flag, `[^' bracket expressions and `.' never match newline, `^' matches an empty string after any newline in addition to its normal function, and `$' matches an empty string before any newline in addition to its normal function. This flag is equivalent to specifying both \fB\-linestop\fR and \fB\-lineanchor\fR, or the \fB(?n)\fR embedded option (see the \fBre_syntax\fR manual page). .TP 15 \fB\-linestop\fR Changes the behavior of `[^' bracket expressions and `.' so that they stop at newlines. This is the same as specifying the \fB(?p)\fR embedded option (see the \fBre_syntax\fR manual page). .TP 15 \fB\-lineanchor\fR Changes the behavior of `^' and `$' (the ``anchors'') so they match the beginning and end of a line respectively. This is the same as specifying the \fB(?w)\fR embedded option (see the \fBre_syntax\fR manual page). .TP 15 \fB\-nocase\fR Causes upper-case characters in \fIstring\fR to be treated as lower case during the matching process. .VS 8.3 .TP 15 \fB\-all\fR |
| ︙ | ︙ |
Changes to doc/regsub.n.
1 2 3 4 5 6 7 8 | '\" '\" Copyright (c) 1993 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" Copyright (c) 2000 Scriptics Corporation. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | '\" '\" Copyright (c) 1993 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" Copyright (c) 2000 Scriptics Corporation. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: regsub.n,v 1.6.14.1 2002/02/05 02:21:58 wolfsuit Exp $ '\" .so man.macros .TH regsub n 8.3 Tcl "Tcl Built-In Commands" .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME regsub \- Perform substitutions based on regular expression pattern matching |
| ︙ | ︙ | |||
56 57 58 59 60 61 62 | If \fB\-all\fR is specified, then ``&'' and ``\e\fIn\fR'' sequences are handled for each substitution using the information from the corresponding match. .TP 15 \fB\-expanded\fR Enables use of the expanded regular expression syntax where whitespace and comments are ignored. This is the same as specifying | | | | | > | 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | If \fB\-all\fR is specified, then ``&'' and ``\e\fIn\fR'' sequences are handled for each substitution using the information from the corresponding match. .TP 15 \fB\-expanded\fR Enables use of the expanded regular expression syntax where whitespace and comments are ignored. This is the same as specifying the \fB(?x)\fR embedded option (see the \fBre_syntax\fR manual page). .TP 15 \fB\-line\fR Enables newline-sensitive matching. By default, newline is a completely ordinary character with no special meaning. With this flag, `[^' bracket expressions and `.' never match newline, `^' matches an empty string after any newline in addition to its normal function, and `$' matches an empty string before any newline in addition to its normal function. This flag is equivalent to specifying both \fB\-linestop\fR and \fB\-lineanchor\fR, or the \fB(?n)\fR embedded option (see the \fBre_syntax\fR manual page). .TP 15 \fB\-linestop\fR Changes the behavior of `[^' bracket expressions and `.' so that they stop at newlines. This is the same as specifying the \fB(?p)\fR embedded option (see the \fBre_syntax\fR manual page). .TP 15 \fB\-lineanchor\fR Changes the behavior of `^' and `$' (the ``anchors'') so they match the beginning and end of a line respectively. This is the same as specifying the \fB(?w)\fR embedded option (see the \fBre_syntax\fR manual page). .TP 10 \fB\-nocase\fR Upper-case characters in \fIstring\fR will be converted to lower-case before matching against \fIexp\fR; however, substitutions specified by \fIsubSpec\fR use the original unconverted form of \fIstring\fR. .VS 8.3 .TP 10 |
| ︙ | ︙ |
Changes to doc/tclsh.1.
1 2 3 4 5 6 7 | '\" '\" Copyright (c) 1993 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | '\" '\" Copyright (c) 1993 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: tclsh.1,v 1.5.6.1 2002/02/05 02:21:58 wolfsuit Exp $ '\" .so man.macros .TH tclsh 1 "" Tcl "Tcl Applications" .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME tclsh \- Simple shell containing Tcl interpreter |
| ︙ | ︙ | |||
121 122 123 124 125 126 127 | The variable \fBtcl_prompt2\fR is used in a similar way when a newline is typed but the current command isn't yet complete; if \fBtcl_prompt2\fR isn't set then no prompt is output for incomplete commands. .SH "STANDARD CHANNELS" .PP | | | 121 122 123 124 125 126 127 128 129 130 131 132 133 134 | The variable \fBtcl_prompt2\fR is used in a similar way when a newline is typed but the current command isn't yet complete; if \fBtcl_prompt2\fR isn't set then no prompt is output for incomplete commands. .SH "STANDARD CHANNELS" .PP See \fBTcl_StandardChannels\fR for more explanations. .SH "SEE ALSO" fconfigure(1), tclvars(1) .SH KEYWORDS argument, interpreter, prompt, script file, shell |
Changes to doc/tcltest.n.
1 2 3 4 5 6 7 8 9 | '\" '\" Copyright (c) 1990-1994 The Regents of the University of California '\" Copyright (c) 1994-1997 Sun Microsystems, Inc. '\" Copyright (c) 1998-1999 Scriptics Corporation '\" Copyright (c) 2000 Ajuba Solutions '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | '\" '\" Copyright (c) 1990-1994 The Regents of the University of California '\" Copyright (c) 1994-1997 Sun Microsystems, Inc. '\" Copyright (c) 1998-1999 Scriptics Corporation '\" Copyright (c) 2000 Ajuba Solutions '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: tcltest.n,v 1.11.14.1 2002/02/05 02:21:58 wolfsuit Exp $ '\" .so man.macros .TH "tcltest" n 8.4 Tcl "Tcl Built-In Commands" .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME tcltest \- Test harness support code and utilities |
| ︙ | ︙ | |||
613 614 615 616 617 618 619 | nonblocking mode .TP \fIasyncPipeClose\fR test can only be run if platform supports async flush and async close on a pipe .TP \fIunixExecs\fR | | > | | 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 | nonblocking mode .TP \fIasyncPipeClose\fR test can only be run if platform supports async flush and async close on a pipe .TP \fIunixExecs\fR test can only be run if this machine has Unix-style commands \fBcat\fR, \fBecho\fR, \fBsh\fR, \fBwc\fR, \fBrm\fR, \fBsleep\fR, \fBfgrep\fR, \fBps\fR, \fBchmod\fR, and \fBmkdir\fR available .TP \fIhasIsoLocale\fR test can only be run if can switch to an ISO locale .TP \fIroot\fR test can only run if Unix user is root .TP |
| ︙ | ︙ | |||
874 875 876 877 878 879 880 | .CS tclsh all.tcl -constraints "knownBug nonPortable" .CE .PP See the \fI"Constraints"\fR section for information about using built-in constraints and adding new ones. .PP | | | | | 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 | .CS tclsh all.tcl -constraints "knownBug nonPortable" .CE .PP See the \fI"Constraints"\fR section for information about using built-in constraints and adding new ones. .PP When tests are run from within an \fBall.tcl\fR file, all files with a ``\fI.test\fR'' extension are normally run. An individual test file will be skipped if one of the following conditions is met: .IP [1] the \fIname\fR of the test files does not match (using glob style matching) one or more elements in the \fBtcltest::matchFiles\fR variable .IP [2] the \fIname\fR of the test file matches (using glob style matching) one or more elements in the \fBtcltest::skipFiles\fR variable .PP |
| ︙ | ︙ |
Changes to doc/tclvars.n.
1 2 3 4 5 6 7 | '\" '\" Copyright (c) 1993 The Regents of the University of California. '\" Copyright (c) 1994-1997 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | '\" '\" Copyright (c) 1993 The Regents of the University of California. '\" Copyright (c) 1994-1997 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: tclvars.n,v 1.9.4.1 2002/02/05 02:21:58 wolfsuit Exp $ '\" .so man.macros .TH tclvars n 8.0 Tcl "Tcl Built-In Commands" .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME tclvars \- Variables used by Tcl |
| ︙ | ︙ | |||
83 84 85 86 87 88 89 | .TP \fBTRASH_FOLDER\fR The path to the trash directory. .TP \fBSTART_UP_FOLDER\fR The path to the start up directory. .TP | | | 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | .TP \fBTRASH_FOLDER\fR The path to the trash directory. .TP \fBSTART_UP_FOLDER\fR The path to the start up directory. .TP \fBHOME\fR The path to the application's default directory. .PP You can also create your own environment variables for the Macintosh. A file named \fITcl Environment Variables\fR may be placed in the preferences folder in the Mac system folder. Each line of this file should be of the form \fIVAR_NAME=var_data\fR. .PP |
| ︙ | ︙ |
Changes to generic/regc_locale.c.
1 2 3 4 5 6 7 8 9 10 11 | /* * regc_locale.c -- * * This file contains the Unicode locale specific regexp routines. * This file is #included by regcomp.c. * * Copyright (c) 1998 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
/*
* regc_locale.c --
*
* This file contains the Unicode locale specific regexp routines.
* This file is #included by regcomp.c.
*
* Copyright (c) 1998 by Scriptics Corporation.
*
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
* RCS: @(#) $Id: regc_locale.c,v 1.6.10.1 2002/02/05 02:21:58 wolfsuit Exp $
*/
/* ASCII character-name table */
static struct cname {
char *name;
char code;
|
| ︙ | ︙ | |||
563 564 565 566 567 568 569 |
struct vars *v;
chr *startp; /* points to start of name */
chr *endp; /* points just past end of name */
{
struct cname *cn;
size_t len;
Tcl_DString ds;
| | | 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 |
struct vars *v;
chr *startp; /* points to start of name */
chr *endp; /* points just past end of name */
{
struct cname *cn;
size_t len;
Tcl_DString ds;
CONST char *np;
/* generic: one-chr names stand for themselves */
assert(startp < endp);
len = endp - startp;
if (len == 1)
return *startp;
|
| ︙ | ︙ | |||
710 711 712 713 714 715 716 |
chr *startp; /* where the name starts */
chr *endp; /* just past the end of the name */
int cases; /* case-independent? */
{
size_t len;
struct cvec *cv = NULL;
Tcl_DString ds;
| > | | 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 |
chr *startp; /* where the name starts */
chr *endp; /* just past the end of the name */
int cases; /* case-independent? */
{
size_t len;
struct cvec *cv = NULL;
Tcl_DString ds;
CONST char *np;
char **namePtr;
int i, index;
/*
* The following arrays define the valid character class names.
*/
static char *classNames[] = {
|
| ︙ | ︙ |
Changes to generic/tcl.decls.
1 2 3 4 5 6 7 8 9 10 11 12 | # tcl.decls -- # # This file contains the declarations for all supported public # functions that are exported by the Tcl library via the stubs table. # This file is used to generate the tclDecls.h, tclPlatDecls.h, # tclStub.c, and tclPlatStub.c files. # # # Copyright (c) 1998-1999 by Scriptics Corporation. # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | # tcl.decls -- # # This file contains the declarations for all supported public # functions that are exported by the Tcl library via the stubs table. # This file is used to generate the tclDecls.h, tclPlatDecls.h, # tclStub.c, and tclPlatStub.c files. # # # Copyright (c) 1998-1999 by Scriptics Corporation. # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # RCS: @(#) $Id: tcl.decls,v 1.63.2.2 2002/02/05 02:21:58 wolfsuit Exp $ library tcl # Define the tcl interface with several sub interfaces: # tclPlat - platform specific public # tclInt - generic private # tclPlatInt - platform specific private |
| ︙ | ︙ | |||
150 151 152 153 154 155 156 |
}
declare 35 generic {
int Tcl_GetDoubleFromObj(Tcl_Interp *interp, Tcl_Obj *objPtr, \
double *doublePtr)
}
declare 36 generic {
int Tcl_GetIndexFromObj(Tcl_Interp *interp, Tcl_Obj *objPtr, \
| | | | 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 |
}
declare 35 generic {
int Tcl_GetDoubleFromObj(Tcl_Interp *interp, Tcl_Obj *objPtr, \
double *doublePtr)
}
declare 36 generic {
int Tcl_GetIndexFromObj(Tcl_Interp *interp, Tcl_Obj *objPtr, \
CONST84 char **tablePtr, CONST char *msg, int flags, int *indexPtr)
}
declare 37 generic {
int Tcl_GetInt(Tcl_Interp *interp, CONST char *str, int *intPtr)
}
declare 38 generic {
int Tcl_GetIntFromObj(Tcl_Interp *interp, Tcl_Obj *objPtr, int *intPtr)
}
declare 39 generic {
int Tcl_GetLongFromObj(Tcl_Interp *interp, Tcl_Obj *objPtr, long *longPtr)
}
declare 40 generic {
Tcl_ObjType * Tcl_GetObjType(CONST char *typeName)
}
declare 41 generic {
char * Tcl_GetStringFromObj(Tcl_Obj *objPtr, int *lengthPtr)
}
declare 42 generic {
void Tcl_InvalidateStringRep(Tcl_Obj *objPtr)
}
|
| ︙ | ︙ | |||
285 286 287 288 289 290 291 |
declare 76 generic {
void Tcl_BackgroundError(Tcl_Interp *interp)
}
declare 77 generic {
char Tcl_Backslash(CONST char *src, int *readPtr)
}
declare 78 generic {
| | | | | | > | | | | | 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 |
declare 76 generic {
void Tcl_BackgroundError(Tcl_Interp *interp)
}
declare 77 generic {
char Tcl_Backslash(CONST char *src, int *readPtr)
}
declare 78 generic {
int Tcl_BadChannelOption(Tcl_Interp *interp, CONST char *optionName, \
CONST char *optionList)
}
declare 79 generic {
void Tcl_CallWhenDeleted(Tcl_Interp *interp, Tcl_InterpDeleteProc *proc, \
ClientData clientData)
}
declare 80 generic {
void Tcl_CancelIdleCall(Tcl_IdleProc *idleProc, ClientData clientData)
}
declare 81 generic {
int Tcl_Close(Tcl_Interp *interp, Tcl_Channel chan)
}
declare 82 generic {
int Tcl_CommandComplete(char *cmd)
}
declare 83 generic {
char * Tcl_Concat(int argc, CONST84 char * CONST *argv)
}
declare 84 generic {
int Tcl_ConvertElement(CONST char *src, char *dst, int flags)
}
declare 85 generic {
int Tcl_ConvertCountedElement(CONST char *src, int length, char *dst, \
int flags)
}
declare 86 generic {
int Tcl_CreateAlias(Tcl_Interp *slave, CONST char *slaveCmd, \
Tcl_Interp *target, CONST char *targetCmd, int argc, \
char * CONST *argv)
}
declare 87 generic {
int Tcl_CreateAliasObj(Tcl_Interp *slave, CONST char *slaveCmd, \
Tcl_Interp *target, CONST char *targetCmd, int objc, \
Tcl_Obj *CONST objv[])
}
declare 88 generic {
Tcl_Channel Tcl_CreateChannel(Tcl_ChannelType *typePtr,
CONST char *chanName, ClientData instanceData, int mask)
}
declare 89 generic {
void Tcl_CreateChannelHandler(Tcl_Channel chan, int mask, \
Tcl_ChannelProc *proc, ClientData clientData)
}
declare 90 generic {
void Tcl_CreateCloseHandler(Tcl_Channel chan, Tcl_CloseProc *proc, \
|
| ︙ | ︙ | |||
359 360 361 362 363 364 365 |
declare 96 generic {
Tcl_Command Tcl_CreateObjCommand(Tcl_Interp *interp, \
CONST char *cmdName, \
Tcl_ObjCmdProc *proc, ClientData clientData, \
Tcl_CmdDeleteProc *deleteProc)
}
declare 97 generic {
| | | 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 |
declare 96 generic {
Tcl_Command Tcl_CreateObjCommand(Tcl_Interp *interp, \
CONST char *cmdName, \
Tcl_ObjCmdProc *proc, ClientData clientData, \
Tcl_CmdDeleteProc *deleteProc)
}
declare 97 generic {
Tcl_Interp * Tcl_CreateSlave(Tcl_Interp *interp, CONST char *slaveName, \
int isSafe)
}
declare 98 generic {
Tcl_TimerToken Tcl_CreateTimerHandler(int milliseconds, \
Tcl_TimerProc *proc, ClientData clientData)
}
declare 99 generic {
|
| ︙ | ︙ | |||
458 459 460 461 462 463 464 |
declare 125 generic {
void Tcl_DStringStartSublist(Tcl_DString *dsPtr)
}
declare 126 generic {
int Tcl_Eof(Tcl_Channel chan)
}
declare 127 generic {
| | | | | 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 |
declare 125 generic {
void Tcl_DStringStartSublist(Tcl_DString *dsPtr)
}
declare 126 generic {
int Tcl_Eof(Tcl_Channel chan)
}
declare 127 generic {
CONST char * Tcl_ErrnoId(void)
}
declare 128 generic {
CONST char * Tcl_ErrnoMsg(int err)
}
declare 129 generic {
int Tcl_Eval(Tcl_Interp *interp, char *string)
}
# This is obsolete, use Tcl_FSEvalFile
declare 130 generic {
int Tcl_EvalFile(Tcl_Interp *interp, CONST char *fileName)
}
declare 131 generic {
int Tcl_EvalObj(Tcl_Interp *interp, Tcl_Obj *objPtr)
}
declare 132 generic {
void Tcl_EventuallyFree(ClientData clientData, Tcl_FreeProc *freeProc)
}
|
| ︙ | ︙ | |||
525 526 527 528 529 530 531 |
declare 146 generic {
int Tcl_Flush(Tcl_Channel chan)
}
declare 147 generic {
void Tcl_FreeResult(Tcl_Interp *interp)
}
declare 148 generic {
| | | | | | | | | | | | | | | | > | 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 |
declare 146 generic {
int Tcl_Flush(Tcl_Channel chan)
}
declare 147 generic {
void Tcl_FreeResult(Tcl_Interp *interp)
}
declare 148 generic {
int Tcl_GetAlias(Tcl_Interp *interp, CONST char *slaveCmd, \
Tcl_Interp **targetInterpPtr, CONST84 char **targetCmdPtr, \
int *argcPtr, char ***argvPtr)
}
declare 149 generic {
int Tcl_GetAliasObj(Tcl_Interp *interp, CONST char *slaveCmd, \
Tcl_Interp **targetInterpPtr, CONST84 char **targetCmdPtr, \
int *objcPtr, Tcl_Obj ***objv)
}
declare 150 generic {
ClientData Tcl_GetAssocData(Tcl_Interp *interp, CONST char *name, \
Tcl_InterpDeleteProc **procPtr)
}
declare 151 generic {
Tcl_Channel Tcl_GetChannel(Tcl_Interp *interp, CONST char *chanName, \
int *modePtr)
}
declare 152 generic {
int Tcl_GetChannelBufferSize(Tcl_Channel chan)
}
declare 153 generic {
int Tcl_GetChannelHandle(Tcl_Channel chan, int direction, \
ClientData *handlePtr)
}
declare 154 generic {
ClientData Tcl_GetChannelInstanceData(Tcl_Channel chan)
}
declare 155 generic {
int Tcl_GetChannelMode(Tcl_Channel chan)
}
declare 156 generic {
CONST char * Tcl_GetChannelName(Tcl_Channel chan)
}
declare 157 generic {
int Tcl_GetChannelOption(Tcl_Interp *interp, Tcl_Channel chan, \
CONST char *optionName, Tcl_DString *dsPtr)
}
declare 158 generic {
Tcl_ChannelType * Tcl_GetChannelType(Tcl_Channel chan)
}
declare 159 generic {
int Tcl_GetCommandInfo(Tcl_Interp *interp, CONST char *cmdName, \
Tcl_CmdInfo *infoPtr)
}
declare 160 generic {
CONST char * Tcl_GetCommandName(Tcl_Interp *interp, Tcl_Command command)
}
declare 161 generic {
int Tcl_GetErrno(void)
}
declare 162 generic {
CONST char * Tcl_GetHostName(void)
}
declare 163 generic {
int Tcl_GetInterpPath(Tcl_Interp *askInterp, Tcl_Interp *slaveInterp)
}
declare 164 generic {
Tcl_Interp * Tcl_GetMaster(Tcl_Interp *interp)
}
declare 165 generic {
CONST char * Tcl_GetNameOfExecutable(void)
}
declare 166 generic {
Tcl_Obj * Tcl_GetObjResult(Tcl_Interp *interp)
}
# Tcl_GetOpenFile is only available on unix, but it is a part of the old
# generic interface, so we inlcude it here for compatibility reasons.
declare 167 unix {
int Tcl_GetOpenFile(Tcl_Interp *interp, CONST char *str, int forWriting, \
int checkUsage, ClientData *filePtr)
}
# Obsolete. Should now use Tcl_FSGetPathType which is objectified
# and therefore usually faster.
declare 168 generic {
Tcl_PathType Tcl_GetPathType(CONST char *path)
}
declare 169 generic {
int Tcl_Gets(Tcl_Channel chan, Tcl_DString *dsPtr)
}
declare 170 generic {
int Tcl_GetsObj(Tcl_Channel chan, Tcl_Obj *objPtr)
}
declare 171 generic {
int Tcl_GetServiceMode(void)
}
declare 172 generic {
Tcl_Interp * Tcl_GetSlave(Tcl_Interp *interp, CONST char *slaveName)
}
declare 173 generic {
Tcl_Channel Tcl_GetStdChannel(int type)
}
declare 174 generic {
CONST char * Tcl_GetStringResult(Tcl_Interp *interp)
}
declare 175 generic {
CONST char * Tcl_GetVar(Tcl_Interp *interp, char *varName, int flags)
}
declare 176 generic {
CONST char * Tcl_GetVar2(Tcl_Interp *interp, char *part1, char *part2, \
int flags)
}
declare 177 generic {
int Tcl_GlobalEval(Tcl_Interp *interp, char *command)
}
declare 178 generic {
int Tcl_GlobalEvalObj(Tcl_Interp *interp, Tcl_Obj *objPtr)
}
|
| ︙ | ︙ | |||
657 658 659 660 661 662 663 |
int Tcl_InterpDeleted(Tcl_Interp *interp)
}
declare 185 generic {
int Tcl_IsSafe(Tcl_Interp *interp)
}
# Obsolete, use Tcl_FSJoinPath
declare 186 generic {
| > | | | | | | | > | | | | | > | | | 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 |
int Tcl_InterpDeleted(Tcl_Interp *interp)
}
declare 185 generic {
int Tcl_IsSafe(Tcl_Interp *interp)
}
# Obsolete, use Tcl_FSJoinPath
declare 186 generic {
CONST char * Tcl_JoinPath(int argc, CONST84 char * CONST *argv,
Tcl_DString *resultPtr)
}
declare 187 generic {
int Tcl_LinkVar(Tcl_Interp *interp, char *varName, char *addr, int type)
}
# This slot is reserved for use by the plus patch:
# declare 188 generic {
# Tcl_MainLoop
# }
declare 189 generic {
Tcl_Channel Tcl_MakeFileChannel(ClientData handle, int mode)
}
declare 190 generic {
int Tcl_MakeSafe(Tcl_Interp *interp)
}
declare 191 generic {
Tcl_Channel Tcl_MakeTcpClientChannel(ClientData tcpSocket)
}
declare 192 generic {
char * Tcl_Merge(int argc, CONST84 char * CONST *argv)
}
declare 193 generic {
Tcl_HashEntry * Tcl_NextHashEntry(Tcl_HashSearch *searchPtr)
}
declare 194 generic {
void Tcl_NotifyChannel(Tcl_Channel channel, int mask)
}
declare 195 generic {
Tcl_Obj * Tcl_ObjGetVar2(Tcl_Interp *interp, Tcl_Obj *part1Ptr, \
Tcl_Obj *part2Ptr, int flags)
}
declare 196 generic {
Tcl_Obj * Tcl_ObjSetVar2(Tcl_Interp *interp, Tcl_Obj *part1Ptr, \
Tcl_Obj *part2Ptr, Tcl_Obj *newValuePtr, int flags)
}
declare 197 {unix win} {
Tcl_Channel Tcl_OpenCommandChannel(Tcl_Interp *interp, int argc, \
CONST84 char **argv, int flags)
}
# This is obsolete, use Tcl_FSOpenFileChannel
declare 198 generic {
Tcl_Channel Tcl_OpenFileChannel(Tcl_Interp *interp, CONST char *fileName, \
CONST char *modeString, int permissions)
}
declare 199 generic {
Tcl_Channel Tcl_OpenTcpClient(Tcl_Interp *interp, int port, \
CONST char *address, CONST char *myaddr, int myport, int async)
}
declare 200 generic {
Tcl_Channel Tcl_OpenTcpServer(Tcl_Interp *interp, int port, \
CONST char *host, Tcl_TcpAcceptProc *acceptProc, \
ClientData callbackData)
}
declare 201 generic {
void Tcl_Preserve(ClientData data)
}
declare 202 generic {
void Tcl_PrintDouble(Tcl_Interp *interp, double value, char *dst)
}
declare 203 generic {
int Tcl_PutEnv(CONST char *string)
}
declare 204 generic {
CONST char * Tcl_PosixError(Tcl_Interp *interp)
}
declare 205 generic {
void Tcl_QueueEvent(Tcl_Event *evPtr, Tcl_QueuePosition position)
}
declare 206 generic {
int Tcl_Read(Tcl_Channel chan, char *bufPtr, int toRead)
}
declare 207 {unix win} {
void Tcl_ReapDetachedProcs(void)
}
declare 208 generic {
int Tcl_RecordAndEval(Tcl_Interp *interp, CONST char *cmd, int flags)
}
declare 209 generic {
int Tcl_RecordAndEvalObj(Tcl_Interp *interp, Tcl_Obj *cmdPtr, int flags)
}
declare 210 generic {
void Tcl_RegisterChannel(Tcl_Interp *interp, Tcl_Channel chan)
}
declare 211 generic {
void Tcl_RegisterObjType(Tcl_ObjType *typePtr)
}
declare 212 generic {
Tcl_RegExp Tcl_RegExpCompile(Tcl_Interp *interp, CONST char *string)
}
declare 213 generic {
int Tcl_RegExpExec(Tcl_Interp *interp, Tcl_RegExp regexp, \
CONST char *str, CONST char *start)
}
declare 214 generic {
int Tcl_RegExpMatch(Tcl_Interp *interp, CONST char *str, \
CONST char *pattern)
}
declare 215 generic {
void Tcl_RegExpRange(Tcl_RegExp regexp, int index, \
CONST char **startPtr, CONST char **endPtr)
}
declare 216 generic {
void Tcl_Release(ClientData clientData)
}
declare 217 generic {
void Tcl_ResetResult(Tcl_Interp *interp)
}
|
| ︙ | ︙ | |||
788 789 790 791 792 793 794 |
Tcl_InterpDeleteProc *proc, ClientData clientData)
}
declare 224 generic {
void Tcl_SetChannelBufferSize(Tcl_Channel chan, int sz)
}
declare 225 generic {
int Tcl_SetChannelOption(Tcl_Interp *interp, Tcl_Channel chan, \
| | | 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 |
Tcl_InterpDeleteProc *proc, ClientData clientData)
}
declare 224 generic {
void Tcl_SetChannelBufferSize(Tcl_Channel chan, int sz)
}
declare 225 generic {
int Tcl_SetChannelOption(Tcl_Interp *interp, Tcl_Channel chan, \
CONST char *optionName, CONST char *newValue)
}
declare 226 generic {
int Tcl_SetCommandInfo(Tcl_Interp *interp, CONST char *cmdName, \
Tcl_CmdInfo *infoPtr)
}
declare 227 generic {
void Tcl_SetErrno(int err)
|
| ︙ | ︙ | |||
826 827 828 829 830 831 832 |
declare 235 generic {
void Tcl_SetObjResult(Tcl_Interp *interp, Tcl_Obj *resultObjPtr)
}
declare 236 generic {
void Tcl_SetStdChannel(Tcl_Channel channel, int type)
}
declare 237 generic {
| | | | | | | | | | | | | 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 |
declare 235 generic {
void Tcl_SetObjResult(Tcl_Interp *interp, Tcl_Obj *resultObjPtr)
}
declare 236 generic {
void Tcl_SetStdChannel(Tcl_Channel channel, int type)
}
declare 237 generic {
CONST char * Tcl_SetVar(Tcl_Interp *interp, char *varName, \
CONST char *newValue, int flags)
}
declare 238 generic {
CONST char * Tcl_SetVar2(Tcl_Interp *interp, char *part1, char *part2, \
CONST char *newValue, int flags)
}
declare 239 generic {
CONST char * Tcl_SignalId(int sig)
}
declare 240 generic {
CONST char * Tcl_SignalMsg(int sig)
}
declare 241 generic {
void Tcl_SourceRCFile(Tcl_Interp *interp)
}
declare 242 generic {
int Tcl_SplitList(Tcl_Interp *interp, CONST char *listStr, int *argcPtr, \
CONST84 char ***argvPtr)
}
# Obsolete, use Tcl_FSSplitPath
declare 243 generic {
void Tcl_SplitPath(CONST char *path, int *argcPtr, CONST84 char ***argvPtr)
}
declare 244 generic {
void Tcl_StaticPackage(Tcl_Interp *interp, CONST char *pkgName, \
Tcl_PackageInitProc *initProc, Tcl_PackageInitProc *safeInitProc)
}
declare 245 generic {
int Tcl_StringMatch(CONST char *str, CONST char *pattern)
}
declare 246 generic {
int Tcl_Tell(Tcl_Channel chan)
}
declare 247 generic {
int Tcl_TraceVar(Tcl_Interp *interp, char *varName, int flags, \
Tcl_VarTraceProc *proc, ClientData clientData)
}
declare 248 generic {
int Tcl_TraceVar2(Tcl_Interp *interp, char *part1, char *part2, \
int flags, Tcl_VarTraceProc *proc, ClientData clientData)
}
declare 249 generic {
CONST char * Tcl_TranslateFileName(Tcl_Interp *interp, CONST char *name, \
Tcl_DString *bufferPtr)
}
declare 250 generic {
int Tcl_Ungets(Tcl_Channel chan, CONST char *str, int len, int atHead)
}
declare 251 generic {
void Tcl_UnlinkVar(Tcl_Interp *interp, char *varName)
}
declare 252 generic {
int Tcl_UnregisterChannel(Tcl_Interp *interp, Tcl_Channel chan)
}
|
| ︙ | ︙ | |||
919 920 921 922 923 924 925 |
}
declare 262 generic {
ClientData Tcl_VarTraceInfo2(Tcl_Interp *interp, char *part1, \
char *part2, int flags, Tcl_VarTraceProc *procPtr, \
ClientData prevClientData)
}
declare 263 generic {
| | | | | | 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 |
}
declare 262 generic {
ClientData Tcl_VarTraceInfo2(Tcl_Interp *interp, char *part1, \
char *part2, int flags, Tcl_VarTraceProc *procPtr, \
ClientData prevClientData)
}
declare 263 generic {
int Tcl_Write(Tcl_Channel chan, CONST char *s, int slen)
}
declare 264 generic {
void Tcl_WrongNumArgs(Tcl_Interp *interp, int objc, \
Tcl_Obj *CONST objv[], CONST char *message)
}
declare 265 generic {
int Tcl_DumpActiveMemory( CONST char *fileName )
}
declare 266 generic {
void Tcl_ValidateAllMemory( CONST char *file, int line )
}
declare 267 generic {
void Tcl_AppendResultVA(Tcl_Interp *interp, va_list argList)
}
declare 268 generic {
void Tcl_AppendStringsToObjVA(Tcl_Obj *objPtr, va_list argList)
}
declare 269 generic {
CONST char * Tcl_HashStats(Tcl_HashTable *tablePtr)
}
declare 270 generic {
CONST char * Tcl_ParseVar(Tcl_Interp *interp, char *str, char **termPtr)
}
declare 271 generic {
CONST char * Tcl_PkgPresent(Tcl_Interp *interp, CONST char *name,
CONST char *version, int exact)
}
declare 272 generic {
CONST char * Tcl_PkgPresentEx(Tcl_Interp *interp, CONST char *name,
|
| ︙ | ︙ | |||
1053 1054 1055 1056 1057 1058 1059 |
declare 295 generic {
int Tcl_ExternalToUtf(Tcl_Interp *interp, Tcl_Encoding encoding, \
CONST char *src, int srcLen, int flags, \
Tcl_EncodingState *statePtr, char *dst, int dstLen, \
int *srcReadPtr, int *dstWrotePtr, int *dstCharsPtr)
}
declare 296 generic {
| | | | | > | 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 |
declare 295 generic {
int Tcl_ExternalToUtf(Tcl_Interp *interp, Tcl_Encoding encoding, \
CONST char *src, int srcLen, int flags, \
Tcl_EncodingState *statePtr, char *dst, int dstLen, \
int *srcReadPtr, int *dstWrotePtr, int *dstCharsPtr)
}
declare 296 generic {
CONST char * Tcl_ExternalToUtfDString(Tcl_Encoding encoding, \
CONST char *src, int srcLen, Tcl_DString *dsPtr)
}
declare 297 generic {
void Tcl_FinalizeThread(void)
}
declare 298 generic {
void Tcl_FinalizeNotifier(ClientData clientData)
}
declare 299 generic {
void Tcl_FreeEncoding(Tcl_Encoding encoding)
}
declare 300 generic {
Tcl_ThreadId Tcl_GetCurrentThread(void)
}
declare 301 generic {
Tcl_Encoding Tcl_GetEncoding(Tcl_Interp *interp, CONST char *name)
}
declare 302 generic {
CONST char * Tcl_GetEncodingName(Tcl_Encoding encoding)
}
declare 303 generic {
void Tcl_GetEncodingNames(Tcl_Interp *interp)
}
declare 304 generic {
int Tcl_GetIndexFromObjStruct(Tcl_Interp *interp, Tcl_Obj *objPtr, \
CONST char **tablePtr, int offset, CONST char *msg, int flags, \
int *indexPtr)
}
declare 305 generic {
VOID * Tcl_GetThreadData(Tcl_ThreadDataKey *keyPtr, int size)
}
declare 306 generic {
Tcl_Obj * Tcl_GetVar2Ex(Tcl_Interp *interp, char *part1, char *part2, \
int flags)
|
| ︙ | ︙ | |||
1147 1148 1149 1150 1151 1152 1153 |
declare 323 generic {
Tcl_UniChar Tcl_UniCharToUpper(int ch)
}
declare 324 generic {
int Tcl_UniCharToUtf(int ch, char *buf)
}
declare 325 generic {
| | | | | | | | | 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 |
declare 323 generic {
Tcl_UniChar Tcl_UniCharToUpper(int ch)
}
declare 324 generic {
int Tcl_UniCharToUtf(int ch, char *buf)
}
declare 325 generic {
CONST char * Tcl_UtfAtIndex(CONST char *src, int index)
}
declare 326 generic {
int Tcl_UtfCharComplete(CONST char *src, int len)
}
declare 327 generic {
int Tcl_UtfBackslash(CONST char *src, int *readPtr, char *dst)
}
declare 328 generic {
CONST char * Tcl_UtfFindFirst(CONST char *src, int ch)
}
declare 329 generic {
CONST char * Tcl_UtfFindLast(CONST char *src, int ch)
}
declare 330 generic {
CONST char * Tcl_UtfNext(CONST char *src)
}
declare 331 generic {
CONST char * Tcl_UtfPrev(CONST char *src, CONST char *start)
}
declare 332 generic {
int Tcl_UtfToExternal(Tcl_Interp *interp, Tcl_Encoding encoding, \
CONST char *src, int srcLen, int flags, \
Tcl_EncodingState *statePtr, char *dst, int dstLen, \
int *srcReadPtr, int *dstWrotePtr, int *dstCharsPtr)
}
declare 333 generic {
CONST char * Tcl_UtfToExternalDString(Tcl_Encoding encoding, \
CONST char *src, int srcLen, Tcl_DString *dsPtr)
}
declare 334 generic {
int Tcl_UtfToLower(char *src)
}
declare 335 generic {
int Tcl_UtfToTitle(char *src)
}
|
| ︙ | ︙ | |||
1199 1200 1201 1202 1203 1204 1205 |
declare 339 generic {
int Tcl_WriteObj(Tcl_Channel chan, Tcl_Obj *objPtr)
}
declare 340 generic {
char * Tcl_GetString(Tcl_Obj *objPtr)
}
declare 341 generic {
| | | | 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 |
declare 339 generic {
int Tcl_WriteObj(Tcl_Channel chan, Tcl_Obj *objPtr)
}
declare 340 generic {
char * Tcl_GetString(Tcl_Obj *objPtr)
}
declare 341 generic {
CONST char * Tcl_GetDefaultEncodingDir(void)
}
declare 342 generic {
void Tcl_SetDefaultEncodingDir(CONST char *path)
}
declare 343 generic {
void Tcl_AlertNotifier(ClientData clientData)
}
declare 344 generic {
void Tcl_ServiceModeHook(int mode)
}
|
| ︙ | ︙ | |||
1232 1233 1234 1235 1236 1237 1238 |
declare 350 generic {
int Tcl_UniCharIsUpper(int ch)
}
declare 351 generic {
int Tcl_UniCharIsWordChar(int ch)
}
declare 352 generic {
| | | | | | | | | | | 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 |
declare 350 generic {
int Tcl_UniCharIsUpper(int ch)
}
declare 351 generic {
int Tcl_UniCharIsWordChar(int ch)
}
declare 352 generic {
int Tcl_UniCharLen(CONST Tcl_UniChar *str)
}
declare 353 generic {
int Tcl_UniCharNcmp(CONST Tcl_UniChar *cs, CONST Tcl_UniChar *ct,\
unsigned long n)
}
declare 354 generic {
CONST char * Tcl_UniCharToUtfDString(CONST Tcl_UniChar *string, \
int numChars, Tcl_DString *dsPtr)
}
declare 355 generic {
CONST Tcl_UniChar * Tcl_UtfToUniCharDString(CONST char *string, \
int length, Tcl_DString *dsPtr)
}
declare 356 generic {
Tcl_RegExp Tcl_GetRegExpFromObj(Tcl_Interp *interp, Tcl_Obj *patObj, int flags)
}
declare 357 generic {
Tcl_Obj *Tcl_EvalTokens (Tcl_Interp *interp, Tcl_Token *tokenPtr, \
int count)
}
declare 358 generic {
void Tcl_FreeParse (Tcl_Parse *parsePtr)
}
declare 359 generic {
void Tcl_LogCommandInfo (Tcl_Interp *interp, CONST char *script, \
CONST char *command, int length)
}
declare 360 generic {
int Tcl_ParseBraces (Tcl_Interp *interp, char *string, \
int numBytes, Tcl_Parse *parsePtr, int append, char **termPtr)
}
declare 361 generic {
int Tcl_ParseCommand (Tcl_Interp *interp, char *string, int numBytes, \
int nested, Tcl_Parse *parsePtr)
}
declare 362 generic {
int Tcl_ParseExpr(Tcl_Interp *interp, char *string, int numBytes, \
Tcl_Parse *parsePtr)
}
declare 363 generic {
int Tcl_ParseQuotedString(Tcl_Interp *interp, char *string, int numBytes, \
Tcl_Parse *parsePtr, int append, char **termPtr)
}
declare 364 generic {
int Tcl_ParseVarName (Tcl_Interp *interp, char *string, \
int numBytes, Tcl_Parse *parsePtr, int append)
}
# These 4 functions are obsolete, use Tcl_FSGetCwd, Tcl_FSChdir,
# Tcl_FSAccess and Tcl_FSStat
declare 365 generic {
CONST char *Tcl_GetCwd(Tcl_Interp *interp, Tcl_DString *cwdPtr)
}
declare 366 generic {
int Tcl_Chdir(CONST char *dirName)
}
declare 367 generic {
int Tcl_Access(CONST char *path, int mode)
}
|
| ︙ | ︙ | |||
1360 1361 1362 1363 1364 1365 1366 |
declare 387 generic {
Tcl_Mutex * Tcl_GetAllocMutex(void)
}
declare 388 generic {
int Tcl_GetChannelNames(Tcl_Interp *interp)
}
declare 389 generic {
| | | 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 |
declare 387 generic {
Tcl_Mutex * Tcl_GetAllocMutex(void)
}
declare 388 generic {
int Tcl_GetChannelNames(Tcl_Interp *interp)
}
declare 389 generic {
int Tcl_GetChannelNamesEx(Tcl_Interp *interp, CONST char *pattern)
}
declare 390 generic {
int Tcl_ProcObjCmd(ClientData clientData, Tcl_Interp *interp, \
int objc, Tcl_Obj *CONST objv[])
}
declare 391 generic {
void Tcl_ConditionFinalize (Tcl_Condition *condPtr)
|
| ︙ | ︙ | |||
1382 1383 1384 1385 1386 1387 1388 |
}
# Introduced in 8.3.2
declare 394 generic {
int Tcl_ReadRaw (Tcl_Channel chan, char *dst, int bytesToRead)
}
declare 395 generic {
| | | | 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 |
}
# Introduced in 8.3.2
declare 394 generic {
int Tcl_ReadRaw (Tcl_Channel chan, char *dst, int bytesToRead)
}
declare 395 generic {
int Tcl_WriteRaw (Tcl_Channel chan, CONST char *src, int srcLen)
}
declare 396 generic {
Tcl_Channel Tcl_GetTopChannel (Tcl_Channel chan)
}
declare 397 generic {
int Tcl_ChannelBuffered (Tcl_Channel chan)
}
declare 398 generic {
CONST char * Tcl_ChannelName(Tcl_ChannelType *chanTypePtr)
}
declare 399 generic {
Tcl_ChannelTypeVersion Tcl_ChannelVersion(Tcl_ChannelType *chanTypePtr)
}
declare 400 generic {
Tcl_DriverBlockModeProc * Tcl_ChannelBlockModeProc(Tcl_ChannelType \
*chanTypePtr)
|
| ︙ | ︙ | |||
1489 1490 1491 1492 1493 1494 1495 |
Tcl_HashKeyType *typePtr)
}
declare 424 generic {
void Tcl_InitObjHashTable(Tcl_HashTable *tablePtr)
}
declare 425 generic {
| | | | | | | | | | | | 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 |
Tcl_HashKeyType *typePtr)
}
declare 424 generic {
void Tcl_InitObjHashTable(Tcl_HashTable *tablePtr)
}
declare 425 generic {
ClientData Tcl_CommandTraceInfo(Tcl_Interp *interp, CONST char *varName, \
int flags, Tcl_CommandTraceProc *procPtr, ClientData prevClientData)
}
declare 426 generic {
int Tcl_TraceCommand(Tcl_Interp *interp, CONST char *varName, int flags, \
Tcl_CommandTraceProc *proc, ClientData clientData)
}
declare 427 generic {
void Tcl_UntraceCommand(Tcl_Interp *interp, CONST char *varName, \
int flags, Tcl_CommandTraceProc *proc, ClientData clientData)
}
declare 428 generic {
char * Tcl_AttemptAlloc(unsigned int size)
}
declare 429 generic {
char * Tcl_AttemptDbCkalloc(unsigned int size, CONST char *file, int line)
}
declare 430 generic {
char * Tcl_AttemptRealloc(char *ptr, unsigned int size)
}
declare 431 generic {
char * Tcl_AttemptDbCkrealloc(char *ptr, unsigned int size,
CONST char *file, int line)
}
declare 432 generic {
int Tcl_AttemptSetObjLength(Tcl_Obj *objPtr, int length)
}
declare 433 generic {
Tcl_ThreadId Tcl_GetChannelThread(Tcl_Channel channel)
}
# introduced in 8.4a3
declare 434 generic {
Tcl_UniChar * Tcl_GetUnicodeFromObj (Tcl_Obj *objPtr, int *lengthPtr)
}
declare 435 generic {
int Tcl_GetMathFuncInfo(Tcl_Interp *interp, CONST char *name, \
int *numArgsPtr, Tcl_ValueType **argTypesPtr, \
Tcl_MathProc **procPtr, ClientData *clientDataPtr)
}
declare 436 generic {
Tcl_Obj * Tcl_ListMathFuncs(Tcl_Interp *interp, CONST char *pattern)
}
declare 437 generic {
Tcl_Obj * Tcl_SubstObj(Tcl_Interp *interp, Tcl_Obj *objPtr, int flags)
|
| ︙ | ︙ | |||
1565 1566 1567 1568 1569 1570 1571 |
Tcl_PackageInitProc ** proc2Ptr, \
ClientData * clientDataPtr, \
Tcl_FSUnloadFileProc **unloadProcPtr)
}
declare 445 generic {
int Tcl_FSMatchInDirectory(Tcl_Interp *interp, Tcl_Obj * result, \
Tcl_Obj *pathPtr, \
| | | 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 |
Tcl_PackageInitProc ** proc2Ptr, \
ClientData * clientDataPtr, \
Tcl_FSUnloadFileProc **unloadProcPtr)
}
declare 445 generic {
int Tcl_FSMatchInDirectory(Tcl_Interp *interp, Tcl_Obj * result, \
Tcl_Obj *pathPtr, \
CONST char * pattern, Tcl_GlobTypeData * types)
}
declare 446 generic {
Tcl_Obj* Tcl_FSLink(Tcl_Obj *pathPtr, Tcl_Obj *toPtr)
}
declare 447 generic {
int Tcl_FSRemoveDirectory(Tcl_Obj *pathPtr, \
int recursive, Tcl_Obj **errorPtr)
|
| ︙ | ︙ | |||
1594 1595 1596 1597 1598 1599 1600 |
}
declare 452 generic {
int Tcl_FSFileAttrsSet(Tcl_Interp *interp, \
int index, Tcl_Obj *pathPtr, \
Tcl_Obj *objPtr)
}
declare 453 generic {
| | | | 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 |
}
declare 452 generic {
int Tcl_FSFileAttrsSet(Tcl_Interp *interp, \
int index, Tcl_Obj *pathPtr, \
Tcl_Obj *objPtr)
}
declare 453 generic {
CONST char ** Tcl_FSFileAttrStrings(Tcl_Obj *pathPtr, Tcl_Obj **objPtrRef)
}
declare 454 generic {
int Tcl_FSStat(Tcl_Obj *pathPtr, struct stat *buf)
}
declare 455 generic {
int Tcl_FSAccess(Tcl_Obj *pathPtr, int mode)
}
declare 456 generic {
Tcl_Channel Tcl_FSOpenFileChannel(Tcl_Interp *interp, Tcl_Obj *pathPtr, \
CONST char *modeString, int permissions)
}
declare 457 generic {
Tcl_Obj* Tcl_FSGetCwd(Tcl_Interp *interp)
}
declare 458 generic {
int Tcl_FSChdir(Tcl_Obj *pathPtr)
}
|
| ︙ | ︙ | |||
1643 1644 1645 1646 1647 1648 1649 |
declare 467 generic {
int Tcl_FSEvalFile(Tcl_Interp *interp, Tcl_Obj *fileName)
}
declare 468 generic {
Tcl_Obj* Tcl_FSNewNativePath(Tcl_Obj* fromFilesystem, ClientData clientData)
}
declare 469 generic {
| | | > | > > > > > | > | > | | | | | 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 |
declare 467 generic {
int Tcl_FSEvalFile(Tcl_Interp *interp, Tcl_Obj *fileName)
}
declare 468 generic {
Tcl_Obj* Tcl_FSNewNativePath(Tcl_Obj* fromFilesystem, ClientData clientData)
}
declare 469 generic {
CONST char* Tcl_FSGetNativePath(Tcl_Obj* pathObjPtr)
}
declare 470 generic {
Tcl_Obj* Tcl_FSFileSystemInfo(Tcl_Obj* pathObjPtr)
}
declare 471 generic {
Tcl_Obj* Tcl_FSPathSeparator(Tcl_Obj* pathObjPtr)
}
declare 472 generic {
Tcl_Obj* Tcl_FSListVolumes(void)
}
declare 473 generic {
int Tcl_FSRegister(ClientData clientData, Tcl_Filesystem *fsPtr)
}
declare 474 generic {
int Tcl_FSUnregister(Tcl_Filesystem *fsPtr)
}
declare 475 generic {
ClientData Tcl_FSData(Tcl_Filesystem *fsPtr)
}
declare 476 generic {
CONST char* Tcl_FSGetTranslatedStringPath(Tcl_Interp *interp, \
Tcl_Obj* pathPtr)
}
declare 477 generic {
Tcl_Filesystem* Tcl_FSGetFileSystemForPath(Tcl_Obj* pathObjPtr)
}
declare 478 generic {
Tcl_PathType Tcl_FSGetPathType (Tcl_Obj *pathObjPtr)
}
# New function due to TIP#49
declare 479 generic {
int Tcl_OutputBuffered(Tcl_Channel chan)
}
declare 480 generic {
void Tcl_FSMountsChanged(Tcl_Filesystem *fsPtr)
}
# New function due to TIP#56
declare 481 generic {
int Tcl_EvalTokensStandard(Tcl_Interp *interp, Tcl_Token *tokenPtr, int count)
}
# New export due to TIP#73
declare 482 generic {
void Tcl_GetTime( Tcl_Time* timeBuf )
}
##############################################################################
# Define the platform specific public Tcl interface. These functions are
# only available on the designated platform.
interface tclPlat
######################
# Windows declarations
# Added in Tcl 8.1
declare 0 win {
CONST TCHAR * Tcl_WinUtfToTChar(CONST char *str, int len, \
Tcl_DString *dsPtr)
}
declare 1 win {
CONST char * Tcl_WinTCharToUtf(CONST TCHAR *str, int len, \
Tcl_DString *dsPtr)
}
##################
# Mac declarations
# This is needed by the shells to handle Macintosh events.
declare 0 mac {
void Tcl_MacSetEventProc(Tcl_MacConvertEventPtr procPtr)
}
# These routines are useful for handling using scripts from resources
# in the application shell
declare 1 mac {
char * Tcl_MacConvertTextResource(Handle resource)
}
declare 2 mac {
int Tcl_MacEvalResource(Tcl_Interp *interp, CONST char *resourceName, \
int resourceNumber, CONST char *fileName)
}
declare 3 mac {
Handle Tcl_MacFindResource(Tcl_Interp *interp, long resourceType, \
CONST char *resourceName, int resourceNumber, \
CONST char *resFileRef, int * releaseIt)
}
# These routines support the new OSType object type (i.e. the packed 4
# character type and creator codes).
declare 4 mac {
int Tcl_GetOSTypeFromObj(Tcl_Interp *interp, Tcl_Obj *objPtr, \
|
| ︙ | ︙ |
Changes to generic/tcl.h.
| ︙ | ︙ | |||
8 9 10 11 12 13 14 | * Copyright (c) 1993-1996 Lucent Technologies. * Copyright (c) 1994-1998 Sun Microsystems, Inc. * Copyright (c) 1998-2000 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | * Copyright (c) 1993-1996 Lucent Technologies. * Copyright (c) 1994-1998 Sun Microsystems, Inc. * Copyright (c) 1998-2000 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tcl.h,v 1.103.2.2 2002/02/05 02:21:58 wolfsuit Exp $ */ #ifndef _TCL #define _TCL /* * For C++ compilers, use extern "C" |
| ︙ | ︙ | |||
76 77 78 79 80 81 82 | /* * The following definitions set up the proper options for Windows * compilers. We use this method because there is no autoconf equivalent. */ #ifndef __WIN32__ | | < > > > | 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | /* * The following definitions set up the proper options for Windows * compilers. We use this method because there is no autoconf equivalent. */ #ifndef __WIN32__ # if defined(_WIN32) || defined(WIN32) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__BORLANDC__) # define __WIN32__ # ifndef WIN32 # define WIN32 # endif # endif #endif #ifdef __WIN32__ # ifndef STRICT # define STRICT # endif |
| ︙ | ︙ | |||
104 105 106 107 108 109 110 111 112 113 114 115 116 117 | /* * The following definitions set up the proper options for Macintosh * compilers. We use this method because there is no autoconf equivalent. */ #ifdef MAC_TCL # ifndef HAS_STDARG # define HAS_STDARG 1 # endif # ifndef USE_TCLALLOC # define USE_TCLALLOC 1 # endif # ifndef NO_STRERROR | > | 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | /* * The following definitions set up the proper options for Macintosh * compilers. We use this method because there is no autoconf equivalent. */ #ifdef MAC_TCL #include <ConditionalMacros.h> # ifndef HAS_STDARG # define HAS_STDARG 1 # endif # ifndef USE_TCLALLOC # define USE_TCLALLOC 1 # endif # ifndef NO_STRERROR |
| ︙ | ︙ | |||
215 216 217 218 219 220 221 | * macro STATIC_BUILD should be defined. */ #ifdef STATIC_BUILD # define DLLIMPORT # define DLLEXPORT #else | | | 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 | * macro STATIC_BUILD should be defined. */ #ifdef STATIC_BUILD # define DLLIMPORT # define DLLEXPORT #else # if (defined(__WIN32__) && (defined(_MSC_VER) || (__BORLANDC__ >= 0x0550) || (defined(__GNUC__) && defined(__declspec)))) || (defined(MAC_TCL) && FUNCTION_DECLSPEC) # define DLLIMPORT __declspec(dllimport) # define DLLEXPORT __declspec(dllexport) # else # define DLLIMPORT # define DLLEXPORT # endif #endif |
| ︙ | ︙ | |||
237 238 239 240 241 242 243 | * class. If the symbol is beind declared for a static build or for use from a * stub library, then the storage class should be empty. * * The convention is that a macro called BUILD_xxxx, where xxxx is the * name of a library we are building, is set on the compile line for sources * that are to be placed in the library. When this macro is set, the * storage class will be set to DLLEXPORT. At the end of the header file, the | | | 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 | * class. If the symbol is beind declared for a static build or for use from a * stub library, then the storage class should be empty. * * The convention is that a macro called BUILD_xxxx, where xxxx is the * name of a library we are building, is set on the compile line for sources * that are to be placed in the library. When this macro is set, the * storage class will be set to DLLEXPORT. At the end of the header file, the * storage class will be reset to DLLIMPORT. */ #undef TCL_STORAGE_CLASS #ifdef BUILD_tcl # define TCL_STORAGE_CLASS DLLEXPORT #else # ifdef USE_TCL_STUBS |
| ︙ | ︙ | |||
270 271 272 273 274 275 276 277 278 279 280 281 282 283 | # define _USING_PROTOTYPES_ 1 # define _ANSI_ARGS_(x) x # define CONST const #else # define _ANSI_ARGS_(x) () # define CONST #endif /* * Make sure EXTERN isn't defined elsewhere */ #ifdef EXTERN #undef EXTERN #endif /* EXTERN */ | > > > > > > | 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 | # define _USING_PROTOTYPES_ 1 # define _ANSI_ARGS_(x) x # define CONST const #else # define _ANSI_ARGS_(x) () # define CONST #endif #ifdef USE_NON_CONST # define CONST84 #else # define CONST84 CONST #endif /* * Make sure EXTERN isn't defined elsewhere */ #ifdef EXTERN #undef EXTERN #endif /* EXTERN */ |
| ︙ | ︙ | |||
939 940 941 942 943 944 945 946 947 948 949 950 951 952 | #define TCL_INTERP_DESTROYED 0x100 #define TCL_LEAVE_ERR_MSG 0x200 #define TCL_TRACE_ARRAY 0x800 #ifndef TCL_REMOVE_OBSOLETE_TRACES /* Required to support old variable/vdelete/vinfo traces */ #define TCL_TRACE_OLD_STYLE 0x1000 #endif /* * Flag values passed to command-related procedures. */ #define TCL_TRACE_RENAME 0x2000 #define TCL_TRACE_DELETE 0x4000 | > > > | 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 | #define TCL_INTERP_DESTROYED 0x100 #define TCL_LEAVE_ERR_MSG 0x200 #define TCL_TRACE_ARRAY 0x800 #ifndef TCL_REMOVE_OBSOLETE_TRACES /* Required to support old variable/vdelete/vinfo traces */ #define TCL_TRACE_OLD_STYLE 0x1000 #endif /* Indicate the semantics of the result of a trace */ #define TCL_TRACE_RESULT_DYNAMIC 0x8000 #define TCL_TRACE_RESULT_OBJECT 0x10000 /* * Flag values passed to command-related procedures. */ #define TCL_TRACE_RENAME 0x2000 #define TCL_TRACE_DELETE 0x4000 |
| ︙ | ︙ | |||
1331 1332 1333 1334 1335 1336 1337 | typedef int (Tcl_DriverCloseProc) _ANSI_ARGS_((ClientData instanceData, Tcl_Interp *interp)); typedef int (Tcl_DriverClose2Proc) _ANSI_ARGS_((ClientData instanceData, Tcl_Interp *interp, int flags)); typedef int (Tcl_DriverInputProc) _ANSI_ARGS_((ClientData instanceData, char *buf, int toRead, int *errorCodePtr)); typedef int (Tcl_DriverOutputProc) _ANSI_ARGS_((ClientData instanceData, | | | | | 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 | typedef int (Tcl_DriverCloseProc) _ANSI_ARGS_((ClientData instanceData, Tcl_Interp *interp)); typedef int (Tcl_DriverClose2Proc) _ANSI_ARGS_((ClientData instanceData, Tcl_Interp *interp, int flags)); typedef int (Tcl_DriverInputProc) _ANSI_ARGS_((ClientData instanceData, char *buf, int toRead, int *errorCodePtr)); typedef int (Tcl_DriverOutputProc) _ANSI_ARGS_((ClientData instanceData, CONST84 char *buf, int toWrite, int *errorCodePtr)); typedef int (Tcl_DriverSeekProc) _ANSI_ARGS_((ClientData instanceData, long offset, int mode, int *errorCodePtr)); typedef int (Tcl_DriverSetOptionProc) _ANSI_ARGS_(( ClientData instanceData, Tcl_Interp *interp, CONST char *optionName, CONST char *value)); typedef int (Tcl_DriverGetOptionProc) _ANSI_ARGS_(( ClientData instanceData, Tcl_Interp *interp, CONST84 char *optionName, Tcl_DString *dsPtr)); typedef void (Tcl_DriverWatchProc) _ANSI_ARGS_(( ClientData instanceData, int mask)); typedef int (Tcl_DriverGetHandleProc) _ANSI_ARGS_(( ClientData instanceData, int direction, ClientData *handlePtr)); typedef int (Tcl_DriverFlushProc) _ANSI_ARGS_(( ClientData instanceData)); |
| ︙ | ︙ | |||
1383 1384 1385 1386 1387 1388 1389 | # define attemptckrealloc(x,y) Tcl_AttemptRealloc(x,y) # define Tcl_InitMemory(x) # define Tcl_DumpActiveMemory(x) # define Tcl_ValidateAllMemory(x,y) #endif /* !TCL_MEM_DEBUG */ | < < < < < < < < < < < | 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 | # define attemptckrealloc(x,y) Tcl_AttemptRealloc(x,y) # define Tcl_InitMemory(x) # define Tcl_DumpActiveMemory(x) # define Tcl_ValidateAllMemory(x,y) #endif /* !TCL_MEM_DEBUG */ /* * struct Tcl_ChannelType: * * One such structure exists for each type (kind) of channel. * It collects together in one place all the functions that are * part of the specific channel type. * |
| ︙ | ︙ | |||
1506 1507 1508 1509 1510 1511 1512 | * Typedefs for the various filesystem operations: */ typedef int (Tcl_FSStatProc) _ANSI_ARGS_((Tcl_Obj *pathPtr, struct stat *buf)); typedef int (Tcl_FSAccessProc) _ANSI_ARGS_((Tcl_Obj *pathPtr, int mode)); typedef Tcl_Channel (Tcl_FSOpenFileChannelProc) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *pathPtr, | | | | 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 | * Typedefs for the various filesystem operations: */ typedef int (Tcl_FSStatProc) _ANSI_ARGS_((Tcl_Obj *pathPtr, struct stat *buf)); typedef int (Tcl_FSAccessProc) _ANSI_ARGS_((Tcl_Obj *pathPtr, int mode)); typedef Tcl_Channel (Tcl_FSOpenFileChannelProc) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *pathPtr, CONST84 char *modeString, int permissions)); typedef int (Tcl_FSMatchInDirectoryProc) _ANSI_ARGS_((Tcl_Interp* interp, Tcl_Obj *result, Tcl_Obj *pathPtr, CONST84 char *pattern, Tcl_GlobTypeData * types)); typedef Tcl_Obj* (Tcl_FSGetCwdProc) _ANSI_ARGS_((Tcl_Interp *interp)); typedef int (Tcl_FSChdirProc) _ANSI_ARGS_((Tcl_Obj *pathPtr)); typedef int (Tcl_FSLstatProc) _ANSI_ARGS_((Tcl_Obj *pathPtr, struct stat *buf)); typedef int (Tcl_FSCreateDirectoryProc) _ANSI_ARGS_((Tcl_Obj *pathPtr)); typedef int (Tcl_FSDeleteFileProc) _ANSI_ARGS_((Tcl_Obj *pathPtr)); |
| ︙ | ︙ | |||
1535 1536 1537 1538 1539 1540 1541 | typedef int (Tcl_FSUtimeProc) _ANSI_ARGS_((Tcl_Obj *pathPtr, struct utimbuf *tval)); typedef int (Tcl_FSNormalizePathProc) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *pathPtr, int nextCheckpoint)); typedef int (Tcl_FSFileAttrsGetProc) _ANSI_ARGS_((Tcl_Interp *interp, int index, Tcl_Obj *pathPtr, Tcl_Obj **objPtrRef)); | | | 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 | typedef int (Tcl_FSUtimeProc) _ANSI_ARGS_((Tcl_Obj *pathPtr, struct utimbuf *tval)); typedef int (Tcl_FSNormalizePathProc) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *pathPtr, int nextCheckpoint)); typedef int (Tcl_FSFileAttrsGetProc) _ANSI_ARGS_((Tcl_Interp *interp, int index, Tcl_Obj *pathPtr, Tcl_Obj **objPtrRef)); typedef CONST84 char** (Tcl_FSFileAttrStringsProc) _ANSI_ARGS_((Tcl_Obj *pathPtr, Tcl_Obj** objPtrRef)); typedef int (Tcl_FSFileAttrsSetProc) _ANSI_ARGS_((Tcl_Interp *interp, int index, Tcl_Obj *pathPtr, Tcl_Obj *objPtr)); typedef Tcl_Obj* (Tcl_FSLinkProc) _ANSI_ARGS_((Tcl_Obj *pathPtr, Tcl_Obj *toPtr)); typedef int (Tcl_FSLoadFileProc) _ANSI_ARGS_((Tcl_Interp * interp, |
| ︙ | ︙ | |||
2110 2111 2112 2113 2114 2115 2116 | * The following constant is used to test for older versions of Tcl * in the stubs tables. * * Jan Nijtman's plus patch uses 0xFCA1BACF, so we need to pick a different * value since the stubs tables don't match. */ | | | 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 | * The following constant is used to test for older versions of Tcl * in the stubs tables. * * Jan Nijtman's plus patch uses 0xFCA1BACF, so we need to pick a different * value since the stubs tables don't match. */ #define TCL_STUB_MAGIC ((int)0xFCA3BACF) /* * The following function is required to be defined in all stubs aware * extensions. The function is actually implemented in the stub * library, not the main Tcl library, although there is a trivial * implementation in the main library in case an extension is statically * linked into an application. |
| ︙ | ︙ | |||
2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 | #include "tclDecls.h" /* * Include platform specific public function declarations that are * accessible via the stubs table. */ #include "tclPlatDecls.h" /* * Public functions that are not accessible via the stubs table. */ EXTERN void Tcl_Main _ANSI_ARGS_((int argc, char **argv, Tcl_AppInitProc *appInitProc)); | > > > > > > > > > > > > > | 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 | #include "tclDecls.h" /* * Include platform specific public function declarations that are * accessible via the stubs table. */ /* * tclPlatDecls.h can't be included here on the Mac, as we need * Mac specific headers to define the Mac types used in this file, * but these Mac haders conflict with a number of tk types * and thus can't be included in the globally read tcl.h * This header was originally added here as a fix for bug 5241 * (stub link error for symbols in TclPlatStubs table), as a work- * around for the bug on the mac, tclMac.h is included immediately * after tcl.h in the tcl precompiled header (with DLLEXPORT set). */ #if !defined(MAC_TCL) #include "tclPlatDecls.h" #endif /* * Public functions that are not accessible via the stubs table. */ EXTERN void Tcl_Main _ANSI_ARGS_((int argc, char **argv, Tcl_AppInitProc *appInitProc)); |
| ︙ | ︙ |
Changes to generic/tclBasic.c.
1 2 3 4 5 | /* * tclBasic.c -- * * Contains the basic facilities for TCL command interpretation, * including interpreter creation and deletion, command creation | | > | < < < | 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 34 35 36 37 38 39 40 41 | /* * tclBasic.c -- * * Contains the basic facilities for TCL command interpretation, * including interpreter creation and deletion, command creation * and deletion, and command/script execution. * * Copyright (c) 1987-1994 The Regents of the University of California. * Copyright (c) 1994-1997 Sun Microsystems, Inc. * Copyright (c) 1998-1999 by Scriptics Corporation. * Copyright (c) 2001 by Kevin B. Kenny. All rights reserved. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclBasic.c,v 1.35.8.1 2002/02/05 02:21:58 wolfsuit Exp $ */ #include "tclInt.h" #include "tclCompile.h" #ifndef TCL_GENERIC_ONLY # include "tclPort.h" #endif /* * Static procedures in this file: */ static char * CallCommandTraces _ANSI_ARGS_((Interp *iPtr, Command *cmdPtr, CONST char *oldName, CONST char* newName, int flags)); static void DeleteInterpProc _ANSI_ARGS_((Tcl_Interp *interp)); static void ProcessUnexpectedResult _ANSI_ARGS_(( Tcl_Interp *interp, int returnCode)); extern TclStubs tclStubs; /* * The following structure defines the commands in the Tcl core. */ |
| ︙ | ︙ | |||
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
(CompileProc *) NULL, 0},
{"lrange", (Tcl_CmdProc *) NULL, Tcl_LrangeObjCmd,
(CompileProc *) NULL, 1},
{"lreplace", (Tcl_CmdProc *) NULL, Tcl_LreplaceObjCmd,
(CompileProc *) NULL, 1},
{"lsearch", (Tcl_CmdProc *) NULL, Tcl_LsearchObjCmd,
(CompileProc *) NULL, 1},
{"lsort", (Tcl_CmdProc *) NULL, Tcl_LsortObjCmd,
(CompileProc *) NULL, 1},
{"namespace", (Tcl_CmdProc *) NULL, Tcl_NamespaceObjCmd,
(CompileProc *) NULL, 1},
{"package", (Tcl_CmdProc *) NULL, Tcl_PackageObjCmd,
(CompileProc *) NULL, 1},
{"proc", (Tcl_CmdProc *) NULL, Tcl_ProcObjCmd,
(CompileProc *) NULL, 1},
{"regexp", (Tcl_CmdProc *) NULL, Tcl_RegexpObjCmd,
| > > | | 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
(CompileProc *) NULL, 0},
{"lrange", (Tcl_CmdProc *) NULL, Tcl_LrangeObjCmd,
(CompileProc *) NULL, 1},
{"lreplace", (Tcl_CmdProc *) NULL, Tcl_LreplaceObjCmd,
(CompileProc *) NULL, 1},
{"lsearch", (Tcl_CmdProc *) NULL, Tcl_LsearchObjCmd,
(CompileProc *) NULL, 1},
{"lset", (Tcl_CmdProc *) NULL, Tcl_LsetObjCmd,
TclCompileLsetCmd, 1},
{"lsort", (Tcl_CmdProc *) NULL, Tcl_LsortObjCmd,
(CompileProc *) NULL, 1},
{"namespace", (Tcl_CmdProc *) NULL, Tcl_NamespaceObjCmd,
(CompileProc *) NULL, 1},
{"package", (Tcl_CmdProc *) NULL, Tcl_PackageObjCmd,
(CompileProc *) NULL, 1},
{"proc", (Tcl_CmdProc *) NULL, Tcl_ProcObjCmd,
(CompileProc *) NULL, 1},
{"regexp", (Tcl_CmdProc *) NULL, Tcl_RegexpObjCmd,
TclCompileRegexpCmd, 1},
{"regsub", (Tcl_CmdProc *) NULL, Tcl_RegsubObjCmd,
(CompileProc *) NULL, 1},
{"rename", (Tcl_CmdProc *) NULL, Tcl_RenameObjCmd,
(CompileProc *) NULL, 1},
{"return", (Tcl_CmdProc *) NULL, Tcl_ReturnObjCmd,
TclCompileReturnCmd, 1},
{"scan", (Tcl_CmdProc *) NULL, Tcl_ScanObjCmd,
|
| ︙ | ︙ | |||
252 253 254 255 256 257 258 | * * Results: * The return value is a token for the interpreter, which may be * used in calls to procedures like Tcl_CreateCmd, Tcl_Eval, or * Tcl_DeleteInterp. * * Side effects: | | | | 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 |
*
* Results:
* The return value is a token for the interpreter, which may be
* used in calls to procedures like Tcl_CreateCmd, Tcl_Eval, or
* Tcl_DeleteInterp.
*
* Side effects:
* The command interpreter is initialized with the built-in commands
* and with the variables documented in tclvars(n).
*
*----------------------------------------------------------------------
*/
Tcl_Interp *
Tcl_CreateInterp()
{
|
| ︙ | ︙ | |||
2319 2320 2321 2322 2323 2324 2325 |
if (cmdPtr->tracePtr != NULL) {
CommandTrace *tracePtr;
CallCommandTraces(iPtr,cmdPtr,NULL,NULL,TCL_TRACE_DELETE);
/* Now delete these traces */
tracePtr = cmdPtr->tracePtr;
while (tracePtr != NULL) {
CommandTrace *nextPtr = tracePtr->nextPtr;
| | | 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 |
if (cmdPtr->tracePtr != NULL) {
CommandTrace *tracePtr;
CallCommandTraces(iPtr,cmdPtr,NULL,NULL,TCL_TRACE_DELETE);
/* Now delete these traces */
tracePtr = cmdPtr->tracePtr;
while (tracePtr != NULL) {
CommandTrace *nextPtr = tracePtr->nextPtr;
Tcl_EventuallyFree((ClientData) tracePtr, TCL_DYNAMIC);
tracePtr = nextPtr;
}
cmdPtr->tracePtr = NULL;
}
/*
* If the command being deleted has a compile procedure, increment the
|
| ︙ | ︙ | |||
2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 |
cmdPtr->refCount++;
result = NULL;
active.nextPtr = iPtr->activeCmdTracePtr;
iPtr->activeCmdTracePtr = &active;
active.cmdPtr = cmdPtr;
for (tracePtr = cmdPtr->tracePtr; tracePtr != NULL;
tracePtr = active.nextTracePtr) {
active.nextTracePtr = tracePtr->nextPtr;
if (!(tracePtr->flags & flags)) {
continue;
}
cmdPtr->flags |= tracePtr->flags;
if (oldName == NULL) {
oldName = Tcl_GetCommandName((Tcl_Interp *) iPtr,
(Tcl_Command) cmdPtr);
}
(*tracePtr->traceProc)(tracePtr->clientData,
(Tcl_Interp *) iPtr, oldName, newName, flags);
cmdPtr->flags &= ~tracePtr->flags;
}
/*
* Restore the variable's flags, remove the record of our active
* traces, and then return.
*/
cmdPtr->flags &= ~CMD_TRACE_ACTIVE;
cmdPtr->refCount--;
iPtr->activeCmdTracePtr = active.nextPtr;
return result;
}
/*
*----------------------------------------------------------------------
*
| > > > > | 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 |
cmdPtr->refCount++;
result = NULL;
active.nextPtr = iPtr->activeCmdTracePtr;
iPtr->activeCmdTracePtr = &active;
active.cmdPtr = cmdPtr;
Tcl_Preserve((ClientData) iPtr);
for (tracePtr = cmdPtr->tracePtr; tracePtr != NULL;
tracePtr = active.nextTracePtr) {
active.nextTracePtr = tracePtr->nextPtr;
if (!(tracePtr->flags & flags)) {
continue;
}
cmdPtr->flags |= tracePtr->flags;
if (oldName == NULL) {
oldName = Tcl_GetCommandName((Tcl_Interp *) iPtr,
(Tcl_Command) cmdPtr);
}
Tcl_Preserve((ClientData) tracePtr);
(*tracePtr->traceProc)(tracePtr->clientData,
(Tcl_Interp *) iPtr, oldName, newName, flags);
cmdPtr->flags &= ~tracePtr->flags;
Tcl_Release((ClientData) tracePtr);
}
/*
* Restore the variable's flags, remove the record of our active
* traces, and then return.
*/
cmdPtr->flags &= ~CMD_TRACE_ACTIVE;
cmdPtr->refCount--;
iPtr->activeCmdTracePtr = active.nextPtr;
Tcl_Release((ClientData) iPtr);
return result;
}
/*
*----------------------------------------------------------------------
*
|
| ︙ | ︙ | |||
2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 |
}
return resultList;
}
/*
*----------------------------------------------------------------------
*
* Tcl_EvalObjEx --
*
* Execute Tcl commands stored in a Tcl object. These commands are
* compiled into bytecodes if necessary, unless TCL_EVAL_DIRECT
* is specified.
*
* Results:
| > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 |
}
return resultList;
}
/*
*----------------------------------------------------------------------
*
* TclInterpReady --
*
* Check if an interpreter is ready to eval commands or scripts,
* i.e., if it was not deleted and if the nesting level is not
* too high.
*
* Results:
* The return value is TCL_OK if it the interpreter is ready,
* TCL_ERROR otherwise.
*
* Side effects:
* The interpreters object and string results are cleared.
*
*----------------------------------------------------------------------
*/
int
TclInterpReady(interp)
Tcl_Interp *interp;
{
register Interp *iPtr = (Interp *) interp;
/*
* Reset both the interpreter's string and object results and clear
* out any previous error information.
*/
Tcl_ResetResult(interp);
/*
* If the interpreter has been deleted, return an error.
*/
if (iPtr->flags & DELETED) {
Tcl_ResetResult(interp);
Tcl_AppendToObj(Tcl_GetObjResult(interp),
"attempt to call eval in deleted interpreter", -1);
Tcl_SetErrorCode(interp, "CORE", "IDELETE",
"attempt to call eval in deleted interpreter",
(char *) NULL);
return TCL_ERROR;
}
/*
* Check depth of nested calls to Tcl_Eval: if this gets too large,
* it's probably because of an infinite loop somewhere.
*/
if (((iPtr->numLevels) >= iPtr->maxNestingDepth)
|| (TclpCheckStackSpace() == 0)) {
Tcl_AppendToObj(Tcl_GetObjResult(interp),
"too many nested calls to Tcl_Eval (infinite loop?)", -1);
return TCL_ERROR;
}
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
* TclEvalObjvInternal --
*
* This procedure evaluates a Tcl command that has already been
* parsed into words, with one Tcl_Obj holding each word. The caller
* is responsible for checking that the interpreter is ready to
* evaluate (by calling TclInterpReady), and also to manage the
* iPtr->numLevels.
*
* Results:
* The return value is a standard Tcl completion code such as
* TCL_OK or TCL_ERROR. A result or error message is left in
* interp's result. If an error occurs, this procedure does
* NOT add any information to the errorInfo variable.
*
* Side effects:
* Depends on the command.
*
*----------------------------------------------------------------------
*/
int
TclEvalObjvInternal(interp, objc, objv, command, length, flags)
Tcl_Interp *interp; /* Interpreter in which to evaluate the
* command. Also used for error
* reporting. */
int objc; /* Number of words in command. */
Tcl_Obj *CONST objv[]; /* An array of pointers to objects that are
* the words that make up the command. */
char *command; /* Points to the beginning of the string
* representation of the command; this
* is used for traces. If the string
* representation of the command is
* unknown, an empty string should be
* supplied. If it is NULL, no traces will
* be called. */
int length; /* Number of bytes in command; if -1, all
* characters up to the first null byte are
* used. */
int flags; /* Collection of OR-ed bits that control
* the evaluation of the script. Only
* TCL_EVAL_GLOBAL is currently
* supported. */
{
Command *cmdPtr;
Interp *iPtr = (Interp *) interp;
Tcl_Obj **newObjv;
int i, code;
Trace *tracePtr, *nextPtr;
char **argv, *commandCopy;
CallFrame *savedVarFramePtr; /* Saves old copy of iPtr->varFramePtr
* in case TCL_EVAL_GLOBAL was set. */
if (objc == 0) {
return TCL_OK;
}
/*
* Find the procedure to execute this command. If there isn't one,
* then see if there is a command "unknown". If so, create a new
* word array with "unknown" as the first word and the original
* command words as arguments. Then call ourselves recursively
* to execute it.
*/
cmdPtr = (Command *) Tcl_GetCommandFromObj(interp, objv[0]);
if (cmdPtr == NULL) {
newObjv = (Tcl_Obj **) ckalloc((unsigned)
((objc + 1) * sizeof (Tcl_Obj *)));
for (i = objc-1; i >= 0; i--) {
newObjv[i+1] = objv[i];
}
newObjv[0] = Tcl_NewStringObj("::unknown", -1);
Tcl_IncrRefCount(newObjv[0]);
cmdPtr = (Command *) Tcl_GetCommandFromObj(interp, newObjv[0]);
if (cmdPtr == NULL) {
Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),
"invalid command name \"", Tcl_GetString(objv[0]), "\"",
(char *) NULL);
code = TCL_ERROR;
} else if (TclInterpReady(interp) == TCL_ERROR) {
code = TCL_ERROR;
} else {
iPtr->numLevels++;
code = TclEvalObjvInternal(interp, objc+1, newObjv, command, length, 0);
iPtr->numLevels--;
}
Tcl_DecrRefCount(newObjv[0]);
ckfree((char *) newObjv);
goto done;
}
/*
* Call trace procedures if needed.
*/
if (command != NULL) {
argv = NULL;
commandCopy = command;
for (tracePtr = iPtr->tracePtr; tracePtr != NULL; tracePtr = nextPtr) {
nextPtr = tracePtr->nextPtr;
if (iPtr->numLevels > tracePtr->level) {
continue;
}
/*
* This is a bit messy because we have to emulate the old trace
* interface, which uses strings for everything.
*/
if (argv == NULL) {
argv = (char **) ckalloc((unsigned) (objc + 1) * sizeof(char *));
for (i = 0; i < objc; i++) {
argv[i] = Tcl_GetString(objv[i]);
}
argv[objc] = 0;
if (length < 0) {
length = strlen(command);
} else if ((size_t)length < strlen(command)) {
commandCopy = (char *) ckalloc((unsigned) (length + 1));
strncpy(commandCopy, command, (size_t) length);
commandCopy[length] = 0;
}
}
(*tracePtr->proc)(tracePtr->clientData, interp, iPtr->numLevels,
commandCopy, cmdPtr->proc, cmdPtr->clientData,
objc, argv);
}
if (argv != NULL) {
ckfree((char *) argv);
}
if (commandCopy != command) {
ckfree((char *) commandCopy);
}
}
/*
* Finally, invoke the command's Tcl_ObjCmdProc.
*/
iPtr->cmdCount++;
savedVarFramePtr = iPtr->varFramePtr;
if (flags & TCL_EVAL_GLOBAL) {
iPtr->varFramePtr = NULL;
}
code = (*cmdPtr->objProc)(cmdPtr->objClientData, interp, objc, objv);
iPtr->varFramePtr = savedVarFramePtr;
if (Tcl_AsyncReady()) {
code = Tcl_AsyncInvoke(interp, code);
}
/*
* If the interpreter has a non-empty string result, the result
* object is either empty or stale because some procedure set
* interp->result directly. If so, move the string result to the
* result object, then reset the string result.
*/
if (*(iPtr->result) != 0) {
(void) Tcl_GetObjResult(interp);
}
done:
return code;
}
/*
*----------------------------------------------------------------------
*
* Tcl_EvalObjv --
*
* This procedure evaluates a Tcl command that has already been
* parsed into words, with one Tcl_Obj holding each word.
*
* Results:
* The return value is a standard Tcl completion code such as
* TCL_OK or TCL_ERROR. A result or error message is left in
* interp's result.
*
* Side effects:
* Depends on the command.
*
*----------------------------------------------------------------------
*/
int
Tcl_EvalObjv(interp, objc, objv, flags)
Tcl_Interp *interp; /* Interpreter in which to evaluate the
* command. Also used for error
* reporting. */
int objc; /* Number of words in command. */
Tcl_Obj *CONST objv[]; /* An array of pointers to objects that are
* the words that make up the command. */
int flags; /* Collection of OR-ed bits that control
* the evaluation of the script. Only
* TCL_EVAL_GLOBAL is currently
* supported. */
{
Interp *iPtr = (Interp *)interp;
Trace *tracePtr;
Tcl_DString cmdBuf;
char *cmdString = "";
int cmdLen = 0;
int code = TCL_OK;
for (tracePtr = iPtr->tracePtr; tracePtr; tracePtr = tracePtr->nextPtr) {
if (iPtr->numLevels <= tracePtr->level) {
int i;
/*
* The command will be needed for an execution trace or stack trace
* generate a command string.
*/
cmdtraced:
Tcl_DStringInit(&cmdBuf);
for (i = 0; i < objc; i++) {
Tcl_DStringAppendElement(&cmdBuf, Tcl_GetString(objv[i]));
}
cmdString = Tcl_DStringValue(&cmdBuf);
cmdLen = Tcl_DStringLength(&cmdBuf);
break;
}
}
/*
* Execute the command if we have not done so already
*/
switch (code) {
case TCL_OK:
if (TclInterpReady(interp) == TCL_ERROR) {
code = TCL_ERROR;
} else {
iPtr->numLevels++;
code = TclEvalObjvInternal(interp, objc, objv, cmdString, cmdLen, flags);
iPtr->numLevels--;
}
if (code == TCL_ERROR && cmdLen == 0)
goto cmdtraced;
break;
case TCL_ERROR:
Tcl_LogCommandInfo(interp, cmdString, cmdString, cmdLen);
break;
default:
/*NOTREACHED*/
break;
}
if (cmdLen != 0) {
Tcl_DStringFree(&cmdBuf);
}
return code;
}
/*
*----------------------------------------------------------------------
*
* Tcl_LogCommandInfo --
*
* This procedure is invoked after an error occurs in an interpreter.
* It adds information to the "errorInfo" variable to describe the
* command that was being executed when the error occurred.
*
* Results:
* None.
*
* Side effects:
* Information about the command is added to errorInfo and the
* line number stored internally in the interpreter is set. If this
* is the first call to this procedure or Tcl_AddObjErrorInfo since
* an error occurred, then old information in errorInfo is
* deleted.
*
*----------------------------------------------------------------------
*/
void
Tcl_LogCommandInfo(interp, script, command, length)
Tcl_Interp *interp; /* Interpreter in which to log information. */
CONST char *script; /* First character in script containing
* command (must be <= command). */
CONST char *command; /* First character in command that
* generated the error. */
int length; /* Number of bytes in command (-1 means
* use all bytes up to first null byte). */
{
char buffer[200];
register CONST char *p;
char *ellipsis = "";
Interp *iPtr = (Interp *) interp;
if (iPtr->flags & ERR_ALREADY_LOGGED) {
/*
* Someone else has already logged error information for this
* command; we shouldn't add anything more.
*/
return;
}
/*
* Compute the line number where the error occurred.
*/
iPtr->errorLine = 1;
for (p = script; p != command; p++) {
if (*p == '\n') {
iPtr->errorLine++;
}
}
/*
* Create an error message to add to errorInfo, including up to a
* maximum number of characters of the command.
*/
if (length < 0) {
length = strlen(command);
}
if (length > 150) {
length = 150;
ellipsis = "...";
}
if (!(iPtr->flags & ERR_IN_PROGRESS)) {
sprintf(buffer, "\n while executing\n\"%.*s%s\"",
length, command, ellipsis);
} else {
sprintf(buffer, "\n invoked from within\n\"%.*s%s\"",
length, command, ellipsis);
}
Tcl_AddObjErrorInfo(interp, buffer, -1);
iPtr->flags &= ~ERR_ALREADY_LOGGED;
}
/*
*----------------------------------------------------------------------
*
* Tcl_EvalTokensStandard --
*
* Given an array of tokens parsed from a Tcl command (e.g., the
* tokens that make up a word or the index for an array variable)
* this procedure evaluates the tokens and concatenates their
* values to form a single result value.
*
* Results:
* The return value is a standard Tcl completion code such as
* TCL_OK or TCL_ERROR. A result or error message is left in
* interp's result.
*
* Side effects:
* Depends on the array of tokens being evaled.
*
*----------------------------------------------------------------------
*/
int
Tcl_EvalTokensStandard(interp, tokenPtr, count)
Tcl_Interp *interp; /* Interpreter in which to lookup
* variables, execute nested commands,
* and report errors. */
Tcl_Token *tokenPtr; /* Pointer to first in an array of tokens
* to evaluate and concatenate. */
int count; /* Number of tokens to consider at tokenPtr.
* Must be at least 1. */
{
Tcl_Obj *resultPtr, *indexPtr, *valuePtr, *newPtr;
char buffer[TCL_UTF_MAX];
#ifdef TCL_MEM_DEBUG
# define MAX_VAR_CHARS 5
#else
# define MAX_VAR_CHARS 30
#endif
char nameBuffer[MAX_VAR_CHARS+1];
char *varName, *index;
char *p = NULL; /* Initialized to avoid compiler warning. */
int length, code;
/*
* The only tricky thing about this procedure is that it attempts to
* avoid object creation and string copying whenever possible. For
* example, if the value is just a nested command, then use the
* command's result object directly.
*/
code = TCL_OK;
resultPtr = NULL;
Tcl_ResetResult(interp);
for ( ; count > 0; count--, tokenPtr++) {
valuePtr = NULL;
/*
* The switch statement below computes the next value to be
* concat to the result, as either a range of text or an
* object.
*/
switch (tokenPtr->type) {
case TCL_TOKEN_TEXT:
p = tokenPtr->start;
length = tokenPtr->size;
break;
case TCL_TOKEN_BS:
length = Tcl_UtfBackslash(tokenPtr->start, (int *) NULL,
buffer);
p = buffer;
break;
case TCL_TOKEN_COMMAND:
code = Tcl_EvalEx(interp, tokenPtr->start+1, tokenPtr->size-2,
0);
if (code != TCL_OK) {
goto done;
}
valuePtr = Tcl_GetObjResult(interp);
break;
case TCL_TOKEN_VARIABLE:
if (tokenPtr->numComponents == 1) {
indexPtr = NULL;
index = NULL;
} else {
code = Tcl_EvalTokensStandard(interp, tokenPtr+2,
tokenPtr->numComponents - 1);
if (code != TCL_OK) {
goto done;
}
indexPtr = Tcl_GetObjResult(interp);
Tcl_IncrRefCount(indexPtr);
index = Tcl_GetString(indexPtr);
}
/*
* We have to make a copy of the variable name in order
* to have a null-terminated string. We can't make a
* temporary modification to the script to null-terminate
* the name, because a trace callback might potentially
* reuse the script and be affected by the null character.
*/
if (tokenPtr[1].size <= MAX_VAR_CHARS) {
varName = nameBuffer;
} else {
varName = ckalloc((unsigned) (tokenPtr[1].size + 1));
}
strncpy(varName, tokenPtr[1].start, (size_t) tokenPtr[1].size);
varName[tokenPtr[1].size] = 0;
valuePtr = Tcl_GetVar2Ex(interp, varName, index,
TCL_LEAVE_ERR_MSG);
if (varName != nameBuffer) {
ckfree(varName);
}
if (indexPtr != NULL) {
Tcl_DecrRefCount(indexPtr);
}
if (valuePtr == NULL) {
code = TCL_ERROR;
goto done;
}
count -= tokenPtr->numComponents;
tokenPtr += tokenPtr->numComponents;
break;
default:
panic("unexpected token type in Tcl_EvalTokensStandard");
}
/*
* If valuePtr isn't NULL, the next piece of text comes from that
* object; otherwise, take length bytes starting at p.
*/
if (resultPtr == NULL) {
if (valuePtr != NULL) {
resultPtr = valuePtr;
} else {
resultPtr = Tcl_NewStringObj(p, length);
}
Tcl_IncrRefCount(resultPtr);
} else {
if (Tcl_IsShared(resultPtr)) {
newPtr = Tcl_DuplicateObj(resultPtr);
Tcl_DecrRefCount(resultPtr);
resultPtr = newPtr;
Tcl_IncrRefCount(resultPtr);
}
if (valuePtr != NULL) {
p = Tcl_GetStringFromObj(valuePtr, &length);
}
Tcl_AppendToObj(resultPtr, p, length);
}
}
if (resultPtr != NULL) {
Tcl_SetObjResult(interp, resultPtr);
Tcl_DecrRefCount(resultPtr);
} else {
code = TCL_ERROR;
}
done:
return code;
}
/*
*----------------------------------------------------------------------
*
* Tcl_EvalTokens --
*
* Given an array of tokens parsed from a Tcl command (e.g., the
* tokens that make up a word or the index for an array variable)
* this procedure evaluates the tokens and concatenates their
* values to form a single result value.
*
* Results:
* The return value is a pointer to a newly allocated Tcl_Obj
* containing the value of the array of tokens. The reference
* count of the returned object has been incremented. If an error
* occurs in evaluating the tokens then a NULL value is returned
* and an error message is left in interp's result.
*
* Side effects:
* A new object is allocated to hold the result.
*
*----------------------------------------------------------------------
*
* This uses a non-standard return convention; its use is now deprecated.
* It is a wrapper for the new function Tcl_EvalTokensStandard, and is not
* used in the core any longer. It is only kept for backward compatibility.
*/
Tcl_Obj *
Tcl_EvalTokens(interp, tokenPtr, count)
Tcl_Interp *interp; /* Interpreter in which to lookup
* variables, execute nested commands,
* and report errors. */
Tcl_Token *tokenPtr; /* Pointer to first in an array of tokens
* to evaluate and concatenate. */
int count; /* Number of tokens to consider at tokenPtr.
* Must be at least 1. */
{
int code;
Tcl_Obj *resPtr;
code = Tcl_EvalTokensStandard(interp, tokenPtr, count);
if (code == TCL_OK) {
resPtr = Tcl_GetObjResult(interp);
Tcl_IncrRefCount(resPtr);
Tcl_ResetResult(interp);
return resPtr;
} else {
return NULL;
}
}
/*
*----------------------------------------------------------------------
*
* Tcl_EvalEx --
*
* This procedure evaluates a Tcl script without using the compiler
* or byte-code interpreter. It just parses the script, creates
* values for each word of each command, then calls EvalObjv
* to execute each command.
*
* Results:
* The return value is a standard Tcl completion code such as
* TCL_OK or TCL_ERROR. A result or error message is left in
* interp's result.
*
* Side effects:
* Depends on the script.
*
*----------------------------------------------------------------------
*/
int
Tcl_EvalEx(interp, script, numBytes, flags)
Tcl_Interp *interp; /* Interpreter in which to evaluate the
* script. Also used for error reporting. */
char *script; /* First character of script to evaluate. */
int numBytes; /* Number of bytes in script. If < 0, the
* script consists of all bytes up to the
* first null character. */
int flags; /* Collection of OR-ed bits that control
* the evaluation of the script. Only
* TCL_EVAL_GLOBAL is currently
* supported. */
{
Interp *iPtr = (Interp *) interp;
char *p, *next;
Tcl_Parse parse;
#define NUM_STATIC_OBJS 20
Tcl_Obj *staticObjArray[NUM_STATIC_OBJS], **objv;
Tcl_Token *tokenPtr;
int i, code, commandLength, bytesLeft, nested;
CallFrame *savedVarFramePtr; /* Saves old copy of iPtr->varFramePtr
* in case TCL_EVAL_GLOBAL was set. */
/*
* The variables below keep track of how much state has been
* allocated while evaluating the script, so that it can be freed
* properly if an error occurs.
*/
int gotParse = 0, objectsUsed = 0;
if (numBytes < 0) {
numBytes = strlen(script);
}
Tcl_ResetResult(interp);
savedVarFramePtr = iPtr->varFramePtr;
if (flags & TCL_EVAL_GLOBAL) {
iPtr->varFramePtr = NULL;
}
/*
* Each iteration through the following loop parses the next
* command from the script and then executes it.
*/
objv = staticObjArray;
p = script;
bytesLeft = numBytes;
if (iPtr->evalFlags & TCL_BRACKET_TERM) {
nested = 1;
} else {
nested = 0;
}
iPtr->evalFlags = 0;
do {
if (Tcl_ParseCommand(interp, p, bytesLeft, nested, &parse)
!= TCL_OK) {
code = TCL_ERROR;
goto error;
}
gotParse = 1;
if (parse.numWords > 0) {
/*
* Generate an array of objects for the words of the command.
*/
if (parse.numWords <= NUM_STATIC_OBJS) {
objv = staticObjArray;
} else {
objv = (Tcl_Obj **) ckalloc((unsigned)
(parse.numWords * sizeof (Tcl_Obj *)));
}
for (objectsUsed = 0, tokenPtr = parse.tokenPtr;
objectsUsed < parse.numWords;
objectsUsed++, tokenPtr += (tokenPtr->numComponents + 1)) {
code = Tcl_EvalTokensStandard(interp, tokenPtr+1,
tokenPtr->numComponents);
if (code == TCL_OK) {
objv[objectsUsed] = Tcl_GetObjResult(interp);
Tcl_IncrRefCount(objv[objectsUsed]);
} else {
goto error;
}
}
/*
* Execute the command and free the objects for its words.
*/
if (TclInterpReady(interp) == TCL_ERROR) {
code = TCL_ERROR;
} else {
iPtr->numLevels++;
code = TclEvalObjvInternal(interp, objectsUsed, objv, p, bytesLeft, 0);
iPtr->numLevels--;
}
if (code != TCL_OK) {
goto error;
}
for (i = 0; i < objectsUsed; i++) {
Tcl_DecrRefCount(objv[i]);
}
objectsUsed = 0;
if (objv != staticObjArray) {
ckfree((char *) objv);
objv = staticObjArray;
}
}
/*
* Advance to the next command in the script.
*/
next = parse.commandStart + parse.commandSize;
bytesLeft -= next - p;
p = next;
Tcl_FreeParse(&parse);
gotParse = 0;
if ((nested != 0) && (p > script) && (p[-1] == ']')) {
/*
* We get here in the special case where the TCL_BRACKET_TERM
* flag was set in the interpreter and we reached a close
* bracket in the script. Return immediately.
*/
iPtr->termOffset = (p - 1) - script;
iPtr->varFramePtr = savedVarFramePtr;
return TCL_OK;
}
} while (bytesLeft > 0);
iPtr->termOffset = p - script;
iPtr->varFramePtr = savedVarFramePtr;
return TCL_OK;
error:
/*
* Generate various pieces of error information, such as the line
* number where the error occurred and information to add to the
* errorInfo variable. Then free resources that had been allocated
* to the command.
*/
if ((code == TCL_ERROR) && !(iPtr->flags & ERR_ALREADY_LOGGED)) {
commandLength = parse.commandSize;
if ((parse.commandStart + commandLength) != (script + numBytes)) {
/*
* The command where the error occurred didn't end at the end
* of the script (i.e. it ended at a terminator character such
* as ";". Reduce the length by one so that the error message
* doesn't include the terminator character.
*/
commandLength -= 1;
}
Tcl_LogCommandInfo(interp, script, parse.commandStart, commandLength);
}
for (i = 0; i < objectsUsed; i++) {
Tcl_DecrRefCount(objv[i]);
}
if (gotParse) {
next = parse.commandStart + parse.commandSize;
bytesLeft -= next - p;
p = next;
Tcl_FreeParse(&parse);
if ((nested != 0) && (p > script)) {
char *nextCmd = NULL; /* pointer to start of next command */
/*
* We get here in the special case where the TCL_BRACKET_TERM
* flag was set in the interpreter.
*
* At this point, we want to find the end of the script
* (either end of script or the closing ']').
*/
while ((p[-1] != ']') && bytesLeft) {
if (Tcl_ParseCommand(NULL, p, bytesLeft, nested, &parse)
!= TCL_OK) {
/*
* We were looking for the ']' to close the script.
* But if we find a syntax error, it is ok to quit
* early since in that case we no longer need to know
* where the ']' is (if there was one). We reset the
* pointer to the start of the command that after the
* one causing the return. -- hobbs
*/
p = (nextCmd == NULL) ? parse.commandStart : nextCmd;
break;
}
if (nextCmd == NULL) {
nextCmd = parse.commandStart;
}
/*
* Advance to the next command in the script.
*/
next = parse.commandStart + parse.commandSize;
bytesLeft -= next - p;
p = next;
Tcl_FreeParse(&parse);
}
iPtr->termOffset = (p - 1) - script;
} else {
iPtr->termOffset = p - script;
}
}
if (objv != staticObjArray) {
ckfree((char *) objv);
}
iPtr->varFramePtr = savedVarFramePtr;
return code;
}
/*
*----------------------------------------------------------------------
*
* Tcl_Eval --
*
* Execute a Tcl command in a string. This procedure executes the
* script directly, rather than compiling it to bytecodes. Before
* the arrival of the bytecode compiler in Tcl 8.0 Tcl_Eval was
* the main procedure used for executing Tcl commands, but nowadays
* it isn't used much.
*
* Results:
* The return value is one of the return codes defined in tcl.h
* (such as TCL_OK), and interp's result contains a value
* to supplement the return code. The value of the result
* will persist only until the next call to Tcl_Eval or Tcl_EvalObj:
* you must copy it or lose it!
*
* Side effects:
* Can be almost arbitrary, depending on the commands in the script.
*
*----------------------------------------------------------------------
*/
int
Tcl_Eval(interp, string)
Tcl_Interp *interp; /* Token for command interpreter (returned
* by previous call to Tcl_CreateInterp). */
char *string; /* Pointer to TCL command to execute. */
{
int code;
code = Tcl_EvalEx(interp, string, -1, 0);
/*
* For backwards compatibility with old C code that predates the
* object system in Tcl 8.0, we have to mirror the object result
* back into the string result (some callers may expect it there).
*/
Tcl_SetResult(interp, TclGetString(Tcl_GetObjResult(interp)),
TCL_VOLATILE);
return code;
}
/*
*----------------------------------------------------------------------
*
* Tcl_EvalObj, Tcl_GlobalEvalObj --
*
* These functions are deprecated but we keep them around for backwards
* compatibility reasons.
*
* Results:
* See the functions they call.
*
* Side effects:
* See the functions they call.
*
*----------------------------------------------------------------------
*/
#undef Tcl_EvalObj
int
Tcl_EvalObj(interp, objPtr)
Tcl_Interp * interp;
Tcl_Obj * objPtr;
{
return Tcl_EvalObjEx(interp, objPtr, 0);
}
#undef Tcl_GlobalEvalObj
int
Tcl_GlobalEvalObj(interp, objPtr)
Tcl_Interp * interp;
Tcl_Obj * objPtr;
{
return Tcl_EvalObjEx(interp, objPtr, TCL_EVAL_GLOBAL);
}
/*
*----------------------------------------------------------------------
*
* Tcl_EvalObjEx --
*
* Execute Tcl commands stored in a Tcl object. These commands are
* compiled into bytecodes if necessary, unless TCL_EVAL_DIRECT
* is specified.
*
* Results:
|
| ︙ | ︙ | |||
2753 2754 2755 2756 2757 2758 2759 |
int flags; /* Collection of OR-ed bits that
* control the evaluation of the
* script. Supported values are
* TCL_EVAL_GLOBAL and
* TCL_EVAL_DIRECT. */
{
register Interp *iPtr = (Interp *) interp;
| < < < < < < | 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 |
int flags; /* Collection of OR-ed bits that
* control the evaluation of the
* script. Supported values are
* TCL_EVAL_GLOBAL and
* TCL_EVAL_DIRECT. */
{
register Interp *iPtr = (Interp *) interp;
int numSrcBytes;
int result;
CallFrame *savedVarFramePtr; /* Saves old copy of iPtr->varFramePtr
* in case TCL_EVAL_GLOBAL was set. */
Tcl_IncrRefCount(objPtr);
if ((iPtr->flags & USE_EVAL_DIRECT) || (flags & TCL_EVAL_DIRECT)) {
/*
* We're not supposed to use the compiler or byte-code interpreter.
* Let Tcl_EvalEx evaluate the command directly (and probably
|
| ︙ | ︙ | |||
2785 2786 2787 2788 2789 2790 2791 |
* USE_EVAL_DIRECT is a special flag used for testing purpose only
* (ensure we go into the TCL_EVAL_DIRECT path, avoiding opt)
*/
if (!(iPtr->flags & USE_EVAL_DIRECT) &&
(objPtr->typePtr == &tclListType) && /* is a list... */
(objPtr->bytes == NULL) /* ...without a string rep */) {
register List *listRepPtr =
| | < < < | | | | | | | | < < < < < | < | < < < | < < < < < < < | < < < | | < < < < < < < | < < < | < < < < < < < | < | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | | | | | | | < < < < | < < < < < < < < < < < < < < < | 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 |
* USE_EVAL_DIRECT is a special flag used for testing purpose only
* (ensure we go into the TCL_EVAL_DIRECT path, avoiding opt)
*/
if (!(iPtr->flags & USE_EVAL_DIRECT) &&
(objPtr->typePtr == &tclListType) && /* is a list... */
(objPtr->bytes == NULL) /* ...without a string rep */) {
register List *listRepPtr =
(List *) objPtr->internalRep.twoPtrValue.ptr1;
result = Tcl_EvalObjv(interp, listRepPtr->elemCount,
listRepPtr->elements, flags);
} else {
register char *p;
p = Tcl_GetStringFromObj(objPtr, &numSrcBytes);
result = Tcl_EvalEx(interp, p, numSrcBytes, flags);
}
} else {
/*
* Let the compiler/engine subsystem do the evaluation.
*/
savedVarFramePtr = iPtr->varFramePtr;
if (flags & TCL_EVAL_GLOBAL) {
iPtr->varFramePtr = NULL;
}
result = TclCompEvalObj(interp, objPtr, /* engineCall */ 0);
/*
* If we are again at the top level, process any unusual
* return code returned by the evaluated code.
*/
if (iPtr->numLevels == 0) {
if (result == TCL_RETURN) {
result = TclUpdateReturnInfo(iPtr);
}
if ((result != TCL_OK) && (result != TCL_ERROR)
&& ((iPtr->evalFlags & TCL_ALLOW_EXCEPTIONS) == 0)) {
ProcessUnexpectedResult(interp, result);
result = TCL_ERROR;
}
}
iPtr->evalFlags = 0;
iPtr->varFramePtr = savedVarFramePtr;
}
TclDecrRefCount(objPtr);
return result;
}
/*
*----------------------------------------------------------------------
*
* ProcessUnexpectedResult --
|
| ︙ | ︙ | |||
3047 3048 3049 3050 3051 3052 3053 |
} else {
char buf[30 + TCL_INTEGER_SPACE];
sprintf(buf, "command returned bad code: %d", returnCode);
Tcl_SetResult(interp, buf, TCL_VOLATILE);
}
}
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 |
} else {
char buf[30 + TCL_INTEGER_SPACE];
sprintf(buf, "command returned bad code: %d", returnCode);
Tcl_SetResult(interp, buf, TCL_VOLATILE);
}
}
/*
*---------------------------------------------------------------------------
*
* Tcl_ExprLong, Tcl_ExprDouble, Tcl_ExprBoolean --
*
* Procedures to evaluate an expression and return its value in a
|
| ︙ | ︙ | |||
3805 3806 3807 3808 3809 3810 3811 |
* An empty string. Just set the interpreter's result to 0.
*/
Tcl_SetResult(interp, "0", TCL_VOLATILE);
}
return result;
}
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 4509 4510 4511 4512 4513 4514 4515 4516 4517 4518 4519 4520 4521 4522 |
* An empty string. Just set the interpreter's result to 0.
*/
Tcl_SetResult(interp, "0", TCL_VOLATILE);
}
return result;
}
/*
*----------------------------------------------------------------------
*
* Tcl_CreateTrace --
*
* Arrange for a procedure to be called to trace command execution.
|
| ︙ | ︙ |
Changes to generic/tclBinary.c.
1 2 3 4 5 6 7 8 9 10 11 12 | /* * tclBinary.c -- * * This file contains the implementation of the "binary" Tcl built-in * command and the Tcl binary data object. * * Copyright (c) 1997 by Sun Microsystems, Inc. * Copyright (c) 1998-1999 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | > > > > > > > > > > > > > > > > > > > > | > | 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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | /* * tclBinary.c -- * * This file contains the implementation of the "binary" Tcl built-in * command and the Tcl binary data object. * * Copyright (c) 1997 by Sun Microsystems, Inc. * Copyright (c) 1998-1999 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclBinary.c,v 1.8.8.1 2002/02/05 02:21:58 wolfsuit Exp $ */ #include <math.h> #include "tclInt.h" #include "tclPort.h" /* * The following constants are used by GetFormatSpec to indicate various * special conditions in the parsing of a format specifier. */ #define BINARY_ALL -1 /* Use all elements in the argument. */ #define BINARY_NOCOUNT -2 /* No count was specified in format. */ /* * The following defines the maximum number of different (integer) * numbers placed in the object cache by 'binary scan' before it bails * out and switches back to Plan A (creating a new object for each * value.) Theoretically, it would be possible to keep the cache * about for the values that are already in it, but that makes the * code slower in practise when overflow happens, and makes little * odds the rest of the time (as measured on my machine.) It is also * slower (on the sample I tried at least) to grow the cache to hold * all items we might want to put in it; presumably the extra cost of * managing the memory for the enlarged table outweighs the benefit * from allocating fewer objects. This is probably because as the * number of objects increases, the likelihood of reuse of any * particular one drops, and there is very little gain from larger * maximum cache sizes (the value below is chosen to allow caching to * work in full with conversion of bytes.) - DKF */ #define BINARY_SCAN_MAX_CACHE 260 /* * Prototypes for local procedures defined in this file: */ static void DupByteArrayInternalRep _ANSI_ARGS_((Tcl_Obj *srcPtr, Tcl_Obj *copyPtr)); static int FormatNumber _ANSI_ARGS_((Tcl_Interp *interp, int type, Tcl_Obj *src, unsigned char **cursorPtr)); static void FreeByteArrayInternalRep _ANSI_ARGS_((Tcl_Obj *objPtr)); static int GetFormatSpec _ANSI_ARGS_((char **formatPtr, char *cmdPtr, int *countPtr)); static Tcl_Obj * ScanNumber _ANSI_ARGS_((unsigned char *buffer, int type, Tcl_HashTable **numberCachePtr)); static int SetByteArrayFromAny _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *objPtr)); static void UpdateStringOfByteArray _ANSI_ARGS_((Tcl_Obj *listPtr)); /* * The following object type represents an array of bytes. An array of |
| ︙ | ︙ | |||
155 156 157 158 159 160 161 | * * Tcl_DbNewByteArrayObj -- * * This procedure is normally called when debugging: i.e., when * TCL_MEM_DEBUG is defined. It is the same as the Tcl_NewByteArrayObj * above except that it calls Tcl_DbCkalloc directly with the file name * and line number from its caller. This simplifies debugging since then | | | | 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 | * * Tcl_DbNewByteArrayObj -- * * This procedure is normally called when debugging: i.e., when * TCL_MEM_DEBUG is defined. It is the same as the Tcl_NewByteArrayObj * above except that it calls Tcl_DbCkalloc directly with the file name * and line number from its caller. This simplifies debugging since then * the [memory active] command will report the correct file name and line * number when reporting objects that haven't been freed. * * When TCL_MEM_DEBUG is not defined, this procedure just returns the * result of calling Tcl_NewByteArrayObj. * * Results: * The newly create object is returned. This object will have no * initial string representation. The returned object has a ref count |
| ︙ | ︙ | |||
557 558 559 560 561 562 563 |
Tcl_Obj *resultPtr; /* Object holding result buffer. */
unsigned char *buffer; /* Start of result buffer. */
unsigned char *cursor; /* Current position within result buffer. */
unsigned char *maxPos; /* Greatest position within result buffer that
* cursor has visited.*/
char *errorString, *errorValue, *str;
int offset, size, length, index;
| | | 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 |
Tcl_Obj *resultPtr; /* Object holding result buffer. */
unsigned char *buffer; /* Start of result buffer. */
unsigned char *cursor; /* Current position within result buffer. */
unsigned char *maxPos; /* Greatest position within result buffer that
* cursor has visited.*/
char *errorString, *errorValue, *str;
int offset, size, length, index;
static CONST char *options[] = {
"format", "scan", NULL
};
enum options {
BINARY_FORMAT, BINARY_SCAN
};
if (objc < 2) {
|
| ︙ | ︙ | |||
992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 |
}
}
break;
}
case BINARY_SCAN: {
int i;
Tcl_Obj *valuePtr, *elementPtr;
if (objc < 4) {
Tcl_WrongNumArgs(interp, 2, objv,
"value formatString ?varName varName ...?");
return TCL_ERROR;
}
buffer = Tcl_GetByteArrayFromObj(objv[2], &length);
format = Tcl_GetString(objv[3]);
cursor = buffer;
arg = 4;
offset = 0;
while (*format != '\0') {
str = format;
if (!GetFormatSpec(&format, &cmd, &count)) {
goto done;
}
switch (cmd) {
case 'a':
case 'A': {
unsigned char *src;
if (arg >= objc) {
goto badIndex;
}
if (count == BINARY_ALL) {
count = length - offset;
} else {
if (count == BINARY_NOCOUNT) {
count = 1;
| > > > > > > > | 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 |
}
}
break;
}
case BINARY_SCAN: {
int i;
Tcl_Obj *valuePtr, *elementPtr;
Tcl_HashTable numberCacheHash;
Tcl_HashTable *numberCachePtr;
if (objc < 4) {
Tcl_WrongNumArgs(interp, 2, objv,
"value formatString ?varName varName ...?");
return TCL_ERROR;
}
numberCachePtr = &numberCacheHash;
Tcl_InitHashTable(numberCachePtr, TCL_ONE_WORD_KEYS);
buffer = Tcl_GetByteArrayFromObj(objv[2], &length);
format = Tcl_GetString(objv[3]);
cursor = buffer;
arg = 4;
offset = 0;
while (*format != '\0') {
str = format;
if (!GetFormatSpec(&format, &cmd, &count)) {
goto done;
}
switch (cmd) {
case 'a':
case 'A': {
unsigned char *src;
if (arg >= objc) {
if (numberCachePtr != NULL) {
Tcl_DeleteHashTable(numberCachePtr);
}
goto badIndex;
}
if (count == BINARY_ALL) {
count = length - offset;
} else {
if (count == BINARY_NOCOUNT) {
count = 1;
|
| ︙ | ︙ | |||
1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 |
}
}
valuePtr = Tcl_NewByteArrayObj(src, size);
resultPtr = Tcl_ObjSetVar2(interp, objv[arg],
NULL, valuePtr, TCL_LEAVE_ERR_MSG);
arg++;
if (resultPtr == NULL) {
Tcl_DecrRefCount(valuePtr); /* unneeded */
return TCL_ERROR;
}
offset += count;
break;
}
case 'b':
case 'B': {
unsigned char *src;
char *dest;
if (arg >= objc) {
goto badIndex;
}
if (count == BINARY_ALL) {
count = (length - offset) * 8;
} else {
if (count == BINARY_NOCOUNT) {
count = 1;
| > > > > > > | 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 |
}
}
valuePtr = Tcl_NewByteArrayObj(src, size);
resultPtr = Tcl_ObjSetVar2(interp, objv[arg],
NULL, valuePtr, TCL_LEAVE_ERR_MSG);
arg++;
if (resultPtr == NULL) {
if (numberCachePtr != NULL) {
Tcl_DeleteHashTable(numberCachePtr);
}
Tcl_DecrRefCount(valuePtr); /* unneeded */
return TCL_ERROR;
}
offset += count;
break;
}
case 'b':
case 'B': {
unsigned char *src;
char *dest;
if (arg >= objc) {
if (numberCachePtr != NULL) {
Tcl_DeleteHashTable(numberCachePtr);
}
goto badIndex;
}
if (count == BINARY_ALL) {
count = (length - offset) * 8;
} else {
if (count == BINARY_NOCOUNT) {
count = 1;
|
| ︙ | ︙ | |||
1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 |
}
}
resultPtr = Tcl_ObjSetVar2(interp, objv[arg],
NULL, valuePtr, TCL_LEAVE_ERR_MSG);
arg++;
if (resultPtr == NULL) {
Tcl_DecrRefCount(valuePtr); /* unneeded */
return TCL_ERROR;
}
offset += (count + 7 ) / 8;
break;
}
case 'h':
case 'H': {
char *dest;
unsigned char *src;
int i;
static char hexdigit[] = "0123456789abcdef";
if (arg >= objc) {
goto badIndex;
}
if (count == BINARY_ALL) {
count = (length - offset)*2;
} else {
if (count == BINARY_NOCOUNT) {
count = 1;
| > > > > > > | 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 |
}
}
resultPtr = Tcl_ObjSetVar2(interp, objv[arg],
NULL, valuePtr, TCL_LEAVE_ERR_MSG);
arg++;
if (resultPtr == NULL) {
if (numberCachePtr != NULL) {
Tcl_DeleteHashTable(numberCachePtr);
}
Tcl_DecrRefCount(valuePtr); /* unneeded */
return TCL_ERROR;
}
offset += (count + 7 ) / 8;
break;
}
case 'h':
case 'H': {
char *dest;
unsigned char *src;
int i;
static char hexdigit[] = "0123456789abcdef";
if (arg >= objc) {
if (numberCachePtr != NULL) {
Tcl_DeleteHashTable(numberCachePtr);
}
goto badIndex;
}
if (count == BINARY_ALL) {
count = (length - offset)*2;
} else {
if (count == BINARY_NOCOUNT) {
count = 1;
|
| ︙ | ︙ | |||
1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 |
}
}
resultPtr = Tcl_ObjSetVar2(interp, objv[arg],
NULL, valuePtr, TCL_LEAVE_ERR_MSG);
arg++;
if (resultPtr == NULL) {
Tcl_DecrRefCount(valuePtr); /* unneeded */
return TCL_ERROR;
}
offset += (count + 1) / 2;
break;
}
case 'c': {
| > > > | 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 |
}
}
resultPtr = Tcl_ObjSetVar2(interp, objv[arg],
NULL, valuePtr, TCL_LEAVE_ERR_MSG);
arg++;
if (resultPtr == NULL) {
if (numberCachePtr != NULL) {
Tcl_DeleteHashTable(numberCachePtr);
}
Tcl_DecrRefCount(valuePtr); /* unneeded */
return TCL_ERROR;
}
offset += (count + 1) / 2;
break;
}
case 'c': {
|
| ︙ | ︙ | |||
1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 |
unsigned char *src;
size = sizeof(double);
/* fall through */
scanNumber:
if (arg >= objc) {
goto badIndex;
}
if (count == BINARY_NOCOUNT) {
if ((length - offset) < size) {
goto done;
}
| > > > | > | > > > > | 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 |
unsigned char *src;
size = sizeof(double);
/* fall through */
scanNumber:
if (arg >= objc) {
if (numberCachePtr != NULL) {
Tcl_DeleteHashTable(numberCachePtr);
}
goto badIndex;
}
if (count == BINARY_NOCOUNT) {
if ((length - offset) < size) {
goto done;
}
valuePtr = ScanNumber(buffer+offset, cmd,
&numberCachePtr);
offset += size;
} else {
if (count == BINARY_ALL) {
count = (length - offset) / size;
}
if ((length - offset) < (count * size)) {
goto done;
}
valuePtr = Tcl_NewObj();
src = buffer+offset;
for (i = 0; i < count; i++) {
elementPtr = ScanNumber(src, cmd,
&numberCachePtr);
src += size;
Tcl_ListObjAppendElement(NULL, valuePtr,
elementPtr);
}
offset += count*size;
}
resultPtr = Tcl_ObjSetVar2(interp, objv[arg],
NULL, valuePtr, TCL_LEAVE_ERR_MSG);
arg++;
if (resultPtr == NULL) {
if (numberCachePtr != NULL) {
Tcl_DeleteHashTable(numberCachePtr);
}
Tcl_DecrRefCount(valuePtr); /* unneeded */
return TCL_ERROR;
}
break;
}
case 'x': {
if (count == BINARY_NOCOUNT) {
|
| ︙ | ︙ | |||
1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 |
} else {
offset -= count;
}
break;
}
case '@': {
if (count == BINARY_NOCOUNT) {
goto badCount;
}
if ((count == BINARY_ALL) || (count > length)) {
offset = length;
} else {
offset = count;
}
break;
}
default: {
errorString = str;
goto badfield;
}
}
}
/*
* Set the result to the last position of the cursor.
*/
done:
Tcl_ResetResult(interp);
Tcl_SetLongObj(Tcl_GetObjResult(interp), arg - 4);
break;
}
}
return TCL_OK;
badValue:
Tcl_ResetResult(interp);
| > > > > > > > > > | 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 |
} else {
offset -= count;
}
break;
}
case '@': {
if (count == BINARY_NOCOUNT) {
if (numberCachePtr != NULL) {
Tcl_DeleteHashTable(numberCachePtr);
}
goto badCount;
}
if ((count == BINARY_ALL) || (count > length)) {
offset = length;
} else {
offset = count;
}
break;
}
default: {
if (numberCachePtr != NULL) {
Tcl_DeleteHashTable(numberCachePtr);
}
errorString = str;
goto badfield;
}
}
}
/*
* Set the result to the last position of the cursor.
*/
done:
Tcl_ResetResult(interp);
Tcl_SetLongObj(Tcl_GetObjResult(interp), arg - 4);
if (numberCachePtr != NULL) {
Tcl_DeleteHashTable(numberCachePtr);
}
break;
}
}
return TCL_OK;
badValue:
Tcl_ResetResult(interp);
|
| ︙ | ︙ | |||
1461 1462 1463 1464 1465 1466 1467 | * out of a buffer. * * Results: * Returns a newly created object containing the scanned number. * This object has a ref count of zero. * * Side effects: | | > > | > > > > | | | | < | | | | < | > > | > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > | 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 |
* out of a buffer.
*
* Results:
* Returns a newly created object containing the scanned number.
* This object has a ref count of zero.
*
* Side effects:
* Might reuse an object in the number cache, place a new object
* in the cache, or delete the cache and set the reference to
* it (itself passed in by reference) to NULL.
*
*----------------------------------------------------------------------
*/
static Tcl_Obj *
ScanNumber(buffer, type, numberCachePtrPtr)
unsigned char *buffer; /* Buffer to scan number from. */
int type; /* Format character from "binary scan" */
Tcl_HashTable **numberCachePtrPtr;
/* Place to look for cache of scanned
* value objects, or NULL if too many
* different numbers have been scanned. */
{
long value;
/*
* We cannot rely on the compiler to properly sign extend integer values
* when we cast from smaller values to larger values because we don't know
* the exact size of the integer types. So, we have to handle sign
* extension explicitly by checking the high bit and padding with 1's as
* needed.
*/
switch (type) {
case 'c':
/*
* Characters need special handling. We want to produce a
* signed result, but on some platforms (such as AIX) chars
* are unsigned. To deal with this, check for a value that
* should be negative but isn't.
*/
value = buffer[0];
if (value & 0x80) {
value |= -0x100;
}
goto returnNumericObject;
case 's':
value = (long) (buffer[0] + (buffer[1] << 8));
goto shortValue;
case 'S':
value = (long) (buffer[1] + (buffer[0] << 8));
shortValue:
if (value & 0x8000) {
value |= -0x10000;
}
goto returnNumericObject;
case 'i':
value = (long) (buffer[0]
+ (buffer[1] << 8)
+ (buffer[2] << 16)
+ (buffer[3] << 24));
goto intValue;
case 'I':
value = (long) (buffer[3]
+ (buffer[2] << 8)
+ (buffer[1] << 16)
+ (buffer[0] << 24));
intValue:
/*
* Check to see if the value was sign extended properly on
* systems where an int is more than 32-bits.
*/
if ((value & (((unsigned int)1)<<31)) && (value > 0)) {
value -= (((unsigned int)1)<<31);
value -= (((unsigned int)1)<<31);
}
returnNumericObject:
if (*numberCachePtrPtr == NULL) {
return Tcl_NewLongObj(value);
} else {
register Tcl_HashTable *tablePtr = *numberCachePtrPtr;
register Tcl_HashEntry *hPtr;
int isNew;
hPtr = Tcl_CreateHashEntry(tablePtr, (char *)value, &isNew);
if (!isNew) {
return (Tcl_Obj *) Tcl_GetHashValue(hPtr);
}
if (tablePtr->numEntries > BINARY_SCAN_MAX_CACHE) {
/*
* We've overflowed the cache! Someone's parsing
* a LOT of varied binary data in a single call!
* Bail out by switching back to the old behaviour
* for the rest of the scan.
*
* Note that anyone just using the 'c' conversion
* (for bytes) cannot trigger this.
*/
Tcl_DeleteHashTable(tablePtr);
*numberCachePtrPtr = NULL;
return Tcl_NewLongObj(value);
} else {
register Tcl_Obj *objPtr = Tcl_NewLongObj(value);
/* Don't need to fiddle with refcount... */
Tcl_SetHashValue(hPtr, (ClientData) objPtr);
return objPtr;
}
}
case 'f': {
float fvalue;
memcpy((VOID *) &fvalue, (VOID *) buffer, sizeof(float));
return Tcl_NewDoubleObj(fvalue);
}
case 'd': {
double dvalue;
memcpy((VOID *) &dvalue, (VOID *) buffer, sizeof(double));
return Tcl_NewDoubleObj(dvalue);
}
}
return NULL;
}
|
Changes to generic/tclCkalloc.c.
| ︙ | ︙ | |||
9 10 11 12 13 14 15 | * Copyright (c) 1998-1999 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * This code contributed by Karl Lehenbauer and Mark Diekhans * | | | 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | * Copyright (c) 1998-1999 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * This code contributed by Karl Lehenbauer and Mark Diekhans * * RCS: @(#) $Id: tclCkalloc.c,v 1.12.14.1 2002/02/05 02:21:58 wolfsuit Exp $ */ #include "tclInt.h" #include "tclPort.h" #define FALSE 0 #define TRUE 1 |
| ︙ | ︙ | |||
107 108 109 110 111 112 113 114 115 116 117 118 119 120 | * that it should dump out the state of memory before exiting. If the * value is non-NULL, it gives the name of the file in which to * dump memory usage information. */ char *tclMemDumpFileName = NULL; static char dumpFile[100]; /* Records where to dump memory allocation * information. */ /* * Mutex to serialize allocations. This is a low-level mutex that must * be explicitly initialized. This is necessary because the self * initializing mutexes use ckalloc... | > | 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | * that it should dump out the state of memory before exiting. If the * value is non-NULL, it gives the name of the file in which to * dump memory usage information. */ char *tclMemDumpFileName = NULL; static char *onExitMemDumpFileName = NULL; static char dumpFile[100]; /* Records where to dump memory allocation * information. */ /* * Mutex to serialize allocations. This is a low-level mutex that must * be explicitly initialized. This is necessary because the self * initializing mutexes use ckalloc... |
| ︙ | ︙ | |||
300 301 302 303 304 305 306 | * * Tcl_DumpActiveMemory -- * * Displays all allocated memory to a file; if no filename is given, * information will be written to stderr. * * Results: | | | 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 |
*
* Tcl_DumpActiveMemory --
*
* Displays all allocated memory to a file; if no filename is given,
* information will be written to stderr.
*
* Results:
* Return TCL_ERROR if an error accessing the file occurs, `errno'
* will have the file error number left in it.
*----------------------------------------------------------------------
*/
int
Tcl_DumpActiveMemory (fileName)
CONST char *fileName; /* Name of the file to write info to */
{
|
| ︙ | ︙ | |||
445 446 447 448 449 450 451 |
return result->body;
}
char *
Tcl_AttemptDbCkalloc(size, file, line)
unsigned int size;
| | | 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 |
return result->body;
}
char *
Tcl_AttemptDbCkalloc(size, file, line)
unsigned int size;
CONST char *file;
int line;
{
struct mem_header *result;
if (validate_memory)
Tcl_ValidateAllMemory (file, line);
|
| ︙ | ︙ | |||
624 625 626 627 628 629 630 | * freeing the old memory space, using all the memory checking * features of this package. * *-------------------------------------------------------------------- */ char * Tcl_DbCkrealloc(ptr, size, file, line) | | | | | 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 |
* freeing the old memory space, using all the memory checking
* features of this package.
*
*--------------------------------------------------------------------
*/
char *
Tcl_DbCkrealloc(ptr, size, file, line)
char *ptr;
unsigned int size;
CONST char *file;
int line;
{
char *new;
unsigned int copySize;
struct mem_header *memp;
if (ptr == NULL) {
return Tcl_DbCkalloc(size, file, line);
|
| ︙ | ︙ | |||
656 657 658 659 660 661 662 |
memcpy((VOID *) new, (VOID *) ptr, (size_t) copySize);
Tcl_DbCkfree(ptr, file, line);
return new;
}
char *
Tcl_AttemptDbCkrealloc(ptr, size, file, line)
| | | | | 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 |
memcpy((VOID *) new, (VOID *) ptr, (size_t) copySize);
Tcl_DbCkfree(ptr, file, line);
return new;
}
char *
Tcl_AttemptDbCkrealloc(ptr, size, file, line)
char *ptr;
unsigned int size;
CONST char *file;
int line;
{
char *new;
unsigned int copySize;
struct mem_header *memp;
if (ptr == NULL) {
return Tcl_AttemptDbCkalloc(size, file, line);
|
| ︙ | ︙ | |||
755 756 757 758 759 760 761 762 | /* *---------------------------------------------------------------------- * * MemoryCmd -- * Implements the Tcl "memory" command, which provides Tcl-level * control of Tcl memory debugging information. * memory info | > > | | | > | | | | 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 |
/*
*----------------------------------------------------------------------
*
* MemoryCmd --
* Implements the Tcl "memory" command, which provides Tcl-level
* control of Tcl memory debugging information.
* memory active $file
* memory break_on_malloc $count
* memory info
* memory init on|off
* memory onexit $file
* memory tag $string
* memory trace on|off
* memory trace_on_at_malloc $count
* memory validate on|off
*
* Results:
* Standard TCL results.
*
*----------------------------------------------------------------------
*/
/* ARGSUSED */
static int
MemoryCmd (clientData, interp, argc, argv)
ClientData clientData;
Tcl_Interp *interp;
int argc;
char **argv;
{
CONST char *fileName;
Tcl_DString buffer;
int result;
if (argc < 2) {
Tcl_AppendResult(interp, "wrong # args: should be \"",
argv[0], " option [args..]\"", (char *) NULL);
return TCL_ERROR;
}
if ((strcmp(argv[1],"active") == 0) || (strcmp(argv[1],"display") == 0)) {
if (argc != 3) {
Tcl_AppendResult(interp, "wrong # args: should be \"",
argv[0], " ", argv[1], " file\"", (char *) NULL);
return TCL_ERROR;
}
fileName = Tcl_TranslateFileName(interp, argv[2], &buffer);
if (fileName == NULL) {
return TCL_ERROR;
}
result = Tcl_DumpActiveMemory (fileName);
|
| ︙ | ︙ | |||
814 815 816 817 818 819 820 |
}
if (Tcl_GetInt(interp, argv[2], &break_on_malloc) != TCL_OK) {
return TCL_ERROR;
}
return TCL_OK;
}
if (strcmp(argv[1],"info") == 0) {
| | | | > > > > > > > > > > > > > > > | 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 |
}
if (Tcl_GetInt(interp, argv[2], &break_on_malloc) != TCL_OK) {
return TCL_ERROR;
}
return TCL_OK;
}
if (strcmp(argv[1],"info") == 0) {
char buf[400];
sprintf(buf, "%-25s %10d\n%-25s %10d\n%-25s %10d\n%-25s %10d\n%-25s %10d\n%-25s %10d\n",
"total mallocs", total_mallocs, "total frees", total_frees,
"current packets allocated", current_malloc_packets,
"current bytes allocated", current_bytes_malloced,
"maximum packets allocated", maximum_malloc_packets,
"maximum bytes allocated", maximum_bytes_malloced);
Tcl_SetResult(interp, buf, TCL_VOLATILE);
return TCL_OK;
}
if (strcmp(argv[1],"init") == 0) {
if (argc != 3) {
goto bad_suboption;
}
init_malloced_bodies = (strcmp(argv[2],"on") == 0);
return TCL_OK;
}
if (strcmp(argv[1],"onexit") == 0) {
if (argc != 3) {
Tcl_AppendResult(interp, "wrong # args: should be \"",
argv[0], " onexit file\"", (char *) NULL);
return TCL_ERROR;
}
fileName = Tcl_TranslateFileName(interp, argv[2], &buffer);
if (fileName == NULL) {
return TCL_ERROR;
}
onExitMemDumpFileName = dumpFile;
strcpy(onExitMemDumpFileName,fileName);
Tcl_DStringFree(&buffer);
return TCL_OK;
}
if (strcmp(argv[1],"tag") == 0) {
if (argc != 3) {
Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
" tag string\"", (char *) NULL);
return TCL_ERROR;
}
|
| ︙ | ︙ | |||
871 872 873 874 875 876 877 |
goto bad_suboption;
}
validate_memory = (strcmp(argv[2],"on") == 0);
return TCL_OK;
}
Tcl_AppendResult(interp, "bad option \"", argv[1],
| | | 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 |
goto bad_suboption;
}
validate_memory = (strcmp(argv[2],"on") == 0);
return TCL_OK;
}
Tcl_AppendResult(interp, "bad option \"", argv[1],
"\": should be active, break_on_malloc, info, init, onexit, ",
"tag, trace, trace_on_at_malloc, or validate", (char *) NULL);
return TCL_ERROR;
argError:
Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
" ", argv[1], " count\"", (char *) NULL);
return TCL_ERROR;
|
| ︙ | ︙ | |||
1032 1033 1034 1035 1036 1037 1038 |
result = TclpAlloc(size);
return result;
}
char *
Tcl_AttemptDbCkalloc(size, file, line)
unsigned int size;
| | | 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 |
result = TclpAlloc(size);
return result;
}
char *
Tcl_AttemptDbCkalloc(size, file, line)
unsigned int size;
CONST char *file;
int line;
{
char *result;
result = (char *) TclpAlloc(size);
return result;
}
|
| ︙ | ︙ | |||
1108 1109 1110 1111 1112 1113 1114 |
result = TclpRealloc(ptr, size);
return result;
}
char *
Tcl_AttemptDbCkrealloc(ptr, size, file, line)
| | | | | 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 |
result = TclpRealloc(ptr, size);
return result;
}
char *
Tcl_AttemptDbCkrealloc(ptr, size, file, line)
char *ptr;
unsigned int size;
CONST char *file;
int line;
{
char *result;
result = (char *) TclpRealloc(ptr, size);
return result;
}
|
| ︙ | ︙ | |||
1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 |
void
TclFinalizeMemorySubsystem()
{
#ifdef TCL_MEM_DEBUG
Tcl_MutexLock(ckallocMutexPtr);
if (tclMemDumpFileName != NULL) {
Tcl_DumpActiveMemory(tclMemDumpFileName);
}
if (curTagPtr != NULL) {
TclpFree((char *) curTagPtr);
curTagPtr = NULL;
}
allocHead = NULL;
Tcl_MutexUnlock(ckallocMutexPtr);
#endif
#if USE_TCLALLOC
TclFinalizeAllocSubsystem();
#endif
}
| > > | 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 |
void
TclFinalizeMemorySubsystem()
{
#ifdef TCL_MEM_DEBUG
Tcl_MutexLock(ckallocMutexPtr);
if (tclMemDumpFileName != NULL) {
Tcl_DumpActiveMemory(tclMemDumpFileName);
} else if (onExitMemDumpFileName != NULL) {
Tcl_DumpActiveMemory(onExitMemDumpFileName);
}
if (curTagPtr != NULL) {
TclpFree((char *) curTagPtr);
curTagPtr = NULL;
}
allocHead = NULL;
Tcl_MutexUnlock(ckallocMutexPtr);
#endif
#if USE_TCLALLOC
TclFinalizeAllocSubsystem();
#endif
}
|
Changes to generic/tclClock.c.
1 2 3 4 5 6 7 8 9 10 11 12 13 | /* * tclClock.c -- * * Contains the time and date related commands. This code * is derived from the time and date facilities of TclX, * by Mark Diekhans and Karl Lehenbauer. * * Copyright 1991-1995 Karl Lehenbauer and Mark Diekhans. * Copyright (c) 1995 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | /* * tclClock.c -- * * Contains the time and date related commands. This code * is derived from the time and date facilities of TclX, * by Mark Diekhans and Karl Lehenbauer. * * Copyright 1991-1995 Karl Lehenbauer and Mark Diekhans. * Copyright (c) 1995 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclClock.c,v 1.11.14.1 2002/02/05 02:21:58 wolfsuit Exp $ */ #include "tcl.h" #include "tclInt.h" #include "tclPort.h" /* |
| ︙ | ︙ | |||
63 64 65 66 67 68 69 |
char *format = "%a %b %d %X %Z %Y";
int dummy;
unsigned long baseClock, clockVal;
long zone;
Tcl_Obj *baseObjPtr = NULL;
char *scanStr;
| | | | | 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
char *format = "%a %b %d %X %Z %Y";
int dummy;
unsigned long baseClock, clockVal;
long zone;
Tcl_Obj *baseObjPtr = NULL;
char *scanStr;
static CONST char *switches[] =
{"clicks", "format", "scan", "seconds", (char *) NULL};
enum command { COMMAND_CLICKS, COMMAND_FORMAT, COMMAND_SCAN,
COMMAND_SECONDS
};
static CONST char *formatSwitches[] = {"-format", "-gmt", (char *) NULL};
static CONST char *scanSwitches[] = {"-base", "-gmt", (char *) NULL};
resultPtr = Tcl_GetObjResult(interp);
if (objc < 2) {
Tcl_WrongNumArgs(interp, 1, objv, "option ?arg ...?");
return TCL_ERROR;
}
|
| ︙ | ︙ | |||
105 106 107 108 109 110 111 |
return TCL_ERROR;
}
if (forceMilli) {
/*
* We can enforce at least millisecond granularity
*/
Tcl_Time time;
| | | 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
return TCL_ERROR;
}
if (forceMilli) {
/*
* We can enforce at least millisecond granularity
*/
Tcl_Time time;
Tcl_GetTime(&time);
Tcl_SetLongObj(resultPtr,
(long) (time.sec*1000 + time.usec/1000));
} else {
Tcl_SetLongObj(resultPtr, (long) TclpGetClicks());
}
return TCL_OK;
}
|
| ︙ | ︙ | |||
293 294 295 296 297 298 299 |
/*
* This is a kludge for systems not having the timezone string in
* struct tm. No matter what was specified, they use the local
* timezone string.
*/
if (useGMT) {
| | | 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 |
/*
* This is a kludge for systems not having the timezone string in
* struct tm. No matter what was specified, they use the local
* timezone string.
*/
if (useGMT) {
CONST char *varValue;
varValue = Tcl_GetVar2(interp, "env", "TZ", TCL_GLOBAL_ONLY);
if (varValue != NULL) {
savedTZEnv = strcpy(ckalloc(strlen(varValue) + 1), varValue);
} else {
savedTZEnv = NULL;
}
|
| ︙ | ︙ |
Changes to generic/tclCmdAH.c.
1 2 3 4 5 6 7 8 9 10 11 12 13 | /* * tclCmdAH.c -- * * This file contains the top-level command routines for most of * the Tcl built-in commands whose names begin with the letters * A to H. * * Copyright (c) 1987-1993 The Regents of the University of California. * Copyright (c) 1994-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | /* * tclCmdAH.c -- * * This file contains the top-level command routines for most of * the Tcl built-in commands whose names begin with the letters * A to H. * * Copyright (c) 1987-1993 The Regents of the University of California. * Copyright (c) 1994-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclCmdAH.c,v 1.16.4.1 2002/02/05 02:21:58 wolfsuit Exp $ */ #include "tclInt.h" #include "tclPort.h" #include <locale.h> /* |
| ︙ | ︙ | |||
127 128 129 130 131 132 133 |
Tcl_ListObjGetElements(interp, caseObjv[0], &caseObjc, &newObjv);
caseObjv = newObjv;
}
for (i = 0; i < caseObjc; i += 2) {
int patObjc, j;
| | | 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
Tcl_ListObjGetElements(interp, caseObjv[0], &caseObjc, &newObjv);
caseObjv = newObjv;
}
for (i = 0; i < caseObjc; i += 2) {
int patObjc, j;
CONST char **patObjv;
char *pat;
unsigned char *p;
if (i == (caseObjc - 1)) {
Tcl_ResetResult(interp);
Tcl_AppendToObj(Tcl_GetObjResult(interp),
"extra case pattern with no body", -1);
|
| ︙ | ︙ | |||
423 424 425 426 427 428 429 |
{
int index, length;
Tcl_Encoding encoding;
char *string;
Tcl_DString ds;
Tcl_Obj *resultPtr;
| | | 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 |
{
int index, length;
Tcl_Encoding encoding;
char *string;
Tcl_DString ds;
Tcl_Obj *resultPtr;
static CONST char *optionStrings[] = {
"convertfrom", "convertto", "names", "system",
NULL
};
enum options {
ENC_CONVERTFROM, ENC_CONVERTTO, ENC_NAMES, ENC_SYSTEM
};
|
| ︙ | ︙ | |||
508 509 510 511 512 513 514 |
}
case ENC_SYSTEM: {
if (objc > 3) {
Tcl_WrongNumArgs(interp, 2, objv, "?encoding?");
return TCL_ERROR;
}
if (objc == 2) {
| > | | 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 |
}
case ENC_SYSTEM: {
if (objc > 3) {
Tcl_WrongNumArgs(interp, 2, objv, "?encoding?");
return TCL_ERROR;
}
if (objc == 2) {
Tcl_SetStringObj(Tcl_GetObjResult(interp),
Tcl_GetEncodingName(NULL), -1);
} else {
return Tcl_SetSystemEncoding(interp,
Tcl_GetStringFromObj(objv[2], NULL));
}
break;
}
}
|
| ︙ | ︙ | |||
782 783 784 785 786 787 788 |
{
int index;
/*
* This list of constants should match the fileOption string array below.
*/
| | | 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 |
{
int index;
/*
* This list of constants should match the fileOption string array below.
*/
static CONST char *fileOptions[] = {
"atime", "attributes", "channels", "copy",
"delete",
"dirname", "executable", "exists", "extension",
"isdirectory", "isfile", "join", "lstat",
"mtime", "mkdir", "nativename",
"normalize", "owned",
"pathtype", "readable", "readlink", "rename",
|
| ︙ | ︙ | |||
1010 1011 1012 1013 1014 1015 1016 |
if (objc < 3) {
Tcl_WrongNumArgs(interp, 2, objv, "name ?name ...?");
return TCL_ERROR;
}
return TclFileMakeDirsCmd(interp, objc, objv);
}
case FILE_NATIVENAME: {
| | | 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 |
if (objc < 3) {
Tcl_WrongNumArgs(interp, 2, objv, "name ?name ...?");
return TCL_ERROR;
}
return TclFileMakeDirsCmd(interp, objc, objv);
}
case FILE_NATIVENAME: {
CONST char *fileName;
Tcl_DString ds;
if (objc != 3) {
goto only3Args;
}
fileName = Tcl_GetString(objv[2]);
fileName = Tcl_TranslateFileName(interp, fileName, &ds);
|
| ︙ | ︙ | |||
1726 1727 1728 1729 1730 1731 1732 |
* If some value lists run out of values, set loop vars to ""
*/
bodyPtr = argObjv[objc-1];
for (j = 0; j < maxj; j++) {
for (i = 0; i < numLists; i++) {
/*
| | | | > > > < | | | | | < < | | | | < | 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 |
* If some value lists run out of values, set loop vars to ""
*/
bodyPtr = argObjv[objc-1];
for (j = 0; j < maxj; j++) {
for (i = 0; i < numLists; i++) {
/*
* Refetch the list members; we assume that the sizes are
* the same, but the array of elements might be different
* if the internal rep of the objects has been lost and
* recreated (it is too difficult to accurately tell when
* this happens, which can lead to some wierd crashes,
* like Bug #494348...)
*/
result = Tcl_ListObjGetElements(interp, argObjv[1+i*2],
&varcList[i], &varvList[i]);
if (result != TCL_OK) {
panic("Tcl_ForeachObjCmd: could not reconvert variable list %d to a list object\n", i);
}
result = Tcl_ListObjGetElements(interp, argObjv[2+i*2],
&argcList[i], &argvList[i]);
if (result != TCL_OK) {
panic("Tcl_ForeachObjCmd: could not reconvert value list %d to a list object\n", i);
}
for (v = 0; v < varcList[i]; v++) {
int k = index[i]++;
Tcl_Obj *valuePtr, *varValuePtr;
int isEmptyObj = 0;
|
| ︙ | ︙ | |||
1912 1913 1914 1915 1916 1917 1918 |
*/
if (objc < 2) {
Tcl_WrongNumArgs(interp, 1, objv, "formatString ?arg arg ...?");
return TCL_ERROR;
}
| | | 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 |
*/
if (objc < 2) {
Tcl_WrongNumArgs(interp, 1, objv, "formatString ?arg arg ...?");
return TCL_ERROR;
}
format = Tcl_GetStringFromObj(objv[1], &formatLen);
endPtr = format + formatLen;
resultPtr = Tcl_NewObj();
objIndex = 2;
while (format < endPtr) {
register char *newPtr = newFormat;
|
| ︙ | ︙ |
Changes to generic/tclCmdIL.c.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | /* * tclCmdIL.c -- * * This file contains the top-level command routines for most of * the Tcl built-in commands whose names begin with the letters * I through L. It contains only commands in the generic core * (i.e. those that don't depend much upon UNIX facilities). * * Copyright (c) 1987-1993 The Regents of the University of California. * Copyright (c) 1993-1997 Lucent Technologies. * Copyright (c) 1994-1997 Sun Microsystems, Inc. * Copyright (c) 1998-1999 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | > | | 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 | /* * tclCmdIL.c -- * * This file contains the top-level command routines for most of * the Tcl built-in commands whose names begin with the letters * I through L. It contains only commands in the generic core * (i.e. those that don't depend much upon UNIX facilities). * * Copyright (c) 1987-1993 The Regents of the University of California. * Copyright (c) 1993-1997 Lucent Technologies. * Copyright (c) 1994-1997 Sun Microsystems, Inc. * Copyright (c) 1998-1999 by Scriptics Corporation. * Copyright (c) 2001 by Kevin B. Kenny. All rights reserved. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclCmdIL.c,v 1.35.2.1 2002/02/05 02:21:58 wolfsuit Exp $ */ #include "tclInt.h" #include "tclPort.h" #include "tclRegexp.h" /* |
| ︙ | ︙ | |||
368 369 370 371 372 373 374 |
int
Tcl_InfoObjCmd(clientData, interp, objc, objv)
ClientData clientData; /* Arbitrary value passed to the command. */
Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
| | | 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 |
int
Tcl_InfoObjCmd(clientData, interp, objc, objv)
ClientData clientData; /* Arbitrary value passed to the command. */
Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
static CONST char *subCmds[] = {
"args", "body", "cmdcount", "commands",
"complete", "default", "exists", "functions", "globals",
"hostname", "level", "library", "loaded",
"locals", "nameofexecutable", "patchlevel", "procs",
"script", "sharedlibextension", "tclversion", "vars",
(char *) NULL};
enum ISubCmdIdx {
|
| ︙ | ︙ | |||
1069 1070 1071 1072 1073 1074 1075 |
static int
InfoHostnameCmd(dummy, interp, objc, objv)
ClientData dummy; /* Not used. */
Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
| | | 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 |
static int
InfoHostnameCmd(dummy, interp, objc, objv)
ClientData dummy; /* Not used. */
Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
CONST char *name;
if (objc != 2) {
Tcl_WrongNumArgs(interp, 2, objv, NULL);
return TCL_ERROR;
}
name = Tcl_GetHostName();
if (name) {
|
| ︙ | ︙ | |||
1187 1188 1189 1190 1191 1192 1193 |
static int
InfoLibraryCmd(dummy, interp, objc, objv)
ClientData dummy; /* Not used. */
Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
| | | 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 |
static int
InfoLibraryCmd(dummy, interp, objc, objv)
ClientData dummy; /* Not used. */
Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
CONST char *libDirName;
if (objc != 2) {
Tcl_WrongNumArgs(interp, 2, objv, NULL);
return TCL_ERROR;
}
libDirName = Tcl_GetVar(interp, "tcl_library", TCL_GLOBAL_ONLY);
|
| ︙ | ︙ | |||
1416 1417 1418 1419 1420 1421 1422 |
Tcl_WrongNumArgs(interp, 2, objv, NULL);
return TCL_ERROR;
}
nameOfExecutable = Tcl_GetNameOfExecutable();
if (nameOfExecutable != NULL) {
| | | 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 |
Tcl_WrongNumArgs(interp, 2, objv, NULL);
return TCL_ERROR;
}
nameOfExecutable = Tcl_GetNameOfExecutable();
if (nameOfExecutable != NULL) {
Tcl_SetStringObj(Tcl_GetObjResult(interp), nameOfExecutable, -1);
}
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
|
| ︙ | ︙ | |||
1449 1450 1451 1452 1453 1454 1455 |
static int
InfoPatchLevelCmd(dummy, interp, objc, objv)
ClientData dummy; /* Not used. */
Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
| | | 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 |
static int
InfoPatchLevelCmd(dummy, interp, objc, objv)
ClientData dummy; /* Not used. */
Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
CONST char *patchlevel;
if (objc != 2) {
Tcl_WrongNumArgs(interp, 2, objv, NULL);
return TCL_ERROR;
}
patchlevel = Tcl_GetVar(interp, "tcl_patchLevel",
|
| ︙ | ︙ | |||
1737 1738 1739 1740 1741 1742 1743 |
static int
InfoTclVersionCmd(dummy, interp, objc, objv)
ClientData dummy; /* Not used. */
Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
| | | 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 |
static int
InfoTclVersionCmd(dummy, interp, objc, objv)
ClientData dummy; /* Not used. */
Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
CONST char *version;
if (objc != 2) {
Tcl_WrongNumArgs(interp, 2, objv, NULL);
return TCL_ERROR;
}
version = Tcl_GetVar(interp, "tcl_version",
|
| ︙ | ︙ | |||
1999 2000 2001 2002 2003 2004 2005 |
int
Tcl_LindexObjCmd(dummy, interp, objc, objv)
ClientData dummy; /* Not used. */
Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
| | | < | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > | > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > | > | > | | | | | > > > > > > > > > > > > > > > > > | > > > > | | > > > > > | > > > | > | | > | > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > | | > | | | | | | > | | | | | < > | | > > > > | > > | > | 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 |
int
Tcl_LindexObjCmd(dummy, interp, objc, objv)
ClientData dummy; /* Not used. */
Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
Tcl_Obj *elemPtr; /* Pointer to the element being extracted */
if (objc < 2) {
Tcl_WrongNumArgs(interp, 1, objv, "list ?index...?");
return TCL_ERROR;
}
/*
* If objc == 3, then objv[ 2 ] may be either a single index or
* a list of indices: go to TclLindexList to determine which.
* If objc >= 4, or objc == 2, then objv[ 2 .. objc-2 ] are all
* single indices and processed as such in TclLindexFlat.
*/
if ( objc == 3 ) {
elemPtr = TclLindexList( interp, objv[ 1 ], objv[ 2 ] );
} else {
elemPtr = TclLindexFlat( interp, objv[ 1 ], objc-2, objv+2 );
}
/*
* Set the interpreter's object result to the last element extracted
*/
if ( elemPtr == NULL ) {
return TCL_ERROR;
} else {
Tcl_SetObjResult(interp, elemPtr);
Tcl_DecrRefCount( elemPtr );
return TCL_OK;
}
}
/*
*----------------------------------------------------------------------
*
* TclLindexList --
*
* This procedure handles the 'lindex' command when objc==3.
*
* Results:
* Returns a pointer to the object extracted, or NULL if an
* error occurred.
*
* Side effects:
* None.
*
* If objv[1] can be parsed as a list, TclLindexList handles extraction
* of the desired element locally. Otherwise, it invokes
* TclLindexFlat to treat objv[1] as a scalar.
*
* The reference count of the returned object includes one reference
* corresponding to the pointer returned. Thus, the calling code will
* usually do something like:
* Tcl_SetObjResult( interp, result );
* Tcl_DecrRefCount( result );
*
*----------------------------------------------------------------------
*/
Tcl_Obj *
TclLindexList( interp, listPtr, argPtr )
Tcl_Interp* interp; /* Tcl interpreter */
Tcl_Obj* listPtr; /* List being unpacked */
Tcl_Obj* argPtr; /* Index or index list */
{
Tcl_Obj **elemPtrs; /* Elements of the list being manipulated. */
int listLen; /* Length of the list being manipulated. */
int index; /* Index into the list */
int result; /* Result returned from a Tcl library call */
int i; /* Current index number */
Tcl_Obj** indices; /* Array of list indices */
int indexCount; /* Size of the array of list indices */
Tcl_Obj* oldListPtr; /* Temp location to preserve the list
* pointer when replacing it with a sublist */
/*
* Determine whether argPtr designates a list or a single index.
* We have to be careful about the order of the checks to avoid
* repeated shimmering; see TIP#22 and TIP#33 for the details.
*/
if ( argPtr->typePtr != &tclListType
&& TclGetIntForIndex( NULL , argPtr, 0, &index ) == TCL_OK ) {
/*
* argPtr designates a single index.
*/
return TclLindexFlat( interp, listPtr, 1, &argPtr );
} else if ( Tcl_ListObjGetElements( NULL, argPtr, &indexCount, &indices )
!= TCL_OK ) {
/*
* argPtr designates something that is neither an index nor a
* well-formed list. Report the error via TclLindexFlat.
*/
return TclLindexFlat( interp, listPtr, 1, &argPtr );
}
/*
* Record the reference to the list that we are maintaining in
* the activation record.
*/
Tcl_IncrRefCount( listPtr );
/*
* argPtr designates a list, and the 'else if' above has parsed it
* into indexCount and indices.
*/
for ( i = 0; i < indexCount; ++i ) {
/*
* Convert the current listPtr to a list if necessary.
*/
result = Tcl_ListObjGetElements( interp, listPtr,
&listLen, &elemPtrs);
if (result != TCL_OK) {
Tcl_DecrRefCount( listPtr );
return NULL;
}
/*
* Get the index from indices[ i ]
*/
result = TclGetIntForIndex( interp, indices[ i ],
/*endValue*/ (listLen - 1),
&index );
if ( result != TCL_OK ) {
/*
* Index could not be parsed
*/
Tcl_DecrRefCount( listPtr );
return NULL;
} else if ( index < 0
|| index >= listLen ) {
/*
* Index is out of range
*/
Tcl_DecrRefCount( listPtr );
listPtr = Tcl_NewObj();
Tcl_IncrRefCount( listPtr );
return listPtr;
}
/*
* Make sure listPtr still refers to a list object.
* If it shared a Tcl_Obj structure with the arguments, then
* it might have just been converted to something else.
*/
if (listPtr->typePtr != &tclListType) {
result = Tcl_ListObjGetElements(interp, listPtr, &listLen,
&elemPtrs);
if (result != TCL_OK) {
Tcl_DecrRefCount( listPtr );
return NULL;
}
}
/*
* Extract the pointer to the appropriate element
*/
oldListPtr = listPtr;
listPtr = elemPtrs[ index ];
Tcl_IncrRefCount( listPtr );
Tcl_DecrRefCount( oldListPtr );
/*
* The work we did above may have caused the internal rep
* of *argPtr to change to something else. Get it back.
*/
result = Tcl_ListObjGetElements( interp, argPtr,
&indexCount, &indices );
if ( result != TCL_OK ) {
/*
* This can't happen unless some extension corrupted a Tcl_Obj.
*/
Tcl_DecrRefCount( listPtr );
return NULL;
}
} /* end for */
/*
* Return the last object extracted. Its reference count will include
* the reference being returned.
*/
return listPtr;
}
/*
*----------------------------------------------------------------------
*
* TclLindexFlat --
*
* This procedure handles the 'lindex' command, given that the
* arguments to the command are known to be a flat list.
*
* Results:
* Returns a standard Tcl result.
*
* Side effects:
* None.
*
* This procedure is called from either tclExecute.c or
* Tcl_LindexObjCmd whenever either is presented with
* objc == 2 or objc >= 4. It is also called from TclLindexList
* for the objc==3 case once it is determined that objv[2] cannot
* be parsed as a list.
*
*----------------------------------------------------------------------
*/
Tcl_Obj *
TclLindexFlat( interp, listPtr, indexCount, indexArray )
Tcl_Interp* interp; /* Tcl interpreter */
Tcl_Obj* listPtr; /* Tcl object representing the list */
int indexCount; /* Count of indices */
Tcl_Obj* CONST indexArray[];
/* Array of pointers to Tcl objects
* representing the indices in the
* list */
{
int i; /* Current list index */
int result; /* Result of Tcl library calls */
int listLen; /* Length of the current list being
* processed */
Tcl_Obj** elemPtrs; /* Array of pointers to the elements
* of the current list */
int index; /* Parsed version of the current element
* of indexArray */
Tcl_Obj* oldListPtr; /* Temporary to hold listPtr so that
* its ref count can be decremented. */
/*
* Record the reference to the 'listPtr' object that we are
* maintaining in the C activation record.
*/
Tcl_IncrRefCount( listPtr );
for ( i = 0; i < indexCount; ++i ) {
/*
* Convert the current listPtr to a list if necessary.
*/
result = Tcl_ListObjGetElements(interp, listPtr,
&listLen, &elemPtrs);
if (result != TCL_OK) {
Tcl_DecrRefCount( listPtr );
return NULL;
}
/*
* Get the index from objv[i]
*/
result = TclGetIntForIndex( interp, indexArray[ i ],
/*endValue*/ (listLen - 1),
&index );
if ( result != TCL_OK ) {
/* Index could not be parsed */
Tcl_DecrRefCount( listPtr );
return NULL;
} else if ( index < 0
|| index >= listLen ) {
/*
* Index is out of range
*/
Tcl_DecrRefCount( listPtr );
listPtr = Tcl_NewObj();
Tcl_IncrRefCount( listPtr );
return listPtr;
}
/*
* Make sure listPtr still refers to a list object.
* It might have been converted to something else above
* if objv[1] overlaps with one of the other parameters.
*/
if (listPtr->typePtr != &tclListType) {
result = Tcl_ListObjGetElements(interp, listPtr, &listLen,
&elemPtrs);
if (result != TCL_OK) {
Tcl_DecrRefCount( listPtr );
return NULL;
}
}
/*
* Extract the pointer to the appropriate element
*/
oldListPtr = listPtr;
listPtr = elemPtrs[ index ];
Tcl_IncrRefCount( listPtr );
Tcl_DecrRefCount( oldListPtr );
}
return listPtr;
}
/*
*----------------------------------------------------------------------
*
* Tcl_LinsertObjCmd --
*
|
| ︙ | ︙ | |||
2465 2466 2467 2468 2469 2470 2471 |
Tcl_Obj *CONST objv[]; /* Argument values. */
{
char *bytes, *patternBytes;
int i, match, mode, index, result, listc, length, elemLen;
int dataType, isIncreasing, lower, upper, patInt, objInt;
double patDouble, objDouble;
Tcl_Obj *patObj, **listv;
| | | 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 |
Tcl_Obj *CONST objv[]; /* Argument values. */
{
char *bytes, *patternBytes;
int i, match, mode, index, result, listc, length, elemLen;
int dataType, isIncreasing, lower, upper, patInt, objInt;
double patDouble, objDouble;
Tcl_Obj *patObj, **listv;
static CONST char *options[] = {
"-ascii", "-decreasing", "-dictionary", "-exact", "-increasing",
"-integer", "-glob", "-real", "-regexp", "-sorted", NULL
};
enum options {
LSEARCH_ASCII, LSEARCH_DECREASING, LSEARCH_DICTIONARY, LSEARCH_EXACT,
LSEARCH_INCREASING, LSEARCH_INTEGER, LSEARCH_GLOB,
LSEARCH_REAL, LSEARCH_REGEXP, LSEARCH_SORTED
|
| ︙ | ︙ | |||
2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 |
Tcl_SetIntObj(Tcl_GetObjResult(interp), index);
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
* Tcl_LsortObjCmd --
*
* 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.
| > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 |
Tcl_SetIntObj(Tcl_GetObjResult(interp), index);
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
* Tcl_LsetObjCmd --
*
* This procedure is invoked to process the "lset" Tcl command.
* See the user documentation for details on what it does.
*
* Results:
* A standard Tcl result.
*
* Side effects:
* See the user documentation.
*
*----------------------------------------------------------------------
*/
int
Tcl_LsetObjCmd( clientData, interp, objc, objv )
ClientData clientData; /* Not used. */
Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument values. */
{
Tcl_Obj* listPtr; /* Pointer to the list being altered. */
Tcl_Obj* finalValuePtr; /* Value finally assigned to the variable */
/* Check parameter count */
if ( objc < 3 ) {
Tcl_WrongNumArgs( interp, 1, objv, "listVar index ?index...? value" );
return TCL_ERROR;
}
/* Look up the list variable's value */
listPtr = Tcl_ObjGetVar2( interp, objv[ 1 ], (Tcl_Obj*) NULL,
TCL_LEAVE_ERR_MSG );
if ( listPtr == NULL ) {
return TCL_ERROR;
}
/*
* Substitute the value in the value. Return either the value or
* else an unshared copy of it.
*/
if ( objc == 4 ) {
finalValuePtr = TclLsetList( interp, listPtr,
objv[ 2 ], objv[ 3 ] );
} else {
finalValuePtr = TclLsetFlat( interp, listPtr,
objc-3, objv+2, objv[ objc-1 ] );
}
/*
* If substitution has failed, bail out.
*/
if ( finalValuePtr == NULL ) {
return TCL_ERROR;
}
/* Finally, update the variable so that traces fire. */
listPtr = Tcl_ObjSetVar2( interp, objv[1], NULL, finalValuePtr,
TCL_LEAVE_ERR_MSG );
Tcl_DecrRefCount( finalValuePtr );
if ( listPtr == NULL ) {
return TCL_ERROR;
}
/* Return the new value of the variable as the interpreter result. */
Tcl_SetObjResult( interp, listPtr );
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
* Tcl_LsortObjCmd --
*
* 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.
|
| ︙ | ︙ | |||
2747 2748 2749 2750 2751 2752 2753 |
int length;
Tcl_Obj *cmdPtr, **listObjPtrs;
SortElement *elementArray;
SortElement *elementPtr;
SortInfo sortInfo; /* Information about this sort that
* needs to be passed to the
* comparison function */
| | | 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 |
int length;
Tcl_Obj *cmdPtr, **listObjPtrs;
SortElement *elementArray;
SortElement *elementPtr;
SortInfo sortInfo; /* Information about this sort that
* needs to be passed to the
* comparison function */
static CONST char *switches[] = {
"-ascii", "-command", "-decreasing", "-dictionary", "-increasing",
"-index", "-integer", "-real", "-unique", (char *) NULL
};
resultPtr = Tcl_GetObjResult(interp);
if (objc < 2) {
Tcl_WrongNumArgs(interp, 1, objv, "?options? list");
|
| ︙ | ︙ |
Changes to generic/tclCmdMZ.c.
| ︙ | ︙ | |||
9 10 11 12 13 14 15 | * Copyright (c) 1987-1993 The Regents of the University of California. * Copyright (c) 1994-1997 Sun Microsystems, Inc. * Copyright (c) 1998-2000 Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | < < | 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 34 35 36 |
* Copyright (c) 1987-1993 The Regents of the University of California.
* Copyright (c) 1994-1997 Sun Microsystems, Inc.
* Copyright (c) 1998-2000 Scriptics Corporation.
*
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
* RCS: @(#) $Id: tclCmdMZ.c,v 1.46.2.1 2002/02/05 02:21:58 wolfsuit Exp $
*/
#include "tclInt.h"
#include "tclPort.h"
#include "tclRegexp.h"
/*
* Structure used to hold information about variable traces:
*/
typedef struct {
int flags; /* Operations for which Tcl command is
* to be invoked. */
size_t length; /* Number of non-NULL chars. in command. */
char command[4]; /* Space for Tcl command to invoke. Actual
* size will be as large as necessary to
* hold command. This field must be the
* last in the structure, so that it can
* be larger than 4 bytes. */
} TraceVarInfo;
|
| ︙ | ︙ | |||
56 57 58 59 60 61 62 | /* * Each subcommand has a number of 'types' to which it can apply. * Currently 'command' and 'variable' are the only * types supported. These two arrays MUST be kept in sync! * In the future we may provide an API to add to the list of * supported trace types. */ | | | 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
/*
* Each subcommand has a number of 'types' to which it can apply.
* Currently 'command' and 'variable' are the only
* types supported. These two arrays MUST be kept in sync!
* In the future we may provide an API to add to the list of
* supported trace types.
*/
static CONST char *traceTypeOptions[] = {
"command", "variable", (char*) NULL
};
static Tcl_TraceTypeObjCmd* traceSubCmds[] = {
TclTraceCommandObjCmd,
TclTraceVariableObjCmd,
};
|
| ︙ | ︙ | |||
143 144 145 146 147 148 149 |
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
int i, indices, match, about, offset, all, doinline, numMatchesSaved;
int cflags, eflags, stringLength;
Tcl_RegExp regExpr;
Tcl_Obj *objPtr, *resultPtr;
Tcl_RegExpInfo info;
| | | 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 |
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
int i, indices, match, about, offset, all, doinline, numMatchesSaved;
int cflags, eflags, stringLength;
Tcl_RegExp regExpr;
Tcl_Obj *objPtr, *resultPtr;
Tcl_RegExpInfo info;
static CONST char *options[] = {
"-all", "-about", "-indices", "-inline",
"-expanded", "-line", "-linestop", "-lineanchor",
"-nocase", "-start", "--", (char *) NULL
};
enum options {
REGEXP_ALL, REGEXP_ABOUT, REGEXP_INDICES, REGEXP_INLINE,
REGEXP_EXPANDED,REGEXP_LINE, REGEXP_LINESTOP,REGEXP_LINEANCHOR,
|
| ︙ | ︙ | |||
246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 |
/*
* User requested -inline, but specified match variables - a no-no.
*/
Tcl_AppendResult(interp, "regexp match variables not allowed",
" when using -inline", (char *) NULL);
return TCL_ERROR;
}
/*
* Get the length of the string that we are matching against so
* we can do the termination test for -all matches. Do this before
* getting the regexp to avoid shimmering problems.
*/
objPtr = objv[1];
stringLength = Tcl_GetCharLength(objPtr);
regExpr = Tcl_GetRegExpFromObj(interp, objv[0], cflags);
if (regExpr == NULL) {
return TCL_ERROR;
}
| > > > > > > > > > > > < < < < < < < | 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 |
/*
* User requested -inline, but specified match variables - a no-no.
*/
Tcl_AppendResult(interp, "regexp match variables not allowed",
" when using -inline", (char *) NULL);
return TCL_ERROR;
}
/*
* Handle the odd about case separately.
*/
if (about) {
regExpr = Tcl_GetRegExpFromObj(interp, objv[0], cflags);
if ((regExpr == NULL) || (TclRegAbout(interp, regExpr) < 0)) {
return TCL_ERROR;
}
return TCL_OK;
}
/*
* Get the length of the string that we are matching against so
* we can do the termination test for -all matches. Do this before
* getting the regexp to avoid shimmering problems.
*/
objPtr = objv[1];
stringLength = Tcl_GetCharLength(objPtr);
regExpr = Tcl_GetRegExpFromObj(interp, objv[0], cflags);
if (regExpr == NULL) {
return TCL_ERROR;
}
if (offset > 0) {
/*
* Add flag if using offset (string is part of a larger string),
* so that "^" won't match.
*/
eflags |= TCL_REG_NOTBOL;
}
|
| ︙ | ︙ | |||
469 470 471 472 473 474 475 |
int idx, result, cflags, all, wlen, wsublen, numMatches, offset;
int start, end, subStart, subEnd, match;
Tcl_RegExp regExpr;
Tcl_RegExpInfo info;
Tcl_Obj *resultPtr, *subPtr, *objPtr;
Tcl_UniChar ch, *wsrc, *wfirstChar, *wstring, *wsubspec, *wend;
| | | 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 |
int idx, result, cflags, all, wlen, wsublen, numMatches, offset;
int start, end, subStart, subEnd, match;
Tcl_RegExp regExpr;
Tcl_RegExpInfo info;
Tcl_Obj *resultPtr, *subPtr, *objPtr;
Tcl_UniChar ch, *wsrc, *wfirstChar, *wstring, *wsubspec, *wend;
static CONST char *options[] = {
"-all", "-nocase", "-expanded",
"-line", "-linestop", "-lineanchor", "-start",
"--", NULL
};
enum options {
REGSUB_ALL, REGSUB_NOCASE, REGSUB_EXPANDED,
REGSUB_LINE, REGSUB_LINESTOP, REGSUB_LINEANCHOR, REGSUB_START,
|
| ︙ | ︙ | |||
1025 1026 1027 1028 1029 1030 1031 |
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
int index, left, right;
Tcl_Obj *resultPtr;
char *string1, *string2;
int length1, length2;
| | | 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 |
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
int index, left, right;
Tcl_Obj *resultPtr;
char *string1, *string2;
int length1, length2;
static CONST char *options[] = {
"bytelength", "compare", "equal", "first",
"index", "is", "last", "length",
"map", "match", "range", "repeat",
"replace", "tolower", "toupper", "totitle",
"trim", "trimleft", "trimright",
"wordend", "wordstart", (char *) NULL
};
|
| ︙ | ︙ | |||
1359 1360 1361 1362 1363 1364 1365 | * The UniChar comparison function */ int (*chcomp)_ANSI_ARGS_((int)) = NULL; int i, failat = 0, result = 1, strict = 0; Tcl_Obj *objPtr, *failVarObj = NULL; | | | 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 |
* The UniChar comparison function
*/
int (*chcomp)_ANSI_ARGS_((int)) = NULL;
int i, failat = 0, result = 1, strict = 0;
Tcl_Obj *objPtr, *failVarObj = NULL;
static CONST char *isOptions[] = {
"alnum", "alpha", "ascii", "control",
"boolean", "digit", "double", "false",
"graph", "integer", "lower", "print",
"punct", "space", "true", "upper",
"wordchar", "xdigit", (char *) NULL
};
enum isOptions {
|
| ︙ | ︙ | |||
2025 2026 2027 2028 2029 2030 2031 |
length1 = Tcl_UtfToUpper(Tcl_GetString(resultPtr));
} else {
length1 = Tcl_UtfToTitle(Tcl_GetString(resultPtr));
}
Tcl_SetObjLength(resultPtr, length1);
} else {
int first, last;
| | | 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 |
length1 = Tcl_UtfToUpper(Tcl_GetString(resultPtr));
} else {
length1 = Tcl_UtfToTitle(Tcl_GetString(resultPtr));
}
Tcl_SetObjLength(resultPtr, length1);
} else {
int first, last;
CONST char *start, *end;
length1 = Tcl_NumUtfChars(string1, length1) - 1;
if (TclGetIntForIndex(interp, objv[3], length1,
&first) != TCL_OK) {
return TCL_ERROR;
}
if (first < 0) {
|
| ︙ | ︙ | |||
2069 2070 2071 2072 2073 2074 2075 |
Tcl_AppendToObj(resultPtr, end, -1);
ckfree(string2);
}
break;
case STR_TRIM: {
Tcl_UniChar ch, trim;
| | | 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 |
Tcl_AppendToObj(resultPtr, end, -1);
ckfree(string2);
}
break;
case STR_TRIM: {
Tcl_UniChar ch, trim;
register CONST char *p, *end;
char *check, *checkEnd;
int offset;
left = 1;
right = 1;
dotrim:
|
| ︙ | ︙ | |||
2158 2159 2160 2161 2162 2163 2164 |
left = 0;
right = 1;
goto dotrim;
}
case STR_WORDEND: {
int cur;
Tcl_UniChar ch;
| | | 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 |
left = 0;
right = 1;
goto dotrim;
}
case STR_WORDEND: {
int cur;
Tcl_UniChar ch;
CONST char *p, *end;
int numChars;
if (objc != 4) {
Tcl_WrongNumArgs(interp, 2, objv, "string index");
return TCL_ERROR;
}
|
| ︙ | ︙ | |||
2196 2197 2198 2199 2200 2201 2202 |
}
Tcl_SetIntObj(resultPtr, cur);
break;
}
case STR_WORDSTART: {
int cur;
Tcl_UniChar ch;
| | | 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 |
}
Tcl_SetIntObj(resultPtr, cur);
break;
}
case STR_WORDSTART: {
int cur;
Tcl_UniChar ch;
CONST char *p;
int numChars;
if (objc != 4) {
Tcl_WrongNumArgs(interp, 2, objv, "string index");
return TCL_ERROR;
}
|
| ︙ | ︙ | |||
2260 2261 2262 2263 2264 2265 2266 |
int
Tcl_SubstObjCmd(dummy, interp, objc, objv)
ClientData dummy; /* Not used. */
Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
| | | 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 |
int
Tcl_SubstObjCmd(dummy, interp, objc, objv)
ClientData dummy; /* Not used. */
Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
static CONST char *substOptions[] = {
"-nobackslashes", "-nocommands", "-novariables", (char *) NULL
};
enum substOptions {
SUBST_NOBACKSLASHES, SUBST_NOCOMMANDS, SUBST_NOVARS
};
Tcl_Obj *resultPtr;
int optionIndex, flags, i;
|
| ︙ | ︙ | |||
2319 2320 2321 2322 2323 2324 2325 |
Tcl_SetObjResult(interp, resultPtr);
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
| | | | 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 |
Tcl_SetObjResult(interp, resultPtr);
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
* Tcl_SubstObj --
*
* This function performs the substitutions specified on the
* given string as described in the user documentation for the
* "subst" Tcl command. This code is heavily based on an
* implementation by Andrew Payne. Note that if a command
* substitution returns TCL_CONTINUE or TCL_RETURN from its
* evaluation and is not completely well-formed, the results are
* not defined.
*
|
| ︙ | ︙ | |||
2480 2481 2482 2483 2484 2485 2486 |
int
Tcl_SwitchObjCmd(dummy, interp, objc, objv)
ClientData dummy; /* Not used. */
Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
| | > | | 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 |
int
Tcl_SwitchObjCmd(dummy, interp, objc, objv)
ClientData dummy; /* Not used. */
Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
int i, j, index, mode, matched, result, splitObjs;
char *string, *pattern;
Tcl_Obj *stringObj;
Tcl_Obj *CONST *savedObjv = objv;
static CONST char *options[] = {
"-exact", "-glob", "-regexp", "--",
NULL
};
enum options {
OPT_EXACT, OPT_GLOB, OPT_REGEXP, OPT_LAST
};
|
| ︙ | ︙ | |||
2530 2531 2532 2533 2534 2535 2536 |
splitObjs = 0;
if (objc == 1) {
Tcl_Obj **listv;
if (Tcl_ListObjGetElements(interp, objv[0], &objc, &listv) != TCL_OK) {
return TCL_ERROR;
}
| < < | < < < < < < < < | < < > | | | < < | > > | > | > | | | > > > > > | > > > > > > > > > > | > | > > > > > > > > > > > > > > > > > > > | 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 |
splitObjs = 0;
if (objc == 1) {
Tcl_Obj **listv;
if (Tcl_ListObjGetElements(interp, objv[0], &objc, &listv) != TCL_OK) {
return TCL_ERROR;
}
/*
* Ensure that the list is non-empty.
*/
if (objc < 1) {
Tcl_WrongNumArgs(interp, 1, savedObjv,
"?switches? string {pattern body ... ?default body?}");
return TCL_ERROR;
}
objv = listv;
splitObjs = 1;
}
/*
* Complain if there is an odd number of words in the list of
* patterns and bodies.
*/
if (objc % 2) {
Tcl_ResetResult(interp);
Tcl_AppendResult(interp, "extra switch pattern with no body", NULL);
/*
* Check if this can be due to a badly placed comment
* in the switch block.
*
* The following is an heuristic to detect the infamous
* "comment in switch" error: just check if a pattern
* begins with '#'.
*/
if (splitObjs) {
for (i=0 ; i<objc ; i+=2) {
if (Tcl_GetString(objv[i])[0] == '#') {
Tcl_AppendResult(interp, ", this may be due to a ",
"comment incorrectly placed outside of a ",
"switch body - see the \"switch\" ",
"documentation", NULL);
break;
}
}
}
return TCL_ERROR;
}
/*
* Complain if the last body is a continuation. Note that this
* check assumes that the list is non-empty!
*/
if (strcmp(Tcl_GetString(objv[objc-1]), "-") == 0) {
Tcl_ResetResult(interp);
Tcl_AppendResult(interp, "no body specified for pattern \"",
Tcl_GetString(objv[objc-2]), "\"", NULL);
return TCL_ERROR;
}
for (i = 0; i < objc; i += 2) {
/*
* See if the pattern matches the string.
*/
pattern = Tcl_GetString(objv[i]);
matched = 0;
if ((i == objc - 2)
&& (*pattern == 'd')
&& (strcmp(pattern, "default") == 0)) {
matched = 1;
} else {
switch (mode) {
|
| ︙ | ︙ | |||
2603 2604 2605 2606 2607 2608 2609 |
/*
* We've got a match. Find a body to execute, skipping bodies
* that are "-".
*/
for (j = i + 1; ; j += 2) {
if (j >= objc) {
| < > > | < < > > | 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 |
/*
* We've got a match. Find a body to execute, skipping bodies
* that are "-".
*/
for (j = i + 1; ; j += 2) {
if (j >= objc) {
/*
* This shouldn't happen since we've checked that the
* last body is not a continuation...
*/
panic("fall-out when searching for body to match pattern");
}
if (strcmp(Tcl_GetString(objv[j]), "-") != 0) {
break;
}
}
result = Tcl_EvalObjEx(interp, objv[j], 0);
if (result == TCL_ERROR) {
|
| ︙ | ︙ | |||
2671 2672 2673 2674 2675 2676 2677 |
} else {
Tcl_WrongNumArgs(interp, 1, objv, "command ?count?");
return TCL_ERROR;
}
objPtr = objv[1];
i = count;
| | | | | | 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 |
} else {
Tcl_WrongNumArgs(interp, 1, objv, "command ?count?");
return TCL_ERROR;
}
objPtr = objv[1];
i = count;
Tcl_GetTime(&start);
while (i-- > 0) {
result = Tcl_EvalObjEx(interp, objPtr, 0);
if (result != TCL_OK) {
return result;
}
}
Tcl_GetTime(&stop);
totalMicroSec = ( ( (double) ( stop.sec - start.sec ) ) * 1.0e6
+ ( stop.usec - start.usec ) );
sprintf(buf, "%.0f microseconds per iteration",
((count <= 0) ? 0 : totalMicroSec/count));
Tcl_ResetResult(interp);
Tcl_AppendToObj(Tcl_GetObjResult(interp), buf, -1);
return TCL_OK;
}
|
| ︙ | ︙ | |||
2722 2723 2724 2725 2726 2727 2728 |
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
int optionIndex, commandLength;
char *name, *flagOps, *command, *p;
size_t length;
/* Main sub commands to 'trace' */
| | | 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 |
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
int optionIndex, commandLength;
char *name, *flagOps, *command, *p;
size_t length;
/* Main sub commands to 'trace' */
static CONST char *traceOptions[] = {
"add", "list", "remove",
#ifndef TCL_REMOVE_OBSOLETE_TRACES
"variable", "vdelete", "vinfo",
#endif
(char *) NULL
};
/* 'OLD' options are pre-Tcl-8.4 style */
|
| ︙ | ︙ | |||
2802 2803 2804 2805 2806 2807 2808 | command = Tcl_GetStringFromObj(objv[4], &commandLength); length = (size_t) commandLength; tvarPtr = (TraceVarInfo *) ckalloc((unsigned) (sizeof(TraceVarInfo) - sizeof(tvarPtr->command) + length + 1)); tvarPtr->flags = flags; | < | | 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 |
command = Tcl_GetStringFromObj(objv[4], &commandLength);
length = (size_t) commandLength;
tvarPtr = (TraceVarInfo *) ckalloc((unsigned)
(sizeof(TraceVarInfo) - sizeof(tvarPtr->command)
+ length + 1));
tvarPtr->flags = flags;
tvarPtr->length = length;
flags |= TCL_TRACE_UNSETS | TCL_TRACE_RESULT_OBJECT;
strcpy(tvarPtr->command, command);
name = Tcl_GetString(objv[2]);
if (Tcl_TraceVar(interp, name, flags, TraceVarProc,
(ClientData) tvarPtr) != TCL_OK) {
ckfree((char *) tvarPtr);
return TCL_ERROR;
}
|
| ︙ | ︙ | |||
2860 2861 2862 2863 2864 2865 2866 |
name = Tcl_GetString(objv[2]);
while ((clientData = Tcl_VarTraceInfo(interp, name, 0,
TraceVarProc, clientData)) != 0) {
tvarPtr = (TraceVarInfo *) clientData;
if ((tvarPtr->length == length) && (tvarPtr->flags == flags)
&& (strncmp(command, tvarPtr->command,
(size_t) length) == 0)) {
| | > < < < | 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 |
name = Tcl_GetString(objv[2]);
while ((clientData = Tcl_VarTraceInfo(interp, name, 0,
TraceVarProc, clientData)) != 0) {
tvarPtr = (TraceVarInfo *) clientData;
if ((tvarPtr->length == length) && (tvarPtr->flags == flags)
&& (strncmp(command, tvarPtr->command,
(size_t) length) == 0)) {
Tcl_UntraceVar(interp, name,
flags | TCL_TRACE_UNSETS | TCL_TRACE_RESULT_OBJECT,
TraceVarProc, clientData);
ckfree((char *) tvarPtr);
break;
}
}
break;
}
case TRACE_OLD_VINFO: {
|
| ︙ | ︙ | |||
2965 2966 2967 2968 2969 2970 2971 |
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
int commandLength, index;
char *name, *command;
size_t length;
enum traceOptions { TRACE_ADD, TRACE_LIST, TRACE_REMOVE };
| | | 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 |
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
int commandLength, index;
char *name, *command;
size_t length;
enum traceOptions { TRACE_ADD, TRACE_LIST, TRACE_REMOVE };
static CONST char *opStrings[] = { "delete", "rename", (char *) NULL };
enum operations { TRACE_CMD_DELETE, TRACE_CMD_RENAME };
switch ((enum traceOptions) optionIndex) {
case TRACE_ADD:
case TRACE_REMOVE: {
int flags = 0;
int i, listLen, result;
|
| ︙ | ︙ | |||
3015 3016 3017 3018 3019 3020 3021 |
length = (size_t) commandLength;
if ((enum traceOptions) optionIndex == TRACE_ADD) {
TraceCommandInfo *tcmdPtr;
tcmdPtr = (TraceCommandInfo *) ckalloc((unsigned)
(sizeof(TraceCommandInfo) - sizeof(tcmdPtr->command)
+ length + 1));
tcmdPtr->flags = flags;
| < | 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 |
length = (size_t) commandLength;
if ((enum traceOptions) optionIndex == TRACE_ADD) {
TraceCommandInfo *tcmdPtr;
tcmdPtr = (TraceCommandInfo *) ckalloc((unsigned)
(sizeof(TraceCommandInfo) - sizeof(tcmdPtr->command)
+ length + 1));
tcmdPtr->flags = flags;
tcmdPtr->length = length;
flags |= TCL_TRACE_DELETE;
strcpy(tcmdPtr->command, command);
name = Tcl_GetString(objv[3]);
if (Tcl_TraceCommand(interp, name, flags, TraceCommandProc,
(ClientData) tcmdPtr) != TCL_OK) {
ckfree((char *) tcmdPtr);
|
| ︙ | ︙ | |||
3046 3047 3048 3049 3050 3051 3052 |
if ((tcmdPtr->length == length)
&& (tcmdPtr->flags == flags)
&& (strncmp(command, tcmdPtr->command,
(size_t) length) == 0)) {
Tcl_UntraceCommand(interp, name,
flags | TCL_TRACE_DELETE,
TraceCommandProc, clientData);
| < < < | 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 |
if ((tcmdPtr->length == length)
&& (tcmdPtr->flags == flags)
&& (strncmp(command, tcmdPtr->command,
(size_t) length) == 0)) {
Tcl_UntraceCommand(interp, name,
flags | TCL_TRACE_DELETE,
TraceCommandProc, clientData);
ckfree((char *) tcmdPtr);
break;
}
}
}
break;
}
|
| ︙ | ︙ | |||
3135 3136 3137 3138 3139 3140 3141 |
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
int commandLength, index;
char *name, *command;
size_t length;
enum traceOptions { TRACE_ADD, TRACE_LIST, TRACE_REMOVE };
| | | 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 |
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
int commandLength, index;
char *name, *command;
size_t length;
enum traceOptions { TRACE_ADD, TRACE_LIST, TRACE_REMOVE };
static CONST char *opStrings[] = { "array", "read", "unset", "write",
(char *) NULL };
enum operations { TRACE_VAR_ARRAY, TRACE_VAR_READ, TRACE_VAR_UNSET,
TRACE_VAR_WRITE };
switch ((enum traceOptions) optionIndex) {
case TRACE_ADD:
case TRACE_REMOVE: {
|
| ︙ | ︙ | |||
3194 3195 3196 3197 3198 3199 3200 |
length = (size_t) commandLength;
if ((enum traceOptions) optionIndex == TRACE_ADD) {
TraceVarInfo *tvarPtr;
tvarPtr = (TraceVarInfo *) ckalloc((unsigned)
(sizeof(TraceVarInfo) - sizeof(tvarPtr->command)
+ length + 1));
tvarPtr->flags = flags;
| < | | 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 |
length = (size_t) commandLength;
if ((enum traceOptions) optionIndex == TRACE_ADD) {
TraceVarInfo *tvarPtr;
tvarPtr = (TraceVarInfo *) ckalloc((unsigned)
(sizeof(TraceVarInfo) - sizeof(tvarPtr->command)
+ length + 1));
tvarPtr->flags = flags;
tvarPtr->length = length;
flags |= TCL_TRACE_UNSETS | TCL_TRACE_RESULT_OBJECT;
strcpy(tvarPtr->command, command);
name = Tcl_GetString(objv[3]);
if (Tcl_TraceVar(interp, name, flags, TraceVarProc,
(ClientData) tvarPtr) != TCL_OK) {
ckfree((char *) tvarPtr);
return TCL_ERROR;
}
|
| ︙ | ︙ | |||
3221 3222 3223 3224 3225 3226 3227 |
while ((clientData = Tcl_VarTraceInfo(interp, name, 0,
TraceVarProc, clientData)) != 0) {
tvarPtr = (TraceVarInfo *) clientData;
if ((tvarPtr->length == length)
&& (tvarPtr->flags == flags)
&& (strncmp(command, tvarPtr->command,
(size_t) length) == 0)) {
| | > < < < | 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 |
while ((clientData = Tcl_VarTraceInfo(interp, name, 0,
TraceVarProc, clientData)) != 0) {
tvarPtr = (TraceVarInfo *) clientData;
if ((tvarPtr->length == length)
&& (tvarPtr->flags == flags)
&& (strncmp(command, tvarPtr->command,
(size_t) length) == 0)) {
Tcl_UntraceVar(interp, name,
flags | TCL_TRACE_UNSETS | TCL_TRACE_RESULT_OBJECT,
TraceVarProc, clientData);
ckfree((char *) tvarPtr);
break;
}
}
}
break;
}
|
| ︙ | ︙ | |||
3318 3319 3320 3321 3322 3323 3324 |
*
*----------------------------------------------------------------------
*/
ClientData
Tcl_CommandTraceInfo(interp, cmdName, flags, proc, prevClientData)
Tcl_Interp *interp; /* Interpreter containing command. */
| | | 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 |
*
*----------------------------------------------------------------------
*/
ClientData
Tcl_CommandTraceInfo(interp, cmdName, flags, proc, prevClientData)
Tcl_Interp *interp; /* Interpreter containing command. */
CONST char *cmdName; /* Name of command. */
int flags; /* OR-ed combo or TCL_GLOBAL_ONLY,
* TCL_NAMESPACE_ONLY (can be 0). */
Tcl_CommandTraceProc *proc; /* Procedure assocated with trace. */
ClientData prevClientData; /* If non-NULL, gives last value returned
* by this procedure, so this call will
* return the next trace after that one.
* If NULL, this call will return the
|
| ︙ | ︙ | |||
3383 3384 3385 3386 3387 3388 3389 |
*----------------------------------------------------------------------
*/
int
Tcl_TraceCommand(interp, cmdName, flags, proc, clientData)
Tcl_Interp *interp; /* Interpreter in which command is
* to be traced. */
| | | 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 |
*----------------------------------------------------------------------
*/
int
Tcl_TraceCommand(interp, cmdName, flags, proc, clientData)
Tcl_Interp *interp; /* Interpreter in which command is
* to be traced. */
CONST char *cmdName; /* Name of command. */
int flags; /* OR-ed collection of bits, including any
* of TCL_TRACE_RENAME, TCL_TRACE_DELETE. */
Tcl_CommandTraceProc *proc; /* Procedure to call when specified ops are
* invoked upon varName. */
ClientData clientData; /* Arbitrary argument to pass to proc. */
{
Command *cmdPtr;
|
| ︙ | ︙ | |||
3433 3434 3435 3436 3437 3438 3439 |
*
*----------------------------------------------------------------------
*/
void
Tcl_UntraceCommand(interp, cmdName, flags, proc, clientData)
Tcl_Interp *interp; /* Interpreter containing command. */
| | | 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 |
*
*----------------------------------------------------------------------
*/
void
Tcl_UntraceCommand(interp, cmdName, flags, proc, clientData)
Tcl_Interp *interp; /* Interpreter containing command. */
CONST char *cmdName; /* Name of command. */
int flags; /* OR-ed collection of bits, including any
* of TCL_TRACE_RENAME, TCL_TRACE_DELETE. */
Tcl_CommandTraceProc *proc; /* Procedure assocated with trace. */
ClientData clientData; /* Arbitrary argument to pass to proc. */
{
register CommandTrace *tracePtr;
CommandTrace *prevPtr;
|
| ︙ | ︙ | |||
3480 3481 3482 3483 3484 3485 3486 |
}
}
if (prevPtr == NULL) {
cmdPtr->tracePtr = tracePtr->nextPtr;
} else {
prevPtr->nextPtr = tracePtr->nextPtr;
}
| | | 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 |
}
}
if (prevPtr == NULL) {
cmdPtr->tracePtr = tracePtr->nextPtr;
} else {
prevPtr->nextPtr = tracePtr->nextPtr;
}
Tcl_EventuallyFree((ClientData) tracePtr, TCL_DYNAMIC);
}
/*
*----------------------------------------------------------------------
*
* TraceCommandProc --
*
|
| ︙ | ︙ | |||
3517 3518 3519 3520 3521 3522 3523 |
* information. */
{
Tcl_SavedResult state;
TraceCommandInfo *tcmdPtr = (TraceCommandInfo *) clientData;
int code;
Tcl_DString cmd;
| < < < < | 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 |
* information. */
{
Tcl_SavedResult state;
TraceCommandInfo *tcmdPtr = (TraceCommandInfo *) clientData;
int code;
Tcl_DString cmd;
if ((tcmdPtr->flags & flags) && !(flags & TCL_INTERP_DESTROYED)) {
/*
* Generate a command to execute by appending list elements
* for the old and new command name and the operation.
*/
if (newName == NULL) {
|
| ︙ | ︙ | |||
3557 3558 3559 3560 3561 3562 3563 |
}
Tcl_RestoreResult(interp, &state);
Tcl_DStringFree(&cmd);
}
if (flags & TCL_TRACE_DESTROYED) {
| < < < | 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 |
}
Tcl_RestoreResult(interp, &state);
Tcl_DStringFree(&cmd);
}
if (flags & TCL_TRACE_DESTROYED) {
ckfree((char *) tcmdPtr);
}
return;
}
/*
*----------------------------------------------------------------------
|
| ︙ | ︙ | |||
3601 3602 3603 3604 3605 3606 3607 |
Tcl_SavedResult state;
TraceVarInfo *tvarPtr = (TraceVarInfo *) clientData;
char *result;
int code;
Tcl_DString cmd;
result = NULL;
| < < < < | 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 |
Tcl_SavedResult state;
TraceVarInfo *tvarPtr = (TraceVarInfo *) clientData;
char *result;
int code;
Tcl_DString cmd;
result = NULL;
if ((tvarPtr->flags & flags) && !(flags & TCL_INTERP_DESTROYED)) {
if (tvarPtr->length != (size_t) 0) {
/*
* Generate a command to execute by appending list elements
* for the two variable names and the operation.
*/
|
| ︙ | ︙ | |||
3654 3655 3656 3657 3658 3659 3660 |
* the command. We discard any object result the command returns.
*/
Tcl_SaveResult(interp, &state);
code = Tcl_Eval(interp, Tcl_DStringValue(&cmd));
if (code != TCL_OK) { /* copy error msg to result */
| < < | < < | | > > > > | < < | 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 |
* the command. We discard any object result the command returns.
*/
Tcl_SaveResult(interp, &state);
code = Tcl_Eval(interp, Tcl_DStringValue(&cmd));
if (code != TCL_OK) { /* copy error msg to result */
register Tcl_Obj *errMsgObj = Tcl_GetObjResult(interp);
Tcl_IncrRefCount(errMsgObj);
result = (char *) errMsgObj;
}
Tcl_RestoreResult(interp, &state);
Tcl_DStringFree(&cmd);
}
}
if (flags & TCL_TRACE_DESTROYED) {
if (result != NULL) {
register Tcl_Obj *errMsgObj = (Tcl_Obj *) result;
Tcl_DecrRefCount(errMsgObj);
result = NULL;
}
ckfree((char *) tvarPtr);
}
return result;
}
/*
|
| ︙ | ︙ |
Changes to generic/tclCompCmds.c.
1 2 3 4 5 6 7 8 9 10 11 |
/*
* tclCompCmds.c --
*
* This file contains compilation procedures that compile various
* Tcl commands into a sequence of instructions ("bytecodes").
*
* Copyright (c) 1997-1998 Sun Microsystems, Inc.
*
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
| > | | < | 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 34 |
/*
* tclCompCmds.c --
*
* This file contains compilation procedures that compile various
* Tcl commands into a sequence of instructions ("bytecodes").
*
* Copyright (c) 1997-1998 Sun Microsystems, Inc.
* Copyright (c) 2001 by Kevin B. Kenny. All rights reserved.
*
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
* RCS: @(#) $Id: tclCompCmds.c,v 1.14.4.1 2002/02/05 02:21:58 wolfsuit Exp $
*/
#include "tclInt.h"
#include "tclCompile.h"
/*
* Prototypes for procedures defined later in this file:
*/
static ClientData DupForeachInfo _ANSI_ARGS_((ClientData clientData));
static void FreeForeachInfo _ANSI_ARGS_((ClientData clientData));
static int TclPushVarName _ANSI_ARGS_((Tcl_Interp *interp,
Tcl_Token *varTokenPtr, CompileEnv *envPtr, int flags,
int *localIndexPtr, int *simpleVarNamePtr, int *isScalarPtr));
/*
* Flags bits used by TclPushVarName.
*/
#define TCL_CREATE_VAR 1 /* Create a compiled local if none is found */
#define TCL_NO_LARGE_INDEX 2 /* Do not return localIndex value > 255 */
|
| ︙ | ︙ | |||
55 56 57 58 59 60 61 | * unless there was an error while parsing string. If an error occurs * then the interpreter's result contains a standard error message. If * complation fails because the command requires a second level of * substitutions, TCL_OUT_LINE_COMPILE is returned indicating that the * command should be compiled "out of line" by emitting code to * invoke its command procedure (Tcl_AppendObjCmd) at runtime. * | < < < < < | 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
* unless there was an error while parsing string. If an error occurs
* then the interpreter's result contains a standard error message. If
* complation fails because the command requires a second level of
* substitutions, TCL_OUT_LINE_COMPILE is returned indicating that the
* command should be compiled "out of line" by emitting code to
* invoke its command procedure (Tcl_AppendObjCmd) at runtime.
*
* Side effects:
* Instructions are added to envPtr to execute the "append" command
* at runtime.
*
*----------------------------------------------------------------------
*/
int
TclCompileAppendCmd(interp, parsePtr, envPtr)
Tcl_Interp *interp; /* Used for error reporting. */
Tcl_Parse *parsePtr; /* Points to a parse structure for the
* command created by Tcl_ParseCommand. */
CompileEnv *envPtr; /* Holds resulting instructions. */
{
Tcl_Token *varTokenPtr, *valueTokenPtr;
int simpleVarName, isScalar, localIndex, numWords;
int code = TCL_OK;
numWords = parsePtr->numWords;
if (numWords == 1) {
Tcl_ResetResult(interp);
Tcl_AppendToObj(Tcl_GetObjResult(interp),
"wrong # args: should be \"append varName ?value value ...?\"",
-1);
return TCL_ERROR;
|
| ︙ | ︙ | |||
108 109 110 111 112 113 114 |
* procedure body and if the name is simple text that does not include
* namespace qualifiers.
*/
varTokenPtr = parsePtr->tokenPtr
+ (parsePtr->tokenPtr->numComponents + 1);
| | < | < < | 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 |
* procedure body and if the name is simple text that does not include
* namespace qualifiers.
*/
varTokenPtr = parsePtr->tokenPtr
+ (parsePtr->tokenPtr->numComponents + 1);
code = TclPushVarName(interp, varTokenPtr, envPtr, TCL_CREATE_VAR,
&localIndex, &simpleVarName, &isScalar);
if (code != TCL_OK) {
goto done;
}
/*
* We are doing an assignment, otherwise TclCompileSetCmd was called,
* so push the new value. This will need to be extended to push a
* value for each argument.
*/
if (numWords > 2) {
valueTokenPtr = varTokenPtr + (varTokenPtr->numComponents + 1);
if (valueTokenPtr->type == TCL_TOKEN_SIMPLE_WORD) {
TclEmitPush(TclRegisterLiteral(envPtr, valueTokenPtr[1].start,
valueTokenPtr[1].size, /*onHeap*/ 0), envPtr);
} else {
code = TclCompileTokens(interp, valueTokenPtr+1,
valueTokenPtr->numComponents, envPtr);
if (code != TCL_OK) {
goto done;
}
}
}
/*
* Emit instructions to set/get the variable.
*/
|
| ︙ | ︙ | |||
168 169 170 171 172 173 174 |
}
}
} else {
TclEmitOpcode(INST_APPEND_STK, envPtr);
}
done:
| < < < < < < < < < | > < | 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 |
}
}
} else {
TclEmitOpcode(INST_APPEND_STK, envPtr);
}
done:
return code;
}
/*
*----------------------------------------------------------------------
*
* TclCompileBreakCmd --
*
* Procedure called to compile the "break" command.
*
* Results:
* The return value is a standard Tcl result, which is TCL_OK unless
* there was an error during compilation. If an error occurs then
* the interpreter's result contains a standard error message.
*
* Side effects:
* Instructions are added to envPtr to execute the "break" command
* at runtime.
*
*----------------------------------------------------------------------
*/
int
TclCompileBreakCmd(interp, parsePtr, envPtr)
Tcl_Interp *interp; /* Used for error reporting. */
Tcl_Parse *parsePtr; /* Points to a parse structure for the
* command created by Tcl_ParseCommand. */
CompileEnv *envPtr; /* Holds resulting instructions. */
{
if (parsePtr->numWords != 1) {
Tcl_ResetResult(interp);
Tcl_AppendToObj(Tcl_GetObjResult(interp),
"wrong # args: should be \"break\"", -1);
return TCL_ERROR;
}
/*
* Emit a break instruction.
*/
TclEmitOpcode(INST_BREAK, envPtr);
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
* TclCompileCatchCmd --
*
* Procedure called to compile the "catch" command.
*
* Results:
* The return value is a standard Tcl result, which is TCL_OK if
* compilation was successful. If an error occurs then the
* interpreter's result contains a standard error message and TCL_ERROR
* is returned. If the command is too complex for TclCompileCatchCmd,
* TCL_OUT_LINE_COMPILE is returned indicating that the catch command
* should be compiled "out of line" by emitting code to invoke its
* command procedure at runtime.
*
* Side effects:
* Instructions are added to envPtr to execute the "catch" command
* at runtime.
*
*----------------------------------------------------------------------
*/
int
TclCompileCatchCmd(interp, parsePtr, envPtr)
Tcl_Interp *interp; /* Used for error reporting. */
Tcl_Parse *parsePtr; /* Points to a parse structure for the
* command created by Tcl_ParseCommand. */
CompileEnv *envPtr; /* Holds resulting instructions. */
{
JumpFixup jumpFixup;
Tcl_Token *cmdTokenPtr, *nameTokenPtr;
char *name;
int localIndex, nameChars, range, startOffset, jumpDist;
int code;
char buffer[32 + TCL_INTEGER_SPACE];
int savedStackDepth = envPtr->currStackDepth;
if ((parsePtr->numWords != 2) && (parsePtr->numWords != 3)) {
Tcl_ResetResult(interp);
Tcl_AppendToObj(Tcl_GetObjResult(interp),
"wrong # args: should be \"catch command ?varName?\"", -1);
return TCL_ERROR;
}
|
| ︙ | ︙ | |||
304 305 306 307 308 309 310 |
}
}
/*
* We will compile the catch command. Emit a beginCatch instruction at
* the start of the catch body: the subcommand it controls.
*/
| < < | 287 288 289 290 291 292 293 294 295 296 297 298 299 300 |
}
}
/*
* We will compile the catch command. Emit a beginCatch instruction at
* the start of the catch body: the subcommand it controls.
*/
envPtr->exceptDepth++;
envPtr->maxExceptDepth =
TclMax(envPtr->exceptDepth, envPtr->maxExceptDepth);
range = TclCreateExceptRange(CATCH_EXCEPTION_RANGE, envPtr);
TclEmitInstInt4(INST_BEGIN_CATCH4, range, envPtr);
|
| ︙ | ︙ | |||
342 343 344 345 346 347 348 |
if (code == TCL_ERROR) {
sprintf(buffer, "\n (\"catch\" body line %d)",
interp->errorLine);
Tcl_AddObjErrorInfo(interp, buffer, -1);
}
goto done;
}
| < < < < > > > < < < < | 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 |
if (code == TCL_ERROR) {
sprintf(buffer, "\n (\"catch\" body line %d)",
interp->errorLine);
Tcl_AddObjErrorInfo(interp, buffer, -1);
}
goto done;
}
envPtr->exceptArrayPtr[range].numCodeBytes =
(envPtr->codeNext - envPtr->codeStart) - startOffset;
/*
* The "no errors" epilogue code: store the body's result into the
* variable (if any), push "0" (TCL_OK) as the catch's "no error"
* result, and jump around the "error case" code.
*/
if (localIndex != -1) {
if (localIndex <= 255) {
TclEmitInstInt1(INST_STORE_SCALAR1, localIndex, envPtr);
} else {
TclEmitInstInt4(INST_STORE_SCALAR4, localIndex, envPtr);
}
}
TclEmitOpcode(INST_POP, envPtr);
TclEmitPush(TclRegisterLiteral(envPtr, "0", 1, /*onHeap*/ 0),
envPtr);
TclEmitForwardJump(envPtr, TCL_UNCONDITIONAL_JUMP, &jumpFixup);
/*
* The "error case" code: store the body's result into the variable (if
* any), then push the error result code. The initial PC offset here is
* the catch's error target.
*/
envPtr->currStackDepth = savedStackDepth;
envPtr->exceptArrayPtr[range].catchOffset =
(envPtr->codeNext - envPtr->codeStart);
if (localIndex != -1) {
TclEmitOpcode(INST_PUSH_RESULT, envPtr);
if (localIndex <= 255) {
TclEmitInstInt1(INST_STORE_SCALAR1, localIndex, envPtr);
} else {
TclEmitInstInt4(INST_STORE_SCALAR4, localIndex, envPtr);
}
TclEmitOpcode(INST_POP, envPtr);
}
TclEmitOpcode(INST_PUSH_RETURN_CODE, envPtr);
/*
* Update the target of the jump after the "no errors" code, then emit
* an endCatch instruction at the end of the catch command.
*/
jumpDist = (envPtr->codeNext - envPtr->codeStart)
- jumpFixup.codeOffset;
if (TclFixupForwardJump(envPtr, &jumpFixup, jumpDist, 127)) {
panic("TclCompileCatchCmd: bad jump distance %d\n", jumpDist);
}
TclEmitOpcode(INST_END_CATCH, envPtr);
done:
envPtr->currStackDepth = savedStackDepth + 1;
envPtr->exceptDepth--;
return code;
}
/*
*----------------------------------------------------------------------
*
* TclCompileContinueCmd --
*
* Procedure called to compile the "continue" command.
*
* Results:
* The return value is a standard Tcl result, which is TCL_OK unless
* there was an error while parsing string. If an error occurs then
* the interpreter's result contains a standard error message.
*
* Side effects:
* Instructions are added to envPtr to execute the "continue" command
* at runtime.
*
*----------------------------------------------------------------------
*/
|
| ︙ | ︙ | |||
441 442 443 444 445 446 447 |
* There should be no argument after the "continue".
*/
if (parsePtr->numWords != 1) {
Tcl_ResetResult(interp);
Tcl_AppendToObj(Tcl_GetObjResult(interp),
"wrong # args: should be \"continue\"", -1);
| < < < < < < | 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 |
* There should be no argument after the "continue".
*/
if (parsePtr->numWords != 1) {
Tcl_ResetResult(interp);
Tcl_AppendToObj(Tcl_GetObjResult(interp),
"wrong # args: should be \"continue\"", -1);
return TCL_ERROR;
}
/*
* Emit a continue instruction.
*/
TclEmitOpcode(INST_CONTINUE, envPtr);
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
* TclCompileExprCmd --
*
* Procedure called to compile the "expr" command.
*
* Results:
* The return value is a standard Tcl result, which is TCL_OK
* unless there was an error while parsing string. If an error occurs
* then the interpreter's result contains a standard error message.
*
* Side effects:
* Instructions are added to envPtr to execute the "expr" command
* at runtime.
*
*----------------------------------------------------------------------
*/
int
TclCompileExprCmd(interp, parsePtr, envPtr)
Tcl_Interp *interp; /* Used for error reporting. */
Tcl_Parse *parsePtr; /* Points to a parse structure for the
* command created by Tcl_ParseCommand. */
CompileEnv *envPtr; /* Holds resulting instructions. */
{
Tcl_Token *firstWordPtr;
if (parsePtr->numWords == 1) {
Tcl_ResetResult(interp);
Tcl_AppendToObj(Tcl_GetObjResult(interp),
"wrong # args: should be \"expr arg ?arg ...?\"", -1);
return TCL_ERROR;
}
|
| ︙ | ︙ | |||
511 512 513 514 515 516 517 | * Procedure called to compile the "for" command. * * Results: * The return value is a standard Tcl result, which is TCL_OK unless * there was an error while parsing string. If an error occurs then * the interpreter's result contains a standard error message. * | < < < | > < | 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 |
* Procedure called to compile the "for" command.
*
* Results:
* The return value is a standard Tcl result, which is TCL_OK unless
* there was an error while parsing string. If an error occurs then
* the interpreter's result contains a standard error message.
*
* Side effects:
* Instructions are added to envPtr to execute the "for" command
* at runtime.
*
*----------------------------------------------------------------------
*/
int
TclCompileForCmd(interp, parsePtr, envPtr)
Tcl_Interp *interp; /* Used for error reporting. */
Tcl_Parse *parsePtr; /* Points to a parse structure for the
* command created by Tcl_ParseCommand. */
CompileEnv *envPtr; /* Holds resulting instructions. */
{
Tcl_Token *startTokenPtr, *testTokenPtr, *nextTokenPtr, *bodyTokenPtr;
JumpFixup jumpFalseFixup;
int jumpBackDist, jumpBackOffset, testCodeOffset, jumpDist;
int bodyRange, nextRange, code;
unsigned char *jumpPc;
char buffer[32 + TCL_INTEGER_SPACE];
int savedStackDepth = envPtr->currStackDepth;
if (parsePtr->numWords != 5) {
Tcl_ResetResult(interp);
Tcl_AppendToObj(Tcl_GetObjResult(interp),
"wrong # args: should be \"for start test next command\"", -1);
return TCL_ERROR;
}
|
| ︙ | ︙ | |||
584 585 586 587 588 589 590 |
bodyRange = TclCreateExceptRange(LOOP_EXCEPTION_RANGE, envPtr);
nextRange = TclCreateExceptRange(LOOP_EXCEPTION_RANGE, envPtr);
/*
* Inline compile the initial command.
*/
| < < > > < > < > > < > | 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 |
bodyRange = TclCreateExceptRange(LOOP_EXCEPTION_RANGE, envPtr);
nextRange = TclCreateExceptRange(LOOP_EXCEPTION_RANGE, envPtr);
/*
* Inline compile the initial command.
*/
code = TclCompileCmdWord(interp, startTokenPtr+1,
startTokenPtr->numComponents, envPtr);
if (code != TCL_OK) {
if (code == TCL_ERROR) {
Tcl_AddObjErrorInfo(interp,
"\n (\"for\" initial command)", -1);
}
goto done;
}
TclEmitOpcode(INST_POP, envPtr);
/*
* Compile the test then emit the conditional jump that exits the for.
*/
envPtr->currStackDepth = savedStackDepth;
testCodeOffset = (envPtr->codeNext - envPtr->codeStart);
code = TclCompileExprWords(interp, testTokenPtr, 1, envPtr);
envPtr->currStackDepth = savedStackDepth + 1;
if (code != TCL_OK) {
if (code == TCL_ERROR) {
Tcl_AddObjErrorInfo(interp,
"\n (\"for\" test expression)", -1);
}
goto done;
}
TclEmitForwardJump(envPtr, TCL_FALSE_JUMP, &jumpFalseFixup);
/*
* Compile the loop body.
*/
envPtr->currStackDepth = savedStackDepth;
envPtr->exceptArrayPtr[bodyRange].codeOffset =
(envPtr->codeNext - envPtr->codeStart);
code = TclCompileCmdWord(interp, bodyTokenPtr+1,
bodyTokenPtr->numComponents, envPtr);
if (code != TCL_OK) {
if (code == TCL_ERROR) {
sprintf(buffer, "\n (\"for\" body line %d)",
interp->errorLine);
Tcl_AddObjErrorInfo(interp, buffer, -1);
}
goto done;
}
envPtr->exceptArrayPtr[bodyRange].numCodeBytes =
(envPtr->codeNext - envPtr->codeStart)
- envPtr->exceptArrayPtr[bodyRange].codeOffset;
TclEmitOpcode(INST_POP, envPtr);
/*
* Compile the "next" subcommand.
*/
envPtr->currStackDepth = savedStackDepth;
envPtr->exceptArrayPtr[bodyRange].continueOffset =
(envPtr->codeNext - envPtr->codeStart);
envPtr->exceptArrayPtr[nextRange].codeOffset =
(envPtr->codeNext - envPtr->codeStart);
code = TclCompileCmdWord(interp, nextTokenPtr+1,
nextTokenPtr->numComponents, envPtr);
envPtr->currStackDepth = savedStackDepth + 1;
if (code != TCL_OK) {
if (code == TCL_ERROR) {
Tcl_AddObjErrorInfo(interp,
"\n (\"for\" loop-end command)", -1);
}
goto done;
}
envPtr->exceptArrayPtr[nextRange].numCodeBytes =
(envPtr->codeNext - envPtr->codeStart)
- envPtr->exceptArrayPtr[nextRange].codeOffset;
TclEmitOpcode(INST_POP, envPtr);
envPtr->currStackDepth = savedStackDepth;
/*
* Jump back to the test at the top of the loop. Generate a 4 byte jump
* if the distance to the test is > 120 bytes. This is conservative and
* ensures that we won't have to replace this jump if we later need to
* replace the ifFalse jump with a 4 byte jump.
*/
|
| ︙ | ︙ | |||
717 718 719 720 721 722 723 |
(envPtr->codeNext - envPtr->codeStart);
/*
* The for command's result is an empty string.
*/
TclEmitPush(TclRegisterLiteral(envPtr, "", 0, /*onHeap*/ 0), envPtr);
| < < < < < < < | 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 |
(envPtr->codeNext - envPtr->codeStart);
/*
* The for command's result is an empty string.
*/
TclEmitPush(TclRegisterLiteral(envPtr, "", 0, /*onHeap*/ 0), envPtr);
code = TCL_OK;
done:
envPtr->exceptDepth--;
return code;
}
/*
*----------------------------------------------------------------------
*
* TclCompileForeachCmd --
*
* Procedure called to compile the "foreach" command.
*
* Results:
* The return value is a standard Tcl result, which is TCL_OK if
* compilation was successful. If an error occurs then the
* interpreter's result contains a standard error message and TCL_ERROR
* is returned. If the command is too complex for TclCompileForeachCmd,
* TCL_OUT_LINE_COMPILE is returned indicating that the foreach command
* should be compiled "out of line" by emitting code to invoke its
* command procedure at runtime.
*
* Side effects:
* Instructions are added to envPtr to execute the "foreach" command
* at runtime.
*
*----------------------------------------------------------------------
*/
|
| ︙ | ︙ | |||
773 774 775 776 777 778 779 |
* used to point to a value list. */
int loopCtTemp; /* Index of temp var holding the loop's
* iteration count. */
Tcl_Token *tokenPtr, *bodyTokenPtr;
char *varList;
unsigned char *jumpPc;
JumpFixup jumpFalseFixup;
| | > > | | < < < | 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 |
* used to point to a value list. */
int loopCtTemp; /* Index of temp var holding the loop's
* iteration count. */
Tcl_Token *tokenPtr, *bodyTokenPtr;
char *varList;
unsigned char *jumpPc;
JumpFixup jumpFalseFixup;
int jumpDist, jumpBackDist, jumpBackOffset, infoIndex, range;
int numWords, numLists, numVars, loopIndex, tempVar, i, j, code;
char savedChar;
char buffer[32 + TCL_INTEGER_SPACE];
int savedStackDepth = envPtr->currStackDepth;
/*
* We parse the variable list argument words and create two arrays:
* varcList[i] is number of variables in i-th var list
* varvList[i] points to array of var names in i-th var list
*/
#define STATIC_VAR_LIST_SIZE 5
int varcListStaticSpace[STATIC_VAR_LIST_SIZE];
CONST char **varvListStaticSpace[STATIC_VAR_LIST_SIZE];
int *varcList = varcListStaticSpace;
CONST char ***varvList = varvListStaticSpace;
/*
* If the foreach command isn't in a procedure, don't compile it inline:
* the payoff is too small.
*/
if (procPtr == NULL) {
return TCL_OUT_LINE_COMPILE;
}
numWords = parsePtr->numWords;
if ((numWords < 4) || (numWords%2 != 0)) {
Tcl_ResetResult(interp);
Tcl_AppendToObj(Tcl_GetObjResult(interp),
"wrong # args: should be \"foreach varList list ?varList list ...? command\"", -1);
return TCL_ERROR;
}
|
| ︙ | ︙ | |||
830 831 832 833 834 835 836 |
/*
* Allocate storage for the varcList and varvList arrays if necessary.
*/
numLists = (numWords - 2)/2;
if (numLists > STATIC_VAR_LIST_SIZE) {
varcList = (int *) ckalloc(numLists * sizeof(int));
| | | | 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 |
/*
* Allocate storage for the varcList and varvList arrays if necessary.
*/
numLists = (numWords - 2)/2;
if (numLists > STATIC_VAR_LIST_SIZE) {
varcList = (int *) ckalloc(numLists * sizeof(int));
varvList = (CONST char ***) ckalloc(numLists * sizeof(char **));
}
for (loopIndex = 0; loopIndex < numLists; loopIndex++) {
varcList[loopIndex] = 0;
varvList[loopIndex] = NULL;
}
/*
* Set the exception stack depth.
*/
envPtr->exceptDepth++;
|
| ︙ | ︙ | |||
880 881 882 883 884 885 886 |
varList[tokenPtr[1].size] = savedChar;
if (code != TCL_OK) {
goto done;
}
numVars = varcList[loopIndex];
for (j = 0; j < numVars; j++) {
| | | 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 |
varList[tokenPtr[1].size] = savedChar;
if (code != TCL_OK) {
goto done;
}
numVars = varcList[loopIndex];
for (j = 0; j < numVars; j++) {
CONST char *varName = varvList[loopIndex][j];
if (!TclIsLocalScalar(varName, (int) strlen(varName))) {
code = TCL_OUT_LINE_COMPILE;
goto done;
}
}
loopIndex++;
}
|
| ︙ | ︙ | |||
928 929 930 931 932 933 934 |
for (loopIndex = 0; loopIndex < numLists; loopIndex++) {
ForeachVarList *varListPtr;
numVars = varcList[loopIndex];
varListPtr = (ForeachVarList *) ckalloc((unsigned)
sizeof(ForeachVarList) + (numVars * sizeof(int)));
varListPtr->numVars = numVars;
for (j = 0; j < numVars; j++) {
| | | 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 |
for (loopIndex = 0; loopIndex < numLists; loopIndex++) {
ForeachVarList *varListPtr;
numVars = varcList[loopIndex];
varListPtr = (ForeachVarList *) ckalloc((unsigned)
sizeof(ForeachVarList) + (numVars * sizeof(int)));
varListPtr->numVars = numVars;
for (j = 0; j < numVars; j++) {
CONST char *varName = varvList[loopIndex][j];
int nameChars = strlen(varName);
varListPtr->varIndexes[j] = TclFindCompiledLocal(varName,
nameChars, /*create*/ 1, /*flags*/ VAR_SCALAR, procPtr);
}
infoPtr->varLists[loopIndex] = varListPtr;
}
infoIndex = TclCreateAuxData((ClientData) infoPtr, &tclForeachInfoType, envPtr);
|
| ︙ | ︙ | |||
953 954 955 956 957 958 959 |
i++, tokenPtr += (tokenPtr->numComponents + 1)) {
if ((i%2 == 0) && (i > 0)) {
code = TclCompileTokens(interp, tokenPtr+1,
tokenPtr->numComponents, envPtr);
if (code != TCL_OK) {
goto done;
}
| < | 913 914 915 916 917 918 919 920 921 922 923 924 925 926 |
i++, tokenPtr += (tokenPtr->numComponents + 1)) {
if ((i%2 == 0) && (i > 0)) {
code = TclCompileTokens(interp, tokenPtr+1,
tokenPtr->numComponents, envPtr);
if (code != TCL_OK) {
goto done;
}
tempVar = (firstValueTemp + loopIndex);
if (tempVar <= 255) {
TclEmitInstInt1(INST_STORE_SCALAR1, tempVar, envPtr);
} else {
TclEmitInstInt4(INST_STORE_SCALAR4, tempVar, envPtr);
}
|
| ︙ | ︙ | |||
990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 |
* Inline compile the loop body.
*/
envPtr->exceptArrayPtr[range].codeOffset =
(envPtr->codeNext - envPtr->codeStart);
code = TclCompileCmdWord(interp, bodyTokenPtr+1,
bodyTokenPtr->numComponents, envPtr);
if (code != TCL_OK) {
if (code == TCL_ERROR) {
sprintf(buffer, "\n (\"foreach\" body line %d)",
interp->errorLine);
Tcl_AddObjErrorInfo(interp, buffer, -1);
}
goto done;
}
| > < | 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 |
* Inline compile the loop body.
*/
envPtr->exceptArrayPtr[range].codeOffset =
(envPtr->codeNext - envPtr->codeStart);
code = TclCompileCmdWord(interp, bodyTokenPtr+1,
bodyTokenPtr->numComponents, envPtr);
envPtr->currStackDepth = savedStackDepth + 1;
if (code != TCL_OK) {
if (code == TCL_ERROR) {
sprintf(buffer, "\n (\"foreach\" body line %d)",
interp->errorLine);
Tcl_AddObjErrorInfo(interp, buffer, -1);
}
goto done;
}
envPtr->exceptArrayPtr[range].numCodeBytes =
(envPtr->codeNext - envPtr->codeStart)
- envPtr->exceptArrayPtr[range].codeOffset;
TclEmitOpcode(INST_POP, envPtr);
/*
* Jump back to the test at the top of the loop. Generate a 4 byte jump
|
| ︙ | ︙ | |||
1059 1060 1061 1062 1063 1064 1065 1066 |
envPtr->exceptArrayPtr[range].breakOffset =
(envPtr->codeNext - envPtr->codeStart);
/*
* The foreach command's result is an empty string.
*/
TclEmitPush(TclRegisterLiteral(envPtr, "", 0, /*onHeap*/ 0), envPtr);
| > < | < | < | 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 |
envPtr->exceptArrayPtr[range].breakOffset =
(envPtr->codeNext - envPtr->codeStart);
/*
* The foreach command's result is an empty string.
*/
envPtr->currStackDepth = savedStackDepth;
TclEmitPush(TclRegisterLiteral(envPtr, "", 0, /*onHeap*/ 0), envPtr);
envPtr->currStackDepth = savedStackDepth + 1;
done:
for (loopIndex = 0; loopIndex < numLists; loopIndex++) {
if (varvList[loopIndex] != NULL) {
ckfree((char *) varvList[loopIndex]);
}
}
if (varcList != varcListStaticSpace) {
ckfree((char *) varcList);
ckfree((char *) varvList);
}
envPtr->exceptDepth--;
return code;
}
/*
*----------------------------------------------------------------------
*
|
| ︙ | ︙ | |||
1183 1184 1185 1186 1187 1188 1189 | * compilation was successful. If an error occurs then the * interpreter's result contains a standard error message and TCL_ERROR * is returned. If the command is too complex for TclCompileIfCmd, * TCL_OUT_LINE_COMPILE is returned indicating that the if command * should be compiled "out of line" by emitting code to invoke its * command procedure at runtime. * | < < < | 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 | * compilation was successful. If an error occurs then the * interpreter's result contains a standard error message and TCL_ERROR * is returned. If the command is too complex for TclCompileIfCmd, * TCL_OUT_LINE_COMPILE is returned indicating that the if command * should be compiled "out of line" by emitting code to invoke its * command procedure at runtime. * * Side effects: * Instructions are added to envPtr to execute the "if" command * at runtime. * *---------------------------------------------------------------------- */ |
| ︙ | ︙ | |||
1209 1210 1211 1212 1213 1214 1215 |
* test when its target PC is determined. */
JumpFixupArray jumpEndFixupArray;
/* Used to fix the jump after each "then"
* body to the end of the "if" when that PC
* is determined. */
Tcl_Token *tokenPtr, *testTokenPtr;
int jumpDist, jumpFalseDist, jumpIndex;
| | > > > > < | 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 |
* test when its target PC is determined. */
JumpFixupArray jumpEndFixupArray;
/* Used to fix the jump after each "then"
* body to the end of the "if" when that PC
* is determined. */
Tcl_Token *tokenPtr, *testTokenPtr;
int jumpDist, jumpFalseDist, jumpIndex;
int numWords, wordIdx, numBytes, j, code;
char *word;
char buffer[100];
int savedStackDepth = envPtr->currStackDepth;
/* Saved stack depth at the start of the first
* test; the envPtr current depth is restored
* to this value at the start of each test. */
/*
* Only compile the "if" command if all arguments are simple
* words, in order to insure correct substitution [Bug 219166]
*/
tokenPtr = parsePtr->tokenPtr;
wordIdx = 0;
numWords = parsePtr->numWords;
for (wordIdx = 0; wordIdx < numWords; wordIdx++) {
if (tokenPtr->type != TCL_TOKEN_SIMPLE_WORD) {
return TCL_OUT_LINE_COMPILE;
}
tokenPtr += 2;
}
TclInitJumpFixupArray(&jumpFalseFixupArray);
TclInitJumpFixupArray(&jumpEndFixupArray);
code = TCL_OK;
/*
* Each iteration of this loop compiles one "if expr ?then? body"
* or "elseif expr ?then? body" clause.
*/
|
| ︙ | ︙ | |||
1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 |
/*
* Compile the test expression then emit the conditional jump
* around the "then" part. If the expression word isn't simple,
* we back off and compile the if command out-of-line.
*/
testTokenPtr = tokenPtr;
code = TclCompileExprWords(interp, testTokenPtr, 1, envPtr);
if (code != TCL_OK) {
if (code == TCL_ERROR) {
Tcl_AddObjErrorInfo(interp,
"\n (\"if\" test expression)", -1);
}
goto done;
}
| > < | 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 |
/*
* Compile the test expression then emit the conditional jump
* around the "then" part. If the expression word isn't simple,
* we back off and compile the if command out-of-line.
*/
envPtr->currStackDepth = savedStackDepth;
testTokenPtr = tokenPtr;
code = TclCompileExprWords(interp, testTokenPtr, 1, envPtr);
if (code != TCL_OK) {
if (code == TCL_ERROR) {
Tcl_AddObjErrorInfo(interp,
"\n (\"if\" test expression)", -1);
}
goto done;
}
if (jumpFalseFixupArray.next >= jumpFalseFixupArray.end) {
TclExpandJumpFixupArray(&jumpFalseFixupArray);
}
jumpIndex = jumpFalseFixupArray.next;
jumpFalseFixupArray.next++;
TclEmitForwardJump(envPtr, TCL_FALSE_JUMP,
&(jumpFalseFixupArray.fixup[jumpIndex]));
|
| ︙ | ︙ | |||
1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 |
}
}
/*
* Compile the "then" command body.
*/
code = TclCompileCmdWord(interp, tokenPtr+1,
tokenPtr->numComponents, envPtr);
if (code != TCL_OK) {
if (code == TCL_ERROR) {
sprintf(buffer, "\n (\"if\" then script line %d)",
interp->errorLine);
Tcl_AddObjErrorInfo(interp, buffer, -1);
}
goto done;
}
| > < | 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 |
}
}
/*
* Compile the "then" command body.
*/
envPtr->currStackDepth = savedStackDepth;
code = TclCompileCmdWord(interp, tokenPtr+1,
tokenPtr->numComponents, envPtr);
if (code != TCL_OK) {
if (code == TCL_ERROR) {
sprintf(buffer, "\n (\"if\" then script line %d)",
interp->errorLine);
Tcl_AddObjErrorInfo(interp, buffer, -1);
}
goto done;
}
/*
* Jump to the end of the "if" command. Both jumpFalseFixupArray and
* jumpEndFixupArray are indexed by "jumpIndex".
*/
if (jumpEndFixupArray.next >= jumpEndFixupArray.end) {
|
| ︙ | ︙ | |||
1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 |
jumpEndFixupArray.fixup[jumpIndex].codeOffset += 3;
}
tokenPtr += (tokenPtr->numComponents + 1);
wordIdx++;
}
/*
* Check for the optional else clause.
*/
if ((wordIdx < numWords)
&& (tokenPtr->type == TCL_TOKEN_SIMPLE_WORD)) {
/*
* There is an else clause. Skip over the optional "else" word.
*/
| > > > > > > > | | 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 |
jumpEndFixupArray.fixup[jumpIndex].codeOffset += 3;
}
tokenPtr += (tokenPtr->numComponents + 1);
wordIdx++;
}
/*
* Restore the current stack depth in the environment; the
* "else" clause (or its default) will add 1 to this.
*/
envPtr->currStackDepth = savedStackDepth;
/*
* Check for the optional else clause.
*/
if ((wordIdx < numWords)
&& (tokenPtr->type == TCL_TOKEN_SIMPLE_WORD)) {
/*
* There is an else clause. Skip over the optional "else" word.
*/
word = tokenPtr[1].start;
numBytes = tokenPtr[1].size;
if ((numBytes == 4) && (strncmp(word, "else", 4) == 0)) {
tokenPtr += (tokenPtr->numComponents + 1);
wordIdx++;
if (wordIdx >= numWords) {
Tcl_ResetResult(interp);
|
| ︙ | ︙ | |||
1412 1413 1414 1415 1416 1417 1418 |
if (code == TCL_ERROR) {
sprintf(buffer, "\n (\"if\" else script line %d)",
interp->errorLine);
Tcl_AddObjErrorInfo(interp, buffer, -1);
}
goto done;
}
| < < | 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 |
if (code == TCL_ERROR) {
sprintf(buffer, "\n (\"if\" else script line %d)",
interp->errorLine);
Tcl_AddObjErrorInfo(interp, buffer, -1);
}
goto done;
}
/*
* Make sure there are no words after the else clause.
*/
wordIdx++;
if (wordIdx < numWords) {
Tcl_ResetResult(interp);
Tcl_AppendToObj(Tcl_GetObjResult(interp),
"wrong # args: extra words after \"else\" clause in \"if\" command", -1);
code = TCL_ERROR;
goto done;
}
} else {
/*
* No else clause: the "if" command's result is an empty string.
*/
TclEmitPush(TclRegisterLiteral(envPtr, "", 0,/*onHeap*/ 0), envPtr);
}
/*
* Fix the unconditional jumps to the end of the "if" command.
*/
for (j = jumpEndFixupArray.next; j > 0; j--) {
|
| ︙ | ︙ | |||
1472 1473 1474 1475 1476 1477 1478 1479 1480 |
}
/*
* Free the jumpFixupArray array if malloc'ed storage was used.
*/
done:
TclFreeJumpFixupArray(&jumpFalseFixupArray);
TclFreeJumpFixupArray(&jumpEndFixupArray);
| > < < < < < < | | 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 |
}
/*
* Free the jumpFixupArray array if malloc'ed storage was used.
*/
done:
envPtr->currStackDepth = savedStackDepth + 1;
TclFreeJumpFixupArray(&jumpFalseFixupArray);
TclFreeJumpFixupArray(&jumpEndFixupArray);
return code;
}
/*
*----------------------------------------------------------------------
*
* TclCompileIncrCmd --
*
* Procedure called to compile the "incr" command.
*
* Results:
* The return value is a standard Tcl result, which is TCL_OK if
* compilation was successful. If an error occurs then the
* interpreter's result contains a standard error message and TCL_ERROR
* is returned. If the command is too complex for TclCompileIncrCmd,
* TCL_OUT_LINE_COMPILE is returned indicating that the incr command
* should be compiled "out of line" by emitting code to invoke its
* command procedure at runtime.
*
* Side effects:
* Instructions are added to envPtr to execute the "incr" command
* at runtime.
*
*----------------------------------------------------------------------
*/
int
TclCompileIncrCmd(interp, parsePtr, envPtr)
Tcl_Interp *interp; /* Used for error reporting. */
Tcl_Parse *parsePtr; /* Points to a parse structure for the
* command created by Tcl_ParseCommand. */
CompileEnv *envPtr; /* Holds resulting instructions. */
{
Tcl_Token *varTokenPtr, *incrTokenPtr;
int simpleVarName, isScalar, localIndex, haveImmValue, immValue;
int code = TCL_OK;
if ((parsePtr->numWords != 2) && (parsePtr->numWords != 3)) {
Tcl_ResetResult(interp);
Tcl_AppendToObj(Tcl_GetObjResult(interp),
"wrong # args: should be \"incr varName ?increment?\"", -1);
return TCL_ERROR;
}
varTokenPtr = parsePtr->tokenPtr
+ (parsePtr->tokenPtr->numComponents + 1);
code = TclPushVarName(interp, varTokenPtr, envPtr, TCL_NO_LARGE_INDEX,
&localIndex, &simpleVarName, &isScalar);
if (code != TCL_OK) {
goto done;
}
/*
* If an increment is given, push it, but see first if it's a small
* integer.
|
| ︙ | ︙ | |||
1567 1568 1569 1570 1571 1572 1573 |
immValue = n;
}
}
word[numBytes] = savedChar;
if (!haveImmValue) {
TclEmitPush(TclRegisterLiteral(envPtr, word, numBytes,
/*onHeap*/ 0), envPtr);
| < < | 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 |
immValue = n;
}
}
word[numBytes] = savedChar;
if (!haveImmValue) {
TclEmitPush(TclRegisterLiteral(envPtr, word, numBytes,
/*onHeap*/ 0), envPtr);
}
} else {
code = TclCompileTokens(interp, incrTokenPtr+1,
incrTokenPtr->numComponents, envPtr);
if (code != TCL_OK) {
if (code == TCL_ERROR) {
Tcl_AddObjErrorInfo(interp,
"\n (increment expression)", -1);
}
goto done;
}
}
} else { /* no incr amount given so use 1 */
haveImmValue = 1;
immValue = 1;
}
/*
|
| ︙ | ︙ | |||
1631 1632 1633 1634 1635 1636 1637 |
TclEmitInstInt1(INST_INCR_STK_IMM, immValue, envPtr);
} else {
TclEmitOpcode(INST_INCR_STK, envPtr);
}
}
done:
| < < < < < < | 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 |
TclEmitInstInt1(INST_INCR_STK_IMM, immValue, envPtr);
} else {
TclEmitOpcode(INST_INCR_STK, envPtr);
}
}
done:
return code;
}
/*
*----------------------------------------------------------------------
*
* TclCompileLappendCmd --
*
* Procedure called to compile the "lappend" command.
*
* Results:
* The return value is a standard Tcl result, which is normally TCL_OK
* unless there was an error while parsing string. If an error occurs
* then the interpreter's result contains a standard error message. If
* complation fails because the command requires a second level of
* substitutions, TCL_OUT_LINE_COMPILE is returned indicating that the
* command should be compiled "out of line" by emitting code to
* invoke its command procedure (Tcl_LappendObjCmd) at runtime.
*
* Side effects:
* Instructions are added to envPtr to execute the "lappend" command
* at runtime.
*
*----------------------------------------------------------------------
*/
int
TclCompileLappendCmd(interp, parsePtr, envPtr)
Tcl_Interp *interp; /* Used for error reporting. */
Tcl_Parse *parsePtr; /* Points to a parse structure for the
* command created by Tcl_ParseCommand. */
CompileEnv *envPtr; /* Holds resulting instructions. */
{
Tcl_Token *varTokenPtr, *valueTokenPtr;
int numValues, simpleVarName, isScalar, localIndex, numWords;
int code = TCL_OK;
/*
* If we're not in a procedure, don't compile.
*/
if (envPtr->procPtr == NULL) {
return TCL_OUT_LINE_COMPILE;
}
numWords = parsePtr->numWords;
if (numWords == 1) {
Tcl_ResetResult(interp);
Tcl_AppendToObj(Tcl_GetObjResult(interp),
"wrong # args: should be \"lappend varName ?value value ...?\"", -1);
return TCL_ERROR;
}
|
| ︙ | ︙ | |||
1708 1709 1710 1711 1712 1713 1714 |
* namespace qualifiers.
*/
varTokenPtr = parsePtr->tokenPtr
+ (parsePtr->tokenPtr->numComponents + 1);
code = TclPushVarName(interp, varTokenPtr, envPtr, TCL_CREATE_VAR,
| | < < < | 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 |
* namespace qualifiers.
*/
varTokenPtr = parsePtr->tokenPtr
+ (parsePtr->tokenPtr->numComponents + 1);
code = TclPushVarName(interp, varTokenPtr, envPtr, TCL_CREATE_VAR,
&localIndex, &simpleVarName, &isScalar);
if (code != TCL_OK) {
goto done;
}
/*
* If we are doing an assignment, push the new value.
* In the no values case, create an empty object.
*/
if (numWords > 2) {
valueTokenPtr = varTokenPtr + (varTokenPtr->numComponents + 1);
if (valueTokenPtr->type == TCL_TOKEN_SIMPLE_WORD) {
TclEmitPush(TclRegisterLiteral(envPtr, valueTokenPtr[1].start,
valueTokenPtr[1].size, /*onHeap*/ 0), envPtr);
} else {
code = TclCompileTokens(interp, valueTokenPtr+1,
valueTokenPtr->numComponents, envPtr);
if (code != TCL_OK) {
goto done;
}
}
#if 0
} else {
/*
* We need to carefully handle the two arg case, as lappend
* always creates the variable.
*/
TclEmitPush(TclRegisterLiteral(envPtr, "", 0, /*onHeap*/ 0), envPtr);
numValues = 1;
#endif
}
/*
* Emit instructions to set/get the variable.
*/
|
| ︙ | ︙ | |||
1780 1781 1782 1783 1784 1785 1786 |
}
}
} else {
TclEmitOpcode(INST_LAPPEND_STK, envPtr);
}
done:
| < < < < | > | | > > > | > | > | < < | | | | | > > | < | < | > > > > | > | > > > > < < < | 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 |
}
}
} else {
TclEmitOpcode(INST_LAPPEND_STK, envPtr);
}
done:
return code;
}
/*
*----------------------------------------------------------------------
*
* TclCompileLindexCmd --
*
* Procedure called to compile the "lindex" command.
*
* Results:
* The return value is a standard Tcl result, which is TCL_OK if the
* compilation was successful. If the command cannot be byte-compiled,
* TCL_OUT_LINE_COMPILE is returned. If an error occurs then the
* interpreter's result contains an error message, and TCL_ERROR is
* returned.
*
* Side effects:
* Instructions are added to envPtr to execute the "lindex" command
* at runtime.
*
*----------------------------------------------------------------------
*/
int
TclCompileLindexCmd(interp, parsePtr, envPtr)
Tcl_Interp *interp; /* Used for error reporting. */
Tcl_Parse *parsePtr; /* Points to a parse structure for the
* command created by Tcl_ParseCommand. */
CompileEnv *envPtr; /* Holds resulting instructions. */
{
Tcl_Token *varTokenPtr;
int code, i;
int numWords;
numWords = parsePtr->numWords;
/*
* Quit if too few args
*/
if ( numWords <= 1 ) {
return TCL_OUT_LINE_COMPILE;
}
varTokenPtr = parsePtr->tokenPtr
+ (parsePtr->tokenPtr->numComponents + 1);
/*
* Push the operands onto the stack.
*/
for ( i = 1 ; i < numWords ; i++ ) {
if (varTokenPtr->type == TCL_TOKEN_SIMPLE_WORD) {
TclEmitPush( TclRegisterLiteral( envPtr,
varTokenPtr[1].start,
varTokenPtr[1].size,
0),
envPtr);
} else {
code = TclCompileTokens(interp, varTokenPtr+1,
varTokenPtr->numComponents, envPtr);
if (code != TCL_OK) {
return code;
}
}
varTokenPtr = varTokenPtr + (varTokenPtr->numComponents + 1);
}
/*
* Emit INST_LIST_INDEX if objc==3, or INST_LIST_INDEX_MULTI
* if there are multiple index args.
*/
if ( numWords == 3 ) {
TclEmitOpcode( INST_LIST_INDEX, envPtr );
} else {
TclEmitInstInt4( INST_LIST_INDEX_MULTI, numWords-1, envPtr );
}
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
* TclCompileListCmd --
*
* Procedure called to compile the "list" command.
*
* Results:
* The return value is a standard Tcl result, which is normally TCL_OK
* unless there was an error while parsing string. If an error occurs
* then the interpreter's result contains a standard error message. If
* complation fails because the command requires a second level of
* substitutions, TCL_OUT_LINE_COMPILE is returned indicating that the
* command should be compiled "out of line" by emitting code to
* invoke its command procedure (Tcl_ListObjCmd) at runtime.
*
* Side effects:
* Instructions are added to envPtr to execute the "list" command
* at runtime.
*
*----------------------------------------------------------------------
*/
|
| ︙ | ︙ | |||
1894 1895 1896 1897 1898 1899 1900 |
/*
* If we're not in a procedure, don't compile.
*/
if (envPtr->procPtr == NULL) {
return TCL_OUT_LINE_COMPILE;
}
| < < | < < < | 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 |
/*
* If we're not in a procedure, don't compile.
*/
if (envPtr->procPtr == NULL) {
return TCL_OUT_LINE_COMPILE;
}
if (parsePtr->numWords == 1) {
/*
* Empty args case
*/
TclEmitPush(TclRegisterLiteral(envPtr, "", 0, 0), envPtr);
} else {
/*
* Push the all values onto the stack.
*/
Tcl_Token *valueTokenPtr;
int i, code, numWords;
numWords = parsePtr->numWords;
valueTokenPtr = parsePtr->tokenPtr
+ (parsePtr->tokenPtr->numComponents + 1);
for (i = 1; i < numWords; i++) {
if (valueTokenPtr->type == TCL_TOKEN_SIMPLE_WORD) {
TclEmitPush(TclRegisterLiteral(envPtr,
valueTokenPtr[1].start, valueTokenPtr[1].size,
/*onHeap*/ 0), envPtr);
} else {
code = TclCompileTokens(interp, valueTokenPtr+1,
valueTokenPtr->numComponents, envPtr);
if (code != TCL_OK) {
return code;
}
}
valueTokenPtr = valueTokenPtr + (valueTokenPtr->numComponents + 1);
}
TclEmitInstInt4(INST_LIST, numWords - 1, envPtr);
}
return TCL_OK;
|
| ︙ | ︙ | |||
1950 1951 1952 1953 1954 1955 1956 | * Results: * The return value is a standard Tcl result, which is TCL_OK if the * compilation was successful. If the command cannot be byte-compiled, * TCL_OUT_LINE_COMPILE is returned. If an error occurs then the * interpreter's result contains an error message, and TCL_ERROR is * returned. * | < < < | 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 | * Results: * The return value is a standard Tcl result, which is TCL_OK if the * compilation was successful. If the command cannot be byte-compiled, * TCL_OUT_LINE_COMPILE is returned. If an error occurs then the * interpreter's result contains an error message, and TCL_ERROR is * returned. * * Side effects: * Instructions are added to envPtr to execute the "llength" command * at runtime. * *---------------------------------------------------------------------- */ |
| ︙ | ︙ | |||
1985 1986 1987 1988 1989 1990 1991 |
if (varTokenPtr->type == TCL_TOKEN_SIMPLE_WORD) {
/*
* We could simply count the number of elements here and push
* that value, but that is too rare a case to waste the code space.
*/
TclEmitPush(TclRegisterLiteral(envPtr, varTokenPtr[1].start,
varTokenPtr[1].size, 0), envPtr);
| < > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > < < < | 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 |
if (varTokenPtr->type == TCL_TOKEN_SIMPLE_WORD) {
/*
* We could simply count the number of elements here and push
* that value, but that is too rare a case to waste the code space.
*/
TclEmitPush(TclRegisterLiteral(envPtr, varTokenPtr[1].start,
varTokenPtr[1].size, 0), envPtr);
} else {
code = TclCompileTokens(interp, varTokenPtr+1,
varTokenPtr->numComponents, envPtr);
if (code != TCL_OK) {
return code;
}
}
TclEmitOpcode(INST_LIST_LENGTH, envPtr);
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
* TclCompileLsetCmd --
*
* Procedure called to compile the "lset" command.
*
* Results:
* The return value is a standard Tcl result, which is TCL_OK if
* the compilation was successful. If the "lset" command is too
* complex for this function, then TCL_OUT_LINE_COMPILE is returned,
* indicating that the command should be compiled "out of line"
* (that is, not byte-compiled). If an error occurs, TCL_ERROR is
* returned, and the interpreter result contains an error message.
*
* Side effects:
* Instructions are added to envPtr to execute the "lset" command
* at runtime.
*
* The general template for execution of the "lset" command is:
* (1) Instructions to push the variable name, unless the
* variable is local to the stack frame.
* (2) If the variable is an array element, instructions
* to push the array element name.
* (3) Instructions to push each of zero or more "index" arguments
* to the stack, followed with the "newValue" element.
* (4) Instructions to duplicate the variable name and/or array
* element name onto the top of the stack, if either was
* pushed at steps (1) and (2).
* (5) The appropriate INST_LOAD_* instruction to place the
* original value of the list variable at top of stack.
* (6) At this point, the stack contains:
* varName? arrayElementName? index1 index2 ... newValue oldList
* The compiler emits one of INST_LSET_FLAT or INST_LSET_LIST
* according as whether there is exactly one index element (LIST)
* or either zero or else two or more (FLAT). This instruction
* removes everything from the stack except for the two names
* and pushes the new value of the variable.
* (7) Finally, INST_STORE_* stores the new value in the variable
* and cleans up the stack.
*
*----------------------------------------------------------------------
*/
int
TclCompileLsetCmd( interp, parsePtr, envPtr )
Tcl_Interp* interp; /* Tcl interpreter for error reporting */
Tcl_Parse* parsePtr; /* Points to a parse structure for
* the command */
CompileEnv* envPtr; /* Holds the resulting instructions */
{
int tempDepth; /* Depth used for emitting one part
* of the code burst. */
Tcl_Token* varTokenPtr; /* Pointer to the Tcl_Token representing
* the parse of the variable name */
int result; /* Status return from library calls */
int localIndex; /* Index of var in local var table */
int simpleVarName; /* Flag == 1 if var name is simple */
int isScalar; /* Flag == 1 if scalar, 0 if array */
int i;
/* Check argument count */
if ( parsePtr->numWords < 3 ) {
/* Fail at run time, not in compilation */
return TCL_OUT_LINE_COMPILE;
}
/*
* Decide if we can use a frame slot for the var/array name or if we
* need to emit code to compute and push the name at runtime. We use a
* frame slot (entry in the array of local vars) if we are compiling a
* procedure body and if the name is simple text that does not include
* namespace qualifiers.
*/
varTokenPtr = parsePtr->tokenPtr
+ (parsePtr->tokenPtr->numComponents + 1);
result = TclPushVarName( interp, varTokenPtr, envPtr, 0,
&localIndex, &simpleVarName, &isScalar );
if (result != TCL_OK) {
return result;
}
/* Push the "index" args and the new element value. */
for ( i = 2; i < parsePtr->numWords; ++i ) {
/* Advance to next arg */
varTokenPtr = varTokenPtr + (varTokenPtr->numComponents + 1);
/* Push an arg */
if (varTokenPtr->type == TCL_TOKEN_SIMPLE_WORD) {
TclEmitPush( TclRegisterLiteral( envPtr,
varTokenPtr[1].start,
varTokenPtr[1].size,
0),
envPtr);
} else {
result = TclCompileTokens(interp, varTokenPtr+1,
varTokenPtr->numComponents, envPtr);
if ( result != TCL_OK ) {
return result;
}
}
}
/*
* Duplicate the variable name if it's been pushed.
*/
if ( !simpleVarName || localIndex < 0 ) {
if ( !simpleVarName || isScalar ) {
tempDepth = parsePtr->numWords - 2;
} else {
tempDepth = parsePtr->numWords - 1;
}
TclEmitInstInt4( INST_OVER, tempDepth, envPtr );
}
/*
* Duplicate an array index if one's been pushed
*/
if ( simpleVarName && !isScalar ) {
if ( localIndex < 0 ) {
tempDepth = parsePtr->numWords - 1;
} else {
tempDepth = parsePtr->numWords - 2;
}
TclEmitInstInt4( INST_OVER, tempDepth, envPtr );
}
/*
* Emit code to load the variable's value.
*/
if ( !simpleVarName ) {
TclEmitOpcode( INST_LOAD_STK, envPtr );
} else if ( isScalar ) {
if ( localIndex < 0 ) {
TclEmitOpcode( INST_LOAD_SCALAR_STK, envPtr );
} else if ( localIndex < 0x100 ) {
TclEmitInstInt1( INST_LOAD_SCALAR1, localIndex, envPtr );
} else {
TclEmitInstInt4( INST_LOAD_SCALAR4, localIndex, envPtr );
}
} else {
if ( localIndex < 0 ) {
TclEmitOpcode( INST_LOAD_ARRAY_STK, envPtr );
} else if ( localIndex < 0x100 ) {
TclEmitInstInt1( INST_LOAD_ARRAY1, localIndex, envPtr );
} else {
TclEmitInstInt4( INST_LOAD_ARRAY4, localIndex, envPtr );
}
}
/*
* Emit the correct variety of 'lset' instruction
*/
if ( parsePtr->numWords == 4 ) {
TclEmitOpcode( INST_LSET_LIST, envPtr );
} else {
TclEmitInstInt4( INST_LSET_FLAT, (parsePtr->numWords - 1), envPtr );
}
/*
* Emit code to put the value back in the variable
*/
if ( !simpleVarName ) {
TclEmitOpcode( INST_STORE_STK, envPtr );
} else if ( isScalar ) {
if ( localIndex < 0 ) {
TclEmitOpcode( INST_STORE_SCALAR_STK, envPtr );
} else if ( localIndex < 0x100 ) {
TclEmitInstInt1( INST_STORE_SCALAR1, localIndex, envPtr );
} else {
TclEmitInstInt4( INST_STORE_SCALAR4, localIndex, envPtr );
}
} else {
if ( localIndex < 0 ) {
TclEmitOpcode( INST_STORE_ARRAY_STK, envPtr );
} else if ( localIndex < 0x100 ) {
TclEmitInstInt1( INST_STORE_ARRAY1, localIndex, envPtr );
} else {
TclEmitInstInt4( INST_STORE_ARRAY4, localIndex, envPtr );
}
}
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
* TclCompileRegexpCmd --
*
* Procedure called to compile the "regexp" command.
*
* Results:
* The return value is a standard Tcl result, which is TCL_OK if
* the compilation was successful. If the "regexp" command is too
* complex for this function, then TCL_OUT_LINE_COMPILE is returned,
* indicating that the command should be compiled "out of line"
* (that is, not byte-compiled). If an error occurs, TCL_ERROR is
* returned, and the interpreter result contains an error message.
*
* Side effects:
* Instructions are added to envPtr to execute the "regexp" command
* at runtime.
*
*----------------------------------------------------------------------
*/
int
TclCompileRegexpCmd(interp, parsePtr, envPtr)
Tcl_Interp* interp; /* Tcl interpreter for error reporting */
Tcl_Parse* parsePtr; /* Points to a parse structure for
* the command */
CompileEnv* envPtr; /* Holds the resulting instructions */
{
Tcl_Token *varTokenPtr; /* Pointer to the Tcl_Token representing
* the parse of the RE or string */
int i, len, code, exactMatch, nocase;
char c, *str;
/*
* We are only interested in compiling simple regexp cases.
* Currently supported compile cases are:
* regexp ?-nocase? ?--? staticString $var
* regexp ?-nocase? ?--? {^staticString$} $var
*/
if (parsePtr->numWords < 3) {
return TCL_OUT_LINE_COMPILE;
}
nocase = 0;
varTokenPtr = parsePtr->tokenPtr;
/*
* We only look for -nocase and -- as options. Everything else
* gets pushed to runtime execution. This is different than regexp's
* runtime option handling, but satisfies our stricter needs.
*/
for (i = 1; i < parsePtr->numWords - 2; i++) {
varTokenPtr = varTokenPtr + (varTokenPtr->numComponents + 1);
if (varTokenPtr->type != TCL_TOKEN_SIMPLE_WORD) {
/* Not a simple string - punt to runtime. */
return TCL_OUT_LINE_COMPILE;
}
str = varTokenPtr[1].start;
len = varTokenPtr[1].size;
if ((len == 2) && (str[0] == '-') && (str[1] == '-')) {
i++;
break;
} else if ((len > 1)
&& (strncmp(str, "-nocase", (unsigned) len) == 0)) {
nocase = 1;
} else {
/* Not an option we recognize. */
return TCL_OUT_LINE_COMPILE;
}
}
if ((parsePtr->numWords - i) != 2) {
/* We don't support capturing to variables */
return TCL_OUT_LINE_COMPILE;
}
/*
* Get the regexp string. If it is not a simple string, punt to runtime.
* If it has a '-', it could be an incorrectly formed regexp command.
*/
varTokenPtr = varTokenPtr + (varTokenPtr->numComponents + 1);
if ((varTokenPtr->type != TCL_TOKEN_SIMPLE_WORD)
|| (*(varTokenPtr[1].start) == '-')) {
return TCL_OUT_LINE_COMPILE;
}
str = varTokenPtr[1].start;
len = varTokenPtr[1].size;
/*
* On the first (pattern) arg, check to see if any RE special characters
* are in the word. If not, this is the same as 'string equal'.
* We can use strchr here because the glob chars are all in the ascii-7
* range. If -nocase was specified, we can't do this because INST_STR_EQ
* has no support for nocase.
*/
if ((len > 1) && (str[0] == '^') && (str[len-1] == '$')) {
/*
* It appears and exact search was requested (ie ^foo$), so strip
* off the special chars and signal exactMatch.
*/
str++; len -= 2;
exactMatch = 1;
} else {
exactMatch = 0;
}
c = str[len];
str[len] = '\0';
if (strpbrk(str, "*+?{}()[].\\|^$") != NULL) {
str[len] = c;
/* We don't do anything with REs with special chars yet. */
return TCL_OUT_LINE_COMPILE;
}
str[len] = c;
if (exactMatch) {
TclEmitPush(TclRegisterLiteral(envPtr, str, len, 0), envPtr);
} else {
/*
* This needs to find the substring anywhere in the string, so
* use string match and *foo*.
*/
char *newStr = ckalloc((unsigned) len + 3);
newStr[0] = '*';
strncpy(newStr + 1, str, (size_t) len);
newStr[len+1] = '*';
newStr[len+2] = '\0';
TclEmitPush(TclRegisterLiteral(envPtr, newStr, len+2, 0), envPtr);
ckfree((char *) newStr);
}
/*
* Push the string arg
*/
varTokenPtr = varTokenPtr + (varTokenPtr->numComponents + 1);
if (varTokenPtr->type == TCL_TOKEN_SIMPLE_WORD) {
TclEmitPush(TclRegisterLiteral(envPtr,
varTokenPtr[1].start, varTokenPtr[1].size, 0), envPtr);
} else {
code = TclCompileTokens(interp, varTokenPtr+1,
varTokenPtr->numComponents, envPtr);
if (code != TCL_OK) {
return code;
}
}
if (exactMatch && !nocase) {
TclEmitOpcode(INST_STR_EQ, envPtr);
} else {
TclEmitInstInt1(INST_STR_MATCH, nocase, envPtr);
}
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
* TclCompileReturnCmd --
*
* Procedure called to compile the "return" command.
*
* Results:
* The return value is a standard Tcl result, which is TCL_OK if the
* compilation was successful. If the particular return command is
* too complex for this function (ie, return with any flags like "-code"
* or "-errorinfo"), TCL_OUT_LINE_COMPILE is returned, indicating that
* the command should be compiled "out of line" (eg, not byte compiled).
* If an error occurs then the interpreter's result contains a standard
* error message.
*
* Side effects:
* Instructions are added to envPtr to execute the "return" command
* at runtime.
*
*----------------------------------------------------------------------
*/
|
| ︙ | ︙ | |||
2048 2049 2050 2051 2052 2053 2054 |
switch (parsePtr->numWords) {
case 1: {
/*
* Simple case: [return]
* Just push the literal string "".
*/
TclEmitPush(TclRegisterLiteral(envPtr, "", 0, 0), envPtr);
| < < | 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 |
switch (parsePtr->numWords) {
case 1: {
/*
* Simple case: [return]
* Just push the literal string "".
*/
TclEmitPush(TclRegisterLiteral(envPtr, "", 0, 0), envPtr);
break;
}
case 2: {
/*
* More complex cases:
* [return "foo"]
* [return $value]
* [return [otherCmd]]
*/
varTokenPtr = parsePtr->tokenPtr
+ (parsePtr->tokenPtr->numComponents + 1);
if (varTokenPtr->type == TCL_TOKEN_SIMPLE_WORD) {
/*
* [return "foo"] case: the parse token is a simple word,
* so just push it.
*/
TclEmitPush(TclRegisterLiteral(envPtr, varTokenPtr[1].start,
varTokenPtr[1].size, /*onHeap*/ 0), envPtr);
} else {
/*
* Parse token is more complex, so compile it; this handles the
* variable reference and nested command cases. If the
* parse token can be byte-compiled, then this instance of
* "return" will be byte-compiled; otherwise it will be
* out line compiled.
|
| ︙ | ︙ | |||
2118 2119 2120 2121 2122 2123 2124 | * unless there was an error while parsing string. If an error occurs * then the interpreter's result contains a standard error message. If * complation fails because the set command requires a second level of * substitutions, TCL_OUT_LINE_COMPILE is returned indicating that the * set command should be compiled "out of line" by emitting code to * invoke its command procedure (Tcl_SetCmd) at runtime. * | < < < < < | 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 |
* unless there was an error while parsing string. If an error occurs
* then the interpreter's result contains a standard error message. If
* complation fails because the set command requires a second level of
* substitutions, TCL_OUT_LINE_COMPILE is returned indicating that the
* set command should be compiled "out of line" by emitting code to
* invoke its command procedure (Tcl_SetCmd) at runtime.
*
* Side effects:
* Instructions are added to envPtr to execute the "set" command
* at runtime.
*
*----------------------------------------------------------------------
*/
int
TclCompileSetCmd(interp, parsePtr, envPtr)
Tcl_Interp *interp; /* Used for error reporting. */
Tcl_Parse *parsePtr; /* Points to a parse structure for the
* command created by Tcl_ParseCommand. */
CompileEnv *envPtr; /* Holds resulting instructions. */
{
Tcl_Token *varTokenPtr, *valueTokenPtr;
int isAssignment, isScalar, simpleVarName, localIndex, numWords;
int code = TCL_OK;
numWords = parsePtr->numWords;
if ((numWords != 2) && (numWords != 3)) {
Tcl_ResetResult(interp);
Tcl_AppendToObj(Tcl_GetObjResult(interp),
"wrong # args: should be \"set varName ?newValue?\"", -1);
return TCL_ERROR;
}
|
| ︙ | ︙ | |||
2163 2164 2165 2166 2167 2168 2169 |
*/
varTokenPtr = parsePtr->tokenPtr
+ (parsePtr->tokenPtr->numComponents + 1);
code = TclPushVarName(interp, varTokenPtr, envPtr,
(isAssignment ? TCL_CREATE_VAR : 0),
| | < < | 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 |
*/
varTokenPtr = parsePtr->tokenPtr
+ (parsePtr->tokenPtr->numComponents + 1);
code = TclPushVarName(interp, varTokenPtr, envPtr,
(isAssignment ? TCL_CREATE_VAR : 0),
&localIndex, &simpleVarName, &isScalar);
if (code != TCL_OK) {
goto done;
}
/*
* If we are doing an assignment, push the new value.
*/
if (isAssignment) {
valueTokenPtr = varTokenPtr + (varTokenPtr->numComponents + 1);
if (valueTokenPtr->type == TCL_TOKEN_SIMPLE_WORD) {
TclEmitPush(TclRegisterLiteral(envPtr, valueTokenPtr[1].start,
valueTokenPtr[1].size, /*onHeap*/ 0), envPtr);
} else {
code = TclCompileTokens(interp, valueTokenPtr+1,
valueTokenPtr->numComponents, envPtr);
if (code != TCL_OK) {
goto done;
}
}
}
/*
* Emit instructions to set/get the variable.
*/
|
| ︙ | ︙ | |||
2229 2230 2231 2232 2233 2234 2235 |
}
}
} else {
TclEmitOpcode((isAssignment? INST_STORE_STK : INST_LOAD_STK), envPtr);
}
done:
| < < < < | | < | | | 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 |
}
}
} else {
TclEmitOpcode((isAssignment? INST_STORE_STK : INST_LOAD_STK), envPtr);
}
done:
return code;
}
/*
*----------------------------------------------------------------------
*
* TclCompileStringCmd --
*
* Procedure called to compile the "string" command.
*
* Results:
* The return value is a standard Tcl result, which is TCL_OK if the
* compilation was successful. If the command cannot be byte-compiled,
* TCL_OUT_LINE_COMPILE is returned. If an error occurs then the
* interpreter's result contains an error message, and TCL_ERROR is
* returned.
*
* Side effects:
* Instructions are added to envPtr to execute the "string" command
* at runtime.
*
*----------------------------------------------------------------------
*/
int
TclCompileStringCmd(interp, parsePtr, envPtr)
Tcl_Interp *interp; /* Used for error reporting. */
Tcl_Parse *parsePtr; /* Points to a parse structure for the
* command created by Tcl_ParseCommand. */
CompileEnv *envPtr; /* Holds resulting instructions. */
{
Tcl_Token *opTokenPtr, *varTokenPtr;
Tcl_Obj *opObj;
int index;
int code;
static CONST char *options[] = {
"bytelength", "compare", "equal", "first",
"index", "is", "last", "length",
"map", "match", "range", "repeat",
"replace", "tolower", "toupper", "totitle",
"trim", "trimleft", "trimright",
"wordend", "wordstart", (char *) NULL
};
enum options {
STR_BYTELENGTH, STR_COMPARE, STR_EQUAL, STR_FIRST,
STR_INDEX, STR_IS, STR_LAST, STR_LENGTH,
STR_MAP, STR_MATCH, STR_RANGE, STR_REPEAT,
STR_REPLACE, STR_TOLOWER, STR_TOUPPER, STR_TOTITLE,
STR_TRIM, STR_TRIMLEFT, STR_TRIMRIGHT,
STR_WORDEND, STR_WORDSTART
};
if (parsePtr->numWords < 2) {
/* Fail at run time, not in compilation */
return TCL_OUT_LINE_COMPILE;
}
opTokenPtr = parsePtr->tokenPtr
+ (parsePtr->tokenPtr->numComponents + 1);
opObj = Tcl_NewStringObj(opTokenPtr->start, opTokenPtr->size);
if (Tcl_GetIndexFromObj(interp, opObj, options, "option", 0,
&index) != TCL_OK) {
Tcl_DecrRefCount(opObj);
Tcl_ResetResult(interp);
return TCL_OUT_LINE_COMPILE;
}
Tcl_DecrRefCount(opObj);
varTokenPtr = opTokenPtr + (opTokenPtr->numComponents + 1);
switch ((enum options) index) {
case STR_BYTELENGTH:
case STR_FIRST:
case STR_IS:
case STR_LAST:
case STR_MAP:
case STR_RANGE:
|
| ︙ | ︙ | |||
2329 2330 2331 2332 2333 2334 2335 |
/*
* All other cases: compile out of line.
*/
return TCL_OUT_LINE_COMPILE;
case STR_COMPARE:
case STR_EQUAL: {
| | < < < < < | | < | < < < < < | < | | 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 |
/*
* All other cases: compile out of line.
*/
return TCL_OUT_LINE_COMPILE;
case STR_COMPARE:
case STR_EQUAL: {
int i;
/*
* If there are any flags to the command, we can't byte compile it
* because the INST_STR_EQ bytecode doesn't support flags.
*/
if (parsePtr->numWords != 4) {
return TCL_OUT_LINE_COMPILE;
}
/*
* Push the two operands onto the stack.
*/
for (i = 0; i < 2; i++) {
if (varTokenPtr->type == TCL_TOKEN_SIMPLE_WORD) {
TclEmitPush(TclRegisterLiteral(envPtr,
varTokenPtr[1].start, varTokenPtr[1].size,
0), envPtr);
} else {
code = TclCompileTokens(interp, varTokenPtr+1,
varTokenPtr->numComponents, envPtr);
if (code != TCL_OK) {
return code;
}
}
varTokenPtr = varTokenPtr + (varTokenPtr->numComponents + 1);
}
TclEmitOpcode(((((enum options) index) == STR_COMPARE) ?
INST_STR_CMP : INST_STR_EQ), envPtr);
return TCL_OK;
}
case STR_INDEX: {
int i;
if (parsePtr->numWords != 4) {
/* Fail at run time, not in compilation */
return TCL_OUT_LINE_COMPILE;
}
/*
* Push the two operands onto the stack.
*/
for (i = 0; i < 2; i++) {
if (varTokenPtr->type == TCL_TOKEN_SIMPLE_WORD) {
TclEmitPush(TclRegisterLiteral(envPtr,
varTokenPtr[1].start, varTokenPtr[1].size,
0), envPtr);
} else {
code = TclCompileTokens(interp, varTokenPtr+1,
varTokenPtr->numComponents, envPtr);
if (code != TCL_OK) {
return code;
}
}
varTokenPtr = varTokenPtr + (varTokenPtr->numComponents + 1);
}
TclEmitOpcode(INST_STR_INDEX, envPtr);
return TCL_OK;
}
case STR_LENGTH: {
if (parsePtr->numWords != 3) {
/* Fail at run time, not in compilation */
return TCL_OUT_LINE_COMPILE;
}
if (varTokenPtr->type == TCL_TOKEN_SIMPLE_WORD) {
/*
* Here someone is asking for the length of a static string.
* Just push the actual character (not byte) length.
*/
|
| ︙ | ︙ | |||
2432 2433 2434 2435 2436 2437 2438 |
return code;
}
}
TclEmitOpcode(INST_STR_LEN, envPtr);
return TCL_OK;
}
case STR_MATCH: {
| | | < < | > | | 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 |
return code;
}
}
TclEmitOpcode(INST_STR_LEN, envPtr);
return TCL_OK;
}
case STR_MATCH: {
int i, length, exactMatch = 0, nocase = 0;
char c, *str;
if (parsePtr->numWords < 4 || parsePtr->numWords > 5) {
/* Fail at run time, not in compilation */
return TCL_OUT_LINE_COMPILE;
}
if (parsePtr->numWords == 5) {
if (varTokenPtr->type != TCL_TOKEN_SIMPLE_WORD) {
return TCL_OUT_LINE_COMPILE;
}
str = varTokenPtr[1].start;
length = varTokenPtr[1].size;
if ((length > 1) &&
strncmp(str, "-nocase", (size_t) length) == 0) {
nocase = 1;
} else {
c = str[length];
str[length] = '\0';
Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),
"bad option \"", str, "\": must be -nocase",
(char *) NULL);
str[length] = c;
/* Fail at run time, not in compilation */
return TCL_OUT_LINE_COMPILE;
}
varTokenPtr = varTokenPtr + (varTokenPtr->numComponents + 1);
}
for (i = 0; i < 2; i++) {
if (varTokenPtr->type == TCL_TOKEN_SIMPLE_WORD) {
str = varTokenPtr[1].start;
|
| ︙ | ︙ | |||
2484 2485 2486 2487 2488 2489 2490 | c = str[length]; str[length] = '\0'; exactMatch = (strpbrk(str, "*[]?\\") == NULL); str[length] = c; } TclEmitPush(TclRegisterLiteral(envPtr, str, length, 0), envPtr); | < < < | 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 |
c = str[length];
str[length] = '\0';
exactMatch = (strpbrk(str, "*[]?\\") == NULL);
str[length] = c;
}
TclEmitPush(TclRegisterLiteral(envPtr, str, length,
0), envPtr);
} else {
code = TclCompileTokens(interp, varTokenPtr+1,
varTokenPtr->numComponents, envPtr);
if (code != TCL_OK) {
return code;
}
}
varTokenPtr = varTokenPtr + (varTokenPtr->numComponents + 1);
}
if (exactMatch) {
TclEmitOpcode(INST_STR_EQ, envPtr);
} else {
TclEmitInstInt1(INST_STR_MATCH, nocase, envPtr);
}
return TCL_OK;
}
}
return TCL_OK;
}
|
| ︙ | ︙ | |||
2525 2526 2527 2528 2529 2530 2531 | * compilation was successful. If an error occurs then the * interpreter's result contains a standard error message and TCL_ERROR * is returned. If compilation failed because the command is too * complex for TclCompileWhileCmd, TCL_OUT_LINE_COMPILE is returned * indicating that the while command should be compiled "out of line" * by emitting code to invoke its command procedure at runtime. * | < < < | > < < | 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 |
* compilation was successful. If an error occurs then the
* interpreter's result contains a standard error message and TCL_ERROR
* is returned. If compilation failed because the command is too
* complex for TclCompileWhileCmd, TCL_OUT_LINE_COMPILE is returned
* indicating that the while command should be compiled "out of line"
* by emitting code to invoke its command procedure at runtime.
*
* Side effects:
* Instructions are added to envPtr to execute the "while" command
* at runtime.
*
*----------------------------------------------------------------------
*/
int
TclCompileWhileCmd(interp, parsePtr, envPtr)
Tcl_Interp *interp; /* Used for error reporting. */
Tcl_Parse *parsePtr; /* Points to a parse structure for the
* command created by Tcl_ParseCommand. */
CompileEnv *envPtr; /* Holds resulting instructions. */
{
Tcl_Token *testTokenPtr, *bodyTokenPtr;
JumpFixup jumpFalseFixup;
unsigned char *jumpPc;
int testCodeOffset, jumpDist, jumpBackDist, jumpBackOffset;
int range, code;
char buffer[32 + TCL_INTEGER_SPACE];
int savedStackDepth = envPtr->currStackDepth;
if (parsePtr->numWords != 3) {
Tcl_ResetResult(interp);
Tcl_AppendToObj(Tcl_GetObjResult(interp),
"wrong # args: should be \"while test command\"", -1);
return TCL_ERROR;
}
|
| ︙ | ︙ | |||
2602 2603 2604 2605 2606 2607 2608 |
if (code != TCL_OK) {
if (code == TCL_ERROR) {
Tcl_AddObjErrorInfo(interp,
"\n (\"while\" test expression)", -1);
}
goto error;
}
| < > > < | 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 |
if (code != TCL_OK) {
if (code == TCL_ERROR) {
Tcl_AddObjErrorInfo(interp,
"\n (\"while\" test expression)", -1);
}
goto error;
}
TclEmitForwardJump(envPtr, TCL_FALSE_JUMP, &jumpFalseFixup);
/*
* Compile the loop body.
*/
envPtr->currStackDepth = savedStackDepth;
bodyTokenPtr = testTokenPtr + (testTokenPtr->numComponents + 1);
envPtr->exceptArrayPtr[range].codeOffset =
(envPtr->codeNext - envPtr->codeStart);
code = TclCompileCmdWord(interp, bodyTokenPtr+1,
bodyTokenPtr->numComponents, envPtr);
envPtr->currStackDepth = savedStackDepth + 1;
if (code != TCL_OK) {
if (code == TCL_ERROR) {
sprintf(buffer, "\n (\"while\" body line %d)",
interp->errorLine);
Tcl_AddObjErrorInfo(interp, buffer, -1);
}
goto error;
}
envPtr->exceptArrayPtr[range].numCodeBytes =
(envPtr->codeNext - envPtr->codeStart)
- envPtr->exceptArrayPtr[range].codeOffset;
TclEmitOpcode(INST_POP, envPtr);
/*
* Jump back to the test at the top of the loop. Generate a 4 byte jump
|
| ︙ | ︙ | |||
2682 2683 2684 2685 2686 2687 2688 2689 |
envPtr->exceptArrayPtr[range].breakOffset =
(envPtr->codeNext - envPtr->codeStart);
/*
* The while command's result is an empty string.
*/
TclEmitPush(TclRegisterLiteral(envPtr, "", 0, /*onHeap*/ 0), envPtr);
| > < < < < < < < < | < < < | 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 |
envPtr->exceptArrayPtr[range].breakOffset =
(envPtr->codeNext - envPtr->codeStart);
/*
* The while command's result is an empty string.
*/
envPtr->currStackDepth = savedStackDepth;
TclEmitPush(TclRegisterLiteral(envPtr, "", 0, /*onHeap*/ 0), envPtr);
envPtr->exceptDepth--;
return TCL_OK;
error:
envPtr->exceptDepth--;
return code;
}
/*
*----------------------------------------------------------------------
*
* TclPushVarName --
*
* Procedure used in the compiling where pushing a variable name
* is necessary (append, lappend, set).
*
* Results:
* The return value is a standard Tcl result, which is normally TCL_OK
* unless there was an error while parsing string. If an error occurs
* then the interpreter's result contains a standard error message.
*
* Side effects:
* Instructions are added to envPtr to execute the "set" command
* at runtime.
*
*----------------------------------------------------------------------
*/
static int
TclPushVarName(interp, varTokenPtr, envPtr, flags, localIndexPtr,
simpleVarNamePtr, isScalarPtr)
Tcl_Interp *interp; /* Used for error reporting. */
Tcl_Token *varTokenPtr; /* Points to a variable token. */
CompileEnv *envPtr; /* Holds resulting instructions. */
int flags; /* takes TCL_CREATE_VAR or
* TCL_LARGE_INDEX_OK */
int *localIndexPtr; /* must not be NULL */
int *simpleVarNamePtr; /* must not be NULL */
int *isScalarPtr; /* must not be NULL */
{
Tcl_Parse elemParse;
int gotElemParse = 0;
register char *p;
char *name, *elName;
register int i, n;
int nameChars, elNameChars, simpleVarName, localIndex;
int code = TCL_OK;
/*
* Decide if we can use a frame slot for the var/array name or if we
* need to emit code to compute and push the name at runtime. We use a
* frame slot (entry in the array of local vars) if we are compiling a
* procedure body and if the name is simple text that does not include
|
| ︙ | ︙ | |||
2866 2867 2868 2869 2870 2871 2872 |
/* we'll push the name */
localIndex = -1;
}
}
if (localIndex < 0) {
TclEmitPush(TclRegisterLiteral(envPtr, name, nameChars,
/*onHeap*/ 0), envPtr);
| < | 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 |
/* we'll push the name */
localIndex = -1;
}
}
if (localIndex < 0) {
TclEmitPush(TclRegisterLiteral(envPtr, name, nameChars,
/*onHeap*/ 0), envPtr);
}
/*
* Compile the element script, if any.
*/
if (elName != NULL) {
|
| ︙ | ︙ | |||
2898 2899 2900 2901 2902 2903 2904 |
goto done;
} else if (elemParse.numWords == 1) {
code = TclCompileTokens(interp, elemParse.tokenPtr+1,
elemParse.tokenPtr->numComponents, envPtr);
if (code != TCL_OK) {
goto done;
}
| < < < < | 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 |
goto done;
} else if (elemParse.numWords == 1) {
code = TclCompileTokens(interp, elemParse.tokenPtr+1,
elemParse.tokenPtr->numComponents, envPtr);
if (code != TCL_OK) {
goto done;
}
} else {
TclEmitPush(TclRegisterLiteral(envPtr, "", 0,
/*alreadyAlloced*/ 0), envPtr);
}
}
} else {
/*
* The var name isn't simple: compile and push it.
*/
code = TclCompileTokens(interp, varTokenPtr+1,
varTokenPtr->numComponents, envPtr);
if (code != TCL_OK) {
goto done;
}
}
done:
if (gotElemParse) {
Tcl_FreeParse(&elemParse);
}
*localIndexPtr = localIndex;
*simpleVarNamePtr = simpleVarName;
*isScalarPtr = (elName == NULL);
return code;
}
|
Changes to generic/tclCompExpr.c.
1 2 3 4 5 6 7 8 9 10 11 | /* * tclCompExpr.c -- * * This file contains the code to compile Tcl expressions. * * Copyright (c) 1997 Sun Microsystems, Inc. * Copyright (c) 1998-2000 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | /* * tclCompExpr.c -- * * This file contains the code to compile Tcl expressions. * * Copyright (c) 1997 Sun Microsystems, Inc. * Copyright (c) 1998-2000 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclCompExpr.c,v 1.6.14.1 2002/02/05 02:21:58 wolfsuit Exp $ */ #include "tclInt.h" #include "tclCompile.h" /* * The stuff below is a bit of a hack so that this file can be used in |
| ︙ | ︙ | |||
202 203 204 205 206 207 208 | * Tcl_ExprDouble, Tcl_ExprBoolean, and Tcl_ExprBooleanObj. * * Results: * The return value is TCL_OK on a successful compilation and TCL_ERROR * on failure. If TCL_ERROR is returned, then the interpreter's result * contains an error message. * | < < < | 202 203 204 205 206 207 208 209 210 211 212 213 214 215 | * Tcl_ExprDouble, Tcl_ExprBoolean, and Tcl_ExprBooleanObj. * * Results: * The return value is TCL_OK on a successful compilation and TCL_ERROR * on failure. If TCL_ERROR is returned, then the interpreter's result * contains an error message. * * envPtr->exprIsJustVarRef is set 1 if the expression consisted of * a single variable reference as in the expression of "if $b then...". * Otherwise it is set 0. This is used to implement Tcl's two level * expression substitution semantics properly. * * envPtr->exprIsComparison is set 1 if the top-level operator in the * expr is a comparison. Otherwise it is set 0. If 1, because the |
| ︙ | ︙ | |||
233 234 235 236 237 238 239 |
* string consists of all bytes up to the
* first null character. */
CompileEnv *envPtr; /* Holds resulting instructions. */
{
ExprInfo info;
Tcl_Parse parse;
Tcl_HashEntry *hPtr;
| | | 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 |
* string consists of all bytes up to the
* first null character. */
CompileEnv *envPtr; /* Holds resulting instructions. */
{
ExprInfo info;
Tcl_Parse parse;
Tcl_HashEntry *hPtr;
int new, i, code;
/*
* If this is the first time we've been called, initialize the table
* of expression operators.
*/
if (numBytes < 0) {
|
| ︙ | ︙ | |||
276 277 278 279 280 281 282 |
info.exprIsJustVarRef = 1; /* will be set 0 if anything else is seen */
info.exprIsComparison = 0;
/*
* Parse the expression then compile it.
*/
| < < < | 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 |
info.exprIsJustVarRef = 1; /* will be set 0 if anything else is seen */
info.exprIsComparison = 0;
/*
* Parse the expression then compile it.
*/
code = Tcl_ParseExpr(interp, script, numBytes, &parse);
if (code != TCL_OK) {
goto done;
}
code = CompileSubExpr(parse.tokenPtr, &info, envPtr);
if (code != TCL_OK) {
Tcl_FreeParse(&parse);
goto done;
}
if (!info.hasOperators) {
/*
* Attempt to convert the primary's object to an int or double.
* This is done in order to support Tcl's policy of interpreting
* operands if at all possible as first integers, else
* floating-point numbers.
*/
TclEmitOpcode(INST_TRY_CVT_TO_NUMERIC, envPtr);
}
Tcl_FreeParse(&parse);
done:
envPtr->exprIsJustVarRef = info.exprIsJustVarRef;
envPtr->exprIsComparison = info.exprIsComparison;
return code;
}
/*
*----------------------------------------------------------------------
|
| ︙ | ︙ | |||
353 354 355 356 357 358 359 | * subexpression at runtime. * * Results: * The return value is TCL_OK on a successful compilation and TCL_ERROR * on failure. If TCL_ERROR is returned, then the interpreter's result * contains an error message. * | < < < | 347 348 349 350 351 352 353 354 355 356 357 358 359 360 | * subexpression at runtime. * * Results: * The return value is TCL_OK on a successful compilation and TCL_ERROR * on failure. If TCL_ERROR is returned, then the interpreter's result * contains an error message. * * envPtr->exprIsJustVarRef is set 1 if the subexpression consisted of * a single variable reference as in the expression of "if $b then...". * Otherwise it is set 0. This is used to implement Tcl's two level * expression substitution semantics properly. * * envPtr->exprIsComparison is set 1 if the top-level operator in the * subexpression is a comparison. Otherwise it is set 0. If 1, because |
| ︙ | ︙ | |||
386 387 388 389 390 391 392 |
{
Tcl_Interp *interp = infoPtr->interp;
Tcl_Token *tokenPtr, *endPtr, *afterSubexprPtr;
OperatorDesc *opDescPtr;
Tcl_HashEntry *hPtr;
char *operator;
char savedChar;
| | < < < < < < < | 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 |
{
Tcl_Interp *interp = infoPtr->interp;
Tcl_Token *tokenPtr, *endPtr, *afterSubexprPtr;
OperatorDesc *opDescPtr;
Tcl_HashEntry *hPtr;
char *operator;
char savedChar;
int objIndex, opIndex, length, code;
char buffer[TCL_UTF_MAX];
if (exprTokenPtr->type != TCL_TOKEN_SUB_EXPR) {
panic("CompileSubExpr: token type %d not TCL_TOKEN_SUB_EXPR\n",
exprTokenPtr->type);
}
code = TCL_OK;
/*
* Switch on the type of the first token after the subexpression token.
* After processing it, advance tokenPtr to point just after the
* subexpression's last token.
*/
tokenPtr = exprTokenPtr+1;
TRACE(exprTokenPtr->start, exprTokenPtr->size,
tokenPtr->start, tokenPtr->size);
switch (tokenPtr->type) {
case TCL_TOKEN_WORD:
code = TclCompileTokens(interp, tokenPtr+1,
tokenPtr->numComponents, envPtr);
if (code != TCL_OK) {
goto done;
}
tokenPtr += (tokenPtr->numComponents + 1);
infoPtr->exprIsJustVarRef = 0;
break;
case TCL_TOKEN_TEXT:
if (tokenPtr->size > 0) {
objIndex = TclRegisterLiteral(envPtr, tokenPtr->start,
tokenPtr->size, /*onHeap*/ 0);
} else {
objIndex = TclRegisterLiteral(envPtr, "", 0, /*onHeap*/ 0);
}
TclEmitPush(objIndex, envPtr);
tokenPtr += 1;
infoPtr->exprIsJustVarRef = 0;
break;
case TCL_TOKEN_BS:
length = Tcl_UtfBackslash(tokenPtr->start, (int *) NULL,
buffer);
if (length > 0) {
objIndex = TclRegisterLiteral(envPtr, buffer, length,
/*onHeap*/ 0);
} else {
objIndex = TclRegisterLiteral(envPtr, "", 0, /*onHeap*/ 0);
}
TclEmitPush(objIndex, envPtr);
tokenPtr += 1;
infoPtr->exprIsJustVarRef = 0;
break;
case TCL_TOKEN_COMMAND:
code = TclCompileScript(interp, tokenPtr->start+1,
tokenPtr->size-2, /*nested*/ 1, envPtr);
if (code != TCL_OK) {
goto done;
}
tokenPtr += 1;
infoPtr->exprIsJustVarRef = 0;
break;
case TCL_TOKEN_VARIABLE:
code = TclCompileTokens(interp, tokenPtr, 1, envPtr);
if (code != TCL_OK) {
goto done;
}
tokenPtr += (tokenPtr->numComponents + 1);
break;
case TCL_TOKEN_SUB_EXPR:
infoPtr->exprIsComparison = 0;
code = CompileSubExpr(tokenPtr, infoPtr, envPtr);
if (code != TCL_OK) {
goto done;
}
tokenPtr += (tokenPtr->numComponents + 1);
break;
case TCL_TOKEN_OPERATOR:
/*
* Look up the operator. Temporarily overwrite the character
* just after the end of the operator with a 0 byte. If the
|
| ︙ | ︙ | |||
500 501 502 503 504 505 506 |
if (hPtr == NULL) {
code = CompileMathFuncCall(exprTokenPtr, operator, infoPtr,
envPtr, &endPtr);
operator[tokenPtr->size] = (char) savedChar;
if (code != TCL_OK) {
goto done;
}
| < < < < | 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 |
if (hPtr == NULL) {
code = CompileMathFuncCall(exprTokenPtr, operator, infoPtr,
envPtr, &endPtr);
operator[tokenPtr->size] = (char) savedChar;
if (code != TCL_OK) {
goto done;
}
tokenPtr = endPtr;
infoPtr->exprIsJustVarRef = 0;
infoPtr->exprIsComparison = 0;
break;
}
operator[tokenPtr->size] = (char) savedChar;
opIndex = (int) Tcl_GetHashValue(hPtr);
opDescPtr = &(operatorTable[opIndex]);
/*
* If the operator is "normal", compile it using information
* from the operator table.
*/
if (opDescPtr->numOperands > 0) {
tokenPtr++;
code = CompileSubExpr(tokenPtr, infoPtr, envPtr);
if (code != TCL_OK) {
goto done;
}
tokenPtr += (tokenPtr->numComponents + 1);
if (opDescPtr->numOperands == 2) {
code = CompileSubExpr(tokenPtr, infoPtr, envPtr);
if (code != TCL_OK) {
goto done;
}
tokenPtr += (tokenPtr->numComponents + 1);
}
TclEmitOpcode(opDescPtr->instruction, envPtr);
infoPtr->hasOperators = 1;
infoPtr->exprIsJustVarRef = 0;
infoPtr->exprIsComparison =
(((opIndex >= OP_LESS) && (opIndex <= OP_NEQ))
|
| ︙ | ︙ | |||
555 556 557 558 559 560 561 |
case OP_PLUS:
case OP_MINUS:
tokenPtr++;
code = CompileSubExpr(tokenPtr, infoPtr, envPtr);
if (code != TCL_OK) {
goto done;
}
| < | 535 536 537 538 539 540 541 542 543 544 545 546 547 548 |
case OP_PLUS:
case OP_MINUS:
tokenPtr++;
code = CompileSubExpr(tokenPtr, infoPtr, envPtr);
if (code != TCL_OK) {
goto done;
}
tokenPtr += (tokenPtr->numComponents + 1);
/*
* Check whether the "+" or "-" is unary.
*/
afterSubexprPtr = exprTokenPtr
|
| ︙ | ︙ | |||
579 580 581 582 583 584 585 |
* The "+" or "-" is binary.
*/
code = CompileSubExpr(tokenPtr, infoPtr, envPtr);
if (code != TCL_OK) {
goto done;
}
| < < < < | 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 |
* The "+" or "-" is binary.
*/
code = CompileSubExpr(tokenPtr, infoPtr, envPtr);
if (code != TCL_OK) {
goto done;
}
tokenPtr += (tokenPtr->numComponents + 1);
TclEmitOpcode(((opIndex==OP_PLUS)? INST_ADD : INST_SUB),
envPtr);
break;
case OP_LAND:
case OP_LOR:
code = CompileLandOrLorExpr(exprTokenPtr, opIndex,
infoPtr, envPtr, &endPtr);
if (code != TCL_OK) {
goto done;
}
tokenPtr = endPtr;
break;
case OP_QUESTY:
code = CompileCondExpr(exprTokenPtr, infoPtr,
envPtr, &endPtr);
if (code != TCL_OK) {
goto done;
}
tokenPtr = endPtr;
break;
default:
panic("CompileSubExpr: unexpected operator %d requiring special treatment\n",
opIndex);
} /* end switch on operator requiring special treatment */
|
| ︙ | ︙ | |||
634 635 636 637 638 639 640 |
if (tokenPtr != (exprTokenPtr + exprTokenPtr->numComponents+1)) {
LogSyntaxError(infoPtr);
code = TCL_ERROR;
}
done:
| < < < < | 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 |
if (tokenPtr != (exprTokenPtr + exprTokenPtr->numComponents+1)) {
LogSyntaxError(infoPtr);
code = TCL_ERROR;
}
done:
return code;
}
/*
*----------------------------------------------------------------------
*
* CompileLandOrLorExpr --
*
* This procedure compiles a Tcl logical and ("&&") or logical or
* ("||") subexpression.
*
* Results:
* The return value is TCL_OK on a successful compilation and TCL_ERROR
* on failure. If TCL_OK is returned, a pointer to the token just after
* the last one in the subexpression is stored at the address in
* endPtrPtr. If TCL_ERROR is returned, then the interpreter's result
* contains an error message.
*
* Side effects:
* Adds instructions to envPtr to evaluate the expression at runtime.
*
*----------------------------------------------------------------------
*/
static int
|
| ︙ | ︙ | |||
681 682 683 684 685 686 687 |
{
JumpFixup shortCircuitFixup; /* Used to fix up the short circuit jump
* after the first subexpression. */
JumpFixup lhsTrueFixup, lhsEndFixup;
/* Used to fix up jumps used to convert the
* first operand to 0 or 1. */
Tcl_Token *tokenPtr;
| | > < < > | 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 |
{
JumpFixup shortCircuitFixup; /* Used to fix up the short circuit jump
* after the first subexpression. */
JumpFixup lhsTrueFixup, lhsEndFixup;
/* Used to fix up jumps used to convert the
* first operand to 0 or 1. */
Tcl_Token *tokenPtr;
int dist, code;
int savedStackDepth = envPtr->currStackDepth;
/*
* Emit code for the first operand.
*/
tokenPtr = exprTokenPtr+2;
code = CompileSubExpr(tokenPtr, infoPtr, envPtr);
if (code != TCL_OK) {
goto done;
}
tokenPtr += (tokenPtr->numComponents + 1);
/*
* Convert the first operand to the result that Tcl requires:
* "0" or "1". Eventually we'll use a new instruction for this.
*/
TclEmitForwardJump(envPtr, TCL_TRUE_JUMP, &lhsTrueFixup);
TclEmitPush(TclRegisterLiteral(envPtr, "0", 1, /*onHeap*/ 0), envPtr);
TclEmitForwardJump(envPtr, TCL_UNCONDITIONAL_JUMP, &lhsEndFixup);
dist = (envPtr->codeNext - envPtr->codeStart) - lhsTrueFixup.codeOffset;
if (TclFixupForwardJump(envPtr, &lhsTrueFixup, dist, 127)) {
badDist:
panic("CompileLandOrLorExpr: bad jump distance %d\n", dist);
}
envPtr->currStackDepth = savedStackDepth;
TclEmitPush(TclRegisterLiteral(envPtr, "1", 1, /*onHeap*/ 0), envPtr);
dist = (envPtr->codeNext - envPtr->codeStart) - lhsEndFixup.codeOffset;
if (TclFixupForwardJump(envPtr, &lhsEndFixup, dist, 127)) {
goto badDist;
}
/*
|
| ︙ | ︙ | |||
734 735 736 737 738 739 740 |
* Emit code for the second operand.
*/
code = CompileSubExpr(tokenPtr, infoPtr, envPtr);
if (code != TCL_OK) {
goto done;
}
| < | 705 706 707 708 709 710 711 712 713 714 715 716 717 718 |
* Emit code for the second operand.
*/
code = CompileSubExpr(tokenPtr, infoPtr, envPtr);
if (code != TCL_OK) {
goto done;
}
tokenPtr += (tokenPtr->numComponents + 1);
/*
* Emit a "logical and" or "logical or" instruction. This does not try
* to "short- circuit" the evaluation of both operands, but instead
* ensures that we either have a "1" or a "0" result.
*/
|
| ︙ | ︙ | |||
756 757 758 759 760 761 762 |
dist = (envPtr->codeNext - envPtr->codeStart)
- shortCircuitFixup.codeOffset;
TclFixupForwardJump(envPtr, &shortCircuitFixup, dist, 127);
*endPtrPtr = tokenPtr;
done:
| | < < < | 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 |
dist = (envPtr->codeNext - envPtr->codeStart)
- shortCircuitFixup.codeOffset;
TclFixupForwardJump(envPtr, &shortCircuitFixup, dist, 127);
*endPtrPtr = tokenPtr;
done:
envPtr->currStackDepth = savedStackDepth + 1;
return code;
}
/*
*----------------------------------------------------------------------
*
* CompileCondExpr --
*
* This procedure compiles a Tcl conditional expression:
* condExpr ::= lorExpr ['?' condExpr ':' condExpr]
*
* Results:
* The return value is TCL_OK on a successful compilation and TCL_ERROR
* on failure. If TCL_OK is returned, a pointer to the token just after
* the last one in the subexpression is stored at the address in
* endPtrPtr. If TCL_ERROR is returned, then the interpreter's result
* contains an error message.
*
* Side effects:
* Adds instructions to envPtr to evaluate the expression at runtime.
*
*----------------------------------------------------------------------
*/
static int
|
| ︙ | ︙ | |||
800 801 802 803 804 805 806 |
* subexpression is stored here. */
{
JumpFixup jumpAroundThenFixup, jumpAroundElseFixup;
/* Used to update or replace one-byte jumps
* around the then and else expressions when
* their target PCs are determined. */
Tcl_Token *tokenPtr;
| | > < < < > < | 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 |
* subexpression is stored here. */
{
JumpFixup jumpAroundThenFixup, jumpAroundElseFixup;
/* Used to update or replace one-byte jumps
* around the then and else expressions when
* their target PCs are determined. */
Tcl_Token *tokenPtr;
int elseCodeOffset, dist, code;
int savedStackDepth = envPtr->currStackDepth;
/*
* Emit code for the test.
*/
tokenPtr = exprTokenPtr+2;
code = CompileSubExpr(tokenPtr, infoPtr, envPtr);
if (code != TCL_OK) {
goto done;
}
tokenPtr += (tokenPtr->numComponents + 1);
/*
* Emit the jump to the "else" expression if the test was false.
*/
TclEmitForwardJump(envPtr, TCL_FALSE_JUMP, &jumpAroundThenFixup);
/*
* Compile the "then" expression. Note that if a subexpression is only
* a primary, we need to try to convert it to numeric. We do this to
* support Tcl's policy of interpreting operands if at all possible as
* first integers, else floating-point numbers.
*/
infoPtr->hasOperators = 0;
code = CompileSubExpr(tokenPtr, infoPtr, envPtr);
if (code != TCL_OK) {
goto done;
}
tokenPtr += (tokenPtr->numComponents + 1);
if (!infoPtr->hasOperators) {
TclEmitOpcode(INST_TRY_CVT_TO_NUMERIC, envPtr);
}
/*
* Emit an unconditional jump around the "else" condExpr.
*/
TclEmitForwardJump(envPtr, TCL_UNCONDITIONAL_JUMP,
&jumpAroundElseFixup);
/*
* Compile the "else" expression.
*/
envPtr->currStackDepth = savedStackDepth;
elseCodeOffset = (envPtr->codeNext - envPtr->codeStart);
infoPtr->hasOperators = 0;
code = CompileSubExpr(tokenPtr, infoPtr, envPtr);
if (code != TCL_OK) {
goto done;
}
tokenPtr += (tokenPtr->numComponents + 1);
if (!infoPtr->hasOperators) {
TclEmitOpcode(INST_TRY_CVT_TO_NUMERIC, envPtr);
}
/*
* Fix up the second jump around the "else" expression.
|
| ︙ | ︙ | |||
886 887 888 889 890 891 892 |
*/
dist = (elseCodeOffset - jumpAroundThenFixup.codeOffset);
TclFixupForwardJump(envPtr, &jumpAroundThenFixup, dist, 127);
*endPtrPtr = tokenPtr;
done:
| | < < < | 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 |
*/
dist = (elseCodeOffset - jumpAroundThenFixup.codeOffset);
TclFixupForwardJump(envPtr, &jumpAroundThenFixup, dist, 127);
*endPtrPtr = tokenPtr;
done:
envPtr->currStackDepth = savedStackDepth + 1;
return code;
}
/*
*----------------------------------------------------------------------
*
* CompileMathFuncCall --
*
* This procedure compiles a call on a math function in an expression:
* mathFuncCall ::= funcName '(' [condExpr {',' condExpr}] ')'
*
* Results:
* The return value is TCL_OK on a successful compilation and TCL_ERROR
* on failure. If TCL_OK is returned, a pointer to the token just after
* the last one in the subexpression is stored at the address in
* endPtrPtr. If TCL_ERROR is returned, then the interpreter's result
* contains an error message.
*
* Side effects:
* Adds instructions to envPtr to evaluate the math function at
* runtime.
*
*----------------------------------------------------------------------
*/
|
| ︙ | ︙ | |||
932 933 934 935 936 937 938 |
* subexpression is stored here. */
{
Tcl_Interp *interp = infoPtr->interp;
Interp *iPtr = (Interp *) interp;
MathFunc *mathFuncPtr;
Tcl_HashEntry *hPtr;
Tcl_Token *tokenPtr, *afterSubexprPtr;
| | < < | 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 |
* subexpression is stored here. */
{
Tcl_Interp *interp = infoPtr->interp;
Interp *iPtr = (Interp *) interp;
MathFunc *mathFuncPtr;
Tcl_HashEntry *hPtr;
Tcl_Token *tokenPtr, *afterSubexprPtr;
int code, i;
/*
* Look up the MathFunc record for the function.
*/
code = TCL_OK;
hPtr = Tcl_FindHashEntry(&iPtr->mathFuncTable, funcName);
if (hPtr == NULL) {
Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),
"unknown math function \"", funcName, "\"", (char *) NULL);
code = TCL_ERROR;
goto done;
}
mathFuncPtr = (MathFunc *) Tcl_GetHashValue(hPtr);
/*
* If not a builtin function, push an object with the function's name.
*/
if (mathFuncPtr->builtinFuncIndex < 0) {
TclEmitPush(TclRegisterLiteral(envPtr, funcName, -1, /*onHeap*/ 0),
envPtr);
}
/*
* Compile any arguments for the function.
*/
tokenPtr = exprTokenPtr+2;
|
| ︙ | ︙ | |||
980 981 982 983 984 985 986 |
}
infoPtr->exprIsComparison = 0;
code = CompileSubExpr(tokenPtr, infoPtr, envPtr);
if (code != TCL_OK) {
goto done;
}
tokenPtr += (tokenPtr->numComponents + 1);
| < | 940 941 942 943 944 945 946 947 948 949 950 951 952 953 |
}
infoPtr->exprIsComparison = 0;
code = CompileSubExpr(tokenPtr, infoPtr, envPtr);
if (code != TCL_OK) {
goto done;
}
tokenPtr += (tokenPtr->numComponents + 1);
}
if (tokenPtr != afterSubexprPtr) {
Tcl_ResetResult(interp);
Tcl_AppendToObj(Tcl_GetObjResult(interp),
"too many arguments for math function", -1);
code = TCL_ERROR;
goto done;
|
| ︙ | ︙ | |||
1004 1005 1006 1007 1008 1009 1010 |
/*
* Compile the call on the math function. Note that the "objc" argument
* count for non-builtin functions is incremented by 1 to include the
* function name itself.
*/
if (mathFuncPtr->builtinFuncIndex >= 0) { /* a builtin function */
| > > > > > > > > > > | > < | 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 |
/*
* Compile the call on the math function. Note that the "objc" argument
* count for non-builtin functions is incremented by 1 to include the
* function name itself.
*/
if (mathFuncPtr->builtinFuncIndex >= 0) { /* a builtin function */
/*
* Adjust the current stack depth by the number of arguments
* of the builtin function. This cannot be handled by the
* TclEmitInstInt1 macro as the number of arguments is not
* passed as an operand.
*/
if (envPtr->maxStackDepth < envPtr->currStackDepth) {
envPtr->maxStackDepth = envPtr->currStackDepth;
}
TclEmitInstInt1(INST_CALL_BUILTIN_FUNC1,
mathFuncPtr->builtinFuncIndex, envPtr);
envPtr->currStackDepth -= mathFuncPtr->numArgs;
} else {
TclEmitInstInt1(INST_CALL_FUNC1, (mathFuncPtr->numArgs+1), envPtr);
}
*endPtrPtr = afterSubexprPtr;
done:
return code;
}
/*
*----------------------------------------------------------------------
*
* LogSyntaxError --
|
| ︙ | ︙ |
Changes to generic/tclCompile.c.
1 2 3 4 5 6 7 8 9 10 11 12 |
/*
* tclCompile.c --
*
* This file contains procedures that compile Tcl commands or parts
* of commands (like quoted strings or nested sub-commands) into a
* sequence of instructions ("bytecodes").
*
* Copyright (c) 1996-1998 Sun Microsystems, Inc.
*
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
| > | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/*
* tclCompile.c --
*
* This file contains procedures that compile Tcl commands or parts
* of commands (like quoted strings or nested sub-commands) into a
* sequence of instructions ("bytecodes").
*
* Copyright (c) 1996-1998 Sun Microsystems, Inc.
* Copyright (c) 2001 by Kevin B. Kenny. All rights reserved.
*
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
* RCS: @(#) $Id: tclCompile.c,v 1.25.4.1 2002/02/05 02:21:58 wolfsuit Exp $
*/
#include "tclInt.h"
#include "tclCompile.h"
/*
* Table of all AuxData types.
|
| ︙ | ︙ | |||
48 49 50 51 52 53 54 |
*
* Note that the load, store, and incr instructions do not distinguish local
* from global variables; the bytecode interpreter at runtime uses the
* existence of a procedure call frame to distinguish these.
*/
InstructionDesc instructionTable[] = {
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > > > > > > > > | 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 |
*
* Note that the load, store, and incr instructions do not distinguish local
* from global variables; the bytecode interpreter at runtime uses the
* existence of a procedure call frame to distinguish these.
*/
InstructionDesc instructionTable[] = {
/* Name Bytes stackEffect #Opnds Operand types Stack top, next */
{"done", 1, -1, 0, {OPERAND_NONE}},
/* Finish ByteCode execution and return stktop (top stack item) */
{"push1", 2, +1, 1, {OPERAND_UINT1}},
/* Push object at ByteCode objArray[op1] */
{"push4", 5, +1, 1, {OPERAND_UINT4}},
/* Push object at ByteCode objArray[op4] */
{"pop", 1, -1, 0, {OPERAND_NONE}},
/* Pop the topmost stack object */
{"dup", 1, +1, 0, {OPERAND_NONE}},
/* Duplicate the topmost stack object and push the result */
{"concat1", 2, INT_MIN, 1, {OPERAND_UINT1}},
/* Concatenate the top op1 items and push result */
{"invokeStk1", 2, INT_MIN, 1, {OPERAND_UINT1}},
/* Invoke command named objv[0]; <objc,objv> = <op1,top op1> */
{"invokeStk4", 5, INT_MIN, 1, {OPERAND_UINT4}},
/* Invoke command named objv[0]; <objc,objv> = <op4,top op4> */
{"evalStk", 1, 0, 0, {OPERAND_NONE}},
/* Evaluate command in stktop using Tcl_EvalObj. */
{"exprStk", 1, 0, 0, {OPERAND_NONE}},
/* Execute expression in stktop using Tcl_ExprStringObj. */
{"loadScalar1", 2, 1, 1, {OPERAND_UINT1}},
/* Load scalar variable at index op1 <= 255 in call frame */
{"loadScalar4", 5, 1, 1, {OPERAND_UINT4}},
/* Load scalar variable at index op1 >= 256 in call frame */
{"loadScalarStk", 1, 0, 0, {OPERAND_NONE}},
/* Load scalar variable; scalar's name is stktop */
{"loadArray1", 2, 0, 1, {OPERAND_UINT1}},
/* Load array element; array at slot op1<=255, element is stktop */
{"loadArray4", 5, 0, 1, {OPERAND_UINT4}},
/* Load array element; array at slot op1 > 255, element is stktop */
{"loadArrayStk", 1, -1, 0, {OPERAND_NONE}},
/* Load array element; element is stktop, array name is stknext */
{"loadStk", 1, 0, 0, {OPERAND_NONE}},
/* Load general variable; unparsed variable name is stktop */
{"storeScalar1", 2, 0, 1, {OPERAND_UINT1}},
/* Store scalar variable at op1<=255 in frame; value is stktop */
{"storeScalar4", 5, 0, 1, {OPERAND_UINT4}},
/* Store scalar variable at op1 > 255 in frame; value is stktop */
{"storeScalarStk", 1, -1, 0, {OPERAND_NONE}},
/* Store scalar; value is stktop, scalar name is stknext */
{"storeArray1", 2, -1, 1, {OPERAND_UINT1}},
/* Store array element; array at op1<=255, value is top then elem */
{"storeArray4", 5, -1, 1, {OPERAND_UINT4}},
/* Store array element; array at op1>=256, value is top then elem */
{"storeArrayStk", 1, -2, 0, {OPERAND_NONE}},
/* Store array element; value is stktop, then elem, array names */
{"storeStk", 1, -1, 0, {OPERAND_NONE}},
/* Store general variable; value is stktop, then unparsed name */
{"incrScalar1", 2, 0, 1, {OPERAND_UINT1}},
/* Incr scalar at index op1<=255 in frame; incr amount is stktop */
{"incrScalarStk", 1, -1, 0, {OPERAND_NONE}},
/* Incr scalar; incr amount is stktop, scalar's name is stknext */
{"incrArray1", 2, -1, 1, {OPERAND_UINT1}},
/* Incr array elem; arr at slot op1<=255, amount is top then elem */
{"incrArrayStk", 1, -2, 0, {OPERAND_NONE}},
/* Incr array element; amount is top then elem then array names */
{"incrStk", 1, -1, 0, {OPERAND_NONE}},
/* Incr general variable; amount is stktop then unparsed var name */
{"incrScalar1Imm", 3, +1, 2, {OPERAND_UINT1, OPERAND_INT1}},
/* Incr scalar at slot op1 <= 255; amount is 2nd operand byte */
{"incrScalarStkImm", 2, 0, 1, {OPERAND_INT1}},
/* Incr scalar; scalar name is stktop; incr amount is op1 */
{"incrArray1Imm", 3, 0, 2, {OPERAND_UINT1, OPERAND_INT1}},
/* Incr array elem; array at slot op1 <= 255, elem is stktop,
* amount is 2nd operand byte */
{"incrArrayStkImm", 2, -1, 1, {OPERAND_INT1}},
/* Incr array element; elem is top then array name, amount is op1 */
{"incrStkImm", 2, 0, 1, {OPERAND_INT1}},
/* Incr general variable; unparsed name is top, amount is op1 */
{"jump1", 2, 0, 1, {OPERAND_INT1}},
/* Jump relative to (pc + op1) */
{"jump4", 5, 0, 1, {OPERAND_INT4}},
/* Jump relative to (pc + op4) */
{"jumpTrue1", 2, -1, 1, {OPERAND_INT1}},
/* Jump relative to (pc + op1) if stktop expr object is true */
{"jumpTrue4", 5, -1, 1, {OPERAND_INT4}},
/* Jump relative to (pc + op4) if stktop expr object is true */
{"jumpFalse1", 2, -1, 1, {OPERAND_INT1}},
/* Jump relative to (pc + op1) if stktop expr object is false */
{"jumpFalse4", 5, -1, 1, {OPERAND_INT4}},
/* Jump relative to (pc + op4) if stktop expr object is false */
{"lor", 1, -1, 0, {OPERAND_NONE}},
/* Logical or: push (stknext || stktop) */
{"land", 1, -1, 0, {OPERAND_NONE}},
/* Logical and: push (stknext && stktop) */
{"bitor", 1, -1, 0, {OPERAND_NONE}},
/* Bitwise or: push (stknext | stktop) */
{"bitxor", 1, -1, 0, {OPERAND_NONE}},
/* Bitwise xor push (stknext ^ stktop) */
{"bitand", 1, -1, 0, {OPERAND_NONE}},
/* Bitwise and: push (stknext & stktop) */
{"eq", 1, -1, 0, {OPERAND_NONE}},
/* Equal: push (stknext == stktop) */
{"neq", 1, -1, 0, {OPERAND_NONE}},
/* Not equal: push (stknext != stktop) */
{"lt", 1, -1, 0, {OPERAND_NONE}},
/* Less: push (stknext < stktop) */
{"gt", 1, -1, 0, {OPERAND_NONE}},
/* Greater: push (stknext || stktop) */
{"le", 1, -1, 0, {OPERAND_NONE}},
/* Logical or: push (stknext || stktop) */
{"ge", 1, -1, 0, {OPERAND_NONE}},
/* Logical or: push (stknext || stktop) */
{"lshift", 1, -1, 0, {OPERAND_NONE}},
/* Left shift: push (stknext << stktop) */
{"rshift", 1, -1, 0, {OPERAND_NONE}},
/* Right shift: push (stknext >> stktop) */
{"add", 1, -1, 0, {OPERAND_NONE}},
/* Add: push (stknext + stktop) */
{"sub", 1, -1, 0, {OPERAND_NONE}},
/* Sub: push (stkext - stktop) */
{"mult", 1, -1, 0, {OPERAND_NONE}},
/* Multiply: push (stknext * stktop) */
{"div", 1, -1, 0, {OPERAND_NONE}},
/* Divide: push (stknext / stktop) */
{"mod", 1, -1, 0, {OPERAND_NONE}},
/* Mod: push (stknext % stktop) */
{"uplus", 1, 0, 0, {OPERAND_NONE}},
/* Unary plus: push +stktop */
{"uminus", 1, 0, 0, {OPERAND_NONE}},
/* Unary minus: push -stktop */
{"bitnot", 1, 0, 0, {OPERAND_NONE}},
/* Bitwise not: push ~stktop */
{"not", 1, 0, 0, {OPERAND_NONE}},
/* Logical not: push !stktop */
{"callBuiltinFunc1", 2, 1, 1, {OPERAND_UINT1}},
/* Call builtin math function with index op1; any args are on stk */
{"callFunc1", 2, INT_MIN, 1, {OPERAND_UINT1}},
/* Call non-builtin func objv[0]; <objc,objv>=<op1,top op1> */
{"tryCvtToNumeric", 1, 0, 0, {OPERAND_NONE}},
/* Try converting stktop to first int then double if possible. */
{"break", 1, 0, 0, {OPERAND_NONE}},
/* Abort closest enclosing loop; if none, return TCL_BREAK code. */
{"continue", 1, 0, 0, {OPERAND_NONE}},
/* Skip to next iteration of closest enclosing loop; if none,
* return TCL_CONTINUE code. */
{"foreach_start4", 5, 0, 1, {OPERAND_UINT4}},
/* Initialize execution of a foreach loop. Operand is aux data index
* of the ForeachInfo structure for the foreach command. */
{"foreach_step4", 5, +1, 1, {OPERAND_UINT4}},
/* "Step" or begin next iteration of foreach loop. Push 0 if to
* terminate loop, else push 1. */
{"beginCatch4", 5, 0, 1, {OPERAND_UINT4}},
/* Record start of catch with the operand's exception index.
* Push the current stack depth onto a special catch stack. */
{"endCatch", 1, 0, 0, {OPERAND_NONE}},
/* End of last catch. Pop the bytecode interpreter's catch stack. */
{"pushResult", 1, +1, 0, {OPERAND_NONE}},
/* Push the interpreter's object result onto the stack. */
{"pushReturnCode", 1, +1, 0, {OPERAND_NONE}},
/* Push interpreter's return code (e.g. TCL_OK or TCL_ERROR) as
* a new object onto the stack. */
{"streq", 1, -1, 0, {OPERAND_NONE}},
/* Str Equal: push (stknext eq stktop) */
{"strneq", 1, -1, 0, {OPERAND_NONE}},
/* Str !Equal: push (stknext neq stktop) */
{"strcmp", 1, -1, 0, {OPERAND_NONE}},
/* Str Compare: push (stknext cmp stktop) */
{"strlen", 1, 0, 0, {OPERAND_NONE}},
/* Str Length: push (strlen stktop) */
{"strindex", 1, -1, 0, {OPERAND_NONE}},
/* Str Index: push (strindex stknext stktop) */
{"strmatch", 2, -1, 1, {OPERAND_INT1}},
/* Str Match: push (strmatch stknext stktop) opnd == nocase */
{"list", 5, INT_MIN, 1, {OPERAND_UINT4}},
/* List: push (stk1 stk2 ... stktop) */
{"listindex", 1, -1, 0, {OPERAND_NONE}},
/* List Index: push (listindex stknext stktop) */
{"listlength", 1, 0, 0, {OPERAND_NONE}},
/* List Len: push (listlength stktop) */
{"appendScalar1", 2, 0, 1, {OPERAND_UINT1}},
/* Append scalar variable at op1<=255 in frame; value is stktop */
{"appendScalar4", 5, 0, 1, {OPERAND_UINT4}},
/* Append scalar variable at op1 > 255 in frame; value is stktop */
{"appendArray1", 2, -1, 1, {OPERAND_UINT1}},
/* Append array element; array at op1<=255, value is top then elem */
{"appendArray4", 5, -1, 1, {OPERAND_UINT4}},
/* Append array element; array at op1>=256, value is top then elem */
{"appendArrayStk", 1, -2, 0, {OPERAND_NONE}},
/* Append array element; value is stktop, then elem, array names */
{"appendStk", 1, -1, 0, {OPERAND_NONE}},
/* Append general variable; value is stktop, then unparsed name */
{"lappendScalar1", 2, 0, 1, {OPERAND_UINT1}},
/* Lappend scalar variable at op1<=255 in frame; value is stktop */
{"lappendScalar4", 5, 0, 1, {OPERAND_UINT4}},
/* Lappend scalar variable at op1 > 255 in frame; value is stktop */
{"lappendArray1", 2, -1, 1, {OPERAND_UINT1}},
/* Lappend array element; array at op1<=255, value is top then elem */
{"lappendArray4", 5, -1, 1, {OPERAND_UINT4}},
/* Lappend array element; array at op1>=256, value is top then elem */
{"lappendArrayStk", 1, -2, 0, {OPERAND_NONE}},
/* Lappend array element; value is stktop, then elem, array names */
{"lappendStk", 1, -1, 0, {OPERAND_NONE}},
/* Lappend general variable; value is stktop, then unparsed name */
{"lindexMulti", 5, INT_MIN, 1, {OPERAND_UINT4}},
/* Lindex with generalized args, operand is number of stacked objs
* used: (operand-1) entries from stktop are the indices; then list
* to process. */
{"over", 5, +1, 1, {OPERAND_UINT4}},
/* Duplicate the arg-th element from top of stack (TOS=0) */
{"lsetList", 1, -2, 0, {OPERAND_NONE}},
/* Four-arg version of 'lset'. stktop is old value; next is
* new element value, next is the index list; pushes new value */
{"lsetFlat", 5, INT_MIN, 1, {OPERAND_UINT4}},
/* Three- or >=5-arg version of 'lset', operand is number of
* stacked objs: stktop is old value, next is new element value, next
* come (operand-2) indices; pushes the new value.
*/
{0}
};
/*
* Prototypes for procedures defined later in this file:
*/
|
| ︙ | ︙ | |||
573 574 575 576 577 578 579 | (double) (codePtr->numLitObjects * sizeof(Tcl_Obj *)); statsPtr->currentExceptBytes -= (double) (codePtr->numExceptRanges * sizeof(ExceptionRange)); statsPtr->currentAuxBytes -= (double) (codePtr->numAuxDataItems * sizeof(AuxData)); statsPtr->currentCmdMapBytes -= (double) codePtr->numCmdLocBytes; | | | 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 |
(double) (codePtr->numLitObjects * sizeof(Tcl_Obj *));
statsPtr->currentExceptBytes -=
(double) (codePtr->numExceptRanges * sizeof(ExceptionRange));
statsPtr->currentAuxBytes -=
(double) (codePtr->numAuxDataItems * sizeof(AuxData));
statsPtr->currentCmdMapBytes -= (double) codePtr->numCmdLocBytes;
Tcl_GetTime(&destroyTime);
lifetimeSec = destroyTime.sec - codePtr->createTime.sec;
if (lifetimeSec > 2000) { /* avoid overflow */
lifetimeSec = 2000;
}
lifetimeMicroSec =
1000000*lifetimeSec + (destroyTime.usec - codePtr->createTime.usec);
|
| ︙ | ︙ | |||
683 684 685 686 687 688 689 690 691 692 693 694 695 696 |
envPtr->source = string;
envPtr->numSrcBytes = numBytes;
envPtr->procPtr = iPtr->compiledProcPtr;
envPtr->numCommands = 0;
envPtr->exceptDepth = 0;
envPtr->maxExceptDepth = 0;
envPtr->maxStackDepth = 0;
TclInitLiteralTable(&(envPtr->localLitTable));
envPtr->exprIsJustVarRef = 0;
envPtr->exprIsComparison = 0;
envPtr->codeStart = envPtr->staticCodeSpace;
envPtr->codeNext = envPtr->codeStart;
envPtr->codeEnd = (envPtr->codeStart + COMPILEENV_INIT_CODE_BYTES);
| > | 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 |
envPtr->source = string;
envPtr->numSrcBytes = numBytes;
envPtr->procPtr = iPtr->compiledProcPtr;
envPtr->numCommands = 0;
envPtr->exceptDepth = 0;
envPtr->maxExceptDepth = 0;
envPtr->maxStackDepth = 0;
envPtr->currStackDepth = 0;
TclInitLiteralTable(&(envPtr->localLitTable));
envPtr->exprIsJustVarRef = 0;
envPtr->exprIsComparison = 0;
envPtr->codeStart = envPtr->staticCodeSpace;
envPtr->codeNext = envPtr->codeStart;
envPtr->codeEnd = (envPtr->codeStart + COMPILEENV_INIT_CODE_BYTES);
|
| ︙ | ︙ | |||
770 771 772 773 774 775 776 | * The return value is TCL_OK on a successful compilation and TCL_ERROR * on failure. If TCL_ERROR is returned, then the interpreter's result * contains an error message. * * interp->termOffset is set to the offset of the character in the * script just after the last one successfully processed; this will be * the offset of the ']' if (flags & TCL_BRACKET_TERM). | < < | 786 787 788 789 790 791 792 793 794 795 796 797 798 799 | * The return value is TCL_OK on a successful compilation and TCL_ERROR * on failure. If TCL_ERROR is returned, then the interpreter's result * contains an error message. * * interp->termOffset is set to the offset of the character in the * script just after the last one successfully processed; this will be * the offset of the ']' if (flags & TCL_BRACKET_TERM). * * Side effects: * Adds instructions to envPtr to evaluate the script at runtime. * *---------------------------------------------------------------------- */ |
| ︙ | ︙ | |||
794 795 796 797 798 799 800 |
* close bracket ']' should be considered a
* command terminator. If zero, close
* bracket has no special meaning. */
CompileEnv *envPtr; /* Holds resulting instructions. */
{
Interp *iPtr = (Interp *) interp;
Tcl_Parse parse;
| < < | 808 809 810 811 812 813 814 815 816 817 818 819 820 821 |
* close bracket ']' should be considered a
* command terminator. If zero, close
* bracket has no special meaning. */
CompileEnv *envPtr; /* Holds resulting instructions. */
{
Interp *iPtr = (Interp *) interp;
Tcl_Parse parse;
int lastTopLevelCmdIndex = -1;
/* Index of most recent toplevel command in
* the command location table. Initialized
* to avoid compiler warning. */
int startCodeOffset = -1; /* Offset of first byte of current command's
* code. Init. to avoid compiler warning. */
unsigned char *entryCodeNext = envPtr->codeNext;
|
| ︙ | ︙ | |||
936 937 938 939 940 941 942 |
if ((cmdPtr != NULL)
&& (cmdPtr->compileProc != NULL)
&& !(iPtr->flags & DONT_COMPILE_CMDS_INLINE)) {
code = (*(cmdPtr->compileProc))(interp, &parse,
envPtr);
if (code == TCL_OK) {
| < < | 948 949 950 951 952 953 954 955 956 957 958 959 960 961 |
if ((cmdPtr != NULL)
&& (cmdPtr->compileProc != NULL)
&& !(iPtr->flags & DONT_COMPILE_CMDS_INLINE)) {
code = (*(cmdPtr->compileProc))(interp, &parse,
envPtr);
if (code == TCL_OK) {
goto finishCommand;
} else if (code == TCL_OUT_LINE_COMPILE) {
/* do nothing */
} else { /* an error */
/*
* There was a compilation error, the last
* command did not get compiled into (*envPtr).
|
| ︙ | ︙ | |||
973 974 975 976 977 978 979 |
}
} else {
objIndex = TclRegisterLiteral(envPtr,
tokenPtr[1].start, tokenPtr[1].size,
/*onHeap*/ 0);
}
TclEmitPush(objIndex, envPtr);
| < < < | 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 |
}
} else {
objIndex = TclRegisterLiteral(envPtr,
tokenPtr[1].start, tokenPtr[1].size,
/*onHeap*/ 0);
}
TclEmitPush(objIndex, envPtr);
} else {
/*
* The word is not a simple string of characters.
*/
code = TclCompileTokens(interp, tokenPtr+1,
tokenPtr->numComponents, envPtr);
if (code != TCL_OK) {
goto error;
}
}
}
/*
* Emit an invoke instruction for the command. We skip this
* if a compile procedure was found for the command.
*/
|
| ︙ | ︙ | |||
1041 1042 1043 1044 1045 1046 1047 |
* If the source script yielded no instructions (e.g., if it was empty),
* push an empty string as the command's result.
*/
if (envPtr->codeNext == entryCodeNext) {
TclEmitPush(TclRegisterLiteral(envPtr, "", 0, /*onHeap*/ 0),
envPtr);
| < < | 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 |
* If the source script yielded no instructions (e.g., if it was empty),
* push an empty string as the command's result.
*/
if (envPtr->codeNext == entryCodeNext) {
TclEmitPush(TclRegisterLiteral(envPtr, "", 0, /*onHeap*/ 0),
envPtr);
}
if ((nested != 0) && (p > script) && (p[-1] == ']')) {
iPtr->termOffset = (p - 1) - script;
} else {
iPtr->termOffset = (p - script);
}
Tcl_DStringFree(&ds);
return TCL_OK;
error:
/*
* Generate various pieces of error information, such as the line
* number where the error occurred and information to add to the
|
| ︙ | ︙ | |||
1082 1083 1084 1085 1086 1087 1088 |
commandLength -= 1;
}
LogCompilationInfo(interp, script, parse.commandStart, commandLength);
if (gotParse) {
Tcl_FreeParse(&parse);
}
iPtr->termOffset = (p - script);
| < < < < | 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 |
commandLength -= 1;
}
LogCompilationInfo(interp, script, parse.commandStart, commandLength);
if (gotParse) {
Tcl_FreeParse(&parse);
}
iPtr->termOffset = (p - script);
Tcl_DStringFree(&ds);
return code;
}
/*
*----------------------------------------------------------------------
*
* TclCompileTokens --
*
* Given an array of tokens parsed from a Tcl command (e.g., the tokens
* that make up a word) this procedure emits instructions to evaluate
* the tokens and concatenate their values to form a single result
* value on the interpreter's runtime evaluation stack.
*
* Results:
* The return value is a standard Tcl result. If an error occurs, an
* error message is left in the interpreter's result.
*
* Side effects:
* Instructions are added to envPtr to push and evaluate the tokens
* at runtime.
*
*----------------------------------------------------------------------
*/
|
| ︙ | ︙ | |||
1125 1126 1127 1128 1129 1130 1131 |
CompileEnv *envPtr; /* Holds the resulting instructions. */
{
Tcl_DString textBuffer; /* Holds concatenated chars from adjacent
* TCL_TOKEN_TEXT, TCL_TOKEN_BS tokens. */
char buffer[TCL_UTF_MAX];
char *name, *p;
int numObjsToConcat, nameBytes, hasNsQualifiers, localVar;
| | < | 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 |
CompileEnv *envPtr; /* Holds the resulting instructions. */
{
Tcl_DString textBuffer; /* Holds concatenated chars from adjacent
* TCL_TOKEN_TEXT, TCL_TOKEN_BS tokens. */
char buffer[TCL_UTF_MAX];
char *name, *p;
int numObjsToConcat, nameBytes, hasNsQualifiers, localVar;
int length, i, code;
unsigned char *entryCodeNext = envPtr->codeNext;
Tcl_DStringInit(&textBuffer);
numObjsToConcat = 0;
for ( ; count > 0; count--, tokenPtr++) {
switch (tokenPtr->type) {
case TCL_TOKEN_TEXT:
Tcl_DStringAppend(&textBuffer, tokenPtr->start,
tokenPtr->size);
break;
|
| ︙ | ︙ | |||
1157 1158 1159 1160 1161 1162 1163 | int literal; literal = TclRegisterLiteral(envPtr, Tcl_DStringValue(&textBuffer), Tcl_DStringLength(&textBuffer), /*onHeap*/ 0); TclEmitPush(literal, envPtr); numObjsToConcat++; | < < < < | 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 |
int literal;
literal = TclRegisterLiteral(envPtr,
Tcl_DStringValue(&textBuffer),
Tcl_DStringLength(&textBuffer), /*onHeap*/ 0);
TclEmitPush(literal, envPtr);
numObjsToConcat++;
Tcl_DStringFree(&textBuffer);
}
code = TclCompileScript(interp, tokenPtr->start+1,
tokenPtr->size-2, /*nested*/ 1, envPtr);
if (code != TCL_OK) {
goto error;
}
numObjsToConcat++;
break;
case TCL_TOKEN_VARIABLE:
/*
* Push any accumulated chars appearing before the $<var>.
*/
if (Tcl_DStringLength(&textBuffer) > 0) {
int literal;
literal = TclRegisterLiteral(envPtr,
Tcl_DStringValue(&textBuffer),
Tcl_DStringLength(&textBuffer), /*onHeap*/ 0);
TclEmitPush(literal, envPtr);
numObjsToConcat++;
Tcl_DStringFree(&textBuffer);
}
/*
* Check if the name contains any namespace qualifiers.
*/
|
| ︙ | ︙ | |||
1208 1209 1210 1211 1212 1213 1214 | } /* * Either push the variable's name, or find its index in * the array of local variables in a procedure frame. */ | < < < | 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 |
}
/*
* Either push the variable's name, or find its index in
* the array of local variables in a procedure frame.
*/
if ((envPtr->procPtr == NULL) || hasNsQualifiers) {
localVar = -1;
TclEmitPush(TclRegisterLiteral(envPtr, name, nameBytes,
/*onHeap*/ 0), envPtr);
} else {
localVar = TclFindCompiledLocal(name, nameBytes,
/*create*/ 0, /*flags*/ 0, envPtr->procPtr);
if (localVar < 0) {
TclEmitPush(TclRegisterLiteral(envPtr, name,
nameBytes, /*onHeap*/ 0), envPtr);
}
}
/*
* Emit instructions to load the variable.
*/
|
| ︙ | ︙ | |||
1248 1249 1250 1251 1252 1253 1254 |
if (code != TCL_OK) {
sprintf(buffer,
"\n (parsing index for array \"%.*s\")",
((nameBytes > 100)? 100 : nameBytes), name);
Tcl_AddObjErrorInfo(interp, buffer, -1);
goto error;
}
| < < | 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 |
if (code != TCL_OK) {
sprintf(buffer,
"\n (parsing index for array \"%.*s\")",
((nameBytes > 100)? 100 : nameBytes), name);
Tcl_AddObjErrorInfo(interp, buffer, -1);
goto error;
}
if (localVar < 0) {
TclEmitOpcode(INST_LOAD_ARRAY_STK, envPtr);
} else if (localVar <= 255) {
TclEmitInstInt1(INST_LOAD_ARRAY1, localVar,
envPtr);
} else {
TclEmitInstInt4(INST_LOAD_ARRAY4, localVar,
envPtr);
}
}
numObjsToConcat++;
count -= tokenPtr->numComponents;
tokenPtr += tokenPtr->numComponents;
break;
default:
panic("Unexpected token type in TclCompileTokens");
|
| ︙ | ︙ | |||
1281 1282 1283 1284 1285 1286 1287 |
if (Tcl_DStringLength(&textBuffer) > 0) {
int literal;
literal = TclRegisterLiteral(envPtr, Tcl_DStringValue(&textBuffer),
Tcl_DStringLength(&textBuffer), /*onHeap*/ 0);
TclEmitPush(literal, envPtr);
numObjsToConcat++;
| < | 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 |
if (Tcl_DStringLength(&textBuffer) > 0) {
int literal;
literal = TclRegisterLiteral(envPtr, Tcl_DStringValue(&textBuffer),
Tcl_DStringLength(&textBuffer), /*onHeap*/ 0);
TclEmitPush(literal, envPtr);
numObjsToConcat++;
}
/*
* If necessary, concatenate the parts of the word.
*/
while (numObjsToConcat > 255) {
|
| ︙ | ︙ | |||
1303 1304 1305 1306 1307 1308 1309 |
/*
* If the tokens yielded no instructions, push an empty string.
*/
if (envPtr->codeNext == entryCodeNext) {
TclEmitPush(TclRegisterLiteral(envPtr, "", 0, /*onHeap*/ 0),
envPtr);
| < < < < < < | 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 |
/*
* If the tokens yielded no instructions, push an empty string.
*/
if (envPtr->codeNext == entryCodeNext) {
TclEmitPush(TclRegisterLiteral(envPtr, "", 0, /*onHeap*/ 0),
envPtr);
}
Tcl_DStringFree(&textBuffer);
return TCL_OK;
error:
Tcl_DStringFree(&textBuffer);
return code;
}
/*
*----------------------------------------------------------------------
*
* TclCompileCmdWord --
*
* Given an array of parse tokens for a word containing one or more Tcl
* commands, emit inline instructions to execute them. This procedure
* differs from TclCompileTokens in that a simple word such as a loop
* body enclosed in braces is not just pushed as a string, but is
* itself parsed into tokens and compiled.
*
* Results:
* The return value is a standard Tcl result. If an error occurs, an
* error message is left in the interpreter's result.
*
* Side effects:
* Instructions are added to envPtr to execute the tokens at runtime.
*
*----------------------------------------------------------------------
*/
int
|
| ︙ | ︙ | |||
1355 1356 1357 1358 1359 1360 1361 |
int code;
/*
* Handle the common case: if there is a single text token, compile it
* into an inline sequence of instructions.
*/
| < | 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 |
int code;
/*
* Handle the common case: if there is a single text token, compile it
* into an inline sequence of instructions.
*/
if ((count == 1) && (tokenPtr->type == TCL_TOKEN_TEXT)) {
code = TclCompileScript(interp, tokenPtr->start, tokenPtr->size,
/*nested*/ 0, envPtr);
return code;
}
/*
|
| ︙ | ︙ | |||
1391 1392 1393 1394 1395 1396 1397 | * supports Tcl's two-level substitution semantics for expressions that * appear as command words. * * Results: * The return value is a standard Tcl result. If an error occurs, an * error message is left in the interpreter's result. * | < < < | < < | 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 |
* supports Tcl's two-level substitution semantics for expressions that
* appear as command words.
*
* Results:
* The return value is a standard Tcl result. If an error occurs, an
* error message is left in the interpreter's result.
*
* Side effects:
* Instructions are added to envPtr to execute the expression.
*
*----------------------------------------------------------------------
*/
int
TclCompileExprWords(interp, tokenPtr, numWords, envPtr)
Tcl_Interp *interp; /* Used for error and status reporting. */
Tcl_Token *tokenPtr; /* Points to first in an array of word
* tokens tokens for the expression to
* compile inline. */
int numWords; /* Number of word tokens starting at
* tokenPtr. Must be at least 1. Each word
* token contains one or more subtokens. */
CompileEnv *envPtr; /* Holds the resulting instructions. */
{
Tcl_Token *wordPtr;
int range, numBytes, i, code;
char *script;
int saveExprIsJustVarRef = envPtr->exprIsJustVarRef;
int saveExprIsComparison = envPtr->exprIsComparison;
range = -1;
code = TCL_OK;
/*
* If the expression is a single word that doesn't require
* substitutions, just compile it's string into inline instructions.
*/
|
| ︙ | ︙ | |||
1454 1455 1456 1457 1458 1459 1460 |
envPtr);
if (code != TCL_OK) {
break;
}
if (i < (numWords - 1)) {
TclEmitPush(TclRegisterLiteral(envPtr, " ", 1, /*onHeap*/ 0),
envPtr);
| < < < < | 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 |
envPtr);
if (code != TCL_OK) {
break;
}
if (i < (numWords - 1)) {
TclEmitPush(TclRegisterLiteral(envPtr, " ", 1, /*onHeap*/ 0),
envPtr);
}
wordPtr += (wordPtr->numComponents + 1);
}
if (code == TCL_OK) {
int concatItems = 2*numWords - 1;
while (concatItems > 255) {
TclEmitInstInt1(INST_CONCAT1, 255, envPtr);
concatItems -= 254;
}
if (concatItems > 1) {
TclEmitInstInt1(INST_CONCAT1, concatItems, envPtr);
}
TclEmitOpcode(INST_EXPR_STK, envPtr);
}
envPtr->exprIsJustVarRef = saveExprIsJustVarRef;
envPtr->exprIsComparison = saveExprIsComparison;
return code;
}
/*
*----------------------------------------------------------------------
*
* TclInitByteCodeObj --
|
| ︙ | ︙ | |||
1566 1567 1568 1569 1570 1571 1572 |
codePtr->numCodeBytes = codeBytes;
codePtr->numLitObjects = numLitObjects;
codePtr->numExceptRanges = envPtr->exceptArrayNext;
codePtr->numAuxDataItems = envPtr->auxDataArrayNext;
codePtr->numCmdLocBytes = cmdLocBytes;
codePtr->maxExceptDepth = envPtr->maxExceptDepth;
codePtr->maxStackDepth = envPtr->maxStackDepth;
| | | 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 |
codePtr->numCodeBytes = codeBytes;
codePtr->numLitObjects = numLitObjects;
codePtr->numExceptRanges = envPtr->exceptArrayNext;
codePtr->numAuxDataItems = envPtr->auxDataArrayNext;
codePtr->numCmdLocBytes = cmdLocBytes;
codePtr->maxExceptDepth = envPtr->maxExceptDepth;
codePtr->maxStackDepth = envPtr->maxStackDepth;
p += sizeof(ByteCode);
codePtr->codeStart = p;
memcpy((VOID *) p, (VOID *) envPtr->codeStart, (size_t) codeBytes);
p += TCL_ALIGN(codeBytes); /* align object array */
codePtr->objArrayPtr = (Tcl_Obj **) p;
for (i = 0; i < numLitObjects; i++) {
|
| ︙ | ︙ | |||
1611 1612 1613 1614 1615 1616 1617 |
* Record various compilation-related statistics about the new ByteCode
* structure. Don't include overhead for statistics-related fields.
*/
#ifdef TCL_COMPILE_STATS
codePtr->structureSize = structureSize
- (sizeof(size_t) + sizeof(Tcl_Time));
| | | 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 |
* Record various compilation-related statistics about the new ByteCode
* structure. Don't include overhead for statistics-related fields.
*/
#ifdef TCL_COMPILE_STATS
codePtr->structureSize = structureSize
- (sizeof(size_t) + sizeof(Tcl_Time));
Tcl_GetTime(&(codePtr->createTime));
RecordByteCodeStats(codePtr);
#endif /* TCL_COMPILE_STATS */
/*
* Free the old internal rep then convert the object to a
* bytecode object by making its internal rep point to the just
|
| ︙ | ︙ | |||
1733 1734 1735 1736 1737 1738 1739 | * the variable is unknown, or if the name is NULL. * *---------------------------------------------------------------------- */ int TclFindCompiledLocal(name, nameBytes, create, flags, procPtr) | | | 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 |
* the variable is unknown, or if the name is NULL.
*
*----------------------------------------------------------------------
*/
int
TclFindCompiledLocal(name, nameBytes, create, flags, procPtr)
register CONST char *name; /* Points to first character of the name of
* a scalar or array variable. If NULL, a
* temporary var should be created. */
int nameBytes; /* Number of bytes in the name. */
int create; /* If 1, allocate a local frame entry for
* the variable if it is new. */
int flags; /* Flag bits for the compiled local if
* created. Only VAR_SCALAR, VAR_ARRAY, and
|
| ︙ | ︙ | |||
1938 1939 1940 1941 1942 1943 1944 | * old array is freed. Byte codes are copied from the old array to the * new one. * *---------------------------------------------------------------------- */ void | | | > > > | 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 |
* old array is freed. Byte codes are copied from the old array to the
* new one.
*
*----------------------------------------------------------------------
*/
void
TclExpandCodeArray(envArgPtr)
void *envArgPtr; /* Points to the CompileEnv whose code array
* must be enlarged. */
{
CompileEnv *envPtr = (CompileEnv*) envArgPtr; /* Points to the CompileEnv whose code array
* must be enlarged. */
/*
* envPtr->codeNext is equal to envPtr->codeEnd. The currently defined
* code bytes are stored between envPtr->codeStart and
* (envPtr->codeNext - 1) [inclusive].
*/
size_t currBytes = (envPtr->codeNext - envPtr->codeStart);
|
| ︙ | ︙ | |||
2540 2541 2542 2543 2544 2545 2546 | * * Side effects: * None. * *---------------------------------------------------------------------- */ | | | 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 |
*
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
void * /* == InstructionDesc* == */
TclGetInstructionTable()
{
return &instructionTable[0];
}
/*
*--------------------------------------------------------------
|
| ︙ | ︙ |
Changes to generic/tclCompile.h.
1 2 3 4 5 6 7 8 9 | /* * tclCompile.h -- * * Copyright (c) 1996-1998 Sun Microsystems, Inc. * Copyright (c) 1998-2000 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | > | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | /* * tclCompile.h -- * * Copyright (c) 1996-1998 Sun Microsystems, Inc. * Copyright (c) 1998-2000 by Scriptics Corporation. * Copyright (c) 2001 by Kevin B. Kenny. All rights reserved. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclCompile.h,v 1.16.4.1 2002/02/05 02:21:59 wolfsuit Exp $ */ #ifndef _TCLCOMPILATION #define _TCLCOMPILATION 1 #ifndef _TCLINT #include "tclInt.h" |
| ︙ | ︙ | |||
212 213 214 215 216 217 218 219 220 221 222 223 224 225 |
int exceptDepth; /* Current exception range nesting level;
* -1 if not in any range currently. */
int maxExceptDepth; /* Max nesting level of exception ranges;
* -1 if no ranges have been compiled. */
int maxStackDepth; /* Maximum number of stack elements needed
* to execute the code. Set by compilation
* procedures before returning. */
LiteralTable localLitTable; /* Contains LiteralEntry's describing
* all Tcl objects referenced by this
* compiled code. Indexed by the string
* representations of the literals. Used to
* avoid creating duplicate objects. */
int exprIsJustVarRef; /* Set 1 if the expression last compiled by
* TclCompileExpr consisted of just a
| > | 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 |
int exceptDepth; /* Current exception range nesting level;
* -1 if not in any range currently. */
int maxExceptDepth; /* Max nesting level of exception ranges;
* -1 if no ranges have been compiled. */
int maxStackDepth; /* Maximum number of stack elements needed
* to execute the code. Set by compilation
* procedures before returning. */
int currStackDepth; /* Current stack depth. */
LiteralTable localLitTable; /* Contains LiteralEntry's describing
* all Tcl objects referenced by this
* compiled code. Indexed by the string
* representations of the literals. Used to
* avoid creating duplicate objects. */
int exprIsJustVarRef; /* Set 1 if the expression last compiled by
* TclCompileExpr consisted of just a
|
| ︙ | ︙ | |||
521 522 523 524 525 526 527 528 | #define INST_LAPPEND_SCALAR1 88 #define INST_LAPPEND_SCALAR4 89 #define INST_LAPPEND_ARRAY1 90 #define INST_LAPPEND_ARRAY4 91 #define INST_LAPPEND_ARRAY_STK 92 #define INST_LAPPEND_STK 93 /* The last opcode */ | > > > > > > > > > > > > > | | 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 | #define INST_LAPPEND_SCALAR1 88 #define INST_LAPPEND_SCALAR4 89 #define INST_LAPPEND_ARRAY1 90 #define INST_LAPPEND_ARRAY4 91 #define INST_LAPPEND_ARRAY_STK 92 #define INST_LAPPEND_STK 93 /* TIP #22 - LINDEX operator with flat arg list */ #define INST_LIST_INDEX_MULTI 94 /* * TIP #33 - 'lset' command. Code gen also required a Forth-like * OVER operation. */ #define INST_OVER 95 #define INST_LSET_LIST 96 #define INST_LSET_FLAT 97 /* The last opcode */ #define LAST_INST_OPCODE 97 /* * Table describing the Tcl bytecode instructions: their name (for * displaying code), total number of code bytes required (including * operand bytes), and a description of the type of each operand. * These operand types include signed and unsigned integers of length * one and four bytes. The unsigned integers are used for indexes or |
| ︙ | ︙ | |||
546 547 548 549 550 551 552 553 554 555 556 557 558 559 |
OPERAND_UINT1, /* One byte unsigned integer. */
OPERAND_UINT4 /* Four byte unsigned integer. */
} InstOperandType;
typedef struct InstructionDesc {
char *name; /* Name of instruction. */
int numBytes; /* Total number of bytes for instruction. */
int numOperands; /* Number of operands. */
InstOperandType opTypes[MAX_INSTRUCTION_OPERANDS];
/* The type of each operand. */
} InstructionDesc;
extern InstructionDesc instructionTable[];
| > > > > > > | 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 |
OPERAND_UINT1, /* One byte unsigned integer. */
OPERAND_UINT4 /* Four byte unsigned integer. */
} InstOperandType;
typedef struct InstructionDesc {
char *name; /* Name of instruction. */
int numBytes; /* Total number of bytes for instruction. */
int stackEffect; /* The worst-case balance stack effect of the
* instruction, used for stack requirements
* computations. The value INT_MIN signals
* that the instruction's worst case effect
* is (1-opnd1).
*/
int numOperands; /* Number of operands. */
InstOperandType opTypes[MAX_INSTRUCTION_OPERANDS];
/* The type of each operand. */
} InstructionDesc;
extern InstructionDesc instructionTable[];
|
| ︙ | ︙ | |||
699 700 701 702 703 704 705 706 707 | * structures describing each var list. The * actual size of this field will be large * enough to numVars indexes. THIS MUST BE * THE LAST FIELD IN THE STRUCTURE! */ } ForeachInfo; extern AuxDataType tclForeachInfoType; /* | > < | | | | | | | | | < > | | | | | < < < < < < < < | < < < < | < | 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 | * structures describing each var list. The * actual size of this field will be large * enough to numVars indexes. THIS MUST BE * THE LAST FIELD IN THE STRUCTURE! */ } ForeachInfo; extern AuxDataType tclForeachInfoType; /* *---------------------------------------------------------------- * Procedures exported by tclBasic.c to be used within the engine. *---------------------------------------------------------------- */ EXTERN int TclEvalObjvInternal _ANSI_ARGS_((Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], char *command, int length, int flags)); EXTERN int TclInterpReady _ANSI_ARGS_((Tcl_Interp *interp)); /* *---------------------------------------------------------------- * Procedures exported by the engine to be used by tclBasic.c *---------------------------------------------------------------- */ EXTERN int TclCompEvalObj _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *objPtr, int engineCall)); /* *---------------------------------------------------------------- * Procedures shared among Tcl bytecode compilation and execution * modules but not used outside: *---------------------------------------------------------------- */ |
| ︙ | ︙ | |||
771 772 773 774 775 776 777 | EXTERN void TclDeleteLiteralTable _ANSI_ARGS_(( Tcl_Interp *interp, LiteralTable *tablePtr)); EXTERN void TclEmitForwardJump _ANSI_ARGS_((CompileEnv *envPtr, TclJumpType jumpType, JumpFixup *jumpFixupPtr)); EXTERN ExceptionRange * TclGetExceptionRangeForPc _ANSI_ARGS_(( unsigned char *pc, int catchOnly, ByteCode* codePtr)); | < < < < < | | 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 |
EXTERN void TclDeleteLiteralTable _ANSI_ARGS_((
Tcl_Interp *interp, LiteralTable *tablePtr));
EXTERN void TclEmitForwardJump _ANSI_ARGS_((CompileEnv *envPtr,
TclJumpType jumpType, JumpFixup *jumpFixupPtr));
EXTERN ExceptionRange * TclGetExceptionRangeForPc _ANSI_ARGS_((
unsigned char *pc, int catchOnly,
ByteCode* codePtr));
EXTERN void TclExpandJumpFixupArray _ANSI_ARGS_((
JumpFixupArray *fixupArrayPtr));
EXTERN void TclFinalizeAuxDataTypeTable _ANSI_ARGS_((void));
EXTERN int TclFindCompiledLocal _ANSI_ARGS_((CONST char *name,
int nameChars, int create, int flags,
Proc *procPtr));
EXTERN LiteralEntry * TclLookupLiteralEntry _ANSI_ARGS_((
Tcl_Interp *interp, Tcl_Obj *objPtr));
EXTERN int TclFixupForwardJump _ANSI_ARGS_((
CompileEnv *envPtr, JumpFixup *jumpFixupPtr,
int jumpDist, int distThreshold));
|
| ︙ | ︙ | |||
837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 |
/*
*----------------------------------------------------------------
* Macros used by Tcl bytecode compilation and execution modules
* inside the Tcl core but not used outside.
*----------------------------------------------------------------
*/
/*
* Macro to emit an opcode byte into a CompileEnv's code array.
* The ANSI C "prototype" for this macro is:
*
* EXTERN void TclEmitOpcode _ANSI_ARGS_((unsigned char op,
* CompileEnv *envPtr));
*/
#define TclEmitOpcode(op, envPtr) \
if ((envPtr)->codeNext == (envPtr)->codeEnd) \
TclExpandCodeArray(envPtr); \
| > > > > > > > > > > > > > > > > > > > > > > > > > | > | 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 |
/*
*----------------------------------------------------------------
* Macros used by Tcl bytecode compilation and execution modules
* inside the Tcl core but not used outside.
*----------------------------------------------------------------
*/
/*
* Macro used to update the stack requirements.
* It is called by the macros TclEmitOpCode, TclEmitInst1 and
* TclEmitInst4.
* Remark that the very last instruction of a bytecode always
* reduces the stack level: INST_DONE or INST_POP, so that the
* maxStackdepth is always updated.
*/
#define TclUpdateStackReqs(op, i, envPtr) \
{\
int delta = instructionTable[(op)].stackEffect;\
if (delta) {\
if (delta < 0) {\
if((envPtr)->maxStackDepth < (envPtr)->currStackDepth) {\
(envPtr)->maxStackDepth = (envPtr)->currStackDepth;\
}\
if (delta == INT_MIN) {\
delta = 1 - (i);\
}\
}\
(envPtr)->currStackDepth += delta;\
}\
}
/*
* Macro to emit an opcode byte into a CompileEnv's code array.
* The ANSI C "prototype" for this macro is:
*
* EXTERN void TclEmitOpcode _ANSI_ARGS_((unsigned char op,
* CompileEnv *envPtr));
*/
#define TclEmitOpcode(op, envPtr) \
if ((envPtr)->codeNext == (envPtr)->codeEnd) \
TclExpandCodeArray(envPtr); \
*(envPtr)->codeNext++ = (unsigned char) (op);\
TclUpdateStackReqs(op, 0, envPtr)
/*
* Macro to emit an integer operand.
* The ANSI C "prototype" for this macro is:
*
* EXTERN void TclEmitInt1 _ANSI_ARGS_((int i, CompileEnv *envPtr));
*/
|
| ︙ | ︙ | |||
873 874 875 876 877 878 879 880 881 882 883 884 885 |
* The ANSI C "prototypes" for these macros are:
*
* EXTERN void TclEmitInstInt1 _ANSI_ARGS_((unsigned char op, int i,
* CompileEnv *envPtr));
* EXTERN void TclEmitInstInt4 _ANSI_ARGS_((unsigned char op, int i,
* CompileEnv *envPtr));
*/
#define TclEmitInstInt1(op, i, envPtr) \
if (((envPtr)->codeNext + 2) > (envPtr)->codeEnd) { \
TclExpandCodeArray(envPtr); \
} \
*(envPtr)->codeNext++ = (unsigned char) (op); \
| > | > | > | 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 |
* The ANSI C "prototypes" for these macros are:
*
* EXTERN void TclEmitInstInt1 _ANSI_ARGS_((unsigned char op, int i,
* CompileEnv *envPtr));
* EXTERN void TclEmitInstInt4 _ANSI_ARGS_((unsigned char op, int i,
* CompileEnv *envPtr));
*/
#define TclEmitInstInt1(op, i, envPtr) \
if (((envPtr)->codeNext + 2) > (envPtr)->codeEnd) { \
TclExpandCodeArray(envPtr); \
} \
*(envPtr)->codeNext++ = (unsigned char) (op); \
*(envPtr)->codeNext++ = (unsigned char) ((unsigned int) (i));\
TclUpdateStackReqs(op, i, envPtr)
#define TclEmitInstInt4(op, i, envPtr) \
if (((envPtr)->codeNext + 5) > (envPtr)->codeEnd) { \
TclExpandCodeArray(envPtr); \
} \
*(envPtr)->codeNext++ = (unsigned char) (op); \
*(envPtr)->codeNext++ = \
(unsigned char) ((unsigned int) (i) >> 24); \
*(envPtr)->codeNext++ = \
(unsigned char) ((unsigned int) (i) >> 16); \
*(envPtr)->codeNext++ = \
(unsigned char) ((unsigned int) (i) >> 8); \
*(envPtr)->codeNext++ = \
(unsigned char) ((unsigned int) (i) );\
TclUpdateStackReqs(op, i, envPtr)
/*
* Macro to push a Tcl object onto the Tcl evaluation stack. It emits the
* object's one or four byte array index into the CompileEnv's code
* array. These support, respectively, a maximum of 256 (2**8) and 2**32
* objects in a CompileEnv. The ANSI C "prototype" for this macro is:
*
|
| ︙ | ︙ | |||
1006 1007 1008 1009 1010 1011 1012 | #define TclMin(i, j) ((((int) i) < ((int) j))? (i) : (j)) #define TclMax(i, j) ((((int) i) > ((int) j))? (i) : (j)) # undef TCL_STORAGE_CLASS # define TCL_STORAGE_CLASS DLLIMPORT #endif /* _TCLCOMPILATION */ | > > > > > | 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 | #define TclMin(i, j) ((((int) i) < ((int) j))? (i) : (j)) #define TclMax(i, j) ((((int) i) > ((int) j))? (i) : (j)) # undef TCL_STORAGE_CLASS # define TCL_STORAGE_CLASS DLLIMPORT #endif /* _TCLCOMPILATION */ |
Changes to generic/tclDate.c.
1 2 3 4 5 6 7 8 9 10 11 12 | /* * tclDate.c -- * * This file is generated from a yacc grammar defined in * the file tclGetDate.y. It should not be edited directly. * * Copyright (c) 1992-1995 Karl Lehenbauer and Mark Diekhans. * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /* * tclDate.c -- * * This file is generated from a yacc grammar defined in * the file tclGetDate.y. It should not be edited directly. * * Copyright (c) 1992-1995 Karl Lehenbauer and Mark Diekhans. * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclDate.c,v 1.19.8.1 2002/02/05 02:21:59 wolfsuit Exp $ */ #include "tclInt.h" #include "tclPort.h" #if defined(MAC_TCL) && !defined(TCL_MAC_USE_MSL_EPOCH) # define EPOCH 1904 |
| ︙ | ︙ | |||
575 576 577 578 579 580 581 582 583 584 585 586 587 588 |
tm = TclpGetDate((TclpTime_t)&Start, 0);
Month = 12 * (tm->tm_year + TM_YEAR_BASE) + tm->tm_mon + RelMonth;
Year = Month / 12;
Month = Month % 12 + 1;
result = Convert(Month, (time_t) tm->tm_mday, Year,
(time_t) tm->tm_hour, (time_t) tm->tm_min, (time_t) tm->tm_sec,
MER24, DSTmaybe, &Julian);
/*
* The following iteration takes into account the case were we jump
* into a "short month". Far example, "one month from Jan 31" will
* fail because there is no Feb 31. The code below will reduce the
* day and try converting the date until we succed or the date equals
* 28 (which always works unless the date is bad in another way).
*/
| > > > > > > > > > > > > > > > > > | 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 |
tm = TclpGetDate((TclpTime_t)&Start, 0);
Month = 12 * (tm->tm_year + TM_YEAR_BASE) + tm->tm_mon + RelMonth;
Year = Month / 12;
Month = Month % 12 + 1;
result = Convert(Month, (time_t) tm->tm_mday, Year,
(time_t) tm->tm_hour, (time_t) tm->tm_min, (time_t) tm->tm_sec,
MER24, DSTmaybe, &Julian);
/*
* The Julian time returned above is behind by one day, if "month"
* or "year" is used to specify relative time and the GMT flag is true.
* This problem occurs only when the current time is closer to
* midnight, the difference being not more than its time difference
* with GMT. For example, in US/Pacific time zone, the problem occurs
* whenever the current time is between midnight to 8:00am or 7:00amDST.
* See Bug# 413397 for more details and sample script.
* To resolve this bug, we simply add the number of seconds corresponding
* to timezone difference with GMT to Julian time, if GMT flag is true.
*/
if (TclDateTimezone == 0) {
Julian += TclpGetTimeZone((unsigned long) Start) * 60L;
}
/*
* The following iteration takes into account the case were we jump
* into a "short month". Far example, "one month from Jan 31" will
* fail because there is no Feb 31. The code below will reduce the
* day and try converting the date until we succed or the date equals
* 28 (which always works unless the date is bad in another way).
*/
|
| ︙ | ︙ |
Changes to generic/tclDecls.h.
1 2 3 4 5 6 7 8 9 10 | /* * tclDecls.h -- * * Declarations of functions in the platform independent public Tcl API. * * Copyright (c) 1998-1999 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | /* * tclDecls.h -- * * Declarations of functions in the platform independent public Tcl API. * * Copyright (c) 1998-1999 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclDecls.h,v 1.63.2.3 2002/02/05 02:21:59 wolfsuit Exp $ */ #ifndef _TCLDECLS #define _TCLDECLS /* * WARNING: This file is automatically generated by the tools/genStubs.tcl |
| ︙ | ︙ | |||
133 134 135 136 137 138 139 | CONST char * str, double * doublePtr)); /* 35 */ EXTERN int Tcl_GetDoubleFromObj _ANSI_ARGS_(( Tcl_Interp * interp, Tcl_Obj * objPtr, double * doublePtr)); /* 36 */ EXTERN int Tcl_GetIndexFromObj _ANSI_ARGS_((Tcl_Interp * interp, | | | | | 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 | CONST char * str, double * doublePtr)); /* 35 */ EXTERN int Tcl_GetDoubleFromObj _ANSI_ARGS_(( Tcl_Interp * interp, Tcl_Obj * objPtr, double * doublePtr)); /* 36 */ EXTERN int Tcl_GetIndexFromObj _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * objPtr, CONST84 char ** tablePtr, CONST char * msg, int flags, int * indexPtr)); /* 37 */ EXTERN int Tcl_GetInt _ANSI_ARGS_((Tcl_Interp * interp, CONST char * str, int * intPtr)); /* 38 */ EXTERN int Tcl_GetIntFromObj _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * objPtr, int * intPtr)); /* 39 */ EXTERN int Tcl_GetLongFromObj _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * objPtr, long * longPtr)); /* 40 */ EXTERN Tcl_ObjType * Tcl_GetObjType _ANSI_ARGS_((CONST char * typeName)); /* 41 */ EXTERN char * Tcl_GetStringFromObj _ANSI_ARGS_((Tcl_Obj * objPtr, int * lengthPtr)); /* 42 */ EXTERN void Tcl_InvalidateStringRep _ANSI_ARGS_(( Tcl_Obj * objPtr)); /* 43 */ |
| ︙ | ︙ | |||
253 254 255 256 257 258 259 | /* 76 */ EXTERN void Tcl_BackgroundError _ANSI_ARGS_((Tcl_Interp * interp)); /* 77 */ EXTERN char Tcl_Backslash _ANSI_ARGS_((CONST char * src, int * readPtr)); /* 78 */ EXTERN int Tcl_BadChannelOption _ANSI_ARGS_(( | | | | | | > | | | > | 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 | /* 76 */ EXTERN void Tcl_BackgroundError _ANSI_ARGS_((Tcl_Interp * interp)); /* 77 */ EXTERN char Tcl_Backslash _ANSI_ARGS_((CONST char * src, int * readPtr)); /* 78 */ EXTERN int Tcl_BadChannelOption _ANSI_ARGS_(( Tcl_Interp * interp, CONST char * optionName, CONST char * optionList)); /* 79 */ EXTERN void Tcl_CallWhenDeleted _ANSI_ARGS_((Tcl_Interp * interp, Tcl_InterpDeleteProc * proc, ClientData clientData)); /* 80 */ EXTERN void Tcl_CancelIdleCall _ANSI_ARGS_(( Tcl_IdleProc * idleProc, ClientData clientData)); /* 81 */ EXTERN int Tcl_Close _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Channel chan)); /* 82 */ EXTERN int Tcl_CommandComplete _ANSI_ARGS_((char * cmd)); /* 83 */ EXTERN char * Tcl_Concat _ANSI_ARGS_((int argc, CONST84 char * CONST * argv)); /* 84 */ EXTERN int Tcl_ConvertElement _ANSI_ARGS_((CONST char * src, char * dst, int flags)); /* 85 */ EXTERN int Tcl_ConvertCountedElement _ANSI_ARGS_(( CONST char * src, int length, char * dst, int flags)); /* 86 */ EXTERN int Tcl_CreateAlias _ANSI_ARGS_((Tcl_Interp * slave, CONST char * slaveCmd, Tcl_Interp * target, CONST char * targetCmd, int argc, char * CONST * argv)); /* 87 */ EXTERN int Tcl_CreateAliasObj _ANSI_ARGS_((Tcl_Interp * slave, CONST char * slaveCmd, Tcl_Interp * target, CONST char * targetCmd, int objc, Tcl_Obj *CONST objv[])); /* 88 */ EXTERN Tcl_Channel Tcl_CreateChannel _ANSI_ARGS_(( Tcl_ChannelType * typePtr, CONST char * chanName, ClientData instanceData, int mask)); /* 89 */ EXTERN void Tcl_CreateChannelHandler _ANSI_ARGS_(( Tcl_Channel chan, int mask, Tcl_ChannelProc * proc, ClientData clientData)); /* 90 */ |
| ︙ | ︙ | |||
326 327 328 329 330 331 332 | /* 96 */ EXTERN Tcl_Command Tcl_CreateObjCommand _ANSI_ARGS_(( Tcl_Interp * interp, CONST char * cmdName, Tcl_ObjCmdProc * proc, ClientData clientData, Tcl_CmdDeleteProc * deleteProc)); /* 97 */ EXTERN Tcl_Interp * Tcl_CreateSlave _ANSI_ARGS_((Tcl_Interp * interp, | | | 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 | /* 96 */ EXTERN Tcl_Command Tcl_CreateObjCommand _ANSI_ARGS_(( Tcl_Interp * interp, CONST char * cmdName, Tcl_ObjCmdProc * proc, ClientData clientData, Tcl_CmdDeleteProc * deleteProc)); /* 97 */ EXTERN Tcl_Interp * Tcl_CreateSlave _ANSI_ARGS_((Tcl_Interp * interp, CONST char * slaveName, int isSafe)); /* 98 */ EXTERN Tcl_TimerToken Tcl_CreateTimerHandler _ANSI_ARGS_((int milliseconds, Tcl_TimerProc * proc, ClientData clientData)); /* 99 */ EXTERN Tcl_Trace Tcl_CreateTrace _ANSI_ARGS_((Tcl_Interp * interp, int level, Tcl_CmdTraceProc * proc, ClientData clientData)); |
| ︙ | ︙ | |||
424 425 426 427 428 429 430 | Tcl_DString * dsPtr, int length)); /* 125 */ EXTERN void Tcl_DStringStartSublist _ANSI_ARGS_(( Tcl_DString * dsPtr)); /* 126 */ EXTERN int Tcl_Eof _ANSI_ARGS_((Tcl_Channel chan)); /* 127 */ | | | | | 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 | Tcl_DString * dsPtr, int length)); /* 125 */ EXTERN void Tcl_DStringStartSublist _ANSI_ARGS_(( Tcl_DString * dsPtr)); /* 126 */ EXTERN int Tcl_Eof _ANSI_ARGS_((Tcl_Channel chan)); /* 127 */ EXTERN CONST char * Tcl_ErrnoId _ANSI_ARGS_((void)); /* 128 */ EXTERN CONST char * Tcl_ErrnoMsg _ANSI_ARGS_((int err)); /* 129 */ EXTERN int Tcl_Eval _ANSI_ARGS_((Tcl_Interp * interp, char * string)); /* 130 */ EXTERN int Tcl_EvalFile _ANSI_ARGS_((Tcl_Interp * interp, CONST char * fileName)); /* 131 */ EXTERN int Tcl_EvalObj _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * objPtr)); /* 132 */ EXTERN void Tcl_EventuallyFree _ANSI_ARGS_(( ClientData clientData, Tcl_FreeProc * freeProc)); |
| ︙ | ︙ | |||
484 485 486 487 488 489 490 | Tcl_HashSearch * searchPtr)); /* 146 */ EXTERN int Tcl_Flush _ANSI_ARGS_((Tcl_Channel chan)); /* 147 */ EXTERN void Tcl_FreeResult _ANSI_ARGS_((Tcl_Interp * interp)); /* 148 */ EXTERN int Tcl_GetAlias _ANSI_ARGS_((Tcl_Interp * interp, | | | | | | | | | | | | | | | | 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 | Tcl_HashSearch * searchPtr)); /* 146 */ EXTERN int Tcl_Flush _ANSI_ARGS_((Tcl_Channel chan)); /* 147 */ EXTERN void Tcl_FreeResult _ANSI_ARGS_((Tcl_Interp * interp)); /* 148 */ EXTERN int Tcl_GetAlias _ANSI_ARGS_((Tcl_Interp * interp, CONST char * slaveCmd, Tcl_Interp ** targetInterpPtr, CONST84 char ** targetCmdPtr, int * argcPtr, char *** argvPtr)); /* 149 */ EXTERN int Tcl_GetAliasObj _ANSI_ARGS_((Tcl_Interp * interp, CONST char * slaveCmd, Tcl_Interp ** targetInterpPtr, CONST84 char ** targetCmdPtr, int * objcPtr, Tcl_Obj *** objv)); /* 150 */ EXTERN ClientData Tcl_GetAssocData _ANSI_ARGS_((Tcl_Interp * interp, CONST char * name, Tcl_InterpDeleteProc ** procPtr)); /* 151 */ EXTERN Tcl_Channel Tcl_GetChannel _ANSI_ARGS_((Tcl_Interp * interp, CONST char * chanName, int * modePtr)); /* 152 */ EXTERN int Tcl_GetChannelBufferSize _ANSI_ARGS_(( Tcl_Channel chan)); /* 153 */ EXTERN int Tcl_GetChannelHandle _ANSI_ARGS_((Tcl_Channel chan, int direction, ClientData * handlePtr)); /* 154 */ EXTERN ClientData Tcl_GetChannelInstanceData _ANSI_ARGS_(( Tcl_Channel chan)); /* 155 */ EXTERN int Tcl_GetChannelMode _ANSI_ARGS_((Tcl_Channel chan)); /* 156 */ EXTERN CONST char * Tcl_GetChannelName _ANSI_ARGS_((Tcl_Channel chan)); /* 157 */ EXTERN int Tcl_GetChannelOption _ANSI_ARGS_(( Tcl_Interp * interp, Tcl_Channel chan, CONST char * optionName, Tcl_DString * dsPtr)); /* 158 */ EXTERN Tcl_ChannelType * Tcl_GetChannelType _ANSI_ARGS_((Tcl_Channel chan)); /* 159 */ EXTERN int Tcl_GetCommandInfo _ANSI_ARGS_((Tcl_Interp * interp, CONST char * cmdName, Tcl_CmdInfo * infoPtr)); /* 160 */ EXTERN CONST char * Tcl_GetCommandName _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Command command)); /* 161 */ EXTERN int Tcl_GetErrno _ANSI_ARGS_((void)); /* 162 */ EXTERN CONST char * Tcl_GetHostName _ANSI_ARGS_((void)); /* 163 */ EXTERN int Tcl_GetInterpPath _ANSI_ARGS_(( Tcl_Interp * askInterp, Tcl_Interp * slaveInterp)); /* 164 */ EXTERN Tcl_Interp * Tcl_GetMaster _ANSI_ARGS_((Tcl_Interp * interp)); /* 165 */ EXTERN CONST char * Tcl_GetNameOfExecutable _ANSI_ARGS_((void)); /* 166 */ EXTERN Tcl_Obj * Tcl_GetObjResult _ANSI_ARGS_((Tcl_Interp * interp)); #if !(defined(__WIN32__) || defined(MAC_TCL) || defined(MAC_OSX_TK))/* UNIX */ /* 167 */ EXTERN int Tcl_GetOpenFile _ANSI_ARGS_((Tcl_Interp * interp, CONST char * str, int forWriting, int checkUsage, ClientData * filePtr)); #endif /* UNIX */ /* 168 */ EXTERN Tcl_PathType Tcl_GetPathType _ANSI_ARGS_((CONST char * path)); /* 169 */ EXTERN int Tcl_Gets _ANSI_ARGS_((Tcl_Channel chan, Tcl_DString * dsPtr)); /* 170 */ EXTERN int Tcl_GetsObj _ANSI_ARGS_((Tcl_Channel chan, Tcl_Obj * objPtr)); /* 171 */ EXTERN int Tcl_GetServiceMode _ANSI_ARGS_((void)); /* 172 */ EXTERN Tcl_Interp * Tcl_GetSlave _ANSI_ARGS_((Tcl_Interp * interp, CONST char * slaveName)); /* 173 */ EXTERN Tcl_Channel Tcl_GetStdChannel _ANSI_ARGS_((int type)); /* 174 */ EXTERN CONST char * Tcl_GetStringResult _ANSI_ARGS_((Tcl_Interp * interp)); /* 175 */ EXTERN CONST char * Tcl_GetVar _ANSI_ARGS_((Tcl_Interp * interp, char * varName, int flags)); /* 176 */ EXTERN CONST char * Tcl_GetVar2 _ANSI_ARGS_((Tcl_Interp * interp, char * part1, char * part2, int flags)); /* 177 */ EXTERN int Tcl_GlobalEval _ANSI_ARGS_((Tcl_Interp * interp, char * command)); /* 178 */ EXTERN int Tcl_GlobalEvalObj _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * objPtr)); |
| ︙ | ︙ | |||
593 594 595 596 597 598 599 | /* 183 */ EXTERN int Tcl_InputBuffered _ANSI_ARGS_((Tcl_Channel chan)); /* 184 */ EXTERN int Tcl_InterpDeleted _ANSI_ARGS_((Tcl_Interp * interp)); /* 185 */ EXTERN int Tcl_IsSafe _ANSI_ARGS_((Tcl_Interp * interp)); /* 186 */ | | > | > | | | | | | | | | | | | | > | | 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 | /* 183 */ EXTERN int Tcl_InputBuffered _ANSI_ARGS_((Tcl_Channel chan)); /* 184 */ EXTERN int Tcl_InterpDeleted _ANSI_ARGS_((Tcl_Interp * interp)); /* 185 */ EXTERN int Tcl_IsSafe _ANSI_ARGS_((Tcl_Interp * interp)); /* 186 */ EXTERN CONST char * Tcl_JoinPath _ANSI_ARGS_((int argc, CONST84 char * CONST * argv, Tcl_DString * resultPtr)); /* 187 */ EXTERN int Tcl_LinkVar _ANSI_ARGS_((Tcl_Interp * interp, char * varName, char * addr, int type)); /* Slot 188 is reserved */ /* 189 */ EXTERN Tcl_Channel Tcl_MakeFileChannel _ANSI_ARGS_((ClientData handle, int mode)); /* 190 */ EXTERN int Tcl_MakeSafe _ANSI_ARGS_((Tcl_Interp * interp)); /* 191 */ EXTERN Tcl_Channel Tcl_MakeTcpClientChannel _ANSI_ARGS_(( ClientData tcpSocket)); /* 192 */ EXTERN char * Tcl_Merge _ANSI_ARGS_((int argc, CONST84 char * CONST * argv)); /* 193 */ EXTERN Tcl_HashEntry * Tcl_NextHashEntry _ANSI_ARGS_(( Tcl_HashSearch * searchPtr)); /* 194 */ EXTERN void Tcl_NotifyChannel _ANSI_ARGS_((Tcl_Channel channel, int mask)); /* 195 */ EXTERN Tcl_Obj * Tcl_ObjGetVar2 _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * part1Ptr, Tcl_Obj * part2Ptr, int flags)); /* 196 */ EXTERN Tcl_Obj * Tcl_ObjSetVar2 _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * part1Ptr, Tcl_Obj * part2Ptr, Tcl_Obj * newValuePtr, int flags)); #if !(defined(__WIN32__) || defined(MAC_TCL) || defined(MAC_OSX_TK))/* UNIX */ /* 197 */ EXTERN Tcl_Channel Tcl_OpenCommandChannel _ANSI_ARGS_(( Tcl_Interp * interp, int argc, CONST84 char ** argv, int flags)); #endif /* UNIX */ #ifdef __WIN32__ /* 197 */ EXTERN Tcl_Channel Tcl_OpenCommandChannel _ANSI_ARGS_(( Tcl_Interp * interp, int argc, CONST84 char ** argv, int flags)); #endif /* __WIN32__ */ /* 198 */ EXTERN Tcl_Channel Tcl_OpenFileChannel _ANSI_ARGS_((Tcl_Interp * interp, CONST char * fileName, CONST char * modeString, int permissions)); /* 199 */ EXTERN Tcl_Channel Tcl_OpenTcpClient _ANSI_ARGS_((Tcl_Interp * interp, int port, CONST char * address, CONST char * myaddr, int myport, int async)); /* 200 */ EXTERN Tcl_Channel Tcl_OpenTcpServer _ANSI_ARGS_((Tcl_Interp * interp, int port, CONST char * host, Tcl_TcpAcceptProc * acceptProc, ClientData callbackData)); /* 201 */ EXTERN void Tcl_Preserve _ANSI_ARGS_((ClientData data)); /* 202 */ EXTERN void Tcl_PrintDouble _ANSI_ARGS_((Tcl_Interp * interp, double value, char * dst)); /* 203 */ EXTERN int Tcl_PutEnv _ANSI_ARGS_((CONST char * string)); /* 204 */ EXTERN CONST char * Tcl_PosixError _ANSI_ARGS_((Tcl_Interp * interp)); /* 205 */ EXTERN void Tcl_QueueEvent _ANSI_ARGS_((Tcl_Event * evPtr, Tcl_QueuePosition position)); /* 206 */ EXTERN int Tcl_Read _ANSI_ARGS_((Tcl_Channel chan, char * bufPtr, int toRead)); #if !(defined(__WIN32__) || defined(MAC_TCL) || defined(MAC_OSX_TK))/* UNIX */ /* 207 */ EXTERN void Tcl_ReapDetachedProcs _ANSI_ARGS_((void)); #endif /* UNIX */ #ifdef __WIN32__ /* 207 */ EXTERN void Tcl_ReapDetachedProcs _ANSI_ARGS_((void)); #endif /* __WIN32__ */ /* 208 */ EXTERN int Tcl_RecordAndEval _ANSI_ARGS_((Tcl_Interp * interp, CONST char * cmd, int flags)); /* 209 */ EXTERN int Tcl_RecordAndEvalObj _ANSI_ARGS_(( Tcl_Interp * interp, Tcl_Obj * cmdPtr, int flags)); /* 210 */ EXTERN void Tcl_RegisterChannel _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Channel chan)); /* 211 */ EXTERN void Tcl_RegisterObjType _ANSI_ARGS_(( Tcl_ObjType * typePtr)); /* 212 */ EXTERN Tcl_RegExp Tcl_RegExpCompile _ANSI_ARGS_((Tcl_Interp * interp, CONST char * string)); /* 213 */ EXTERN int Tcl_RegExpExec _ANSI_ARGS_((Tcl_Interp * interp, Tcl_RegExp regexp, CONST char * str, CONST char * start)); /* 214 */ EXTERN int Tcl_RegExpMatch _ANSI_ARGS_((Tcl_Interp * interp, CONST char * str, CONST char * pattern)); /* 215 */ EXTERN void Tcl_RegExpRange _ANSI_ARGS_((Tcl_RegExp regexp, int index, CONST char ** startPtr, CONST char ** endPtr)); /* 216 */ EXTERN void Tcl_Release _ANSI_ARGS_((ClientData clientData)); /* 217 */ EXTERN void Tcl_ResetResult _ANSI_ARGS_((Tcl_Interp * interp)); /* 218 */ EXTERN int Tcl_ScanElement _ANSI_ARGS_((CONST char * str, int * flagPtr)); |
| ︙ | ︙ | |||
725 726 727 728 729 730 731 | ClientData clientData)); /* 224 */ EXTERN void Tcl_SetChannelBufferSize _ANSI_ARGS_(( Tcl_Channel chan, int sz)); /* 225 */ EXTERN int Tcl_SetChannelOption _ANSI_ARGS_(( Tcl_Interp * interp, Tcl_Channel chan, | > | | 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 | ClientData clientData)); /* 224 */ EXTERN void Tcl_SetChannelBufferSize _ANSI_ARGS_(( Tcl_Channel chan, int sz)); /* 225 */ EXTERN int Tcl_SetChannelOption _ANSI_ARGS_(( Tcl_Interp * interp, Tcl_Channel chan, CONST char * optionName, CONST char * newValue)); /* 226 */ EXTERN int Tcl_SetCommandInfo _ANSI_ARGS_((Tcl_Interp * interp, CONST char * cmdName, Tcl_CmdInfo * infoPtr)); /* 227 */ EXTERN void Tcl_SetErrno _ANSI_ARGS_((int err)); /* 228 */ EXTERN void Tcl_SetErrorCode _ANSI_ARGS_(TCL_VARARGS(Tcl_Interp *,interp)); |
| ︙ | ︙ | |||
756 757 758 759 760 761 762 | /* 235 */ EXTERN void Tcl_SetObjResult _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * resultObjPtr)); /* 236 */ EXTERN void Tcl_SetStdChannel _ANSI_ARGS_((Tcl_Channel channel, int type)); /* 237 */ | | > | | | | | | | | | | | | | | 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 | /* 235 */ EXTERN void Tcl_SetObjResult _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * resultObjPtr)); /* 236 */ EXTERN void Tcl_SetStdChannel _ANSI_ARGS_((Tcl_Channel channel, int type)); /* 237 */ EXTERN CONST char * Tcl_SetVar _ANSI_ARGS_((Tcl_Interp * interp, char * varName, CONST char * newValue, int flags)); /* 238 */ EXTERN CONST char * Tcl_SetVar2 _ANSI_ARGS_((Tcl_Interp * interp, char * part1, char * part2, CONST char * newValue, int flags)); /* 239 */ EXTERN CONST char * Tcl_SignalId _ANSI_ARGS_((int sig)); /* 240 */ EXTERN CONST char * Tcl_SignalMsg _ANSI_ARGS_((int sig)); /* 241 */ EXTERN void Tcl_SourceRCFile _ANSI_ARGS_((Tcl_Interp * interp)); /* 242 */ EXTERN int Tcl_SplitList _ANSI_ARGS_((Tcl_Interp * interp, CONST char * listStr, int * argcPtr, CONST84 char *** argvPtr)); /* 243 */ EXTERN void Tcl_SplitPath _ANSI_ARGS_((CONST char * path, int * argcPtr, CONST84 char *** argvPtr)); /* 244 */ EXTERN void Tcl_StaticPackage _ANSI_ARGS_((Tcl_Interp * interp, CONST char * pkgName, Tcl_PackageInitProc * initProc, Tcl_PackageInitProc * safeInitProc)); /* 245 */ EXTERN int Tcl_StringMatch _ANSI_ARGS_((CONST char * str, CONST char * pattern)); /* 246 */ EXTERN int Tcl_Tell _ANSI_ARGS_((Tcl_Channel chan)); /* 247 */ EXTERN int Tcl_TraceVar _ANSI_ARGS_((Tcl_Interp * interp, char * varName, int flags, Tcl_VarTraceProc * proc, ClientData clientData)); /* 248 */ EXTERN int Tcl_TraceVar2 _ANSI_ARGS_((Tcl_Interp * interp, char * part1, char * part2, int flags, Tcl_VarTraceProc * proc, ClientData clientData)); /* 249 */ EXTERN CONST char * Tcl_TranslateFileName _ANSI_ARGS_(( Tcl_Interp * interp, CONST char * name, Tcl_DString * bufferPtr)); /* 250 */ EXTERN int Tcl_Ungets _ANSI_ARGS_((Tcl_Channel chan, CONST char * str, int len, int atHead)); /* 251 */ EXTERN void Tcl_UnlinkVar _ANSI_ARGS_((Tcl_Interp * interp, char * varName)); /* 252 */ EXTERN int Tcl_UnregisterChannel _ANSI_ARGS_(( Tcl_Interp * interp, Tcl_Channel chan)); /* 253 */ |
| ︙ | ︙ | |||
849 850 851 852 853 854 855 | ClientData prevClientData)); /* 262 */ EXTERN ClientData Tcl_VarTraceInfo2 _ANSI_ARGS_((Tcl_Interp * interp, char * part1, char * part2, int flags, Tcl_VarTraceProc * procPtr, ClientData prevClientData)); /* 263 */ | | | | | | | 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 | ClientData prevClientData)); /* 262 */ EXTERN ClientData Tcl_VarTraceInfo2 _ANSI_ARGS_((Tcl_Interp * interp, char * part1, char * part2, int flags, Tcl_VarTraceProc * procPtr, ClientData prevClientData)); /* 263 */ EXTERN int Tcl_Write _ANSI_ARGS_((Tcl_Channel chan, CONST char * s, int slen)); /* 264 */ EXTERN void Tcl_WrongNumArgs _ANSI_ARGS_((Tcl_Interp * interp, int objc, Tcl_Obj *CONST objv[], CONST char * message)); /* 265 */ EXTERN int Tcl_DumpActiveMemory _ANSI_ARGS_(( CONST char * fileName)); /* 266 */ EXTERN void Tcl_ValidateAllMemory _ANSI_ARGS_((CONST char * file, int line)); /* 267 */ EXTERN void Tcl_AppendResultVA _ANSI_ARGS_((Tcl_Interp * interp, va_list argList)); /* 268 */ EXTERN void Tcl_AppendStringsToObjVA _ANSI_ARGS_(( Tcl_Obj * objPtr, va_list argList)); /* 269 */ EXTERN CONST char * Tcl_HashStats _ANSI_ARGS_((Tcl_HashTable * tablePtr)); /* 270 */ EXTERN CONST char * Tcl_ParseVar _ANSI_ARGS_((Tcl_Interp * interp, char * str, char ** termPtr)); /* 271 */ EXTERN CONST char * Tcl_PkgPresent _ANSI_ARGS_((Tcl_Interp * interp, CONST char * name, CONST char * version, int exact)); /* 272 */ EXTERN CONST char * Tcl_PkgPresentEx _ANSI_ARGS_((Tcl_Interp * interp, |
| ︙ | ︙ | |||
951 952 953 954 955 956 957 | EXTERN int Tcl_ExternalToUtf _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Encoding encoding, CONST char * src, int srcLen, int flags, Tcl_EncodingState * statePtr, char * dst, int dstLen, int * srcReadPtr, int * dstWrotePtr, int * dstCharsPtr)); /* 296 */ | | | | | | 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 | EXTERN int Tcl_ExternalToUtf _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Encoding encoding, CONST char * src, int srcLen, int flags, Tcl_EncodingState * statePtr, char * dst, int dstLen, int * srcReadPtr, int * dstWrotePtr, int * dstCharsPtr)); /* 296 */ EXTERN CONST char * Tcl_ExternalToUtfDString _ANSI_ARGS_(( Tcl_Encoding encoding, CONST char * src, int srcLen, Tcl_DString * dsPtr)); /* 297 */ EXTERN void Tcl_FinalizeThread _ANSI_ARGS_((void)); /* 298 */ EXTERN void Tcl_FinalizeNotifier _ANSI_ARGS_(( ClientData clientData)); /* 299 */ EXTERN void Tcl_FreeEncoding _ANSI_ARGS_((Tcl_Encoding encoding)); /* 300 */ EXTERN Tcl_ThreadId Tcl_GetCurrentThread _ANSI_ARGS_((void)); /* 301 */ EXTERN Tcl_Encoding Tcl_GetEncoding _ANSI_ARGS_((Tcl_Interp * interp, CONST char * name)); /* 302 */ EXTERN CONST char * Tcl_GetEncodingName _ANSI_ARGS_(( Tcl_Encoding encoding)); /* 303 */ EXTERN void Tcl_GetEncodingNames _ANSI_ARGS_(( Tcl_Interp * interp)); /* 304 */ EXTERN int Tcl_GetIndexFromObjStruct _ANSI_ARGS_(( Tcl_Interp * interp, Tcl_Obj * objPtr, CONST char ** tablePtr, int offset, CONST char * msg, int flags, int * indexPtr)); /* 305 */ EXTERN VOID * Tcl_GetThreadData _ANSI_ARGS_(( Tcl_ThreadDataKey * keyPtr, int size)); /* 306 */ EXTERN Tcl_Obj * Tcl_GetVar2Ex _ANSI_ARGS_((Tcl_Interp * interp, char * part1, char * part2, int flags)); /* 307 */ |
| ︙ | ︙ | |||
1034 1035 1036 1037 1038 1039 1040 | /* 322 */ EXTERN Tcl_UniChar Tcl_UniCharToTitle _ANSI_ARGS_((int ch)); /* 323 */ EXTERN Tcl_UniChar Tcl_UniCharToUpper _ANSI_ARGS_((int ch)); /* 324 */ EXTERN int Tcl_UniCharToUtf _ANSI_ARGS_((int ch, char * buf)); /* 325 */ | | | | | | | | | > | | | > | | 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 | /* 322 */ EXTERN Tcl_UniChar Tcl_UniCharToTitle _ANSI_ARGS_((int ch)); /* 323 */ EXTERN Tcl_UniChar Tcl_UniCharToUpper _ANSI_ARGS_((int ch)); /* 324 */ EXTERN int Tcl_UniCharToUtf _ANSI_ARGS_((int ch, char * buf)); /* 325 */ EXTERN CONST char * Tcl_UtfAtIndex _ANSI_ARGS_((CONST char * src, int index)); /* 326 */ EXTERN int Tcl_UtfCharComplete _ANSI_ARGS_((CONST char * src, int len)); /* 327 */ EXTERN int Tcl_UtfBackslash _ANSI_ARGS_((CONST char * src, int * readPtr, char * dst)); /* 328 */ EXTERN CONST char * Tcl_UtfFindFirst _ANSI_ARGS_((CONST char * src, int ch)); /* 329 */ EXTERN CONST char * Tcl_UtfFindLast _ANSI_ARGS_((CONST char * src, int ch)); /* 330 */ EXTERN CONST char * Tcl_UtfNext _ANSI_ARGS_((CONST char * src)); /* 331 */ EXTERN CONST char * Tcl_UtfPrev _ANSI_ARGS_((CONST char * src, CONST char * start)); /* 332 */ EXTERN int Tcl_UtfToExternal _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Encoding encoding, CONST char * src, int srcLen, int flags, Tcl_EncodingState * statePtr, char * dst, int dstLen, int * srcReadPtr, int * dstWrotePtr, int * dstCharsPtr)); /* 333 */ EXTERN CONST char * Tcl_UtfToExternalDString _ANSI_ARGS_(( Tcl_Encoding encoding, CONST char * src, int srcLen, Tcl_DString * dsPtr)); /* 334 */ EXTERN int Tcl_UtfToLower _ANSI_ARGS_((char * src)); /* 335 */ EXTERN int Tcl_UtfToTitle _ANSI_ARGS_((char * src)); /* 336 */ EXTERN int Tcl_UtfToUniChar _ANSI_ARGS_((CONST char * src, Tcl_UniChar * chPtr)); /* 337 */ EXTERN int Tcl_UtfToUpper _ANSI_ARGS_((char * src)); /* 338 */ EXTERN int Tcl_WriteChars _ANSI_ARGS_((Tcl_Channel chan, CONST char * src, int srcLen)); /* 339 */ EXTERN int Tcl_WriteObj _ANSI_ARGS_((Tcl_Channel chan, Tcl_Obj * objPtr)); /* 340 */ EXTERN char * Tcl_GetString _ANSI_ARGS_((Tcl_Obj * objPtr)); /* 341 */ EXTERN CONST char * Tcl_GetDefaultEncodingDir _ANSI_ARGS_((void)); /* 342 */ EXTERN void Tcl_SetDefaultEncodingDir _ANSI_ARGS_(( CONST char * path)); /* 343 */ EXTERN void Tcl_AlertNotifier _ANSI_ARGS_((ClientData clientData)); /* 344 */ EXTERN void Tcl_ServiceModeHook _ANSI_ARGS_((int mode)); /* 345 */ EXTERN int Tcl_UniCharIsAlnum _ANSI_ARGS_((int ch)); /* 346 */ EXTERN int Tcl_UniCharIsAlpha _ANSI_ARGS_((int ch)); /* 347 */ EXTERN int Tcl_UniCharIsDigit _ANSI_ARGS_((int ch)); /* 348 */ EXTERN int Tcl_UniCharIsLower _ANSI_ARGS_((int ch)); /* 349 */ EXTERN int Tcl_UniCharIsSpace _ANSI_ARGS_((int ch)); /* 350 */ EXTERN int Tcl_UniCharIsUpper _ANSI_ARGS_((int ch)); /* 351 */ EXTERN int Tcl_UniCharIsWordChar _ANSI_ARGS_((int ch)); /* 352 */ EXTERN int Tcl_UniCharLen _ANSI_ARGS_((CONST Tcl_UniChar * str)); /* 353 */ EXTERN int Tcl_UniCharNcmp _ANSI_ARGS_((CONST Tcl_UniChar * cs, CONST Tcl_UniChar * ct, unsigned long n)); /* 354 */ EXTERN CONST char * Tcl_UniCharToUtfDString _ANSI_ARGS_(( CONST Tcl_UniChar * string, int numChars, Tcl_DString * dsPtr)); /* 355 */ EXTERN CONST Tcl_UniChar * Tcl_UtfToUniCharDString _ANSI_ARGS_(( CONST char * string, int length, Tcl_DString * dsPtr)); /* 356 */ EXTERN Tcl_RegExp Tcl_GetRegExpFromObj _ANSI_ARGS_(( Tcl_Interp * interp, Tcl_Obj * patObj, int flags)); /* 357 */ EXTERN Tcl_Obj * Tcl_EvalTokens _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Token * tokenPtr, int count)); /* 358 */ EXTERN void Tcl_FreeParse _ANSI_ARGS_((Tcl_Parse * parsePtr)); /* 359 */ EXTERN void Tcl_LogCommandInfo _ANSI_ARGS_((Tcl_Interp * interp, CONST char * script, CONST char * command, int length)); /* 360 */ EXTERN int Tcl_ParseBraces _ANSI_ARGS_((Tcl_Interp * interp, char * string, int numBytes, Tcl_Parse * parsePtr, int append, char ** termPtr)); /* 361 */ EXTERN int Tcl_ParseCommand _ANSI_ARGS_((Tcl_Interp * interp, |
| ︙ | ︙ | |||
1151 1152 1153 1154 1155 1156 1157 | int numBytes, Tcl_Parse * parsePtr, int append, char ** termPtr)); /* 364 */ EXTERN int Tcl_ParseVarName _ANSI_ARGS_((Tcl_Interp * interp, char * string, int numBytes, Tcl_Parse * parsePtr, int append)); /* 365 */ | | | 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 | int numBytes, Tcl_Parse * parsePtr, int append, char ** termPtr)); /* 364 */ EXTERN int Tcl_ParseVarName _ANSI_ARGS_((Tcl_Interp * interp, char * string, int numBytes, Tcl_Parse * parsePtr, int append)); /* 365 */ EXTERN CONST char * Tcl_GetCwd _ANSI_ARGS_((Tcl_Interp * interp, Tcl_DString * cwdPtr)); /* 366 */ EXTERN int Tcl_Chdir _ANSI_ARGS_((CONST char * dirName)); /* 367 */ EXTERN int Tcl_Access _ANSI_ARGS_((CONST char * path, int mode)); /* 368 */ EXTERN int Tcl_Stat _ANSI_ARGS_((CONST char * path, |
| ︙ | ︙ | |||
1215 1216 1217 1218 1219 1220 1221 | Tcl_NotifierProcs * notifierProcPtr)); /* 387 */ EXTERN Tcl_Mutex * Tcl_GetAllocMutex _ANSI_ARGS_((void)); /* 388 */ EXTERN int Tcl_GetChannelNames _ANSI_ARGS_((Tcl_Interp * interp)); /* 389 */ EXTERN int Tcl_GetChannelNamesEx _ANSI_ARGS_(( | | | | | 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 | Tcl_NotifierProcs * notifierProcPtr)); /* 387 */ EXTERN Tcl_Mutex * Tcl_GetAllocMutex _ANSI_ARGS_((void)); /* 388 */ EXTERN int Tcl_GetChannelNames _ANSI_ARGS_((Tcl_Interp * interp)); /* 389 */ EXTERN int Tcl_GetChannelNamesEx _ANSI_ARGS_(( Tcl_Interp * interp, CONST char * pattern)); /* 390 */ EXTERN int Tcl_ProcObjCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp * interp, int objc, Tcl_Obj *CONST objv[])); /* 391 */ EXTERN void Tcl_ConditionFinalize _ANSI_ARGS_(( Tcl_Condition * condPtr)); /* 392 */ EXTERN void Tcl_MutexFinalize _ANSI_ARGS_((Tcl_Mutex * mutex)); /* 393 */ EXTERN int Tcl_CreateThread _ANSI_ARGS_((Tcl_ThreadId * idPtr, Tcl_ThreadCreateProc proc, ClientData clientData, int stackSize, int flags)); /* 394 */ EXTERN int Tcl_ReadRaw _ANSI_ARGS_((Tcl_Channel chan, char * dst, int bytesToRead)); /* 395 */ EXTERN int Tcl_WriteRaw _ANSI_ARGS_((Tcl_Channel chan, CONST char * src, int srcLen)); /* 396 */ EXTERN Tcl_Channel Tcl_GetTopChannel _ANSI_ARGS_((Tcl_Channel chan)); /* 397 */ EXTERN int Tcl_ChannelBuffered _ANSI_ARGS_((Tcl_Channel chan)); /* 398 */ EXTERN CONST char * Tcl_ChannelName _ANSI_ARGS_(( Tcl_ChannelType * chanTypePtr)); /* 399 */ EXTERN Tcl_ChannelTypeVersion Tcl_ChannelVersion _ANSI_ARGS_(( Tcl_ChannelType * chanTypePtr)); /* 400 */ EXTERN Tcl_DriverBlockModeProc * Tcl_ChannelBlockModeProc _ANSI_ARGS_(( Tcl_ChannelType * chanTypePtr)); |
| ︙ | ︙ | |||
1324 1325 1326 1327 1328 1329 1330 | Tcl_HashTable * tablePtr, int keyType, Tcl_HashKeyType * typePtr)); /* 424 */ EXTERN void Tcl_InitObjHashTable _ANSI_ARGS_(( Tcl_HashTable * tablePtr)); /* 425 */ EXTERN ClientData Tcl_CommandTraceInfo _ANSI_ARGS_(( | | | | | | > | 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 | Tcl_HashTable * tablePtr, int keyType, Tcl_HashKeyType * typePtr)); /* 424 */ EXTERN void Tcl_InitObjHashTable _ANSI_ARGS_(( Tcl_HashTable * tablePtr)); /* 425 */ EXTERN ClientData Tcl_CommandTraceInfo _ANSI_ARGS_(( Tcl_Interp * interp, CONST char * varName, int flags, Tcl_CommandTraceProc * procPtr, ClientData prevClientData)); /* 426 */ EXTERN int Tcl_TraceCommand _ANSI_ARGS_((Tcl_Interp * interp, CONST char * varName, int flags, Tcl_CommandTraceProc * proc, ClientData clientData)); /* 427 */ EXTERN void Tcl_UntraceCommand _ANSI_ARGS_((Tcl_Interp * interp, CONST char * varName, int flags, Tcl_CommandTraceProc * proc, ClientData clientData)); /* 428 */ EXTERN char * Tcl_AttemptAlloc _ANSI_ARGS_((unsigned int size)); /* 429 */ EXTERN char * Tcl_AttemptDbCkalloc _ANSI_ARGS_((unsigned int size, CONST char * file, int line)); /* 430 */ EXTERN char * Tcl_AttemptRealloc _ANSI_ARGS_((char * ptr, unsigned int size)); /* 431 */ EXTERN char * Tcl_AttemptDbCkrealloc _ANSI_ARGS_((char * ptr, unsigned int size, CONST char * file, int line)); /* 432 */ EXTERN int Tcl_AttemptSetObjLength _ANSI_ARGS_(( Tcl_Obj * objPtr, int length)); /* 433 */ EXTERN Tcl_ThreadId Tcl_GetChannelThread _ANSI_ARGS_(( Tcl_Channel channel)); /* 434 */ |
| ︙ | ︙ | |||
1397 1398 1399 1400 1401 1402 1403 | Tcl_PackageInitProc ** proc1Ptr, Tcl_PackageInitProc ** proc2Ptr, ClientData * clientDataPtr, Tcl_FSUnloadFileProc ** unloadProcPtr)); /* 445 */ EXTERN int Tcl_FSMatchInDirectory _ANSI_ARGS_(( Tcl_Interp * interp, Tcl_Obj * result, | | | 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 | Tcl_PackageInitProc ** proc1Ptr, Tcl_PackageInitProc ** proc2Ptr, ClientData * clientDataPtr, Tcl_FSUnloadFileProc ** unloadProcPtr)); /* 445 */ EXTERN int Tcl_FSMatchInDirectory _ANSI_ARGS_(( Tcl_Interp * interp, Tcl_Obj * result, Tcl_Obj * pathPtr, CONST char * pattern, Tcl_GlobTypeData * types)); /* 446 */ EXTERN Tcl_Obj* Tcl_FSLink _ANSI_ARGS_((Tcl_Obj * pathPtr, Tcl_Obj * toPtr)); /* 447 */ EXTERN int Tcl_FSRemoveDirectory _ANSI_ARGS_((Tcl_Obj * pathPtr, int recursive, Tcl_Obj ** errorPtr)); |
| ︙ | ︙ | |||
1423 1424 1425 1426 1427 1428 1429 | int index, Tcl_Obj * pathPtr, Tcl_Obj ** objPtrRef)); /* 452 */ EXTERN int Tcl_FSFileAttrsSet _ANSI_ARGS_((Tcl_Interp * interp, int index, Tcl_Obj * pathPtr, Tcl_Obj * objPtr)); /* 453 */ | | | | 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 | int index, Tcl_Obj * pathPtr, Tcl_Obj ** objPtrRef)); /* 452 */ EXTERN int Tcl_FSFileAttrsSet _ANSI_ARGS_((Tcl_Interp * interp, int index, Tcl_Obj * pathPtr, Tcl_Obj * objPtr)); /* 453 */ EXTERN CONST char ** Tcl_FSFileAttrStrings _ANSI_ARGS_((Tcl_Obj * pathPtr, Tcl_Obj ** objPtrRef)); /* 454 */ EXTERN int Tcl_FSStat _ANSI_ARGS_((Tcl_Obj * pathPtr, struct stat * buf)); /* 455 */ EXTERN int Tcl_FSAccess _ANSI_ARGS_((Tcl_Obj * pathPtr, int mode)); /* 456 */ EXTERN Tcl_Channel Tcl_FSOpenFileChannel _ANSI_ARGS_(( Tcl_Interp * interp, Tcl_Obj * pathPtr, CONST char * modeString, int permissions)); /* 457 */ EXTERN Tcl_Obj* Tcl_FSGetCwd _ANSI_ARGS_((Tcl_Interp * interp)); /* 458 */ EXTERN int Tcl_FSChdir _ANSI_ARGS_((Tcl_Obj * pathPtr)); /* 459 */ EXTERN int Tcl_FSConvertToPathType _ANSI_ARGS_(( Tcl_Interp * interp, Tcl_Obj * pathPtr)); |
| ︙ | ︙ | |||
1471 1472 1473 1474 1475 1476 1477 | EXTERN int Tcl_FSEvalFile _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * fileName)); /* 468 */ EXTERN Tcl_Obj* Tcl_FSNewNativePath _ANSI_ARGS_(( Tcl_Obj* fromFilesystem, ClientData clientData)); /* 469 */ | | | > > | 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 |
EXTERN int Tcl_FSEvalFile _ANSI_ARGS_((Tcl_Interp * interp,
Tcl_Obj * fileName));
/* 468 */
EXTERN Tcl_Obj* Tcl_FSNewNativePath _ANSI_ARGS_((
Tcl_Obj* fromFilesystem,
ClientData clientData));
/* 469 */
EXTERN CONST char* Tcl_FSGetNativePath _ANSI_ARGS_((Tcl_Obj* pathObjPtr));
/* 470 */
EXTERN Tcl_Obj* Tcl_FSFileSystemInfo _ANSI_ARGS_((
Tcl_Obj* pathObjPtr));
/* 471 */
EXTERN Tcl_Obj* Tcl_FSPathSeparator _ANSI_ARGS_((Tcl_Obj* pathObjPtr));
/* 472 */
EXTERN Tcl_Obj* Tcl_FSListVolumes _ANSI_ARGS_((void));
/* 473 */
EXTERN int Tcl_FSRegister _ANSI_ARGS_((ClientData clientData,
Tcl_Filesystem * fsPtr));
/* 474 */
EXTERN int Tcl_FSUnregister _ANSI_ARGS_((Tcl_Filesystem * fsPtr));
/* 475 */
EXTERN ClientData Tcl_FSData _ANSI_ARGS_((Tcl_Filesystem * fsPtr));
/* 476 */
EXTERN CONST char* Tcl_FSGetTranslatedStringPath _ANSI_ARGS_((
Tcl_Interp * interp, Tcl_Obj* pathPtr));
/* 477 */
EXTERN Tcl_Filesystem* Tcl_FSGetFileSystemForPath _ANSI_ARGS_((
Tcl_Obj* pathObjPtr));
/* 478 */
EXTERN Tcl_PathType Tcl_FSGetPathType _ANSI_ARGS_((Tcl_Obj * pathObjPtr));
/* 479 */
EXTERN int Tcl_OutputBuffered _ANSI_ARGS_((Tcl_Channel chan));
/* 480 */
EXTERN void Tcl_FSMountsChanged _ANSI_ARGS_((
Tcl_Filesystem * fsPtr));
/* 481 */
EXTERN int Tcl_EvalTokensStandard _ANSI_ARGS_((
Tcl_Interp * interp, Tcl_Token * tokenPtr,
int count));
/* 482 */
EXTERN void Tcl_GetTime _ANSI_ARGS_((Tcl_Time* timeBuf));
typedef struct TclStubHooks {
struct TclPlatStubs *tclPlatStubs;
struct TclIntStubs *tclIntStubs;
struct TclIntPlatStubs *tclIntPlatStubs;
} TclStubHooks;
|
| ︙ | ︙ | |||
1566 1567 1568 1569 1570 1571 1572 |
Tcl_Obj * (*tcl_DuplicateObj) _ANSI_ARGS_((Tcl_Obj * objPtr)); /* 29 */
void (*tclFreeObj) _ANSI_ARGS_((Tcl_Obj * objPtr)); /* 30 */
int (*tcl_GetBoolean) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * str, int * boolPtr)); /* 31 */
int (*tcl_GetBooleanFromObj) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * objPtr, int * boolPtr)); /* 32 */
unsigned char * (*tcl_GetByteArrayFromObj) _ANSI_ARGS_((Tcl_Obj * objPtr, int * lengthPtr)); /* 33 */
int (*tcl_GetDouble) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * str, double * doublePtr)); /* 34 */
int (*tcl_GetDoubleFromObj) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * objPtr, double * doublePtr)); /* 35 */
| | | | 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 |
Tcl_Obj * (*tcl_DuplicateObj) _ANSI_ARGS_((Tcl_Obj * objPtr)); /* 29 */
void (*tclFreeObj) _ANSI_ARGS_((Tcl_Obj * objPtr)); /* 30 */
int (*tcl_GetBoolean) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * str, int * boolPtr)); /* 31 */
int (*tcl_GetBooleanFromObj) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * objPtr, int * boolPtr)); /* 32 */
unsigned char * (*tcl_GetByteArrayFromObj) _ANSI_ARGS_((Tcl_Obj * objPtr, int * lengthPtr)); /* 33 */
int (*tcl_GetDouble) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * str, double * doublePtr)); /* 34 */
int (*tcl_GetDoubleFromObj) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * objPtr, double * doublePtr)); /* 35 */
int (*tcl_GetIndexFromObj) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * objPtr, CONST84 char ** tablePtr, CONST char * msg, int flags, int * indexPtr)); /* 36 */
int (*tcl_GetInt) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * str, int * intPtr)); /* 37 */
int (*tcl_GetIntFromObj) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * objPtr, int * intPtr)); /* 38 */
int (*tcl_GetLongFromObj) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * objPtr, long * longPtr)); /* 39 */
Tcl_ObjType * (*tcl_GetObjType) _ANSI_ARGS_((CONST char * typeName)); /* 40 */
char * (*tcl_GetStringFromObj) _ANSI_ARGS_((Tcl_Obj * objPtr, int * lengthPtr)); /* 41 */
void (*tcl_InvalidateStringRep) _ANSI_ARGS_((Tcl_Obj * objPtr)); /* 42 */
int (*tcl_ListObjAppendList) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * listPtr, Tcl_Obj * elemListPtr)); /* 43 */
int (*tcl_ListObjAppendElement) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * listPtr, Tcl_Obj * objPtr)); /* 44 */
int (*tcl_ListObjGetElements) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * listPtr, int * objcPtr, Tcl_Obj *** objvPtr)); /* 45 */
int (*tcl_ListObjIndex) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * listPtr, int index, Tcl_Obj ** objPtrPtr)); /* 46 */
int (*tcl_ListObjLength) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * listPtr, int * intPtr)); /* 47 */
|
| ︙ | ︙ | |||
1608 1609 1610 1611 1612 1613 1614 |
Tcl_AsyncHandler (*tcl_AsyncCreate) _ANSI_ARGS_((Tcl_AsyncProc * proc, ClientData clientData)); /* 71 */
void (*tcl_AsyncDelete) _ANSI_ARGS_((Tcl_AsyncHandler async)); /* 72 */
int (*tcl_AsyncInvoke) _ANSI_ARGS_((Tcl_Interp * interp, int code)); /* 73 */
void (*tcl_AsyncMark) _ANSI_ARGS_((Tcl_AsyncHandler async)); /* 74 */
int (*tcl_AsyncReady) _ANSI_ARGS_((void)); /* 75 */
void (*tcl_BackgroundError) _ANSI_ARGS_((Tcl_Interp * interp)); /* 76 */
char (*tcl_Backslash) _ANSI_ARGS_((CONST char * src, int * readPtr)); /* 77 */
| | | | | | | | 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 |
Tcl_AsyncHandler (*tcl_AsyncCreate) _ANSI_ARGS_((Tcl_AsyncProc * proc, ClientData clientData)); /* 71 */
void (*tcl_AsyncDelete) _ANSI_ARGS_((Tcl_AsyncHandler async)); /* 72 */
int (*tcl_AsyncInvoke) _ANSI_ARGS_((Tcl_Interp * interp, int code)); /* 73 */
void (*tcl_AsyncMark) _ANSI_ARGS_((Tcl_AsyncHandler async)); /* 74 */
int (*tcl_AsyncReady) _ANSI_ARGS_((void)); /* 75 */
void (*tcl_BackgroundError) _ANSI_ARGS_((Tcl_Interp * interp)); /* 76 */
char (*tcl_Backslash) _ANSI_ARGS_((CONST char * src, int * readPtr)); /* 77 */
int (*tcl_BadChannelOption) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * optionName, CONST char * optionList)); /* 78 */
void (*tcl_CallWhenDeleted) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_InterpDeleteProc * proc, ClientData clientData)); /* 79 */
void (*tcl_CancelIdleCall) _ANSI_ARGS_((Tcl_IdleProc * idleProc, ClientData clientData)); /* 80 */
int (*tcl_Close) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Channel chan)); /* 81 */
int (*tcl_CommandComplete) _ANSI_ARGS_((char * cmd)); /* 82 */
char * (*tcl_Concat) _ANSI_ARGS_((int argc, CONST84 char * CONST * argv)); /* 83 */
int (*tcl_ConvertElement) _ANSI_ARGS_((CONST char * src, char * dst, int flags)); /* 84 */
int (*tcl_ConvertCountedElement) _ANSI_ARGS_((CONST char * src, int length, char * dst, int flags)); /* 85 */
int (*tcl_CreateAlias) _ANSI_ARGS_((Tcl_Interp * slave, CONST char * slaveCmd, Tcl_Interp * target, CONST char * targetCmd, int argc, char * CONST * argv)); /* 86 */
int (*tcl_CreateAliasObj) _ANSI_ARGS_((Tcl_Interp * slave, CONST char * slaveCmd, Tcl_Interp * target, CONST char * targetCmd, int objc, Tcl_Obj *CONST objv[])); /* 87 */
Tcl_Channel (*tcl_CreateChannel) _ANSI_ARGS_((Tcl_ChannelType * typePtr, CONST char * chanName, ClientData instanceData, int mask)); /* 88 */
void (*tcl_CreateChannelHandler) _ANSI_ARGS_((Tcl_Channel chan, int mask, Tcl_ChannelProc * proc, ClientData clientData)); /* 89 */
void (*tcl_CreateCloseHandler) _ANSI_ARGS_((Tcl_Channel chan, Tcl_CloseProc * proc, ClientData clientData)); /* 90 */
Tcl_Command (*tcl_CreateCommand) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * cmdName, Tcl_CmdProc * proc, ClientData clientData, Tcl_CmdDeleteProc * deleteProc)); /* 91 */
void (*tcl_CreateEventSource) _ANSI_ARGS_((Tcl_EventSetupProc * setupProc, Tcl_EventCheckProc * checkProc, ClientData clientData)); /* 92 */
void (*tcl_CreateExitHandler) _ANSI_ARGS_((Tcl_ExitProc * proc, ClientData clientData)); /* 93 */
Tcl_Interp * (*tcl_CreateInterp) _ANSI_ARGS_((void)); /* 94 */
void (*tcl_CreateMathFunc) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * name, int numArgs, Tcl_ValueType * argTypes, Tcl_MathProc * proc, ClientData clientData)); /* 95 */
Tcl_Command (*tcl_CreateObjCommand) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * cmdName, Tcl_ObjCmdProc * proc, ClientData clientData, Tcl_CmdDeleteProc * deleteProc)); /* 96 */
Tcl_Interp * (*tcl_CreateSlave) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * slaveName, int isSafe)); /* 97 */
Tcl_TimerToken (*tcl_CreateTimerHandler) _ANSI_ARGS_((int milliseconds, Tcl_TimerProc * proc, ClientData clientData)); /* 98 */
Tcl_Trace (*tcl_CreateTrace) _ANSI_ARGS_((Tcl_Interp * interp, int level, Tcl_CmdTraceProc * proc, ClientData clientData)); /* 99 */
void (*tcl_DeleteAssocData) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * name)); /* 100 */
void (*tcl_DeleteChannelHandler) _ANSI_ARGS_((Tcl_Channel chan, Tcl_ChannelProc * proc, ClientData clientData)); /* 101 */
void (*tcl_DeleteCloseHandler) _ANSI_ARGS_((Tcl_Channel chan, Tcl_CloseProc * proc, ClientData clientData)); /* 102 */
int (*tcl_DeleteCommand) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * cmdName)); /* 103 */
int (*tcl_DeleteCommandFromToken) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Command command)); /* 104 */
|
| ︙ | ︙ | |||
1665 1666 1667 1668 1669 1670 1671 |
void (*tcl_DStringFree) _ANSI_ARGS_((Tcl_DString * dsPtr)); /* 120 */
void (*tcl_DStringGetResult) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_DString * dsPtr)); /* 121 */
void (*tcl_DStringInit) _ANSI_ARGS_((Tcl_DString * dsPtr)); /* 122 */
void (*tcl_DStringResult) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_DString * dsPtr)); /* 123 */
void (*tcl_DStringSetLength) _ANSI_ARGS_((Tcl_DString * dsPtr, int length)); /* 124 */
void (*tcl_DStringStartSublist) _ANSI_ARGS_((Tcl_DString * dsPtr)); /* 125 */
int (*tcl_Eof) _ANSI_ARGS_((Tcl_Channel chan)); /* 126 */
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 |
void (*tcl_DStringFree) _ANSI_ARGS_((Tcl_DString * dsPtr)); /* 120 */
void (*tcl_DStringGetResult) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_DString * dsPtr)); /* 121 */
void (*tcl_DStringInit) _ANSI_ARGS_((Tcl_DString * dsPtr)); /* 122 */
void (*tcl_DStringResult) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_DString * dsPtr)); /* 123 */
void (*tcl_DStringSetLength) _ANSI_ARGS_((Tcl_DString * dsPtr, int length)); /* 124 */
void (*tcl_DStringStartSublist) _ANSI_ARGS_((Tcl_DString * dsPtr)); /* 125 */
int (*tcl_Eof) _ANSI_ARGS_((Tcl_Channel chan)); /* 126 */
CONST char * (*tcl_ErrnoId) _ANSI_ARGS_((void)); /* 127 */
CONST char * (*tcl_ErrnoMsg) _ANSI_ARGS_((int err)); /* 128 */
int (*tcl_Eval) _ANSI_ARGS_((Tcl_Interp * interp, char * string)); /* 129 */
int (*tcl_EvalFile) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * fileName)); /* 130 */
int (*tcl_EvalObj) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * objPtr)); /* 131 */
void (*tcl_EventuallyFree) _ANSI_ARGS_((ClientData clientData, Tcl_FreeProc * freeProc)); /* 132 */
void (*tcl_Exit) _ANSI_ARGS_((int status)); /* 133 */
int (*tcl_ExposeCommand) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * hiddenCmdToken, CONST char * cmdName)); /* 134 */
int (*tcl_ExprBoolean) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * str, int * ptr)); /* 135 */
int (*tcl_ExprBooleanObj) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * objPtr, int * ptr)); /* 136 */
int (*tcl_ExprDouble) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * str, double * ptr)); /* 137 */
int (*tcl_ExprDoubleObj) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * objPtr, double * ptr)); /* 138 */
int (*tcl_ExprLong) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * str, long * ptr)); /* 139 */
int (*tcl_ExprLongObj) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * objPtr, long * ptr)); /* 140 */
int (*tcl_ExprObj) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * objPtr, Tcl_Obj ** resultPtrPtr)); /* 141 */
int (*tcl_ExprString) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * string)); /* 142 */
void (*tcl_Finalize) _ANSI_ARGS_((void)); /* 143 */
void (*tcl_FindExecutable) _ANSI_ARGS_((CONST char * argv0)); /* 144 */
Tcl_HashEntry * (*tcl_FirstHashEntry) _ANSI_ARGS_((Tcl_HashTable * tablePtr, Tcl_HashSearch * searchPtr)); /* 145 */
int (*tcl_Flush) _ANSI_ARGS_((Tcl_Channel chan)); /* 146 */
void (*tcl_FreeResult) _ANSI_ARGS_((Tcl_Interp * interp)); /* 147 */
int (*tcl_GetAlias) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * slaveCmd, Tcl_Interp ** targetInterpPtr, CONST84 char ** targetCmdPtr, int * argcPtr, char *** argvPtr)); /* 148 */
int (*tcl_GetAliasObj) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * slaveCmd, Tcl_Interp ** targetInterpPtr, CONST84 char ** targetCmdPtr, int * objcPtr, Tcl_Obj *** objv)); /* 149 */
ClientData (*tcl_GetAssocData) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * name, Tcl_InterpDeleteProc ** procPtr)); /* 150 */
Tcl_Channel (*tcl_GetChannel) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * chanName, int * modePtr)); /* 151 */
int (*tcl_GetChannelBufferSize) _ANSI_ARGS_((Tcl_Channel chan)); /* 152 */
int (*tcl_GetChannelHandle) _ANSI_ARGS_((Tcl_Channel chan, int direction, ClientData * handlePtr)); /* 153 */
ClientData (*tcl_GetChannelInstanceData) _ANSI_ARGS_((Tcl_Channel chan)); /* 154 */
int (*tcl_GetChannelMode) _ANSI_ARGS_((Tcl_Channel chan)); /* 155 */
CONST char * (*tcl_GetChannelName) _ANSI_ARGS_((Tcl_Channel chan)); /* 156 */
int (*tcl_GetChannelOption) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Channel chan, CONST char * optionName, Tcl_DString * dsPtr)); /* 157 */
Tcl_ChannelType * (*tcl_GetChannelType) _ANSI_ARGS_((Tcl_Channel chan)); /* 158 */
int (*tcl_GetCommandInfo) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * cmdName, Tcl_CmdInfo * infoPtr)); /* 159 */
CONST char * (*tcl_GetCommandName) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Command command)); /* 160 */
int (*tcl_GetErrno) _ANSI_ARGS_((void)); /* 161 */
CONST char * (*tcl_GetHostName) _ANSI_ARGS_((void)); /* 162 */
int (*tcl_GetInterpPath) _ANSI_ARGS_((Tcl_Interp * askInterp, Tcl_Interp * slaveInterp)); /* 163 */
Tcl_Interp * (*tcl_GetMaster) _ANSI_ARGS_((Tcl_Interp * interp)); /* 164 */
CONST char * (*tcl_GetNameOfExecutable) _ANSI_ARGS_((void)); /* 165 */
Tcl_Obj * (*tcl_GetObjResult) _ANSI_ARGS_((Tcl_Interp * interp)); /* 166 */
#if !(defined(__WIN32__) || defined(MAC_TCL) || defined(MAC_OSX_TK))/* UNIX */
int (*tcl_GetOpenFile) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * str, int forWriting, int checkUsage, ClientData * filePtr)); /* 167 */
#endif /* UNIX */
#ifdef __WIN32__
void *reserved167;
#endif /* __WIN32__ */
#ifdef MAC_TCL
void *reserved167;
#endif /* MAC_TCL */
Tcl_PathType (*tcl_GetPathType) _ANSI_ARGS_((CONST char * path)); /* 168 */
int (*tcl_Gets) _ANSI_ARGS_((Tcl_Channel chan, Tcl_DString * dsPtr)); /* 169 */
int (*tcl_GetsObj) _ANSI_ARGS_((Tcl_Channel chan, Tcl_Obj * objPtr)); /* 170 */
int (*tcl_GetServiceMode) _ANSI_ARGS_((void)); /* 171 */
Tcl_Interp * (*tcl_GetSlave) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * slaveName)); /* 172 */
Tcl_Channel (*tcl_GetStdChannel) _ANSI_ARGS_((int type)); /* 173 */
CONST char * (*tcl_GetStringResult) _ANSI_ARGS_((Tcl_Interp * interp)); /* 174 */
CONST char * (*tcl_GetVar) _ANSI_ARGS_((Tcl_Interp * interp, char * varName, int flags)); /* 175 */
CONST char * (*tcl_GetVar2) _ANSI_ARGS_((Tcl_Interp * interp, char * part1, char * part2, int flags)); /* 176 */
int (*tcl_GlobalEval) _ANSI_ARGS_((Tcl_Interp * interp, char * command)); /* 177 */
int (*tcl_GlobalEvalObj) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * objPtr)); /* 178 */
int (*tcl_HideCommand) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * cmdName, CONST char * hiddenCmdToken)); /* 179 */
int (*tcl_Init) _ANSI_ARGS_((Tcl_Interp * interp)); /* 180 */
void (*tcl_InitHashTable) _ANSI_ARGS_((Tcl_HashTable * tablePtr, int keyType)); /* 181 */
int (*tcl_InputBlocked) _ANSI_ARGS_((Tcl_Channel chan)); /* 182 */
int (*tcl_InputBuffered) _ANSI_ARGS_((Tcl_Channel chan)); /* 183 */
int (*tcl_InterpDeleted) _ANSI_ARGS_((Tcl_Interp * interp)); /* 184 */
int (*tcl_IsSafe) _ANSI_ARGS_((Tcl_Interp * interp)); /* 185 */
CONST char * (*tcl_JoinPath) _ANSI_ARGS_((int argc, CONST84 char * CONST * argv, Tcl_DString * resultPtr)); /* 186 */
int (*tcl_LinkVar) _ANSI_ARGS_((Tcl_Interp * interp, char * varName, char * addr, int type)); /* 187 */
void *reserved188;
Tcl_Channel (*tcl_MakeFileChannel) _ANSI_ARGS_((ClientData handle, int mode)); /* 189 */
int (*tcl_MakeSafe) _ANSI_ARGS_((Tcl_Interp * interp)); /* 190 */
Tcl_Channel (*tcl_MakeTcpClientChannel) _ANSI_ARGS_((ClientData tcpSocket)); /* 191 */
char * (*tcl_Merge) _ANSI_ARGS_((int argc, CONST84 char * CONST * argv)); /* 192 */
Tcl_HashEntry * (*tcl_NextHashEntry) _ANSI_ARGS_((Tcl_HashSearch * searchPtr)); /* 193 */
void (*tcl_NotifyChannel) _ANSI_ARGS_((Tcl_Channel channel, int mask)); /* 194 */
Tcl_Obj * (*tcl_ObjGetVar2) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * part1Ptr, Tcl_Obj * part2Ptr, int flags)); /* 195 */
Tcl_Obj * (*tcl_ObjSetVar2) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * part1Ptr, Tcl_Obj * part2Ptr, Tcl_Obj * newValuePtr, int flags)); /* 196 */
#if !(defined(__WIN32__) || defined(MAC_TCL) || defined(MAC_OSX_TK))/* UNIX */
Tcl_Channel (*tcl_OpenCommandChannel) _ANSI_ARGS_((Tcl_Interp * interp, int argc, CONST84 char ** argv, int flags)); /* 197 */
#endif /* UNIX */
#ifdef __WIN32__
Tcl_Channel (*tcl_OpenCommandChannel) _ANSI_ARGS_((Tcl_Interp * interp, int argc, CONST84 char ** argv, int flags)); /* 197 */
#endif /* __WIN32__ */
#ifdef MAC_TCL
void *reserved197;
#endif /* MAC_TCL */
Tcl_Channel (*tcl_OpenFileChannel) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * fileName, CONST char * modeString, int permissions)); /* 198 */
Tcl_Channel (*tcl_OpenTcpClient) _ANSI_ARGS_((Tcl_Interp * interp, int port, CONST char * address, CONST char * myaddr, int myport, int async)); /* 199 */
Tcl_Channel (*tcl_OpenTcpServer) _ANSI_ARGS_((Tcl_Interp * interp, int port, CONST char * host, Tcl_TcpAcceptProc * acceptProc, ClientData callbackData)); /* 200 */
void (*tcl_Preserve) _ANSI_ARGS_((ClientData data)); /* 201 */
void (*tcl_PrintDouble) _ANSI_ARGS_((Tcl_Interp * interp, double value, char * dst)); /* 202 */
int (*tcl_PutEnv) _ANSI_ARGS_((CONST char * string)); /* 203 */
CONST char * (*tcl_PosixError) _ANSI_ARGS_((Tcl_Interp * interp)); /* 204 */
void (*tcl_QueueEvent) _ANSI_ARGS_((Tcl_Event * evPtr, Tcl_QueuePosition position)); /* 205 */
int (*tcl_Read) _ANSI_ARGS_((Tcl_Channel chan, char * bufPtr, int toRead)); /* 206 */
#if !(defined(__WIN32__) || defined(MAC_TCL) || defined(MAC_OSX_TK))/* UNIX */
void (*tcl_ReapDetachedProcs) _ANSI_ARGS_((void)); /* 207 */
#endif /* UNIX */
#ifdef __WIN32__
void (*tcl_ReapDetachedProcs) _ANSI_ARGS_((void)); /* 207 */
#endif /* __WIN32__ */
#ifdef MAC_TCL
void *reserved207;
#endif /* MAC_TCL */
int (*tcl_RecordAndEval) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * cmd, int flags)); /* 208 */
int (*tcl_RecordAndEvalObj) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * cmdPtr, int flags)); /* 209 */
void (*tcl_RegisterChannel) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Channel chan)); /* 210 */
void (*tcl_RegisterObjType) _ANSI_ARGS_((Tcl_ObjType * typePtr)); /* 211 */
Tcl_RegExp (*tcl_RegExpCompile) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * string)); /* 212 */
int (*tcl_RegExpExec) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_RegExp regexp, CONST char * str, CONST char * start)); /* 213 */
int (*tcl_RegExpMatch) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * str, CONST char * pattern)); /* 214 */
void (*tcl_RegExpRange) _ANSI_ARGS_((Tcl_RegExp regexp, int index, CONST char ** startPtr, CONST char ** endPtr)); /* 215 */
void (*tcl_Release) _ANSI_ARGS_((ClientData clientData)); /* 216 */
void (*tcl_ResetResult) _ANSI_ARGS_((Tcl_Interp * interp)); /* 217 */
int (*tcl_ScanElement) _ANSI_ARGS_((CONST char * str, int * flagPtr)); /* 218 */
int (*tcl_ScanCountedElement) _ANSI_ARGS_((CONST char * str, int length, int * flagPtr)); /* 219 */
int (*tcl_Seek) _ANSI_ARGS_((Tcl_Channel chan, int offset, int mode)); /* 220 */
int (*tcl_ServiceAll) _ANSI_ARGS_((void)); /* 221 */
int (*tcl_ServiceEvent) _ANSI_ARGS_((int flags)); /* 222 */
void (*tcl_SetAssocData) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * name, Tcl_InterpDeleteProc * proc, ClientData clientData)); /* 223 */
void (*tcl_SetChannelBufferSize) _ANSI_ARGS_((Tcl_Channel chan, int sz)); /* 224 */
int (*tcl_SetChannelOption) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Channel chan, CONST char * optionName, CONST char * newValue)); /* 225 */
int (*tcl_SetCommandInfo) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * cmdName, Tcl_CmdInfo * infoPtr)); /* 226 */
void (*tcl_SetErrno) _ANSI_ARGS_((int err)); /* 227 */
void (*tcl_SetErrorCode) _ANSI_ARGS_(TCL_VARARGS(Tcl_Interp *,interp)); /* 228 */
void (*tcl_SetMaxBlockTime) _ANSI_ARGS_((Tcl_Time * timePtr)); /* 229 */
void (*tcl_SetPanicProc) _ANSI_ARGS_((Tcl_PanicProc * panicProc)); /* 230 */
int (*tcl_SetRecursionLimit) _ANSI_ARGS_((Tcl_Interp * interp, int depth)); /* 231 */
void (*tcl_SetResult) _ANSI_ARGS_((Tcl_Interp * interp, char * str, Tcl_FreeProc * freeProc)); /* 232 */
int (*tcl_SetServiceMode) _ANSI_ARGS_((int mode)); /* 233 */
void (*tcl_SetObjErrorCode) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * errorObjPtr)); /* 234 */
void (*tcl_SetObjResult) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * resultObjPtr)); /* 235 */
void (*tcl_SetStdChannel) _ANSI_ARGS_((Tcl_Channel channel, int type)); /* 236 */
CONST char * (*tcl_SetVar) _ANSI_ARGS_((Tcl_Interp * interp, char * varName, CONST char * newValue, int flags)); /* 237 */
CONST char * (*tcl_SetVar2) _ANSI_ARGS_((Tcl_Interp * interp, char * part1, char * part2, CONST char * newValue, int flags)); /* 238 */
CONST char * (*tcl_SignalId) _ANSI_ARGS_((int sig)); /* 239 */
CONST char * (*tcl_SignalMsg) _ANSI_ARGS_((int sig)); /* 240 */
void (*tcl_SourceRCFile) _ANSI_ARGS_((Tcl_Interp * interp)); /* 241 */
int (*tcl_SplitList) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * listStr, int * argcPtr, CONST84 char *** argvPtr)); /* 242 */
void (*tcl_SplitPath) _ANSI_ARGS_((CONST char * path, int * argcPtr, CONST84 char *** argvPtr)); /* 243 */
void (*tcl_StaticPackage) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * pkgName, Tcl_PackageInitProc * initProc, Tcl_PackageInitProc * safeInitProc)); /* 244 */
int (*tcl_StringMatch) _ANSI_ARGS_((CONST char * str, CONST char * pattern)); /* 245 */
int (*tcl_Tell) _ANSI_ARGS_((Tcl_Channel chan)); /* 246 */
int (*tcl_TraceVar) _ANSI_ARGS_((Tcl_Interp * interp, char * varName, int flags, Tcl_VarTraceProc * proc, ClientData clientData)); /* 247 */
int (*tcl_TraceVar2) _ANSI_ARGS_((Tcl_Interp * interp, char * part1, char * part2, int flags, Tcl_VarTraceProc * proc, ClientData clientData)); /* 248 */
CONST char * (*tcl_TranslateFileName) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * name, Tcl_DString * bufferPtr)); /* 249 */
int (*tcl_Ungets) _ANSI_ARGS_((Tcl_Channel chan, CONST char * str, int len, int atHead)); /* 250 */
void (*tcl_UnlinkVar) _ANSI_ARGS_((Tcl_Interp * interp, char * varName)); /* 251 */
int (*tcl_UnregisterChannel) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Channel chan)); /* 252 */
int (*tcl_UnsetVar) _ANSI_ARGS_((Tcl_Interp * interp, char * varName, int flags)); /* 253 */
int (*tcl_UnsetVar2) _ANSI_ARGS_((Tcl_Interp * interp, char * part1, char * part2, int flags)); /* 254 */
void (*tcl_UntraceVar) _ANSI_ARGS_((Tcl_Interp * interp, char * varName, int flags, Tcl_VarTraceProc * proc, ClientData clientData)); /* 255 */
void (*tcl_UntraceVar2) _ANSI_ARGS_((Tcl_Interp * interp, char * part1, char * part2, int flags, Tcl_VarTraceProc * proc, ClientData clientData)); /* 256 */
void (*tcl_UpdateLinkedVar) _ANSI_ARGS_((Tcl_Interp * interp, char * varName)); /* 257 */
int (*tcl_UpVar) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * frameName, char * varName, CONST char * localName, int flags)); /* 258 */
int (*tcl_UpVar2) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * frameName, char * part1, char * part2, CONST char * localName, int flags)); /* 259 */
int (*tcl_VarEval) _ANSI_ARGS_(TCL_VARARGS(Tcl_Interp *,interp)); /* 260 */
ClientData (*tcl_VarTraceInfo) _ANSI_ARGS_((Tcl_Interp * interp, char * varName, int flags, Tcl_VarTraceProc * procPtr, ClientData prevClientData)); /* 261 */
ClientData (*tcl_VarTraceInfo2) _ANSI_ARGS_((Tcl_Interp * interp, char * part1, char * part2, int flags, Tcl_VarTraceProc * procPtr, ClientData prevClientData)); /* 262 */
int (*tcl_Write) _ANSI_ARGS_((Tcl_Channel chan, CONST char * s, int slen)); /* 263 */
void (*tcl_WrongNumArgs) _ANSI_ARGS_((Tcl_Interp * interp, int objc, Tcl_Obj *CONST objv[], CONST char * message)); /* 264 */
int (*tcl_DumpActiveMemory) _ANSI_ARGS_((CONST char * fileName)); /* 265 */
void (*tcl_ValidateAllMemory) _ANSI_ARGS_((CONST char * file, int line)); /* 266 */
void (*tcl_AppendResultVA) _ANSI_ARGS_((Tcl_Interp * interp, va_list argList)); /* 267 */
void (*tcl_AppendStringsToObjVA) _ANSI_ARGS_((Tcl_Obj * objPtr, va_list argList)); /* 268 */
CONST char * (*tcl_HashStats) _ANSI_ARGS_((Tcl_HashTable * tablePtr)); /* 269 */
CONST char * (*tcl_ParseVar) _ANSI_ARGS_((Tcl_Interp * interp, char * str, char ** termPtr)); /* 270 */
CONST char * (*tcl_PkgPresent) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * name, CONST char * version, int exact)); /* 271 */
CONST char * (*tcl_PkgPresentEx) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * name, CONST char * version, int exact, ClientData * clientDataPtr)); /* 272 */
int (*tcl_PkgProvide) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * name, CONST char * version)); /* 273 */
CONST char * (*tcl_PkgRequire) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * name, CONST char * version, int exact)); /* 274 */
void (*tcl_SetErrorCodeVA) _ANSI_ARGS_((Tcl_Interp * interp, va_list argList)); /* 275 */
int (*tcl_VarEvalVA) _ANSI_ARGS_((Tcl_Interp * interp, va_list argList)); /* 276 */
Tcl_Pid (*tcl_WaitPid) _ANSI_ARGS_((Tcl_Pid pid, int * statPtr, int options)); /* 277 */
|
| ︙ | ︙ | |||
1858 1859 1860 1861 1862 1863 1864 |
void (*tcl_DeleteThreadExitHandler) _ANSI_ARGS_((Tcl_ExitProc * proc, ClientData clientData)); /* 289 */
void (*tcl_DiscardResult) _ANSI_ARGS_((Tcl_SavedResult * statePtr)); /* 290 */
int (*tcl_EvalEx) _ANSI_ARGS_((Tcl_Interp * interp, char * script, int numBytes, int flags)); /* 291 */
int (*tcl_EvalObjv) _ANSI_ARGS_((Tcl_Interp * interp, int objc, Tcl_Obj *CONST objv[], int flags)); /* 292 */
int (*tcl_EvalObjEx) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * objPtr, int flags)); /* 293 */
void (*tcl_ExitThread) _ANSI_ARGS_((int status)); /* 294 */
int (*tcl_ExternalToUtf) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Encoding encoding, CONST char * src, int srcLen, int flags, Tcl_EncodingState * statePtr, char * dst, int dstLen, int * srcReadPtr, int * dstWrotePtr, int * dstCharsPtr)); /* 295 */
| | | | | | | | | | | | | | | | | | 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 |
void (*tcl_DeleteThreadExitHandler) _ANSI_ARGS_((Tcl_ExitProc * proc, ClientData clientData)); /* 289 */
void (*tcl_DiscardResult) _ANSI_ARGS_((Tcl_SavedResult * statePtr)); /* 290 */
int (*tcl_EvalEx) _ANSI_ARGS_((Tcl_Interp * interp, char * script, int numBytes, int flags)); /* 291 */
int (*tcl_EvalObjv) _ANSI_ARGS_((Tcl_Interp * interp, int objc, Tcl_Obj *CONST objv[], int flags)); /* 292 */
int (*tcl_EvalObjEx) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * objPtr, int flags)); /* 293 */
void (*tcl_ExitThread) _ANSI_ARGS_((int status)); /* 294 */
int (*tcl_ExternalToUtf) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Encoding encoding, CONST char * src, int srcLen, int flags, Tcl_EncodingState * statePtr, char * dst, int dstLen, int * srcReadPtr, int * dstWrotePtr, int * dstCharsPtr)); /* 295 */
CONST char * (*tcl_ExternalToUtfDString) _ANSI_ARGS_((Tcl_Encoding encoding, CONST char * src, int srcLen, Tcl_DString * dsPtr)); /* 296 */
void (*tcl_FinalizeThread) _ANSI_ARGS_((void)); /* 297 */
void (*tcl_FinalizeNotifier) _ANSI_ARGS_((ClientData clientData)); /* 298 */
void (*tcl_FreeEncoding) _ANSI_ARGS_((Tcl_Encoding encoding)); /* 299 */
Tcl_ThreadId (*tcl_GetCurrentThread) _ANSI_ARGS_((void)); /* 300 */
Tcl_Encoding (*tcl_GetEncoding) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * name)); /* 301 */
CONST char * (*tcl_GetEncodingName) _ANSI_ARGS_((Tcl_Encoding encoding)); /* 302 */
void (*tcl_GetEncodingNames) _ANSI_ARGS_((Tcl_Interp * interp)); /* 303 */
int (*tcl_GetIndexFromObjStruct) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * objPtr, CONST char ** tablePtr, int offset, CONST char * msg, int flags, int * indexPtr)); /* 304 */
VOID * (*tcl_GetThreadData) _ANSI_ARGS_((Tcl_ThreadDataKey * keyPtr, int size)); /* 305 */
Tcl_Obj * (*tcl_GetVar2Ex) _ANSI_ARGS_((Tcl_Interp * interp, char * part1, char * part2, int flags)); /* 306 */
ClientData (*tcl_InitNotifier) _ANSI_ARGS_((void)); /* 307 */
void (*tcl_MutexLock) _ANSI_ARGS_((Tcl_Mutex * mutexPtr)); /* 308 */
void (*tcl_MutexUnlock) _ANSI_ARGS_((Tcl_Mutex * mutexPtr)); /* 309 */
void (*tcl_ConditionNotify) _ANSI_ARGS_((Tcl_Condition * condPtr)); /* 310 */
void (*tcl_ConditionWait) _ANSI_ARGS_((Tcl_Condition * condPtr, Tcl_Mutex * mutexPtr, Tcl_Time * timePtr)); /* 311 */
int (*tcl_NumUtfChars) _ANSI_ARGS_((CONST char * src, int len)); /* 312 */
int (*tcl_ReadChars) _ANSI_ARGS_((Tcl_Channel channel, Tcl_Obj * objPtr, int charsToRead, int appendFlag)); /* 313 */
void (*tcl_RestoreResult) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_SavedResult * statePtr)); /* 314 */
void (*tcl_SaveResult) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_SavedResult * statePtr)); /* 315 */
int (*tcl_SetSystemEncoding) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * name)); /* 316 */
Tcl_Obj * (*tcl_SetVar2Ex) _ANSI_ARGS_((Tcl_Interp * interp, char * part1, char * part2, Tcl_Obj * newValuePtr, int flags)); /* 317 */
void (*tcl_ThreadAlert) _ANSI_ARGS_((Tcl_ThreadId threadId)); /* 318 */
void (*tcl_ThreadQueueEvent) _ANSI_ARGS_((Tcl_ThreadId threadId, Tcl_Event* evPtr, Tcl_QueuePosition position)); /* 319 */
Tcl_UniChar (*tcl_UniCharAtIndex) _ANSI_ARGS_((CONST char * src, int index)); /* 320 */
Tcl_UniChar (*tcl_UniCharToLower) _ANSI_ARGS_((int ch)); /* 321 */
Tcl_UniChar (*tcl_UniCharToTitle) _ANSI_ARGS_((int ch)); /* 322 */
Tcl_UniChar (*tcl_UniCharToUpper) _ANSI_ARGS_((int ch)); /* 323 */
int (*tcl_UniCharToUtf) _ANSI_ARGS_((int ch, char * buf)); /* 324 */
CONST char * (*tcl_UtfAtIndex) _ANSI_ARGS_((CONST char * src, int index)); /* 325 */
int (*tcl_UtfCharComplete) _ANSI_ARGS_((CONST char * src, int len)); /* 326 */
int (*tcl_UtfBackslash) _ANSI_ARGS_((CONST char * src, int * readPtr, char * dst)); /* 327 */
CONST char * (*tcl_UtfFindFirst) _ANSI_ARGS_((CONST char * src, int ch)); /* 328 */
CONST char * (*tcl_UtfFindLast) _ANSI_ARGS_((CONST char * src, int ch)); /* 329 */
CONST char * (*tcl_UtfNext) _ANSI_ARGS_((CONST char * src)); /* 330 */
CONST char * (*tcl_UtfPrev) _ANSI_ARGS_((CONST char * src, CONST char * start)); /* 331 */
int (*tcl_UtfToExternal) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Encoding encoding, CONST char * src, int srcLen, int flags, Tcl_EncodingState * statePtr, char * dst, int dstLen, int * srcReadPtr, int * dstWrotePtr, int * dstCharsPtr)); /* 332 */
CONST char * (*tcl_UtfToExternalDString) _ANSI_ARGS_((Tcl_Encoding encoding, CONST char * src, int srcLen, Tcl_DString * dsPtr)); /* 333 */
int (*tcl_UtfToLower) _ANSI_ARGS_((char * src)); /* 334 */
int (*tcl_UtfToTitle) _ANSI_ARGS_((char * src)); /* 335 */
int (*tcl_UtfToUniChar) _ANSI_ARGS_((CONST char * src, Tcl_UniChar * chPtr)); /* 336 */
int (*tcl_UtfToUpper) _ANSI_ARGS_((char * src)); /* 337 */
int (*tcl_WriteChars) _ANSI_ARGS_((Tcl_Channel chan, CONST char * src, int srcLen)); /* 338 */
int (*tcl_WriteObj) _ANSI_ARGS_((Tcl_Channel chan, Tcl_Obj * objPtr)); /* 339 */
char * (*tcl_GetString) _ANSI_ARGS_((Tcl_Obj * objPtr)); /* 340 */
CONST char * (*tcl_GetDefaultEncodingDir) _ANSI_ARGS_((void)); /* 341 */
void (*tcl_SetDefaultEncodingDir) _ANSI_ARGS_((CONST char * path)); /* 342 */
void (*tcl_AlertNotifier) _ANSI_ARGS_((ClientData clientData)); /* 343 */
void (*tcl_ServiceModeHook) _ANSI_ARGS_((int mode)); /* 344 */
int (*tcl_UniCharIsAlnum) _ANSI_ARGS_((int ch)); /* 345 */
int (*tcl_UniCharIsAlpha) _ANSI_ARGS_((int ch)); /* 346 */
int (*tcl_UniCharIsDigit) _ANSI_ARGS_((int ch)); /* 347 */
int (*tcl_UniCharIsLower) _ANSI_ARGS_((int ch)); /* 348 */
int (*tcl_UniCharIsSpace) _ANSI_ARGS_((int ch)); /* 349 */
int (*tcl_UniCharIsUpper) _ANSI_ARGS_((int ch)); /* 350 */
int (*tcl_UniCharIsWordChar) _ANSI_ARGS_((int ch)); /* 351 */
int (*tcl_UniCharLen) _ANSI_ARGS_((CONST Tcl_UniChar * str)); /* 352 */
int (*tcl_UniCharNcmp) _ANSI_ARGS_((CONST Tcl_UniChar * cs, CONST Tcl_UniChar * ct, unsigned long n)); /* 353 */
CONST char * (*tcl_UniCharToUtfDString) _ANSI_ARGS_((CONST Tcl_UniChar * string, int numChars, Tcl_DString * dsPtr)); /* 354 */
CONST Tcl_UniChar * (*tcl_UtfToUniCharDString) _ANSI_ARGS_((CONST char * string, int length, Tcl_DString * dsPtr)); /* 355 */
Tcl_RegExp (*tcl_GetRegExpFromObj) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * patObj, int flags)); /* 356 */
Tcl_Obj * (*tcl_EvalTokens) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Token * tokenPtr, int count)); /* 357 */
void (*tcl_FreeParse) _ANSI_ARGS_((Tcl_Parse * parsePtr)); /* 358 */
void (*tcl_LogCommandInfo) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * script, CONST char * command, int length)); /* 359 */
int (*tcl_ParseBraces) _ANSI_ARGS_((Tcl_Interp * interp, char * string, int numBytes, Tcl_Parse * parsePtr, int append, char ** termPtr)); /* 360 */
int (*tcl_ParseCommand) _ANSI_ARGS_((Tcl_Interp * interp, char * string, int numBytes, int nested, Tcl_Parse * parsePtr)); /* 361 */
int (*tcl_ParseExpr) _ANSI_ARGS_((Tcl_Interp * interp, char * string, int numBytes, Tcl_Parse * parsePtr)); /* 362 */
int (*tcl_ParseQuotedString) _ANSI_ARGS_((Tcl_Interp * interp, char * string, int numBytes, Tcl_Parse * parsePtr, int append, char ** termPtr)); /* 363 */
int (*tcl_ParseVarName) _ANSI_ARGS_((Tcl_Interp * interp, char * string, int numBytes, Tcl_Parse * parsePtr, int append)); /* 364 */
CONST char * (*tcl_GetCwd) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_DString * cwdPtr)); /* 365 */
int (*tcl_Chdir) _ANSI_ARGS_((CONST char * dirName)); /* 366 */
int (*tcl_Access) _ANSI_ARGS_((CONST char * path, int mode)); /* 367 */
int (*tcl_Stat) _ANSI_ARGS_((CONST char * path, struct stat * bufPtr)); /* 368 */
int (*tcl_UtfNcmp) _ANSI_ARGS_((CONST char * s1, CONST char * s2, unsigned long n)); /* 369 */
int (*tcl_UtfNcasecmp) _ANSI_ARGS_((CONST char * s1, CONST char * s2, unsigned long n)); /* 370 */
int (*tcl_StringCaseMatch) _ANSI_ARGS_((CONST char * str, CONST char * pattern, int nocase)); /* 371 */
int (*tcl_UniCharIsControl) _ANSI_ARGS_((int ch)); /* 372 */
|
| ︙ | ︙ | |||
1951 1952 1953 1954 1955 1956 1957 |
Tcl_UniChar * (*tcl_GetUnicode) _ANSI_ARGS_((Tcl_Obj * objPtr)); /* 382 */
Tcl_Obj * (*tcl_GetRange) _ANSI_ARGS_((Tcl_Obj * objPtr, int first, int last)); /* 383 */
void (*tcl_AppendUnicodeToObj) _ANSI_ARGS_((Tcl_Obj * objPtr, CONST Tcl_UniChar * unicode, int length)); /* 384 */
int (*tcl_RegExpMatchObj) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * stringObj, Tcl_Obj * patternObj)); /* 385 */
void (*tcl_SetNotifier) _ANSI_ARGS_((Tcl_NotifierProcs * notifierProcPtr)); /* 386 */
Tcl_Mutex * (*tcl_GetAllocMutex) _ANSI_ARGS_((void)); /* 387 */
int (*tcl_GetChannelNames) _ANSI_ARGS_((Tcl_Interp * interp)); /* 388 */
| | | | | 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 |
Tcl_UniChar * (*tcl_GetUnicode) _ANSI_ARGS_((Tcl_Obj * objPtr)); /* 382 */
Tcl_Obj * (*tcl_GetRange) _ANSI_ARGS_((Tcl_Obj * objPtr, int first, int last)); /* 383 */
void (*tcl_AppendUnicodeToObj) _ANSI_ARGS_((Tcl_Obj * objPtr, CONST Tcl_UniChar * unicode, int length)); /* 384 */
int (*tcl_RegExpMatchObj) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * stringObj, Tcl_Obj * patternObj)); /* 385 */
void (*tcl_SetNotifier) _ANSI_ARGS_((Tcl_NotifierProcs * notifierProcPtr)); /* 386 */
Tcl_Mutex * (*tcl_GetAllocMutex) _ANSI_ARGS_((void)); /* 387 */
int (*tcl_GetChannelNames) _ANSI_ARGS_((Tcl_Interp * interp)); /* 388 */
int (*tcl_GetChannelNamesEx) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * pattern)); /* 389 */
int (*tcl_ProcObjCmd) _ANSI_ARGS_((ClientData clientData, Tcl_Interp * interp, int objc, Tcl_Obj *CONST objv[])); /* 390 */
void (*tcl_ConditionFinalize) _ANSI_ARGS_((Tcl_Condition * condPtr)); /* 391 */
void (*tcl_MutexFinalize) _ANSI_ARGS_((Tcl_Mutex * mutex)); /* 392 */
int (*tcl_CreateThread) _ANSI_ARGS_((Tcl_ThreadId * idPtr, Tcl_ThreadCreateProc proc, ClientData clientData, int stackSize, int flags)); /* 393 */
int (*tcl_ReadRaw) _ANSI_ARGS_((Tcl_Channel chan, char * dst, int bytesToRead)); /* 394 */
int (*tcl_WriteRaw) _ANSI_ARGS_((Tcl_Channel chan, CONST char * src, int srcLen)); /* 395 */
Tcl_Channel (*tcl_GetTopChannel) _ANSI_ARGS_((Tcl_Channel chan)); /* 396 */
int (*tcl_ChannelBuffered) _ANSI_ARGS_((Tcl_Channel chan)); /* 397 */
CONST char * (*tcl_ChannelName) _ANSI_ARGS_((Tcl_ChannelType * chanTypePtr)); /* 398 */
Tcl_ChannelTypeVersion (*tcl_ChannelVersion) _ANSI_ARGS_((Tcl_ChannelType * chanTypePtr)); /* 399 */
Tcl_DriverBlockModeProc * (*tcl_ChannelBlockModeProc) _ANSI_ARGS_((Tcl_ChannelType * chanTypePtr)); /* 400 */
Tcl_DriverCloseProc * (*tcl_ChannelCloseProc) _ANSI_ARGS_((Tcl_ChannelType * chanTypePtr)); /* 401 */
Tcl_DriverClose2Proc * (*tcl_ChannelClose2Proc) _ANSI_ARGS_((Tcl_ChannelType * chanTypePtr)); /* 402 */
Tcl_DriverInputProc * (*tcl_ChannelInputProc) _ANSI_ARGS_((Tcl_ChannelType * chanTypePtr)); /* 403 */
Tcl_DriverOutputProc * (*tcl_ChannelOutputProc) _ANSI_ARGS_((Tcl_ChannelType * chanTypePtr)); /* 404 */
Tcl_DriverSeekProc * (*tcl_ChannelSeekProc) _ANSI_ARGS_((Tcl_ChannelType * chanTypePtr)); /* 405 */
|
| ︙ | ︙ | |||
1987 1988 1989 1990 1991 1992 1993 |
int (*tcl_IsChannelExisting) _ANSI_ARGS_((CONST char* channelName)); /* 418 */
int (*tcl_UniCharNcasecmp) _ANSI_ARGS_((CONST Tcl_UniChar * cs, CONST Tcl_UniChar * ct, unsigned long n)); /* 419 */
int (*tcl_UniCharCaseMatch) _ANSI_ARGS_((CONST Tcl_UniChar * ustr, CONST Tcl_UniChar * pattern, int nocase)); /* 420 */
Tcl_HashEntry * (*tcl_FindHashEntry) _ANSI_ARGS_((Tcl_HashTable * tablePtr, CONST char * key)); /* 421 */
Tcl_HashEntry * (*tcl_CreateHashEntry) _ANSI_ARGS_((Tcl_HashTable * tablePtr, CONST char * key, int * newPtr)); /* 422 */
void (*tcl_InitCustomHashTable) _ANSI_ARGS_((Tcl_HashTable * tablePtr, int keyType, Tcl_HashKeyType * typePtr)); /* 423 */
void (*tcl_InitObjHashTable) _ANSI_ARGS_((Tcl_HashTable * tablePtr)); /* 424 */
| | | | | | | | | | | > | 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 |
int (*tcl_IsChannelExisting) _ANSI_ARGS_((CONST char* channelName)); /* 418 */
int (*tcl_UniCharNcasecmp) _ANSI_ARGS_((CONST Tcl_UniChar * cs, CONST Tcl_UniChar * ct, unsigned long n)); /* 419 */
int (*tcl_UniCharCaseMatch) _ANSI_ARGS_((CONST Tcl_UniChar * ustr, CONST Tcl_UniChar * pattern, int nocase)); /* 420 */
Tcl_HashEntry * (*tcl_FindHashEntry) _ANSI_ARGS_((Tcl_HashTable * tablePtr, CONST char * key)); /* 421 */
Tcl_HashEntry * (*tcl_CreateHashEntry) _ANSI_ARGS_((Tcl_HashTable * tablePtr, CONST char * key, int * newPtr)); /* 422 */
void (*tcl_InitCustomHashTable) _ANSI_ARGS_((Tcl_HashTable * tablePtr, int keyType, Tcl_HashKeyType * typePtr)); /* 423 */
void (*tcl_InitObjHashTable) _ANSI_ARGS_((Tcl_HashTable * tablePtr)); /* 424 */
ClientData (*tcl_CommandTraceInfo) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * varName, int flags, Tcl_CommandTraceProc * procPtr, ClientData prevClientData)); /* 425 */
int (*tcl_TraceCommand) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * varName, int flags, Tcl_CommandTraceProc * proc, ClientData clientData)); /* 426 */
void (*tcl_UntraceCommand) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * varName, int flags, Tcl_CommandTraceProc * proc, ClientData clientData)); /* 427 */
char * (*tcl_AttemptAlloc) _ANSI_ARGS_((unsigned int size)); /* 428 */
char * (*tcl_AttemptDbCkalloc) _ANSI_ARGS_((unsigned int size, CONST char * file, int line)); /* 429 */
char * (*tcl_AttemptRealloc) _ANSI_ARGS_((char * ptr, unsigned int size)); /* 430 */
char * (*tcl_AttemptDbCkrealloc) _ANSI_ARGS_((char * ptr, unsigned int size, CONST char * file, int line)); /* 431 */
int (*tcl_AttemptSetObjLength) _ANSI_ARGS_((Tcl_Obj * objPtr, int length)); /* 432 */
Tcl_ThreadId (*tcl_GetChannelThread) _ANSI_ARGS_((Tcl_Channel channel)); /* 433 */
Tcl_UniChar * (*tcl_GetUnicodeFromObj) _ANSI_ARGS_((Tcl_Obj * objPtr, int * lengthPtr)); /* 434 */
int (*tcl_GetMathFuncInfo) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * name, int * numArgsPtr, Tcl_ValueType ** argTypesPtr, Tcl_MathProc ** procPtr, ClientData * clientDataPtr)); /* 435 */
Tcl_Obj * (*tcl_ListMathFuncs) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * pattern)); /* 436 */
Tcl_Obj * (*tcl_SubstObj) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * objPtr, int flags)); /* 437 */
int (*tcl_DetachChannel) _ANSI_ARGS_((Tcl_Interp* interp, Tcl_Channel channel)); /* 438 */
int (*tcl_IsStandardChannel) _ANSI_ARGS_((Tcl_Channel channel)); /* 439 */
int (*tcl_FSCopyFile) _ANSI_ARGS_((Tcl_Obj * srcPathPtr, Tcl_Obj * destPathPtr)); /* 440 */
int (*tcl_FSCopyDirectory) _ANSI_ARGS_((Tcl_Obj * srcPathPtr, Tcl_Obj * destPathPtr, Tcl_Obj ** errorPtr)); /* 441 */
int (*tcl_FSCreateDirectory) _ANSI_ARGS_((Tcl_Obj * pathPtr)); /* 442 */
int (*tcl_FSDeleteFile) _ANSI_ARGS_((Tcl_Obj * pathPtr)); /* 443 */
int (*tcl_FSLoadFile) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * pathPtr, CONST char * sym1, CONST char * sym2, Tcl_PackageInitProc ** proc1Ptr, Tcl_PackageInitProc ** proc2Ptr, ClientData * clientDataPtr, Tcl_FSUnloadFileProc ** unloadProcPtr)); /* 444 */
int (*tcl_FSMatchInDirectory) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * result, Tcl_Obj * pathPtr, CONST char * pattern, Tcl_GlobTypeData * types)); /* 445 */
Tcl_Obj* (*tcl_FSLink) _ANSI_ARGS_((Tcl_Obj * pathPtr, Tcl_Obj * toPtr)); /* 446 */
int (*tcl_FSRemoveDirectory) _ANSI_ARGS_((Tcl_Obj * pathPtr, int recursive, Tcl_Obj ** errorPtr)); /* 447 */
int (*tcl_FSRenameFile) _ANSI_ARGS_((Tcl_Obj * srcPathPtr, Tcl_Obj * destPathPtr)); /* 448 */
int (*tcl_FSLstat) _ANSI_ARGS_((Tcl_Obj * pathPtr, struct stat * buf)); /* 449 */
int (*tcl_FSUtime) _ANSI_ARGS_((Tcl_Obj * pathPtr, struct utimbuf * tval)); /* 450 */
int (*tcl_FSFileAttrsGet) _ANSI_ARGS_((Tcl_Interp * interp, int index, Tcl_Obj * pathPtr, Tcl_Obj ** objPtrRef)); /* 451 */
int (*tcl_FSFileAttrsSet) _ANSI_ARGS_((Tcl_Interp * interp, int index, Tcl_Obj * pathPtr, Tcl_Obj * objPtr)); /* 452 */
CONST char ** (*tcl_FSFileAttrStrings) _ANSI_ARGS_((Tcl_Obj * pathPtr, Tcl_Obj ** objPtrRef)); /* 453 */
int (*tcl_FSStat) _ANSI_ARGS_((Tcl_Obj * pathPtr, struct stat * buf)); /* 454 */
int (*tcl_FSAccess) _ANSI_ARGS_((Tcl_Obj * pathPtr, int mode)); /* 455 */
Tcl_Channel (*tcl_FSOpenFileChannel) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * pathPtr, CONST char * modeString, int permissions)); /* 456 */
Tcl_Obj* (*tcl_FSGetCwd) _ANSI_ARGS_((Tcl_Interp * interp)); /* 457 */
int (*tcl_FSChdir) _ANSI_ARGS_((Tcl_Obj * pathPtr)); /* 458 */
int (*tcl_FSConvertToPathType) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * pathPtr)); /* 459 */
Tcl_Obj* (*tcl_FSJoinPath) _ANSI_ARGS_((Tcl_Obj * listObj, int elements)); /* 460 */
Tcl_Obj* (*tcl_FSSplitPath) _ANSI_ARGS_((Tcl_Obj* pathPtr, int * lenPtr)); /* 461 */
int (*tcl_FSEqualPaths) _ANSI_ARGS_((Tcl_Obj* firstPtr, Tcl_Obj* secondPtr)); /* 462 */
Tcl_Obj* (*tcl_FSGetNormalizedPath) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj* pathObjPtr)); /* 463 */
Tcl_Obj* (*tcl_FSJoinToPath) _ANSI_ARGS_((Tcl_Obj * basePtr, int objc, Tcl_Obj *CONST objv[])); /* 464 */
ClientData (*tcl_FSGetInternalRep) _ANSI_ARGS_((Tcl_Obj* pathObjPtr, Tcl_Filesystem * fsPtr)); /* 465 */
Tcl_Obj* (*tcl_FSGetTranslatedPath) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj* pathPtr)); /* 466 */
int (*tcl_FSEvalFile) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * fileName)); /* 467 */
Tcl_Obj* (*tcl_FSNewNativePath) _ANSI_ARGS_((Tcl_Obj* fromFilesystem, ClientData clientData)); /* 468 */
CONST char* (*tcl_FSGetNativePath) _ANSI_ARGS_((Tcl_Obj* pathObjPtr)); /* 469 */
Tcl_Obj* (*tcl_FSFileSystemInfo) _ANSI_ARGS_((Tcl_Obj* pathObjPtr)); /* 470 */
Tcl_Obj* (*tcl_FSPathSeparator) _ANSI_ARGS_((Tcl_Obj* pathObjPtr)); /* 471 */
Tcl_Obj* (*tcl_FSListVolumes) _ANSI_ARGS_((void)); /* 472 */
int (*tcl_FSRegister) _ANSI_ARGS_((ClientData clientData, Tcl_Filesystem * fsPtr)); /* 473 */
int (*tcl_FSUnregister) _ANSI_ARGS_((Tcl_Filesystem * fsPtr)); /* 474 */
ClientData (*tcl_FSData) _ANSI_ARGS_((Tcl_Filesystem * fsPtr)); /* 475 */
CONST char* (*tcl_FSGetTranslatedStringPath) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj* pathPtr)); /* 476 */
Tcl_Filesystem* (*tcl_FSGetFileSystemForPath) _ANSI_ARGS_((Tcl_Obj* pathObjPtr)); /* 477 */
Tcl_PathType (*tcl_FSGetPathType) _ANSI_ARGS_((Tcl_Obj * pathObjPtr)); /* 478 */
int (*tcl_OutputBuffered) _ANSI_ARGS_((Tcl_Channel chan)); /* 479 */
void (*tcl_FSMountsChanged) _ANSI_ARGS_((Tcl_Filesystem * fsPtr)); /* 480 */
int (*tcl_EvalTokensStandard) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Token * tokenPtr, int count)); /* 481 */
void (*tcl_GetTime) _ANSI_ARGS_((Tcl_Time* timeBuf)); /* 482 */
} TclStubs;
#ifdef __cplusplus
extern "C" {
#endif
extern TclStubs *tclStubsPtr;
#ifdef __cplusplus
|
| ︙ | ︙ | |||
4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 | #define Tcl_FSMountsChanged \ (tclStubsPtr->tcl_FSMountsChanged) /* 480 */ #endif #ifndef Tcl_EvalTokensStandard #define Tcl_EvalTokensStandard \ (tclStubsPtr->tcl_EvalTokensStandard) /* 481 */ #endif #endif /* defined(USE_TCL_STUBS) && !defined(USE_TCL_STUB_PROCS) */ /* !END!: Do not edit above this line. */ #endif /* _TCLDECLS */ | > > > > | 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 | #define Tcl_FSMountsChanged \ (tclStubsPtr->tcl_FSMountsChanged) /* 480 */ #endif #ifndef Tcl_EvalTokensStandard #define Tcl_EvalTokensStandard \ (tclStubsPtr->tcl_EvalTokensStandard) /* 481 */ #endif #ifndef Tcl_GetTime #define Tcl_GetTime \ (tclStubsPtr->tcl_GetTime) /* 482 */ #endif #endif /* defined(USE_TCL_STUBS) && !defined(USE_TCL_STUB_PROCS) */ /* !END!: Do not edit above this line. */ #endif /* _TCLDECLS */ |
Changes to generic/tclEncoding.c.
1 2 3 4 5 6 7 8 9 10 | /* * tclEncoding.c -- * * Contains the implementation of the encoding conversion package. * * Copyright (c) 1996-1998 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | /* * tclEncoding.c -- * * Contains the implementation of the encoding conversion package. * * Copyright (c) 1996-1998 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclEncoding.c,v 1.8.2.1 2002/02/05 02:21:59 wolfsuit Exp $ */ #include "tclInt.h" #include "tclPort.h" typedef size_t (LengthProc)_ANSI_ARGS_((CONST char *src)); |
| ︙ | ︙ | |||
337 338 339 340 341 342 343 | * Results: * * Side effects: * *------------------------------------------------------------------------- */ | | | | 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 |
* Results:
*
* Side effects:
*
*-------------------------------------------------------------------------
*/
CONST char *
Tcl_GetDefaultEncodingDir()
{
return tclDefaultEncodingDir;
}
/*
*-------------------------------------------------------------------------
*
* Tcl_SetDefaultEncodingDir --
*
*
* Results:
*
* Side effects:
*
*-------------------------------------------------------------------------
*/
void
Tcl_SetDefaultEncodingDir(path)
CONST char *path;
{
tclDefaultEncodingDir = (char *)ckalloc((unsigned) strlen(path) + 1);
strcpy(tclDefaultEncodingDir, path);
}
/*
*-------------------------------------------------------------------------
|
| ︙ | ︙ | |||
501 502 503 504 505 506 507 | * * Side effects: * None. * *--------------------------------------------------------------------------- */ | | | 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 |
*
* Side effects:
* None.
*
*---------------------------------------------------------------------------
*/
CONST char *
Tcl_GetEncodingName(encoding)
Tcl_Encoding encoding; /* The encoding whose name to fetch. */
{
Encoding *encodingPtr;
if (encoding == NULL) {
encoding = systemEncoding;
|
| ︙ | ︙ | |||
777 778 779 780 781 782 783 | * * Side effects: * None. * *------------------------------------------------------------------------- */ | | | 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 |
*
* Side effects:
* None.
*
*-------------------------------------------------------------------------
*/
CONST char *
Tcl_ExternalToUtfDString(encoding, src, srcLen, dstPtr)
Tcl_Encoding encoding; /* The encoding for the source string, or
* NULL for the default system encoding. */
CONST char *src; /* Source string in specified encoding. */
int srcLen; /* Source string length in bytes, or < 0 for
* encoding-specific string length. */
Tcl_DString *dstPtr; /* Uninitialized or free DString in which
|
| ︙ | ︙ | |||
940 941 942 943 944 945 946 | * * Side effects: * None. * *------------------------------------------------------------------------- */ | | | 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 |
*
* Side effects:
* None.
*
*-------------------------------------------------------------------------
*/
CONST char *
Tcl_UtfToExternalDString(encoding, src, srcLen, dstPtr)
Tcl_Encoding encoding; /* The encoding for the converted string,
* or NULL for the default system encoding. */
CONST char *src; /* Source string in UTF-8. */
int srcLen; /* Source string length in bytes, or < 0 for
* strlen(). */
Tcl_DString *dstPtr; /* Uninitialized or free DString in which
|
| ︙ | ︙ | |||
1276 1277 1278 1279 1280 1281 1282 |
static Tcl_Channel
OpenEncodingFile(dir, name)
CONST char *dir;
CONST char *name;
{
| | | | | 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 |
static Tcl_Channel
OpenEncodingFile(dir, name)
CONST char *dir;
CONST char *name;
{
CONST char *argv[3];
Tcl_DString pathString;
CONST char *path;
Tcl_Channel chan;
Tcl_Obj *pathPtr;
argv[0] = dir;
argv[1] = "encoding";
argv[2] = name;
Tcl_DStringInit(&pathString);
Tcl_JoinPath(3, argv, &pathString);
path = Tcl_DStringAppend(&pathString, ".enc", -1);
pathPtr = Tcl_NewStringObj(path,-1);
Tcl_IncrRefCount(pathPtr);
|
| ︙ | ︙ | |||
1580 1581 1582 1583 1584 1585 1586 |
init[0] = '\0';
final[0] = '\0';
Tcl_DStringInit(&escapeData);
while (1) {
int argc;
| | | 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 |
init[0] = '\0';
final[0] = '\0';
Tcl_DStringInit(&escapeData);
while (1) {
int argc;
CONST char **argv;
char *line;
Tcl_DString lineString;
Tcl_DStringInit(&lineString);
if (Tcl_Gets(chan, &lineString) < 0) {
break;
}
|
| ︙ | ︙ |
Changes to generic/tclEnv.c.
| ︙ | ︙ | |||
8 9 10 11 12 13 14 | * * Copyright (c) 1991-1994 The Regents of the University of California. * Copyright (c) 1994-1998 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | * * Copyright (c) 1991-1994 The Regents of the University of California. * Copyright (c) 1994-1998 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclEnv.c,v 1.9.14.1 2002/02/05 02:21:59 wolfsuit Exp $ */ #include "tclInt.h" #include "tclPort.h" TCL_DECLARE_MUTEX(envMutex) /* To serialize access to environ */ |
| ︙ | ︙ | |||
80 81 82 83 84 85 86 |
void
TclSetupEnv(interp)
Tcl_Interp *interp; /* Interpreter whose "env" array is to be
* managed. */
{
Tcl_DString envString;
| > | | 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
void
TclSetupEnv(interp)
Tcl_Interp *interp; /* Interpreter whose "env" array is to be
* managed. */
{
Tcl_DString envString;
CONST char *p1;
char *p2;
int i;
/*
* For MacOS X
*/
#if defined(__APPLE__) && defined(__DYNAMIC__)
environ = *_NSGetEnviron();
|
| ︙ | ︙ | |||
129 130 131 132 133 134 135 | * versions of Solaris; ignore the entry. */ continue; } p2++; p2[-1] = '\0'; | | > | 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
* versions of Solaris; ignore the entry.
*/
continue;
}
p2++;
p2[-1] = '\0';
Tcl_SetVar2(interp, "env", Tcl_DStringValue(&envString), p2,
TCL_GLOBAL_ONLY);
Tcl_DStringFree(&envString);
}
Tcl_MutexUnlock(&envMutex);
}
Tcl_TraceVar2(interp, "env", (char *) NULL,
TCL_GLOBAL_ONLY | TCL_TRACE_WRITES | TCL_TRACE_UNSETS |
|
| ︙ | ︙ | |||
170 171 172 173 174 175 176 |
TclSetEnv(name, value)
CONST char *name; /* Name of variable whose value is to be
* set (UTF-8). */
CONST char *value; /* New value for variable (UTF-8). */
{
Tcl_DString envString;
int index, length, nameLength;
| | > | 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 |
TclSetEnv(name, value)
CONST char *name; /* Name of variable whose value is to be
* set (UTF-8). */
CONST char *value; /* New value for variable (UTF-8). */
{
Tcl_DString envString;
int index, length, nameLength;
char *p, *oldValue;
CONST char *p2;
/*
* Figure out where the entry is going to go. If the name doesn't
* already exist, enlarge the array if necessary to make room. If the
* name exists, free its old entry.
*/
|
| ︙ | ︙ | |||
202 203 204 205 206 207 208 |
}
index = length;
environ[index + 1] = NULL;
#endif
oldValue = NULL;
nameLength = strlen(name);
} else {
| | | 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 |
}
index = length;
environ[index + 1] = NULL;
#endif
oldValue = NULL;
nameLength = strlen(name);
} else {
CONST char *env;
/*
* Compare the new value to the existing value. If they're
* the same then quit immediately (e.g. don't rewrite the
* value or propagate it to other interpreters). Otherwise,
* when there are N interpreters there will be N! propagations
* of the same value among the interpreters.
|
| ︙ | ︙ | |||
299 300 301 302 303 304 305 |
int
Tcl_PutEnv(string)
CONST char *string; /* Info about environment variable in the
* form NAME=value. (native) */
{
Tcl_DString nameString;
int nameLength;
| | > | 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 |
int
Tcl_PutEnv(string)
CONST char *string; /* Info about environment variable in the
* form NAME=value. (native) */
{
Tcl_DString nameString;
int nameLength;
CONST char *name;
char *value;
if (string == NULL) {
return 0;
}
/*
* First convert the native string to UTF. Then separate the
|
| ︙ | ︙ | |||
439 440 441 442 443 444 445 | * * Side effects: * None. * *---------------------------------------------------------------------- */ | | | | 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 |
*
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
CONST char *
TclGetEnv(name, valuePtr)
CONST char *name; /* Name of environment variable to find
* (UTF-8). */
Tcl_DString *valuePtr; /* Uninitialized or free DString in which
* the value of the environment variable is
* stored. */
{
int length, index;
CONST char *result;
Tcl_MutexLock(&envMutex);
index = TclpFindVariable(name, &length);
result = NULL;
if (index != -1) {
Tcl_DString envStr;
|
| ︙ | ︙ | |||
526 527 528 529 530 531 532 |
}
/*
* If a value is being set, call TclSetEnv to do all of the work.
*/
if (flags & TCL_TRACE_WRITES) {
| | | | 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 |
}
/*
* If a value is being set, call TclSetEnv to do all of the work.
*/
if (flags & TCL_TRACE_WRITES) {
CONST char *value;
value = Tcl_GetVar2(interp, "env", name2, TCL_GLOBAL_ONLY);
TclSetEnv(name2, value);
}
/*
* If a value is being read, call TclGetEnv to do all of the work.
*/
if (flags & TCL_TRACE_READS) {
Tcl_DString valueString;
CONST char *value;
value = TclGetEnv(name2, &valueString);
if (value == NULL) {
return "no such variable";
}
Tcl_SetVar2(interp, name1, name2, value, 0);
Tcl_DStringFree(&valueString);
|
| ︙ | ︙ | |||
629 630 631 632 633 634 635 |
if (environCache) {
memcpy((VOID *) newCache, (VOID *) environCache,
(size_t) (cacheSize * sizeof(char*)));
ckfree((char *) environCache);
}
environCache = newCache;
| | | 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 |
if (environCache) {
memcpy((VOID *) newCache, (VOID *) environCache,
(size_t) (cacheSize * sizeof(char*)));
ckfree((char *) environCache);
}
environCache = newCache;
environCache[cacheSize] = newStr;
environCache[cacheSize+1] = NULL;
cacheSize += 5;
}
}
/*
*----------------------------------------------------------------------
|
| ︙ | ︙ |
Changes to generic/tclEvent.c.
1 2 3 4 5 6 7 8 9 10 11 12 13 | /* * tclEvent.c -- * * This file implements some general event related interfaces including * background errors, exit handlers, and the "vwait" and "update" * command procedures. * * Copyright (c) 1990-1994 The Regents of the University of California. * Copyright (c) 1994-1998 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | /* * tclEvent.c -- * * This file implements some general event related interfaces including * background errors, exit handlers, and the "vwait" and "update" * command procedures. * * Copyright (c) 1990-1994 The Regents of the University of California. * Copyright (c) 1994-1998 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclEvent.c,v 1.15.2.1 2002/02/05 02:21:59 wolfsuit Exp $ */ #include "tclInt.h" #include "tclPort.h" /* * The data structure below is used to report background errors. One |
| ︙ | ︙ | |||
136 137 138 139 140 141 142 |
void
Tcl_BackgroundError(interp)
Tcl_Interp *interp; /* Interpreter in which an error has
* occurred. */
{
BgError *errPtr;
| | | 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
void
Tcl_BackgroundError(interp)
Tcl_Interp *interp; /* Interpreter in which an error has
* occurred. */
{
BgError *errPtr;
CONST char *errResult, *varValue;
ErrAssocData *assocPtr;
int length;
/*
* The Tcl_AddErrorInfo call below (with an empty string) ensures that
* errorInfo gets properly set. It's needed in cases where the error
* came from a utility procedure like Tcl_GetVar instead of Tcl_Eval;
|
| ︙ | ︙ | |||
286 287 288 289 290 291 292 |
errChannel = Tcl_GetStdChannel(TCL_STDERR);
if (errChannel != (Tcl_Channel) NULL) {
char *string;
int len;
string = Tcl_GetStringFromObj(Tcl_GetObjResult(interp), &len);
| | | 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 |
errChannel = Tcl_GetStdChannel(TCL_STDERR);
if (errChannel != (Tcl_Channel) NULL) {
char *string;
int len;
string = Tcl_GetStringFromObj(Tcl_GetObjResult(interp), &len);
if (Tcl_FindCommand(interp, "bgerror", NULL, TCL_GLOBAL_ONLY) == NULL) {
Tcl_WriteChars(errChannel, assocPtr->firstBgPtr->errorInfo, -1);
Tcl_WriteChars(errChannel, "\n", -1);
} else {
Tcl_WriteChars(errChannel,
"bgerror failed to handle background error.\n",
-1);
Tcl_WriteChars(errChannel, " Original error: ", -1);
|
| ︙ | ︙ | |||
934 935 936 937 938 939 940 |
*
*----------------------------------------------------------------------
*/
int
TclInExit()
{
| | > | 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 |
*
*----------------------------------------------------------------------
*/
int
TclInExit()
{
ThreadSpecificData *tsdPtr = (ThreadSpecificData *)
TclThreadDataKeyGet(&dataKey);
if (tsdPtr == NULL) {
return inFinalize;
} else {
return tsdPtr->inExit;
}
}
|
| ︙ | ︙ | |||
1045 1046 1047 1048 1049 1050 1051 |
ClientData clientData; /* Not used. */
Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
int optionIndex;
int flags = 0; /* Initialized to avoid compiler warning. */
| | | 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 |
ClientData clientData; /* Not used. */
Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
int optionIndex;
int flags = 0; /* Initialized to avoid compiler warning. */
static CONST char *updateOptions[] = {"idletasks", (char *) NULL};
enum updateOptions {REGEXP_IDLETASKS};
if (objc == 1) {
flags = TCL_ALL_EVENTS|TCL_DONT_WAIT;
} else if (objc == 2) {
if (Tcl_GetIndexFromObj(interp, objv[1], updateOptions,
"option", 0, &optionIndex) != TCL_OK) {
|
| ︙ | ︙ |
Changes to generic/tclExecute.c.
1 2 3 4 5 6 7 8 9 10 11 12 | /* * tclExecute.c -- * * This file contains procedures that execute byte-compiled Tcl * commands. * * Copyright (c) 1996-1997 Sun Microsystems, Inc. * Copyright (c) 1998-2000 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | > | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | /* * tclExecute.c -- * * This file contains procedures that execute byte-compiled Tcl * commands. * * Copyright (c) 1996-1997 Sun Microsystems, Inc. * Copyright (c) 1998-2000 by Scriptics Corporation. * Copyright (c) 2001 by Kevin B. Kenny. All rights reserved. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclExecute.c,v 1.34.4.1 2002/02/05 02:21:59 wolfsuit Exp $ */ #include "tclInt.h" #include "tclCompile.h" #ifdef NO_FLOAT_H # include "../compat/float.h" |
| ︙ | ︙ | |||
216 217 218 219 220 221 222 | #define O2S(objPtr) #endif /* TCL_COMPILE_DEBUG */ /* * Declarations for local procedures to this file: */ | | < < < < | | 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 | #define O2S(objPtr) #endif /* TCL_COMPILE_DEBUG */ /* * Declarations for local procedures to this file: */ static int TclExecuteByteCode _ANSI_ARGS_((Tcl_Interp *interp, ByteCode *codePtr)); static int ExprAbsFunc _ANSI_ARGS_((Tcl_Interp *interp, ExecEnv *eePtr, ClientData clientData)); static int ExprBinaryFunc _ANSI_ARGS_((Tcl_Interp *interp, ExecEnv *eePtr, ClientData clientData)); static int ExprCallMathFunc _ANSI_ARGS_((Tcl_Interp *interp, ExecEnv *eePtr, int objc, Tcl_Obj **objv)); static int ExprDoubleFunc _ANSI_ARGS_((Tcl_Interp *interp, |
| ︙ | ︙ | |||
244 245 246 247 248 249 250 |
ExecEnv *eePtr, ClientData clientData));
static int ExprUnaryFunc _ANSI_ARGS_((Tcl_Interp *interp,
ExecEnv *eePtr, ClientData clientData));
#ifdef TCL_COMPILE_STATS
static int EvalStatsCmd _ANSI_ARGS_((ClientData clientData,
Tcl_Interp *interp, int argc, char **argv));
#endif
| < < | | > | < | 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 |
ExecEnv *eePtr, ClientData clientData));
static int ExprUnaryFunc _ANSI_ARGS_((Tcl_Interp *interp,
ExecEnv *eePtr, ClientData clientData));
#ifdef TCL_COMPILE_STATS
static int EvalStatsCmd _ANSI_ARGS_((ClientData clientData,
Tcl_Interp *interp, int argc, char **argv));
#endif
#ifdef TCL_COMPILE_DEBUG
static char * GetOpcodeName _ANSI_ARGS_((unsigned char *pc));
#endif
static ExceptionRange * GetExceptRangeForPc _ANSI_ARGS_((unsigned char *pc,
int catchOnly, ByteCode* codePtr));
static char * GetSrcInfoForPc _ANSI_ARGS_((unsigned char *pc,
ByteCode* codePtr, int *lengthPtr));
static void GrowEvaluationStack _ANSI_ARGS_((ExecEnv *eePtr));
static void IllegalExprOperandType _ANSI_ARGS_((
Tcl_Interp *interp, unsigned char *pc,
Tcl_Obj *opndPtr));
static void InitByteCodeExecution _ANSI_ARGS_((
Tcl_Interp *interp));
#ifdef TCL_COMPILE_DEBUG
static void PrintByteCodeInfo _ANSI_ARGS_((ByteCode *codePtr));
#endif
static void RecordTracebackInfo _ANSI_ARGS_((
Tcl_Interp *interp, Tcl_Obj *objPtr,
int numSrcBytes));
#ifdef TCL_COMPILE_DEBUG
static char * StringForResultCode _ANSI_ARGS_((int result));
static void ValidatePcAndStackTop _ANSI_ARGS_((
ByteCode *codePtr, unsigned char *pc,
int stackTop, int stackLowerBound));
#endif
static int VerifyExprObjType _ANSI_ARGS_((Tcl_Interp *interp,
Tcl_Obj *objPtr));
/*
* Table describing the built-in math functions. Entries in this table are
* indexed by the values of the INST_CALL_BUILTIN_FUNC instruction's
|
| ︙ | ︙ | |||
310 311 312 313 314 315 316 |
{"double", 1, {TCL_EITHER}, ExprDoubleFunc, 0},
{"int", 1, {TCL_EITHER}, ExprIntFunc, 0},
{"rand", 0, {TCL_EITHER}, ExprRandFunc, 0}, /* NOTE: rand takes no args. */
{"round", 1, {TCL_EITHER}, ExprRoundFunc, 0},
{"srand", 1, {TCL_INT}, ExprSrandFunc, 0},
{0},
};
| < < < < < < < < < < < < < < < < | < | < | 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 |
{"double", 1, {TCL_EITHER}, ExprDoubleFunc, 0},
{"int", 1, {TCL_EITHER}, ExprIntFunc, 0},
{"rand", 0, {TCL_EITHER}, ExprRandFunc, 0}, /* NOTE: rand takes no args. */
{"round", 1, {TCL_EITHER}, ExprRoundFunc, 0},
{"srand", 1, {TCL_INT}, ExprSrandFunc, 0},
{0},
};
/*
*----------------------------------------------------------------------
*
* InitByteCodeExecution --
*
* This procedure is called once to initialize the Tcl bytecode
* interpreter.
*
* Results:
* None.
*
* Side effects:
* This procedure initializes the array of instruction names. If
* compiling with the TCL_COMPILE_STATS flag, it initializes the
* array that counts the executions of each instruction and it
* creates the "evalstats" command. It also establishes the link
* between the Tcl "tcl_traceExec" and C "tclTraceExec" variables.
*
*----------------------------------------------------------------------
*/
static void
InitByteCodeExecution(interp)
Tcl_Interp *interp; /* Interpreter for which the Tcl variable
* "tcl_traceExec" is linked to control
* instruction tracing. */
{
#ifdef TCL_COMPILE_DEBUG
if (Tcl_LinkVar(interp, "tcl_traceExec", (char *) &tclTraceExec,
TCL_LINK_INT) != TCL_OK) {
panic("InitByteCodeExecution: can't create link for tcl_traceExec variable");
}
#endif
#ifdef TCL_COMPILE_STATS
|
| ︙ | ︙ | |||
511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 |
memcpy((VOID *) newStackPtr, (VOID *) eePtr->stackPtr,
(size_t) currBytes);
Tcl_EventuallyFree((ClientData)eePtr->stackPtr, TCL_DYNAMIC);
eePtr->stackPtr = newStackPtr;
eePtr->stackEnd = (newElems - 1); /* i.e. index of last usable item */
}
/*
*----------------------------------------------------------------------
*
* TclExecuteByteCode --
*
* This procedure executes the instructions of a ByteCode structure.
* It returns when a "done" instruction is executed or an error occurs.
*
* Results:
* The return value is one of the return codes defined in tcl.h
* (such as TCL_OK), and interp->objResultPtr refers to a Tcl object
* that either contains the result of executing the code or an
* error message.
*
* Side effects:
* Almost certainly, depending on the ByteCode's instructions.
*
*----------------------------------------------------------------------
*/
| > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 |
memcpy((VOID *) newStackPtr, (VOID *) eePtr->stackPtr,
(size_t) currBytes);
Tcl_EventuallyFree((ClientData)eePtr->stackPtr, TCL_DYNAMIC);
eePtr->stackPtr = newStackPtr;
eePtr->stackEnd = (newElems - 1); /* i.e. index of last usable item */
}
/*
*--------------------------------------------------------------
*
* Tcl_ExprObj --
*
* Evaluate an expression in a Tcl_Obj.
*
* Results:
* A standard Tcl object result. If the result is other than TCL_OK,
* then the interpreter's result contains an error message. If the
* result is TCL_OK, then a pointer to the expression's result value
* object is stored in resultPtrPtr. In that case, the object's ref
* count is incremented to reflect the reference returned to the
* caller; the caller is then responsible for the resulting object
* and must, for example, decrement the ref count when it is finished
* with the object.
*
* Side effects:
* Any side effects caused by subcommands in the expression, if any.
* The interpreter result is not modified unless there is an error.
*
*--------------------------------------------------------------
*/
int
Tcl_ExprObj(interp, objPtr, resultPtrPtr)
Tcl_Interp *interp; /* Context in which to evaluate the
* expression. */
register Tcl_Obj *objPtr; /* Points to Tcl object containing
* expression to evaluate. */
Tcl_Obj **resultPtrPtr; /* Where the Tcl_Obj* that is the expression
* result is stored if no errors occur. */
{
Interp *iPtr = (Interp *) interp;
CompileEnv compEnv; /* Compilation environment structure
* allocated in frame. */
LiteralTable *localTablePtr = &(compEnv.localLitTable);
register ByteCode *codePtr = NULL;
/* Tcl Internal type of bytecode.
* Initialized to avoid compiler warning. */
AuxData *auxDataPtr;
LiteralEntry *entryPtr;
Tcl_Obj *saveObjPtr;
char *string;
int length, i, result;
/*
* First handle some common expressions specially.
*/
string = Tcl_GetStringFromObj(objPtr, &length);
if (length == 1) {
if (*string == '0') {
*resultPtrPtr = Tcl_NewLongObj(0);
Tcl_IncrRefCount(*resultPtrPtr);
return TCL_OK;
} else if (*string == '1') {
*resultPtrPtr = Tcl_NewLongObj(1);
Tcl_IncrRefCount(*resultPtrPtr);
return TCL_OK;
}
} else if ((length == 2) && (*string == '!')) {
if (*(string+1) == '0') {
*resultPtrPtr = Tcl_NewLongObj(1);
Tcl_IncrRefCount(*resultPtrPtr);
return TCL_OK;
} else if (*(string+1) == '1') {
*resultPtrPtr = Tcl_NewLongObj(0);
Tcl_IncrRefCount(*resultPtrPtr);
return TCL_OK;
}
}
/*
* Get the ByteCode from the object. If it exists, make sure it hasn't
* been invalidated by, e.g., someone redefining a command with a
* compile procedure (this might make the compiled code wrong). If
* necessary, convert the object to be a ByteCode object and compile it.
* Also, if the code was compiled in/for a different interpreter, we
* recompile it.
*
* Precompiled expressions, however, are immutable and therefore
* they are not recompiled, even if the epoch has changed.
*
*/
if (objPtr->typePtr == &tclByteCodeType) {
codePtr = (ByteCode *) objPtr->internalRep.otherValuePtr;
if (((Interp *) *codePtr->interpHandle != iPtr)
|| (codePtr->compileEpoch != iPtr->compileEpoch)) {
if (codePtr->flags & TCL_BYTECODE_PRECOMPILED) {
if ((Interp *) *codePtr->interpHandle != iPtr) {
panic("Tcl_ExprObj: compiled expression jumped interps");
}
codePtr->compileEpoch = iPtr->compileEpoch;
} else {
(*tclByteCodeType.freeIntRepProc)(objPtr);
objPtr->typePtr = (Tcl_ObjType *) NULL;
}
}
}
if (objPtr->typePtr != &tclByteCodeType) {
TclInitCompileEnv(interp, &compEnv, string, length);
result = TclCompileExpr(interp, string, length, &compEnv);
/*
* Free the compilation environment's literal table bucket array if
* it was dynamically allocated.
*/
if (localTablePtr->buckets != localTablePtr->staticBuckets) {
ckfree((char *) localTablePtr->buckets);
}
if (result != TCL_OK) {
/*
* Compilation errors. Free storage allocated for compilation.
*/
#ifdef TCL_COMPILE_DEBUG
TclVerifyLocalLiteralTable(&compEnv);
#endif /*TCL_COMPILE_DEBUG*/
entryPtr = compEnv.literalArrayPtr;
for (i = 0; i < compEnv.literalArrayNext; i++) {
TclReleaseLiteral(interp, entryPtr->objPtr);
entryPtr++;
}
#ifdef TCL_COMPILE_DEBUG
TclVerifyGlobalLiteralTable(iPtr);
#endif /*TCL_COMPILE_DEBUG*/
auxDataPtr = compEnv.auxDataArrayPtr;
for (i = 0; i < compEnv.auxDataArrayNext; i++) {
if (auxDataPtr->type->freeProc != NULL) {
auxDataPtr->type->freeProc(auxDataPtr->clientData);
}
auxDataPtr++;
}
TclFreeCompileEnv(&compEnv);
return result;
}
/*
* Successful compilation. If the expression yielded no
* instructions, push an zero object as the expression's result.
*/
if (compEnv.codeNext == compEnv.codeStart) {
TclEmitPush(TclRegisterLiteral(&compEnv, "0", 1, /*onHeap*/ 0),
&compEnv);
}
/*
* Add a "done" instruction as the last instruction and change the
* object into a ByteCode object. Ownership of the literal objects
* and aux data items is given to the ByteCode object.
*/
compEnv.numSrcBytes = iPtr->termOffset;
TclEmitOpcode(INST_DONE, &compEnv);
TclInitByteCodeObj(objPtr, &compEnv);
TclFreeCompileEnv(&compEnv);
codePtr = (ByteCode *) objPtr->internalRep.otherValuePtr;
#ifdef TCL_COMPILE_DEBUG
if (tclTraceCompile == 2) {
TclPrintByteCodeObj(interp, objPtr);
}
#endif /* TCL_COMPILE_DEBUG */
}
/*
* Execute the expression after first saving the interpreter's result.
*/
saveObjPtr = Tcl_GetObjResult(interp);
Tcl_IncrRefCount(saveObjPtr);
Tcl_ResetResult(interp);
/*
* Increment the code's ref count while it is being executed. If
* afterwards no references to it remain, free the code.
*/
codePtr->refCount++;
result = TclExecuteByteCode(interp, codePtr);
codePtr->refCount--;
if (codePtr->refCount <= 0) {
TclCleanupByteCode(codePtr);
objPtr->typePtr = NULL;
objPtr->internalRep.otherValuePtr = NULL;
}
/*
* If the expression evaluated successfully, store a pointer to its
* value object in resultPtrPtr then restore the old interpreter result.
* We increment the object's ref count to reflect the reference that we
* are returning to the caller. We also decrement the ref count of the
* interpreter's result object after calling Tcl_SetResult since we
* next store into that field directly.
*/
if (result == TCL_OK) {
*resultPtrPtr = iPtr->objResultPtr;
Tcl_IncrRefCount(iPtr->objResultPtr);
Tcl_SetObjResult(interp, saveObjPtr);
}
Tcl_DecrRefCount(saveObjPtr);
return result;
}
/*
*----------------------------------------------------------------------
*
* TclCompEvalObj --
*
* This procedure evaluates the script contained in a Tcl_Obj by
* first compiling it and then passing it to TclExecuteByteCode.
*
* Results:
* The return value is one of the return codes defined in tcl.h
* (such as TCL_OK), and interp->objResultPtr refers to a Tcl object
* that either contains the result of executing the code or an
* error message.
*
* Side effects:
* Almost certainly, depending on the ByteCode's instructions.
*
*----------------------------------------------------------------------
*/
int
TclCompEvalObj(interp, objPtr, engineCall)
Tcl_Interp *interp;
Tcl_Obj *objPtr;
int engineCall; /* Set to 1 if it is an internal
* engine call, 0 if called from
* Tcl_EvalObjEx */
{
register Interp *iPtr = (Interp *) interp;
int evalFlags; /* Interp->evalFlags value when the
* procedure was called. */
register ByteCode* codePtr; /* Tcl Internal type of bytecode. */
int oldCount = iPtr->cmdCount; /* Used to tell whether any commands
* at all were executed. */
int numSrcBytes;
int result;
Namespace *namespacePtr;
/*
* Check that the interpreter is ready to execute scripts
*/
if (TclInterpReady(interp) == TCL_ERROR) {
return TCL_ERROR;
}
/*
* Get the ByteCode from the object. If it exists, make sure it hasn't
* been invalidated by, e.g., someone redefining a command with a
* compile procedure (this might make the compiled code wrong). If
* necessary, convert the object to be a ByteCode object and compile it.
* Also, if the code was compiled in/for a different interpreter,
* or for a different namespace, or for the same namespace but
* with different name resolution rules, we recompile it.
*
* Precompiled objects, however, are immutable and therefore
* they are not recompiled, even if the epoch has changed.
*
* To be pedantically correct, we should also check that the
* originating procPtr is the same as the current context procPtr
* (assuming one exists at all - none for global level). This
* code is #def'ed out because [info body] was changed to never
* return a bytecode type object, which should obviate us from
* the extra checks here.
*/
if (iPtr->varFramePtr != NULL) {
namespacePtr = iPtr->varFramePtr->nsPtr;
} else {
namespacePtr = iPtr->globalNsPtr;
}
if (objPtr->typePtr == &tclByteCodeType) {
codePtr = (ByteCode *) objPtr->internalRep.otherValuePtr;
if (((Interp *) *codePtr->interpHandle != iPtr)
|| (codePtr->compileEpoch != iPtr->compileEpoch)
#ifdef CHECK_PROC_ORIGINATION /* [Bug: 3412 Pedantic] */
|| (codePtr->procPtr != NULL && !(iPtr->varFramePtr &&
iPtr->varFramePtr->procPtr == codePtr->procPtr))
#endif
|| (codePtr->nsPtr != namespacePtr)
|| (codePtr->nsEpoch != namespacePtr->resolverEpoch)) {
if (codePtr->flags & TCL_BYTECODE_PRECOMPILED) {
if ((Interp *) *codePtr->interpHandle != iPtr) {
panic("Tcl_EvalObj: compiled script jumped interps");
}
codePtr->compileEpoch = iPtr->compileEpoch;
} else {
tclByteCodeType.freeIntRepProc(objPtr);
}
}
}
if (objPtr->typePtr != &tclByteCodeType) {
iPtr->errorLine = 1;
result = tclByteCodeType.setFromAnyProc(interp, objPtr);
if (result != TCL_OK) {
return result;;
}
} else {
codePtr = (ByteCode *) objPtr->internalRep.otherValuePtr;
if (((Interp *) *codePtr->interpHandle != iPtr)
|| (codePtr->compileEpoch != iPtr->compileEpoch)) {
(*tclByteCodeType.freeIntRepProc)(objPtr);
iPtr->errorLine = 1;
result = (*tclByteCodeType.setFromAnyProc)(interp, objPtr);
if (result != TCL_OK) {
return result;
}
}
}
codePtr = (ByteCode *) objPtr->internalRep.otherValuePtr;
/*
* Extract then reset the compilation flags in the interpreter.
* Resetting the flags must be done after any compilation.
*/
evalFlags = iPtr->evalFlags;
iPtr->evalFlags = 0;
/*
* Execute the commands. If the code was compiled from an empty string,
* don't bother executing the code.
*/
numSrcBytes = codePtr->numSrcBytes;
iPtr->numLevels++;
if ((numSrcBytes > 0) || (codePtr->flags & TCL_BYTECODE_PRECOMPILED)) {
/*
* Increment the code's ref count while it is being executed. If
* afterwards no references to it remain, free the code.
*/
codePtr->refCount++;
result = TclExecuteByteCode(interp, codePtr);
codePtr->refCount--;
if (codePtr->refCount <= 0) {
TclCleanupByteCode(codePtr);
}
} else {
result = TCL_OK;
}
/*
* If no commands at all were executed, check for asynchronous
* handlers so that they at least get one change to execute.
* This is needed to handle event loops written in Tcl with
* empty bodies.
*/
if ((oldCount == iPtr->cmdCount) && Tcl_AsyncReady()) {
result = Tcl_AsyncInvoke(interp, result);
}
/*
* If an error occurred, record information about what was being
* executed when the error occurred.
*/
if ((result == TCL_ERROR) && !(iPtr->flags & ERR_ALREADY_LOGGED)) {
RecordTracebackInfo(interp, objPtr, numSrcBytes);
}
/*
* Set the interpreter's termOffset member to the offset of the
* character just after the last one executed. We approximate the offset
* of the last character executed by using the number of characters
* compiled.
*/
iPtr->termOffset = numSrcBytes;
iPtr->flags &= ~ERR_ALREADY_LOGGED;
iPtr->numLevels--;
/*
* Tcl_EvalObjEx needs the evalFlags for error reporting at
* iPtr->numLevels 0 - we pass it here, it will reset them.
*/
if (!engineCall) {
iPtr->evalFlags = evalFlags;
}
return result;
}
/*
*----------------------------------------------------------------------
*
* RecordTracebackInfo --
*
* Procedure called by Tcl_EvalObj to record information about what was
* being executed when the error occurred.
*
* Results:
* None.
*
* Side effects:
* Appends information about the script being evaluated to the
* interpreter's "errorInfo" variable.
*
*----------------------------------------------------------------------
*/
static void
RecordTracebackInfo(interp, objPtr, numSrcBytes)
Tcl_Interp *interp; /* The interpreter in which the error
* occurred. */
Tcl_Obj *objPtr; /* Points to object containing script whose
* evaluation resulted in an error. */
int numSrcBytes; /* Number of bytes compiled in script. */
{
Interp *iPtr = (Interp *) interp;
char buf[200];
char *ellipsis, *bytes;
int length;
/*
* Decide how much of the command to print in the error message
* (up to a certain number of bytes).
*/
bytes = Tcl_GetStringFromObj(objPtr, &length);
length = TclMin(numSrcBytes, length);
ellipsis = "";
if (length > 150) {
length = 150;
ellipsis = " ...";
}
if (!(iPtr->flags & ERR_IN_PROGRESS)) {
sprintf(buf, "\n while executing\n\"%.*s%s\"",
length, bytes, ellipsis);
} else {
sprintf(buf, "\n invoked from within\n\"%.*s%s\"",
length, bytes, ellipsis);
}
Tcl_AddObjErrorInfo(interp, buf, -1);
}
/*
*----------------------------------------------------------------------
*
* TclExecuteByteCode --
*
* This procedure executes the instructions of a ByteCode structure.
* It returns when a "done" instruction is executed or an error occurs.
*
* Results:
* The return value is one of the return codes defined in tcl.h
* (such as TCL_OK), and interp->objResultPtr refers to a Tcl object
* that either contains the result of executing the code or an
* error message.
*
* Side effects:
* Almost certainly, depending on the ByteCode's instructions.
*
*----------------------------------------------------------------------
*/
static int
TclExecuteByteCode(interp, codePtr)
Tcl_Interp *interp; /* Token for command interpreter. */
ByteCode *codePtr; /* The bytecode sequence to interpret. */
{
Interp *iPtr = (Interp *) interp;
ExecEnv *eePtr = iPtr->execEnvPtr;
/* Points to the execution environment. */
|
| ︙ | ︙ | |||
613 614 615 616 617 618 619 |
/*
* Loop executing instructions until a "done" instruction, a TCL_RETURN,
* or some error.
*/
for (;;) {
#ifdef TCL_COMPILE_DEBUG
| | < | 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 |
/*
* Loop executing instructions until a "done" instruction, a TCL_RETURN,
* or some error.
*/
for (;;) {
#ifdef TCL_COMPILE_DEBUG
ValidatePcAndStackTop(codePtr, pc, stackTop, initStackTop);
if (traceInstructions) {
fprintf(stdout, "%2d: %2d ", iPtr->numLevels, stackTop);
TclPrintInstruction(codePtr, pc);
fflush(stdout);
}
#endif /* TCL_COMPILE_DEBUG */
|
| ︙ | ︙ | |||
674 675 676 677 678 679 680 681 682 683 684 685 686 687 |
case INST_DUP:
valuePtr = stackPtr[stackTop];
PUSH_OBJECT(valuePtr);
TRACE_WITH_OBJ(("=> "), valuePtr);
ADJUST_PC(1);
case INST_CONCAT1:
opnd = TclGetUInt1AtPtr(pc+1);
{
Tcl_Obj *concatObjPtr;
int totalLen = 0;
/*
| > > > > > > > | 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 |
case INST_DUP:
valuePtr = stackPtr[stackTop];
PUSH_OBJECT(valuePtr);
TRACE_WITH_OBJ(("=> "), valuePtr);
ADJUST_PC(1);
case INST_OVER:
opnd = TclGetUInt4AtPtr( pc+1 );
valuePtr = stackPtr[ stackTop - opnd ];
PUSH_OBJECT( valuePtr );
TRACE_WITH_OBJ(("=> "), valuePtr);
ADJUST_PC( 5 );
case INST_CONCAT1:
opnd = TclGetUInt1AtPtr(pc+1);
{
Tcl_Obj *concatObjPtr;
int totalLen = 0;
/*
|
| ︙ | ︙ | |||
739 740 741 742 743 744 745 |
opnd = TclGetUInt1AtPtr(pc+1);
pcAdjustment = 2;
doInvocation:
{
int objc = opnd; /* The number of arguments. */
Tcl_Obj **objv; /* The array of argument objects. */
| < < | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | > > > > > > > > > | > > > > > > | | > > > > > > | > | > > | > > > > > > > | < < > > | > > < < | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | < < < | < < < < < < < < < < < < | 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 |
opnd = TclGetUInt1AtPtr(pc+1);
pcAdjustment = 2;
doInvocation:
{
int objc = opnd; /* The number of arguments. */
Tcl_Obj **objv; /* The array of argument objects. */
int newPcOffset; /* New inst offset for break, continue. */
Tcl_Obj **preservedStack;
/* Reference to memory block containing
* objv array (must be kept live throughout
* trace and command invokations.) */
#ifdef TCL_COMPILE_DEBUG
char cmdNameBuf[21];
#endif
objv = &(stackPtr[stackTop - (objc-1)]);
#ifdef TCL_COMPILE_DEBUG
if (tclTraceExec >= 2) {
if (traceInstructions) {
strncpy(cmdNameBuf, Tcl_GetString(objv[0]), 20);
TRACE(("%u => call ", objc));
} else {
fprintf(stdout, "%d: (%u) invoking ",
iPtr->numLevels,
(unsigned int)(pc - codePtr->codeStart));
}
for (i = 0; i < objc; i++) {
TclPrintObject(stdout, objv[i], 15);
fprintf(stdout, " ");
}
fprintf(stdout, "\n");
fflush(stdout);
}
#endif /*TCL_COMPILE_DEBUG*/
/*
* If trace procedures will be called, we need a
* command string to pass to TclEvalObjvInternal; note
* that a copy of the string will be made there to
* include the ending \0.
*/
bytes = NULL;
length = 0;
if (iPtr->tracePtr != NULL) {
Trace *tracePtr, *nextTracePtr;
for (tracePtr = iPtr->tracePtr; tracePtr != NULL;
tracePtr = nextTracePtr) {
nextTracePtr = tracePtr->nextPtr;
if (iPtr->numLevels <= tracePtr->level) {
/*
* Traces will be called: get command string
*/
bytes = GetSrcInfoForPc(pc, codePtr, &length);
break;
}
}
}
/*
* A reference to part of the stack vector itself
* escapes our control, so must use preserve/release
* to stop it from being deallocated by a recursive
* call to ourselves. The extra variable is needed
* because all others are liable to change due to the
* trace procedures.
*/
Tcl_Preserve((ClientData)stackPtr);
preservedStack = stackPtr;
/*
* Finally, let TclEvalObjvInternal handle the command.
*/
Tcl_ResetResult(interp);
DECACHE_STACK_INFO();
result = TclEvalObjvInternal(interp, objc, objv, bytes, length, 0);
CACHE_STACK_INFO();
/*
* If the old stack is going to be released, it is
* safe to do so now, since no references to objv are
* going to be used from now on.
*/
Tcl_Release((ClientData) preservedStack);
/*
* Pop the objc top stack elements and decrement their ref
* counts.
*/
for (i = 0; i < objc; i++) {
|
| ︙ | ︙ | |||
994 995 996 997 998 999 1000 | goto checkForCatch; } } case INST_EVAL_STK: objPtr = POP_OBJECT(); DECACHE_STACK_INFO(); | | | 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 |
goto checkForCatch;
}
}
case INST_EVAL_STK:
objPtr = POP_OBJECT();
DECACHE_STACK_INFO();
result = TclCompEvalObj(interp, objPtr, /* engineCall */ 1);
CACHE_STACK_INFO();
if (result == TCL_OK) {
/*
* Normal return; push the eval's object result.
*/
PUSH_OBJECT(Tcl_GetObjResult(interp));
TRACE_WITH_OBJ(("\"%.30s\" => ", O2S(objPtr)),
|
| ︙ | ︙ | |||
1411 1412 1413 1414 1415 1416 1417 | * Pop the opnd (objc) top stack elements into a new list obj * and then decrement their ref counts. */ opnd = TclGetUInt4AtPtr(pc+1); valuePtr = Tcl_NewListObj(opnd, &(stackPtr[stackTop - (opnd-1)])); | | | | 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 |
* Pop the opnd (objc) top stack elements into a new list obj
* and then decrement their ref counts.
*/
opnd = TclGetUInt4AtPtr(pc+1);
valuePtr = Tcl_NewListObj(opnd, &(stackPtr[stackTop - (opnd-1)]));
for (i = 0; i < opnd; stackTop--, i++) {
TclDecrRefCount(stackPtr[stackTop]);
}
PUSH_OBJECT(valuePtr);
TRACE_WITH_OBJ(("%u => ", opnd), valuePtr);
ADJUST_PC(5);
/*
|
| ︙ | ︙ | |||
2009 2010 2011 2012 2013 2014 2015 |
PUSH_OBJECT(Tcl_NewIntObj(length));
TRACE(("%.20s => %d\n", O2S(valuePtr), length));
TclDecrRefCount(valuePtr);
ADJUST_PC(1);
case INST_LIST_INDEX:
{
| | > | > | | > | | > > | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > | > > > | | | | < < > | > > > | > > > | > > | > > | > > | > | > > | > > > > | > > > > > > | | | > > > | > > > > | > > > | > | > | > > > > > > > > | | | > > > | > > > | > > > > | > > > > > > > > | > | > > > | > > > > > > > > | > > > > > > > > > > > > > > > > > > > | | | 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 |
PUSH_OBJECT(Tcl_NewIntObj(length));
TRACE(("%.20s => %d\n", O2S(valuePtr), length));
TclDecrRefCount(valuePtr);
ADJUST_PC(1);
case INST_LIST_INDEX:
{
/*** lindex with objc == 3 ***/
/* Pop the two operands */
value2Ptr = POP_OBJECT();
valuePtr = POP_OBJECT();
/* Extract the desired list element */
objPtr = TclLindexList( interp, valuePtr, value2Ptr );
if ( objPtr == NULL ) {
TRACE_WITH_OBJ( ( "%.30s %.30s => ERROR: ",
O2S( valuePtr ),
O2S( value2Ptr ) ),
Tcl_GetObjResult( interp ) );
TclDecrRefCount( value2Ptr );
TclDecrRefCount( valuePtr );
result = TCL_ERROR;
goto checkForCatch;
}
/* Stash the list element on the stack */
PUSH_OBJECT( objPtr );
TRACE(( "%.20s %.20s => %s\n",
O2S( valuePtr ),
O2S( value2Ptr ),
O2S( objPtr ) ) );
TclDecrRefCount( valuePtr );
TclDecrRefCount( value2Ptr );
TclDecrRefCount( objPtr );
}
ADJUST_PC( 1 );
case INST_LIST_INDEX_MULTI:
{
/*
* 'lindex' with multiple index args:
*
* Determine the count of index args.
*/
int numIdx;
opnd = TclGetUInt4AtPtr(pc+1);
numIdx = opnd-1;
/*
* Do the 'lindex' operation.
*/
objPtr = TclLindexFlat( interp,
stackPtr[ stackTop - numIdx ],
numIdx,
stackPtr + stackTop - numIdx + 1 );
/*
* Clean up ref counts
*/
for ( i = 0 ; i <= numIdx ; i++ ) {
Tcl_DecrRefCount( stackPtr[ stackTop -- ] );
}
/*
* Check for errors
*/
if ( objPtr == NULL ) {
TRACE_WITH_OBJ( ( "%d => ERROR: ", opnd ),
Tcl_GetObjResult( interp ) );
result = TCL_ERROR;
goto checkForCatch;
}
/*
* Set result
*/
PUSH_OBJECT( objPtr );
TRACE(( "%d => %s\n", opnd, O2S( objPtr ) ));
Tcl_DecrRefCount( objPtr );
}
ADJUST_PC( 5 );
case INST_LSET_FLAT:
{
/*
* Lset with 3, 5, or more args. Get the number of index args.
*/
int numIdx;
opnd = TclGetUInt4AtPtr( pc + 1 );
numIdx = opnd - 2;
/*
* Get the old value of variable, and remove the stack ref.
* This is safe because the variable still references the
* object; the ref count will never go zero here.
*/
value2Ptr = POP_OBJECT();
Tcl_DecrRefCount( value2Ptr );
/*
* Get the new element value.
*/
valuePtr = POP_OBJECT();
/*
* Compute the new variable value
*/
objPtr = TclLsetFlat( interp, value2Ptr, numIdx,
stackPtr + stackTop - numIdx + 1,
valuePtr );
Tcl_DecrRefCount( valuePtr );
/*
* Clean up ref counts
*/
for ( i = 0 ; i < numIdx ; i++ ) {
Tcl_DecrRefCount( stackPtr[ stackTop -- ] );
}
/*
* Check for errors
*/
if ( objPtr == NULL ) {
TRACE_WITH_OBJ( ( "%d => ERROR: ", opnd ),
Tcl_GetObjResult( interp ) );
result = TCL_ERROR;
goto checkForCatch;
}
/*
* Set result
*/
PUSH_OBJECT( objPtr );
TRACE(( "%d => %s\n", opnd, O2S( objPtr ) ));
Tcl_DecrRefCount( objPtr );
}
ADJUST_PC( 5 );
case INST_LSET_LIST:
{
/*
* 'lset' with 4 args.
*
* Get the old value of variable, and remove the stack ref.
* This is safe because the variable still references the
* object; the ref count will never go zero here.
*/
objPtr = POP_OBJECT();
Tcl_DecrRefCount( objPtr );
/*
* Get the new element value, and the index list
*/
valuePtr = POP_OBJECT();
value2Ptr = POP_OBJECT();
/*
* Compute the new variable value
*/
objPtr = TclLsetList( interp, objPtr, value2Ptr, valuePtr );
Tcl_DecrRefCount( valuePtr );
Tcl_DecrRefCount( value2Ptr );
/*
* Check for errors
*/
if ( objPtr == NULL ) {
TRACE_WITH_OBJ( ( "\"%.30s\" => ERROR: ", O2S(value2Ptr)),
Tcl_GetObjResult( interp ) );
result = TCL_ERROR;
goto checkForCatch;
}
/*
* Set result
*/
PUSH_OBJECT( objPtr );
TRACE(( "=> %s\n", O2S( objPtr ) ));
Tcl_DecrRefCount( objPtr );
}
ADJUST_PC( 1 );
case INST_STR_EQ:
case INST_STR_NEQ:
{
/*
* String (in)equality check
*/
|
| ︙ | ︙ | |||
3317 3318 3319 3320 3321 3322 3323 |
listTmpIndex = infoPtr->firstValueTemp;
for (i = 0; i < numLists; i++) {
varListPtr = infoPtr->varLists[i];
numVars = varListPtr->numVars;
listVarPtr = &(compiledLocals[listTmpIndex]);
listPtr = listVarPtr->value.objPtr;
| | | 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 |
listTmpIndex = infoPtr->firstValueTemp;
for (i = 0; i < numLists; i++) {
varListPtr = infoPtr->varLists[i];
numVars = varListPtr->numVars;
listVarPtr = &(compiledLocals[listTmpIndex]);
listPtr = listVarPtr->value.objPtr;
listRepPtr = (List *) listPtr->internalRep.twoPtrValue.ptr1;
listLen = listRepPtr->elemCount;
valIndex = (iterNum * numVars);
for (j = 0; j < numVars; j++) {
int setEmptyStr = 0;
if (valIndex >= listLen) {
setEmptyStr = 1;
|
| ︙ | ︙ | |||
3574 3575 3576 3577 3578 3579 3580 | * top are invalid. * *---------------------------------------------------------------------- */ #ifdef TCL_COMPILE_DEBUG static void | | < < > > | | | | 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 |
* top are invalid.
*
*----------------------------------------------------------------------
*/
#ifdef TCL_COMPILE_DEBUG
static void
ValidatePcAndStackTop(codePtr, pc, stackTop, stackLowerBound)
register ByteCode *codePtr; /* The bytecode whose summary is printed
* to stdout. */
unsigned char *pc; /* Points to first byte of a bytecode
* instruction. The program counter. */
int stackTop; /* Current stack top. Must be between
* stackLowerBound and stackUpperBound
* (inclusive). */
int stackLowerBound; /* Smallest legal value for stackTop. */
{
int stackUpperBound = stackLowerBound + codePtr->maxStackDepth;
/* Greatest legal value for stackTop. */
unsigned int relativePc = (unsigned int) (pc - codePtr->codeStart);
unsigned int codeStart = (unsigned int) codePtr->codeStart;
unsigned int codeEnd = (unsigned int)
(codePtr->codeStart + codePtr->numCodeBytes);
unsigned char opCode = *pc;
if (((unsigned int) pc < codeStart) || ((unsigned int) pc > codeEnd)) {
fprintf(stderr, "\nBad instruction pc 0x%x in TclExecuteByteCode\n",
(unsigned int) pc);
panic("TclExecuteByteCode execution failure: bad pc");
}
if ((unsigned int) opCode > LAST_INST_OPCODE) {
fprintf(stderr, "\nBad opcode %d at pc %u in TclExecuteByteCode\n",
(unsigned int) opCode, relativePc);
panic("TclExecuteByteCode execution failure: bad opcode");
}
if ((stackTop < stackLowerBound) || (stackTop > stackUpperBound)) {
int numChars;
char *cmd = GetSrcInfoForPc(pc, codePtr, &numChars);
char *ellipsis = "";
fprintf(stderr, "\nBad stack top %d at pc %u in TclExecuteByteCode (min %i, max %i)",
stackTop, relativePc, stackLowerBound, stackUpperBound);
if (cmd != NULL) {
if (numChars > 100) {
numChars = 100;
ellipsis = "...";
}
fprintf(stderr, "\n executing %.*s%s\n", numChars, cmd,
ellipsis);
|
| ︙ | ︙ | |||
3686 3687 3688 3689 3690 3691 3692 |
}
}
Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), "can't use ",
msg, " as operand of \"", operatorStrings[opCode - INST_LOR],
"\"", (char *) NULL);
}
}
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 |
}
}
Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), "can't use ",
msg, " as operand of \"", operatorStrings[opCode - INST_LOR],
"\"", (char *) NULL);
}
}
/*
*----------------------------------------------------------------------
*
* GetSrcInfoForPc --
*
* Given a program counter value, finds the closest command in the
|
| ︙ | ︙ | |||
5327 5328 5329 5330 5331 5332 5333 |
fprintf(stdout, "\nHeap Statistics:\n");
TclDumpMemoryInfo(stdout);
#endif
fprintf(stdout, "\n----------------------------------------------------------------\n");
return TCL_OK;
}
#endif /* TCL_COMPILE_STATS */
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 5774 5775 5776 5777 5778 5779 5780 5781 5782 5783 5784 5785 5786 5787 |
fprintf(stdout, "\nHeap Statistics:\n");
TclDumpMemoryInfo(stdout);
#endif
fprintf(stdout, "\n----------------------------------------------------------------\n");
return TCL_OK;
}
#endif /* TCL_COMPILE_STATS */
#ifdef TCL_COMPILE_DEBUG
/*
*----------------------------------------------------------------------
*
* StringForResultCode --
*
|
| ︙ | ︙ |
Changes to generic/tclFCmd.c.
1 2 3 4 5 6 7 8 9 10 11 | /* * tclFCmd.c * * This file implements the generic portion of file manipulation * subcommands of the "file" command. * * Copyright (c) 1996-1998 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | /* * tclFCmd.c * * This file implements the generic portion of file manipulation * subcommands of the "file" command. * * Copyright (c) 1996-1998 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclFCmd.c,v 1.13.8.1 2002/02/05 02:21:59 wolfsuit Exp $ */ #include "tclInt.h" #include "tclPort.h" /* * Declarations for local procedures defined in this file: |
| ︙ | ︙ | |||
402 403 404 405 406 407 408 |
Tcl_AppendResult(interp, "error deleting unknown file: ",
Tcl_PosixError(interp), (char *) NULL);
} else {
Tcl_AppendResult(interp, "error deleting \"",
Tcl_GetString(errfile), "\": ",
Tcl_PosixError(interp), (char *) NULL);
}
| > > | | | < < | 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 |
Tcl_AppendResult(interp, "error deleting unknown file: ",
Tcl_PosixError(interp), (char *) NULL);
} else {
Tcl_AppendResult(interp, "error deleting \"",
Tcl_GetString(errfile), "\": ",
Tcl_PosixError(interp), (char *) NULL);
}
}
done:
if (errorBuffer != NULL) {
Tcl_DecrRefCount(errorBuffer);
}
return result;
}
/*
*---------------------------------------------------------------------------
*
* CopyRenameOneFile
|
| ︙ | ︙ | |||
806 807 808 809 810 811 812 |
int
TclFileAttrsCmd(interp, objc, objv)
Tcl_Interp *interp; /* The interpreter for error reporting. */
int objc; /* Number of command line arguments. */
Tcl_Obj *CONST objv[]; /* The command line objects. */
{
int result;
| | | 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 |
int
TclFileAttrsCmd(interp, objc, objv)
Tcl_Interp *interp; /* The interpreter for error reporting. */
int objc; /* Number of command line arguments. */
Tcl_Obj *CONST objv[]; /* The command line objects. */
{
int result;
CONST char ** attributeStrings;
Tcl_Obj* objStrings = NULL;
int numObjStrings = -1;
Tcl_Obj *filePtr;
if (objc < 3) {
Tcl_WrongNumArgs(interp, 2, objv,
"name ?option? ?value? ?option value ...?");
|
| ︙ | ︙ | |||
838 839 840 841 842 843 844 |
}
/* We own the object now */
Tcl_IncrRefCount(objStrings);
/* Use objStrings as a list object */
if (Tcl_ListObjLength(interp, objStrings, &numObjStrings) != TCL_OK) {
goto end;
}
| | > | 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 |
}
/* We own the object now */
Tcl_IncrRefCount(objStrings);
/* Use objStrings as a list object */
if (Tcl_ListObjLength(interp, objStrings, &numObjStrings) != TCL_OK) {
goto end;
}
attributeStrings = (CONST char **)
ckalloc ((1+numObjStrings) * sizeof(char*));
for (index = 0; index < numObjStrings; index++) {
Tcl_ListObjIndex(interp, objStrings, index, &objPtr);
attributeStrings[index] = Tcl_GetString(objPtr);
}
attributeStrings[index] = NULL;
}
if (objc == 0) {
|
| ︙ | ︙ |
Changes to generic/tclFileName.c.
1 2 3 4 5 6 7 8 9 10 11 12 | /* * tclFileName.c -- * * This file contains routines for converting file names betwen * native and network form. * * Copyright (c) 1995-1998 Sun Microsystems, Inc. * Copyright (c) 1998-1999 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /* * tclFileName.c -- * * This file contains routines for converting file names betwen * native and network form. * * Copyright (c) 1995-1998 Sun Microsystems, Inc. * Copyright (c) 1998-1999 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclFileName.c,v 1.22.2.1 2002/02/05 02:21:59 wolfsuit Exp $ */ #include "tclInt.h" #include "tclPort.h" #include "tclRegexp.h" /* |
| ︙ | ︙ | |||
66 67 68 69 70 71 72 | TclPlatformType tclPlatform = TCL_PLATFORM_UNIX; /* * Prototypes for local procedures defined in this file: */ | | | 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | TclPlatformType tclPlatform = TCL_PLATFORM_UNIX; /* * Prototypes for local procedures defined in this file: */ static CONST char * DoTildeSubst _ANSI_ARGS_((Tcl_Interp *interp, CONST char *user, Tcl_DString *resultPtr)); static CONST char * ExtractWinRoot _ANSI_ARGS_((CONST char *path, Tcl_DString *resultPtr, int offset, Tcl_PathType *typePtr)); static int SkipToChar _ANSI_ARGS_((char **stringPtr, char *match)); static Tcl_Obj* SplitMacPath _ANSI_ARGS_((CONST char *path)); |
| ︙ | ︙ | |||
162 163 164 165 166 167 168 |
Tcl_DString *resultPtr; /* Buffer to hold result. */
int offset; /* Offset in buffer where result should be
* stored. */
Tcl_PathType *typePtr; /* Where to store pathType result */
{
if (path[0] == '/' || path[0] == '\\') {
/* Might be a UNC or Vol-Relative path */
| | | | 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 |
Tcl_DString *resultPtr; /* Buffer to hold result. */
int offset; /* Offset in buffer where result should be
* stored. */
Tcl_PathType *typePtr; /* Where to store pathType result */
{
if (path[0] == '/' || path[0] == '\\') {
/* Might be a UNC or Vol-Relative path */
CONST char *host, *share, *tail;
int hlen, slen;
if (path[1] != '/' && path[1] != '\\') {
Tcl_DStringSetLength(resultPtr, offset);
*typePtr = TCL_PATH_VOLUME_RELATIVE;
Tcl_DStringAppend(resultPtr, "/", 1);
return &path[1];
}
host = &path[2];
/* Skip separators */
while (host[0] == '/' || host[0] == '\\') host++;
for (hlen = 0; host[hlen];hlen++) {
if (host[hlen] == '/' || host[hlen] == '\\')
break;
|
| ︙ | ︙ | |||
378 379 380 381 382 383 384 |
FileNameInit();
re = Tcl_GetRegExpFromObj(NULL, tsdPtr->macRootPatternPtr,
REG_ADVANCED);
if (!Tcl_RegExpExec(NULL, re, path, path)) {
type = TCL_PATH_RELATIVE;
} else {
| | | > | > | | > | 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 |
FileNameInit();
re = Tcl_GetRegExpFromObj(NULL, tsdPtr->macRootPatternPtr,
REG_ADVANCED);
if (!Tcl_RegExpExec(NULL, re, path, path)) {
type = TCL_PATH_RELATIVE;
} else {
CONST char *root, *end;
Tcl_RegExpRange(re, 2, &root, &end);
if (root != NULL) {
type = TCL_PATH_RELATIVE;
} else {
if (driveNameLengthPtr != NULL) {
Tcl_RegExpRange(re, 0, &root, &end);
*driveNameLengthPtr = end - root;
}
if (driveNameRef != NULL) {
if (*root == '/') {
char *c;
int gotColon = 0;
*driveNameRef = Tcl_NewStringObj(root + 1,
end - root -1);
c = Tcl_GetString(*driveNameRef);
while (*c != '\0') {
if (*c == '/') {
gotColon++;
*c = ':';
}
c++;
}
/*
* If there is no colon, we have just a
* volume name so we must add a colon so
* it is an absolute path.
*/
if (gotColon == 0) {
Tcl_AppendToObj(*driveNameRef, ":", 1);
} else if ((gotColon > 1) &&
(*(c-1) == ':')) {
/* We have an extra colon */
Tcl_SetObjLength(*driveNameRef,
c - Tcl_GetString(*driveNameRef) - 1);
}
}
}
}
|
| ︙ | ︙ | |||
444 445 446 447 448 449 450 |
CONST char *rootEnd;
Tcl_DStringInit(&ds);
rootEnd = ExtractWinRoot(path, &ds, 0, &type);
if ((rootEnd != path) && (driveNameLengthPtr != NULL)) {
*driveNameLengthPtr = rootEnd - path;
if (driveNameRef != NULL) {
| | | | 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 |
CONST char *rootEnd;
Tcl_DStringInit(&ds);
rootEnd = ExtractWinRoot(path, &ds, 0, &type);
if ((rootEnd != path) && (driveNameLengthPtr != NULL)) {
*driveNameLengthPtr = rootEnd - path;
if (driveNameRef != NULL) {
*driveNameRef = Tcl_NewStringObj(Tcl_DStringValue(&ds),
Tcl_DStringLength(&ds));
Tcl_IncrRefCount(*driveNameRef);
}
}
Tcl_DStringFree(&ds);
break;
}
}
|
| ︙ | ︙ | |||
547 548 549 550 551 552 553 |
*/
void
Tcl_SplitPath(path, argcPtr, argvPtr)
CONST char *path; /* Pointer to string containing a path. */
int *argcPtr; /* Pointer to location to fill in with
* the number of elements in the path. */
| | | 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 |
*/
void
Tcl_SplitPath(path, argcPtr, argvPtr)
CONST char *path; /* Pointer to string containing a path. */
int *argcPtr; /* Pointer to location to fill in with
* the number of elements in the path. */
CONST char ***argvPtr; /* Pointer to place to store pointer to array
* of pointers to path elements. */
{
Tcl_Obj *resultPtr = NULL; /* Needed only to prevent gcc warnings. */
Tcl_Obj *tmpPtr, *eltPtr;
int i, size, len;
char *p, *str;
|
| ︙ | ︙ | |||
578 579 580 581 582 583 584 |
}
/*
* Allocate a buffer large enough to hold the contents of all of
* the list plus the argv pointers and the terminating NULL pointer.
*/
| | | 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 |
}
/*
* Allocate a buffer large enough to hold the contents of all of
* the list plus the argv pointers and the terminating NULL pointer.
*/
*argvPtr = (CONST char **) ckalloc((unsigned)
((((*argcPtr) + 1) * sizeof(char *)) + size));
/*
* Position p after the last argv pointer and copy the contents of
* the list in, piece by piece.
*/
|
| ︙ | ︙ | |||
807 808 809 810 811 812 813 |
*/
i = 0; /* Needed only to prevent gcc warnings. */
re = Tcl_GetRegExpFromObj(NULL, tsdPtr->macRootPatternPtr, REG_ADVANCED);
if (Tcl_RegExpExec(NULL, re, path, path) == 1) {
| | | 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 |
*/
i = 0; /* Needed only to prevent gcc warnings. */
re = Tcl_GetRegExpFromObj(NULL, tsdPtr->macRootPatternPtr, REG_ADVANCED);
if (Tcl_RegExpExec(NULL, re, path, path) == 1) {
CONST char *start, *end;
Tcl_Obj *nextElt;
/*
* Treat degenerate absolute paths like / and /../.. as
* Mac relative file names for lack of anything else to do.
*/
|
| ︙ | ︙ | |||
844 845 846 847 848 849 850 |
*/
isMac = 1;
i = 7;
} else {
Tcl_RegExpRange(re, 10, &start, &end);
if (start) {
| < < | 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 |
*/
isMac = 1;
i = 7;
} else {
Tcl_RegExpRange(re, 10, &start, &end);
if (start) {
/*
* Normal Unix style paths.
*/
isMac = 0;
i = 10;
} else {
Tcl_RegExpRange(re, 12, &start, &end);
if (start) {
/*
* Normal Mac style paths.
*/
isMac = 1;
i = 12;
}
|
| ︙ | ︙ | |||
927 928 929 930 931 932 933 |
p++;
}
while ((p = strchr(p, ':')) != NULL) {
length = p - elementStart;
if (length == 1) {
while (*p == ':') {
| | > | | | | | 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 |
p++;
}
while ((p = strchr(p, ':')) != NULL) {
length = p - elementStart;
if (length == 1) {
while (*p == ':') {
Tcl_ListObjAppendElement(NULL, result,
Tcl_NewStringObj("::", 2));
elementStart = p++;
}
} else {
/*
* If this is a simple component, drop the leading colon.
*/
if ((elementStart[1] != '~')
&& (strchr(elementStart+1, '/') == NULL)) {
elementStart++;
length--;
}
Tcl_ListObjAppendElement(NULL, result,
Tcl_NewStringObj(elementStart, length));
elementStart = p++;
}
}
if (elementStart[0] != ':') {
if (elementStart[0] != '\0') {
Tcl_ListObjAppendElement(NULL, result,
Tcl_NewStringObj(elementStart, -1));
}
} else {
if (elementStart[1] != '\0' || elementStart == path) {
if ((elementStart[1] != '~') && (elementStart[1] != '\0')
&& (strchr(elementStart+1, '/') == NULL)) {
elementStart++;
}
Tcl_ListObjAppendElement(NULL, result,
Tcl_NewStringObj(elementStart, -1));
}
}
} else {
/*
* Split on slashes, suppress extra /'s, and convert .. to ::.
*/
|
| ︙ | ︙ | |||
1027 1028 1029 1030 1031 1032 1033 |
int objc;
Tcl_Obj *CONST objv[];
{
int i;
Tcl_Obj *lobj, *ret;
if (basePtr == NULL) {
| | | | | 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 |
int objc;
Tcl_Obj *CONST objv[];
{
int i;
Tcl_Obj *lobj, *ret;
if (basePtr == NULL) {
lobj = Tcl_NewListObj(0, NULL);
} else {
lobj = Tcl_NewListObj(1, &basePtr);
}
for (i = 0; i<objc;i++) {
Tcl_ListObjAppendElement(NULL, lobj, objv[i]);
}
ret = Tcl_FSJoinPath(lobj, -1);
Tcl_DecrRefCount(lobj);
return ret;
}
/*
*---------------------------------------------------------------------------
*
|
| ︙ | ︙ | |||
1086 1087 1088 1089 1090 1091 1092 |
if (*p == '\0') {
return;
}
switch (tclPlatform) {
case TCL_PLATFORM_UNIX:
| < | 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 |
if (*p == '\0') {
return;
}
switch (tclPlatform) {
case TCL_PLATFORM_UNIX:
/*
* Append a separator if needed.
*/
if (length > 0 && (start[length-1] != '/')) {
Tcl_AppendToObj(prefix, "/", 1);
length++;
|
| ︙ | ︙ | |||
1148 1149 1150 1151 1152 1153 1154 |
Tcl_SetObjLength(prefix, length + (int) strlen(p));
dest = Tcl_GetString(prefix) + length;
for (; *p != '\0'; p++) {
if ((*p == '/') || (*p == '\\')) {
while ((p[1] == '/') || (p[1] == '\\')) {
p++;
}
| | < | < | 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 |
Tcl_SetObjLength(prefix, length + (int) strlen(p));
dest = Tcl_GetString(prefix) + length;
for (; *p != '\0'; p++) {
if ((*p == '/') || (*p == '\\')) {
while ((p[1] == '/') || (p[1] == '\\')) {
p++;
}
if ((p[1] != '\0') && needsSep) {
*dest++ = '/';
}
} else {
*dest++ = *p;
needsSep = 1;
}
}
length = dest - Tcl_GetString(prefix);
|
| ︙ | ︙ | |||
1265 1266 1267 1268 1269 1270 1271 | * * Side effects: * Modifies the Tcl_DString. * *---------------------------------------------------------------------- */ | | | | | | > | | | | 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 |
*
* Side effects:
* Modifies the Tcl_DString.
*
*----------------------------------------------------------------------
*/
CONST char *
Tcl_JoinPath(argc, argv, resultPtr)
int argc;
CONST char * CONST *argv;
Tcl_DString *resultPtr; /* Pointer to previously initialized DString */
{
int i, len;
Tcl_Obj *listObj = Tcl_NewObj();
Tcl_Obj *resultObj;
char *resultStr;
/* Build the list of paths */
for (i = 0; i < argc; i++) {
Tcl_ListObjAppendElement(NULL, listObj,
Tcl_NewStringObj(argv[i], -1));
}
/* Ask the objectified code to join the paths */
Tcl_IncrRefCount(listObj);
resultObj = Tcl_FSJoinPath(listObj, argc);
Tcl_IncrRefCount(resultObj);
Tcl_DecrRefCount(listObj);
/* Store the result */
resultStr = Tcl_GetStringFromObj(resultObj, &len);
Tcl_DStringAppend(resultPtr, resultStr, len);
Tcl_DecrRefCount(resultObj);
/* Return a pointer to the result */
return Tcl_DStringValue(resultPtr);
}
/*
*---------------------------------------------------------------------------
*
|
| ︙ | ︙ | |||
1322 1323 1324 1325 1326 1327 1328 | * * Side effects: * None. * *---------------------------------------------------------------------- */ | | | < < < | < | < | < | < < < < | < < < < < < < | < < | | | < | < < | < | < > | 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 |
*
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
CONST char *
Tcl_TranslateFileName(interp, name, bufferPtr)
Tcl_Interp *interp; /* Interpreter in which to store error
* message (if necessary). */
CONST char *name; /* File name, which may begin with "~" (to
* indicate current user's home directory) or
* "~<user>" (to indicate any user's home
* directory). */
Tcl_DString *bufferPtr; /* Uninitialized or free DString filled
* with name after tilde substitution. */
{
Tcl_Obj *path = Tcl_NewStringObj(name, -1);
CONST char *result;
Tcl_IncrRefCount(path);
result = Tcl_FSGetTranslatedStringPath(interp,path);
if (result == NULL) {
return NULL;
}
Tcl_DStringInit(bufferPtr);
Tcl_DStringAppend(bufferPtr, result, -1);
Tcl_DecrRefCount(path);
/*
* Convert forward slashes to backslashes in Windows paths because
* some system interfaces don't accept forward slashes.
*/
if (tclPlatform == TCL_PLATFORM_WINDOWS) {
register char *p;
for (p = Tcl_DStringValue(bufferPtr); *p != '\0'; p++) {
if (*p == '/') {
*p = '\\';
}
}
|
| ︙ | ︙ | |||
1440 1441 1442 1443 1444 1445 1446 |
if (strchr("/\\:", *p) != NULL) {
lastSep = p;
}
}
break;
}
p = strrchr(name, '.');
| | < | 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 |
if (strchr("/\\:", *p) != NULL) {
lastSep = p;
}
}
break;
}
p = strrchr(name, '.');
if ((p != NULL) && (lastSep != NULL) && (lastSep > p)) {
p = NULL;
}
/*
* In earlier versions, we used to back up to the first period in a series
* so that "foo..o" would be split into "foo" and "..o". This is a
* confusing and usually incorrect behavior, so now we split at the last
|
| ︙ | ︙ | |||
1477 1478 1479 1480 1481 1482 1483 | * * Side effects: * Information may be left in resultPtr. * *---------------------------------------------------------------------- */ | | | | 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 |
*
* Side effects:
* Information may be left in resultPtr.
*
*----------------------------------------------------------------------
*/
static CONST char *
DoTildeSubst(interp, user, resultPtr)
Tcl_Interp *interp; /* Interpreter in which to store error
* message (if necessary). */
CONST char *user; /* Name of user whose home directory should be
* substituted, or "" for current user. */
Tcl_DString *resultPtr; /* Initialized DString filled with name
* after tilde substitution. */
{
CONST char *dir;
if (*user == '\0') {
Tcl_DString dirString;
dir = TclGetEnv("HOME", &dirString);
if (dir == NULL) {
if (interp) {
|
| ︙ | ︙ | |||
1512 1513 1514 1515 1516 1517 1518 |
Tcl_ResetResult(interp);
Tcl_AppendResult(interp, "user \"", user, "\" doesn't exist",
(char *) NULL);
}
return NULL;
}
}
| | | 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 |
Tcl_ResetResult(interp);
Tcl_AppendResult(interp, "user \"", user, "\" doesn't exist",
(char *) NULL);
}
return NULL;
}
}
return Tcl_DStringValue(resultPtr);
}
/*
*----------------------------------------------------------------------
*
* Tcl_GlobObjCmd --
*
|
| ︙ | ︙ | |||
1545 1546 1547 1548 1549 1550 1551 |
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
int index, i, globFlags, length, join, dir, result;
char *string, *separators;
Tcl_Obj *typePtr, *resultPtr, *look;
Tcl_Obj *pathOrDir = NULL;
Tcl_DString prefix;
| | | 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 |
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
int index, i, globFlags, length, join, dir, result;
char *string, *separators;
Tcl_Obj *typePtr, *resultPtr, *look;
Tcl_Obj *pathOrDir = NULL;
Tcl_DString prefix;
static CONST char *options[] = {
"-directory", "-join", "-nocomplain", "-path", "-tails",
"-types", "--", NULL
};
enum options {
GLOB_DIR, GLOB_JOIN, GLOB_NOCOMPLAIN, GLOB_PATH, GLOB_TAILS,
GLOB_TYPE, GLOB_LAST
};
|
| ︙ | ︙ | |||
1965 1966 1967 1968 1969 1970 1971 |
Tcl_Obj *unquotedPrefix; /* Prefix to glob pattern, if non-null, which
* is considered literally. */
int globFlags; /* Stores or'ed combination of flags */
Tcl_GlobTypeData *types; /* Struct containing acceptable types.
* May be NULL. */
{
char *separators;
| > | | 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 |
Tcl_Obj *unquotedPrefix; /* Prefix to glob pattern, if non-null, which
* is considered literally. */
int globFlags; /* Stores or'ed combination of flags */
Tcl_GlobTypeData *types; /* Struct containing acceptable types.
* May be NULL. */
{
char *separators;
CONST char *head;
char *tail, *start;
char c;
int result, prefixLen;
Tcl_DString buffer;
separators = NULL; /* lint. */
switch (tclPlatform) {
case TCL_PLATFORM_UNIX:
|
| ︙ | ︙ |
Changes to generic/tclGetDate.y.
1 2 3 4 5 6 7 8 9 10 11 12 13 | /* * tclGetDate.y -- * * Contains yacc grammar for parsing date and time strings. * The output of this file should be the file tclDate.c which * is used directly in the Tcl sources. * * Copyright (c) 1992-1995 Karl Lehenbauer and Mark Diekhans. * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/*
* tclGetDate.y --
*
* Contains yacc grammar for parsing date and time strings.
* The output of this file should be the file tclDate.c which
* is used directly in the Tcl sources.
*
* Copyright (c) 1992-1995 Karl Lehenbauer and Mark Diekhans.
* Copyright (c) 1995-1997 Sun Microsystems, Inc.
*
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
* RCS: @(#) $Id: tclGetDate.y,v 1.17.8.1 2002/02/05 02:21:59 wolfsuit Exp $
*/
%{
/*
* tclDate.c --
*
* This file is generated from a yacc grammar defined in
|
| ︙ | ︙ | |||
794 795 796 797 798 799 800 801 802 803 804 805 806 807 |
tm = TclpGetDate((TclpTime_t)&Start, 0);
Month = 12 * (tm->tm_year + TM_YEAR_BASE) + tm->tm_mon + RelMonth;
Year = Month / 12;
Month = Month % 12 + 1;
result = Convert(Month, (time_t) tm->tm_mday, Year,
(time_t) tm->tm_hour, (time_t) tm->tm_min, (time_t) tm->tm_sec,
MER24, DSTmaybe, &Julian);
/*
* The following iteration takes into account the case were we jump
* into a "short month". Far example, "one month from Jan 31" will
* fail because there is no Feb 31. The code below will reduce the
* day and try converting the date until we succed or the date equals
* 28 (which always works unless the date is bad in another way).
*/
| > > > > > > > > > > > > > > > > > | 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 |
tm = TclpGetDate((TclpTime_t)&Start, 0);
Month = 12 * (tm->tm_year + TM_YEAR_BASE) + tm->tm_mon + RelMonth;
Year = Month / 12;
Month = Month % 12 + 1;
result = Convert(Month, (time_t) tm->tm_mday, Year,
(time_t) tm->tm_hour, (time_t) tm->tm_min, (time_t) tm->tm_sec,
MER24, DSTmaybe, &Julian);
/*
* The Julian time returned above is behind by one day, if "month"
* or "year" is used to specify relative time and the GMT flag is true.
* This problem occurs only when the current time is closer to
* midnight, the difference being not more than its time difference
* with GMT. For example, in US/Pacific time zone, the problem occurs
* whenever the current time is between midnight to 8:00am or 7:00amDST.
* See Bug# 413397 for more details and sample script.
* To resolve this bug, we simply add the number of seconds corresponding
* to timezone difference with GMT to Julian time, if GMT flag is true.
*/
if (TclDateTimezone == 0) {
Julian += TclpGetTimeZone((unsigned long) Start) * 60L;
}
/*
* The following iteration takes into account the case were we jump
* into a "short month". Far example, "one month from Jan 31" will
* fail because there is no Feb 31. The code below will reduce the
* day and try converting the date until we succed or the date equals
* 28 (which always works unless the date is bad in another way).
*/
|
| ︙ | ︙ |
Changes to generic/tclHash.c.
1 2 3 4 5 6 7 8 9 10 11 12 | /* * tclHash.c -- * * Implementation of in-memory hash tables for Tcl and Tcl-based * applications. * * Copyright (c) 1991-1993 The Regents of the University of California. * Copyright (c) 1994 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /* * tclHash.c -- * * Implementation of in-memory hash tables for Tcl and Tcl-based * applications. * * Copyright (c) 1991-1993 The Regents of the University of California. * Copyright (c) 1994 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclHash.c,v 1.9.14.1 2002/02/05 02:21:59 wolfsuit Exp $ */ #include "tclInt.h" /* * Prevent macros from clashing with function definitions. */ |
| ︙ | ︙ | |||
732 733 734 735 736 737 738 | * * Side effects: * None. * *---------------------------------------------------------------------- */ | | | 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 |
*
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
CONST char *
Tcl_HashStats(tablePtr)
Tcl_HashTable *tablePtr; /* Table for which to produce stats. */
{
#define NUM_COUNTERS 10
int count[NUM_COUNTERS], overflow, i, j;
double average, tmp;
register Tcl_HashEntry *hPtr;
|
| ︙ | ︙ |
Changes to generic/tclHistory.c.
| ︙ | ︙ | |||
8 9 10 11 12 13 14 | * * Copyright (c) 1990-1993 The Regents of the University of California. * Copyright (c) 1994-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | * * Copyright (c) 1990-1993 The Regents of the University of California. * Copyright (c) 1994-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclHistory.c,v 1.3.28.1 2002/02/05 02:21:59 wolfsuit Exp $ */ #include "tclInt.h" #include "tclPort.h" /* |
| ︙ | ︙ | |||
38 39 40 41 42 43 44 |
*----------------------------------------------------------------------
*/
int
Tcl_RecordAndEval(interp, cmd, flags)
Tcl_Interp *interp; /* Token for interpreter in which command
* will be executed. */
| | | 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
*----------------------------------------------------------------------
*/
int
Tcl_RecordAndEval(interp, cmd, flags)
Tcl_Interp *interp; /* Token for interpreter in which command
* will be executed. */
CONST char *cmd; /* Command to record. */
int flags; /* Additional flags. TCL_NO_EVAL means
* only record: don't execute command.
* TCL_EVAL_GLOBAL means use Tcl_GlobalEval
* instead of Tcl_Eval. */
{
register Tcl_Obj *cmdPtr;
int length = strlen(cmd);
|
| ︙ | ︙ |
Changes to generic/tclIO.c.
1 2 3 4 5 6 7 8 9 10 11 12 | /* * tclIO.c -- * * This file provides the generic portions (those that are the same on * all platforms and for all channel types) of Tcl's IO facilities. * * Copyright (c) 1998-2000 Ajuba Solutions * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /* * tclIO.c -- * * This file provides the generic portions (those that are the same on * all platforms and for all channel types) of Tcl's IO facilities. * * Copyright (c) 1998-2000 Ajuba Solutions * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclIO.c,v 1.38.2.1 2002/02/05 02:21:59 wolfsuit Exp $ */ #include "tclInt.h" #include "tclPort.h" #include "tclIO.h" #include <assert.h> |
| ︙ | ︙ | |||
108 109 110 111 112 113 114 | Tcl_Channel chan)); static void DiscardInputQueued _ANSI_ARGS_((ChannelState *statePtr, int discardSavedBuffers)); static void DiscardOutputQueued _ANSI_ARGS_(( ChannelState *chanPtr)); static int DoRead _ANSI_ARGS_((Channel *chanPtr, char *srcPtr, int slen)); | | | 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | Tcl_Channel chan)); static void DiscardInputQueued _ANSI_ARGS_((ChannelState *statePtr, int discardSavedBuffers)); static void DiscardOutputQueued _ANSI_ARGS_(( ChannelState *chanPtr)); static int DoRead _ANSI_ARGS_((Channel *chanPtr, char *srcPtr, int slen)); static int DoWrite _ANSI_ARGS_((Channel *chanPtr, CONST char *src, int srcLen)); static int DoReadChars _ANSI_ARGS_ ((Channel* chan, Tcl_Obj* objPtr, int toRead, int appendFlag)); static int DoWriteChars _ANSI_ARGS_ ((Channel* chan, CONST char* src, int len)); static int FilterInputBytes _ANSI_ARGS_((Channel *chanPtr, GetsState *statePtr)); |
| ︙ | ︙ | |||
752 753 754 755 756 757 758 |
* Always (un)register bottom-most channel in the stack. This makes
* management of the channel list easier because no manipulation is
* necessary during (un)stack operation.
*/
chanPtr = ((Channel *) chan)->state->bottomChanPtr;
statePtr = chanPtr->state;
| | | 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 |
* Always (un)register bottom-most channel in the stack. This makes
* management of the channel list easier because no manipulation is
* necessary during (un)stack operation.
*/
chanPtr = ((Channel *) chan)->state->bottomChanPtr;
statePtr = chanPtr->state;
if (statePtr->channelName == (CONST char *) NULL) {
panic("Tcl_RegisterChannel: channel without name");
}
if (interp != (Tcl_Interp *) NULL) {
hTblPtr = GetChannelTable(interp);
hPtr = Tcl_CreateHashEntry(hTblPtr, statePtr->channelName, &new);
if (new == 0) {
if (chan == (Tcl_Channel) Tcl_GetHashValue(hPtr)) {
|
| ︙ | ︙ | |||
999 1000 1001 1002 1003 1004 1005 |
*---------------------------------------------------------------------------
*/
Tcl_Channel
Tcl_GetChannel(interp, chanName, modePtr)
Tcl_Interp *interp; /* Interpreter in which to find or create
* the channel. */
| | | | 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 |
*---------------------------------------------------------------------------
*/
Tcl_Channel
Tcl_GetChannel(interp, chanName, modePtr)
Tcl_Interp *interp; /* Interpreter in which to find or create
* the channel. */
CONST char *chanName; /* The name of the channel. */
int *modePtr; /* Where to store the mode in which the
* channel was opened? Will contain an ORed
* combination of TCL_READABLE and
* TCL_WRITABLE, if non-NULL. */
{
Channel *chanPtr; /* The actual channel. */
Tcl_HashTable *hTblPtr; /* Hash table of channels. */
Tcl_HashEntry *hPtr; /* Search variable. */
CONST char *name; /* Translated name. */
/*
* Substitute "stdin", etc. Note that even though we immediately
* find the channel using Tcl_GetStdChannel, we still need to look
* it up in the specified interpreter to ensure that it is present
* in the channel table. Otherwise, safe interpreters would always
* have access to the standard channels.
|
| ︙ | ︙ | |||
1077 1078 1079 1080 1081 1082 1083 |
*
*----------------------------------------------------------------------
*/
Tcl_Channel
Tcl_CreateChannel(typePtr, chanName, instanceData, mask)
Tcl_ChannelType *typePtr; /* The channel type record. */
| | | 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 |
*
*----------------------------------------------------------------------
*/
Tcl_Channel
Tcl_CreateChannel(typePtr, chanName, instanceData, mask)
Tcl_ChannelType *typePtr; /* The channel type record. */
CONST char *chanName; /* Name of channel to record. */
ClientData instanceData; /* Instance specific data. */
int mask; /* TCL_READABLE & TCL_WRITABLE to indicate
* if the channel is readable, writable. */
{
Channel *chanPtr; /* The channel structure newly created. */
ChannelState *statePtr; /* The stack-level independent state info
* for the channel. */
|
| ︙ | ︙ | |||
1117 1118 1119 1120 1121 1122 1123 |
/*
* Set all the bits that are part of the stack-independent state
* information for the channel.
*/
if (chanName != (char *) NULL) {
| | | > | 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 |
/*
* Set all the bits that are part of the stack-independent state
* information for the channel.
*/
if (chanName != (char *) NULL) {
char *tmp = ckalloc((unsigned) (strlen(chanName) + 1));
statePtr->channelName = tmp;
strcpy(tmp, chanName);
} else {
panic("Tcl_CreateChannel: NULL channel name");
}
statePtr->flags = mask;
/*
|
| ︙ | ︙ | |||
1713 1714 1715 1716 1717 1718 1719 | * * Side effects: * None. * *---------------------------------------------------------------------- */ | | | 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 |
*
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
CONST char *
Tcl_GetChannelName(chan)
Tcl_Channel chan; /* The channel for which to return the name. */
{
ChannelState *statePtr; /* State of actual channel. */
statePtr = ((Channel *) chan)->state;
return statePtr->channelName;
|
| ︙ | ︙ | |||
2056 2057 2058 2059 2060 2061 2062 |
/*
* Produce the output on the channel.
*/
toWrite = bufPtr->nextAdded - bufPtr->nextRemoved;
written = (chanPtr->typePtr->outputProc) (chanPtr->instanceData,
| | | 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 |
/*
* Produce the output on the channel.
*/
toWrite = bufPtr->nextAdded - bufPtr->nextRemoved;
written = (chanPtr->typePtr->outputProc) (chanPtr->instanceData,
bufPtr->buf + bufPtr->nextRemoved, toWrite,
&errorCode);
/*
* If the write failed completely attempt to start the asynchronous
* flush mechanism and break out of this loop - do not attempt to
* write any more output at this time.
*/
|
| ︙ | ︙ | |||
2107 2108 2109 2110 2111 2112 2113 2114 |
if (calledFromAsyncFlush) {
if (statePtr->unreportedError == 0) {
statePtr->unreportedError = errorCode;
}
} else {
Tcl_SetErrno(errorCode);
if (interp != NULL) {
Tcl_SetResult(interp,
| > > > > > > > | | 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 |
if (calledFromAsyncFlush) {
if (statePtr->unreportedError == 0) {
statePtr->unreportedError = errorCode;
}
} else {
Tcl_SetErrno(errorCode);
if (interp != NULL) {
/*
* Casting away CONST here is safe because the
* TCL_VOLATILE flag guarantees CONST treatment
* of the Posix error string.
*/
Tcl_SetResult(interp,
(char *) Tcl_PosixError(interp), TCL_VOLATILE);
}
}
/*
* When we get an error we throw away all the output
* currently queued.
*/
|
| ︙ | ︙ | |||
2272 2273 2274 2275 2276 2277 2278 |
* Some resources can be cleared only if the bottom channel
* in a stack is closed. All the other channels in the stack
* are not allowed to remove.
*/
if (chanPtr == statePtr->bottomChanPtr) {
if (statePtr->channelName != (char *) NULL) {
| | | 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 |
* Some resources can be cleared only if the bottom channel
* in a stack is closed. All the other channels in the stack
* are not allowed to remove.
*/
if (chanPtr == statePtr->bottomChanPtr) {
if (statePtr->channelName != (char *) NULL) {
ckfree((char *) statePtr->channelName);
statePtr->channelName = NULL;
}
Tcl_FreeEncoding(statePtr->encoding);
if (statePtr->outputStage != NULL) {
ckfree((char *) statePtr->outputStage);
statePtr->outputStage = (char *) NULL;
|
| ︙ | ︙ | |||
2678 2679 2680 2681 2682 2683 2684 |
*
*----------------------------------------------------------------------
*/
int
Tcl_Write(chan, src, srcLen)
Tcl_Channel chan; /* The channel to buffer output for. */
| | | 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 |
*
*----------------------------------------------------------------------
*/
int
Tcl_Write(chan, src, srcLen)
Tcl_Channel chan; /* The channel to buffer output for. */
CONST char *src; /* Data to queue in output buffer. */
int srcLen; /* Length of data in bytes, or < 0 for
* strlen(). */
{
/*
* Always use the topmost channel of the stack
*/
Channel *chanPtr;
|
| ︙ | ︙ | |||
2728 2729 2730 2731 2732 2733 2734 |
*
*----------------------------------------------------------------------
*/
int
Tcl_WriteRaw(chan, src, srcLen)
Tcl_Channel chan; /* The channel to buffer output for. */
| | | 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 |
*
*----------------------------------------------------------------------
*/
int
Tcl_WriteRaw(chan, src, srcLen)
Tcl_Channel chan; /* The channel to buffer output for. */
CONST char *src; /* Data to queue in output buffer. */
int srcLen; /* Length of data in bytes, or < 0 for
* strlen(). */
{
Channel *chanPtr = ((Channel *) chan);
ChannelState *statePtr = chanPtr->state; /* state info for channel */
int errorCode, written;
|
| ︙ | ︙ | |||
3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 |
dstLen -= saved;
saved = 0;
}
Tcl_UtfToExternal(NULL, encoding, stage, stageLen, flags,
&statePtr->outputEncodingState, dst,
dstLen + BUFFER_PADDING, &stageRead, &dstWrote, NULL);
if (stageRead + dstWrote == 0) {
/*
* We have an incomplete UTF-8 character at the end of the
* staging buffer. It will get moved to the beginning of the
* staging buffer followed by more bytes from src.
*/
| > > > > > > > > > > > > > > > > > > | 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 |
dstLen -= saved;
saved = 0;
}
Tcl_UtfToExternal(NULL, encoding, stage, stageLen, flags,
&statePtr->outputEncodingState, dst,
dstLen + BUFFER_PADDING, &stageRead, &dstWrote, NULL);
/* Fix for SF #506297, reported by Martin Forssen <ruric@users.sourceforge.net>.
*
* The encoding chosen in the script exposing the bug
* writes out three intro characters when
* TCL_ENCODING_START is set, but does not consume any
* input as TCL_ENCODING_END is cleared. As some output
* was generated the enclosing loop calls UtfToExternal
* again, again with START set. Three more characters in
* the out and still no use of input ... To break this
* infinite loop we remove TCL_ENCODING_START from the set
* of flags after the first call (no condition is
* required, the later calls remove an unset flag, which
* is a no-op). This causes the subsequent calls to
* UtfToExternal to consume and convert the actual input.
*/
flags &= ~TCL_ENCODING_START;
if (stageRead + dstWrote == 0) {
/*
* We have an incomplete UTF-8 character at the end of the
* staging buffer. It will get moved to the beginning of the
* staging buffer followed by more bytes from src.
*/
|
| ︙ | ︙ | |||
3627 3628 3629 3630 3631 3632 3633 |
dstEnd = eof;
statePtr->flags |= (CHANNEL_EOF | CHANNEL_STICKY_EOF);
statePtr->inputEncodingFlags |= TCL_ENCODING_END;
}
if (statePtr->flags & CHANNEL_EOF) {
skip = 0;
eol = dstEnd;
| | | | | 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 |
dstEnd = eof;
statePtr->flags |= (CHANNEL_EOF | CHANNEL_STICKY_EOF);
statePtr->inputEncodingFlags |= TCL_ENCODING_END;
}
if (statePtr->flags & CHANNEL_EOF) {
skip = 0;
eol = dstEnd;
if (eol == objPtr->bytes + oldLength) {
/*
* If we didn't append any bytes before encountering EOF,
* caller needs to see -1.
*/
Tcl_SetObjLength(objPtr, oldLength);
CommonGetsCleanup(chanPtr, encoding);
copiedTotal = -1;
goto done;
}
goto goteol;
}
dst = dstEnd;
|
| ︙ | ︙ | |||
4638 4639 4640 4641 4642 4643 4644 |
* then tell the caller to fill the buffer with more bytes.
*/
ChannelBuffer *nextPtr;
nextPtr = bufPtr->nextPtr;
if (nextPtr == NULL) {
| > | | | | > > > > > > > > | | > | 4664 4665 4666 4667 4668 4669 4670 4671 4672 4673 4674 4675 4676 4677 4678 4679 4680 4681 4682 4683 4684 4685 4686 4687 4688 4689 4690 4691 4692 4693 4694 |
* then tell the caller to fill the buffer with more bytes.
*/
ChannelBuffer *nextPtr;
nextPtr = bufPtr->nextPtr;
if (nextPtr == NULL) {
if (srcLen > 0) {
/*
* There isn't enough data in the buffers to complete the next
* character, so we need to wait for more data before the next
* file event can be delivered.
*
* SF #478856.
*
* The exception to this is if the input buffer was
* completely empty before we tried to convert its
* contents. Nothing in, nothing out, and no incomplete
* character data. The conversion before the current one
* was complete.
*/
statePtr->flags |= CHANNEL_NEED_MORE_DATA;
}
return -1;
}
nextPtr->nextRemoved -= srcLen;
memcpy((VOID *) (nextPtr->buf + nextPtr->nextRemoved), (VOID *) src,
(size_t) srcLen);
RecycleBuffer(statePtr, bufPtr, 0);
statePtr->inQueueHead = nextPtr;
|
| ︙ | ︙ | |||
4685 4686 4687 4688 4689 4690 4691 |
numChars -= (dstRead - dstWrote);
if ((unsigned) numChars > (unsigned) toRead) {
/*
* Got too many chars.
*/
| | | 4721 4722 4723 4724 4725 4726 4727 4728 4729 4730 4731 4732 4733 4734 4735 |
numChars -= (dstRead - dstWrote);
if ((unsigned) numChars > (unsigned) toRead) {
/*
* Got too many chars.
*/
CONST char *eof;
eof = Tcl_UtfAtIndex(dst, toRead);
statePtr->inputEncodingState = oldState;
Tcl_ExternalToUtf(NULL, statePtr->encoding, src, srcLen,
statePtr->inputEncodingFlags, &statePtr->inputEncodingState,
dst, eof - dst + TCL_UTF_MAX, &srcRead, &dstWrote, &numChars);
dstRead = dstWrote;
|
| ︙ | ︙ | |||
4898 4899 4900 4901 4902 4903 4904 |
*
*----------------------------------------------------------------------
*/
int
Tcl_Ungets(chan, str, len, atEnd)
Tcl_Channel chan; /* The channel for which to add the input. */
| | | 4934 4935 4936 4937 4938 4939 4940 4941 4942 4943 4944 4945 4946 4947 4948 |
*
*----------------------------------------------------------------------
*/
int
Tcl_Ungets(chan, str, len, atEnd)
Tcl_Channel chan; /* The channel for which to add the input. */
CONST char *str; /* The input itself. */
int len; /* The length of the input. */
int atEnd; /* If non-zero, add at end of queue; otherwise
* add at head of queue. */
{
Channel *chanPtr; /* The real IO channel. */
ChannelState *statePtr; /* State of actual channel. */
ChannelBuffer *bufPtr; /* Buffer to contain the data. */
|
| ︙ | ︙ | |||
5858 5859 5860 5861 5862 5863 5864 |
*
*----------------------------------------------------------------------
*/
int
Tcl_BadChannelOption(interp, optionName, optionList)
Tcl_Interp *interp; /* Current interpreter. (can be NULL)*/
| | | | | | 5894 5895 5896 5897 5898 5899 5900 5901 5902 5903 5904 5905 5906 5907 5908 5909 5910 5911 5912 5913 5914 5915 5916 5917 5918 5919 5920 5921 5922 5923 |
*
*----------------------------------------------------------------------
*/
int
Tcl_BadChannelOption(interp, optionName, optionList)
Tcl_Interp *interp; /* Current interpreter. (can be NULL)*/
CONST char *optionName; /* 'bad option' name */
CONST char *optionList; /* Specific options list to append
* to the standard generic options.
* can be NULL for generic options
* only.
*/
{
if (interp) {
CONST char *genericopt =
"blocking buffering buffersize encoding eofchar translation";
CONST char **argv;
int argc, i;
Tcl_DString ds;
Tcl_DStringInit(&ds);
Tcl_DStringAppend(&ds, genericopt, -1);
if (optionList && (*optionList)) {
Tcl_DStringAppend(&ds, " ", 1);
Tcl_DStringAppend(&ds, optionList, -1);
}
if (Tcl_SplitList(interp, Tcl_DStringValue(&ds),
&argc, &argv) != TCL_OK) {
panic("malformed option list in channel driver");
|
| ︙ | ︙ | |||
5921 5922 5923 5924 5925 5926 5927 |
*----------------------------------------------------------------------
*/
int
Tcl_GetChannelOption(interp, chan, optionName, dsPtr)
Tcl_Interp *interp; /* For error reporting - can be NULL. */
Tcl_Channel chan; /* Channel on which to get option. */
| | | 5957 5958 5959 5960 5961 5962 5963 5964 5965 5966 5967 5968 5969 5970 5971 |
*----------------------------------------------------------------------
*/
int
Tcl_GetChannelOption(interp, chan, optionName, dsPtr)
Tcl_Interp *interp; /* For error reporting - can be NULL. */
Tcl_Channel chan; /* Channel on which to get option. */
CONST char *optionName; /* Option to get. */
Tcl_DString *dsPtr; /* Where to store value(s). */
{
size_t len; /* Length of optionName string. */
char optionVal[128]; /* Buffer for sprintf. */
Channel *chanPtr = (Channel *) chan;
ChannelState *statePtr = chanPtr->state; /* state info for channel */
int flags;
|
| ︙ | ︙ | |||
6055 6056 6057 6058 6059 6060 6061 6062 6063 6064 6065 6066 6067 6068 |
Tcl_DStringAppendElement(dsPtr, "");
} else {
char buf[4];
sprintf(buf, "%c", statePtr->outEofChar);
Tcl_DStringAppendElement(dsPtr, buf);
}
}
if (((flags & (TCL_READABLE|TCL_WRITABLE)) ==
(TCL_READABLE|TCL_WRITABLE)) && (len == 0)) {
Tcl_DStringEndSublist(dsPtr);
}
if (len > 0) {
return TCL_OK;
| > > > > | 6091 6092 6093 6094 6095 6096 6097 6098 6099 6100 6101 6102 6103 6104 6105 6106 6107 6108 |
Tcl_DStringAppendElement(dsPtr, "");
} else {
char buf[4];
sprintf(buf, "%c", statePtr->outEofChar);
Tcl_DStringAppendElement(dsPtr, buf);
}
}
if ( !(flags & (TCL_READABLE|TCL_WRITABLE))) {
/* Not readable or writable (server socket) */
Tcl_DStringAppendElement(dsPtr, "");
}
if (((flags & (TCL_READABLE|TCL_WRITABLE)) ==
(TCL_READABLE|TCL_WRITABLE)) && (len == 0)) {
Tcl_DStringEndSublist(dsPtr);
}
if (len > 0) {
return TCL_OK;
|
| ︙ | ︙ | |||
6095 6096 6097 6098 6099 6100 6101 6102 6103 6104 6105 6106 6107 6108 |
} else if (statePtr->outputTranslation == TCL_TRANSLATE_CR) {
Tcl_DStringAppendElement(dsPtr, "cr");
} else if (statePtr->outputTranslation == TCL_TRANSLATE_CRLF) {
Tcl_DStringAppendElement(dsPtr, "crlf");
} else {
Tcl_DStringAppendElement(dsPtr, "lf");
}
}
if (((flags & (TCL_READABLE|TCL_WRITABLE)) ==
(TCL_READABLE|TCL_WRITABLE)) && (len == 0)) {
Tcl_DStringEndSublist(dsPtr);
}
if (len > 0) {
return TCL_OK;
| > > > > | 6135 6136 6137 6138 6139 6140 6141 6142 6143 6144 6145 6146 6147 6148 6149 6150 6151 6152 |
} else if (statePtr->outputTranslation == TCL_TRANSLATE_CR) {
Tcl_DStringAppendElement(dsPtr, "cr");
} else if (statePtr->outputTranslation == TCL_TRANSLATE_CRLF) {
Tcl_DStringAppendElement(dsPtr, "crlf");
} else {
Tcl_DStringAppendElement(dsPtr, "lf");
}
}
if ( !(flags & (TCL_READABLE|TCL_WRITABLE))) {
/* Not readable or writable (server socket) */
Tcl_DStringAppendElement(dsPtr, "auto");
}
if (((flags & (TCL_READABLE|TCL_WRITABLE)) ==
(TCL_READABLE|TCL_WRITABLE)) && (len == 0)) {
Tcl_DStringEndSublist(dsPtr);
}
if (len > 0) {
return TCL_OK;
|
| ︙ | ︙ | |||
6145 6146 6147 6148 6149 6150 6151 |
*---------------------------------------------------------------------------
*/
int
Tcl_SetChannelOption(interp, chan, optionName, newValue)
Tcl_Interp *interp; /* For error reporting - can be NULL. */
Tcl_Channel chan; /* Channel on which to set mode. */
| | | < | | 6189 6190 6191 6192 6193 6194 6195 6196 6197 6198 6199 6200 6201 6202 6203 6204 6205 6206 6207 6208 6209 6210 |
*---------------------------------------------------------------------------
*/
int
Tcl_SetChannelOption(interp, chan, optionName, newValue)
Tcl_Interp *interp; /* For error reporting - can be NULL. */
Tcl_Channel chan; /* Channel on which to set mode. */
CONST char *optionName; /* Which option to set? */
CONST char *newValue; /* New value for option. */
{
Channel *chanPtr = (Channel *) chan; /* The real IO channel. */
ChannelState *statePtr = chanPtr->state; /* state info for channel */
size_t len; /* Length of optionName string. */
int argc;
CONST char **argv;
/*
* If the channel is in the middle of a background copy, fail.
*/
if (statePtr->csPtr) {
if (interp) {
|
| ︙ | ︙ | |||
6189 6190 6191 6192 6193 6194 6195 6196 6197 6198 6199 6200 6201 6202 |
chanPtr = statePtr->topChanPtr;
len = strlen(optionName);
if ((len > 2) && (optionName[1] == 'b') &&
(strncmp(optionName, "-blocking", len) == 0)) {
if (Tcl_GetBoolean(interp, newValue, &newMode) == TCL_ERROR) {
return TCL_ERROR;
}
if (newMode) {
newMode = TCL_MODE_BLOCKING;
} else {
newMode = TCL_MODE_NONBLOCKING;
| > | 6232 6233 6234 6235 6236 6237 6238 6239 6240 6241 6242 6243 6244 6245 6246 |
chanPtr = statePtr->topChanPtr;
len = strlen(optionName);
if ((len > 2) && (optionName[1] == 'b') &&
(strncmp(optionName, "-blocking", len) == 0)) {
int newMode;
if (Tcl_GetBoolean(interp, newValue, &newMode) == TCL_ERROR) {
return TCL_ERROR;
}
if (newMode) {
newMode = TCL_MODE_BLOCKING;
} else {
newMode = TCL_MODE_NONBLOCKING;
|
| ︙ | ︙ | |||
6265 6266 6267 6268 6269 6270 6271 |
}
if (statePtr->flags & TCL_READABLE) {
statePtr->inEofChar = (int) argv[0][0];
}
} else if (argc != 2) {
if (interp) {
Tcl_AppendResult(interp,
| | | | | | 6309 6310 6311 6312 6313 6314 6315 6316 6317 6318 6319 6320 6321 6322 6323 6324 6325 6326 6327 6328 6329 6330 6331 6332 6333 6334 6335 6336 6337 6338 6339 6340 6341 6342 |
}
if (statePtr->flags & TCL_READABLE) {
statePtr->inEofChar = (int) argv[0][0];
}
} else if (argc != 2) {
if (interp) {
Tcl_AppendResult(interp,
"bad value for -eofchar: should be a list of zero,",
" one, or two elements", (char *) NULL);
}
ckfree((char *) argv);
return TCL_ERROR;
} else {
if (statePtr->flags & TCL_READABLE) {
statePtr->inEofChar = (int) argv[0][0];
}
if (statePtr->flags & TCL_WRITABLE) {
statePtr->outEofChar = (int) argv[1][0];
}
}
if (argv != NULL) {
ckfree((char *) argv);
}
return TCL_OK;
} else if ((len > 1) && (optionName[1] == 't') &&
(strncmp(optionName, "-translation", len) == 0)) {
CONST char *readMode, *writeMode;
if (Tcl_SplitList(interp, newValue, &argc, &argv) == TCL_ERROR) {
return TCL_ERROR;
}
if (argc == 1) {
readMode = (statePtr->flags & TCL_READABLE) ? argv[0] : NULL;
|
| ︙ | ︙ | |||
6307 6308 6309 6310 6311 6312 6313 6314 |
" element list", (char *) NULL);
}
ckfree((char *) argv);
return TCL_ERROR;
}
if (readMode) {
if (*readMode == '\0') {
| > | | | | | | | | | | 6351 6352 6353 6354 6355 6356 6357 6358 6359 6360 6361 6362 6363 6364 6365 6366 6367 6368 6369 6370 6371 6372 6373 6374 6375 6376 6377 6378 6379 6380 6381 6382 6383 6384 6385 6386 6387 6388 6389 6390 6391 6392 6393 6394 6395 6396 6397 6398 6399 6400 6401 |
" element list", (char *) NULL);
}
ckfree((char *) argv);
return TCL_ERROR;
}
if (readMode) {
TclEolTranslation translation;
if (*readMode == '\0') {
translation = statePtr->inputTranslation;
} else if (strcmp(readMode, "auto") == 0) {
translation = TCL_TRANSLATE_AUTO;
} else if (strcmp(readMode, "binary") == 0) {
translation = TCL_TRANSLATE_LF;
statePtr->inEofChar = 0;
Tcl_FreeEncoding(statePtr->encoding);
statePtr->encoding = NULL;
} else if (strcmp(readMode, "lf") == 0) {
translation = TCL_TRANSLATE_LF;
} else if (strcmp(readMode, "cr") == 0) {
translation = TCL_TRANSLATE_CR;
} else if (strcmp(readMode, "crlf") == 0) {
translation = TCL_TRANSLATE_CRLF;
} else if (strcmp(readMode, "platform") == 0) {
translation = TCL_PLATFORM_TRANSLATION;
} else {
if (interp) {
Tcl_AppendResult(interp,
"bad value for -translation: ",
"must be one of auto, binary, cr, lf, crlf,",
" or platform", (char *) NULL);
}
ckfree((char *) argv);
return TCL_ERROR;
}
/*
* Reset the EOL flags since we need to look at any buffered
* data to see if the new translation mode allows us to
* complete the line.
*/
if (translation != statePtr->inputTranslation) {
statePtr->inputTranslation = translation;
statePtr->flags &= ~(INPUT_SAW_CR);
statePtr->flags &= ~(CHANNEL_NEED_MORE_DATA);
UpdateInterest(chanPtr);
}
}
if (writeMode) {
if (*writeMode == '\0') {
|
| ︙ | ︙ | |||
7125 7126 7127 7128 7129 7130 7131 |
Channel *chanPtr; /* The channel to create
* the handler for. */
ChannelState *statePtr; /* state info for channel */
Tcl_Channel chan; /* The opaque type for the channel. */
char *chanName;
int modeIndex; /* Index of mode argument. */
int mask;
| | | 7170 7171 7172 7173 7174 7175 7176 7177 7178 7179 7180 7181 7182 7183 7184 |
Channel *chanPtr; /* The channel to create
* the handler for. */
ChannelState *statePtr; /* state info for channel */
Tcl_Channel chan; /* The opaque type for the channel. */
char *chanName;
int modeIndex; /* Index of mode argument. */
int mask;
static CONST char *modeOptions[] = {"readable", "writable", NULL};
static int maskArray[] = {TCL_READABLE, TCL_WRITABLE};
if ((objc != 3) && (objc != 4)) {
Tcl_WrongNumArgs(interp, 1, objv, "channelId event ?script?");
return TCL_ERROR;
}
if (Tcl_GetIndexFromObj(interp, objv[2], modeOptions, "event name", 0,
|
| ︙ | ︙ | |||
7258 7259 7260 7261 7262 7263 7264 |
!= TCL_OK) {
return TCL_ERROR;
}
}
if (inPtr != outPtr) {
if (nonBlocking != (writeFlags & CHANNEL_NONBLOCKING)) {
if (SetBlockMode(NULL, outPtr,
| | | 7303 7304 7305 7306 7307 7308 7309 7310 7311 7312 7313 7314 7315 7316 7317 |
!= TCL_OK) {
return TCL_ERROR;
}
}
if (inPtr != outPtr) {
if (nonBlocking != (writeFlags & CHANNEL_NONBLOCKING)) {
if (SetBlockMode(NULL, outPtr,
nonBlocking ? TCL_MODE_NONBLOCKING : TCL_MODE_BLOCKING)
!= TCL_OK) {
if (nonBlocking != (readFlags & CHANNEL_NONBLOCKING)) {
SetBlockMode(NULL, inPtr,
(readFlags & CHANNEL_NONBLOCKING)
? TCL_MODE_NONBLOCKING : TCL_MODE_BLOCKING);
return TCL_ERROR;
}
|
| ︙ | ︙ | |||
7340 7341 7342 7343 7344 7345 7346 7347 7348 7349 7350 7351 7352 7353 |
int size;
int total;
int sizeb;
Tcl_Obj* bufObj = NULL;
char* buffer;
int inBinary, outBinary, sameEncoding; /* Encoding control */
inChan = (Tcl_Channel) csPtr->readPtr;
outChan = (Tcl_Channel) csPtr->writePtr;
inStatePtr = csPtr->readPtr->state;
outStatePtr = csPtr->writePtr->state;
interp = csPtr->interp;
cmdPtr = csPtr->cmdPtr;
| > | 7385 7386 7387 7388 7389 7390 7391 7392 7393 7394 7395 7396 7397 7398 7399 |
int size;
int total;
int sizeb;
Tcl_Obj* bufObj = NULL;
char* buffer;
int inBinary, outBinary, sameEncoding; /* Encoding control */
int underflow; /* input underflow */
inChan = (Tcl_Channel) csPtr->readPtr;
outChan = (Tcl_Channel) csPtr->writePtr;
inStatePtr = csPtr->readPtr->state;
outStatePtr = csPtr->writePtr->state;
interp = csPtr->interp;
cmdPtr = csPtr->cmdPtr;
|
| ︙ | ︙ | |||
7386 7387 7388 7389 7390 7391 7392 |
}
/*
* Read up to bufSize bytes.
*/
if ((csPtr->toRead == -1) || (csPtr->toRead > csPtr->bufSize)) {
| | | | | > | | > | > | | | | | > | 7432 7433 7434 7435 7436 7437 7438 7439 7440 7441 7442 7443 7444 7445 7446 7447 7448 7449 7450 7451 7452 7453 7454 7455 7456 7457 7458 7459 7460 7461 7462 7463 7464 7465 7466 7467 7468 7469 7470 7471 7472 7473 7474 7475 7476 7477 7478 7479 7480 7481 7482 7483 7484 7485 7486 7487 7488 7489 |
}
/*
* Read up to bufSize bytes.
*/
if ((csPtr->toRead == -1) || (csPtr->toRead > csPtr->bufSize)) {
sizeb = csPtr->bufSize;
} else {
sizeb = csPtr->toRead;
}
if (inBinary || sameEncoding) {
size = DoRead(inStatePtr->topChanPtr, csPtr->buffer, sizeb);
} else {
size = DoReadChars(inStatePtr->topChanPtr, bufObj, sizeb, 0 /* No append */);
}
underflow = (size >= 0) && (size < sizeb); /* input underflow */
if (size < 0) {
readError:
errObj = Tcl_NewObj();
Tcl_AppendStringsToObj(errObj, "error reading \"",
Tcl_GetChannelName(inChan), "\": ",
Tcl_PosixError(interp), (char *) NULL);
break;
} else if (underflow) {
/*
* We had an underflow on the read side. If we are at EOF,
* then the copying is done, otherwise set up a channel
* handler to detect when the channel becomes readable again.
*/
if ((size == 0) && Tcl_Eof(inChan)) {
break;
}
if (! Tcl_Eof(inChan) && !(mask & TCL_READABLE)) {
if (mask & TCL_WRITABLE) {
Tcl_DeleteChannelHandler(outChan, CopyEventProc,
(ClientData) csPtr);
}
Tcl_CreateChannelHandler(inChan, TCL_READABLE,
CopyEventProc, (ClientData) csPtr);
}
if (size == 0) {
if (bufObj != (Tcl_Obj*) NULL) {
Tcl_DecrRefCount (bufObj);
bufObj = (Tcl_Obj*) NULL;
}
return TCL_OK;
}
}
/*
* Now write the buffer out.
*/
if (inBinary || sameEncoding) {
|
| ︙ | ︙ | |||
7471 7472 7473 7474 7475 7476 7477 7478 7479 7480 7481 7482 |
*/
if (csPtr->toRead != -1) {
csPtr->toRead -= size;
}
csPtr->total += size;
/*
* Check to see if the write is happening in the background. If so,
* stop copying and wait for the channel to become writable again.
*/
| > > > > > > > > > > | | 7521 7522 7523 7524 7525 7526 7527 7528 7529 7530 7531 7532 7533 7534 7535 7536 7537 7538 7539 7540 7541 7542 7543 7544 7545 7546 7547 7548 7549 7550 |
*/
if (csPtr->toRead != -1) {
csPtr->toRead -= size;
}
csPtr->total += size;
/*
* Break loop if EOF && (size>0)
*/
if (Tcl_Eof(inChan)) {
break;
}
/*
* Check to see if the write is happening in the background. If so,
* stop copying and wait for the channel to become writable again.
* After input underflow we already installed a readable handler
* therefore we don't need a writable handler.
*/
if ( ! underflow && (outStatePtr->flags & BG_FLUSH_SCHEDULED) ) {
if (!(mask & TCL_WRITABLE)) {
if (mask & TCL_READABLE) {
Tcl_DeleteChannelHandler(inChan, CopyEventProc,
(ClientData) csPtr);
}
Tcl_CreateChannelHandler(outChan, TCL_WRITABLE,
CopyEventProc, (ClientData) csPtr);
|
| ︙ | ︙ | |||
7994 7995 7996 7997 7998 7999 8000 |
*
*----------------------------------------------------------------------
*/
static int
DoWrite(chanPtr, src, srcLen)
Channel *chanPtr; /* The channel to buffer output for. */
| | | | 8054 8055 8056 8057 8058 8059 8060 8061 8062 8063 8064 8065 8066 8067 8068 8069 8070 8071 8072 8073 8074 8075 |
*
*----------------------------------------------------------------------
*/
static int
DoWrite(chanPtr, src, srcLen)
Channel *chanPtr; /* The channel to buffer output for. */
CONST char *src; /* Data to write. */
int srcLen; /* Number of bytes to write. */
{
ChannelState *statePtr = chanPtr->state; /* state info for channel */
ChannelBuffer *outBufPtr; /* Current output buffer. */
int foundNewline; /* Did we find a newline in output? */
char *dPtr;
CONST char *sPtr; /* Search variables for newline. */
int crsent; /* In CRLF eol translation mode,
* remember the fact that a CR was
* output to the channel without
* its following NL. */
int i; /* Loop index for newline search. */
int destCopied; /* How many bytes were used in this
* destination buffer to hold the
|
| ︙ | ︙ | |||
8353 8354 8355 8356 8357 8358 8359 |
*
*----------------------------------------------------------------------
*/
int
Tcl_GetChannelNamesEx(interp, pattern)
Tcl_Interp *interp; /* Interp for error reporting. */
| | | | 8413 8414 8415 8416 8417 8418 8419 8420 8421 8422 8423 8424 8425 8426 8427 8428 8429 8430 8431 |
*
*----------------------------------------------------------------------
*/
int
Tcl_GetChannelNamesEx(interp, pattern)
Tcl_Interp *interp; /* Interp for error reporting. */
CONST char *pattern; /* pattern to filter on. */
{
ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
ChannelState *statePtr;
CONST char *name; /* name for channel */
Tcl_Obj *resultPtr; /* pointer to result object */
Tcl_HashTable *hTblPtr; /* Hash table of channels. */
Tcl_HashEntry *hPtr; /* Search variable. */
Tcl_HashSearch hSearch; /* Search variable. */
if (interp == (Tcl_Interp *) NULL) {
return TCL_OK;
|
| ︙ | ︙ | |||
8501 8502 8503 8504 8505 8506 8507 |
int
Tcl_IsChannelExisting(chanName)
CONST char* chanName; /* The name of the channel to look for. */
{
ChannelState *statePtr;
ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
| | | 8561 8562 8563 8564 8565 8566 8567 8568 8569 8570 8571 8572 8573 8574 8575 |
int
Tcl_IsChannelExisting(chanName)
CONST char* chanName; /* The name of the channel to look for. */
{
ChannelState *statePtr;
ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
CONST char *name;
int chanNameLen;
chanNameLen = strlen(chanName);
for (statePtr = tsdPtr->firstCSPtr;
statePtr != NULL;
statePtr = statePtr->nextCSPtr) {
if (statePtr->topChanPtr == (Channel *) tsdPtr->stdinChannel) {
|
| ︙ | ︙ | |||
8543 8544 8545 8546 8547 8548 8549 | * * Side effects: * None. * *---------------------------------------------------------------------- */ | | | 8603 8604 8605 8606 8607 8608 8609 8610 8611 8612 8613 8614 8615 8616 8617 |
*
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
CONST char *
Tcl_ChannelName(chanTypePtr)
Tcl_ChannelType *chanTypePtr; /* Pointer to channel type. */
{
return (chanTypePtr->typeName);
}
/*
|
| ︙ | ︙ |
Changes to generic/tclIO.h.
1 2 3 4 5 6 7 8 9 10 11 12 | /* * tclIO.h -- * * This file provides the generic portions (those that are the same on * all platforms and for all channel types) of Tcl's IO facilities. * * Copyright (c) 1998-2000 Ajuba Solutions * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /* * tclIO.h -- * * This file provides the generic portions (those that are the same on * all platforms and for all channel types) of Tcl's IO facilities. * * Copyright (c) 1998-2000 Ajuba Solutions * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclIO.h,v 1.4.2.1 2002/02/05 02:21:59 wolfsuit Exp $ */ /* * Make sure that both EAGAIN and EWOULDBLOCK are defined. This does not * compile on systems where neither is defined. We want both defined so * that we can test safely for both. In the code we still have to test for * both because there may be systems on which both are defined and have |
| ︙ | ︙ | |||
154 155 156 157 158 159 160 |
* One of these structures is allocated for each open channel. It contains data
* specific to the channel but which belongs to the generic part of the Tcl
* channel mechanism, and it points at an instance specific (and type
* specific) * instance data, and at a channel type structure.
*/
typedef struct ChannelState {
| | | 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 |
* One of these structures is allocated for each open channel. It contains data
* specific to the channel but which belongs to the generic part of the Tcl
* channel mechanism, and it points at an instance specific (and type
* specific) * instance data, and at a channel type structure.
*/
typedef struct ChannelState {
CONST char *channelName; /* The name of the channel instance in Tcl
* commands. Storage is owned by the generic IO
* code, is dynamically allocated. */
int flags; /* ORed combination of the flags defined
* below. */
Tcl_Encoding encoding; /* Encoding to apply when reading or writing
* data on this channel. NULL means no
* encoding is applied to data. */
|
| ︙ | ︙ | |||
178 179 180 181 182 183 184 |
/* Current encoding state, used when converting
* UTF-8 to output data bytes. */
int outputEncodingFlags; /* Encoding flags to pass to conversion
* routine when converting UTF-8 to output
* data bytes. May be TCL_ENCODING_START
* before converting first byte and
* TCL_ENCODING_END when EOF is seen. */
| | | | 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 |
/* Current encoding state, used when converting
* UTF-8 to output data bytes. */
int outputEncodingFlags; /* Encoding flags to pass to conversion
* routine when converting UTF-8 to output
* data bytes. May be TCL_ENCODING_START
* before converting first byte and
* TCL_ENCODING_END when EOF is seen. */
TclEolTranslation inputTranslation;
/* What translation to apply for end of line
* sequences on input? */
TclEolTranslation outputTranslation;
/* What translation to use for generating
* end of line sequences in output? */
int inEofChar; /* If nonzero, use this as a signal of EOF
* on input. */
int outEofChar; /* If nonzero, append this to the channel
* when it is closed if it is open for
* writing. */
|
| ︙ | ︙ |
Changes to generic/tclIOCmd.c.
1 2 3 4 5 6 7 8 9 10 | /* * tclIOCmd.c -- * * Contains the definitions of most of the Tcl commands relating to IO. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | /* * tclIOCmd.c -- * * Contains the definitions of most of the Tcl commands relating to IO. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclIOCmd.c,v 1.10.4.1 2002/02/05 02:21:59 wolfsuit Exp $ */ #include "tclInt.h" #include "tclPort.h" /* * Callback structure for accept callback in a TCP server. |
| ︙ | ︙ | |||
241 242 243 244 245 246 247 |
}
if ((mode & TCL_READABLE) == 0) {
Tcl_AppendResult(interp, "channel \"", name,
"\" wasn't opened for reading", (char *) NULL);
return TCL_ERROR;
}
| < < < < < | < < < < | 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 |
}
if ((mode & TCL_READABLE) == 0) {
Tcl_AppendResult(interp, "channel \"", name,
"\" wasn't opened for reading", (char *) NULL);
return TCL_ERROR;
}
linePtr = Tcl_NewObj();
lineLen = Tcl_GetsObj(chan, linePtr);
if (lineLen < 0) {
if (!Tcl_Eof(chan) && !Tcl_InputBlocked(chan)) {
if (objc == 3) {
Tcl_DecrRefCount(linePtr);
}
|
| ︙ | ︙ | |||
274 275 276 277 278 279 280 281 282 283 284 285 286 287 |
TCL_LEAVE_ERR_MSG) == NULL) {
Tcl_DecrRefCount(linePtr);
return TCL_ERROR;
}
resultPtr = Tcl_GetObjResult(interp);
Tcl_SetIntObj(resultPtr, lineLen);
return TCL_OK;
}
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
| > > | 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 |
TCL_LEAVE_ERR_MSG) == NULL) {
Tcl_DecrRefCount(linePtr);
return TCL_ERROR;
}
resultPtr = Tcl_GetObjResult(interp);
Tcl_SetIntObj(resultPtr, lineLen);
return TCL_OK;
} else {
Tcl_SetObjResult(interp, linePtr);
}
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
|
| ︙ | ︙ | |||
425 426 427 428 429 430 431 |
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
Tcl_Channel chan; /* The channel to tell on. */
int offset, mode; /* Where to seek? */
int result; /* Of calling Tcl_Seek. */
char *chanName;
int optionIndex;
| > | > | 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 |
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
Tcl_Channel chan; /* The channel to tell on. */
int offset, mode; /* Where to seek? */
int result; /* Of calling Tcl_Seek. */
char *chanName;
int optionIndex;
static CONST char *originOptions[] = {
"start", "current", "end", (char *) NULL
};
static int modeArray[] = {SEEK_SET, SEEK_CUR, SEEK_END};
if ((objc != 3) && (objc != 4)) {
Tcl_WrongNumArgs(interp, 1, objv, "channelId offset ?origin?");
return TCL_ERROR;
}
chanName = Tcl_GetString(objv[1]);
|
| ︙ | ︙ | |||
727 728 729 730 731 732 733 |
* This procedure generates an argv array for the string arguments. It
* starts out with stack-allocated space but uses dynamically-allocated
* storage if needed.
*/
#define NUM_ARGS 20
Tcl_Obj *resultPtr;
| | | | | 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 |
* This procedure generates an argv array for the string arguments. It
* starts out with stack-allocated space but uses dynamically-allocated
* storage if needed.
*/
#define NUM_ARGS 20
Tcl_Obj *resultPtr;
CONST char **argv;
char *string;
Tcl_Channel chan;
CONST char *argStorage[NUM_ARGS];
int argc, background, i, index, keepNewline, result, skip, length;
static CONST char *options[] = {
"-keepnewline", "--", NULL
};
enum options {
EXEC_KEEPNEWLINE, EXEC_LAST
};
/*
|
| ︙ | ︙ | |||
785 786 787 788 789 790 791 |
* enough to hold the argc arguments plus 1 extra for the zero
* end-of-argv word.
*/
argv = argStorage;
argc = objc - skip;
if ((argc + 1) > sizeof(argv) / sizeof(argv[0])) {
| | | 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 |
* enough to hold the argc arguments plus 1 extra for the zero
* end-of-argv word.
*/
argv = argStorage;
argc = objc - skip;
if ((argc + 1) > sizeof(argv) / sizeof(argv[0])) {
argv = (CONST char **) ckalloc((unsigned)(argc + 1) * sizeof(char *));
}
/*
* Copy the string conversions of each (post option) object into the
* argument vector.
*/
|
| ︙ | ︙ | |||
977 978 979 980 981 982 983 | #ifdef MAC_TCL Tcl_AppendResult(interp, "command pipelines not supported on Macintosh OS", (char *)NULL); return TCL_ERROR; #else int mode, seekFlag, cmdObjc; | | | 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 |
#ifdef MAC_TCL
Tcl_AppendResult(interp,
"command pipelines not supported on Macintosh OS",
(char *)NULL);
return TCL_ERROR;
#else
int mode, seekFlag, cmdObjc;
CONST char **cmdArgv;
if (Tcl_SplitList(interp, what+1, &cmdObjc, &cmdArgv) != TCL_OK) {
return TCL_ERROR;
}
mode = TclGetOpenMode(interp, modeString, &seekFlag);
if (mode == -1) {
|
| ︙ | ︙ | |||
1301 1302 1303 1304 1305 1306 1307 |
int
Tcl_SocketObjCmd(notUsed, interp, objc, objv)
ClientData notUsed; /* Not used. */
Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
| | | 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 |
int
Tcl_SocketObjCmd(notUsed, interp, objc, objv)
ClientData notUsed; /* Not used. */
Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
static CONST char *socketOptions[] = {
"-async", "-myaddr", "-myport","-server", (char *) NULL
};
enum socketOptions {
SKT_ASYNC, SKT_MYADDR, SKT_MYPORT, SKT_SERVER
};
int optionIndex, a, server, port;
char *arg, *copyScript, *host, *script;
|
| ︙ | ︙ | |||
1496 1497 1498 1499 1500 1501 1502 |
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
Tcl_Channel inChan, outChan;
char *arg;
int mode, i;
int toRead, index;
Tcl_Obj *cmdPtr;
| | | 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 |
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
Tcl_Channel inChan, outChan;
char *arg;
int mode, i;
int toRead, index;
Tcl_Obj *cmdPtr;
static CONST char* switches[] = { "-size", "-command", NULL };
enum { FcopySize, FcopyCommand };
if ((objc < 3) || (objc > 7) || (objc == 4) || (objc == 6)) {
Tcl_WrongNumArgs(interp, 1, objv,
"input output ?-size size? ?-command callback?");
return TCL_ERROR;
}
|
| ︙ | ︙ |
Changes to generic/tclIOGT.c.
1 2 3 4 5 6 7 8 9 10 11 12 | /* * tclIOGT.c -- * * Implements a generic transformation exposing the underlying API * at the script level. Contributed by Andreas Kupries. * * Copyright (c) 2000 Ajuba Solutions * Copyright (c) 1999-2000 Andreas Kupries (a.kupries@westend.com) * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | | | | | 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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | /* * tclIOGT.c -- * * Implements a generic transformation exposing the underlying API * at the script level. Contributed by Andreas Kupries. * * Copyright (c) 2000 Ajuba Solutions * Copyright (c) 1999-2000 Andreas Kupries (a.kupries@westend.com) * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * CVS: $Id: tclIOGT.c,v 1.3.14.1 2002/02/05 02:21:59 wolfsuit Exp $ */ #include "tclInt.h" #include "tclPort.h" #include "tclIO.h" /* * Forward declarations of internal procedures. * First the driver procedures of the transformation. */ static int TransformBlockModeProc _ANSI_ARGS_ (( ClientData instanceData, int mode)); static int TransformCloseProc _ANSI_ARGS_ (( ClientData instanceData, Tcl_Interp* interp)); static int TransformInputProc _ANSI_ARGS_ (( ClientData instanceData, char* buf, int toRead, int* errorCodePtr)); static int TransformOutputProc _ANSI_ARGS_ (( ClientData instanceData, CONST char *buf, int toWrite, int* errorCodePtr)); static int TransformSeekProc _ANSI_ARGS_ (( ClientData instanceData, long offset, int mode, int* errorCodePtr)); static int TransformSetOptionProc _ANSI_ARGS_(( ClientData instanceData, Tcl_Interp *interp, CONST char *optionName, CONST char *value)); static int TransformGetOptionProc _ANSI_ARGS_(( ClientData instanceData, Tcl_Interp *interp, CONST char *optionName, Tcl_DString *dsPtr)); static void TransformWatchProc _ANSI_ARGS_ (( ClientData instanceData, int mask)); static int TransformGetFileHandleProc _ANSI_ARGS_ (( ClientData instanceData, int direction, ClientData* handlePtr)); static int TransformNotifyProc _ANSI_ARGS_ (( ClientData instanceData, int mask)); |
| ︙ | ︙ | |||
792 793 794 795 796 797 798 |
*
*------------------------------------------------------*
*/
static int
TransformOutputProc (instanceData, buf, toWrite, errorCodePtr)
ClientData instanceData;
| | | 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 |
*
*------------------------------------------------------*
*/
static int
TransformOutputProc (instanceData, buf, toWrite, errorCodePtr)
ClientData instanceData;
CONST char* buf;
int toWrite;
int* errorCodePtr;
{
TransformChannelData* dataPtr = (TransformChannelData*) instanceData;
int res;
/* should assert (dataPtr->mode & TCL_WRITABLE) */
|
| ︙ | ︙ | |||
911 912 913 914 915 916 917 |
*------------------------------------------------------*
*/
static int
TransformSetOptionProc (instanceData, interp, optionName, value)
ClientData instanceData;
Tcl_Interp *interp;
| | | | 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 |
*------------------------------------------------------*
*/
static int
TransformSetOptionProc (instanceData, interp, optionName, value)
ClientData instanceData;
Tcl_Interp *interp;
CONST char *optionName;
CONST char *value;
{
TransformChannelData* dataPtr = (TransformChannelData*) instanceData;
Tcl_Channel downChan = Tcl_GetStackedChannel(dataPtr->self);
Tcl_DriverSetOptionProc *setOptionProc;
setOptionProc = Tcl_ChannelSetOptionProc(Tcl_GetChannelType(downChan));
if (setOptionProc != NULL) {
|
| ︙ | ︙ | |||
949 950 951 952 953 954 955 |
*------------------------------------------------------*
*/
static int
TransformGetOptionProc (instanceData, interp, optionName, dsPtr)
ClientData instanceData;
Tcl_Interp* interp;
| | | | 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 |
*------------------------------------------------------*
*/
static int
TransformGetOptionProc (instanceData, interp, optionName, dsPtr)
ClientData instanceData;
Tcl_Interp* interp;
CONST char* optionName;
Tcl_DString* dsPtr;
{
TransformChannelData* dataPtr = (TransformChannelData*) instanceData;
Tcl_Channel downChan = Tcl_GetStackedChannel(dataPtr->self);
Tcl_DriverGetOptionProc *getOptionProc;
getOptionProc = Tcl_ChannelGetOptionProc(Tcl_GetChannelType(downChan));
if (getOptionProc != NULL) {
return (*getOptionProc)(Tcl_GetChannelInstanceData(downChan),
interp, optionName, dsPtr);
} else if (optionName == (CONST char*) NULL) {
/*
* Request is query for all options, this is ok.
*/
return TCL_OK;
}
/*
* Request for a specific option has to fail, we don't have any.
|
| ︙ | ︙ |
Changes to generic/tclIOSock.c.
1 2 3 4 5 6 7 8 9 10 | /* * tclIOSock.c -- * * Common routines used by all socket based channel types. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | /* * tclIOSock.c -- * * Common routines used by all socket based channel types. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclIOSock.c,v 1.5.18.1 2002/02/05 02:22:00 wolfsuit Exp $ */ #include "tclInt.h" #include "tclPort.h" /* *--------------------------------------------------------------------------- |
| ︙ | ︙ | |||
39 40 41 42 43 44 45 |
Tcl_Interp *interp;
char *string; /* Integer or service name */
char *proto; /* "tcp" or "udp", typically */
int *portPtr; /* Return port number */
{
struct servent *sp; /* Protocol info for named services */
Tcl_DString ds;
| | | 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
Tcl_Interp *interp;
char *string; /* Integer or service name */
char *proto; /* "tcp" or "udp", typically */
int *portPtr; /* Return port number */
{
struct servent *sp; /* Protocol info for named services */
Tcl_DString ds;
CONST char *native;
if (Tcl_GetInt(NULL, string, portPtr) != TCL_OK) {
/*
* Don't bother translating 'proto' to native.
*/
native = Tcl_UtfToExternalDString(NULL, string, -1, &ds);
|
| ︙ | ︙ |
Changes to generic/tclIOUtil.c.
| ︙ | ︙ | |||
13 14 15 16 17 18 19 | * * Copyright (c) 1991-1994 The Regents of the University of California. * Copyright (c) 1994-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | > > > | 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | * * Copyright (c) 1991-1994 The Regents of the University of California. * Copyright (c) 1994-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclIOUtil.c,v 1.22.2.1 2002/02/05 02:22:00 wolfsuit Exp $ */ #include "tclInt.h" #include "tclPort.h" #ifdef MAC_TCL #include "tclMacInt.h" #endif /* * Prototypes for procedures defined later in this file. The last * of these could perhaps be exported in the future, if extensions * require it. */ |
| ︙ | ︙ | |||
63 64 65 66 67 68 69 | /* * These form part of the native filesystem support. They are needed * here because we have a few native filesystem functions (which are * the same for mac/win/unix) in this file. There is no need to place * them in tclInt.h, because they are not (and should not be) used * anywhere else. */ | | | 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | /* * These form part of the native filesystem support. They are needed * here because we have a few native filesystem functions (which are * the same for mac/win/unix) in this file. There is no need to place * them in tclInt.h, because they are not (and should not be) used * anywhere else. */ extern CONST char * tclpFileAttrStrings[]; extern CONST TclFileAttrProcs tclpFileAttrProcs[]; /* * The following functions are obsolete string based APIs, and should * be removed in a future release (Tcl 9 would be a good time). */ |
| ︙ | ︙ | |||
104 105 106 107 108 109 110 |
}
/* Obsolete */
Tcl_Channel
Tcl_OpenFileChannel(interp, path, modeString, permissions)
Tcl_Interp *interp; /* Interpreter for error reporting;
* can be NULL. */
| | | | 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |
}
/* Obsolete */
Tcl_Channel
Tcl_OpenFileChannel(interp, path, modeString, permissions)
Tcl_Interp *interp; /* Interpreter for error reporting;
* can be NULL. */
CONST char *path; /* Name of file to open. */
CONST char *modeString; /* A list of POSIX open modes or
* a string such as "rw". */
int permissions; /* If the open involves creating a
* file, with what modes to create
* it? */
{
Tcl_Channel ret;
Tcl_Obj *pathPtr = Tcl_NewStringObj(path,-1);
|
| ︙ | ︙ | |||
134 135 136 137 138 139 140 |
Tcl_IncrRefCount(pathPtr);
ret = Tcl_FSChdir(pathPtr);
Tcl_DecrRefCount(pathPtr);
return ret;
}
/* Obsolete */
| | | | 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 |
Tcl_IncrRefCount(pathPtr);
ret = Tcl_FSChdir(pathPtr);
Tcl_DecrRefCount(pathPtr);
return ret;
}
/* Obsolete */
CONST char *
Tcl_GetCwd(interp, cwdPtr)
Tcl_Interp *interp;
Tcl_DString *cwdPtr;
{
Tcl_Obj *cwd;
cwd = Tcl_FSGetCwd(interp);
if (cwd == NULL) {
return NULL;
} else {
Tcl_DStringInit(cwdPtr);
Tcl_DStringAppend(cwdPtr, Tcl_GetString(cwd), -1);
Tcl_DecrRefCount(cwd);
return Tcl_DStringValue(cwdPtr);
}
}
/* Obsolete */
int
Tcl_EvalFile(interp, fileName)
Tcl_Interp *interp; /* Interpreter in which to process file. */
CONST char *fileName; /* Name of file to process. Tilde-substitution
* will be performed on this name. */
{
int ret;
Tcl_Obj *pathPtr = Tcl_NewStringObj(fileName,-1);
Tcl_IncrRefCount(pathPtr);
ret = Tcl_FSEvalFile(interp, pathPtr);
Tcl_DecrRefCount(pathPtr);
|
| ︙ | ︙ | |||
509 510 511 512 513 514 515 | * at the head of the list: i.e. it must be the last registered. * * Results: * Normally TCL_OK; TCL_ERROR if memory for a new node in the list * could not be allocated. * * Side effects: | | | 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 |
* at the head of the list: i.e. it must be the last registered.
*
* Results:
* Normally TCL_OK; TCL_ERROR if memory for a new node in the list
* could not be allocated.
*
* Side effects:
* Memory allocated and modifies the link list for filesystems.
*
*----------------------------------------------------------------------
*/
int
Tcl_FSRegister(clientData, fsPtr)
ClientData clientData; /* Client specific data for this fs */
|
| ︙ | ︙ | |||
970 971 972 973 974 975 976 |
*---------------------------------------------------------------------------
*/
int
TclGetOpenMode(interp, string, seekFlagPtr)
Tcl_Interp *interp; /* Interpreter to use for error
* reporting - may be NULL. */
| | | | 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 |
*---------------------------------------------------------------------------
*/
int
TclGetOpenMode(interp, string, seekFlagPtr)
Tcl_Interp *interp; /* Interpreter to use for error
* reporting - may be NULL. */
CONST char *string; /* Mode string, e.g. "r+" or
* "RDONLY CREAT". */
int *seekFlagPtr; /* Set this to 1 if the caller
* should seek to EOF during the
* opening of the file. */
{
int mode, modeArgc, c, i, gotRW;
CONST char **modeArgv, *flag;
#define RW_MODES (O_RDONLY|O_WRONLY|O_RDWR)
/*
* Check for the simpler fopen-like access modes (e.g. "r"). They
* are distinguished from the POSIX access modes by the presence
* of a lower-case first letter.
*/
|
| ︙ | ︙ | |||
1130 1131 1132 1133 1134 1135 1136 | * Results: * A standard Tcl result, which is either the result of executing * the file or an error indicating why the file couldn't be read. * * Side effects: * Depends on the commands in the file. During the evaluation * of the contents of the file, iPtr->scriptFile is made to | | | | | | | | | | | | | | 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 |
* Results:
* A standard Tcl result, which is either the result of executing
* the file or an error indicating why the file couldn't be read.
*
* Side effects:
* Depends on the commands in the file. During the evaluation
* of the contents of the file, iPtr->scriptFile is made to
* point to pathPtr (the old value is cached and replaced when
* this function returns).
*
*----------------------------------------------------------------------
*/
int
Tcl_FSEvalFile(interp, pathPtr)
Tcl_Interp *interp; /* Interpreter in which to process file. */
Tcl_Obj *pathPtr; /* Path of file to process. Tilde-substitution
* will be performed on this name. */
{
int result, length;
struct stat statBuf;
Tcl_Obj *oldScriptFile;
Interp *iPtr;
char *string;
Tcl_Channel chan;
Tcl_Obj *objPtr;
if (Tcl_FSGetTranslatedPath(interp, pathPtr) == NULL) {
return TCL_ERROR;
}
result = TCL_ERROR;
objPtr = Tcl_NewObj();
if (Tcl_FSStat(pathPtr, &statBuf) == -1) {
Tcl_SetErrno(errno);
Tcl_AppendResult(interp, "couldn't read file \"",
Tcl_GetString(pathPtr),
"\": ", Tcl_PosixError(interp), (char *) NULL);
goto end;
}
chan = Tcl_FSOpenFileChannel(interp, pathPtr, "r", 0644);
if (chan == (Tcl_Channel) NULL) {
Tcl_ResetResult(interp);
Tcl_AppendResult(interp, "couldn't read file \"",
Tcl_GetString(pathPtr),
"\": ", Tcl_PosixError(interp), (char *) NULL);
goto end;
}
/*
* The eofchar is \32 (^Z). This is the usual on Windows, but we
* effect this cross-platform to allow for scripted documents.
* [Bug: 2040]
*/
Tcl_SetChannelOption(interp, chan, "-eofchar", "\32");
if (Tcl_ReadChars(chan, objPtr, -1, 0) < 0) {
Tcl_Close(interp, chan);
Tcl_AppendResult(interp, "couldn't read file \"",
Tcl_GetString(pathPtr),
"\": ", Tcl_PosixError(interp), (char *) NULL);
goto end;
}
if (Tcl_Close(interp, chan) != TCL_OK) {
goto end;
}
iPtr = (Interp *) interp;
oldScriptFile = iPtr->scriptFile;
iPtr->scriptFile = pathPtr;
Tcl_IncrRefCount(iPtr->scriptFile);
string = Tcl_GetStringFromObj(objPtr, &length);
result = Tcl_EvalEx(interp, string, length, 0);
/*
* Now we have to be careful; the script may have changed the
* iPtr->scriptFile value, so we must reset it without
* assuming it still points to 'pathPtr'.
*/
if (iPtr->scriptFile != NULL) {
Tcl_DecrRefCount(iPtr->scriptFile);
}
iPtr->scriptFile = oldScriptFile;
if (result == TCL_RETURN) {
result = TclUpdateReturnInfo(iPtr);
} else if (result == TCL_ERROR) {
char msg[200 + TCL_INTEGER_SPACE];
/*
* Record information telling where the error occurred.
*/
sprintf(msg, "\n (file \"%.150s\" line %d)", Tcl_GetString(pathPtr),
interp->errorLine);
Tcl_AddErrorInfo(interp, msg);
}
end:
Tcl_DecrRefCount(objPtr);
return result;
|
| ︙ | ︙ | |||
1292 1293 1294 1295 1296 1297 1298 | * * Side effects: * The global variable $errorCode is reset. * *---------------------------------------------------------------------- */ | | | | 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 |
*
* Side effects:
* The global variable $errorCode is reset.
*
*----------------------------------------------------------------------
*/
CONST char *
Tcl_PosixError(interp)
Tcl_Interp *interp; /* Interpreter whose $errorCode variable
* is to be changed. */
{
CONST char *id, *msg;
msg = Tcl_ErrnoMsg(errno);
id = Tcl_ErrnoId();
Tcl_SetErrorCode(interp, "POSIX", id, msg, (char *) NULL);
return msg;
}
|
| ︙ | ︙ | |||
1340 1341 1342 1343 1344 1345 1346 |
char *path;
Tcl_Obj *transPtr = Tcl_FSGetTranslatedPath(NULL, pathPtr);
if (transPtr == NULL) {
path = NULL;
} else {
path = Tcl_GetString(transPtr);
}
| < < | 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 |
char *path;
Tcl_Obj *transPtr = Tcl_FSGetTranslatedPath(NULL, pathPtr);
if (transPtr == NULL) {
path = NULL;
} else {
path = Tcl_GetString(transPtr);
}
/*
* Call each of the "stat" function in succession. A non-return
* value of -1 indicates the particular function has succeeded.
*/
Tcl_MutexLock(&obsoleteFsHookMutex);
statProcPtr = statProcList;
while ((retVal == -1) && (statProcPtr != NULL)) {
retVal = (*statProcPtr->proc)(path, buf);
statProcPtr = statProcPtr->nextPtr;
}
Tcl_MutexUnlock(&obsoleteFsHookMutex);
|
| ︙ | ︙ | |||
1445 1446 1447 1448 1449 1450 1451 |
char *path;
Tcl_Obj *transPtr = Tcl_FSGetTranslatedPath(NULL, pathPtr);
if (transPtr == NULL) {
path = NULL;
} else {
path = Tcl_GetString(transPtr);
}
| < < | 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 |
char *path;
Tcl_Obj *transPtr = Tcl_FSGetTranslatedPath(NULL, pathPtr);
if (transPtr == NULL) {
path = NULL;
} else {
path = Tcl_GetString(transPtr);
}
/*
* Call each of the "access" function in succession. A non-return
* value of -1 indicates the particular function has succeeded.
*/
Tcl_MutexLock(&obsoleteFsHookMutex);
accessProcPtr = accessProcList;
while ((retVal == -1) && (accessProcPtr != NULL)) {
retVal = (*accessProcPtr->proc)(path, mode);
accessProcPtr = accessProcPtr->nextPtr;
}
Tcl_MutexUnlock(&obsoleteFsHookMutex);
|
| ︙ | ︙ | |||
1499 1500 1501 1502 1503 1504 1505 |
*/
Tcl_Channel
Tcl_FSOpenFileChannel(interp, pathPtr, modeString, permissions)
Tcl_Interp *interp; /* Interpreter for error reporting;
* can be NULL. */
Tcl_Obj *pathPtr; /* Name of file to open. */
| | | 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 |
*/
Tcl_Channel
Tcl_FSOpenFileChannel(interp, pathPtr, modeString, permissions)
Tcl_Interp *interp; /* Interpreter for error reporting;
* can be NULL. */
Tcl_Obj *pathPtr; /* Name of file to open. */
CONST char *modeString; /* A list of POSIX open modes or
* a string such as "rw". */
int permissions; /* If the open involves creating a
* file, with what modes to create
* it? */
{
Tcl_Filesystem *fsPtr;
#ifdef USE_OBSOLETE_FS_HOOKS
|
| ︙ | ︙ | |||
1521 1522 1523 1524 1525 1526 1527 |
}
#ifdef USE_OBSOLETE_FS_HOOKS
if (transPtr == NULL) {
path = NULL;
} else {
path = Tcl_GetString(transPtr);
}
| < < | 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 |
}
#ifdef USE_OBSOLETE_FS_HOOKS
if (transPtr == NULL) {
path = NULL;
} else {
path = Tcl_GetString(transPtr);
}
/*
* Call each of the "Tcl_OpenFileChannel" function in succession.
* A non-NULL return value indicates the particular function has
* succeeded.
*/
Tcl_MutexLock(&obsoleteFsHookMutex);
openFileChannelProcPtr = openFileChannelProcList;
while ((retVal == NULL) && (openFileChannelProcPtr != NULL)) {
retVal = (*openFileChannelProcPtr->proc)(interp, path,
modeString, permissions);
openFileChannelProcPtr = openFileChannelProcPtr->nextPtr;
}
|
| ︙ | ︙ | |||
1595 1596 1597 1598 1599 1600 1601 |
*/
int
Tcl_FSMatchInDirectory(interp, result, pathPtr, pattern, types)
Tcl_Interp *interp; /* Interpreter to receive error messages. */
Tcl_Obj *result; /* List object to receive results. */
Tcl_Obj *pathPtr; /* Contains path to directory to search. */
| | | 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 |
*/
int
Tcl_FSMatchInDirectory(interp, result, pathPtr, pattern, types)
Tcl_Interp *interp; /* Interpreter to receive error messages. */
Tcl_Obj *result; /* List object to receive results. */
Tcl_Obj *pathPtr; /* Contains path to directory to search. */
CONST char *pattern; /* Pattern to match against. */
Tcl_GlobTypeData *types; /* Object containing list of acceptable types.
* May be NULL. In particular the directory
* flag is very important. */
{
Tcl_Filesystem *fsPtr = Tcl_FSGetFileSystemForPath(pathPtr);
if (fsPtr != NULL) {
Tcl_FSMatchInDirectoryProc *proc = fsPtr->matchInDirectoryProc;
|
| ︙ | ︙ | |||
1936 1937 1938 1939 1940 1941 1942 | * * Side effects: * None. * *---------------------------------------------------------------------- */ | | | 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 |
*
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
static CONST char**
NativeFileAttrStrings(pathPtr, objPtrRef)
Tcl_Obj *pathPtr;
Tcl_Obj** objPtrRef;
{
return tclpFileAttrStrings;
}
|
| ︙ | ︙ | |||
1969 1970 1971 1972 1973 1974 1975 | * Side effects: * None. * *---------------------------------------------------------------------- */ static int | | | | | 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 |
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
static int
NativeFileAttrsGet(interp, index, pathPtr, objPtrRef)
Tcl_Interp *interp; /* The interpreter for error reporting. */
int index; /* index of the attribute command. */
Tcl_Obj *pathPtr; /* path of file we are operating on. */
Tcl_Obj **objPtrRef; /* for output. */
{
return (*tclpFileAttrProcs[index].getProc)(interp, index,
pathPtr, objPtrRef);
}
/*
*----------------------------------------------------------------------
*
* NativeFileAttrsSet --
*
|
| ︙ | ︙ | |||
2000 2001 2002 2003 2004 2005 2006 | * Side effects: * None. * *---------------------------------------------------------------------- */ static int | | | | | 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 |
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
static int
NativeFileAttrsSet(interp, index, pathPtr, objPtr)
Tcl_Interp *interp; /* The interpreter for error reporting. */
int index; /* index of the attribute command. */
Tcl_Obj *pathPtr; /* path of file we are operating on. */
Tcl_Obj *objPtr; /* set to this value. */
{
return (*tclpFileAttrProcs[index].setProc)(interp, index,
pathPtr, objPtr);
}
/*
*----------------------------------------------------------------------
*
* Tcl_FSFileAttrStrings --
*
|
| ︙ | ︙ | |||
2035 2036 2037 2038 2039 2040 2041 | * * Side effects: * None. * *---------------------------------------------------------------------- */ | | | 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 |
*
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
CONST char **
Tcl_FSFileAttrStrings(pathPtr, objPtrRef)
Tcl_Obj* pathPtr;
Tcl_Obj** objPtrRef;
{
Tcl_Filesystem *fsPtr = Tcl_FSGetFileSystemForPath(pathPtr);
if (fsPtr != NULL) {
Tcl_FSFileAttrStringsProc *proc = fsPtr->fileAttrStringsProc;
|
| ︙ | ︙ | |||
2152 2153 2154 2155 2156 2157 2158 |
*/
int
Tcl_FSChdir(pathPtr)
Tcl_Obj *pathPtr;
{
Tcl_Filesystem *fsPtr;
int retVal = -1;
| < | < | 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 |
*/
int
Tcl_FSChdir(pathPtr)
Tcl_Obj *pathPtr;
{
Tcl_Filesystem *fsPtr;
int retVal = -1;
if (Tcl_FSGetNormalizedPath(NULL, pathPtr) == NULL) {
return TCL_ERROR;
}
fsPtr = Tcl_FSGetFileSystemForPath(pathPtr);
if (fsPtr != NULL) {
Tcl_FSChdirProc *proc = fsPtr->chdirProc;
if (proc != NULL) {
|
| ︙ | ︙ | |||
2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 |
* thrown, we can just continue (and that will report the error
* to the user). If there was no error we must assume that the
* cwd was actually changed to the normalized value we
* calculated above, and we must therefore cache that
* information.
*/
if (retVal == TCL_OK) {
/* Get a lock on the cwd while we modify it */
Tcl_MutexLock(&cwdMutex);
/* Free up the previous cwd we stored */
if (cwdPathPtr != NULL) {
Tcl_DecrRefCount(cwdPathPtr);
}
/* Now remember the current cwd */
cwdPathPtr = normDirName;
| > > > > > > > > > > > > > > > > > > < | 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 |
* thrown, we can just continue (and that will report the error
* to the user). If there was no error we must assume that the
* cwd was actually changed to the normalized value we
* calculated above, and we must therefore cache that
* information.
*/
if (retVal == TCL_OK) {
/*
* Note that this normalized path may be different to what
* we found above (or at least a different object), if the
* filesystem epoch changed recently. This can actually
* happen with scripted documents very easily. Therefore
* we ask for the normalized path again (the correct value
* will have been cached as a result of the
* Tcl_FSGetFileSystemForPath call above anyway).
*/
Tcl_Obj *normDirName = Tcl_FSGetNormalizedPath(NULL, pathPtr);
if (normDirName == NULL) {
return TCL_ERROR;
}
/*
* We will be adding a reference to this object when
* we store it in the cwdPathPtr.
*/
Tcl_IncrRefCount(normDirName);
/* Get a lock on the cwd while we modify it */
Tcl_MutexLock(&cwdMutex);
/* Free up the previous cwd we stored */
if (cwdPathPtr != NULL) {
Tcl_DecrRefCount(cwdPathPtr);
}
/* Now remember the current cwd */
cwdPathPtr = normDirName;
Tcl_MutexUnlock(&cwdMutex);
}
}
return (retVal);
}
|
| ︙ | ︙ | |||
2848 2849 2850 2851 2852 2853 2854 | * current platform (between mac, win, unix) but the list * of volumes we get by calling (*proc) will reflect the current * (real) platform only and this may cause some tests to fail. * In particular, on unix '/' will match the beginning of * certain absolute Windows paths starting '//' and those tests * will go wrong. * | | | > > > > > | | | | | 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 |
* current platform (between mac, win, unix) but the list
* of volumes we get by calling (*proc) will reflect the current
* (real) platform only and this may cause some tests to fail.
* In particular, on unix '/' will match the beginning of
* certain absolute Windows paths starting '//' and those tests
* will go wrong.
*
* Besides these test-suite issues, there is one other reason
* to skip the native filesystem --- since the tclFilename.c
* code has nice fast 'absolute path' checkers, we don't want
* to waste time repeating that effort here, and this
* function is actually called quite often, so if we can
* save the overhead of the native filesystem returning us
* a list of volumes all the time, it is better.
*/
if ((fsRecPtr->fsPtr != &nativeFilesystem) && (proc != NULL)) {
int numVolumes;
Tcl_Obj *thisFsVolumes = (*proc)();
if (thisFsVolumes != NULL) {
if (Tcl_ListObjLength(NULL, thisFsVolumes,
&numVolumes) != TCL_OK) {
/*
* This is VERY bad; the Tcl_FSListVolumesProc
* didn't return a valid list. Set numVolumes to
* -1 so that we skip the while loop below and just
* return with the current value of 'type'.
*
* It would be better if we could signal an error
* here (but panic seems a bit excessive).
*/
numVolumes = -1;
}
while (numVolumes > 0) {
|
| ︙ | ︙ | |||
2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 | *--------------------------------------------------------------------------- * * Tcl_FSCopyFile -- * * If the two paths given belong to the same filesystem, we call * that filesystem's copy function. Otherwise we simply * return the posix error 'EXDEV', and -1. * * Results: * Standard Tcl error code if a function was called. * * Side effects: * A file may be copied. * | > > > > | 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 | *--------------------------------------------------------------------------- * * Tcl_FSCopyFile -- * * If the two paths given belong to the same filesystem, we call * that filesystem's copy function. Otherwise we simply * return the posix error 'EXDEV', and -1. * * Note that in the native filesystems, 'copyFileProc' is defined * to copy soft links (i.e. it copies the links themselves, not * the things they point to). * * Results: * Standard Tcl error code if a function was called. * * Side effects: * A file may be copied. * |
| ︙ | ︙ | |||
3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 |
if (objPtr->typePtr == &tclFsPathType) {
return TCL_OK;
}
/* Free old representation */
if (objPtr->typePtr != NULL) {
if (objPtr->bytes == NULL) {
objPtr->typePtr->updateStringProc(objPtr);
}
if ((objPtr->typePtr->freeIntRepProc) != NULL) {
(*objPtr->typePtr->freeIntRepProc)(objPtr);
}
}
fsPathPtr = (FsPath*)ckalloc((unsigned)sizeof(FsPath));
/* It's a pure normalized absolute path */
fsPathPtr->translatedPathPtr = NULL;
fsPathPtr->normPathPtr = objPtr;
fsPathPtr->cwdPtr = NULL;
fsPathPtr->nativePathPtr = NULL;
fsPathPtr->fsRecPtr = NULL;
fsPathPtr->filesystemEpoch = -1;
| > > > > > > > > | | 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 |
if (objPtr->typePtr == &tclFsPathType) {
return TCL_OK;
}
/* Free old representation */
if (objPtr->typePtr != NULL) {
if (objPtr->bytes == NULL) {
if (objPtr->typePtr->updateStringProc == NULL) {
if (interp != NULL) {
Tcl_ResetResult(interp);
Tcl_AppendResult(interp, "can't find object",
"string representation", (char *) NULL);
}
return TCL_ERROR;
}
objPtr->typePtr->updateStringProc(objPtr);
}
if ((objPtr->typePtr->freeIntRepProc) != NULL) {
(*objPtr->typePtr->freeIntRepProc)(objPtr);
}
}
fsPathPtr = (FsPath*)ckalloc((unsigned)sizeof(FsPath));
/* It's a pure normalized absolute path */
fsPathPtr->translatedPathPtr = NULL;
fsPathPtr->normPathPtr = objPtr;
fsPathPtr->cwdPtr = NULL;
fsPathPtr->nativePathPtr = NULL;
fsPathPtr->fsRecPtr = NULL;
fsPathPtr->filesystemEpoch = -1;
objPtr->internalRep.otherValuePtr = (VOID *) fsPathPtr;
objPtr->typePtr = &tclFsPathType;
return TCL_OK;
}
/*
*---------------------------------------------------------------------------
|
| ︙ | ︙ | |||
3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 |
if (objPtr->typePtr == &tclFsPathType) {
return TCL_OK;
}
/* Free old representation */
if (objPtr->typePtr != NULL) {
if (objPtr->bytes == NULL) {
objPtr->typePtr->updateStringProc(objPtr);
}
if ((objPtr->typePtr->freeIntRepProc) != NULL) {
(*objPtr->typePtr->freeIntRepProc)(objPtr);
}
}
| > > > > > > > > | 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 |
if (objPtr->typePtr == &tclFsPathType) {
return TCL_OK;
}
/* Free old representation */
if (objPtr->typePtr != NULL) {
if (objPtr->bytes == NULL) {
if (objPtr->typePtr->updateStringProc == NULL) {
if (interp != NULL) {
Tcl_ResetResult(interp);
Tcl_AppendResult(interp, "can't find object",
"string representation", (char *) NULL);
}
return TCL_ERROR;
}
objPtr->typePtr->updateStringProc(objPtr);
}
if ((objPtr->typePtr->freeIntRepProc) != NULL) {
(*objPtr->typePtr->freeIntRepProc)(objPtr);
}
}
|
| ︙ | ︙ | |||
3461 3462 3463 3464 3465 3466 3467 |
if (split != len) {
/* We have multiple pieces '~user/foo/bar...' */
name[split] = '\0';
}
/* Do some tilde substitution */
if (name[1] == '\0') {
/* We have just '~' */
| | | > > > | > | > > | > > > > > > > > > > > > > | | > | 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 |
if (split != len) {
/* We have multiple pieces '~user/foo/bar...' */
name[split] = '\0';
}
/* Do some tilde substitution */
if (name[1] == '\0') {
/* We have just '~' */
CONST char *dir;
Tcl_DString dirString;
if (split != len) { name[split] = separator; }
dir = TclGetEnv("HOME", &dirString);
if (dir == NULL) {
if (interp) {
Tcl_ResetResult(interp);
Tcl_AppendResult(interp, "couldn't find HOME environment ",
"variable to expand path", (char *) NULL);
}
return TCL_ERROR;
}
Tcl_DStringInit(&temp);
Tcl_JoinPath(1, &dir, &temp);
Tcl_DStringFree(&dirString);
} else {
/* We have a user name '~user' */
Tcl_DStringInit(&temp);
if (TclpGetUserHome(name+1, &temp) == NULL) {
if (interp != NULL) {
Tcl_ResetResult(interp);
Tcl_AppendResult(interp, "user \"", (name+1),
"\" doesn't exist", (char *) NULL);
}
Tcl_DStringFree(&temp);
if (split != len) { name[split] = separator; }
return TCL_ERROR;
}
if (split != len) { name[split] = separator; }
}
expandedUser = Tcl_DStringValue(&temp);
transPtr = Tcl_NewStringObj(expandedUser, Tcl_DStringLength(&temp));
if (split != len) {
/* Join up the tilde substitution with the rest */
if (name[split+1] == separator) {
/*
* Somewhat tricky case like ~//foo/bar.
* Make use of Split/Join machinery to get it right.
* Assumes all paths beginning with ~ are part of the
* native filesystem.
*/
int objc;
Tcl_Obj **objv;
Tcl_Obj *parts = TclpNativeSplitPath(objPtr, NULL);
Tcl_ListObjGetElements(NULL, parts, &objc, &objv);
/* Skip '~'. It's replaced by its expansion */
objc--; objv++;
while (objc--) {
TclpNativeJoinPath(transPtr, Tcl_GetString(*objv++));
}
Tcl_DecrRefCount(parts);
} else {
/* Simple case. "rest" is relative path. Just join it. */
Tcl_Obj *rest = Tcl_NewStringObj(name+split+1,-1);
transPtr = Tcl_FSJoinToPath(transPtr, 1, &rest);
}
}
Tcl_DStringFree(&temp);
} else {
transPtr = Tcl_FSJoinToPath(objPtr,0,NULL);
}
/*
|
| ︙ | ︙ | |||
3523 3524 3525 3526 3527 3528 3529 |
Tcl_IncrRefCount(fsPathPtr->translatedPathPtr);
fsPathPtr->normPathPtr = NULL;
fsPathPtr->cwdPtr = NULL;
fsPathPtr->nativePathPtr = NULL;
fsPathPtr->fsRecPtr = NULL;
fsPathPtr->filesystemEpoch = -1;
| | | 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 |
Tcl_IncrRefCount(fsPathPtr->translatedPathPtr);
fsPathPtr->normPathPtr = NULL;
fsPathPtr->cwdPtr = NULL;
fsPathPtr->nativePathPtr = NULL;
fsPathPtr->fsRecPtr = NULL;
fsPathPtr->filesystemEpoch = -1;
objPtr->internalRep.otherValuePtr = (VOID *) fsPathPtr;
objPtr->typePtr = &tclFsPathType;
return TCL_OK;
}
/*
*---------------------------------------------------------------------------
|
| ︙ | ︙ | |||
3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 |
/*
* Free old representation; shouldn't normally be any,
* but best to be safe.
*/
if (objPtr->typePtr != NULL) {
if (objPtr->bytes == NULL) {
objPtr->typePtr->updateStringProc(objPtr);
}
if ((objPtr->typePtr->freeIntRepProc) != NULL) {
(*objPtr->typePtr->freeIntRepProc)(objPtr);
}
}
fsPathPtr = (FsPath*)ckalloc((unsigned)sizeof(FsPath));
fsPathPtr->translatedPathPtr = NULL;
/* Circular reference, by design */
fsPathPtr->normPathPtr = objPtr;
fsPathPtr->cwdPtr = NULL;
fsPathPtr->nativePathPtr = clientData;
fsPathPtr->fsRecPtr = fsFromPtr->fsRecPtr;
fsPathPtr->filesystemEpoch = fsFromPtr->filesystemEpoch;
| > > > | | 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 |
/*
* Free old representation; shouldn't normally be any,
* but best to be safe.
*/
if (objPtr->typePtr != NULL) {
if (objPtr->bytes == NULL) {
if (objPtr->typePtr->updateStringProc == NULL) {
return NULL;
}
objPtr->typePtr->updateStringProc(objPtr);
}
if ((objPtr->typePtr->freeIntRepProc) != NULL) {
(*objPtr->typePtr->freeIntRepProc)(objPtr);
}
}
fsPathPtr = (FsPath*)ckalloc((unsigned)sizeof(FsPath));
fsPathPtr->translatedPathPtr = NULL;
/* Circular reference, by design */
fsPathPtr->normPathPtr = objPtr;
fsPathPtr->cwdPtr = NULL;
fsPathPtr->nativePathPtr = clientData;
fsPathPtr->fsRecPtr = fsFromPtr->fsRecPtr;
fsPathPtr->filesystemEpoch = fsFromPtr->filesystemEpoch;
objPtr->internalRep.otherValuePtr = (VOID *) fsPathPtr;
objPtr->typePtr = &tclFsPathType;
return objPtr;
}
static void
FreeFsPathInternalRep(pathObjPtr)
Tcl_Obj *pathObjPtr; /* Path object with internal rep to free. */
|
| ︙ | ︙ | |||
3653 3654 3655 3656 3657 3658 3659 |
{
register FsPath* srcFsPathPtr =
(FsPath*) srcPtr->internalRep.otherValuePtr;
register FsPath* copyFsPathPtr =
(FsPath*) ckalloc((unsigned)sizeof(FsPath));
Tcl_FSDupInternalRepProc *dupProc;
| | | 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 |
{
register FsPath* srcFsPathPtr =
(FsPath*) srcPtr->internalRep.otherValuePtr;
register FsPath* copyFsPathPtr =
(FsPath*) ckalloc((unsigned)sizeof(FsPath));
Tcl_FSDupInternalRepProc *dupProc;
copyPtr->internalRep.otherValuePtr = (VOID *) copyFsPathPtr;
if (srcFsPathPtr->translatedPathPtr != NULL) {
copyFsPathPtr->translatedPathPtr = srcFsPathPtr->translatedPathPtr;
Tcl_IncrRefCount(copyFsPathPtr->translatedPathPtr);
} else {
copyFsPathPtr->translatedPathPtr = NULL;
}
|
| ︙ | ︙ | |||
3762 3763 3764 3765 3766 3767 3768 | * NULL or a valid string. * * Side effects: * Only those of 'Tcl_FSConvertToPathType' * *--------------------------------------------------------------------------- */ | | | 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 |
* NULL or a valid string.
*
* Side effects:
* Only those of 'Tcl_FSConvertToPathType'
*
*---------------------------------------------------------------------------
*/
CONST char*
Tcl_FSGetTranslatedStringPath(interp, pathPtr)
Tcl_Interp *interp;
Tcl_Obj* pathPtr;
{
Tcl_Obj *transPtr = Tcl_FSGetTranslatedPath(interp, pathPtr);
if (transPtr == NULL) {
return NULL;
|
| ︙ | ︙ | |||
3994 3995 3996 3997 3998 3999 4000 | * * Side effects: * See Tcl_FSGetInternalRep. * *--------------------------------------------------------------------------- */ | | | | 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 |
*
* Side effects:
* See Tcl_FSGetInternalRep.
*
*---------------------------------------------------------------------------
*/
CONST char*
Tcl_FSGetNativePath(pathObjPtr)
Tcl_Obj* pathObjPtr;
{
return (CONST char *)Tcl_FSGetInternalRep(pathObjPtr, &nativeFilesystem);
}
/*
*---------------------------------------------------------------------------
*
* NativeCreateNativeRep --
*
|
| ︙ | ︙ | |||
4070 4071 4072 4073 4074 4075 4076 |
TclpNativeToNormalized(clientData)
ClientData clientData;
{
Tcl_DString ds;
Tcl_Obj *objPtr;
#ifdef __WIN32__
| | | | 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 |
TclpNativeToNormalized(clientData)
ClientData clientData;
{
Tcl_DString ds;
Tcl_Obj *objPtr;
#ifdef __WIN32__
Tcl_WinTCharToUtf((CONST char*)clientData, -1, &ds);
#else
Tcl_ExternalToUtfDString(NULL, (CONST char*)clientData, -1, &ds);
#endif
objPtr = Tcl_NewStringObj(Tcl_DStringValue(&ds),Tcl_DStringLength(&ds));
Tcl_DStringFree(&ds);
return objPtr;
}
|
| ︙ | ︙ | |||
4496 4497 4498 4499 4500 4501 4502 |
struct utimbuf *tval;
{
#ifdef MAC_TCL
long gmt_offset=TclpGetGMTOffset();
struct utimbuf local_tval;
local_tval.actime=tval->actime+gmt_offset;
local_tval.modtime=tval->modtime+gmt_offset;
| | > | | | | 4556 4557 4558 4559 4560 4561 4562 4563 4564 4565 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 |
struct utimbuf *tval;
{
#ifdef MAC_TCL
long gmt_offset=TclpGetGMTOffset();
struct utimbuf local_tval;
local_tval.actime=tval->actime+gmt_offset;
local_tval.modtime=tval->modtime+gmt_offset;
return utime(Tcl_GetString(Tcl_FSGetNormalizedPath(NULL,pathPtr)),
&local_tval);
#else
return utime(Tcl_GetString(Tcl_FSGetNormalizedPath(NULL,pathPtr)),tval);
#endif
}
/* Everything from here on is contained in this obsolete ifdef */
#ifdef USE_OBSOLETE_FS_HOOKS
/*
*----------------------------------------------------------------------
*
* TclStatInsertProc --
*
* Insert the passed procedure pointer at the head of the list of
* functions which are used during a call to 'TclStat(...)'. The
* passed function should behave exactly like 'TclStat' when called
* during that time (see 'TclStat(...)' for more information).
* The function will be added even if it already in the list.
*
* Results:
* Normally TCL_OK; TCL_ERROR if memory for a new node in the list
* could not be allocated.
*
* Side effects:
* Memory allocated and modifies the link list for 'TclStat'
* functions.
*
*----------------------------------------------------------------------
*/
int
TclStatInsertProc (proc)
|
| ︙ | ︙ | |||
4614 4615 4616 4617 4618 4619 4620 | /* *---------------------------------------------------------------------- * * TclAccessInsertProc -- * * Insert the passed procedure pointer at the head of the list of | | | | | > | 4675 4676 4677 4678 4679 4680 4681 4682 4683 4684 4685 4686 4687 4688 4689 4690 4691 4692 4693 | /* *---------------------------------------------------------------------- * * TclAccessInsertProc -- * * Insert the passed procedure pointer at the head of the list of * functions which are used during a call to 'TclAccess(...)'. * The passed function should behave exactly like 'TclAccess' when * called during that time (see 'TclAccess(...)' for more * information). The function will be added even if it already in * the list. * * Results: * Normally TCL_OK; TCL_ERROR if memory for a new node in the list * could not be allocated. * * Side effects: * Memory allocated and modifies the link list for 'TclAccess' |
| ︙ | ︙ | |||
4718 4719 4720 4721 4722 4723 4724 | /* *---------------------------------------------------------------------- * * TclOpenFileChannelInsertProc -- * * Insert the passed procedure pointer at the head of the list of * functions which are used during a call to | | | | | 4780 4781 4782 4783 4784 4785 4786 4787 4788 4789 4790 4791 4792 4793 4794 4795 4796 4797 4798 4799 4800 4801 4802 4803 4804 | /* *---------------------------------------------------------------------- * * TclOpenFileChannelInsertProc -- * * Insert the passed procedure pointer at the head of the list of * functions which are used during a call to * 'Tcl_OpenFileChannel(...)'. The passed function should behave * exactly like 'Tcl_OpenFileChannel' when called during that time * (see 'Tcl_OpenFileChannel(...)' for more information). The * function will be added even if it already in the list. * * Results: * Normally TCL_OK; TCL_ERROR if memory for a new node in the list * could not be allocated. * * Side effects: * Memory allocated and modifies the link list for * 'Tcl_OpenFileChannel' functions. * *---------------------------------------------------------------------- */ int TclOpenFileChannelInsertProc(proc) |
| ︙ | ︙ |
Changes to generic/tclIndexObj.c.
1 2 3 4 5 6 7 8 9 10 11 12 | /* * tclIndexObj.c -- * * This file implements objects of type "index". This object type * is used to lookup a keyword in a table of valid values and cache * the index of the matching entry. * * Copyright (c) 1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /* * tclIndexObj.c -- * * This file implements objects of type "index". This object type * is used to lookup a keyword in a table of valid values and cache * the index of the matching entry. * * Copyright (c) 1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclIndexObj.c,v 1.10.8.1 2002/02/05 02:22:00 wolfsuit Exp $ */ #include "tclInt.h" /* * Prototypes for procedures defined later in this file: */ |
| ︙ | ︙ | |||
72 73 74 75 76 77 78 |
*----------------------------------------------------------------------
*/
int
Tcl_GetIndexFromObj(interp, objPtr, tablePtr, msg, flags, indexPtr)
Tcl_Interp *interp; /* Used for error reporting if not NULL. */
Tcl_Obj *objPtr; /* Object containing the string to lookup. */
| | | | 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
*----------------------------------------------------------------------
*/
int
Tcl_GetIndexFromObj(interp, objPtr, tablePtr, msg, flags, indexPtr)
Tcl_Interp *interp; /* Used for error reporting if not NULL. */
Tcl_Obj *objPtr; /* Object containing the string to lookup. */
CONST char **tablePtr; /* Array of strings to compare against the
* value of objPtr; last entry must be NULL
* and there must not be duplicate entries. */
CONST char *msg; /* Identifying word to use in error messages. */
int flags; /* 0 or TCL_EXACT */
int *indexPtr; /* Place to store resulting integer index. */
{
/*
* See if there is a valid cached result from a previous lookup
* (doing the check here saves the overhead of calling
|
| ︙ | ︙ | |||
131 132 133 134 135 136 137 |
*/
int
Tcl_GetIndexFromObjStruct(interp, objPtr, tablePtr, offset, msg, flags,
indexPtr)
Tcl_Interp *interp; /* Used for error reporting if not NULL. */
Tcl_Obj *objPtr; /* Object containing the string to lookup. */
| | | | > > | 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 |
*/
int
Tcl_GetIndexFromObjStruct(interp, objPtr, tablePtr, offset, msg, flags,
indexPtr)
Tcl_Interp *interp; /* Used for error reporting if not NULL. */
Tcl_Obj *objPtr; /* Object containing the string to lookup. */
CONST char **tablePtr; /* The first string in the table. The second
* string will be at this address plus the
* offset, the third plus the offset again,
* etc. The last entry must be NULL
* and there must not be duplicate entries. */
int offset; /* The number of bytes between entries */
CONST char *msg; /* Identifying word to use in error messages. */
int flags; /* 0 or TCL_EXACT */
int *indexPtr; /* Place to store resulting integer index. */
{
int index, length, i, numAbbrev;
char *key, *p1;
CONST char *p2;
CONST char * CONST *entryPtr;
Tcl_Obj *resultPtr;
/*
* See if there is a valid cached result from a previous lookup.
*/
if ((objPtr->typePtr == &tclIndexType)
|
| ︙ | ︙ | |||
173 174 175 176 177 178 179 |
*/
if (key[0] == '\0') {
goto error;
}
for (entryPtr = tablePtr, i = 0; *entryPtr != NULL;
| | | 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 |
*/
if (key[0] == '\0') {
goto error;
}
for (entryPtr = tablePtr, i = 0; *entryPtr != NULL;
entryPtr = (CONST char **) ((char *)entryPtr + offset), i++) {
for (p1 = key, p2 = *entryPtr; *p1 == *p2; p1++, p2++) {
if (*p1 == 0) {
index = i;
goto done;
}
}
if (*p1 == 0) {
|
| ︙ | ︙ | |||
218 219 220 221 222 223 224 |
error:
if (interp != NULL) {
int count;
resultPtr = Tcl_GetObjResult(interp);
Tcl_AppendStringsToObj(resultPtr,
(numAbbrev > 1) ? "ambiguous " : "bad ", msg, " \"",
key, "\": must be ", *tablePtr, (char *) NULL);
| | > | | 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 |
error:
if (interp != NULL) {
int count;
resultPtr = Tcl_GetObjResult(interp);
Tcl_AppendStringsToObj(resultPtr,
(numAbbrev > 1) ? "ambiguous " : "bad ", msg, " \"",
key, "\": must be ", *tablePtr, (char *) NULL);
for (entryPtr = (CONST char **)((char *)tablePtr + offset), count = 0;
*entryPtr != NULL;
entryPtr = (CONST char **)((char *)entryPtr + offset),
count++) {
if ((*((char **) ((char *) entryPtr + offset))) == NULL) {
Tcl_AppendStringsToObj(resultPtr,
(count > 0) ? ", or " : " or ", *entryPtr,
(char *) NULL);
} else {
Tcl_AppendStringsToObj(resultPtr, ", ", *entryPtr,
(char *) NULL);
|
| ︙ | ︙ | |||
297 298 299 300 301 302 303 |
Tcl_WrongNumArgs(interp, objc, objv, message)
Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments to print
* from objv. */
Tcl_Obj *CONST objv[]; /* Initial argument objects, which
* should be included in the error
* message. */
| | | 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 |
Tcl_WrongNumArgs(interp, objc, objv, message)
Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments to print
* from objv. */
Tcl_Obj *CONST objv[]; /* Initial argument objects, which
* should be included in the error
* message. */
CONST char *message; /* Error message to print after the
* leading objects in objv. The
* message may be NULL. */
{
Tcl_Obj *objPtr;
char **tablePtr;
int i, offset;
|
| ︙ | ︙ |
Changes to generic/tclInt.decls.
1 2 3 4 5 6 7 8 9 10 11 12 | # tclInt.decls -- # # This file contains the declarations for all unsupported # functions that are exported by the Tcl library. This file # is used to generate the tclIntDecls.h, tclIntPlatDecls.h, # tclIntStub.c, tclPlatStub.c, tclCompileDecls.h and tclCompileStub.c # files # # Copyright (c) 1998-1999 by Scriptics Corporation. # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # | > > | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | # tclInt.decls -- # # This file contains the declarations for all unsupported # functions that are exported by the Tcl library. This file # is used to generate the tclIntDecls.h, tclIntPlatDecls.h, # tclIntStub.c, tclPlatStub.c, tclCompileDecls.h and tclCompileStub.c # files # # Copyright (c) 1998-1999 by Scriptics Corporation. # Copyright (c) 2001 by Kevin B. Kenny. All rights reserved. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # RCS: @(#) $Id: tclInt.decls,v 1.34.2.1 2002/02/05 02:22:00 wolfsuit Exp $ library tcl # Define the unsupported generic interfaces. interface tclInt |
| ︙ | ︙ | |||
54 55 56 57 58 59 60 |
int TclCopyChannel(Tcl_Interp *interp, Tcl_Channel inChan, \
Tcl_Channel outChan, int toRead, Tcl_Obj *cmdPtr)
}
# TclCreatePipeline unofficially exported for use by BLT.
declare 9 {unix win} {
| | | 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
int TclCopyChannel(Tcl_Interp *interp, Tcl_Channel inChan, \
Tcl_Channel outChan, int toRead, Tcl_Obj *cmdPtr)
}
# TclCreatePipeline unofficially exported for use by BLT.
declare 9 {unix win} {
int TclCreatePipeline(Tcl_Interp *interp, int argc, CONST char **argv, \
Tcl_Pid **pidArrayPtr, TclFile *inPipePtr, TclFile *outPipePtr, \
TclFile *errFilePtr)
}
declare 10 generic {
int TclCreateProc(Tcl_Interp *interp, Namespace *nsPtr,
CONST char *procName,
Tcl_Obj *argsPtr, Tcl_Obj *bodyPtr, Proc **procPtrPtr)
|
| ︙ | ︙ | |||
166 167 168 169 170 171 172 |
Namespace **altNsPtrPtr, Namespace **actualCxtPtrPtr, \
CONST char **simpleNamePtr)
}
declare 39 generic {
TclObjCmdProcType TclGetObjInterpProc(void)
}
declare 40 generic {
| | | | 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 |
Namespace **altNsPtrPtr, Namespace **actualCxtPtrPtr, \
CONST char **simpleNamePtr)
}
declare 39 generic {
TclObjCmdProcType TclGetObjInterpProc(void)
}
declare 40 generic {
int TclGetOpenMode(Tcl_Interp *interp, CONST char *str, int *seekFlagPtr)
}
declare 41 generic {
Tcl_Command TclGetOriginalCommand(Tcl_Command command)
}
declare 42 generic {
char * TclpGetUserHome(CONST char *name, Tcl_DString *bufferPtr)
}
declare 43 generic {
int TclGlobalInvoke(Tcl_Interp *interp, int argc, char **argv, int flags)
}
declare 44 generic {
int TclGuessPackageName(CONST char *fileName, Tcl_DString *bufPtr)
}
declare 45 generic {
int TclHideUnsafeCommands(Tcl_Interp *interp)
}
declare 46 generic {
int TclInExit(void)
}
|
| ︙ | ︙ | |||
295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 |
}
declare 75 generic {
unsigned long TclpGetClicks(void)
}
declare 76 generic {
unsigned long TclpGetSeconds(void)
}
declare 77 generic {
void TclpGetTime(Tcl_Time *time)
}
declare 78 generic {
int TclpGetTimeZone(unsigned long time)
}
# Replaced by Tcl_FSListVolumes in 8.4:
#declare 79 generic {
# int TclpListVolumes(Tcl_Interp *interp)
#}
| > > > | 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 |
}
declare 75 generic {
unsigned long TclpGetClicks(void)
}
declare 76 generic {
unsigned long TclpGetSeconds(void)
}
# deprecated
declare 77 generic {
void TclpGetTime(Tcl_Time *time)
}
declare 78 generic {
int TclpGetTimeZone(unsigned long time)
}
# Replaced by Tcl_FSListVolumes in 8.4:
#declare 79 generic {
# int TclpListVolumes(Tcl_Interp *interp)
#}
|
| ︙ | ︙ | |||
422 423 424 425 426 427 428 |
# char * TclWordEnd(char *start, char *lastChar, int nested, int *semiPtr)
# }
# Procedures used in conjunction with Tcl namespaces. They are
# defined here instead of in tcl.decls since they are not stable yet.
declare 111 generic {
| | | | | | | | | | 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 |
# char * TclWordEnd(char *start, char *lastChar, int nested, int *semiPtr)
# }
# Procedures used in conjunction with Tcl namespaces. They are
# defined here instead of in tcl.decls since they are not stable yet.
declare 111 generic {
void Tcl_AddInterpResolvers(Tcl_Interp *interp, CONST char *name, \
Tcl_ResolveCmdProc *cmdProc, Tcl_ResolveVarProc *varProc, \
Tcl_ResolveCompiledVarProc *compiledVarProc)
}
declare 112 generic {
int Tcl_AppendExportList(Tcl_Interp *interp, Tcl_Namespace *nsPtr, \
Tcl_Obj *objPtr)
}
declare 113 generic {
Tcl_Namespace * Tcl_CreateNamespace(Tcl_Interp *interp, CONST char *name, \
ClientData clientData, Tcl_NamespaceDeleteProc *deleteProc)
}
declare 114 generic {
void Tcl_DeleteNamespace(Tcl_Namespace *nsPtr)
}
declare 115 generic {
int Tcl_Export(Tcl_Interp *interp, Tcl_Namespace *nsPtr, \
CONST char *pattern, int resetListFirst)
}
declare 116 generic {
Tcl_Command Tcl_FindCommand(Tcl_Interp *interp, CONST char *name, \
Tcl_Namespace *contextNsPtr, int flags)
}
declare 117 generic {
Tcl_Namespace * Tcl_FindNamespace(Tcl_Interp *interp, CONST char *name, \
Tcl_Namespace *contextNsPtr, int flags)
}
declare 118 generic {
int Tcl_GetInterpResolvers(Tcl_Interp *interp, CONST char *name, \
Tcl_ResolverInfo *resInfo)
}
declare 119 generic {
int Tcl_GetNamespaceResolvers(Tcl_Namespace *namespacePtr, \
Tcl_ResolverInfo *resInfo)
}
declare 120 generic {
Tcl_Var Tcl_FindNamespaceVar(Tcl_Interp *interp, char *name, \
Tcl_Namespace *contextNsPtr, int flags)
}
declare 121 generic {
int Tcl_ForgetImport(Tcl_Interp *interp, Tcl_Namespace *nsPtr, \
CONST char *pattern)
}
declare 122 generic {
Tcl_Command Tcl_GetCommandFromObj(Tcl_Interp *interp, Tcl_Obj *objPtr)
}
declare 123 generic {
void Tcl_GetCommandFullName(Tcl_Interp *interp, Tcl_Command command, \
Tcl_Obj *objPtr)
}
declare 124 generic {
Tcl_Namespace * Tcl_GetCurrentNamespace(Tcl_Interp *interp)
}
declare 125 generic {
Tcl_Namespace * Tcl_GetGlobalNamespace(Tcl_Interp *interp)
}
declare 126 generic {
void Tcl_GetVariableFullName(Tcl_Interp *interp, Tcl_Var variable, \
Tcl_Obj *objPtr)
}
declare 127 generic {
int Tcl_Import(Tcl_Interp *interp, Tcl_Namespace *nsPtr, \
CONST char *pattern, int allowOverwrite)
}
declare 128 generic {
void Tcl_PopCallFrame(Tcl_Interp* interp)
}
declare 129 generic {
int Tcl_PushCallFrame(Tcl_Interp* interp, Tcl_CallFrame *framePtr, \
Tcl_Namespace *nsPtr, int isProcCallFrame)
}
declare 130 generic {
int Tcl_RemoveInterpResolvers(Tcl_Interp *interp, CONST char *name)
}
declare 131 generic {
void Tcl_SetNamespaceResolvers(Tcl_Namespace *namespacePtr, \
Tcl_ResolveCmdProc *cmdProc, Tcl_ResolveVarProc *varProc, \
Tcl_ResolveCompiledVarProc *compiledVarProc)
}
declare 132 generic {
|
| ︙ | ︙ | |||
521 522 523 524 525 526 527 |
# Added in 8.1:
#declare 137 generic {
# int TclpChdir(CONST char *dirName)
#}
declare 138 generic {
| | | | 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 |
# Added in 8.1:
#declare 137 generic {
# int TclpChdir(CONST char *dirName)
#}
declare 138 generic {
CONST char * TclGetEnv(CONST char *name, Tcl_DString *valuePtr)
}
#declare 139 generic {
# int TclpLoadFile(Tcl_Interp *interp, char *fileName, char *sym1, \
# char *sym2, Tcl_PackageInitProc **proc1Ptr, \
# Tcl_PackageInitProc **proc2Ptr, ClientData *clientDataPtr)
#}
declare 140 generic {
int TclLooksLikeInt(CONST char *bytes, int length)
}
# This is used by TclX, but should otherwise be considered private
declare 141 generic {
CONST char *TclpGetCwd(Tcl_Interp *interp, Tcl_DString *cwdPtr)
}
declare 142 generic {
int TclSetByteCodeFromAny(Tcl_Interp *interp, Tcl_Obj *objPtr, \
CompileHookProc *hookProc, ClientData clientData)
}
declare 143 generic {
int TclAddLiteralObj(struct CompileEnv *envPtr, Tcl_Obj *objPtr, \
|
| ︙ | ︙ | |||
595 596 597 598 599 600 601 |
#}
#declare 155 generic {
# int TclTestChannelEventCmd(ClientData clientData, \
# Tcl_Interp *interp, int argc, char **argv)
#}
declare 156 generic {
| | | | > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > | 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 |
#}
#declare 155 generic {
# int TclTestChannelEventCmd(ClientData clientData, \
# Tcl_Interp *interp, int argc, char **argv)
#}
declare 156 generic {
void TclRegError (Tcl_Interp *interp, CONST char *msg, \
int status)
}
declare 157 generic {
Var * TclVarTraceExists (Tcl_Interp *interp, char *varName)
}
declare 158 generic {
void TclSetStartupScriptFileName(CONST char *filename)
}
declare 159 generic {
CONST char *TclGetStartupScriptFileName(void)
}
#declare 160 generic {
# int TclpMatchFilesTypes(Tcl_Interp *interp, char *separators, \
# Tcl_DString *dirPtr, char *pattern, char *tail, GlobTypeData *types)
#}
# new in 8.3.2/8.4a2
declare 161 generic {
int TclChannelTransform(Tcl_Interp *interp, Tcl_Channel chan, \
Tcl_Obj *cmdObjPtr)
}
declare 162 generic {
void TclChannelEventScriptInvoker(ClientData clientData, int flags)
}
# ALERT: The result of 'TclGetInstructionTable' is actually an
# "InstructionDesc*" but we do not want to describe this structure in
# "tclInt.h". It is described in "tclCompile.h". Use a cast to the
# correct type when calling this procedure.
declare 163 generic {
void * TclGetInstructionTable (void)
}
# ALERT: The argument of 'TclExpandCodeArray' is actually a
# "CompileEnv*" but we do not want to describe this structure in
# "tclInt.h". It is described in "tclCompile.h".
declare 164 generic {
void TclExpandCodeArray (void *envPtr)
}
# These functions are vfs aware, but are generally only useful internally.
declare 165 generic {
void TclpSetInitialEncodings(void)
}
# New function due to TIP #33
declare 166 generic {
int TclListObjSetElement( Tcl_Interp* interp,
Tcl_Obj* listPtr,
int index,
Tcl_Obj* valuePtr )
}
# VFS-aware versions of Tcl*StartupScriptFileName (158 and 159 above)
declare 167 generic {
void TclSetStartupScriptPath(Tcl_Obj *pathPtr)
}
declare 168 generic {
Tcl_Obj *TclGetStartupScriptPath(void)
}
##############################################################################
# Define the platform specific internal Tcl interface. These functions are
# only available on the designated platform.
interface tclIntPlat
|
| ︙ | ︙ | |||
661 662 663 664 665 666 667 |
int FSpSetDefaultDir(FSSpecPtr theSpec)
}
declare 6 mac {
OSErr FSpFindFolder(short vRefNum, OSType folderType, \
Boolean createFolder, FSSpec *spec)
}
declare 7 mac {
| | | | | | 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 |
int FSpSetDefaultDir(FSSpecPtr theSpec)
}
declare 6 mac {
OSErr FSpFindFolder(short vRefNum, OSType folderType, \
Boolean createFolder, FSSpec *spec)
}
declare 7 mac {
void GetGlobalMouseTcl(Point *mouse)
}
# The following routines are utility functions in Tcl. They are exported
# here because they are needed in Tk. They are not officially supported,
# however. The first set are from the MoreFiles package.
declare 8 mac {
pascal OSErr FSpGetDirectoryIDTcl(CONST FSSpec *spec, long *theDirID, \
Boolean *isDirectory)
}
declare 9 mac {
pascal short FSpOpenResFileCompatTcl(CONST FSSpec *spec, \
SignedByte permission)
}
declare 10 mac {
pascal void FSpCreateResFileCompatTcl(CONST FSSpec *spec, OSType creator, \
OSType fileType, ScriptCode scriptTag)
}
# Like the MoreFiles routines these fix problems in the standard
# Mac calls. These routines are from tclMacUtils.h.
declare 11 mac {
|
| ︙ | ︙ | |||
732 733 734 735 736 737 738 739 |
declare 23 mac {
FILE * TclMacFOpenHack(CONST char *path, CONST char *mode)
}
# Replaced in 8.1 by TclpReadLink:
# declare 24 mac {
# int TclMacReadlink(char *path, char *buf, int size)
# }
declare 25 mac {
| > > > | | 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 |
declare 23 mac {
FILE * TclMacFOpenHack(CONST char *path, CONST char *mode)
}
# Replaced in 8.1 by TclpReadLink:
# declare 24 mac {
# int TclMacReadlink(char *path, char *buf, int size)
# }
declare 24 mac {
char * TclpGetTZName(int isdst)
}
declare 25 mac {
int TclMacChmod(CONST char *path, int mode)
}
############################
# Windows specific internals
declare 0 win {
void TclWinConvertError(DWORD errCode)
|
| ︙ | ︙ | |||
794 795 796 797 798 799 800 |
Tcl_Channel TclpCreateCommandChannel(TclFile readFile, \
TclFile writeFile, TclFile errorFile, int numPids, Tcl_Pid *pidPtr)
}
declare 14 win {
int TclpCreatePipe(TclFile *readPipe, TclFile *writePipe)
}
declare 15 win {
| | | 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 |
Tcl_Channel TclpCreateCommandChannel(TclFile readFile, \
TclFile writeFile, TclFile errorFile, int numPids, Tcl_Pid *pidPtr)
}
declare 14 win {
int TclpCreatePipe(TclFile *readPipe, TclFile *writePipe)
}
declare 15 win {
int TclpCreateProcess(Tcl_Interp *interp, int argc, CONST char **argv, \
TclFile inputFile, TclFile outputFile, TclFile errorFile, \
Tcl_Pid *pidPtr)
}
# Signature changed in 8.1:
# declare 16 win {
# TclFile TclpCreateTempFile(char *contents, Tcl_DString *namePtr)
# }
|
| ︙ | ︙ | |||
862 863 864 865 866 867 868 |
Tcl_Channel TclpCreateCommandChannel(TclFile readFile, \
TclFile writeFile, TclFile errorFile, int numPids, Tcl_Pid *pidPtr)
}
declare 3 unix {
int TclpCreatePipe(TclFile *readPipe, TclFile *writePipe)
}
declare 4 unix {
| | | 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 |
Tcl_Channel TclpCreateCommandChannel(TclFile readFile, \
TclFile writeFile, TclFile errorFile, int numPids, Tcl_Pid *pidPtr)
}
declare 3 unix {
int TclpCreatePipe(TclFile *readPipe, TclFile *writePipe)
}
declare 4 unix {
int TclpCreateProcess(Tcl_Interp *interp, int argc, CONST char **argv, \
TclFile inputFile, TclFile outputFile, TclFile errorFile, \
Tcl_Pid *pidPtr)
}
# Signature changed in 8.1:
# declare 5 unix {
# TclFile TclpCreateTempFile(char *contents,
# Tcl_DString *namePtr)
|
| ︙ | ︙ |
Changes to generic/tclInt.h.
1 2 3 4 5 6 7 8 9 10 11 12 13 | /* * tclInt.h -- * * Declarations of things used internally by the Tcl interpreter. * * Copyright (c) 1987-1993 The Regents of the University of California. * Copyright (c) 1993-1997 Lucent Technologies. * Copyright (c) 1994-1998 Sun Microsystems, Inc. * Copyright (c) 1998-1999 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | > | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | /* * tclInt.h -- * * Declarations of things used internally by the Tcl interpreter. * * Copyright (c) 1987-1993 The Regents of the University of California. * Copyright (c) 1993-1997 Lucent Technologies. * Copyright (c) 1994-1998 Sun Microsystems, Inc. * Copyright (c) 1998-1999 by Scriptics Corporation. * Copyright (c) 2001 by Kevin B. Kenny. All rights reserved. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclInt.h,v 1.68.2.1 2002/02/05 02:22:00 wolfsuit Exp $ */ #ifndef _TCLINT #define _TCLINT /* * Common include files needed by most of the Tcl source files are |
| ︙ | ︙ | |||
94 95 96 97 98 99 100 |
Tcl_Namespace *context, Tcl_ResolvedVarInfo **rPtr));
typedef int (Tcl_ResolveVarProc) _ANSI_ARGS_((
Tcl_Interp* interp, char* name, Tcl_Namespace *context,
int flags, Tcl_Var *rPtr));
typedef int (Tcl_ResolveCmdProc) _ANSI_ARGS_((Tcl_Interp* interp,
| | | 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
Tcl_Namespace *context, Tcl_ResolvedVarInfo **rPtr));
typedef int (Tcl_ResolveVarProc) _ANSI_ARGS_((
Tcl_Interp* interp, char* name, Tcl_Namespace *context,
int flags, Tcl_Var *rPtr));
typedef int (Tcl_ResolveCmdProc) _ANSI_ARGS_((Tcl_Interp* interp,
CONST84 char* name, Tcl_Namespace *context, int flags,
Tcl_Command *rPtr));
typedef struct Tcl_ResolverInfo {
Tcl_ResolveCmdProc *cmdResProc; /* Procedure handling command name
* resolution. */
Tcl_ResolveVarProc *varResProc; /* Procedure handling variable name
* resolution for variables that
|
| ︙ | ︙ | |||
1427 1428 1429 1430 1431 1432 1433 | * the wrong result on platforms that allocate addresses that are divisible * by 4 or 2. Only use it for offsets or sizes. */ #define TCL_ALIGN(x) (((int)(x) + 7) & ~7) /* | | > > > > > > > > > > > > > | 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 |
* the wrong result on platforms that allocate addresses that are divisible
* by 4 or 2. Only use it for offsets or sizes.
*/
#define TCL_ALIGN(x) (((int)(x) + 7) & ~7)
/*
* The following enum values are used to specify the runtime platform
* setting of the tclPlatform variable.
*/
typedef enum {
TCL_PLATFORM_UNIX, /* Any Unix-like OS. */
TCL_PLATFORM_MAC, /* MacOS. */
TCL_PLATFORM_WINDOWS /* Any Microsoft Windows OS. */
} TclPlatformType;
/*
* The following enum values are used to indicate the translation
* of a Tcl channel. Declared here so that each platform can define
* TCL_PLATFORM_TRANSLATION to the native translation on that platform
*/
typedef enum TclEolTranslation {
TCL_TRANSLATE_AUTO, /* Eol == \r, \n and \r\n. */
TCL_TRANSLATE_CR, /* Eol == \r. */
TCL_TRANSLATE_LF, /* Eol == \n. */
TCL_TRANSLATE_CRLF /* Eol == \r\n. */
} TclEolTranslation;
/*
* Flags for TclInvoke:
*
* TCL_INVOKE_HIDDEN Invoke a hidden command; if not set,
* invokes an exposed command.
* TCL_INVOKE_NO_UNKNOWN If set, "unknown" is not invoked if
* the command to be invoked is not found.
|
| ︙ | ︙ | |||
1523 1524 1525 1526 1527 1528 1529 | * Data structures related to obsolete filesystem hooks *---------------------------------------------------------------- */ typedef int (TclStatProc_) _ANSI_ARGS_((CONST char *path, struct stat *buf)); typedef int (TclAccessProc_) _ANSI_ARGS_((CONST char *path, int mode)); typedef Tcl_Channel (TclOpenFileChannelProc_) _ANSI_ARGS_((Tcl_Interp *interp, | | | 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 | * Data structures related to obsolete filesystem hooks *---------------------------------------------------------------- */ typedef int (TclStatProc_) _ANSI_ARGS_((CONST char *path, struct stat *buf)); typedef int (TclAccessProc_) _ANSI_ARGS_((CONST char *path, int mode)); typedef Tcl_Channel (TclOpenFileChannelProc_) _ANSI_ARGS_((Tcl_Interp *interp, CONST char *fileName, CONST char *modeString, int permissions)); /* *---------------------------------------------------------------- * Data structures related to procedures *---------------------------------------------------------------- |
| ︙ | ︙ | |||
1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 | * Variables denoting the Tcl object types defined in the core. */ extern Tcl_ObjType tclBooleanType; extern Tcl_ObjType tclByteArrayType; extern Tcl_ObjType tclByteCodeType; extern Tcl_ObjType tclDoubleType; extern Tcl_ObjType tclIntType; extern Tcl_ObjType tclListType; extern Tcl_ObjType tclProcBodyType; extern Tcl_ObjType tclStringType; extern Tcl_ObjType tclArraySearchType; extern Tcl_ObjType tclIndexType; extern Tcl_ObjType tclNsNameType; | > | 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 | * Variables denoting the Tcl object types defined in the core. */ extern Tcl_ObjType tclBooleanType; extern Tcl_ObjType tclByteArrayType; extern Tcl_ObjType tclByteCodeType; extern Tcl_ObjType tclDoubleType; extern Tcl_ObjType tclEndOffsetType; extern Tcl_ObjType tclIntType; extern Tcl_ObjType tclListType; extern Tcl_ObjType tclProcBodyType; extern Tcl_ObjType tclStringType; extern Tcl_ObjType tclArraySearchType; extern Tcl_ObjType tclIndexType; extern Tcl_ObjType tclNsNameType; |
| ︙ | ︙ | |||
1621 1622 1623 1624 1625 1626 1627 | EXTERN int TclCleanupChildren _ANSI_ARGS_((Tcl_Interp *interp, int numPids, Tcl_Pid *pidPtr, Tcl_Channel errorChan)); EXTERN void TclCleanupCommand _ANSI_ARGS_((Command *cmdPtr)); EXTERN int TclCopyChannel _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Channel inChan, Tcl_Channel outChan, int toRead, Tcl_Obj *cmdPtr)); | < < < < < < < | 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 | EXTERN int TclCleanupChildren _ANSI_ARGS_((Tcl_Interp *interp, int numPids, Tcl_Pid *pidPtr, Tcl_Channel errorChan)); EXTERN void TclCleanupCommand _ANSI_ARGS_((Command *cmdPtr)); EXTERN int TclCopyChannel _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Channel inChan, Tcl_Channel outChan, int toRead, Tcl_Obj *cmdPtr)); EXTERN int TclCreateProc _ANSI_ARGS_((Tcl_Interp *interp, Namespace *nsPtr, CONST char *procName, Tcl_Obj *argsPtr, Tcl_Obj *bodyPtr, Proc **procPtrPtr)); EXTERN void TclDeleteCompiledLocalVars _ANSI_ARGS_(( Interp *iPtr, CallFrame *framePtr)); EXTERN void TclDeleteVars _ANSI_ARGS_((Interp *iPtr, |
| ︙ | ︙ | |||
1691 1692 1693 1694 1695 1696 1697 | EXTERN int TclGetNamespaceForQualName _ANSI_ARGS_(( Tcl_Interp *interp, CONST char *qualName, Namespace *cxtNsPtr, int flags, Namespace **nsPtrPtr, Namespace **altNsPtrPtr, Namespace **actualCxtPtrPtr, CONST char **simpleNamePtr)); EXTERN TclObjCmdProcType TclGetObjInterpProc _ANSI_ARGS_((void)); | < < < < | 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 | EXTERN int TclGetNamespaceForQualName _ANSI_ARGS_(( Tcl_Interp *interp, CONST char *qualName, Namespace *cxtNsPtr, int flags, Namespace **nsPtrPtr, Namespace **altNsPtrPtr, Namespace **actualCxtPtrPtr, CONST char **simpleNamePtr)); EXTERN TclObjCmdProcType TclGetObjInterpProc _ANSI_ARGS_((void)); EXTERN Tcl_Command TclGetOriginalCommand _ANSI_ARGS_(( Tcl_Command command)); EXTERN int TclGlob _ANSI_ARGS_((Tcl_Interp *interp, char *pattern, Tcl_Obj *unquotedPrefix, int globFlags, Tcl_GlobTypeData* types)); EXTERN int TclGlobalInvoke _ANSI_ARGS_((Tcl_Interp *interp, int argc, char **argv, int flags)); EXTERN int TclHideUnsafeCommands _ANSI_ARGS_(( Tcl_Interp *interp)); EXTERN int TclInExit _ANSI_ARGS_((void)); EXTERN Tcl_Obj * TclIncrElementOfIndexedArray _ANSI_ARGS_(( Tcl_Interp *interp, int localIndex, Tcl_Obj *elemPtr, long incrAmount)); EXTERN Tcl_Obj * TclIncrIndexedScalar _ANSI_ARGS_(( |
| ︙ | ︙ | |||
1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 | ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])); EXTERN int TclIsLocalScalar _ANSI_ARGS_((CONST char *src, int len)); EXTERN Proc * TclIsProc _ANSI_ARGS_((Command *cmdPtr)); EXTERN int TclJoinThread _ANSI_ARGS_((Tcl_ThreadId id, int* result)); EXTERN int TclMathInProgress _ANSI_ARGS_((void)); EXTERN Tcl_Obj * TclNewProcBodyObj _ANSI_ARGS_((Proc *procPtr)); EXTERN int TclObjCommandComplete _ANSI_ARGS_((Tcl_Obj *cmdPtr)); EXTERN int TclObjInterpProc _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])); EXTERN int TclObjInvoke _ANSI_ARGS_((Tcl_Interp *interp, | > > > > > > > > > > > > > > > > > > > | 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 | ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])); EXTERN int TclIsLocalScalar _ANSI_ARGS_((CONST char *src, int len)); EXTERN Proc * TclIsProc _ANSI_ARGS_((Command *cmdPtr)); EXTERN int TclJoinThread _ANSI_ARGS_((Tcl_ThreadId id, int* result)); EXTERN Tcl_Obj * TclLindexList _ANSI_ARGS_((Tcl_Interp* interp, Tcl_Obj* listPtr, Tcl_Obj* argPtr )); EXTERN Tcl_Obj * TclLindexFlat _ANSI_ARGS_((Tcl_Interp* interp, Tcl_Obj* listPtr, int indexCount, Tcl_Obj *CONST indexArray[] )); EXTERN Tcl_Obj * TclLsetList _ANSI_ARGS_((Tcl_Interp* interp, Tcl_Obj* listPtr, Tcl_Obj* indexPtr, Tcl_Obj* valuePtr )); EXTERN Tcl_Obj * TclLsetFlat _ANSI_ARGS_((Tcl_Interp* interp, Tcl_Obj* listPtr, int indexCount, Tcl_Obj *CONST indexArray[], Tcl_Obj* valuePtr )); EXTERN int TclMathInProgress _ANSI_ARGS_((void)); EXTERN Tcl_Obj * TclNewProcBodyObj _ANSI_ARGS_((Proc *procPtr)); EXTERN int TclObjCommandComplete _ANSI_ARGS_((Tcl_Obj *cmdPtr)); EXTERN int TclObjInterpProc _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])); EXTERN int TclObjInvoke _ANSI_ARGS_((Tcl_Interp *interp, |
| ︙ | ︙ | |||
1774 1775 1776 1777 1778 1779 1780 | EXTERN char * TclpFindExecutable _ANSI_ARGS_(( CONST char *argv0)); EXTERN int TclpFindVariable _ANSI_ARGS_((CONST char *name, int *lengthPtr)); EXTERN void TclpFree _ANSI_ARGS_((char *ptr)); EXTERN unsigned long TclpGetClicks _ANSI_ARGS_((void)); EXTERN Tcl_Channel TclpGetDefaultStdChannel _ANSI_ARGS_((int type)); | < < | 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 | EXTERN char * TclpFindExecutable _ANSI_ARGS_(( CONST char *argv0)); EXTERN int TclpFindVariable _ANSI_ARGS_((CONST char *name, int *lengthPtr)); EXTERN void TclpFree _ANSI_ARGS_((char *ptr)); EXTERN unsigned long TclpGetClicks _ANSI_ARGS_((void)); EXTERN Tcl_Channel TclpGetDefaultStdChannel _ANSI_ARGS_((int type)); EXTERN unsigned long TclpGetSeconds _ANSI_ARGS_((void)); EXTERN int TclpGetTimeZone _ANSI_ARGS_((unsigned long time)); EXTERN char * TclpGetUserHome _ANSI_ARGS_((CONST char *name, Tcl_DString *bufferPtr)); EXTERN int TclpHasSockets _ANSI_ARGS_((Tcl_Interp *interp)); EXTERN void TclpInitLibraryPath _ANSI_ARGS_((CONST char *argv0)); EXTERN void TclpInitLock _ANSI_ARGS_((void)); EXTERN void TclpInitPlatform _ANSI_ARGS_((void)); |
| ︙ | ︙ | |||
1820 1821 1822 1823 1824 1825 1826 | Tcl_Obj *destPathPtr)); EXTERN int TclpObjRemoveDirectory _ANSI_ARGS_((Tcl_Obj *pathPtr, int recursive, Tcl_Obj **errorPtr)); EXTERN int TclpObjRenameFile _ANSI_ARGS_((Tcl_Obj *srcPathPtr, Tcl_Obj *destPathPtr)); EXTERN int TclpMatchInDirectory _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *resultPtr, Tcl_Obj *pathPtr, | | | | 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 | Tcl_Obj *destPathPtr)); EXTERN int TclpObjRemoveDirectory _ANSI_ARGS_((Tcl_Obj *pathPtr, int recursive, Tcl_Obj **errorPtr)); EXTERN int TclpObjRenameFile _ANSI_ARGS_((Tcl_Obj *srcPathPtr, Tcl_Obj *destPathPtr)); EXTERN int TclpMatchInDirectory _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *resultPtr, Tcl_Obj *pathPtr, CONST char *pattern, Tcl_GlobTypeData *types)); EXTERN Tcl_Obj* TclpObjGetCwd _ANSI_ARGS_((Tcl_Interp *interp)); EXTERN Tcl_Obj* TclpObjLink _ANSI_ARGS_((Tcl_Obj *pathPtr, Tcl_Obj *toPtr)); EXTERN int TclpObjChdir _ANSI_ARGS_((Tcl_Obj *pathPtr)); EXTERN Tcl_Obj* TclFileDirname _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj*pathPtr)); EXTERN int TclpObjStat _ANSI_ARGS_((Tcl_Obj *pathPtr, struct stat *buf)); EXTERN Tcl_Channel TclpOpenFileChannel _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *pathPtr, CONST char *modeString, int permissions)); EXTERN void TclpPanic _ANSI_ARGS_(TCL_VARARGS(CONST char *, format)); EXTERN char * TclpReadlink _ANSI_ARGS_((CONST char *fileName, Tcl_DString *linkPtr)); EXTERN char * TclpRealloc _ANSI_ARGS_((char *ptr, unsigned int size)); |
| ︙ | ︙ | |||
1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 | Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])); EXTERN int Tcl_LrangeObjCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])); EXTERN int Tcl_LreplaceObjCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])); EXTERN int Tcl_LsearchObjCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])); EXTERN int Tcl_LsortObjCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])); EXTERN int Tcl_NamespaceObjCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])); EXTERN int Tcl_OpenObjCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])); EXTERN int Tcl_PackageObjCmd _ANSI_ARGS_((ClientData clientData, | > > | 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 |
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
EXTERN int Tcl_LrangeObjCmd _ANSI_ARGS_((ClientData clientData,
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
EXTERN int Tcl_LreplaceObjCmd _ANSI_ARGS_((ClientData clientData,
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
EXTERN int Tcl_LsearchObjCmd _ANSI_ARGS_((ClientData clientData,
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
EXTERN int Tcl_LsetObjCmd _ANSI_ARGS_((ClientData clientData,
Tcl_Interp* interp, int objc, Tcl_Obj *CONST objv[]));
EXTERN int Tcl_LsortObjCmd _ANSI_ARGS_((ClientData clientData,
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
EXTERN int Tcl_NamespaceObjCmd _ANSI_ARGS_((ClientData clientData,
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
EXTERN int Tcl_OpenObjCmd _ANSI_ARGS_((ClientData clientData,
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
EXTERN int Tcl_PackageObjCmd _ANSI_ARGS_((ClientData clientData,
|
| ︙ | ︙ | |||
2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 | Tcl_Parse *parsePtr, struct CompileEnv *envPtr)); EXTERN int TclCompileLindexCmd _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Parse *parsePtr, struct CompileEnv *envPtr)); EXTERN int TclCompileListCmd _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Parse *parsePtr, struct CompileEnv *envPtr)); EXTERN int TclCompileLlengthCmd _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Parse *parsePtr, struct CompileEnv *envPtr)); EXTERN int TclCompileReturnCmd _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Parse *parsePtr, struct CompileEnv *envPtr)); EXTERN int TclCompileSetCmd _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Parse *parsePtr, struct CompileEnv *envPtr)); EXTERN int TclCompileStringCmd _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Parse *parsePtr, struct CompileEnv *envPtr)); EXTERN int TclCompileWhileCmd _ANSI_ARGS_((Tcl_Interp *interp, | > > > > | 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 | Tcl_Parse *parsePtr, struct CompileEnv *envPtr)); EXTERN int TclCompileLindexCmd _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Parse *parsePtr, struct CompileEnv *envPtr)); EXTERN int TclCompileListCmd _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Parse *parsePtr, struct CompileEnv *envPtr)); EXTERN int TclCompileLlengthCmd _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Parse *parsePtr, struct CompileEnv *envPtr)); EXTERN int TclCompileLsetCmd _ANSI_ARGS_((Tcl_Interp* interp, Tcl_Parse* parsePtr, struct CompileEnv* envPtr)); EXTERN int TclCompileRegexpCmd _ANSI_ARGS_((Tcl_Interp* interp, Tcl_Parse* parsePtr, struct CompileEnv* envPtr)); EXTERN int TclCompileReturnCmd _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Parse *parsePtr, struct CompileEnv *envPtr)); EXTERN int TclCompileSetCmd _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Parse *parsePtr, struct CompileEnv *envPtr)); EXTERN int TclCompileStringCmd _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Parse *parsePtr, struct CompileEnv *envPtr)); EXTERN int TclCompileWhileCmd _ANSI_ARGS_((Tcl_Interp *interp, |
| ︙ | ︙ |
Changes to generic/tclIntDecls.h.
1 2 3 4 5 6 7 8 9 10 11 12 13 | /* * tclIntDecls.h -- * * This file contains the declarations for all unsupported * functions that are exported by the Tcl library. These * interfaces are not guaranteed to remain the same between * versions. Use at your own risk. * * Copyright (c) 1998-1999 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | /* * tclIntDecls.h -- * * This file contains the declarations for all unsupported * functions that are exported by the Tcl library. These * interfaces are not guaranteed to remain the same between * versions. Use at your own risk. * * Copyright (c) 1998-1999 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclIntDecls.h,v 1.29.2.3 2002/02/05 02:22:00 wolfsuit Exp $ */ #ifndef _TCLINTDECLS #define _TCLINTDECLS /* * WARNING: This file is automatically generated by the tools/genStubs.tcl |
| ︙ | ︙ | |||
59 60 61 62 63 64 65 | /* 8 */ EXTERN int TclCopyChannel _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Channel inChan, Tcl_Channel outChan, int toRead, Tcl_Obj * cmdPtr)); #if !(defined(__WIN32__) || defined(MAC_TCL) || defined(MAC_OSX_TK))/* UNIX */ /* 9 */ EXTERN int TclCreatePipeline _ANSI_ARGS_((Tcl_Interp * interp, | | | | 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | /* 8 */ EXTERN int TclCopyChannel _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Channel inChan, Tcl_Channel outChan, int toRead, Tcl_Obj * cmdPtr)); #if !(defined(__WIN32__) || defined(MAC_TCL) || defined(MAC_OSX_TK))/* UNIX */ /* 9 */ EXTERN int TclCreatePipeline _ANSI_ARGS_((Tcl_Interp * interp, int argc, CONST char ** argv, Tcl_Pid ** pidArrayPtr, TclFile * inPipePtr, TclFile * outPipePtr, TclFile * errFilePtr)); #endif /* UNIX */ #ifdef __WIN32__ /* 9 */ EXTERN int TclCreatePipeline _ANSI_ARGS_((Tcl_Interp * interp, int argc, CONST char ** argv, Tcl_Pid ** pidArrayPtr, TclFile * inPipePtr, TclFile * outPipePtr, TclFile * errFilePtr)); #endif /* __WIN32__ */ /* 10 */ EXTERN int TclCreateProc _ANSI_ARGS_((Tcl_Interp * interp, Namespace * nsPtr, CONST char * procName, Tcl_Obj * argsPtr, Tcl_Obj * bodyPtr, |
| ︙ | ︙ | |||
152 153 154 155 156 157 158 | Namespace ** altNsPtrPtr, Namespace ** actualCxtPtrPtr, CONST char ** simpleNamePtr)); /* 39 */ EXTERN TclObjCmdProcType TclGetObjInterpProc _ANSI_ARGS_((void)); /* 40 */ EXTERN int TclGetOpenMode _ANSI_ARGS_((Tcl_Interp * interp, | | | | | 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 | Namespace ** altNsPtrPtr, Namespace ** actualCxtPtrPtr, CONST char ** simpleNamePtr)); /* 39 */ EXTERN TclObjCmdProcType TclGetObjInterpProc _ANSI_ARGS_((void)); /* 40 */ EXTERN int TclGetOpenMode _ANSI_ARGS_((Tcl_Interp * interp, CONST char * str, int * seekFlagPtr)); /* 41 */ EXTERN Tcl_Command TclGetOriginalCommand _ANSI_ARGS_(( Tcl_Command command)); /* 42 */ EXTERN char * TclpGetUserHome _ANSI_ARGS_((CONST char * name, Tcl_DString * bufferPtr)); /* 43 */ EXTERN int TclGlobalInvoke _ANSI_ARGS_((Tcl_Interp * interp, int argc, char ** argv, int flags)); /* 44 */ EXTERN int TclGuessPackageName _ANSI_ARGS_(( CONST char * fileName, Tcl_DString * bufPtr)); /* 45 */ EXTERN int TclHideUnsafeCommands _ANSI_ARGS_(( Tcl_Interp * interp)); /* 46 */ EXTERN int TclInExit _ANSI_ARGS_((void)); /* 47 */ EXTERN Tcl_Obj * TclIncrElementOfIndexedArray _ANSI_ARGS_(( |
| ︙ | ︙ | |||
332 333 334 335 336 337 338 | /* 108 */ EXTERN void TclTeardownNamespace _ANSI_ARGS_((Namespace * nsPtr)); /* 109 */ EXTERN int TclUpdateReturnInfo _ANSI_ARGS_((Interp * iPtr)); /* Slot 110 is reserved */ /* 111 */ EXTERN void Tcl_AddInterpResolvers _ANSI_ARGS_(( | | | | | | | | | | | | 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 | /* 108 */ EXTERN void TclTeardownNamespace _ANSI_ARGS_((Namespace * nsPtr)); /* 109 */ EXTERN int TclUpdateReturnInfo _ANSI_ARGS_((Interp * iPtr)); /* Slot 110 is reserved */ /* 111 */ EXTERN void Tcl_AddInterpResolvers _ANSI_ARGS_(( Tcl_Interp * interp, CONST char * name, Tcl_ResolveCmdProc * cmdProc, Tcl_ResolveVarProc * varProc, Tcl_ResolveCompiledVarProc * compiledVarProc)); /* 112 */ EXTERN int Tcl_AppendExportList _ANSI_ARGS_(( Tcl_Interp * interp, Tcl_Namespace * nsPtr, Tcl_Obj * objPtr)); /* 113 */ EXTERN Tcl_Namespace * Tcl_CreateNamespace _ANSI_ARGS_((Tcl_Interp * interp, CONST char * name, ClientData clientData, Tcl_NamespaceDeleteProc * deleteProc)); /* 114 */ EXTERN void Tcl_DeleteNamespace _ANSI_ARGS_(( Tcl_Namespace * nsPtr)); /* 115 */ EXTERN int Tcl_Export _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Namespace * nsPtr, CONST char * pattern, int resetListFirst)); /* 116 */ EXTERN Tcl_Command Tcl_FindCommand _ANSI_ARGS_((Tcl_Interp * interp, CONST char * name, Tcl_Namespace * contextNsPtr, int flags)); /* 117 */ EXTERN Tcl_Namespace * Tcl_FindNamespace _ANSI_ARGS_((Tcl_Interp * interp, CONST char * name, Tcl_Namespace * contextNsPtr, int flags)); /* 118 */ EXTERN int Tcl_GetInterpResolvers _ANSI_ARGS_(( Tcl_Interp * interp, CONST char * name, Tcl_ResolverInfo * resInfo)); /* 119 */ EXTERN int Tcl_GetNamespaceResolvers _ANSI_ARGS_(( Tcl_Namespace * namespacePtr, Tcl_ResolverInfo * resInfo)); /* 120 */ EXTERN Tcl_Var Tcl_FindNamespaceVar _ANSI_ARGS_(( Tcl_Interp * interp, char * name, Tcl_Namespace * contextNsPtr, int flags)); /* 121 */ EXTERN int Tcl_ForgetImport _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Namespace * nsPtr, CONST char * pattern)); /* 122 */ EXTERN Tcl_Command Tcl_GetCommandFromObj _ANSI_ARGS_(( Tcl_Interp * interp, Tcl_Obj * objPtr)); /* 123 */ EXTERN void Tcl_GetCommandFullName _ANSI_ARGS_(( Tcl_Interp * interp, Tcl_Command command, Tcl_Obj * objPtr)); /* 124 */ EXTERN Tcl_Namespace * Tcl_GetCurrentNamespace _ANSI_ARGS_(( Tcl_Interp * interp)); /* 125 */ EXTERN Tcl_Namespace * Tcl_GetGlobalNamespace _ANSI_ARGS_(( Tcl_Interp * interp)); /* 126 */ EXTERN void Tcl_GetVariableFullName _ANSI_ARGS_(( Tcl_Interp * interp, Tcl_Var variable, Tcl_Obj * objPtr)); /* 127 */ EXTERN int Tcl_Import _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Namespace * nsPtr, CONST char * pattern, int allowOverwrite)); /* 128 */ EXTERN void Tcl_PopCallFrame _ANSI_ARGS_((Tcl_Interp* interp)); /* 129 */ EXTERN int Tcl_PushCallFrame _ANSI_ARGS_((Tcl_Interp* interp, Tcl_CallFrame * framePtr, Tcl_Namespace * nsPtr, int isProcCallFrame)); /* 130 */ EXTERN int Tcl_RemoveInterpResolvers _ANSI_ARGS_(( Tcl_Interp * interp, CONST char * name)); /* 131 */ EXTERN void Tcl_SetNamespaceResolvers _ANSI_ARGS_(( Tcl_Namespace * namespacePtr, Tcl_ResolveCmdProc * cmdProc, Tcl_ResolveVarProc * varProc, Tcl_ResolveCompiledVarProc * compiledVarProc)); /* 132 */ EXTERN int TclpHasSockets _ANSI_ARGS_((Tcl_Interp * interp)); /* 133 */ EXTERN struct tm * TclpGetDate _ANSI_ARGS_((TclpTime_t time, int useGMT)); /* 134 */ EXTERN size_t TclpStrftime _ANSI_ARGS_((char * s, size_t maxsize, CONST char * format, CONST struct tm * t)); /* 135 */ EXTERN int TclpCheckStackSpace _ANSI_ARGS_((void)); /* Slot 136 is reserved */ /* Slot 137 is reserved */ /* 138 */ EXTERN CONST char * TclGetEnv _ANSI_ARGS_((CONST char * name, Tcl_DString * valuePtr)); /* Slot 139 is reserved */ /* 140 */ EXTERN int TclLooksLikeInt _ANSI_ARGS_((CONST char * bytes, int length)); /* 141 */ EXTERN CONST char * TclpGetCwd _ANSI_ARGS_((Tcl_Interp * interp, Tcl_DString * cwdPtr)); /* 142 */ EXTERN int TclSetByteCodeFromAny _ANSI_ARGS_(( Tcl_Interp * interp, Tcl_Obj * objPtr, CompileHookProc * hookProc, ClientData clientData)); /* 143 */ |
| ︙ | ︙ | |||
467 468 469 470 471 472 473 | EXTERN void TclSetLibraryPath _ANSI_ARGS_((Tcl_Obj * pathPtr)); /* 153 */ EXTERN Tcl_Obj * TclGetLibraryPath _ANSI_ARGS_((void)); /* Slot 154 is reserved */ /* Slot 155 is reserved */ /* 156 */ EXTERN void TclRegError _ANSI_ARGS_((Tcl_Interp * interp, | | | | > > > > > > > > > > > > > | 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 |
EXTERN void TclSetLibraryPath _ANSI_ARGS_((Tcl_Obj * pathPtr));
/* 153 */
EXTERN Tcl_Obj * TclGetLibraryPath _ANSI_ARGS_((void));
/* Slot 154 is reserved */
/* Slot 155 is reserved */
/* 156 */
EXTERN void TclRegError _ANSI_ARGS_((Tcl_Interp * interp,
CONST char * msg, int status));
/* 157 */
EXTERN Var * TclVarTraceExists _ANSI_ARGS_((Tcl_Interp * interp,
char * varName));
/* 158 */
EXTERN void TclSetStartupScriptFileName _ANSI_ARGS_((
CONST char * filename));
/* 159 */
EXTERN CONST char * TclGetStartupScriptFileName _ANSI_ARGS_((void));
/* Slot 160 is reserved */
/* 161 */
EXTERN int TclChannelTransform _ANSI_ARGS_((Tcl_Interp * interp,
Tcl_Channel chan, Tcl_Obj * cmdObjPtr));
/* 162 */
EXTERN void TclChannelEventScriptInvoker _ANSI_ARGS_((
ClientData clientData, int flags));
/* 163 */
EXTERN void * TclGetInstructionTable _ANSI_ARGS_((void));
/* 164 */
EXTERN void TclExpandCodeArray _ANSI_ARGS_((void * envPtr));
/* 165 */
EXTERN void TclpSetInitialEncodings _ANSI_ARGS_((void));
/* 166 */
EXTERN int TclListObjSetElement _ANSI_ARGS_((Tcl_Interp* interp,
Tcl_Obj* listPtr, int index,
Tcl_Obj* valuePtr));
/* 167 */
EXTERN void TclSetStartupScriptPath _ANSI_ARGS_((
Tcl_Obj * pathPtr));
/* 168 */
EXTERN Tcl_Obj * TclGetStartupScriptPath _ANSI_ARGS_((void));
typedef struct TclIntStubs {
int magic;
struct TclIntStubHooks *hooks;
void *reserved0;
int (*tclAccessDeleteProc) _ANSI_ARGS_((TclAccessProc_ * proc)); /* 1 */
|
| ︙ | ︙ | |||
508 509 510 511 512 513 514 |
#ifdef MAC_TCL
void *reserved5;
#endif /* MAC_TCL */
void (*tclCleanupCommand) _ANSI_ARGS_((Command * cmdPtr)); /* 6 */
int (*tclCopyAndCollapse) _ANSI_ARGS_((int count, CONST char * src, char * dst)); /* 7 */
int (*tclCopyChannel) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Channel inChan, Tcl_Channel outChan, int toRead, Tcl_Obj * cmdPtr)); /* 8 */
#if !(defined(__WIN32__) || defined(MAC_TCL) || defined(MAC_OSX_TK))/* UNIX */
| | | | 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 |
#ifdef MAC_TCL
void *reserved5;
#endif /* MAC_TCL */
void (*tclCleanupCommand) _ANSI_ARGS_((Command * cmdPtr)); /* 6 */
int (*tclCopyAndCollapse) _ANSI_ARGS_((int count, CONST char * src, char * dst)); /* 7 */
int (*tclCopyChannel) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Channel inChan, Tcl_Channel outChan, int toRead, Tcl_Obj * cmdPtr)); /* 8 */
#if !(defined(__WIN32__) || defined(MAC_TCL) || defined(MAC_OSX_TK))/* UNIX */
int (*tclCreatePipeline) _ANSI_ARGS_((Tcl_Interp * interp, int argc, CONST char ** argv, Tcl_Pid ** pidArrayPtr, TclFile * inPipePtr, TclFile * outPipePtr, TclFile * errFilePtr)); /* 9 */
#endif /* UNIX */
#ifdef __WIN32__
int (*tclCreatePipeline) _ANSI_ARGS_((Tcl_Interp * interp, int argc, CONST char ** argv, Tcl_Pid ** pidArrayPtr, TclFile * inPipePtr, TclFile * outPipePtr, TclFile * errFilePtr)); /* 9 */
#endif /* __WIN32__ */
#ifdef MAC_TCL
void *reserved9;
#endif /* MAC_TCL */
int (*tclCreateProc) _ANSI_ARGS_((Tcl_Interp * interp, Namespace * nsPtr, CONST char * procName, Tcl_Obj * argsPtr, Tcl_Obj * bodyPtr, Proc ** procPtrPtr)); /* 10 */
void (*tclDeleteCompiledLocalVars) _ANSI_ARGS_((Interp * iPtr, CallFrame * framePtr)); /* 11 */
void (*tclDeleteVars) _ANSI_ARGS_((Interp * iPtr, Tcl_HashTable * tablePtr)); /* 12 */
|
| ︙ | ︙ | |||
546 547 548 549 550 551 552 |
TclCmdProcType (*tclGetInterpProc) _ANSI_ARGS_((void)); /* 33 */
int (*tclGetIntForIndex) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * objPtr, int endValue, int * indexPtr)); /* 34 */
Tcl_Obj * (*tclGetIndexedScalar) _ANSI_ARGS_((Tcl_Interp * interp, int localIndex, int flags)); /* 35 */
int (*tclGetLong) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * str, long * longPtr)); /* 36 */
int (*tclGetLoadedPackages) _ANSI_ARGS_((Tcl_Interp * interp, char * targetName)); /* 37 */
int (*tclGetNamespaceForQualName) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * qualName, Namespace * cxtNsPtr, int flags, Namespace ** nsPtrPtr, Namespace ** altNsPtrPtr, Namespace ** actualCxtPtrPtr, CONST char ** simpleNamePtr)); /* 38 */
TclObjCmdProcType (*tclGetObjInterpProc) _ANSI_ARGS_((void)); /* 39 */
| | | | 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 |
TclCmdProcType (*tclGetInterpProc) _ANSI_ARGS_((void)); /* 33 */
int (*tclGetIntForIndex) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * objPtr, int endValue, int * indexPtr)); /* 34 */
Tcl_Obj * (*tclGetIndexedScalar) _ANSI_ARGS_((Tcl_Interp * interp, int localIndex, int flags)); /* 35 */
int (*tclGetLong) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * str, long * longPtr)); /* 36 */
int (*tclGetLoadedPackages) _ANSI_ARGS_((Tcl_Interp * interp, char * targetName)); /* 37 */
int (*tclGetNamespaceForQualName) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * qualName, Namespace * cxtNsPtr, int flags, Namespace ** nsPtrPtr, Namespace ** altNsPtrPtr, Namespace ** actualCxtPtrPtr, CONST char ** simpleNamePtr)); /* 38 */
TclObjCmdProcType (*tclGetObjInterpProc) _ANSI_ARGS_((void)); /* 39 */
int (*tclGetOpenMode) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * str, int * seekFlagPtr)); /* 40 */
Tcl_Command (*tclGetOriginalCommand) _ANSI_ARGS_((Tcl_Command command)); /* 41 */
char * (*tclpGetUserHome) _ANSI_ARGS_((CONST char * name, Tcl_DString * bufferPtr)); /* 42 */
int (*tclGlobalInvoke) _ANSI_ARGS_((Tcl_Interp * interp, int argc, char ** argv, int flags)); /* 43 */
int (*tclGuessPackageName) _ANSI_ARGS_((CONST char * fileName, Tcl_DString * bufPtr)); /* 44 */
int (*tclHideUnsafeCommands) _ANSI_ARGS_((Tcl_Interp * interp)); /* 45 */
int (*tclInExit) _ANSI_ARGS_((void)); /* 46 */
Tcl_Obj * (*tclIncrElementOfIndexedArray) _ANSI_ARGS_((Tcl_Interp * interp, int localIndex, Tcl_Obj * elemPtr, long incrAmount)); /* 47 */
Tcl_Obj * (*tclIncrIndexedScalar) _ANSI_ARGS_((Tcl_Interp * interp, int localIndex, long incrAmount)); /* 48 */
Tcl_Obj * (*tclIncrVar2) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * part1Ptr, Tcl_Obj * part2Ptr, long incrAmount, int part1NotParsed)); /* 49 */
void (*tclInitCompiledLocals) _ANSI_ARGS_((Tcl_Interp * interp, CallFrame * framePtr, Namespace * nsPtr)); /* 50 */
int (*tclInterpInit) _ANSI_ARGS_((Tcl_Interp * interp)); /* 51 */
|
| ︙ | ︙ | |||
633 634 635 636 637 638 639 |
#endif /* MAC_TCL */
void *reserved105;
int (*tclStatDeleteProc) _ANSI_ARGS_((TclStatProc_ * proc)); /* 106 */
int (*tclStatInsertProc) _ANSI_ARGS_((TclStatProc_ * proc)); /* 107 */
void (*tclTeardownNamespace) _ANSI_ARGS_((Namespace * nsPtr)); /* 108 */
int (*tclUpdateReturnInfo) _ANSI_ARGS_((Interp * iPtr)); /* 109 */
void *reserved110;
| | | | | | | | | | | | | > > | > > > | 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 |
#endif /* MAC_TCL */
void *reserved105;
int (*tclStatDeleteProc) _ANSI_ARGS_((TclStatProc_ * proc)); /* 106 */
int (*tclStatInsertProc) _ANSI_ARGS_((TclStatProc_ * proc)); /* 107 */
void (*tclTeardownNamespace) _ANSI_ARGS_((Namespace * nsPtr)); /* 108 */
int (*tclUpdateReturnInfo) _ANSI_ARGS_((Interp * iPtr)); /* 109 */
void *reserved110;
void (*tcl_AddInterpResolvers) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * name, Tcl_ResolveCmdProc * cmdProc, Tcl_ResolveVarProc * varProc, Tcl_ResolveCompiledVarProc * compiledVarProc)); /* 111 */
int (*tcl_AppendExportList) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Namespace * nsPtr, Tcl_Obj * objPtr)); /* 112 */
Tcl_Namespace * (*tcl_CreateNamespace) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * name, ClientData clientData, Tcl_NamespaceDeleteProc * deleteProc)); /* 113 */
void (*tcl_DeleteNamespace) _ANSI_ARGS_((Tcl_Namespace * nsPtr)); /* 114 */
int (*tcl_Export) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Namespace * nsPtr, CONST char * pattern, int resetListFirst)); /* 115 */
Tcl_Command (*tcl_FindCommand) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * name, Tcl_Namespace * contextNsPtr, int flags)); /* 116 */
Tcl_Namespace * (*tcl_FindNamespace) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * name, Tcl_Namespace * contextNsPtr, int flags)); /* 117 */
int (*tcl_GetInterpResolvers) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * name, Tcl_ResolverInfo * resInfo)); /* 118 */
int (*tcl_GetNamespaceResolvers) _ANSI_ARGS_((Tcl_Namespace * namespacePtr, Tcl_ResolverInfo * resInfo)); /* 119 */
Tcl_Var (*tcl_FindNamespaceVar) _ANSI_ARGS_((Tcl_Interp * interp, char * name, Tcl_Namespace * contextNsPtr, int flags)); /* 120 */
int (*tcl_ForgetImport) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Namespace * nsPtr, CONST char * pattern)); /* 121 */
Tcl_Command (*tcl_GetCommandFromObj) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * objPtr)); /* 122 */
void (*tcl_GetCommandFullName) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Command command, Tcl_Obj * objPtr)); /* 123 */
Tcl_Namespace * (*tcl_GetCurrentNamespace) _ANSI_ARGS_((Tcl_Interp * interp)); /* 124 */
Tcl_Namespace * (*tcl_GetGlobalNamespace) _ANSI_ARGS_((Tcl_Interp * interp)); /* 125 */
void (*tcl_GetVariableFullName) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Var variable, Tcl_Obj * objPtr)); /* 126 */
int (*tcl_Import) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Namespace * nsPtr, CONST char * pattern, int allowOverwrite)); /* 127 */
void (*tcl_PopCallFrame) _ANSI_ARGS_((Tcl_Interp* interp)); /* 128 */
int (*tcl_PushCallFrame) _ANSI_ARGS_((Tcl_Interp* interp, Tcl_CallFrame * framePtr, Tcl_Namespace * nsPtr, int isProcCallFrame)); /* 129 */
int (*tcl_RemoveInterpResolvers) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * name)); /* 130 */
void (*tcl_SetNamespaceResolvers) _ANSI_ARGS_((Tcl_Namespace * namespacePtr, Tcl_ResolveCmdProc * cmdProc, Tcl_ResolveVarProc * varProc, Tcl_ResolveCompiledVarProc * compiledVarProc)); /* 131 */
int (*tclpHasSockets) _ANSI_ARGS_((Tcl_Interp * interp)); /* 132 */
struct tm * (*tclpGetDate) _ANSI_ARGS_((TclpTime_t time, int useGMT)); /* 133 */
size_t (*tclpStrftime) _ANSI_ARGS_((char * s, size_t maxsize, CONST char * format, CONST struct tm * t)); /* 134 */
int (*tclpCheckStackSpace) _ANSI_ARGS_((void)); /* 135 */
void *reserved136;
void *reserved137;
CONST char * (*tclGetEnv) _ANSI_ARGS_((CONST char * name, Tcl_DString * valuePtr)); /* 138 */
void *reserved139;
int (*tclLooksLikeInt) _ANSI_ARGS_((CONST char * bytes, int length)); /* 140 */
CONST char * (*tclpGetCwd) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_DString * cwdPtr)); /* 141 */
int (*tclSetByteCodeFromAny) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * objPtr, CompileHookProc * hookProc, ClientData clientData)); /* 142 */
int (*tclAddLiteralObj) _ANSI_ARGS_((struct CompileEnv * envPtr, Tcl_Obj * objPtr, LiteralEntry ** litPtrPtr)); /* 143 */
void (*tclHideLiteral) _ANSI_ARGS_((Tcl_Interp * interp, struct CompileEnv * envPtr, int index)); /* 144 */
struct AuxDataType * (*tclGetAuxDataType) _ANSI_ARGS_((char * typeName)); /* 145 */
TclHandle (*tclHandleCreate) _ANSI_ARGS_((VOID * ptr)); /* 146 */
void (*tclHandleFree) _ANSI_ARGS_((TclHandle handle)); /* 147 */
TclHandle (*tclHandlePreserve) _ANSI_ARGS_((TclHandle handle)); /* 148 */
void (*tclHandleRelease) _ANSI_ARGS_((TclHandle handle)); /* 149 */
int (*tclRegAbout) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_RegExp re)); /* 150 */
void (*tclRegExpRangeUniChar) _ANSI_ARGS_((Tcl_RegExp re, int index, int * startPtr, int * endPtr)); /* 151 */
void (*tclSetLibraryPath) _ANSI_ARGS_((Tcl_Obj * pathPtr)); /* 152 */
Tcl_Obj * (*tclGetLibraryPath) _ANSI_ARGS_((void)); /* 153 */
void *reserved154;
void *reserved155;
void (*tclRegError) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * msg, int status)); /* 156 */
Var * (*tclVarTraceExists) _ANSI_ARGS_((Tcl_Interp * interp, char * varName)); /* 157 */
void (*tclSetStartupScriptFileName) _ANSI_ARGS_((CONST char * filename)); /* 158 */
CONST char * (*tclGetStartupScriptFileName) _ANSI_ARGS_((void)); /* 159 */
void *reserved160;
int (*tclChannelTransform) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Channel chan, Tcl_Obj * cmdObjPtr)); /* 161 */
void (*tclChannelEventScriptInvoker) _ANSI_ARGS_((ClientData clientData, int flags)); /* 162 */
void * (*tclGetInstructionTable) _ANSI_ARGS_((void)); /* 163 */
void (*tclExpandCodeArray) _ANSI_ARGS_((void * envPtr)); /* 164 */
void (*tclpSetInitialEncodings) _ANSI_ARGS_((void)); /* 165 */
int (*tclListObjSetElement) _ANSI_ARGS_((Tcl_Interp* interp, Tcl_Obj* listPtr, int index, Tcl_Obj* valuePtr)); /* 166 */
void (*tclSetStartupScriptPath) _ANSI_ARGS_((Tcl_Obj * pathPtr)); /* 167 */
Tcl_Obj * (*tclGetStartupScriptPath) _ANSI_ARGS_((void)); /* 168 */
} TclIntStubs;
#ifdef __cplusplus
extern "C" {
#endif
extern TclIntStubs *tclIntStubsPtr;
#ifdef __cplusplus
|
| ︙ | ︙ | |||
1278 1279 1280 1281 1282 1283 1284 1285 1286 | #define TclChannelTransform \ (tclIntStubsPtr->tclChannelTransform) /* 161 */ #endif #ifndef TclChannelEventScriptInvoker #define TclChannelEventScriptInvoker \ (tclIntStubsPtr->tclChannelEventScriptInvoker) /* 162 */ #endif #ifndef TclpSetInitialEncodings #define TclpSetInitialEncodings \ | > > > > > > > > | > > > > > > > > > > > > | 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 | #define TclChannelTransform \ (tclIntStubsPtr->tclChannelTransform) /* 161 */ #endif #ifndef TclChannelEventScriptInvoker #define TclChannelEventScriptInvoker \ (tclIntStubsPtr->tclChannelEventScriptInvoker) /* 162 */ #endif #ifndef TclGetInstructionTable #define TclGetInstructionTable \ (tclIntStubsPtr->tclGetInstructionTable) /* 163 */ #endif #ifndef TclExpandCodeArray #define TclExpandCodeArray \ (tclIntStubsPtr->tclExpandCodeArray) /* 164 */ #endif #ifndef TclpSetInitialEncodings #define TclpSetInitialEncodings \ (tclIntStubsPtr->tclpSetInitialEncodings) /* 165 */ #endif #ifndef TclListObjSetElement #define TclListObjSetElement \ (tclIntStubsPtr->tclListObjSetElement) /* 166 */ #endif #ifndef TclSetStartupScriptPath #define TclSetStartupScriptPath \ (tclIntStubsPtr->tclSetStartupScriptPath) /* 167 */ #endif #ifndef TclGetStartupScriptPath #define TclGetStartupScriptPath \ (tclIntStubsPtr->tclGetStartupScriptPath) /* 168 */ #endif #endif /* defined(USE_TCL_STUBS) && !defined(USE_TCL_STUB_PROCS) */ /* !END!: Do not edit above this line. */ #endif /* _TCLINTDECLS */ |
Changes to generic/tclIntPlatDecls.h.
1 2 3 4 5 6 7 8 9 10 11 | /* * tclIntPlatDecls.h -- * * This file contains the declarations for all platform dependent * unsupported functions that are exported by the Tcl library. These * interfaces are not guaranteed to remain the same between * versions. Use at your own risk. * * Copyright (c) 1998-1999 by Scriptics Corporation. * All rights reserved. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | /* * tclIntPlatDecls.h -- * * This file contains the declarations for all platform dependent * unsupported functions that are exported by the Tcl library. These * interfaces are not guaranteed to remain the same between * versions. Use at your own risk. * * Copyright (c) 1998-1999 by Scriptics Corporation. * All rights reserved. * * RCS: @(#) $Id: tclIntPlatDecls.h,v 1.12.6.2 2002/02/05 02:22:00 wolfsuit Exp $ */ #ifndef _TCLINTPLATDECLS #define _TCLINTPLATDECLS /* * WARNING: This file is automatically generated by the tools/genStubs.tcl |
| ︙ | ︙ | |||
39 40 41 42 43 44 45 | TclFile errorFile, int numPids, Tcl_Pid * pidPtr)); /* 3 */ EXTERN int TclpCreatePipe _ANSI_ARGS_((TclFile * readPipe, TclFile * writePipe)); /* 4 */ EXTERN int TclpCreateProcess _ANSI_ARGS_((Tcl_Interp * interp, | | | | | 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | TclFile errorFile, int numPids, Tcl_Pid * pidPtr)); /* 3 */ EXTERN int TclpCreatePipe _ANSI_ARGS_((TclFile * readPipe, TclFile * writePipe)); /* 4 */ EXTERN int TclpCreateProcess _ANSI_ARGS_((Tcl_Interp * interp, int argc, CONST char ** argv, TclFile inputFile, TclFile outputFile, TclFile errorFile, Tcl_Pid * pidPtr)); /* Slot 5 is reserved */ /* 6 */ EXTERN TclFile TclpMakeFile _ANSI_ARGS_((Tcl_Channel channel, int direction)); /* 7 */ EXTERN TclFile TclpOpenFile _ANSI_ARGS_((CONST char * fname, int mode)); |
| ︙ | ︙ | |||
97 98 99 100 101 102 103 | TclFile errorFile, int numPids, Tcl_Pid * pidPtr)); /* 14 */ EXTERN int TclpCreatePipe _ANSI_ARGS_((TclFile * readPipe, TclFile * writePipe)); /* 15 */ EXTERN int TclpCreateProcess _ANSI_ARGS_((Tcl_Interp * interp, | | | | | 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | TclFile errorFile, int numPids, Tcl_Pid * pidPtr)); /* 14 */ EXTERN int TclpCreatePipe _ANSI_ARGS_((TclFile * readPipe, TclFile * writePipe)); /* 15 */ EXTERN int TclpCreateProcess _ANSI_ARGS_((Tcl_Interp * interp, int argc, CONST char ** argv, TclFile inputFile, TclFile outputFile, TclFile errorFile, Tcl_Pid * pidPtr)); /* Slot 16 is reserved */ /* Slot 17 is reserved */ /* 18 */ EXTERN TclFile TclpMakeFile _ANSI_ARGS_((Tcl_Channel channel, int direction)); /* 19 */ EXTERN TclFile TclpOpenFile _ANSI_ARGS_((CONST char * fname, |
| ︙ | ︙ | |||
145 146 147 148 149 150 151 | /* 5 */ EXTERN int FSpSetDefaultDir _ANSI_ARGS_((FSSpecPtr theSpec)); /* 6 */ EXTERN OSErr FSpFindFolder _ANSI_ARGS_((short vRefNum, OSType folderType, Boolean createFolder, FSSpec * spec)); /* 7 */ | | | > | | | | 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 | /* 5 */ EXTERN int FSpSetDefaultDir _ANSI_ARGS_((FSSpecPtr theSpec)); /* 6 */ EXTERN OSErr FSpFindFolder _ANSI_ARGS_((short vRefNum, OSType folderType, Boolean createFolder, FSSpec * spec)); /* 7 */ EXTERN void GetGlobalMouseTcl _ANSI_ARGS_((Point * mouse)); /* 8 */ EXTERN pascal OSErr FSpGetDirectoryIDTcl _ANSI_ARGS_(( CONST FSSpec * spec, long * theDirID, Boolean * isDirectory)); /* 9 */ EXTERN pascal short FSpOpenResFileCompatTcl _ANSI_ARGS_(( CONST FSSpec * spec, SignedByte permission)); /* 10 */ EXTERN pascal void FSpCreateResFileCompatTcl _ANSI_ARGS_(( CONST FSSpec * spec, OSType creator, OSType fileType, ScriptCode scriptTag)); /* 11 */ EXTERN int FSpLocationFromPath _ANSI_ARGS_((int length, CONST char * path, FSSpecPtr theSpec)); /* 12 */ EXTERN OSErr FSpPathFromLocation _ANSI_ARGS_((FSSpecPtr theSpec, |
| ︙ | ︙ | |||
189 190 191 192 193 194 195 | EXTERN short TclMacUnRegisterResourceFork _ANSI_ARGS_(( char * tokenPtr, Tcl_Obj * resultPtr)); /* 22 */ EXTERN int TclMacCreateEnv _ANSI_ARGS_((void)); /* 23 */ EXTERN FILE * TclMacFOpenHack _ANSI_ARGS_((CONST char * path, CONST char * mode)); | | > | | | 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 |
EXTERN short TclMacUnRegisterResourceFork _ANSI_ARGS_((
char * tokenPtr, Tcl_Obj * resultPtr));
/* 22 */
EXTERN int TclMacCreateEnv _ANSI_ARGS_((void));
/* 23 */
EXTERN FILE * TclMacFOpenHack _ANSI_ARGS_((CONST char * path,
CONST char * mode));
/* 24 */
EXTERN char * TclpGetTZName _ANSI_ARGS_((int isdst));
/* 25 */
EXTERN int TclMacChmod _ANSI_ARGS_((CONST char * path, int mode));
#endif /* MAC_TCL */
typedef struct TclIntPlatStubs {
int magic;
struct TclIntPlatStubHooks *hooks;
#if !(defined(__WIN32__) || defined(MAC_TCL) || defined(MAC_OSX_TK))/* UNIX */
void (*tclGetAndDetachPids) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Channel chan)); /* 0 */
int (*tclpCloseFile) _ANSI_ARGS_((TclFile file)); /* 1 */
Tcl_Channel (*tclpCreateCommandChannel) _ANSI_ARGS_((TclFile readFile, TclFile writeFile, TclFile errorFile, int numPids, Tcl_Pid * pidPtr)); /* 2 */
int (*tclpCreatePipe) _ANSI_ARGS_((TclFile * readPipe, TclFile * writePipe)); /* 3 */
int (*tclpCreateProcess) _ANSI_ARGS_((Tcl_Interp * interp, int argc, CONST char ** argv, TclFile inputFile, TclFile outputFile, TclFile errorFile, Tcl_Pid * pidPtr)); /* 4 */
void *reserved5;
TclFile (*tclpMakeFile) _ANSI_ARGS_((Tcl_Channel channel, int direction)); /* 6 */
TclFile (*tclpOpenFile) _ANSI_ARGS_((CONST char * fname, int mode)); /* 7 */
int (*tclUnixWaitForFile) _ANSI_ARGS_((int fd, int mask, int timeout)); /* 8 */
TclFile (*tclpCreateTempFile) _ANSI_ARGS_((CONST char * contents)); /* 9 */
#endif /* UNIX */
#ifdef __WIN32__
|
| ︙ | ︙ | |||
226 227 228 229 230 231 232 |
unsigned long (*tclpGetPid) _ANSI_ARGS_((Tcl_Pid pid)); /* 8 */
int (*tclWinGetPlatformId) _ANSI_ARGS_((void)); /* 9 */
void *reserved10;
void (*tclGetAndDetachPids) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Channel chan)); /* 11 */
int (*tclpCloseFile) _ANSI_ARGS_((TclFile file)); /* 12 */
Tcl_Channel (*tclpCreateCommandChannel) _ANSI_ARGS_((TclFile readFile, TclFile writeFile, TclFile errorFile, int numPids, Tcl_Pid * pidPtr)); /* 13 */
int (*tclpCreatePipe) _ANSI_ARGS_((TclFile * readPipe, TclFile * writePipe)); /* 14 */
| | | 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 |
unsigned long (*tclpGetPid) _ANSI_ARGS_((Tcl_Pid pid)); /* 8 */
int (*tclWinGetPlatformId) _ANSI_ARGS_((void)); /* 9 */
void *reserved10;
void (*tclGetAndDetachPids) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Channel chan)); /* 11 */
int (*tclpCloseFile) _ANSI_ARGS_((TclFile file)); /* 12 */
Tcl_Channel (*tclpCreateCommandChannel) _ANSI_ARGS_((TclFile readFile, TclFile writeFile, TclFile errorFile, int numPids, Tcl_Pid * pidPtr)); /* 13 */
int (*tclpCreatePipe) _ANSI_ARGS_((TclFile * readPipe, TclFile * writePipe)); /* 14 */
int (*tclpCreateProcess) _ANSI_ARGS_((Tcl_Interp * interp, int argc, CONST char ** argv, TclFile inputFile, TclFile outputFile, TclFile errorFile, Tcl_Pid * pidPtr)); /* 15 */
void *reserved16;
void *reserved17;
TclFile (*tclpMakeFile) _ANSI_ARGS_((Tcl_Channel channel, int direction)); /* 18 */
TclFile (*tclpOpenFile) _ANSI_ARGS_((CONST char * fname, int mode)); /* 19 */
void (*tclWinAddProcess) _ANSI_ARGS_((HANDLE hProcess, DWORD id)); /* 20 */
void *reserved21;
TclFile (*tclpCreateTempFile) _ANSI_ARGS_((CONST char * contents)); /* 22 */
|
| ︙ | ︙ | |||
248 249 250 251 252 253 254 |
VOID * (*tclpSysAlloc) _ANSI_ARGS_((long size, int isBin)); /* 0 */
void (*tclpSysFree) _ANSI_ARGS_((VOID * ptr)); /* 1 */
VOID * (*tclpSysRealloc) _ANSI_ARGS_((VOID * cp, unsigned int size)); /* 2 */
void (*tclpExit) _ANSI_ARGS_((int status)); /* 3 */
int (*fSpGetDefaultDir) _ANSI_ARGS_((FSSpecPtr theSpec)); /* 4 */
int (*fSpSetDefaultDir) _ANSI_ARGS_((FSSpecPtr theSpec)); /* 5 */
OSErr (*fSpFindFolder) _ANSI_ARGS_((short vRefNum, OSType folderType, Boolean createFolder, FSSpec * spec)); /* 6 */
| | | | | | | | 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 |
VOID * (*tclpSysAlloc) _ANSI_ARGS_((long size, int isBin)); /* 0 */
void (*tclpSysFree) _ANSI_ARGS_((VOID * ptr)); /* 1 */
VOID * (*tclpSysRealloc) _ANSI_ARGS_((VOID * cp, unsigned int size)); /* 2 */
void (*tclpExit) _ANSI_ARGS_((int status)); /* 3 */
int (*fSpGetDefaultDir) _ANSI_ARGS_((FSSpecPtr theSpec)); /* 4 */
int (*fSpSetDefaultDir) _ANSI_ARGS_((FSSpecPtr theSpec)); /* 5 */
OSErr (*fSpFindFolder) _ANSI_ARGS_((short vRefNum, OSType folderType, Boolean createFolder, FSSpec * spec)); /* 6 */
void (*getGlobalMouseTcl) _ANSI_ARGS_((Point * mouse)); /* 7 */
pascal OSErr (*fSpGetDirectoryIDTcl) _ANSI_ARGS_((CONST FSSpec * spec, long * theDirID, Boolean * isDirectory)); /* 8 */
pascal short (*fSpOpenResFileCompatTcl) _ANSI_ARGS_((CONST FSSpec * spec, SignedByte permission)); /* 9 */
pascal void (*fSpCreateResFileCompatTcl) _ANSI_ARGS_((CONST FSSpec * spec, OSType creator, OSType fileType, ScriptCode scriptTag)); /* 10 */
int (*fSpLocationFromPath) _ANSI_ARGS_((int length, CONST char * path, FSSpecPtr theSpec)); /* 11 */
OSErr (*fSpPathFromLocation) _ANSI_ARGS_((FSSpecPtr theSpec, int * length, Handle * fullPath)); /* 12 */
void (*tclMacExitHandler) _ANSI_ARGS_((void)); /* 13 */
void (*tclMacInitExitToShell) _ANSI_ARGS_((int usePatch)); /* 14 */
OSErr (*tclMacInstallExitToShellPatch) _ANSI_ARGS_((ExitToShellProcPtr newProc)); /* 15 */
int (*tclMacOSErrorToPosixError) _ANSI_ARGS_((int error)); /* 16 */
void (*tclMacRemoveTimer) _ANSI_ARGS_((void * timerToken)); /* 17 */
void * (*tclMacStartTimer) _ANSI_ARGS_((long ms)); /* 18 */
int (*tclMacTimerExpired) _ANSI_ARGS_((void * timerToken)); /* 19 */
int (*tclMacRegisterResourceFork) _ANSI_ARGS_((short fileRef, Tcl_Obj * tokenPtr, int insert)); /* 20 */
short (*tclMacUnRegisterResourceFork) _ANSI_ARGS_((char * tokenPtr, Tcl_Obj * resultPtr)); /* 21 */
int (*tclMacCreateEnv) _ANSI_ARGS_((void)); /* 22 */
FILE * (*tclMacFOpenHack) _ANSI_ARGS_((CONST char * path, CONST char * mode)); /* 23 */
char * (*tclpGetTZName) _ANSI_ARGS_((int isdst)); /* 24 */
int (*tclMacChmod) _ANSI_ARGS_((CONST char * path, int mode)); /* 25 */
#endif /* MAC_TCL */
} TclIntPlatStubs;
#ifdef __cplusplus
extern "C" {
#endif
extern TclIntPlatStubs *tclIntPlatStubsPtr;
|
| ︙ | ︙ | |||
451 452 453 454 455 456 457 | #define FSpSetDefaultDir \ (tclIntPlatStubsPtr->fSpSetDefaultDir) /* 5 */ #endif #ifndef FSpFindFolder #define FSpFindFolder \ (tclIntPlatStubsPtr->fSpFindFolder) /* 6 */ #endif | | | | | | | | | | | | | | 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 | #define FSpSetDefaultDir \ (tclIntPlatStubsPtr->fSpSetDefaultDir) /* 5 */ #endif #ifndef FSpFindFolder #define FSpFindFolder \ (tclIntPlatStubsPtr->fSpFindFolder) /* 6 */ #endif #ifndef GetGlobalMouseTcl #define GetGlobalMouseTcl \ (tclIntPlatStubsPtr->getGlobalMouseTcl) /* 7 */ #endif #ifndef FSpGetDirectoryIDTcl #define FSpGetDirectoryIDTcl \ (tclIntPlatStubsPtr->fSpGetDirectoryIDTcl) /* 8 */ #endif #ifndef FSpOpenResFileCompatTcl #define FSpOpenResFileCompatTcl \ (tclIntPlatStubsPtr->fSpOpenResFileCompatTcl) /* 9 */ #endif #ifndef FSpCreateResFileCompatTcl #define FSpCreateResFileCompatTcl \ (tclIntPlatStubsPtr->fSpCreateResFileCompatTcl) /* 10 */ #endif #ifndef FSpLocationFromPath #define FSpLocationFromPath \ (tclIntPlatStubsPtr->fSpLocationFromPath) /* 11 */ #endif #ifndef FSpPathFromLocation #define FSpPathFromLocation \ |
| ︙ | ︙ | |||
519 520 521 522 523 524 525 | #define TclMacCreateEnv \ (tclIntPlatStubsPtr->tclMacCreateEnv) /* 22 */ #endif #ifndef TclMacFOpenHack #define TclMacFOpenHack \ (tclIntPlatStubsPtr->tclMacFOpenHack) /* 23 */ #endif | | > > > | 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 | #define TclMacCreateEnv \ (tclIntPlatStubsPtr->tclMacCreateEnv) /* 22 */ #endif #ifndef TclMacFOpenHack #define TclMacFOpenHack \ (tclIntPlatStubsPtr->tclMacFOpenHack) /* 23 */ #endif #ifndef TclpGetTZName #define TclpGetTZName \ (tclIntPlatStubsPtr->tclpGetTZName) /* 24 */ #endif #ifndef TclMacChmod #define TclMacChmod \ (tclIntPlatStubsPtr->tclMacChmod) /* 25 */ #endif #endif /* MAC_TCL */ #endif /* defined(USE_TCL_STUBS) && !defined(USE_TCL_STUB_PROCS) */ /* !END!: Do not edit above this line. */ #endif /* _TCLINTPLATDECLS */ |
Changes to generic/tclInterp.c.
1 2 3 4 5 6 7 8 9 10 11 | /* * tclInterp.c -- * * This file implements the "interp" command which allows creation * and manipulation of Tcl interpreters from within Tcl scripts. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | /* * tclInterp.c -- * * This file implements the "interp" command which allows creation * and manipulation of Tcl interpreters from within Tcl scripts. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclInterp.c,v 1.7.6.1 2002/02/05 02:22:00 wolfsuit Exp $ */ #include <stdio.h> #include "tclInt.h" #include "tclPort.h" /* |
| ︙ | ︙ | |||
343 344 345 346 347 348 349 |
Tcl_InterpObjCmd(clientData, interp, objc, objv)
ClientData clientData; /* Unused. */
Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
int index;
| | | 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 |
Tcl_InterpObjCmd(clientData, interp, objc, objv)
ClientData clientData; /* Unused. */
Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
int index;
static CONST char *options[] = {
"alias", "aliases", "create", "delete",
"eval", "exists", "expose", "hide",
"hidden", "issafe", "invokehidden", "marktrusted",
"slaves", "share", "target", "transfer",
NULL
};
enum option {
|
| ︙ | ︙ | |||
415 416 417 418 419 420 421 |
}
return AliasList(interp, slaveInterp);
}
case OPT_CREATE: {
int i, last, safe;
Tcl_Obj *slavePtr;
char buf[16 + TCL_INTEGER_SPACE];
| | | 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 |
}
return AliasList(interp, slaveInterp);
}
case OPT_CREATE: {
int i, last, safe;
Tcl_Obj *slavePtr;
char buf[16 + TCL_INTEGER_SPACE];
static CONST char *options[] = {
"-safe", "--", NULL
};
enum option {
OPT_SAFE, OPT_LAST
};
safe = Tcl_IsSafe(interp);
|
| ︙ | ︙ | |||
578 579 580 581 582 583 584 |
}
Tcl_SetIntObj(Tcl_GetObjResult(interp), Tcl_IsSafe(slaveInterp));
return TCL_OK;
}
case OPT_INVOKEHID: {
int i, index, global;
Tcl_Interp *slaveInterp;
| | | 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 |
}
Tcl_SetIntObj(Tcl_GetObjResult(interp), Tcl_IsSafe(slaveInterp));
return TCL_OK;
}
case OPT_INVOKEHID: {
int i, index, global;
Tcl_Interp *slaveInterp;
static CONST char *hiddenOptions[] = {
"-global", "--", NULL
};
enum hiddenOption {
OPT_GLOBAL, OPT_LAST
};
global = 0;
|
| ︙ | ︙ | |||
804 805 806 807 808 809 810 |
*
*----------------------------------------------------------------------
*/
int
Tcl_CreateAlias(slaveInterp, slaveCmd, targetInterp, targetCmd, argc, argv)
Tcl_Interp *slaveInterp; /* Interpreter for source command. */
| | | | | 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 |
*
*----------------------------------------------------------------------
*/
int
Tcl_CreateAlias(slaveInterp, slaveCmd, targetInterp, targetCmd, argc, argv)
Tcl_Interp *slaveInterp; /* Interpreter for source command. */
CONST char *slaveCmd; /* Command to install in slave. */
Tcl_Interp *targetInterp; /* Interpreter for target command. */
CONST char *targetCmd; /* Name of target command. */
int argc; /* How many additional arguments? */
char * CONST *argv; /* These are the additional args. */
{
Tcl_Obj *slaveObjPtr, *targetObjPtr;
Tcl_Obj **objv;
int i;
int result;
objv = (Tcl_Obj **) ckalloc((unsigned) sizeof(Tcl_Obj *) * argc);
|
| ︙ | ︙ | |||
859 860 861 862 863 864 865 |
*
*----------------------------------------------------------------------
*/
int
Tcl_CreateAliasObj(slaveInterp, slaveCmd, targetInterp, targetCmd, objc, objv)
Tcl_Interp *slaveInterp; /* Interpreter for source command. */
| | | | 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 |
*
*----------------------------------------------------------------------
*/
int
Tcl_CreateAliasObj(slaveInterp, slaveCmd, targetInterp, targetCmd, objc, objv)
Tcl_Interp *slaveInterp; /* Interpreter for source command. */
CONST char *slaveCmd; /* Command to install in slave. */
Tcl_Interp *targetInterp; /* Interpreter for target command. */
CONST char *targetCmd; /* Name of target command. */
int objc; /* How many additional arguments? */
Tcl_Obj *CONST objv[]; /* Argument vector. */
{
Tcl_Obj *slaveObjPtr, *targetObjPtr;
int result;
slaveObjPtr = Tcl_NewStringObj(slaveCmd, -1);
|
| ︙ | ︙ | |||
902 903 904 905 906 907 908 |
*----------------------------------------------------------------------
*/
int
Tcl_GetAlias(interp, aliasName, targetInterpPtr, targetNamePtr, argcPtr,
argvPtr)
Tcl_Interp *interp; /* Interp to start search from. */
| | | | 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 |
*----------------------------------------------------------------------
*/
int
Tcl_GetAlias(interp, aliasName, targetInterpPtr, targetNamePtr, argcPtr,
argvPtr)
Tcl_Interp *interp; /* Interp to start search from. */
CONST char *aliasName; /* Name of alias to find. */
Tcl_Interp **targetInterpPtr; /* (Return) target interpreter. */
CONST char **targetNamePtr; /* (Return) name of target command. */
int *argcPtr; /* (Return) count of addnl args. */
char ***argvPtr; /* (Return) additional arguments. */
{
InterpInfo *iiPtr;
Tcl_HashEntry *hPtr;
Alias *aliasPtr;
int i, objc;
|
| ︙ | ︙ | |||
962 963 964 965 966 967 968 |
*----------------------------------------------------------------------
*/
int
Tcl_GetAliasObj(interp, aliasName, targetInterpPtr, targetNamePtr, objcPtr,
objvPtr)
Tcl_Interp *interp; /* Interp to start search from. */
| | | | 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 |
*----------------------------------------------------------------------
*/
int
Tcl_GetAliasObj(interp, aliasName, targetInterpPtr, targetNamePtr, objcPtr,
objvPtr)
Tcl_Interp *interp; /* Interp to start search from. */
CONST char *aliasName; /* Name of alias to find. */
Tcl_Interp **targetInterpPtr; /* (Return) target interpreter. */
CONST char **targetNamePtr; /* (Return) name of target command. */
int *objcPtr; /* (Return) count of addnl args. */
Tcl_Obj ***objvPtr; /* (Return) additional args. */
{
InterpInfo *iiPtr;
Tcl_HashEntry *hPtr;
Alias *aliasPtr;
int objc;
|
| ︙ | ︙ | |||
987 988 989 990 991 992 993 |
}
aliasPtr = (Alias *) Tcl_GetHashValue(hPtr);
Tcl_ListObjGetElements(NULL, aliasPtr->prefixPtr, &objc, &objv);
if (targetInterpPtr != (Tcl_Interp **) NULL) {
*targetInterpPtr = aliasPtr->targetInterp;
}
| | | 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 |
}
aliasPtr = (Alias *) Tcl_GetHashValue(hPtr);
Tcl_ListObjGetElements(NULL, aliasPtr->prefixPtr, &objc, &objv);
if (targetInterpPtr != (Tcl_Interp **) NULL) {
*targetInterpPtr = aliasPtr->targetInterp;
}
if (targetNamePtr != (CONST char **) NULL) {
*targetNamePtr = Tcl_GetString(objv[0]);
}
if (objcPtr != (int *) NULL) {
*objcPtr = objc - 1;
}
if (objvPtr != (Tcl_Obj ***) NULL) {
*objvPtr = objv + 1;
|
| ︙ | ︙ | |||
1521 1522 1523 1524 1525 1526 1527 |
*
*----------------------------------------------------------------------
*/
Tcl_Interp *
Tcl_CreateSlave(interp, slavePath, isSafe)
Tcl_Interp *interp; /* Interpreter to start search at. */
| | | 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 |
*
*----------------------------------------------------------------------
*/
Tcl_Interp *
Tcl_CreateSlave(interp, slavePath, isSafe)
Tcl_Interp *interp; /* Interpreter to start search at. */
CONST char *slavePath; /* Name of slave to create. */
int isSafe; /* Should new slave be "safe" ? */
{
Tcl_Obj *pathPtr;
Tcl_Interp *slaveInterp;
pathPtr = Tcl_NewStringObj(slavePath, -1);
slaveInterp = SlaveCreate(interp, pathPtr, isSafe);
|
| ︙ | ︙ | |||
1554 1555 1556 1557 1558 1559 1560 |
*
*----------------------------------------------------------------------
*/
Tcl_Interp *
Tcl_GetSlave(interp, slavePath)
Tcl_Interp *interp; /* Interpreter to start search from. */
| | | 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 |
*
*----------------------------------------------------------------------
*/
Tcl_Interp *
Tcl_GetSlave(interp, slavePath)
Tcl_Interp *interp; /* Interpreter to start search from. */
CONST char *slavePath; /* Path of slave to find. */
{
Tcl_Obj *pathPtr;
Tcl_Interp *slaveInterp;
pathPtr = Tcl_NewStringObj(slavePath, -1);
slaveInterp = GetInterp(interp, pathPtr);
Tcl_DecrRefCount(pathPtr);
|
| ︙ | ︙ | |||
1825 1826 1827 1828 1829 1830 1831 |
ClientData clientData; /* Slave interpreter. */
Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
Tcl_Interp *slaveInterp;
int index;
| | | 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 |
ClientData clientData; /* Slave interpreter. */
Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
Tcl_Interp *slaveInterp;
int index;
static CONST char *options[] = {
"alias", "aliases", "eval", "expose",
"hide", "hidden", "issafe", "invokehidden",
"marktrusted", NULL
};
enum options {
OPT_ALIAS, OPT_ALIASES, OPT_EVAL, OPT_EXPOSE,
OPT_HIDE, OPT_HIDDEN, OPT_ISSAFE, OPT_INVOKEHIDDEN,
|
| ︙ | ︙ | |||
1852 1853 1854 1855 1856 1857 1858 |
if (Tcl_GetIndexFromObj(interp, objv[1], options, "option", 0,
&index) != TCL_OK) {
return TCL_ERROR;
}
switch ((enum options) index) {
case OPT_ALIAS: {
| > | | | | | | | | | | > > > > > | 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 |
if (Tcl_GetIndexFromObj(interp, objv[1], options, "option", 0,
&index) != TCL_OK) {
return TCL_ERROR;
}
switch ((enum options) index) {
case OPT_ALIAS: {
if (objc > 2) {
if (objc == 3) {
return AliasDescribe(interp, slaveInterp, objv[2]);
}
if (Tcl_GetString(objv[3])[0] == '\0') {
if (objc == 4) {
return AliasDelete(interp, slaveInterp, objv[2]);
}
} else {
return AliasCreate(interp, slaveInterp, interp, objv[2],
objv[3], objc - 4, objv + 4);
}
}
Tcl_WrongNumArgs(interp, 2, objv,
"aliasName ?targetName? ?args..?");
return TCL_ERROR;
}
case OPT_ALIASES: {
if (objc != 2) {
Tcl_WrongNumArgs(interp, 2, objv, (char *) NULL);
return TCL_ERROR;
}
return AliasList(interp, slaveInterp);
}
case OPT_EVAL: {
if (objc < 3) {
Tcl_WrongNumArgs(interp, 2, objv, "arg ?arg ...?");
return TCL_ERROR;
}
|
| ︙ | ︙ | |||
1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 |
if (objc != 2) {
Tcl_WrongNumArgs(interp, 2, objv, NULL);
return TCL_ERROR;
}
return SlaveHidden(interp, slaveInterp);
}
case OPT_ISSAFE: {
Tcl_SetIntObj(Tcl_GetObjResult(interp), Tcl_IsSafe(slaveInterp));
return TCL_OK;
}
case OPT_INVOKEHIDDEN: {
int global, i, index;
| > > > > | | 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 |
if (objc != 2) {
Tcl_WrongNumArgs(interp, 2, objv, NULL);
return TCL_ERROR;
}
return SlaveHidden(interp, slaveInterp);
}
case OPT_ISSAFE: {
if (objc != 2) {
Tcl_WrongNumArgs(interp, 2, objv, (char *) NULL);
return TCL_ERROR;
}
Tcl_SetIntObj(Tcl_GetObjResult(interp), Tcl_IsSafe(slaveInterp));
return TCL_OK;
}
case OPT_INVOKEHIDDEN: {
int global, i, index;
static CONST char *hiddenOptions[] = {
"-global", "--", NULL
};
enum hiddenOption {
OPT_GLOBAL, OPT_LAST
};
global = 0;
for (i = 2; i < objc; i++) {
|
| ︙ | ︙ |
Changes to generic/tclLink.c.
| ︙ | ︙ | |||
9 10 11 12 13 14 15 | * * Copyright (c) 1993 The Regents of the University of California. * Copyright (c) 1994-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | * * Copyright (c) 1993 The Regents of the University of California. * Copyright (c) 1994-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclLink.c,v 1.3.28.1 2002/02/05 02:22:00 wolfsuit Exp $ */ #include "tclInt.h" /* * For each linked variable there is a data structure of the following * type, which describes the link and is the clientData for the trace |
| ︙ | ︙ | |||
231 232 233 234 235 236 237 |
char *name1; /* First part of variable name. */
char *name2; /* Second part of variable name. */
int flags; /* Miscellaneous additional information. */
{
Link *linkPtr = (Link *) clientData;
int changed;
char buffer[TCL_DOUBLE_SPACE];
| > | | 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 |
char *name1; /* First part of variable name. */
char *name2; /* Second part of variable name. */
int flags; /* Miscellaneous additional information. */
{
Link *linkPtr = (Link *) clientData;
int changed;
char buffer[TCL_DOUBLE_SPACE];
CONST char *value;
char **pp, *result;
Tcl_Obj *objPtr;
/*
* If the variable is being unset, then just re-create it (with a
* trace) unless the whole interpreter is going away.
*/
|
| ︙ | ︙ | |||
360 361 362 363 364 365 366 |
if (*pp != NULL) {
ckfree(*pp);
}
*pp = (char *) ckalloc((unsigned) (strlen(value) + 1));
strcpy(*pp, value);
break;
default:
| | | 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 |
if (*pp != NULL) {
ckfree(*pp);
}
*pp = (char *) ckalloc((unsigned) (strlen(value) + 1));
strcpy(*pp, value);
break;
default:
result = "internal error: bad linked variable type";
}
end:
Tcl_DecrRefCount(objPtr);
return result;
}
/*
|
| ︙ | ︙ |
Changes to generic/tclListObj.c.
1 2 3 4 5 6 7 8 9 10 11 12 | /* * tclListObj.c -- * * This file contains procedures that implement the Tcl list object * type. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * Copyright (c) 1998 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | > | > > > > > > > > > | 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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
/*
* tclListObj.c --
*
* This file contains procedures that implement the Tcl list object
* type.
*
* Copyright (c) 1995-1997 Sun Microsystems, Inc.
* Copyright (c) 1998 by Scriptics Corporation.
* Copyright (c) 2001 by Kevin B. Kenny. All rights reserved.
*
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
* RCS: @(#) $Id: tclListObj.c,v 1.9.14.1 2002/02/05 02:22:00 wolfsuit Exp $
*/
#include "tclInt.h"
/*
* Prototypes for procedures defined later in this file:
*/
static void DupListInternalRep _ANSI_ARGS_((Tcl_Obj *srcPtr,
Tcl_Obj *copyPtr));
static void FreeListInternalRep _ANSI_ARGS_((Tcl_Obj *listPtr));
static int SetListFromAny _ANSI_ARGS_((Tcl_Interp *interp,
Tcl_Obj *objPtr));
static void UpdateStringOfList _ANSI_ARGS_((Tcl_Obj *listPtr));
/*
* The structure below defines the list Tcl object type by means of
* procedures that can be invoked by generic object code.
*
* The internal representation of a list object is a two-pointer
* representation. The first pointer designates a List structure that
* contains an array of pointers to the element objects, together with
* integers that represent the current element count and the allocated
* size of the array. The second pointer is normally NULL; during
* execution of functions in this file that operate on nested sublists,
* it is occasionally used as working storage to avoid an auxiliary
* stack.
*/
Tcl_ObjType tclListType = {
"list", /* name */
FreeListInternalRep, /* freeIntRepProc */
DupListInternalRep, /* dupIntRepProc */
UpdateStringOfList, /* updateStringProc */
|
| ︙ | ︙ | |||
101 102 103 104 105 106 107 | } listRepPtr = (List *) ckalloc(sizeof(List)); listRepPtr->maxElemCount = objc; listRepPtr->elemCount = objc; listRepPtr->elements = elemPtrs; | > | | | | | 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 |
}
listRepPtr = (List *) ckalloc(sizeof(List));
listRepPtr->maxElemCount = objc;
listRepPtr->elemCount = objc;
listRepPtr->elements = elemPtrs;
listPtr->internalRep.twoPtrValue.ptr1 = (VOID *) listRepPtr;
listPtr->internalRep.twoPtrValue.ptr2 = NULL;
listPtr->typePtr = &tclListType;
}
return listPtr;
}
#endif /* if TCL_MEM_DEBUG */
/*
*----------------------------------------------------------------------
*
* Tcl_DbNewListObj --
*
* This procedure is normally called when debugging: i.e., when
* TCL_MEM_DEBUG is defined. It creates new list objects. It is the
* same as the Tcl_NewListObj procedure above except that it calls
* Tcl_DbCkalloc directly with the file name and line number from its
* caller. This simplifies debugging since then the [memory active]
* command will report the correct file name and line number when
* reporting objects that haven't been freed.
*
* When TCL_MEM_DEBUG is not defined, this procedure just returns the
* result of calling Tcl_NewListObj.
*
* Results:
* A new list object is returned that is initialized from the object
* pointers in objv. If objc is less than or equal to zero, an empty
|
| ︙ | ︙ | |||
170 171 172 173 174 175 176 | } listRepPtr = (List *) ckalloc(sizeof(List)); listRepPtr->maxElemCount = objc; listRepPtr->elemCount = objc; listRepPtr->elements = elemPtrs; | > | | 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 |
}
listRepPtr = (List *) ckalloc(sizeof(List));
listRepPtr->maxElemCount = objc;
listRepPtr->elemCount = objc;
listRepPtr->elements = elemPtrs;
listPtr->internalRep.twoPtrValue.ptr1 = (VOID *) listRepPtr;
listPtr->internalRep.twoPtrValue.ptr2 = NULL;
listPtr->typePtr = &tclListType;
}
return listPtr;
}
#else /* if not TCL_MEM_DEBUG */
|
| ︙ | ︙ | |||
257 258 259 260 261 262 263 | } listRepPtr = (List *) ckalloc(sizeof(List)); listRepPtr->maxElemCount = objc; listRepPtr->elemCount = objc; listRepPtr->elements = elemPtrs; | | > | 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 |
}
listRepPtr = (List *) ckalloc(sizeof(List));
listRepPtr->maxElemCount = objc;
listRepPtr->elemCount = objc;
listRepPtr->elements = elemPtrs;
objPtr->internalRep.twoPtrValue.ptr1 = (VOID *) listRepPtr;
objPtr->internalRep.twoPtrValue.ptr2 = NULL;
objPtr->typePtr = &tclListType;
} else {
objPtr->bytes = tclEmptyStringRep;
objPtr->length = 0;
}
}
|
| ︙ | ︙ | |||
313 314 315 316 317 318 319 |
if (listPtr->typePtr != &tclListType) {
int result = SetListFromAny(interp, listPtr);
if (result != TCL_OK) {
return result;
}
}
| | | 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 |
if (listPtr->typePtr != &tclListType) {
int result = SetListFromAny(interp, listPtr);
if (result != TCL_OK) {
return result;
}
}
listRepPtr = (List *) listPtr->internalRep.twoPtrValue.ptr1;
*objcPtr = listRepPtr->elemCount;
*objvPtr = listRepPtr->elements;
return TCL_OK;
}
/*
*----------------------------------------------------------------------
|
| ︙ | ︙ | |||
364 365 366 367 368 369 370 |
}
if (listPtr->typePtr != &tclListType) {
result = SetListFromAny(interp, listPtr);
if (result != TCL_OK) {
return result;
}
}
| | | 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 |
}
if (listPtr->typePtr != &tclListType) {
result = SetListFromAny(interp, listPtr);
if (result != TCL_OK) {
return result;
}
}
listRepPtr = (List *) listPtr->internalRep.twoPtrValue.ptr1;
listLen = listRepPtr->elemCount;
result = Tcl_ListObjGetElements(interp, elemListPtr, &objc, &objv);
if (result != TCL_OK) {
return result;
}
|
| ︙ | ︙ | |||
427 428 429 430 431 432 433 |
if (listPtr->typePtr != &tclListType) {
int result = SetListFromAny(interp, listPtr);
if (result != TCL_OK) {
return result;
}
}
| | | 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 |
if (listPtr->typePtr != &tclListType) {
int result = SetListFromAny(interp, listPtr);
if (result != TCL_OK) {
return result;
}
}
listRepPtr = (List *) listPtr->internalRep.twoPtrValue.ptr1;
elemPtrs = listRepPtr->elements;
numElems = listRepPtr->elemCount;
numRequired = numElems + 1 ;
/*
* If there is no room in the current array of element pointers,
* allocate a new, larger array and copy the pointers to it.
|
| ︙ | ︙ | |||
511 512 513 514 515 516 517 |
if (listPtr->typePtr != &tclListType) {
int result = SetListFromAny(interp, listPtr);
if (result != TCL_OK) {
return result;
}
}
| | | 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 |
if (listPtr->typePtr != &tclListType) {
int result = SetListFromAny(interp, listPtr);
if (result != TCL_OK) {
return result;
}
}
listRepPtr = (List *) listPtr->internalRep.twoPtrValue.ptr1;
if ((index < 0) || (index >= listRepPtr->elemCount)) {
*objPtrPtr = NULL;
} else {
*objPtrPtr = listRepPtr->elements[index];
}
return TCL_OK;
|
| ︙ | ︙ | |||
558 559 560 561 562 563 564 |
if (listPtr->typePtr != &tclListType) {
int result = SetListFromAny(interp, listPtr);
if (result != TCL_OK) {
return result;
}
}
| | | 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 |
if (listPtr->typePtr != &tclListType) {
int result = SetListFromAny(interp, listPtr);
if (result != TCL_OK) {
return result;
}
}
listRepPtr = (List *) listPtr->internalRep.twoPtrValue.ptr1;
*intPtr = listRepPtr->elemCount;
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
|
| ︙ | ︙ | |||
626 627 628 629 630 631 632 |
}
if (listPtr->typePtr != &tclListType) {
result = SetListFromAny(interp, listPtr);
if (result != TCL_OK) {
return result;
}
}
| | | 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 |
}
if (listPtr->typePtr != &tclListType) {
result = SetListFromAny(interp, listPtr);
if (result != TCL_OK) {
return result;
}
}
listRepPtr = (List *) listPtr->internalRep.twoPtrValue.ptr1;
elemPtrs = listRepPtr->elements;
numElems = listRepPtr->elemCount;
if (first < 0) {
first = 0;
}
if (first >= numElems) {
|
| ︙ | ︙ | |||
759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 |
Tcl_InvalidateStringRep(listPtr);
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
* FreeListInternalRep --
*
* Deallocate the storage associated with a list object's internal
* representation.
*
* Results:
* None.
*
* Side effects:
* Frees listPtr's List* internal representation and sets listPtr's
| > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | > > > | 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 |
Tcl_InvalidateStringRep(listPtr);
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
* TclLsetList --
*
* Core of the 'lset' command when objc == 4. Objv[2] may be
* either a scalar index or a list of indices.
*
* Results:
* Returns the new value of the list variable, or NULL if an
* error occurs.
*
* Side effects:
* Surgery is performed on the list value to produce the
* result.
*
* On entry, the reference count of the variable value does not reflect
* any references held on the stack. The first action of this function
* is to determine whether the object is shared, and to duplicate it if
* it is. The reference count of the duplicate is incremented.
* At this point, the reference count will be 1 for either case, so that
* the object will appear to be unshared.
*
* If an error occurs, and the object has been duplicated, the reference
* count on the duplicate is decremented so that it is now 0: this dismisses
* any memory that was allocated by this procedure.
*
* If no error occurs, the reference count of the original object is
* incremented if the object has not been duplicated, and nothing is
* done to a reference count of the duplicate. Now the reference count
* of an unduplicated object is 2 (the returned pointer, plus the one
* stored in the variable). The reference count of a duplicate object
* is 1, reflecting that the returned pointer is the only active
* reference. The caller is expected to store the returned value back
* in the variable and decrement its reference count. (INST_STORE_*
* does exactly this.)
*
* Tcl_LsetFlat and related functions maintain a linked list of
* Tcl_Obj's whose string representations must be spoilt by threading
* via 'ptr2' of the two-pointer internal representation. On entry
* to Tcl_LsetList, the values of 'ptr2' are immaterial; on exit,
* the 'ptr2' field of any Tcl_Obj that has been modified is set to
* NULL.
*
*----------------------------------------------------------------------
*/
Tcl_Obj*
TclLsetList( interp, listPtr, indexArgPtr, valuePtr )
Tcl_Interp* interp; /* Tcl interpreter */
Tcl_Obj* listPtr; /* Pointer to the list being modified */
Tcl_Obj* indexArgPtr; /* Index or index-list arg to 'lset' */
Tcl_Obj* valuePtr; /* Value arg to 'lset' */
{
int indexCount; /* Number of indices in the index list */
Tcl_Obj** indices; /* Vector of indices in the index list*/
int duplicated; /* Flag == 1 if the obj has been
* duplicated, 0 otherwise */
Tcl_Obj* retValuePtr; /* Pointer to the list to be returned */
int index; /* Current index in the list - discarded */
int result; /* Status return from library calls */
Tcl_Obj* subListPtr; /* Pointer to the current sublist */
int elemCount; /* Count of elements in the current sublist */
Tcl_Obj** elemPtrs; /* Pointers to elements of current sublist */
Tcl_Obj* chainPtr; /* Pointer to the enclosing sublist
* of the current sublist */
int i;
/*
* Determine whether the index arg designates a list or a single
* index. We have to be careful about the order of the checks to
* avoid repeated shimmering; see TIP #22 and #23 for details.
*/
if ( indexArgPtr->typePtr != &tclListType
&& TclGetIntForIndex( NULL, indexArgPtr, 0, &index ) == TCL_OK ) {
/*
* indexArgPtr designates a single index.
*/
return TclLsetFlat( interp, listPtr, 1, &indexArgPtr, valuePtr );
} else if ( Tcl_ListObjGetElements( NULL, indexArgPtr,
&indexCount, &indices ) != TCL_OK ) {
/*
* indexArgPtr designates something that is neither an index nor a
* well formed list. Report the error via TclLsetFlat.
*/
return TclLsetFlat( interp, listPtr, 1, &indexArgPtr, valuePtr );
}
/*
* At this point, we know that argPtr designates a well formed list,
* and the 'else if' above has parsed it into indexCount and indices.
* If there are no indices, simply return 'valuePtr', counting the
* returned pointer as a reference.
*/
if ( indexCount == 0 ) {
Tcl_IncrRefCount( valuePtr );
return valuePtr;
}
/*
* Duplicate the list arg if necessary.
*/
if ( Tcl_IsShared( listPtr ) ) {
duplicated = 1;
listPtr = Tcl_DuplicateObj( listPtr );
Tcl_IncrRefCount( listPtr );
} else {
duplicated = 0;
}
/*
* It would be tempting simply to go off to TclLsetFlat to finish the
* processing. Alas, it is also incorrect! The problem is that
* 'indexArgPtr' may designate a sublist of 'listPtr' whose value
* is to be manipulated. The fact that 'listPtr' is itself unshared
* does not guarantee that no sublist is. Therefore, it's necessary
* to replicate all the work here, expanding the index list on each
* trip through the loop.
*/
/*
* Anchor the linked list of Tcl_Obj's whose string reps must be
* invalidated if the operation succeeds.
*/
retValuePtr = listPtr;
chainPtr = NULL;
/*
* Handle each index arg by diving into the appropriate sublist
*/
for ( i = 0; ; ++i ) {
/*
* Take the sublist apart.
*/
result = Tcl_ListObjGetElements( interp, listPtr,
&elemCount, &elemPtrs );
if ( result != TCL_OK ) {
break;
}
listPtr->internalRep.twoPtrValue.ptr2 = (VOID *) chainPtr;
/*
* Reconstitute the index array
*/
result = Tcl_ListObjGetElements( interp, indexArgPtr,
&indexCount, &indices );
if ( result != TCL_OK ) {
/*
* Shouldn't be able to get here, because we already
* parsed the thing successfully once.
*/
break;
}
/*
* Determine the index of the requested element.
*/
result = TclGetIntForIndex( interp, indices[ i ],
(elemCount - 1), &index );
if ( result != TCL_OK ) {
break;
}
/*
* Check that the index is in range.
*/
if ( ( index < 0 ) || ( index >= elemCount ) ) {
Tcl_SetObjResult( interp,
Tcl_NewStringObj( "list index out of range",
-1 ) );
result = TCL_ERROR;
break;
}
/*
* Break the loop after extracting the innermost sublist
*/
if ( i >= indexCount-1 ) {
result = TCL_OK;
break;
}
/*
* Extract the appropriate sublist, and make sure that it is unshared.
*/
subListPtr = elemPtrs[ index ];
if ( Tcl_IsShared( subListPtr ) ) {
subListPtr = Tcl_DuplicateObj( subListPtr );
result = TclListObjSetElement( interp, listPtr, index,
subListPtr );
if ( result != TCL_OK ) {
/*
* We actually shouldn't be able to get here, because
* we've already checked everything that TclListObjSetElement
* checks. If we were to get here, it would result in leaking
* subListPtr.
*/
break;
}
}
/*
* Chain the current sublist onto the linked list of Tcl_Obj's
* whose string reps must be spoilt.
*/
chainPtr = listPtr;
listPtr = subListPtr;
}
/*
* Store the new element into the correct slot in the innermost sublist.
*/
if ( result == TCL_OK ) {
result = TclListObjSetElement( interp, listPtr, index, valuePtr );
}
if ( result == TCL_OK ) {
listPtr->internalRep.twoPtrValue.ptr2 = (VOID *) chainPtr;
/* Spoil all the string reps */
while ( listPtr != NULL ) {
subListPtr = (Tcl_Obj *) listPtr->internalRep.twoPtrValue.ptr2;
Tcl_InvalidateStringRep( listPtr );
listPtr->internalRep.twoPtrValue.ptr2 = NULL;
listPtr = subListPtr;
}
/* Return the new list if everything worked. */
if ( !duplicated ) {
Tcl_IncrRefCount( retValuePtr );
}
return retValuePtr;
}
/* Clean up the one dangling reference otherwise */
if ( duplicated ) {
Tcl_DecrRefCount( retValuePtr );
}
return NULL;
}
/*
*----------------------------------------------------------------------
*
* TclLsetFlat --
*
* Core of the 'lset' command when objc>=5. Objv[2], ... ,
* objv[objc-2] contain scalar indices.
*
* Results:
* Returns the new value of the list variable, or NULL if an
* error occurs.
*
* Side effects:
* Surgery is performed on the list value to produce the
* result.
*
* On entry, the reference count of the variable value does not reflect
* any references held on the stack. The first action of this function
* is to determine whether the object is shared, and to duplicate it if
* it is. The reference count of the duplicate is incremented.
* At this point, the reference count will be 1 for either case, so that
* the object will appear to be unshared.
*
* If an error occurs, and the object has been duplicated, the reference
* count on the duplicate is decremented so that it is now 0: this dismisses
* any memory that was allocated by this procedure.
*
* If no error occurs, the reference count of the original object is
* incremented if the object has not been duplicated, and nothing is
* done to a reference count of the duplicate. Now the reference count
* of an unduplicated object is 2 (the returned pointer, plus the one
* stored in the variable). The reference count of a duplicate object
* is 1, reflecting that the returned pointer is the only active
* reference. The caller is expected to store the returned value back
* in the variable and decrement its reference count. (INST_STORE_*
* does exactly this.)
*
* Tcl_LsetList and related functions maintain a linked list of
* Tcl_Obj's whose string representations must be spoilt by threading
* via 'ptr2' of the two-pointer internal representation. On entry
* to Tcl_LsetList, the values of 'ptr2' are immaterial; on exit,
* the 'ptr2' field of any Tcl_Obj that has been modified is set to
* NULL.
*
*----------------------------------------------------------------------
*/
Tcl_Obj*
TclLsetFlat( interp, listPtr, indexCount, indexArray, valuePtr )
Tcl_Interp* interp; /* Tcl interpreter */
Tcl_Obj* listPtr; /* Pointer to the list being modified */
int indexCount; /* Number of index args */
Tcl_Obj *CONST indexArray[];
/* Index args */
Tcl_Obj* valuePtr; /* Value arg to 'lset' */
{
int duplicated; /* Flag == 1 if the obj has been
* duplicated, 0 otherwise */
Tcl_Obj* retValuePtr; /* Pointer to the list to be returned */
int elemCount; /* Length of one sublist being changed */
Tcl_Obj** elemPtrs; /* Pointers to the elements of a sublist */
Tcl_Obj* subListPtr; /* Pointer to the current sublist */
int index; /* Index of the element to replace in the
* current sublist */
Tcl_Obj* chainPtr; /* Pointer to the enclosing list of
* the current sublist. */
int result; /* Status return from library calls */
int i;
/*
* If there are no indices, then simply return the new value,
* counting the returned pointer as a reference
*/
if ( indexCount == 0 ) {
Tcl_IncrRefCount( valuePtr );
return valuePtr;
}
/*
* If the list is shared, make a private copy.
*/
if ( Tcl_IsShared( listPtr ) ) {
duplicated = 1;
listPtr = Tcl_DuplicateObj( listPtr );
Tcl_IncrRefCount( listPtr );
} else {
duplicated = 0;
}
/*
* Anchor the linked list of Tcl_Obj's whose string reps must be
* invalidated if the operation succeeds.
*/
retValuePtr = listPtr;
chainPtr = NULL;
/*
* Handle each index arg by diving into the appropriate sublist
*/
for ( i = 0; ; ++i ) {
/*
* Take the sublist apart.
*/
result = Tcl_ListObjGetElements( interp, listPtr,
&elemCount, &elemPtrs );
if ( result != TCL_OK ) {
break;
}
listPtr->internalRep.twoPtrValue.ptr2 = (VOID *) chainPtr;
/*
* Determine the index of the requested element.
*/
result = TclGetIntForIndex( interp, indexArray[ i ],
(elemCount - 1), &index );
if ( result != TCL_OK ) {
break;
}
/*
* Check that the index is in range.
*/
if ( ( index < 0 ) || ( index >= elemCount ) ) {
Tcl_SetObjResult( interp,
Tcl_NewStringObj( "list index out of range",
-1 ) );
result = TCL_ERROR;
break;
}
/*
* Break the loop after extracting the innermost sublist
*/
if ( i >= indexCount-1 ) {
result = TCL_OK;
break;
}
/*
* Extract the appropriate sublist, and make sure that it is unshared.
*/
subListPtr = elemPtrs[ index ];
if ( Tcl_IsShared( subListPtr ) ) {
subListPtr = Tcl_DuplicateObj( subListPtr );
result = TclListObjSetElement( interp, listPtr, index,
subListPtr );
if ( result != TCL_OK ) {
/*
* We actually shouldn't be able to get here.
* If we do, it would result in leaking subListPtr,
* but everything's been validated already; the error
* exit from TclListObjSetElement should never happen.
*/
break;
}
}
/*
* Chain the current sublist onto the linked list of Tcl_Obj's
* whose string reps must be spoilt.
*/
chainPtr = listPtr;
listPtr = subListPtr;
}
/* Store the result in the list element */
if ( result == TCL_OK ) {
result = TclListObjSetElement( interp, listPtr, index, valuePtr );
}
if ( result == TCL_OK ) {
listPtr->internalRep.twoPtrValue.ptr2 = (VOID *) chainPtr;
/* Spoil all the string reps */
while ( listPtr != NULL ) {
subListPtr = (Tcl_Obj *) listPtr->internalRep.twoPtrValue.ptr2;
Tcl_InvalidateStringRep( listPtr );
listPtr->internalRep.twoPtrValue.ptr2 = NULL;
listPtr = subListPtr;
}
/* Return the new list if everything worked. */
if ( !duplicated ) {
Tcl_IncrRefCount( retValuePtr );
}
return retValuePtr;
}
/* Clean up the one dangling reference otherwise */
if ( duplicated ) {
Tcl_DecrRefCount( retValuePtr );
}
return NULL;
}
/*
*----------------------------------------------------------------------
*
* TclListObjSetElement --
*
* Set a single element of a list to a specified value
*
* Results:
*
* The return value is normally TCL_OK. If listPtr does not
* refer to a list object and cannot be converted to one, TCL_ERROR
* is returned and an error message will be left in the interpreter
* result if interp is not NULL. Similarly, if index designates
* an element outside the range [0..listLength-1], where
* listLength is the count of elements in the list object designated
* by listPtr, TCL_ERROR is returned and an error message is left
* in the interpreter result.
*
* Side effects:
*
* Panics if listPtr designates a shared object. Otherwise, attempts
* to convert it to a list. Decrements the ref count of the object
* at the specified index within the list, replaces with the
* object designated by valuePtr, and increments the ref count
* of the replacement object.
*
* It is the caller's responsibility to invalidate the string
* representation of the object.
*
*----------------------------------------------------------------------
*/
int
TclListObjSetElement( interp, listPtr, index, valuePtr )
Tcl_Interp* interp; /* Tcl interpreter; used for error reporting
* if not NULL */
Tcl_Obj* listPtr; /* List object in which element should be
* stored */
int index; /* Index of element to store */
Tcl_Obj* valuePtr; /* Tcl object to store in the designated
* list element */
{
int result; /* Return value from this function */
List* listRepPtr; /* Internal representation of the list
* being modified */
Tcl_Obj** elemPtrs; /* Pointers to elements of the list */
int elemCount; /* Number of elements in the list */
/* Ensure that the listPtr parameter designates an unshared list */
if ( Tcl_IsShared( listPtr ) ) {
panic( "Tcl_ListObjSetElement called with shared object" );
}
if ( listPtr->typePtr != &tclListType ) {
result = SetListFromAny( interp, listPtr );
if ( result != TCL_OK ) {
return result;
}
}
listRepPtr = (List*) listPtr->internalRep.twoPtrValue.ptr1;
elemPtrs = listRepPtr->elements;
elemCount = listRepPtr->elemCount;
/* Ensure that the index is in bounds */
if ( index < 0 || index >= elemCount ) {
if ( interp != NULL ) {
Tcl_SetObjResult( interp,
Tcl_NewStringObj( "list index out of range",
-1 ) );
return TCL_ERROR;
}
}
/* Add a reference to the new list element */
Tcl_IncrRefCount( valuePtr );
/* Remove a reference from the old list element */
Tcl_DecrRefCount( elemPtrs[ index ] );
/* Stash the new object in the list */
elemPtrs[ index ] = valuePtr;
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
* FreeListInternalRep --
*
* Deallocate the storage associated with a list object's internal
* representation.
*
* Results:
* None.
*
* Side effects:
* Frees listPtr's List* internal representation and sets listPtr's
* internalRep.twoPtrValue.ptr1 to NULL. Decrements the ref counts
* of all element objects, which may free them.
*
*----------------------------------------------------------------------
*/
static void
FreeListInternalRep(listPtr)
Tcl_Obj *listPtr; /* List object with internal rep to free. */
{
register List *listRepPtr = (List *) listPtr->internalRep.twoPtrValue.ptr1;
register Tcl_Obj **elemPtrs = listRepPtr->elements;
register Tcl_Obj *objPtr;
int numElems = listRepPtr->elemCount;
int i;
for (i = 0; i < numElems; i++) {
objPtr = elemPtrs[i];
Tcl_DecrRefCount(objPtr);
}
ckfree((char *) elemPtrs);
ckfree((char *) listRepPtr);
listPtr->internalRep.twoPtrValue.ptr1 = NULL;
listPtr->internalRep.twoPtrValue.ptr2 = NULL;
}
/*
*----------------------------------------------------------------------
*
* DupListInternalRep --
*
|
| ︙ | ︙ | |||
820 821 822 823 824 825 826 |
*/
static void
DupListInternalRep(srcPtr, copyPtr)
Tcl_Obj *srcPtr; /* Object with internal rep to copy. */
Tcl_Obj *copyPtr; /* Object with internal rep to set. */
{
| | | 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 |
*/
static void
DupListInternalRep(srcPtr, copyPtr)
Tcl_Obj *srcPtr; /* Object with internal rep to copy. */
Tcl_Obj *copyPtr; /* Object with internal rep to set. */
{
List *srcListRepPtr = (List *) srcPtr->internalRep.twoPtrValue.ptr1;
int numElems = srcListRepPtr->elemCount;
int maxElems = srcListRepPtr->maxElemCount;
register Tcl_Obj **srcElemPtrs = srcListRepPtr->elements;
register Tcl_Obj **copyElemPtrs;
register List *copyListRepPtr;
int i;
|
| ︙ | ︙ | |||
846 847 848 849 850 851 852 |
}
copyListRepPtr = (List *) ckalloc(sizeof(List));
copyListRepPtr->maxElemCount = maxElems;
copyListRepPtr->elemCount = numElems;
copyListRepPtr->elements = copyElemPtrs;
| | > | 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 |
}
copyListRepPtr = (List *) ckalloc(sizeof(List));
copyListRepPtr->maxElemCount = maxElems;
copyListRepPtr->elemCount = numElems;
copyListRepPtr->elements = copyElemPtrs;
copyPtr->internalRep.twoPtrValue.ptr1 = (VOID *) copyListRepPtr;
copyPtr->internalRep.twoPtrValue.ptr2 = NULL;
copyPtr->typePtr = &tclListType;
}
/*
*----------------------------------------------------------------------
*
* SetListFromAny --
|
| ︙ | ︙ | |||
972 973 974 975 976 977 978 |
* Tcl_GetStringFromObj, to use that old internalRep.
*/
if ((oldTypePtr != NULL) && (oldTypePtr->freeIntRepProc != NULL)) {
oldTypePtr->freeIntRepProc(objPtr);
}
| | > | 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 |
* Tcl_GetStringFromObj, to use that old internalRep.
*/
if ((oldTypePtr != NULL) && (oldTypePtr->freeIntRepProc != NULL)) {
oldTypePtr->freeIntRepProc(objPtr);
}
objPtr->internalRep.twoPtrValue.ptr1 = (VOID *) listRepPtr;
objPtr->internalRep.twoPtrValue.ptr2 = NULL;
objPtr->typePtr = &tclListType;
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
|
| ︙ | ︙ | |||
1004 1005 1006 1007 1008 1009 1010 |
static void
UpdateStringOfList(listPtr)
Tcl_Obj *listPtr; /* List object with string rep to update. */
{
# define LOCAL_SIZE 20
int localFlags[LOCAL_SIZE], *flagPtr;
| | | 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 |
static void
UpdateStringOfList(listPtr)
Tcl_Obj *listPtr; /* List object with string rep to update. */
{
# define LOCAL_SIZE 20
int localFlags[LOCAL_SIZE], *flagPtr;
List *listRepPtr = (List *) listPtr->internalRep.twoPtrValue.ptr1;
int numElems = listRepPtr->elemCount;
register int i;
char *elem, *dst;
int length;
/*
* Convert each element of the list to string form and then convert it
|
| ︙ | ︙ |
Changes to generic/tclLoad.c.
1 2 3 4 5 6 7 8 9 10 11 | /* * tclLoad.c -- * * This file provides the generic portion (those that are the same * on all platforms) of Tcl's dynamic loading facilities. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | /* * tclLoad.c -- * * This file provides the generic portion (those that are the same * on all platforms) of Tcl's dynamic loading facilities. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclLoad.c,v 1.6.8.1 2002/02/05 02:22:00 wolfsuit Exp $ */ #include "tclInt.h" /* * The following structure describes a package that has been loaded * either dynamically (with the "load" command) or statically (as |
| ︙ | ︙ | |||
447 448 449 450 451 452 453 |
void
Tcl_StaticPackage(interp, pkgName, initProc, safeInitProc)
Tcl_Interp *interp; /* If not NULL, it means that the
* package has already been loaded
* into the given interpreter by
* calling the appropriate init proc. */
| | | 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 |
void
Tcl_StaticPackage(interp, pkgName, initProc, safeInitProc)
Tcl_Interp *interp; /* If not NULL, it means that the
* package has already been loaded
* into the given interpreter by
* calling the appropriate init proc. */
CONST char *pkgName; /* Name of package (must be properly
* capitalized: first letter upper
* case, others lower case). */
Tcl_PackageInitProc *initProc; /* Procedure to call to incorporate
* this package into a trusted
* interpreter. */
Tcl_PackageInitProc *safeInitProc; /* Procedure to call to incorporate
* this package into a safe interpreter
|
| ︙ | ︙ |
Changes to generic/tclLoadNone.c.
1 2 3 4 5 6 7 8 9 10 11 12 | /* * tclLoadNone.c -- * * This procedure provides a version of the TclLoadFile for use * in systems that don't support dynamic loading; it just returns * an error. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /* * tclLoadNone.c -- * * This procedure provides a version of the TclLoadFile for use * in systems that don't support dynamic loading; it just returns * an error. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclLoadNone.c,v 1.6.2.1 2002/02/05 02:22:00 wolfsuit Exp $ */ #include "tclInt.h" /* *---------------------------------------------------------------------- * |
| ︙ | ︙ | |||
31 32 33 34 35 36 37 | * Side effects: * None. * *---------------------------------------------------------------------- */ int | | > | 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
int
TclpLoadFile(interp, pathPtr, sym1, sym2, proc1Ptr, proc2Ptr, clientDataPtr, unloadProcPtr)
Tcl_Interp *interp; /* Used for error reporting. */
Tcl_Obj *pathPtr; /* Name of the file containing the desired
* code. */
CONST char *sym1, *sym2; /* Names of two procedures to look up in
* the file's symbol table. */
Tcl_PackageInitProc **proc1Ptr, **proc2Ptr;
/* Where to return the addresses corresponding
* to sym1 and sym2. */
ClientData *clientDataPtr; /* Filled with token for dynamically loaded
* file which will be passed back to
* TclpUnloadFile() to unload the file. */
Tcl_FSUnloadFileProc **unloadProcPtr;
{
Tcl_SetResult(interp,
"dynamic loading is not currently available on this system",
TCL_STATIC);
return TCL_ERROR;
}
|
| ︙ | ︙ | |||
72 73 74 75 76 77 78 | * None. * *---------------------------------------------------------------------- */ int TclGuessPackageName(fileName, bufPtr) | | | 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
* None.
*
*----------------------------------------------------------------------
*/
int
TclGuessPackageName(fileName, bufPtr)
CONST char *fileName; /* Name of file containing package (already
* translated to local form if needed). */
Tcl_DString *bufPtr; /* Initialized empty dstring. Append
* package name to this if possible. */
{
return 0;
}
|
| ︙ | ︙ |
Changes to generic/tclMain.c.
1 2 3 4 5 6 7 8 9 10 11 12 | /* * tclMain.c -- * * Main program for Tcl shells and other Tcl-based applications. * * Copyright (c) 1988-1994 The Regents of the University of California. * Copyright (c) 1994-1997 Sun Microsystems, Inc. * Copyright (c) 2000 Ajuba Solutions. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /* * tclMain.c -- * * Main program for Tcl shells and other Tcl-based applications. * * Copyright (c) 1988-1994 The Regents of the University of California. * Copyright (c) 1994-1997 Sun Microsystems, Inc. * Copyright (c) 2000 Ajuba Solutions. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclMain.c,v 1.13.2.2 2002/02/05 02:22:00 wolfsuit Exp $ */ #include "tcl.h" #include "tclInt.h" # undef TCL_STORAGE_CLASS # define TCL_STORAGE_CLASS DLLEXPORT |
| ︙ | ︙ | |||
29 30 31 32 33 34 35 | EXTERN int Tcl_LinkVar(); int (*tclDummyLinkVarPtr)() = Tcl_LinkVar; /* * Declarations for various library procedures and variables (don't want * to include tclPort.h here, because people might copy this file out of * the Tcl source directory to make their own modified versions). | < < < > > > | | > > > > > > | < > | | > | > > | > | > > > | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > | | > > > | > > | 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 |
EXTERN int Tcl_LinkVar();
int (*tclDummyLinkVarPtr)() = Tcl_LinkVar;
/*
* Declarations for various library procedures and variables (don't want
* to include tclPort.h here, because people might copy this file out of
* the Tcl source directory to make their own modified versions).
*/
#if !defined(MAC_TCL)
extern int isatty _ANSI_ARGS_((int fd));
#else
#include <unistd.h>
#endif
static Tcl_Obj *tclStartupScriptPath = NULL;
static Tcl_MainLoopProc *mainLoopProc = NULL;
/*
* Structure defintiion for information used to keep the state of
* an interactive command processor that reads lines from standard
* input and writes prompts and results to standard output.
*/
typedef enum {
PROMPT_NONE, /* Print no prompt */
PROMPT_START, /* Print prompt for command start */
PROMPT_CONTINUE /* Print prompt for command continuation */
} PromptType;
typedef struct InteractiveState {
Tcl_Channel input; /* The standard input channel from which
* lines are read. */
int tty; /* Non-zero means standard input is a
* terminal-like device. Zero means it's
* a file. */
Tcl_Obj *commandPtr; /* Used to assemble lines of input into
* Tcl commands. */
PromptType prompt; /* Next prompt to print */
Tcl_Interp *interp; /* Interpreter that evaluates interactive
* commands. */
} InteractiveState;
/*
* Forward declarations for procedures defined later in this file.
*/
static void Prompt _ANSI_ARGS_((Tcl_Interp *interp,
PromptType *promptPtr));
static void StdinProc _ANSI_ARGS_((ClientData clientData,
int mask));
/*
*----------------------------------------------------------------------
*
* TclSetStartupScriptPath --
*
* Primes the startup script VFS path, used to override the
* command line processing.
*
* Results:
* None.
*
* Side effects:
* This procedure initializes the VFS path of the Tcl script to
* run at startup.
*
*----------------------------------------------------------------------
*/
void TclSetStartupScriptPath(pathPtr)
Tcl_Obj *pathPtr;
{
if (tclStartupScriptPath != NULL) {
Tcl_DecrRefCount(tclStartupScriptPath);
}
tclStartupScriptPath = pathPtr;
if (tclStartupScriptPath != NULL) {
Tcl_IncrRefCount(tclStartupScriptPath);
}
}
/*
*----------------------------------------------------------------------
*
* TclGetStartupScriptPath --
*
* Gets the startup script VFS path, used to override the
* command line processing.
*
* Results:
* The startup script VFS path, NULL if none has been set.
*
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
Tcl_Obj *TclGetStartupScriptPath()
{
return tclStartupScriptPath;
}
/*
*----------------------------------------------------------------------
*
* TclSetStartupScriptFileName --
*
* Primes the startup script file name, used to override the
* command line processing.
*
* Results:
* None.
*
* Side effects:
* This procedure initializes the file name of the Tcl script to
* run at startup.
*
*----------------------------------------------------------------------
*/
void TclSetStartupScriptFileName(fileName)
CONST char *fileName;
{
Tcl_Obj *pathPtr = Tcl_NewStringObj(fileName,-1);
TclSetStartupScriptPath(pathPtr);
}
/*
*----------------------------------------------------------------------
*
* TclGetStartupScriptFileName --
*
* Gets the startup script file name, used to override the
* command line processing.
*
* Results:
* The startup script file name, NULL if none has been set.
*
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
CONST char *TclGetStartupScriptFileName()
{
Tcl_Obj *pathPtr = TclGetStartupScriptPath();
if (pathPtr == NULL) {
return NULL;
}
return Tcl_GetString(pathPtr);
}
/*
*----------------------------------------------------------------------
*
|
| ︙ | ︙ | |||
140 141 142 143 144 145 146 |
/* Application-specific initialization
* procedure to call after most
* initialization but before starting to
* execute commands. */
{
Tcl_Obj *resultPtr;
Tcl_Obj *commandPtr = NULL;
| | > | < < < | < < | | > > > > > > > | | | | | | | > > > > | | > | 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 |
/* Application-specific initialization
* procedure to call after most
* initialization but before starting to
* execute commands. */
{
Tcl_Obj *resultPtr;
Tcl_Obj *commandPtr = NULL;
char buffer[TCL_INTEGER_SPACE + 5], *args;
PromptType prompt = PROMPT_START;
int code, length, tty;
int exitCode = 0;
Tcl_Channel inChannel, outChannel, errChannel;
Tcl_Interp *interp;
Tcl_DString argString;
Tcl_FindExecutable(argv[0]);
interp = Tcl_CreateInterp();
Tcl_InitMemory(interp);
/*
* Make command-line arguments available in the Tcl variables "argc"
* and "argv". If the first argument doesn't start with a "-" then
* strip it off and use it as the name of a script file to process.
*/
if (TclGetStartupScriptPath() == NULL) {
if ((argc > 1) && (argv[1][0] != '-')) {
TclSetStartupScriptFileName(argv[1]);
argc--;
argv++;
}
}
/*
* The CONST casting is safe, and better we do it here than force
* all callers of Tcl_Main to do it. (Those callers are likely
* in a main() that can't easily change its signature.)
*/
args = Tcl_Merge(argc-1, (CONST char **)argv+1);
Tcl_ExternalToUtfDString(NULL, args, -1, &argString);
Tcl_SetVar(interp, "argv", Tcl_DStringValue(&argString), TCL_GLOBAL_ONLY);
Tcl_DStringFree(&argString);
ckfree(args);
if (TclGetStartupScriptPath() == NULL) {
Tcl_ExternalToUtfDString(NULL, argv[0], -1, &argString);
} else {
TclSetStartupScriptFileName(Tcl_ExternalToUtfDString(NULL,
TclGetStartupScriptFileName(), -1, &argString));
}
TclFormatInt(buffer, (long) argc-1);
Tcl_SetVar(interp, "argc", buffer, TCL_GLOBAL_ONLY);
Tcl_SetVar(interp, "argv0", Tcl_DStringValue(&argString), TCL_GLOBAL_ONLY);
/*
* Set the "tcl_interactive" variable.
*/
tty = isatty(0);
Tcl_SetVar(interp, "tcl_interactive",
((TclGetStartupScriptPath() == NULL) && tty) ? "1" : "0",
TCL_GLOBAL_ONLY);
/*
* Invoke application-specific initialization.
*/
Tcl_Preserve((ClientData) interp);
if ((*appInitProc)(interp) != TCL_OK) {
errChannel = Tcl_GetStdChannel(TCL_STDERR);
if (errChannel) {
Tcl_WriteChars(errChannel,
"application-specific initialization failed: ", -1);
Tcl_WriteObj(errChannel, Tcl_GetObjResult(interp));
Tcl_WriteChars(errChannel, "\n", 1);
}
}
if (Tcl_InterpDeleted(interp)) {
goto done;
}
/*
* If a script file was specified then just source that file
* and quit.
*/
if (TclGetStartupScriptPath() != NULL) {
code = Tcl_FSEvalFile(interp, TclGetStartupScriptPath());
if (code != TCL_OK) {
errChannel = Tcl_GetStdChannel(TCL_STDERR);
if (errChannel) {
/*
* The following statement guarantees that the errorInfo
* variable is set properly.
*/
Tcl_AddErrorInfo(interp, "");
Tcl_WriteObj(errChannel, Tcl_GetVar2Ex(interp, "errorInfo",
|
| ︙ | ︙ | |||
252 253 254 255 256 257 258 259 260 |
* that we need to fetch the standard channels again after every
* eval, since they may have been changed.
*/
commandPtr = Tcl_NewObj();
Tcl_IncrRefCount(commandPtr);
inChannel = Tcl_GetStdChannel(TCL_STDIN);
outChannel = Tcl_GetStdChannel(TCL_STDOUT);
| > > > > < | | | | < < < < | < < | < < | < < < | < < > | < < < < < < < < < < < > | > > > > > > > > | > > | > > > | > | | | | > > > < | > | > > > | > > | | > > > | > | > | > > > > > > > > > | > > > > > > > > > > > > < > < < < < < < < > > > > > > > > > | | > > > > > > > > > > > > > > > > > > > > | 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 |
* that we need to fetch the standard channels again after every
* eval, since they may have been changed.
*/
commandPtr = Tcl_NewObj();
Tcl_IncrRefCount(commandPtr);
/*
* Get a new value for tty if anyone writes to ::tcl_interactive
*/
Tcl_LinkVar(interp, "tcl_interactive", (char *) &tty, TCL_LINK_BOOLEAN);
inChannel = Tcl_GetStdChannel(TCL_STDIN);
outChannel = Tcl_GetStdChannel(TCL_STDOUT);
while ((inChannel != (Tcl_Channel) NULL) && !Tcl_InterpDeleted(interp)) {
if (tty) {
Prompt(interp, &prompt);
if (Tcl_InterpDeleted(interp)) {
break;
}
inChannel = Tcl_GetStdChannel(TCL_STDIN);
if (inChannel == (Tcl_Channel) NULL) {
break;
}
}
length = Tcl_GetsObj(inChannel, commandPtr);
if (length < 0) {
if (Tcl_InputBlocked(inChannel)) {
/*
* This can only happen if stdin has been set to
* non-blocking. In that case cycle back and try
* again. This sets up a tight polling loop (since
* we have no event loop running). If this causes
* bad CPU hogging, we might try toggling the blocking
* on stdin instead.
*/
continue;
}
/*
* Either EOF, or an error on stdin; we're done
*/
break;
}
/*
* Add the newline removed by Tcl_GetsObj back to the string.
*/
Tcl_AppendToObj(commandPtr, "\n", 1);
if (!TclObjCommandComplete(commandPtr)) {
prompt = PROMPT_CONTINUE;
continue;
}
prompt = PROMPT_START;
code = Tcl_RecordAndEvalObj(interp, commandPtr, TCL_EVAL_GLOBAL);
inChannel = Tcl_GetStdChannel(TCL_STDIN);
outChannel = Tcl_GetStdChannel(TCL_STDOUT);
errChannel = Tcl_GetStdChannel(TCL_STDERR);
Tcl_DecrRefCount(commandPtr);
commandPtr = Tcl_NewObj();
Tcl_IncrRefCount(commandPtr);
if (code != TCL_OK) {
if (errChannel) {
Tcl_WriteObj(errChannel, Tcl_GetObjResult(interp));
Tcl_WriteChars(errChannel, "\n", 1);
}
} else if (tty) {
resultPtr = Tcl_GetObjResult(interp);
Tcl_GetStringFromObj(resultPtr, &length);
if ((length > 0) && outChannel) {
Tcl_WriteObj(outChannel, resultPtr);
Tcl_WriteChars(outChannel, "\n", 1);
}
}
if (mainLoopProc != NULL) {
/*
* If a main loop has been defined while running interactively,
* we want to start a fileevent based prompt by establishing a
* channel handler for stdin.
*/
InteractiveState *isPtr = NULL;
if (inChannel) {
if (tty) {
Prompt(interp, &prompt);
}
isPtr = (InteractiveState *)
ckalloc((int) sizeof(InteractiveState));
isPtr->input = inChannel;
isPtr->tty = tty;
isPtr->commandPtr = commandPtr;
isPtr->prompt = prompt;
isPtr->interp = interp;
Tcl_UnlinkVar(interp, "tcl_interactive");
Tcl_LinkVar(interp, "tcl_interactive", (char *) &(isPtr->tty),
TCL_LINK_BOOLEAN);
Tcl_CreateChannelHandler(inChannel, TCL_READABLE, StdinProc,
(ClientData) isPtr);
}
(*mainLoopProc)();
mainLoopProc = NULL;
if (inChannel) {
tty = isPtr->tty;
Tcl_UnlinkVar(interp, "tcl_interactive");
Tcl_LinkVar(interp, "tcl_interactive", (char *) &tty,
TCL_LINK_BOOLEAN);
prompt = isPtr->prompt;
if (isPtr->input != (Tcl_Channel) NULL) {
Tcl_DeleteChannelHandler(isPtr->input, StdinProc,
(ClientData) isPtr);
}
ckfree((char *)isPtr);
}
inChannel = Tcl_GetStdChannel(TCL_STDIN);
outChannel = Tcl_GetStdChannel(TCL_STDOUT);
errChannel = Tcl_GetStdChannel(TCL_STDERR);
}
#ifdef TCL_MEM_DEBUG
/*
* This code here only for the (unsupported and deprecated)
* [checkmem] command.
*/
if (tclMemDumpFileName != NULL) {
mainLoopProc = NULL;
Tcl_DeleteInterp(interp);
}
#endif
}
done:
if ((exitCode == 0) && (mainLoopProc != NULL)) {
/*
* If everything has gone OK so far, call the main loop proc,
* if it exists. Packages (like Tk) can set it to start processing
* events at this point.
*/
(*mainLoopProc)();
mainLoopProc = NULL;
}
if (commandPtr != NULL) {
Tcl_DecrRefCount(commandPtr);
}
/*
* Rather than calling exit, invoke the "exit" command so that
* users can replace "exit" with some other command to do additional
* cleanup on exit. The Tcl_Eval call should never return.
*/
if (!Tcl_InterpDeleted(interp)) {
sprintf(buffer, "exit %d", exitCode);
Tcl_Eval(interp, buffer);
/*
* If Tcl_Eval returns, trying to eval [exit], something
* unusual is happening. Maybe interp has been deleted;
* maybe [exit] was redefined. We still want to cleanup
* and exit.
*/
if (!Tcl_InterpDeleted(interp)) {
Tcl_DeleteInterp(interp);
}
}
/*
* If we get here, the master interp has been deleted. Allow
* its destruction with the last matching Tcl_Release.
*/
Tcl_Release((ClientData) interp);
Tcl_Exit(exitCode);
}
/*
*---------------------------------------------------------------
*
* Tcl_SetMainLoop --
*
|
| ︙ | ︙ | |||
429 430 431 432 433 434 435 |
*
*----------------------------------------------------------------------
*/
/* ARGSUSED */
static void
StdinProc(clientData, mask)
| | | < < | | < | > | > > > | < < | > > > > > | < < | > | | | | < < < < < | | | | | < | > > > | | < < | | | | | | > > > > > > > | | | > < | 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 |
*
*----------------------------------------------------------------------
*/
/* ARGSUSED */
static void
StdinProc(clientData, mask)
ClientData clientData; /* The state of interactive cmd line */
int mask; /* Not used. */
{
InteractiveState *isPtr = (InteractiveState *) clientData;
Tcl_Channel chan = isPtr->input;
Tcl_Obj *commandPtr = isPtr->commandPtr;
Tcl_Interp *interp = isPtr->interp;
int code, length;
length = Tcl_GetsObj(chan, commandPtr);
if (length < 0) {
if (Tcl_InputBlocked(chan)) {
return;
}
if (isPtr->tty) {
/*
* Would be better to find a way to exit the mainLoop?
* Or perhaps evaluate [exit]? Leaving as is for now due
* to compatibility concerns.
*/
Tcl_Exit(0);
}
Tcl_DeleteChannelHandler(chan, StdinProc, (ClientData) isPtr);
return;
}
Tcl_AppendToObj(commandPtr, "\n", 1);
if (!TclObjCommandComplete(commandPtr)) {
isPtr->prompt = PROMPT_CONTINUE;
goto prompt;
}
isPtr->prompt = PROMPT_START;
/*
* Disable the stdin channel handler while evaluating the command;
* otherwise if the command re-enters the event loop we might
* process commands from stdin before the current command is
* finished. Among other things, this will trash the text of the
* command being evaluated.
*/
Tcl_CreateChannelHandler(chan, 0, StdinProc, (ClientData) isPtr);
code = Tcl_RecordAndEvalObj(interp, commandPtr, TCL_EVAL_GLOBAL);
isPtr->input = chan = Tcl_GetStdChannel(TCL_STDIN);
Tcl_DecrRefCount(commandPtr);
isPtr->commandPtr = commandPtr = Tcl_NewObj();
Tcl_IncrRefCount(commandPtr);
if (chan != (Tcl_Channel) NULL) {
Tcl_CreateChannelHandler(chan, TCL_READABLE, StdinProc,
(ClientData) isPtr);
}
if (code != TCL_OK) {
Tcl_Channel errChannel = Tcl_GetStdChannel(TCL_STDERR);
if (errChannel != (Tcl_Channel) NULL) {
Tcl_WriteObj(errChannel, Tcl_GetObjResult(interp));
Tcl_WriteChars(errChannel, "\n", 1);
}
} else if (isPtr->tty) {
Tcl_Obj *resultPtr = Tcl_GetObjResult(interp);
Tcl_Channel outChannel = Tcl_GetStdChannel(TCL_STDOUT);
Tcl_GetStringFromObj(resultPtr, &length);
if ((length >0) && (outChannel != (Tcl_Channel) NULL)) {
Tcl_WriteObj(outChannel, resultPtr);
Tcl_WriteChars(outChannel, "\n", 1);
}
}
/*
* If a tty stdin is still around, output a prompt.
*/
prompt:
if (isPtr->tty && (isPtr->input != (Tcl_Channel) NULL)) {
Prompt(interp, &(isPtr->prompt));
isPtr->input = Tcl_GetStdChannel(TCL_STDIN);
}
}
/*
*----------------------------------------------------------------------
*
* Prompt --
*
|
| ︙ | ︙ | |||
521 522 523 524 525 526 527 | * A prompt gets output, and a Tcl script may be evaluated * in interp. * *---------------------------------------------------------------------- */ static void | | | | | | > > > > | | > > > > | | < | < < < < < | < | | | < | < < < < < < | | > | 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 |
* A prompt gets output, and a Tcl script may be evaluated
* in interp.
*
*----------------------------------------------------------------------
*/
static void
Prompt(interp, promptPtr)
Tcl_Interp *interp; /* Interpreter to use for prompting. */
PromptType *promptPtr; /* Points to type of prompt to print.
* Filled with PROMPT_NONE after a
* prompt is printed. */
{
Tcl_Obj *promptCmdPtr;
int code;
Tcl_Channel outChannel, errChannel;
if (*promptPtr == PROMPT_NONE) {
return;
}
promptCmdPtr = Tcl_GetVar2Ex(interp,
((*promptPtr == PROMPT_CONTINUE) ? "tcl_prompt2" : "tcl_prompt1"),
NULL, TCL_GLOBAL_ONLY);
if (Tcl_InterpDeleted(interp)) {
return;
}
if (promptCmdPtr == NULL) {
defaultPrompt:
outChannel = Tcl_GetStdChannel(TCL_STDOUT);
if ((*promptPtr == PROMPT_START)
&& (outChannel != (Tcl_Channel) NULL)) {
Tcl_WriteChars(outChannel, "% ", 2);
}
} else {
code = Tcl_EvalObjEx(interp, promptCmdPtr, TCL_EVAL_GLOBAL);
if (code != TCL_OK) {
Tcl_AddErrorInfo(interp,
"\n (script that generates prompt)");
errChannel = Tcl_GetStdChannel(TCL_STDERR);
if (errChannel != (Tcl_Channel) NULL) {
Tcl_WriteObj(errChannel, Tcl_GetObjResult(interp));
Tcl_WriteChars(errChannel, "\n", 1);
}
goto defaultPrompt;
}
}
outChannel = Tcl_GetStdChannel(TCL_STDOUT);
if (outChannel != (Tcl_Channel) NULL) {
Tcl_Flush(outChannel);
}
*promptPtr = PROMPT_NONE;
}
|
Changes to generic/tclNamesp.c.
| ︙ | ︙ | |||
15 16 17 18 19 20 21 | * Michael J. McLennan * Bell Labs Innovations for Lucent Technologies * mmclennan@lucent.com * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | * Michael J. McLennan * Bell Labs Innovations for Lucent Technologies * mmclennan@lucent.com * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclNamesp.c,v 1.25.8.1 2002/02/05 02:22:00 wolfsuit Exp $ */ #include "tclInt.h" /* * Flag passed to TclGetNamespaceForQualName to indicate that it should * search for a namespace rather than a command or variable inside a |
| ︙ | ︙ | |||
716 717 718 719 720 721 722 |
* This is the global namespace, so be careful to preserve the
* "errorInfo" and "errorCode" variables. These might be needed
* later on if errors occur while deleting commands. We are careful
* to destroy and recreate the "errorInfo" and "errorCode"
* variables, in case they had any traces on them.
*/
| > | | 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 |
* This is the global namespace, so be careful to preserve the
* "errorInfo" and "errorCode" variables. These might be needed
* later on if errors occur while deleting commands. We are careful
* to destroy and recreate the "errorInfo" and "errorCode"
* variables, in case they had any traces on them.
*/
CONST char *str;
char *errorInfoStr, *errorCodeStr;
str = Tcl_GetVar((Tcl_Interp *) iPtr, "errorInfo", TCL_GLOBAL_ONLY);
if (str != NULL) {
errorInfoStr = ckalloc((unsigned) (strlen(str)+1));
strcpy(errorInfoStr, str);
} else {
errorInfoStr = NULL;
|
| ︙ | ︙ | |||
897 898 899 900 901 902 903 |
int
Tcl_Export(interp, namespacePtr, pattern, resetListFirst)
Tcl_Interp *interp; /* Current interpreter. */
Tcl_Namespace *namespacePtr; /* Points to the namespace from which
* commands are to be exported. NULL for
* the current namespace. */
| | | 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 |
int
Tcl_Export(interp, namespacePtr, pattern, resetListFirst)
Tcl_Interp *interp; /* Current interpreter. */
Tcl_Namespace *namespacePtr; /* Points to the namespace from which
* commands are to be exported. NULL for
* the current namespace. */
CONST char *pattern; /* String pattern indicating which commands
* to export. This pattern may not include
* any namespace qualifiers; only commands
* in the specified namespace may be
* exported. */
int resetListFirst; /* If nonzero, resets the namespace's
* export list before appending.
* If 0, return an error if an imported
|
| ︙ | ︙ | |||
1098 1099 1100 1101 1102 1103 1104 |
int
Tcl_Import(interp, namespacePtr, pattern, allowOverwrite)
Tcl_Interp *interp; /* Current interpreter. */
Tcl_Namespace *namespacePtr; /* Points to the namespace into which the
* commands are to be imported. NULL for
* the current namespace. */
| | | 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 |
int
Tcl_Import(interp, namespacePtr, pattern, allowOverwrite)
Tcl_Interp *interp; /* Current interpreter. */
Tcl_Namespace *namespacePtr; /* Points to the namespace into which the
* commands are to be imported. NULL for
* the current namespace. */
CONST char *pattern; /* String pattern indicating which commands
* to import. This pattern should be
* qualified by the name of the namespace
* from which to import the command(s). */
int allowOverwrite; /* If nonzero, allow existing commands to
* be overwritten by imported commands.
* If 0, return an error if an imported
* cmd conflicts with an existing one. */
|
| ︙ | ︙ | |||
1333 1334 1335 1336 1337 1338 1339 |
int
Tcl_ForgetImport(interp, namespacePtr, pattern)
Tcl_Interp *interp; /* Current interpreter. */
Tcl_Namespace *namespacePtr; /* Points to the namespace from which
* previously imported commands should be
* removed. NULL for current namespace. */
| | | 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 |
int
Tcl_ForgetImport(interp, namespacePtr, pattern)
Tcl_Interp *interp; /* Current interpreter. */
Tcl_Namespace *namespacePtr; /* Points to the namespace from which
* previously imported commands should be
* removed. NULL for current namespace. */
CONST char *pattern; /* String pattern indicating which imported
* commands to remove. This pattern should
* be qualified by the name of the
* namespace from which the command(s) were
* imported. */
{
Namespace *nsPtr, *importNsPtr, *dummyPtr, *actualCtxPtr;
CONST char *simplePattern;
|
| ︙ | ︙ | |||
1876 1877 1878 1879 1880 1881 1882 |
*----------------------------------------------------------------------
*/
Tcl_Namespace *
Tcl_FindNamespace(interp, name, contextNsPtr, flags)
Tcl_Interp *interp; /* The interpreter in which to find the
* namespace. */
| | | 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 |
*----------------------------------------------------------------------
*/
Tcl_Namespace *
Tcl_FindNamespace(interp, name, contextNsPtr, flags)
Tcl_Interp *interp; /* The interpreter in which to find the
* namespace. */
CONST char *name; /* Namespace name. If it starts with "::",
* will be looked up in global namespace.
* Else, looked up first in contextNsPtr
* (current namespace if contextNsPtr is
* NULL), then in global namespace. */
Tcl_Namespace *contextNsPtr; /* Ignored if TCL_GLOBAL_ONLY flag is set
* or if the name starts with "::".
* Otherwise, points to namespace in which
|
| ︙ | ︙ | |||
2460 2461 2462 2463 2464 2465 2466 |
int
Tcl_NamespaceObjCmd(clientData, interp, objc, objv)
ClientData clientData; /* Arbitrary value passed to cmd. */
Tcl_Interp *interp; /* Current interpreter. */
register int objc; /* Number of arguments. */
register Tcl_Obj *CONST objv[]; /* Argument objects. */
{
| | | 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 |
int
Tcl_NamespaceObjCmd(clientData, interp, objc, objv)
ClientData clientData; /* Arbitrary value passed to cmd. */
Tcl_Interp *interp; /* Current interpreter. */
register int objc; /* Number of arguments. */
register Tcl_Obj *CONST objv[]; /* Argument objects. */
{
static CONST char *subCmds[] = {
"children", "code", "current", "delete",
"eval", "exists", "export", "forget", "import",
"inscope", "origin", "parent", "qualifiers",
"tail", "which", (char *) NULL
};
enum NSSubCmdIdx {
NSChildrenIdx, NSCodeIdx, NSCurrentIdx, NSDeleteIdx,
|
| ︙ | ︙ |
Changes to generic/tclObj.c.
1 2 3 4 5 6 7 8 9 10 11 12 13 | /* * tclObj.c -- * * This file contains Tcl object-related procedures that are used by * many Tcl commands. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * Copyright (c) 1999 by Scriptics Corporation. * Copyright (c) 2001 by ActiveState Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | > | 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 | /* * tclObj.c -- * * This file contains Tcl object-related procedures that are used by * many Tcl commands. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * Copyright (c) 1999 by Scriptics Corporation. * Copyright (c) 2001 by ActiveState Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclObj.c,v 1.23.8.1 2002/02/05 02:22:00 wolfsuit Exp $ */ #include "tclInt.h" #include "tclCompile.h" #include "tclPort.h" /* * Table of all object types. */ static Tcl_HashTable typeTable; |
| ︙ | ︙ | |||
72 73 74 75 76 77 78 79 80 81 82 83 84 85 | static int CompareObjKeys _ANSI_ARGS_(( VOID *keyPtr, Tcl_HashEntry *hPtr)); static void FreeObjEntry _ANSI_ARGS_(( Tcl_HashEntry *hPtr)); static unsigned int HashObjKey _ANSI_ARGS_(( Tcl_HashTable *tablePtr, VOID *keyPtr)); /* * The structures below defines the Tcl object types defined in this file by * means of procedures that can be invoked by generic object code. See also * tclStringObj.c, tclListObj.c, tclByteCode.c for other type manager * implementations. */ | > > > > > > > > > > > > | 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
static int CompareObjKeys _ANSI_ARGS_((
VOID *keyPtr, Tcl_HashEntry *hPtr));
static void FreeObjEntry _ANSI_ARGS_((
Tcl_HashEntry *hPtr));
static unsigned int HashObjKey _ANSI_ARGS_((
Tcl_HashTable *tablePtr,
VOID *keyPtr));
/*
* Prototypes for the CommandName object type.
*/
static void DupCmdNameInternalRep _ANSI_ARGS_((Tcl_Obj *objPtr,
Tcl_Obj *copyPtr));
static void FreeCmdNameInternalRep _ANSI_ARGS_((
Tcl_Obj *objPtr));
static int SetCmdNameFromAny _ANSI_ARGS_((Tcl_Interp *interp,
Tcl_Obj *objPtr));
/*
* The structures below defines the Tcl object types defined in this file by
* means of procedures that can be invoked by generic object code. See also
* tclStringObj.c, tclListObj.c, tclByteCode.c for other type manager
* implementations.
*/
|
| ︙ | ︙ | |||
115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
TCL_HASH_KEY_TYPE_VERSION, /* version */
0, /* flags */
HashObjKey, /* hashKeyProc */
CompareObjKeys, /* compareKeysProc */
AllocObjEntry, /* allocEntryProc */
FreeObjEntry /* freeEntryProc */
};
/*
*-------------------------------------------------------------------------
*
* TclInitObjectSubsystem --
*
* This procedure is invoked to perform once-only initialization of
| > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 |
TCL_HASH_KEY_TYPE_VERSION, /* version */
0, /* flags */
HashObjKey, /* hashKeyProc */
CompareObjKeys, /* compareKeysProc */
AllocObjEntry, /* allocEntryProc */
FreeObjEntry /* freeEntryProc */
};
/*
* The structure below defines the command name Tcl object type by means of
* procedures that can be invoked by generic object code. Objects of this
* type cache the Command pointer that results from looking up command names
* in the command hashtable. Such objects appear as the zeroth ("command
* name") argument in a Tcl command.
*/
Tcl_ObjType tclCmdNameType = {
"cmdName", /* name */
FreeCmdNameInternalRep, /* freeIntRepProc */
DupCmdNameInternalRep, /* dupIntRepProc */
(Tcl_UpdateStringProc *) NULL, /* updateStringProc */
SetCmdNameFromAny /* setFromAnyProc */
};
/*
* Structure containing a cached pointer to a command that is the result
* of resolving the command's name in some namespace. It is the internal
* representation for a cmdName object. It contains the pointer along
* with some information that is used to check the pointer's validity.
*/
typedef struct ResolvedCmdName {
Command *cmdPtr; /* A cached Command pointer. */
Namespace *refNsPtr; /* Points to the namespace containing the
* reference (not the namespace that
* contains the referenced command). */
long refNsId; /* refNsPtr's unique namespace id. Used to
* verify that refNsPtr is still valid
* (e.g., it's possible that the cmd's
* containing namespace was deleted and a
* new one created at the same address). */
int refNsCmdEpoch; /* Value of the referencing namespace's
* cmdRefEpoch when the pointer was cached.
* Before using the cached pointer, we check
* if the namespace's epoch was incremented;
* if so, this cached pointer is invalid. */
int cmdEpoch; /* Value of the command's cmdEpoch when this
* pointer was cached. Before using the
* cached pointer, we check if the cmd's
* epoch was incremented; if so, the cmd was
* renamed, deleted, hidden, or exposed, and
* so the pointer is invalid. */
int refCount; /* Reference count: 1 for each cmdName
* object that has a pointer to this
* ResolvedCmdName structure as its internal
* rep. This structure can be freed when
* refCount becomes zero. */
} ResolvedCmdName;
/*
*-------------------------------------------------------------------------
*
* TclInitObjectSubsystem --
*
* This procedure is invoked to perform once-only initialization of
|
| ︙ | ︙ | |||
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 |
typeTableInitialized = 1;
Tcl_InitHashTable(&typeTable, TCL_STRING_KEYS);
Tcl_MutexUnlock(&tableMutex);
Tcl_RegisterObjType(&tclBooleanType);
Tcl_RegisterObjType(&tclByteArrayType);
Tcl_RegisterObjType(&tclDoubleType);
Tcl_RegisterObjType(&tclIntType);
Tcl_RegisterObjType(&tclStringType);
Tcl_RegisterObjType(&tclListType);
Tcl_RegisterObjType(&tclByteCodeType);
Tcl_RegisterObjType(&tclProcBodyType);
Tcl_RegisterObjType(&tclArraySearchType);
Tcl_RegisterObjType(&tclIndexType);
Tcl_RegisterObjType(&tclNsNameType);
#ifdef TCL_COMPILE_STATS
Tcl_MutexLock(&tclObjMutex);
tclObjsAlloced = 0;
tclObjsFreed = 0;
{
int i;
| > > | 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 |
typeTableInitialized = 1;
Tcl_InitHashTable(&typeTable, TCL_STRING_KEYS);
Tcl_MutexUnlock(&tableMutex);
Tcl_RegisterObjType(&tclBooleanType);
Tcl_RegisterObjType(&tclByteArrayType);
Tcl_RegisterObjType(&tclDoubleType);
Tcl_RegisterObjType(&tclEndOffsetType);
Tcl_RegisterObjType(&tclIntType);
Tcl_RegisterObjType(&tclStringType);
Tcl_RegisterObjType(&tclListType);
Tcl_RegisterObjType(&tclByteCodeType);
Tcl_RegisterObjType(&tclProcBodyType);
Tcl_RegisterObjType(&tclArraySearchType);
Tcl_RegisterObjType(&tclIndexType);
Tcl_RegisterObjType(&tclNsNameType);
Tcl_RegisterObjType(&tclCmdNameType);
#ifdef TCL_COMPILE_STATS
Tcl_MutexLock(&tclObjMutex);
tclObjsAlloced = 0;
tclObjsFreed = 0;
{
int i;
|
| ︙ | ︙ | |||
328 329 330 331 332 333 334 | * None. * *---------------------------------------------------------------------- */ Tcl_ObjType * Tcl_GetObjType(typeName) | | | 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 |
* None.
*
*----------------------------------------------------------------------
*/
Tcl_ObjType *
Tcl_GetObjType(typeName)
CONST char *typeName; /* Name of Tcl object type to look up. */
{
register Tcl_HashEntry *hPtr;
Tcl_ObjType *typePtr;
Tcl_MutexLock(&tableMutex);
hPtr = Tcl_FindHashEntry(&typeTable, typeName);
if (hPtr != (Tcl_HashEntry *) NULL) {
|
| ︙ | ︙ | |||
462 463 464 465 466 467 468 | * Tcl_DbNewObj -- * * This procedure is normally called when debugging: i.e., when * TCL_MEM_DEBUG is defined. It creates new Tcl objects that denote the * empty string. It is the same as the Tcl_NewObj procedure above * except that it calls Tcl_DbCkalloc directly with the file name and * line number from its caller. This simplifies debugging since then | | | 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 | * Tcl_DbNewObj -- * * This procedure is normally called when debugging: i.e., when * TCL_MEM_DEBUG is defined. It creates new Tcl objects that denote the * empty string. It is the same as the Tcl_NewObj procedure above * except that it calls Tcl_DbCkalloc directly with the file name and * line number from its caller. This simplifies debugging since then * the [memory active] command will report the correct file name and line * number when reporting objects that haven't been freed. * * When TCL_MEM_DEBUG is not defined, this procedure just returns the * result of calling Tcl_NewObj. * * Results: * The result is a newly allocated that represents the empty string. |
| ︙ | ︙ | |||
864 865 866 867 868 869 870 | * * Tcl_DbNewBooleanObj -- * * This procedure is normally called when debugging: i.e., when * TCL_MEM_DEBUG is defined. It creates new boolean objects. It is the * same as the Tcl_NewBooleanObj procedure above except that it calls * Tcl_DbCkalloc directly with the file name and line number from its | | | | | 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 | * * Tcl_DbNewBooleanObj -- * * This procedure is normally called when debugging: i.e., when * TCL_MEM_DEBUG is defined. It creates new boolean objects. It is the * same as the Tcl_NewBooleanObj procedure above except that it calls * Tcl_DbCkalloc directly with the file name and line number from its * caller. This simplifies debugging since then the [memory active] * command will report the correct file name and line number when * reporting objects that haven't been freed. * * When TCL_MEM_DEBUG is not defined, this procedure just returns the * result of calling Tcl_NewBooleanObj. * * Results: * The newly created object is returned. This object will have an * invalid string representation. The returned object has ref count 0. |
| ︙ | ︙ | |||
1222 1223 1224 1225 1226 1227 1228 | * * Tcl_DbNewDoubleObj -- * * This procedure is normally called when debugging: i.e., when * TCL_MEM_DEBUG is defined. It creates new double objects. It is the * same as the Tcl_NewDoubleObj procedure above except that it calls * Tcl_DbCkalloc directly with the file name and line number from its | | | | | 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 | * * Tcl_DbNewDoubleObj -- * * This procedure is normally called when debugging: i.e., when * TCL_MEM_DEBUG is defined. It creates new double objects. It is the * same as the Tcl_NewDoubleObj procedure above except that it calls * Tcl_DbCkalloc directly with the file name and line number from its * caller. This simplifies debugging since then the [memory active] * command will report the correct file name and line number when * reporting objects that haven't been freed. * * When TCL_MEM_DEBUG is not defined, this procedure just returns the * result of calling Tcl_NewDoubleObj. * * Results: * The newly created object is returned. This object will have an * invalid string representation. The returned object has ref count 0. |
| ︙ | ︙ | |||
1853 1854 1855 1856 1857 1858 1859 | * Tcl_DbNewLongObj so that whether the Tcl core is compiled to do * memory debugging of the core is independent of whether a client * requests debugging for itself. * * When the core is compiled with TCL_MEM_DEBUG defined, * Tcl_DbNewLongObj calls Tcl_DbCkalloc directly with the file name and * line number from its caller. This simplifies debugging since then | | | | 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 | * Tcl_DbNewLongObj so that whether the Tcl core is compiled to do * memory debugging of the core is independent of whether a client * requests debugging for itself. * * When the core is compiled with TCL_MEM_DEBUG defined, * Tcl_DbNewLongObj calls Tcl_DbCkalloc directly with the file name and * line number from its caller. This simplifies debugging since then * the [memory active] command will report the caller's file name and * line number when reporting objects that haven't been freed. * * Otherwise, when the core is compiled without TCL_MEM_DEBUG defined, * this procedure just returns the result of calling Tcl_NewLongObj. * * Results: * The newly created long integer object is returned. This object * will have an invalid string representation. The returned object has |
| ︙ | ︙ | |||
2321 2322 2323 2324 2325 2326 2327 |
if (length == 0) {
break;
}
result += (result<<3) + c;
}
return result;
}
| > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 |
if (length == 0) {
break;
}
result += (result<<3) + c;
}
return result;
}
/*
*----------------------------------------------------------------------
*
* Tcl_GetCommandFromObj --
*
* Returns the command specified by the name in a Tcl_Obj.
*
* Results:
* Returns a token for the command if it is found. Otherwise, if it
* can't be found or there is an error, returns NULL.
*
* Side effects:
* May update the internal representation for the object, caching
* the command reference so that the next time this procedure is
* called with the same object, the command can be found quickly.
*
*----------------------------------------------------------------------
*/
Tcl_Command
Tcl_GetCommandFromObj(interp, objPtr)
Tcl_Interp *interp; /* The interpreter in which to resolve the
* command and to report errors. */
register Tcl_Obj *objPtr; /* The object containing the command's
* name. If the name starts with "::", will
* be looked up in global namespace. Else,
* looked up first in the current namespace
* if contextNsPtr is NULL, then in global
* namespace. */
{
Interp *iPtr = (Interp *) interp;
register ResolvedCmdName *resPtr;
register Command *cmdPtr;
Namespace *currNsPtr;
int result;
CallFrame *savedFramePtr;
char *name;
/*
* If the variable name is fully qualified, do as if the lookup were
* done from the global namespace; this helps avoid repeated lookups
* of fully qualified names. It costs close to nothing, and may be very
* helpful for OO applications which pass along a command name ("this"),
* [Patch 456668]
*/
savedFramePtr = iPtr->varFramePtr;
name = Tcl_GetString(objPtr);
if ((*name++ == ':') && (*name == ':')) {
iPtr->varFramePtr = NULL;
}
/*
* Get the internal representation, converting to a command type if
* needed. The internal representation is a ResolvedCmdName that points
* to the actual command.
*/
if (objPtr->typePtr != &tclCmdNameType) {
result = tclCmdNameType.setFromAnyProc(interp, objPtr);
if (result != TCL_OK) {
iPtr->varFramePtr = savedFramePtr;
return (Tcl_Command) NULL;
}
}
resPtr = (ResolvedCmdName *) objPtr->internalRep.otherValuePtr;
/*
* Get the current namespace.
*/
if (iPtr->varFramePtr != NULL) {
currNsPtr = iPtr->varFramePtr->nsPtr;
} else {
currNsPtr = iPtr->globalNsPtr;
}
/*
* Check the context namespace and the namespace epoch of the resolved
* symbol to make sure that it is fresh. If not, then force another
* conversion to the command type, to discard the old rep and create a
* new one. Note that we verify that the namespace id of the context
* namespace is the same as the one we cached; this insures that the
* namespace wasn't deleted and a new one created at the same address
* with the same command epoch.
*/
cmdPtr = NULL;
if ((resPtr != NULL)
&& (resPtr->refNsPtr == currNsPtr)
&& (resPtr->refNsId == currNsPtr->nsId)
&& (resPtr->refNsCmdEpoch == currNsPtr->cmdRefEpoch)) {
cmdPtr = resPtr->cmdPtr;
if (cmdPtr->cmdEpoch != resPtr->cmdEpoch) {
cmdPtr = NULL;
}
}
if (cmdPtr == NULL) {
result = tclCmdNameType.setFromAnyProc(interp, objPtr);
if (result != TCL_OK) {
iPtr->varFramePtr = savedFramePtr;
return (Tcl_Command) NULL;
}
resPtr = (ResolvedCmdName *) objPtr->internalRep.otherValuePtr;
if (resPtr != NULL) {
cmdPtr = resPtr->cmdPtr;
}
}
iPtr->varFramePtr = savedFramePtr;
return (Tcl_Command) cmdPtr;
}
/*
*----------------------------------------------------------------------
*
* TclSetCmdNameObj --
*
* Modify an object to be an CmdName object that refers to the argument
* Command structure.
*
* Results:
* None.
*
* Side effects:
* The object's old internal rep is freed. It's string rep is not
* changed. The refcount in the Command structure is incremented to
* keep it from being freed if the command is later deleted until
* TclExecuteByteCode has a chance to recognize that it was deleted.
*
*----------------------------------------------------------------------
*/
void
TclSetCmdNameObj(interp, objPtr, cmdPtr)
Tcl_Interp *interp; /* Points to interpreter containing command
* that should be cached in objPtr. */
register Tcl_Obj *objPtr; /* Points to Tcl object to be changed to
* a CmdName object. */
Command *cmdPtr; /* Points to Command structure that the
* CmdName object should refer to. */
{
Interp *iPtr = (Interp *) interp;
register ResolvedCmdName *resPtr;
Tcl_ObjType *oldTypePtr = objPtr->typePtr;
register Namespace *currNsPtr;
if (oldTypePtr == &tclCmdNameType) {
return;
}
/*
* Get the current namespace.
*/
if (iPtr->varFramePtr != NULL) {
currNsPtr = iPtr->varFramePtr->nsPtr;
} else {
currNsPtr = iPtr->globalNsPtr;
}
cmdPtr->refCount++;
resPtr = (ResolvedCmdName *) ckalloc(sizeof(ResolvedCmdName));
resPtr->cmdPtr = cmdPtr;
resPtr->refNsPtr = currNsPtr;
resPtr->refNsId = currNsPtr->nsId;
resPtr->refNsCmdEpoch = currNsPtr->cmdRefEpoch;
resPtr->cmdEpoch = cmdPtr->cmdEpoch;
resPtr->refCount = 1;
if ((oldTypePtr != NULL) && (oldTypePtr->freeIntRepProc != NULL)) {
oldTypePtr->freeIntRepProc(objPtr);
}
objPtr->internalRep.twoPtrValue.ptr1 = (VOID *) resPtr;
objPtr->internalRep.twoPtrValue.ptr2 = NULL;
objPtr->typePtr = &tclCmdNameType;
}
/*
*----------------------------------------------------------------------
*
* FreeCmdNameInternalRep --
*
* Frees the resources associated with a cmdName object's internal
* representation.
*
* Results:
* None.
*
* Side effects:
* Decrements the ref count of any cached ResolvedCmdName structure
* pointed to by the cmdName's internal representation. If this is
* the last use of the ResolvedCmdName, it is freed. This in turn
* decrements the ref count of the Command structure pointed to by
* the ResolvedSymbol, which may free the Command structure.
*
*----------------------------------------------------------------------
*/
static void
FreeCmdNameInternalRep(objPtr)
register Tcl_Obj *objPtr; /* CmdName object with internal
* representation to free. */
{
register ResolvedCmdName *resPtr =
(ResolvedCmdName *) objPtr->internalRep.otherValuePtr;
if (resPtr != NULL) {
/*
* Decrement the reference count of the ResolvedCmdName structure.
* If there are no more uses, free the ResolvedCmdName structure.
*/
resPtr->refCount--;
if (resPtr->refCount == 0) {
/*
* Now free the cached command, unless it is still in its
* hash table or if there are other references to it
* from other cmdName objects.
*/
Command *cmdPtr = resPtr->cmdPtr;
TclCleanupCommand(cmdPtr);
ckfree((char *) resPtr);
}
}
}
/*
*----------------------------------------------------------------------
*
* DupCmdNameInternalRep --
*
* Initialize the internal representation of an cmdName Tcl_Obj to a
* copy of the internal representation of an existing cmdName object.
*
* Results:
* None.
*
* Side effects:
* "copyPtr"s internal rep is set to point to the ResolvedCmdName
* structure corresponding to "srcPtr"s internal rep. Increments the
* ref count of the ResolvedCmdName structure pointed to by the
* cmdName's internal representation.
*
*----------------------------------------------------------------------
*/
static void
DupCmdNameInternalRep(srcPtr, copyPtr)
Tcl_Obj *srcPtr; /* Object with internal rep to copy. */
register Tcl_Obj *copyPtr; /* Object with internal rep to set. */
{
register ResolvedCmdName *resPtr =
(ResolvedCmdName *) srcPtr->internalRep.otherValuePtr;
copyPtr->internalRep.twoPtrValue.ptr1 = (VOID *) resPtr;
copyPtr->internalRep.twoPtrValue.ptr2 = NULL;
if (resPtr != NULL) {
resPtr->refCount++;
}
copyPtr->typePtr = &tclCmdNameType;
}
/*
*----------------------------------------------------------------------
*
* SetCmdNameFromAny --
*
* Generate an cmdName internal form for the Tcl object "objPtr".
*
* Results:
* The return value is a standard Tcl result. The conversion always
* succeeds and TCL_OK is returned.
*
* Side effects:
* A pointer to a ResolvedCmdName structure that holds a cached pointer
* to the command with a name that matches objPtr's string rep is
* stored as objPtr's internal representation. This ResolvedCmdName
* pointer will be NULL if no matching command was found. The ref count
* of the cached Command's structure (if any) is also incremented.
*
*----------------------------------------------------------------------
*/
static int
SetCmdNameFromAny(interp, objPtr)
Tcl_Interp *interp; /* Used for error reporting if not NULL. */
register Tcl_Obj *objPtr; /* The object to convert. */
{
Interp *iPtr = (Interp *) interp;
char *name;
Tcl_Command cmd;
register Command *cmdPtr;
Namespace *currNsPtr;
register ResolvedCmdName *resPtr;
/*
* Get "objPtr"s string representation. Make it up-to-date if necessary.
*/
name = objPtr->bytes;
if (name == NULL) {
name = Tcl_GetString(objPtr);
}
/*
* Find the Command structure, if any, that describes the command called
* "name". Build a ResolvedCmdName that holds a cached pointer to this
* Command, and bump the reference count in the referenced Command
* structure. A Command structure will not be deleted as long as it is
* referenced from a CmdName object.
*/
cmd = Tcl_FindCommand(interp, name, (Tcl_Namespace *) NULL,
/*flags*/ 0);
cmdPtr = (Command *) cmd;
if (cmdPtr != NULL) {
/*
* Get the current namespace.
*/
if (iPtr->varFramePtr != NULL) {
currNsPtr = iPtr->varFramePtr->nsPtr;
} else {
currNsPtr = iPtr->globalNsPtr;
}
cmdPtr->refCount++;
resPtr = (ResolvedCmdName *) ckalloc(sizeof(ResolvedCmdName));
resPtr->cmdPtr = cmdPtr;
resPtr->refNsPtr = currNsPtr;
resPtr->refNsId = currNsPtr->nsId;
resPtr->refNsCmdEpoch = currNsPtr->cmdRefEpoch;
resPtr->cmdEpoch = cmdPtr->cmdEpoch;
resPtr->refCount = 1;
} else {
resPtr = NULL; /* no command named "name" was found */
}
/*
* Free the old internalRep before setting the new one. We do this as
* late as possible to allow the conversion code, in particular
* GetStringFromObj, to use that old internalRep. If no Command
* structure was found, leave NULL as the cached value.
*/
if ((objPtr->typePtr != NULL)
&& (objPtr->typePtr->freeIntRepProc != NULL)) {
objPtr->typePtr->freeIntRepProc(objPtr);
}
objPtr->internalRep.twoPtrValue.ptr1 = (VOID *) resPtr;
objPtr->internalRep.twoPtrValue.ptr2 = NULL;
objPtr->typePtr = &tclCmdNameType;
return TCL_OK;
}
|
Changes to generic/tclParse.c.
1 2 3 4 5 6 | /* * tclParse.c -- * * This file contains procedures that parse Tcl scripts. They * do so in a general-purpose fashion that can be used for many * different purposes, including compilation, direct execution, | | < < | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | /* * tclParse.c -- * * This file contains procedures that parse Tcl scripts. They * do so in a general-purpose fashion that can be used for many * different purposes, including compilation, direct execution, * code analysis, etc. * * Copyright (c) 1997 Sun Microsystems, Inc. * Copyright (c) 1998-2000 Ajuba Solutions. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclParse.c,v 1.16.4.1 2002/02/05 02:22:00 wolfsuit Exp $ */ #include "tclInt.h" #include "tclPort.h" /* * The following table provides parsing information about each possible |
| ︙ | ︙ | |||
175 176 177 178 179 180 181 | * Prototypes for local procedures defined in this file: */ static int CommandComplete _ANSI_ARGS_((char *script, int length)); static int ParseTokens _ANSI_ARGS_((char *src, int mask, Tcl_Parse *parsePtr)); | < < < | 173 174 175 176 177 178 179 180 181 182 183 184 185 186 | * Prototypes for local procedures defined in this file: */ static int CommandComplete _ANSI_ARGS_((char *script, int length)); static int ParseTokens _ANSI_ARGS_((char *src, int mask, Tcl_Parse *parsePtr)); /* *---------------------------------------------------------------------- * * Tcl_ParseCommand -- * * Given a string, this procedure parses the first Tcl command |
| ︙ | ︙ | |||
751 752 753 754 755 756 757 |
parsePtr->tokenPtr = newPtr;
parsePtr->tokensAvailable = newCount;
}
/*
*----------------------------------------------------------------------
*
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 746 747 748 749 750 751 752 753 754 755 756 757 758 759 |
parsePtr->tokenPtr = newPtr;
parsePtr->tokensAvailable = newCount;
}
/*
*----------------------------------------------------------------------
*
* Tcl_ParseVarName --
*
* Given a string starting with a $ sign, parse off a variable
* name and return information about the parse.
*
* Results:
* The return value is TCL_OK if the command was parsed
|
| ︙ | ︙ | |||
1882 1883 1884 1885 1886 1887 1888 | * * Side effects: * None. * *---------------------------------------------------------------------- */ | | | 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 |
*
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
CONST char *
Tcl_ParseVar(interp, string, termPtr)
Tcl_Interp *interp; /* Context for looking up variable. */
register char *string; /* String containing variable name.
* First character must be "$". */
char **termPtr; /* If non-NULL, points to word to fill
* in with character just after last
* one in the variable specifier. */
|
| ︙ | ︙ |
Changes to generic/tclParseExpr.c.
| ︙ | ︙ | |||
8 9 10 11 12 13 14 | * * Copyright (c) 1997 Sun Microsystems, Inc. * Copyright (c) 1998-2000 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | * * Copyright (c) 1997 Sun Microsystems, Inc. * Copyright (c) 1998-2000 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclParseExpr.c,v 1.9.2.1 2002/02/05 02:22:00 wolfsuit Exp $ */ #include "tclInt.h" /* * The stuff below is a bit of a hack so that this file can be used in * environments that include no UNIX, i.e. no errno: just arrange to use |
| ︙ | ︙ | |||
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
char *lastChar; /* Points just after last byte of expr. */
} ParseInfo;
/*
* Definitions of the different lexemes that appear in expressions. The
* order of these must match the corresponding entries in the
* operatorStrings array below.
*/
#define LITERAL 0
#define FUNC_NAME 1
#define OPEN_BRACKET 2
#define OPEN_BRACE 3
#define OPEN_PAREN 4
#define CLOSE_PAREN 5
#define DOLLAR 6
#define QUOTE 7
#define COMMA 8
#define END 9
#define UNKNOWN 10
/*
| > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > | | < | < | > | | | 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 |
char *lastChar; /* Points just after last byte of expr. */
} ParseInfo;
/*
* Definitions of the different lexemes that appear in expressions. The
* order of these must match the corresponding entries in the
* operatorStrings array below.
*
* Basic lexemes:
*/
#define LITERAL 0
#define FUNC_NAME 1
#define OPEN_BRACKET 2
#define OPEN_BRACE 3
#define OPEN_PAREN 4
#define CLOSE_PAREN 5
#define DOLLAR 6
#define QUOTE 7
#define COMMA 8
#define END 9
#define UNKNOWN 10
#define UNKNOWN_CHAR 11
/*
* Binary numeric operators:
*/
#define MULT 12
#define DIVIDE 13
#define MOD 14
#define PLUS 15
#define MINUS 16
#define LEFT_SHIFT 17
#define RIGHT_SHIFT 18
#define LESS 19
#define GREATER 20
#define LEQ 21
#define GEQ 22
#define EQUAL 23
#define NEQ 24
#define BIT_AND 25
#define BIT_XOR 26
#define BIT_OR 27
#define AND 28
#define OR 29
#define QUESTY 30
#define COLON 31
/*
* Unary operators. Unary minus and plus are represented by the (binary)
* lexemes MINUS and PLUS.
*/
#define NOT 32
#define BIT_NOT 33
/*
* Binary string operators:
*/
#define STREQ 34
#define STRNEQ 35
/*
* Mapping from lexemes to strings; used for debugging messages. These
* entries must match the order and number of the lexeme definitions above.
*/
static char *lexemeStrings[] = {
"LITERAL", "FUNCNAME",
"[", "{", "(", ")", "$", "\"", ",", "END", "UNKNOWN", "UNKNOWN_CHAR",
"*", "/", "%", "+", "-",
"<<", ">>", "<", ">", "<=", ">=", "==", "!=",
"&", "^", "|", "&&", "||", "?", ":",
"!", "~", "eq", "ne",
};
/*
* Declarations for local procedures to this file:
*/
static int GetLexeme _ANSI_ARGS_((ParseInfo *infoPtr));
static void LogSyntaxError _ANSI_ARGS_((ParseInfo *infoPtr,
char *extraInfo));
static int ParseAddExpr _ANSI_ARGS_((ParseInfo *infoPtr));
static int ParseBitAndExpr _ANSI_ARGS_((ParseInfo *infoPtr));
static int ParseBitOrExpr _ANSI_ARGS_((ParseInfo *infoPtr));
static int ParseBitXorExpr _ANSI_ARGS_((ParseInfo *infoPtr));
static int ParseCondExpr _ANSI_ARGS_((ParseInfo *infoPtr));
static int ParseEqualityExpr _ANSI_ARGS_((ParseInfo *infoPtr));
static int ParseLandExpr _ANSI_ARGS_((ParseInfo *infoPtr));
static int ParseLorExpr _ANSI_ARGS_((ParseInfo *infoPtr));
static int ParseMultiplyExpr _ANSI_ARGS_((ParseInfo *infoPtr));
static int ParsePrimaryExpr _ANSI_ARGS_((ParseInfo *infoPtr));
static int ParseRelationalExpr _ANSI_ARGS_((ParseInfo *infoPtr));
static int ParseShiftExpr _ANSI_ARGS_((ParseInfo *infoPtr));
static int ParseUnaryExpr _ANSI_ARGS_((ParseInfo *infoPtr));
static void PrependSubExprTokens _ANSI_ARGS_((char *op,
int opBytes, char *src, int srcBytes,
int firstIndex, ParseInfo *infoPtr));
/*
* Macro used to debug the execution of the recursive descent parser used
* to parse expressions.
*/
#ifdef TCL_COMPILE_DEBUG
|
| ︙ | ︙ | |||
277 278 279 280 281 282 283 |
goto error;
}
code = ParseCondExpr(&info);
if (code != TCL_OK) {
goto error;
}
if (info.lexeme != END) {
| | | 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 |
goto error;
}
code = ParseCondExpr(&info);
if (code != TCL_OK) {
goto error;
}
if (info.lexeme != END) {
LogSyntaxError(&info, "extra tokens at end of expression");
goto error;
}
string[numBytes] = (char) savedChar;
return TCL_OK;
error:
string[numBytes] = (char) savedChar;
|
| ︙ | ︙ | |||
383 384 385 386 387 388 389 |
*/
code = ParseCondExpr(infoPtr);
if (code != TCL_OK) {
return code;
}
if (infoPtr->lexeme != COLON) {
| | | 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 |
*/
code = ParseCondExpr(infoPtr);
if (code != TCL_OK) {
return code;
}
if (infoPtr->lexeme != COLON) {
LogSyntaxError(infoPtr, "missing colon from ternary conditional");
return TCL_ERROR;
}
code = GetLexeme(infoPtr); /* skip over the ':' */
if (code != TCL_OK) {
return code;
}
|
| ︙ | ︙ | |||
1144 1145 1146 1147 1148 1149 1150 |
return code;
}
code = ParseCondExpr(infoPtr);
if (code != TCL_OK) {
return code;
}
if (infoPtr->lexeme != CLOSE_PAREN) {
| | > | 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 |
return code;
}
code = ParseCondExpr(infoPtr);
if (code != TCL_OK) {
return code;
}
if (infoPtr->lexeme != CLOSE_PAREN) {
LogSyntaxError(infoPtr, "looking for close parenthesis");
return TCL_ERROR;
}
code = GetLexeme(infoPtr); /* skip over the ')' */
if (code != TCL_OK) {
return code;
}
return TCL_OK;
}
|
| ︙ | ︙ | |||
1374 1375 1376 1377 1378 1379 1380 |
parsePtr->numTokens++;
code = GetLexeme(infoPtr); /* skip over function name */
if (code != TCL_OK) {
return code;
}
if (infoPtr->lexeme != OPEN_PAREN) {
| > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > | > > > | > > < < < < | 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 |
parsePtr->numTokens++;
code = GetLexeme(infoPtr); /* skip over function name */
if (code != TCL_OK) {
return code;
}
if (infoPtr->lexeme != OPEN_PAREN) {
/*
* Guess what kind of error we have by trying to tell
* whether we have a function or variable name here.
* Alas, this makes the parser more tightly bound with the
* rest of the interpreter, but that is the only way to
* give a sensible message here. Still, it is not too
* serious as this is only done when generating an error.
*/
Interp *iPtr = (Interp *) infoPtr->parsePtr->interp;
char savedChar;
Tcl_HashEntry *hPtr;
/*
* Look up the name as a function name; note that this
* requires the expression to be in writable memory.
*/
savedChar = tokenPtr->start[tokenPtr->size];
tokenPtr->start[tokenPtr->size] = '\0';
hPtr = Tcl_FindHashEntry(&iPtr->mathFuncTable, tokenPtr->start);
tokenPtr->start[tokenPtr->size] = savedChar;
/*
* Assume that we have an attempted variable reference
* unless we've got a function name, as the set of
* potential function names is typically much smaller.
*/
if (hPtr != NULL) {
LogSyntaxError(infoPtr,
"expected parenthesis enclosing function arguments");
} else {
LogSyntaxError(infoPtr,
"variable references require preceding $");
}
return TCL_ERROR;
}
code = GetLexeme(infoPtr); /* skip over '(' */
if (code != TCL_OK) {
return code;
}
while (infoPtr->lexeme != CLOSE_PAREN) {
code = ParseCondExpr(infoPtr);
if (code != TCL_OK) {
return code;
}
if (infoPtr->lexeme == COMMA) {
code = GetLexeme(infoPtr); /* skip over , */
if (code != TCL_OK) {
return code;
}
} else if (infoPtr->lexeme != CLOSE_PAREN) {
LogSyntaxError(infoPtr,
"missing close parenthesis at end of function call");
return TCL_ERROR;
}
}
exprTokenPtr = &parsePtr->tokenPtr[exprIndex];
exprTokenPtr->size = (infoPtr->next - exprTokenPtr->start);
exprTokenPtr->numComponents = parsePtr->numTokens - firstIndex;
break;
case COMMA:
LogSyntaxError(infoPtr,
"commas can only separate function arguments");
return TCL_ERROR;
case END:
LogSyntaxError(infoPtr, "premature end of expression");
return TCL_ERROR;
case UNKNOWN:
LogSyntaxError(infoPtr, "single equality character not legal in expressions");
return TCL_ERROR;
case UNKNOWN_CHAR:
LogSyntaxError(infoPtr, "character not legal in expressions");
return TCL_ERROR;
case QUESTY:
LogSyntaxError(infoPtr, "unexpected ternary 'then' separator");
return TCL_ERROR;
case COLON:
LogSyntaxError(infoPtr, "unexpected ternary 'else' separator");
return TCL_ERROR;
case CLOSE_PAREN:
LogSyntaxError(infoPtr, "unexpected close parenthesis");
return TCL_ERROR;
default: {
char buf[64];
sprintf(buf, "unexpected operator %s", lexemeStrings[lexeme]);
LogSyntaxError(infoPtr, buf);
return TCL_ERROR;
}
}
/*
* Advance to the next lexeme before returning.
*/
code = GetLexeme(infoPtr);
if (code != TCL_OK) {
return code;
}
parsePtr->term = infoPtr->next;
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
* GetLexeme --
*
|
| ︙ | ︙ | |||
1819 1820 1821 1822 1823 1824 1825 | infoPtr->lexeme = LITERAL; return TCL_OK; } break; } return TCL_OK; } | | | 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 |
infoPtr->lexeme = LITERAL;
return TCL_OK;
}
break;
}
return TCL_OK;
}
infoPtr->lexeme = UNKNOWN_CHAR;
return TCL_OK;
}
}
/*
*----------------------------------------------------------------------
*
|
| ︙ | ︙ | |||
1899 1900 1901 1902 1903 1904 1905 | * describing the error. * * Results: * None. * * Side effects: * Sets the interpreter result to an error message describing the | | > | > > > | | > > > > | | 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 |
* describing the error.
*
* Results:
* None.
*
* Side effects:
* Sets the interpreter result to an error message describing the
* expression that was being parsed when the error occurred, and why
* the parser considers that to be a syntax error at all.
*
*----------------------------------------------------------------------
*/
static void
LogSyntaxError(infoPtr, extraInfo)
ParseInfo *infoPtr; /* Holds the parse state for the
* expression being parsed. */
char *extraInfo; /* String to provide extra information
* about the syntax error. */
{
int numBytes = (infoPtr->lastChar - infoPtr->originalExpr);
char buffer[100];
if (numBytes > 60) {
sprintf(buffer, "syntax error in expression \"%.60s...\"",
infoPtr->originalExpr);
} else {
sprintf(buffer, "syntax error in expression \"%s\"",
infoPtr->originalExpr);
}
Tcl_AppendStringsToObj(Tcl_GetObjResult(infoPtr->parsePtr->interp),
buffer, ": ", extraInfo, (char *) NULL);
infoPtr->parsePtr->errorType = TCL_PARSE_SYNTAX;
infoPtr->parsePtr->term = infoPtr->start;
}
|
Changes to generic/tclPipe.c.
1 2 3 4 5 6 7 8 9 10 11 12 | /* * tclPipe.c -- * * This file contains the generic portion of the command channel * driver as well as various utility routines used in managing * subprocesses. * * Copyright (c) 1997 by Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /* * tclPipe.c -- * * This file contains the generic portion of the command channel * driver as well as various utility routines used in managing * subprocesses. * * Copyright (c) 1997 by Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclPipe.c,v 1.3.28.1 2002/02/05 02:22:00 wolfsuit Exp $ */ #include "tclInt.h" #include "tclPort.h" /* * A linked list of the following structures is used to keep track |
| ︙ | ︙ | |||
35 36 37 38 39 40 41 | TCL_DECLARE_MUTEX(pipeMutex) /* Guard access to detList. */ /* * Declarations for local procedures defined in this file: */ static TclFile FileForRedirect _ANSI_ARGS_((Tcl_Interp *interp, | | > | | 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | TCL_DECLARE_MUTEX(pipeMutex) /* Guard access to detList. */ /* * Declarations for local procedures defined in this file: */ static TclFile FileForRedirect _ANSI_ARGS_((Tcl_Interp *interp, CONST char *spec, int atOk, CONST char *arg, CONST char *nextArg, int flags, int *skipPtr, int *closePtr, int *releasePtr)); /* *---------------------------------------------------------------------- * * FileForRedirect -- * * This procedure does much of the work of parsing redirection |
| ︙ | ︙ | |||
63 64 65 66 67 68 69 |
*----------------------------------------------------------------------
*/
static TclFile
FileForRedirect(interp, spec, atOK, arg, nextArg, flags, skipPtr, closePtr,
releasePtr)
Tcl_Interp *interp; /* Intepreter to use for error reporting. */
| | | | | 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
*----------------------------------------------------------------------
*/
static TclFile
FileForRedirect(interp, spec, atOK, arg, nextArg, flags, skipPtr, closePtr,
releasePtr)
Tcl_Interp *interp; /* Intepreter to use for error reporting. */
CONST char *spec; /* Points to character just after
* redirection character. */
CONST char *arg; /* Pointer to entire argument containing
* spec: used for error reporting. */
int atOK; /* Non-zero means that '@' notation can be
* used to specify a channel, zero means that
* it isn't. */
CONST char *nextArg; /* Next argument in argc/argv array, if needed
* for file name or channel name. May be
* NULL. */
int flags; /* Flags to use for opening file or to
* specify mode for channel. */
int *skipPtr; /* Filled with 1 if redirection target was
* in spec, 2 if it was in nextArg. */
int *closePtr; /* Filled with one if the caller should
|
| ︙ | ︙ | |||
119 120 121 122 123 124 125 |
* written by the child appears after stuff we've already
* written.
*/
Tcl_Flush(chan);
}
} else {
| | | 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
* written by the child appears after stuff we've already
* written.
*/
Tcl_Flush(chan);
}
} else {
CONST char *name;
Tcl_DString nameString;
if (*spec == '\0') {
spec = nextArg;
if (spec == NULL) {
goto badLastArg;
}
|
| ︙ | ︙ | |||
274 275 276 277 278 279 280 |
* from pipeline. NULL means there isn't any
* stderr output. */
{
int result = TCL_OK;
int i, abnormalExit, anyErrorInfo;
Tcl_Pid pid;
WAIT_STATUS_TYPE waitStatus;
| | | 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 |
* from pipeline. NULL means there isn't any
* stderr output. */
{
int result = TCL_OK;
int i, abnormalExit, anyErrorInfo;
Tcl_Pid pid;
WAIT_STATUS_TYPE waitStatus;
CONST char *msg;
abnormalExit = 0;
for (i = 0; i < numPids; i++) {
pid = Tcl_WaitPid(pidPtr[i], (int *) &waitStatus, 0);
if (pid == (Tcl_Pid) -1) {
result = TCL_ERROR;
if (interp != (Tcl_Interp *) NULL) {
|
| ︙ | ︙ | |||
320 321 322 323 324 325 326 |
TclFormatInt(msg2, WEXITSTATUS(waitStatus));
Tcl_SetErrorCode(interp, "CHILDSTATUS", msg1, msg2,
(char *) NULL);
}
abnormalExit = 1;
} else if (WIFSIGNALED(waitStatus)) {
if (interp != (Tcl_Interp *) NULL) {
| | | | 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 |
TclFormatInt(msg2, WEXITSTATUS(waitStatus));
Tcl_SetErrorCode(interp, "CHILDSTATUS", msg1, msg2,
(char *) NULL);
}
abnormalExit = 1;
} else if (WIFSIGNALED(waitStatus)) {
if (interp != (Tcl_Interp *) NULL) {
CONST char *p;
p = Tcl_SignalMsg((int) (WTERMSIG(waitStatus)));
Tcl_SetErrorCode(interp, "CHILDKILLED", msg1,
Tcl_SignalId((int) (WTERMSIG(waitStatus))), p,
(char *) NULL);
Tcl_AppendResult(interp, "child killed: ", p, "\n",
(char *) NULL);
}
} else if (WIFSTOPPED(waitStatus)) {
if (interp != (Tcl_Interp *) NULL) {
CONST char *p;
p = Tcl_SignalMsg((int) (WSTOPSIG(waitStatus)));
Tcl_SetErrorCode(interp, "CHILDSUSP", msg1,
Tcl_SignalId((int) (WSTOPSIG(waitStatus))),
p, (char *) NULL);
Tcl_AppendResult(interp, "child suspended: ", p, "\n",
(char *) NULL);
|
| ︙ | ︙ | |||
435 436 437 438 439 440 441 |
*/
int
TclCreatePipeline(interp, argc, argv, pidArrayPtr, inPipePtr,
outPipePtr, errFilePtr)
Tcl_Interp *interp; /* Interpreter to use for error reporting. */
int argc; /* Number of entries in argv. */
| | | 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 |
*/
int
TclCreatePipeline(interp, argc, argv, pidArrayPtr, inPipePtr,
outPipePtr, errFilePtr)
Tcl_Interp *interp; /* Interpreter to use for error reporting. */
int argc; /* Number of entries in argv. */
CONST char **argv; /* Array of strings describing commands in
* pipeline plus I/O redirection with <,
* <<, >, etc. Argv[argc] must be NULL. */
Tcl_Pid **pidArrayPtr; /* Word at *pidArrayPtr gets filled in with
* address of array of pids for processes
* in pipeline (first pid is first process
* in pipeline). */
TclFile *inPipePtr; /* If non-NULL, input to the pipeline comes
|
| ︙ | ︙ | |||
472 473 474 475 476 477 478 |
{
Tcl_Pid *pidPtr = NULL; /* Points to malloc-ed array holding all
* the pids of child processes. */
int numPids; /* Actual number of processes that exist
* at *pidPtr right now. */
int cmdCount; /* Count of number of distinct commands
* found in argc/argv. */
| | | 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 |
{
Tcl_Pid *pidPtr = NULL; /* Points to malloc-ed array holding all
* the pids of child processes. */
int numPids; /* Actual number of processes that exist
* at *pidPtr right now. */
int cmdCount; /* Count of number of distinct commands
* found in argc/argv. */
CONST char *inputLiteral = NULL; /* If non-null, then this points to a
* string containing input data (specified
* via <<) to be piped to the first process
* in the pipeline. */
TclFile inputFile = NULL; /* If != NULL, gives file to use as input for
* first process in pipeline (specified via <
* or <@). */
int inputClose = 0; /* If non-zero, then inputFile should be
|
| ︙ | ︙ | |||
494 495 496 497 498 499 500 |
int outputRelease = 0;
TclFile errorFile = NULL; /* Writable file for error output from all
* commands in pipeline. NULL means use
* stderr. */
int errorClose = 0; /* If non-zero, then errorFile should be
* closed when cleaning up. */
int errorRelease = 0;
| | | 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 |
int outputRelease = 0;
TclFile errorFile = NULL; /* Writable file for error output from all
* commands in pipeline. NULL means use
* stderr. */
int errorClose = 0; /* If non-zero, then errorFile should be
* closed when cleaning up. */
int errorRelease = 0;
CONST char *p;
int skip, lastBar, lastArg, i, j, atOK, flags, errorToOutput;
Tcl_DString execBuffer;
TclFile pipeIn;
TclFile curInFile, curOutFile, curErrFile;
Tcl_Channel channel;
if (inPipePtr != NULL) {
|
| ︙ | ︙ | |||
798 799 800 801 802 803 804 |
pidPtr = (Tcl_Pid *) ckalloc((unsigned) (cmdCount * sizeof(Tcl_Pid)));
curInFile = inputFile;
for (i = 0; i < argc; i = lastArg + 1) {
int result, joinThisError;
Tcl_Pid pid;
| | | 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 |
pidPtr = (Tcl_Pid *) ckalloc((unsigned) (cmdCount * sizeof(Tcl_Pid)));
curInFile = inputFile;
for (i = 0; i < argc; i = lastArg + 1) {
int result, joinThisError;
Tcl_Pid pid;
CONST char *oldName;
/*
* Convert the program name into native form.
*/
if (Tcl_TranslateFileName(interp, argv[i], &execBuffer) == NULL) {
goto error;
|
| ︙ | ︙ | |||
988 989 990 991 992 993 994 |
*/
Tcl_Channel
Tcl_OpenCommandChannel(interp, argc, argv, flags)
Tcl_Interp *interp; /* Interpreter for error reporting. Can
* NOT be NULL. */
int argc; /* How many arguments. */
| | | 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 |
*/
Tcl_Channel
Tcl_OpenCommandChannel(interp, argc, argv, flags)
Tcl_Interp *interp; /* Interpreter for error reporting. Can
* NOT be NULL. */
int argc; /* How many arguments. */
CONST char **argv; /* Array of arguments for command pipe. */
int flags; /* Or'ed combination of TCL_STDIN, TCL_STDOUT,
* TCL_STDERR, and TCL_ENFORCE_MODE. */
{
TclFile *inPipePtr, *outPipePtr, *errFilePtr;
TclFile inPipe, outPipe, errFile;
int numPids;
Tcl_Pid *pidPtr;
|
| ︙ | ︙ |
Changes to generic/tclPkg.c.
1 2 3 4 5 6 7 8 9 10 11 | /* * tclPkg.c -- * * This file implements package and version control for Tcl via * the "package" command and a few C APIs. * * Copyright (c) 1996 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | /* * tclPkg.c -- * * This file implements package and version control for Tcl via * the "package" command and a few C APIs. * * Copyright (c) 1996 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclPkg.c,v 1.7.8.1 2002/02/05 02:22:00 wolfsuit Exp $ */ #include "tclInt.h" /* * Each invocation of the "package ifneeded" command creates a structure * of the following type, which is used to load the package into the |
| ︙ | ︙ | |||
466 467 468 469 470 471 472 |
int
Tcl_PackageObjCmd(dummy, interp, objc, objv)
ClientData dummy; /* Not used. */
Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
| | | 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 |
int
Tcl_PackageObjCmd(dummy, interp, objc, objv)
ClientData dummy; /* Not used. */
Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
static CONST char *pkgOptions[] = {
"forget", "ifneeded", "names", "present", "provide", "require",
"unknown", "vcompare", "versions", "vsatisfies", (char *) NULL
};
enum pkgOptions {
PKG_FORGET, PKG_IFNEEDED, PKG_NAMES, PKG_PRESENT,
PKG_PROVIDE, PKG_REQUIRE, PKG_UNKNOWN, PKG_VCOMPARE,
PKG_VERSIONS, PKG_VSATISFIES
|
| ︙ | ︙ |
Changes to generic/tclPlatDecls.h.
1 2 3 4 5 6 7 8 | /* * tclPlatDecls.h -- * * Declarations of platform specific Tcl APIs. * * Copyright (c) 1998-1999 by Scriptics Corporation. * All rights reserved. * | | | < < > > > > | | | | | | | 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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
/*
* tclPlatDecls.h --
*
* Declarations of platform specific Tcl APIs.
*
* Copyright (c) 1998-1999 by Scriptics Corporation.
* All rights reserved.
*
* RCS: @(#) $Id: tclPlatDecls.h,v 1.12.6.2 2002/02/05 02:22:00 wolfsuit Exp $
*/
#ifndef _TCLPLATDECLS
#define _TCLPLATDECLS
/*
* Pull in the typedef of TCHAR for windows.
*/
#if defined(__WIN32__) && !defined(_TCHAR_DEFINED)
# include <tchar.h>
# ifndef _TCHAR_DEFINED
/* Borland seems to forget to set this. */
typedef _TCHAR TCHAR;
# define _TCHAR_DEFINED
# endif
# if defined(_MSC_VER) && defined(__STDC__)
/* MSVC++ misses this. */
typedef _TCHAR TCHAR;
# endif
#endif
/* !BEGIN!: Do not edit below this line. */
/*
* Exported function declarations:
*/
#ifdef __WIN32__
/* 0 */
EXTERN CONST TCHAR * Tcl_WinUtfToTChar _ANSI_ARGS_((CONST char * str,
int len, Tcl_DString * dsPtr));
/* 1 */
EXTERN CONST char * Tcl_WinTCharToUtf _ANSI_ARGS_((CONST TCHAR * str,
int len, Tcl_DString * dsPtr));
#endif /* __WIN32__ */
#ifdef MAC_TCL
/* 0 */
EXTERN void Tcl_MacSetEventProc _ANSI_ARGS_((
Tcl_MacConvertEventPtr procPtr));
/* 1 */
EXTERN char * Tcl_MacConvertTextResource _ANSI_ARGS_((
Handle resource));
/* 2 */
EXTERN int Tcl_MacEvalResource _ANSI_ARGS_((Tcl_Interp * interp,
CONST char * resourceName,
int resourceNumber, CONST char * fileName));
/* 3 */
EXTERN Handle Tcl_MacFindResource _ANSI_ARGS_((Tcl_Interp * interp,
long resourceType, CONST char * resourceName,
int resourceNumber, CONST char * resFileRef,
int * releaseIt));
/* 4 */
EXTERN int Tcl_GetOSTypeFromObj _ANSI_ARGS_((
Tcl_Interp * interp, Tcl_Obj * objPtr,
OSType * osTypePtr));
/* 5 */
EXTERN void Tcl_SetOSTypeObj _ANSI_ARGS_((Tcl_Obj * objPtr,
|
| ︙ | ︙ | |||
82 83 84 85 86 87 88 |
#endif /* MAC_OSX_TCL */
typedef struct TclPlatStubs {
int magic;
struct TclPlatStubHooks *hooks;
#ifdef __WIN32__
| | | | | | 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
#endif /* MAC_OSX_TCL */
typedef struct TclPlatStubs {
int magic;
struct TclPlatStubHooks *hooks;
#ifdef __WIN32__
CONST TCHAR * (*tcl_WinUtfToTChar) _ANSI_ARGS_((CONST char * str, int len, Tcl_DString * dsPtr)); /* 0 */
CONST char * (*tcl_WinTCharToUtf) _ANSI_ARGS_((CONST TCHAR * str, int len, Tcl_DString * dsPtr)); /* 1 */
#endif /* __WIN32__ */
#ifdef MAC_TCL
void (*tcl_MacSetEventProc) _ANSI_ARGS_((Tcl_MacConvertEventPtr procPtr)); /* 0 */
char * (*tcl_MacConvertTextResource) _ANSI_ARGS_((Handle resource)); /* 1 */
int (*tcl_MacEvalResource) _ANSI_ARGS_((Tcl_Interp * interp, CONST char * resourceName, int resourceNumber, CONST char * fileName)); /* 2 */
Handle (*tcl_MacFindResource) _ANSI_ARGS_((Tcl_Interp * interp, long resourceType, CONST char * resourceName, int resourceNumber, CONST char * resFileRef, int * releaseIt)); /* 3 */
int (*tcl_GetOSTypeFromObj) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * objPtr, OSType * osTypePtr)); /* 4 */
void (*tcl_SetOSTypeObj) _ANSI_ARGS_((Tcl_Obj * objPtr, OSType osType)); /* 5 */
Tcl_Obj * (*tcl_NewOSTypeObj) _ANSI_ARGS_((OSType osType)); /* 6 */
int (*strncasecmp) _ANSI_ARGS_((CONST char * s1, CONST char * s2, size_t n)); /* 7 */
int (*strcasecmp) _ANSI_ARGS_((CONST char * s1, CONST char * s2)); /* 8 */
#endif /* MAC_TCL */
#ifdef MAC_OSX_TCL
|
| ︙ | ︙ |
Changes to generic/tclPosixStr.c.
1 2 3 4 5 6 7 8 9 10 11 12 13 | /* * tclPosixStr.c -- * * This file contains procedures that generate strings * corresponding to various POSIX-related codes, such * as errno and signals. * * Copyright (c) 1991-1994 The Regents of the University of California. * Copyright (c) 1994-1996 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | /* * tclPosixStr.c -- * * This file contains procedures that generate strings * corresponding to various POSIX-related codes, such * as errno and signals. * * Copyright (c) 1991-1994 The Regents of the University of California. * Copyright (c) 1994-1996 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclPosixStr.c,v 1.6.14.1 2002/02/05 02:22:00 wolfsuit Exp $ */ #include "tclInt.h" #include "tclPort.h" /* *---------------------------------------------------------------------- |
| ︙ | ︙ | |||
31 32 33 34 35 36 37 | * * Side effects: * None. * *---------------------------------------------------------------------- */ | | | 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
*
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
CONST char *
Tcl_ErrnoId()
{
switch (errno) {
#ifdef E2BIG
case E2BIG: return "E2BIG";
#endif
#ifdef EACCES
|
| ︙ | ︙ | |||
476 477 478 479 480 481 482 | * * Side effects: * None. * *---------------------------------------------------------------------- */ | | | 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 |
*
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
CONST char *
Tcl_ErrnoMsg(err)
int err; /* Error number (such as in errno variable). */
{
switch (err) {
#ifdef E2BIG
case E2BIG: return "argument list too long";
#endif
|
| ︙ | ︙ | |||
923 924 925 926 927 928 929 | * * Side effects: * None. * *---------------------------------------------------------------------- */ | | | 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 |
*
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
CONST char *
Tcl_SignalId(sig)
int sig; /* Number of signal. */
{
switch (sig) {
#ifdef SIGABRT
case SIGABRT: return "SIGABRT";
#endif
|
| ︙ | ︙ | |||
1055 1056 1057 1058 1059 1060 1061 | * * Side effects: * None. * *---------------------------------------------------------------------- */ | | | 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 |
*
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
CONST char *
Tcl_SignalMsg(sig)
int sig; /* Number of signal. */
{
switch (sig) {
#ifdef SIGABRT
case SIGABRT: return "SIGABRT";
#endif
|
| ︙ | ︙ |
Changes to generic/tclProc.c.
1 2 3 4 5 6 7 8 9 10 11 12 | /* * tclProc.c -- * * This file contains routines that implement Tcl procedures, * including the "proc" and "uplevel" commands. * * Copyright (c) 1987-1993 The Regents of the University of California. * Copyright (c) 1994-1998 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /* * tclProc.c -- * * This file contains routines that implement Tcl procedures, * including the "proc" and "uplevel" commands. * * Copyright (c) 1987-1993 The Regents of the University of California. * Copyright (c) 1994-1998 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclProc.c,v 1.29.2.1 2002/02/05 02:22:00 wolfsuit Exp $ */ #include "tclInt.h" #include "tclCompile.h" /* * Prototypes for static functions in this file |
| ︙ | ︙ | |||
66 67 68 69 70 71 72 |
Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
register Interp *iPtr = (Interp *) interp;
Proc *procPtr;
char *fullName;
| | | 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
register Interp *iPtr = (Interp *) interp;
Proc *procPtr;
char *fullName;
CONST char *procName, *procArgs, *procBody;
Namespace *nsPtr, *altNsPtr, *cxtNsPtr;
Tcl_Command cmd;
Tcl_DString ds;
if (objc != 4) {
Tcl_WrongNumArgs(interp, 1, objv, "name args body");
return TCL_ERROR;
|
| ︙ | ︙ | |||
160 161 162 163 164 165 166 |
* seem to make a lot of sense to verify the number of arguments we
* are about to ignore ...
* - could be enhanced to handle also non-empty bodies that contain
* only comments; however, parsing the body will slow down the
* compilation of all procs whose argument list is just _args_
*/
| < < | | | > | > | | | | | | | | | | | | | | | | | | | | | | | | | | < | 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 |
* seem to make a lot of sense to verify the number of arguments we
* are about to ignore ...
* - could be enhanced to handle also non-empty bodies that contain
* only comments; however, parsing the body will slow down the
* compilation of all procs whose argument list is just _args_
*/
procArgs = Tcl_GetString(objv[2]);
while(*procArgs == ' ') {
procArgs++;
}
if ((procArgs[0] == 'a') && (strncmp(procArgs, "args", 4) == 0)) {
procArgs +=4;
while(*procArgs != '\0') {
if (*procArgs != ' ') {
goto done;
}
procArgs++;
}
/*
* The argument list is just "args"; check the body
*/
procBody = Tcl_GetString(objv[3]);
while(*procBody != '\0') {
if (!isspace(UCHAR(*procBody))) {
goto done;
}
procBody++;
}
/*
* The body is just spaces: link the compileProc
*/
((Command *) cmd)->compileProc = TclCompileNoOp;
}
done:
return TCL_OK;
}
/*
|
| ︙ | ︙ | |||
232 233 234 235 236 237 238 |
Namespace *nsPtr; /* namespace containing this proc */
CONST char *procName; /* unqualified name of this proc */
Tcl_Obj *argsPtr; /* description of arguments */
Tcl_Obj *bodyPtr; /* command body */
Proc **procPtrPtr; /* returns: pointer to proc data */
{
Interp *iPtr = (Interp*)interp;
| | | | 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 |
Namespace *nsPtr; /* namespace containing this proc */
CONST char *procName; /* unqualified name of this proc */
Tcl_Obj *argsPtr; /* description of arguments */
Tcl_Obj *bodyPtr; /* command body */
Proc **procPtrPtr; /* returns: pointer to proc data */
{
Interp *iPtr = (Interp*)interp;
CONST char **argArray = NULL;
register Proc *procPtr;
int i, length, result, numArgs;
CONST char *args, *bytes, *p;
register CompiledLocal *localPtr = NULL;
Tcl_Obj *defPtr;
int precompiled = 0;
if (bodyPtr->typePtr == &tclProcBodyType) {
/*
* Because the body is a TclProProcBody, the actual body is already
|
| ︙ | ︙ | |||
332 333 334 335 336 337 338 |
localPtr = procPtr->firstLocalPtr;
} else {
procPtr->numArgs = numArgs;
procPtr->numCompiledLocals = numArgs;
}
for (i = 0; i < numArgs; i++) {
int fieldCount, nameLength, valueLength;
| | | 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 |
localPtr = procPtr->firstLocalPtr;
} else {
procPtr->numArgs = numArgs;
procPtr->numCompiledLocals = numArgs;
}
for (i = 0; i < numArgs; i++) {
int fieldCount, nameLength, valueLength;
CONST char **fieldValues;
/*
* Now divide the specifier up into name and default.
*/
result = Tcl_SplitList(interp, argArray[i], &fieldCount,
&fieldValues);
|
| ︙ | ︙ | |||
372 373 374 375 376 377 378 |
/*
* Check that the formal parameter name is a scalar.
*/
p = fieldValues[0];
while (*p != '\0') {
if (*p == '(') {
| | | 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 |
/*
* Check that the formal parameter name is a scalar.
*/
p = fieldValues[0];
while (*p != '\0') {
if (*p == '(') {
CONST char *q = p;
do {
q++;
} while (*q != '\0');
q--;
if (*q == ')') { /* we have an array element */
Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),
"procedure \"", procName,
|
| ︙ | ︙ | |||
1653 1654 1655 1656 1657 1658 1659 | * TclCompileNoOp -- * * Procedure called to compile noOp's * * Results: * The return value is TCL_OK, indicating successful compilation. * | < < < > < > > > | 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 |
* TclCompileNoOp --
*
* Procedure called to compile noOp's
*
* Results:
* The return value is TCL_OK, indicating successful compilation.
*
* Side effects:
* Instructions are added to envPtr to execute a noOp at runtime.
*
*----------------------------------------------------------------------
*/
static int
TclCompileNoOp(interp, parsePtr, envPtr)
Tcl_Interp *interp; /* Used for error reporting. */
Tcl_Parse *parsePtr; /* Points to a parse structure for the
* command created by Tcl_ParseCommand. */
CompileEnv *envPtr; /* Holds resulting instructions. */
{
Tcl_Token *tokenPtr;
int i, code;
int savedStackDepth = envPtr->currStackDepth;
tokenPtr = parsePtr->tokenPtr;
for(i = 1; i < parsePtr->numWords; i++) {
tokenPtr = tokenPtr + tokenPtr->numComponents + 1;
envPtr->currStackDepth = savedStackDepth;
if (tokenPtr->type != TCL_TOKEN_SIMPLE_WORD) {
code = TclCompileTokens(interp, tokenPtr+1,
tokenPtr->numComponents, envPtr);
if (code != TCL_OK) {
return code;
}
TclEmitOpcode(INST_POP, envPtr);
}
}
envPtr->currStackDepth = savedStackDepth;
TclEmitPush(TclRegisterLiteral(envPtr, "", 0, /*onHeap*/ 0), envPtr);
return TCL_OK;
}
|
Changes to generic/tclRegexp.c.
1 2 3 4 5 6 7 8 9 10 11 12 | /* * tclRegexp.c -- * * This file contains the public interfaces to the Tcl regular * expression mechanism. * * Copyright (c) 1998 by Sun Microsystems, Inc. * Copyright (c) 1998-1999 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /* * tclRegexp.c -- * * This file contains the public interfaces to the Tcl regular * expression mechanism. * * Copyright (c) 1998 by Sun Microsystems, Inc. * Copyright (c) 1998-1999 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclRegexp.c,v 1.11.10.1 2002/02/05 02:22:00 wolfsuit Exp $ */ #include "tclInt.h" #include "tclPort.h" #include "tclRegexp.h" /* |
| ︙ | ︙ | |||
84 85 86 87 88 89 90 | static Tcl_ThreadDataKey dataKey; /* * Declarations for functions used only in this file. */ static TclRegexp * CompileRegexp _ANSI_ARGS_((Tcl_Interp *interp, | | | 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | static Tcl_ThreadDataKey dataKey; /* * Declarations for functions used only in this file. */ static TclRegexp * CompileRegexp _ANSI_ARGS_((Tcl_Interp *interp, CONST char *pattern, int length, int flags)); static void DupRegexpInternalRep _ANSI_ARGS_((Tcl_Obj *srcPtr, Tcl_Obj *copyPtr)); static void FinalizeRegexp _ANSI_ARGS_((ClientData clientData)); static void FreeRegexp _ANSI_ARGS_((TclRegexp *regexpPtr)); static void FreeRegexpInternalRep _ANSI_ARGS_((Tcl_Obj *objPtr)); static int RegExpExecUniChar _ANSI_ARGS_((Tcl_Interp *interp, Tcl_RegExp re, CONST Tcl_UniChar *uniString, |
| ︙ | ︙ | |||
137 138 139 140 141 142 143 |
*----------------------------------------------------------------------
*/
Tcl_RegExp
Tcl_RegExpCompile(interp, string)
Tcl_Interp *interp; /* For use in error reporting and
* to access the interp regexp cache. */
| | | 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
*----------------------------------------------------------------------
*/
Tcl_RegExp
Tcl_RegExpCompile(interp, string)
Tcl_Interp *interp; /* For use in error reporting and
* to access the interp regexp cache. */
CONST char *string; /* String for which to produce
* compiled regular expression. */
{
return (Tcl_RegExp) CompileRegexp(interp, string, (int) strlen(string),
REG_ADVANCED);
}
/*
|
| ︙ | ︙ | |||
179 180 181 182 183 184 185 |
CONST char *start; /* If string is part of a larger string,
* this identifies beginning of larger
* string, so that "^" won't match. */
{
int flags, result, numChars;
TclRegexp *regexp = (TclRegexp *)re;
Tcl_DString ds;
| | | 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 |
CONST char *start; /* If string is part of a larger string,
* this identifies beginning of larger
* string, so that "^" won't match. */
{
int flags, result, numChars;
TclRegexp *regexp = (TclRegexp *)re;
Tcl_DString ds;
CONST Tcl_UniChar *ustr;
/*
* If the starting point is offset from the beginning of the buffer,
* then we need to tell the regexp engine not to match "^".
*/
if (string > start) {
|
| ︙ | ︙ | |||
239 240 241 242 243 244 245 |
void
Tcl_RegExpRange(re, index, startPtr, endPtr)
Tcl_RegExp re; /* Compiled regular expression that has
* been passed to Tcl_RegExpExec. */
int index; /* 0 means give the range of the entire
* match, > 0 means give the range of
* a matching subrange. */
| | | | 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 |
void
Tcl_RegExpRange(re, index, startPtr, endPtr)
Tcl_RegExp re; /* Compiled regular expression that has
* been passed to Tcl_RegExpExec. */
int index; /* 0 means give the range of the entire
* match, > 0 means give the range of
* a matching subrange. */
CONST char **startPtr; /* Store address of first character in
* (sub-) range here. */
CONST char **endPtr; /* Store address of character just after last
* in (sub-) range here. */
{
TclRegexp *regexpPtr = (TclRegexp *) re;
CONST char *string;
if ((size_t) index > regexpPtr->re.re_nsub) {
*startPtr = *endPtr = NULL;
|
| ︙ | ︙ | |||
394 395 396 397 398 399 400 |
*
*----------------------------------------------------------------------
*/
int
Tcl_RegExpMatch(interp, string, pattern)
Tcl_Interp *interp; /* Used for error reporting. May be NULL. */
| | | | 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 |
*
*----------------------------------------------------------------------
*/
int
Tcl_RegExpMatch(interp, string, pattern)
Tcl_Interp *interp; /* Used for error reporting. May be NULL. */
CONST char *string; /* String. */
CONST char *pattern; /* Regular expression to match against
* string. */
{
Tcl_RegExp re;
re = Tcl_RegExpCompile(interp, pattern);
if (re == NULL) {
return -1;
|
| ︙ | ︙ | |||
692 693 694 695 696 697 698 |
*
*----------------------------------------------------------------------
*/
void
TclRegError(interp, msg, status)
Tcl_Interp *interp; /* Interpreter for error reporting. */
| | | 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 |
*
*----------------------------------------------------------------------
*/
void
TclRegError(interp, msg, status)
Tcl_Interp *interp; /* Interpreter for error reporting. */
CONST char *msg; /* Message to prepend to error. */
int status; /* Status code to report. */
{
char buf[100]; /* ample in practice */
char cbuf[100]; /* lots in practice */
size_t n;
char *p;
|
| ︙ | ︙ | |||
827 828 829 830 831 832 833 |
*
*----------------------------------------------------------------------
*/
static TclRegexp *
CompileRegexp(interp, string, length, flags)
Tcl_Interp *interp; /* Used for error reporting if not NULL. */
| | | | 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 |
*
*----------------------------------------------------------------------
*/
static TclRegexp *
CompileRegexp(interp, string, length, flags)
Tcl_Interp *interp; /* Used for error reporting if not NULL. */
CONST char *string; /* The regexp to compile (UTF-8). */
int length; /* The length of the string in bytes. */
int flags; /* Compilation flags. */
{
TclRegexp *regexpPtr;
CONST Tcl_UniChar *uniString;
int numChars;
Tcl_DString stringBuf;
int status, i;
ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
if (!tsdPtr->initialized) {
tsdPtr->initialized = 1;
|
| ︙ | ︙ |
Changes to generic/tclResolve.c.
| ︙ | ︙ | |||
8 9 10 11 12 13 14 | * whole, or both. * * Copyright (c) 1998 Lucent Technologies, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | * whole, or both. * * Copyright (c) 1998 Lucent Technologies, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclResolve.c,v 1.3.34.1 2002/02/05 02:22:00 wolfsuit Exp $ */ #include "tclInt.h" /* * Declarations for procedures local to this file: */ |
| ︙ | ︙ | |||
59 60 61 62 63 64 65 |
*/
void
Tcl_AddInterpResolvers(interp, name, cmdProc, varProc, compiledVarProc)
Tcl_Interp *interp; /* Interpreter whose name resolution
* rules are being modified. */
| | | 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
*/
void
Tcl_AddInterpResolvers(interp, name, cmdProc, varProc, compiledVarProc)
Tcl_Interp *interp; /* Interpreter whose name resolution
* rules are being modified. */
CONST char *name; /* Name of this resolution scheme. */
Tcl_ResolveCmdProc *cmdProc; /* New procedure for command
* resolution */
Tcl_ResolveVarProc *varProc; /* Procedure for variable resolution
* at runtime */
Tcl_ResolveCompiledVarProc *compiledVarProc;
/* Procedure for variable resolution
* at compile time. */
|
| ︙ | ︙ | |||
138 139 140 141 142 143 144 |
*/
int
Tcl_GetInterpResolvers(interp, name, resInfoPtr)
Tcl_Interp *interp; /* Interpreter whose name resolution
* rules are being queried. */
| | | 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
*/
int
Tcl_GetInterpResolvers(interp, name, resInfoPtr)
Tcl_Interp *interp; /* Interpreter whose name resolution
* rules are being queried. */
CONST char *name; /* Look for a scheme with this name. */
Tcl_ResolverInfo *resInfoPtr; /* Returns pointers to the procedures,
* if found */
{
Interp *iPtr = (Interp*)interp;
ResolverScheme *resPtr;
/*
|
| ︙ | ︙ | |||
190 191 192 193 194 195 196 |
*/
int
Tcl_RemoveInterpResolvers(interp, name)
Tcl_Interp *interp; /* Interpreter whose name resolution
* rules are being modified. */
| | | 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 |
*/
int
Tcl_RemoveInterpResolvers(interp, name)
Tcl_Interp *interp; /* Interpreter whose name resolution
* rules are being modified. */
CONST char *name; /* Name of the scheme to be removed. */
{
Interp *iPtr = (Interp*)interp;
ResolverScheme **prevPtrPtr, *resPtr;
/*
* Look for an existing scheme with the given name.
*/
|
| ︙ | ︙ | |||
287 288 289 290 291 292 293 | * name resolution schemes, such as those for object-oriented * packages. * * Command resolution is handled by a procedure of the following * type: * * typedef int (Tcl_ResolveCmdProc) _ANSI_ARGS_(( | | | | | 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 | * name resolution schemes, such as those for object-oriented * packages. * * Command resolution is handled by a procedure of the following * type: * * typedef int (Tcl_ResolveCmdProc) _ANSI_ARGS_(( * Tcl_Interp* interp, CONST char* name, Tcl_Namespace *context, * int flags, Tcl_Command *rPtr)); * * Whenever a command is executed or Tcl_FindCommand is invoked * within the namespace, this procedure is called to resolve the * command name. If this procedure is able to resolve the name, * it should return the status code TCL_OK, along with the * corresponding Tcl_Command in the rPtr argument. Otherwise, * the procedure can return TCL_CONTINUE, and the command will * be treated under the usual name resolution rules. Or, it can * return TCL_ERROR, and the command will be considered invalid. * * Variable resolution is handled by two procedures. The first * is called whenever a variable needs to be resolved at compile * time: * * typedef int (Tcl_ResolveCompiledVarProc) _ANSI_ARGS_(( * Tcl_Interp* interp, CONST char* name, Tcl_Namespace *context, * Tcl_ResolvedVarInfo *rPtr)); * * If this procedure is able to resolve the name, it should return * the status code TCL_OK, along with variable resolution info in * the rPtr argument; this info will be used to set up compiled * locals in the call frame at runtime. The procedure may also * return TCL_CONTINUE, and the variable will be treated under * the usual name resolution rules. Or, it can return TCL_ERROR, * and the variable will be considered invalid. * * Another procedure is used whenever a variable needs to be * resolved at runtime but it is not recognized as a compiled local. * (For example, the variable may be requested via * Tcl_FindNamespaceVar.) This procedure has the following type: * * typedef int (Tcl_ResolveVarProc) _ANSI_ARGS_(( * Tcl_Interp* interp, CONST char* name, Tcl_Namespace *context, * int flags, Tcl_Var *rPtr)); * * This procedure is quite similar to the compile-time version. * It returns the same status codes, but if variable resolution * succeeds, this procedure returns a Tcl_Var directly via the * rPtr argument. * |
| ︙ | ︙ |
Changes to generic/tclResult.c.
1 2 3 4 5 6 7 8 9 10 | /* * tclResult.c -- * * This file contains code to manage the interpreter result. * * Copyright (c) 1997 by Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | /* * tclResult.c -- * * This file contains code to manage the interpreter result. * * Copyright (c) 1997 by Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclResult.c,v 1.4.18.1 2002/02/05 02:22:00 wolfsuit Exp $ */ #include "tclInt.h" /* * Function prototypes for local procedures in this file: */ |
| ︙ | ︙ | |||
293 294 295 296 297 298 299 | * Side effects: * If the string result is empty, the object result is moved to the * string result, then the object result is reset. * *---------------------------------------------------------------------- */ | | | 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 |
* Side effects:
* If the string result is empty, the object result is moved to the
* string result, then the object result is reset.
*
*----------------------------------------------------------------------
*/
CONST char *
Tcl_GetStringResult(interp)
register Tcl_Interp *interp; /* Interpreter whose result to return. */
{
/*
* If the string result is empty, move the object result to the
* string result, then reset the object result.
*/
|
| ︙ | ︙ |
Changes to generic/tclStringObj.c.
| ︙ | ︙ | |||
29 30 31 32 33 34 35 | * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * Copyright (c) 1999 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * Copyright (c) 1999 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclStringObj.c,v 1.21.10.1 2002/02/05 02:22:00 wolfsuit Exp $ */ #include "tclInt.h" /* * Prototypes for procedures defined later in this file: */ |
| ︙ | ︙ | |||
215 216 217 218 219 220 221 | * * Tcl_DbNewStringObj -- * * This procedure is normally called when debugging: i.e., when * TCL_MEM_DEBUG is defined. It creates new string objects. It is the * same as the Tcl_NewStringObj procedure above except that it calls * Tcl_DbCkalloc directly with the file name and line number from its | | | | | 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 | * * Tcl_DbNewStringObj -- * * This procedure is normally called when debugging: i.e., when * TCL_MEM_DEBUG is defined. It creates new string objects. It is the * same as the Tcl_NewStringObj procedure above except that it calls * Tcl_DbCkalloc directly with the file name and line number from its * caller. This simplifies debugging since then the [memory active] * command will report the correct file name and line number when * reporting objects that haven't been freed. * * When TCL_MEM_DEBUG is not defined, this procedure just returns the * result of calling Tcl_NewStringObj. * * Results: * A newly created string object is returned that has ref count zero. * |
| ︙ | ︙ | |||
283 284 285 286 287 288 289 |
return Tcl_NewStringObj(bytes, length);
}
#endif /* TCL_MEM_DEBUG */
/*
*---------------------------------------------------------------------------
*
| | | 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 |
return Tcl_NewStringObj(bytes, length);
}
#endif /* TCL_MEM_DEBUG */
/*
*---------------------------------------------------------------------------
*
* Tcl_NewUnicodeObj --
*
* This procedure is creates a new String object and initializes
* it from the given Unicode String. If the Utf String is the same size
* as the Unicode string, don't duplicate the data.
*
* Results:
* The newly created object is returned. This object will have no
|
| ︙ | ︙ | |||
591 592 593 594 595 596 597 | * Changes the internal rep of "objPtr" to the String type. * *---------------------------------------------------------------------- */ Tcl_Obj * Tcl_GetRange(objPtr, first, last) | < | | 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 |
* Changes the internal rep of "objPtr" to the String type.
*
*----------------------------------------------------------------------
*/
Tcl_Obj *
Tcl_GetRange(objPtr, first, last)
Tcl_Obj *objPtr; /* The Tcl object to find the range of. */
int first; /* First index of the range. */
int last; /* Last index of the range. */
{
Tcl_Obj *newObjPtr; /* The Tcl object to find the range of. */
String *stringPtr;
SetStringFromAny(NULL, objPtr);
|
| ︙ | ︙ | |||
1218 1219 1220 1221 1222 1223 1224 |
static void
AppendUnicodeToUtfRep(objPtr, unicode, numChars)
Tcl_Obj *objPtr; /* Points to the object to append to. */
CONST Tcl_UniChar *unicode; /* String to convert to UTF. */
int numChars; /* Number of chars of "unicode" to convert. */
{
Tcl_DString dsPtr;
| | | | 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 |
static void
AppendUnicodeToUtfRep(objPtr, unicode, numChars)
Tcl_Obj *objPtr; /* Points to the object to append to. */
CONST Tcl_UniChar *unicode; /* String to convert to UTF. */
int numChars; /* Number of chars of "unicode" to convert. */
{
Tcl_DString dsPtr;
CONST char *bytes;
if (numChars < 0) {
numChars = 0;
if (unicode) {
while (unicode[numChars] != 0) { numChars++; }
}
}
if (numChars == 0) {
return;
}
Tcl_DStringInit(&dsPtr);
bytes = Tcl_UniCharToUtfDString(unicode, numChars, &dsPtr);
AppendUtfToUtfRep(objPtr, bytes, Tcl_DStringLength(&dsPtr));
Tcl_DStringFree(&dsPtr);
}
/*
*----------------------------------------------------------------------
*
|
| ︙ | ︙ |
Changes to generic/tclStubInit.c.
1 2 3 4 5 6 7 8 9 10 | /* * tclStubInit.c -- * * This file contains the initializers for the Tcl stub vectors. * * Copyright (c) 1998-1999 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | /* * tclStubInit.c -- * * This file contains the initializers for the Tcl stub vectors. * * Copyright (c) 1998-1999 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclStubInit.c,v 1.61.4.3 2002/02/05 02:22:00 wolfsuit Exp $ */ #include "tclInt.h" #include "tclPort.h" /* * Remove macros that will interfere with the definitions below. |
| ︙ | ︙ | |||
238 239 240 241 242 243 244 |
TclRegError, /* 156 */
TclVarTraceExists, /* 157 */
TclSetStartupScriptFileName, /* 158 */
TclGetStartupScriptFileName, /* 159 */
NULL, /* 160 */
TclChannelTransform, /* 161 */
TclChannelEventScriptInvoker, /* 162 */
| > > | > > > | 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 |
TclRegError, /* 156 */
TclVarTraceExists, /* 157 */
TclSetStartupScriptFileName, /* 158 */
TclGetStartupScriptFileName, /* 159 */
NULL, /* 160 */
TclChannelTransform, /* 161 */
TclChannelEventScriptInvoker, /* 162 */
TclGetInstructionTable, /* 163 */
TclExpandCodeArray, /* 164 */
TclpSetInitialEncodings, /* 165 */
TclListObjSetElement, /* 166 */
TclSetStartupScriptPath, /* 167 */
TclGetStartupScriptPath, /* 168 */
};
TclIntPlatStubs tclIntPlatStubs = {
TCL_STUB_MAGIC,
NULL,
#if !(defined(__WIN32__) || defined(MAC_TCL) || defined(MAC_OSX_TK))/* UNIX */
TclGetAndDetachPids, /* 0 */
|
| ︙ | ︙ | |||
294 295 296 297 298 299 300 |
TclpSysAlloc, /* 0 */
TclpSysFree, /* 1 */
TclpSysRealloc, /* 2 */
TclpExit, /* 3 */
FSpGetDefaultDir, /* 4 */
FSpSetDefaultDir, /* 5 */
FSpFindFolder, /* 6 */
| | | | | | | 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 |
TclpSysAlloc, /* 0 */
TclpSysFree, /* 1 */
TclpSysRealloc, /* 2 */
TclpExit, /* 3 */
FSpGetDefaultDir, /* 4 */
FSpSetDefaultDir, /* 5 */
FSpFindFolder, /* 6 */
GetGlobalMouseTcl, /* 7 */
FSpGetDirectoryIDTcl, /* 8 */
FSpOpenResFileCompatTcl, /* 9 */
FSpCreateResFileCompatTcl, /* 10 */
FSpLocationFromPath, /* 11 */
FSpPathFromLocation, /* 12 */
TclMacExitHandler, /* 13 */
TclMacInitExitToShell, /* 14 */
TclMacInstallExitToShellPatch, /* 15 */
TclMacOSErrorToPosixError, /* 16 */
TclMacRemoveTimer, /* 17 */
TclMacStartTimer, /* 18 */
TclMacTimerExpired, /* 19 */
TclMacRegisterResourceFork, /* 20 */
TclMacUnRegisterResourceFork, /* 21 */
TclMacCreateEnv, /* 22 */
TclMacFOpenHack, /* 23 */
TclpGetTZName, /* 24 */
TclMacChmod, /* 25 */
#endif /* MAC_TCL */
};
TclPlatStubs tclPlatStubs = {
TCL_STUB_MAGIC,
NULL,
|
| ︙ | ︙ | |||
879 880 881 882 883 884 885 886 887 888 |
Tcl_FSData, /* 475 */
Tcl_FSGetTranslatedStringPath, /* 476 */
Tcl_FSGetFileSystemForPath, /* 477 */
Tcl_FSGetPathType, /* 478 */
Tcl_OutputBuffered, /* 479 */
Tcl_FSMountsChanged, /* 480 */
Tcl_EvalTokensStandard, /* 481 */
};
/* !END!: Do not edit above this line. */
| > | 884 885 886 887 888 889 890 891 892 893 894 |
Tcl_FSData, /* 475 */
Tcl_FSGetTranslatedStringPath, /* 476 */
Tcl_FSGetFileSystemForPath, /* 477 */
Tcl_FSGetPathType, /* 478 */
Tcl_OutputBuffered, /* 479 */
Tcl_FSMountsChanged, /* 480 */
Tcl_EvalTokensStandard, /* 481 */
Tcl_GetTime, /* 482 */
};
/* !END!: Do not edit above this line. */
|
Changes to generic/tclTest.c.
| ︙ | ︙ | |||
9 10 11 12 13 14 15 | * Copyright (c) 1993-1994 The Regents of the University of California. * Copyright (c) 1994-1997 Sun Microsystems, Inc. * Copyright (c) 1998-2000 Ajuba Solutions. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | * Copyright (c) 1993-1994 The Regents of the University of California. * Copyright (c) 1994-1997 Sun Microsystems, Inc. * Copyright (c) 1998-2000 Ajuba Solutions. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclTest.c,v 1.32.2.1 2002/02/05 02:22:00 wolfsuit Exp $ */ #define TCL_TEST #include "tclInt.h" #include "tclPort.h" |
| ︙ | ︙ | |||
102 103 104 105 106 107 108 109 110 111 112 113 114 115 | /* * The counter below is used to determine if the TestsaveresultFree * routine was called for a result. */ static int freeCount; /* * Forward declarations for procedures defined later in this file: */ int Tcltest_Init _ANSI_ARGS_((Tcl_Interp *interp)); static int AsyncHandlerProc _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int code)); | > > > > > > | 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | /* * The counter below is used to determine if the TestsaveresultFree * routine was called for a result. */ static int freeCount; /* * Boolean flag used by the "testsetmainloop" and "testexitmainloop" * commands. */ static int exitMainLoop = 0; /* * Forward declarations for procedures defined later in this file: */ int Tcltest_Init _ANSI_ARGS_((Tcl_Interp *interp)); static int AsyncHandlerProc _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int code)); |
| ︙ | ︙ | |||
152 153 154 155 156 157 158 159 160 161 162 163 164 165 |
Tcl_EncodingState *statePtr, char *dst,
int dstLen, int *srcReadPtr, int *dstWrotePtr,
int *dstCharsPtr));
static void ExitProcEven _ANSI_ARGS_((ClientData clientData));
static void ExitProcOdd _ANSI_ARGS_((ClientData clientData));
static int GetTimesCmd _ANSI_ARGS_((ClientData clientData,
Tcl_Interp *interp, int argc, char **argv));
static int NoopCmd _ANSI_ARGS_((ClientData clientData,
Tcl_Interp *interp, int argc, char **argv));
static int NoopObjCmd _ANSI_ARGS_((ClientData clientData,
Tcl_Interp *interp, int objc,
Tcl_Obj *CONST objv[]));
static void PrintParse _ANSI_ARGS_((Tcl_Interp *interp,
Tcl_Parse *parsePtr));
| > | 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 |
Tcl_EncodingState *statePtr, char *dst,
int dstLen, int *srcReadPtr, int *dstWrotePtr,
int *dstCharsPtr));
static void ExitProcEven _ANSI_ARGS_((ClientData clientData));
static void ExitProcOdd _ANSI_ARGS_((ClientData clientData));
static int GetTimesCmd _ANSI_ARGS_((ClientData clientData,
Tcl_Interp *interp, int argc, char **argv));
static void MainLoop _ANSI_ARGS_((void));
static int NoopCmd _ANSI_ARGS_((ClientData clientData,
Tcl_Interp *interp, int argc, char **argv));
static int NoopObjCmd _ANSI_ARGS_((ClientData clientData,
Tcl_Interp *interp, int objc,
Tcl_Obj *CONST objv[]));
static void PrintParse _ANSI_ARGS_((Tcl_Interp *interp,
Tcl_Parse *parsePtr));
|
| ︙ | ︙ | |||
235 236 237 238 239 240 241 | Tcl_Interp *interp, Tcl_Value *args, Tcl_Value *resultPtr)); static int TestMathFunc2 _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, Tcl_Value *args, Tcl_Value *resultPtr)); static int TestmainthreadCmd _ANSI_ARGS_((ClientData dummy, Tcl_Interp *interp, int argc, char **argv)); | > > > > | > | | > | | > | | > | | 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 | Tcl_Interp *interp, Tcl_Value *args, Tcl_Value *resultPtr)); static int TestMathFunc2 _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, Tcl_Value *args, Tcl_Value *resultPtr)); static int TestmainthreadCmd _ANSI_ARGS_((ClientData dummy, Tcl_Interp *interp, int argc, char **argv)); static int TestsetmainloopCmd _ANSI_ARGS_((ClientData dummy, Tcl_Interp *interp, int argc, char **argv)); static int TestexitmainloopCmd _ANSI_ARGS_((ClientData dummy, Tcl_Interp *interp, int argc, char **argv)); static Tcl_Channel PretendTclpOpenFileChannel _ANSI_ARGS_(( Tcl_Interp *interp, CONST char *fileName, CONST char *modeString, int permissions)); static Tcl_Channel TestOpenFileChannelProc1 _ANSI_ARGS_(( Tcl_Interp *interp, CONST char *fileName, CONST char *modeString, int permissions)); static Tcl_Channel TestOpenFileChannelProc2 _ANSI_ARGS_(( Tcl_Interp *interp, CONST char *fileName, CONST char *modeString, int permissions)); static Tcl_Channel TestOpenFileChannelProc3 _ANSI_ARGS_(( Tcl_Interp *interp, CONST char *fileName, CONST char *modeString, int permissions)); static int TestpanicCmd _ANSI_ARGS_((ClientData dummy, Tcl_Interp *interp, int argc, char **argv)); static int TestparserObjCmd _ANSI_ARGS_((ClientData dummy, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])); static int TestparsevarObjCmd _ANSI_ARGS_((ClientData dummy, Tcl_Interp *interp, int objc, |
| ︙ | ︙ | |||
311 312 313 314 315 316 317 | static int TestFilesystemObjCmd _ANSI_ARGS_((ClientData dummy, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])); static void TestReport _ANSI_ARGS_((CONST char* cmd, Tcl_Obj* arg1, Tcl_Obj* arg2)); | > | > > | > | > > | > > > | | > | > | | > | | > | > | > > > > > | > | > | > | > | > | > > | | | | 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 |
static int TestFilesystemObjCmd _ANSI_ARGS_((ClientData dummy,
Tcl_Interp *interp, int objc,
Tcl_Obj *CONST objv[]));
static void TestReport _ANSI_ARGS_((CONST char* cmd, Tcl_Obj* arg1, Tcl_Obj* arg2));
static Tcl_Obj *TestReportGetNativePath(Tcl_Obj* pathObjPtr);
static int TestReportStat _ANSI_ARGS_ ((Tcl_Obj *path,
struct stat *buf));
static int TestReportAccess _ANSI_ARGS_ ((Tcl_Obj *path,
int mode));
static Tcl_Channel TestReportOpenFileChannel _ANSI_ARGS_ ((
Tcl_Interp *interp, Tcl_Obj *fileName,
CONST char *modeString, int permissions));
static int TestReportMatchInDirectory _ANSI_ARGS_ ((
Tcl_Interp *interp, Tcl_Obj *resultPtr,
Tcl_Obj *dirPtr, CONST char *pattern,
Tcl_GlobTypeData *types));
static int TestReportChdir _ANSI_ARGS_ ((Tcl_Obj *dirName));
static int TestReportLstat _ANSI_ARGS_ ((Tcl_Obj *path,
struct stat *buf));
static int TestReportCopyFile _ANSI_ARGS_ ((Tcl_Obj *src,
Tcl_Obj *dst));
static int TestReportDeleteFile _ANSI_ARGS_ ((Tcl_Obj *path));
static int TestReportRenameFile _ANSI_ARGS_ ((Tcl_Obj *src,
Tcl_Obj *dst));
static int TestReportCreateDirectory _ANSI_ARGS_ ((Tcl_Obj *path));
static int TestReportCopyDirectory _ANSI_ARGS_ ((Tcl_Obj *src,
Tcl_Obj *dst, Tcl_Obj **errorPtr));
static int TestReportRemoveDirectory _ANSI_ARGS_ ((Tcl_Obj *path,
int recursive, Tcl_Obj **errorPtr));
static int TestReportLoadFile _ANSI_ARGS_ ((Tcl_Interp *interp,
Tcl_Obj *fileName, CONST char *sym1,
CONST char *sym2, Tcl_PackageInitProc **proc1Ptr,
Tcl_PackageInitProc **proc2Ptr,
ClientData *clientDataPtr,
Tcl_FSUnloadFileProc **unloadProcPtr));
static Tcl_Obj * TestReportLink _ANSI_ARGS_ ((Tcl_Obj *path,
Tcl_Obj *to));
static CONST char** TestReportFileAttrStrings _ANSI_ARGS_ ((
Tcl_Obj *fileName, Tcl_Obj **objPtrRef));
static int TestReportFileAttrsGet _ANSI_ARGS_ ((Tcl_Interp *interp,
int index, Tcl_Obj *fileName, Tcl_Obj **objPtrRef));
static int TestReportFileAttrsSet _ANSI_ARGS_ ((Tcl_Interp *interp,
int index, Tcl_Obj *fileName, Tcl_Obj *objPtr));
static int TestReportUtime _ANSI_ARGS_ ((Tcl_Obj *fileName,
struct utimbuf *tval));
static int TestReportNormalizePath _ANSI_ARGS_ ((
Tcl_Interp *interp, Tcl_Obj *pathPtr,
int nextCheckpoint));
static int TestReportInFilesystem _ANSI_ARGS_ ((Tcl_Obj *pathPtr, ClientData *clientDataPtr));
static void TestReportFreeInternalRep _ANSI_ARGS_ ((ClientData clientData));
static ClientData TestReportDupInternalRep _ANSI_ARGS_ ((ClientData clientData));
static Tcl_Filesystem testReportingFilesystem = {
"reporting",
sizeof(Tcl_Filesystem),
TCL_FILESYSTEM_VERSION_1,
&TestReportInFilesystem, /* path in */
&TestReportDupInternalRep,
|
| ︙ | ︙ | |||
402 403 404 405 406 407 408 |
*/
int
Tcltest_Init(interp)
Tcl_Interp *interp; /* Interpreter for application. */
{
Tcl_ValueType t3ArgTypes[2];
| | > > > > > > > > | 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 |
*/
int
Tcltest_Init(interp)
Tcl_Interp *interp; /* Interpreter for application. */
{
Tcl_ValueType t3ArgTypes[2];
Tcl_Obj *listPtr;
Tcl_Obj **objv;
int objc, index;
static CONST char *specialOptions[] = {
"-appinitprocerror", "-appinitprocdeleteinterp",
"-appinitprocclosestderr", "-appinitprocsetrcfile", (char *) NULL
};
if (Tcl_PkgProvide(interp, "Tcltest", TCL_VERSION) == TCL_ERROR) {
return TCL_ERROR;
}
/*
* Create additional commands and math functions for testing Tcl.
*/
|
| ︙ | ︙ | |||
526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 |
(ClientData) 123);
Tcl_CreateMathFunc(interp, "T2", 0, (Tcl_ValueType *) NULL, TestMathFunc,
(ClientData) 345);
Tcl_CreateCommand(interp, "teststatproc", TeststatprocCmd, (ClientData) 0,
(Tcl_CmdDeleteProc *) NULL);
Tcl_CreateCommand(interp, "testmainthread", TestmainthreadCmd, (ClientData) 0,
(Tcl_CmdDeleteProc *) NULL);
t3ArgTypes[0] = TCL_EITHER;
t3ArgTypes[1] = TCL_EITHER;
Tcl_CreateMathFunc(interp, "T3", 2, t3ArgTypes, TestMathFunc2,
(ClientData) 0);
#ifdef TCL_THREADS
if (TclThread_Init(interp) != TCL_OK) {
return TCL_ERROR;
}
#endif
/*
* And finally add any platform specific test commands.
*/
return TclplatformtestInit(interp);
}
| > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 |
(ClientData) 123);
Tcl_CreateMathFunc(interp, "T2", 0, (Tcl_ValueType *) NULL, TestMathFunc,
(ClientData) 345);
Tcl_CreateCommand(interp, "teststatproc", TeststatprocCmd, (ClientData) 0,
(Tcl_CmdDeleteProc *) NULL);
Tcl_CreateCommand(interp, "testmainthread", TestmainthreadCmd, (ClientData) 0,
(Tcl_CmdDeleteProc *) NULL);
Tcl_CreateCommand(interp, "testsetmainloop", TestsetmainloopCmd,
(ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
Tcl_CreateCommand(interp, "testexitmainloop", TestexitmainloopCmd,
(ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
t3ArgTypes[0] = TCL_EITHER;
t3ArgTypes[1] = TCL_EITHER;
Tcl_CreateMathFunc(interp, "T3", 2, t3ArgTypes, TestMathFunc2,
(ClientData) 0);
#ifdef TCL_THREADS
if (TclThread_Init(interp) != TCL_OK) {
return TCL_ERROR;
}
#endif
/*
* Check for special options used in ../tests/main.test
*/
listPtr = Tcl_GetVar2Ex(interp, "argv", NULL, TCL_GLOBAL_ONLY);
if (listPtr != NULL) {
if (Tcl_ListObjGetElements(interp, listPtr, &objc, &objv) != TCL_OK) {
return TCL_ERROR;
}
if (objc && (Tcl_GetIndexFromObj(NULL, objv[0], specialOptions, NULL,
TCL_EXACT, &index) == TCL_OK)) {
switch (index) {
case 0: {
return TCL_ERROR;
}
case 1: {
Tcl_DeleteInterp(interp);
return TCL_ERROR;
}
case 2: {
int mode;
Tcl_UnregisterChannel(interp,
Tcl_GetChannel(interp, "stderr", &mode));
return TCL_ERROR;
}
case 3: {
if (objc-1) {
Tcl_SetVar2Ex(interp, "tcl_rcFileName", NULL,
objv[1], TCL_GLOBAL_ONLY);
}
return TCL_ERROR;
}
}
}
}
/*
* And finally add any platform specific test commands.
*/
return TclplatformtestInit(interp);
}
|
| ︙ | ︙ | |||
660 661 662 663 664 665 666 |
AsyncHandlerProc(clientData, interp, code)
ClientData clientData; /* Pointer to TestAsyncHandler structure. */
Tcl_Interp *interp; /* Interpreter in which command was
* executed, or NULL. */
int code; /* Current return code from command. */
{
TestAsyncHandler *asyncPtr = (TestAsyncHandler *) clientData;
| | | | 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 |
AsyncHandlerProc(clientData, interp, code)
ClientData clientData; /* Pointer to TestAsyncHandler structure. */
Tcl_Interp *interp; /* Interpreter in which command was
* executed, or NULL. */
int code; /* Current return code from command. */
{
TestAsyncHandler *asyncPtr = (TestAsyncHandler *) clientData;
CONST char *listArgv[4];
char string[TCL_INTEGER_SPACE], *cmd;
TclFormatInt(string, code);
listArgv[0] = asyncPtr->command;
listArgv[1] = Tcl_GetString(Tcl_GetObjResult(interp));
listArgv[2] = string;
listArgv[3] = NULL;
cmd = Tcl_Merge(3, listArgv);
if (interp != NULL) {
code = Tcl_Eval(interp, cmd);
} else {
/*
|
| ︙ | ︙ | |||
1427 1428 1429 1430 1431 1432 1433 |
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
Tcl_Encoding encoding;
int index, length;
char *string;
TclEncoding *encodingPtr;
| | | 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 |
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
Tcl_Encoding encoding;
int index, length;
char *string;
TclEncoding *encodingPtr;
static CONST char *optionStrings[] = {
"create", "delete", "path",
NULL
};
enum options {
ENC_CREATE, ENC_DELETE, ENC_PATH
};
|
| ︙ | ︙ | |||
1876 1877 1878 1879 1880 1881 1882 |
static int
TestgetplatformCmd(clientData, interp, argc, argv)
ClientData clientData; /* Not used. */
Tcl_Interp *interp; /* Current interpreter. */
int argc; /* Number of arguments. */
char **argv; /* Argument strings. */
{
| | | 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 |
static int
TestgetplatformCmd(clientData, interp, argc, argv)
ClientData clientData; /* Not used. */
Tcl_Interp *interp; /* Current interpreter. */
int argc; /* Number of arguments. */
char **argv; /* Argument strings. */
{
static CONST char *platformStrings[] = { "unix", "mac", "windows" };
TclPlatformType *platform;
#ifdef __WIN32__
platform = TclWinGetPlatform();
#else
platform = &tclPlatform;
#endif
|
| ︙ | ︙ | |||
1928 1929 1930 1931 1932 1933 1934 |
Tcl_Interp *slaveToDelete;
if (argc != 2) {
Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
" path\"", (char *) NULL);
return TCL_ERROR;
}
| < < < < < | 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 |
Tcl_Interp *slaveToDelete;
if (argc != 2) {
Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
" path\"", (char *) NULL);
return TCL_ERROR;
}
slaveToDelete = Tcl_GetSlave(interp, argv[1]);
if (slaveToDelete == (Tcl_Interp *) NULL) {
return TCL_ERROR;
}
Tcl_DeleteInterp(slaveToDelete);
return TCL_OK;
}
|
| ︙ | ︙ | |||
2140 2141 2142 2143 2144 2145 2146 |
Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* The argument objects. */
{
int index;
char *locale;
| | | 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 |
Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* The argument objects. */
{
int index;
char *locale;
static CONST char *optionStrings[] = {
"ctype", "numeric", "time", "collate", "monetary",
"all", NULL
};
static int lcTypes[] = {
LC_CTYPE, LC_NUMERIC, LC_TIME, LC_COLLATE, LC_MONETARY,
LC_ALL
};
|
| ︙ | ︙ | |||
2526 2527 2528 2529 2530 2531 2532 |
static int
TestparsevarObjCmd(clientData, interp, objc, objv)
ClientData clientData; /* Not used. */
Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* The argument objects. */
{
| > | | 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 |
static int
TestparsevarObjCmd(clientData, interp, objc, objv)
ClientData clientData; /* Not used. */
Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* The argument objects. */
{
CONST char *value;
char *name, *termPtr;
if (objc != 2) {
Tcl_WrongNumArgs(interp, 1, objv, "varName");
return TCL_ERROR;
}
name = Tcl_GetString(objv[1]);
value = Tcl_ParseVar(interp, name, &termPtr);
|
| ︙ | ︙ | |||
2638 2639 2640 2641 2642 2643 2644 |
{
int i, ii, indices, stringLength, match, about;
int hasxflags, cflags, eflags;
Tcl_RegExp regExpr;
char *string;
Tcl_Obj *objPtr;
Tcl_RegExpInfo info;
| | | 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 |
{
int i, ii, indices, stringLength, match, about;
int hasxflags, cflags, eflags;
Tcl_RegExp regExpr;
char *string;
Tcl_Obj *objPtr;
Tcl_RegExpInfo info;
static CONST char *options[] = {
"-indices", "-nocase", "-about", "-expanded",
"-line", "-linestop", "-lineanchor",
"-xflags",
"--", (char *) NULL
};
enum options {
REGEXP_INDICES, REGEXP_NOCASE, REGEXP_ABOUT, REGEXP_EXPANDED,
|
| ︙ | ︙ | |||
2752 2753 2754 2755 2756 2757 2758 |
/*
* Set the interpreter's object result to an integer object w/
* value 0.
*/
Tcl_SetIntObj(Tcl_GetObjResult(interp), 0);
if (objc > 2 && (cflags®_EXPECT) && indices) {
| | > | 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 |
/*
* Set the interpreter's object result to an integer object w/
* value 0.
*/
Tcl_SetIntObj(Tcl_GetObjResult(interp), 0);
if (objc > 2 && (cflags®_EXPECT) && indices) {
char *varName;
CONST char *value;
int start, end;
char info[TCL_INTEGER_SPACE * 2];
varName = Tcl_GetString(objv[2]);
TclRegExpRangeUniChar(regExpr, -1, &start, &end);
sprintf(info, "%d %d", start, end-1);
value = Tcl_SetVar(interp, varName, info, 0);
|
| ︙ | ︙ | |||
3165 3166 3167 3168 3169 3170 3171 |
TesttranslatefilenameCmd(dummy, interp, argc, argv)
ClientData dummy; /* Not used. */
Tcl_Interp *interp; /* Current interpreter. */
int argc; /* Number of arguments. */
char **argv; /* Argument strings. */
{
Tcl_DString buffer;
| | | 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 |
TesttranslatefilenameCmd(dummy, interp, argc, argv)
ClientData dummy; /* Not used. */
Tcl_Interp *interp; /* Current interpreter. */
int argc; /* Number of arguments. */
char **argv; /* Argument strings. */
{
Tcl_DString buffer;
CONST char *result;
if (argc != 2) {
Tcl_AppendResult(interp, "wrong # arguments: should be \"",
argv[0], " path\"", (char *) NULL);
return TCL_ERROR;
}
result = Tcl_TranslateFileName(interp, argv[1], &buffer);
|
| ︙ | ︙ | |||
3377 3378 3379 3380 3381 3382 3383 |
char *argString;
/*
* Put the arguments into a var args structure
* Append all of the arguments together separated by spaces
*/
| | | 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 |
char *argString;
/*
* Put the arguments into a var args structure
* Append all of the arguments together separated by spaces
*/
argString = Tcl_Merge(argc-1, (CONST char **) argv+1);
panic(argString);
ckfree(argString);
return TCL_OK;
}
/*
|
| ︙ | ︙ | |||
3427 3428 3429 3430 3431 3432 3433 3434 |
mode = (int) strtol(argv[1], &rest, 8);
if ((rest == argv[1]) || (*rest != '\0')) {
goto usage;
}
for (i = 2; i < argc; i++) {
Tcl_DString buffer;
| > | | | | | 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 |
mode = (int) strtol(argv[1], &rest, 8);
if ((rest == argv[1]) || (*rest != '\0')) {
goto usage;
}
for (i = 2; i < argc; i++) {
Tcl_DString buffer;
CONST char *translated;
translated = Tcl_TranslateFileName(interp, argv[i], &buffer);
if (translated == NULL) {
return TCL_ERROR;
}
if (chmod(translated, (unsigned) mode) != 0) {
Tcl_AppendResult(interp, translated, ": ", Tcl_PosixError(interp),
(char *) NULL);
return TCL_ERROR;
}
Tcl_DStringFree(&buffer);
}
return TCL_OK;
}
|
| ︙ | ︙ | |||
3618 3619 3620 3621 3622 3623 3624 |
{
Interp *iPtr = (Interp *) interp;
int i, n;
double timePer;
Tcl_Time start, stop;
Tcl_Obj *objPtr;
Tcl_Obj **objv;
| | | | | | | | | | | | | | | | | | | | | | | | | | | 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 |
{
Interp *iPtr = (Interp *) interp;
int i, n;
double timePer;
Tcl_Time start, stop;
Tcl_Obj *objPtr;
Tcl_Obj **objv;
CONST char *s;
char newString[TCL_INTEGER_SPACE];
/* alloc & free 100000 times */
fprintf(stderr, "alloc & free 100000 6 word items\n");
Tcl_GetTime(&start);
for (i = 0; i < 100000; i++) {
objPtr = (Tcl_Obj *) ckalloc(sizeof(Tcl_Obj));
ckfree((char *) objPtr);
}
Tcl_GetTime(&stop);
timePer = (stop.sec - start.sec)*1000000 + (stop.usec - start.usec);
fprintf(stderr, " %.3f usec per alloc+free\n", timePer/100000);
/* alloc 5000 times */
fprintf(stderr, "alloc 5000 6 word items\n");
objv = (Tcl_Obj **) ckalloc(5000 * sizeof(Tcl_Obj *));
Tcl_GetTime(&start);
for (i = 0; i < 5000; i++) {
objv[i] = (Tcl_Obj *) ckalloc(sizeof(Tcl_Obj));
}
Tcl_GetTime(&stop);
timePer = (stop.sec - start.sec)*1000000 + (stop.usec - start.usec);
fprintf(stderr, " %.3f usec per alloc\n", timePer/5000);
/* free 5000 times */
fprintf(stderr, "free 5000 6 word items\n");
Tcl_GetTime(&start);
for (i = 0; i < 5000; i++) {
ckfree((char *) objv[i]);
}
Tcl_GetTime(&stop);
timePer = (stop.sec - start.sec)*1000000 + (stop.usec - start.usec);
fprintf(stderr, " %.3f usec per free\n", timePer/5000);
/* Tcl_NewObj 5000 times */
fprintf(stderr, "Tcl_NewObj 5000 times\n");
Tcl_GetTime(&start);
for (i = 0; i < 5000; i++) {
objv[i] = Tcl_NewObj();
}
Tcl_GetTime(&stop);
timePer = (stop.sec - start.sec)*1000000 + (stop.usec - start.usec);
fprintf(stderr, " %.3f usec per Tcl_NewObj\n", timePer/5000);
/* Tcl_DecrRefCount 5000 times */
fprintf(stderr, "Tcl_DecrRefCount 5000 times\n");
Tcl_GetTime(&start);
for (i = 0; i < 5000; i++) {
objPtr = objv[i];
Tcl_DecrRefCount(objPtr);
}
Tcl_GetTime(&stop);
timePer = (stop.sec - start.sec)*1000000 + (stop.usec - start.usec);
fprintf(stderr, " %.3f usec per Tcl_DecrRefCount\n", timePer/5000);
ckfree((char *) objv);
/* TclGetString 100000 times */
fprintf(stderr, "TclGetStringFromObj of \"12345\" 100000 times\n");
objPtr = Tcl_NewStringObj("12345", -1);
Tcl_GetTime(&start);
for (i = 0; i < 100000; i++) {
(void) TclGetString(objPtr);
}
Tcl_GetTime(&stop);
timePer = (stop.sec - start.sec)*1000000 + (stop.usec - start.usec);
fprintf(stderr, " %.3f usec per TclGetStringFromObj of \"12345\"\n",
timePer/100000);
/* Tcl_GetIntFromObj 100000 times */
fprintf(stderr, "Tcl_GetIntFromObj of \"12345\" 100000 times\n");
Tcl_GetTime(&start);
for (i = 0; i < 100000; i++) {
if (Tcl_GetIntFromObj(interp, objPtr, &n) != TCL_OK) {
return TCL_ERROR;
}
}
Tcl_GetTime(&stop);
timePer = (stop.sec - start.sec)*1000000 + (stop.usec - start.usec);
fprintf(stderr, " %.3f usec per Tcl_GetIntFromObj of \"12345\"\n",
timePer/100000);
Tcl_DecrRefCount(objPtr);
/* Tcl_GetInt 100000 times */
fprintf(stderr, "Tcl_GetInt of \"12345\" 100000 times\n");
Tcl_GetTime(&start);
for (i = 0; i < 100000; i++) {
if (Tcl_GetInt(interp, "12345", &n) != TCL_OK) {
return TCL_ERROR;
}
}
Tcl_GetTime(&stop);
timePer = (stop.sec - start.sec)*1000000 + (stop.usec - start.usec);
fprintf(stderr, " %.3f usec per Tcl_GetInt of \"12345\"\n",
timePer/100000);
/* sprintf 100000 times */
fprintf(stderr, "sprintf of 12345 100000 times\n");
Tcl_GetTime(&start);
for (i = 0; i < 100000; i++) {
sprintf(newString, "%d", 12345);
}
Tcl_GetTime(&stop);
timePer = (stop.sec - start.sec)*1000000 + (stop.usec - start.usec);
fprintf(stderr, " %.3f usec per sprintf of 12345\n",
timePer/100000);
/* hashtable lookup 100000 times */
fprintf(stderr, "hashtable lookup of \"gettimes\" 100000 times\n");
Tcl_GetTime(&start);
for (i = 0; i < 100000; i++) {
(void) Tcl_FindHashEntry(&iPtr->globalNsPtr->cmdTable, "gettimes");
}
Tcl_GetTime(&stop);
timePer = (stop.sec - start.sec)*1000000 + (stop.usec - start.usec);
fprintf(stderr, " %.3f usec per hashtable lookup of \"gettimes\"\n",
timePer/100000);
/* Tcl_SetVar 100000 times */
fprintf(stderr, "Tcl_SetVar of \"12345\" 100000 times\n");
Tcl_GetTime(&start);
for (i = 0; i < 100000; i++) {
s = Tcl_SetVar(interp, "a", "12345", TCL_LEAVE_ERR_MSG);
if (s == NULL) {
return TCL_ERROR;
}
}
Tcl_GetTime(&stop);
timePer = (stop.sec - start.sec)*1000000 + (stop.usec - start.usec);
fprintf(stderr, " %.3f usec per Tcl_SetVar of a to \"12345\"\n",
timePer/100000);
/* Tcl_GetVar 100000 times */
fprintf(stderr, "Tcl_GetVar of a==\"12345\" 100000 times\n");
Tcl_GetTime(&start);
for (i = 0; i < 100000; i++) {
s = Tcl_GetVar(interp, "a", TCL_LEAVE_ERR_MSG);
if (s == NULL) {
return TCL_ERROR;
}
}
Tcl_GetTime(&stop);
timePer = (stop.sec - start.sec)*1000000 + (stop.usec - start.usec);
fprintf(stderr, " %.3f usec per Tcl_GetVar of a==\"12345\"\n",
timePer/100000);
Tcl_ResetResult(interp);
return TCL_OK;
}
|
| ︙ | ︙ | |||
3848 3849 3850 3851 3852 3853 3854 |
TestsetCmd(data, interp, argc, argv)
ClientData data; /* Additional flags for Get/SetVar2. */
register Tcl_Interp *interp; /* Current interpreter. */
int argc; /* Number of arguments. */
char **argv; /* Argument strings. */
{
int flags = (int) data;
| | | 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 |
TestsetCmd(data, interp, argc, argv)
ClientData data; /* Additional flags for Get/SetVar2. */
register Tcl_Interp *interp; /* Current interpreter. */
int argc; /* Number of arguments. */
char **argv; /* Argument strings. */
{
int flags = (int) data;
CONST char *value;
if (argc == 2) {
Tcl_SetResult(interp, "before get", TCL_STATIC);
value = Tcl_GetVar2(interp, argv[1], (char *) NULL, flags);
if (value == NULL) {
return TCL_ERROR;
}
|
| ︙ | ︙ | |||
3902 3903 3904 3905 3906 3907 3908 |
register Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* The argument objects. */
{
int discard, result, index;
Tcl_SavedResult state;
Tcl_Obj *objPtr;
| | | 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 |
register Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* The argument objects. */
{
int discard, result, index;
Tcl_SavedResult state;
Tcl_Obj *objPtr;
static CONST char *optionStrings[] = {
"append", "dynamic", "free", "object", "small", NULL
};
enum options {
RESULT_APPEND, RESULT_DYNAMIC, RESULT_FREE, RESULT_OBJECT, RESULT_SMALL
};
/*
|
| ︙ | ︙ | |||
4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 |
Tcl_SetObjResult(interp, idObj);
return TCL_OK;
} else {
Tcl_SetResult(interp, "wrong # args", TCL_STATIC);
return TCL_ERROR;
}
}
/*
*----------------------------------------------------------------------
*
* TestaccessprocCmd --
*
* Implements the "testTclAccessProc" cmd that is used to test the
| > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 4245 4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 4336 4337 4338 4339 4340 4341 |
Tcl_SetObjResult(interp, idObj);
return TCL_OK;
} else {
Tcl_SetResult(interp, "wrong # args", TCL_STATIC);
return TCL_ERROR;
}
}
/*
*----------------------------------------------------------------------
*
* MainLoop --
*
* A main loop set by TestsetmainloopCmd below.
*
* Results:
* None.
*
* Side effects:
* Event handlers could do anything.
*
*----------------------------------------------------------------------
*/
static void
MainLoop(void)
{
while (!exitMainLoop) {
Tcl_DoOneEvent(0);
}
fprintf(stdout,"Exit MainLoop\n");
fflush(stdout);
}
/*
*----------------------------------------------------------------------
*
* TestsetmainloopCmd --
*
* Implements the "testsetmainloop" cmd that is used to test the
* 'Tcl_SetMainLoop' API.
*
* Results:
* A standard Tcl result.
*
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
static int
TestsetmainloopCmd (dummy, interp, argc, argv)
ClientData dummy; /* Not used. */
register Tcl_Interp *interp; /* Current interpreter. */
int argc; /* Number of arguments. */
char **argv; /* Argument strings. */
{
exitMainLoop = 0;
Tcl_SetMainLoop(MainLoop);
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
* TestexitmainloopCmd --
*
* Implements the "testexitmainloop" cmd that is used to test the
* 'Tcl_SetMainLoop' API.
*
* Results:
* A standard Tcl result.
*
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
static int
TestexitmainloopCmd (dummy, interp, argc, argv)
ClientData dummy; /* Not used. */
register Tcl_Interp *interp; /* Current interpreter. */
int argc; /* Number of arguments. */
char **argv; /* Argument strings. */
{
exitMainLoop = 1;
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
* TestaccessprocCmd --
*
* Implements the "testTclAccessProc" cmd that is used to test the
|
| ︙ | ︙ | |||
4351 4352 4353 4354 4355 4356 4357 |
return retVal;
}
static Tcl_Channel
PretendTclpOpenFileChannel(interp, fileName, modeString, permissions)
Tcl_Interp *interp; /* Interpreter for error reporting;
* can be NULL. */
| | | | | | | | | | | | | 4521 4522 4523 4524 4525 4526 4527 4528 4529 4530 4531 4532 4533 4534 4535 4536 4537 4538 4539 4540 4541 4542 4543 4544 4545 4546 4547 4548 4549 4550 4551 4552 4553 4554 4555 4556 4557 4558 4559 4560 4561 4562 4563 4564 4565 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 4600 4601 4602 4603 4604 4605 4606 4607 4608 4609 4610 4611 4612 4613 4614 4615 4616 4617 |
return retVal;
}
static Tcl_Channel
PretendTclpOpenFileChannel(interp, fileName, modeString, permissions)
Tcl_Interp *interp; /* Interpreter for error reporting;
* can be NULL. */
CONST char *fileName; /* Name of file to open. */
CONST char *modeString; /* A list of POSIX open modes or
* a string such as "rw". */
int permissions; /* If the open involves creating a
* file, with what modes to create
* it? */
{
Tcl_Channel ret;
Tcl_Obj *pathPtr = Tcl_NewStringObj(fileName, -1);
Tcl_IncrRefCount(pathPtr);
ret = TclpOpenFileChannel(interp, pathPtr, modeString, permissions);
Tcl_DecrRefCount(pathPtr);
return ret;
}
static Tcl_Channel
TestOpenFileChannelProc1(interp, fileName, modeString, permissions)
Tcl_Interp *interp; /* Interpreter for error reporting;
* can be NULL. */
CONST char *fileName; /* Name of file to open. */
CONST char *modeString; /* A list of POSIX open modes or
* a string such as "rw". */
int permissions; /* If the open involves creating a
* file, with what modes to create
* it? */
{
CONST char *expectname="testOpenFileChannel1%.fil";
Tcl_DString ds;
Tcl_DStringInit(&ds);
Tcl_JoinPath(1, &expectname, &ds);
if (!strcmp(Tcl_DStringValue(&ds), fileName)) {
Tcl_DStringFree(&ds);
return (PretendTclpOpenFileChannel(interp, "__testOpenFileChannel1%__.fil",
modeString, permissions));
} else {
Tcl_DStringFree(&ds);
return (NULL);
}
}
static Tcl_Channel
TestOpenFileChannelProc2(interp, fileName, modeString, permissions)
Tcl_Interp *interp; /* Interpreter for error reporting;
* can be NULL. */
CONST char *fileName; /* Name of file to open. */
CONST char *modeString; /* A list of POSIX open modes or
* a string such as "rw". */
int permissions; /* If the open involves creating a
* file, with what modes to create
* it? */
{
CONST char *expectname="testOpenFileChannel2%.fil";
Tcl_DString ds;
Tcl_DStringInit(&ds);
Tcl_JoinPath(1, &expectname, &ds);
if (!strcmp(Tcl_DStringValue(&ds), fileName)) {
Tcl_DStringFree(&ds);
return (PretendTclpOpenFileChannel(interp, "__testOpenFileChannel2%__.fil",
modeString, permissions));
} else {
Tcl_DStringFree(&ds);
return (NULL);
}
}
static Tcl_Channel
TestOpenFileChannelProc3(interp, fileName, modeString, permissions)
Tcl_Interp *interp; /* Interpreter for error reporting;
* can be NULL. */
CONST char *fileName; /* Name of file to open. */
CONST char *modeString; /* A list of POSIX open modes or
* a string such as "rw". */
int permissions; /* If the open involves creating a
* file, with what modes to create
* it? */
{
CONST char *expectname="testOpenFileChannel3%.fil";
Tcl_DString ds;
Tcl_DStringInit(&ds);
Tcl_JoinPath(1, &expectname, &ds);
if (!strcmp(Tcl_DStringValue(&ds), fileName)) {
Tcl_DStringFree(&ds);
|
| ︙ | ︙ | |||
5170 5171 5172 5173 5174 5175 5176 |
static int
TestGetIndexFromObjStructObjCmd(dummy, interp, objc, objv)
ClientData dummy; /* Not used. */
Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
| > | > | 5340 5341 5342 5343 5344 5345 5346 5347 5348 5349 5350 5351 5352 5353 5354 5355 5356 |
static int
TestGetIndexFromObjStructObjCmd(dummy, interp, objc, objv)
ClientData dummy; /* Not used. */
Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
CONST char *ary[] = {
"a", "b", "c", "d", "e", "f", (char *)NULL,(char *)NULL
};
int idx,target;
if (objc != 3) {
Tcl_WrongNumArgs(interp, 1, objv, "argument targetvalue");
return TCL_ERROR;
}
if (Tcl_GetIndexFromObjStruct(interp, objv[1], ary, 2*sizeof(char *),
|
| ︙ | ︙ | |||
5283 5284 5285 5286 5287 5288 5289 |
}
}
/*
* Simple helper function to extract the native vfs representation of a
* path object, or NULL if no such representation exists.
*/
| | | | | 5455 5456 5457 5458 5459 5460 5461 5462 5463 5464 5465 5466 5467 5468 5469 5470 5471 5472 5473 5474 5475 5476 5477 5478 5479 5480 5481 5482 5483 |
}
}
/*
* Simple helper function to extract the native vfs representation of a
* path object, or NULL if no such representation exists.
*/
static Tcl_Obj*
TestReportGetNativePath(Tcl_Obj* pathObjPtr) {
return (Tcl_Obj*) Tcl_FSGetInternalRep(pathObjPtr, &testReportingFilesystem);
}
static void
TestReportFreeInternalRep(ClientData clientData) {
Tcl_Obj *nativeRep = (Tcl_Obj*)clientData;
if (nativeRep != NULL) {
/* Free the path */
Tcl_DecrRefCount(nativeRep);
}
}
static ClientData
TestReportDupInternalRep(ClientData clientData) {
Tcl_Obj *original = (Tcl_Obj*)clientData;
Tcl_IncrRefCount(original);
return clientData;
}
static void
|
| ︙ | ︙ | |||
5361 5362 5363 5364 5365 5366 5367 |
TestReport("access",path,NULL);
return Tcl_FSAccess(TestReportGetNativePath(path),mode);
}
static Tcl_Channel
TestReportOpenFileChannel(interp, fileName, modeString, permissions)
Tcl_Interp *interp; /* Interpreter for error reporting;
* can be NULL. */
| | | | | 5533 5534 5535 5536 5537 5538 5539 5540 5541 5542 5543 5544 5545 5546 5547 5548 5549 5550 5551 5552 5553 5554 5555 5556 5557 5558 5559 5560 5561 5562 5563 5564 |
TestReport("access",path,NULL);
return Tcl_FSAccess(TestReportGetNativePath(path),mode);
}
static Tcl_Channel
TestReportOpenFileChannel(interp, fileName, modeString, permissions)
Tcl_Interp *interp; /* Interpreter for error reporting;
* can be NULL. */
Tcl_Obj *fileName; /* Name of file to open. */
CONST char *modeString; /* A list of POSIX open modes or
* a string such as "rw". */
int permissions; /* If the open involves creating a
* file, with what modes to create
* it? */
{
TestReport("open",fileName, NULL);
return Tcl_FSOpenFileChannel(interp, TestReportGetNativePath(fileName),
modeString, permissions);
}
static int
TestReportMatchInDirectory(interp, resultPtr, dirPtr, pattern, types)
Tcl_Interp *interp; /* Interpreter to receive results. */
Tcl_Obj *resultPtr; /* Directory separators to pass to TclDoGlob. */
Tcl_Obj *dirPtr; /* Contains path to directory to search. */
CONST char *pattern; /* Pattern to match against. */
Tcl_GlobTypeData *types; /* Object containing list of acceptable types.
* May be NULL. */
{
TestReport("matchindirectory",dirPtr, NULL);
return Tcl_FSMatchInDirectory(interp, resultPtr,
TestReportGetNativePath(dirPtr), pattern,
types);
|
| ︙ | ︙ | |||
5485 5486 5487 5488 5489 5490 5491 |
Tcl_Obj **errorPtr; /* If non-NULL, to be filled with UTF-8 name
* of file causing error. */
{
TestReport("removedirectory",path,NULL);
return Tcl_FSRemoveDirectory(TestReportGetNativePath(path), recursive,
errorPtr);
}
| | | 5657 5658 5659 5660 5661 5662 5663 5664 5665 5666 5667 5668 5669 5670 5671 |
Tcl_Obj **errorPtr; /* If non-NULL, to be filled with UTF-8 name
* of file causing error. */
{
TestReport("removedirectory",path,NULL);
return Tcl_FSRemoveDirectory(TestReportGetNativePath(path), recursive,
errorPtr);
}
static CONST char**
TestReportFileAttrStrings(fileName, objPtrRef)
Tcl_Obj* fileName;
Tcl_Obj** objPtrRef;
{
TestReport("fileattributestrings",fileName,NULL);
return Tcl_FSFileAttrStrings(TestReportGetNativePath(fileName), objPtrRef);
}
|
| ︙ | ︙ |
Changes to generic/tclTestObj.c.
| ︙ | ︙ | |||
8 9 10 11 12 13 14 | * * Copyright (c) 1995-1998 Sun Microsystems, Inc. * Copyright (c) 1999 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | * * Copyright (c) 1995-1998 Sun Microsystems, Inc. * Copyright (c) 1999 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclTestObj.c,v 1.7.14.1 2002/02/05 02:22:00 wolfsuit Exp $ */ #include "tclInt.h" /* * An array of Tcl_Obj pointers used in the commands that operate on or get * the values of Tcl object-valued variables. varPtr[i] is the i-th |
| ︙ | ︙ | |||
400 401 402 403 404 405 406 |
TestindexobjCmd(clientData, interp, objc, objv)
ClientData clientData; /* Not used. */
Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
int allowAbbrev, index, index2, setError, i, result;
| | | | 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 |
TestindexobjCmd(clientData, interp, objc, objv)
ClientData clientData; /* Not used. */
Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
int allowAbbrev, index, index2, setError, i, result;
CONST char **argv;
static CONST char *tablePtr[] = {"a", "b", "check", (char *) NULL};
if ((objc == 3) && (strcmp(Tcl_GetString(objv[1]),
"check") == 0)) {
/*
* This code checks to be sure that the results of
* Tcl_GetIndexFromObj are properly cached in the object and
* returned on subsequent lookups.
|
| ︙ | ︙ | |||
438 439 440 441 442 443 444 |
if (Tcl_GetBooleanFromObj(interp, objv[1], &setError) != TCL_OK) {
return TCL_ERROR;
}
if (Tcl_GetBooleanFromObj(interp, objv[2], &allowAbbrev) != TCL_OK) {
return TCL_ERROR;
}
| | | 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 |
if (Tcl_GetBooleanFromObj(interp, objv[1], &setError) != TCL_OK) {
return TCL_ERROR;
}
if (Tcl_GetBooleanFromObj(interp, objv[2], &allowAbbrev) != TCL_OK) {
return TCL_ERROR;
}
argv = (CONST char **) ckalloc((unsigned) ((objc-3) * sizeof(char *)));
for (i = 4; i < objc; i++) {
argv[i-4] = Tcl_GetString(objv[i]);
}
argv[objc-4] = NULL;
/*
* Tcl_GetIndexFromObj assumes that the table is statically-allocated
|
| ︙ | ︙ | |||
770 771 772 773 774 775 776 777 778 779 780 781 782 783 |
}
for (i = 0; i < NUMBER_OF_OBJECT_VARS; i++) {
if (varPtr[i] != NULL) {
Tcl_DecrRefCount(varPtr[i]);
varPtr[i] = NULL;
}
}
} else if (strcmp(subCmd, "newobj") == 0) {
if (objc != 3) {
goto wrongNumArgs;
}
index = Tcl_GetString(objv[2]);
if (GetVariableIndex(interp, index, &varIndex) != TCL_OK) {
return TCL_ERROR;
| > > > > > > > > > > > > > | 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 |
}
for (i = 0; i < NUMBER_OF_OBJECT_VARS; i++) {
if (varPtr[i] != NULL) {
Tcl_DecrRefCount(varPtr[i]);
varPtr[i] = NULL;
}
}
} else if ( strcmp ( subCmd, "invalidateStringRep" ) == 0 ) {
if ( objc != 3 ) {
goto wrongNumArgs;
}
index = Tcl_GetString( objv[2] );
if ( GetVariableIndex( interp, index, &varIndex ) != TCL_OK ) {
return TCL_ERROR;
}
if (CheckIfVarUnset(interp, varIndex)) {
return TCL_ERROR;
}
Tcl_InvalidateStringRep( varPtr[varIndex] );
Tcl_SetObjResult( interp, varPtr[varIndex] );
} else if (strcmp(subCmd, "newobj") == 0) {
if (objc != 3) {
goto wrongNumArgs;
}
index = Tcl_GetString(objv[2]);
if (GetVariableIndex(interp, index, &varIndex) != TCL_OK) {
return TCL_ERROR;
|
| ︙ | ︙ | |||
878 879 880 881 882 883 884 |
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
int varIndex, option, i, length;
#define MAX_STRINGS 11
char *index, *string, *strings[MAX_STRINGS+1];
TestString *strPtr;
| | | 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 |
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
int varIndex, option, i, length;
#define MAX_STRINGS 11
char *index, *string, *strings[MAX_STRINGS+1];
TestString *strPtr;
static CONST char *options[] = {
"append", "appendstrings", "get", "get2", "length", "length2",
"set", "set2", "setlength", "ualloc", (char *) NULL
};
if (objc < 3) {
wrongNumArgs:
Tcl_WrongNumArgs(interp, 1, objv, "option arg ?arg ...?");
|
| ︙ | ︙ |
Changes to generic/tclThreadJoin.c.
1 2 3 4 5 6 7 8 9 10 11 12 | /* * tclThreadJoin.c -- * * This file implements a platform independent emulation layer for * the handling of joinable threads. The Mac and Windows platforms * use this code to provide the functionality of joining threads. * * Copyright (c) 2000 by Scriptics, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /* * tclThreadJoin.c -- * * This file implements a platform independent emulation layer for * the handling of joinable threads. The Mac and Windows platforms * use this code to provide the functionality of joining threads. * * Copyright (c) 2000 by Scriptics, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclThreadJoin.c,v 1.2.14.1 2002/02/05 02:22:00 wolfsuit Exp $ */ #include "tclInt.h" /* The information about each joinable thread is remembered in a * structure as defined below. */ |
| ︙ | ︙ | |||
195 196 197 198 199 200 201 |
* free the structure and return.
*/
*result = threadPtr->result;
Tcl_ConditionFinalize (&threadPtr->cond);
Tcl_MutexFinalize (&threadPtr->threadMutex);
| | | 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 |
* free the structure and return.
*/
*result = threadPtr->result;
Tcl_ConditionFinalize (&threadPtr->cond);
Tcl_MutexFinalize (&threadPtr->threadMutex);
ckfree ((VOID*) threadPtr);
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
|
| ︙ | ︙ | |||
226 227 228 229 230 231 232 |
VOID
TclRememberJoinableThread(id)
Tcl_ThreadId id; /* The thread to remember as joinable */
{
JoinableThread* threadPtr;
| | | 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 |
VOID
TclRememberJoinableThread(id)
Tcl_ThreadId id; /* The thread to remember as joinable */
{
JoinableThread* threadPtr;
threadPtr = (JoinableThread*) ckalloc (sizeof (JoinableThread));
threadPtr->id = id;
threadPtr->done = 0;
threadPtr->waitedUpon = 0;
threadPtr->threadMutex = (Tcl_Mutex) NULL;
threadPtr->cond = (Tcl_Condition) NULL;
Tcl_MutexLock (&joinMutex);
|
| ︙ | ︙ |
Changes to generic/tclThreadTest.c.
1 2 3 4 5 6 7 8 9 10 11 12 13 | /* * tclThreadTest.c -- * * This file implements the testthread command. Eventually this * should be tclThreadCmd.c * Some of this code is based on work done by Richard Hipp on behalf of * Conservation Through Innovation, Limited, with their permission. * * Copyright (c) 1998 by Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | /* * tclThreadTest.c -- * * This file implements the testthread command. Eventually this * should be tclThreadCmd.c * Some of this code is based on work done by Richard Hipp on behalf of * Conservation Through Innovation, Limited, with their permission. * * Copyright (c) 1998 by Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclThreadTest.c,v 1.11.14.1 2002/02/05 02:22:00 wolfsuit Exp $ */ #include "tclInt.h" #ifdef TCL_THREADS /* * Each thread has an single instance of the following structure. There |
| ︙ | ︙ | |||
114 115 116 117 118 119 120 | #undef TCL_STORAGE_CLASS #define TCL_STORAGE_CLASS DLLEXPORT EXTERN int TclThread_Init _ANSI_ARGS_((Tcl_Interp *interp)); EXTERN int Tcl_ThreadObjCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])); EXTERN int TclCreateThread _ANSI_ARGS_((Tcl_Interp *interp, | | | | 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 | #undef TCL_STORAGE_CLASS #define TCL_STORAGE_CLASS DLLEXPORT EXTERN int TclThread_Init _ANSI_ARGS_((Tcl_Interp *interp)); EXTERN int Tcl_ThreadObjCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])); EXTERN int TclCreateThread _ANSI_ARGS_((Tcl_Interp *interp, char *script, int joinable)); EXTERN int TclThreadList _ANSI_ARGS_((Tcl_Interp *interp)); EXTERN int TclThreadSend _ANSI_ARGS_((Tcl_Interp *interp, Tcl_ThreadId id, char *script, int wait)); #undef TCL_STORAGE_CLASS #define TCL_STORAGE_CLASS DLLIMPORT Tcl_ThreadCreateType NewTestThread _ANSI_ARGS_((ClientData clientData)); static void ListRemove _ANSI_ARGS_((ThreadSpecificData *tsdPtr)); static void ListUpdateInner _ANSI_ARGS_((ThreadSpecificData *tsdPtr)); static int ThreadEventProc _ANSI_ARGS_((Tcl_Event *evPtr, int mask)); static void ThreadErrorProc _ANSI_ARGS_((Tcl_Interp *interp)); static void ThreadFreeProc _ANSI_ARGS_((ClientData clientData)); static int ThreadDeleteEvent _ANSI_ARGS_((Tcl_Event *eventPtr, ClientData clientData)); |
| ︙ | ︙ | |||
199 200 201 202 203 204 205 |
ClientData dummy; /* Not used. */
Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
int option;
| | | 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 |
ClientData dummy; /* Not used. */
Tcl_Interp *interp; /* Current interpreter. */
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
int option;
static CONST char *threadOptions[] = {"create", "exit", "id", "join", "names",
"send", "wait", "errorproc",
(char *) NULL};
enum options {THREAD_CREATE, THREAD_EXIT, THREAD_ID, THREAD_JOIN,
THREAD_NAMES, THREAD_SEND, THREAD_WAIT, THREAD_ERRORPROC};
if (objc < 2) {
Tcl_WrongNumArgs(interp, 1, objv, "option ?args?");
|
| ︙ | ︙ | |||
401 402 403 404 405 406 407 |
*----------------------------------------------------------------------
*/
/* ARGSUSED */
int
TclCreateThread(interp, script, joinable)
Tcl_Interp *interp; /* Current interpreter. */
| | | | | 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 |
*----------------------------------------------------------------------
*/
/* ARGSUSED */
int
TclCreateThread(interp, script, joinable)
Tcl_Interp *interp; /* Current interpreter. */
char *script; /* Script to execute */
int joinable; /* Flag, joinable thread or not */
{
ThreadCtrl ctrl;
Tcl_ThreadId id;
ctrl.script = script;
ctrl.condWait = NULL;
ctrl.flags = 0;
joinable = joinable ? TCL_THREAD_JOINABLE : TCL_THREAD_NOFLAGS;
Tcl_MutexLock(&threadMutex);
if (Tcl_CreateThread(&id, NewTestThread, (ClientData) &ctrl,
TCL_THREAD_STACK_DEFAULT, joinable) != TCL_OK) {
Tcl_MutexUnlock(&threadMutex);
Tcl_AppendResult(interp,"can't create a new thread",0);
ckfree((void*)ctrl.script);
return TCL_ERROR;
}
|
| ︙ | ︙ | |||
436 437 438 439 440 441 442 |
Tcl_SetObjResult(interp, Tcl_NewLongObj((long)id));
return TCL_OK;
}
/*
*------------------------------------------------------------------------
*
| | | 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 |
Tcl_SetObjResult(interp, Tcl_NewLongObj((long)id));
return TCL_OK;
}
/*
*------------------------------------------------------------------------
*
* NewTestThread --
*
* This routine is the "main()" for a new thread whose task is to
* execute a single TCL script. The argument to this function is
* a pointer to a structure that contains the text of the TCL script
* to be executed.
*
* Space to hold the script field of the ThreadControl structure passed
|
| ︙ | ︙ | |||
462 463 464 465 466 467 468 | * * Side effects: * A TCL script is executed in a new thread. * *------------------------------------------------------------------------ */ Tcl_ThreadCreateType | | | 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 |
*
* Side effects:
* A TCL script is executed in a new thread.
*
*------------------------------------------------------------------------
*/
Tcl_ThreadCreateType
NewTestThread(clientData)
ClientData clientData;
{
ThreadCtrl *ctrlPtr = (ThreadCtrl*)clientData;
ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
int result;
char *threadEvalScript;
|
| ︙ | ︙ | |||
542 543 544 545 546 547 548 |
*------------------------------------------------------------------------
*/
static void
ThreadErrorProc(interp)
Tcl_Interp *interp; /* Interp that failed */
{
Tcl_Channel errChannel;
| | | | 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 |
*------------------------------------------------------------------------
*/
static void
ThreadErrorProc(interp)
Tcl_Interp *interp; /* Interp that failed */
{
Tcl_Channel errChannel;
CONST char *errorInfo, *argv[3];
char *script;
char buf[TCL_DOUBLE_SPACE+1];
sprintf(buf, "%ld", (long) Tcl_GetCurrentThread());
errorInfo = Tcl_GetVar(interp, "errorInfo", TCL_GLOBAL_ONLY);
if (errorProcString == NULL) {
errChannel = Tcl_GetStdChannel(TCL_STDERR);
Tcl_WriteChars(errChannel, "Error from thread ", -1);
|
| ︙ | ︙ | |||
839 840 841 842 843 844 845 | * Returns 1 to indicate that the event was processed. * * Side effects: * Fills out the ThreadEventResult struct. * *------------------------------------------------------------------------ */ | | | | 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 |
* Returns 1 to indicate that the event was processed.
*
* Side effects:
* Fills out the ThreadEventResult struct.
*
*------------------------------------------------------------------------
*/
static int
ThreadEventProc(evPtr, mask)
Tcl_Event *evPtr; /* Really ThreadEvent */
int mask;
{
ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
ThreadEvent *threadEventPtr = (ThreadEvent *)evPtr;
ThreadEventResult *resultPtr = threadEventPtr->resultPtr;
Tcl_Interp *interp = tsdPtr->interp;
int code;
CONST char *result, *errorCode, *errorInfo;
if (interp == NULL) {
code = TCL_ERROR;
result = "no target interp!";
errorCode = "THREAD";
errorInfo = "";
} else {
|
| ︙ | ︙ | |||
912 913 914 915 916 917 918 |
*
* Side effects:
* Clears up mem specified in ClientData
*
*------------------------------------------------------------------------
*/
/* ARGSUSED */
| | | 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 |
*
* Side effects:
* Clears up mem specified in ClientData
*
*------------------------------------------------------------------------
*/
/* ARGSUSED */
static void
ThreadFreeProc(clientData)
ClientData clientData;
{
if (clientData) {
ckfree((char *) clientData);
}
}
|
| ︙ | ︙ | |||
938 939 940 941 942 943 944 |
*
* Side effects:
* It cleans up our events in the event queue for this thread.
*
*------------------------------------------------------------------------
*/
/* ARGSUSED */
| | | 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 |
*
* Side effects:
* It cleans up our events in the event queue for this thread.
*
*------------------------------------------------------------------------
*/
/* ARGSUSED */
static int
ThreadDeleteEvent(eventPtr, clientData)
Tcl_Event *eventPtr; /* Really ThreadEvent */
ClientData clientData; /* dummy */
{
if (eventPtr->proc == ThreadEventProc) {
ckfree((char *) ((ThreadEvent *) eventPtr)->script);
return 1;
|
| ︙ | ︙ | |||
971 972 973 974 975 976 977 |
* Side effects:
* It unblocks anyone that is waiting on a send to this thread.
* It cleans up any events in the event queue for this thread.
*
*------------------------------------------------------------------------
*/
/* ARGSUSED */
| | | 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 |
* Side effects:
* It unblocks anyone that is waiting on a send to this thread.
* It cleans up any events in the event queue for this thread.
*
*------------------------------------------------------------------------
*/
/* ARGSUSED */
static void
ThreadExitProc(clientData)
ClientData clientData;
{
char *threadEvalScript = (char *) clientData;
ThreadEventResult *resultPtr, *nextPtr;
Tcl_ThreadId self = Tcl_GetCurrentThread();
|
| ︙ | ︙ |
Changes to generic/tclTimer.c.
1 2 3 4 5 6 7 8 9 10 11 | /* * tclTimer.c -- * * This file provides timer event management facilities for Tcl, * including the "after" command. * * Copyright (c) 1997 by Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | /* * tclTimer.c -- * * This file provides timer event management facilities for Tcl, * including the "after" command. * * Copyright (c) 1997 by Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclTimer.c,v 1.3.28.1 2002/02/05 02:22:00 wolfsuit Exp $ */ #include "tclInt.h" #include "tclPort.h" /* * For each timer callback that's pending there is one record of the following |
| ︙ | ︙ | |||
220 221 222 223 224 225 226 |
timerHandlerPtr = (TimerHandler *) ckalloc(sizeof(TimerHandler));
/*
* Compute when the event should fire.
*/
| | | 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 |
timerHandlerPtr = (TimerHandler *) ckalloc(sizeof(TimerHandler));
/*
* Compute when the event should fire.
*/
Tcl_GetTime(&time);
timerHandlerPtr->time.sec = time.sec + milliseconds/1000;
timerHandlerPtr->time.usec = time.usec + (milliseconds%1000)*1000;
if (timerHandlerPtr->time.usec >= 1000000) {
timerHandlerPtr->time.usec -= 1000000;
timerHandlerPtr->time.sec += 1;
}
|
| ︙ | ︙ | |||
346 347 348 349 350 351 352 |
blockTime.usec = 0;
} else if ((flags & TCL_TIMER_EVENTS) && tsdPtr->firstTimerHandlerPtr) {
/*
* Compute the timeout for the next timer on the list.
*/
| | | 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 |
blockTime.usec = 0;
} else if ((flags & TCL_TIMER_EVENTS) && tsdPtr->firstTimerHandlerPtr) {
/*
* Compute the timeout for the next timer on the list.
*/
Tcl_GetTime(&blockTime);
blockTime.sec = tsdPtr->firstTimerHandlerPtr->time.sec - blockTime.sec;
blockTime.usec = tsdPtr->firstTimerHandlerPtr->time.usec -
blockTime.usec;
if (blockTime.usec < 0) {
blockTime.sec -= 1;
blockTime.usec += 1000000;
}
|
| ︙ | ︙ | |||
397 398 399 400 401 402 403 |
ThreadSpecificData *tsdPtr = InitTimer();
if ((flags & TCL_TIMER_EVENTS) && tsdPtr->firstTimerHandlerPtr) {
/*
* Compute the timeout for the next timer on the list.
*/
| | | 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 |
ThreadSpecificData *tsdPtr = InitTimer();
if ((flags & TCL_TIMER_EVENTS) && tsdPtr->firstTimerHandlerPtr) {
/*
* Compute the timeout for the next timer on the list.
*/
Tcl_GetTime(&blockTime);
blockTime.sec = tsdPtr->firstTimerHandlerPtr->time.sec - blockTime.sec;
blockTime.usec = tsdPtr->firstTimerHandlerPtr->time.usec -
blockTime.usec;
if (blockTime.usec < 0) {
blockTime.sec -= 1;
blockTime.usec += 1000000;
}
|
| ︙ | ︙ | |||
496 497 498 499 500 501 502 |
* handler appearing after earlier ones with the same expiration
* time, we don't have to worry about newer generation timers
* appearing before later ones.
*/
tsdPtr->timerPending = 0;
currentTimerId = tsdPtr->lastTimerId;
| | | 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 |
* handler appearing after earlier ones with the same expiration
* time, we don't have to worry about newer generation timers
* appearing before later ones.
*/
tsdPtr->timerPending = 0;
currentTimerId = tsdPtr->lastTimerId;
Tcl_GetTime(&time);
while (1) {
nextPtrPtr = &tsdPtr->firstTimerHandlerPtr;
timerHandlerPtr = tsdPtr->firstTimerHandlerPtr;
if (timerHandlerPtr == NULL) {
break;
}
|
| ︙ | ︙ | |||
731 732 733 734 735 736 737 |
AfterInfo *afterPtr;
AfterAssocData *assocPtr = (AfterAssocData *) clientData;
Tcl_CmdInfo cmdInfo;
int length;
char *argString;
int index;
char buf[16 + TCL_INTEGER_SPACE];
| > | > | 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 |
AfterInfo *afterPtr;
AfterAssocData *assocPtr = (AfterAssocData *) clientData;
Tcl_CmdInfo cmdInfo;
int length;
char *argString;
int index;
char buf[16 + TCL_INTEGER_SPACE];
static CONST char *afterSubCmds[] = {
"cancel", "idle", "info", (char *) NULL
};
enum afterSubCmds {AFTER_CANCEL, AFTER_IDLE, AFTER_INFO};
ThreadSpecificData *tsdPtr = InitTimer();
if (objc < 2) {
Tcl_WrongNumArgs(interp, 1, objv, "option ?arg arg ...?");
return TCL_ERROR;
}
|
| ︙ | ︙ |
Changes to generic/tclUtf.c.
1 2 3 4 5 6 7 8 9 10 | /* * tclUtf.c -- * * Routines for manipulating UTF-8 strings. * * Copyright (c) 1997-1998 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | /* * tclUtf.c -- * * Routines for manipulating UTF-8 strings. * * Copyright (c) 1997-1998 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclUtf.c,v 1.17.4.1 2002/02/05 02:22:00 wolfsuit Exp $ */ #include "tclInt.h" /* * Include the static character classification tables and macros. */ |
| ︙ | ︙ | |||
227 228 229 230 231 232 233 | * * Side effects: * None. * *--------------------------------------------------------------------------- */ | | | 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 |
*
* Side effects:
* None.
*
*---------------------------------------------------------------------------
*/
CONST char *
Tcl_UniCharToUtfDString(wString, numChars, dsPtr)
CONST Tcl_UniChar *wString; /* Unicode string to convert to UTF-8. */
int numChars; /* Length of Unicode string in Tcl_UniChars
* (must be >= 0). */
Tcl_DString *dsPtr; /* UTF-8 representation of string is
* appended to this previously initialized
* DString. */
|
| ︙ | ︙ | |||
389 390 391 392 393 394 395 | * * Side effects: * None. * *--------------------------------------------------------------------------- */ | | | 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 |
*
* Side effects:
* None.
*
*---------------------------------------------------------------------------
*/
CONST Tcl_UniChar *
Tcl_UtfToUniCharDString(string, length, dsPtr)
CONST char *string; /* UTF-8 string to convert to Unicode. */
int length; /* Length of UTF-8 string in bytes, or -1
* for strlen(). */
Tcl_DString *dsPtr; /* Unicode representation of string is
* appended to this previously initialized
* DString. */
|
| ︙ | ︙ | |||
532 533 534 535 536 537 538 | * the return value is NULL. * * Side effects: * None. * *--------------------------------------------------------------------------- */ | | | | 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 |
* the return value is NULL.
*
* Side effects:
* None.
*
*---------------------------------------------------------------------------
*/
CONST char *
Tcl_UtfFindFirst(string, ch)
CONST char *string; /* The UTF-8 string to be searched. */
int ch; /* The Tcl_UniChar to search for. */
{
int len;
Tcl_UniChar find;
while (1) {
len = Tcl_UtfToUniChar(string, &find);
if (find == ch) {
return string;
}
if (*string == '\0') {
return NULL;
}
string += len;
}
}
|
| ︙ | ︙ | |||
572 573 574 575 576 577 578 | * * Side effects: * None. * *--------------------------------------------------------------------------- */ | | | | 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 |
*
* Side effects:
* None.
*
*---------------------------------------------------------------------------
*/
CONST char *
Tcl_UtfFindLast(string, ch)
CONST char *string; /* The UTF-8 string to be searched. */
int ch; /* The Tcl_UniChar to search for. */
{
int len;
Tcl_UniChar find;
CONST char *last;
last = NULL;
while (1) {
len = Tcl_UtfToUniChar(string, &find);
if (find == ch) {
last = string;
}
if (*string == '\0') {
break;
}
string += len;
}
return last;
}
/*
*---------------------------------------------------------------------------
*
* Tcl_UtfNext --
*
|
| ︙ | ︙ | |||
615 616 617 618 619 620 621 | * * Side effects: * None. * *--------------------------------------------------------------------------- */ | | | | 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 |
*
* Side effects:
* None.
*
*---------------------------------------------------------------------------
*/
CONST char *
Tcl_UtfNext(str)
CONST char *str; /* The current location in the string. */
{
Tcl_UniChar ch;
return str + Tcl_UtfToUniChar(str, &ch);
}
/*
*---------------------------------------------------------------------------
*
* Tcl_UtfPrev --
*
|
| ︙ | ︙ | |||
645 646 647 648 649 650 651 | * * Side effects: * None. * *--------------------------------------------------------------------------- */ | | | 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 |
*
* Side effects:
* None.
*
*---------------------------------------------------------------------------
*/
CONST char *
Tcl_UtfPrev(str, start)
CONST char *str; /* The current location in the string. */
CONST char *start; /* Pointer to the beginning of the
* string, to avoid going backwards too
* far. */
{
CONST char *look;
|
| ︙ | ︙ | |||
669 670 671 672 673 674 675 |
break;
}
byte = *((unsigned char *) look);
if (byte < 0x80) {
break;
}
if (byte >= 0xC0) {
| | | | 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 |
break;
}
byte = *((unsigned char *) look);
if (byte < 0x80) {
break;
}
if (byte >= 0xC0) {
return look;
}
look--;
}
return str;
}
/*
*---------------------------------------------------------------------------
*
* Tcl_UniCharAtIndex --
*
|
| ︙ | ︙ | |||
724 725 726 727 728 729 730 | * * Side effects: * None. * *--------------------------------------------------------------------------- */ | | | | 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 |
*
* Side effects:
* None.
*
*---------------------------------------------------------------------------
*/
CONST char *
Tcl_UtfAtIndex(src, index)
register CONST char *src; /* The UTF-8 string. */
register int index; /* The position of the desired character. */
{
Tcl_UniChar ch;
while (index > 0) {
index--;
src += Tcl_UtfToUniChar(src, &ch);
}
return src;
}
/*
*---------------------------------------------------------------------------
*
* Tcl_UtfBackslash --
*
|
| ︙ | ︙ | |||
1268 1269 1270 1271 1272 1273 1274 | * None. * *---------------------------------------------------------------------- */ int Tcl_UniCharLen(str) | | | 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 |
* None.
*
*----------------------------------------------------------------------
*/
int
Tcl_UniCharLen(str)
CONST Tcl_UniChar *str; /* Unicode string to find length of. */
{
int len = 0;
while (*str != '\0') {
len++;
str++;
}
|
| ︙ | ︙ | |||
1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 |
* Skip all successive *'s in the pattern
*/
while (*(++pattern) == '*') {}
p = *pattern;
if (p == 0) {
return 1;
}
while (1) {
/*
* Optimization for matching - cruise through the string
* quickly if the next char in the pattern isn't a special
* character
*/
if ((p != '[') && (p != '?') && (p != '\\')) {
| > > > | 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 |
* Skip all successive *'s in the pattern
*/
while (*(++pattern) == '*') {}
p = *pattern;
if (p == 0) {
return 1;
}
if (nocase) {
p = Tcl_UniCharToLower(p);
}
while (1) {
/*
* Optimization for matching - cruise through the string
* quickly if the next char in the pattern isn't a special
* character
*/
if ((p != '[') && (p != '?') && (p != '\\')) {
|
| ︙ | ︙ |
Changes to generic/tclUtil.c.
1 2 3 4 5 6 7 8 9 10 11 12 | /* * tclUtil.c -- * * This file contains utility procedures that are used by many Tcl * commands. * * Copyright (c) 1987-1993 The Regents of the University of California. * Copyright (c) 1994-1998 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | > | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | /* * tclUtil.c -- * * This file contains utility procedures that are used by many Tcl * commands. * * Copyright (c) 1987-1993 The Regents of the University of California. * Copyright (c) 1994-1998 Sun Microsystems, Inc. * Copyright (c) 2001 by Kevin B. Kenny. All rights reserved. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclUtil.c,v 1.24.2.1 2002/02/05 02:22:00 wolfsuit Exp $ */ #include "tclInt.h" #include "tclPort.h" /* * The following variable holds the full path name of the binary |
| ︙ | ︙ | |||
57 58 59 60 61 62 63 64 65 66 67 68 69 70 | static char precisionString[10] = "12"; /* The string value of all the tcl_precision * variables. */ static char precisionFormat[10] = "%.12g"; /* The format string actually used in calls * to sprintf. */ TCL_DECLARE_MUTEX(precisionMutex) /* *---------------------------------------------------------------------- * * TclFindElement -- * | > > > > > > > > > > > > > > > > > > > > > > > > | 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
static char precisionString[10] = "12";
/* The string value of all the tcl_precision
* variables. */
static char precisionFormat[10] = "%.12g";
/* The format string actually used in calls
* to sprintf. */
TCL_DECLARE_MUTEX(precisionMutex)
/*
* Prototypes for procedures defined later in this file.
*/
static void UpdateStringOfEndOffset _ANSI_ARGS_(( Tcl_Obj* objPtr ));
static int SetEndOffsetFromAny _ANSI_ARGS_(( Tcl_Interp* interp,
Tcl_Obj* objPtr ));
/*
* The following is the Tcl object type definition for an object
* that represents a list index in the form, "end-offset". It is
* used as a performance optimization in TclGetIntForIndex. The
* internal rep is an integer, so no memory management is required
* for it.
*/
Tcl_ObjType tclEndOffsetType = {
"end-offset", /* name */
(Tcl_FreeInternalRepProc*) NULL, /* freeIntRepProc */
(Tcl_DupInternalRepProc*) NULL, /* dupIntRepProc */
UpdateStringOfEndOffset, /* updateStringProc */
SetEndOffsetFromAny
};
/*
*----------------------------------------------------------------------
*
* TclFindElement --
*
|
| ︙ | ︙ | |||
391 392 393 394 395 396 397 |
int
Tcl_SplitList(interp, list, argcPtr, argvPtr)
Tcl_Interp *interp; /* Interpreter to use for error reporting.
* If NULL, no error message is left. */
CONST char *list; /* Pointer to string with list structure. */
int *argcPtr; /* Pointer to location to fill in with
* the number of elements in the list. */
| | | | | 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 |
int
Tcl_SplitList(interp, list, argcPtr, argvPtr)
Tcl_Interp *interp; /* Interpreter to use for error reporting.
* If NULL, no error message is left. */
CONST char *list; /* Pointer to string with list structure. */
int *argcPtr; /* Pointer to location to fill in with
* the number of elements in the list. */
CONST char ***argvPtr; /* Pointer to place to store pointer to
* array of pointers to list elements. */
{
CONST char **argv;
CONST char *l;
char *p;
int length, size, i, result, elSize, brace;
CONST char *element;
/*
* Figure out how much space to allocate. There must be enough
* space for both the array of pointers and also for a copy of
* the list. To estimate the number of pointers needed, count
* the number of space characters in the list.
*/
for (size = 1, l = list; *l != 0; l++) {
if (isspace(UCHAR(*l))) { /* INTL: ISO space. */
size++;
}
}
size++; /* Leave space for final NULL pointer. */
argv = (CONST char **) ckalloc((unsigned)
((size * sizeof(char *)) + (l - list) + 1));
length = strlen(list);
for (i = 0, p = ((char *) argv) + size*sizeof(char *);
*list != 0; i++) {
CONST char *prevList = list;
result = TclFindElement(interp, list, length, &element,
|
| ︙ | ︙ | |||
818 819 820 821 822 823 824 |
*
*----------------------------------------------------------------------
*/
char *
Tcl_Merge(argc, argv)
int argc; /* How many strings to merge. */
| | | 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 |
*
*----------------------------------------------------------------------
*/
char *
Tcl_Merge(argc, argv)
int argc; /* How many strings to merge. */
CONST char * CONST *argv; /* Array of string values. */
{
# define LOCAL_SIZE 20
int localFlags[LOCAL_SIZE], *flagPtr;
int numChars;
char *result;
char *dst;
int i;
|
| ︙ | ︙ | |||
921 922 923 924 925 926 927 |
*
*----------------------------------------------------------------------
*/
char *
Tcl_Concat(argc, argv)
int argc; /* Number of strings to concatenate. */
| | | 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 |
*
*----------------------------------------------------------------------
*/
char *
Tcl_Concat(argc, argv)
int argc; /* Number of strings to concatenate. */
CONST char * CONST *argv; /* Array of strings to concatenate. */
{
int totalSize, i;
char *p;
char *result;
for (totalSize = 1, i = 0; i < argc; i++) {
totalSize += strlen(argv[i]) + 1;
|
| ︙ | ︙ | |||
1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 |
* Skip all successive *'s in the pattern
*/
while (*(++pattern) == '*') {}
p = *pattern;
if (p == '\0') {
return 1;
}
while (1) {
/*
* Optimization for matching - cruise through the string
* quickly if the next char in the pattern isn't a special
* character
*/
if ((p != '[') && (p != '?') && (p != '\\')) {
if (nocase) {
| > > > > | | | | > > > > > | | > > > > | 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 |
* Skip all successive *'s in the pattern
*/
while (*(++pattern) == '*') {}
p = *pattern;
if (p == '\0') {
return 1;
}
Tcl_UtfToUniChar(pattern, &ch2);
if (nocase) {
ch2 = Tcl_UniCharToLower(ch2);
}
while (1) {
/*
* Optimization for matching - cruise through the string
* quickly if the next char in the pattern isn't a special
* character
*/
if ((p != '[') && (p != '?') && (p != '\\')) {
if (nocase) {
while (*string) {
int charLen = Tcl_UtfToUniChar(string, &ch1);
if (ch2==ch1 || ch2==Tcl_UniCharToLower(ch1)) {
break;
}
string += charLen;
}
} else {
/*
* There's no point in trying to make this code
* shorter, as the number of bytes you want to
* compare each time is non-constant.
*/
while (*string) {
int charLen = Tcl_UtfToUniChar(string, &ch1);
if (ch2 == ch1) {
break;
}
string += charLen;
}
}
}
if (Tcl_StringCaseMatch(string, pattern, nocase)) {
return 1;
}
if (*string == '\0') {
|
| ︙ | ︙ | |||
1840 1841 1842 1843 1844 1845 1846 |
TclPrecTraceProc(clientData, interp, name1, name2, flags)
ClientData clientData; /* Not used. */
Tcl_Interp *interp; /* Interpreter containing variable. */
char *name1; /* Name of variable. */
char *name2; /* Second part of variable name. */
int flags; /* Information about what happened. */
{
| > | | 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 |
TclPrecTraceProc(clientData, interp, name1, name2, flags)
ClientData clientData; /* Not used. */
Tcl_Interp *interp; /* Interpreter containing variable. */
char *name1; /* Name of variable. */
char *name2; /* Second part of variable name. */
int flags; /* Information about what happened. */
{
CONST char *value;
char *end;
int prec;
/*
* If the variable is unset, then recreate the trace.
*/
if (flags & TCL_TRACE_UNSETS) {
|
| ︙ | ︙ | |||
2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 |
* "objPtr" holds "end". */
int *indexPtr; /* Location filled in with an integer
* representing an index. */
{
char *bytes;
int length, offset;
if (objPtr->typePtr == &tclIntType) {
*indexPtr = (int)objPtr->internalRep.longValue;
return TCL_OK;
}
| > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > | > > | > > | > | > | > > > > > > > > > > > > > > > > > > > > | > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > | | > | | > | | < > | > > > > > > > > > > > > > > | | 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 |
* "objPtr" holds "end". */
int *indexPtr; /* Location filled in with an integer
* representing an index. */
{
char *bytes;
int length, offset;
/* If the object is already an integer, use it. */
if (objPtr->typePtr == &tclIntType) {
*indexPtr = (int)objPtr->internalRep.longValue;
return TCL_OK;
}
if ( SetEndOffsetFromAny( NULL, objPtr ) == TCL_OK ) {
/*
* If the object is already an offset from the end of the list, or
* can be converted to one, use it.
*/
*indexPtr = endValue + objPtr->internalRep.longValue;
} else if ( Tcl_GetIntFromObj( NULL, objPtr, &offset ) == TCL_OK ) {
/*
* If the object can be converted to an integer, use that.
*/
*indexPtr = offset;
} else {
/*
* Report a parse error.
*/
if ((Interp *)interp != NULL) {
bytes = Tcl_GetStringFromObj( objPtr, &length );
Tcl_AppendStringsToObj( Tcl_GetObjResult(interp),
"bad index \"", bytes,
"\": must be integer or end?-integer?",
(char *) NULL);
if ( !strncmp ( bytes, "end-", 3 ) ) {
bytes += 3;
}
TclCheckBadOctal(interp, bytes);
}
return TCL_ERROR;
}
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
* UpdateStringOfEndOffset --
*
* Update the string rep of a Tcl object holding an "end-offset"
* expression.
*
* Results:
* None.
*
* Side effects:
* Stores a valid string in the object's string rep.
*
* This procedure does NOT free any earlier string rep. If it is
* called on an object that already has a valid string rep, it will
* leak memory.
*
*----------------------------------------------------------------------
*/
static void
UpdateStringOfEndOffset( objPtr )
register Tcl_Obj* objPtr;
{
char buffer[ TCL_INTEGER_SPACE + sizeof("end") + 1 ];
register int len;
strcpy( buffer, "end" );
len = sizeof( "end" ) - 1;
if ( objPtr->internalRep.longValue != 0 ) {
buffer[len++] = '-';
len += TclFormatInt( buffer + len,
-( objPtr->internalRep.longValue ) );
}
objPtr->bytes = ckalloc( (unsigned) ( len + 1 ) );
strcpy( objPtr->bytes, buffer );
objPtr->length = len;
}
/*
*----------------------------------------------------------------------
*
* SetEndOffsetFromAny --
*
* Look for a string of the form "end-offset" and convert it
* to an internal representation holding the offset.
*
* Results:
* Returns TCL_OK if ok, TCL_ERROR if the string was badly formed.
*
* Side effects:
* If interp is not NULL, stores an error message in the
* interpreter result.
*
*----------------------------------------------------------------------
*/
static int
SetEndOffsetFromAny( Tcl_Interp* interp,
/* Tcl interpreter or NULL */
Tcl_Obj* objPtr )
/* Pointer to the object to parse */
{
int offset; /* Offset in the "end-offset" expression */
Tcl_ObjType* oldTypePtr = objPtr->typePtr;
/* Old internal rep type of the object */
register char* bytes; /* String rep of the object */
int length; /* Length of the object's string rep */
/* If it's already the right type, we're fine. */
if ( objPtr->typePtr == &tclEndOffsetType ) {
return TCL_OK;
}
/* Check for a string rep of the right form. */
bytes = Tcl_GetStringFromObj(objPtr, &length);
if ((*bytes != 'e') || (strncmp(bytes, "end",
(size_t)((length > 3) ? 3 : length)) != 0)) {
if ( interp != NULL ) {
Tcl_AppendStringsToObj( Tcl_GetObjResult( interp ),
"bad index \"", bytes,
"\": must be end?-integer?",
(char*) NULL );
}
return TCL_ERROR;
}
/* Convert the string rep */
if (length <= 3) {
offset = 0;
} else if (bytes[3] == '-') {
/*
* This is our limited string expression evaluator
*/
if (Tcl_GetInt(interp, bytes+3, &offset) != TCL_OK) {
return TCL_ERROR;
}
} else {
/* Conversion failed. Report the error. */
if ( interp != NULL ) {
Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),
"bad index \"", bytes,
"\": must be integer or end?-integer?",
(char *) NULL);
}
return TCL_ERROR;
}
/*
* The conversion succeeded. Free the old internal rep and set
* the new one.
*/
if ((oldTypePtr != NULL) && (oldTypePtr->freeIntRepProc != NULL)) {
oldTypePtr->freeIntRepProc(objPtr);
}
objPtr->internalRep.longValue = offset;
objPtr->typePtr = &tclEndOffsetType;
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
* TclCheckBadOctal --
*
* This procedure checks for a bad octal value and appends a
|
| ︙ | ︙ | |||
2282 2283 2284 2285 2286 2287 2288 |
*/
CONST char *
Tcl_GetNameOfExecutable()
{
return (tclExecutableName);
}
| > > > > > > > > > > > > > > > > > > > > > > > > > > | 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 |
*/
CONST char *
Tcl_GetNameOfExecutable()
{
return (tclExecutableName);
}
/*
*----------------------------------------------------------------------
*
* TclpGetTime --
*
* Deprecated synonym for Tcl_GetTime.
*
* Results:
* None.
*
* Side effects:
* Stores current time in the buffer designated by "timePtr"
*
* This procedure is provided for the benefit of extensions written
* before Tcl_GetTime was exported from the library.
*
*----------------------------------------------------------------------
*/
void
TclpGetTime( timePtr )
Tcl_Time* timePtr;
{
Tcl_GetTime( timePtr );
}
|
Changes to generic/tclVar.c.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | /* * tclVar.c -- * * This file contains routines that implement Tcl variables * (both scalars and arrays). * * The implementation of arrays is modelled after an initial * implementation by Mark Diekhans and Karl Lehenbauer. * * Copyright (c) 1987-1994 The Regents of the University of California. * Copyright (c) 1994-1997 Sun Microsystems, Inc. * Copyright (c) 1998-1999 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | > | | 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 | /* * tclVar.c -- * * This file contains routines that implement Tcl variables * (both scalars and arrays). * * The implementation of arrays is modelled after an initial * implementation by Mark Diekhans and Karl Lehenbauer. * * Copyright (c) 1987-1994 The Regents of the University of California. * Copyright (c) 1994-1997 Sun Microsystems, Inc. * Copyright (c) 1998-1999 by Scriptics Corporation. * Copyright (c) 2001 by Kevin B. Kenny. All rights reserved. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclVar.c,v 1.38.2.1 2002/02/05 02:22:00 wolfsuit Exp $ */ #include "tclInt.h" #include "tclPort.h" /* * The strings below are used to indicate what went wrong when a |
| ︙ | ︙ | |||
37 38 39 40 41 42 43 | /* * Forward references to procedures defined later in this file: */ static char * CallTraces _ANSI_ARGS_((Interp *iPtr, Var *arrayPtr, Var *varPtr, char *part1, char *part2, | | | 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | /* * Forward references to procedures defined later in this file: */ static char * CallTraces _ANSI_ARGS_((Interp *iPtr, Var *arrayPtr, Var *varPtr, char *part1, char *part2, int flags, int *resultTypePtr)); static void CleanupVar _ANSI_ARGS_((Var *varPtr, Var *arrayPtr)); static void DeleteSearches _ANSI_ARGS_((Var *arrayVarPtr)); static void DeleteArray _ANSI_ARGS_((Interp *iPtr, char *arrayName, Var *varPtr, int flags)); static int MakeUpvar _ANSI_ARGS_(( Interp *iPtr, CallFrame *framePtr, |
| ︙ | ︙ | |||
469 470 471 472 473 474 475 | * * Side effects: * None. * *---------------------------------------------------------------------- */ | | | 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 |
*
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
CONST char *
Tcl_GetVar(interp, varName, flags)
Tcl_Interp *interp; /* Command interpreter in which varName is
* to be looked up. */
char *varName; /* Name of a variable in interp. */
int flags; /* OR-ed combination of TCL_GLOBAL_ONLY,
* TCL_NAMESPACE_ONLY or TCL_LEAVE_ERR_MSG
* bits. */
|
| ︙ | ︙ | |||
504 505 506 507 508 509 510 | * * Side effects: * None. * *---------------------------------------------------------------------- */ | | | 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 |
*
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
CONST char *
Tcl_GetVar2(interp, part1, part2, flags)
Tcl_Interp *interp; /* Command interpreter in which variable is
* to be looked up. */
char *part1; /* Name of an array (if part2 is non-NULL)
* or the name of a variable. */
char *part2; /* If non-NULL, gives the name of an element
* in the array part1. */
|
| ︙ | ︙ | |||
629 630 631 632 633 634 635 636 |
/*
* Invoke any traces that have been set for the variable.
*/
if ((varPtr->tracePtr != NULL)
|| ((arrayPtr != NULL) && (arrayPtr->tracePtr != NULL))) {
msg = CallTraces(iPtr, arrayPtr, varPtr, part1, part2,
| > | > > > > > | > > > > > > | 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 |
/*
* Invoke any traces that have been set for the variable.
*/
if ((varPtr->tracePtr != NULL)
|| ((arrayPtr != NULL) && (arrayPtr->tracePtr != NULL))) {
int resultType;
msg = CallTraces(iPtr, arrayPtr, varPtr, part1, part2,
(flags & (TCL_NAMESPACE_ONLY|TCL_GLOBAL_ONLY)) | TCL_TRACE_READS,
&resultType);
if (msg != NULL) {
if (flags & TCL_LEAVE_ERR_MSG) {
if (resultType & TCL_TRACE_RESULT_OBJECT) {
VarErrMsg(interp, part1, part2, "read",
Tcl_GetString((Tcl_Obj *) msg));
} else {
VarErrMsg(interp, part1, part2, "read", msg);
}
}
if (resultType & TCL_TRACE_RESULT_DYNAMIC) {
ckfree(msg);
} else if (resultType & TCL_TRACE_RESULT_OBJECT) {
Tcl_DecrRefCount((Tcl_Obj *) msg);
}
goto errorReturn;
}
}
/*
* Return the element if it's an existing scalar variable.
|
| ︙ | ︙ | |||
753 754 755 756 757 758 759 760 |
}
/*
* Invoke any traces that have been set for the variable.
*/
if (varPtr->tracePtr != NULL) {
msg = CallTraces(iPtr, /*arrayPtr*/ NULL, varPtr, varName, NULL,
| > > | > > > > | > > > > > > | 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 |
}
/*
* Invoke any traces that have been set for the variable.
*/
if (varPtr->tracePtr != NULL) {
int resultType;
msg = CallTraces(iPtr, /*arrayPtr*/ NULL, varPtr, varName, NULL,
TCL_TRACE_READS, &resultType);
if (msg != NULL) {
if (flags & TCL_LEAVE_ERR_MSG) {
if (resultType & TCL_TRACE_RESULT_OBJECT) {
VarErrMsg(interp, varName, NULL, "read",
Tcl_GetString((Tcl_Obj *) msg));
} else {
VarErrMsg(interp, varName, NULL, "read", msg);
}
}
if (resultType & TCL_TRACE_RESULT_DYNAMIC) {
ckfree(msg);
} else if (resultType & TCL_TRACE_RESULT_OBJECT) {
Tcl_DecrRefCount((Tcl_Obj *) msg);
}
return NULL;
}
}
/*
* Make sure we're dealing with a scalar variable and not an array, and
|
| ︙ | ︙ | |||
910 911 912 913 914 915 916 917 |
/*
* Invoke any traces that have been set for the element variable.
*/
if ((varPtr->tracePtr != NULL)
|| ((arrayPtr != NULL) && (arrayPtr->tracePtr != NULL))) {
msg = CallTraces(iPtr, arrayPtr, varPtr, arrayName, elem,
| > > | > > > > | > > > > > > | 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 |
/*
* Invoke any traces that have been set for the element variable.
*/
if ((varPtr->tracePtr != NULL)
|| ((arrayPtr != NULL) && (arrayPtr->tracePtr != NULL))) {
int resultType;
msg = CallTraces(iPtr, arrayPtr, varPtr, arrayName, elem,
TCL_TRACE_READS, &resultType);
if (msg != NULL) {
if (flags & TCL_LEAVE_ERR_MSG) {
if (resultType & TCL_TRACE_RESULT_OBJECT) {
VarErrMsg(interp, arrayName, elem, "read",
Tcl_GetString((Tcl_Obj *) msg));
} else {
VarErrMsg(interp, arrayName, elem, "read", msg);
}
}
if (resultType & TCL_TRACE_RESULT_DYNAMIC) {
ckfree(msg);
} else if (resultType & TCL_TRACE_RESULT_OBJECT) {
Tcl_DecrRefCount((Tcl_Obj *)msg);
}
goto errorReturn;
}
}
/*
* Return the element if it's an existing scalar variable.
|
| ︙ | ︙ | |||
1022 1023 1024 1025 1026 1027 1028 | * If varName is defined as a local or global variable in interp, * its value is changed to newValue. If varName isn't currently * defined, then a new global variable by that name is created. * *---------------------------------------------------------------------- */ | | | | 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 |
* If varName is defined as a local or global variable in interp,
* its value is changed to newValue. If varName isn't currently
* defined, then a new global variable by that name is created.
*
*----------------------------------------------------------------------
*/
CONST char *
Tcl_SetVar(interp, varName, newValue, flags)
Tcl_Interp *interp; /* Command interpreter in which varName is
* to be looked up. */
char *varName; /* Name of a variable in interp. */
CONST char *newValue; /* New value for varName. */
int flags; /* Various flags that tell how to set value:
* any of TCL_GLOBAL_ONLY,
* TCL_NAMESPACE_ONLY, TCL_APPEND_VALUE,
* TCL_LIST_ELEMENT, TCL_LEAVE_ERR_MSG. */
{
return Tcl_SetVar2(interp, varName, (char *) NULL, newValue, flags);
}
|
| ︙ | ︙ | |||
1063 1064 1065 1066 1067 1068 1069 | * Side effects: * The value of the given variable is set. If either the array * or the entry didn't exist then a new one is created. * *---------------------------------------------------------------------- */ | | | | 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 |
* Side effects:
* The value of the given variable is set. If either the array
* or the entry didn't exist then a new one is created.
*
*----------------------------------------------------------------------
*/
CONST char *
Tcl_SetVar2(interp, part1, part2, newValue, flags)
Tcl_Interp *interp; /* Command interpreter in which variable is
* to be looked up. */
char *part1; /* If part2 is NULL, this is name of scalar
* variable. Otherwise it is the name of
* an array. */
char *part2; /* Name of an element within an array, or
* NULL. */
CONST char *newValue; /* New value for variable. */
int flags; /* Various flags that tell how to set value:
* any of TCL_GLOBAL_ONLY,
* TCL_NAMESPACE_ONLY, TCL_APPEND_VALUE,
* TCL_LIST_ELEMENT, or TCL_LEAVE_ERR_MSG */
{
register Tcl_Obj *valuePtr;
Tcl_Obj *varValuePtr;
|
| ︙ | ︙ | |||
1326 1327 1328 1329 1330 1331 1332 1333 |
/*
* Invoke any write traces for the variable.
*/
if ((varPtr->tracePtr != NULL)
|| ((arrayPtr != NULL) && (arrayPtr->tracePtr != NULL))) {
char *msg = CallTraces(iPtr, arrayPtr, varPtr, part1, part2,
| > > | > > > > > | > > > > > > | 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 |
/*
* Invoke any write traces for the variable.
*/
if ((varPtr->tracePtr != NULL)
|| ((arrayPtr != NULL) && (arrayPtr->tracePtr != NULL))) {
int resultType;
char *msg = CallTraces(iPtr, arrayPtr, varPtr, part1, part2,
(flags & (TCL_GLOBAL_ONLY|TCL_NAMESPACE_ONLY)) | TCL_TRACE_WRITES,
&resultType);
if (msg != NULL) {
if (flags & TCL_LEAVE_ERR_MSG) {
if (resultType & TCL_TRACE_RESULT_OBJECT) {
VarErrMsg(interp, part1, part2, "set",
Tcl_GetString((Tcl_Obj *) msg));
} else {
VarErrMsg(interp, part1, part2, "set", msg);
}
}
if (resultType & TCL_TRACE_RESULT_DYNAMIC) {
ckfree(msg);
} else if (resultType & TCL_TRACE_RESULT_OBJECT) {
Tcl_DecrRefCount((Tcl_Obj *)msg);
}
goto cleanup;
}
}
/*
* Return the variable's value unless the variable was changed in some
|
| ︙ | ︙ | |||
1461 1462 1463 1464 1465 1466 1467 1468 |
/*
* Invoke any read traces that have been set for the variable if we
* are appending, but only in the lappend case.
*/
if ((flags & TCL_APPEND_VALUE) && (flags & TCL_LIST_ELEMENT)
&& (varPtr->tracePtr != NULL)) {
char *msg = CallTraces(iPtr, /*arrayPtr*/ NULL, varPtr, varName, NULL,
| > > | > > > > | > > > > > > | 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 |
/*
* Invoke any read traces that have been set for the variable if we
* are appending, but only in the lappend case.
*/
if ((flags & TCL_APPEND_VALUE) && (flags & TCL_LIST_ELEMENT)
&& (varPtr->tracePtr != NULL)) {
int resultType;
char *msg = CallTraces(iPtr, /*arrayPtr*/ NULL, varPtr, varName, NULL,
TCL_TRACE_READS, &resultType);
if (msg != NULL) {
if (flags & TCL_LEAVE_ERR_MSG) {
if (resultType & TCL_TRACE_RESULT_OBJECT) {
VarErrMsg(interp, varName, NULL, "read",
Tcl_GetString((Tcl_Obj *) msg));
} else {
VarErrMsg(interp, varName, NULL, "read", msg);
}
}
if (resultType & TCL_TRACE_RESULT_DYNAMIC) {
ckfree(msg);
} else if (resultType & TCL_TRACE_RESULT_OBJECT) {
Tcl_DecrRefCount((Tcl_Obj *)msg);
}
return NULL;
}
}
/*
* If the variable is in a hashtable and its hPtr field is NULL, then we
|
| ︙ | ︙ | |||
1565 1566 1567 1568 1569 1570 1571 1572 |
TclClearVarUndefined(varPtr);
/*
* Invoke any write traces for the variable.
*/
if (varPtr->tracePtr != NULL) {
char *msg = CallTraces(iPtr, /*arrayPtr*/ NULL, varPtr,
| > > | > > > > | > > > > > > | 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 |
TclClearVarUndefined(varPtr);
/*
* Invoke any write traces for the variable.
*/
if (varPtr->tracePtr != NULL) {
int resultType;
char *msg = CallTraces(iPtr, /*arrayPtr*/ NULL, varPtr,
varName, (char *) NULL, TCL_TRACE_WRITES, &resultType);
if (msg != NULL) {
if (flags & TCL_LEAVE_ERR_MSG) {
if (resultType & TCL_TRACE_RESULT_OBJECT) {
VarErrMsg(interp, varName, NULL, "set",
Tcl_GetString((Tcl_Obj *) msg));
} else {
VarErrMsg(interp, varName, NULL, "set", msg);
}
}
if (resultType & TCL_TRACE_RESULT_DYNAMIC) {
ckfree(msg);
} else if (resultType & TCL_TRACE_RESULT_OBJECT) {
Tcl_DecrRefCount((Tcl_Obj *)msg);
}
goto cleanup;
}
}
/*
* Return the variable's value unless the variable was changed in some
|
| ︙ | ︙ | |||
1771 1772 1773 1774 1775 1776 1777 1778 |
* Invoke any read traces that have been set for the element variable if
* we are appending, but only in the lappend case.
*/
if ((flags & TCL_APPEND_VALUE) && (flags & TCL_LIST_ELEMENT)
&& ((varPtr->tracePtr != NULL)
|| ((arrayPtr != NULL) && (arrayPtr->tracePtr != NULL)))) {
char *msg = CallTraces(iPtr, arrayPtr, varPtr, arrayName, elem,
| > > | > > > > | > > > > > > | 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 |
* Invoke any read traces that have been set for the element variable if
* we are appending, but only in the lappend case.
*/
if ((flags & TCL_APPEND_VALUE) && (flags & TCL_LIST_ELEMENT)
&& ((varPtr->tracePtr != NULL)
|| ((arrayPtr != NULL) && (arrayPtr->tracePtr != NULL)))) {
int resultType;
char *msg = CallTraces(iPtr, arrayPtr, varPtr, arrayName, elem,
TCL_TRACE_READS, &resultType);
if (msg != NULL) {
if (flags & TCL_LEAVE_ERR_MSG) {
if (resultType & TCL_TRACE_RESULT_OBJECT) {
VarErrMsg(interp, arrayName, elem, "read",
Tcl_GetString((Tcl_Obj *) msg));
} else {
VarErrMsg(interp, arrayName, elem, "read", msg);
}
}
if (resultType & TCL_TRACE_RESULT_DYNAMIC) {
ckfree(msg);
} else if (resultType & TCL_TRACE_RESULT_OBJECT) {
Tcl_DecrRefCount((Tcl_Obj *) msg);
}
goto errorReturn;
}
}
/*
* Set the variable's new value and discard the old one.
|
| ︙ | ︙ | |||
1846 1847 1848 1849 1850 1851 1852 1853 |
/*
* Invoke any write traces for the element variable.
*/
if ((varPtr->tracePtr != NULL)
|| ((arrayPtr != NULL) && (arrayPtr->tracePtr != NULL))) {
char *msg = CallTraces(iPtr, arrayPtr, varPtr, arrayName, elem,
| > > | > > > > | > > > > > > | 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 |
/*
* Invoke any write traces for the element variable.
*/
if ((varPtr->tracePtr != NULL)
|| ((arrayPtr != NULL) && (arrayPtr->tracePtr != NULL))) {
int resultType;
char *msg = CallTraces(iPtr, arrayPtr, varPtr, arrayName, elem,
TCL_TRACE_WRITES, &resultType);
if (msg != NULL) {
if (flags & TCL_LEAVE_ERR_MSG) {
if (resultType & TCL_TRACE_RESULT_OBJECT) {
VarErrMsg(interp, arrayName, elem, "set",
Tcl_GetString((Tcl_Obj *) msg));
} else {
VarErrMsg(interp, arrayName, elem, "set", msg);
}
}
if (resultType & TCL_TRACE_RESULT_DYNAMIC) {
ckfree(msg);
} else if (resultType & TCL_TRACE_RESULT_OBJECT) {
Tcl_DecrRefCount((Tcl_Obj *) msg);
}
goto errorReturn;
}
}
/*
* Return the element's value unless it was changed in some gross way by
|
| ︙ | ︙ | |||
2254 2255 2256 2257 2258 2259 2260 2261 2262 |
* will use dummyVar so it won't increment varPtr's refCount itself.
* 2. Turn off the VAR_TRACE_ACTIVE flag in dummyVar: we want to
* call unset traces even if other traces are pending.
*/
if ((dummyVar.tracePtr != NULL)
|| ((arrayPtr != NULL) && (arrayPtr->tracePtr != NULL))) {
varPtr->refCount++;
dummyVar.flags &= ~VAR_TRACE_ACTIVE;
| > > > | | > > > > > > > > | | 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 |
* will use dummyVar so it won't increment varPtr's refCount itself.
* 2. Turn off the VAR_TRACE_ACTIVE flag in dummyVar: we want to
* call unset traces even if other traces are pending.
*/
if ((dummyVar.tracePtr != NULL)
|| ((arrayPtr != NULL) && (arrayPtr->tracePtr != NULL))) {
char *msg;
int resultType;
varPtr->refCount++;
dummyVar.flags &= ~VAR_TRACE_ACTIVE;
msg = CallTraces(iPtr, arrayPtr, &dummyVar, part1, part2,
(flags & (TCL_GLOBAL_ONLY|TCL_NAMESPACE_ONLY)) | TCL_TRACE_UNSETS,
&resultType);
if (msg != NULL) {
if (resultType & TCL_TRACE_RESULT_DYNAMIC) {
ckfree(msg);
} else if (resultType & TCL_TRACE_RESULT_OBJECT) {
Tcl_DecrRefCount((Tcl_Obj *) msg);
}
}
while (dummyVar.tracePtr != NULL) {
VarTrace *tracePtr = dummyVar.tracePtr;
dummyVar.tracePtr = tracePtr->nextPtr;
Tcl_EventuallyFree((ClientData) tracePtr, TCL_DYNAMIC);
}
for (activePtr = iPtr->activeTracePtr; activePtr != NULL;
activePtr = activePtr->nextPtr) {
if (activePtr->varPtr == varPtr) {
activePtr->nextTracePtr = NULL;
}
}
|
| ︙ | ︙ | |||
2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 |
flagMask = TCL_GLOBAL_ONLY | TCL_NAMESPACE_ONLY;
varPtr = TclLookupVar(interp, part1, part2,
(flags & flagMask) | TCL_LEAVE_ERR_MSG,
"trace", /*createPart1*/ 1, /*createPart2*/ 1, &arrayPtr);
if (varPtr == NULL) {
return TCL_ERROR;
}
/*
* Set up trace information.
*/
| > > > > > > > > > | | | 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 |
flagMask = TCL_GLOBAL_ONLY | TCL_NAMESPACE_ONLY;
varPtr = TclLookupVar(interp, part1, part2,
(flags & flagMask) | TCL_LEAVE_ERR_MSG,
"trace", /*createPart1*/ 1, /*createPart2*/ 1, &arrayPtr);
if (varPtr == NULL) {
return TCL_ERROR;
}
/*
* Check for a nonsense flag combination. Note that this is a
* panic() because there should be no code path that ever sets
* both flags.
*/
if ((flags&TCL_TRACE_RESULT_DYNAMIC) && (flags&TCL_TRACE_RESULT_OBJECT)) {
panic("bad result flag combination");
}
/*
* Set up trace information.
*/
flagMask = TCL_TRACE_READS | TCL_TRACE_WRITES | TCL_TRACE_UNSETS |
TCL_TRACE_ARRAY | TCL_TRACE_RESULT_DYNAMIC | TCL_TRACE_RESULT_OBJECT;
#ifndef TCL_REMOVE_OBSOLETE_TRACES
flagMask |= TCL_TRACE_OLD_STYLE;
#endif
tracePtr = (VarTrace *) ckalloc(sizeof(VarTrace));
tracePtr->traceProc = proc;
tracePtr->clientData = clientData;
tracePtr->flags = flags & flagMask;
|
| ︙ | ︙ | |||
2540 2541 2542 2543 2544 2545 2546 |
/*
* Set up a mask to mask out the parts of the flags that we are not
* interested in now.
*/
flagMask = TCL_TRACE_READS | TCL_TRACE_WRITES | TCL_TRACE_UNSETS |
| | | 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 |
/*
* Set up a mask to mask out the parts of the flags that we are not
* interested in now.
*/
flagMask = TCL_TRACE_READS | TCL_TRACE_WRITES | TCL_TRACE_UNSETS |
TCL_TRACE_ARRAY | TCL_TRACE_RESULT_DYNAMIC | TCL_TRACE_RESULT_OBJECT;
#ifndef TCL_REMOVE_OBSOLETE_TRACES
flagMask |= TCL_TRACE_OLD_STYLE;
#endif
flags &= flagMask;
for (tracePtr = varPtr->tracePtr, prevPtr = NULL; ;
prevPtr = tracePtr, tracePtr = tracePtr->nextPtr) {
if (tracePtr == NULL) {
|
| ︙ | ︙ | |||
2573 2574 2575 2576 2577 2578 2579 |
}
}
if (prevPtr == NULL) {
varPtr->tracePtr = tracePtr->nextPtr;
} else {
prevPtr->nextPtr = tracePtr->nextPtr;
}
| | | 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 |
}
}
if (prevPtr == NULL) {
varPtr->tracePtr = tracePtr->nextPtr;
} else {
prevPtr->nextPtr = tracePtr->nextPtr;
}
Tcl_EventuallyFree((ClientData) tracePtr, TCL_DYNAMIC);
/*
* If this is the last trace on the variable, and the variable is
* unset and unused, then free up the variable.
*/
if (TclIsVarUndefined(varPtr)) {
|
| ︙ | ︙ | |||
2932 2933 2934 2935 2936 2937 2938 |
if (result != TCL_OK) {
if (createdNewObj) {
Tcl_DecrRefCount(varValuePtr); /* free unneeded obj. */
}
return result;
}
}
| | | 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 |
if (result != TCL_OK) {
if (createdNewObj) {
Tcl_DecrRefCount(varValuePtr); /* free unneeded obj. */
}
return result;
}
}
listRepPtr = (List *) varValuePtr->internalRep.twoPtrValue.ptr1;
elemPtrs = listRepPtr->elements;
numElems = listRepPtr->elemCount;
/*
* If there is no room in the current array of element pointers,
* allocate a new, larger array and copy the pointers to it.
*/
|
| ︙ | ︙ | |||
3030 3031 3032 3033 3034 3035 3036 |
* The list of constants below should match the arrayOptions string array
* below.
*/
enum {ARRAY_ANYMORE, ARRAY_DONESEARCH, ARRAY_EXISTS, ARRAY_GET,
ARRAY_NAMES, ARRAY_NEXTELEMENT, ARRAY_SET, ARRAY_SIZE,
ARRAY_STARTSEARCH, ARRAY_STATISTICS, ARRAY_UNSET};
| | | 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 |
* The list of constants below should match the arrayOptions string array
* below.
*/
enum {ARRAY_ANYMORE, ARRAY_DONESEARCH, ARRAY_EXISTS, ARRAY_GET,
ARRAY_NAMES, ARRAY_NEXTELEMENT, ARRAY_SET, ARRAY_SIZE,
ARRAY_STARTSEARCH, ARRAY_STATISTICS, ARRAY_UNSET};
static CONST char *arrayOptions[] = {
"anymore", "donesearch", "exists", "get", "names", "nextelement",
"set", "size", "startsearch", "statistics", "unset", (char *) NULL
};
Interp *iPtr = (Interp *) interp;
Var *varPtr, *arrayPtr;
Tcl_HashEntry *hPtr;
|
| ︙ | ︙ | |||
3069 3070 3071 3072 3073 3074 3075 3076 3077 |
/*
* Special array trace used to keep the env array in sync for
* array names, array get, etc.
*/
if (varPtr != NULL && varPtr->tracePtr != NULL
&& (TclIsVarArray(varPtr) || TclIsVarUndefined(varPtr))) {
msg = CallTraces(iPtr, arrayPtr, varPtr, varName, NULL,
(TCL_LEAVE_ERR_MSG|TCL_NAMESPACE_ONLY|TCL_GLOBAL_ONLY|
| > > | > | > > > > > > > > | 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 |
/*
* Special array trace used to keep the env array in sync for
* array names, array get, etc.
*/
if (varPtr != NULL && varPtr->tracePtr != NULL
&& (TclIsVarArray(varPtr) || TclIsVarUndefined(varPtr))) {
int resultType;
msg = CallTraces(iPtr, arrayPtr, varPtr, varName, NULL,
(TCL_LEAVE_ERR_MSG|TCL_NAMESPACE_ONLY|TCL_GLOBAL_ONLY|
TCL_TRACE_ARRAY), &resultType);
if (msg != NULL) {
if (resultType & TCL_TRACE_RESULT_DYNAMIC) {
VarErrMsg(interp, varName, NULL, "trace array", msg);
ckfree(msg);
} else if (resultType & TCL_TRACE_RESULT_OBJECT) {
VarErrMsg(interp, varName, NULL, "trace array",
Tcl_GetString((Tcl_Obj *) msg));
Tcl_DecrRefCount((Tcl_Obj *)msg);
} else {
VarErrMsg(interp, varName, NULL, "trace array", msg);
}
return TCL_ERROR;
}
}
/*
* Verify that it is indeed an array variable. This test comes after
* the traces - the variable may actually become an array as an effect
|
| ︙ | ︙ | |||
3173 3174 3175 3176 3177 3178 3179 |
break;
}
case ARRAY_GET: {
Tcl_HashSearch search;
Var *varPtr2;
char *pattern = NULL;
char *name;
| | > > > > > > > > > | > | > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > | > | > | | > > > | | > > > > > > > > > > | | 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 |
break;
}
case ARRAY_GET: {
Tcl_HashSearch search;
Var *varPtr2;
char *pattern = NULL;
char *name;
Tcl_Obj *namePtr, *valuePtr, *nameLstPtr, *tmpResPtr, **namePtrPtr;
int i, count;
if ((objc != 3) && (objc != 4)) {
Tcl_WrongNumArgs(interp, 2, objv, "arrayName ?pattern?");
return TCL_ERROR;
}
if (notArray) {
return TCL_OK;
}
if (objc == 4) {
pattern = TclGetString(objv[3]);
}
/*
* Store the array names in a new object.
*/
nameLstPtr = Tcl_NewObj();
Tcl_IncrRefCount(nameLstPtr);
for (hPtr = Tcl_FirstHashEntry(varPtr->value.tablePtr, &search);
hPtr != NULL; hPtr = Tcl_NextHashEntry(&search)) {
varPtr2 = (Var *) Tcl_GetHashValue(hPtr);
if (TclIsVarUndefined(varPtr2)) {
continue;
}
name = Tcl_GetHashKey(varPtr->value.tablePtr, hPtr);
if ((objc == 4) && !Tcl_StringMatch(name, pattern)) {
continue; /* element name doesn't match pattern */
}
namePtr = Tcl_NewStringObj(name, -1);
result = Tcl_ListObjAppendElement(interp, nameLstPtr,
namePtr);
if (result != TCL_OK) {
Tcl_DecrRefCount(namePtr); /* free unneeded name obj */
Tcl_DecrRefCount(nameLstPtr);
return result;
}
}
/*
* Make sure the Var structure of the array is not removed by
* a trace while we're working.
*/
varPtr->refCount++;
tmpResPtr = Tcl_NewObj();
/*
* Get the array values corresponding to each element name
*/
result = Tcl_ListObjGetElements(interp, nameLstPtr, &count, &namePtrPtr);
if (result != TCL_OK) {
goto errorInArrayGet;
}
tmpResPtr = Tcl_NewObj();
for (i = 0; i < count; i++) {
namePtr = *namePtrPtr++;
valuePtr = Tcl_ObjGetVar2(interp, objv[2], namePtr,
TCL_LEAVE_ERR_MSG);
if (valuePtr == NULL) {
/*
* Some trace played a trick on us; we need to diagnose to
* adapt our behaviour: was the array element unset, or did
* the modification modify the complete array?
*/
if (TclIsVarArray(varPtr) && !TclIsVarUndefined(varPtr)) {
/*
* The array itself looks OK, the variable was undefined:
* forget it.
*/
continue;
} else {
result = TCL_ERROR;
goto errorInArrayGet;
}
}
result = Tcl_ListObjAppendElement(interp, tmpResPtr,
namePtr);
if (result != TCL_OK) {
goto errorInArrayGet;
}
result = Tcl_ListObjAppendElement(interp, tmpResPtr,
valuePtr);
if (result != TCL_OK) {
goto errorInArrayGet;
}
}
varPtr->refCount--;
Tcl_SetObjResult(interp, tmpResPtr);
Tcl_DecrRefCount(nameLstPtr);
break;
errorInArrayGet:
varPtr->refCount--;
Tcl_DecrRefCount(nameLstPtr);
Tcl_DecrRefCount(tmpResPtr); /* free unneeded temp result obj */
return result;
}
case ARRAY_NAMES: {
Tcl_HashSearch search;
Var *varPtr2;
char *pattern = NULL;
char *name;
Tcl_Obj *namePtr;
int mode, matched = 0;
static CONST char *options[] = {
"-exact", "-glob", "-regexp", (char *) NULL
};
enum options { OPT_EXACT, OPT_GLOB, OPT_REGEXP };
mode = OPT_GLOB;
if ((objc < 3) && (objc > 5)) {
|
| ︙ | ︙ | |||
3387 3388 3389 3390 3391 3392 3393 |
&searchPtr->search);
searchPtr->nextPtr = varPtr->searchPtr;
varPtr->searchPtr = searchPtr;
break;
}
case ARRAY_STATISTICS: {
| | | | 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 |
&searchPtr->search);
searchPtr->nextPtr = varPtr->searchPtr;
varPtr->searchPtr = searchPtr;
break;
}
case ARRAY_STATISTICS: {
CONST char *stats;
if (notArray) {
goto error;
}
stats = Tcl_HashStats(varPtr->value.tablePtr);
if (stats != NULL) {
Tcl_SetStringObj(Tcl_GetObjResult(interp), stats, -1);
ckfree((void *)stats);
} else {
Tcl_SetResult(interp, "error reading array statistics",
TCL_STATIC);
return TCL_ERROR;
}
break;
|
| ︙ | ︙ | |||
4006 4007 4008 4009 4010 4011 4012 |
for (tail = varName; *tail != '\0'; tail++) {
/* empty body */
}
while ((tail > varName) && ((*tail != ':') || (*(tail-1) != ':'))) {
tail--;
}
| | | 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 |
for (tail = varName; *tail != '\0'; tail++) {
/* empty body */
}
while ((tail > varName) && ((*tail != ':') || (*(tail-1) != ':'))) {
tail--;
}
if ((*tail == ':') && (tail > varName)) {
tail++;
}
/*
* Link to the variable "varName" in the global :: namespace.
*/
|
| ︙ | ︙ | |||
4290 4291 4292 4293 4294 4295 4296 | * Almost anything can happen, depending on trace; this procedure * itself doesn't have any side effects. * *---------------------------------------------------------------------- */ static char * | | > > > > > | 4478 4479 4480 4481 4482 4483 4484 4485 4486 4487 4488 4489 4490 4491 4492 4493 4494 4495 4496 4497 4498 4499 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 4510 4511 4512 4513 4514 4515 4516 4517 4518 4519 4520 4521 4522 4523 4524 4525 4526 |
* Almost anything can happen, depending on trace; this procedure
* itself doesn't have any side effects.
*
*----------------------------------------------------------------------
*/
static char *
CallTraces(iPtr, arrayPtr, varPtr, part1, part2, flags, resultTypePtr)
Interp *iPtr; /* Interpreter containing variable. */
register Var *arrayPtr; /* Pointer to array variable that contains
* the variable, or NULL if the variable
* isn't an element of an array. */
Var *varPtr; /* Variable whose traces are to be
* invoked. */
char *part1, *part2; /* Variable's two-part name. */
int flags; /* Flags passed to trace procedures:
* indicates what's happening to variable,
* plus other stuff like TCL_GLOBAL_ONLY,
* TCL_NAMESPACE_ONLY, and
* TCL_INTERP_DESTROYED. */
int *resultTypePtr; /* Report what kind of result was generated
* from the trace to this location. */
{
register VarTrace *tracePtr;
ActiveVarTrace active;
char *result, *openParen, *p;
Tcl_DString nameCopy;
int copiedName;
/*
* If there are already similar trace procedures active for the
* variable, don't call them again.
*/
if (varPtr->flags & VAR_TRACE_ACTIVE) {
return NULL;
}
varPtr->flags |= VAR_TRACE_ACTIVE;
varPtr->refCount++;
if (arrayPtr != NULL) {
arrayPtr->refCount++;
}
/*
* If the variable name hasn't been parsed into array name and
* element, do it here. If there really is an array element,
* make a copy of the original name so that NULLs can be
* inserted into it to separate the names (can't modify the name
* string in place, because the string might get used by the
|
| ︙ | ︙ | |||
4360 4361 4362 4363 4364 4365 4366 4367 |
/*
* Invoke traces on the array containing the variable, if relevant.
*/
result = NULL;
active.nextPtr = iPtr->activeTracePtr;
iPtr->activeTracePtr = &active;
if (arrayPtr != NULL && !(arrayPtr->flags & VAR_TRACE_ACTIVE)) {
| > < > > > > > > > > > > > > > > > > > > > > > | 4553 4554 4555 4556 4557 4558 4559 4560 4561 4562 4563 4564 4565 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 4600 4601 4602 4603 4604 4605 4606 4607 4608 4609 4610 4611 4612 4613 4614 4615 4616 4617 4618 4619 4620 4621 4622 4623 4624 4625 4626 4627 4628 4629 4630 4631 4632 4633 4634 4635 4636 4637 4638 4639 4640 4641 4642 4643 4644 4645 4646 4647 4648 |
/*
* Invoke traces on the array containing the variable, if relevant.
*/
result = NULL;
active.nextPtr = iPtr->activeTracePtr;
iPtr->activeTracePtr = &active;
Tcl_Preserve((ClientData) iPtr);
if (arrayPtr != NULL && !(arrayPtr->flags & VAR_TRACE_ACTIVE)) {
active.varPtr = arrayPtr;
for (tracePtr = arrayPtr->tracePtr; tracePtr != NULL;
tracePtr = active.nextTracePtr) {
active.nextTracePtr = tracePtr->nextPtr;
if (!(tracePtr->flags & flags)) {
continue;
}
Tcl_Preserve((ClientData) tracePtr);
result = (*tracePtr->traceProc)(tracePtr->clientData,
(Tcl_Interp *) iPtr, part1, part2, flags);
if (result != NULL) {
*resultTypePtr = tracePtr->flags &
(TCL_TRACE_RESULT_DYNAMIC | TCL_TRACE_RESULT_OBJECT);
if (flags & TCL_TRACE_UNSETS) {
if (tracePtr->flags & TCL_TRACE_RESULT_DYNAMIC) {
ckfree(result);
} else if (tracePtr->flags & TCL_TRACE_RESULT_OBJECT) {
Tcl_DecrRefCount((Tcl_Obj *) result);
}
result = NULL;
} else {
Tcl_Release((ClientData) tracePtr);
goto done;
}
}
Tcl_Release((ClientData) tracePtr);
}
}
/*
* Invoke traces on the variable itself.
*/
if (flags & TCL_TRACE_UNSETS) {
flags |= TCL_TRACE_DESTROYED;
}
active.varPtr = varPtr;
for (tracePtr = varPtr->tracePtr; tracePtr != NULL;
tracePtr = active.nextTracePtr) {
active.nextTracePtr = tracePtr->nextPtr;
if (!(tracePtr->flags & flags)) {
continue;
}
Tcl_Preserve((ClientData) tracePtr);
result = (*tracePtr->traceProc)(tracePtr->clientData,
(Tcl_Interp *) iPtr, part1, part2, flags);
if (result != NULL) {
*resultTypePtr = tracePtr->flags &
(TCL_TRACE_RESULT_DYNAMIC | TCL_TRACE_RESULT_OBJECT);
if (flags & TCL_TRACE_UNSETS) {
if (tracePtr->flags & TCL_TRACE_RESULT_DYNAMIC) {
ckfree(result);
} else if (tracePtr->flags & TCL_TRACE_RESULT_OBJECT) {
Tcl_DecrRefCount((Tcl_Obj *) result);
}
result = NULL;
} else {
Tcl_Release((ClientData) tracePtr);
goto done;
}
}
Tcl_Release((ClientData) tracePtr);
}
/*
* Restore the variable's flags, remove the record of our active
* traces, and then return.
*/
done:
if (arrayPtr != NULL) {
arrayPtr->refCount--;
}
if (copiedName) {
Tcl_DStringFree(&nameCopy);
}
varPtr->flags &= ~VAR_TRACE_ACTIVE;
varPtr->refCount--;
iPtr->activeTracePtr = active.nextPtr;
Tcl_Release((ClientData) iPtr);
return result;
}
/*
*----------------------------------------------------------------------
*
* NewVar --
|
| ︙ | ︙ | |||
4725 4726 4727 4728 4729 4730 4731 4732 4733 4734 |
* hash entries will be deleted automatically when the whole
* table is deleted). Note that we give CallTraces the variable's
* fully-qualified name so that any called trace procedures can
* refer to these variables being deleted.
*/
if (varPtr->tracePtr != NULL) {
objPtr = Tcl_NewObj();
Tcl_IncrRefCount(objPtr); /* until done with traces */
Tcl_GetVariableFullName(interp, (Tcl_Var) varPtr, objPtr);
| > > > | | > > > > > > > | | 4939 4940 4941 4942 4943 4944 4945 4946 4947 4948 4949 4950 4951 4952 4953 4954 4955 4956 4957 4958 4959 4960 4961 4962 4963 4964 4965 4966 4967 4968 4969 4970 4971 4972 4973 |
* hash entries will be deleted automatically when the whole
* table is deleted). Note that we give CallTraces the variable's
* fully-qualified name so that any called trace procedures can
* refer to these variables being deleted.
*/
if (varPtr->tracePtr != NULL) {
char *msg;
int resultType;
objPtr = Tcl_NewObj();
Tcl_IncrRefCount(objPtr); /* until done with traces */
Tcl_GetVariableFullName(interp, (Tcl_Var) varPtr, objPtr);
msg = CallTraces(iPtr, (Var *) NULL, varPtr,
Tcl_GetString(objPtr), (char *) NULL, flags, &resultType);
if (msg != NULL) {
if (resultType & TCL_TRACE_RESULT_DYNAMIC) {
ckfree(msg);
} else if (resultType & TCL_TRACE_RESULT_OBJECT) {
Tcl_DecrRefCount((Tcl_Obj *) msg);
}
}
Tcl_DecrRefCount(objPtr); /* free no longer needed obj */
while (varPtr->tracePtr != NULL) {
VarTrace *tracePtr = varPtr->tracePtr;
varPtr->tracePtr = tracePtr->nextPtr;
Tcl_EventuallyFree((ClientData) tracePtr, TCL_DYNAMIC);
}
for (activePtr = iPtr->activeTracePtr; activePtr != NULL;
activePtr = activePtr->nextPtr) {
if (activePtr->varPtr == varPtr) {
activePtr->nextTracePtr = NULL;
}
}
|
| ︙ | ︙ | |||
4854 4855 4856 4857 4858 4859 4860 |
/*
* Invoke traces on the variable that is being deleted. Then delete
* the variable's trace records.
*/
if (varPtr->tracePtr != NULL) {
| > > > | | > > > > > > > | | 5078 5079 5080 5081 5082 5083 5084 5085 5086 5087 5088 5089 5090 5091 5092 5093 5094 5095 5096 5097 5098 5099 5100 5101 5102 5103 5104 5105 5106 5107 |
/*
* Invoke traces on the variable that is being deleted. Then delete
* the variable's trace records.
*/
if (varPtr->tracePtr != NULL) {
char *msg;
int resultType;
msg = CallTraces(iPtr, (Var *) NULL, varPtr,
varPtr->name, (char *) NULL, flags, &resultType);
if (msg != NULL) {
if (resultType & TCL_TRACE_RESULT_DYNAMIC) {
ckfree(msg);
} else if (resultType & TCL_TRACE_RESULT_OBJECT) {
Tcl_DecrRefCount((Tcl_Obj *) msg);
}
}
while (varPtr->tracePtr != NULL) {
VarTrace *tracePtr = varPtr->tracePtr;
varPtr->tracePtr = tracePtr->nextPtr;
Tcl_EventuallyFree((ClientData) tracePtr, TCL_DYNAMIC);
}
for (activePtr = iPtr->activeTracePtr; activePtr != NULL;
activePtr = activePtr->nextPtr) {
if (activePtr->varPtr == varPtr) {
activePtr->nextTracePtr = NULL;
}
}
|
| ︙ | ︙ | |||
4941 4942 4943 4944 4945 4946 4947 4948 |
if (TclIsVarScalar(elPtr) && (elPtr->value.objPtr != NULL)) {
objPtr = elPtr->value.objPtr;
TclDecrRefCount(objPtr);
elPtr->value.objPtr = NULL;
}
elPtr->hPtr = NULL;
if (elPtr->tracePtr != NULL) {
elPtr->flags &= ~VAR_TRACE_ACTIVE;
| > > > | | > > > > > > > > | | 5175 5176 5177 5178 5179 5180 5181 5182 5183 5184 5185 5186 5187 5188 5189 5190 5191 5192 5193 5194 5195 5196 5197 5198 5199 5200 5201 5202 5203 5204 5205 5206 |
if (TclIsVarScalar(elPtr) && (elPtr->value.objPtr != NULL)) {
objPtr = elPtr->value.objPtr;
TclDecrRefCount(objPtr);
elPtr->value.objPtr = NULL;
}
elPtr->hPtr = NULL;
if (elPtr->tracePtr != NULL) {
char *msg;
int resultType;
elPtr->flags &= ~VAR_TRACE_ACTIVE;
msg = CallTraces(iPtr, (Var *) NULL, elPtr, arrayName,
Tcl_GetHashKey(varPtr->value.tablePtr, hPtr), flags,
&resultType);
if (msg != NULL) {
if (resultType & TCL_TRACE_RESULT_DYNAMIC) {
ckfree(msg);
} else if (resultType & TCL_TRACE_RESULT_OBJECT) {
Tcl_DecrRefCount((Tcl_Obj *) msg);
}
}
while (elPtr->tracePtr != NULL) {
VarTrace *tracePtr = elPtr->tracePtr;
elPtr->tracePtr = tracePtr->nextPtr;
Tcl_EventuallyFree((ClientData) tracePtr,TCL_DYNAMIC);
}
for (activePtr = iPtr->activeTracePtr; activePtr != NULL;
activePtr = activePtr->nextPtr) {
if (activePtr->varPtr == elPtr) {
activePtr->nextTracePtr = NULL;
}
}
|
| ︙ | ︙ | |||
5097 5098 5099 5100 5101 5102 5103 |
if (varPtr == NULL) {
return NULL;
}
if ((varPtr->tracePtr != NULL)
|| ((arrayPtr != NULL) && (arrayPtr->tracePtr != NULL))) {
| > > > | | > > > > > > > | 5342 5343 5344 5345 5346 5347 5348 5349 5350 5351 5352 5353 5354 5355 5356 5357 5358 5359 5360 5361 5362 5363 5364 5365 5366 5367 |
if (varPtr == NULL) {
return NULL;
}
if ((varPtr->tracePtr != NULL)
|| ((arrayPtr != NULL) && (arrayPtr->tracePtr != NULL))) {
char *msg;
int resultType;
msg = CallTraces((Interp *)interp, arrayPtr, varPtr, varName,
(char *) NULL, TCL_TRACE_READS, &resultType);
if (msg != NULL) {
if (resultType & TCL_TRACE_RESULT_DYNAMIC) {
ckfree(msg);
} else if (resultType & TCL_TRACE_RESULT_OBJECT) {
Tcl_DecrRefCount((Tcl_Obj *) msg);
}
}
}
/*
* If the variable doesn't exist anymore and no-one's using
* it, then free up the relevant structures and hash table entries.
*/
|
| ︙ | ︙ |
Changes to library/http/http.tcl.
1 2 3 4 5 6 7 8 9 10 11 | # http.tcl -- # # Client-side HTTP for GET, POST, and HEAD commands. # These routines can be used in untrusted code that uses # the Safesock security policy. These procedures use a # callback interface to avoid using vwait, which is not # defined in the safe base. # # See the file "license.terms" for information on usage and # redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES. # | | | | 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 34 |
# http.tcl --
#
# Client-side HTTP for GET, POST, and HEAD commands.
# These routines can be used in untrusted code that uses
# the Safesock security policy. These procedures use a
# callback interface to avoid using vwait, which is not
# defined in the safe base.
#
# See the file "license.terms" for information on usage and
# redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: http.tcl,v 1.39.8.1 2002/02/05 02:22:01 wolfsuit Exp $
# Rough version history:
# 1.0 Old http_get interface
# 2.0 http:: namespace and http::geturl
# 2.1 Added callbacks to handle arriving data, and timeouts
# 2.2 Added ability to fetch into a channel
# 2.3 Added SSL support, and ability to post from a channel
# This version also cleans up error cases and eliminates the
# "ioerror" status in favor of raising an error
# 2.4 Added -binary option to http::geturl and charset element
# to the state array.
package require Tcl 8.2
# keep this in sync with pkgIndex.tcl
package provide http 2.4.1
namespace eval http {
variable http
array set http {
-accept */*
-proxyhost {}
-proxyport {}
|
| ︙ | ︙ | |||
400 401 402 403 404 405 406 |
fconfigure $state(-querychannel) -blocking 1 -translation binary
set contDone 0
}
if {[catch {
puts $s "$how $srvurl HTTP/1.0"
puts $s "Accept: $http(-accept)"
| > > > > > | > | 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 |
fconfigure $state(-querychannel) -blocking 1 -translation binary
set contDone 0
}
if {[catch {
puts $s "$how $srvurl HTTP/1.0"
puts $s "Accept: $http(-accept)"
if {$port == $defport} {
# Don't add port in this case, to handle broken servers.
# [Bug #504508]
puts $s "Host: $host"
} else {
puts $s "Host: $host:$port"
}
puts $s "User-Agent: $http(-useragent)"
foreach {key value} $state(-headers) {
regsub -all \[\n\r\] $value {} value
set key [string trim $key]
if {[string equal $key "Content-Length"]} {
set contDone 1
set state(querylength) $value
|
| ︙ | ︙ |
Changes to library/http/pkgIndex.tcl.
1 2 3 4 5 6 7 8 9 10 11 |
# Tcl package index file, version 1.1
# This file is generated by the "pkg_mkIndex" command
# and sourced either when an application starts up or
# by a "package unknown" script. It invokes the
# "package ifneeded" command to set up package-related
# information so that packages will be loaded automatically
# in response to "package require" commands. When this
# script is sourced, the variable $dir must contain the
# full path name of this file's directory.
if {![package vsatisfies [package provide Tcl] 8.2]} {return}
| | | 1 2 3 4 5 6 7 8 9 10 11 12 |
# Tcl package index file, version 1.1
# This file is generated by the "pkg_mkIndex" command
# and sourced either when an application starts up or
# by a "package unknown" script. It invokes the
# "package ifneeded" command to set up package-related
# information so that packages will be loaded automatically
# in response to "package require" commands. When this
# script is sourced, the variable $dir must contain the
# full path name of this file's directory.
if {![package vsatisfies [package provide Tcl] 8.2]} {return}
package ifneeded http 2.4.1 [list tclPkgSetup $dir http 2.4.1 {{http.tcl source {::http::config ::http::formatQuery ::http::geturl ::http::reset ::http::wait ::http::register ::http::unregister}}}]
|
Changes to library/init.tcl.
1 2 3 4 5 | # init.tcl -- # # Default system startup file for Tcl-based applications. Defines # "unknown" procedure and auto-load facilities. # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | # init.tcl -- # # Default system startup file for Tcl-based applications. Defines # "unknown" procedure and auto-load facilities. # # RCS: @(#) $Id: init.tcl,v 1.49.8.1 2002/02/05 02:22:01 wolfsuit Exp $ # # Copyright (c) 1991-1993 The Regents of the University of California. # Copyright (c) 1994-1996 Sun Microsystems, Inc. # Copyright (c) 1998-1999 Scriptics Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. |
| ︙ | ︙ | |||
548 549 550 551 552 553 554 |
# Add an initial ; to have the {} extension check first.
set execExtensions [split ";$env(PATHEXT)" ";"]
} else {
set execExtensions [list {} .com .exe .bat]
}
if {[lsearch -exact $shellBuiltins $name] != -1} {
| > > > > > > > | | 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 |
# Add an initial ; to have the {} extension check first.
set execExtensions [split ";$env(PATHEXT)" ";"]
} else {
set execExtensions [list {} .com .exe .bat]
}
if {[lsearch -exact $shellBuiltins $name] != -1} {
# When this is command.com for some reason on Win2K, Tcl won't
# exec it unless the case is right, which this corrects. COMSPEC
# may not point to a real file, so do the check.
set cmd $env(COMSPEC)
if {[file exists $cmd]} {
set cmd [file attributes $cmd -shortname]
}
return [set auto_execs($name) [list $cmd /c $name]]
}
if {[llength [file split $name]] != 1} {
foreach ext $execExtensions {
set file ${name}${ext}
if {[file exists $file] && ![file isdirectory $file]} {
return [set auto_execs($name) [list $file]]
|
| ︙ | ︙ | |||
643 644 645 646 647 648 649 |
# action - "renaming" or "copying"
# src - source directory
# dest - destination directory
proc ::tcl::CopyDirectory {action src dest} {
set nsrc [file normalize $src]
set ndest [file normalize $dest]
if {[string equal $action "renaming"]} {
| | > | 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 |
# action - "renaming" or "copying"
# src - source directory
# dest - destination directory
proc ::tcl::CopyDirectory {action src dest} {
set nsrc [file normalize $src]
set ndest [file normalize $dest]
if {[string equal $action "renaming"]} {
# Can't rename volumes. We could give a more precise
# error message here, but that would break the test suite.
if {[lsearch -exact [file volumes] $nsrc] != -1} {
return -code error "error $action \"$src\" to\
\"$dest\": trying to rename a volume or move a directory\
into itself"
}
}
if {[file exists $dest]} {
|
| ︙ | ︙ | |||
686 687 688 689 690 691 692 |
return -code error "error $action \"$src\" to\
\"$dest\": trying to rename a volume or move a directory\
into itself"
}
}
file mkdir $dest
}
| | > > > > > > | < < | < < < | | 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 |
return -code error "error $action \"$src\" to\
\"$dest\": trying to rename a volume or move a directory\
into itself"
}
}
file mkdir $dest
}
# Have to be careful to capture both visible and hidden files.
# We will also be more generous to the file system and not
# assume the hidden and non-hidden lists are non-overlapping.
#
# On Unix 'hidden' files begin with '.'. On other platforms
# or filesystems hidden files may have other interpretations.
set filelist [concat [glob -nocomplain -directory $src *] \
[glob -nocomplain -directory $src -types hidden *]]
foreach s [lsort -unique $filelist] {
if {([file tail $s] != ".") && ([file tail $s] != "..")} {
file copy $s [file join $dest [file tail $s]]
}
}
return
}
|
Changes to mac/MW_TclAppleScriptHeader.pch.
| ︙ | ︙ | |||
8 9 10 11 12 13 14 | * compiler flags. See MetroWerks documention for more details. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | < < < < < < < < < < < | 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 34 35 36 | * compiler flags. See MetroWerks documention for more details. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: MW_TclAppleScriptHeader.pch,v 1.4.28.1 2002/02/05 02:22:01 wolfsuit Exp $ */ /* * To use the compilied header you need to set the "Prefix file" in * the "C/C++ Language" preference panel to point to the created * compilied header. The name of the header depends on the * architecture we are compiling for (see the code below). For * example, for a 68k app the prefix file should be: MW_TclHeader68K. */ #if __POWERPC__ #pragma precompile_target "MW_TclAppleScriptHeaderPPC" #elif __CFM68K__ #pragma precompile_target "MW_TclAppleScriptHeaderCFM68K" #else #pragma precompile_target "MW_TclAppleScriptHeader68K" #endif #include "tclMacCommonPch.h" #define USE_TCL_STUBS |
Added mac/MW_TclBuildLibHeader.h.
> > > > > > > | 1 2 3 4 5 6 7 | #if __POWERPC__ #include "MW_TclBuildLibHeaderPPC" #elif __CFM68K__ #include "MW_TclBuildLibHeaderCFM68K" #else #include "MW_TclBuildLibHeader68K" #endif |
Added mac/MW_TclBuildLibHeader.pch.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 34 35 | /* * MW_TclBuildLibHeader.pch -- * * This file is the source for a pre-compilied header that gets used * for all files in the Tcl projects. This make compilies go a bit * faster. This file is only intended to be used in the MetroWerks * CodeWarrior environment. It essentially acts as a place to set * compiler flags. See MetroWerks documention for more details. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id$ */ /* * To use the compilied header you need to set the "Prefix file" in * the "C/C++ Language" preference panel to point to the created * compilied header. The name of the header depends on the * architecture we are compiling for (see the code below). For * example, for a 68k app the prefix file should be: MW_TclHeader68K. */ #if __POWERPC__ #pragma precompile_target "MW_TclBuildLibHeaderPPC" #elif __CFM68K__ #pragma precompile_target "MW_TclBuildLibHeaderCFM68K" #else #pragma precompile_target "MW_TclBuildLibHeader68K" #endif #define BUILD_tcl 1 #include "MW_TclHeaderCommon.h" |
Changes to mac/MW_TclHeader.pch.
| ︙ | ︙ | |||
8 9 10 11 12 13 14 | * compiler flags. See MetroWerks documention for more details. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | < < < < < < < < < | < < < < < < < | 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 | * compiler flags. See MetroWerks documention for more details. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: MW_TclHeader.pch,v 1.7.28.1 2002/02/05 02:22:01 wolfsuit Exp $ */ /* * To use the compilied header you need to set the "Prefix file" in * the "C/C++ Language" preference panel to point to the created * compilied header. The name of the header depends on the * architecture we are compiling for (see the code below). For * example, for a 68k app the prefix file should be: MW_TclHeader68K. */ #if __POWERPC__ #pragma precompile_target "MW_TclHeaderPPC" #elif __CFM68K__ #pragma precompile_target "MW_TclHeaderCFM68K" #else #pragma precompile_target "MW_TclHeader68K" #endif #include "MW_TclHeaderCommon.h" |
Added mac/MW_TclHeaderCommon.h.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | /* * MW_TclHeaderCommon.h -- * * Common includes for precompiled headers * * Copyright (c) 1998 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id$ */ #pragma once #include "tclMacCommonPch.h" /* * Place any includes below that will are needed by the majority of the * and is OK to be in any file in the system. */ #include "tcl.h" #ifdef BUILD_tcl # undef TCL_STORAGE_CLASS # define TCL_STORAGE_CLASS DLLEXPORT #endif #include "tclMac.h" #undef TCL_STORAGE_CLASS #define TCL_STORAGE_CLASS DLLIMPORT #include "tclInt.h" #if PRAGMA_IMPORT #pragma import on #endif #include <MoreFiles.h> #include <MoreFilesExtras.h> #include <FSpCompat.h> #include <FileCopy.h> #include <FullPath.h> #include <IterateDirectory.h> #include <MoreDesktopMgr.h> #include <DirectoryCopy.h> #include <Search.h> #ifdef PRAGMA_IMPORT_OFF #pragma import off #elif PRAGMA_IMPORT #pragma import reset #endif |
Added mac/MW_TclStaticHeader.h.
> > > > > > > | 1 2 3 4 5 6 7 | #if __POWERPC__ #include "MW_TclStaticHeaderPPC" #elif __CFM68K__ #include "MW_TclStaticHeaderCFM68K" #else #include "MW_TclStaticHeader68K" #endif |
Added mac/MW_TclStaticHeader.pch.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 34 35 | /* * MW_TclStaticHeader.pch -- * * This file is the source for a pre-compilied header that gets used * for all files in the Tcl projects. This make compilies go a bit * faster. This file is only intended to be used in the MetroWerks * CodeWarrior environment. It essentially acts as a place to set * compiler flags. See MetroWerks documention for more details. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id$ */ /* * To use the compilied header you need to set the "Prefix file" in * the "C/C++ Language" preference panel to point to the created * compilied header. The name of the header depends on the * architecture we are compiling for (see the code below). For * example, for a 68k app the prefix file should be: MW_TclHeader68K. */ #if __POWERPC__ #pragma precompile_target "MW_TclStaticHeaderPPC" #elif __CFM68K__ #pragma precompile_target "MW_TclStaticHeaderCFM68K" #else #pragma precompile_target "MW_TclStaticHeader68K" #endif #define STATIC_BUILD 1 #include "MW_TclHeaderCommon.h" |
Changes to mac/MW_TclTestHeader.pch.
1 | /* | | | | | < | < < < < < < | < < < < < | | 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 34 35 36 37 38 39 40 41 | /* * MW_TclTestHeader.pch -- * * This file is the source for a pre-compilied header that gets used * for all files in the Tcl projects. This make compilies go a bit * faster. This file is only intended to be used in the MetroWerks * CodeWarrior environment. It essentially acts as a place to set * compiler flags. See MetroWerks documention for more details. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: MW_TclTestHeader.pch,v 1.1.18.1 2002/02/05 02:22:01 wolfsuit Exp $ */ /* * To use the compilied header you need to set the "Prefix file" in * the "C/C++ Language" preference panel to point to the created * compilied header. The name of the header depends on the * architecture we are compiling for (see the code below). For * example, for a 68k app the prefix file should be: MW_TclHeader68K. */ #if __POWERPC__ #pragma precompile_target "MW_TclTestHeaderPPC" #elif __CFM68K__ #pragma precompile_target "MW_TclTestHeaderCFM68K" #else #pragma precompile_target "MW_TclTestHeader68K" #endif #define BUILD_tcl 1 #define STATIC_BUILD 1 #define TCL_DEBUG 1 #define TCL_THREADS 1 #include "MW_TclHeaderCommon.h" |
Changes to mac/tclMac.h.
1 2 3 4 5 6 7 8 9 10 | /* * tclMac.h -- * * Declarations of Macintosh specific public variables and procedures. * * Copyright (c) 1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | < < < < < < < < < < | 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 | /* * tclMac.h -- * * Declarations of Macintosh specific public variables and procedures. * * Copyright (c) 1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclMac.h,v 1.4.30.1 2002/02/05 02:22:01 wolfsuit Exp $ */ #ifndef _TCLMAC #define _TCLMAC #ifndef _TCL # include "tcl.h" #endif #include <Types.h> #include <Files.h> #include <Events.h> typedef int (*Tcl_MacConvertEventPtr) _ANSI_ARGS_((EventRecord *eventPtr)); #include "tclPlatDecls.h" #endif /* _TCLMAC */ |
Changes to mac/tclMacAlloc.c.
| ︙ | ︙ | |||
10 11 12 13 14 15 16 | * Copyright (c) 1996-1997 Sun Microsystems, Inc. * * Portions contributed by Chris Kingsley, Jack Jansen and Ray Johnson *. * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | > > | > > > > > > > > > > | | | 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
* Copyright (c) 1996-1997 Sun Microsystems, Inc.
*
* Portions contributed by Chris Kingsley, Jack Jansen and Ray Johnson
*.
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
* RCS: @(#) $Id: tclMacAlloc.c,v 1.4.28.1 2002/02/05 02:22:01 wolfsuit Exp $
*/
#include "tclInt.h"
#include "tclMacInt.h"
#include <Memory.h>
#include <Gestalt.h>
#include <stdlib.h>
#include <string.h>
/*
* Flags that are used by ConfigureMemory to define how the allocator
* should work. They can be or'd together.
*/
#define MEMORY_ALL_SYS 1 /* All memory should come from the system
heap. */
#define MEMORY_DONT_USE_TEMPMEM 2 /* Don't use temporary memory but system memory. */
/*
* Amount of space to leave in the application heap for the Toolbox to work.
*/
#define TOOLBOX_SPACE (512 * 1024)
static int memoryFlags = 0;
static Handle toolGuardHandle = NULL;
/* This handle must be around so that we don't
* have NewGWorld failures. This handle is
* purgeable. Before we allocate any blocks,
* we see if this handle is still around.
* If it is not, then we try to get it again.
* If we can get it, we lock it and try
* to do the normal allocation, unlocking on
* the way out. If we can't, we go to the
* system heap directly. */
static int tclUseMemTracking = 0; /* Are we tracking memory allocations?
* On recent versions of the MacOS this
* is no longer necessary, as we can use
* temporary memory which is freed by the
* OS after a quit or crash. */
static size_t tclExtraHdlSize = 0; /* Size of extra memory allocated at the start
* of each block when using memory tracking
* ( == 0 otherwise) */
/*
* The following typedef and variable are used to keep track of memory
* blocks that are allocated directly from the System Heap. These chunks
* of memory must always be freed - even if we crash.
*/
typedef struct listEl {
Handle memoryHandle;
struct listEl * next;
struct listEl * prec;
} ListEl;
static ListEl * systemMemory = NULL;
static ListEl * appMemory = NULL;
/*
* Prototypes for functions used only in this file.
*/
static pascal void CleanUpExitProc _ANSI_ARGS_((void));
void ConfigureMemory _ANSI_ARGS_((int flags));
|
| ︙ | ︙ | |||
95 96 97 98 99 100 101 102 |
TclpSysRealloc(
VOID *oldPtr, /* Original block */
unsigned int size) /* New size of block. */
{
Handle hand;
void *newPtr;
int maxsize;
| > > | > > > > > > > > > > > | > > | 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 |
TclpSysRealloc(
VOID *oldPtr, /* Original block */
unsigned int size) /* New size of block. */
{
Handle hand;
void *newPtr;
int maxsize;
OSErr err;
if (tclUseMemTracking) {
hand = ((ListEl *) ((Ptr) oldPtr - tclExtraHdlSize))->memoryHandle;
} else {
hand = RecoverHandle((Ptr) oldPtr);
}
maxsize = GetHandleSize(hand) - sizeof(Handle);
if (maxsize < size) {
HUnlock(hand);
SetHandleSize(hand,size + tclExtraHdlSize);
err = MemError();
HLock(hand);
if(err==noErr){
newPtr=(*hand + tclExtraHdlSize);
} else {
newPtr = TclpSysAlloc(size, 1);
if(newPtr!=NULL) {
memmove(newPtr, oldPtr, maxsize);
TclpSysFree(oldPtr);
}
}
} else {
newPtr = oldPtr;
}
return newPtr;
}
/*
|
| ︙ | ︙ | |||
132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
VOID *
TclpSysAlloc(
long size, /* Size of block to allocate. */
int isBin) /* Is this a bin allocation? */
{
Handle hand = NULL;
ListEl * newMemoryRecord;
if (!(memoryFlags & MEMORY_ALL_SYS)) {
/*
* If the guard handle has been purged, throw it away and try
* to allocate it again.
*/
| > > > > > > > > > > > > > > > > > > > > > > > > > | 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 |
VOID *
TclpSysAlloc(
long size, /* Size of block to allocate. */
int isBin) /* Is this a bin allocation? */
{
Handle hand = NULL;
ListEl * newMemoryRecord;
int isSysMem = 0;
static int initialized=0;
if (!initialized) {
long response = 0;
OSErr err = noErr;
int useTempMem = 0;
/* Check if we can use temporary memory */
initialized=1;
err = Gestalt(gestaltOSAttr, &response);
if (err == noErr) {
useTempMem = response & (1 << gestaltRealTempMemory);
}
tclUseMemTracking = !useTempMem || (memoryFlags & MEMORY_DONT_USE_TEMPMEM);
if(tclUseMemTracking) {
tclExtraHdlSize = sizeof(ListEl);
/*
* We are allocating memory directly from the system
* heap. We need to install an exit handle
* to ensure the memory is cleaned up.
*/
TclMacInstallExitToShellPatch(CleanUpExitProc);
}
}
if (!(memoryFlags & MEMORY_ALL_SYS)) {
/*
* If the guard handle has been purged, throw it away and try
* to allocate it again.
*/
|
| ︙ | ︙ | |||
153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 |
* If we have never allocated the guard handle, or it was purged
* and thrown away, then try to allocate it again.
*/
if (toolGuardHandle == NULL) {
toolGuardHandle = NewHandle(TOOLBOX_SPACE);
if (toolGuardHandle != NULL) {
HPurge(toolGuardHandle);
}
}
/*
* If we got the handle, lock it and do our allocation.
*/
if (toolGuardHandle != NULL) {
HLock(toolGuardHandle);
| > | < < | < < < < < < < > > > > > > > > > | > > < < < < < < < < < < < < < < < < < > > > | > > > > > > > | > > > > > | | 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 |
* If we have never allocated the guard handle, or it was purged
* and thrown away, then try to allocate it again.
*/
if (toolGuardHandle == NULL) {
toolGuardHandle = NewHandle(TOOLBOX_SPACE);
if (toolGuardHandle != NULL) {
HLock(toolGuardHandle);
HPurge(toolGuardHandle);
}
}
/*
* If we got the handle, lock it and do our allocation.
*/
if (toolGuardHandle != NULL) {
HLock(toolGuardHandle);
hand = NewHandle(size + tclExtraHdlSize);
HUnlock(toolGuardHandle);
}
}
if (hand == NULL) {
/*
* Ran out of memory in application space. Lets try to get
* more memory from system. Otherwise, we return NULL to
* denote failure.
*/
if(!tclUseMemTracking) {
/* Use Temporary Memory instead of System Heap when available */
OSErr err;
isBin = 1; /* always HLockHi TempMemHandles */
hand = TempNewHandle(size + tclExtraHdlSize,&err);
if(err!=noErr) { hand=NULL; }
} else {
/* Use system heap when tracking memory */
isSysMem=1;
isBin = 0;
hand = NewHandleSys(size + tclExtraHdlSize);
}
}
if (hand == NULL) {
return NULL;
}
if (isBin) {
HLockHi(hand);
} else {
HLock(hand);
}
if(tclUseMemTracking) {
/* Only need to do this when tracking memory */
newMemoryRecord = (ListEl *) *hand;
newMemoryRecord->memoryHandle = hand;
newMemoryRecord->prec = NULL;
if(isSysMem) {
newMemoryRecord->next = systemMemory;
systemMemory = newMemoryRecord;
} else {
newMemoryRecord->next = appMemory;
appMemory = newMemoryRecord;
}
if(newMemoryRecord->next!=NULL) {
newMemoryRecord->next->prec=newMemoryRecord;
}
}
return (*hand + tclExtraHdlSize);
}
/*
*----------------------------------------------------------------------
*
* TclpSysFree --
*
|
| ︙ | ︙ | |||
234 235 236 237 238 239 240 |
*----------------------------------------------------------------------
*/
void
TclpSysFree(
void * ptr) /* Free this system memory. */
{
| | > > | > > > > | > > > > > > > > | > | < < > | 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 |
*----------------------------------------------------------------------
*/
void
TclpSysFree(
void * ptr) /* Free this system memory. */
{
if(tclUseMemTracking) {
/* Only need to do this when tracking memory */
ListEl *memRecord;
memRecord = (ListEl *) ((Ptr) ptr - tclExtraHdlSize);
/* Remove current record from linked list */
if(memRecord->next!=NULL) {
memRecord->next->prec=memRecord->prec;
}
if(memRecord->prec!=NULL) {
memRecord->prec->next=memRecord->next;
}
if(memRecord==appMemory) {
appMemory=memRecord->next;
} else if(memRecord==systemMemory) {
systemMemory=memRecord->next;
}
DisposeHandle(memRecord->memoryHandle);
} else {
DisposeHandle(RecoverHandle((Ptr) ptr));
}
}
/*
*----------------------------------------------------------------------
*
* CleanUpExitProc --
*
|
| ︙ | ︙ | |||
267 268 269 270 271 272 273 274 275 276 |
*/
static pascal void
CleanUpExitProc()
{
ListEl * memRecord;
while (systemMemory != NULL) {
memRecord = systemMemory;
systemMemory = memRecord->next;
| > > < | | < | 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 |
*/
static pascal void
CleanUpExitProc()
{
ListEl * memRecord;
if(tclUseMemTracking) {
/* Only need to do this when tracking memory */
while (systemMemory != NULL) {
memRecord = systemMemory;
systemMemory = memRecord->next;
DisposeHandle(memRecord->memoryHandle);
}
}
}
/*
*----------------------------------------------------------------------
*
* FreeAllMemory --
|
| ︙ | ︙ | |||
300 301 302 303 304 305 306 307 308 309 |
*/
void
FreeAllMemory()
{
ListEl * memRecord;
while (systemMemory != NULL) {
memRecord = systemMemory;
systemMemory = memRecord->next;
| > > < | < < < | | < | 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 |
*/
void
FreeAllMemory()
{
ListEl * memRecord;
if(tclUseMemTracking) {
/* Only need to do this when tracking memory */
while (systemMemory != NULL) {
memRecord = systemMemory;
systemMemory = memRecord->next;
DisposeHandle(memRecord->memoryHandle);
}
while (appMemory != NULL) {
memRecord = appMemory;
appMemory = memRecord->next;
DisposeHandle(memRecord->memoryHandle);
}
}
}
/*
*----------------------------------------------------------------------
*
* ConfigureMemory --
|
| ︙ | ︙ |
Changes to mac/tclMacAppInit.c.
1 2 3 4 5 6 7 8 9 10 11 | /* * tclMacAppInit.c -- * * Provides a version of the Tcl_AppInit procedure for the example shell. * * Copyright (c) 1993-1994 Lockheed Missle & Space Company, AI Center * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | | 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 | /* * tclMacAppInit.c -- * * Provides a version of the Tcl_AppInit procedure for the example shell. * * Copyright (c) 1993-1994 Lockheed Missle & Space Company, AI Center * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclMacAppInit.c,v 1.8.8.1 2002/02/05 02:22:02 wolfsuit Exp $ */ #include "tcl.h" #include "tclInt.h" #include "tclPort.h" #include "tclMac.h" #include "tclMacInt.h" #if defined(THINK_C) # include <console.h> #elif defined(__MWERKS__) # include <SIOUX.h> EXTERN short InstallConsole _ANSI_ARGS_((short fd)); #endif #ifdef TCL_TEST extern int Procbodytest_Init _ANSI_ARGS_((Tcl_Interp *interp)); extern int Procbodytest_SafeInit _ANSI_ARGS_((Tcl_Interp *interp)); extern int TclObjTest_Init _ANSI_ARGS_((Tcl_Interp *interp)); extern int Tcltest_Init _ANSI_ARGS_((Tcl_Interp *interp)); |
| ︙ | ︙ | |||
185 186 187 188 189 190 191 192 193 194 195 196 197 198 |
#elif defined(__MWERKS__)
/* Set options for CodeWarrior SIOUX package */
SIOUXSettings.autocloseonquit = true;
SIOUXSettings.showstatusline = true;
SIOUXSettings.asktosaveonclose = false;
InstallConsole(0);
SIOUXSetTitle("\pTcl Interpreter");
#elif defined(applec)
/* Init packages used by MPW SIOW package */
InitGraf((Ptr)&qd.thePort);
| > | 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 |
#elif defined(__MWERKS__)
/* Set options for CodeWarrior SIOUX package */
SIOUXSettings.autocloseonquit = true;
SIOUXSettings.showstatusline = true;
SIOUXSettings.asktosaveonclose = false;
SIOUXSettings.wasteusetempmemory = true;
InstallConsole(0);
SIOUXSetTitle("\pTcl Interpreter");
#elif defined(applec)
/* Init packages used by MPW SIOW package */
InitGraf((Ptr)&qd.thePort);
|
| ︙ | ︙ |
Changes to mac/tclMacApplication.r.
1 2 3 4 5 6 7 8 9 10 11 12 | /* * tclMacApplication.r -- * * This file creates resources for use Tcl Shell application. * It should be viewed as an example of how to create a new * Tcl application using the shared Tcl libraries. * * Copyright (c) 1996-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /* * tclMacApplication.r -- * * This file creates resources for use Tcl Shell application. * It should be viewed as an example of how to create a new * Tcl application using the shared Tcl libraries. * * Copyright (c) 1996-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclMacApplication.r,v 1.3.18.1 2002/02/05 02:22:02 wolfsuit Exp $ */ #include <Types.r> #include <SysTypes.r> /* * The folowing include and defines help construct |
| ︙ | ︙ | |||
30 31 32 33 34 35 36 37 38 39 40 41 42 |
# define RELEASE_LEVEL beta
#elif (TCL_RELEASE_LEVEL == 2)
# define RELEASE_LEVEL final
#endif
#if (TCL_RELEASE_LEVEL == 2)
# define MINOR_VERSION (TCL_MINOR_VERSION * 16) + TCL_RELEASE_SERIAL
#else
# define MINOR_VERSION TCL_MINOR_VERSION * 16
#endif
resource 'vers' (1) {
TCL_MAJOR_VERSION, MINOR_VERSION,
| > > | | | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
# define RELEASE_LEVEL beta
#elif (TCL_RELEASE_LEVEL == 2)
# define RELEASE_LEVEL final
#endif
#if (TCL_RELEASE_LEVEL == 2)
# define MINOR_VERSION (TCL_MINOR_VERSION * 16) + TCL_RELEASE_SERIAL
# define RELEASE_CODE 0x00
#else
# define MINOR_VERSION TCL_MINOR_VERSION * 16
# define RELEASE_CODE TCL_RELEASE_SERIAL
#endif
resource 'vers' (1) {
TCL_MAJOR_VERSION, MINOR_VERSION,
RELEASE_LEVEL, RELEASE_CODE, verUS,
TCL_PATCH_LEVEL,
TCL_PATCH_LEVEL ", by Ray Johnson & Jim Ingham" "\n" "© 2001 Tcl Core Team"
};
resource 'vers' (2) {
TCL_MAJOR_VERSION, MINOR_VERSION,
RELEASE_LEVEL, RELEASE_CODE, verUS,
TCL_PATCH_LEVEL,
"Tcl Shell " TCL_PATCH_LEVEL " © 1993-2001"
};
#define TCL_APP_CREATOR 'Tcl '
type TCL_APP_CREATOR as 'STR ';
resource TCL_APP_CREATOR (0, purgeable) {
"Tcl Shell " TCL_PATCH_LEVEL " © 1993-2001"
};
/*
* The 'kind' resource works with a 'BNDL' in Macintosh Easy Open
* to affect the text the Finder displays in the "kind" column and
* file info dialog. This information will be applied to all files
* with the listed creator and type.
*/
resource 'kind' (128, "Tcl kind", purgeable) {
TCL_APP_CREATOR,
0, /* region = USA */
{
'APPL', "Tcl Shell",
}
};
/*
* The following resource is used when creating the 'env' variable in
* the Macintosh environment. The creation mechanisim looks for the
* 'STR#' resource named "Tcl Environment Variables" rather than a
* specific resource number. (In other words, feel free to change the
* resource id if it conflicts with your application.) Each string in
* the resource must be of the form "KEYWORD=SOME STRING". See Tcl
* documentation for futher information about the env variable.
*
* A good example of something you may want to set is: "TCL_LIBRARY=My
* disk:etc."
*/
resource 'STR#' (128, "Tcl Environment Variables") {
{
/*
"SCHEDULE_NAME=Agent Controller Schedule",
"SCHEDULE_PATH=Lozoya:System Folder:Tcl Lib:Tcl-Scheduler"
*/
};
};
data 'alis' (1000, "Library Folder") {
$"0000 0000 00BA 0002 0001 012F 0000 0000" /* .....†...../.... */
$"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
$"0000 0000 0000 985C FB00 4244 0000 0000" /* ......ò\š.BD.... */
$"0002 1328 5375 7070 6F72 7420 4C69 6272" /* ...(Support Libr */
$"6172 6965 7329 0000 0000 0000 0000 0000" /* aries).......... */
$"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
$"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
$"0000 0076 8504 B617 A796 003D 0027 025B" /* ...vÖ..ßñ.=.'.[ */
$"01E4 0001 0001 0000 0000 0000 0000 0000" /* .”.............. */
$"0000 0000 0000 0000 0001 2F00 0002 0015" /* ........../..... */
$"2F3A 2853 7570 706F 7274 204C 6962 7261" /* /:(Support Libra */
$"7269 6573 2900 FFFF 0000" /* ries)... */
};
|
Changes to mac/tclMacBOAMain.c.
1 2 3 4 5 6 7 8 9 10 | /* * tclMacBGMain.c -- * * Main program for Macintosh Background Only Application shells. * * Copyright (c) 1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | /* * tclMacBGMain.c -- * * Main program for Macintosh Background Only Application shells. * * Copyright (c) 1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclMacBOAMain.c,v 1.3.28.1 2002/02/05 02:22:02 wolfsuit Exp $ */ #include "tcl.h" #include "tclInt.h" #include "tclMacInt.h" #include <Resources.h> #include <Notification.h> |
| ︙ | ︙ | |||
45 46 47 48 49 50 51 | */ extern int isatty _ANSI_ARGS_((int fd)); extern char * strcpy _ANSI_ARGS_((char *dst, CONST char *src)); static Tcl_Interp *interp; /* Interpreter for application. */ | < < < < < < < < < < < < | 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | */ extern int isatty _ANSI_ARGS_((int fd)); extern char * strcpy _ANSI_ARGS_((char *dst, CONST char *src)); static Tcl_Interp *interp; /* Interpreter for application. */ /* * Forward references for procedures defined later in this file: */ void TclMacDoNotification(char *mssg); void TclMacNotificationResponse(NMRecPtr nmRec); int Tcl_MacBGNotifyObjCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const *objv); /* *---------------------------------------------------------------------- |
| ︙ | ︙ | |||
104 105 106 107 108 109 110 |
Tcl_Obj *commandPtr = NULL;
char buffer[1000], *args, *fileName;
int code, tty;
int exitCode = 0;
Tcl_FindExecutable(argv[0]);
interp = Tcl_CreateInterp();
| < < < < | 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
Tcl_Obj *commandPtr = NULL;
char buffer[1000], *args, *fileName;
int code, tty;
int exitCode = 0;
Tcl_FindExecutable(argv[0]);
interp = Tcl_CreateInterp();
Tcl_InitMemory(interp);
/*
* Make command-line arguments available in the Tcl variables "argc"
* and "argv". If the first argument doesn't start with a "-" then
* strip it off and use it as the name of a script file to process.
*/
|
| ︙ | ︙ | |||
314 315 316 317 318 319 320 |
}
TclMacDoNotification(Tcl_GetString(objv[1]));
return TCL_OK;
}
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 298 299 300 301 302 303 304 |
}
TclMacDoNotification(Tcl_GetString(objv[1]));
return TCL_OK;
}
|
Changes to mac/tclMacChan.c.
1 2 3 4 5 6 7 8 9 10 11 | /* * tclMacChan.c * * Channel drivers for Macintosh channels for the * console fds. * * Copyright (c) 1996-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | /* * tclMacChan.c * * Channel drivers for Macintosh channels for the * console fds. * * Copyright (c) 1996-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclMacChan.c,v 1.7.8.1 2002/02/05 02:22:02 wolfsuit Exp $ */ #include "tclInt.h" #include "tclPort.h" #include "tclMacInt.h" #include <Aliases.h> #include <Errors.h> |
| ︙ | ︙ | |||
104 105 106 107 108 109 110 | Tcl_Interp *interp)); static int FileEventProc _ANSI_ARGS_((Tcl_Event *evPtr, int flags)); static ThreadSpecificData *FileInit _ANSI_ARGS_((void)); static int FileInput _ANSI_ARGS_((ClientData instanceData, char *buf, int toRead, int *errorCode)); static int FileOutput _ANSI_ARGS_((ClientData instanceData, | | | | | | 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 |
Tcl_Interp *interp));
static int FileEventProc _ANSI_ARGS_((Tcl_Event *evPtr,
int flags));
static ThreadSpecificData *FileInit _ANSI_ARGS_((void));
static int FileInput _ANSI_ARGS_((ClientData instanceData,
char *buf, int toRead, int *errorCode));
static int FileOutput _ANSI_ARGS_((ClientData instanceData,
CONST char *buf, int toWrite, int *errorCode));
static int FileSeek _ANSI_ARGS_((ClientData instanceData,
long offset, int mode, int *errorCode));
static void FileSetupProc _ANSI_ARGS_((ClientData clientData,
int flags));
static int GetOpenMode _ANSI_ARGS_((Tcl_Interp *interp,
CONST char *string));
static Tcl_Channel OpenFileChannel _ANSI_ARGS_((CONST char *fileName,
int mode, int permissions, int *errorCodePtr));
static int StdIOBlockMode _ANSI_ARGS_((ClientData instanceData,
int mode));
static int StdIOClose _ANSI_ARGS_((ClientData instanceData,
Tcl_Interp *interp));
static int StdIOInput _ANSI_ARGS_((ClientData instanceData,
char *buf, int toRead, int *errorCode));
static int StdIOOutput _ANSI_ARGS_((ClientData instanceData,
CONST char *buf, int toWrite, int *errorCode));
static int StdIOSeek _ANSI_ARGS_((ClientData instanceData,
long offset, int mode, int *errorCode));
static int StdReady _ANSI_ARGS_((ClientData instanceData,
int mask));
/*
* This structure describes the channel type structure for file based IO:
*/
static Tcl_ChannelType consoleChannelType = {
"file", /* Type name. */
(Tcl_ChannelTypeVersion)StdIOBlockMode, /* Set blocking/nonblocking mode.*/
StdIOClose, /* Close proc. */
StdIOInput, /* Input proc. */
StdIOOutput, /* Output proc. */
StdIOSeek, /* Seek proc. */
NULL, /* Set option proc. */
NULL, /* Get option proc. */
CommonWatch, /* Initialize notifier. */
CommonGetHandle /* Get OS handles out of channel. */
};
/*
* This variable describes the channel type structure for file based IO.
*/
static Tcl_ChannelType fileChannelType = {
"file", /* Type name. */
(Tcl_ChannelTypeVersion)FileBlockMode, /* Set blocking or
* non-blocking mode.*/
FileClose, /* Close proc. */
FileInput, /* Input proc. */
FileOutput, /* Output proc. */
FileSeek, /* Seek proc. */
NULL, /* Set option proc. */
NULL, /* Get option proc. */
|
| ︙ | ︙ | |||
544 545 546 547 548 549 550 |
*
*----------------------------------------------------------------------
*/
static int
StdIOOutput(
ClientData instanceData, /* Unused. */
| | | | 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 |
*
*----------------------------------------------------------------------
*/
static int
StdIOOutput(
ClientData instanceData, /* Unused. */
CONST char *buf, /* The data buffer. */
int toWrite, /* How many bytes to write? */
int *errorCode) /* Where to store error code. */
{
int written;
int fd;
*errorCode = 0;
errno = 0;
fd = (int) ((FileState*)instanceData)->fileRef;
written = write(fd, (void*)buf, (size_t) toWrite);
if (written > -1) {
return written;
}
*errorCode = errno;
return -1;
}
|
| ︙ | ︙ | |||
750 751 752 753 754 755 756 |
*/
Tcl_Channel
TclpOpenFileChannel(
Tcl_Interp *interp, /* Interpreter for error reporting;
* can be NULL. */
Tcl_Obj *pathPtr, /* Name of file to open. */
| | | | 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 |
*/
Tcl_Channel
TclpOpenFileChannel(
Tcl_Interp *interp, /* Interpreter for error reporting;
* can be NULL. */
Tcl_Obj *pathPtr, /* Name of file to open. */
CONST char *modeString, /* A list of POSIX open modes or
* a string such as "rw". */
int permissions) /* If the open involves creating a
* file, with what modes to create
* it? */
{
Tcl_Channel chan;
int mode;
CONST char *native;
int errorCode;
mode = GetOpenMode(interp, modeString);
if (mode == -1) {
return NULL;
}
|
| ︙ | ︙ | |||
1078 1079 1080 1081 1082 1083 1084 |
*
*----------------------------------------------------------------------
*/
static int
FileOutput(
ClientData instanceData, /* Unused. */
| | | 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 |
*
*----------------------------------------------------------------------
*/
static int
FileOutput(
ClientData instanceData, /* Unused. */
CONST char *buffer, /* The data buffer. */
int toWrite, /* How many bytes to write? */
int *errorCodePtr) /* Where to store error code. */
{
FileState *fileState = (FileState *) instanceData;
long length = toWrite;
OSErr err;
|
| ︙ | ︙ | |||
1278 1279 1280 1281 1282 1283 1284 |
GetOpenMode(
Tcl_Interp *interp, /* Interpreter to use for error
* reporting - may be NULL. */
CONST char *string) /* Mode string, e.g. "r+" or
* "RDONLY CREAT". */
{
int mode, modeArgc, c, i, gotRW;
| | | 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 |
GetOpenMode(
Tcl_Interp *interp, /* Interpreter to use for error
* reporting - may be NULL. */
CONST char *string) /* Mode string, e.g. "r+" or
* "RDONLY CREAT". */
{
int mode, modeArgc, c, i, gotRW;
CONST char **modeArgv, *flag;
/*
* Check for the simpler fopen-like access modes (e.g. "r"). They
* are distinguished from the POSIX access modes by the presence
* of a lower-case first letter.
*/
|
| ︙ | ︙ |
Changes to mac/tclMacCommonPch.h.
1 2 3 4 5 6 7 8 9 10 11 12 13 | /* * tclMacCommonPch.h -- * * Macintosh Tcl must be compiled with certain compiler options to * ensure that it will work correctly. The following pragmas are * used to ensure that those options are set correctly. An error * will occur at compile time if they are not set correctly. * * Copyright (c) 1998 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | /* * tclMacCommonPch.h -- * * Macintosh Tcl must be compiled with certain compiler options to * ensure that it will work correctly. The following pragmas are * used to ensure that those options are set correctly. An error * will occur at compile time if they are not set correctly. * * Copyright (c) 1998 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclMacCommonPch.h,v 1.2.38.1 2002/02/05 02:22:02 wolfsuit Exp $ */ #if !__option(enumsalwaysint) #error Tcl requires the Metrowerks setting "Enums always ints". #endif |
| ︙ | ︙ | |||
44 45 46 47 48 49 50 | * The define is used most everywhere to tell Tcl (or any Tcl * extensions) that we are compiling for the Macintosh platform. */ #define MAC_TCL | < < < < < < < < < < < < < < < < < > | < | 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | * The define is used most everywhere to tell Tcl (or any Tcl * extensions) that we are compiling for the Macintosh platform. */ #define MAC_TCL /* * Define the following symbol if you want * comprehensive debugging turned on. */ /* #define TCL_DEBUG */ #ifdef TCL_DEBUG # define TCL_MEM_DEBUG # define TCL_TEST #endif /* * for Metrowerks Pro 6 MSL */ #include <UseDLLPrefix.h> |
Changes to mac/tclMacFCmd.c.
1 2 3 4 5 6 7 8 9 10 11 | /* * tclMacFCmd.c -- * * Implements the Macintosh specific portions of the file manipulation * subcommands of the "file" command. * * Copyright (c) 1996-1998 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | /* * tclMacFCmd.c -- * * Implements the Macintosh specific portions of the file manipulation * subcommands of the "file" command. * * Copyright (c) 1996-1998 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclMacFCmd.c,v 1.10.8.1 2002/02/05 02:22:02 wolfsuit Exp $ */ #include "tclInt.h" #include "tclMac.h" #include "tclMacInt.h" #include "tclPort.h" #include <FSpCompat.h> |
| ︙ | ︙ | |||
28 29 30 31 32 33 34 | #include <Aliases.h> /* * Callback for the file attributes code. */ static int GetFileFinderAttributes _ANSI_ARGS_((Tcl_Interp *interp, | | | | | | | 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
#include <Aliases.h>
/*
* Callback for the file attributes code.
*/
static int GetFileFinderAttributes _ANSI_ARGS_((Tcl_Interp *interp,
int objIndex, Tcl_Obj *fileName,
Tcl_Obj **attributePtrPtr));
static int GetFileReadOnly _ANSI_ARGS_((Tcl_Interp *interp,
int objIndex, Tcl_Obj *fileName,
Tcl_Obj **readOnlyPtrPtr));
static int SetFileFinderAttributes _ANSI_ARGS_((Tcl_Interp *interp,
int objIndex, Tcl_Obj *fileName,
Tcl_Obj *attributePtr));
static int SetFileReadOnly _ANSI_ARGS_((Tcl_Interp *interp,
int objIndex, Tcl_Obj *fileName,
Tcl_Obj *readOnlyPtr));
/*
* These are indeces into the tclpFileAttrsStrings table below.
*/
#define MAC_CREATOR_ATTRIBUTE 0
#define MAC_HIDDEN_ATTRIBUTE 1
#define MAC_READONLY_ATTRIBUTE 2
#define MAC_TYPE_ATTRIBUTE 3
/*
* Global variables for the file attributes code.
*/
CONST char *tclpFileAttrStrings[] = {"-creator", "-hidden", "-readonly",
"-type", (char *) NULL};
CONST TclFileAttrProcs tclpFileAttrProcs[] = {
{GetFileFinderAttributes, SetFileFinderAttributes},
{GetFileFinderAttributes, SetFileFinderAttributes},
{GetFileReadOnly, SetFileReadOnly},
{GetFileFinderAttributes, SetFileFinderAttributes}};
|
| ︙ | ︙ | |||
712 713 714 715 716 717 718 |
}
if (err == noErr) {
FSMakeFSSpecCompat(dstFileSpec.vRefNum, dstFileSpec.parID,
tmpName, &tmpDirSpec);
err = FSpDirCreateCompat(&tmpDirSpec, smSystemScript, &tmpDirID);
}
if (err == noErr) {
| | | 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 |
}
if (err == noErr) {
FSMakeFSSpecCompat(dstFileSpec.vRefNum, dstFileSpec.parID,
tmpName, &tmpDirSpec);
err = FSpDirCreateCompat(&tmpDirSpec, smSystemScript, &tmpDirID);
}
if (err == noErr) {
err = FSpDirectoryCopy(&srcFileSpec, &tmpDirSpec, NULL, NULL, 0, true,
CopyErrHandler);
}
/*
* Even if the Copy failed, Rename/Move whatever did get copied to the
* appropriate final destination, if possible.
*/
|
| ︙ | ︙ | |||
1020 1021 1022 1023 1024 1025 1026 |
* parent directory. */
Boolean *pathExistsPtr, /* Set to true if path actually exists,
* false if it doesn't or there was an
* error reading the specified path. */
Boolean *pathIsDirectoryPtr)/* Set to true if path is itself a directory,
* otherwise false. */
{
| | | | 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 |
* parent directory. */
Boolean *pathExistsPtr, /* Set to true if path actually exists,
* false if it doesn't or there was an
* error reading the specified path. */
Boolean *pathIsDirectoryPtr)/* Set to true if path is itself a directory,
* otherwise false. */
{
CONST char *dirName;
OSErr err;
int argc;
CONST char **argv;
long d;
Tcl_DString buffer;
*pathExistsPtr = false;
*pathIsDirectoryPtr = false;
Tcl_DStringInit(&buffer);
|
| ︙ | ︙ | |||
1153 1154 1155 1156 1157 1158 1159 |
*----------------------------------------------------------------------
*/
static int
GetFileFinderAttributes(
Tcl_Interp *interp, /* The interp to report errors with. */
int objIndex, /* The index of the attribute option. */
| | | | | | < | 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 |
*----------------------------------------------------------------------
*/
static int
GetFileFinderAttributes(
Tcl_Interp *interp, /* The interp to report errors with. */
int objIndex, /* The index of the attribute option. */
Tcl_Obj *fileName, /* The name of the file (UTF-8). */
Tcl_Obj **attributePtrPtr) /* A pointer to return the object with. */
{
OSErr err;
FSSpec fileSpec;
FInfo finfo;
CONST char *native;
native=Tcl_FSGetNativePath(fileName);
err = FSpLocationFromPath(strlen(native),
native, &fileSpec);
if (err == noErr) {
err = FSpGetFInfo(&fileSpec, &finfo);
}
if (err == noErr) {
switch (objIndex) {
|
| ︙ | ︙ | |||
1200 1201 1202 1203 1204 1205 1206 |
}
}
}
if (err != noErr) {
errno = TclMacOSErrorToPosixError(err);
Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),
| | | 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 |
}
}
}
if (err != noErr) {
errno = TclMacOSErrorToPosixError(err);
Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),
"could not read \"", Tcl_GetString(fileName), "\": ",
Tcl_PosixError(interp), (char *) NULL);
return TCL_ERROR;
}
return TCL_OK;
}
/*
|
| ︙ | ︙ | |||
1232 1233 1234 1235 1236 1237 1238 |
*----------------------------------------------------------------------
*/
static int
GetFileReadOnly(
Tcl_Interp *interp, /* The interp to report errors with. */
int objIndex, /* The index of the attribute. */
| | | | | | < | 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 |
*----------------------------------------------------------------------
*/
static int
GetFileReadOnly(
Tcl_Interp *interp, /* The interp to report errors with. */
int objIndex, /* The index of the attribute. */
Tcl_Obj *fileName, /* The name of the file (UTF-8). */
Tcl_Obj **readOnlyPtrPtr) /* A pointer to return the object with. */
{
OSErr err;
FSSpec fileSpec;
CInfoPBRec paramBlock;
CONST char *native;
native=Tcl_FSGetNativePath(fileName);
err = FSpLocationFromPath(strlen(native),
native, &fileSpec);
if (err == noErr) {
if (err == noErr) {
paramBlock.hFileInfo.ioCompletion = NULL;
paramBlock.hFileInfo.ioNamePtr = fileSpec.name;
paramBlock.hFileInfo.ioVRefNum = fileSpec.vRefNum;
paramBlock.hFileInfo.ioFDirIndex = 0;
|
| ︙ | ︙ | |||
1269 1270 1271 1272 1273 1274 1275 |
paramBlock.hFileInfo.ioFlAttrib & 1);
}
}
}
if (err != noErr) {
errno = TclMacOSErrorToPosixError(err);
Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),
| | | 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 |
paramBlock.hFileInfo.ioFlAttrib & 1);
}
}
}
if (err != noErr) {
errno = TclMacOSErrorToPosixError(err);
Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),
"could not read \"", Tcl_GetString(fileName), "\": ",
Tcl_PosixError(interp), (char *) NULL);
return TCL_ERROR;
}
return TCL_OK;
}
/*
|
| ︙ | ︙ | |||
1297 1298 1299 1300 1301 1302 1303 |
*----------------------------------------------------------------------
*/
static int
SetFileFinderAttributes(
Tcl_Interp *interp, /* The interp to report errors with. */
int objIndex, /* The index of the attribute. */
| | | | | | < | 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 |
*----------------------------------------------------------------------
*/
static int
SetFileFinderAttributes(
Tcl_Interp *interp, /* The interp to report errors with. */
int objIndex, /* The index of the attribute. */
Tcl_Obj *fileName, /* The name of the file (UTF-8). */
Tcl_Obj *attributePtr) /* The command line object. */
{
OSErr err;
FSSpec fileSpec;
FInfo finfo;
CONST char *native;
native=Tcl_FSGetNativePath(fileName);
err = FSpLocationFromPath(strlen(native),
native, &fileSpec);
if (err == noErr) {
err = FSpGetFInfo(&fileSpec, &finfo);
}
if (err == noErr) {
switch (objIndex) {
|
| ︙ | ︙ | |||
1353 1354 1355 1356 1357 1358 1359 |
Boolean isDirectory = 0;
err = FSpGetDirectoryID(&fileSpec, &dirID, &isDirectory);
if ((err == noErr) && isDirectory) {
Tcl_Obj *resultPtr = Tcl_GetObjResult(interp);
Tcl_AppendStringsToObj(resultPtr, "cannot set ",
tclpFileAttrStrings[objIndex], ": \"",
| | | | 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 |
Boolean isDirectory = 0;
err = FSpGetDirectoryID(&fileSpec, &dirID, &isDirectory);
if ((err == noErr) && isDirectory) {
Tcl_Obj *resultPtr = Tcl_GetObjResult(interp);
Tcl_AppendStringsToObj(resultPtr, "cannot set ",
tclpFileAttrStrings[objIndex], ": \"",
Tcl_GetString(fileName), "\" is a directory", (char *) NULL);
return TCL_ERROR;
}
}
if (err != noErr) {
errno = TclMacOSErrorToPosixError(err);
Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),
"could not read \"", Tcl_GetString(fileName), "\": ",
Tcl_PosixError(interp), (char *) NULL);
return TCL_ERROR;
}
return TCL_OK;
}
/*
|
| ︙ | ︙ | |||
1389 1390 1391 1392 1393 1394 1395 |
*----------------------------------------------------------------------
*/
static int
SetFileReadOnly(
Tcl_Interp *interp, /* The interp to report errors with. */
int objIndex, /* The index of the attribute. */
| | | | | | < | 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 |
*----------------------------------------------------------------------
*/
static int
SetFileReadOnly(
Tcl_Interp *interp, /* The interp to report errors with. */
int objIndex, /* The index of the attribute. */
Tcl_Obj *fileName, /* The name of the file (UTF-8). */
Tcl_Obj *readOnlyPtr) /* The command line object. */
{
OSErr err;
FSSpec fileSpec;
HParamBlockRec paramBlock;
int hidden;
CONST char *native;
native=Tcl_FSGetNativePath(fileName);
err = FSpLocationFromPath(strlen(native),
native, &fileSpec);
if (err == noErr) {
if (Tcl_GetBooleanFromObj(interp, readOnlyPtr, &hidden) != TCL_OK) {
return TCL_ERROR;
}
paramBlock.fileParam.ioCompletion = NULL;
|
| ︙ | ︙ | |||
1436 1437 1438 1439 1440 1441 1442 |
err = fnfErr;
}
}
if (err != noErr) {
errno = TclMacOSErrorToPosixError(err);
Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),
| | | 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 |
err = fnfErr;
}
}
if (err != noErr) {
errno = TclMacOSErrorToPosixError(err);
Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),
"could not read \"", Tcl_GetString(fileName), "\": ",
Tcl_PosixError(interp), (char *) NULL);
return TCL_ERROR;
}
return TCL_OK;
}
/*
|
| ︙ | ︙ | |||
1490 1491 1492 1493 1494 1495 1496 |
theError = PBHGetVInfoSync(&pb);
if ( theError != noErr ) {
break;
}
| | | 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 |
theError = PBHGetVInfoSync(&pb);
if ( theError != noErr ) {
break;
}
Tcl_ExternalToUtfDString(NULL, (CONST char *)&name[1], name[0], &dstr);
elemPtr = Tcl_NewStringObj(Tcl_DStringValue(&dstr),
Tcl_DStringLength(&dstr));
Tcl_AppendToObj(elemPtr, ":", 1);
Tcl_ListObjAppendElement(NULL, resultPtr, elemPtr);
Tcl_DStringFree(&dstr);
|
| ︙ | ︙ | |||
1621 1622 1623 1624 1625 1626 1627 |
*/
fileNamePtr=NULL;
}
} else {
Tcl_UtfToExternalDString(NULL,&path[lastCheckpoint],
fileNameLen,&nativeds);
fileNameLen=Tcl_DStringLength(&nativeds);
| | | > > > | | | 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 |
*/
fileNamePtr=NULL;
}
} else {
Tcl_UtfToExternalDString(NULL,&path[lastCheckpoint],
fileNameLen,&nativeds);
fileNameLen=Tcl_DStringLength(&nativeds);
if(fileNameLen > MAXMACFILENAMELEN) {
err = bdNamErr;
} else {
fileName[0]=fileNameLen;
strncpy((char *) fileName + 1, Tcl_DStringValue(&nativeds),
fileNameLen);
}
Tcl_DStringFree(&nativeds);
}
if(err == noErr)
err=FSMakeFSSpecCompat(vRefNum, dirID, fileNamePtr, &fileSpec);
if(err != noErr) {
if(err != fnfErr) {
/*
* this can occur if trying to get parent of a root
* volume via '::' or when using an illegal
* filename; revert to last checkpoint and stop
* processing path further
*/
err=FSMakeFSSpecCompat(vRefNum, dirID, NULL, &fileSpec);
if(err != noErr) {
/* should never happen, bail out */
return firstCheckpoint;
}
|
| ︙ | ︙ | |||
1683 1684 1685 1686 1687 1688 1689 |
return firstCheckpoint; /* should not see any errors here, bail out */
}
HLock(newPathHandle);
Tcl_ExternalToUtfDString(NULL,*newPathHandle,newPathLen,&nativeds);
if (cur != 0) {
/* not at end, append remaining path */
| | | | | 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 |
return firstCheckpoint; /* should not see any errors here, bail out */
}
HLock(newPathHandle);
Tcl_ExternalToUtfDString(NULL,*newPathHandle,newPathLen,&nativeds);
if (cur != 0) {
/* not at end, append remaining path */
if ( newPathLen==0 || (*(*newPathHandle+(newPathLen-1))!=':' && path[nextCheckpoint] !=':')) {
Tcl_DStringAppend(&nativeds, ":" , 1);
}
Tcl_DStringAppend(&nativeds, &path[nextCheckpoint],
strlen(&path[nextCheckpoint]));
}
DisposeHandle(newPathHandle);
fileNameLen=Tcl_DStringLength(&nativeds);
Tcl_SetStringObj(pathPtr,Tcl_DStringValue(&nativeds),fileNameLen);
Tcl_DStringFree(&nativeds);
return nextCheckpoint+(fileNameLen-origPathLen);
}
|
Changes to mac/tclMacFile.c.
1 2 3 4 5 6 7 8 9 10 11 12 | /* * tclMacFile.c -- * * This file implements the channel drivers for Macintosh * files. It also comtains Macintosh version of other Tcl * functions that deal with the file system. * * Copyright (c) 1995-1998 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /* * tclMacFile.c -- * * This file implements the channel drivers for Macintosh * files. It also comtains Macintosh version of other Tcl * functions that deal with the file system. * * Copyright (c) 1995-1998 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclMacFile.c,v 1.12.8.1 2002/02/05 02:22:02 wolfsuit Exp $ */ /* * Note: This code eventually needs to support async I/O. In doing this * we will need to keep track of all current async I/O. If exit to shell * is called - we shouldn't exit until all asyc I/O completes. */ |
| ︙ | ︙ | |||
35 36 37 38 39 40 41 |
FSSpec* specPtr));
static OSErr
FspLocationFromFsPath(pathPtr, specPtr)
Tcl_Obj *pathPtr;
FSSpec* specPtr;
{
| | | 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
FSSpec* specPtr));
static OSErr
FspLocationFromFsPath(pathPtr, specPtr)
Tcl_Obj *pathPtr;
FSSpec* specPtr;
{
CONST char *native = Tcl_FSGetNativePath(pathPtr);
return FSpLocationFromPath(strlen(native), native, specPtr);
}
/*
*----------------------------------------------------------------------
*
|
| ︙ | ︙ | |||
124 125 126 127 128 129 130 |
*---------------------------------------------------------------------- */
int
TclpMatchInDirectory(interp, resultPtr, pathPtr, pattern, types)
Tcl_Interp *interp; /* Interpreter to receive errors. */
Tcl_Obj *resultPtr; /* List object to lappend results. */
Tcl_Obj *pathPtr; /* Contains path to directory to search. */
| | | 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 |
*---------------------------------------------------------------------- */
int
TclpMatchInDirectory(interp, resultPtr, pathPtr, pattern, types)
Tcl_Interp *interp; /* Interpreter to receive errors. */
Tcl_Obj *resultPtr; /* List object to lappend results. */
Tcl_Obj *pathPtr; /* Contains path to directory to search. */
CONST char *pattern; /* Pattern to match against. */
Tcl_GlobTypeData *types; /* Object containing list of acceptable types.
* May be NULL. In particular the directory
* flag is very important. */
{
char *fname;
int fnameLen, result = TCL_OK;
int baseLength;
|
| ︙ | ︙ | |||
173 174 175 176 177 178 179 |
if ((err != noErr) || !isDirectory) {
/*
* Check if we had a relative path (unix style relative path
* compatibility for glob)
*/
Tcl_DStringFree(&dsOrig);
Tcl_DStringAppend(&dsOrig, ":", 1);
| | | 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 |
if ((err != noErr) || !isDirectory) {
/*
* Check if we had a relative path (unix style relative path
* compatibility for glob)
*/
Tcl_DStringFree(&dsOrig);
Tcl_DStringAppend(&dsOrig, ":", 1);
Tcl_DStringAppend(&dsOrig, Tcl_GetString(fileNamePtr), -1);
baseLength = Tcl_DStringLength(&dsOrig);
Tcl_UtfToExternalDString(NULL, Tcl_DStringValue(&dsOrig),
Tcl_DStringLength(&dsOrig), &fileString);
err = FSpLocationFromPath(Tcl_DStringLength(&fileString),
Tcl_DStringValue(&fileString), &dirSpec);
|
| ︙ | ︙ | |||
230 231 232 233 234 235 236 237 238 |
* Now check to see if the file matches.
*/
Tcl_ExternalToUtfDString(NULL, (char *) fileName + 1, fileName[0],
&fileString);
if (Tcl_StringMatch(Tcl_DStringValue(&fileString), pattern)) {
int typeOk = 1;
Tcl_DStringSetLength(&dsOrig, baseLength);
Tcl_DStringAppend(&dsOrig, Tcl_DStringValue(&fileString), -1);
| > < | 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 |
* Now check to see if the file matches.
*/
Tcl_ExternalToUtfDString(NULL, (char *) fileName + 1, fileName[0],
&fileString);
if (Tcl_StringMatch(Tcl_DStringValue(&fileString), pattern)) {
int typeOk = 1;
Tcl_Obj *tempName;
Tcl_DStringSetLength(&dsOrig, baseLength);
Tcl_DStringAppend(&dsOrig, Tcl_DStringValue(&fileString), -1);
fname = Tcl_DStringValue(&dsOrig);
fnameLen = Tcl_DStringLength(&dsOrig);
/*
* We use this tempName in calls to check the file's
* type below. We may also use it for the result.
*/
|
| ︙ | ︙ | |||
278 279 280 281 282 283 284 |
((types->perm & TCL_GLOB_PERM_X) &&
(TclpObjAccess(tempName, X_OK) != 0))
) {
typeOk = 0;
}
}
if (typeOk == 1 && types->type != 0) {
| < < < | 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 |
((types->perm & TCL_GLOB_PERM_X) &&
(TclpObjAccess(tempName, X_OK) != 0))
) {
typeOk = 0;
}
}
if (typeOk == 1 && types->type != 0) {
if (TclpObjStat(tempName, &buf) != 0) {
/* Posix error occurred */
typeOk = 0;
}
if (typeOk) {
/*
* In order bcdpfls as in 'find -t'
*/
if (
((types->type & TCL_GLOB_TYPE_BLOCK) &&
S_ISBLK(buf.st_mode)) ||
|
| ︙ | ︙ | |||
540 541 542 543 544 545 546 |
Tcl_DStringFree(&ds);
return cwdPtr;
} else {
return NULL;
}
}
| | | 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 |
Tcl_DStringFree(&ds);
return cwdPtr;
} else {
return NULL;
}
}
CONST char *
TclpGetCwd(
Tcl_Interp *interp, /* If non-NULL, used for error reporting. */
Tcl_DString *bufferPtr) /* Uninitialized or free DString filled
* with name of current directory. */
{
FSSpec theSpec;
int length;
|
| ︙ | ︙ | |||
609 610 611 612 613 614 615 |
Boolean wasAlias;
long dirID;
char fileName[257];
char *end;
Handle theString = NULL;
int pathSize;
Tcl_DString ds;
| < | | | > | | < < | | | | | 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 |
Boolean wasAlias;
long dirID;
char fileName[257];
char *end;
Handle theString = NULL;
int pathSize;
Tcl_DString ds;
Tcl_UtfToExternalDString(NULL, path, -1, &ds);
/*
* Remove ending colons if they exist.
*/
while ((Tcl_DStringLength(&ds) != 0) && (Tcl_DStringValue(&ds)[Tcl_DStringLength(&ds) - 1] == ':')) {
Tcl_DStringSetLength(&ds, Tcl_DStringLength(&ds) - 1);
}
end = strrchr(Tcl_DStringValue(&ds), ':');
if (end == NULL ) {
strcpy(fileName + 1, Tcl_DStringValue(&ds));
} else {
strcpy(fileName + 1, end + 1);
Tcl_DStringSetLength(&ds, end + 1 - Tcl_DStringValue(&ds));
}
fileName[0] = (char) strlen(fileName + 1);
/*
* Create the file spec for the directory of the file
* we want to look at.
*/
if (end != NULL) {
err = FSpLocationFromPath(Tcl_DStringLength(&ds), Tcl_DStringValue(&ds), &fileSpec);
if (err != noErr) {
Tcl_DStringFree(&ds);
errno = EINVAL;
return NULL;
}
} else {
FSMakeFSSpecCompat(0, 0, NULL, &fileSpec);
|
| ︙ | ︙ | |||
903 904 905 906 907 908 909 |
{
OSErr err;
FSSpec fileSpec;
Handle pathString = NULL;
int size;
FILE * f;
| | | 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 |
{
OSErr err;
FSSpec fileSpec;
Handle pathString = NULL;
int size;
FILE * f;
err = FSpLocationFromPath(strlen(path), path, &fileSpec);
if ((err != noErr) && (err != fnfErr)) {
return NULL;
}
err = FSpPathFromLocation(&fileSpec, &size, &pathString);
if ((err != noErr) && (err != fnfErr)) {
return NULL;
}
|
| ︙ | ︙ | |||
1006 1007 1008 1009 1010 1011 1012 |
default:
return EINVAL;
}
}
int
TclMacChmod(
| | | > | | < | 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 |
default:
return EINVAL;
}
}
int
TclMacChmod(
CONST char *path,
int mode)
{
HParamBlockRec hpb;
OSErr err;
Str255 pathName;
strcpy((char *) pathName + 1, path);
pathName[0] = strlen(path);
hpb.fileParam.ioNamePtr = pathName;
hpb.fileParam.ioVRefNum = 0;
hpb.fileParam.ioDirID = 0;
if (mode & 0200) {
err = PBHRstFLockSync(&hpb);
} else {
err = PBHSetFLockSync(&hpb);
}
if (err != noErr) {
errno = TclMacOSErrorToPosixError(err);
return -1;
}
return 0;
|
| ︙ | ︙ |
Changes to mac/tclMacInit.c.
1 2 3 4 5 6 7 8 9 10 | /* * tclMacInit.c -- * * Contains the Mac-specific interpreter initialization functions. * * Copyright (c) 1995-1998 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | > | > > < | | | | | | | | | > | | | > > | 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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
/*
* tclMacInit.c --
*
* Contains the Mac-specific interpreter initialization functions.
*
* Copyright (c) 1995-1998 Sun Microsystems, Inc.
*
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
* RCS: @(#) $Id: tclMacInit.c,v 1.5.8.1 2002/02/05 02:22:02 wolfsuit Exp $
*/
#include <AppleEvents.h>
#include <AEDataModel.h>
#include <AEObjects.h>
#include <AEPackObject.h>
#include <AERegistry.h>
#include <Files.h>
#include <Folders.h>
#include <Gestalt.h>
#include <TextUtils.h>
#include <Resources.h>
#include <Strings.h>
#include "tclInt.h"
#include "tclMacInt.h"
#include "tclPort.h"
#include "tclInitScript.h"
/*
* The following string is the startup script executed in new
* interpreters. It looks on the library path and in the resource fork for
* a script "init.tcl" that is compatible with this version of Tcl. The
* init.tcl script does all of the real work of initialization.
*/
static char initCmd[] = "if {[info proc tclInit]==\"\"} {\n\
proc tclInit {} {\n\
global tcl_pkgPath env\n\
proc sourcePath {file} {\n\
foreach i $::auto_path {\n\
set init [file join $i $file.tcl]\n\
if {[catch {uplevel #0 [list source $init]}] == 0} {\n\
return\n\
}\n\
}\n\
if {[catch {uplevel #0 [list source -rsrc $file]}] == 0} {\n\
return\n\
}\n\
rename sourcePath {}\n\
set msg \"Can't find $file resource or a usable $file.tcl file\"\n\
append msg \" in the following directories:\"\n\
append msg \" $::auto_path\"\n\
append msg \" perhaps you need to install Tcl or set your\"\n\
append msg \" TCL_LIBRARY environment variable?\"\n\
error $msg\n\
}\n\
if {[info exists env(EXT_FOLDER)]} {\n\
lappend tcl_pkgPath [file join $env(EXT_FOLDER) {Tool Command Language}]\n\
}\n\
if {[info exists tcl_pkgPath] == 0} {\n\
set tcl_pkgPath {no extension folder}\n\
}\n\
sourcePath init\n\
sourcePath auto\n\
sourcePath package\n\
sourcePath history\n\
sourcePath word\n\
sourcePath parray\n\
rename sourcePath {}\n\
} }\n\
tclInit";
/*
* The following structures are used to map the script/language codes of a
* font to the name that should be passed to Tcl_GetEncoding() to obtain
* the encoding for that font. The set of numeric constants is fixed and
* defined by Apple.
*/
|
| ︙ | ︙ | |||
345 346 347 348 349 350 351 |
void
TclpInitLibraryPath(argv0)
CONST char *argv0; /* Name of executable from argv[0] to main().
* Not used because we can determine the name
* by querying the module handle. */
{
Tcl_Obj *objPtr, *pathPtr;
| | > > > > > > > > > > | | | | < | > | > > > > > > > | | > > | 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 |
void
TclpInitLibraryPath(argv0)
CONST char *argv0; /* Name of executable from argv[0] to main().
* Not used because we can determine the name
* by querying the module handle. */
{
Tcl_Obj *objPtr, *pathPtr;
CONST char *str;
Tcl_DString ds;
TclMacCreateEnv();
pathPtr = Tcl_NewObj();
/*
* Look for the library relative to default encoding dir.
*/
str = Tcl_GetDefaultEncodingDir();
if ((str != NULL) && (str[0] != '\0')) {
objPtr = Tcl_NewStringObj(str, -1);
Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
}
str = TclGetEnv("TCL_LIBRARY", &ds);
if ((str != NULL) && (str[0] != '\0')) {
/*
* If TCL_LIBRARY is set, search there.
*/
objPtr = Tcl_NewStringObj(str, Tcl_DStringLength(&ds));
Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
Tcl_DStringFree(&ds);
}
objPtr = TclGetLibraryPath();
if (objPtr != NULL) {
Tcl_ListObjAppendList(NULL, pathPtr, objPtr);
}
/*
* lappend path [file join $env(EXT_FOLDER) \
* "Tool Command Language" "tcl[info version]"
*/
str = TclGetEnv("EXT_FOLDER", &ds);
if ((str != NULL) && (str[0] != '\0')) {
Tcl_DString libPath, path;
CONST char *argv[3];
argv[0] = str;
argv[1] = "Tool Command Language";
Tcl_DStringInit(&libPath);
Tcl_DStringAppend(&libPath, "tcl", -1);
Tcl_DStringAppend(&libPath, TCL_VERSION, -1);
argv[2] = Tcl_DStringValue(&libPath);
Tcl_DStringInit(&path);
str = Tcl_JoinPath(3, argv, &path);
objPtr = Tcl_NewStringObj(str, Tcl_DStringLength(&path));
Tcl_ListObjAppendElement(NULL, pathPtr, objPtr);
Tcl_DStringFree(&ds);
Tcl_DStringFree(&libPath);
Tcl_DStringFree(&path);
}
TclSetLibraryPath(pathPtr);
}
/*
*---------------------------------------------------------------------------
*
|
| ︙ | ︙ | |||
415 416 417 418 419 420 421 |
*/
void
TclpSetInitialEncodings()
{
CONST char *encoding;
Tcl_Obj *pathPtr;
| | | | | 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 |
*/
void
TclpSetInitialEncodings()
{
CONST char *encoding;
Tcl_Obj *pathPtr;
int fontId, err;
fontId = 0;
GetFinderFont(&fontId);
encoding = TclMacGetFontEncoding(fontId);
if (encoding == NULL) {
encoding = "macRoman";
}
err = Tcl_SetSystemEncoding(NULL, encoding);
if (err == TCL_OK && libraryPathEncodingFixed == 0) {
/*
* Until the system encoding was actually set, the library path was
* actually in the native multi-byte encoding, and not really UTF-8
* as advertised. We cheated as follows:
*
* 1. It was safe to allow the Tcl_SetSystemEncoding() call to
|
| ︙ | ︙ | |||
468 469 470 471 472 473 474 475 476 477 478 479 480 481 |
string = Tcl_GetStringFromObj(objv[i], &length);
Tcl_ExternalToUtfDString(NULL, string, length, &ds);
Tcl_SetStringObj(objv[i], Tcl_DStringValue(&ds),
Tcl_DStringLength(&ds));
Tcl_DStringFree(&ds);
}
}
libraryPathEncodingFixed = 1;
}
/* This is only ever called from the startup thread */
if (binaryEncoding == NULL) {
/*
| > | 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 |
string = Tcl_GetStringFromObj(objv[i], &length);
Tcl_ExternalToUtfDString(NULL, string, length, &ds);
Tcl_SetStringObj(objv[i], Tcl_DStringValue(&ds),
Tcl_DStringLength(&ds));
Tcl_DStringFree(&ds);
}
Tcl_InvalidateStringRep(pathPtr);
}
libraryPathEncodingFixed = 1;
}
/* This is only ever called from the startup thread */
if (binaryEncoding == NULL) {
/*
|
| ︙ | ︙ | |||
508 509 510 511 512 513 514 |
TclpSetVariables(interp)
Tcl_Interp *interp;
{
long int gestaltResult;
int minor, major, objc;
Tcl_Obj **objv;
char versStr[2 * TCL_INTEGER_SPACE];
| | | 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 |
TclpSetVariables(interp)
Tcl_Interp *interp;
{
long int gestaltResult;
int minor, major, objc;
Tcl_Obj **objv;
char versStr[2 * TCL_INTEGER_SPACE];
CONST char *str;
Tcl_Obj *pathPtr;
Tcl_DString ds;
str = "no library";
pathPtr = TclGetLibraryPath();
if (pathPtr != NULL) {
objc = 0;
|
| ︙ | ︙ | |||
664 665 666 667 668 669 670 671 672 673 674 675 676 677 |
*/
int
Tcl_Init(
Tcl_Interp *interp) /* Interpreter to initialize. */
{
Tcl_Obj *pathPtr;
/*
* For Macintosh applications the Init function may be contained in
* the application resources. If it exists we use it - otherwise we
* look in the tcl_library directory. Ditto for the history command.
*/
| > > > > > > | 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 |
*/
int
Tcl_Init(
Tcl_Interp *interp) /* Interpreter to initialize. */
{
Tcl_Obj *pathPtr;
if (tclPreInitScript != NULL) {
if (Tcl_Eval(interp, tclPreInitScript) == TCL_ERROR) {
return (TCL_ERROR);
};
}
/*
* For Macintosh applications the Init function may be contained in
* the application resources. If it exists we use it - otherwise we
* look in the tcl_library directory. Ditto for the history command.
*/
|
| ︙ | ︙ | |||
704 705 706 707 708 709 710 |
*/
void
Tcl_SourceRCFile(
Tcl_Interp *interp) /* Interpreter to source rc file into. */
{
Tcl_DString temp;
| | | | 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 |
*/
void
Tcl_SourceRCFile(
Tcl_Interp *interp) /* Interpreter to source rc file into. */
{
Tcl_DString temp;
CONST char *fileName;
Tcl_Channel errChannel;
Handle h;
fileName = Tcl_GetVar(interp, "tcl_rcFileName", TCL_GLOBAL_ONLY);
if (fileName != NULL) {
Tcl_Channel c;
CONST char *fullName;
Tcl_DStringInit(&temp);
fullName = Tcl_TranslateFileName(interp, fileName, &temp);
if (fullName == NULL) {
/*
* Couldn't translate the file name (e.g. it referred to a
* bogus user or there was no HOME environment variable).
|
| ︙ | ︙ | |||
746 747 748 749 750 751 752 |
}
Tcl_DStringFree(&temp);
}
fileName = Tcl_GetVar(interp, "tcl_rcRsrcName", TCL_GLOBAL_ONLY);
if (fileName != NULL) {
| | > > > > | | | 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 |
}
Tcl_DStringFree(&temp);
}
fileName = Tcl_GetVar(interp, "tcl_rcRsrcName", TCL_GLOBAL_ONLY);
if (fileName != NULL) {
Str255 rezName;
Tcl_DString ds;
Tcl_UtfToExternalDString(NULL, fileName, -1, &ds);
strcpy((char *) rezName + 1, Tcl_DStringValue(&ds));
rezName[0] = (unsigned) Tcl_DStringLength(&ds);
h = GetNamedResource('TEXT', rezName);
Tcl_DStringFree(&ds);
if (h != NULL) {
if (Tcl_MacEvalResource(interp, fileName, 0, NULL) != TCL_OK) {
errChannel = Tcl_GetStdChannel(TCL_STDERR);
if (errChannel) {
Tcl_WriteObj(errChannel, Tcl_GetObjResult(interp));
Tcl_WriteChars(errChannel, "\n", 1);
}
}
Tcl_ResetResult(interp);
ReleaseResource(h);
}
}
}
|
Changes to mac/tclMacInt.h.
1 2 3 4 5 6 7 8 9 10 | /* * tclMacInt.h -- * * Declarations of Macintosh specific shared variables and procedures. * * Copyright (c) 1996-1998 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | | | | < < > > > > > | > > > | < < < | 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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
/*
* tclMacInt.h --
*
* Declarations of Macintosh specific shared variables and procedures.
*
* Copyright (c) 1996-1998 Sun Microsystems, Inc.
*
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
* RCS: @(#) $Id: tclMacInt.h,v 1.6.18.1 2002/02/05 02:22:02 wolfsuit Exp $
*/
#ifndef _TCLMACINT
#define _TCLMACINT
#ifndef _TCLINT
#include "tclInt.h"
#endif
#ifndef _TCLPORT
#include "tclPort.h"
#endif
#include <Events.h>
#include <Files.h>
/*
* Defines to control stack behavior.
*
* The Tcl8.2 regexp code is highly recursive for patterns with many
* subexpressions. So we have to increase the stack space to accomodate.
* 512 K is good enough for ordinary work, but you need 768 to pass the Tcl
* regexp testsuite.
*
* For the PPC, you need to set the stack space in the Project file.
*
*/
#ifdef TCL_TEST
# define TCL_MAC_68K_STACK_GROWTH (768*1024)
#else
# define TCL_MAC_68K_STACK_GROWTH (512*1024)
#endif
#define TCL_MAC_STACK_THRESHOLD 16384
#ifdef BUILD_tcl
# undef TCL_STORAGE_CLASS
# define TCL_STORAGE_CLASS DLLEXPORT
#endif
/*
* This flag is passed to TclMacRegisterResourceFork
* by a file (usually a library) whose resource fork
* should not be closed by the resource command.
*/
#define TCL_RESOURCE_DONT_CLOSE 2
/*
* Typedefs used by Macintosh parts of Tcl.
*/
/*
* Prototypes of Mac only internal functions.
*/
EXTERN char * TclMacGetFontEncoding _ANSI_ARGS_((int fontId));
EXTERN int TclMacHaveThreads _ANSI_ARGS_((void));
EXTERN long TclpGetGMTOffset _ANSI_ARGS_((void));
# undef TCL_STORAGE_CLASS
# define TCL_STORAGE_CLASS DLLIMPORT
#include "tclIntPlatDecls.h"
#endif /* _TCLMACINT */
|
Changes to mac/tclMacLibrary.c.
| ︙ | ︙ | |||
9 10 11 12 13 14 15 | * file. * * Copyright (c) 1996 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | > > > > > > > > > | 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 34 35 36 37 38 39 40 41 42 43 | * file. * * Copyright (c) 1996 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclMacLibrary.c,v 1.4.18.1 2002/02/05 02:22:02 wolfsuit Exp $ */ /* * Here is another place that we are using the old routine names... */ #include <CodeFragments.h> #include <Errors.h> #include <Resources.h> #include <Strings.h> #include "tclMacInt.h" #if defined(TCL_REGISTER_LIBRARY) && defined(USE_TCL_STUBS) #error "Can't use TCL_REGISTER_LIBRARY and USE_TCL_STUBS at the same time!" /* * Can't register a library with Tcl when using stubs in the current * implementation, since Tcl_InitStubs hasn't been called yet * when OpenLibraryResource is executing. */ #endif /* * These function are not currently defined in any header file. The * only place they should be used is in the Initialization and * Termination entry points for a code fragment. The prototypes * are included here to avoid compile errors. */ |
| ︙ | ︙ |
Changes to mac/tclMacLibrary.r.
1 2 3 4 5 6 7 8 9 10 11 12 | /* * tclMacLibrary.r -- * * This file creates resources used by the Tcl shared library. * Many thanks go to "Jay Lieske, Jr." <lieske@princeton.edu> who * wrote the initial version of this file. * * Copyright (c) 1996-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /* * tclMacLibrary.r -- * * This file creates resources used by the Tcl shared library. * Many thanks go to "Jay Lieske, Jr." <lieske@princeton.edu> who * wrote the initial version of this file. * * Copyright (c) 1996-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclMacLibrary.r,v 1.4.18.1 2002/02/05 02:22:02 wolfsuit Exp $ */ #include <Types.r> #include <SysTypes.r> /* * The folowing include and defines help construct |
| ︙ | ︙ | |||
30 31 32 33 34 35 36 37 38 39 40 41 42 |
# define RELEASE_LEVEL beta
#elif (TCL_RELEASE_LEVEL == 2)
# define RELEASE_LEVEL final
#endif
#if (TCL_RELEASE_LEVEL == 2)
# define MINOR_VERSION (TCL_MINOR_VERSION * 16) + TCL_RELEASE_SERIAL
#else
# define MINOR_VERSION TCL_MINOR_VERSION * 16
#endif
resource 'vers' (1) {
TCL_MAJOR_VERSION, MINOR_VERSION,
| > > | | | | | 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
# define RELEASE_LEVEL beta
#elif (TCL_RELEASE_LEVEL == 2)
# define RELEASE_LEVEL final
#endif
#if (TCL_RELEASE_LEVEL == 2)
# define MINOR_VERSION (TCL_MINOR_VERSION * 16) + TCL_RELEASE_SERIAL
# define RELEASE_CODE 0x00
#else
# define MINOR_VERSION TCL_MINOR_VERSION * 16
# define RELEASE_CODE TCL_RELEASE_SERIAL
#endif
resource 'vers' (1) {
TCL_MAJOR_VERSION, MINOR_VERSION,
RELEASE_LEVEL, RELEASE_CODE, verUS,
TCL_PATCH_LEVEL,
TCL_PATCH_LEVEL ", by Ray Johnson & Jim Ingham" "\n" "© 2001 Tcl Core Team"
};
resource 'vers' (2) {
TCL_MAJOR_VERSION, MINOR_VERSION,
RELEASE_LEVEL, RELEASE_CODE, verUS,
TCL_PATCH_LEVEL,
"Tcl Library " TCL_PATCH_LEVEL " © 1993-2001"
};
/*
* Currently the creator for all Tcl/Tk libraries and extensions
* should be 'TclL'. This will allow those extension and libraries
* to use the common icon for Tcl extensions. However, this signature
* still needs to be approved by the signature police at Apple and may
|
| ︙ | ︙ | |||
92 93 94 95 96 97 98 |
resource 'FREF' (TCL_LIBRARY_RESOURCES, purgeable)
{
'shlb', 0, ""
};
type TCL_CREATOR as 'STR ';
resource TCL_CREATOR (0, purgeable) {
| | | 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
resource 'FREF' (TCL_LIBRARY_RESOURCES, purgeable)
{
'shlb', 0, ""
};
type TCL_CREATOR as 'STR ';
resource TCL_CREATOR (0, purgeable) {
"Tcl Library " TCL_PATCH_LEVEL " © 1993-2001"
};
/*
* The 'kind' resource works with a 'BNDL' in Macintosh Easy Open
* to affect the text the Finder displays in the "kind" column and
* file info dialog. This information will be applied to all files
* with the listed creator and type.
|
| ︙ | ︙ | |||
121 122 123 124 125 126 127 |
* give the user a little detail about the library's capabilities
* and enough information to install the library in the correct location.
* A similar string should be placed in all shared libraries.
*/
resource 'STR ' (-16397, purgeable) {
"Tcl Library\n\n"
"This is the core library needed to run Tool Command Language programs. "
| | < < < < < < < < < < < < < < | 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 |
* give the user a little detail about the library's capabilities
* and enough information to install the library in the correct location.
* A similar string should be placed in all shared libraries.
*/
resource 'STR ' (-16397, purgeable) {
"Tcl Library\n\n"
"This is the core library needed to run Tool Command Language programs. "
"To work properly, it should be placed in the ŒTool Command Language¹ folder "
"within the Extensions folder."
};
/*
* The following are icons for the shared library.
*/
data 'icl4' (2000, "Tcl Shared Library", purgeable) {
$"0FFF FFFF FFFF FFFF FFFF FFFF FFFF 0000"
$"F000 0000 0000 0000 0000 0000 000C F000"
|
| ︙ | ︙ |
Changes to mac/tclMacLoad.c.
1 2 3 4 5 6 7 8 9 10 11 12 | /* * tclMacLoad.c -- * * This procedure provides a version of the TclLoadFile for use * on the Macintosh. This procedure will only work with systems * that use the Code Fragment Manager. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /* * tclMacLoad.c -- * * This procedure provides a version of the TclLoadFile for use * on the Macintosh. This procedure will only work with systems * that use the Code Fragment Manager. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclMacLoad.c,v 1.7.2.1 2002/02/05 02:22:02 wolfsuit Exp $ */ #include <CodeFragments.h> #include <Errors.h> #include <Resources.h> #include <Strings.h> #include <FSpCompat.h> |
| ︙ | ︙ | |||
104 105 106 107 108 109 110 |
CONST char *sym1,
CONST char *sym2, /* Names of two procedures to look up in
* the file's symbol table. */
Tcl_PackageInitProc **proc1Ptr,
Tcl_PackageInitProc **proc2Ptr,
/* Where to return the addresses corresponding
* to sym1 and sym2. */
| | | | > | < < < < < < < < < > > > > > > > > > | 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 |
CONST char *sym1,
CONST char *sym2, /* Names of two procedures to look up in
* the file's symbol table. */
Tcl_PackageInitProc **proc1Ptr,
Tcl_PackageInitProc **proc2Ptr,
/* Where to return the addresses corresponding
* to sym1 and sym2. */
ClientData *clientDataPtr, /* Filled with token for dynamically loaded
* file which will be passed back to
* (*unloadProcPtr)() to unload the file. */
Tcl_FSUnloadFileProc **unloadProcPtr)
/* Filled with address of Tcl_FSUnloadFileProc
* function which should be used for
* this file. */
{
CFragConnectionID connID;
Ptr dummy;
OSErr err;
CFragSymbolClass symClass;
FSSpec fileSpec;
short fragFileRef, saveFileRef;
Handle fragResource;
UInt32 offset = 0;
UInt32 length = kCFragGoesToEOF;
StringPtr fragName=NULL;
Str255 errName, symbolName;
Tcl_DString ds;
CONST char *native;
native = Tcl_FSGetNativePath(pathPtr);
err = FSpLocationFromPath(strlen(native), native, &fileSpec);
if (err != noErr) {
Tcl_SetResult(interp, "could not locate shared library", TCL_STATIC);
return TCL_ERROR;
}
/*
* First thing we must do is infer the package name from the sym1
* variable (by removing the "_Init" suffix). This is kind of dumb
* since the caller actually knows this value, it just doesn't give
* it to us.
*/
native = Tcl_UtfToExternalDString(NULL, sym1, -1, &ds);
Tcl_DStringSetLength(&ds, Tcl_DStringLength(&ds) - 5);
/*
* See if this fragment has a 'cfrg' resource. It will tell us where
* to look for the fragment in the file. If it doesn't exist we will
* assume we have a ppc frag using the whole data fork. If it does
* exist we find the frag that matches the one we are looking for and
* get the offset and size from the resource.
*/
|
| ︙ | ︙ | |||
169 170 171 172 173 174 175 |
itemCount = (*(CfrgHeaderPtrHand)fragResource)->itemCount;
itemStart = &(*(CfrgHeaderPtrHand)fragResource)->arrayStart;
for (index = 0; index < itemCount;
index++, itemStart += srcItem->itemSize) {
srcItem = (CfrgItem*)itemStart;
if (srcItem->archType != OUR_ARCH_TYPE) continue;
| | | > > < | > > > > | > > > | | | > > | | < < < | 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 |
itemCount = (*(CfrgHeaderPtrHand)fragResource)->itemCount;
itemStart = &(*(CfrgHeaderPtrHand)fragResource)->arrayStart;
for (index = 0; index < itemCount;
index++, itemStart += srcItem->itemSize) {
srcItem = (CfrgItem*)itemStart;
if (srcItem->archType != OUR_ARCH_TYPE) continue;
if (!strncasecmp(native, (char *) srcItem->name + 1,
strlen(native))) {
offset = srcItem->codeOffset;
length = srcItem->codeLength;
fragName=srcItem->name;
}
}
}
/*
* Close the resource file. If the extension wants to reopen the
* resource fork it should use the tclMacLibrary.c file during it's
* construction.
*/
HUnlock(fragResource);
ReleaseResource(fragResource);
CloseResFile(fragFileRef);
UseResFile(saveFileRef);
}
Tcl_DStringFree(&ds);
/*
* Now we can attempt to load the fragement using the offset & length
* obtained from the resource. We don't worry about the main entry point
* as we are going to search for specific entry points passed to us.
*/
err = GetDiskFragment(&fileSpec, offset, length, fragName,
kLoadCFrag, &connID, &dummy, errName);
*clientDataPtr = (ClientData) connID;
if (err != fragNoErr) {
p2cstr(errName);
Tcl_AppendResult(interp, "couldn't load file \"",
Tcl_GetString(pathPtr),
"\": ", errName, (char *) NULL);
return TCL_ERROR;
}
*unloadProcPtr = &TclpUnloadFile;
Tcl_UtfToExternalDString(NULL, sym1, -1, &ds);
strcpy((char *) symbolName + 1, Tcl_DStringValue(&ds));
symbolName[0] = (unsigned) Tcl_DStringLength(&ds);
err = FindSymbol(connID, symbolName, (Ptr *) proc1Ptr, &symClass);
Tcl_DStringFree(&ds);
if (err != fragNoErr || symClass == kDataCFragSymbol) {
Tcl_SetResult(interp,
"could not find Initialization routine in library",
TCL_STATIC);
return TCL_ERROR;
}
Tcl_UtfToExternalDString(NULL, sym2, -1, &ds);
strcpy((char *) symbolName + 1, Tcl_DStringValue(&ds));
symbolName[0] = (unsigned) Tcl_DStringLength(&ds);
err = FindSymbol(connID, symbolName, (Ptr *) proc2Ptr, &symClass);
Tcl_DStringFree(&ds);
if (err != fragNoErr || symClass == kDataCFragSymbol) {
*proc2Ptr = NULL;
}
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
* TclpUnloadFile --
|
| ︙ | ︙ | |||
252 253 254 255 256 257 258 259 260 261 262 263 264 265 |
void
TclpUnloadFile(clientData)
ClientData clientData; /* ClientData returned by a previous call
* to TclpLoadFile(). The clientData is
* a token that represents the loaded
* file. */
{
}
/*
*----------------------------------------------------------------------
*
* TclGuessPackageName --
*
| > | 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 |
void
TclpUnloadFile(clientData)
ClientData clientData; /* ClientData returned by a previous call
* to TclpLoadFile(). The clientData is
* a token that represents the loaded
* file. */
{
CloseConnection((CFragConnectionID*) &clientData);
}
/*
*----------------------------------------------------------------------
*
* TclGuessPackageName --
*
|
| ︙ | ︙ | |||
276 277 278 279 280 281 282 | * None. * *---------------------------------------------------------------------- */ int TclGuessPackageName( | | | 285 286 287 288 289 290 291 292 293 294 295 296 297 298 |
* None.
*
*----------------------------------------------------------------------
*/
int
TclGuessPackageName(
CONST char *fileName, /* Name of file containing package (already
* translated to local form if needed). */
Tcl_DString *bufPtr) /* Initialized empty dstring. Append
* package name to this if possible. */
{
return 0;
}
|
Deleted mac/tclMacMSLPrefix.h.
|
| < < < < < < < < < < < < < < < < < < < < < < < < |
Changes to mac/tclMacMath.h.
| ︙ | ︙ | |||
8 9 10 11 12 13 14 | * are passed around and used, they will crash hard on the 68K. * * Copyright (c) 1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | * are passed around and used, they will crash hard on the 68K. * * Copyright (c) 1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclMacMath.h,v 1.2.34.1 2002/02/05 02:22:02 wolfsuit Exp $ */ #ifndef _TCLMACMATH #define _TCLMACMATH #include <math.h> |
| ︙ | ︙ | |||
131 132 133 134 135 136 137 | # ifdef floor # undef floor # define floor floord # endif #endif #endif | | | 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 | # ifdef floor # undef floor # define floor floord # endif #endif #endif #if (defined(THINK_C)) #pragma export on double hypotd(double x, double y); #define hypot hypotd #pragma export reset #endif #endif /* _TCLMACMATH */ |
Changes to mac/tclMacNotify.c.
| ︙ | ︙ | |||
10 11 12 13 14 15 16 | * event proc will have to arbitrate which events go to which threads. * * Copyright (c) 1995-1996 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | * event proc will have to arbitrate which events go to which threads. * * Copyright (c) 1995-1996 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclMacNotify.c,v 1.6.26.1 2002/02/05 02:22:02 wolfsuit Exp $ */ #include "tclInt.h" #include "tclPort.h" #include "tclMac.h" #include "tclMacInt.h" #include <signal.h> |
| ︙ | ︙ | |||
262 263 264 265 266 267 268 |
Rect mouseRect;
/*
* Check for mouse moved events. These events aren't placed on the
* system event queue unless we call WaitNextEvent.
*/
| | | 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 |
Rect mouseRect;
/*
* Check for mouse moved events. These events aren't placed on the
* system event queue unless we call WaitNextEvent.
*/
GetGlobalMouseTcl(¤tMouse);
if ((notifier.eventProcPtr != NULL) &&
!EqualPt(currentMouse, notifier.lastMousePosition)) {
notifier.lastMousePosition = currentMouse;
theEvent.what = nullEvent;
if ((*notifier.eventProcPtr)(&theEvent) == true) {
eventFound = 1;
}
|
| ︙ | ︙ | |||
292 293 294 295 296 297 298 |
}
/*
* Process events from the OS event queue.
*/
while (needsUpdate || (GetEvQHdr()->qHead != NULL)) {
| | | 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 |
}
/*
* Process events from the OS event queue.
*/
while (needsUpdate || (GetEvQHdr()->qHead != NULL)) {
GetGlobalMouseTcl(¤tMouse);
SetRect(&mouseRect, currentMouse.h, currentMouse.v,
currentMouse.h + 1, currentMouse.v + 1);
RectRgn(notifier.utilityRgn, &mouseRect);
WaitNextEvent(everyEvent, &theEvent, 5, notifier.utilityRgn);
needsUpdate = 0;
if ((notifier.eventProcPtr != NULL)
|
| ︙ | ︙ | |||
347 348 349 350 351 352 353 |
if (!timePtr) {
notifier.timerActive = 0;
} else {
/*
* Compute when the timer should fire.
*/
| | | 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 |
if (!timePtr) {
notifier.timerActive = 0;
} else {
/*
* Compute when the timer should fire.
*/
Tcl_GetTime(¬ifier.timer);
notifier.timer.sec += timePtr->sec;
notifier.timer.usec += timePtr->usec;
if (notifier.timer.usec >= 1000000) {
notifier.timer.usec -= 1000000;
notifier.timer.sec += 1;
}
notifier.timerActive = 1;
|
| ︙ | ︙ | |||
477 478 479 480 481 482 483 |
if (!found) {
/*
* Set up mouse region so we will wake if the mouse is moved.
* We do this by defining the smallest possible region around
* the current mouse position.
*/
| | | 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 |
if (!found) {
/*
* Set up mouse region so we will wake if the mouse is moved.
* We do this by defining the smallest possible region around
* the current mouse position.
*/
GetGlobalMouseTcl(¤tMouse);
SetRect(&mouseRect, currentMouse.h, currentMouse.v,
currentMouse.h + 1, currentMouse.v + 1);
RectRgn(notifier.utilityRgn, &mouseRect);
WaitNextEvent(everyEvent, &macEvent, sleepTime,
notifier.utilityRgn);
|
| ︙ | ︙ |
Changes to mac/tclMacOSA.c.
| ︙ | ︙ | |||
8 9 10 11 12 13 14 | * * Copyright (c) 1996 Lucent Technologies and Jim Ingham * Copyright (c) 1997 Sun Microsystems, Inc. * * See the file "License Terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | * * Copyright (c) 1996 Lucent Technologies and Jim Ingham * Copyright (c) 1997 Sun Microsystems, Inc. * * See the file "License Terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclMacOSA.c,v 1.6.18.1 2002/02/05 02:22:02 wolfsuit Exp $ */ #define MAC_TCL #include <Aliases.h> #include <string.h> #include <AppleEvents.h> |
| ︙ | ︙ | |||
2064 2065 2066 2067 2068 2069 2070 |
Handle resHandle;
Str255 rezName;
int result = TCL_OK;
short saveRef, fileRef = -1;
char idStr[16 + TCL_INTEGER_SPACE];
FSSpec fileSpec;
Tcl_DString buffer;
| | | 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 |
Handle resHandle;
Str255 rezName;
int result = TCL_OK;
short saveRef, fileRef = -1;
char idStr[16 + TCL_INTEGER_SPACE];
FSSpec fileSpec;
Tcl_DString buffer;
CONST char *nativeName;
OSErr myErr = noErr;
OSAID scriptID;
Size scriptSize;
AEDesc scriptData;
/*
* First extract the script data
|
| ︙ | ︙ | |||
2116 2117 2118 2119 2120 2121 2122 |
if ((err != noErr) && (err != fnfErr)) {
Tcl_AppendResult(interp,
"Error getting a location for the file: \"",
fileName, "\".", NULL);
return TCL_ERROR;
}
| | | | 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 |
if ((err != noErr) && (err != fnfErr)) {
Tcl_AppendResult(interp,
"Error getting a location for the file: \"",
fileName, "\".", NULL);
return TCL_ERROR;
}
FSpCreateResFileCompatTcl(&fileSpec,
'WiSH', 'osas', smSystemScript);
myErr = ResError();
if ((myErr != noErr) && (myErr != dupFNErr)) {
sprintf(idStr, "%d", myErr);
Tcl_AppendResult(interp, "Error #", idStr,
" creating new resource file ", fileName, (char *) NULL);
result = TCL_ERROR;
goto rezEvalCleanUp;
}
fileRef = FSpOpenResFileCompatTcl(&fileSpec, fsRdWrPerm);
if (fileRef == -1) {
Tcl_AppendResult(interp, "Error reading the file: \"",
fileName, "\".", NULL);
result = TCL_ERROR;
goto rezEvalCleanUp;
}
UseResFile(fileRef);
|
| ︙ | ︙ | |||
2283 2284 2285 2286 2287 2288 2289 |
Handle sourceData;
Str255 rezName;
int result = TCL_OK;
short saveRef, fileRef = -1;
char idStr[16 + TCL_INTEGER_SPACE];
FSSpec fileSpec;
Tcl_DString buffer;
| | | | 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 |
Handle sourceData;
Str255 rezName;
int result = TCL_OK;
short saveRef, fileRef = -1;
char idStr[16 + TCL_INTEGER_SPACE];
FSSpec fileSpec;
Tcl_DString buffer;
CONST char *nativeName;
saveRef = CurResFile();
if (fileName != NULL) {
OSErr err;
Tcl_DStringInit(&buffer);
nativeName = Tcl_TranslateFileName(interp, fileName, &buffer);
if (nativeName == NULL) {
return TCL_ERROR;
}
err = FSpLocationFromPath(strlen(nativeName), nativeName, &fileSpec);
Tcl_DStringFree(&buffer);
if (err != noErr) {
Tcl_AppendResult(interp, "Error finding the file: \"",
fileName, "\".", NULL);
return TCL_ERROR;
}
fileRef = FSpOpenResFileCompatTcl(&fileSpec, fsRdPerm);
if (fileRef == -1) {
Tcl_AppendResult(interp, "Error reading the file: \"",
fileName, "\".", NULL);
return TCL_ERROR;
}
UseResFile(fileRef);
} else {
|
| ︙ | ︙ |
Deleted mac/tclMacOSA.exp.
|
| < |
Changes to mac/tclMacOSA.r.
1 2 3 4 5 6 7 8 9 10 | /* * tkMacOSA.r -- * * This file creates resources used by the AppleScript package. * * Copyright (c) 1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | | | | | | > > | | | | | | | 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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
/*
* tkMacOSA.r --
*
* This file creates resources used by the AppleScript package.
*
* Copyright (c) 1997 Sun Microsystems, Inc.
*
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
* RCS: @(#) $Id: tclMacOSA.r,v 1.3.18.1 2002/02/05 02:22:02 wolfsuit Exp $
*/
#include <Types.r>
#include <SysTypes.r>
/*
* The folowing include and defines help construct
* the version string for Tcl.
*/
#define SCRIPT_MAJOR_VERSION 1 /* Major number */
#define SCRIPT_MINOR_VERSION 1 /* Minor number */
#define SCRIPT_RELEASE_SERIAL 0 /* Really minor number! */
#define RELEASE_LEVEL final /* alpha, beta, or final */
#define SCRIPT_VERSION "1.1"
#define SCRIPT_PATCH_LEVEL "1.1.0"
#define FINAL 1 /* Change to 1 if final version. */
#if FINAL
# define MINOR_VERSION (SCRIPT_MINOR_VERSION * 16) + SCRIPT_RELEASE_SERIAL
# define RELEASE_CODE 0x00
#else
# define MINOR_VERSION SCRIPT_MINOR_VERSION * 16
# define RELEASE_CODE SCRIPT_RELEASE_SERIAL
#endif
#define RELEASE_CODE 0x00
resource 'vers' (1) {
SCRIPT_MAJOR_VERSION, MINOR_VERSION,
RELEASE_LEVEL, RELEASE_CODE, verUS,
SCRIPT_PATCH_LEVEL,
SCRIPT_PATCH_LEVEL ", by Jim Ingham © Cygnus Solutions" "\n" "© 2001 Tcl Core Team"
};
resource 'vers' (2) {
SCRIPT_MAJOR_VERSION, MINOR_VERSION,
RELEASE_LEVEL, RELEASE_CODE, verUS,
SCRIPT_PATCH_LEVEL,
"Tclapplescript " SCRIPT_PATCH_LEVEL " © 1996-2001"
};
/*
* The -16397 string will be displayed by Finder when a user
* tries to open the shared library. The string should
* give the user a little detail about the library's capabilities
* and enough information to install the library in the correct location.
* A similar string should be placed in all shared libraries.
*/
resource 'STR ' (-16397, purgeable) {
"TclAppleScript Library\n\n"
"This library provides the ability to run AppleScript "
" commands from Tcl/Tk programs. To work properly, it "
"should be placed in the ŒTool Command Language¹ folder "
"within the Extensions folder."
};
/*
* We now load the Tk library into the resource fork of the library.
*/
data 'TEXT' (4000,"pkgIndex",purgeable, preload) {
"# Tcl package index file, version 1.0\n"
"package ifneeded Tclapplescript 1.1 [list tclPkgSetup $dir Tclapplescript 1.1 {{Tclapplescript"
".shlb load AppleScript}}]\n"
};
|
Changes to mac/tclMacPanic.c.
1 2 3 4 5 6 7 8 9 10 11 12 13 | /* * tclMacPanic.c -- * * Source code for the "Tcl_Panic" library procedure used in "Simple * Shell"; other Mac applications will probably call Tcl_SetPanicProc * to set a more robust application-specific panic procedure. * * Copyright (c) 1993-1994 Lockheed Missle & Space Company, AI Center * Copyright (c) 1995-1996 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | > | 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 | /* * tclMacPanic.c -- * * Source code for the "Tcl_Panic" library procedure used in "Simple * Shell"; other Mac applications will probably call Tcl_SetPanicProc * to set a more robust application-specific panic procedure. * * Copyright (c) 1993-1994 Lockheed Missle & Space Company, AI Center * Copyright (c) 1995-1996 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclMacPanic.c,v 1.5.8.1 2002/02/05 02:22:02 wolfsuit Exp $ */ #include <Events.h> #include <Controls.h> #include <ControlDefinitions.h> #include <Windows.h> #include <TextEdit.h> #include <Fonts.h> #include <Dialogs.h> #include <Icons.h> #include <Sound.h> #include <stdarg.h> |
| ︙ | ︙ | |||
55 56 57 58 59 60 61 |
* Side effects:
* The process dies, entering the debugger if possible.
*
*----------------------------------------------------------------------
*/
/* VARARGS ARGSUSED */
| | | 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
* Side effects:
* The process dies, entering the debugger if possible.
*
*----------------------------------------------------------------------
*/
/* VARARGS ARGSUSED */
void
TclpPanic TCL_VARARGS_DEF(CONST char *, format)
{
va_list varg;
char msg[256];
WindowRef macWinPtr, foundWinPtr;
Rect macRect;
Rect buttonRect = PANIC_BUTTON_RECT;
|
| ︙ | ︙ | |||
124 125 126 127 128 129 130 |
SysBeep(1);
} else {
SetPortWindowPort(macWinPtr);
GlobalToLocal(&event.where);
part = FindControl(event.where, macWinPtr,
&okButtonHandle);
| | | 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 |
SysBeep(1);
} else {
SetPortWindowPort(macWinPtr);
GlobalToLocal(&event.where);
part = FindControl(event.where, macWinPtr,
&okButtonHandle);
if ((kControlButtonPart == part) &&
(TrackControl(okButtonHandle,
event.where, NULL))) {
done = true;
}
}
break;
case keyDown:
|
| ︙ | ︙ | |||
148 149 150 151 152 153 154 |
SetPortWindowPort(macWinPtr);
TextFont(systemFont);
BeginUpdate(macWinPtr);
if (stopIconHandle != NULL) {
PlotIcon(&iconRect, stopIconHandle);
}
| | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 |
SetPortWindowPort(macWinPtr);
TextFont(systemFont);
BeginUpdate(macWinPtr);
if (stopIconHandle != NULL) {
PlotIcon(&iconRect, stopIconHandle);
}
TETextBox(msg, strlen(msg), &textRect, teFlushDefault);
DrawControls(macWinPtr);
EndUpdate(macWinPtr);
}
}
}
CloseWindow(macWinPtr);
exitNow:
#ifdef TCL_DEBUG
Debugger();
#else
abort();
#endif
}
|
Changes to mac/tclMacPort.h.
1 2 3 4 5 6 7 8 9 10 11 12 | /* * tclMacPort.h -- * * This header file handles porting issues that occur because of * differences between the Mac and Unix. It should be the only * file that contains #ifdefs to handle different flavors of OS. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /* * tclMacPort.h -- * * This header file handles porting issues that occur because of * differences between the Mac and Unix. It should be the only * file that contains #ifdefs to handle different flavors of OS. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclMacPort.h,v 1.13.8.1 2002/02/05 02:22:02 wolfsuit Exp $ */ #ifndef _MACPORT #define _MACPORT #ifndef _TCLINT |
| ︙ | ︙ | |||
51 52 53 54 55 56 57 | # include <utime.h> /* * The following definitions are usually found if fcntl.h. * However, MetroWerks has screwed that file up a couple of times * and all we need are the defines. */ | | | | 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | # include <utime.h> /* * The following definitions are usually found if fcntl.h. * However, MetroWerks has screwed that file up a couple of times * and all we need are the defines. */ #ifndef _FCNTL # define O_RDWR 0x0 /* open the file in read/write mode */ # define O_RDONLY 0x1 /* open the file in read only mode */ # define O_WRONLY 0x2 /* open the file in write only mode */ # define O_APPEND 0x0100 /* open the file in append mode */ # define O_CREAT 0x0200 /* create the file if it doesn't exist */ # define O_EXCL 0x0400 /* if the file exists don't create it again */ # define O_TRUNC 0x0800 /* truncate the file after opening it */ #endif /* * MetroWerks stat.h file is rather weak. The defines * after the include are needed to fill in the missing * defines. */ # include <stat.h> |
| ︙ | ︙ | |||
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | # define S_IXGRP 00001 /* execute permission: group */ # define S_IRWXO 00007 /* read, write, execute: other */ # define S_IROTH 00004 /* read permission: other */ # define S_IWOTH 00002 /* write permission: other */ # define S_IXOTH 00001 /* execute permission: other */ # endif # define isatty(arg) 1 /* * Defines used by access function. This function is provided * by Mac Tcl as the function TclpAccess. */ # define F_OK 0 /* test for existence of file */ # define X_OK 0x01 /* test for execute or search permission */ # define W_OK 0x02 /* test for write permission */ # define R_OK 0x04 /* test for read permission */ #endif /* __MWERKS__ */ /* * Many signals are not supported on the Mac and are thus not defined in * <signal.h>. They are defined here so that Tcl will compile with less * modification. | > > | 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | # define S_IXGRP 00001 /* execute permission: group */ # define S_IRWXO 00007 /* read, write, execute: other */ # define S_IROTH 00004 /* read permission: other */ # define S_IWOTH 00002 /* write permission: other */ # define S_IXOTH 00001 /* execute permission: other */ # endif #if __MSL__ < 0x6000 # define isatty(arg) 1 /* * Defines used by access function. This function is provided * by Mac Tcl as the function TclpAccess. */ # define F_OK 0 /* test for existence of file */ # define X_OK 0x01 /* test for execute or search permission */ # define W_OK 0x02 /* test for write permission */ # define R_OK 0x04 /* test for read permission */ #endif #endif /* __MWERKS__ */ /* * Many signals are not supported on the Mac and are thus not defined in * <signal.h>. They are defined here so that Tcl will compile with less * modification. |
| ︙ | ︙ | |||
143 144 145 146 147 148 149 150 151 152 153 154 155 156 | #define WIFEXITED(stat) (1) #define WIFSTOPSIG(stat) (1) #define WIFTERMSIG(stat) (1) #define WIFEXITSTATUS(stat) (1) #define WEXITSTATUS(stat) (1) #define WTERMSIG(status) (1) #define WSTOPSIG(status) (1) /* * Make sure that MAXPATHLEN is defined. */ #ifndef MAXPATHLEN # ifdef PATH_MAX | > > > > > | 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 | #define WIFEXITED(stat) (1) #define WIFSTOPSIG(stat) (1) #define WIFTERMSIG(stat) (1) #define WIFEXITSTATUS(stat) (1) #define WEXITSTATUS(stat) (1) #define WTERMSIG(status) (1) #define WSTOPSIG(status) (1) #ifdef BUILD_tcl # undef TCL_STORAGE_CLASS # define TCL_STORAGE_CLASS DLLEXPORT #endif /* * Make sure that MAXPATHLEN is defined. */ #ifndef MAXPATHLEN # ifdef PATH_MAX |
| ︙ | ︙ | |||
201 202 203 204 205 206 207 | /* * Declare dynamic loading extension macro. */ #define TCL_SHLIB_EXT ".shlb" /* | | | | < | 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 | /* * Declare dynamic loading extension macro. */ #define TCL_SHLIB_EXT ".shlb" /* * The following define is defined as a workaround on the mac. It claims that * struct tm has the timezone string in it, which is not true. However, * the code that works around this fact does not compile on the Mac, since * it relies on the fact that time.h has a "timezone" variable, which the * Metrowerks time.h does not have... * * The Mac timezone stuff is implemented via the TclpGetTZName() routine in * tclMacTime.c * */ #define HAVE_TM_ZONE /* |
| ︙ | ︙ | |||
292 293 294 295 296 297 298 | typedef int TclpMutex; #define TclpMutexInit(a) #define TclpMutexLock(a) #define TclpMutexUnlock(a) #endif /* TCL_THREADS */ typedef pascal void (*ExitToShellProcPtr)(void); | | | < | > > > | 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 | typedef int TclpMutex; #define TclpMutexInit(a) #define TclpMutexLock(a) #define TclpMutexUnlock(a) #endif /* TCL_THREADS */ typedef pascal void (*ExitToShellProcPtr)(void); #include "tclMac.h" // contains #include "tclPlatDecls.h" #include "tclIntPlatDecls.h" # undef TCL_STORAGE_CLASS # define TCL_STORAGE_CLASS DLLIMPORT #endif /* _MACPORT */ |
Changes to mac/tclMacProjects.sea.hqx.
1 | (This file must be converted with BinHex 4.0) | | > | < > | < | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > > | | | | | | | | | | | | | | | | | | | | | | > > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | | > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | | > > > > > > | | | | | | | | | | | | | | | | | | | | | | > > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | > > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > > | | | | | | | | | | | | | | | | | | | | | | > > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | | | | | | | | | | | | | > > > > > > > > | < < < > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > > | | | | | | > > > > > > > > > > > > > > > > > > > > > | | | < < < < < < < < < < < < < | | | | | | | | | | | | > > > > > | | | | | < < < < < < | > > > > > > > | > > > > > > > > | | < > > > > | | < < > | < < > > | < < > | < < > > > > > | < < < < < | | | | | | | | | | | | | > > > > | > | > | > | < < > > | < > > | | | 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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 |
(This file must be converted with BinHex 4.0)
:%R4ME%eKBe"bEfTPBh4c,R0PB3""8&"-BA9cG#%!!!%Y3J!"U09VQe0dG@CQ5A3
J+'-T-6Nj0bda16Ni)%&XB@4ND@iJ8hPcG'9YFb`J5@jM,L`JD(4dF$S[,hH3!bj
KE'&NC'PZFhPc,Q0[E5p6G(9QCNPd,`d+'J!&%!!",8)!N!0b!!%!N!0b)aJ0TD9
5CA0PFRCPC+@P!+@3"!%!!$J!4,Ea6[1fm8mc!*!0#)B&!*!$cJ!Q)L%!!5ad!!)
Y2L"#G@PXC!!!&e)!43!L!9-#3J(!rj!%!alrq2r`bd3!!)!!N!HPN!3"!!!f!%5
d(A&cZ#2FJ!#3!h)!!5`V!*!$FJ!'h`-!!!%S!#BJ1`!"+`-!##dq)(4ME!!!M%i
!I3!3!GN"p!(!rj!%!Klrq2r`bd!!!)!!N!HPN!3"!!"!!)#f"X)LYh!(iJ#3!mi
!!#$+!*!$cJ!3j3B!!PXD!!!I2J#3"!m!3Np"Ae4ME&0SC@aXFbl2J!!!3,*069"
b3eG*43%!rj!%!*!+J(!!N!C#`G4TA)3FKdFB9Vjc[S"j9Z"(P%(IQk8f+56NDRU
5pB3pqpZ&4hM@%p(`!kJSMT&0c@IMqN+AIQQ9Ur&[KCX)&PHl[plQD92bUEJb1P#
LX&0[E0r+,YJ!B(fUT5+hHLGS(jYE-EDeN`13!&1EZ"El+m5VENB!"J``M8UlNiQ
*(K)5LJFl$C9ckF#P20mJCC[TGPc*B*!!T5pZ5009m21P8ZTTCBU2+Ub4D*YV8kk
&5VpeDRcm(+!3J&`P4RKN'`CE,lET`HT,,2)NaZkVbaTFPB`#Y*65c8m9pD`1hpk
D5R6B5ZcCmU8r,"aD4[-FST3F6j2i#IRF#Rk#4[)@AVV58T*LT@hf`4@cX#h#AMD
i"lQ"f,H)S2(i'[DL3[0FJS*IV3$[L$*fa@f"9!Ml@JqKPYDcMPDKYNhTa2K'"BD
lLV0`[99B8HY"QZTJ%c1Akp8rRPUL)*,AFMD@+RE(%FLD9U#3!0FeKP'8-k&-k,*
4+aT'SqiJ'&R4K$KdL8Hb2BEN+"Hf9rp)K#48hNrDmp"JH6!iLAY`TqhFBS09JVC
L12KTL)%S0&b5Y6HqHl(b%)Dr,91$h'%if2jIKi`VrZ@5K%'SP@`cb)96C[ccAQ%
N-qDTZB6aJHD'II09NlD59M4jLbT6YflN-MPVZFfQ%cHIGe%2CmNV"+1PYTS+eVM
q)45!m&3bP,3D@Y0GNHd$C,UPVUPl4@5+[pp!40YK4jF$)'f+60X[QT4&UhRC((*
aSL@1mNCcACUe@1CK[EDGMkVJK0Sc8d+MCCRG)[qcT[mcM9(bb!J2@HE"liQ3!0Q
IEe#NCTeVM4j8+1@[(C--KjifTc0LG,"e8mYMDaDL5#Q5P4ZqD"KF`[r6#5'$er0
EQa6J%&Gq-bDhUB[EmV8V1EK$*@@b+e#CZ!Qif!ST,@)2aKE0iIkrj*S3-`bZKBD
PqYH+`FiDQEqSM[9epiMp$49kTT+aZ223MdY$S8D2&Z2*k@Vjf$l0Z()"m&KQIi@
l3dGB@B!&a1[1F!SL#HCdb#6N[e"4D&LR,$1CA$1Zak2pfKR6b-VArq56D1i)lRE
BE[A0!q5D3X$FYC!!I0jrVYdbk6rJGheYN!#J4bk'9c42D+MmeJQlD&MDGpe@21`
8ZdHNJp9c*rYR[UJ2Hfk`ErACJAP9#If)V'p5*1@S!5Y%+HmT%#lMCG0`+c(Qq-N
@3UBEM8LBB0fmBbam#k`a6C!!`,B1rccpZ!DfaVc)YDA&@dMXe6Lh8I'+(KkN5YQ
d13TS*(VlCDir!A6-dPaHR0QafC@RUpQ!6-$T$PF3X$0d6%(!#'2aVhI%i5FHP)Q
q&J)9-Z@$LH*J$iB*(q5EBVJ0jj3G,YI+c-`3YZ4GbK$#(+DKEM*iZdER$5lhl,&
Aji#rTEBMHU%X)0U2US&Pp,cRSEH)RGbBXlm5&"*iL!2DdUGcD$92ZI`D&-IATrN
NG,!X,V!5j%!&fq$JA*cUIrha2P#Mh2LX#mCTQJZJ`)KdHJLE+mMQrh3*[E8Jdk,
9Y&%0CGJAGQ#&[Vf22qKjG&*2Y+F$-L5"T35f-jq%!12"hb0$CD)-9$q+BAA[#q[
mZ2bEN!#H),UV(NV%)prrFI!Zl2,3h2(J9GPk0+&ibYfajY2*EVGE-kl"B+Jk`$6
IAMAXR`6EdZi"G@)EGV!#X8'#!%(c'"G[lpM0U%k9Z1rj90[5)Hi1q#BCDFSdLD1
Af29+!b)T3i*E#X)#5TYbQ$l0hm&E-mPjfm[3!2ce@@FS5!qV2[[J3Q9Vc+4Jp3(
Qf3IU'!0)f4lPFS6%[rI(q#L#,E2SKXKVe,446)fl'TYm#L(QV`"ZUSY`+1dip6U
@*'0UAb@2Im4&Z)5II5HcS@b0TZUdh@J2Hd6d4jc-%,)[C-N`EfH#mQa*m"4`R`b
ah4X2AImZii5fH),c&CpI+&4mP8$NL,2G*pjFqN8V2'qZf#ECRTJ[VA8Um-@!Zj&
S8DZGrjDS["SU(35G2PMZU$80U)%qh%Np+NAG&6fPeqcA@fG2JPak82@"DQ33*%2
%Dp(KcR0dQ`*6RC9A-l03fp$[F*c8jSpj1dpqr%cX)+e**Vak`"`dmXYU`XJ@mD#
%dUfU`+jGQ@88Zh(Fc,B&5'l``8A8bhHS#hS&)Hje"15D5k4lQP-lYFlM%c9Y+&-
CpaSc9"SIG1$!MMcDTqalhK`M[Qm!!dmMDJA1Ei$h#IA6Q-"iAFGN*R!bG&H3!!E
&YTABa85dS9AA`mSm*M#Y$j21r5)!`RFkKB,&'m8Xr43i8("3L#P8kGKQ6P81i6e
`-aTa49mrNS#e8BD%&ekQ!Mj0`S`NcZAVhLJPU-L#$c%[f$+-Sk-YI,YKp@8mBUc
#4(%jD(4mj+LAEZTTpEFMc%R@GUUmpEq,6E%3D5-B-j8MpPr-@&8B4Ej9C69E8p,
T066D$(HiN!!XE!8j9LjlJ26SU'8f!*(+6@b%YH!"`QZc[PiEkKS&([FTCp!jp0e
i-jbATcBTUm!bb1*Lm@F!m88jpkVPCq'FQb6444jRI@8dNUUXmMJlJ'J,(ETECb[
Lfclqd5HeN!"kpS(TdGqc%S@-V!iQSX`ii6AG2C!!bP[q0'PQmH@2K8rrL*PQS44
1B5h`)0p$Pbq%DmJfPEAUYjI&i,Y[J8#"qTZETRb6(YT-bD$*qVRNPdCPfFQeqbU
ZYaEr,e##+Ph0@)+mdd@-CY1M64*!HrfUY!'KeaN#`*!!8C(qpZX@MCfU9$h@J9H
SJ8bA@&1[G%*%F+0*ZKCmf`baUkJr('M0#%!Ch8UGiKC4Z,Y!1fP@3eA6MeUVqdb
Dedji3Z4QQF)ciFd-9D4FS(BISI!Z!bTPJZZ3!("Y2P6DVHC@38iFq31IZPUf2VR
pj!B6jT*'ANUd'ml8e9RVQ"k0``c)Z2d*kTAGLm,21P$X3FR!"Xe$2bYD#@4%%9[
,TET3EL"PF`b$%P4YCFFEkbI'1MR,&%GM-Q+fA4D$0'"p",B-D%SL!Pj!RhJ[McR
YqX`jfm#ajGLF%!B#,YJfD5NY6#QjlK)AA,QH0kbT6rRdZLCGi&9+&pFfXakXL(l
dJUre)[D3!1"-QlT+r'3'fTHIJ+P*c`&c2QYj-2iU`H'h!ZaQJm&rY,E6lm69j`C
0FN[$[QakJ2Sa5+(XIF`qk@CTD3l"!rSpkB&'f(*P`p6L+D93*$C3I"P$26F8Ye-
&Xmrdi9eZcc06%--!1'1-b658"lJ2,hJN![Z8fip6jV$Pd@Nc%N16RZQ*Dc2M$d9
X3FL!bGDA5DSC&#N5iHT#%UJ4-l3G1($hR`VqIkB#EbC,JC9lJ@&P8BhQ[,KKc,a
e!bZeX%e,rIYjqA#+Jr,p-G1"h3fCiM,!kV!QN!$h%iaNrf$!Mc9`V&96Yik#M#D
#Q"%R",ApXEA9@X+Kh*!!(EHP1[-#2l"(Ufc+)hl,REYZP6lXPB()E8QG-+[EcY'
([iHl(YJSlNbEhFYfl,h8$F(6[jB8-#&`F$G$,b`CK9C@1I&2JDAKS"URAF(JDN-
Khf4*l-4DH%DR%CR-0icBSNDd6khB8T)bDCEK*NhFfKGGCe%DT%eP"Xk@0@[29D+
ZCj9Aa&`N,6SC#-Nih)@j)h(XjHb('T14h&1I-2UDd)SSF13YK+J!&9HAjEDMN!"
-5P!Y-AP&$VhKZdqXlP6JNm66ZqAebah[rb[R'$XiRTD@#6[q*-51X@(FJ&5+CVh
jJfUkYk#4bZi9p0HLire*U3Rm9a![[J+"2QIfpjZ0*R,T@`Uc[4lQ8m%BV3-bG+Q
cT[)eB*+Gcm[DA3qM62%--+Q'APIf!M3hCf2R&m6XRXC3[UZ+aCE(`Zaq#N)LMkp
6L'*ZiTcBCJB![dHbGPfh$UX!fBPY11U`$TT%jZ*KA*(akpDk1TR0#02h4P9'a&Y
,ID8-Rrci8&"Y)R3M*8NMlrFHZFhMG)@ipQHaZ2'4YUX19jT[SFXTqEqcFC,22`l
ecP1$e"9C2'4piD-cH@*6Sf"DX0Lf2M831GE*@i[bl+bCl)T-T-[i-kflh*8Ch-0
KbdCAV2DY3"0*2@@TjLT2Z`j8Ud0NQA&"(SmQ`G`S6K[ZqD`XU,B)hP"$,CcL)2b
%r1Y*I-P2cjAVe&a9B$5!-!Yr&RkT"Lb02+b$h4FiK!+pPbbTm5rP#jMG08iIcT0
8ZeGY5A9dY5KeVSR53B60cm[X%@6#Qb[!Y3MR3#a26N*hjB%Q8YEASGLS+EB"IqC
+fE5E!eqLP*R*(HX+KDfF8&BEr8H#leK9pI`Z*K&hUXcp5M#DMbh)4,rp[p#Rd0f
8,qfQ+L%,m(!'Af@3!#B-[-G9B1qk`!e&"1CJe!*aDESdF1(`RJJ#Y-X(06MKU3D
Rf4hkfS$%5Q8,J8bHr4DiB@Nf[hXVj[mfQP"c32X0)LLRrae00pb@E2EA+0Hjq!%
F)UNjF)h&e[,$@Ck%A%A4U-DeCK"@!bJ#Y@D21NYGKVHbe9kcPE!j-l4a!lh3E8C
rqP[ricTbj4hN2h2IJGeQL$$2fc#SF)$0f1M14mp"GHUJ9`Q%3SPHpc59ep'p*D#
6@,f0fMTR+@LUdYmQ$k+j#3+-(TSA8VC,c)+YLJYElJhY0@'XGq-ZHlN*2$Y52dc
(0,+pS["2056hF%&lK30eEVIDbk`hL4TV6a1Kf*jrE-3i"RMXeVmM2m8rBS"0ZDm
8$P5*T(UIaN`6Ffk[A+j50Xe*4i35'DE+)Xmi[)ZTkb%GM,KmcrM'dh"S)m[@rbV
Eb`1SRpCHD*6la$++-h2EGJ0c!lQB$j@0@`CJjN(qEF4qp$kH4*eZ#N256(PTc0G
)"dK9rU2`ZY11k(k00aRe#MA`F5C(VJMY%,ie24a55S"LkT55e,K6J*K1S2S-E(Z
Tc5T,S@F&fD'8R$a5C+ZCT@IP1ADSD1h39GNJr4E[Vj2imV"3`(YJqCTSdUV4%J0
cAJXZfMJlP0a,eip3SL,EAK[N["#FlSfiKX+h-*!!(Z8`F4*Q+aH`QJSS4L9C)G@
%*+80jNCa-`T&NCJ$P*`MV%a4K%68qDjTjdleQ+L#$#U`e$!Dh+4DN!!%",VY*U)
rkI*d#Dm"'BCCZK9""QaGc+FN8ja53FKfQ2`[$F5Dfa(I9A'c,AlA"m@b,dc6Zbl
)5,0iBZc"Pm!4UPj%pqVQ&PKD$HRJcQ3feR,*)A@#mBL%k!-MYkh9!ZR8%c89p'D
S03TbUJ54%+*HEMTfBa*X8EiC5imq&-XKi%T6md%2c5hCS(m"j0SjHa+$1*S4j#Y
d0aCCh5@$6e`!1)Abr!'"3$k[1-["hS0+5+e99(L5"3ZHc(%pKKmPU4h2@4GM[Vp
3Y@RX,jCIH1ibQD`j*`cRh5V2E$Dh9I#8b)F%)Zkkb`HR4#I&118B4-i6J$LBXCe
QGM5e)BT"+Dj*J26ip)mTKLi&)IJZ$KVNZhFPeR`A2LSE30hU[4@6#$+VaP4!9'i
8khG80*6+qVZ#rR4UN!$pNK43#+I#-Vb+!Q8hIF(0Ga5"6Gl9J`I&(p2Y+P)paE$
T3qY*8i5mhIqpN`9*GFQ9EFDCqH+ldSBLNiNV"`*J0rB5J*64b"+kbhp1((K[+a9
HV)Xi1-KJPA1@IDZJSR#+LN`9!eeeQ+#8rYMY'Api3Ikm2"dXAjlM+KRQiSq%@(5
IJ!V2e14QFMV4fD+E4QTQTP9R(K$GGXfVAVL`m[NE&)1GU(&b$'`,24Lh1VMT0i8
$ik,34mP[AB*k@TbRUc5@B!0%@Dq&[,e`r!NJ3iN5j#`Y(F9H&ULb-3DkI5r3L1L
)ZP"$+P"bQ+b4L$i[pBLFML"1'E'%2mRA`M(9`5*J(f)j@U13!0&`jd2r64BY3F$
)"`E'GU91"Q8ldUbQ%"TZh4ICS@',l`0`+-$Q5)VHV1`MjU3Era&rmL2Tmf8bF%[
`1U!TBRm$#-F6SLJb@'m5*rU9hIG61CMpEPBir!SpSY*$lAp,jJqbM&Am[UVN$JQ
f4qm)er8X+aceFc2CDhC$GXICJ-*HR(D8jPfU3B1-GDjKCd#d"mcmH02,'Q@LdpL
j0"eeqMIQHFD!Ke!h0Baa'k%3lG)F4`+BNUGbrV[dehZQCqE*HbZ4lXTbC3j-(TN
UB&&!Jh(DY,*m'#h91bXQ,1kB4b,lmdBaQNV"KTqGb0L@dNh1hKH-E`18&!@ESN%
2'C&J5L0iTfE1@SQZk6`+qTJC&LX3'k&C!IU&jPKR8`-MbF9dU+(AXmZ)X,[,*h'
B3!fMG19K3T0E8IRcrdh#!T!!'!M#i0Q,2NYJh5Mr1Nl'*cl,D#qYTTT3k*T6J90
D&A2G@$f(+,8NA)6M&EIRN!$`*E5BEl2`hZTCe#[S1QG)4(8-8eJh#'f"%EJ%ReM
Ta"SfUXQp8+pfdhbF$Di95U*FLUeX$iFSLrL"[0qlT)"-%Tki6jJN!!2j%@HM#0H
ElK1CMA0I@92[&TkCj(-hPUik&mRcIll1NrHN'P$1$p845hm6qjbH3mqf-KicTp*
Pf@8BEc!i"ekdUFCT389rbdA"DQ!pN3ZZ2%`J)9([C&l`aX%FMH(5jJ*D4LRaiSB
5@M`-hZc4)D4N`akFRQe4qELI42R%"bTfIEj[r"Q&ar1e4h")V'(VKfT,-pj&krC
TV'eRL8"cS-K1dZdXkA'l+bS!XAa3LiTZ21cpqE%(YYRK9kd)i&IqR9Ml6-B$6UU
FIrUh1([lNhI6DVql"d86iV0e4,rFI[V401S%1*AJDfh&ZS3XG*!!PXfU0d"SSlP
&aKbd`83ahV`Z`j,HLN2JlBC&3eC*cYHB%h9194%TILjD&ckD*Im#AKCH9hSMS!E
Ki6jPjdD0YK0FP!3q'kCbbUBLZh&Xkj)C8jJ,S2e4YlpkFD2J#U*Rm@#XQJ5NkaS
L`+c-EJ`([0YapB&F+X8KQb`L-RH%$`0FG&f@`'@',3N45R(FGi144K*4rG4&"Ke
FSa)dm59(N5U1K`AN1rC8fR+e2*%qHKB+`6Be[qYimB*2#04*%q@3!&'D24M@5I8
Y,,[+RkNU*Rq$&e$2KM9mJ'DIiFF,N!!h`R3#YU+Dl+55+Z%ljhZ0K&IbM,QCr"`
eaQQh$GM,Uf8q'VS&8#c9E+LU@fUd,YX[EAeVj@$f)AY1-5Y8!(A5F-Q#6#Ui0[C
,I,bj%1!Y0Car5eliKf3i0"RmbQfYcP,[JHAiBRC11p)U*(+Z0'$*508(+ddDHF`
L+KAMdTVA`$1#4X0XKamDATD9$G)d+N0`f5RS+S4Ik2Ger&dS@NkRaUA2J1NFmZX
-EGRj!#m80i9Sr,KT,#&-je2QHM2JQ(50CdENr)a4,'*`c`1UP)PUVpPh#9D(!Cb
Tjd6Bc['GV(aqY%CPaqp!q8dmdSUekMBC*DacI&ErJq!18%YXCk5r2T!!*jbmb,d
913a$3(PRmS4@+hP+IU"L@'",8phdqmbCa,6PCc!!S"m1R5G298@iT-[b3k8Uk'p
peAX[V#KTqbNQ'H*qK$q5!8i2KE1TK98`p-8,D`XThIi$mqh&1A(ZA[iJ5'0`hjC
Ak8mY&644Vcm`,d*)R,QTrHrLLDErcVafTiMLpH'h3@k-6P9pChk3!29$,J10Ej'
Q([@EGqISc+XqKGNIp$"D1#C!83%'Z1$&G$AM)aQ5HiijS#)HQ-*AIUT#Dc'C%1f
!*)T8TGTS#Vmp(LpEL&fYeJh[eUlAcC!!8eErLKbkl")2G0jS$&URXZAjA5FMl1H
M@RKAdVGV[FGJ*Kc%k$aVhfk%PV&!Qf,J&(&KlFA&MCKebbXG`3,RQ[c#6r3l0V1
TjU"2k85(mbE""4lJc[r(lkcY-"G3ePi8)T4RQT68!%A69U@'ikIXRYFKUJP59I(
A[@2dflJeR*Rr@5iqSTj2@$pHhSG`iCHm%[A)aHQG)Afkl5#$AAE#l%M)ZcLc00[
`5rLi*P`Z"akjXR1r[LRPMf)A$)H29-Zla)Fi4%e%5M0"b'i&maa4(HLAi8DXT0d
#Gl`PC*I%9mRM"#EPG#X+A2Ce`q3&(V"'hrq-#jCml,DI55QIL'qk0XcaAjkX5YG
2PSk)UPLZ`ZF(M"lImSe#m!EP&SfDpa&h306P35@MM$TFq4JLJ8#c4m2K'9LccCS
F,GkLIIjBMcLi18@c@X'CXYEBemM#@5+N+1C8F%$Fk2l6UX1eRekFL[%*N5eYh)h
lJ+U*CGPEJbpSH5G9pFMGcJm)A2%Z*i#%5hT-,3@0U5UBFHdr8$T4d9qb+H'Ep-4
AJ+3BPYLj21,AEekEpTS"T8F6r*Gada,!@93`G9bb&'EEY'bRCG)(Zq4d@pq6!9q
aHR"Ij#kP[CeXR'VfQS&df,&@JhpGEj'Fj-)m3V)[k)hDC3bLiCcRP3CUe%UA&)b
D`V5RT"jL4MLp69+@R)*&6I0N+I'0JSS)*Jk+5+3VehC+X3a$5q4r,XLma$h-3M2
HA26QqXFB3DNU!*&LM!QD"BhUR+4V"qq21jd)DLaFcSC9[*L@5Cil[l6%a%61IFp
Bb@d0DhTl0Pm!6CD9dQ3AH9f2Qq59@JBrYZ3jGNPjP+kG#UmES6@5eqGVCIYf$Nb
iRK)`Zl4brB@4%aZaqbXEP06+DlZ+T5%m`5T6c"YX!SGG[0Y,88Qi0%FD[5[hA[Z
K!Kp#8bP1-cNTHU,%BH90"r$$03VMp!+C&Hb)dC9,S4"'`bHUA')mGIC1$*E3Ffm
QdPTRP#DXi,qGS`fd&hD"2MLBkeH`h0B@PTSf%9)P29QCKb#1&IErj+YFQ@r!,Gm
N1lP@k2%(E`bCNi8mph*aSPF%[(ZATlc09",ADXpEmIe[EAIXcT,E@H1c0qF!bP@
1qANCl,JPBeVHhMYMPK2#&@bcAlM5QT8!%"2mUZ-1Y'8J$%`GA@CVYLaaG#KYBdQ
im0Zpb6$JBq`,A)YN)HRFq-iKdNNDr-lme%l0YU0J&BKE!M"!`I[GH0e!b9(XJPF
(d-X%jHe`$b4fUQirUXj[2bK&AE-b8Cl9lk*1,dr#Hc%TGXZPX9F%&02qlB88XpE
@*2UTD#l<(c'Z4I'RQL,H@IVS+2p5[J!PTiNXl-)8-Gr(`&R6,-BVLbrSZ5aZ@
X`$j[5RQK1Mp&!FRfVdqliSKQm+M35rQ$U*Dl5@T,@ZS2mad2[Q'XeXR6cX0eiBp
&S[6'`d0$ENHf0qV$$C3D`5"le2-fB-SPCXDi[idEeG`ZJIG"Dh%IkSi[&b3bZFU
rB5i&a6+RZ6+GBCY,jiEM86L&YIVbim8&"E4epej[VEmGVeMMSh$X(NkeXEPY3bR
a0`B@8-0%JL5*a!VHL&JTqH`[*0XRlQ)pUhVYDcNFr4[M&#`pY3kX0[YLX*GE%,h
2j4A5A30RUZdRMi3"kMdQSl!fp##MHZ@CiCq#a56PpV1hq@arb'-Ub1@e@54T)h-
R*N#ZkFZ"0*A)9N8@iqPd1#J(4MA6BM5ZKh22#c(@K)QAb@H+"`@1I`)pIdk+RLQ
jI0I9aQ*BCdJScl(Kea"J#Xq8lJd!Hr'lme1Q0!6Gj1VU)T'#2%@fBPhD`@ki`l!
eZ5$Cd(&VJe1CLf6C&"m81X[MbeRTFjIef!SXTa[,P*NV$04$b,+X#X[EBe[M@p5
28!&(YS#GSd8JQMHXfCLSe[dX)k0lNEIGe`p"XBf*F+#@`pjqea)kC[+IMlFDmHp
01`di*6FNb3@ICQmG#J%4'8h(8ji5M9e1,d8P@1#3!'22aKXI[4KR@-R9K8DLdX(
$LrGTfkd9)IQ6KNkQ+3@Y$+KK*&NmbaC6lce%9hU!a55DD+d3D`9A`M-&'Je1F(q
5`GNI+(fKql8PZ`MhY*HQYmSMT-I"'iJQdeTBmE,QDMpp-qr"(LL0B()@!%cVjLT
SJ6arXK)Ua8q@N4P&BN&&SQEILV@3!*lb$&&1`lU"KElJ3"pf+*JBcf+PLNh#f2)
4mVS3N3PQX*Q3!"9q["Apkkb%K`b1ac"#i%Pj)'!+!@ZU+iVHZN6HI1U+6!MqrDF
S$ppR04L)cQd,CIfieHQkAd,XDi45b!@TMNA,%5%fL","e&EYEdVR+lM$T,&hfJb
BXb`&eRlfABpfe#TDHS,Q5f2*X*`8mXSB'!*fVDlrT)A'@pElQ[!c%b$C)jXk5Fh
pH,,bC+0Ee68CH-kPI-[4,[hjk1V5F15VJ+$BR(dQQiq3!+F9BbM%ki[FdCFNLEf
+cZleHr4Ah&M[[c#@8*R`*HV("bL5!B4ZaITX[F%3NB2F$d9QiV(JbrDLpRbE'0Y
0)Gf'@UH)J"q)DJQ8DU8BiXL5cMDMrb+!#"fcl$Mh4"6l&#q,%+h!3&9GI9f-,Ha
AkHKK+CG@V$)Z#f"%GhrGhqmpXGSFGZr(+i[D$i-&,i-mEN1kBrV'dXce#HDN3hV
f!H(3''*M)5HK"[10M!ZBTrYN#rI3P-'i,9SI#0bBBq+`NTS9B!hHYFa-E3GljY&
QffJ'Cij8iHXUG$R`VQ)[eGVSNp'3!!5!VdK`&kMpLVR-aL'TEMd8[&rlTY+U8X3
I[M,')c,HKmYpG*akq'I,"X"(cUb(G6Ef'jDFeM-N0EQY&D)kh%+D+LU4CbN3'%3
G94+,6$L-&ZHRR,4p3NZq!)49XCNJp6+Ti&F5!04J6ad,ajfNPA5)Xq1bPdE-)16
L!$S4k6+j1mhM"[`Xf!C$VeA'dBq9D1j$YR#Xea[-Jik9@XDLlCbrS0%#ZRYI6h$
Ta4%1@e5i[8,2fhPA"hfMhl2Gd,DT`GQMq2FY'3N8,'Xr`,K4Uph-aUFj$-&"8G4
D'%RdSEP6jB30eS*KZmSj-f9%Iq'TNh62FBE$BpHM$TDZI-#PN!3"!!"%!"#i)pU
VZ#2DU`!!!5J!!$Uf!*!$cJ!8Rim!!qmY!!!C2`#3"!m!3Np"Ae4ME&0SC@aXFbl
2J#jiE@`!!6Ff9%9B9%0A588"!2q3"!#3#S!!N!N"1J#3!cF!N!32!%,"e3Yp9Ii
)G@q1M&+eZVY+UcfdQBlbjJ*TIXpAm28Bq"(rbr9bq+0NK'C*Ni'aAdAGKmN8l!"
#`G82Y@aZ1`rdha9`9fYTim6JNY'qNmj+0Vl*J+I1)Hhri*Yrq@Ip1MP@,j-S`VF
LR9Tem31SREKcSfPH[U&9rGDk0*FI80-*$Q2cbR`CLB&J#[iJ@k@kiBTEKEI8&*'
j'L9Fb'#8'!Xf+iBpCB2[LT%N@ER%qQ90FY#+kIpHq)*i95#YZm@E&Le)fEae92#
QQ-cT*M'+&!bQVZA1Mm$$Ph[PH)CD$-aq#!P22I3!fYGB`,UN*lHiIQpLI#f`[N1
H4'6RD#,KR5VP`'r#&)hYG`5lXkUmNU3!IPV98d,FQB4*j2fVPSEL&Q6a`qT5FZ0
Q,DZ,H2R2mLR'aPN9`0HTe%cf,M"Cia98)PrV#idI%UpN83Fc'pcSXCZ$EeZea,-
CSU#`KbCrlGjqD&M96$KN@@+G8FCY992!AdSjNbil-98"@S@lrXT2+`*(b`Ep`"p
kaN4jd,i@SB+8D[M"pGELVBXp0R$JDDq-QH1GLUep0+EH'R-$A(-%6%S949&0@!`
Ce"@"8*(qTCG&CVU'@Kh8#$P29kbm#,'[2c5NQ%L#ZQ+p5cdap9iE`PKhm,BPjHa
D%RNbA18kh#Jc%-@Ia",5@il@5`Z)@IGI%N%Kq2qdAaHIVFBbGMEFja#!-KD#0JG
03P-%+AJ[UV4l`D*ZiArUcC*aYRmS(*Zj(feJ(Kc+ZYUEj9ZhH-cE!qjCqSVF+eq
ZXPMXI!)B9,IpidKmNJme%4qZG-P"L1P3j`H5!L(fT,q"hUDTrGc(bB,Uc&U5bLk
I+K6G#Kd1[6%qEPi&%N)Ql&fdENQPPa6V&[i`U,UQIYEeCi@jL&+Zajdr%Sk8*8i
NL0d"YJpGJ$$0[PLUC-UhL0(kHTd*3PL,3GCCAQ1e-[`dcdG,)mVqdPBN0ZNCZ0E
pMUfmVB9(%SX)dr-k-f2['fN3@8a"[rFENHcAi26[9i-aNB4Mi@H-qcl6XTSZhA'
-ee9[r#TjDeCV[BhEhDE5,CI"BEibVl#ca)(5c*Q0pIRqHfmc`XN[@&aTT%$qV+6
[%#dKF6DYbeL3!)8!R!#[U5J&NPq4rm(mcQlPVIi&9(+ZKKrLX5praRhS'r%Kdf+
h,'c+I&Zl$D1)2F5XFG2md%bS95FiH$[8($S@2J@hK)Y6!V+DmCZf'JBLKkL#cpe
60d$Jl4%GHplhZ)&l8&PM-AY@#J06UX6&B4VV*Fc8#%-RX13-0b9-cZ,%[J-S1d'
P$@Tp16(#0h@RifCZC5k+pkKE+5fljY&"f*K))'i$d)dM%RQ'L5V,jR4TMib8[lR
k-UEp5!*Q2U3#imcR4Zhi2%6GfJ$%PeqaMNQhV&62V["Y%P1$d"Z+@T!!E&i9kar
iq1TS"ZD!+PGX6B)$-jkEjHE3[c*P(bJr&$-)J%*r@YHRC!Teb0c"pPia-ShI`iL
6b2jZNHHSl!VK&J#e5P)0RINS5YpAVENU%pERFp3#+DNI%VIM6VGbpHKcaDBP-q2
BDm6M,#!C56kc+240m0f21U#&Uc,R1qIS!U$`i%!lGFeRF+FdD9e1Nl"aBd*G9jH
Bj*hDQ4#GhYIZ[C8ImdU$i428ZQQAkqZ#eJVGiLMQSh43%TLE1)IK$3FPMVaDcp!
)j+@3!)rkGdrT`m&*"'8@jEhV51Kr9P2--C!!VmeI$Yr5c2#Y4m+1bbUf,!`h'qZ
hrYjPFU`#*F1&%14+,aCljIkLAZk-C96k+UNjGI`bp8L#q,`d19J)#,CrGEQ(m8P
MM0E@d1eZCD8PU(0Y2mp6+$IR)%C901e*LakJjHRP!@4(JFJ%i(RNAFT"KMJia$X
XeY,l8V8r@IR('ZBYVEAVkha+1%9Q)V1aJc'U-2Xl&bCh1QC+)1H!98(-8S4lNbd
#16@QD-8,AbJj9mTdcH5ITLHA"llAfhJ%,LH"3AP&)K8Bc)$91Lmd,@Ef)4fb)k8
$P)DK'R23Tc52,29D%VaBi&,U+mPP!L@X4&hTT3jC4Cp0q2BI8!-0`B0q1icjhmJ
VJLPPH3MYSqrY&@NZmhXb`e1)pj2)DejlN[PpE5*JG'@P@fCqH5eQT2QNAh*)Zbj
90'Mq&#C'!mHC3)dHSQhIP[d3GP9,CG45LXPlG"aG4Jd8b4`iP%%RTNZm%@,H'Pm
E[32bL(HP9#T8qmV-%ET3"2,K*rP9%546%Aibk(!CSQG1SGG,c-9TEZSB9@,TSQ6
GaB8@DH`(`2E%IKKeBr&U5p1&dcBH#41)MdIIPSU#DNa`RZT#jB-%%[J*(qdVFX$
fSm#3!,$ajf!X0B'RaX(-8mjFD1%chlPQ#R!SVef[)`8)*H*p4XpH3E$PC9KUCGf
(K#G8Y#NVaC6iP`EK!G"ePLSrl)`L'P6rT9QL4pXC%Tc(4@'$BhYDRB[Gf5T'+$i
+h)fUM4I32G*,C16#V!a1fPN9%h86MTU"[-QYr2#+Fr4JVYH*Q@KVXL6pERXPmGh
5$'im'N8,Llkr2IEHUE%AUhm28-5i&MSqZZ8,qmC05pdqbbeJml6jU*298-f8#bY
NXSf1mZ-PQ18YAS%RD#U0rY`Se9K6JZQHc)`8rq[0%i"MJ4llc`eEXDVH8Z6mJ%h
#9k5BC(dc&Z&CQ"iYQP1MJ)853@UQII#SjpE4D+apPqL2%D#V,rN++rd`"94DZc2
(+j@4#p4`AKA[YN')(9[S"Uq$rdPHLXDiUU9L'9r8R(4F`9qiSb))2XaA2)M'"!J
3a#8BmSGEqUr(b`8&Y0F0NGUGcef+Sf1j!P2LdfJXA99l#Gq"A4[q,KFP*1PqKJM
THlJI4*AMa5D-'TK45"EGGjCQ8`@L)d4i##93&Ie8*rXJj94X)l5QpfcKmKepbeU
0Q4iZ0%*`&N%d9SS+)R(bmD%$fVZ1!+K@I@XL([`"%ab#%#Ea6q9Kjlbj4M*5)MI
GXPRZPh$3()*l%$m,faC2X#G3iRP9JeaK(%'PVAAiDef$hQ#dC+Ckj&Pa%4VScfM
6&VQr8PUC1SD6hL3$@FUUMmql[8V!@VT2BJal1XF8PVLK4cVGYM2h6q24Bihl$NI
aI%krCFbEQcB#(9aSLDeF*)cINa!*R3rEeb)mR1**M)eYEdh+rVdJ*SfchkhZBLe
dIaUmjUZNGr8DmrNG968mCIGHfd1fr%P`abNfP4ZqTh0[%`DjHD[fN!!0Dj+RJ8A
X0r+abdG26ck0j[4BUeII(a[QPX%62lebN!!F89&860hN$Ti"Xr2+1U(mlpZMM61
Sd#ACRXcfb)L@FAH40KJbL641m)lbP%(@)K$cmaYaNf44L#&%8U#EX@rUc&p1AF(
X'[6pPUY5Ai$9b"[[lU(DUDBp61Zl@,GEYBq8)p[#b!p&cGK968VB,8G-M-6)0VV
*6VbQj%f[1X3GM3d3,218JlhR3GSJ$eQL9ha5p+r&JAG!L0V+`@%9I[LR@R5ME'J
*@9XUrPC)8$C2m5B*cRF#6dQ#HS+,ZX!H)r$NDcA3E3j4"1FT'00,eh$YQ@LX8Ra
"U@`U+QPII[*Shjhl)K!BlY(`Jp)jfF&(b"NZf(#Z0A,j32V1Tmf`j"jH3$aa6CL
UCkH+Er#,fFp'F0)"NM8,IK%rHFkDr6"3Z"R)G'-S11rYTKV2U+&(39M!TYbGr@$
rJ*Lid%dH-@f%L2(6YPY4SX&NXXd5TY$km'+iaF45(S26[#&$8G$0mY1h$ci2%VS
eAJB-R)ZdR!Z6kB&e0jkACl0Y62Uf-hQ,G,GD(kRAmSNmPacZk2!3&KTr3&-"2("
)E)eceCiX3BZJ(T,"(b[)F'9mT9CNYUQJ`L9S(X'eU@#rp)lKRpT9q1#h#ZQK'-i
emrq&LEj1bFhddeK9LGPL4)8E&P!1GCqBXZHIV$8PXq0X')E+$LZm*hF*Y*d&1H%
`f[&NV+Zlq5$6RB(,Q+iBF'$SqphQ&2A1dEYY,8Z8T*LC8Ufl[fA"rIMpUh!IDB2
#f#cj$`jh9q)44fQD5AjQMkXr9rG#3+fpAqTp6L*8H)mSBr`,M0cRlpjG@2VI"R8
l0YT6!AXmiLcBYN@U5Nr#4e0N-9N(RL`lSfSP0TDLS+PZkr&r,Sk'"6Iqr#bB(0-
(JK8Z1f5fB5@acMp41ZCk*$6#2Db2f"9ITZlm9Q''Z4l9mGL)'Mmh)Ie`)T(fX2-
T9[1q4(e,f5&K(kpKf%,ahM`J,k0fQ5*`Dr")eGIfr,ecE`#EAV&c@9Q)b6ZYlXE
J[rVB$'4K"eZrf52Z)0m',DK$S3-a)+mMH$jTrMIQG`9eTL!BYE*PjN3I%6PmlhH
`AmaCGr#C`-Fka&c4#Nb-2A2U2[%QbHh""fi@B`1p)dU2b1Sm+kr6rM"ZGA"TqBL
d,JH@KCm9lP*K1pUAqd6"36aC1JUqGrl'DeZfLe6h")T5!Qf)0M088'QUrPd5k*S
[HB',[#DIDDXjPPeF8PTF9M`8T`)NqXD"VhBE9ddQjp2*jApH8p#-eqa@34,Yr(-
p%8MiZ$L'kQ3Lijq+fI8&%!R%'q9L"(KU-pm[D[N(Tjb-ifJLMm3-Lr,#SEaLl8$
E9qXea"i(&`Gj8qjY2'-[Ca)$dJl%6G)CCBd'-6K$4Eb*3h5!9!H22%@NXQR3aD4
@0@F5%&YU@6'JHbQrR)CVZR+!6q-rm8`-KF6'S5i-LlR*"5-A(J)lQYYphL%9ch'
S3fD9#0LTEX"q(9VcM2Bh9!AN5M-8Jej8QZ1XD,&LMR(R[4mj[C[Z1BHdr2`T"Uq
UB!9SA1UR%DLpU$*PiP0ZX```YXFj&lll3EAPliK`PV'U`[Qr%UNmP&3$aNrrM5q
CFd(q)PK*DLbaL8X6l"J9jY1m4+PTY%@X!0qL58``Sf@G#qURVe$D6Lm,Y3F)+r&
lh@@%[DX2E%BC'3(5'T6p35MK(Yq+"@4934N2%PC%YEQmLF)N#Fm6LXEA+6`[1ak
U'5H*C2Xe*iCf3T3-5+ZB(a88BB0r#j)SLCQ6ilYEe"#cUe2DkYpfb5[@Qm3R9`2
Pi'3-&I(@F-j',K3%4SpNdV'f@J%qCj5HP2(ki&J#154G6#c$58rBNE'A'ir(+!%
D2*YVZ3-pT14ZZE58p&b3!)KLi21$+TifiaD#HiVm(VUmYRB+ipHLjV30fTm64,8
42hX-mk,U6EHmHc,P)3GZPV2#$AJJ)6'fPrMHLjL1'Y$f"1q3!()CibdQEfV60qq
UR,k3!%Z5!50IJ-,(XM)#e1r8LZAb12SV1$1F[HqhEpLDb5LD6JA(S(rCJ-YLLBD
-355JeC1QKqUj%0[CJ%lilM9T[PcJU1*rU15VS3KbMd8Ui(++[4Fkqq"'V6Nqm*%
$B6G3FIGVl1[IPF4!TXpI*$&`0c(P[*[bXG,[QTUKjbA4jA1@IIb4`i(e`S@&A&T
lJ,`(5*5lmMLi'i@&Gq8KNbhkRC-dGj@&1rRNhr@bR%c(AFE!3Nf$0P$XcjeM+&0
Im%K"QCpP,Fm@K![*aJEBZ6%iK*)m58!*#ePT5F)k3DBI-l&*bc$CfZJA'fENSeL
4ecTJa4HE#"!&qGVlRPM8Q9F%PdmXAf4L3f$K6B@BMq0frIjc!L@-[,USjC&L8%E
CIjkQ(3KE4Ld%hel&qhhaJ"Z-'%U59fHHhH6*82UZDh5S9eNi9Z6)*)`"HUcE,*9
Ga*D`@3G#NfL8V-*@+&a*TTp-D#h%,U%*@lik`,%eQrSrGA,M'*[*@'j[,TVmMPZ
kX$#e!Ehp$*Jr2*UPcM#$8`%9Um&CELbXEr4e$j!!qrLP*0FEXXTNrke)'Ch-i#B
88K$bZ14J#M$X-3UU@1'mKl'd#SeIm6b'L44-YVDVB+"4,N,)IMmBpGdTd9Bb!&"
i"2)fUT!!0M,1'5KIdQi,Xm`0TIj&p+fcb)mmP@p(KcC321+c""A+[3XUELphXmX
Jqak[33LCFKJqbY*$3"")[*8!rGS[LmJA4#MdMfibjDGS5+JpYTa-I)2X-C5-Df4
*0*Lqr""(SqEVTMZXe$kd-T8fa#``l#%e3jd-`XKq#*FZ-V'FRAM4J14#@JQeIQU
N2Um!-A89qZTIlaXGaF2Nl[&-4AYd8jrHI9@ELKlp!fi6KBeC3P%1eRlqLSF-T$B
D-RPZR@K96qN8Q,V%$ZA0"j@Fp9@AX%4@,jadRVm@lTBq0E4fT!!*j"X%Vbl(%6K
6qq,k"GR4m$%04)Kc"HiAc'PMB4LM#NdAd%hXc6K$48VF1YjUp)-H*%BFVZfU'k5
PaRk4MaMrHjL,aVKGrNR`MQ*kjrMfC*(krH-5Pcpa+UJpHE(e--'maqra1'aKL'H
kHrc2dQ&P@#LiX,K1BNlfR4"%Y8(b3BbU(HSJ*HD!!QD(+Q'N5Y8lhdLUE#'H(&R
V(FkR(mP"F%rYp[61+ja4L4Q!'GNH4BNqJi30!6$F%aqI*fLeY&kdVJf*%p*RR1h
F,1&a-Z(0XR9d*PKU@e0XUGlA!R3PXlPf*%q&RT@(0R4*PdT+`aZF"f@1,FkH1KC
qm62V+I"X18M9%"1mE5C&c,6kT"Qp[hjpZEVm-,I(3ADfC-IH-q-%G#8V3CjG@C'
Y)k6#pG(RI03LFJ@J@%1@bdp1URBe`GMicj(@-[#2Z#DC3G@#55(Hj(YKiq6KB$c
#QB3&i6'D9F"B*6'E&IP+jQ9$dLcJ&3APLQf(V+,2XB"pM3lal&QGYZZXAR"D*E1
T'PLh'6Z#jY8NdHG[j('#X'83$aD8I4qK#)(QQ(pe!eQVk#`GSAl&h5kjPJc0fjM
A5ZIZ8Zm%"$@5''JCMdq0E@rDZ8Z4qrT3XAV+&'H$'@+%[TJr-Ye'-@Q4DZ1B-E+
TPQ2T!k&diPCGl%a60P3l@DGaj+VphhKi)Z4lX,aXXa3KE809,89q9-JNb9D@CHi
,-Z%`(G-Fd!6NZVJ"8a+2Y''pkHB+IL',m'EaRIQj5*45T6CiVaC934A(Nl8"dK,
'NR`a)E0@!Vrq`@ilT$IEehHd#@Q%*G2,QG"jG!iIHjI)LSRqGZqF!"f42pfl*Kj
eQ%GS6V#%YVf$I0H961GiEPBBSUV"i*Lf2%l`jI82`N*A+PM#D%kr3(XNHI59-Ne
6"G!fD45$49ccR,UBBN4SY!Ik@Smja)9e+cDe3J2(GP(HTBKi`B+m,hA*%b9Z+PK
GajBD2F-80,,VAA"k0bEm1kNlcqlAqX,e'lI4GeNb59I4SVNRKLZ45k*&QrDjR6j
0c1,Brq2MKK96)0C3K4"1Fh`IPJUX`ETf&j15q`!dddXGM3DhfdX$91k`%*fP!5H
)SQ[R%X1)c)G2a"Y8#AVMdqSLT)V'RR6dm4`SUeI1[m#XKIV$rbF#q2IHHq9fm2K
F3[Y##5#Q2!1p[@!Y-0h2@!--Kf8A9J&YL(peCRh9%fB#L6ES+BQLJ9QAS(0ZXqJ
',S1rJU5P#F$T2'LPGF$%EY,1f)ke(13I6C!!P9MUT,l)Di5mA`QXAIMpBk'VUeB
mB4!iQ*jF%MY4(YQrLU[1A$3MZB,XBHckI8&U"TQhRm6H[*!!C3%JPlL!K+lRC+-
UR3kAGFL*NVrdDMG))M*6!1EKmUh%Z"J'#0dL$pKJ0R&YDbh$`9KYd$V#a$lK%DD
B`J)+FSNHlqE8!Yh$*F"(AYHhJd23VAR6%($08lGYd[-KGJhhGjhhHi8BY&kpTdC
0#8Sq*lYQ!VMIfB%imi2CU-#BIbr1if8IUQq$Ad,i2C&D-(9f3jBXpINS'HEmVNT
%r!GHJNH1rdUJM5ma`SXiNU(*%(`RLIC%c(Trl(M2F5dbd88fXI6Pfc"K&ah&#VA
idc`l41Z,PX%LGJ$lYJll@*L&2Z6Chfd541RX$B24hU0JkF+ETj3laib098JDJ#Y
cjdeGZh5a,3)$8NDSJSf@rA$EU*lqh4%#XD0'iQV0fV+28%m'Z*iSNY19l1XL,[@
1f'&bRaBkSFDAqMT(C8'&,I[U!@PK`Jq#pI'**'-H[VkURQZci'V[2IK30fAI96$
!UlJD@ilf5mLQCYplY+QIidK`KKL$-N38`B8&k6*HJf`qZY!P6hh9A*IcTq6J'cI
0V,H#18LeGRP-)[H)i*B5ZGD3!*UVjJ-f@lPc)H@-Kh5QEkJ80SQJ(6c"4CZb,Vp
iY$bV4--q(C%j,B415BaLK,L!9qH$dQ0"%3iIUR#9"B3h-p3-5,L(D#5Tp*1"q*L
1*FkbV&$1+!"+UJ2qfH$[d)jc)qJ#Xji`jS1MURahAmKqZ)ASc0U$YbjH3m+Dp[+
T`m6M*G0ecdDHV1be,Kj6T2ALUbZ%q18r,r(pe2VKc+LHrqkc&5"%BIPQ0Qbl9-C
DJT')H)q!*3i,$G%d#[0USBZ3!2ML@`kb"qmjfV('H1VXQ`BcHFYSjVQQBj9deXY
Z4)@`Xfd%9K,l9ekbFMQ4Rf&%`N5R)35ZRIkJ2LmX3D(Rl05#,$+%AdZ0-Ud,Sr+
3!2h0jaN"QMrrPjHRd%eYP-V9Ib%c%JYM-$Hr%qc&Pe03T%ZTU0KbN5*2+3R25'9
+(ibd&)2`S29`2"X*NUBXLY(qhXlYImiMj"mdDD5@RpjDGSDSU*KjX@EA(+S3+ip
0NpQ'J6%4$Ib&aP$pPe8G!'3PA(jIaQ66$*aN8SY'!UXqq*61Urm1qTkp1i8H&%@
J'#Rcd`3QqL&M0,'Qp"a!Sm1CkMAL%0fHNN!*,"lpBU-GGATi,QpK(9i)G6EH`T1
@[3MM64[fFJrl"9TNFkLQ"BCLclU+EjHAfP[(ileC-2m@jM*ijGR0S-([3&0F&N#
PN!3"!!""!)#dSDNkYddlJJ!!)-S!!&KP!*!$cJ!4DHS!!H2N!!!G5J#3"!m!9'0
XBA"`E'9cBh*TF(3Zci!!!%#b68e3FN0A588"!2q3"!#3#S"`!*!'3X(8a&YX(BZ
$5%@ZT,mNCf6blr3R4K@-8X(N[0HfNDAiZV*-ap+QN9efYEGm!FG90KipU1L)Pd*
C6Xld!Lm6qF-2RE'qrTDBHN)AE"U@ZJ0kf%A0X,pbHiUQKSX#Q*%mb[GeKT3"5RT
Q62b*c4RbI$#eJq`"VjP(A+Y&K$l$bk3BZ34LMMX#CFcjE([,SrLqMIp'3i"#3-A
HUc%lX&b56Q-0L1R&AcGh9`D&GBdUUKCM@RKC-p4!rd`'@k5YdAq5Qb9iE5+8Ij!
!0GCdeI1ee8U+i5l%iTC8$'@fkTpi44U6XE189L8ZKBL80Hp(4U%q@49@cMF4h*C
T[)IRrl&800MZJVXNA1S+P0C"B2,bYSm#MPFaLLmP*6b,&e$BLV"!NchYAXRJ"F+
DHLc[)q5AQI&`2V5Z6P1dD19-!fJ48c*#jILEAqem8!hS24JYh'l`C$!i3LA*ca$
rNVj&Dq%#Y*K3eb$)@4'"YEjC@!qNb5YLTXNmRK-Pl9jeiLM6qEmE"29141@QPVh
+LKcIJ800f$CIV"R0rLdIUq#A6Trqh$KC(Gd(VfB`fP!!(cDhRApJNQb)qA3ZMTb
p!PYlJ$YIl43J9eHmVdrclTa4Vqh[k6d[hG-09RG0fIr[C,qH'Sp)k+mHf2r-"J5
3!)VU*I%[0@Qkq#BU-VFKmJS4lSk1FG,D518DY5phTS4l)RBa1%i+b!X$`hqJ[Lc
5QdM",BMlaE%@F[[#rdXNi&iX*5)lALUU'1$-$R5@!-e2*[2PTAAb'M56c-IT3Gi
Z(,*Ib03,VUea1X5+bR'UB')JKdB3#[F5N[D'5&B3`UGB+rC2h$(PLL@,pYXHi5T
d0'$Kf&CVCRp&RJIerKD@ck`$ecXfR0)i-*AQ1@MFZM@iARUJQ@2aq9XIV`&+K,'
+VZk'[6V&@`6kDD4Y9p)%cVdQ#Abd9TS9a,E5IYXB-FNAHM#qNj&Urp5S)RbIYdc
d%F*ia5G$[FFeSQ5@$,DNfC(fNGR(29a50UKJlh4A52MZiTHBF&NUr9C-%CB`ZfC
+*G"BmPU'Np""VE"Mlp-LfUF)ereP$8KNK-V945+$$YHib'9X`Pk"h'ZjCVB!V!d
hMfB8%,`#YQ5+Qpk##45I3a@l-Z@[8[+N#[%VH2PYT)f)#Alidb6MMH*52URH3pl
Re&*L)(-$K9PcaNr4dS88p%-*-J)aMD",DHSH89d-+HkB0ZbQmNl!#L2p+l"N6PU
XT+(XlV5'2PX0fT@1IUQ*e9R*r'0+Y),T50e[fmF8!)@mFCVE$SPflD1Y'ZEhlJ#
XKXJUiYL2R$XEcZMiC@301dCERNILXL$6G!(UHYSPVMkShdLeB'1a#pHI0`j'YI`
iR0f1#BDJ$fj#9B'a)kI8VYF)ifKLBb,Q3k8K*85e1V!TZ4*Vm*V!RP#cmRYeaVK
L*#'B1Tmb)[A-JI5a1%CpZ*M#Q8m$2@DkKC5XTRL5)NS-"fmikUEIl1$EXA0eHpJ
[Ueab#NSqGC5E`eUEB(r$!!fARjjhZ&1@md2%MmMAK"CPFVmCjTY&'-,d[1B0(i9
Fbr3*40'593!XEPVcm+XEUbTe!JVH')qRBpaFSrU92qa3J5Q+chDd9-m-&(5UrJe
a12(G$XK9klc)i+G-MH#G21f@AAr5l#BmM8mc%4(EYCTHhI&9HEY41b&VbY6d1+@
+q0#Jd8NC`DDF+RXS9pT#AR)U2,9-6drC[3p,)CMmJ93GI`4"`Tq$!!Uim'qAQ'5
LhabUMicV'h-@b!rJEbkf2I4-LbkFMKQE9!kG#pBmH-4"VA)f&S!lMSqm)Ik3!!*
b6D3+b4kKLp0M9U6+!6!,Vq0@LHK*"9A4M+)del,',[Y,Y*,AfZ!*L,b-+C-'JKh
3qqhQQh6-&pY[[@a0!bK#HBF!'kI,j8r-fmTP'lUi*B60B6h*1cKrmpM&(,qEiUq
cVD9H5QG',KLB'Uk,Kp!S*pHiT"M+%$2Q0ErZlr0'K[Ri,DiSf2pqhJTQ@i@!D-I
*Df&09%DXHH%!D1-8F9pAVSDqVTP@2XKZL9FZ&4c3hNXEmR82M(6DJpb45H6D#Y@
LGV@PrSE(k)"0*)m[53&GSX-hJ`VG'D3#XJ2@bQ4#1[XV3cL`H)Gr$AcUYrir,`A
e6Tl8X#G!$Y`YE5!kheTV&NG8"I3QLR-AUEh+Zqf+D%BUZTB@1k!3AR)`M65!lPj
#,2i6H5(6ep$BJMd)mq5UC@l5q'*3`-ISi13[#,aK*k56"3N8"Y4IXY(jJ#K#BX,
[4"qjRf"r!qHEcqpDNFRBmhiP#1RRMmN+L3*bc$Z8Y(Ca+&N@65!R$$Q)PRd`2UU
MB28&r''2,Hh#i(mf+&IH&*p'h"K+HZR1BC-`YXC1j8Bm*f2NKPjDeJ+'%1Y`+E5
kRZMD#'r(bGNPL5i2&6!S0`R5a6RIMR#"UGJYj3$r3l4,J46,CER`9iB,UI#@N!!
DrM4c2)9*BSCiBZ['PIl#i4$NQhcKh9M%N!!TS95#S183KK+Jkdmm)L!#6[BI5ES
0U"bLjJlm#@&fZELJ-54pTEM*C%[chPRerI&KT!DCjM9+Q(Tk'M2$r4NMd!2pMD*
Bf68QQ-#j#6*e%6)LS5Te9$$fV[dKZ""KL$ZeT@eqLS4cS&D++(9qfaH%%iJqK8f
CK6)`@mmrLcSJN!$dAd6e#p@b"RDBXk*Fd#lBLVEPTD*Q6HmqN!#R-QTl*LkZb-K
@jA,-N`&r'R#Ue84Rr)a9&1Z#q2AF69Z%rU'Lc5(!5*HK6GU8MFUM*D*Z-Df'K*6
bl-edI(`"*M2`Q0j'bJ9I-"q*rCCHkN-(h(P!cS!YNjBQ'GM2RYEBLQ9LkAPT9UC
CUYaJ9'j1!GC1@CF*Gc3VY3jDrXeIHEBZ4jNrVSUPERekfcYQa+@X'chd*8HJrR`
QI#YGNci%pcDef[`mL5e`E$8K+'@(!8e+b+8IeBpp!F@ZGcH%I,,!FU6eG%1QX@A
TfJXr6h[rYmRK@MNkK*EkR&)d&PKX&#IZAUU`R9r*F2`k&)R%INX&1!m69*I(bRr
)K4*$A@Jm"(Q"2Xhi[PHG&8(MG(#Gf!1%H)C`4%r3pDHN&GlM9Y&-bMlRrp@R*1!
'*5N%YBqpF,EU`i9TE((r,m&$Q@1M-`Pi!BH)mY-pe1[0T5hT[bj81f&UDEr@cAE
L`'LamGPb#jHSiCid%C@*-1fbk$*2Y`lTSJ-&V'+H+Eaq#)iQ-[YNFJ(EZDpNe1$
D&J2BS&lY+#d`pD#d[V!pM3eYKFD&-GjE1c$b5H#FKB$LYbE@,A'$l959)JP[L&B
Y!-I5ZqV,,2)3*!3fiUf14#)$-"E!Z3Lk#J!05VJKIITL6`1&fF'DIZ&XVcc+)N5
hc-m6m!Fe'"V$D&GlI,#$jmY3Bj%T*Xqrjb9&c%@alC0Y"V[pP-B$`05c5q21ihQ
#&+JC@jH[*)U(`#IHN5XPZhBiBFaZqkK8c1&Q-QCGBSR&9KjYV#D92`UA4d5R5,Q
@*kVb*8h+Ce%9DBj0+6I-rE(A2lAaICe4r0dIQ-U5Lp9h,+B4T`j-(0#Gk'Ck(L@
LVCT$V,k5jSpX&L`AD!bED9&ZE-"@ETF@G(X1Ac&Teep*kj6e&I[(fCJP!Ll)pi*
Nb,h6J18UaaLlPS,Gm[XPDG42Yk2LR8Zj*9)9+pLMrVI2j%k25BhR$Tkl2V4cG8a
%PFMF*`a(e,UIdbhlI#DLKjAHhVmXh9+NpML3!,[#@#!j-[f)38X2"1dp9j!!4XQ
M&Q'-'#qjMQp+&U6N5b&'b`kIB0FALjDDXrVFr@d`YTFZCqPQII-a5hIa#CRXa`r
R%&+&YPei!9pH+1[CdZ[NT0[!5BEJLHqPq0XfVD&+Yc1eh1N&Le)!r30qk#drfla
%S[Z`9k`Kq`SYh`J,"d&pY8&@2ZNAXE['VKNRECm+dRr"l8qDYkmE@-c'&1m)f`&
+Brmqp"BLh$GqFT'Vl1ij$PbNjfjFMK,E9YR[P1UIN8%GJ`Xa8ZG%4iVd4jcD+SV
"`CJb5H9f%FqMSDkde-0p*DAZmGb'&2qA5jcN!YY*p'"mp6Qhm"[a`Rd)"K$16EI
eSL&Iq[*FKEH`q"8mZK0*U*i(dPk2`lhB"ACXSaq0@E[GLN49%3bjC"!MY3K![,S
*`0(R(U)S!'N[lmmPMQ9[*Q6*!M1HhpP&rX2c4L"CCAe9$Bj,CXr&R`$e)!dQic#
$[FXeR-*qR"Cr1a3N'#J[R)8SI01&DP%k&afpMhJFclFhdP$FPchhZ!iG6#h$ecB
Fb$(p8d-UHp[rJAq(JIQB-+Nk1MP4*kH4rYG(V1fQC4eAl`"dM#MbcfGXL3T8"fF
cGp)1Qq`VJc[+*$S1YH(Bmd*YJXmUPhp'!H#!S4I&mAVlIG3Kf-26(4$+riK")rX
iID6A`&mBp$YT*ICQ8BbM0,MqemL-&DNY,XfMA6rGia2iZmUS*e[6d*kPer"rHY)
-kPQbXbbPJqCd%N1P-bVVYZYjCXb(RR(Y2rV)&Yd3ZC81L#2G$"llC@+meT5(X#b
XD)85bBq216R3L&pLh"amQiCEk[q('Lq+IpH#Ep@Jh!C6lKm)IYq'@G6XYk89#9U
DV2TRLGlRj*jF8&,DqGZYSkQV14eL#e@H&+0rU-DMYih#8J6"`@YD0@B6q[[e8lk
U+Gf%Z#PL4$cK%pZS8UB!A)dRjrY'fBLjZV`pPi$@B6N9$IJL3IQr5XA`e+2kKA*
@$6[HHXQZ1((pD,SdlHdF8!#HGFa4mYrFkie'k[b"R[qe[hLG,p`QGXPMiFZqH*9
ScXQj(8jDq+$ASH$N"a`'U'bJ*d01`e2Bk8`dNhmULK`QIpZr&i$LRd,h314Q8kL
2E1ijhEm6aD%h(%Vc0i,dBf"630Q-ZiYaUARLb2RaIq"&qQqbT0@AKZrqHHICA#r
+'C*GZ@a`)DbmGHAa0i@[lYffGY*S-K,QlTPdXBqble6D!5,8A!8$PiJ$@e(e#"Y
HUSa#A+U+F'6&61+D4Kdk1$VJac*'eqP&TpIJ*AF5%Umeq)EZ)&dpGkQHHhh0-MF
(T@f0C6dJ'm0ISN'Fjf`k!cN'4%D2%eScB1r@a`VC3(QQX9BX8k5FfFD"`S&p@'[
6TGXc*mQCSFpr[&0FflDRi#aKHfia-(60CLC&S9(eXq(N)m,&Gb!Z!EdZ12p9!(r
LaZkJ#Z#0YmBIckc55q$SHdN1pNm"YVJ$*#U(h`k)bE$DU$63T'%*!%d@ILQj8%8
Z,2X$'h,Bd%RHb2ZQqGHVTS3#hj!!*K@FY94XaKF+0e1XMZZqka2,'KlTZf*jih4
K3p2Pp1`#NDm0f)5pVKecB45Q*ef&EP[K*p5YX*[)h6BAPGp%le"#F&D(P8,3'YT
P&bRNGUqUjll0&,[MJ,pQhTQe[GI*U"KlhC*+41kER%0k3,G)ARPDb6iFL,iC8qp
)ej@[S"lL@UCcDjmT4Y5I@q9,3bEQNCK"$ib4k03TUkq-N!$SAF2`A1l9HkA"mSa
*DrIKX(Z3!'2e'FXLBY,JQ&,Tbj'&-E2Z3RaB)jS4qhfN&f,8CMM@FaZ"9)UeSUX
89Eq"cVdU,[Kj[+2GdU'-cZ4PeZf8"$k[Q6L@fd5hpLV`Q4-I1qMi)lr0EjF@3dj
F&G5c[r*,f&4ZqH$8%$mVZmp5aTaH")Dk'IYSL%2BPlb6(!NZD3F#%(jbp(Sa+cl
DUF2YM,ZE0G6)dE52Cc[Ak%Pec!UMHb0TR#YVfV9%6Eb*&@H6)qNTf)9"D6Ekm1J
(+ClQZ3TbMbE64qQVbkJd)i$h3c'Uj[BM(X33h3`68ASfA`I@@4jYGRCR$CQe!f@
XRPl,6RMa5h@kP-V1c['ECiiEq+Z+d1EYQ3bJ+YPX%Ir$",qTK-('K**9ZZ!Le3!
GFYSH$q,UK6JTJKH$dc9Rp23(HAqFp1Rh%!EV#!LR&3!,[arMT0V,iYK`TB5ZF6e
N4@haI,UX"SG$e$Tm4Yl,i@bk28D`K`cAYpd11J6G,,!2J1iM,@8I`hX9T,,XJ0R
R*eA+fUa6"+U[c9HiEpqHk`HNkhI'QYSj[HD'@Ajf6[Mf&R-!el)F+rfeZT*F+f"
dE0iSU9@%IQ+%D-36(R(H(MdlJDE#eErhfS#($!F'[-@AQKZC-L4f6RZTk3*YQR@
GP#$0ZbV%P1Ullqb,K!4V)+BadTa5La'KZN@j6@B@@EE6XX1e'mX'1@89J8K$J@1
'Tp)Ud0he&-S$PK$CB)4dVISR&apED2KDQqM!d2Tc#8p%mK1Fh!&,,T%P*''m*AH
,e6,kH4i,VNT+3hi5&qk`dSZS8G%HKB6QVCY0XjkK"PNr0ePkNJaDVUe4THZ-q[K
F+LG@Q"3D8GDMZE2KQG8IJ*!!@@#jEfXrjf%A2MLmQGdCH(Yf)T[M5Urb+dZFGJ$
CrirQ293T@VBDm)-b@AFGrIpC'$a9d@%+`4(EAp-*6aHHHc+3!)Ymq2I))(UUMHa
!)8p3[EqB%HP@mGD+&q[)CiC',CKSfIcm'H95*6kKQr1idKUNjE8+U8ZL8H!qCZN
,HBf5'")j%aP(,62V0Z![SZSAqk$dh&BNj89YUKMFPmKNf0rmN!""2hKKEbH13-L
h!*a4I5$Xh00"+Cb3!+"KKXaaGdP5fSX@p-KiGPXiXKi,(L-%SSrfA4J!FVS$96*
b5XQ+2[66[hGm'T!!b+51i-KC$lV$$)9'KXAdZ[+pHF#MmE`T!jcAQ([I'%V3Gr`
C[',ISaiBDF0RT%SjMjqlj'ZQ+9T4K3EM-k`AH%3(2`JGPY-)(FiY%GTkZPVA!fP
M9I[!a3@l6"C+0'S!!8Q%TF+MrNTJY9aL!%"5J5@iCBbchfL4&9e8mHd*RTl2@5E
RbK8T#JZC'!d`#bF,m8iX64fcX'*SaXh"q1jSfa,2(b9(#"Lb)MHTmrK6V%[cNBC
5m9!JQYFfaC1Hd63jdBbEFfafG!#eC@RViS2ZGrL%M5"'b"kF5I@)2ArFe`NJl!p
+YG2S(+"f+(KQMeL"q@bBNe0@p$fSa1TSqYdrN!#(',kH[YHh59I)c)T0#T1I4PN
ePA4Q0Nfde6DYV4CpqdJl%hG%iG-)C5l8(i8'GP$KX8YkJ*)Kj6@6F'`9JMNq+cQ
-f3mPRfpKPdVU6HQK`$jIc9VTrDGf+MNEmd5RrNR`Ld#MPVTLl9jY0%5B"q,YR(`
-+U3*)VbjGpeEM,[q2K+Q6Ph`0-5cQ1q-Q"!KdABcUliN,CKYR51#@!kQXQ*kPF`
DI+bUVT@'ARd`a@BYE'UG)-h2!q@DAS!3$-8hA-*cqEE!20H9CQSN&a!Mh-[)q!P
98KdRMjJ%0eMVQP!%FAfE0S1iUJ9RV+SiF[6,ee3R3DDh&K+M`l9pe6!MH!6PI@D
8ijfFM21e!G5HYFCa"%H%hH,CAceFe[AMUiJT+6HHj-9,TlIm[VmS"kJKp-9VjqS
*Kim5mRpJ3M1#B9NXL+kN5jRCY0jjqN6U(6+TFT&8j'[341Y2)NVIB-A(DJG@+Ur
EP@[p2NY2Yq+0A'IMYR5d8mI*dfM66c($iTASbJ'I@1E"2jih+V(X!![DY#8J94A
@'l&9R#fMVi3S53V#5i`d&FL@rNMqVjHN*QkK)BZEZ@N4'k&aeSc[JYB6[XC6A2C
AX$q526M6,K"qK8YK`2'80hkPlp6+1XT+FpS1HMc+IT@$XU[[ZRldpIh+*Z!efVA
5a@C%Gr"(Kk80Ykj)mE4QQpJmQ1"k2dZUFFfZUAr@QLkr2P**6`ck1IT*H9De-r&
3H8D1Ub(!m9)E34Ka(*4&!h%(IIIELDRZ-i6r%F1IcJARlj@5p%*,J2)JFaUJ6XJ
!GDk-E5,@Z4eTD'3e9GMSZ9CrYLS&K9"'NFf69)AhGU"SpDTlEIC[rE(ai)6d5eI
B%8$mGBBPX9)f6P$pEDL-E"$L'bN#&DSUNh[R'Yk5N!$mPCrF3Yc3HhQ%CaGfA@J
%SXH2Sfr-cc"kjMeT3V!40-CX$NXjR3R)bkKQmTA3+rE&6HRT04%kJLJ!("R#TkH
4)eEXb4jd49'4&4*m5c)d5diI5HlcDl%aQBcENkU)"Ip[VC`[@AAV4FSN3jjhAF+
rFBJefaRA3D%Hl)F$kb3dZr"AmNDbHA*$RSlppT-k!9-(38APUEUm*UI80rGFhIr
XG'VUVmce&fU%kP@*268,,JmYUkLHV+b3!1$V923%kGYp[mMHHAV)%Qc`&ejQeHQ
CT!DlSI'4EG1D+9cFSc8p8cBaM9SM-PKHYFdk5i8)(al015UI!GF@H2`LXV9l+hR
d0cjb"P@0[M'P8ZmmPR`E*R3$)@INar0C"!hC3Li6c)VaSGZe#l*jL'$d0Kh9b'r
bj@[@$,b2jBFQCm6#l)[)NiCYC,cae,[khA+80I@P0*a%mU*-P&`J(2Pe3fq6(NH
UB8XD5f+E+#6ZDGl'$2IVL@h+N!"Pm%eRE8U)cH3eTjNi8r8mC1"$3h8i!ADir%r
@[G5*mp&1550p6+TFJAi`Nf%1a!bZXk[pCGq"0!"eE!QCpdJA4'rXmXHY64Za"GA
2B%%GacV`Q1jLZQ!(eS'QQP,Ue'%hki`9UR5jRG11AJh$ZMbPBm'h`"4m!iVd#JK
QRdmrl#35`ML9R*GSM(X6+UJhfEmVEhE(fUZ)$b83FYFlq#TJArR!&Z[$I[[%$&4
-)H+IZRc[m$c+*5VMGiae`Y0T*MmNPJ--9HC!@@!U`hIA"Z'*)!mLQ30U@qVHI1-
irlGFb[d4BYJ2#qJlb8%DYM&bUK-Eq1U+R,!6(jhNl2Dk``8`)A6Zce[SZL!#3Ca
B(f"(ZF6[D9pTNTF[8MVjXI"kS"1C4r,9p3QJEcQM"NB9BRrJ[+p[Gem'pGjYfhA
i6YA`j[%FpF$A0!ii[6)Q'9JP2U,UiH#lP&`&,KNC42pdVqZMC13R'+Jj!1MkK%&
d2jGYf6HUJ%FcRILVZSXLM+4`JK6+pFj+ZbEEcYZ`Vif$![T)mEM[#`5B#AAhd,M
j+DjZ`)CPC[S0j3iGU,"2Cj-Sm5Y6LkQ`amqPVlS&!pG*9T`&h!U&NCCA$4K4KhH
@NX29bXkJSE3mbGfU&Y2e8305N!"&j'M$5RadSm%DV2LM8RaD9mk-0"DP'%h6SQf
ki["G1TG#Uc#&#!pBe,prG"jJbd[`,bTCp%eped-UQHh$,,&*Q1p@jJe6"J&5e%R
"4&4ilf0)(a$`DFMd9`fLb5dfZl1IUTX'6"9e@$KMpkS,YJB6adZ"%h`*[LJR4+`
&AAh`6)i-XmMZdPR%PdAZjUCQ#'#FZM`i-#Q["D--Y#pibN,(00J0$4PcX9YIL5l
)i5k'pAa2,c-k55$TVTAkc9&CmkHeLad0GmfS5@P$LNFRfIkql+rqZZiK4GdKS3a
ZGTIJ)IUL84lbMHjQU'I+FD#,qM2eH0mIrmNL%*9iSRCRURa0X4$kj63N#H5[cpq
,TCmiX4$!Um!BHhB)8Hj%&f#(31AF-%""c!M6NRhLKaZSCcYq#PkaEm"3E!M@kMA
rR(!%@2DM9ZZeDVR60rp"fE46q+X,qeNMEN[@DP`![lhR)EHI4K)Ylq$D#1AJLID
EC+Bc$C!!GH"5Sba3($Ck,8j4[K5NQ,6`1SKki))dGYBU!82k1(9TRFpD"XI$!)J
5h(YG-9I59+`U0C(!-!V6IVBi#5plX6,F#ZJHZCY4bjk969Z[5m2,feeAQL5MNip
IB$eeF%a%09k(MiQhiBmqYNjqjc1T%2lhcCEIXA)3je1b0*`!D%*!SI3,NaiESEj
G(PbX81SGTAAKq6cR*ENBl*I4`C*FBfP[Xa299N(HVM%2HCI5Z1k**""CBPUA0a9
6D3!)R+DYS,YH+pU`[N6kHV$rbUCYhqlc*93&+5Z`F8#cYYc-D9r1%l-FY#aHAfl
GU4,TLQ6!b(j*KS(B"D(Si(926LqE8MfQ[Ql$$i@j`&'&8bU`4)0#LElHSHS2QR*
KU"[VaGHAB)(ZlXmH)Rk$,&BIbLTeE,-+il,rXdcYMU)!&Ta2[A4(QU,PATFkQ8h
3K4KhI4-f8(2S$$l53eXXBq0X`NA4K26frJK-Eq#"3YX,A40FRBiJ8$`JS%(Gl,*
CFbfl)D[BMKT`I3'2m$+(FCViF@&h!)83TC!%!3!!43!3Z#2DSEJMfU%!!$Uf!!"
[HJ#3!mi!&Ab"!!+N@`!!&U`!N!32!&4ME'&`F'aPFf0bDA"d,Xq!,RKYE!!!Fm&
849K83eG*43%!rj!%!*!+J!#3"d,"e1,,,[4c1[kGP(l3CH2J[q1L`A0AZ$9CE,#
R[UmT+,(r18[&%a"P%)!$6c69(Z(K%BL4mb(fq%,`eBFPQXC,P3SM-fbZ3@L5#Ir
(IarMAb2EDf%%bddK@8Ce$CB[$Q6r'%1qUa1-80!c8LQR&D94cq"*I5jaLaBEB%L
e2H3LG8,Gi!SMBpK8AI8CK$4U3%(iTJQ$+61E8ZF",TrZH[pVMZp[G[L-'e1H@$&
2Ak2%Ar55l2Qcl*I`[V6)9$2`TEj"KdPBa"h9bRb4d`JMb-2NXU%KJS&r9N8fB94
hli%5FpfTdFc,D2bEl8)%1!e206-C[i*%9KT,PbYl1'Zd0ZhEc(Ee+T0KGbhIceC
0LBF)N!$Za!mUZeB5Z"m-[@fEimm)SH@I'#iKV$Z2HD@rYLh)`0J`r8f85eYbQii
-Z!kJdeU"N8P6)8-2CZ$F['XkjiU0Ri)*26-@YqZ0MfMJ%9SI[!#0bHrT8GCVP9'
kJ5C[+C00#LKGZG[TBKN24L@R4AEJ@BGJ+4+`m1Z$V!YD1BQK44QX(%*Bia[i"PP
KYh%VM8KXr4'[*NF5Zb6"D98d53Db&pD[I'ICcpcK2+)h"rLM"UH%h3QdTdIK!F6
Z'L6'cBFYIXaEA`2Ep5lXh2@r"P@LKhrJXRQdU5efMeV0JK-Iki&QhG2QXdJ3@K'
j-apI4!&53F0eZ)bl1bAdSjI@p4,LIGf40YQK'%41NHaQ'&pMNp6ZI32QBS#PH%m
N%rZ4a0hFN!#U(bIhZ0%2j&!QHhK0BR4++6V0aaF(q!rH",UD*$k!3G'iMbd#,PB
+PDPdM[0rYbfV@Jl#JX,rV[V'3Cp!pH@9SkX0FA6SaMRi&9J&Lrj&Bj9aM*9e!l9
!RiZ!m&YD2EFMST%3@M-KRi0"NPKJYfeaBpmEN4U+)SRk-Y0+!JUErp#S1NSMD3e
a!I!kQ3U$YQAX@fL0j1C0JmQ9bc8I&%'ZbJ!+GQT#@E6BQY2*VPpKPrr+R991hf0
fB'i&4A[C`6iT$0)U066U`@d(b4IHc%2$pGcU-L'Y"VqhMAQ8jRaeY$Y$dJJ9+LJ
R!K`K6mKSL5EkI[eB-i$X6!j)MJhe8ep5KQII9"TCI&qMQ4BRp"H,lmb`hK!ilES
5-#qN+M#KUNSAQE5-!9"YTRiK4ZAqqA18HB4Yq'h`P2P6)G%I3X!5DDXlZ'+YA4Q
G*'"Flkf*[-N1!$Zm4bCRj+8Z$NJFTcjI+c3am+m$3ThlEi@"4[I3P,er[H"!a90
*fLF[A`XeFM3V5J,1qbZNaX'l,ScmF`ALZ6p2jZ'3!"*YD6T!#F'H%f3Z[r&jHb%
r8BT'P8`Gf&",`6%*pqlc#cHedljTpaahE$@2V'@EI&AFk8B"HUb6'[6c6X[4pT8
Qr8q[9ipS$(Q+h`3,c+NrX[413(em+SbLPBq`RQi*lY9f8m+'R`SHh0X%Dr%Jh"D
ST4AMSF)R[XERYde["h9`hfLb)C0QM*Pc5HC18Ji9'20%)PIrG"!99aaaTjVq[K%
mMY)Z'mcXrS3Z$l0UIhdL)+J5J+!`hSa[r`MPcq55*"1Ga@PScIiPXjJJ80f2`U(
c%i!kFN*$3F*'`KS*SE6h"[`#-AEIM2BM%BhGPcB!iX-c81*pN36U4Y!-e40Icl(
q2RrJG8$B1D3S!h*2FP$cAk&6%@0*%&jeS08hDpA0ePD65[Hqa)M'V+ha!V#*+k$
jm,[S!dbL@ekj,)3XXNFfHLP-@N0"KZceKh,Ce(jaGUa%+e))hEa-KJ#66KQB"h#
Zr#+NSjVLaeU5,8C0r2TBX2YU$@hZeN$kNT2pE6,&)lAej*GA69kK0pJ0BfJBYbk
%da8``L`-*&i1hF2hDiNLQVRl%(46LB2l%-UINKZ'%BhHAA03YQKUT6afNB"Zk#P
Td'TmjIT#`k*mp`@XEhXN`(E)bL3FTX9MF01`RA0iVJ"1m6LkA"QYlaD@62+9r#Q
JC`6P)5SEG9ZQ,l3pf23`N6U6[1i(-P%2KQ(KAPUFd)Gf*"fMk4B5F@KCf0p52MF
dZMR2TD25'h%DHK'YNAlL'(30SfCP8NDCi6PG$kPK5r1RG"[p2Y*4EVHfJKeIepE
E-,K6A)aF0J$d@h8k0)+1'X$5a0IXkeId`)S,BrIQ[T8ik3k"URFBkVa88)'80MT
KSZ0*4$kqB-Nd3aPMa34j%+pZ3$TY3bDk&ZG(0mIl[A'b3!(midmGFfVLPZfeJ1)
T)5m8pVRLI,bqhK[m&6TqMm@2acE$UlAE05eI*"5cUMhFLf6k1JBMMR#4PX!9J1G
bSeHS&"-6YB)33e2ja1f@9A%[*@83%D!#UkGc0&)$`h5q0Uef9A[QfG,2!bIc4(@
-hh&`&i%#0H6K*q%3BjZ-cHZcfI'V@PdH"db*Y280fr'#)bZ%*bd0"hGp"*FLR+"
$rZFQR'%T!-EIiE3YKAU(@&lB0l9Yi*e2(UI`*qC0&`f8KGE1m6Q,rfkZX#*-KE2
Z5%NQpdUT$J!G*[j%'#'NL(JE[VSIcVc,9Q[bNbA!%@)"8&P@F`c#9HHk49#M&aF
3S@G"K6pj$T1eUrEYH"m5U(%'9d")KhP2N!$fY$pCPKqJdR9`Q9Vlfje4`PQ94b4
-cZM44pU)G+(ZK'@cVQ9cS#@*caPhmG(@HR&N[q1[ak,9Ck9+Aj6E1+P#%,THLDU
N'+C9GpcJLS,jjhF*ZB2EU5C,Bk,B[cU5jI*Q80(p8Vr4E&CXRBI#XNl`6EFGXjL
!"dIPXi6e2T-jPAKEh#AFPPpFpX,DaMrq![Q6-f!&d5V$cDMQNQpHPlfY3"'0M)f
Z6A[kLp(*HX$Lf3YDV,iY@cRIiMGSplCh%3`VAMR*PcQaS1*Z8)pe(!q4e5*-Er0
mNCZ*4)f9SNm2`HfZkjb8-5AJa-cr@4T5eYZDS4NciT!!5$+qfCbUHBcm!9ClFd(
pEqDQV%2dPXM"HhQVfHB8bG'NH*8TK0[aSVm$"%`EaAb#YN948F&iQH8@##3BA)3
$Uq8IiS!3'k*FG'cEAd#p@jjkp5Ba+GT5`Z%rb$!1frGBqP5cG[J"P#'i!cJ'LV#
IIPp(ZTQcFi)eUZ'F*a1RbjSrbTSaKN8L!iIrGb5ab8(m9*4Rk9JD3(RS8(B2Qp%
3C"bZkBB'FrE)(Ym!F4B#jU@af91CNEGJU`a3EMA`6`0Ze2lMN!!XcYGi2Uc+L%0
"$'++&GjD!)eCNSXkQ`j&!Hddpi8+KThBI"HaD@[#46J*8CCZlFQRC!cQ2VXA3F9
2dN)kD,cFcUB8,#-E!QTdk)`$,Mbm4H(@CS"PJke3QF00VZNA4b,mFG13!$)AYI$
'(AjAach+,RTXPG3NPf5fZcJeIp9-1LKa3IeUh1c4GNND`h"-dfd`4f,J0f8qKTC
Z%AJkrPSk(L9l+4mL"p3bBj!!6,2D9@Lh6dU*JfhH&lb*PYX%&JI%qCGYp5ZkS@p
cl50m&NGV$PhA4J34GeYFd0jDL-Up"'3K@P%fNa,lHh$4@eVBLI-R(CT!8f*i31Z
`YrCkQ1pISe(N2UpbYqE0fQr&PG`$RlXC$hdF!R,Xm5D9iIV@@Z'(rPZS(G"Y$V*
43$1G"R(428eBPV0!A!41DVHTJK1aeFIr3chJN!!Z!$Tp56e''R1JFcdJG)'lkDX
('1BlCqM'KKfF4[M3T0Al%RDTV3UaE'[F`%CG,Y5h4HdN[%q[r'8"SacGBRF-c!l
YEUDebP+,D#Jf'+'Rlk%D+m1Vc9e&`@AHU6'AAG%cSG9!HIe*DDF@idi3q*pcGEa
FLeYNVcYb$h9p$K!@[Z9l43-Tr5U9CbC3LXdafT`45-p*[plR+l-q(NE,XpUK9T'
E%emjcC5Xq)(Xl1A[$G16'8mQ4X&TmXfmm48L@A2F`Lf8$*m3qj43ZZcV,KqX&AG
P0*hHc3%KHSIXXNB8V@[6f9rKaRV$El8*i9AP+K2pJDcBa4U`U,Hr%K4ihcT-#3-
kJF#CQ2rc!M*N"NNNrGQX$aXl-iGhVG)U&LM4HYCf*Y8%JD*h$)[-9,pcZ8,LZ2I
XC4,9)YV,VA-$P&f0UaH')**XVMKZ10&cKjhch8ddm5lEPqk+S[4+F4&C[iR(Qif
8IeCTr5+[hKB8ZalG$PdMl*M+"A@!X@03G,q!EqU-RmD#F`jXq)[c)6()CX+ZXNi
r*mm3-ci`JZd`pIH1rBd0&m1m6hjb`1E$1A`Qc`l!j1K@(5[#,E'!kG+c`CGY@0Q
BfrS@j5DL4imCKmDS"HifQYbVKIES)DFXb5"4NbiNTX&DmCmc(5,3@03+3)f%JJ+
6+6XRerSN3(AdD`%"Db8mZr!$d"k!YI*PrQF%IBj[r*[+AYJ-(U&G-eC0TH*Nlm[
[eXU,b(B3RVa[#E(r-QVhi,B3Ic-f@DkimHdJep4b'+im[c'Dl$''8A2AT51i'J@
fPXIDQ)[U9B9m,8j1rLr0ePfeKR0'$$FT'TdYHJrqB(MFHH8dBiRK*A35+lCA+pL
i%rkmEGUlBZ"GX#"RqB6hXi5LeAQpR*LhbESe,84XeCZ+(c0IV[aUEF&I"PbRalQ
pD8$5YqIF9H`,VbF)aQr!Rbp*Ql@BE[idIG0ql6lDE'XmQ)*rYFQZPTj4X)"h1RF
aE[MS,EmM%,c*kdbdD5jIUkb5TYHFf$Yii[q"bSJrBd3Y`CYRmH4#V()3ef%eF4k
@5@pX-#3QqUqmqK&%XqX-Y(G&IaR'Q0R1"JGSI0+GDXAhK&e#KrQF@&eh1Ua$jC1
`Q#L5#R`)E!9r"MSad1kD"QI'jAeXZ9U!3QH-j9m)8Hi"5*)#E%-cafUc6b63JG4
E31eIDH6eRadA2dpqM("66M-CrKrVIrq3!%mQk'"M8%ZTTp(Cb10(L`m2$&462Tq
621q!jXekMP&pS1+2f,m'PVdrCIE,db1X*)r2)DLqJ3R9R%r03!BAl6F@Y'0"Qi!
6502FJSdECABYj,*SAr+G&f(XFj`qDMhUUr&h5l(crpr'R3Jp!!-d0UQAd)-e#25
1J*F&i3d8R[J`D-pl-@2GKXMAKh!,A)B+&H3KeVYP`HYBA%'G,T4qkGSU9c01ED+
PElc2@%lFE2LeE9#[SJC"r[Br1ia'pYBUbAr6(c[FBAE1S3dL4V%qM#G[5X[I3La
4+A51qkV&,,$6[[PHPT4h'mPVc!D$V5S6KK!0Ydj6IDam2K@H'qqkd-*cHj&#ELe
m`r4''d6900i+8F1'&X8M6*3I$9!R+qUm,rPJVqc[9X[0ZaSK@32rhMM45#FIf-&
jpMhG!2'b43)@V'h#0l,&XTGHAXh+)T["+S$QP5LaF`*kQZ'R1Nj1kR"*,@h"8rH
c*J!LLf`NiL0eM14Sr9q`US4h4ZcHP0bPeYk(&8[,ReAGIlNj*9rIGblhqr+,(ja
%`D-f08RpGKkr)2(14GhkeIcSiJ5N$#MYQR!mMm[hj%*Q+MCKiJiDQ0@e,-j2"LX
8ea2idVq"1Fre$DSF0l&UqEb`656L%BDrfb`NBbIT@lMbJKq*j80$km'9P!I#f2b
U@4SRMZ36E$!@Ra4'$,'821KIY&Ep*aS6lcGGF9B$,34b,0`6Ham1BAJQS9M9mGb
+Z)@@FA#mVYr63#)kS[[DdrBdD#YRYL"IpS+ah6F-!3a9"-6JC-CiEVG&BlZ0r$p
SL02F'I@`UQ`GMdil$S)F)Vq!DD"+Y@i"j[-6aq1SBUN%4D9VE*K-e0SLLq0Lb3G
)NBAj`HY"j$9Ak+8p$0M#fV,jST!!c8UBa"V*D-j"LR"P2JQE,*CAF`HC@e8DfCa
@C4C2TScV4AeP*`Y*dmj3e0XNL#2*ZNqfFKIQ#rFekNpENdrh,"[%DVRXI,pidAU
0k+Tk**2%&e6b#T1hCU-pr%Qp)`13!%@bIEqkK#r9)4ANFfe[q[jK3Zm([-DfbqV
i8,D`+rNm"rGQS$jlFS0PC+*Zb3$l)G$8)4Q,mN`TEG1r30UIlp4pIUY'SR%KaAr
6a4M5+`JJIpX6LcA$q1lC%$I2m&TA&fI5)8qLp%IB2L,Df(c9QXjmi-lKd#ND&S$
)KL$lN[SERi@VkfPiA9GDM3m0d`H@5aiFlYKm[G'(f2Q)DFV90C!!erbdk((U8J8
+UENPG,ahMlK3URrAf0Thq6A`VLN-H'$JB94rM(C+LX[@)pZMFP,J@TJ4ke-FV*)
jdYP[IAT6cl[L))a[3SQ1HH'5UlA51cHe4I#fQfLqm3dB$0*P1M+"N!"c89pV(6M
"3*0)0PK'-[C,P&**R,q!IY[pa099D2jQRqJ")E1&h,rhkH494apLS5*E*!%jSkZ
R1hGDZ,AP993rH@H[&3qRDKC@XB4+[d1SPpYEEa3Q-LHp%CpphJAhkhlP`Jdl%lG
RqC!!"FP@UFkN9$%adj!!1'LX,LUlS4fC*0qJjHN(K#Ufp"i,Rq95B,&-5MI%pqp
%GB@*+Xi!38'DXl4940TA'5Mh+EbG*fVfVmP'c!YcC9["P4X$m6&TfMN4bD66T%$
5IIZA4H(bGPlI`&lGVQI`ClBI(il85K)#M5fTSq&(d1T11aK)Ne,irE`jK`a6+mU
EIJD'P1IkLM[e!UURqB0)+5I*4$Ab9,`9h&9+&af`jl,0jbZYNPMB03dDA`ZZqM(
ibH+%4Kf*h4eLFhG*J8I3CQeK+(U'&FJ%(TIJHdcGQcU)9"R6$A9$lh`Ydr'rFJ,
L*XiF0UkjdP9(#DkaN!$ifbdhdM(GTB,U*'!Z'j88lKR"'1fEfR[mV,[35ZQk1Kd
,Ref58-N(Nf[0)3AVU(lkhME00Cr$UQQ!LVXYha#2(mpZ)Kd!)bfj4cRk@MiKiGI
9T##RL!8*80!%diJr@0BVN!#1%@)NjXQ5fiAhkG!r5h1i6"XXY5"+3N@EGZIcl!b
9"4jj'C3P53!j2rF%iPVQM-k,b`Y#M$`r9KdJVAKXijXBTX6TBmL9-DAmYmhT33L
hJY$CV5FBF&kliieM#'"lA%XTbjmErDa3Y21k,k82+$&(ZYP#d1Q!YDYabY4`P@f
,Pdlq*IcA`Z04Zqm5Z-"r+jAcCarNDmq-V1HlcRX,qKSBrqT,m@%U9A0r23qDCZ#
kPiRFF6A2+R[eA432VF"IqTUB+b4Yp%GS9,MH('I9ZYC`))H(SB"2mAAf$@TP4ZP
[rJqrVcVHKNXqq'p"NAA2R)%q9X4QCZTead(e!ZQh*N0(HkkHC,VhpAC'5fU$)Ka
mL$[d`,qkHP2e$D[8L-Ub*`&0Cff4d9p+LF'5VJhjG&8#R*3SjB&*fNLajEf(L-j
`244fB&j2TbRC(HU4k+!MEY$KjaQY8@`Ml`MSbH3RUdC+fL*9L`(,jI9iAlL49,C
N-mN9,SmQS`#lI2mB2B[M9K@XFHlIX9*hD)M[GLV15L,2elIH)T&PMTAIHLNdSpK
SGBCeld),!U,1Zf5,dD-i+0Cdmm5+6pQL,qV1Im&Im$5V39+[ZNkd#em)Pa-3*%4
d%@42EBbp)XK(Jm%,mGQ-Hh0!KVi)G'8,)j!!bae8SA-j&B,690p@V$+H-"K8m8G
0RjZ`+RHGkfFX5'`"`c8!"Y3q8FB&1VXD"iJ*GpVqA`[C!!63CQ,FX-QqcE8,
rAkEqlkc9Jb$m`6p-@Ih%pIB@me#a$G(eQc%fY8**PGaCT#,1l6C%NI5QEZK'Uq[
FF@e+IC!!('%rJ,)iS--HJ-jR1`"'(TPe*3`&2G8NfQh5qAB@FKkm)36K[LRc"1q
N)9"l6C53!-%YHf$2-&QM2[S93[&kf-(*Q3T#8%0$VrHD`#-peL$Z8F@Y""b)SFB
VJ18L6bU,6GmP(k3`h#d'pKV#Q'J45*r(fYHGd+4FXK2R-Bk!TC!%!3!!2`#!Y+'
MYVJMIH)!!&KP!!#i)!#3!mi!$i!l!!9UH3!!5%-!N!32!&4ME%aTBR*KFQPPFbl
2J!!!3,*069"b3eG*43%!rj!%!*!+J(!!N!C#`G6"DVkE#E,5Nl9qmI))CVU"cJC
!ChD)!ci,F&BKe1BZp)I`)@hrrZ&aaLU)@hM1i!hNjXd&QJ,0iATRd3Q("p-9`qP
K$`[4l$i4%*KJl*JrVYpUia%06r5qAQKXd$I[Y5b5HajdjFj`'kqBa@U10X@l!BA
KBS'r[UP6G1E$MTjI-ApG!cQJer(SK`B!8"(b8%E1mH'XMl2q8eC0QiNTp[PP,@V
G)pA(Zm0B0`#CA$+T9I`VBJ%D,0UPB2FrbQe)jjZ09`#S9d5A!))-eI30Gi2EI%5
IG*aVj)m6`HeLY,Ia+5fA9`lBeH-mALb@)HHB$94Nb!Bb1a8jMbrB[THQYh+VR9b
)N!$)FmZNU$PIl8jG$Z4S,dR,HIi#"JKm@$RIR`-@&'9p*2pL$Dhl4rRr`S3TEpf
UHZ!0@Xi-J-SY9Q0Zb4A'$T'-(D-9X"S,DH"!jqHX@5&"Dhl`#UH)JY"fSP+c&LL
[h0C3QEh*0kdHH%E-*dd6G%XK(Y$,V189!m'9bTc+RDdT3JpQQ&EQ5U6FkV9-i)!
40L`Bl"H-T0c$"C0#('N*i*k-!S+k#jj6rIf1!h[lGYUXkZlPYHjm3,CMA!KQ)BZ
DR%e2JE"GB%Qd*8Nri%$!Z!"3cREfN!$+!ZR,cpL[aabB540H&jCE"aXZ`NeDDkl
IZhBC6!Z44GIJ&HCh-!GYNTYpQ,*i-ASK@E$Td"R6Q$MBZRk8,Jpm&)IL5+MM,4(
'e-CrK60%2$2,NeD-kDB!pJ8q&LrXh[kVai9`%Xi9jSHM[2E(a$e"50qBe!&8RI!
"`Nr$DI)eD9Xp&0&Ulj0XSJa0G"bkBL,@Y#6e[TI`pI4p[RH5e68lm1bRmXi1rU'
@i0d-1-UN8TS3'$`Q0h!Vhk5ETh[l+mUf`0B45ZeXSr2Y`4EY)'c1U&jAPI-G5kI
MNk3hqBM5G$CVr4iFa332eY+Ak,H2B(53!'k#RZGlq#$I4Rf"eMl2-l*#93PEq+D
%0#$U8QHQ`qI[2A@KZ'#@YJL)"+!fKD3Im5k"09XU@0[J+VJAcC-,JF'jZbXG*iQ
8lR+(#%GXT&9AN5L3!$NCAMe4Nb9H(c5bd3Nmj13!LkZF1bMrkmSZBHAjVGm(ZT0
05@1QX&81D2mNRA4H(j`kb`IPMLCT,3c80&C8B8BaFBLXh1`YphC`,VT$[XR&*J(
2A&G-J"1(Q)D3!)[,A`NGCDKP"Bajla,Sm6HQL@HhYp@Sk&E!!`daj1BlKTEE6,(
X$KIErC%Z!TE0A&F)I,U-Kk#%pTI!B@KR(K6,S`jf(4f")AeK"eiaV9*-'"3BURe
ILK1F8QCe4r2Yk6pIfqJcG1ii,XQC)`lN*9*iPCIpF2S41Q[fE'ZKAQaZpbfN3-R
[9K(q1L+'H!0(!pH`3&6,qh%S0[TQ[Id2iA)ZS'C1P6LI9$SqI"K![hC9FMkN-&0
j#eL,HaSb'I6IU*[9C#,0'#j'4DceZVprRT6I3bae%Rdl,$,+c[RUDleE1)&GM$J
2[aE6mH&4c'km&FAL)1C&TZN$(k0S1JETJSFQDSe'p&65QUIMmj%r!0SCqq`3Nj'
[8'#6k0Tj"N*Pd&ca')rii(V+iM%-*V%mf)Td%C4h,kEjG&L%%kVF`)A6qMCAbY4
kSTDcb,[V[lpF%lAYA*%C3+2*d%TH%Bi6GNbBkHP'a'[j*m(&`UTGiHSPFSj-i0r
53&BV%pcqdCIMC2H`hEik19Kiq9XGN5Y34+P&8m#e2qPCEl654SI#i8USJbXq#*5
*NdV)clpV`2GH`r0(h1B$9L[EIHjrYB@FXP'cEp0daVYb13de3L8A4VF*@MI5Ue$
8pMR!$MZfF'GNqNU5IhVd#FfSHG+hV)P"h9fIKMC+5QBhZQ#`4e%jqAK(Tmc0FU+
*#1c1bYQ+8T(j9)$$MI9X0TF[PD+I+[M5&&0SMA$IXXqqV9PUmkH3!!@LG&kSPAJ
96F+L*0,4KAH-MbDqceS@)C41H"d'p&dehYE0h"UdiT8)BLlR,"G)&+pE"CEYc+m
QQ)JhTb$5p#)M$AdA"%qj1&2GbYZD"["rrZK+-h4`Xc%N*$b'ck$L30Z`VHe'4+R
G2)hK$5"dHN,3IU*")-5QV"A0@G46%`hkMZ!Zl95`'P+JV32rlbN8'klNi$e1%3I
SLLY1,e'42Cab%`qLqi%4L1Y6dKpU1`Z(VrC,k50G9XlKpZ)A"X-+A1Q,1N4%hTG
5#aq'e&jU)62X'2"N%HL9Ne%JSGd!%M@'A8BmFp4`U,%"dPi6a2cjiVM[XC&ER%L
TSh-kQD0TCJL`bd"d'fM,k5$J,!d5EZrAk8F'q&4KJF*-D+*S#MjCLDaAPHZ[k'a
JGpGTGPXE,SB-LM$c`6BC6R,Q$-0emmL,KZ,U-T5K!rV8Ie4qcdrA,KF1V,hN@lE
#03lR&l$J8L(cN!$5NeSYlFR(3l0[d[0KF(jRqCRPbMHp%&60$l)40a-2'*VfRAT
fM&3&lSUBbV"lN3ANd0MlVf'jd&R&iV2FpqUY"Ue*RleU`N',318S0RMRjCTAh`"
h3Jp$+jVVK0)jkr)CQ[cUL"C9*pCECMa"KXm4DPC4k1RK@jCD9+LLck!Q0VQI25I
13*A+hT`AH@9Hha9pj'1b6Z@k+$K,FllG@$'""+YK[QMI0%&!"YV"C@K!X@SqfjM
5I*[48G"*55hJ,'X#KDS"kV&jJ0Fc%l$lPR&BhVL((D1!+[Z,Hm3ERrq*HC!!G[X
b'R(EZ[4#FCI+1E%CINll(dl5&5f@c!M#F+QX!B)55)mp8d6`1&,e,236Y#Y6Dai
"c4ci&VQY[QiRk2'cG#dPZMHP[(2QfY"meUG4qHY3GDQ2*rm'ImPiM9EKNp10`fJ
#k[9&p8lbZXf[I68`TQfVMP2@4&p%&#h,+jcZUQlQZ)DqelcNfUjT5MP[QQ%k9+V
4@22@eCI$LjM,6+k@-@NVh6q2GLiU4R@HiM@$+arb2&JU6HK(jMA2832%L'8V$!e
daCTYM'@HSb*`1UJa89'cPqLk4-0q+FYQ85Ta(VaCEFlMSmNBQRPf%'YGSV`i6d0
E'A5S$54fF@*'ZUF$qQq,1!8NccD[Nd'X&aL[%$PPQ&DXTFLL[$BcqG[m@NJDPp#
Z+T%5V`(a'%eklQR2S`T$-%BC4kl*HFe*(('q0hCALS&-$!b3!#pcd#5e)bF-5ce
92F&Z)Mmb,l)-Z2b9f@l$ZMh"f005MZDUYMVqd@%[LS'NI,51#Ve%`Ml!DIl!0ld
SSF8G1)pJ!18!A!cfFp8X2c%rV[S40C4UP11lXUjSaYlHj2V!RTF2aiCJSR&H0YK
[X3lTK@IkI0BkT`AA3X&*21AqU$lE+463'9F4[CHTPZa%UG-NDSXNABb"kiCP*i#
4JF#A6jR%lL%qUMAAH8YB#UNM'NBk3Q9FI2S%8i3DYrQb5VH[@P")N91%eARe6V[
fH4"GEHZEITjVlb'I0ZRU+'p#jl)U'P`E&@qYc'HV0P3LbUh95$abq2FPPXfQ4@i
D'B6)`iH$*[Jlb1SlVU1R@diB%rGqmH#iSX@6V-+'Pc`*j@3'0X(A#cimGfqYiR#
56PUaQ00%j&e04eeP8K6(Zj2lKZ1`iMqQm&Thl(H+L8F$*BYH)EqrU0dGAcRH-2i
!cei'qjbD`"IdLX@NNDTT$3l$krX**4(hpP(q@jfN`,Fe@G)hJdqFRI@&D,D6'),
9ZmqBZP`QYp2M4kH9PceeFIra'Sa#+E"YUY1kPmYf&M'GGcp8d&caP!)[2le)PUV
Se"0G+2I,[!b+%1ZcUXSS@RXKccm,38MG*F+X66H8`eYr(AKT2c(*cZH-j!Dj9'*
ALm4ZEMf6)N*%PCJB1YVqMc#+ADbj!L+j'9Ia-9$Iq"K[3kdJ%T(')FLkZR8P["8
FHHZVE1j5*TQIA5GAIE6Ndi3cEj!!Mlrd#Y"G`#**$+X-"J'mTU4Lp+pEFr"MJDk
IZPKFNH5GpAeGQrEU#GeS1Lr#Y()VTA'AQcKi6bL#RdIKf5MLY&f&23p8A*!!KKL
55*&S&"R+1D3"BbhcNK4%AUeF-R1QB01RbLSHSR&l1Nj1G$+C-,H'DRNd*XbfD@[
&5!-'mA%XDaCMb42D-qJpPiQmYc59kR3mJr-JYE%fT8mdc0mZMLm('Qbh@PN%rSd
HFR5mbJ"hacT9jf'IEe(84kYDp@!,4%LYTQU$5FPU'(RcmS,l#D1qSH[V(*GYDaP
jrfX,cBaRL"m3ejD+6SZX'1KI4DFEcKkGk1M(IAilUC,'5+6E5ke[6icCZFV%6Vd
9,rq862-%R$!F&C0UA1BCh*ZqqD2q8`0VC@RMbJ1hScjU('1rR,Qf["YYM)Y@44H
RPNerF8ZbGc("X3h3rL9X(P!&Z!M-&Z)89fZa'fG#8B!QmV!L*bKm2(YajdGNpe!
P[UFBmp,L8KUZ(-Ul0N(('p!hp4EEVDD5ER+a@5YF(5JD@0H)&GC*AaqMJUAi'EI
Tl"1ccR@[6[65%m5G)RTJMcL(PU@66K"&6*9Z6r`6#Z9q+4MSUQh9((d6"FFVl$'
M+D%FePZG3&([Ja*M)RMdHY&SdP!VY(pipGF'YKlKhe!-)(jP@2c,bK+,,i6KcMk
U!NckPVH6L!keY$(5!Z,kG,qG+8@)6#f8S@$f&`VjP!0HR%DE&8RRe)KE![9jjjm
b,R&#@2Hf$@rmmMkXjF"VC6eAqPeN1`@Pd+rfi2ia@#pZ#L)P!BD6Mi)KKljX$A2
k%eL[,KMA(H$T(phpf["+V6%&-Lbd(Q*QGrDB0QC#qqNGeBQBCa2MVb%15%&P580
S"5MDl(E3,Q`JdG5XjNS@pK)IJ6@),1f",dfSI+MlFAM(@[IP!b'GKJl@#%%q$S-
kU*BM[`6+6b2@ae%VpD3U4)KB89@8R4qVVZl39k!Mi8Qi`i8$r!(0NdqB%[pdLUZ
%0RQ5T5`V(F53!+8MIE#"K%HVq)4Sb&)X$i4S*pLeFIUcbU2-kV%TVDZQ'&Kj*f!
92$%)SQEm3*b[XCZAPceX[m*ZLF9F3HU1I1@r(!4$Dd`CAY5@4S3YJMYji&q!NIJ
SjTNcVP5J&L(`NV[FH`DLGjZhDb)Zc,KXAd0%Zp3+eFdb''9#[2-B(9AB2ScU,`V
SP"cPJ,ilbXBpBVX&j)c90P($SN$%`a0"I4dTZjr53b`$-3aJ,Y3+C3`5-"GZ@13
+UVEP28(Z*RDFMBq#A"KQa3Z4rZS'F+3%*#1+$53'%3)d9l6lirmAejHhKi+TQTd
U#--26ZrJ6dDU!Z8(!NL+91k[&pp(8mD4fdeEleV-B&rTpp(Ed(2L(PT!Q3G'#hq
RN!$YmNZYL0*VNAPjhD1&fkF[m%"b`ia5hH5pV'bSK#KE2jKQ1E1JPHQfPQikFKb
X4"5hY$TSeNR-hUI,PllFP'"6A#CZD&0j5)(UJ03h'[H$a6K&Lk)"PLB9IAH,3&j
X$HZ+Y,&"l'3bmK'"4,iReiqjNEV"I%F9a-0p9*S2[XHGkL5kQm%,VN8@%Xi@B8V
9hcj0"Q!m,%A0VS65dCF`L"HpE)MTFii($kLV`,*jUBYi[V*8G3i0Q",VqJHrTU@
r$$AMpJSGYqZajd&8+'F!f8m@,-"1j4N6`83&"Hb4`[pb+Z)B)9[)BVjcD8U&h)1
&L3+%Y*pd1BfEZ116($3L`*E%ZGXk3Zc9G+,Kk&B@Mcc$YYihl%)!k2*VcI%c3G`
(*'UP8fjH#i*m)'p1!!fFU8@m6mkc"fqlZiB0[U0'@3C)8RX2MJ4d[#Pd6iI'h3M
+m`"!3b9Z+M0H#D"&qLcBa2,+0iBCb*2(f(ZEDL#a96jlLEL'61Lb&3Q`N62+!1d
VZTVhCYHd!h(T"2Zc9l&6IbVq'pAq8J*cl9*G@c`-8[!9B2Uhdj5ZMj,B*[IY[SX
k6,KdG[)r[r`l6C!!I!(b8J4P-ScPaTkCj0Qa!YAf!QR3M[&-203(R4UE5[5d)(#
2cZ"AkZEKpP#Jb*j+,!Ek#TQ*+ai1jVGFaflI(UX`P8MBJe)FE,`0KpV5e3U&-YN
HMUb`TbJp`'ecfYJM2XXHRkkNIJc$DT0(YViMS'V4*d,3[3A2Nf*J8cBNUVVPGe1
BRkb#"-k)I(Q$F%RA1DC#@6&lLkcCeCd4mBFI0XmiIQN#[[00[@f"Yp6&V"1Pl0I
m$b[5%*KTkqAa@cqeJEGDr($jQS*ViT!!CYZLFJ*Vc**4Y5G`jPeSrAFiaLdf1&Q
jMhIPTZc"S`r8'%H[)Zjf1BV,6ASb$XC6LS2laVH(m@U46E38mN#r(-$qmh6Che(
4[TZ(d2l0mDDi94pTBA9b,C91)hAeTGc%AIC@0Hl!r@#c2mI**f$(-F$h&pi`U8[
(Hh3ci&jP"cqB1@ITN!$k03abp*S3jAb&P&iY$*&%RS[HD88*ZRTc&'`LKH-[e,b
@e@rHX4bZ'K!-i8L)$Sm#@3JL(Tf6GYD$4XM"!(@NE!md5KR[qB06XdU&%iSrAD$
jG4p,*Ci3KG#YT[q4VrZ#ICNJkDL2#VZjHAJ@A*jY#qrK%8V12MZ+4a1T8mSUGXE
GJhbUS@"(3B"98H2D"JamVb4PLA-EMHCh*,VVa,(&HB1U*KebV%@pS@LZ+mGSQ"Z
$04+U8l#!)0+*Jff$(&"SEJFT-8Z61R4RDL,c#c-aq5cddM&%qNDYS!iF8)@TPMV
D5'AH3IrNI29%l3L3!+B4"-H!Pf+fLh0%r)-&e@h*U2kj!ZHSb%k5deqDhTbDBU0
!hA3)Lj81f9D5idi3f[f8@ML*FkR1$mN9S'K5BM(KQfhhcI-J4*!!a+)$R2KT*df
@V[$MCdYe+ECjYM`P+mrmP4N0`b36U%#4+`p$6d)IPfXa@k-,+B64'#q),%TQpbe
p0VCeGX@4mmEK%ULlp%LR9@ZhhTC@aKUrE%KN,kTHI'&mfhl#&a82EUlMK-R"N!"
&U35VS9L6%c8j88Ab%UmH0A$$IP[fb4[k$$MF!"rfb5jh08*MeeeVlA43!Ddk@Nj
D0l%8a`RU#)jAN`8"BKRhm!+4C+Cp$pLYNX#$*H)Y`!NlJJ@8rah9KYLY3#Dp@B0
$&*pF@+bSMHA'qq@T[N*l)"RPm'EZ0K&A#rA5SQAqBCrIEdLS"!0-8E2adGj*bXI
&Br#IY`BFik2T'r"l,IKGc0P)k(daC%'Hk-#AVY,065qmpT95Qb*RpIJ[$mjqJCD
SKL"[fNHT*kBeZEIVlj3M(9%&mqJr9"d$c&qeYG$FBM`eA*bG$RM!S8C6ZT@(V-$
8DfrQS4jELcKmEH,*Cb&R5KQj0lT!MNM,5G6aSB$fpY&fBF9@j'3(Z&aPkjMqMNB
RLScmT&*p8R$ah6#9G`%NQB)emi9"`pJ`JRABib$VD&QNc%Xb1L2PN53P"G+!(5[
N425&*8Jd%q"`B9JQHlTFrJlCZfGQpRm-UACcM"jjbAm&a`l!%jkqT&d+Ep,CpG)
89@d95+i4"$,6BHN[Ki*ib$@CT'qK("")9EQQ2N@`l2(!%[4Xh$fSGJ!8STH(ECE
(9)3NdEQ8+(jN$LmKLI"IjdbjGbVEc,XL5Y#3!2r*q4!ZBlKA[(Bp%%LdedQBrJH
DJX#YEb6TE0N)D8ad"rH*4JaUbABG2aZ'UKbSrJ&@lhdlBG03GfX$Gf*iX0bZ-)D
9Qm8$FKj1)X4CXR['XXBdmDU$8"V4aZ2G&3cdA'EIcHJNLUElKSl,j6mf%A#HT%T
m+8UiI0BX!j`Z42VHV'Xb&QkNJLKI!3,p2l5p+4rY"D,jKPYB8HC&G@D%TiSBjYf
fS#pN%[P8h92I8iY%@p8kkGM'a#PCQIk9TTM#l('50CAK#!T$UR#T-XMaNmaiG#S
PV$VQd5ip5cR&8ZLFhC4+bH+K-V)4VGe'U*j1EC[KZqGITZ4kRb@TmRKLhB0bb@`
1)PL(0(+E6,3%XR-eA%$645&H(Z5-XXF'akDfp'D*6ckh[84*jm$Aq(cCeDeV(aG
8q%0#MV6K5e,4+(V*Y(VbNMrl#MBp)bk(iX%8P+N,8F,EU0Mmm68fja(cqE(@LP(
%fGiF3GPC2d#*U'U3!1l&c*)qYb3E$$ZI0A["""kjSA[c6HlkLU,$Q1D@R"YQ%G2
6"VV'i3ArTCHNC0Rd(Lm*EKRmGm[#e6Qkrib26Z@Nri'NZ@+M(lEU1#AIQPNiI`0
RA"`B%)k+a+pdh)$3c$8K4J&JDNJLeC+ljTlR8LX"DD$,5I1Cp9p`ZE,*(@%[m,`
3($Q)[qa#jcX),&cBr8$SEf4AdfmH+(VMecF9QRLYRQQYd'(9BUT"1ULS8XSJ1+#
&QHD+j4ajMj!!Z-@j1ZQ`pULD*2bkj#3ZRi0YNkSk@jhmaJ2HU*ZBqAB1NVQ*aHK
(4D-HV&D@ZS`"GD"E#fCB$058#LH$0[N(h15qJl56[*ei-2GZUd%BD1PE0Y[q[CU
lV4`dY1"%@dklFRZ+h9PM"3aVZEFeS'Rd`Ar80m@"m-A5BH#S2#!640!kVQIj(Zm
X),Mr62jrB6[G3-l4*64IAjfdU,R$Rd!5X%ZjfS!qTGJlcQ"&YLT+&Z)ed`V91+q
AfNE1lpQL9&RK9l8"i@Rr%IjB)(HBf[4GTG%,DkpPfMS-+r"3$Iql!kNLPF%0P'k
0$-%8lKe5a80`)N2&GLqK$D61P9lV(A-*&a5%l9H&@Y4b*!&eSZ,mTSLi5,&M#&N
kRaG!RHLbBqLrJfjIch"PGd,BI@R`[3pEDL)[q0U@C(-'fE9DkVpK2`G[#*[1@B8
(IRGB'p1ViDkm2e0l1I""*PU!UX*mj!D0J5MHH(@*fIb!CQB#ph#5(D3ri-,6"(b
ElT%PlMb)Br"kb-d``)V5QXVpj8+U6AP+kQR*!!,Yi3UDIr8f"",-$bFZ$bq08+&
ph!B#)'36e'CFL@VQMXU[$8N[T$f$l@6ei*HYU03c@m)V5ZFF2PS5GX1jGd-EZ(h
ar8%9k%+93)lIE9C'HC+bAVdm6$Nj&p&9Zk!NR*XSM!LI'R1P19+E%GA'E`LXjV'
&mcBNpmcSJ)@LprS$GX'0e*3U-UMK"cMeTR`)CH1DmmNJcF52SU'&ilFrHTAASAG
I@GbYd5Plr)N4VX`Ma+S39drp*-QP12d*H+JA,A5+6)C)jpNkUp,G%V1d$QqA,d5
Ip,$%5YGNlekNrKDD`F%Y*VX[Am0-FBU6Xpe0kc,+YY$b95FXI8!QDhFYGfflMLD
p1%j`qDjqChDFXDQhM,V0(bcZI0AAkTU8fd4h8G'A`J8*`ER)GXZ&)--0YG[Q)f+
b`%M9iQL1&&J,#eQ#jbSif*1AUm',,Z$UU'pXT[JA4kk**Zj+pfXr(FZGXZdY%mJ
'h$QDq3Al,bSTqL[[ML(X#aU2a5)`a@rI#bDVT@G*MCFm,PMIU,He#j`0eAAi+HP
)5dc5qCfXpMkr0hI(B8NE[j(lBcjp(H)U`+mbS&Tj*V*N0@9G6l'p(qP'PiMGfM`
8VQ%%3DH@,Q66R(ZcG'`Y[!6IrREZm4JH0m&Xd8&i0*!!kkcN!f&p"j13!'l!-Cq
"0bb#9AGqTR5Ri)Y3pUqSCG+ZldH"$m42PNa`&$*@m1r$f"'9mH4P(Mf+!YI%dT+
rdBFp3X1&b-i#LJ$f8lIFbC!!!'[S8#03'$hPfk6U-F"H"QTP2DjiJ)hFQL&%r#6
LPcei9r$Z%6iY8`cBHe1&#Q)V$emSXH0ma9"flNh8HeEdkcH1[EDm%%5SKb#0QLi
F*UFF6-1(0QJj*fb&8,V)k95K0`(0AAm0+C,-Yh"DQB#`ZK1*,fG6*@'Z5&fPS9f
MKj5@$91!J-(,U(0h31M&+Jm"9R,pE-rJ2mi0AJMqll6Y-bhK+LiaCFY+*c'b4T3
qZdrZmMI@p5N)SdU-qM"&q,Ph@5!$Sm5Y%3VBDeLS'Rpe3*GKX9QIp+rc%Q`6JZ,
"j+4EddJ&SK%,#&b"Pd1`cfq5!iVES8R#A6HFK)Rr(&JVip6Y)V,4mF%3hP4H8$L
R[G4BHMB-3jejYa31`3&2UKFAj*,$6#T(QYr"B,S4-hVKLf@%PQ*'RU6Lp"i4`AQ
+-`kH[b('f8X+j+0'1EpX6Zc#`$&r-*VIRH9bMLZYBKShH2DfRCU"A4&`%X!lHrf
k@E1-(*U+D@4+i&lVA6BXQ5mZ(aZrcM`UFUp$,``AUF3p9XrqM340fSq3!,D)`%,
jL+M'1SYNp&&2`8mNp*J"f46!r)fQMI*rXTM(Se5KRe4((*Q!#X%Q8PlV#2BZa9K
e4@)MPbCXp*mB#CTY`DZHPZMBFPH3!"S@N!#`I-h&bFVH3G'h'!HM0ccBQdYKK@`
l@RpPpXK5BZh%$8Um1'2)!S(UMHh99%5K#qRAJq[K-caeHl(a)QcX'J(F*makXL[
hZAViEDkBN9r[JkX)(fiMml+9!M&9+BcEdB0Xef)EPJ`3ka,`QrUP%3pGY6#ZMIi
Xmj4hNb#pAD1R6*5KG2Al[N@IMSPr"EBDU)ZC#iqpFEr`Id8Li55Z0NGPqlKSGk#
jJ60qehcLUmQA5SEe$&X6IQNSdVAF%-iP%X&eNVf!5U9KNATBaqqN2NdD+fQ[ie%
0(4jXLLJY`,RDRTa*`dN"E4eUD8AcZI`iBp!3`rKjN!$ELZd4P#8L8bKehrpA,rS
aN!!&4KAe$!jiL1L46MFJ489ic2F'%kRQdJ-NCS,U"-&lJ+$%r82j*@JM!9CZ88(
"9f`Bkb"Ym(J'%2Z-%d8HHbdh1%Pb*f29iCUkqTqVe8k(G2XVpMkV$QBEMfIq$lp
D"-1B(Bi$5jhfLVip+0kCc`SQjQBcDbE`i`F1Tr`U%S6LiR5P8,02cihjm3fQ@KS
HY'1!ZkcBDRP`*4jVa53NeqABk22C(+C!mKh%NlJFTm#YR-2jh@@B4d3A"6FC[BR
Z&E&+Vr`Pr(fNf8XZ9cPNI@'qPNTJJh!QEC!!V,33(*X)j,AYkMpDUUiIll$!XA*
Rae'+"NVpk``CCNeCVLJm&6#SMVk6l",mGkKm%DP!eENL,#D(AB2Q)"VjbX6@`I4
80[Q0MB1(V2Hi'BkhbCm&kr4De%0lGDcS#EefJ$8$IK&DmR+MQ$"!kR@+cIkV%B3
@%D(+0j!!NQ#RQp6)Y)$RcC6-ZR8C8eihNq$1JXDD9hpam"EqC"XbJeY[pC%+M&q
H0GK[b&9CBJicVXr9jGe91(Y5AMhNNR*BM8fl&8H[-J2mK$[@kp`TEBL[TeX2Z6Q
,4R%9eE$L,U(&RZ1FGmab8-@@R+8!8+bD%%KGqL4a(5IT+'ja!X8iM1b`$5pQr`)
H4Nb"r(!bllL43YTbD#U6&P9jR%a2(%bR(6ZJEdJBaIIdU1C5"$2Lij2hA0Ij&La
BLXaZQ9hq*3*@''3GCM%F)-"i$EAlpT%RI["J#4'&i0bDArB+VPRY9FYjf(R3aM(
lH(b1h,6-A--@mEHYcTl6Q-!'Z5h6,[MGM,TKfdN%HT%!Dq,B'pPrM&9c)Uk3!#V
H9lVeq2,J%c)'!!MEXK89@98[+XLbD9p#r6hfA2*&9hPfPB562bC"N`B2Q3AT2*V
TA*2aELJZ%@1dlqU*l*V)phQ%K)cFp90HDf,h+%D*1U2(C%S2SphfbK'*$d&qrR0
c5JYIl)B$X1@NSc&'iBeQ4pj[DhP6%0,a30B-2f)08[[bZU2&kJ#qCP#BT"F*89b
iP2#Ah'C2KpT(p&rGF+Nh0dTabGiVU!,m3INq)H*5(R'H0aQ2m+j5eLIm&S()G$c
hYH!TQaMSa14!X-5,&0N+Uqb8#YG5UTDJ[URe9HNh[lm8VdH*m#ViPS5(6jG&A)6
#IU8@(*-QD*Lk6CNmD$lR9+l+P1@a[2NQDDU8eGkqZ83L*$,*VG,KR[FHC5rEXGq
I1P(Zc4YHYk*5a-IriB2*da)UK#TFpV(ZKSpQRb@m8D#3!&&3lf+#Rbe-K`VQbJ9
%)+QkYrCkm#5%X,mJ2EA,Vm360c!5BC-kLaKI8Cj8q([%"kX9!ia6Z[Y,&i2`E22
*BYUaRjf@Lp#eMTCB8U8N$`Sc%lpl)GZ6$`(%8*+S#bj25br-BfiN4bGdj&fM*N(
`20hIk(2EIG[Ni%2#YGQeX,iTcL,S3`ID[+fSlCmqSjJ-+*DHf5R-231A"VkXUcq
BX%NY*B0T8r"Q+q3E1fe0rXL*@%!%X'*[Pr6&#@crIih'QN4EZ3[3Pjb'G'S)*T[
p@Rd'Q+"feEqM)6ekl&QRN[IRda2*Nl44AqTQ%HXDrHP2hm9peP)D%&m$P9Z-XJj
6hm%!j*!!G03`0E$5NjMZM`K"jCCm4Rq5@EJUfTlCHB8K@SVTfDI6--SF1Y6Fijm
DaD8&@`lp!mf`4`kEB1*Yec'V@13jlKajMY"&hl$T"L((@"6C#`#BTCkE+-NKk1%
jbJCU1&QDeeG0"`K!,"K14PDdapX*Z240*$-i60cAF3BY26fqF(LJ1EGk&EL0$B`
3'06`SP4"FA(4AX8dk)p@#84h'AC!rcT`IGmGeUb["%"$(kQ(1(8lQ5&-22mHfL%
KZK#9r1JCf@"TiP&))KT%j!$p-'qf)kDQCHFJlSH&)`@%NBT,UVdIZ%"m2%erIJd
-Np[NKPVbPK-4E)rL$BNEm@!'X*URM@6FPZB"Ur`C9C1T`MAPQ@QkZ5)h(6fpDR#
'i3#4TTNHahbfP3Qjd`&S2I6L-6BG9!0Fpbaa51pUB3m2e1Vq6e29aUi"Q1mc(f%
*3+-D59!hT2CZ1'I#GVrVf*DFNpT%T6b9Nq6LS"`304lk(AhLjM0Y1#%5%-e8Y1(
ke9$J%$dFQmBV)-lG1dCfYGm02Zb@l[!4#@XL&,bV`b*qRaX9+Krk2frA2Q$,50V
XGG5DDLj*""%1$`1[F4pL&jT3d-'p`)!&HFa!$*!!4li%BFeIZCfGa0GI"BQP516
m!Z`-[`pNb,MmI8#dHjhq'H+i+P)QR"3%3*k4[H[pq6`Lm*!!1,bh4B"`+@#`[ST
f3YCmGS0RLKCV"3%lENL#)QCBRbiR5hh9FVA)*EpF*6Sr%2NID4HGSJA-RCiZ-N,
V6"G))+$0RXlPZ3'-cTMk(05fqQ%A9*mjGBdA2K2'")`[T"m`r6Q$UVXXISiqb5M
B6ZPdEDpm%4@VB5X5@)pUZUqbJYd!'3#AAj(kI#FbGDr8%0V@McfCPF(@1+ATJ*Z
hYZ0M$3mi98qkXb,RrY[AS*2DN505JU(Z4Z,p!-46Q'FaQC3S`Aj*Xd,cYhY[eBN
9N8j99#NEeI$QMNR(,Tj1@X8NN!#amA8ljKd',V6q!#$KDi)6qX#m*hTM8(bPi0G
)pBY[KF4ZmI[F+HQ![))e%MR+Sq4Ml1SHa64G(FLJFPc'aX[,bH'G@E@)P`IM3`k
FKP4I92@rB*6`iqiYq#'Tr218MZEl'6!*rGUJ[ZQ#bXU9MEhT)kL5iH5ciZ&$N!$
k408Ee!SDMX5RXeKdjm6hieHYMEqdRHIGiY)4FM"brFaUJk#f9m(DaS#JXT6-e4,
992%'p29DcCD)0l82J5b*A&cNZ*`2pk4p0j!!FIJ0GrRq)9iFRYX)I-Dj"1Q3!&U
i16MjL,%,rqQjVqC9ZCDLBhRhM!(FZp0(QAiI0rS*J`I120AClSF*J($,LG#h8[Z
GBh5cZ9c9mLimNcca+G9UF"3#bGRd,XIL1e3*S$a6hfpR1-IqpJT&@49@',!P8Fe
R,ZQe0BQ5PY!HJ4%pr6A)GT%8Ff5qqF1PQmN)rI1aI)1+*PrDlAQee'r*TSMehr-
ZQ4&2G5"d-G`VkMmEQeX2'pL2,N$UXNLj9"5FeR&2IrJ[m6`)qq4+)KNAGe1lReM
aIpS9e``Brh2'"1e`KIN+KBQ%DKSE@p%3XIipkNpLI8IE#GGd5K1aq%rj04kU-'4
cDUSlp"6qde-1B[ac@[25U)K2I!)&mV[c,6CR[@%TImR"NbJEprDRZ#I-[2KlIAm
Kq'"r`5IGP%ekVM!1b+`hPqaLp2@,mZ)8E0jH(qGBJ%R%&@6)3Dqpa(MEC(8P[cK
bR5j#1(GYj"PN+P)C*$1#Jfa&`fT0L`c&H,3`!S,,'&4$GKkZjk)1L,FDN!#&CM&
Hr!0VIKrNpN)GAZek9HcT-ML"Iiq)jq49-Q+4qI5!R6e`mFMR2F*@#-DF'MK`GMU
%cdm`%rdmCmreGNZT9N8%%6@fRi"bb'f*kVJmR'#'23fR[qaJ0jK,6&22+0ReiiN
2(fh)PM2&-L&IFGc4q0E6XRf'rUmkj)ECM5Jer59'0*B'LQ0C(``2DPQ19*3F*GM
fjU8S59SFJRIdP'DeS2)6l9e3chpZ$)*M+([DX5iLH5%1dS!Z'`4%%#!PZI(,Y@Y
R8VSG(KVl5TAmMP'TpeL)3"`dd9(diHY'("1Xmjlp2qmdMN0V"%Uc4Re0YG-FbF4
TqQUI1HB-kF[GSr%9hU8fNCIVEBX(!2hVqM5&FJmX@d(6XN)rl8``qeXTRjY2Ue3
J0(-pJ#'h"+iMMh"YS),EYV,VCYlXQ&aC8r15TaR@BKY+0MM"$A*r#BqbRr("RRT
C*Ifj8)5bSi$CGGLYLID$!ehP$+$j3U2Y-5'YJe[jYa)Hd'i%jTY(35FR&EZDVl0
q$,SkhpF-@LTF206ce+#l)4abqT!!$APBRBiE'(5b"l$mj'FG"QN!VqH(5GmJpC2
#cQ@qRH@&V2XU+#ZXDBB&[T2"5Hi+[dTV@Y`jAS$AaKYLB)b)I1rJZT@lLAZ"LY-
$irR!85[9CrP1dbLCfd3&Pkq&N!$X&2kqCd#+(5qad`m9$jqbp90qe"@"l2A`Sb-
ic&1h,Z#SfDemlb5`@(jMbjYqJQ"IVPa#&A)IUV,HPT[3+C),!#qhG!r*+ZfMDY[
C9p0`8&$V3%d!2`pT6BrL"@!Ij6"9[pL9XQRPA9(h-[30p8"b)Qr(1Em"Q[i[$,Z
r#ZmH$8'[@,&FP*mDQD*YIi3Fp(9MaVk'8J649iL!fX9i&IeGpjU,#$PdcMf4`pS
jfH*4hEQ4SU@[,YK2K1i0EJqU%UqC)G,8p,$MG+Ql%M$IKF&R6'US&0KFC,E2Eh(
XcZi"hQ1jE!(&Urr"l"$D8Y[,c44mb8Zp,6Val"ZMdBQq`SXA0K'eaarC"phrpB3
Md%Tq6`R+bE`mKcV)[T)&#MTV*aPZrf1V)QK5#05Fq$@%iaTKjUXp%#$U%hmaD38
RCCHe+[@5rS&RU'+Tqq0B88LGaCXml20MpZbF,pbFp[H-)a%QFa)pX5T&)FBlHHA
`2M,P6!k`+-BUBllRpN(h((kc9i2RLVC,DbXCKZ4AHr,8ZD!339P4rZZH(Qa)$BQ
3!)k,M9C3had6T0Ifj"jj[C'8B(B[li`bfq1UX+6+SqL5Br!%3+'*9drZ1f06!Br
M&rR6hbUe69,%`()k5+9G0$DTA3&3J#EE)QZ'8"K%a+6lUiV`0E5-aNLGCJHS`9H
2J)E*6'2)p25@h*mfKIdU,UEhia$S2S-T3$k$RNCS&m-![F&6f30Jf'q[XH"Md0D
D"!@Nma,%mPXh8L09YpM#9CFTc[YipBUk#&Ch*hC`)NC("-00#XU,dZ2bh)frIGK
`-I3%[Pl@ZBh[0hTp)Z"PK-bNM-#a,@j6[ff2r0`EC[Pm5+%(q3XcUS15ZBBek0B
m9+Xf,Aq4&fVIr12-R1C00M!-m'KN(NB3&(MV8[eQ"f34Z`ZME'imH20M*+REk3k
p`plm2@Zld03+qaJQ9S9Y`!KEl',dGM8'c1f0S*YKaYJm"JdIJEVBk14jPR%,N!$
!K3-IMprE(eU4eQj2`&CMc'E@Y+Lc[U"F'GAG1jE#afU!-i2`RCC8(NCe!VmjU(m
r2Lj[TAXX+1i9"-aJBP)S%0(KG4XRTj(-EQ58q4kcU+'NKXZBD29$R5#*G#cDq+$
1Iqicb4TI)iBH3-(rq`BcYQ2+&I),k*fR@GDjRPIEYRP[N!"5b[IMfFG8iCDl@@9
+q@B*iX14b"*023(L4H#+G`cM`H6RU(5kHY9a-iMMZ93'2d*+c"$C-4X"ehp0aPL
eS`MHqJCh,H+YbqHXm+YGKib2JU3"-[AA)GFKb)VpV5$(!X+)L,!kqpH-'+QdLkh
rY),hET200,EHSHAJD4hK#BB#Q0"U%&jkRUa@Dp@2rqXj+ZfiDbE+j)U2Q8SbFJ+
4M3Nr0ZH&$q*qLB(`Q3p6@a"eE#hP90CBMfkhYH11h'I5pfA(emrTQLp"KCcf-jP
"qN3381Gj-+T!&q2&'V-5`YkS)9E1&jDMFl*A6&f%J[-XrdqlP$f@%MZ2`d6XNG@
becPX`6UI4re[iD&M(bdA$XF%Lm'aN!"aZ2dX&&h-P!JIQD-eQ`5,,pHDr`l29-T
ai!*N(-3RLM5Jk8JQ[PLB08@V9Sc5q5k0-,,%SU5S1ammr(6-E1mbkVcY+)j)QU5
aKH%CQk&QiDLmbFq,FrN4q"GEF$p9,ar5kU#YUU*p"`QX+T,E(S'!,(SRi%[PKT2
j%IjUReAd`pd+391IfZ6#ZY(6ia#ATc8hmQbhGQ6h@#GcF+[)r!cikBZH!)[q5Rj
,K5#hF!*`'LmXLE*F$XH9Hm&9F54ITd%mSU5XaBV@($(,!9QJDTB!b$DTl+-`[*2
6QAAUBBKPl2JaME3jFB*Vm9#eA&E%f-NI&+UDhbHki6qpcIG0hk1Xcq#2ZU$UPL5
EfacmYUd6HX-mZfh5%@l8`Er`Fli-i8&ND4(cKXT*6m2fGY39,12-TK2DG5ZQ$-h
N[)4NK#(M6U&adUZ2JbkqERSJQHre6P$KFKepGHID,l$#TUfdZKFe+(CIrR&ee-5
6F9$$RdTCBk5A-J)4p$JTQA2L'-4&4Y9U5CP2`F$FJ!qS-l&jeLK4"'8hM9`jKA@
&aMCZ@Ll9f$m"UYmpFc$L!%T2YG)$+i[NB5Z&21!AFQrI`DlDS(+$A,F1MQ1mEIH
(DT2+X@TFl6XY*)rj@C38'VD3!&kPekIEkFXLd@F0Q8Q'm%[KUKZ2l[*60H4CKJ!
lNpAKXJ,$P,iS0FaR9#Q`S#'C52qEbkJ91&Pr81-m"HU@G*rP%A"D3&5`Y"2TFm(
%V0,N(aP+CJR"XZKP8CkPEXqP`DK&iT5(Q9Nh([p@*iPq%kSdDU4SbNIME[I!bZX
-MBi&BDlkNZ+$KLT)+DXi(SfXA)mUephpYDPKA8eJ0155,E[ch06$m&0TCX'PCrb
c&%(H##a69*h`T93MpGNNHU*8i'A0#IfFG4dSG6,Kr1$JJ+rDSUrA*&M!#cD0k2M
PK5ibSq2ZRV)MQ9CZDR(j4-EDjUMa`UJNETkF@dT4M2,"p0le(6PTmdZ@Mhp0`d1
4HJE"61icJ2j`a$2RrahmA3rCilK)30kMerT&Y,Vfkb6%,dFT6mpcA#!%TZ6`fQZ
,rk5G2eP(cQCCjYF6!4dDlQII9%m[j2BZcj'kHXi''k,*HE,((a"b6jKZB++UPqQ
KkaqP3ViTd+Jq,EX#PLHkNpeGID&cjQ`J&iFJ)T2qpA[LQQ9ZMZ(bV3Kc%E-ViPX
CqTDGhl!&F0DVb9pNiTp"-@9#R5#FIE`h+MI6(4i`GP%P+cb-GTc#!qfie%GVa!*
RkNGC'd%cJ-pdNN[$XKp'MC-!,Q*qbdk[)$lDmBAi&k9#rKM+lbXMjU(NP1QHc9`
LflPq2R8P64qqiLb-,R,,#PlELJZZ@jY3aPf9S@alc!h34qlq%#$l'bR*l1UG6rl
**$$BrL%&hhSDC@YG#edZAMHLSXCjq,K&V3)k!'B%+@qlN!#K'JV%IJfA*T,$(dr
,Krr[VEMp@32&*9[I'0*(9%lM-!Ab%J-$,C*CI`@8fK&r'-##qL'rphGj!J&U%iG
dchLBCAI,Uj(aXc3-BD#J!ad#S5YcT5Ki`8#YeU[SXRaBYFd-"rQ!!lBB,BX%DdM
ZqQ,pEB(!0X4Pd8kB[TqB(mr-p!1DC,a5Vh@NkLQPR0fI9@[Dq8K`i-CL#AN+6CF
#(09jKJirZX)@GPqkpY3rD936arkcN!#MM$Z@Aj!!4QG`GlDUMe6'p0K"kYDI5*V
JETD*Me#I+lMlbmfU2E)p"JjI-S"hM16SIYbGBHHj`Fd8MAJd2ia#V$$H&4''1`e
"Xf'a)LTD`QaPl'%4GD#LMUH6%@i'h%3redUr&PdQLe6lkSY6k5Nf%@b9-e)mJ1Y
J#+bPFrYATmA+U3%bYVAE9)hD#j(J%SAh42DfC4[-+&lX#``VYZ3NdMI!)T,Xk[S
c5JQB)Rd6"5AIbJ"mq`5PM$e16pVMD5*iAZ4A)$LVBj'Epm1@PB%$m!-3Pk@TUXm
1)d'"MSTE&RX(,D(c"Z%IK-Iq3+#M`@,(GDa6URT8"Nhc*Gr0ePH[Ac@k,1bj@`p
l#1&pFKf@'ACe`D'H)D*9M5"GACUMqcq)-qX6PfifDb&53E!fcq'48ShU9#%KQl5
`-mB!p*%Cf)J(lRUr1-&Bkc4$#I$0DGd*%aDE'61[UF2RC[BS+CL[P6R-Th,HZIT
B8`ZHEHAH(U(3RF!eP'Vk[TVk2I8i+dqdR+BMXPqr&Zhi[NLKAi&A6!%MLcZm(FL
R5daHBYI!'$3bY8EQ-kc1MdAlIBRTXemGZP)4XDbE(2NjaL4m-"b2hhTplj+EJrj
Fq'$4fKY8aZFQfApXVZS"jUT18+AD4V`YcmHD+8GCRcJ02%Hb1+!Zf&6[GSXp`'@
5mUQ-+B&`j#$1%`ccdGA5&ZAlD!MckkKh-")QH!D9icA$*hQqjRJ[@#Q5QaQJD8l
1r(B5V9Dj[$)iipi!pB!)0CGL+i[4N4qNX3(Vac6NM0m+BPf3!2T0MmGd2(&8"2Q
I!,Ch3ZV0[jYfDPaGKE&`HP(I%&E)H05V+b-B0N!Uk'ISPiEL%i"96&-plb!"*PZ
LGA#$NV%`EfB!VCPbGYa)qV16aqhDEe"m*j61h8fq-pR-$pmmca#5RYX4%1G!4S,
"flf&N!"kcQ1*jiB"@P0qR@S@5r4%mZ!rK3bjX&Z#Yf1-Nl54mh3J$kdJC$8lRKJ
@`#YGViM)EUdqaq[RJ$3ZiM5db`C1cZY0-#m+`!T!b&['YZ5d54(U(jN)Dmp`p-B
3IKF&F[QFD%B8PhB&Z-BTXrT0(fk-I$'$&!eEZ4-q(8FM[LHqmVim08",#*Q#$dD
&+cVXpDSZXKd,Hc[KT`*FccH'IdB4r*`m)F3%c6j'U*hBBQYbTR[Y,Q4%Hk)I+Id
&+YLZBVNm9)aCP4TMeC[LM$Y#CNGicH4E"Ck',Y-*-QL%E6)GIpJK44&Cq!RYJ1+
qlXhF8H8B@8')Lk9m0eMDR3ZVZd&D2Ib8R#VLRBfP05BkVqEU4)EM9"BkArpkI44
aUPchKNPFD2b`a@P"$&hL!Kf&"MS095(GL%PhP9Br@GNQei5jI#RlYmH8QHGamMS
1[GAbUabTeLVQ5Af)J5ledG"!RR$S6,Tra$&))d(j1kp)hpfLr!q2J1,XJh6C'i2
V&J)Q1-Z'%2MQFD#cckr`K5`N8V`0Zr&3'A"m5Bh`F9ArpjbTr@+"+Hm[BLm$[UR
f,FTBA(jmJ9IM66XNeEKNVhZmIN'mdJ-`)ed69ik-6d'mhJ'Fm9[rd)df)*3DE#e
fF!kr*,R*IprMAJ%hBP[Je@lCI6T'X!Zi5N$!JMFBjBj*[q1LSHL3!(@Yk-QiYf6
q1r0&kM%`c#4B@1T8E"cRj)DmhbciII#mhML2NCIL3$1HjF$2MRXaGL(kb1HINrD
"Vqf(pVl4JR@ATq+X2R4!0jZhKS$%Rd,Y%c-%fD$k5P-3$+F8,%hhBRU@6m9MUFp
L1Fr&e#LqG-cXeE`Mf%3)faZcTNe"%c2(qaL(`9I(e6jYr!(NIV$fdA`M2`iiV%[
F)3HSD,fSZA,9Y*lq1'Y%N!$J89*4"qdc'+,*4,[ahIlS6S1r5JmAT3QG23@Fa5C
rDE0bBjZ&CEfCA646Y+4B2$H3!*[$J8`BU@LUbahmE@aUf4#MpcEK9rQ!&158`44
SDiU0-(Pp4[k*Ga)VjUK*IGH#aRQmM#Lkr'N!N93A)81j@CQ6aILj0i@1[9C+TYe
Ler1bPMqRaL@Y0q)p9-3,9h"9,T91U!SC`BG+VpF#ZNQ1D4-)H29GB#IXQI9Xa"2
ifjp`j"jU*-4J)VUVPb-ZS#*-*[)8m4-&0IX*2ZmZS,825apmak[aklkfcAJ(ka1
I&6d*"m,#L'801jkHHVfZ#h3A,*,rURY*e0-'4)Sj%["#"E*Kh"UIFR'UP+Mf(a2
$P#aA%25HIkM3[NTjECqK1625#[(mR($GLq4*SK+'8rY(rr(9XdZ@mbPa)eElh1l
!,"AG))i#MUKTdR"EiA6KHa5VLq'SGl@i+iYH`0H@UFFG-Dd#0%5d+2XD8YQ+51'
@[jcT0KAA`[&UEhG+)"@I%1F`VF1DHhPpEV*A4FPLD#r$qQ*2[Dci8S0aT`lA0`E
6eB5c*@R3P@$'RLZ3!+58GXFc5FJ-a8-G)0epE9BMqbTm!Z"PKL-BMKC8-K%YM@D
FLG*P0JV5J)A2ee`K09@a0@*QZdY1T(Sq,`4J@4Pm+[+dYae`SSF&IIENqdkJ'94
q(d(V*5e!Ca6PT2ampXQ2VFABCZ3a4JBHkILm)-kdC-D")V+AMGpa"kEeqXp@-6E
,(fI9C'#d!ep*Z4K!ZMcXK"QM"PJ3iqpSqh&G#ZU2L!kmY0U&aj3EpCM)d3$S1Xe
$YM1Q-c`&e[cR,5flBLafEYGM14P5B1B*V`R-,0[Nl$2NkjP%G'(EH5LCDpeT"Em
JI!,FVek%EaUI'RCThBX5!fir-LY!EX#e`Vc#K`pL-aI8$@LMe8HhpVXC95hCNmT
9DfVQUfrVjh-93emC6+3QBiC*#DaS`qN&lHS5!Vp'AeP)!39fZZGar)C-Q5+5pc1
`ZE)kZ#QK6`aeTlM2G2Dp-[4R4ZA#'(Dp4#*ZhaI*$D`86%I'3($j[kDNL!)[G#$
L!"k&T*'ZN!#mS2@d0fMRKS0F*JbNIp@@0f,L10qq(0DJI%pN9)rH)I"cr8QB2#D
,BQ4,0F,pjX3,S9QX5J[H6UGYIY3XXp9+aVpe9pUd3(BDT"Q'`eqPpIPPIb+$b!'
0Sbhm5hP+%N[H@[0dbY00Yb"H,@[$$RBlAJKH340Lp8N+d41PprMbSiF1JAeKQi-
23B5IGF9#DHfd9(Bm+4NY4K3@K+E4j&%N'lIHIX&&5CMLJcedEE-,$qbABlS3pD&
dAX(kTVSeD9(9r0A@K3kM05eBc@%!&QfCZH62f#dN["Yc0!D!0-F#HrPe+q6E`Ir
9+@8d@c5-SEmf90a9XQV6A-$*0FEB3Ve$E6e9"IX-4iF*@FD(Q5qE!6SL"qiemDK
p(*2hSp9)T'a,XP58F@KV'hiJUAZH4l8"qANVB)GP!(H4Ded6LeF52G-LF-2(-+*
b16ilA08&EdAKr9Ca8209"IdNQ#R(ZZPSf%'*3XYTE@,-Ud-PGk8b%GK!8j[jK%"
`@aT(LeZebHCd@hJr&r#Gi2KNL,Q95Fq(KjpAV`XF,mH$IpLk[HC*T&VPl+ZlZ,X
%Pm0Gp+ZP'+Vhfq"ZR-BT#0M-r-mLUQ6U6GI`J0q1YEr"98Sh#ec`jP[m4@jLPAS
@Z4UYNdmQENFJ*0hXLd2JGG+9Z-hqZ`me$&&'6(QlZl814Xh2*m0hRk#,Mp-0fXB
3(e313hkK&ECTTELpS3D@+TJqCQ061)NhU(Z@lRh[aV'bDjZ0)b,lpaKTl134F9L
i-R61"6AU5ZR-pY!cb4cGR49J[VABEXr5)TbUDQFdK-kqCrhh1BBR#5&&pI%4mCY
fpir@b@jYP9@j#&ZE5mM11,Ri8%BBb2Tmj1PqN!$l95K4+ISFf8d(5cQ'6HZeZPD
'3YMr8lrkb6[kL6A$MZ6KC('*%PE,0D5mE#4m(9&i!hX*h",96%Tp))BZPF"9mMi
rTj!!M`QdFR@$q-a(e28j%eUqNREC`Sf`*EXF$Ch4hh`1maTJ&$b46S9[d!$%L0Z
68`Ep8FMSYF-Aqb[EHXMc8d![([ic`0!cJPeX%`,"IbZXLA%UD[#-FLhU%++81(H
ji"'q!$+2A8pQ!,iK,3lVlPXZ2V9d"Yk-(1IR3Z1*fC!!L'hD+,a28,LcpH0Bp8H
lN3m6CA&,*$3IQA1Z+U4K*@RYIiN@X8TV$bkBhmeRKF[Lrh)S8#!TXk+d`6iS'S9
LKRFA+T3T['eYY9dl,BIj(PliYB9+9fYA1`+JBQTV2aG"2S%(BUL6jDf+09,PiV`
)CG3@'Pa[*Qq6'q+Gkm$U+XfF$1mIUa+dXH8(k`Jp[l6d!Bmqeip,TjH$m%frDk5
XN!#3!)%ZMYPJAJYi9ppp+XE$JBUJ)M`+c)2PLN4-#cC`@,aL*LVMK,',4i@A`1G
(H+9l52T`IHVRkC%B+[!rAXAjlJ5DK3h-3Ak*rS1S!8@EpKcX!VaKA#NC2J4Y`H0
0qTA"dQ-UZHP+8@DlheR5D)JPqr%cL,%(D!)UhYM,D88Ge8p2pDS+CG[4dB+qLZD
I5qApE2i6eeTDCE'3!2JBBdiqEU&I`E)UYa4mEAS"Z@j3SRGh1liVSc-+@kK-kQ&
Fci@B4jTC5Im0NPrl3TU+*ReRmiN+i8PpPkr!$pF+&p4,IjJNEI43Jp%c3ki+4N(
N&#P"JDXJQTbVMX81BK8r!UpH1A'cXGQMU*a8HS,RZM*LZ1R`Z(KA1JR%ikTX)NI
kr924YMH$3a3%8`D"HhUR%eq9"A)$cr"-HY10Dj!!2d@'R!JYT&f@i90ApT(+&R*
mJ,MH%D93&&8D1I1hFFRX1SP+pC&l3&N+%jdB%S*l)-,BeBF"A$ID!K3"UPkG0N5
V%RT"*T3"P(*cUMA)b9ZkRBd`Q-,!bX68i("$0lX*E&V6XVh1aE%XkYreE6EZ0pP
rPKAQS`[)iCCI4,E6'%)a9cMXdS'LJ5F&(%h%HLCUM3%PNP9aAIHr%'q@@+k-142
8qH%r16Iek"lMNlYqNaRa%TrUhS@&-"@XF(i`K!F+&`6$X-ZkQL8`U4$S(+HURpl
f@rrr[iHGH5eY(e,4Zq('N!"UN!"M`dRXpTc9NPk1)-Kr-!JS!j!!N!#+!J4J'qp
%VI8X3i-)AZrf%E14jN@YT),Z$$l3KXp83GP+&NHZ8jEi5iKaJE0RY$+N$2VDd)@
@[FN,N!"UY8%[9$-mYX$qT%"p$c$3'c#@ZPk68VCDI*9USNM`2i5EPq,AiM)X`eE
`b%3[3`l3JK"5m(DJ9)%"qMLD,LUD`bRX*Xh%9I#%9i'F4%'jNK6[G0a*q'4"#M'
Me93qXbcpmKS,IC!!)-r+0ZBd[PFR(9$MY+EY6+,`YrRTfKkk"[`ij2QCp5-BVQf
bBq2ib%%df@MaKdQjI$%XVmdaIDQ0m,'6B'mS`qb1Y"I-,,$L[2f9[*i8aV@a1T1
+L[Teh"TmM!'V"U0ePPBfPIKe@"fB0lld(%*`9-LeU(raFe,*m1k&kimLQ[QC+bm
fa5*l8*efKPrE+,NR8pi$*)q5"3SF[0`PrbGeBc[pU#lr'f-YPff5QhhhKE*ZHM,
,QheI53C+HYe'@4pjEQ-JP5r5eNC1&Y@fl[T!*-pNqMd1EbD+D3mQqCS-$c@MD3D
DHJhDM&-1k,VM)(YI@fY2Z[cL*0930Ife"eXHdDmE-r"8DXSE+rPIm0,[,SH25&0
MES!pDp+c0Qr&@QBKpbpYSH-30Bkh@(8*ZIXLp#K'6fNZGZrZ9M$F(TR"`HcL1"*
F3,T`D9QV+Q!GU--Pc6k(6Z9rZ1dF,'$LcK%PFf-&iiji9HR!a#Q@N!"JAD+dI&A
FTL%[`6acjHVNF#@0#lZr8aU+QdHZf[B!0(8KFq6m!MRR-NFSINIbfi#rNBY%#Vc
'rPLiCU!TA@#(cbNq"cdS)1M02Rld6CHABmLp9@+P*HE6+!*l*("k9X59+Zh`$DZ
b)m3)`J(0Cac2re9RG92k9-jaE%`8$@Bj"XZ2VS)P*dpHNdcm4MP6%pdUqdpNTfc
H%hjFd@F21Xh`[NkqDFTiIJ8(b&#M'l*BP'ND`9qApffIkG!R[bEaTAVr(hXeqKP
V$c$5Fk4FGYbpM4BqCi*!drKEA'%iSQU25c9G9YaaY)Far0A@XlS2dAA-lCc2m#q
&,iQ1aa-T[(*SKARAC'MXRDb0U%`-jPk"lXGaee%P)j*B3'G8KQa'@[-3h*q9QIi
rZijj"0-,K!(pkrcYHae*&IpY88qH6!fUE[ak@BG"[)`K'R@'&i&"p8+pG)[(mkH
HVP*[pl$3RB3d3E'TYcH5@a-U5[hU"!eYdS4LCT5eU[!Z+l+IrC[*NXN6UifZ!c4
(N45E(r9i0RaJa"cM5['XM8d38TA881EN%ES'd*U3!,&YG&c5PcLLk(SX`J*#`IB
$0)1a(,de1d0T*DbVeplc51(l&'0H'YNpmMTGFGD(a$a'!U1#jdefD$Ya)CH'FJm
)BDI4FV-[mKk%U"aGJA)r`9e1ZJ-aQ0(k`f-Y[[`P#+'-lTQhi$hEEb!mQ,AEmj2
q`'J+qe1i8*RL#E2V)("haTk-b`2qQ@!k%ISBG%V%@G(*6j2K(A%5)5b*#64"I5Q
Rea2Y&NRG8Z9[`"V2X%6h$&!Ae$LPJX8ajQ8SQDmF+C&Yq*p!Z3H8V4LcQN'dfPq
bETN(59$A*hJ$9MeBN!"H*XN*BXfADfc06D3)Z!J[,a"i,rVTEjS!%-@L(TV$PI(
!Ak3'$EpCYEUdXC3VQB@e$d+"Te*E2SGMk8K'$DcD`dLTQBRVVm0DJGrl"S[T"1%
Y(r[5(k'HS`XH1`fFQ#8Z!HPpiGP($h2D2Q#i+%cKaM[*r6G'@)ISerblHf[S6[A
KTCPLJXMh&Gj)cY&330DS`EqALD0S%[Qfk6pUS"j+L!mZY`*,LqemL!#0!cZ,V,G
$`UhdRRYi!,ckZ,@#XS,jYqb``YI-heY8(!1h+6DL'fJLCZq+0K!`49fJp3,mqEr
S`GIRjZ$lP2immCRa53A-H`KcETrLEP'0fKG!-hZpa5B5'[e)Y!jqUal5(kK-ded
i+$MkQ%MU3!,d[1bB1IF9[GCkUk*6hhJ!TC!%!3!!3`!3Z#2D-lJMfM-!!'pk!!$
EZJ#3!mi!%m$%!!XHZ3!!)VN!N!32!&4ME%aTBR*KFQPPFbl2J#jiE@`!!I$H9%9
B9%0A588"!2q3"!#3#S!!N!N"QJ#3!f`!N!32!%,"e3rPe#b3!&*+4D!8p3I+K-V
9ll6TRV"@)qCMmGmb`r!)he``jaX+iPR!9dI@RL1XBF339QP"'4Tem)R%C'AQBad
afIKSZ*-Ce"$r%I8VX,9jm'2#',&JFR%kAYmA8%$A8J-kfqQNeDhA"!"#`G5P#m!
qrDbCHA8Cm*d0@T(k1j!!IY%QFJZ&,5r``@Q,bZf95FVFdd`hY[a*(1[+`Yd`&qh
1h`1Z-Q24eF8Ei'&ZR8IqEDINldPDbA(ikJDKpi4YYiS9lQh$Rfp6rKbi)`lC9iF
V3TX#4)1ei49&1,)8"+Z*#Hj496lJXQ',$hQ@-Zraip[TA6M2P4'C"0D)1G[I2Nf
BXi2iZ'ap3HmrJ%m0RP#B!Yl*mPbZBDRb-ER`UDRdb3rG5EmX[Lb(,BRRVB0Q"5V
VaX["ZS%rR*Bc#N,3G(`8fPp6Mc#dR,m+0[djK&$5jCXm!"Maj8fjf61m`f(Je[U
",%@qAGbCVmQmm##G*b"RK2QY1RZYa$KQ3i@ZLFJp'UbF*fqA&3pQqk[iCVp"83p
@f""CIG*KNi1R9VLXAKrqF%))D#P'QYq(h(eKGCdL-4,R[&l%D9#pm3cHY,YhjZU
FXN*Tk6'rQF*$Q,'BZcjfY#PX5N2+UGLb)kM1#`Bh4`e**`1(TUB%qXHGQ-!*F6P
!h*)GIhb*S4`8j-bD2cke8UR)6"DSfi(keqrCpJVZrBmbbQ-FV6qFk'TZ`EacG!l
)CJPUTcD[himj-%V99V@3!169mB5DafX4@EEdIa!1c*5[M"`1k+eFYNFN"2A($,A
SGcq$ff[*K9PFf'1B-6NS*F+0b03j2iVV!H*1kHEr`LPP&Y9mIYFV40@`#pBPHaa
2rbbf)[$)m94jM6JkThp)#fPidpj3JlJLG"QfABCVdb)E%ELc1QrYaFkT%lU3!%2
l-Q%,0@l*deL`D)l6q`&3Ta8*qS,(@i)X!6J,D",)UJF(2eAX9mZV`kmKR8AJHS[
lHN6ANYKmqMEmBEXEEA@B(GZ1pD"c5NhHLQc*cBV(5i86X%B$ARB)E5ak#&-!Dr1
6plGj`leY(aaeCmf!$*1)`*JFDP$9k2Y&2)`)f@YQZ3ea,aN5`bGNIELK(&0Rp6C
%AA6()@DD(d1e16K(#0-1r&jJ9QVDZ[5G"*&%h3YHP#Cja&IYamGa%Cmp(#$-0ZJ
$"%YFBqr&DIMr[`EDQ5*%D*5c&%qb+NKJNDmN'Vq1mS(04cE$5N!idD6@mMKZRpp
,0ecC6VhiD$J*Qj!!0FNbrA-&-JH,f0di8Q)0j3DaTIYJ$j!!Me6Y40%m+LPZ!E`
&8d2#T&Gh&C5qDd`"9J9CQZXf4$P&Hp!3#(S@ffZ[[eC(@&8LSUGE9K""FAc)d5,
BC1rVFb,V512[+r(-#P3bYBYjI3+mH%de+M3Yce1X,i+eU5`hm,,qLA$Ep8GFQE-
&2D(P&SMF!H)PGTZiHDM2C'cbA$Mh&qSMB9qJP*8&Jp06'`VDm-eEiFBmUHY9MEF
CDi`Xdj4+445L3iRbdBfBl-mE2"i)IM9i&MqIPiS'SKaR$#A3(01Qb*jlZCji+mF
T02S9d@MkV`H*b`!1"$@fNEI4Scd2YF"6a1Bb+Si+#cm`G9$S&,qXKF'c4KFp)"M
I`edfk8QP5)$)4!qT$UDd)"qZ+681)2NQ%efjb[13!+iZf`AG8i``Tr108Lb0GEU
akY'Hqpc5"3A6B!$X@`&KTCJ$G'@R6*P@[&*,%2qVXC!!&kB(rE$%&'HmDh)p#Lp
h`FZbCeR-98CR+N@PGHGlDP3$P+X2E8khRkIlB*PLe9bV9IV1ek$-%-V,c'+#9GF
ec3)ST&KN#p@d1NY6p!NMXQZI`dJ!AmA(`pFf*N1e%YI-kG)[CePRiZjR6GTR$2X
'$c,$P!%P#0L*@Ia%Lc*Zql2,H35$i-Rrf)+aRr4F6`C0&h2E!m#qUZL2(8q+X&`
DrM&0Gi"5qqhf*`QXCmp`b,`0[-MEmhbBVe%ff4VLVN#"m&E6P(q,JFDK`HJrLK6
E6am$Sdlq!r"k5hDibSNFjXl5Dqpe,,c[3PTT%r#IhZ%Nme8lF0P@d3k`5B5H+)4
(c8Ikra$ebS*3CZ`+P#dpBSPMPEMa&e)*RTlG6FN99'K-PXQZ#Y-GR1Q6UFVRP9@
bm2*hZTHA&k#R$eBVUET0jQrdm%T,5K@020hme!I42J-DJm`iEj,6bNI-JLMeBE'
H,4IFYGa1%(lRK@Xb$J%N3I,P1cf1iJRQ#6SlL9k4!Sm6Lk*,fPjP0TK(mGj)P(l
Q9+5Y@[9b3ZmRq!N)i(5$JD0U#2A+JDVPTJLh'p2lPTdA2$,b+PiXLqFe&fcP&F0
i$!EDHH%l[586'iPebb-X[(fiIf+b'Jm+fa"2@XIEk*0A4(TEUU`4cUaT@#*IZC'
d4J8RKdV&%3&I'!$HH51UZLmkK)Pa,lNID1T6S0jb4H)KYJUJ#h#p[emBhFX,0Z&
e!0JZA$QF%VFX1VD@K#P@hBH1BeI0dBmaF$bbe(J5Y+iZHqa42IjY+VD5Mb0dS2'
m9a#[04YF2cX)lperp-%ea&j&bm3LffL8T(!&Ba)eq&",N!#5+Qh+8I6+IB063+$
BeARhqphqM2,'e&P%E"!++&j0X""Z[L(RiUG1JFJJ'&0p3UY'BK+%iPAdrh1)`(&
JX)Yh$8k)"XX"63ND+q9I8r!YbY)T!D$'bJT*S4lFmlIT%h-0,p[C(jm8EK-6U91
eLHarG5I3)E)8dU(aXcr-D-T-(CHVaZ,#AhU6hlM2errk!D#(VhMXP#,a2'!#Mp5
5$EZCXd)hHm#SfD6Ph2UHR$FYqRKS9X9hQ3Pq6Mi9KX&Ed91`UK5((d*K*ND,9Gl
NQMddr))k8[,R!ZG#+&G!-aZ8X(d#3fNKL0Z59S#L,NE9P3QQMX"N8%F6p'#E(GK
kK8QEDLpBr@f`rQd0-+*I'l[4PC-T0l95l@-ai[*$PTZ`Z+9BUmS[k!Bj,a466#P
Z!4Z0-'Sm`Z9`)TQ9D(qpUH2(E5'qrP!PiN6ZBY6&FG0r*)r+hpVZdc3l5a8YPV!
!#k$Qq,l&jb`H8Z)M[YpDem$,lA(Z,(ISZ8i*U0ppqUNd1(Z5hT+Z&Y'c%ibTiAR
BZe"mcAK%P@SXQ&HUlYkKdL%EZqrTqi2[&YM`IpGrE@kb0aE,aB[)m9NZB0@fMST
h3A$A[P19IVa420&T0Jhc9$(ZpEb19SHPP)8PV%QTUa"ki#MPQk$k"FYf2rMVf*P
"aJAa,1RU2lC4CD0k05qI03rI"T+83eAZKqqVa![HJr%bX500jSZ@+l-mUGdh2i0
ZAU6A,CGJJ[EG&8,S&)Nc0EmSpB13!(qHBd,H3Di#ZrHP`k[cJ%-ri6A2JDcZ2H5
Q(S8&8p`08FSK`,Al,aZFdj!!p18hr9$ZMkZqNXmB[i,1K+5mj$)JM#TT"`6REG$
eek9&+3b+RD5m0EH2SN4@ri6&9%VBj3I&dL*KiTF'meH1QGi9C(e#S)lG!m@Y,ZL
rUFh#M[Hm2*-J'Mi29`5`*DRbYcFEMr"e&,-"p!!PA,R#LjrdbK-c@9Zr9-5S"4!
%XcR3CQmcc)@5#cc[%25Cb-dY#82kKI$%P,X5aj,,NAGE)TbPBpKNM8BR+Y$5$26
X6`Q'Ndb&M-C&l0,iZ(drQ+[8T6k!Sm-jj,!HX(Iehp2YYe#q+Nrd6DHhXG$-"LJ
J#l8US*lYSAm(3k@#M5HY`R&ba9XKraqi,f`5b5mii%1D"rfN0FJX%-0`&'eUr4e
C$9M&h[Jh4ak,,(f-Zp96S13Ah')IDC[&f$ZTQd#`c*hkbN%)'+9m$DpZ)*b3!"1
VYU#-[Gm#G-5MF0N%DZT&%1lDML)-4@hYm@lHh4ZC5D+9Sf!#2-fl*KL(,1`p'SA
rAM5+D+(bHlk!Hab'P&[eM%TqETiq4ZmpZ`GP!9VM-UZ[[dAeP2,P@**J&$'F!@K
#Hpq"%!X4Hcm*`F&aPV00*l,C+[LeCShA+k!V1$1rmpNb"j-K)+i96m3,*)Bh!Qb
j+`CK!E-pqM5H-#(5e*!!h8(jjaGYQfAeA-0FCKGJef-SUBGh@1Bc[d8*aKY#5Xb
6R%&)k*cY4qZ#[%SjP4RC$JA6G4MmZ98a2e8X#CXD'lk(RLDDJGpS("XZBlA5iKI
VB+GhZXGIb+"T(f0r)0Dp"5(Je)!!iGkLLDTLQH$i9Aa6`8Yf!4bqc2X*5%cXq)&
$`3KkA!"8J)-)AjIG0,)f3#H`fpmc6AV0iLpfIR4Xhp3`MR`2"UZ8E`D2UI6e3mG
4d@rf"5mTB9b`&0+%9F9)4!UN4KGRL14(QFM-KIr&cj%E1r9`*J`-rGG2dGp0ZAG
!-$,&IJRk4[qGFAaU6d'm9lH!XMXdX0rV+'PZVe91hlX-cFc+0#SPR@p93kl#G(q
K85p*G0!p&r09VLSMUQK%1cTb"aCN'"[k)6qkK8"+Jhl'2$+*`N2Mr)-GbfQ"T,Q
L,C,B&ZJXlKKUl+3k`@m1APC+$jI"9U"Yb&0$'(YDKa$P00H85Df@2$VhVqmD4a$
9AL+SB)l`YB9TqkVRX4Y["iIM-bI0`@KPrEN@kMJSbbL@jA#EIZq"@Hr9`M5"FF)
jQU*3e9*N3944*M%`22aqV(&%d8"R#1dh'%D3!-SjkFP6jd"KeKe!q!N(0+D"0UU
KDVkYcm1D3ad4iHAj0(@Z%fZaU3Ll5JZ*2b`H5eA'8b3TDPaQLa66kUA1N[U,f!p
V&,lm(*DK%#6KAABY,(-rN!!&!eh!69(HiDUiM9"Sj8l&N!"LZqVV51`iQ,'3!!b
Z`H&"+V8&6(fDr-+dm9N4X'H!j50GG10XG*`h&bIZ%6Q`R,kfLH6Via0-"NHK0"T
$m9JqqCN-+`-k#6pF"1-5TA8Qq"#B(RjQ,i31&Q$M5M*KIA8Aa9Kpd#$@B-NZH05
LH(,RXfD-E2Pce#Pj0#V"d(!$kjlKPqXfTEqFUlafK*N$j*[9S8eP@a@cMC[[D+(
JadiBVdHi@G4F4lB*H``j12'YcUK*Nf6UD'EGc2a+YI'Y'9cQF*c*1C4F(pYMB+3
c%Q*SV)65[%e@2pEfrI3G88HT1+346-Da#JM%,NF+[8C[P+2EcT0m@%pReb[H+-J
82TUFZ2eY-UGC5G[*-S*pkcqJejD#X&MP"[0(AZdqBb"b2EP`D+efrV0b+$0l88k
#dQeSBU2FFHN!P2iDYMT0V)Rj0Ymq"ar`PaUS*3!hDJF5)TI&b,(&Fb4M+pA!UpP
0dqDfFr,*9'Yb(-,$SqAkRQMA)YS4$8k&HmSI(AAaC4Q,J@!f@'$*lXC@T,5S&*4
X#*3&%UXJNEe,@!ijReLiJSYf(U0eTChhKC-Nqj5lafbaNbi80iMHmTjL6!ZLd)Q
DN!!@LS5%Y,S-H1l%eG)KHS$ec8iFifTBD!IYLVGZ(3LJ(!Ql`j!!B@fSd+d[3"`
LVph$0ZpDpREMkD*KN`,S*#DV9&j234,c0kjiKd!@1ZeT6"#j&m2X&!I`K4k1a$L
GLEHPTTfMrK1l`E(F4G)!QR,c#-`)Dbrr6+G*Y&4IpHC#)rBYES##VR!UAfSUdLD
RMbik!'38%9mH%cck9J)[hR4VS30YHE4YTQDBeKp[-H6[piBei8@HQXY3UVe%+cV
+akqehS'[*1`lX0!Q%BL!-e*VQ+,$33YQ-l%d9Y,H&+c41I9Jfm5'dVm$BR'UUmb
pdMHrAk84RaqKp"M0)BPPp0+qh58pZ[1P$ce2X`reEmL+BSm`(2l$+aRifS*-UX)
3IIT`r4@2X2p#Ybp"q#lMZE02GcIC,bJp2M)FZ+CAdU&DCm9K"H`B&,kicQ!4H5@
p4lP(HG%258%pFJ')-1$Z#*JIXAFd2m09Sk4k-A6-Y5%aq[bePKb#aLXE,9%pYAp
)8i[)Bjq+,58a*pm,e,`Vlm@$'q2L%99XK5eSTGKLFQdUNlB'Aik2YjqA56cc4$J
[!Sb,T%8%9QH5&1(ffd`V$BZB6c[,4K8bj@P(Z`0fUB0C2Z&el[$*[`EP&S(%PC9
PCG(hTrb#P9RXkBEb2dr'T5dU$R#9Z"1b&$*!G3iP05k0PeS*@r'U+SF*k)GZL8#
*2B[aX-+fjN"[Vr)Yh*f(mMh"[`J!UFRq15E6XjZLT$M1V(%@GZ#99MH+VPmPU6q
l*Q%8AiGFLJHGU0`8TMmGIpe*qPZ[j[8KYBCjL$3pFG@(KZ'R6cRX&m+LT58aiNA
HZ5)JK&*0q(5$(G(cI,"CR5SUHE343GU*U)+p`rE"LFYZ+Va6raZQ!T!!$0MVAJL
XKFY25CDLk9JpTS49iMdKNAEqUl&ec8DL6M6R!%+Fr-P+HNIld$fbqr)!HVfiiZ1
#3Ab'f32MD@U&P`,ILGh0""XE(DK+`aQ+pSp(U"!Fj1$0AeqSG"hDEUZQ!#HJ&K%
Q"3104cEdQh28hD'JkFB[TcTp,K"YJBQh2PHH`NQ+2qGRb+9a@30MAEf"*#'HMHM
!UbKDS0JdGAq#pSTp'+!Y6fCAh)+jbeVV1-C!FBD&lALUCq,l-AVkeDqj0M+Rf60
H2GPp)E*JFp(Jp+9amRKDRGpIdL%i`1lbqpcF-2aEXX6l)RUP1j2"Kb!Yi4(E
AGEGLcr4C,#2YZ$0$P@BrAGTZ&&5MI51-fV(2`Ra8*,3)d""jG2ceq0R89iRHF%f
Y5@f9SHr!!HCT[5YV3JmBXeX)K5PURafr9abCipRE9Yl%EF)X4Ta8S9BZ8kjPZI3
[e[5,P@4Ee3mBm)5r$!IGB#irUSKbqF3d2$c922()rb3ZfP[AYhaR8r9qLPU9P0'
B@83#Vl3PTiRIT%"Ui)G8+d#r&m`&$8)J(*KL0JF+d@V8-`Ikb$88B[Q['0rJP`r
6$'!6AZr'6""JYJN@0YfXA`,D0''qCYY#4ETZfXhPCPcf+Kd[0#aDlc4"4mLBRS-
R[ie%8l1k#JC%rLXF,Bd*lfV&h&Jp%X0af[r&,V2RkCCDNqHKB$+4(Dl4a4-'AYN
&(NX(()(F)I#S[+4NpHSAD,l,)0*-c3*8e$BQ2,*P'JM6qA#'Ff@p-BprdN3kMP1
5e5jlHRBa"&(aXmB+F3(%`$fFBZ95d,pahhQpKiIEE8&d3&D9kd9peqRLdr`Z5XM
@`2bF'h8SHABABf2iXffB()@`kkYm$S``SP")i$PFGkN9!fZRCjEPfPj`Yif'FJi
fF'T*cdCR$pY$DVY@jSl38k*S-Zh5KjPd#LF,DPkJQJ)UDA9b30P2Zh-#1A'l"TK
QUdGqUHQU$3k6Rj1--'EHdJV6qQGb#RV-Kb%CLFB'XQ*5GVc+KHAe&a'!cm)UmKA
1(hH,Z1$Z!U9dh8SZ5[%*8MV5V9BFY!8UBd%K&bYY)V6,!2dQY#93B)0'2RHP#,$
`3,bCEJrNl2`9ZZ-2mYe"e2[3AB4Vh39pbYXjVKar9Ca3()*``F33C6Ikkh3VP%a
$1)5d"FKi+Qa$PqCdEPAF3dG+SIRHA05%PfAE!1"EhX3h2'$EN[XJBLVY*f1"PS9
(8f#9CV2h1Nd-4(Z$%AE(+'$)6)Jjm,i@@RBEPf83(Q3SQ'hKUM-*qh0d6N[DQEQ
*d%1HR4bCm(pQB#jYNMfl)PDIl1$H8a#S9PNKH1L"3bDfVciY80`Jb3p$LFlZHUR
m)ddCKG+#QVqV8H0JJBCe62#DXQFp#bhh4QZaISZ5dkZ"%'MfbRTUXJ2KA"Vcq39
F0(*c6&b251[CLpP'M%hmH#5j@(@kPRj#*4$4P+#H"q25LIL2m!eb-1F3AV+HmK*
pBpkk,k``)6UCGd(rkKGK(1dN"KUj&eV0+JiIEC[$LHp[F6NKp'!pBlp"`!2kLmr
C8A#Q%fbSQNYT-&X`J`)(G`I!3l023Q6[qNE,kaAPmqM$qL2"FZ8`AE[ZE,A*!Um
r8(61E(&CjaTD$fA*CX'*9j0)KLqMH,,LeJ$GXRbR!@eU-QL%-L+@RF)MZlBhBL`
AVKd0(RpX(hh5!SS-d"dF*SY')p3mTNcLXIJph3$"qPL+fCP2@b-k26154%[Ya'P
[+H,Fb$Yl$@Xb2`CVZECSLhA&3MhUJZF0jSRXGpS48-*c!lJ)d'TATY'6kqL+2Xb
r*Si#DK!0lMfdeX2[+!AX1(rPSB1-M6SA"`'Rc6P%`hXJ*adilX(L!NA1NI+$-&F
-'JX#EQ%MepTp#HF18EaqQm*6L1SVhLaSb$@NX@V'YN2LiKZqApl00UjdhCeIPT&
q**0NT"TMd"IX+&CA9D,'lJAXTikPK3*HF'+*MS*UL#CSZ9FH!,BMcCj#GlRR9NA
'Tkc&+4$XqMjLEh,*PTCD@DT%(M18i"[&-Q*T'EP54(fFr[`c&aq1$+I1"eHm6H!
-D6hA`l%m4#5lhZp3KSc1qD#3!(RYLPb2Er'X(#IqE8!#&J*0!$"q36hTXSAK3YC
A[&3cK[+PaZkFTC-eB)-r%Q*MrlV#l&'V-q"VqC1m`$(L6j9+([hSSZiC&l4JmE'
Q#ieI$Ej4&Gqq1%RX`L`@[H1+Mq#1[J6&ckRZQJBDHk1+U(Ap34Y2BiF%-H&-e1I
I#96cMD@3!!8&)3JM%!C6*-!$3ISDqUbih#l!M9%Xa""b`ahHH"j'LC9L'EpH@5a
M'@c-3Uq14,bGr)4N-e3R9-*XCA"Vl9Eaa`3Z$)m9+6fBC"+c"LGE5A550J-Kh"8
b'DkB4eKK9q4h6pSBr-Ih1+Yc@$@#rEpi'F)`+,Qqq"LJHF##9d3kRRdUPqNQ)D5
KNb"&@fkERd3B&&(!##)`T8pV!+S+aXhdRGi)r3(Rk#+$X8`[qkZTmjZEZ,S(4j'
!+E+#kDjMq$@4YCS8"2pr*U%+Y2D0E@'C)TiIAp)1$pRL+*aAFI+#5d,VXA"+RQY
X+!5qiJMe*[0l"!Yd,c2[QENLib#d2T`HGJEpR8pmZYHcB)P8!16FJV8[PRKr%f(
)GBl(5bbEPTH96p-K`"[c[2-IMde,D+`p&A2'-88K$0CBFN"Q'*fPE1b')"DMe$F
HG9[2ljm'@319$5+T-Z'*hFKpBYB[0VJVh3UG-h2QIeGB&9I(4H`))MPc2`NL@m5
NEb&bmrhM#c[LJ-Z[mX'p5q$-B8@+SS86h6KL`12Jl)(RB@PPf4@8Ke%Vq[@IF#&
,a*9f@hiqeYPD(YAh%Dl(iHe`)MKX4%BPiUr#B99b8J""DUrH`q"6V-[mB3MMrkD
1)qYZCj'#(Q62Xjk,K0D![8DMc8@!FK(HXbIJH(U0,'jF9hZGpmHUJM&CEShHS40
8!Z(@KVe`HH6T-RP,abU(Z*&10`rf4!$V!`ZH"hGcCT92V$,Ni4h("m'$PcK%#14
#kDm8UBV0*"D,05&[hDe84$QaATTU"S&[G[f5@0klE#Z`@Q1h2Q"crXp&-MbDdcG
1&jl@1dD!lYT)l6+@R20N(2aM(BHlV3Sjc-,XVTHZ!EP9`FM31Hf4F(KBNl9@AB8
4ZZFLl[YkIl"HaHja0GVh(FpX6%f`,*pf0b#C+Sp%FU33Qj!!``a,)q8"P"ArNVB
XL&*le998f&Fc*jEhFE%iB9ekNk'*R'L9T1T%m#1lGrM(@UKrPA04eCIMm5[@64M
LM8lH3XP1)E1h-&EGE!18,-&C%QZ`R'&Cl8TUCTY-eZ#-m46DEdLPLd*))bc3-pl
S-GHSDfP4[cqM9qj&l&Xk&GVL3bLKh`hp%`4JaIA-qCaU'eNUKlqGUS-QFYCVjUI
qX2T,!$50U2J'49*1AmmBMM+8&8E,[ahl*C2-ZGV5%RcH+*GE3e80h6N[(VTlVAr
[ID9UjK-S6LUKKELRHk2(5bM#*eYm'Q81D$@KHD8f)'S*K)@2Jf52iiFhTfR"5UD
RHE9+!6MVC`jf0RrSR+pH3"Y8b"4[IedY$T2eeL00-BQ-$,Pq6UATh0i8%[IFirQ
[d#50b"Uh5K`Al,Dh5+Rk4CI"S@j5[,DI$%`91cDpZS3'5*b(d#P8rbPYCjTFVJ+
e[!bcQ6VDbGj-2Mf@X8@5$JGfK8H49ILN$lD@mS*@K8b&B-+Y8Iqj)RTYa$J+SdX
,XMm[14!5PEUTDGK2c6(DEk5X#Zqa-MVhAJf(lhFA@E0C+lAPrBNBiqX(IqHVBmq
ST4JAEfR&!6Kbd&fdGp+FkkVaUR%d+jZQdLlHGZCLPbT"AR,V"HdQ'%+XYj98'4k
pjJ#3!*4V-kk2i#$ifYh`LLjI8lP@lD8Y4@JPdj8@0RS$E*@kN!#NG"fIZGQp5NV
k@`a'1'6@dQ%p9R[%#)Gi`4Nlk%"eF3AMLb19C(9V8X2a5jN@*9fTe`5&--&UR!M
i8m90#c*HRI#1LRUqiS@N5Xe)[PN+3AqjkBd-@VUEj5fDSr&`,kj&br4TM,pkG2Q
kj+ZTZ6)rRiI[fV&I,dr["qTm#!UJjm@KL,m-BjZ*,%eVmdhXBUSE1mp5TeLI2S-
HFElSNl#5LJ1[RZE3e![%)A#2[M,K!D$X-JJp!'$CXK0(&m`B5GXdHe@&3IN3-HH
@5C!!f4,JaIX!`1LC@%R8U$Xf`!Idc*-#`*@P(XfGFH4)AQEHh)5!(B98[L'l+f5
II%H*rYqPXc6K90ELAGQ@KM2,'c)XFHJ[@(Tj9K2+l4)Z1(dDd2b4`4ek'"kE#r`
&rjR66%CQr[C9M'Rk99%*[CZpB(0#V8@&%PaHe,@5[Qr2*N*l3$2mJ$`eVe5N!+C
A@33HD#edF%dq4cE9!adq'P0amh-6[8Q![$3I2@2BcdCi9KhMEQ"E4HEU$Y$,0`T
[Ym$5!%TK3`C*40fk(CM@IL4GpUph2I@!pSd&eGdr4+&refYEJEjKeVMKh#0-,"9
'2*D[jQ"N'Gai'I)'[ChdcGj1L(K%PdZl60D4'XR)"29USRQABR8PHa1dUcLZcVB
JDq8Q'M&*#jFEbHB-m4-jGc)3NaUEGIGAKKMjSfR,MBaf)G(K3Q0NRb6NSV"'8cD
Qi)1l9p%MfiVEHR*(QL$F-A1*L-qj**%Je9Mi1L@aS,&R'UCqDmq6VD[aIQK2)3G
1ir6"SVb*9+Q9TZR4FfSIIq)U4ZmqXT5C"dc4m&QD)ch%e2'(')M1FMp&PET'S6c
!KE&UhSdMB8V`lDNqk#PM6cdL"8*8$*%T8eTRL-pQ3cLH5DU3!(#6M!"Q+d9YMm$
N`q54ZFh9JNFH2%RI$Fp4$d-U#BTd)2CX1P-pmZ#TL366L**4lQTGKM@NF3#3!)m
*DG3-R'FD'G9'AD4T5H4ai02S#!8EJLr#FLd&VZjpHB)T#el4a@P[C)5FL+51F@(
JTfR[h*G#iXl!jLrGr1fr"*r$KIB*"@SBF"&PEI8H3h#kr,E`NB!fC['IJKhT`HL
eYlEr6*Xr1@C(6ARhSKP[[dIY',rX4'$M)&a20eP*V@&'i-4Q"KffD@$H11fmkC`
@&fjM'XMBG9rC'FELD2aRXCZf("&(ZF94"aEqDJZTm'1Pc9BkiQF$j,LUMmae&YQ
*Maa+1`0Z`aV9LGHD5IN@D&X2-Z5@L01SkdDP3HD0XR"dHjE$KM*RDYV&EeJfe$c
m0[S+d4ZB[5XX*SV4e+'Mh'lE4"[HZ68@4l5aqiXEG@Nj3`4aXljP1#p3Qk%MLH0
C-C4[,EcVA[Lk@q8H2rNPi5m!pAQDc'amhS&(-Pr12Jf1SCG8&[2SC&'(c-0cbX2
U#rPbp`SBNSBqGBD49F[QC@3ZF@LH9HC*Gh-Q9JHq%%remL)l&p-hQE[UUZi$f@-
JI2"92iF[pKU9HXEbEIi3+)[`@QKa+(&Qkq!N9m@J!YA2qhJ$%6Dr1&#dZRG1h5e
4Irk'jC@BYEb,D9`p1!m&GJL5e1hHDkAk[jNM[['V!RV9b1kcVL'HNLUSJC*TeT)
2P%Y$5+VqJ[EFG-S1HLYFN4KEKML+bPZD1K5@)@@$j,mf&Q*`VMLRY0$mb*E8*3X
GD0I+([b%'qaZ,l,KRr$mEpfhRekXLES3!LmN(Teq*,FhHHCj$ETl*[ZDr-C-c$-
RQrf+l+R8-9DC9Q"pG%+0a[&4r@$QFGr-Fre21'A5)AeB)'eYl)J"Y[FhU&`&8@Y
JEr5""*N5LYN%@"CL+k#V4VrihV@R$##mNf1PXHc"T3%&Um@HK"%c8dpCVJhYcl6
42H"A*p9%AI0k0@Jr*iC!BJ)@EB'``k*h1A5`EJ#PN!3"!!!m!)#dSF5TYeNKK!!
!Z#!!!3jV!*!$cJ!-@R8!""l(!!!b83#3"!m!9'0X8fKPE'ac,Xq!!!"!XNe08(*
$9dP&!3$rN!3!N!U!F!#3"N,"e4rahBGB+p$IhcA8XarlKIRL%&4V![@Lk23Nd9Q
!5FZ3!$XPbE!!pd8Sd3U[HaGHml,03e2dMF!h#`P+6FYj+IYU6IiVf@,5S@,-fm`
#lX%3eS#-pX(1G5$44qR`L%l,CrK*Gi,($q8G10YMFVJDD5+p@+md"k`235Mr,bH
U4h6C92Bm,-jhCm)@5bQ25h$JQQk8H@V3TR1"KmVGNb3hee(N&AF30#d-4`NBA$b
5Q6H9Y!RlFJScXX+0aMKY91pSaYLa!LmK@2)XYkNipNidb1i2lZ(VqaUGJjUc0Hl
Qq&UDic9T%%J+8miTCbN!TXc1#-K(k-GYZGia`EQE@3U(&`,C$GJ#RJQb9[r9R*R
BI1XF-TUc6-Nm(B63YpG$N!$R&(m,8I8aI!#GlNAm9G"68@CTMX*qIb*BD&8Nme#
kFF$`VUC8C-9h"PV(QA$h`Rfb")lEFI&F4`RU,$6aK1rH3JrLVBekVd,36EQj1p)
S48T'X5N`qjYJSj6RrIY!Ja(p353F#$T*4Fa%`kGI4X)ZX)%YMLQT$Z81RH%1ZA(
ZNLFU-mjp9m%UpY2+K+Xir5NQdbr)p#qdkKQaj4![dU1k+2#hMIS#4@RBj2Tl+%A
cL!SreFj`HlGZdEUH'V!PINpZi`hjiS'H`F*3dH`*iRlC1A@C,riSMYZXpX'pHfQ
53C@kpiaMk56a%'c$@md2%cLk5!)#IrdeSFP+[e8EFraa@V!L-pI*lalb&M*F#N,
+4PAhRfh)BFiK+qepj5ZIJ%5qL`eG&e10p,J9qA@%%,lB5F9qH2UD8P6C'Cm+@Td
P2RP*lmb%T)2'4Y@'++d@V4Gj'H53!%@11CCHdI(h,Fq5hEf1kNHH1lKR**&+1[-
iBBqHS!NZZ(HYH1Ge#mLrMpliYcDXUPe@N!!bH'KN!ZGkacb-2[XRV@[*rp@8md,
0BCB(`FiP5V(%Dk0@TqMC4'5NV+`$dm3!Y["89CZVJDa[!KEV4D(kDV(GjQA+T0V
pc2#Q)*fbYAc&@ScArE5maffabS0G,1cbbPP#C!UbT&pNECASY,L50P!iQS06N!"
FU9P($KY221+0R'!+Y3CTr8qReM-6Efmi))ZY4qF(eG"l6Se@iaedE"@q6h-VSiK
i@Daq9JAQm5H)@508pVhI8B(2Ik3-BVd*p6!jJMBk*Y"VJ`j1M%`i&VmKcG#hFIq
%h+p*4909a,Z[a2pPKkmmTHVCiAFEYSh(@QReLRDBGU)0J+1p1*+"klCUPPf,))j
8%cUlmR!eI0*ejNeQ&Vrk&9(3F$QY0'13!0lK05YrNia6(eU&6P+p2EiR(GJZ#Mk
+4D)[5N"5h9B0iQ[Z'ZmIkR`[-QB'3mdQVA(G,fI[1Yb&RI22Zapm8dM-J1T(J!V
T*3"[5i#Kb5kR%YQ*$ieH$T`erkVf$Af5*CjX&LFeVT4@$QhPi+ek`GbmVZ'HY5A
#L!)h@(ZrcH(h0#fK8k"bqiX1rGT%j2p4!"EKM26[Sffl&)(VI#Rh!cpaETHX+P(
!U*&ZD(N"iBr!J6LL%Pk"J&-VSV)#@JeDf,`5&cQH'l[6D`m`SMk"!%4Qqm(U[V"
-CG'9Ak$b%Z+J9@8Hf6FR25J))Q'Cmp15&dPUB2XMrYT,jp(S,,L$+9(*EaD%YH[
$jV[3TAlkG1C!DU&PV'*VKC60P,`rPR9M+RM1-DVaH)0mlCePa+9$9b+(E98*JQ5
N*P0i,Jl@PiK%5kI&-(@2m,"c,N$,Q"fI6++,$-c+4ReY+ReT0ql"rU,-JM92`hU
IAjJAk!qlCPMCMIc4,mTj2#[Ca,`r2'[N!PMrl"lX$9H@kU`YPl%Qq5c1641j0ra
X$(U)H"*"NXdh%XcdFqC8G6!aV"9KT!R$HP-$,,cHicc0fSKN&N)rR#5H4GI(#i!
kfV`!L`Srq)FLfJ'ql4+T(VZSi+#rZRGE#-&kqN-SUHjFUP6I(%K"0#"`r''@Kq0
k&VlFC@-jP6YbKUd,#el'$`3Vh*RRlM+9KKRLX@+[56#P2hT6i+QN6)j8i!I'bAq
85&qF#U601dC*T([*pb',ZlfL(*PJ4h%M(hRG*MFLR#dYV$UQPX3KfGYfZi1mrrD
pk9)Sk0[H`S+qb#I3%aMFZT!!LZq&(r[Ka*@,j0RRL)ai8-2F4T8XZKQ'Jh`Lqr3
&NLR*JE3S$1j4"#T@-4KYjeZ'd$'ch"[2M(-['$Hq+Yh%3H8,kV16FNK$ZB$%!r'
C4ph99C-B'ckLT,FZDied6DbQ'+[P0Aamk9`fVS(c'TEI3dVKpXd[[rdSC3Lr9lE
VZkcAES&Z'-ErHR@$C++9VlC8*5!0`hqhY"iQm(rZ3eIjYl)`"YMNP#82rlD2)GA
'RArRJpV"(jqHGD*R'pFIMFFchJGQ3-L'D11QE9Hl96S'&YIRk&R0dB`dQm$8[K%
9*RQEKPAB2QaL4MN[#$+CMVYraPeFpcND,mQ8*(fM43[cbQ!0h,pK-8Q4bpUkb`H
(U-Q4*A4$i3`M[-TCm&e'T,cZkIqpJCk+l#GP486S8@jZ`Jf,cTLDKi"c'$K%`)D
YTRKr(X8TdQkVKL55d%XhVk)bF#1$4i3FKLbm"Iep,*X1F3$BhUi!h3R!PK0edQj
P3P""0`2kj$A#)Redi[cQ9KjQHPp@kS&QdPBeprmqXNq8khcZL81)L`0h(fRe0(P
fi0F4`J#Ql9'm2`0C)R#pAi@l0E##lE"+KFTY2S,Kc(#!j['5ZcDPZA,l6S9hE@q
X(90@I1T"Y"hliIDp-9bhdf$HKpjpj6hRlBkhD862q0TiGDQ&,50l"!VpIdPF'Lr
KC%JfL@B`&!hDU2BGfl&KV6(D4Y&QXq1F[FRG!0@A(Le1[iF1iM*l5&8[!LKpGSl
e2-I(H+hCRAdM-`Li`)d6fE[eHlF-Lh26Nr3V#+"!X)365C8Flq,UZ&Zj[KJ$jH`
YMPA)E[c'bVdRXh!Vmk%LI$RZ)(hTPd*KRQ3h*H5&8,1-*`F!@8h$p9c9JB+6Y9%
Yp(c#3H91V["NLik48`bXXdlmhX8%ia4"#K-kfj!!bMh3qU-MrC`8S@@,lhDd9Zc
MT&*Im6'VIakTEN#Ne@45SIhcmGHcBpGUd!1*LkkFB$05T5,6Z'X-f`-,3@HP*L(
qF#Kf3Ylf,K!@Md*+Q4Lh#q!"%DPNjG+r+a1G'DXBe'-*kNdf,-,6-%J6NY$K2-M
PhJEMk14MNc(-pXS'rDVhV[FRaF,N*j!!X#JiR(,M5%H(b@-2*R$9TL)$pkpCYhK
a1!5jITb"!@@e%8leR%"S$`D3!'98Rq!8ET05c-B%-A4LrbQTB0c!ZXB@qEd62e&
@f`6Y%(9%F3Y'j0pc(H"h@1"fQDe%1033"dAH'GMiNl[0r`qe4LZai%L%i8I1*,&
%UebiBI0Mmfrj@A(de`2)!6pG8JLhUf@1E9Ah))GJf1*VhZ'kMjc0Im-CpJbN$KD
!lF5l1!G!Z"pM1VF@b-p,[hYGapeRe2&kfmQl[LKI`2a&ji9"Mac!+9kAeI`f8q*
"dVX8TBNXViXeSP&#B90C,@'q"Am$dCa(K)k#Rc'+L#+BA2DHGIA3@-)Zk%Mfqck
K*heGTpm$djDSjIQXi9"2piHM!$U2jDh[0*jAQD!`MH8`Q%lA0bSC98$SVV#L"Q(
0)N9F+)#Am2c"1Llh1*'d(EK9H+KeE)!#0PJ+*eV-TX&@QBKN,'EI%[!-56iCj9H
LXC*bCLR8al+e)5HeB9`$HSPSlI`NkFbXL+a[a"QDp3VVmIbrkV$I4b)+&"U5$('
MC9lEU"PYcL)SJA+aPXL14*ImXQN"G2Df9US0V2ep-ALId*ep2M2Re-pd2!bDXq&
!bLhcQ`"8YJklT$J)fc(f4V9)GDBG)&-C#c`j$r#XaA+ibmT20hkI2XeAp,,GGKk
$"(`Jp49L,!6%SVra*h"[XX4#)5,-eT8$Z0UF&kPa2jpKBU"P@4-,X*YUCi1K-j4
iV2C'+kRa(BHEATD'9`j4J1(!*TJ@@`-3BFNAG0P9T@h$l(K*ZEZ&VkJA3EbQBXU
@6r@4K6%1&J#&mf%UT*V3#!cl&+i'qU*'a,Q%RaDL5epl3jDikca&1$G%1Mq!TDA
!Kk1NAE(AVEb9ePp)G6fc%e,B-@L46M5(9SP5bHAJ"pK54H,+mhq4jaU9*3K9mG"
Dh"qFl9-'cbM&(+rcFP,CGm2%F-aA)d5&[LqGI1rM6HK3'TP4@rEF@`Q`M5lcm",
K65A88)iSrT*,$4-VHe*F"`@Q%9,GRA9P+)rb+#AjC"2f5SefL!ddQT'T@-r2bTa
ckcFpLdjmp3hL)$Z3!*@(!r1UmZeaeUKDe5@DQiLT@M)MI4"QNRLTQJB)JhPZmAk
Kr(!E0B0il6c)1F9rb1c3Si-ii,T5%Hhq)r`BI[A*D@@3!&ab'VIrpMLcXTXaVA4
VILGS28Vi852K'$6NCGZ*HNH,-#GkqCKklb)lqR*CdHa9QHBV3K-,35HC2BD!5,m
XQ6UC-TF"+Cl)3,K*qA@lh!H*&fZ$X,$k-+Jm(T48qibR10J&p9V@EZD4M0p%P$C
Qm'lXSS!BA8NALSNc2L+`3Z"I8#1!4#U#bVc`kJ'h"JkQ'5"MUdCl-p`[cU1FT'f
kCQK-I'9'!3Z'Q+$LUJc98Q*ej-5'46+N6ZUNkTS%qdGZ-K`-3M#AUiRA1Z*IQi'
DF)YU6H`0T0N,SD8B,6bA*mGd06E$VDS**X0#UF@*+ee++!Krm6Y[f#Z$&9Zfa2E
,h,j`5Im5%%Kq20bXD,3i#JPi@EUZ*mGfIF1r-"El)DSCKF(Lr$Yh'-1H'QcNrVe
%$A@IGK5ePlm4M838cB(h"B@"lKjJ&bfG+d#`)XaRZ5V)FQD1@(f)EMpXrK)IXLP
,(i+iLC4V3PAk,S1Nek1'SLZ"a50&MH,')K)"RC0))AmkKrV*A*`I)ZQqqL-c*bS
8cXEIHm5GBiNlE0-$j!Q*X5JrEZRP#q4)`p@SAIL(@N!*pIeALcH!bN6fQF"SJZE
&(jV0L$Lfl&K*hrKFkkd@#KEE&h*R%ZP(5(-`UIYC2$%(E61M[GR5JcjFFYF1IbK
`5m`VRYVj+1RidY[N!K`9FYLPMXT&RbBfaR)B0IF-cl*CB!Zem&iK+$k$@DK90)L
Nj%Y'4P4AKK,,*QAQNX9Aj#HT9-Ferr"1V[hCI"+eNSq@d,I8IHHe&C)K4@U3!-U
N&fV6Vec0F)L12RqXUbT,N!$-)BR)6eL93+iDUV#PFB4k0D1*(&!C`!ZVXUk@412
V)B[BaF$D(K"fcFle#Z(ieFMG@UC(`5eLY8X#PXiVHcEj31RA"EGm(T`rDqCmN3V
emFJFBSV-QIUE85#BmHN+Sjh(q+iKZB+CMJYcQN"+"-QpSj8'fZHCf*VqeR0AN!!
eCQQelEK-%!3jL8lB5'A`LQG#(Kj%iF36Y)alI`6C@86d4#CXbYbj,JBiphCPD`@
PN32a4rfPRE9[JUklPfl8iB28cV'YdI-T,($4iaeCIAJc$m#'Ck&LeLZK6U5GH59
)IHPcNi![li$),b"E4B9M0mi5&V!L$AS%YLKm@#l[*,Eek!%rGG)0kh9"0TSbA$H
6$K#j$ZCSDLhfmM4E2m0DpE9NZ`EPUL6INbQU'NpBR8!4J0@'*BeG&R@&8#@P-aG
l#EH0[,l'E(B(TG3PHm0lR[dI6LC1fef)[NSd2Gb+1h4&'dYMBZ!JVbpKD+UQ,X3
VLbGP"FHDKpKp8#V`KeD[YM13!110bfa$b(1cFP@BU)1`F#U2#l61%VRNiqV@qSB
EVK0IGr09KD`5`+d#Up[qpILfQ#cUK)d5HXc`1F'(2Pj1(0UC0'p@Y8jjL,JFL(e
F,(a4A,pSDNERlU8!mBYAHF`0IeaK%G)"(b8`[-1VY!'!i`A5&JrMYB!TkJIGp6a
l@PkU#'KM(RJK8JZb#6eJ-C%aPhSl#1qQ(b08V"IS"rSD&M[,GMEAlNH`m*J%0T4
2Gj)IdK`0"R2R1cjhk40K`Ifa5!4CpAKrAc@d+!b&$kEB*jP4l6LLR*-$hR8fSkI
&2R`3T)YNL!EAT`!-dlSFJ$,F*)G3DXR3a4Y3i4ThiD`AZTNHDm!+C*XVqhfU)Li
f(,e"R1X5ZR5c3E'q,JprX)GJJ,[E5Y&R8`[2`e4j9@B9b`8h240BNI#51&d8irV
aUH%&CQBBP!)'9e&pUU,%[A1aG,!H,GJZdK0#[qZh[HF9CVP1(MAR0qJ[9"T4j2X
lTGf9Gm)L+IN-X8Q[V%$@##"k'+CP%ErX[dZ$p%bh#aB,!qE0U%TVGrIfPh*4)Ne
9BZB,e4ii!CNERVfF&R@Y%Da6B6-!E'Zfb`NNG3MM$*N$TAHHXef-`#968krV$Dd
`Q3M-ljBfK8U'Qi)TXk-#q%cV%BBq3[qIr&C1k#J6e,(`8+*NaV-J3HIj$2JQ5r%
A5(&3h5MCTBp6*9X,m*X,Gi@)+`8b3ii`A1Z[%%CfA0mZ5I[`R4KlVVmqNml)XN#
$ch+ek!qERfMa8-4Lp'ThG&5LcZE13!jIp9HFE$L'cGmi0`'m9)JqYK$eq-ZBD,D
Y$Ge*($E,2bhTS)+Y@f,AAVD4pJ+Q&!%YXEUUc6%6P(8pHR#8V%XAE1qQPe$+,De
8cL-h#@,eXArmMF`N2Fda!qjf4I3PiU)(F&0RNXAkHFE4@XK#E9*N5ZrkhUA-05[
(B%0B!"*r"69"EK!H0'KiFKmlp!(A#"05(pZ,j5$Imerh"$+R6"TE-eDNKc)aS-'
i8@IT&A$E+hK1Y##FcL1p`&1prXf8i#UCadUq,rfRHNJm'UCVNCXqiPGMRU#jiF%
M'3Jij'MfV9QS5PAl'RC@[NdGZLSN[`qFai5%"$)F9"C`[3Pl&4H2mQTidL!"F,)
3+PT0600$Sef"aP#JajXk`-[A)J5QUXLYpMh-5b0'A`l(#"HXX1k$qGd))N",N4q
rFhb(fUQI9keJ!cJ(4lCTPe"%P#f3!#$pD`3%G,DcA*[K+UkLpb3qiQ6(6&%2i+e
)Hc1@'0K(I3f`C6jlS02J1-cAbS3ENFFpE0aDTd+'qTT@FcR@H@CM`!H,$LpMAJ(
YK@6VRaG6#DlC+fFILd"lDR9bQ@-Diq@cEqRmC$M54MN'0BV659C)ef)f$kRkGKe
fd#T4Dr2`(rI6JThNfEdmV$d#,pZaSf2Z&($UD19S*R0elBHf'clS$9l0HfH&DGH
i8bRF2MAi)c,TipfDV!()2$@55BCXNe$ERJC2L)1,mBDLF+4d`ZeU++B2K#ZZ,dp
&BlkYN@Z0*qiSVNeEl`801*LGlM0[Lqa9Ba$q*HK4B+ZHQ@-1'lHFY5H`RMFVaVZ
9JNSp5'Qde-1M@N@1)Td[phq19ciilB@pi`THjN+0%)1Si8!3H6+$45%6X"3&q6[
H(TSe3FqTaAl1)V*fkR@CPL%Y3l*mRVCGB1i`JU368BGLL)@*X61+Na5k)DaZFdC
UJ%bJ@emq,)!HG@cka8D-dISlM`A4q1Gk5@mRCKD3!##6GAA4%rR,4j`QjFrep[G
UULd+M0G3pG)P5,DrqkF`dZII#+'qp1RmDlc-8q,2N`0)Sqa*'GB8AYP8EPbfC&U
l@@d2&rY6XPZh9TC+bcTfCQ&0Bh%5b@-!A%LIY`ecd)ia%aMq9+0-+diR0jca#P[
I9cTL9jFSRc2mblpYmiZP4ZpDMQqF6Y1C2UI8FMNXAA-$aBU&@X+V+QhiEH9E)`@
M-Zrk+Z6eC`)-@HVTkUi-5qfVb&M0@abk'UFAQ*A*2'0452-4RCHiA6hi5d9,%k0
TA3AbQD0i`"hS*eUfQrkSXm66%ep8C%U&jEq5$4,FNY&kjHp$0@QEVi1X@jYR!86
dJ$IM0$c!1LrPhd6[`YB(B'0-(AZ0F"0IB"kY'L"qD[Y4E'leQZ,BqNT`&q+VBVT
4H@a@DDheFX!j#U(%pe-I*R8![%H%1KVkDK2B8bLcH8XS+KlViPhcI`FJS1LH(5M
RV9e4RNSB@!`U+*DX1G'Qi`4TJIdU*ZE&Vb(5QZhH`6[j8T1IH8DG!ZND42"`)N9
ScDIG8+1aGLU+0C4,c`'5p#!,(J&KlYAa,YUlGQR6Bb+0H[l+fPS-03Xr!NRRF&N
G26KCNG[Z$MRDerdV,hT6FY+J`%Q`X3Q00SV1qVMU+`IP"RaNrZ@N),RbiZjFRT8
T2l&Q6bAN5#Zi@d)la2fQ6hIEV8pX0VDJP-6-K[C"!mH`G#P3iYDAXV#0$4p1CDq
bQfmS9Q"m3!jGG(GN%Z*[,ipf2R5Z+Y)UGiT`RhUJTm+*@j1U+M@PU`iFTCI9ZDb
RReIGSq8pG0&Id3`KT%i%0*jf4H1F0+[,*"8k526RKb1il3US1QNi!8lk9QE,'-m
iZ`f*QFl'FI@D'CT[)FpRfQ&Lh02(*$rP3eK(TA)hc2U'F9$HK4iiN6e$N!!h9K6
S"-9p0Xf(ijNLe1!X34@-G'$4"DUiBa&#Hr9mIC5#YC&4lMPK$pSe*B)PkI9@2F$
VG!X'Tlbj$#D5m$B#022Z)%hP)'0B(i`1PQD)rTj"0caF',")#F6qk+famXP"#`I
6+QV3*6%QmjZ%(Z80Sh#4'Tcf!G`M$r6ShJITQh'3!&4(mq4R%"k!b`AarQA0QNU
dV-Kpib)YCkFF6ZI[lhTcaUIfDj9LqT!!`&YKP"f'52d6G-,R([Qd[XYXV'G5jdc
%A#Ii$m4BD1(Hc!4&IMZJB%eNSX*emM%(0q-(DZ(mF+B"S&jFP@!QdT1"'M*iE"X
+4lcb-I(fMhZmm%G[NF3*H[&aD1AbH`12C4q(ij&#aGCXVmM2h(mfkQ5i`kK5qDl
rTk$U-lQN+6bNhQGU1T`SE$-BHANT#6)`IJNKT4GjhRPC-D0bAr1lBrbr1A$j-bX
&T5E$QJ*Xb%P@mVI#3M"5k0&)*3pX9MSSErNP%TJ*,a%I-a&h4QiTL&Yd3F)&CG$
36KC8rf5RHbC0"ThN6c8dq(LQk5r8193Mj#,k6ErQ$S1cCSl1%+k"Ml0jQBGVh&F
Ir@&)eET$F53ZVY`baI8GINe+JYqY"r!V5BBPUkB2E`-CN!"FGiX+#[Q!3TZ8YI"
%0&"[5UaYklda!q$d5K93fXSc,0*G6drc#2kLAeF21UQ(IbHMM3hJr+fm@*a1UiF
r6k8%GL$iE"Rl4leU#bNQfQQ5L0,H-A)('6T*c6&0H[Rj$bm)[,MVF--L[&T0AFR
%Di[`4f`k-kTcd6M#e12P+bh[k,1@C&Yi,rbIbcVqq0H&!GA`KDei$K`jSc"`bdm
+r%Nk-RcA&ND1SJ,(Bc#!mpQ5-*UkEG-VFID#0qa!iQmV'bf+[VcKSFbG,"Imj4P
%M-J9Q@NbZ0RVS,+K)TVB&Y82QFpU4p+E+"T$+,ElJl5fAC1*eYI*DEUB1)*8[rb
IH3V4$8hZ1A,IlKaj%E,fEV6@rdT"83MU[a'Xl"9ArBrU@9X,ha`R8&8b*A(5Re1
5FZ(``rXkETN5FC9)4YcMB#&EDFCPrBBTjd93!meK+rBD*0ShUqA4Vq5*J0&L4*F
A@!Y-NUTjH'UFPc5qj'Pej8l1B4#m-6fRpqbkMDBM"(QdD+cN`[ZdXUe5[bIl!2Q
`Kr&TVp)KIm2Fe2$pb5Pc'4`kaRr-Jq6A`UM6+d8bL8[cUq4*!3+(6(X,d'Z6H9+
)(D6[i2i[%pcb+A8V$%`L'+NeMThlPCURkp!L-',DE*!!Hmrc@%1aBEPTK#ph`mY
@qfArdjL6G"$m'*%SP9@KaMMF+-Tb1Mem-'-JqCI2k"lUL#!ij(jDK@(@+c-QjfF
E%,iE4j80)2Tj8pYHF)9"2P4MYTQJRGJ9U1KZK#P-Fq"XBREIh-)KIG3mkH'k"Cl
kl95miX8[86hTEA0Xp,MS#AkJ8`Gcc)SQ%H-RqiSc#ZFYm"JI*mdFDFbB*Yr#m61
EZTH$!TTr3'FCQq0`0ISD@SS)HiBQ-I-&+db--hZEH@$`2AUUajrUa3IcaPqcRGa
ldYkK'*j3r#hkP'Qj6J-SLCldU&V3iXJ0C3J)hZ6DZHThKc!bcRHqL5#!chIZ@1Y
DpDQ[m#Z(jFBIah8r6bqlB%b4!H!2FZTNQbX3%!-*K(e0'YJ"H&"kmZke-b9hlZa
C@)M"J$1-Cq`E@BPj8`GEC6lN2l6P3HrE`pbrrTbEV4AAeP*81L&c3fK&DV&DIN$
9DEK(i6laMC6$16XQX)qA)eXmQS0fJbE#8rJpKX)J4J5MC!X%@4l$)`r2Ef,QbhP
j8`J"peC+0hkEi0-NRUmNITU5)Bj#99h',[9c5Ph+8TChYVJ6'8&#*h&+5hh@IPc
ST9hHRc3'ZLpC'`k[TDKHQjr3$qGl#P"iKXjVj'6ZqPLjM"iSLmZ0a&,@J#9#BT5
920ldJH-bV9N''9J'MF&NZElcICC[ejfkDa2[4TcAhaj3Xk!k6A,5j,r+cqAKXN%
d(DMlQhLGr'd"CSd@5[['E!Mjlp0,eEeIAI*(Pji-3e5*arp(U[V#40IA2jQ'qdl
P'a0bG-b9j)iLpGXmbF38ZH-j``8D"IHb1pG0b#qCNA3KI[E@DZf%65N4K3fY1!#
U$(eKZJQEq93R!(dB&#GHk(("MBheh!65LJD4+PCpQDJDLHQQp$9M(8,`h2fbPlc
jCZ`AeeqILF5'&)Q6T`QY3d$5eqB-59`r-&,mK`3kreH3!0aq6%E!ENq4L39JY)!
95&jamjpUG9MXf(9[%eq&'%K[@H#fNhY-p2B#Jq)XAUIk4S"$q`Fp-fRJF*U`UK[
5[&&!j+M88#R!N`Hf4bTP0q,H!)8Q5*4",a%rIGGi"09)VCeT(I59T5a$#m$RU,T
Faa55NlB!"RYX&Tm-ljcT#,+B8Gf"&[+))-)SEMDGLNqaNVGk('455(mYFlfBSE5
DUlReGF91jA6C38CmY!#FV$5AicX&3,6`kTIU*,!D[m"hE0MTLm(jIqj'M8hUBqQ
L@Q'TK%SJjqf4TSVQZkDDIejYG,+eK0QTjKMFk6kd*)KYrkTL6CS,HlrM4b2A66(
MbccZ!NM8fqc%BDkCEipJFDThHVXfU2Zkh$#l'q8UrC!!kDL20SaR42UVU1Um8E-
pSmA*"Lb&EUS'"Ji*2'A8eAQ5AE0Y)RK"VX@C0@20-2$(VYD)P2++&rFJH!EpdNq
A5q9B+$(SHPQ(lZ24qE(#jkb0,VI8i'S-FKEDdL(U))!*IJYcj!cidK!#QYqI8pF
"aYri8H'Rk#BIm%jbi04D,$SV5!lb6DB[f%YYk%%`Di`TK6)ii8V@-ZKYBT,0d'`
3drT5jUdH1ke*cDVqmb`iX@aG&JA"Ze'H!8XehU2TT)febbP,r-plpfM,%1[&@UP
V'NbSAQfIbe(*YjD3!&rqYCf0a2J9q(%$rRNKklIAkPc6MK&U6&QE0GX9jX`E[@3
mmFlfl4`M0$0LbjV$cjGJAq1YmF(%PUGjp$c6DebNXk)piDK&3rir42Sl8+$m5Cd
ZXI#60LDeQc9+K6#JkY1'XXQ1cj!!cbEc&!UbH',1Qd8iHad#I#6D%"ENe$%([%X
1&)-jGYGjTXI`RR@Jp9[J-q2qkIRNaA8Sd'1[[iXp-0If%!3h&R3G,R$TUrVeUq%
UUKB+@U53!$(II'GZh98DMD%`rNfY[(c4@B##T-kI1$pqXM[,I`E)#A4!$'(fC3p
-Np(@+0KXY@l9cI$$9PUQ2r2"3`H1K"NDAG0"C'1EmB*SQ)V1fhrcHNC15T&H)fp
T*S0MB5l)R`6cT@4b)cb`[B2(b'M)K#kH#rYUl1&$El)U'&ZPG3jC'18Tb9)4+,q
X$GPhBkhJM'aSRj+*JMmarN$lS"5@bBA0$B5)4k@PYFC@HJY6MC9H!Vl)b&E(T9R
Bp9C9a3M#BchjZD"28,MQ"PMT3q-6(RhK@pdlmAeD(ApU3-',1rD[kSKXAL5)1(6
&AK`m!%*MU4m"p3-ikJNYFda#!-8XK1eI[feQJ2M%M6#STbm6P-I-f'X5PX0IC['
cEY2H&T*+pk8D3FLeQaR5HNcaLeR3#b5XXqcPF1QPM4h@LMXdehMA-#NK'+h'G8K
DHQ&b@qA*lq3A*jIdD`ijVZ,(lB4&ic%f)H"8kH0ENFqRC6PCmF&Zl4R0haV5$--
H%r[ram'e(Le-YFR9CiT*f#hH%0d@mZ-Hbd)M8P-QPhl,,1UbCNeAhjNqhi,hccN
&9m$(b!L!9eVUURl"D$Mb6e`&*+[F3IMD3$-F"'p%*X"1*f#$94amVe%rhZ'd$C!
!mm)JAhGGJY`1Q%UCY&djR2CYqXmM9iBekcRA1kQ5UU(+[RMfEC-HbamB8%SqAp#
(qPcZHS$fbA(eEXmRkMjSCTq&6'hkT4$MDkZXphU(9[Q&TEJ&0Ce'E+%)cmJF)B,
LN!$RYQqM)kc&FMKJeVT$FNGY"hV*HCKqjqIb+PYh(,$8+ZQX$GIVqTPPffqMm9b
PYGa48A!*8*f&$%4MdkCr(f21*Gi+RSSrLqmIY8Mfqd80b[NDD&cik)T4[XFh)B@
2[f(3Z"Cd!hS8$8RaMckX#0@'Q@&)a1XVXX#aMUmFEr4&BC6%Xjj3Z[%a2**jlS0
lpZr`J``"E-`#q!TTf#0$p!*h-%YjfLY0,GZCIiMejlI&H(HdmlJlCdH(8mc*eG(
b")dE"Je,@*62*l&BY`Jaf("Sj62b`A!QPi*I4!JH)@iqA!-qP#IkNB`Qqf1RP8h
0fe,RN8p#[Q'Tk3Zc&kPGVPF$%f,UjilTP*ZMqlBaAST%p23'3G+kSj!!*T(,0Y#
Q"22m`T@eUFe'Fj%6Yq6D#PF,c@a20PGLN[8@Uk5M2Ek-8`VXC'cd%"aC!J5Cm$4
RAZ1L8Pchr-ZqP[j,,63H9+l"YNU5lZcM41`D%`[T@KaX3L4cQ3CSL[JXF4`N"6h
cY6j+VA!)r0$L3XbTPAdFG$dAD%RFbb@SH0Ade2'd**!!'A&"H!'[45QY&al4U6C
-IE'%&,,jmPT*N!$D!Kaj0&)VJ@IccKLMmS-K!,Zr%@+AFIKj1CTZDE0K#iZ&-!f
,5S+#k4[IMBE+5pNq$SQd!HA4`(N9jL92*HiH93E"dKjJEQr[FjC4r(BfrY1EQ-d
0CcB!42YiCRlr&B-V!eSRL"6&C39db!%e30AMeGKmHKHFZa$6&k2KdU1i5-B%Pb$
m&l*6r%f*a%l4@&$,mc3*br``)DTKV*Cc(NNmq4Y@r+T4P"S5Z1'hX2IQCH,-#$p
d-5dT5[lD8bTQJ&0`65&B[Z955!M34b5Lh"5cPYG4&MK+18YXSc'jL%`3V9ca)r%
+a`*1!fBIa1[l2RTEfa11mQdI19Q6VL2lfP9(Dh3r-KJASp&UV#iQMe50(b@!N4J
44EIp%KMR!RIPNdL3!(DGI8LQRDMrAYBH8!RfJc3'4&*bP,)Nj(j"$QjK,Z8PfKF
`HBH5Se8rTdVh-LPb3b(G+c#)P2KKX[NV#$C'`lY1TfcGl0hBikPF0&$-JZ#dl)i
%m@*[[JiI[`UFRC[m@1ErZE"LPh#&VXjMADD)-TB+ZKL51EXc-ikXFq63U-J+"$T
AS[`#kqpQNhq&*4k5+GTPb9)X4E3#+b68XVTjj)TTJ*h-khLf-Zad@QYT9fef2@,
Q`Z0m"K82)&AX`TE`"c6[4pr9mCFi##jF5E@)f3-9S*'c#q!G2&6T1ibB(+GI)iB
V9S$brq6G3kZTT0[0A!j[e"QEE[QRD+RC98e+',[T*6p+LA(NSISHe+-Z$FcYV`R
,,94804ekXAh#j&kqKeej-Xqm5*m9dF`pqQSDj2lfI)%'5cRkYYU(1YCTc9qT*S[
&UXEjBVJ8X`3af0DFX8VL!m&qmh%%V9bLjhf`6DGK-CSKR8SI63M+,[N,1C[EBI[
kVKJ6cc)hkVPq'Ri+h4D"%qX&`l39il'V(khMKG5)5$Kkd)KRlRfV2e0NQ`6QjRh
#q9#D`C*bZj50EU#r(&X+e@r!@4[&dkRr`%[J3@H9hekU@LSh9+96+rND@&Yd(8a
%LY`9M[h-4dD0dG"('RiiL%QC'6*N5A9pMZEPf#$`,@RK,JeJAAXha9RL+SK,'Yr
L'SSRjRSjN928)Q#@m$Z(hdrPE+)b*6YKLe5R""JJ,IV"T`j-V63,5m*ebTBE,RU
QDi!Ni4TDS)FN!6XT@*bI4221N@lCbpXM+Qf2cPAmZMVIcmHT&r9D(%&G8+VM3r)
R$crrcN2-%GK*)6MU8E6qfGS'%CjC@MYTAcpIM)BM9V%3#f!'$'p)j`(ScN)j,2X
ijV[Z#DkFdSLhDiPR9CLQDhK5+TEL'G8a[lEQAXbrAaaX44I6HjX[J%j8F"ZI,Bd
e50qID)Z3!2,UN!"0GprIDR4#6$Ii4U[bXj4Q19-JBVAieU[cGUkB&Pl,0rbFH+'
$6Rcm19f2$(R`4HjreH5lF[cTJj,+X%BrP-GA*53&1qSBBD3$5$kIUZH$i-iYC2F
*#2(J'TJNGm5cp!`ET1"ISKXlj+$,Nr%Z1qCbqjSA95$GFqXYBqi+$AcHHKpVZED
L9-VaHAT%F+(AXZ+9b%`Dm4!eG9fDM2j1`I(Tq(5"ID3&4IJ8+a6VpG$cY8Dkf0S
"`Y-6BjEAjIaTAf#r9Jk'mhZ46'SB35j%R$plNVXqJTkqj6p+9ea[p!VaJ+24r'f
ZH$klFi[pdSbA#91PC,YD,9-0K'B5&K6d'$M*THrYS"J0CX+Q@pK)j@3F6-,[d6D
X6jJeSZ&6"U@jhHFjL0eq+CFPaT6$15pQZlNUpL)IJ[e20l-m[r,Srec+ZQZGKU8
0K1#V"@XppqXEF8Vl6ra"KS#%Q3F01"NS6&ET5&kSUlm61bVdEDbb()-SNIcjdh1
hVV'%9!'!HRG9CGLcf4$GK5(qe$)@J$[rF1El(A%9L%eMmliC!a26bfrEMXA-e*E
kTp"jJFG`%G!8V'T"J8V$HqTVeN,MSNqdp$N`dqdLYrDLK&#YXhr`cp",-Pecqb3
)V6cFLq3R#E6*Rk#6fK9ZmjheaBa*imi+&CTb6Z6Td)C5AfIDf!mY!V#Sq8K+RDh
Na'9@K8Bb4V3@[FI1#M%p1XmKIP["I%`R5G(V2!HI*%Q1mTl)(mj[e1%kp!A$9iZ
G2phNh%X3'QJIX-Z*mK,hA1jCi%4hK&ZVVJGYqrjREU1PAq`Z[l(!SBTlYE-Fm$D
rB1KTRc&k#'bmH4kYJMdjd!j*(1bER06HT'qh#L1GEM2f0)P`pS9cpbDSNcb$&ji
r"m)SJRlMX,LDICMhmH()qT!!JleHPf0l5jfL&bS**jZ&-&e929H*)NYN3#bpd6%
4[e0-kBc(e+-f&DM2"%fEe`BKfN`'jLKdX#1PG#[bGlhH2QNQE!BF9hl)Va$`)I`
`1XdMfiI``P4qbj0(eT4&"r9,%PFT'5cpM@!flYJ#,3'ALmTm`cH(@LT99MGc*h&
%5FFBf5d%[fM6-GL'U9eGlLhYl3@f5Tp'0H-#SclZC5-b[UR8mSXEJdbVU4Vdq3h
&+c*1)3f9b8pUhGB[ZRQf9S(f8%em-j2SLK9"T%0)CX0aSjT@"LC35hE&akl"`im
PFAC6X)!rcrkRNP*ZYC!!A`3L+3SAj@0'RHCI)(1S$*PhdP%-0@)kZY1cJ)be*Qp
dS@LeTSrKRT+"95ML-jjfH4`G1lPXSbmZP#+BU45S9d5,BQ5$EN1JiDJA!6CjRHl
l1FqBrQ"rC82RMShpNlZFT9!!i-U5[RrFC#5$hMG"EfJ(SCbS++VP,Ipa5$PT![N
YXEDaU2@c)ffYZP'AbQc-M61Mq*MNXGPm&&%5N94rD%e`([#[N`0&F*V'*!DXcRK
bejfI(&#C3!mr"qi3qh9(RiSK"M)2EJX)&FrG($Q5AV0Ik(Cl'#F*BSQVh&,E"6F
AC`krI#R1-bkqk[d,G&DE6l0M5HECR+UBb%Ue&1R[e,KH2Fq+0cVb+"Z0hNLJk[2
khNPQF*4k!c-8+,5m3QUk4N[JfB#blJ0S9Em$fZ92ApN`&AdTF`!(K+F'RaZLI'`
Ri1abBQQX@)8)@5Fj!P9JZbbR"6R`J-JZNSh!BiHG1mpMk,-4DR5BeV,&TCJ"ITl
bU9fYQS8k3-"$"2GlRYNSPVdr!TmJ,CUF&`J&dTX)M9-Bf+4c9G(D*VjQaHIcdEY
rC2b"Gd2jEaIRH#&$FY2J5%L8k82ZMIHQ[VEDjZe4Yh1!,dAc1aCLPFrBd)HU0e!
40rp&V'0$QG0&raGf$i#@Z5Ib$6(aA'PXN!$4C#ke-jT@ELmlXY$IpI0bSIm$24,
+khIdqU`kFKdl-1XZF$N[,3d!H5J5Dk`Q%5GKKY@m!MmR(0[c!YFPK3C"KE*6-Y%
%6K9!$)#8bc6r`*8LQ5FT1')%C2R@PH)M#,V-Bj!!D@%)(9A9DJbd9Q,GMS[aKaC
5%$,2U!-H$EA+)D36KQ8RT4RlHNiJ"-4032rXSE$m#J-*hM-E@1")--dpGrB'S9k
3!&m*d&J)0jAd(aa[MaBY-0-`PXYUjPirHa)h'6$#-MH8kAXURDPJ+A%Fj'!J@G&
&Sm0Ye2&,#,dZ(IVFr#k,YiTFIS6!IVr[GC-9lhG[-[-J-3""@"qZkSKb)Y&FI`I
(@cUQ4CR'Q`,,PKC%mi@&Me!h982),[3`%(qLSCGD)LE0(!Gf@9KAUr0I#K"0efK
KK85A1rLS[NUk+0IC4pdTVCN`43'8'ZR[+GlZVm)4(q(ef2U-JRHQ[b%IANlN64J
L)0`YPAMTSUEB5(&d$P)kKKV#rVcD+RS8A$[5IBA3,qKe'KYH%e*M"bZS5G68CL[
AYB63`kNQTZ63-#-VVQ)[+LNIGM&*rDRKr$40N[VbGqZ0*A6*+0HMTTa*i8Bm2bC
GSqL,K-Ze2D0!#ehLq9"p*SSXq0fVHdIA%Nmj52&Ce5i,aqElj#kePMf,P%ChFq#
Er%Rf9F8P%hkU+@!eHXTr9fB)ejZ&IT&"R(Z#Z!!ThdTf"&D@lEaKpSbS`46,M#-
KB9*kIG+pFRV"-2jGLXBA#af"Zf(Pafa(2Ff4@Y4GP+P,AVcc%qDqjhkkC@i[MR+
&85i1T`)[bD!6R6RNMljLE",Gjd2Z&'A'C)A0f53b)f5XC*8@"BMGKFpTE9YSjRd
)*!%d"Lk'*1SpJJR8pE+2,P@9!L3'KS!a+2Ahr%GPkrV()l!cRkTKd+Vq1kf*3G(
0V4CeHKZA&S``0Rc(BqZHNUUNpMDcN!$e,T!!X)4-i6YRXrF4-aM#*#8"bCB@a0P
P`!p6-@VdbqrV&1@-)E(C-lN4Fj&T'bcR[krEMHUNRS&'fLCZrRa28Ca!b+FXrDc
b"lb&Gj@P9MRm6`m[HK5!H%8Gb6V&20UGH2XqiSXjl9pa-S!Y0F@'cacIe'+Y0TY
84kkJ9#9S%dM+jl%FjDq&C9fYPfpV9'2EX3RLN!#PN!3"!!"!!"#i)pUlZ#2DZ`!
!flS!!5[l!*!$cJ!3+2m!"U'Z!!!Fj`#3"!m!9'0X8fKPE'ac,Xq!,RKYE!!"0cC
849K83eG*43%!rj!%!*!+J!#3#3%k!*!$0`#3"!m!3X(9#he9rJKeEik-8V@kZdU
V2E5CM[,Q9SeqceI`p4Mi%Ir,pA,iSf5%B1aAJE&LF@'3!1AE"6"#`G654D@ifia
X9r5,'ZbL6H2M69`9C80S#5('%+Q3!+GI@2k2@'Bm`XqY16I"JB[%c3$6aH0SQDI
e-5JDF0rb,B*1&m9Me-8F35ZpjDl`(&e$24+i'EL5V#q$pF8*QSdXH'*bm&`!-#J
DEjb61bcPR+2ZI[e*DX#f$0XTcKTVM&A+dp$Hhm(rk"BFYjl'IrRqUr0i'+l"(B6
II*&kU6ZGZAc!`!2B(Y+9q2Y"JmF)FTPBCL)PG1dec,jNjFmeK8MR"qcHT3-9#kH
V9,@"0f2h@i!KSAK+&VSA+CVbkfhmq)3T6%e9YT(2$G@IkhUM0-&R$*[D9@J,ZlR
"-Bj$XeNBE[2UrkBdR4UZaSq9lh-TiVfUUclI5V3r1Cc1-J3V[$'8"K@CZA$*PF&
r"%6eDHP22F#*GaC#04lpV[HK,9m,2Eef0Fb"HRkmq,%Ka5$m+dGbFqYCR(E1ISX
HTdQ3!,(SPL!8rRcc)FaRF@aR!PPalk6IMl6RKJcpYBePZ`2h)8p,iMX',[DVI9S
@+6MHHE(mRTTmVESc,MPZ6"i"Z3VrpTPpJN@XZ3XRN!!hA4ME-f&h-A-8i1aiaHB
8BRdbC!5Dj6aE@XMdiSljN3aM+m3FKpPe0CK35Q&F3-5kIhD4%&p@T0h%3TqGpRY
P003!Hil3lf6c-Gl$TPc$%9@J+C!!3&MMZ98V3`eS,TPrj#JbrQ39Nk#PjGFXN!!
r+aE55!V)X"4V2*mM,EfQeJ,`Cd&BUR&M(1@lACQP`'j"[TbAUD(&*ql6,5FT'AD
Y52kE&8&ICbJ6Af&rPGBJUjXq9CBKk""iPA$8!mV-&T16U$,Kr$*G`SdC55-4F2S
`6ca8ErJe*hH`bHc2Q2S"fpmfdhmM0bfhF4iPN!"T5Kj$iXkVb3!6-9A+De'`dC!
!cKcT5e(k"Upe%MmrflHQ$50f"lR%DFLk*j9q%QC09*!!HGa3&TT#U`$!91jfmqh
XDMP[-N`&KD58Sf[iX2kjD1a3Zj',AmJ&D#!PB,eSJ2dJ`QdYlbhldX+$m@q5Ali
EfHMiFrfG(NrL!TFY,PCHj6rbU,G)BBB8fRF)K[64YSV+eBKjrQA3F'Aq8d*@DVR
B[hcH-EmmAmKjp%DDFM#*D"`6[*@EqFi'kPcb399EKiS$i8qLkVAXP6'0,85P5*d
ff6(fp1*fqcYci%fjR!*Q%Z@%MfaIr-V,LA+q0+l3I+BDa2,FF`J'bIcN!,)iYi%
6B([1Mrp%D`1UB+@hqdE%LA1)*@+$&lEG6VAM8-hR#I,h+ID4fhf$M!Nl$9#d-M4
G,lB9aI1j1,'YT*p#YU1rc2#[%d@aa3P$0IS5S1Q1)JY&VK5e'J3PeK5)d6r[f2T
`YG3q6fPk4#mYL(rUM)ji$L4M4SVE8mfaqfB&ci,C5"Cb5[[`DI-d$iPYfipS0[-
RElMD)'8'RSXC+2Zp`-YP@jS2UKqYMTq&a!cLLR&NLk!)@9XLj,05@#3Rmk+dUfD
R$5NY)iYAK0IeM"Ud@AM+H5FHPRVP9)f,R'#%)!'L0@[dY!I[GY[I#!CQY!MSS*H
X2UEHLIH!0+(a)!'$4(NapQERC6j26AZ-h0#R54%6V+aV%S*PX2EC0aTVh),jc+q
dp$S66!iid(P8P1!GZp9-X&kZ6h3@VFpH)Pre9"qCqYc@(E6R8*ErbFcYI2TrR,I
0pp%'GfJ[#ricAV@bbH-p1)Kk+RVX4I[!$BqfSD%QiZ0N8AC9hG[@mlqYeHX($r3
c+A1@-DLfP'kHU(#prTJj8E'kP&$d%iBbHLAb$XI&+-$dIYFVdd)Hp"N''!r"QT5
iA56*DU`#+j4,iSa8QN#frGjU"rakZRmTDG@rRF$N%Cm)Xe)0['U'bmYkL5N%ET'
r3,ceMAM-3VcK)R)+qYJ)"jT#`CEl,%3-21hcp3aTbBGH3q#PCp0q%51U'-bR!lD
fP8Pp,SLr)-F11D!13L$rI)VqfAr"$jZ(FSi6RAf1m1pM0,a"p9*1hmAkj(6l,9A
m2da9E$qQr+JqL`ei$F$-`-RffMjV@Ib@D8bdQ*ZZe0'&*6"HrDNqf,@pq(VldR)
MepmBAipq6QY2("5P(6[h-AR0,ibdBB8e,D([i00PZ86m-2e%C0[MHJDIhJpB1MT
jh-%`d&X99MY9m&pl1`DKBqi**FpHmH-J!,#VR9C1RH#BVIXIPBKrpMalA)GfXmI
'd2G#,KEdTEAJ%+6C8QbQcU&*%HQe-iil'NA0HF3PUhC'3SS8N!"U-[EjcSE+Il5
AKmH(Z92Vh0q['@(''CfFRCT5ff2NhkKd0-kGG`T`$Z8')i9TBi@(`p@%(X$K`@$
U3l[L+m(C"CqC'9&L$de3mG08S+B!Xb8hpqPkBk9Ebl9Z2i2cH$mVMG`U66h*N6b
YIh#3!*8c8jbhm%$`5AqYr1@%q9&EK2`Y6d@2!T'&1%(dEE$fUNdX))3Vq89I!+F
KJQ3LiB&i)N6Z&+(rql%iXSiqGFAjPpM'UAbF`6h@h6X"ql(apHfU`r,Dce+mf'm
lT0&M-mG+3%!IhR#@Pb+GmQT8mGqF4De644T-TMDL4icPilF8r`VUpA-cZq3UBf`
k,kEB31+MTr2`8,fi'dcffFMDff(SQId,eJ&C*'LkPM'@A#h(r3l)N6c[YKEJCMV
X8"pi6c&SH",)`3k*jZK20KhH-dfL61a9(Tm`B%qH2bp,P+C1&+b12GpAk#F%MN0
aE[d5-PGM8a6*Qm#if%0`arc1hArp+)FGAEH*Q%[-VFYq)SSESJmV'4)bHT&I*IE
,MkVfLPlbh@(ZT8Eeq#Ybe%6YTMYjDhTIqh[HA+X@YY9h(MC2[dqJ8jPUDFE6DK"
TH!a3L"'"!%4bG!JIikQV3SD'-E)dEXRrpF32H92lm10dYAGaflQ#4a'mq5X#SUN
G9[FY'KebhrpQQ4NqA&kYjF'ZKKX[JF$9N!$aUU6a'"13!)Ym)efA"U!ahaL6T3(
$`j[b#9)qk!4kqc,p,&)bJ`@,YNY8b'SH,Xh[fL1%6q5jj"XZe*ZFelm-NpGYUB2
IhG2@QPC`ENVl63F8`h+UCP0Lf*!!LlDcYfCJpD@Qief9l&-,+)0'!cddj4$i&28
+Xi))0afkpLP4j0b8B$&9GDNG%bEF34R'cMI1'l,T(`Y@JrpS`*a@SUj(I2`PJll
"V'C3X2Erk3X2k"NlSk8FHF2pfpDqUe8JN!#((S3DdD8+iJ1ShCcJ#V'L"#5d!T[
4mrT-0l25c@[fA9*dYYR#hAF-2a!$K%AKc1lEk"(R-K$4mqXfhJr'PDjFr$i8,%8
15dNr[,[BGKL'P,*Ne-BILYmEU"SI4+"IH5YI8MTp[6U$`mX&QEj[4"+GMC8p6(A
SRlBNpb`dL6ZV5Ehd8FiNTKQCc80,KUVX@qN`@qeSY&,q2,q0p1TP$j,Fp4Y0,6i
d'[mjGljlPMEiY0lZRp"l&+NX+AQGmZ%URUC2jFX,4R+26`+YY$5+@eS[+h4J[*U
,FhSaGKHAZ'-80a2T'XejS`Zf3QPMSE3jp+2Afp3+QeUVdQXPEIF8'!NachfCFQf
PEL[,r26JiEf$c)k3!2pr6EKIPa8I6V'6Idp8@XHA6K@YR12l6"`BT!649jTL4VA
j$9D(YpKFEjb-1e5CrY#5q45N&T0lq#KjGRh#Z$6m#`FAAbE'1c%Gc'9k"%'k[JR
2QhM2X&i-B@iEfJM[%qMQ6pCKCpIMY6ClD%D"@-YD(VI`hX$Y9$aQ2$Y!'#Q)cip
bkUJRHTD$(VPk[h*chS%($3QiFD9+#,Mi3$+3!$VUbZ4%!aIc6bbS'`jYRHr@kjZ
9`*ilfbI`GXF)m9K#l,3-dd%edPNBadcM(Re5apE@)hmdC,IaIQaN-9`0*1Yrf-(
c!4HlCIQ+R@a4PQB()ifI%bT"Pp*q'IYM4iIma)kC'm&MCNQ,i,GNfba#ZXIFj%a
r@E0)BIq*f-llHSD"TVCl2[dFh"f8qYdN)eM'N!!jhDN6JA02'Y!q5BJi5"!Nj,h
0@d%%)J`p1DDlJ,++jhee&DE9`YYp$88B@H'YUJJ,%5DT*`('kNZEU6T3a"B#X,a
A"Eh8@cI-`dl&)QQQN8Z&F5LlJR!-[L[QUa"cKd$UDrN6Tc*QPIjVEQdkEN4V!Ea
RIEV03IHS0$9TK[ke`#,+0`[I5EG45#%0Ge85SJrT""KZd*9mV&(ZB@DdXcHZ3`6
+K"48#qL,eKZJP6BJq")d*5bcl6AQDSjD3aPZe[+jMI+TS-N(#0dFhUj3Z,K+"i(
2DbK(Q@Nb##ZDEHTdG*-XCX81Lk[X!1eYXcVhRcZ6Hk$8*`&'C%F@6`jfA9,YB2+
YbKc+(fCh'I0'k#eL#l8lAp9`#+1b3PXi$!Vdh5kC6iJYQQlkX3jG4UqNNb!!S4e
M2iXXke#3!--QUJ9`jR31EFcYqVBL!%B`5F@kFRqpY)HHU9G`%E#$fb(,4J$jDV6
qScbYrIP!lP&6Zf$p(%k,`Nd*3U1"N4'IXLeIcJaFl)ZY&4Z(DVf,mr4-+`Pi-le
&C*!!2!T4QN,jN!!iY,)"F@-$#fUBGd`'9LpYa+ZpXJ-Ql'SJm#bkcR$Q%i850#Q
#XZ#e+Hmpl6%B0S!cJ,&2DTj"T4[(qabZ5RV&!(Cp29Q!#kT`(eZJim$MHR5pUcR
VF)H)J'[U"&'4a%#QG)"mr$NfriHT*ADB0YA'qAQ1DT1)3IEfT(3Khc8NJ-TX`X,
4DEF*qSrRQ)CD#X4P"&IFmZAMDBi4*e1HR)S,+U%TM0#JaLV0lA%6p2-e+H`5i`R
km1Q46'2)"jBHH3%@p"[N'"AYk`qq2K8i%f-K"q8*d(d)M@SS$Y2cLEhdc6#[!&m
X6Y`S8D[1CeZeT3"eq!S+iDf"8#Lk&BfdqMC3[1(KPjhAKX2H1iRe445ZAfd8KJ9
3+KI``ldH#T2U4%Rk3FU6e6Xf6Tq3!-h2Q)UPj5095'p[$9EGlb4T)3UdD8r+EC(
ViH0$Cjlj4)F&X[)aYTHZP3QTj',fPc661'1BANE8"@'d85cCC#,[)"pVY3`RF0,
eH5haH!`Ir$MANkmHJ$*h%FNJVGl!60@b08`+QdN4HAP((R14'r!eBq5-+bae-fq
R8jJ&#!EAqfhCE%$E3SL$6cB5ECKV(lm)31$,GH[I"Qr&@2FKI6V1kcXpV1Xc9-f
JP'[Yd(B@dUN+,8UX'VR&9&',Mbe!jEphkI&b)b2[Dab"&f9P*bPXZA2*QJ8G'e`
)8j!!L!AC-jCJ'm8dV%i0lq[@R"HBeENT)N8r[6(`&@'["#IA4SJ1%3VeKHcZJaF
!%LfdI0@5)E(cLEiJU2Uql+(IM9*,GNqEb4hEXEe["Yc4iH*h5H6Z@!*P0q[6GP+
DMNf0A2NHi!M#h18A`bc%f5(IJT5E3TIf@@,rRh"iadAHLBKJfZ3BHKGa($#kETU
A8bUCPcqhVeL9$@PhjQXeN[*YVl&#Ce+1DLD*aih@c4hk5Mcl1ClATlEYh(18ki#
8,+)piH8i#MGf!)%edCjGX5p)PmY`#)0Cr,5GJlEUCV4rjJ3U'YBC42rd+T,'GMT
1Hb*a"f&DGf'mG8-@K&@+PJi0I11[Bqj!#lpIDNSK*(NBbSCU`J"bE`F+8Sj%ALm
'dfpb,BGj[+#TT6CBTfhq#"hD-Z@3!#Jpk#HQ8Z"@bFVr&5d+E$@)`)'JV#UF3-P
!`a!Z64Pr1rF9Sc[)F%)QLS+Y'U[+q`QhqKPH'%J25TEML*'Q1Vbh)L8L#Xh*qmY
)PL9hh5@J1"`40lQVb$h2,0GCXh+h6k99-'Kq0bEi2N21U+I+#*lDK4+k"X%pZl9
K2HpXlV(BiDLK1[*cS&MC6I3"IF4!dBBl9QhVHQ0lbRQVd[@&6#T*YqLqDB[rRh'
!P"%88aRGIZA54X`df)+2L)fklq#C0cYjPF'b"*YD64Gq[62L53Q8"Nih8U+J!2Q
RTA0`!b5"rJT$q$J-(YSETLTUcPr&k1C`3qB$5HdMV&9)$Uc#m(d@Si1D`k3C#Jk
KNEKSABDeL[a#aRiB+FYJ6!JJIP8JqaK*HVqeVc[5G"6bl,2+j8Tr9*U"X,+%ep4
%A1,@l31CDC!!EPbbA0)rE44r#BG)0Vq)@lF"Ri10*@6!@Z&A80Umlp@fVi-'@(`
TjM0IN[qF#)jcNb)"r$@TUXaHKld8[3$+@2eFf!,'D`RdFVT2RkEFEK!6%TCU,R$
SR6YLQaL5T3a*IUFk5Z"k3CAH60AeLGbYT(HHLV#bX1H#!Ukk+r4!CNF(-3h*$#L
ZQ*12M#fYYrEklYXV"p+,qbE"lk`0ZFdAX6+U-L9l2,hE!(3lP)M#M10il*Lb,`1
XLR)M&L0ZUT`8,jHcCPN68VJr1RmPQX5Xr2%Y)CrqMDJHc#'fh8k`Na#mEIP1DQp
$Xcldp!jU#$d308ha[lXGM!TYUk[0@&TFKR)AFfRm68&Zie0E,h8RdClK$+DUSI`
re*-3QZkY&N2Y[')H`rdG5ZG20XF$39!qVpAGqdRkQ!Mm4+M2RFT0#(d&,b-jBZK
A4V1%,B58c$p%Z"E2hC`PD%-KcXAJ-jr`X0+G+Hr9M$-b#IC`1(aN6cL50L65F$9
rB&X2UU5ilijcqZ*p-bJHajSMH&lmmEFZ!mSIMeChiXIPPaKIi$hhMm,[4FeEDVK
qZ5X5XR+4GQc)Ife4S@+jD"Q@cjHl*S`#@rl+NcE`@LBFPG99,8A5rj@E!@G5""I
"2M[HIeM$CB91D,6*CM%j(!BcQa$'K%DkQ,NFN3-)P!NPe4@1A6P"6X[ijmkl90E
lIM+LpX29Rbec2iXFb,IqLB+9jUf!K1(qpE!0UZl@*['2%,-JX"LSM5Mkp-M`3GN
p!CU'*L+1"0&-,6ce#BX@c2f[rq6c!"Z)A5c%rm&',[U46d#EL+&GcJreil$Jpcp
CShSf'KRb!T%hZN5D,qVPX#5@1m9EAR98HNJG&C61kJi9i6cDDdk3!!)'6YdQY&S
bHG3$I9ic9m!G[l,eB8krA`9d2JA5,-[2'SV$f$ET3NrV#UZLDNqG1iRDX'jf%Iq
Y(fYG,Ge$%DpZD5I1F1fX[`R(1I$G`)JPCFq$qlK2G"!%&GU+5pI!GSjkF[T)9+9
5J8l5j#BDNRYE$6N0lF!mH2+lf)qQ[f,+1T(0@-a`T(kJm42j(I`)bZR"E,fQDGl
,+(RKma0fJL@mV0BQZrF38&R6CQPmI"M9,NS0PYah3ZCc!6QPM3P5Vf6H+jY34KT
[3R9ZU840XbGaq-Z9lF!JrYIf"&D3!0mR#mmHd5kaUK0'BNUm1XQKQBVET$H[)!k
ba[d8AhlSmR6SGjihUaG+DZS)4PV$0+!5(b`Q,BL3!([)McDU#5N)@JF$+`f'Zr3
Qcj[rH4+DfJ46I"A*LHKT8-P+Q+K5CJh*h5!952j4H&r@YMD,Y[V2)1bRq115T@Q
LIjDHkiJkF&R4ej5Tel%k5$dmVS`d6HbCP$1bcGHqYpHr4DD8(FA5K9CE&4,&&EK
'Y[GD,A[E1cI-K!FH()J9c'mX2[80Ie33!#0h11RISBAb4b4hN!#Clia2IT8[AjF
j9-l&3#8bIrCa0ff@-0"i-+5FmT*f,lcPeUDCF1h*X`Qq3GDkd!LF!bq@LD8I$9"
r+dVP249[hJGkVS#8Zq!+%`r(P$8*Jfji1%q'Tm"!l9A2Ubd%pN'b95i4r@5M1#K
KcJL6#3"dXfAqKYD`kcZaMXNQ"I*J,eH(AqJ48Da$,KVQ"q0D(B*#3D%#`rY"Pe!
+"fqJNSC[rA9@*!b(),Fh+qQF3)cdNM5"I4I524Zm`(&C26m*&9+)`j3RmS-a-r*
cX2+E4,1fa2&T%#f''!X4T@qK4aa%ATkkjHK(r#h%SGZ&I"'KQiL2,amGqE*jeXD
F,8cpB!@2*AV$rSm)Z!'Ffk(&JpA!cQ[RUZ@!kYpBcM((qebQH0*CLhZ"IIJCC5@
cRB$B(JN4#q8"B0%leNqJ5TDqRm9eD0mK4G@heZ,rilAYGT!!r[[Gcb`jE''bTZk
Jh'Va@MPdU$m4mKJ("#ESe%j*V(4&[80A901F,16,J%me&2Q[*cpfh6aaU[(6%l-
dhQmqh+H)L-ZPK+-*GJ+FqA"M'fFE6Rk-3VjUYl19AE#0*br*rl6'a1[ILC1EM+0
GB4R&*),P`RZeb[*)l%MamM+$-9V8Ji%2N!$kkUA$FH!(2C!!R4S*A)E)NEDMH-r
%`eSX(DLHKSiYiN2drN9m#`MY*@`qUlKmQ[@(T9@TFpa,%9PI3+I6ZY%!&95K9l%
p8dI6b0)bJT0B-@0%$$pGcS%rb0LmSLF*&Jd4ih12iG!-2TD(e))fm(j@iq2kh$U
Ud*X!'05,c$fMYF6%p0E+6el[+Y5[f@k(@'HMC8hZe6kb'h%R'4I+Ma3"Y`Qb#1d
c0FjiP'!jiK'6U26,eE$(jTcV%A1$VP08rG!PH,'SY9iPEP0iU@&*`AVbV"m23C@
H4#'Ir5pKe`EC3[@*PBF"d8+[6@`#e,I#@)9p@c3e!Il5c9q3!!SI3NK)+LlS3dR
H9ld*%F-+jZH[)$#Q6`"Sl+')AXQkLSrCpeA`HKdJiib-F39-X5-$RdZ!6N$30r$
-rj[jQHji$'fS'L%%$R!9h[aqNC4cYi0c6f2j0c'"%ci0&-V,-jZIDAcbFd93j,T
4C4e(*fpqh&(UEMi&j&Q`Q%YA4++LrL28r[X3@+L!mITGUNQ,(q+p9B4*0EFG0UT
#cmpAIAi+1+6!TbhQK2B+DA9@e*F8U-NH0KK0+qrM)+63`9iE"`jF1V@B!$NN4`d
cPi*fS)hkJ2C3LK[ekqT@S5ccdGNU!HVH!JV)PTkLG3d16h&$5D(arqFL-)XkFUh
6RT[baRX!iU-YGdhIB&9-hJ*b53("kDXk22HUaPDqJmACT,0aDJGHLa4G53#"#k*
p!X+KFPX3i$e'AKhCDK!+5fNhUQ@,Ia@CbC52iFJ-**b!f#K0TjL(08dP*h)Rje,
9A+h+,R'5clXRSl(mMrk$`SQkBFadqI-cYELV'#aAAi("CZr1Km8l"Yf1KC@Pbcd
3DYij9eXH)1("()@*Alaqh)6c%dc&q3&$j%C,HNJ1[PU@SdPEEpZI#CK(#CGNB9H
XpQ#cJIfS@E81LRPI+2Yk25Gh8"UIB6`DSQDY'B%[[LDF4J-c@pRN(Z5iYHlSm4&
M#853!)ZkqfpijTZjm'N4!3GEih4ihYQT0f(8U$KqE8Q4G2Y4,BkFa#43TB-#A),
LX)i6aaqdVKVe8G#)SV$R49THCa&hYqBpeRJ99aUIbMh-ZUkbY0Bc928jfe+1`dc
rJ5Q&M6eiAJ8jipp0Kmh60e`S@PXc(q@,EkqZ9GNbV9--Ue"jT)k%P0"0QMJqH@3
I`+CefFG[2elb(9*PHD-LfX'23pJVFUS9fiU4S5p+Xpb'h$Lj%",)E*ETbrr$'PT
GCKrZm9G!C!fJ"@-JJ,6591Xc&#RYL$X"%K-BFj94KfHl2SDq+[L2eCqRPGPR,6J
*l0TjfUL&aCp2,SUr8MdJR,HEI4+HMY8dQk(#B0khqfEli"6BS)HmYQ!2'i8"1h-
YEX%"C9JppQjh8mUjj#&Qcb&PR[,'#2r,&I12"9!mCqLcH''idlcU9e0fID`CAFR
pEF""k!DpXkUm"D"[TKahSk336-[TGElFkT1H9,UQ9dQBAU*khdLJ41#`+*Q*JpY
LZj8aFj!!Y)FXif0FZ$+E(m8YiDQ'f-28!Ji-)!3rflhmZ8S4I9!(2l$(h*[4k)d
4%XCIfcZ5i3`*aFr5KEhX)RECrEkI4GqR)3Zq8$5M#(%#K6G$cMVq5Y1bUF$b6aA
T%l!kpi6(IIG+$-ARqi5LCqeX')HJ#qMj6j&bDSK8'K+lZp!k+'B4Dh%`b-6hkX5
hX$*!QVYcTS)AcJ-Xc11jE!6@dEMTlhBF%EKL`%r,f!9IY`dTH`a&YM@&Udd*C1C
$fE2Y9-UjTl0%%TD%-8M-5hcj-F+4JN!1##'264%8!+@3"!%!!$!!3!#3#3%1D`#
3"mi!N!0"rj!%!*!+TC!%!3!!03!!Y[&1mlEa6[-!N!21!!%Y%J#3!h)!"3lX!*!
15@0[EJd!!4)YD@0[ENe"3e0!!*!2J!#3#3(Q!*!$J!#3"!m!3X(8iHr%)(JHNZX
l)T0$PMe1&X9%h,U"-`j,RCS+U(NFRSIR`'$MA4ifZ1eNp(bc"k[8Tf29`V5Ebi-
dlUp1aif&(6j6c4PRTLP1eK5a-h2EPVY&cfClKmZkIGS2aXQ*%PIPjC5M%Hph@9&
a(ZfDKkIUBkh$)JJi(L3&)ZG6@!#PN!3"!!!`!%!!N!N",#X!N!Gb!!#dN!$rN!3
!N!ULN!!!!!%!!!'MLJ!"SSS!!!9,!*$c$!!J!!J!SJ%F!)"993#3!``!+!!S!+i
"6J#e998!N!--!#!!#!#L!4`!JP99!*!$$!"L!*)!m!'B!)9993#3!``!4J#Q!,S
"eJ#'998!N!--!#J!+!"e!6`!Ke99!*!$$J!S!#J!`J'N!)K995J+!*!$$!!S!#J
!P!%5!J"993#3!``!+!!S!)d"&`)"998!N!--!#J!+!#f!4`%!999!*!$@J!"!*!
&A3"`!(%!V!3#6dX!N!G+!&8"%iJk8fpbFRNZ)#"*ER0dB@aXBA4TEfiJBf&Z)'p
ZE(NJBQ8JF'9bCQpbE@9N)'pZ)%K'8b"fEfaeE@9c,J#3!eS!!3#3"9d!F!"a!+`
%!Np,!*!(5J"9!41)1P4SC5"QD@aP)0*H-0-JE@&j)'*P)'4KE@&RC@3Z)#"3E'9
KFf8JGA0P)'Pd)(GTG'JJBf&eG'P[ELi!N!05!!%!N!9Y!'B!J3#L"!*25`#3"33
!5!"R!31)-P0[FR*j,#"LGA3JB5"NDA0V)(*PE'&dC@3JCA*bEh)J+&i`+5"SBA-
JEf0MGA*bC@3Z!*!$I8&%3e)$!!"q$9-+Ni3"Sfd!l!Yb!l5b-LXVieY0hP[[D[H
QELEAJ$%!3!-!N!1kY3b!!!PT+[lJ!985,2Y+b&X1iq9cZS94MV)rcirrVL!j0k`
Dq"(+KM9jKQ+MCf[`V&ir"HlX#m#`U3BL1%aA2VhVbkfM'32&(&P,'cJ,!*!$6!!
#!*!&-3"R!%8!V33%8A9TG!#3"3S!8!!F!4#)'P9Z8h4eCQCTEQFJGf&c)(0eBf0
PFh0QG@`K!*!&#!!1!#J!,U!#!!%!N!28384$8J-!!4)08`UE*!!lLSL+&Fm@d(1
X4'`3p5`rIcrXejfrjql1$+GBf'%P+PL&999LjEra",'U"3ZbC6Y1)2Q3!"m"9#5
BqM@mKDIGaGRG6G,)HT+pI4mZ3pc&PmHP#aEjM6KA6jAe#b3m5Sk53ElSG,A`G'S
9QL)q"HC1abaeLk9cJ@A[I"3FZ$A+c+Ce3%m()3a-9j4CR+h"Zf9c)KIFIJai(r!
m3+*2iaUXL26-$cGj+&$EM-KaUkHFa@0E8ER-cGETJDZ80pr*q`cTre6rb@d!N!4
Z!!%!N!9S!(S!I!#f"!*25`#3"dJ!AJ%PL%j6EfeP)'PdC@ec)(GPFQ8JFfYTF("
PC#"LC@0KGA0P)(4SCANJBA*P)'j[G#"cGA"`Eh*dC@3JBRNJG'KTFb"cC@aQ,@9
iG(*KBh4[FLi!N!1T384$8J-!!,B08`UM!J,[j!5Gr91a$mmfHp2E9(6Bajb+k03
*LRTfFql'k6J3$a8lE'G9#9C9N!-KhQd6UrS"#j)2B)QrqC!!!Al+C$IA*4T0h,,
0C$41)9c$S80X0Nh%l40&LQIS0$'"1Rme"P-qaQ1QT*,p22dS82pVc)-l2TG!Iei
&[QEeiPFKRRa,frhZGP$pLG-c6DU+j6&M59JZp!+6*N%5EamGV!)!N!-k!!%!N!9
3!&N!C!#6"!*25`#3"3-!4!")!1L)'94SDA-JBA*MD'PfC5"TFb"NB@eKCf9N,L!
!N!4)!!%!N!9(!&S!@`#8"!*25`#3"3)!43!a!1L)*eP[G5"SBACP)'9ZG'9bC@3
JB@iJD@jMEh*bC@0d)("KFh0hEh*N,J#3"#J!!3#3"DS!K!#q!0`%#%0[ER4TER9
P!*!&"!!%!+)"BX!#!qJ!N!0m!!%!N!9T!'-!I3#I"!*25`#3"cd!B!$cL&a8D'9
bC5"TFb"ZEh3JC@j[G@GS)(*[EfdJEfiJdPi`db"dEb"MEfjdD@jeC5"9EP0dG@C
QD@jR,L!J3@iJB@4NDA4TEfjKE#"H-5"LHA4PFb"KFQ8JEQ9PC'9N,J#3!ai!EJ#
'!0i"j!!&!*!)!38'8h4KG(9c!*!''!!d!"3!r!&k!!%"!!%!N!8$k!#3!j3!!!%
I384$8J-!"1B08`VN)J$IGJ11FDG1aI+XhN5ajMb`KrLXhP3XTk#)Ge0Rp62"!"d
')Xj5G&B21kcbrprhRKcHfHed@!),S+0`'6QD'hf-e6-0EE0JA0JYVCTKMLqC4BD
'lHI%rAFk&h,ZT!UE+blcrR5$XU%CY3&X,KdXDS#*9HPJ06Ki%J%%4j'$aiQ$Lac
80FqpJqd)X1(#V")%h"U$B,1dq1`PRHQNP#Lmm&%MhQUjjlm1[0)NHb-$5U,$+hX
*C!STdVjIpHXJf$AMJATqk-M-MAJli["V5jR)&)*,#QKAa55e-8raq6Fp!b1H-Bc
[G-40$Ldme)!l'AmdjamkrMTV)lN-NRH5S0Q(&[jUb4G0pRc!Ah1RGIC')T3DMaB
!!!F+384$8J-!$#J1A3ZXJL3qkJcIlqii#D&+Ke!DU9(K"%G!H9m(C[1JfB+%&8p
N1&D8a9jY2,15NYUHE9KV1r(lkN0S,@5Y3J9V6Lk3!)3*Hi[IEhAm2XAeqmM#S&Q
eT-lX,V86@a55-#r*XU4,K4$5pcZplm6LfR2Vp`F0jqFd-3%N0#-e(dEN$U81T2p
Ub-pQ#-'`@@PihV`qI-'pjd8RLm)IBIebRc`+GJ`A2SQ9L4kZJf(%Ki5*VD(+++J
iJ(KI*!L$-i6RJBMj%"Nl8-TZX#ZTIBcBlM$p%iP6Rlpp[)(p[2VZF,crpQH$ikl
L2p[!0f(&9(QT2YqjNVeT*-pR6bI2K*@I,SDba8$G!'bC21$jKIJR0ihTKH,TKfI
'!mcHfQh&j`f`,dKaB5E1mjd,%'aq)4Z*jC),+Ar)9b3$Jkf@qrR[cF3cPIATH#J
bR,XaXMLik5Tr8bYLC46q"Ael&k+"C[I#"GZ0$dVBebMX4XC2jR%5'B3rL8[E(JV
icPi$,iS4kXh`-m@V!Qj4VaQ&0c&()JhM%r'jCe8ZjY92Rj`CFTrN2KlHEH!EPj,
MZ@)f9CDH+hEiTDeIR%r+[YVcfk8NpmZjEFX%I&6"VhJSqdSP["kj&S,-8"q$@hF
lBJDqY'mm1IR$qG"UHHkj'8cVrDQ+IZU(8IJ2r+`9X&j(B4F5)P5mR*i%J3j#-[I
S!Ke%SY!0Uq"LXTMRC6'h+)[kMf34jf3K+&588$L%#LRFTZT&UP5Pf`02Xq6d+c&
C4[ZF[#bC[qBB@8U[jj+bA(kpjl%XDpk*lM)`2ki`-+8rG"Lmb1a`'!50rN3`q#!
he5SIaJ[hrX5$@Z[`iXKI9Zl`5KXQ`c"*KXNc6+SZf3Dr`9YX&JBq,H,iZ,!,elX
ee+GlXAa$MkVGC%f"T8I8PkC42fLe%MV,KqS+VNa[B%P[1H!S&5jI@,ZJ0KaG-b2
TERM4K(bSPGJqL-%1fYE-M91k@m"*3&Bfi2X@YjEZT3J1QVkL![(3ed!b4qe`$N"
`QL*UQpdF3bfdiT(4$1iC3,"LM'iV364RaNi2iGC+dhq6$j%`!`lI%Dm1d4cTqeI
dJf@e5Dc)M)LN2DTPe)hD2YLD3f%01I++KlAi[L4ZHA0H[3qE9@qmSGZ%rZ&%Y32
9Ah[-dRZ#A%bCT+TF[bkE+VPid8'PRJCMVrr+36c)[N!hp"D"$ZC6SR-ajP5(UD1
#Srmr'"hLem1#8fA[AIR(b4fMd*Ulpcr3#[S$MSdVKIiDdY4fD"6)TbKXB05T[[6
pc25K$`8IcSSJ9#eGjIkb6qhVqj4bp@,!+Ab0p0iTlF`FG5,VRGTaJ'J@Rj[9MJf
V3!i!FAq$hT(CD38,fJD!CimeQd(*"%i2DEIGVcL4Sk$&k5BM,TrU&DPfNAS0TpK
l&Zh2lXZ3!*&TbdZ$GVILk[[+Cr""B06H3[-$Gid6'FUFe4b1$IGCYRQXU8d%bl4
0a"+-P*,$T29Q$H1S#A(5mGC($JcjNmKbd,k#1UI#h4RE+2SiVp#F8U!JIRp,rIY
)DeGDL'&83"i$p&i6,+a`1r3(fS0K+SEKRZ3L!9lL)*B)!F#)rlQVjd$`pqi0RQp
XY&@pYrVNk85Irrh[M[qHrBjVrderGGk6cAbck@*X[5*13r1q1RcA*r(AY'c)Q&a
50kA)b(ETcGab10R#2bU'XLNQNC!!JpI92ER&p8MDSSMMNK34ILGadH5hd4EHcS3
HC4M,2P2`GPqGP+L8*,m1j`!2G%KF,RNDJPmUKYS9CREH&0cfZ+k@Eqbaj91VBdq
6rDUr*a,[PG+G(H2qS1G5+C5SMZBED%SB&0VJ,%j62X2L6Z[Z$dVq'44'F4e3rYU
LJ[-me"T9J829KkaerSDL$)`VXIrCdFZcN!"TZ#A1de%Y8Z*-EUE1dB#*1lE,NrP
R,ZC(qHd6E9H292IX,&qq)8rXQ'mG0F'TBQ-`'-U'0bZ0I0fldUeC)pFB($(0mYM
#MjS2bLmArF&Jl6B4IR*,dRjZj2c")G18Mbhb'4BS'bV1cY1i#FPI5GQ!DIUhaYA
"UlBK+ErTQSd''jLfK25XF6Xh*!9-C3%qf%MK,m3U-M!)K,fk%TkBK&2brJZdA!"
'E1f`4+rVE-pq%&fdrE"-3)#i`R5j*Y1f-B*N'$,XS6dfZQ''F-Z(*q,F4ir[4U+
Gr`1)iAJSBjSKL8*IMe6rHppArie+Gb2BZ8Qf+l@fJlHjUXbHLI@hl5BUN!$pc,J
d'qhDFE1TIC-BPF@@5VlR@LJNK,1'9*eaLB1,Aa'&8ZNr!CA6DN)ViC4-AD+8`[#
"#%FTlJFYPBQFIc(%k%*98ZVB@2@VpFN46eGTXP!p4KUi4pA(qEEmFUJT["bc*Xf
"AJB*T)e!-4UU4"bk0YZ"#V2#JX&#@U%EkXVA2hjV)KEh[3!!!E9"4%05!`!#b!e
9#j5La1aK"%pReGh9)B3UDfd*$*Ld(%PN`13%U$)jQ8J'!5,ISD3P(j-1*6FFH89
q*XQCr'eJ`6EH6TpTGi@%56)6f530b#IEXf2Z,82mj(Z1VVPMNi+EBlfXU"!$l3c
i%Lp1N!!m8H53!1ai1[jprBcY`1#e3A#i[$`q(XH3!(Cdp2`FU,0B$5dZZjD$j!q
rA0lJBYTbDI!m1FqF&ca[H@Y+QLp4erP&b0b@U#3HJ2Vrr0lbcQQNH+&'MC)kqK6
`ec9Z1Z2T1Lha1Z$H*fQXlZHZki&[&YbUTmmb*DPlkrZZK!rURDDm9"'9%[kG1*j
6[@R1UKP8hmmJ,Pl[iH@LC)-'+SShpBbB-p32UAVkpLLF8Nl5&[!0f9E$bq-lhJl
FT+Tq8F+d2Dm'e[MrUc4&)[-RAYp`U+Tlk'k!,'B@$N@Xe`fED[H!5S[L%M*5IP,
*a!HF9h89CN*F*[55Jl8T-$XVQN%ef6PIQ!X'`cDK&**3Q@cfkN&Cf@C&LH%X1S@
1%ilU&29$c81F@AbHjM@&!SDq&R@'X%)VM"[r`)*S3B0P#d85Yaq4Z#rf[!r14`!
!!E9"4%05!`!#p!e9#pbb`+d2"#FRY(fFYXSYA1K9e1X5RpXqUZ,qI8AV$SS,G6[
'T3i3Pq29Uq'iApffE4qJ&5%[hdYbX9&af`F,kc%+A#4PY&f[r*I5qN+[D-[p#I8
P$A1d2aZ8eN,f[I&"VQU3!'U('"FcA9bIAV`I3"Ue`D,Pq[VKBEZYAEB4'cDRM5r
#2jfRVprmaie5iqHDh5GcCR`6r@[mMj+l@J@QB"Y`9!%T2J*B'A3!6LE+,LC1QE+
8-&SVe!+P$Um3U!A(#CJ9k4A$83%$KDQHMhj%jXBb&`NVADe#far6`F+R*%,5pUq
+rhVVC%V-b4S"k4*C[hadMbkXb!Krkr%ZUc%RU@9hAq+E(drLFq%L6G8r*frLF[[
dHdMRE2(A*4lI%R,1Gj94Lqr3HdDZP)X6Ia[kkhIq2-C(H+*S@fD(Ah[[8&c[IEb
mKi*QQI"!D-((5&*ShIYK&j-dA&4a%dke*lAH,h8)LP3&jJl&YqJJQ"Ti3c*VCf4
JfY@3!#MQ+4"5RUG`%Gf3!"SFCM'HZaEKJ+I)QUQ$H5N@j-iqSi5X5#(['arhL'e
hL&QCN!$fA1ha&!)!!!'+384$8J-!!V3093ZF&-Ae83$I*(P*'YHDE1qe@Dh!Idk
GbP6IkAY@IKAB#V`+E!8![PD0YV@jZ@rZNRAA#J`6f4%$14$09`ERpmcaNaqj2hG
2l%TfFfar'bK(iZPCq2Tpp3,NLk)cNXpm(Iqqr4eAC+m0)VI2X9Nb0[HH+Hc6,md
l0#SpEeUab'PfiGccV3UT2UPTm8[1A%pU&"kKqRrqk2Q8T$)m+&9UP)9HXVlEkLS
$VQ@45GHXZjIS90Z`,!ekA,J@Te[-*E4TDmXN(m@6&,Y*K-3NrblFca4A-4-a3+d
0!&BlJeH,B3S,*!4hDDb&Fe,[j@M"Z9L*IP4[j%9S(m!HJq4)d,Vb-9',D"1U))[
fK3p[J)R"ES9dUSE(@$cNrd2(6ZiJ@,9'+XJSGT!!!)e9adG8C!Mf"cdX-bdCZ8m
)c)TlmT%U%#b,A)T6N!#BGA"a3$U0f8#KH!m,D0Z-er3+fSNkMY,#E4kf%!UBjfU
9!3H94f(GrJmB9-d@((SB8VMqM-6Vq,9VGM3#!!!%-d&%3e)$!!Ch$9803b)5%HC
HEK"N,4P%D[*%*!X3@DZQ*LHh2BZ-i(ERb%Qh-e2bQAph[qrELM`EhmbhY8#5eFl
XbH4*f,ilNa'5j9ENLDc)laq42j1IbEcCeRB454B6XMFYb5)S31)(rdjCKT&84$L
S#cYiiLGf)5c5J1e3aD%@GK*H(mq1D3bR6lpC+R)6)mRY[@4[%r6@hmf'R%[)+8F
IZEr5&V,ejRAjaL3*5bPTf0kN&a@6NPGC,a$mi-RK`KFHI%V$*QM4BN6+hFfqTX2
b,*5j55k)jb(*(2h&i)XDJqim&Fee*9$cG*JIMZ6*i#SGjViNe#Xq)@+3!*h[`af
,NK")heX@$ED[(5XhPA-`LA1fRcbNbSE0RBqrZ,m'l)YVm[NQUD!A@)"Ck2@aqND
T+'b%UlJKdF4%D4j'8D8QKLJRXm5(8JQR40@4X8N6+L,JmB-'82KL!,85ECR3J#8
d%@TbLdfC`eLTT"qR$+aeU)[Di0J#T6DMFe4B`aLflrdNJ-)Z!m3jBTLiESAmcl%
RFHbLl9fAJNh,JDRU`pD$+ZFdM(GdeX@!G"Z$#pDfYBXaSNc2)HBbh"2bA1lEQ20
L2d(0f,[Q&#I)A'ZQ2(KBb@@qIDUNT-rSkShVZbh3b(2j4EE#Hi"%aD`5%YXK48J
Pi!JpjfESS#*')G-lpU&Zma9#N6ZP%AF+hP-PhjBJ16hDlDNc*qDmR%1jlK@TB-c
EfPh+FK[jplG1#3aZ,GrmP`rLNbG@J3Mpl)N"@`NmD#E1Ye,'NV,SJ&0-'N"4lGD
H(L15jV)kGQArf*KLjXEBBNT+ilSFVqIQ2L6S6,2!-qdr5A,SM5rZ8%e+qrrFIEa
)TAK+(ePf3"KU9mH96KeiJM&J8-CCH2(UplHlTpQ8&pIV!mfS&!eYS22Y"H59K,,
GX(5'$iDUN!!D1!1%4[Dm+R'd+EK+q$Ll6eBP[SHY1Jm&+*f0f9@c1LPl$U`!LB0
EA#,N"l-#h9`&eEjM4RfXIVf`GZf$Y!rlJeGII3NEUUX[JA!5-Xp,Z*!!K9k#PFa
lib#6LH[)jR!53fYB8Y@+#cA4e!fZkRA5eL(bC5reTB0Nq+`1N!#ULm1*SfpKL@K
A(V8&MK(J'6fDpK)ZJ-$X$'lTUd'pQXb1L-Hl60lqhlJ2YkIbbBfVNkBAI5lbXT2
6-1CCQI@i%dADZX@J'V("P$45$f-VG@mlh@!+D@pipZKGMr,CUC9ZcXXMqF'dI'X
XGU%XA8IkajQ+#fPh$2Aj@FVRjqVrINKT#[0r9hl1a'Bar[EhjGLF9@FZ6fPZ&[U
Q90aX9RVbi))fT0[hNY60m9Pip++5qIc2PqqBK`c8pE9GaLXRlhFHm(""&mY9YB2
CTqfiUkZ$G385RX(1bd[ERX3qk'4JZaVPpDGj!R%'T["3[!PH+Gc$PhJ`"hHqIVA
3@F0Eeq31!*!$$!Y9EP0dG@CQ)'&c1J#3!`J()'C[E'4PFJ#3!c`!"33JEfBJ"b"
TG'9YFbi%8h4[F"Y*G'9YFb"bC@eKD@jTEQFJG'mJ9@j6G(9QCMS,9@j6G(9QCQP
ZCcS!N!-Y384$8J-!!$!05`0EE!ZhDJ#3"DJ"@qfr"JB$m"(EmRm)@%,*M`E@'c'
A%`#3!`B!N!80!*!$2`B"J!#3!`8f,M!Z-6)f,M!Z-5`J3fp`HA*TCfKd)+NJ-6N
j-#db-$!a)%&XB@4ND@iJ8hPcG'9YFb`J5@jM,J#3!b)'!B!!N!-&0Li`,M%98h4
eCQC*G#"%C@aeH'@U)$BZ-#ia!*!$$!!S!#J!I`&`"+p993#3!b!IU5!a16N`,6N
i)%&XB@4ND@iJ8hPcG'9YFb`J5@jM,J#3!c4"9A-b!*!$!8P$6L-!!`#3!i!!!3#
"!!)!JJ!$!)0'8N9'!!-!N!1!!!%!J3!#!))!!`#$!*!$('&eFh3!N!-"5801)`#
3"B4'8N9'!*!&K!#3!aF!N!83!8S!!!%!!'3!!!%5!*!)R8&%3e)$!!#S$9X+@N!
#GrJF9R9RkF3q91`3He-hGAEBSBqh'hZkhCY[Kl-IE&K9BP8P@&9L2BBG9J8*U#Q
Qq![JiFY6!'CTr+CUIJ,Z--20MlZSKSY&HKKK,qfj,(1Q,"9-Mmrf5(RXk-@X00L
!E*!!DjS5jK4TL&dh"9[h4!G&YT63ABX`ZFQ#C6*"-HNekEYI%LZAU+5p`$mR$b*
V!*!$Rd&%3e)$!!#U$9-+R!)#lpEP$+#qS*Ea@aQI@CQPV4E2bMUh0hHehUhEXm9
[R!'!!3"S!'"NFeNC!!-*U#QQq!X8kF1E,U4q(UI(l#YZT(50Qkh9NT084ZTSlpY
69H@-`L5-qh0p3'iE[*J9S`[#TA#'fNJ1Lp%f64eF0J!,&AB`dPq682G6"-FSJiV
4Xp(IN!!QGReLkGYZmL[kiaM*q`i!N!0-!!)!N!8)!$3!'J%EL"Y3E'9KFf8JD@j
cCA*d)'4TFfXJAM!JGfPdD$S!N!B,!!X!+`!VS!)%5`#3"4d!0!!Y!4L)!Pia!*!
$1J!"!*!&0J#(!%S!`33#6dX!N!8#!%8!,`%rL"PH-#"KF("PBA*c)(4[)'*P)'4
KE@&RC@3Z5`#3!aJ!2!"!!,3"Q!!"!3#3"`%(!!!S#J#3!aJ!2!"!!,3"Q!!"!3#
3"`%)!!!S#J#3!a8!9!"N!)X"KJ!"!3#3"`4,!*!%"d&38%`!N!B(8f9R-J!"!*!
%"e0PCc-!!Rm!N!-(8f9R6J!$r`#3!`G"8&"-!*!&!3#3!i!!(rp!!#!#)!!L"*!
!!#B*b!!L%q3!)L!#!#*!!3!JKq#!)3r`3#)F-#!N'Im3+"U+#$)bLL3Q-[)b6M3
'15CPp$)5C43N#'Im#!4``"!#2q!J!3'!3!#'`)!!3!%!!#!#!!!6j!!!#FJ!!!5
3!!!!!L!!!!&!!*!$J!#3"i!!(rr!!$rri!!rrr!!2rri!$rrr!!rrri!2rrr!$r
rri!rrrr!2rrri$rrrr!rrrri2rrrr$rrrrjrrj!$2rrrrKrrrr`2rrri"rrrm!2
rrq!"rrr!!2rrJ!"rr`!!2ri!!"rm!!!2q!!!"r!!!!2J!!!"`!#3!i!!N!F"!!I
rrJ!)!)-!#B%#J!T#!N!)K!)J#3J#%![3!rJ))!!)#%!!#!L!!!J*!!!)#J!!#!`
!!!J)!!!)#!(i#!J$r!J)"``)#!Crb!J'S)J)$+#)#!`"L!J0!BJ)'Ad)#"P(#!J
Cr`J)($!)#!ri#!J!B!J)!E!)#!!!#!J!!!J2rrri"rrq!!rrr`!2rrq!$rrr`!r
rrq!2rrr`$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!r
rrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!r
rrrJ2rrri$rrrq!rrrrJ!!!%!"rrq!!J!J`!,J3+!#%)#3!Q%!L!)5!)3#j!!!rJ
))!!)#%!!#!L!!!J*!!!)#J!!#!`!!!J)!!!)#!(i#!J$r!J)"``)#!Crb!J'S)J
)$+#)#!`"L!J0!BJ)'Ad)#"P(#!JCr`J)($!)#!ri#!J!B!J)!E!)#!!!#!J!!!J
2rrri"rrq!!rrr`!2rrq!$rrr`!rrrq!2rrr`$rrrq!rrrrJ2rrri$rrrq!rrrrJ
2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ
2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ!!!%!"rrq!!J!J`!
,J3+!#N)#3!T%!L!+5!)3#P!$q!JJ!!J)3!!)#)!!#!N!!!J+!!!)$!!!#!J!!!J
)!IJ)#!2m#!J($!J)"Rr)#!DJL!J-S)J)$!')#!d"L!JCI3J)'8F)#"Rr#!JF-!J
)$rJ)#!"J#!J"X!J)!!!)#!!!#!rrrrJ(rri!$rrr!!rrri!2rrr!$rrri!rrrr!
2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ
2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ
2rrri$rrrq!!!!3#3!i!!!!&!!!!#)!!!"*!!!!!*b!!!%q3!!#!#!!"!!3!!Kq#
!!3r`3!)F-#!%'Im3#"U+#")bLL3Q-[)b6M3'15CPp$)5C43N#'Im#!4``"!#2q!
J!3'!3!#'`)!!3!%!!#!#!!!6j!!!#FJ!!!53!!!!!L!!!!&!!*!$J!#3"i!!!!(
!!!!$i!!!"r!!!!ri!!!Ir!!!2ri!!(rr!!$rri!"rrr!!rrri!Irrr!2rrri(rr
rr$rrrrjrrj!$2rrrrKrrrr`2rrri"rrrm!2rrq!"rrr!!2rrJ!"rr`!!2ri!!"r
m!!!2q!!!"r!!!!2J!!!"`!#3!i!!N!Kh384$8J-!!)!08`YE)!-$TQ$$UQUc-,!
")Q*J0dZafeQ9S#"L`alUfF#B96%,BbUkpkG6V!S,L@2)YZ*heJ"5+2hK[F##5VM
&3+GM5$+1VpRh*L)1[qR'r[[BRcTA6bLQN38GNEU#'ELMa4UZU'SRT%mb#Zp&cJ8
!N!0A384$8J-!!3%08`,FeJD6pp*'c886E3#dq6FZ[0Y0'fE#E,kV#pq%hE$Ej0e
feG9eB3!*1+@)rh3&qKSdTMBHqm5GDpP1JSQ`da$k`,2S!'L3!-@qrJ5q"J#3"J%
L384$8J-!!iS08`UE*!"rKN@`h6Nj%l$&$Pe,6NmGf`%9!pZaqYJ-9[A12LLS@(e
X`@kXkXE!2f0r925rrfq2mhC@'FEU!!ZC03eF9Shd`Bj'pkj6'Z`%Xr-S&0c&iM*
#YY5j)-Pc#j!!hfq#GS,Td84dcbPjXa2G[-RZ+i@%-ma,@ZUD8SSG#ciIQp0r"2"
krMRUbY2UD[qIAfl(Ujrp3rrlNCBP!VJcDU1#E9E"5#Dm4DYXM&@eAPXqBTZhKHe
K&AhF&mE5@NbNP,3#F4p-ISc$ekiEjSHQ'HT6frC0h3qk%'KDJ#F%b!#F!%bpqLd
!rZS*!a&r!2#LFZ%#%"b#J!'#BQ!Y1)Z43BcI$%,N%MVLkQ15c,dSF4p-hh6j4F3
VE-XB!*!$-!#3"`3!!2q3"J!"!*!(!J#3"`-!N!F%rj!'!*!$"J#3"3m!!!3!N"'
"!*!HJ3$r!*!FJ3"8+rm!N"U"!&6r9#[r!*!BJ3"8rj!$9#[r!*!@J3"8rj!&9#[
r!*!8J3$epT!$92D3"#[r!*!5J3$epT!%q2D3"5[r!*!3J3$ep[D"N!C@prEf+rm
!N!k"!2Afp[hrN!Em9[D3!b[r!*!-J3$ep[C@rhrhN!5"rrIfN!3Vr`#3#S%!pID
3!rcppeCrN!@VN!0rp[BVr`#3#)%!92D3"2prpRmUI`#3!e48IeBVpP3Vr`#3"S%
!92rfN!0@rrMhIbTr!*!$9&5Vpb[fre3Vr`#3")%!92rrpT!$r2hh9P3U9*!&Ik[
hp[Erre3Vr`!!J3"8rj!$92MfrhrfIbU3"948Ihrhq&6rN!08q2m!!2mV92rrp[C
@rrIhIbU"N!5X9+Y@pT!$rrp8q2m!N!6r+e6rp[EmrIC@UbU"pT!$JArrprD3!rp
8q2m!N!Er+e6fp[hppeDVUrq3"RrhpT!$92Mr!*!)rb[fpPEqIrH3"2q"pj!%pT!
$prMr!*!+rb[fpPEprj!'JID3"IIir`#3$2mVpT!'ri(hN!2fN!2hq2m!N!lr+rD
3!rrrq2rrq2D3!rIir`#3%2mVpT!$prIipj!$p[Iir`#3%[mVpT!%92D3!rIir`#
3&2mV92q3"96ir`#3&[mV92q3!e6ir`#3'2mV92p8q2m!N"Vr+e6ir`#3(2rir`#
3([m!N$&E18&%3e)$!,l@%&809835!#&LlPE2IEijMq-)4`KT+X'mK*!!(Y%NTpK
-4U)Q&`hRN5E(*8TN,$Nrhp`T*2%f"NPGrja6SJ34%(%Cac)d&3D5J#&BPQ9FP`Q
-l9M@CF45aP+@@NZTCF@aeV%faYchphZHpqkp'%8kRErrc`!DTDFNbS%J5))J##)
$!&f6rh(9q9FeSM-)I0p#KVi%arMVLJqCQTm!+I&hMrr!(6IPIIVIDLY'Ee+ZhRm
E9Yc`MGS+ZNV%3Elk"K'ee3FGGqPqmaN&j&$YrPGl+qa2lphjlZb4hi(B@6a5qqj
X6,!a2JpDqYrpJa0%UJm(1P*1N!"lRaMip+GKfdFJ@EllKe$bPfZF3mh,2acBDhl
h0Narcp-CQ+lNkIhdHV3LIZEcCqMeD%@LMDFV345ZqrbCJRm##$j)Rl36)##1@2Z
AR![(,@'J!M@HZIbUjF1#I`)G+3p%jZcQPBVS1dLqRmm[2k@bX%5PEYlcjk+r8%R
ma2'6D$ZPp&rp3pP(jTHF#4#VSZ(#H+rkjmjIC2CDHkXAZfrKjV&`)8mf"XE-HEr
+FmrLVKkfBA"4S(II4fij`"3'`8jGHp6Hq4fa`HI1K!-48#H1caTc2UGL"90"N!"
d+j[+8SH8T@T+CjrGcMqrk2`&*Fa%dbp%`eIS0Z0RHFB8DJT-iHB-V6N`43i9,iB
f$UPVQlm4f1cBV"+ebPkX2e+9cb5$9cV5cZH2R&+12IpCG"k,2ir&ReH*dQre+(G
ZpcG059kkBhV5P$4(cARh4pfZ28GS+,mD#cZFhrU$HHiB[bV8VVGpk`p6jNl66b&
ck9#Gpl5l91BNkk6+GReR9AjT%4&0fhCfh09KSkJ3Hl5MrphCSY1$LCa5G%SE%8V
Pi-hr+Pi%D,LRZlR$jZNdD&IqAi9bqH)8(DLb5imLX9(llQe@,0%A`A3')KPYZ6p
p8QANJ`5-IiL@Up"I,hLPpiG+G5r-ke1QK`G6b`YHJFL5f2DcM(cc(fI2h[@q+JC
#&1[plpi5YZPM'd%%,eLDmDTrXHd6c6Y4)hNSAaQ',8(N"d6Z(HUqepT`ji*`4"m
E2kkr-IkmAU,lpG6i,T!!r901'M62IR(%I-mUKF8dcGC,4Rlhme8U!V*cI#6PGVa
mT3!-rVaCaIe[2EE)[X3+Vd54*,pFJm0Z0l+8qp2GZkd0bIj`[0R1bk$XH"fLFQa
B3-Va&@hN1qS!!9r&DR-HAb31Meq`M%M9Uqi!C3`HYNl$brYV-YDmA+P(2BaKDDA
)Q(B'-EM1b'"E5Gf284#m8MTmAB5m,`,PI[E)bbQJT1HQJ)+A4Z#l1rF'hPfaFFK
Zld!%K)i)L)+PPr2EDYpGSGYm0e0`QrrS9$haJUNMbQh,65SLEcX+AQP6CX[mUmZ
6jYiIj0hIDlCB,(PAcjSQA`CG'I9F59SXCSX[Ua&*2I0B1"DpqJ!fF5CSSXIPS!2
mdQ`T6qCFHrqdHk,Y,p9(PVi8L$rf$5aG$#ViSGeHi53bA%H#SK@66VhNRMjl8e5
0pimI'lhTh3TNPYHh9VBfG5"`l(D+S'MZERBf,d3NarpTpCp@iif"Pd!8MYDZd)G
#1DH1)@+QljFc4`BEPFp%"4%)Zp&`,"6r)1T,%CSf,h)l#ZD&EdF'6*0eRXL$94f
*[E8cr9hhiT24G@["c-9j)1Bj,"rLfL#b`EQAmd2*83$HidXrUV6r@pFr2!IJZfZ
'2Z3lTq[DXGBaAbS8c`0"6i[1qfLXkcjRIpF-Fji$%3'leH@mc3U02cqYC1C1dCh
)hQFLHepRA`@Lrp$*8#K(fp#FTd8CJ"P%Tp,@iIMTj%Hp-kr(dCA(FlClp+rdSA-
pahe"Jj)e"Nd[Q2R$-mpGZ8jeAF1I[1HZf1eGmbfeAGFrGd8jZKB9c2bD'q+)QSI
M#T1PZ'!b$k0!U'h[`8qSB0ihaja&*&a%KAIL9Ic*RbB31ARR!JaIK+K16F3V1LK
U"S!-NLd9&)eUVVhKUqEA1cLk6pQD[dI4FXS'GPH-2cF5T4FS1VmRVMF"&(*U"28
''"kX#C!!Ge`+c`R`VFN+8P9iRr-"FekTFZj9%A2HdNQj9e+8Dm9Q6A)IS&H(Y&H
64p6XYqK[h9[6Sh1210(BTQC2SEpe8qk2cJ8S0hfb-pP)&q,Q[$S&B+f*0UKaFDq
+BEXh5pAXeqP[hH[h4ZG1@RhNhMF2S"LFYIRV+,+q[N2&R@RQ[&Q6dBfK'$'3!--
TQK%J3Qlq-a",URQm$C&Ib2#XimqA"iMKrF6ZGeC('p,-m`p&$[E2p*Z[2Y!r-m0
mcGSMDl0GmGN6k'rGK"R6jQERf'BFf8rXIZFJXAAeXNRQUqZ5qrYR"XcI`D9,Z$4
TlC(5Z)I9DA-R0@E6dQG0eJ1(`5Sq'V0[FP1-fGZCNDX(0VT8Gr0iI`P(PrH0@bR
kLD,+bQi()0AIp3pKPbY!dF6+"Q*4rc@(LJiTfmC$#Y(")0NL3T)#Xq@4mK+hUla
E$%c33,dA-@dfE"mdY2Rr,bG4P1U2H%&K4!$DL+(4h%"'6A%4mTRKH6Zk!FMHTeY
4Z0Q3!0e*39I3F'6D0m#VFBH1EjkmTF6HK-98M*G5i0BB[#aSm*[E(H`,'M`ThF&
,#29EcaNm`"+1ZUfd,fjqR6iG3rBqHepV-l+jK%UdrPNf+T-bYECMNP6*eMpl0S2
`i"%SSUUlA(d['MD&8XMHA2!1K44&%Yi$BjpiHjG+q6T*0$LbXd-bHpUIlci65R#
@Q)C,PfQSM+!X9cPh)3)M4UppQ`@VRB,92Q+hqA8+I0d2X0fPER6`084c`Z-jZe5
RpjLqXP$bFVk-Q28%`f)R!YLF"r"p-9p01c(NI#iZ!ER,bS'r!r5$4,U*N!"-QIE
kZflH#d#jL`$r2Rp8(d26HQjDlRB9eDPp1+kX5"jV`['&HQhl$'BZBb0P9-Z""LC
Vrr[e[MC+r)5,cf2CQ4#AZp"Ffl8H2cGMf#Tr2S(8A6rcS"N#L"C#!fJJ#SUB&`9
Cp#KB91FYEfHq9,Z236"a"4QMlTq5q4)GA(f,Gr%8G8hS63Lb83jFdkJ)5AfE6Ie
Gah0-#,6ZM[kZda+PNUC'"3'kGZ9VD%AABI4aPE2SJXC2'SZF#5f,*5#pL#2!3Eb
hA8`1*jrEh(9LlikZdmreGPdH[HPphejc9pAS69d$SH[QZ&%F+,AD`m+,Km"#4ib
McMq`MPh1$eq4AEAFA2ZqMcXcIcL1+*NdDX$KQjJK6d2RG"3$%2d2cGBa%N*i@Q$
c48$TpL['B9qQDPalHUJ)%4T9'f0dp5+LlM,bFFRXh!d3`H[j%kH94i$cl'A-B)'
h5H8bNei4Ml1JqVYDa$(,2-,c0SiiLaU9C*NB$KCNPYS[MDjXPTP5D(-k[jMCGGU
h$m@jcjah--empB+Scm(&j@8D-2jP4f4M'VCVT3!-&p-bFFb!XmMi`VI+D&)!3"0
&fN0!+N31Ym$XTj+mJ@i0266(E8!J(NB$b'X!(-ER)Er515Xe&FblGY9$*DVY5l#
LqZ8@$ed*RAbP@M9JUj'JVHk8Qr&9mV6&V8A)E1m-0r$fMi`rre!QEia)U'ZAmED
9kQ22YX5Sf"5$5f%UmN4E5AQ*3@`FPFT44f#YNE+3!'&N3BQ1SCfp"3r$D#U0)rp
1%jK!c@H294r`0,[4R"$0$CjQ+jSMX[QFGiX$D%i6cGiYpU!j*TUp@e"dBMDL6ce
4[N#RfccJ9aqQVhj)i&FI3'mbUY$RZ)%B[DU6%D)(B25PL4SKTP#hpUkEf)5-TMX
3R90h49Qkl)AikGb#UrELdA86EmDQ)k&LC(AP!"IM)5GY&iij%fi9cp(V*Yj#'Dj
*q4"TMbBhVM6KLYJ!'D$0IY"5DGr$PkmcA'i%S@6%IK&!E6N1I"!r6r1PF5k-Tf#
Kj9Y+*[CC+bIfq93m3S2%jNpM`kG!'VX"Qdi*IAZ1QiqCKkCTP+A*ka0cc-0**(r
'jZ2+%M,lmQ3e0PL$*9[hE5PTDU*TmjqGG8d!KbLb"`6'Y6$a'V)8E-jY[3Z&RpT
#*P9A82JT#I+UC+e+AMS["L(#k!T-b%T`b'3fmJ2aeMkC80SqZFhI(l"2Fl33UU$
`+RCCr41FK`KJqm0JMQhkK1P44',hZBYeUhq3!!21jANj1$hU'X8b+a!0h3IL4"F
G1"$B-D$[)1#L&CQaEJ2jC@PjS1i"Q*Gpl63-B"U`ZAZ%J-L$"'KGEFk$F9JKQi4
pE8[2JC4pXGY805A35d!5QHmXL*kDEXAPF#PY6faL1B[&jQA8kGJ0m'@D&'JI&8#
&0h6C,iD,R6%KM,&U"jDkC-6rm*[(9@#JDK+)XK98V%*J&3GG'KZRP(f-"91+$5F
h2i&K*0)V"dQXBNK6&eiZm4iiGFC'"%[cDMDXa#(M$c[V*[BC5)P0R!%@EY5+UhQ
1H`PBf3M6!YA0L*iUZ,6N)Xa0RCDZUGFF9F0*D5MS$8MeQEQb,f0MT2ADddNbrH[
,)&0"`i$SH@lHQ'JYE#[TX)'e*P`aiHG!FkZMLi#h[JcI*JP1ml8hD`X0hEG2CAQ
lD31eRBCZC@@-M3FM!2QXJ9iM!b*i81"S,"q-F*1bqbd!!E$dr[DHM[lfN!"jq$S
6)6%"#dKDMN%-0hZ,VBcm-([,@$8br3SDG"L*('9j%XNFY4NA-J!bc+!APPCeR"*
"+%iUX2%-[*JPLVh8d@6Sq0kaVSTd"cKm+QfZD*V0@lQ5M`*SfF9J'!`F`hXXhkD
VB#PP9@p`F[(pqXZ#YE6TeM3JmV*GqA3Cb$f'4*3IjUIA1iY#aaqIHB0r,aUk9[5
2,IR!1iM!3"$djNfX-#i@V&3C0UTFmJ%+4Q3"YV)D``iqKaGG6IM%ZeBkqpq2Dd%
H,N6LF"(B-SAXHmGZm!qVmSJ%`aaR!,5qk"["0Li%Ia8Q6LTfdIQNB0il(aa0NM$
J96miU[J&!JB[%-RMk&H4phhqr'1AN!$*pVr[Hb0+J-XpHEhVqJi%hJT&aZ[J450
p"bMEkcX`HY-0'@DrjGY&6)#k,JjMaRfH9bpkAk9@`83ZFKiENZI0c!MS'iIL58T
%d'"+1,`cJJ2VqJlN&#f,(NV+`pZ2q20246iDB-B25,$KR6Sr$PJbVf$H'lF3Dlh
VPXcVr92%*Up3S3#c6!3J'@FZQ@HZV,LQBfJMrXN2VJfD+kIqJ)T&HSQ'2#X"JiI
#Kd6$q(-Bd&kjYh,US[D[4YG0rF(P35bqNpLEZT!!$UM+GhH+`6d%[,jIMbD9Q&!
`,c$!B"!P)U)3ah(*mL-h8-,k1P-[f-8f$GHCD"[jFXJPVN6ibN(CE,NSQY1i18X
fMeVheVCre3jK,(N0!ZNXQ(Gfh5L#KB$+jfVE+lXZJfK`!XZl"UmG!*i(#ZBeV![
Cfi'@4'kXcL$KlaJ1CC,jGPX*G3YHU4fJEMPPSLBpi$,0k1TcC'ER9Sj&qQ!`'1l
8-`rkbDal8cF*$41ERj'fh+8Z!B'L4K5c`J1GUNBKqrQXVUB[CY&@dGa+TISF-a!
"-V%&c4[ZSqNRm'jM*J8d(J1"VdaXd'$1UmSR3q-YRd1NCFK!Ab0[1DCm0RRiPYH
UmSf(9Dke[K4@mF)[N!"K(YZN4jCLNPY("hBS+E6G6fZS`b36r$5r655P#,ElrA%
CI!$f9I*kk`kIQm5+c1%VC&H9P%cJ,-2Q'`Pk-HrAAG4Xp+,*#Cc&9G)J'Jbbc&F
)Z&L`4dlk5&L@$bNVH1iT+[LAG#%E'[2R`j3kJKmXIAmM!RVKMR9p9CHR8(B'eQ,
@(H'BTAr"UqjZCJ3J9AJ&XElJ9I)+&I!+Sa"'4eh&$ILCT`ND)UKF-KN(0(J2300
&0#N%AU4Q-1#i6Ymqie+&U+ZS)(9[5cLZB1%X@4BXR("+#YPpTU0ZiQFGG8dr51F
)3Xmb&XM&#`4bT@$Hj[[mqCb3!1c@!VpFFI#VTPXkkTBX`%mAKJBJL&[pq8$k&lh
C+T`CG$Q,#ZB9[)ZXmJ[H4T)8hbbBpbmE3&)%3G8aE$$8C3!kP#`[6FEbAJV$Q-C
8QTJN%pZqbk%8'MZ,5q1eb#JM+Z+cmL60Cm'N91f19iFE3Nl2a@aaX5d8SBYPTFQ
r`-!%,REc*)e-iHPL%PQeYAr""-(FNB*jkaCGcTHLik#H)!fY!85cBDpe12lD1b2
1)EAdLB%4-bB!TAql+'bLD$BNGkiEAlS4"+@#9a#T!E+e5SkBhE(%!hI#[3fkTVP
MQ@1@+K$!q`jZ8(%i+1Tkq3U!N!#i``@lYZ[#&LY!YNVpC8V1a2NSjm[NX!QG1dH
qDN-R$VJjbh+@Vm3a')8ZQL0SMQ'58('mM$JD9$cC8@Nc053l!Q-2M+RG[&PKUN&
&lK`*aakJ6911iBhfq'XRC2Fk8d0m$k)irZ)J-X4frBe[)&*hp194CE-fa"prTlL
l)6N9DlM@!A+-c`E'Eh[J$#LkGldm($HT3ZY`BNAYCKaGL1Y$PM$)h(ekrZ&K@j8
U$UAQZ(eYKmq!b&%fClG[hj0Re)[+qH59(B'GMkLX8"+[BbqI8@@U%+Ki90mj!U2
`64YZcbkiKp##SRTP0#"0afGb4'!K6$`G)1S#A8B'hH@)eQYd$Yhq'%`p(3[@K'2
@0H&ZpiVH#UArI"BL0fPBP-d@6'5bi(qeB"D'"pcV6YIRR!15Z'Y2(MZ$bI&chcp
h'T0")U9MXX`AHJA'#HVCrheFTmQUGdiFab5jlf42p6ZB@'TVD8$bH-l*@TS-9Q0
'%bAq!A'QM5#)3a((@I8+R+"e1ml'6`1mM`6'h$&6Jq1hPbNbh`eL9N2b48bTf1F
J3mH+3)`N1m)0)Y!1k2P,J0+rrVEc@h9QaeK4FEM--EDa1'c#Tb&FL+B'Q'`SGb'
1YB@!$U%%S5ff8M+J+l0NXUq04IPHiX-"MNCAR`hkBVLLh$%fAk5)qUXN-ULb%A0
hF9Je69qJI#XHriDH`XX&M-bahC'de(8`@@Ed+!Y#Ma5K"m#kh4LH,9'aYSb@j[M
83B#6!jp%E54c6$,Bj$Bb4XP4[5'CqQ`36UeHKBFXDhe9,m+`rAFFM3d[jd!%*F4
J+MD2QEjTlB#M[8*mBZ()8d0ZdrL3!0XKZjm2)C*lb!CfLS!@E-ELB#Fi9`&YJ6"
`1J-$#Q8MK-N!`MafY6[Z[eS1H*)'k)H*(&!-j()mqCKUXja4K`!@eeQ6[XKih"d
I6q"k0ldHDB8KdLFMG)5080UHae[B9$FI9$Eq*BB@dT!!bkrb!-Q#!bcF5+mBI9Y
99VT$LJe$kLiB8UL+HH!KCVPZI,2d!L2N"8KB%85jTK$*X!kH!Xi`)1#LZLJLBFB
J3*-lBPUPNXLS+L`Q-GcIr"1)0c)bL!`Za9&cm+!#T(bBM$UDafR*PK[eS[!)43F
kLf')RJUA,4JlJ8`hFc3F-aAINqGHB6)&aXEV0-m)KKGf**MiH5X5k3[RG$BUN!!
L($$$Rm[11K"Pib5"-NR#%&J,FDR3ILX)!3llh(iL"r6a"L65EM(8aN1c1a)B9QC
IM@(GpXriiS0)#Mrl-9hq-CYIM10bGQJI%4hS@"cr0"pEl$R@G2FfQf1lSke3j+N
YC"khQSLU)%PmaQ,JlAJ,q(fILmd*jCE`66iLNcM)`"F,*X,'CrcU,MJML1#3!(d
JX"@,BlS0$(Fb`bBq`N(%%5`fTLd@)[k-@5ccX#JGT'9[S8ZVqG*RI+5AZHXZ&20
fKSrHVH'@#iB[C(,2A!VJ8(b1fq-jmc8%iNA1C@(G`S(!b"6D,4B*-Mh-#FN*8"H
6f'R4Up*Gp(SL!L#Dc3BLAL()S0fD%cV(@%c90P*QpFX"kA#VGCpd3M@e4cVFBV*
R'NK[GaC4P-FqCa'K,Ccb,,TL0liL4iG)N!"qePMNFa"KJVT6XaZ,B&D8F[6Drak
Nk5QlT!1hG@6N#),+E4MF`i2ADC%R-K,+(XHV&fNi(B#KUp!!4[3lahGe`&%E(GJ
mI`J%i1Eh'iXFA5LAi[E&[NkqJZf%mi)&$8AZ3Ud4l&3eJ"eI["(%am-rYEQG-9U
+"0F-AR!pQF@`8`cTI-38*+c5)'&p*)99B4E#FNL"Y(k%K%bH*KiNreNiI@Z-`UN
i!pCllErbGAX'-L$IYi'%jMXD,+bTlEMX5dpB%qr$Ueb[X+CL!jm0K0a2YbqHU@Z
$a91a2eJmdN'0&edj@f3b8m@l-0j)%GJi1A6`f,QH(%@QLa9cb$%G"0F0J,IX0$N
CEL-(`jCPPNG4I#YeZh9Qqh#B50(plF-8fB'NaPa%04pdJH(bVST9E9d9kdmRV9f
+#(YVVH3m'-R5LMNbBL6CC&Aqr("!@lTiKF4,-SF6h+D`Sa`HSDh,[[KddZdC#,+
"fq`A3meLk!($8&Hk3rH)S6E[8*K`"E!NKf8CQ#Zf2)V,hCJ@PQr)f&'9dEE"heZ
9F6TT5NKRJ,)S!6MH4@3#!%L&BJT$(!LNh0&&eq5,ikI1R43[#Ud8cCI#a`((LNP
YSr2j5!)1SeMDQ9'2+)JiLU1B"3*e0dU"`PNpNCMQG6kV&rQkCD-NP*5C!'UBC"-
'l0H,k#)Rh!pQI*m0f6cNIJkLBQh`YkVd)Xp&(%R"$d-fEp3!Ha-pFlq*R'TT*+4
U-N3``aJ#6DFf$DZfc&r0cjM#8@S3V,U'Jl'6XLqp4F8`kF3%KK$ZcT!!D8B8a0N
dMIaA1jm68`E(QSjL&`%'b2+'9A(RJ3J4FNmGKj!!$kJkAIN#cMJC#a#TF&NdF+6
lb(#b22FI[K0ifqebEQj,2I#Hh6kSpKef8E#NUC2eK6`jHL)@13aRNLV`GQ!c`)3
E"DPa)3'GQ4EDY2*TBUABkBPdL4#!3PP[-4P$4J)@ZNLU#"C%fEaMa"R2Y-$XXCM
!0VciTRKKNbpmUd**PbGUbY6IrS)@N@%*G`cj6P8IPjllerGE5iLF&,DPkXKBjY,
9HFR0#Nj0fIXp[V0hPhRddSk"R3@E"r*c0qm)X!NaEh+bqZ`jXFR5l@hbU0KN0(I
RD1E[4JY'Rp'fSH9C+&N[*fPL%Z2*'ERmN!##NJUEH&8SAK@)"Mp&r42T'Y(MCa3
5d`miTEQ"FSbZ8XZ3!*3T$kAT2k*NSr0a+Yj%8JE&hq$1hN"QaQJJ3kPpaEdjp5G
lk[9MTbTpCm1[j*cXJF@dI[,FIQ+cU@-hPX[C8Z`3%33[AZ@1@jjalUD)DH@SJj!
!#DKlNcI-pr25AU1L%LBT&5-c$Lk&L@i&3!k)bRk$"(1f)*PUEi'(UX63%SU`f43
P!M4Y+,HEF!RLfVajCb$6[k1A-crlP)lGf,B`D0Xj[1d'1Zib4@mmbd"G+fmp3GY
k8j([%`&3cD(*NmMZ94a"&E'hA-SE3D6%D'J"M0J[A4e&XZ"LdZdNdpkQI9KXZ9`
kHA0Xq6C&'S3FV3p[+VU8&kfc[`hca'3iIM'jj4R9AFIJ`+epP*@r0C!![`X)Xc0
h"l1qa2c(h3bDDXcVdSZC3+6mN`U%VT9"a'aAD-+f&`+TrREcEY0ZApf9*&dKe*!
!JcE'j+#QfdPXTBJ8#5AE*iA[Y8kL+amr3d@ZQLdB3T%l*E0hY%$$AhD3!-k)8dJ
,+j,'$L*k`c65Ab*"+,N8H)!!)Ap[IX(!cQFm5lVGr-FNQFqR5&4pld*8HcU'+'r
UJ$PC[BmflA#BUa85DL3ZY`YNd6L4XUJBA,FB39*Q#D03l*2$m!+QC5Y#QiSJ5NI
Z6de4BU%+D2SDRHj(R*5"II[RL&ENimRak8A&ASmFFRH$#1)RciG!ZFVk*VrBBph
m[DZ4[1UdEVjdM68H,Lah[2&hma26iM@([8%Abq$8e@4$BM3[LHB8E*J+DCKP3"[
iaF!R20$bS60fG4p-KRUS5*KB@&G%cSqYEk*![F%bB%R$`,cZ0,P9f-Q"fZfpJJ9
rMQZhl#Z5M@3Je`YcBIe(cXHad6@Q0%TLiX!'X'!+(q4JAi)!Rd`"AUGmZYa5'*V
3CU[h&I%fkf!QL'hN&Vb!%AL9pIE2i9AJD)E%K%([)RX!iSh-)-3lQM5Pq@*e-)#
Fq!Q@B',Nk*BE&`l@&E&Shk4)P4Y"S1TrKK43Q"B,*!(`Z`C)mXb1JKf"dGbDZ%,
"Y3,)8U`jT,qSV)H8AiVH0l3PdlkLrad#R4J3@`'3!'Pq(5)Mp&cri!K8,fKCecH
*d*4Q1D4LNT&[5NC-+$#L@SDfPM)Jj"Bl"mlAB%&aBJ@CS6-856mcA)E,QhF-M1l
+cD"V"D1r`p@bcTf92I8jPI8pZKp)ACp6AhQXrKa[D#*J2*S*%dlmf0`QLVk&)`6
(&L+NfG`45k8hQ6("[b2`ZicmJ8bD'"JLC)9Ki9@8kB(SSVbChpZpjKfpMq`Xb0b
j@ASh',dP9*E-k&-@3[A#$EMq4Pj1I!&0VZj*IKClijTViTb"+IFK'X)(C!Q2$[2
EZkSj+&05K(#`)i1m(S,X4RD4jrAdE`rN"hThH"Q3!!X15m3!J&(i&$+*3X&dSDD
-iIA!MY`GSjP"&c[)+@b+J[a5(KH)$QZe+JL6N9Y"mfS,1JK8[kY%@hKZ2MBBb2I
[+1#&,cErm9T#'pXq-#"4je+H0Hd0bUJP#U9-L)lfa5rqJVdHLK3fRi-C(E+93L4
LdZ"Tr-iL5N!Xq@5S#+$Bqp),KAl9$N(Nr'M"QlaGT5R0%k!TYpXb!$'q',aG"aF
8mP-`ErR4KL,MD`!"THNG2h'k22lhXih(Jeh(A`fSJQrZ3"&q5+8jGdI'l0H(Bhm
a&Sk,J$Q*J)'b#p0b6F"8B&Yf2,1c3(UV#Ji1C0N6fkR)eiU0TLNIPpLR8V'SSG0
NA0a4X*Q[0C(6*rD-PVUQaBFHJ,&CP-$%N!"GMiD8Di`h,CE&AG1IX(PfAG%EHH4
3c!UJJl0)bCk2-d3BX(&f5ijh%,R@Y*K!6FXBN@R-H4e+,b,5fj`k(S`$hlMD1[P
lea$BI5NS#dE323AK),&%4b%#S+"jM9GBH$dCM%(`!6mGdUUl5Vb[GBI2`a)+P3m
lB*kmhP4D&)Ud6cSPAah(Udekf[NS&TY"aHl)8QBLcrSSXcqbiG(U&!mpiBiIHN$
[V)Tf5)1fQ,D%MC(Q0ESM(#%&,d*)G55J[TXKr-8i)&)(3`B%@4Db*#eVl%6"beP
M"K9J5[2+SZ"%3P3[qZ9)hD$VajE`TLrLZPKZ'4r!jRR-"#)-EEkk)XHEY%KICdF
RA34"Xdd#KhVdSX,"a9UKLB0"*&VU2GJm#J-5N486)-,(Ab6"3IJ-MUhN)2KF(La
!R9mM+dE@$l4bi,#cHk*C44Lf,jJjU8J(8@DIe0(V26biP*dpVj4-'TH')6S2HEl
Q%X8faA9&(BkLQ)QZILABU@0@,TE5!I'k0*f#l8d10TM-DU)3!TMY&B!'YKJP))f
K@I`NZ!b6+@m$4I3%STY8"aYK%NMV49[UhV0@%b`9%krhj[[2JfDjXq#Cr&dC(T'
5KqU%mCE*mSaq*i%*2TIe8FT@I,Ted[GS8Ya"!"H-`rjdHJ3+Z,jhC!'rB24raKG
`lIM4cm@!5iH+5)"J-HCPKB1kV2f-LPqLlIH-Q%PYcS,(2U(0U6K`($5CVpj`K$H
0E"Ub2i0YNE#A@c&*e%8'fF&EbXCC%i!#5aL3!%"8#M+3!(ZT)a-85@UihYX3TiC
jhSB%0E4i'b,8X*ShKpSS1%0EXQc#dL0-0)YZi8!U0J65flX+r+1pMq`Sb!LFei4
j,3R64%5KG)5C(5c-9D9#Q0P"`YbX#A19V93+-e9$Q+RY#M0&`T`A,-`"Z4%R)Li
8T@JmT'kEd"%M-3+p"VcSj4fmK3(ciZ9H`(c#`'KQ"RbUN!##9YL6',MSY""DMCN
HX)afGbiBUac@1NY(K`$dAdbLSE2pQGS!R+#0Q9jf`bc6@B4)NT2e5K9LmRrJj$!
@!Eba+FT$$S5f-m4Ce&j#a3qF!6lMrPaZr6eCE"1JPDGjJpGfCS+SXJ2&I(l"T9%
"NU1S6U5%fJX(C5mFH1A@Y4aiHj!!mG1NM!-2@I3YP44i#bDAH)[bBXTX1MKK3m3
LC+jcC-BK[(HH&h9HNpREldEpAX%eDHM$bMG3[294`Q$N6XiXLM[Z40(44q),,TS
%Spf#84Z+U6i$H&&Y'6LUQ,%d8GLqD#haA@)`E!`49@8EaVj(bB)'DNSK)Dqqj%,
543481T*H#)p9hSdPik8%iJDbF0f9aZJ$ch*[e,e'*$%+V32""Df[8f5BV$a2*X2
VLU4B2-J%XIaIL%A)C1H16#mFLq"CL53mE@+#Sm8-ME5*52E6!,CeqDU$$2%mbF!
dC1R8K1ceB4c9k8RF1U6iFC!!pi68lYr"mFhCbM!G*4!"@D`V5N55Bk(+(TR"ckf
'm'Ja3j3Y5d!Up'4VUH[(eV8q&-"4&3@K%!-i-fEM'K#4@N[VS0),@h@'8UfPK"+
(&'dZ`Ap6RS'Fd5[)'4T#bN3ZEB@NN!$F5S**hUfi@)ReFk+63'""b1Me%$+d!YY
"M'1IC5Ldpea3D-0i5FrS5!N3V!)X&fS,3A+hQ)T(&&LG%'H4JAP2`B)M"Hp'%-'
kPTa4%3"JGpB9Z@h5kk`,86&*@r9lNXS#c*0FD`Q-3LLN41$5Y-1N*I#aL"JRbNX
TQHq@`)E"Z2&IEJP1rJ13!%JR5FF(G1-!&ar3h@&#C!(p&"S1XUNpiU!bpakCT+`
j$'$d!4VJ68VqkmlHED3NaE%1(*[&acSk6"j%5BLM61jZ54#6frmqQaSe-B--Pdl
kF,XEhlQ0MEZ-'`2BZ#$Y+,DeHEDeXC!!8N`'542E&STYE8@mlDp0e+L"qd!+!Hf
,cBSp!LpQ&Vd!P0cBT'*Lib`Km1+D`h")%`h`!UK[NF!&I#S1kX4"EAa3*apN2-5
KfX3KaHiD`+!mi0qHTTG"J'K01'cV$YUhrB0@IK"md+ZHKAM"2C(-AKSZjQ051)D
b!T[BfZ%Ze**35aC3Jr4)NhEfFQT*E'$bH#06Kj&&425,M6U&0c+`9r%D[I"QQDr
[l!h+-EG+"&RE&m%2#i0&X*B2Z5$hhlV$1VGrf')pq,$A@GcHmPFiSA&#TBD$M2d
TJAPD$DZMLS$S8kHcN!$3G-682jp)`E&iEb$EA3@5IBbM-QBG,iHT4T`!YZ[fGdE
Kd-0"6XScXM0kMpVGcX#83(E'faQpEKU@i''G2+a31MfrP(f*"UCSi+@h,rA5J5*
LB`TP6AUf-mhVH*!!f0cM($+`1D`3L4+"fVZB0"#[9UQRpS&G8eU%$BZCbAmqJC'
DXbY3p!U6@FR5C%0b)*Q42*%-*5mQ*b4A*eZ6(b6R*kFRCbIA*I[LYRKa[$aq)'k
*qq1Ia+[M4q1$m3IM6m8Aa22Ldq1ciq[LI3PE)LY4QQK)$#3b%Vj%6f*DBQeL6U)
pF8eL9Q*ZBQ8N(M&&4L)()J14M)J[dK1C&PNDH6EbEQ4HC&(N[XLUb)Ud90Uq0&G
DBjSjl9,DmE5FY'MDDfP2Th@PjD906lXjE88X&5Z,Z@+0XFfa5l%cXD1a#E&RBqf
aDf+cBR0M+hI(GRIZ(YRYh,eTGqlZ&hHIfAekGrEZCE[(GbrBREIlUYfhlEjppiT
82&@BfTFU6ae-E8TC8jG5*cVle0rK*c[M*EIDl42G5GbY%YdhZ@X9hEHi1b5kMh1
h6R3Ij+iZZNpcYeYdImRGL1L18cHf3R6RF(H9k$l&hAY&p`RZ,K6GIqIZ$D,l)AI
E4EHCZh0%Yj@lDd@hKEZ64IFplJk,lNcZIL@klh,hXZKfFEG!G0rRlTMSIXVGJk,
l@qkfLHi#lTD*lQIF6BRZ"p40Ua$Grm(GpD)lMlZhLZirFAH@k2irlPiMZKZiqaQ
QFr%6*D&HSLB5!!eUj`&V4CG&R$CCG&QSDF1Lbf*-qmU`e4cHUNS-N!!-D`M`Bqi
1LCFXS,3kdH8J502&9YQHV3V&!"C%QK*G$U,)%M(m,@d*NGRLU-NmB,VSVZ(ZI$&
m%$r2m[!&BMX1MXK6KZfHiJ(,$%hrcNe4FB@4+C)MZK`3NH1'!kEam)#KkA&Z'M-
d[FT0*)#r*q(a*VTK`(Xm3"-!Sf&%%`!(GS)%F*8Q[-60BVQIFrFqdIf#Zi[%aAr
NlMc4CBq9H&Gd'Ad6caTB@%dX*#CJqJ2m,1-"&`e#'H3"eBBVNlRT4E%PHjC%VZJ
b%LBf'C!!jA-HINJ-B)qGf#-BCi%N6+,l%RIMS[YrU4YILHPh0-ELYiMZSpbGB6M
Q86SQrJ0$deTZ-RU!TlPTMU(T2lKTUD&T$6GG0$6p*cG9#lEq&arpL4M`VrLC`J0
ba3!@IRb6B*3$*Zi8`im3d[0`%X#r%2TV5"eh')lm*fT+9KLDjR(6+R'0![-)0pe
RD'*d6-ihA2XP0fNHJ&P22Q8B`%'IA'CSBLq6M"UDfVQT8La['QrL&YdTh!f)lK(
ZEKEGYlRE+,U$h(@*lZ[Fh5HkVh(A)EU[8PFeLHi%lLiAA3jfCSfkDlPl[a$"%b4
mBPCT'5#MM2T-G&Gcph24r60heiMZIh)AUR$8I*&4A-(NIiSX*L3k9&`G&m+NM,j
+[+#-*eGdD+XadD%M$iJ,K!JZmH)rd-N5(@,%*$T8M%Bk[a0i+I#f%85T99pc-fJ
$93P')hMKb$VP*)IbdN`NlP14Lq6NNS'CDlMaVK2)Y$a1b,0J5C14U%`m&AP4rL9
Zi%PjK%`j5e@5Vilce5)SiT[KZIU"HPDCP9pG"5fK9kP,UNHG8408LhS+h42U'MK
01)VT9DT56BC$p89U!cV,9$XhAUA@P!fTAj+3!$'CJmNd6*j`(mAR+AF22Tql+r&
TGCr"TpPp!Trhh*IaHGGp#Cp2hAjm2R0EmINIlXhir$rh*R`fZ"[`bA-Ia1GUpb&
mVR'Air1hEKfI4Hjpq&c[lX5Rcef)cf*h#TqIZ'&CEB*6dE3F`k)Pk,IaK)Ul2+$
IjmPC!2(HaC)(BDUp0(QE@T1m2RPIFQ9bER*9FPemMaU2aj)9FAJbe4VINe`+)0!
4leEYm6hS4P@HqJ+LQ+&QUGR*0@U9@Ub@!ja-*BZKjdK2ZM$)Q4`$B'P19LApb5q
5imNc56F!c'(Hi!B`#k2[j'T-MT!!4m9N'LBN42)b*-4X6%L-Nc$*`@3b*PpKmLB
Q*-C"6&l%j#hbU*K-`B6%q$BQ&NbJeM#j(j2A-5%a[SC*+5D[BM+#b9,bU*JmMNN
h*XX`X@(b+#Ca60BL-#X`qEqB,-(N36**`q4IbD0LXJD6Hc'"QNme(C29Q&b2bCr
*Sf,b0#Ec-2N26"CJmL`Q,CMm'*-jQ(b)#3QJ#a-5`2X#L@i35252M%6rNj&S)52
4If-NZSq4D!BMd4mBL@jK*2SM)p%U4U)r-4,GcNMdhaQ*eM-5hF4)Y)k4k&mBLAl
25,5%NHMAM%3V054+e%NNB[6je"Fc$DPrNmEUL8i$HLd,&j*+"Him&!BK!*YFa4[
q2@ri)fh$q+f'$CIaK[2PK[(jKJdRKdH`SCNl0h+R$6rPq+R$$jacKA@h%aZ[i#9
pMCId3ej5"5pT+LpT)V23a#cB25aF0V$3c#cm&m'#aI!UbUrq5Eabm@I%N!!C`G!
`ELSMpB)*ETJ,KeAM8+'0$Alb0Qm8Ka1c"#dKqLJF1*GQ8U8STHITdjMTr@6XSNp
aT[GMTLDeP$Y1qUJ*G%h0I5c+JqXHLr,,P2b`N!#Z*h9d0%hX#4rRb@`dCI2&Tq3
&PBhV`eS(Vh)ILrj&0*c$'rcAm'QH&)IVm'Sr"QfLKV[q3%D9C*B+%Bi,C2jhJF`
Y!TPR#Q4Z&mLm3#$cE`8bIb#3!2Pr-6*r`FJmMj(jlaLC[m2)r!0'jQm`-XpLC,k
(NANk)r22'CR[Cf6q&52c2h$3hmY"IaX(rArPS*r036qAJrjR(23hLk!ri3QXIr(
jD`D9ib@PhTd@2X36U%kKb42r',E4C-iiSY#,XG9bh[`A[2QY[2P2aHBa9U0N9(6
5a`lUq`6KJ946l'&P(`kI3aK,NB-)TeICa-6*QYU%rUpJ6VpQbeF`V5FRqh0dkjc
GM44YI"[8(@hHAkU!U(#Z[SQ0Z+2FU@26b#JFqkq"X[@RSHS6jZ-6*m1!l(05I"e
ApKCfN!#rJ,S4aDEbNmIM['dfL"Q9jVe0FGr41pi!ap8e4FKaim698,eB0h&1aT'
Hkrl3c)lb2GZ')e"98!H(Nj1PGc([$8G1AqAHpe$Pa#lPP-ER%cpJTVXQ,L!K8Z(
[8Fa3d@%Ecd)dAX95Q,A#fDL[XK`#["@4#Ch5R*JFP)1!mR%V&+1j5FPpkYp(fXc
Z&%erLDPZ05V0%1CRVAKKJm0UNqAE6#L#BepfD'8c$MIrX6$9L8!MJpV`L4'Ka#)
,*CmldMfI&2,"D9&Lj,TVSVlPa6&h,(25!pP9+P580mQh%LqG-$'0kj'I$!j'pBK
jc$+'b8lAcKppjlF,MhIUmi2r2PeB[ai%lj!!YQapk*4"K4M-pb[-HA"J"U-bUM*
(8pAPA4J-El2$"f"UQphm%XacXr&c"6p`I0rFaXS)8P*P3h1@YArQpGLUYRf$ILC
TJk+jQHe`9)5VJkdr`T9"0'`)mi"a-[6GJ&G3lpfr!'TDqLcplDq(9&@q3D6p'-*
#l9p"al1*lckYZJ[DKThCh2mN1EQC3BB"AY8iLjfX--*8E5DQ`SHXrHh[qmV*F@(
lql[)E$K+$JqKZ+2bH$dlMUjYIaq1"EYEcMQ,2#Tj+QQVVbeQTq01hUL80J*"X2q
1Yb%'BA"k'cZd@-b1,[VF1MQ0*j96&%R%N8Nc&aI6d!#'FR8$(j*clLLFlN+TRRI
JFJc8bFQUakRSc-8ZU3$!pbkcYNNbe(b#SPE)-5aI-MJZeEEcAZ@JLF+BX+QjAK0
V4m)Mf)8Xf&RpCp6p@-!C03-EZ03-r0b2ReRi@HJ9p#Q6['KI6"GK4$1,f4UJCN6
chQE1fkLdDi+jiNBbf*8$EYA)Mb5%X)NC5c3ISpH(Hp@Y(T9Z0dX'b32HdkVQ3qK
2YTjJY#[ZVleKf(lcPYSEVV$brGYEpP%9B#eI`SN,)iZe95fU,4iaPcq[&Mf)bpD
ADU8b%MJhZ0k(J)(4dBhlS)U4[2hbjPGjfaK[pH8f'&K8Ji',c-#dZmr!0fk4$*K
@h`%$keQeNb4!plF[`mpV3,VAb*%c(3,Ma)@Na0Xcb"[ikl9"@a@J$4F'+(X`FDJ
Ki$1qQ`'061%er#cc+NEb%Y2YF6K[hb"I0+e(P#i("5+*Rj)$RTp1T'kS%ESNKGL
dT(NTI63cC1RJi'rpTL+3!-'9ZU9'i'8hV8IJ$6BY*l--#VbQp5eINKH9faCfS8U
XTJGK3JceFcq(HSab8VHNX8!4YY05pYQYrk1K+(b'$2q&`SV,Zr,KF'1+fGmkSD'
)R@RcKGB*cL)5"+Y@DAK`-iS8[-TdUDI5(e3j@fkM[F4bLrhjJM8I,9KlC8#F*B3
iQL%r'E"P+6(XZ"5CDjbL%,"&Qa$C1KECZQ#4r@#2%0PdLSjZ*E8QfDhRDSM[YDC
9%0qbT[9NU-cL@q84(iki+`5Ph"80D5c%(4SEY-4C%'Q!R*!!0HeAUp&Ch@Zi9Z8
0J,[UIL'91#jZGKQD'pQB[3Q!",pXI8*F$4L%FP`+K4cGXf$@YAa*KPC8eCLQ'%Z
)K`!QA)*TZ4iDJj%$1J"Di+`HbZGM0ek"$3KPi($'j&ML&4QTrkJTY2Qh3c')&0Q
kEBKX,BYX$BYX53f4d4'EdK'C[Pf4dE9bd8&QFQII"5*$Xb15MXMSUQi3Q9j$C%Y
BC1Z-)P1-6-)Kl-+(cb"a(M%8cGN`SUd-lf1Ji8[q&0'RB0kh#iY8FjBl*KX*G0f
'J&EEPd0!cl,*a3V16*Hhm&Dd2E+AiZCK#@l`J#m"C%fR9f$Ie%aUM2TDchN8H3+
-NmFlZS6AM*!!@P4cP$1HX@5Ff4P"*Q2KkF1D%N%@N@$35UDmV0kK[3Z'b[hYA6,
Vii)hQjD#SMp146r-GpMXPbXVT1EGe1`Zpc5NZ+(-`l$,EI0fU*!!pM![Lp&#"")
-N@h2NUUkq'NK-#Jc&5qk)DTU91,5Id-e-YMq'd,Na+L$c"(R%K$!*KJQjFhqEqI
XIjf@rAZbmcfR+R%mP%cBjj*b,N4liSSK1lmA3de'-%5!-#Nj[%-khlXGcG0V$Ud
"p0",&`b&2r4H-`!Qqc8fDM$!KfNAdYdbKD6&BJXj1+8Lpd`bMS6PKLeA#R6l#[k
Xj-m5##qRTC0%f2T,0LL9"`@,`e30i5DYlKHPYdK'j"@K(V0CBd#+R8'ZkF%JPa#
CSN`&kKCL5I8F2KK1"mmKmE$RkR`1`AG$L+VJ#B`p0kB0)'8cNNAMXGcda2DC"[P
Smfr-AXM!(RY*I2Dd(Y1m[9HeX%R9ZKJp4d3&Mc2E(k`[)q3%LMYDcXRQbp'pBqd
2HT)p`k3q8&0`DFmMiU[HhliDe5+NN!!3ba0EGGRckP8L4Yfp*HfVq4LAjjKRkeA
mpR32!YNV2UZQpiLY0!U`%3+K+Kf$[!Q$bL63jmiNe3h9*&lf++[BSka2ak1!&+*
j+e&Kf#S$8"65UMT)ea[GIiIHL$G%mm+YmNBUH8JlF"XHKMG-rl*D,MaKM898+h@
9c$#5KFD!JCD1"HIc@fH3!,UeeU22p3Tdr6m5`%YfcaV,@6kpGrVBFk0iKH$QcCN
jCe)JiX),%*&%SQU)C$ie5T58bdVDq+J912Mlq2Q4GU3j,a#&iQ8S&eHT`k2*EQ,
e%mlDRaa,&NUP3QUHPM&Sl"L53eU`1@$m[jb5D[D9r&*kS)4JHri&E#m-CK'S&3*
$bJ$LGSE($[HLhQFcCd9l121jK6mhmfFZYVQYjCZ88B[XD)iRiiVabmiJYDkb)#,
eac'CK4Q9a8U3!#Kbe*Z8fjUNahqTPS""a'*3R,d!"I#iI6D+PDG3h9VY$CrEld@
RaAiV*G*CK8RR,rIX0EG[!*'*Zrr1A8lbiJ$m,-,23[c-`Xrpq)(D1B$**Rb1idH
(Yia`m6e#$YA9Y1B08+Q2k`qENcCpTq9-XY[5QLaN)S+9b!mJJMU)h)$XS)A3$j0
"*LkS4$GYN8bMC,2GhR`&Vl,j5U'Al)"XB6f@-FCU$rXSqi)M5VX[*-dVpa#JPih
%#9!**XePP#e39CEQ2&4G9!%eeY'e4qC1ff+a0fhkiXi@5Pl6"3b&ZI-"&l**+-H
Q5R,09b-,@q!N,jDhp-M5D4jPi&hf"3$AqM,bGq9V@a`N4UlZ@6ppfS*SGCRf)SC
+IQJS5'#G%Q5Ka$NjpS0kc)mi'abLM&aQE2%X!AK-4q,JYfCr%5[G3kEN*dH+c4N
34C5'@-,1S85NjBbcL*hkNjRkE-i1iae$NB*),Mkj%93(mY'Yb%+r)+![E%&&([-
3T*ma%d0-#*Z&R`fN+J!+e%8c9mE@hriC0lp'(dR3bB,+1Qc4MLhDaH$Vm"UUX1a
Ii'H4Ci[VX-82d'RRjYGNT3l*"h(a#L165mdqI19['j)4rX31`r&V-TA"5532-Me
&#"@b`kQ['cmHa"Xa-e!kRl*$!&EhDeNmN@4S)dA)r,khQ&"A89%C'"-JS@*!Me4
PIb""ahM2YN&(H%S8B#bk1M4FB8*9#AXp,-&(`1k9jMF%F$eE*ViqDS0Ul'*Y8&J
1UY+@l3'$hlAR`HZefqH$P9XB$-k6B($cPjk%hLfLD53)H+f3!!JNLCMNp*A9KEr
Z8HTGic@")L*J@"8h%,"1A(SYR8X93NRh%UQN@mYdf&-H0B,eL-T)SE$p6#CN`hY
!VTJMP#TI*Lp+$DdrI3i*L4XqZjc[@IJ($2l2Za$mTdX#p)p*d*qfU!(bLd59TTk
CVK0k'Y5I-k*qdbF60kb-0-C,M$#"4EZf3MJ6a6AfIL!,XcS'N!$k!(`8Y[4!HB%
I`UU3!0kqA-N-CZP,`@VlTlqd-GRk+!P9$R4T!l0V$-c'`-G&SPfbY*c89QL9%!c
VPNc+rU8UAc@[F3-l19S1BGYDci'%[p)LQ9lC5L$)mYCc@kJ`@db9H909hMKfjDb
[9#GP-UJZ!)4r5NDHcfpjRXQi2PEXZeJ2!%e(Z$KUJI2Nc95K1Mc*A5hNK,e4G+r
PVNX2S-Vc-Yd2%Sp1VbaKHZ',@c+p5QbVi`fSDU2$eV+AM['YGND-+LL#*e6"Q)b
F1+e)h6a()Yf+#+A6q-P"0i#*AN)48Tmp"U8&!(jZTB04HIG(V9!M#U8A+VN3&C(
%2lf*LSeNRN"$SDUH(&2Zc'0(M51RNj5F5MjV',j-$SHKm[@me63AUD[2*ZFSY!8
TCda#aBBTXP0Q"RAK3NrR)f`3N!!9IT!!CqDTV'##R2-[j`SQm))UQ*!!LZli#"*
EUD*%E&rcSIe&T&i#eI&%II[1mi[Q,A!QYj`U,L1RTf88l1[)`dQ'e9b*pU()&e'
I%`EdP,hLd3#qGCR"&lRaUZD(,#Mmm'0"S)ke`JPQdb$869D'%VKf"YeTL!LbLF6
ZrqC%kQ,DJ&A`9h[8lGTm$Ib5`#Fi1QiqBhLeKb[XApRmSPj%6GrH"e8c,!Uj9"a
5KZ8HC19r+(Km"-bhk5@mM#`TG&36dN*1Ll3!@Mk0!XMNLDl4(6XV9-b9BDJ@D)*
-hP[r5UNRIqpVfj9298QpF!@)@5`lVc551L"lNbre3"m1aM#2+K'q&,D*JD3b880
%003k%3@%K,M5mC19VN%iKP81)F[2FTFC"[)JIVNQ@*@kCpY#3PIUjM`&%N#M*I"
e+SaLr%PC%'5@dL4qi[K*i#H#Rc5ET59'2i82%6VG$'F)b5-39LM1R`KrIRSeIIk
42[%@3$Ir,#G0GMQCD#I(#c89[&r)9Xmif#+&YPmTUK!r3Tl+fS)NH3cHa$6qX#I
DN5)+T&2X1%FBK8#iP%jfBT)8%YP0Pa(aCb2&J93PpLP@[H)Gb-*%C6ERG+(LCL8
lY"P@!j5T1BG-0V'&3a0VlD@UI!,)b6-B5-43e8m"fRdp,F5$"(&5GU-0DeVV-I-
"Q&HG3G93R#U`3K@h$mTJS!)#JJY[JZ1RY8JN32&AdeU+NQ4P'qh`(R(lr#d"H`Z
L(GG+&HQqlSH)0"kRS52@bfp"KAZG%95(JbHISI1DJCbpED5D0c&U'%J0HF%0631
'"X2&TT!!0c+B"2#15aE"j'(j--hC3h'(9,&1&h8DHXl2)ZlQS5DUJJe)%+&'QE9
iSihYV9"1k$,lm@Nc`cQa[C85$XfhLfM59NElqd1FN5YejqCk(qS$k#Ni@9X[(4@
C@"d2950L#AbCUH*I[J-[Q3$+4r#6p[9h9#iL[i"Uq1P%`-6$*dMj%rkq,C&aGdb
JJjA8[a2Dk)m`ZNQ%@H`F5MdNKVJN!V-M@lb)A5GIb1,0JpDpB6SDe8)j8Q+*3Bm
Y!29`TY$D"RViJ%I`H"43F)K2T1dPE+,)R$jq'@U"(r'E364p"!i$(2b#+Y2JD,S
'2'#&pP!#UdY+M[@8P"`qQ2RpfK1RUR02RAVRPG"QrkjMZkU9pa%A@&R4)dLUTF,
`J'f29&QjS)fd[!L!pa'!X9$5fR*HHkb&"dY+MPqik@Q23dL6"fL3!"AF@mDJNZd
4I31TH++)AMMB(),UcC2HbUZF#GmK9XD&aj1!TmAJfXD'Gpc&3N'AD!bp%$VQMM4
#P5FEdE(SSXmr8pq6qIec2I@eScR(cTcYU6r@mdT1I6T,PJYZJP1h,)qJi@5eXja
99IIh0UfNU[3G,e(AYdH)2J,5q%UZ9U(FRlpI3@e4"1VG2RGd%B00+hdTU1Fff5H
kbaaGa*jS5U)TXKq-XP!M[P+J$G#qD@8S#8H-Me5C1CTY-6Q,Tk+Uj89k2!dV+4'
`5LG$[V&G8[!4iB(SJ8+SfUJdcq!8Uh%SGTHGcfmMadAG(4%iZjiB8LhRpD+f+$Q
Jb1,#+lUhpe4P*H55F5Vhl)QFNcRI6`mI-Jl[U[ElMhQFi5R2`a``b!S40#(4)"G
1#Y2J&5qjc#12b'SY5F@fQaS$9&@"X9PlY*2S``LSJCb6iGVk5[DCkA%"+[&G"5G
2R`fc)L1`#q1F'Jd#,'Af3QZ49C!!ik$CF#!j,"6RI8!4jXJXPjHEA@CSVNTYMMi
Hh4a&390'cF3J&6J!(9-&5mPVSJTC*5i[34C25K8Gd[Y)96DV#dB[`Gf-F#bfHHF
S+V$+pfI!'@fQ8PRl`##@*V+Fc@G29Tm+jiH)hh1H+QZeaeNKaqCJ["0L*@9G@D'
e3l5!DqfdJ#X5I*Uk3LaJ&9@6M*r&3BYS%krk101%`hbUiU3MM5-NaC+'P$1f5FR
YqR3XD6H@e'DS[MF,#Jk`+2qZ$1Q@cQ($)[b[p!bFVDiA!XjLTVRD*@4$*13%-9N
T&1i&YLRNBU13!,e-NE,+r8,-8bH!UE3Yl$`jUd&cM[FU@1V0rjdr&kkU-k&d5h9
I#lDS9Z$UqTlkc*1RklF6q09bkiTj[hRJ9ka),r#*VFdl-rh3Ea,BiFmp,pRDI2C
Fk05jqN"pU2VldU%ZX88XKD"K&3aGPX5GLP,"d-SfFhN`3ph8l#+!T#BcG2%V`8a
+bmEI"#1jqD1EP@dh'-JpGI*iZJGr)MIiiB,Il1!I,UPjm&XiH&F"(qfi$NI[UUc
@$SFU5"-I$N,IqT!!L4N3#2,$JeT!A-"!*c9l'6!9i9%!eZ2"$GE6SiZ)kp99qI5
)+Kp,4U3k0c##-,J%9hkN%LZ`Ud"ehJL'-ZYc6Tq>rHNj@"9bSp"C!!([cS*'&
qF"+,mM`H55j9ZlVEhUMNijR3ik38c2Y`[1EMQAciQRJmNj43P-`+Nb2UB1*!dRa
0ql6+L%@jkl`28[,K*pS@fU1@I*JVY[!ml!b5&,bNec0b6SC'6jmm@hhb4(@p8%l
(931f[%J9PQE3Slp!)5BbhV8XTMj0+(4pV8%JSjG'GqD1@Mb10,A-'eN-1Dc2!S&
Z3pXJ+ME5eGMAbDM'pA95&9ckG9*SI!LIEP@(6kGbiP1Q$Rip3ahi1T4lU8Cm)UV
KkjPU2d#NZ"V#*i)((QN"f06#&63j#'LL`L&fVfkP5Q-pMr(6*i&m*1`253CS@2`
i`0NfHar-df*FXGl$dY6d&%bi3#,c9q8('kPj!3N`dFP-P$%6aIM%e$l,9bS,2hZ
SBX+PH)dU"dHSbX1PQCMU-(NFi`VL1T&m([Q$Q9qA+TfR1K)@%9mP!fX4&+`k*Te
DT398"41#ZJa+XcpZK'VMp)FKDX8cL!%kE&Q1JDM'SHalU&*+*kI)hhV[BjiNhr[
B4)QCP$Jd*EE,fZkK&`a,jp!8$NeYpe#(105a9BFkYZ*3"`jeE2G3NcM8a*89hY'
K&`a,je!6$M9Yqe![+1fYpNX%4p[jQPILlhd-!N@%1j(h2KC"PpV1i*4KF%SXIeZ
$(BE"$X(fYJDE$)00hXV&l+55bG([Ce1T#'H0LbQ+SE@9`6&CmH"YB[!Y9'#h#D@
EZ,51,beK"ERDTAAN!IYD#!@KBV5Ed$rX)15!mR`+,L*Q93LLiqdk1C41HqpM*J-
j0,CG*GaJdKV+LlJKiKNJ'e+H!58`lMeJVm#R%G%+AkN'')fJYP+kC,MDc3**UGK
l(k2UM8C2KE#hL#TFflJ+ee[#@FKBd`Jj+DU"M4e!!#82fIS%9G9KV`!aPVXbbTK
B-6"N1-BBXDa[4[,T!IE@P*Q`SYM@pE4X`q+hFCQZY$i"F1+0%Ir)@4!*(RHP1L,
F[))%C4$AGVG!jFH(QMHiLJbAYi*eU+AS&FaRD6qYhd,#H3@C*k4lj3'G!KJUG'J
`+i)5#pD5#N5iTf+GN!$T`X"c)I1'-Uh1mJ`Qk*-Li0,'Pq03@HYZ$$&4Q8bPl4A
6SpaYQR9%4%)PU"LffiNipmrfBl('8N6p4[!TTD+6)YqdBPk#0#C1RV@pJq0XBDV
qkQ'1jQ[rjFLhc@M%#jHI+M6EQ'#b$C,$b8k10Ud!`AQa[@RVQ5'ck'1a!qm43rL
8CN`*[%5Qm'T'l4`[8pkL#%cAiB&V@P5EZjb8"1IfCPL`K('U1,#Fa(-RSP,ZE&l
Q6R'5m5"ASqlC4LVqFTTbKf68(-M[4pBG)3,mp1MX)l12r&dIU@NJT86D%&651fh
G0+UQprlSl'QcThd(+LI[(q9"N@eY-phL6(SLB4*1UVicTDI%mY[-H@5ZV881N['
eRK$4effj9iTT3Jl@4LfM@KH2Cp,R'A6KbkCBjCHll"AmkH02Ne#kAR'BUPU,'%K
P9+f3!!8&[9QBU$Z,$-3S4(TdEa49Qj+LNBdL)S4%qEA50UUbFTpZ-a)4fAKpR`!
cZYQd@I1-UB,(,aY-ZAPSYdDb%S-F"Bm($A!B&%&i5@&hMJJ3T2a(3Aq2bq"dQ&6
4XBKTJbVb9JZT1Ac)JF,U!#@%66Gq@Jaj"Bk3!#*N+%qqh@X+6a@0e$#&jmF5)M5
08e9"S&09"jR%!l4#m8CH"#Lf36S@D#P&j%DJ[&@0I2Z-+NFeIje-dUH([1K$X`R
0R5UL4I6HNfNSD0BaB3V99R93&2jIYEj+&BG53B$ZhhLl3YQk(FeEU*QUjl*l(VJ
*"QH1X"!H(NmJhbdF)b54N!!*+HpbM49iLq9#UBqaJQiaH(B(2p!89$`9LUedU[3
,([e+j5[9e8JBArRGD'qQI6D4imkG$9IbSjB0%lN'$ql&a$JSHMr)a$SFLXmV)9)
E[CiULjIUlja$GhE5-&lJHLpK$K%EA@5UX8YcJY%(Y8-2BcXRJkc2dkDN3*Uk(5D
1HJ$SrqG,C'kY(Fe$5l&C1@qrXQ1S(rrNN!#BL3lL&cGlMU9UcJ9),+m)3'L8!D0
KBKU+DiIZqTERmNVYXSG%QU%4QA8V9D&Qcf"(2c%L`L$4PF%NCC!!N39"QBR,AT)
b+YhX4@8[Kd#-lV,24h$Bh6THcpDrL$X3VGIH6eRVI,jJS`Xdh%KbKU*4"d@I&'R
%ipZ$LIh`SZ@Mp"!&UEC"FV*"R4Y[EaX8#3!E43$Bl6@6!1`aG6PB9[dM,SKS%('
P8LD+H'#&Q-a1lrJE-ql1m6c-@Y0EkirM!I3!XZ%68l%RNGP!-I9CUY)C6DM!'Te
Z929b&Z"V'6l&U[M'XfUIfSI24qSM[-j5@ALK+afG%6@LTrlbMVL4Mm$RBI@`IL&
iM-2D(Z8%9B369,'(hU($m-&KD-*Kk1!`G-Sik9A-55mFTMm#BrqX%5Z-PE2SXG$
Nhm%CP%9IQ"AHR58pb8Xkc-Y!CirD)`@&TR*9MSp,ZI!"q)$2)A8)RcT9Kd&19$&
e&P91(8"6JfT!ClrDMmiQ1#(l,JYCXRFMXiG2N5Tk8J[50Mb@i(DC2-a-SY1S'Se
-SS0(TX"RXpU-MeQCmFP9ZAmj#'*Nq%Q0BE$k*,-DI#M!MG3&hPNI[@R@kEC"1$e
!dRhU'HQ9,ZHRRj5Aed3e"c1RZZ9PVPiCfC8r[qC3HF$I,rFFB,jE"ic*bhGi`1G
rM3-qhiS$0QN(6#cHUJ0SU%PHj!US)d485ArcUaD*cHG9c,L$c@@ah%QAC#DUCCL
FbGfNCDh'CQT#49r2UjC`mFMckR-pZE4CcAPi9-h4Gm,MlhRBV*kpJ#d3HUi+Y!h
5"i2Dm&#)RA,j&FZhab+CqQM1jLT@dAA*N!#f%A9aB+HX!!!LhmH+'&[9($(jR#B
hNL,[&TS5Jq,5Xhb*SUfMFVLCL)icqk)8,8qQ4k*a$L*DRJ9"FKm44-P3aM#B"F2
QA(2N8B,YflAL&Y'&,@%E%Y&cI"5Pem)0RBL`IME3STlpf'qhClD`XS4a$0VRBa5
U@%cJM&S6SNFj@dQ%(X&@RrE`!34XB41`e%JXpBP"JpCH*0mcL,6*CS3r#TZP#Rl
9LLST8iL!bHAS84L@9K5EDkH1LmKY1,qDZXB[Kk!#@6JVR%fJN!!B5XDiH`LJ%ip
')!Tf9#eaA+r2b6Q9SjqYe(F-F`6"cXV3+cfC2AKCZhmr$A%p$f-'2(A&r[he`mI
U1HEMb5GhH1Flm`dpMhShMi-b)8B#ZG)9CD0m4),b8MAR!`bUjJG4)[&b9JM4`+%
-2[G!f$4jA!Tl(JZlc"046Gj@L5Tijj!!%QNBpMb)LBNHTP%HB3L'#Xh%M0A`HS1
KBV["J'U,l#-L'!Bi'&BBJS&"D%-`["J8$#ZdB+"&h-d!1(EQC%lT)IhFfD2e*6h
2hkh!)$#AMIR*#p0$fLbP#L(`#)l,C28S8r2%JNb5ADi'#UaGF-LZFr8jaVf90!F
)-K5B1E@UR!-K6#U`8b"5SISfUP#((5SlB")X#Apdp&)SL2C'rPI`9V5&[eb&l"p
3YG%(2Zk&&p%fUL!#'aZBfYNKV,C9"@e94UK0bAUlBG0YXdI*KS4(+#P0+"8AT9!
UhK9#kI3+4G[iEJLQaR)!e!q6!Hd&akE%XBerh@-03SI"&&Id)4G[-JUH&'5baqL
X)CjK,I#&3`UBrJ8PTdhHj$4GSfcHDaT1MSRTm91-MaBKLJdAM'%LT'bCb'e%CLF
9!V,!S#1h@DJ&(5%+Z3`V(($lE*SL!TNdb'cPad4-qDKbRT3lr[JL$3@m)U%"5)"
4CIS8582&aTJ+!S*S##9`dJ@%PQL&XFVDQS)HejbipPRE))P'YiV()bUAQr`kG8I
,PmNL)9BU0RA2X6EKr0b3!#`+GXC+J-#X*4F@qI,eepB4Br+e8%'H%ZcCDQk)aKF
$8Dj!HZEL+N*2`Bl,F&`T[DKjh32)TN`rmZ(K-S-%l6Gf3e$$E5hf94JE1mJ*6lR
B'-T"[)C1A[6b2JSNADND$&kQI8ikJQ%9iTDP04R9$%-0SLK$iHhJk2@CAjZ"6P1
0l4Z$'QBZGKX*J#6FlUAT'e*j&k"9S!AM0911hRkN2J,cLN*k**U4klTR`%#cBQ4
8haNNZ$0HlaNF"5FIQ8*Gl"IJ"3HXKR6l3dNb,i,h&pj3H-&ZJ'm1IV#8V!ZmR6N
pY#)P&i`ifa!K!L@4"m4&KEfT5dH@4I@N85bH$VEmdb#M&"m6Har&khU`9,(L0@r
RDiZmRAql@00MhE-rb'1KB*8HkerDYqqa'"!P&E@hdbE5%a#3!!K[N8[SjN'"Q4A
q1r)F0308NR!-J'i`dVXL%4Xl#M%fbme6,pC%rUE#QNd6qbjSmT!!Aq3MaKLcmJU
hj`'!4&Bj0BXb6RVX0T8+Y%Teq@ic9qZIP&kpk6J6B"hpqBa!+IN3+16"'DMDad0
&i`qEi$&@#3qbh#$JQcYXV)D#(Rr4)ChL0B%LV91%e)MBfL5c883TQ2KKD0'G@%F
EHK0CNJ$U*@"d2)""iaTkQpqKC*-8hX6,kD2ha!1-hYeFl1b&B%U*mEi3)lc,5-!
`C[2h,2!NZ4V[--QP%C)rTiXACVFbUp00"V0cD@j&$a,5r8(fmAKjK%LJIB[+&4i
l12,"T+Vmi`%5%N8pBN%*lh,kI)EPh#NA-r8T6l&kTabfq2U(HP@%(N[!lGF#ach
``D4M&YH&@hBDYK6LQ4V`E#Q+kFA$fTEHk#02BDNjaTkP4HH!X2LH5YA(p%FS+H4
",L""AmU,A18fML4!mp4EA")eb[&#SJb#PK5T6beRT#X%'%9GNd526'a[TBIe(D-
U!bLMUM$VH2!$J0Z'3+kBd2CS$C3eN3F24PPMe)mZQBHhb$!@reZ4F50KXY1)%Q#
,-Z*Z+M+P9l3[$MS'%38AH2BZJ`*N498d(&@RNm2+1[R8(J2`99c`1&A3(ij2HHP
RE`Hb[jKF1eH(qCmb9V62*TiXLVfi-#qj`U83aCBU"lVjmdqNUUEFYqb$l'1,H8K
#6baGaS)VTX+fh2BJa([c5a$jR9j`6dp!P-9'aa4JNKe2i''C8k@ah$Ui"(2!#B-
*L6I(QNNN&$bN6qIa3M*ZI4#*X0bB%d6r"bIThEZL4j-rQIR"T"0lI[Bf4`alSQK
')RM`dDJV59lJf&bJR!-2#Jc$XFK`F$((4Y4`4#N$PYMfjl04[i-IB"FXc"e%CZ"
!BYa%J*iR1p%H,`J9RD[*`BHA+b6K8a*%pjPP4@kr(a1!H#8RmIS-56a1Z"Z5H&m
&*I(k2%QmK%aQMpjdVaZ9AcT4XcL%p*2QPm#XRpJVC8%jm#"Q19T5m#bPqR3IdRp
kIHAaFrSVPIA$)9KdeKmR!l5lPr`@Q4T%3Sm+!B'1FGH8qa8j&ZRJ3MJc5Sm&S@a
'dKBTR5('MXGSLXF5UG-+E[XU"NRhH-#c3c+$V,S!)%dIF**+L6KTr8934Y)PLpR
[cM&m[9-lc"K4q*GhU'&TXlCp$$df!(AcPKU6'1NeMYld+h0`FH)"K@kU@1cY6&@
'&m[PeI[-f`6lj`4[0EABd0%0(DHKBp+LIB*%C8L@6-hE9V)NI@'aN!"Gl%$"N!"
8*)IMRN3S9B+)3Q(E'`"mL4JAb%c"!1kqmU$SSfdNNd4b-8)&@-hNB[U!hB@0p'#
cb[%(HQbr2[(+SI[[@@F2!Y,mJhG[@hViX&pGEa$&V"T*hpLf'S),j*U*V+dprUq
rd!X1TU65GT*q-)&2"@CqmCT12jk#XFM$5",'&@4JQGa2NaV-VC5Ch*G%4$m)8Q#
EMbY-"H"bN!#UZEkFMkGIIKNre1eQi,H0M)JpMNYJ#UZH%YRi)5r"4@6'Tmk9R$K
jVPlh`AB64$SLcKfVVMqCFf&'c!hDKIhlaBhJM*J6,EqU##B',0mR3FfjI9Y"#X(
59cA5*ZNPh*F(DU)iUMmkk+f!fm32p)M+8e26SUCNHLqZ-E`3'lbX)8'41+`)Q50
&%M-aK3C&Dai,X[c"l5,T'6c3Cdf`1jFF4h,'fm1NR8-EKa"VT69#&23`NFTT(50
eKb!ASb)S&1&aH*!!,f$)["h68M)+iJHCj!8kNc@LZca9@3Z95[4JNp-*dALa*%"
8YfC9hUbC%P0-aZi'i6V*N6Ga!QJpc0l#D&EJDIL"RUV+jfJ#fI!"%c5BF8rM!Vk
8kS3c@`!R%iJ4l@AI5Ma%bh"3%alAcZdc0M@CT"GTFV,`Z(*)cmZ[*!'PDHLbjm#
*XhQ*fT!!ERPpiK*Q)j*qSXi6H!GUJ,)3NMAk4M$)V"@k@9j5B8KG5,,a&TT6Cea
)IPQhC[[NPiTRYBa%223"-MpM0P9a-6LENJ@m9JQR4RVF0LRYlPl`),1&Nil+ZK6
L,'F3&C&l(CcJrH(YfP5G%)5Y2I)a1VH0`YXJJ@kh)2L0"V-(GdR5PHR6KFGY)dZ
V"U[HJP,2&9$jD33284ai56IH5Q4ecq9MXBIe6aHHU$"H&)HR[*Rmh@&2'RCYZeJ
RJ'AUBJ*BqR4$afAS&"Y*Fm(NUpm)1E,NbiPMf`)9MG'H6'#D19(hHmLR%kZf48!
,CXHqG2[X""hJZZ-$f+Li8dBAFN,eNMpIU1[T%eIjSG%d%Z)f`)1DK0jda+Sj!X8
L0!2Q2Xma)#Akmlf(H%Qe@KC3mr$d`'Q$dXDMKL8DMV&h"4fcm)+V-bFfE!mJmLc
YXGr1-K3$ICV*'%9'L%[G"T(9!(L%qVV)pMbR(*SH`0MdE2U,#aCKNlX'J#f%hc3
rR8AlYb('`R3@@#TH(M3XX'aE!*l"NI'UE36**d&XllmMpSa"8+1J-4+P(GXR5YI
-4TQ!mpL6d[L#6@e'ZMKU`26N6Lm3(A+3!'*S("58h38&fp!reb$RkUEY)mqfN8*
@lfJ`qepbSGIF&VS%"rVf[FffaHAeH2Ejk3Lkc(-9*Q$E%rA@4KBB+l5dIp&IqpX
+1)1Sr@f6+0*RrVEL5A5$2BjAV$$9L-LAV(`FTP)MhJLA@!G9hBR(NLMP"q%KNYT
)I2UNZ8FfY'HTqNJER)Q9*[@dTG-3bA+,(LmY1P38&'ee4PfLSJkJif'EqXPED($
K%5F1Te6f%6eHBkL,KMl3T4j)8I&SQMe)eqQ"K9k1lP2T#8RV4,HFUqmjmBU[T15
aJbmM%A(J-")3Ciq9R10SIhVcJRKeq!$&rTIdj*`mfh-1c58$rKHU$9A9Epefap,
GlKKYGdaZ"`$h6JmS-cakdme2Nk(2R`k5dI[r@K6H!r$HMdNC0D)cMSi`UV3l85c
C`JGaU42'PeBb'm5$d)eiNMYC0'`U#M)mTL+"GHK+`#jpida*R)rqMA5",KPrqDr
NNSK!YRhaR%jh16plF'ZAdc4E@ml2rMpEcVD$jl3)DX0bm1#'Fr0![Sr3a$pB06J
5'"NX$p!Mj$hq2q&mBMmH'p5"a`e'!aJ[aM!hrFGli$q%`FS'6f"Z)Kk&kZkcHdV
Ldad+2iKG2%ELA$-a3*0JGUZ-$)r)*J2,$X'bicGRqHa[`M)%r*1e8X!r@EXe![l
*rZqZJ1m@1N$!2aQ4![l*b0B+Q&Rq,JTi+eM@''kMid8d'apX!()[-0'1[Kadl0I
&XDI1hFdMjlVrqNGZ4CDM(ERjZj9j-%YrC@6TlQ6Yk6(fhFQLYiDa1rCd4&SfXh(
(dmG2PEa`pRKpTECI`l'HliIU-Eahi*M(bE08#S#&$#"#-ekH8ECA(5a1j+3Y1Q+
0q26'[93@mk+3k3b-@-ASh,De+&lde*r$46@)a,pqY$+ra(24Fj(bI9Q3JBE#
c1aCSUrm#J@UQ%0'KF(e2pDPM[d(!p[lP(,M0CBS$"8R0)4r!V6k'i#[%if693AX
($RJ@39Kj%SD-,k36KLm)P500hLf5UMj'(AHCE2`CLZGe19Y#+F8Ul*Ud6AY19Cp
kS6iR[9fhDY2Pk@lk5LLdh8dhbNGEjFcF(S,$I$Z65ae%,VAEViPq$%GaTU3'fNH
Gf2AXZA3fP!Kef#QEL%4mS2ENZAGHU*&&MBcHp)GXGVB5SiL-l6PDq9HMVr-F48&
%$r-&MleI0cd@[HGp*'AJY1Ap"FEQmjiAlHldKRrDRIl`6r0UXV[UmYDa'rffNGq
$,jFm8epCR`1m1hEUH2fadchJ(EPV1TNf$[PMpRITN!"M`BG3iJ#223r60#3H1''
c6I-V)T23%3pY#lZ2)C!!rEh(m2marc&$YVCG,d'hMKe,Mjh1V@,Ri@hNPPjZ0"8
rI6+,j8I8l3Y%fFPAYh6@0hV6l6N803d@NY[hE-FmQI$f0rc[k@bBRNFlCXM8T@2
!U!ZMDdm1Pe6A9iClcT4iFk+J)03b2UVSTTJGchG#G#C5q',@(JD,2'bV6)K(kl$
Y(@dCk$dVC8DDS``XlFAPNp8[R2cqZC,+8hM`SY2EjFTiY4aAm5`bTilMQ3[ZB#P
N--HAqR(TPFTcCmlkHVE$keNr3MEJ0k"1X5j*&ffBC)R0$P*Q9,RGIAM&!8B8XH0
f0R`C'jjkTHGZlUKU1K[jicVfcUDYppM2'[eecA0VL[f181L&1d)KHTcLpX(U'"a
9,RC(b!'VIZ-GSY%,fd3MYE9Sp%*00)T["4UpF2I4k)9YS*%aN!"@ADm&dYCQm0X
)T"FZb(+$5&&4[p4AppM,KjfrUqr*S9cRRA0rFlbq"l'Rj`lmMIEIK9"r[#4dmQa
1bGRDN!"faXXRU`(&R1`jP91bUlU%IJkA$*!!f!%!!#k-384$8J-!8f`293e&0!)
!BdEZ-qqG1``M)M+6%4(KS+K)T%4QC#kpp`lAe0a2CQDZPU+)BV(3K@K@TZqp-l)
I89&3dGa2CZiINTQ3"!dZPmY9CQTUVP6%IG&-cF`)aq(h[M2JZ*rqk[mljqrl2pr
CchI1!4YGJ36"%q55P0#FEhXk-A''mS$mH)a9ITaEr8RhTcYEV&NH`4&#Gh0RfhU
4ZS6!1U559Ab9e$#@kV8YeSkY(5YD5mDZN!#[VK6PPpZ*p+4!EIl#4&P6rU2Tq(i
e5CbQH@`Tp"pL-[p[i@6CUFc9BQeGk&IL-Ijpi@`j6NRMAaCq)DpArUNYXlRSI('
J9QClJ[j&I)B2+[a@,PC+HAlK"2Qf-PCldPC0"i[EqC!!`U(b!mThfRffFMTF(+(
CEII6(d3VRe8i6bj5&QJ0YMF6kG2L'rb4`UPbRA+4cbam8(j4H9KlbAD'6K(2F@0
KFaN*39YV@dF0BS*fh[B#E5-qcam[6*+VP"UH@pKI(U!mTAeZUkI$a)9D#eX2ZNM
mQMpE1%HZ8%CT*EC'G)cBLSmVA#`h8pVbdB8MjBl+H+h@jUGjBRXYaVBlNEiZK[2
A#V[+Uj@P[&0KEhQ*mVB@DPY&1iK4[+$`4rRIbKrD*PXdE5aQDCrC2UDpa1@mCf%
I18bjbPXArLTrU2bQ[@alP8i8CfJRE8IT0q)Vr2I#kI)TTCd@BGY-Ia)riMmAYT5
[+C'm5H%[mKVP6qeIYSfdUEL&CaIHI9TqAmR42V"YSeI%bpS"fc[dZ[JZ[e5B+Hp
AZQZIf2j'qiTlH,I#c[*Hj5$[9rL@r&IPX2DHl4$0%)1ePEB90%"mMYmV$*(h+6[
jNF)EmPEPV,E,YS1QLjAF8RK"PT3Jl92E"KSSUTTJ-e'(Ae3FFL'9rBS$G3p0b0+
icP2i-AkEVq9(HD+@U#HQ*"j,[*fi0T'lR,(Q0%qFYLbjLliqjCLS*JpF,mQ(A*+
X`0KF'bMLe44*rY`MbGZ6*6N@TKVQ'CMe3"CKiXHN#N*P-!1A9DVV"mC@UKT0Ue3
pG(fPUK0lM!+C3Ub6!J6"QGNY%6j'E!UabaM[`&K*GN+cCTEmCNP1d59CGdUb+eR
4*Re1ZrMI$YS@ZLBdmPVS+[rEL[T"a'ErdX!9%IkDm!&[qTpAAr`D`9,P&k0fqeG
G@4lYrq$$04'Krej6i9m4(GkL`KrQMj!!0jlhpkMpb0&L0a&+AakpjX-e,G$Rp@$
+3PC%p1L59XblI"S9kSm1p)ZEed3XMrlr"'PU$k9(MjldDp3T88hdDhkRAe08*mG
-)0%N1lPIBpE[&"e1mYLAb-K16D*1dHm-e$M"1N9CFd)rNB3H,#')&-ZG@-"BQ*3
%*"i81kPQmS%6U*0a%'!#e5SC+%D"i)!f6338kM5T6UD3!$)#-91K,4i-C9+Tea4
[TUPN54IBc&N*V8&1LQkFFLT3+PS`jd@9!AjDa!R56d@bS-4!4)89D9&P%"2J493
-p!QD++hd+D"&JS1J4HU[P)ZS%14M,c,*3!8c%F)YAQ!3LN39pi+$L)J%JLQBJB4
k[d$p$>B8S!@k5%**j+AK"E3,K5p9+)KrXKM(U[$S'Dr5krZ9*eQERIT9$5e,#
*+"1-L2qULj[4hIV0$Xb!T'B6iC)))rK&[eQ4A@E4!K8ZcYK9-jQ*Z#3m,S')8QL
#K%!d+G4P)L[4BBjAVK!`'q,KqY4!"(`dPEaiHDB&85C`Q)9+NC!!jS8S%J+T@@"
5ITI$5aPF46EI,a-MT$-(i4Z9$%2`b%9`TmaF#J%U9`D5HmTb'$B,VLAqdpJZQm!
JA[!U)2IH1GP6-C!!kB@+Hc,hDH#RYDi%"#(!+mki,H6k0&d@,c19I9"93Pf!AiZ
RPP!U1[bqcI44ip@2hGC`HQ*%95#*!'l@Z#,)"+1i#%BmD`Bp@(")F-%P1&a%"-j
#6bH5hZkZ`QkmaX`@i1CD*48%#e-[8-%NHp841),+N!"H11Q#6cq$)mMJ$L4F`(N
U&ET&!&S3,$!cVCdAS$BKRCH3cG$$M*`f)U1+G`34Lr(k&c*&kf*3VSZU(p5h
JM3"-m-S!Lb5Q&&8'HTG)(84-FC!!K4!-(CbC5Vr#G!QUJT5K+062V%$8QLi`QAJ
m!3%DLJJe!'Ea!Q%BTN0QSQJK"Cr55JIK&j!!-Kd3*AM+k)LRbH5$CJVfBA$3)+H
IQjhFCCCbA*a-N!$jc8ir&Rkb)#dSf6'c8h!38C,d)#EHBpH-&3fV#KC4"3ZK%JX
6dN)`dd2dQF"ZFK#Gb-SZiV3E"")c6"jlGF'VMM6S6)4S)cTmj!K)P8jXVj1Y"HM
je-*@P4D'-UQ%$JG4LJ3V"N*C%5p5@#2P4%[S,&*B5eL%I!*(S+PALTaL#,RJ6Z#
GD1kFM)&ih#Nb(q*#X$!*-B"a%&-NS&V`UB@Y[%,S1)L8i)hB,#IC!j1&F4"9&`K
iMLBA,%bpPpd%dKK0TQ![)6aH)!KScUi#I55LJf+3!0('Hb8&!NHNQP91#S2CL,4
GZbCLPIqmCIAZ9AYfqk286H'eiShDAE[$9fb9VSD(ESc!Ci9DmFIDGe',1ihKY@i
,k@V%KZ94S5ZL0fk1q#!L-R6h[m9lELYZPEr+-cQ)M)Mj&010%m5*a"b"ENG--'Q
cc9CjYYd0TmeZCY+qQJYd#jKpNKc5B*@0#Xa+Q#fLR"k0#Gl#M'&%`%lRL(*Q(jK
XQ1kLj9i01f*`D$c*)'2f%G2Ciii%)QCh"[41Q,5$X8Pb3$maac*0f"hqmC,)6CZ
M9qeBMVTTG'LN'*3kKH3Fd`da2#aLFr55H$64041k$&EjqcLbd,i[aRSJeQeK,N,
e1V(RfB@9Zb0f`a84SC(ZcVJC4AaKdVjI"HCVC+&pVf+p%qX3Q-k5(*`[bNFbaD!
MqlC%EPS5'HTIFrI@DVbX%m%f"#BAV#G&qFCUmIU4h028E0dFiED4abfYmVaUdpe
Eb1'QhU60Um0N!ePSmlCKlF6m)%`d)*@+FRB*S!fd@YSNX3d*M0UdC(RiRP"rT,b
*Z4,qRhF%mZeK#L6jlLHL*DHFb3C&K8B[L3JM`ZSQjZ$1fV`#b%q'l(#BBC!!EbE
+1H@LH[0Qch+D!Y`hHYCfNcDV'T0Q-(@5R0P1P#pC4-FY8S*k5e+CKVe@bkb0l$j
pdqD)2CZ@lSRF(EdNP!(3CTf#L!Acbc"CNR`p9Jc++BrIRKcT@QKda,R0d@Z@,iR
'Le(8TZJPkiML5GUX2#fKbR4%M&`6'Vdm22lERRp0--jYmLhZESTN'LUAVpQi1b)
mM'@j%E(D#+56@8QB)jf-1+mPE,6+#GN`9f'SPK!X#hKKHLXd-R59HmBi2T1-Z'D
kCHBCJC`c![PY4(Hbd%Ed`ASejNeK*QX*f,1%2PC(3P-#i`D"mCMCD-6-1f5M(j`
QlBGB62aNSIe3!6KjQ*q"@DNPf!"R(Xa!kqX*mjpYlI#If*)F6r82Te+ER4qbY4q
#@B2b`fA!L-+N-d`6,@'"Hf0LPG[`dih*$deBBp,h5jJQ-$1XGa15L-E(20d39bV
B)DADN!"b"RC)#F$1a+3#4Y(D&"d2eRJ)S"ZmB)FS$'aRG0HG8GrT["fJMEL(6pV
8@,Ze+EYjJiirpj!!VYU3!-BQE3JfIdK,Q%PD'm"TXm@DdqE33dMM3kCU3cRimkh
b8"I-GUd0b'U$l06QU[9XQk6MS3dpS`h&JDM@*[L)@jI"Edk(3m116iG$VjUdS45
6%,,3KQ*MKRk#16CQD"1Y6AZ5+NhH&"LdI01D2DYhV`P&BPbkHhR8jNMLAUCK0LD
,BDC+mZYKSU9$*Z1i%,8TI$Hq#*bh,0dG(KS"kH&Tf["5k@cRZ5FFGhLG0K`(b0A
D)#Hd54,S3S%H%#KQra&SAi&f%fKMJ9B)p%H"ILA3%SEYK0FkJCB*p&H"[Lj39D#
E"GUI5EmVd+8#r8bJJ3,pPd!(#p6#0&jQiA@f[LV3R`9Daq4dJBiNG9YUC8T4$kN
8U%-NVj%QGPFYd!9-(D3r&ZJaa[-e3pdRd*G4Ca$S6,ch-Ef[-KMM"ET)S1RX)NL
Jc`QdYd"(#r3MJ5B)Y$@VZ5pNDaXlc`#"[+DeBK6E"CV()-d5k#Q"TJNd3+#[-%@
6'BQ&!Re6S(m)Y)U4%LE3C`4k6D!I#R5Y3!F*p"m-GC%4"kMKmI"LfH)H)a6-e`A
kPN#r%qJ0JBi9k&5"[XCS5QHZIjl4p!XMb#V31(CDJCd6Qc&CS&F%qTj!jc13!!U
MB*9!fl%0+"CSCi%D",T(S"k"RK1Sb$`b4+"C!XeJ"mCHhQCqlm210N+Jl3@D`ki
A-9VKr@HCGbB*p#PfK[i-4NGfjP+"0K,S1`,0&fJrJAi[d+-#(523L3cB-2Er)L1
PKVN'KpR,FXa1jYBM!Mh%GJ[!lM)k!2Zhq#bbJRR`3hE)4jMS9S&Z%fKh*[S4mhi
pFaa%j`RdX%"hJA5f26(3aA,2CVC2XjQ3!*qTISIYam-#E5E3c`8D)Y"[f!'J`L(
3-`+G)L6HakPLmlH2b5[+hM+[SHR'"DlJPI0VqS6PPQ8F'PM9qQU5de)jZD6$UP(
E-rF21G-ZBNTXqSkj&394FkUlIc,ih2464V-U6'VEGI9Sqj9Y)qUD4%j0#pRhCAh
@Cm1+qahmp[c%9a-mJ4ZQ0HZdG((jj32$,lDm0M2Zb-lC,4T(,bcY[$GrhBb6L3C
0&JYVApmphRVhr9P[r[Q[TjF&V2MRJ*l,qcpaq,fr22rVKimRAj!!rY[SlG!a$ea
kGqK,2feqZ-[CA9pprH1rRhfblpr'r[hh9jVV$Y0r1Vi@2[,qR!pqH11A0BqX[rI
F&jrhq[LTCplkkk!AIRZj68V3TrpSeA[*Z2ZZ[r2GLcprp1#a'eZrlr((TN@hZqf
CX2DESd9RKH84Me'6(E6aeKhN)26iJp$M$lT-&YUJVPLM'aQ8"60$-k)KlpF8MIF
KdcE6'hAZE4!rS8%D01F1IH-Je)d(Qke"JmZC%J!GA+m05N!9(khdi,Dq53-!IiY
*&FaqEI"qdUL*FUGFQ(N`J`N#r8`CM0pk`9MMkkN'"fZ$MfM'UTZl*A5'fFD`QbS
N'CXLiDPGQeD&4['$SC'EYNDZ#SeNDk*Zq#fU-)'E6JXXaPN@@Z@aK16&fPM8T`D
M9MS@PE+a$CSa!f"cB8MA$1S2$a'c$eqqXm+c0a%`0P)EL`V,@0!r&Vh,f-ZDXFp
05QmF[R`cj`aYl'c0Q*FUI4E5hYSpUh)4QBAD@+2@h(Apa&UrfdY"[Pr,4hdi(le
m2ZV%qHZdjQA2ZEmej1r9mX1djQ&AI-IDX(Y0a+1Sl19RhX,"hTTa2RVqI26kq9q
5KCBr(1Y69MmkmrbT@R0IPE!jUa*L3UfC#F%q94p%EIVS84!aSHk14%cBBG)Q)1Y
0##-,E8)%eX@BRi,*eTTRqkM)m&(4hRSM)IMi&mjE9H-Rc$qqrM"K)26Q@Fp1'1C
Hlb!AfJ5mINh!keGHQQqYjC8#e4SSe2Rc"+ej8p&bbH)&%Pqh!'rH35d2qc,I#ri
bd+MfBpY)%M`A(VBlXX,2VQk3!-@HL-MGbb2@X![rZRL5hG8epP9IV[JdE9Vc2fN
"eh56PSIAQVbTC)'Z#"&G@Db@"rH0pm!85r+I0M+aic'#h,UD5%L@*T(Z4'pkD%4
lBELm-&cDH,blM8IH'*m1'(BbXG-NdG,D`c3F2YiI(hN9qY4IF9I[Zd[ebUA6$RK
)E&ihM"pPP8HATETKG!Pa`rJ#6&'((Ue)FY-B-Q&Zq(NKNB!E4VR6ZZR4d*VU$!,
*TBh'+m,S$M#Y*IQ2*Q6#R2(c3+BN``["#f$ejUArXkG($p4'iNRC,`HXXU&'P(q
FM`R5Kb&'P$X!PJ'9I`2D+`1DB!1DB!1DB--@[#[2GprAT@LY(a+iNE%QE54Dm*%
Uc"&*EJaR'T!!i*UM@62JRFf!pY#!PcE$3"pF[&8C#%df,ea$DkEpV422q4"G1A+
%0SUF&Y[5I!&1qbV8"X13!151lXH!e'&!4M2!h3BdNJCXXf%M`2VGYbrqY!m4k#L
FH4612!U3!%CPiXcPd)Vc0Xqc%iF5Z![XY)D!YP1rRCEC+B'pdGlCPITfiAZhm1-
jC(K8k1j)ARY#1q5[[H-,LEqfdRYj0ccL`ifKmF5Ymli*K6"XI0-`jSb[DEMj2@A
-$Qe-*FZ)Bf*-fKLmp)e"2KPc5T*r$N4'"q99GSTFMm)$,HID+EjqYF5"$SPbZd!
l4@jUHG&Z#D[R*Yj+kfKZ`"1MVede$BeF*HhVD)QV*+C1DHZLfY'MkLh)@McjMQ3
Y(QabCf%jMAKpm4"'kq)&*QeaNY8b,Se*YGrc+HRSX)RKk&M$VdAiFU`h,)q1L'm
CdRd#m55-fkQ0LdP913k0p6LFIKa1hcVMVekHM$[T*2cac0Si9-I'SDdBKfj`h'*
*RVj8P+IM4IUhb6$"-2YKLN9jiJc4-M'BDHj`%p@T1Hr@8%aD,[*B,R*AlRj3H-C
(BEr(i"IGLFcG$a@S-ZELNf2Z*%QHN@DR'AD+pplICm2dJiN4kHq#2*fFSP4,T#!
BZ`rkImfe8hcFl&b"H3M-*qJ)M"[)DmYfpSTDDC,6k2[Dlhlb&0%UrqlIULAQf5R
B&QMp96cNX10kZZpkqR(A)`69A)6VhhcA[lPI$fYlG%ZLCYDGbCi8el+dpE&GiSi
9@HhhEhqJr,kb*iUIUAkbp,DrYQh(NNE0@Y8-U2qmiZX@24VHV([Mc%XAAkakr[`
,jrkqEUfbHhAiUY#P5m+@IrCae,qM0fhm&lUZcGFqZ[VKUhrpj'plpm6F@H$P8kq
F2"Sb0rhXNF[pZJ8&"i6F`ra'pYdV1CQA,Pr210c[VHjp1hGVrhVAecUmhDPhRjj
C[3TqR2&0dcqEr0,ZTjBrYrjeiQr6IjraMDe`dRmQrhID2qErmm[JHfrj[`qD0f[
%$d1'$[r12c$afd'$aqC2b"XrHZ5SJ1bJZcHZC&l+ZAji38EhcRdIR[PJdZ-*EBc
0$BRmrkd24-&8+@hiG1@+IFrYf,9ckjEhYhf`rpd$laaklj'$ALIF8H)JF`+99BI
P3Z#i,mE3ZCMhAj`ll0QRjPJ@2VhS`PG6Tc`5H,`2'[pa[!mDrq(QJbrQIZ@IIGS
(Ih(h`CM&ih,l$hYUcV-,&beiHZSM8ilc`8drFqT2H`JrmJ$SPMmPd6YVZ-A[H0R
fEMrk%(rZ#Q,FISVE,e(KGrl&FfXRD&BHpHridlJMi))6LAAG*+rFiHSd46Fcd6X
S10&0AH1pG5ZrqAk9L@62GHaN-[HJc*+,,q0TI$f2j9ei(%S`&A%VaLcFMc&4$r"
bIKm[idr`B[i-VqC2mP+8Er,c@Yk@Gq3P["&[aP[a'Mk!er22H3Ar'Q-%HQ#lhd6
"Z6F`'ZBPM,"kN9IajrPjrJ*+a2kGVd2T+'c8EVkDKk0XA5KIbTI`-,kFImBrjP(
mhcbDEm*`XAra5,k'4r$0r"VrL&rP(r*Aq9rj*ra[I#rIJehr[e(`-Mr&Aq%R86J
VK#HQml2m#,r-qr&Z2)J(m`"Jlh%[qJE2jRIj&Cl$-rNP#&hR'I``40rLhAPIhKN
XlIRV[#YrMAIJEr01[$I[`h[b,0k,&r!Iq3cq$@r+rq40q#qm(Iq*Yq3rmpEm9ck
4rmDRmpqCJ!e&L2JNrKmqQIqA6q2ri22j2rQAS1-HS(b2hc`qLirJ2r!KI#JIcVr
M!r(lPJrLJrPBRXmRm$`qRSrQ)rNS8*k0%p`&e9FB[6QJpc"I!*UlJpDqr'%qNcr
)NrMM2)'hi8EHR"YiS[$rI"B3886!a#Zja$I`6rP+[S,[imra(A`AhmQhmLhmIEk
0Im$hmhIj!Ii12m6Ii`H2b`,r0`T1C`%-(C+jbKhF`Lr`3$k1Im((!$ZAHp(pq@+
HbiIaCrP6I!k%&[+Rq5+)IX@RmLRm%E!m9KCSc2pic#a!"'`mm9CCi![3m"@IMGq
*@H![q0dk#i`"YH0!Ehp361Kp&[3Z3KCi'Y3q!RT[Q3@iYT-q,MT5GZa%F"dNBGN
N&KD5N!"fKB6e+ePB3%*X*3R(KT!!813L`IiP#F94**4QXp#CK5BX6#AKGL`,45a
%X(#CKGBXj*2JCd,qYLc-*k&f1`Yl@CK-3YX@*$5UBZ%3#FdBi'EY5'K96-*D4UM
#!,c2VYmY*H%!#qr%XG#-K)2XU*m`e&j'p0l"*+aQLPDcBiFa4i60C-&!JX`BC)%
%bd85,T5am#S,SdN)C!i0C!F,kNG#-'-,CN3%lfIK*!Z-p'!Q'X!1(,#1"HDQ!-B
F-)q%%#F,$5a%NT!![TU%E%C+pMB@Q,VXB56FYE2!MRUAEGL9lLc-CS%GpFSF%R,
fXF#f2iHj,-I#!Y[#(1DQ(,E0Q4YC1-8#!jDC3-+PD"Db@*M1!J0cLC&bR@hYG8E
Sp98XX10PN!#MdJ`rbi1(QBF1Pl"`MJAQTm1-PZjR@!KNJAQP1i2FPl(eM@'"DHd
Ec!)lDprK,,"6GQCjV60MkmCfV"YMkmCSlpDB"8Ce0lBEh4KEq`-X-+VE-`$Y94B
BJ+jX6lT@Xe$"!YZ(VQaRZM,4eeJHkF!8GEM'!Q@"%G5"qE8$bf9[Gf+K*3XX(h9
Laq[%9(4LZp5*NGZTJ)8T*241Bb'-KA3@-PKJDDJh1dE[*",k-"9pf$(kX264Kaf
lclFX'%RSbG*S6lB02GNfp'5(lmPbDmmM,,#ddT-4fR-J#bc0CE(f))Zj)iZe%eP
X#l0BRXTLc&RXN!"C-eKJa'8a`,eBZZr&8RB[jX4HE(YkA@@"Y81p@-lU0CF&GU3
#jU!#PXF,Q)X,@(BTB-39X$cq)p[X(dRZNhq-eRQX@HIGB9UDGFeMeXdlB+,-ZNj
K4Z#e)-ZX*d-SZF+X,pY[eY0+c(UA3,0qc'R@5jUBp9BfQ#5cAL2!4--%`d`fkr9
f'&am$SE2&CK9-#V-&CLQ-&2-HN8T6!--,LUbB5DDp4DjCVe(-8`pc$UBR6"lBD#
m"j5Edh6G[&MA2B+ZP`h6pCVjZPia8pGEe1Lk@+lVTP'k,N&J"4ElCZMkFiGdI9F
C6)QZlcbJke[VGAh,4CM1Z[iH,[C#D#mB9YPeI@N,Q,d`'6"6G(e*NUk(PF*Xd2A
U+dkp)G#T[e$Te2pqhUQ[a@4YJ91[h1[8T@bRrJk(`3@26GCjFE+ZEi5a*H[1!TL
TbATb3M+)KX&&#KBZ#,QQ*H[,&LIVAF$8CAkb(YFf@6q@NDcESj2eqfFNkqA'C,h
X(%aZX[j%#8bIC,ei6V,q6!6-CCM*bATe4E,qT!Sc+9N[pF-FJ!'LG&LbIRXR$"#
hSI!f''ihKKN1!mAq1TJG-,MdCm*m#30!Y@N`96#"-'#SRCHXYrA!Y%M@1kk$!F%
P!&S#SC)QbASV#J2#@N&a66P-+3`30IR*qS#9-$M3!"!h!%$V2i-a*1X9eFPkLk*
N[3H!0B$TcHR*HPd8$"MV)2J'(2)'$[2'h'6pM"PQ,`b)I'PLX[im'*lI"a1FV*p
h`X!Cjl0JmT,e&cE!K-&dJKN#!mHILi'"mR0ANr9eB&bl'JBES)"J%3!&1%D!X+N
'"J5D31bRf,L9F6"EB#$d(!kcS`&Q+6Dhh+2c1JpbS8G2i4lGe3#6$T2VdCI&`25
"QH,4d`5Bb4jp[4d'&qX(H[6B%TL0-(-mHTFUMajAiG'2&F0NH[5L-SpZ,I,SGJm
-pHMP@4kp'%UI'H,4Udpjp#FAHr6E-cak@c"h"*!!4V%H[G8)Mej6lp(V)cckj`"
5%HI4[clTdAZ%HI3h30LC0)rq8SK(V`+bDV4(h`'PZd$mVRBHI5F)f!R%eQUB+"J
!HVq64pm'JVD"BGX`Mrl"!Bqq(i5p'qR4$dhdk1pGKHRUd9IM-Kb+`Spip1@622T
RB2TXU8H20RX`qKh9AQ)9LpqmJC3dTbQN)+,FB@&PF%aC-jj@bP0)Q@ZVAFfP44[
`p5mSPrYMfr)ZFD*M1hI9#6,&jaamI'YMSfNSfiY((NPEa"[RkVQpL+H93C!!qi[
iN`*4NFGNdBp9mIXVDB-lKYc2Td![Y3I0jiZF86cj)XVYHP8'*fdj%4F!h1i$PE`
@C8',P4[[lZGaCAaP%9pAcYmXiUe%SRN+dac,$[6,`NUDBUHN()X0j`'N9ABeL`2
X*$H4qdfbjMNH"j&[h88UDCilL[RQAKCHfZPSRQER+Fd%jLdE%4eQ[fIMDi[T3Tj
@a&1fHkm@NkXTpRZ,mAIRe"f-UGTleBi3B0j[$fR(%mY+'G1kH0q$UF3HNXZ2PP@
b'lrE$8SFjSS"CHAF&BGAS94mX6dMPqrH9X`IL-2Ie1"GY[0RLRLpRCF8m9T42Xl
eM3P$U@qbe+lQ%q`dXJSQ%kXp12r4ZI[!rqMZ!cHlqm$alMj`NlX2T,UlNRlVlZl
T4(5drGjd1)KFRAChVPI*[9cLELGM+RChGqcrLHi1J,[6`RKD#8m@6l1k@1QF@&&
Z-NT)aeFDQVk$rje1iqI6a*`@[0P1ATI'DfNf,cl$lbrRY6[B(Z"jFi+rNXCL0d6
CNQjLT-`8rHe3a"TMTQ,XkVc6++[ENTfi08RcRH`"V4qES%JK`!@4Dip&FN$XBiY
%NRJV[pl"hHPSKmTDR)#[H`am60QU%r"KGm+h4(D4YmY,qCjBrNN*IcH@2eR#cmI
b&dYi3bb'K2+GXIbj%PiCbm85[M5@ejI`MV(F[pHE6ET6Up9KQ%)FV([B&0JLBPF
aTa[*c'Vh8lDF5fDiV#",FbFb`h)P@elccE6Z6#hE%#bMI$2cF(Yf%BmjXj0APh%
VQYYLhR(lkC6(dNqJh6'ANcCc[G@4Y)AXCcql1JT*m@Cmb#JqXZ`!DE46iY`br#T
l!&+#aD8Zj*jcT,PR46J#QV[i8DGM-[kUQMG6'DhT`-A8d!bbb5QahP5@4h5hY'-
mQ+2k21YI))Y(FVh64(qe3Yd`'4J!eH$@!rA1U!cdamQRZ+Fi(X,K"$*+jcarXCJ
h&2-"aE`Y2ZF8mqdBI#F`0K5Ck#1SIIMT4EVEBU2EBVrESXTY8CfU5,,%+6bj@2!
"$`E`fT+$[%Zek0M2AGAHLbNSFPVNl3!$L-4fDZ'HDT1[6f4-4@%mZ6TH63K3QK`
'*m9"859I9ZheU+'*9a1Q,Ae5KkJ+AEjlE'J#5ZfEek'iIMb*9c'f`,G)3"%m*aQ
*3IcRE5`l&8J"C8AF&HZHYEIEJh0jEHNkAR5HM"55eeHEb19S3Pd#HHAMf+k9UCK
dB2aPk+0SGjlL%NlA!N+3!#S&YCNE2%YkjB9DI0"+,NrYSNNpJ0&3j%j$@@U#EZZ
1Ef"iqhiHLqDf'%1p[3iMASPPCf`6*MhQr8UFGrX*@PYiJGf-rc'AMl2%e2!+&fp
9aMqUjQfVHAJ*appE,#[Q6p)qI"q5r'Vq*PB0[#,@a$,pA!+2NfNlmKE2TUh*1cb
EMV)kM'9-F"kQ,SDFrUKCE'#THNJX&V#N*Z"(*HKqI32AL88#Mk[RbqKF(KGE'Cq
YUeM#a10VebeGL&TJEG`"Y`4b&NGG**I@Fr`TAqXC9"'93'XP,brQ+$a*X["LVe*
-4j2[)GbEVH0cr@M4d[f-@ff[9I9+hU@BM!Cb&FIA-(e*MD8&3Be)cAdJXN("Ac1
c+rFHX22ee6b1C['1,PDCD%UHXFrDJ8H*hi*f6PV2XK24%-c1jH-E$[(YGTj@$m#
mVCGpRPF3"4mCp`Dkp`3NT1#*F@8#6ki#REkV52Z&A*jAp`Rhfa@,Ui)-*#,UCXF
,K2M8V6i"#5R5I9@Mql+RZKZ#GD3UiLpEbCTQ9fTPh-ZjNf6b3(-,NM63XkBf#"J
jRCSdMia[f-*19mklY$MZG&qKX1YP(cd(6N"#+S6dMb8mVGSGm!CkdCZ`EQjH5,0
`-E84*e@2$5Ff%i&S*'HQ0ZSc[HeQ1@fCLN[bYAAAh(BiBB&LP[G@+,CALrMQ)Vj
4i#Yhm+2PI'8FrkdYAhQ'QqamA4Tr2TDI+H)pl,bqM$GU4X+C@)*G9mNI2-JrAXF
hPjN)M-R)6$D1f@$b6C2-XUb10N9NGJfTibUC[3UKpQ4fKAcV*,21j%-R*ajUL['
A&FaY@0Q`USTIGFE+%Vp+akUl,pqCfj-CbHXcb&G30Zd8$bbDI$CP#D%V%ZamlNd
)*-(qEi&Erlm#cJ&`eSFS('LFlaX()fm+&f6V+NQfS&M#K644YU,SJ68+jZS+f8T
00aA98imE4J2qq*%e0jHMFC2bef+-Xm!DZlMMHkb!h&4'3ECAJ**dmBKP'Z&e[bR
$$BV$@'D)XVd5"J8Bl"8VC2ZC1j'BIV`+5akH5MR&Ha4rM!m9ZV3iR[+*@kSVYPY
blh51ieAK+,i6RhJK&MNmG@5S(l9V'q3C`dAjrR1Ll-&3XlUGS[b%8D!BNV@mE*G
mU(bA[+1$+"H23V&H+XNE)dAjpLTXH["l$XX@$-5%%b5(C6DCANL6N!#---@6!4C
1XY#1KA`5!VDcX)k&#"Ek%GD!H4)b!CQ'!-#a-P'qKk*Tac#m1AfeK%&eSK`h4l5
FA8M*)-8MqkK'BLE92)LjE(PMY6F1*$*UGJQYP,-&5FhH4LXGf8Z*kZ`1@,FM&m-
Np@jAM2#q1`6,Zc1K(3kiJL&KF6C4[E)Df#Z[5ZU9B-KFk8k@VE%F6*CcX-a*NmM
S,MQZJkMQR#HBIC+D%iAl(!YC0T%X19p5-V!rXaMBc(TJ-hG)DZBT-XZ@m-#"d*1
*mY*aGP'pT%$UdRjFASU@e%Y%ak8-c,,)E$TQXmPXQ#Kh3HAimN&-4SL@beeTM&2
!@#j*aH#&5[Nk8XAe#&c#C+b6j!cXBTGk&#k1Np6$F)Ckq"ba"-cK#-Paq$)pCR)
F(N,$6BjqjfN2Nk9I8d+bh!p!BMH)MVIb#)hGNC1lR`'UAP5l4i+jHb!`+!k80KL
BJ356)-Ppii#"jrVZ!+C[M+6f*@lUDj6NcP@i3S'`cPHa3&T03alV$'Gf+`-eh5S
`$,qE3[C,lJDfEY%%Ua*lQGM'a-k!UQkcF3ZG+XT@`'i(ArXDaYGqTD5fA`@CpK'
BG5FhNkNI,ab[Kf%)6Q0!Y)[bki-Pe'I*HEU1NZ6A,SVb-Tbb3`Y*lA!!["fL*0V
"6fDCZ1U1+e$iGLQbcGXl#GIERE"Z#FK[6i28fm1a(%f@8l(XC*E86KI*$&QJ%`j
!1d'9fLQEi0T,DZmd,(XMMeKkKe%bQ,Yh1V!C"$(ILjJM@ASRS9!$hPAU`09RRf6
T%m'bF*r,"0%BL'qp##-32BXN5mpcl2!p9dPUcj-%H36)PPlN3#!A!*RPNY5X)f3
'mV1)&l2b*,9A@mak98Q@APF)6,NAXPG"('JXD)DE!KbLJ,LNi#STXSM@S%&%D8e
-YSZ12jV3'*1MD3`*IpTCX*(3**)NiLDML+Yq15$+b8RN8aJQJdNa3)Pm2"KTNRr
#P42Cj+GTD$K)FF',NZ9R2h'"iqG!`[[c3-R4qJc4e6S$3@e06[[V*j,kD`LCj8U
@L6-BcEm95ilT,$P2re*bc%JMdaR4Zbc94634'rrN5XRaj'GdYdNZ959(k55DD**
[BrbQ(iAXl$E48S*,1+S%)qMXUd@j%BVZ0J*apN1LT9%61V*'N!"Ef55eKL6C'N'
b$0K1%lF,MRSlJ91I*$NqEdTV6I,R+1CVR5bU&FJQFN@$C-%`),*(&56h9Q36fjR
B!R)rF5G&kEjM,85,[T'N-BYZSaS'3M[E5`jR!C`S1kHL*9$K0239F8Jbb3Q5aE1
4MSG8bJ,mp4V`GdR(S29TY#21Z'`a%L3'fAC"UGBZ*((1&aeGjK-+ic$`)KC0pE%
-60"3f0&XaU,UG$rkS64X6$Q5j(eSjG,kLBkbFm6ECDGS4i4FXRLLK,Bbb8rdNH3
R-$SM,3*2`ZH3!)YR+L#N2K1"&2(-CBDC$)aFA5&CU[I6F'a+p44iRD3`aj16%#b
Pf&U2S*D5c-6f)BYFPJiM40lH+DQhFD2H*XRp0XRNYaY,MY[$LFaY)pPm2e+#kNG
Mi["(%l3rNk'r*1KF-05LPkQY)Y6@"NTU,GS*4qdmSV`YrTa3faBJ[JE2ekI4m5D
jicUNDE`0G9a-(&e5)6P+USM1%QbfbG')G%0U)h3*PNCcD5)b4LXd++h#!+39P4b
YKT1$eT4,MTUVK+ZQ$i&5Nbr*!cc3'bJk"U`N'JBJ3DX$*S&Y!$aF$`m[@bdkkMm
MPr9S1H4k!h"iakLSaJ3MJeYJ+2`bY%`p8)0ai9YF!a+EDk!S[cNG%j3+VBZ5e,S
mF0BC*I80C#A('h-*l$0QbA'QRY"bCLp$S'Ma'F+d8R5m0*'J,Ql$XNkd9&@beV`
+6Ae9-$P'e96*mA`"Q6j[P"cR+iMdH65D,k!(G,``PDc2SF0eJF4c-C,Ph(6@*Te
E$#V1SCpbJG5rSc4S#SUGVpY(BmS%bpV90!Cr@Q"Y![8MSbVS3&1'LaB46N+l*L*
,#*`iAEJX18aQ3V5TKSA2b-kC*N%H9FT2EC,M8jEp9XDaX)9FVm4iqC3X8AiZAh,
Xm*!!LafXDV"Mk8jDKcZ-&S2E8TU*$Qd1c62*1US*RKfLQS,q3ABe)-PJL&%bp#q
,N4`B0)JNQcBCIh8+4C+6N6l@Sl'*h8M3X@KqZe64F8L9F49d*&afV&Lb&*8aP,@
)SHc)9IFM&59MG2Tf"42dC`qF`J5NP)0+*m`6%c'aS)i%`-jkdI(-%(5TFMA%G,5
&6b,&kUL`hNBke"XMEmj"YbYha#Re)fL$m-964dTY03)CVCjF$3!i-i6VdCHE9iQ
1cf1)ZJUdRfEXdGFJ"(mh41i4KTI@A0(a4J0GJVb!(G,QLr*,+)+V3AA95@cpD+,
ZHB`Ca!I@&qT)8RpK#S,PA"1k#%GEKp'FD0lA`Trc4)Z54"GY&ba#*8dX&bbQeR3
4SK4,&lN%biCkG[RTUqabj44fZ@mRZC5ILm)`8P(H!8I(L)iG@8KhMPeeT'+aUad
KB'H9j0JD4ICTka$*XDfBl13fN!$h`3&5"GPI4QqEe2h)D1UlU!r)ldC+mJ%-S85
Tl(G3HC,IDBP4Lk,M8![5M4bDD-,c+I1ZL&l'![bb"`j8Y[R-rS%$TaQ0aLQ'")0
KUXAbJm%`NeM-Kj*jdRMB49124N$)D$!N-H68Sdf#$3C$*M$'N!#NK3C$`QK$r$p
MJ[',%fl(q+l)C9i#8I&Y!SX*KS6*E$Bf&6%QhfKmf-J)Q!N8k(T`P-@5B,&-p8P
-(A6mHSc4q!JB%Sa2'ie2UkSkdcL(")+Di*da`8@$9IC[JI&"Lm%id`YL5KYS''C
*mJNpmXTR&LKia%LSAQMdS4qFBdNb6V8B,%aTI`[a9)*a9XJ9Jf880&V8KF`TM`m
2cKj'e[')A#q2PmaFaZF&`pLQ%LdJ[Mp"2mfFP2$J)V*k#Y1(8cP(NYNBhh+8Ec+
P2a(+L`IRFpD#aqFDAMe`XXKJ`'DrF+&T5$GPT,*)I+RldhrHqhAkiqaIbbYYXN0
bfQ3("#Prkh2Kb!9PrlJQ2mijr25FFH18Jbb%AmLi'a*bTFf4ekIq-V9[qkPr(ZN
ppIH-H`%&)5'+1[QEbC19SfkQ3rr*#%-4P-XK"N[JVcG)`*qYM(bjFI2r[relH4[
*aXBNNTX6r[QG,mGrFE6F5,"(dfh'`RmQ')F(IMNPm'Ml`+m3XNmf-Aa[1(V%BMM
kjbXYjKK'(hd(fH,S,aE$b9aeN[UY1Yk!c5dd'#BB$,-0re@rb-kpBM&FV999cTF
Y[ID6)McmQk)m-[14rNV6a['cYi0HIbYT5TqJG2c%P`)#P*m+TR45CQ$cRL-lQ$9
6q8ijU'c,[+$m6$EQ-,(G9'@&HPEPhRr2+e5-`e-ArP,MCrXTZFrP"!DF63qfh!X
-#0RI2LFS4$%4Zc0!f4,J$Em%0!eS(46b'p#I"$3*qM0)kD#)bMY0a$JPAaN"PIF
TdBi3+'`IQ"QFFb3N5+N-8VCQ+[455&r1rrT`qVed!KJ!!"dI384$8J-!-Xi293e
P04%!)Q2Z8lqf,mfM[)R28V1CQ%NHQ9+H*8NV&pJFB+4T#MkDhU3f%D-h"hXeY#b
63$H$Z4`[4a[bq4S#1T&aCh$1V)[Zl!ib*%4QPi-XaeXBR2@UCcB`U)b(kf"`&Gh
)F&J1'jN-rIlphQ[64QD1ZhI[jamETLF&3C!!"%%3")"SIaIQ)p%SARc,,$0"Z4R
BPrcVf!kYrCaT1bma+BR[-QHF19HKiR#D2aa,D6Yml5Gdhl)#*"SiTJU@-F%8Rr0
l6TMTSe,qB&Xj,Rj)"1iM!NrIcLS,HdimABQ2B[RMFIRM,KM%C-11C2**H-M%&1#
A-aDHRSU-8eT"*k-,42LP`QLJBN5l*cAq(*rqlE$MlpXFE@58kVRMSq)YZ@QZEBS
j$RFkb&3BrAlRD+"U)3h,GFB'&V58QAZ(YG2FSjf%c8IqHHq@k@IR9r*$XdeRB4D
Ck51cA29PD2LaK+q1Ubl[X+#fV9m4'[@+ahLiAfh$pa#Vq$%4XPaK&A--3"'i@NF
[020%DS`NLjaF4GUQC*Tp6,Z5l--iBV#2VlhU1-C(1efLcq&G+$LX,fm5USeKBK%
cK1'),cmqE-3-BSJ,!&JmlrHeZEU66c'#ELp-3DU$ImdVaK2KZ1`dNJAmDh#)b8h
aa'LRP`4d3cLNRfQXih(rEiVdl,'KPXRJ5!aCTpZTrZY`5Y2G5&B&R3NNl3cGPpj
3CSUB3R-,4K`#PYIMr$e`EciU5)I`*iK82U3I419Fl'"U&$Ek"*C4UF'B+&Hi-lS
ZJ%,XKTM9VL4K%0`bDl5$d+X5S@hG50DYHp(VG*iTI[(fq[*iFC[#pBNPUEIlRPr
Rd1F-Z,4dBJGGDi%qm@%HR@#"DdY%R'hkClqL5@b$I9jG9ef6-(`Ia(D[dJH3!-)
D4!*VBXNIBLT$P*ZqAUpE[ji+1Gh,YR)4e4&+2`DhFQ-iZ6i`TZTAN!$Q5`B[VFI
eDS9`,4alCY@`"ap`j@c9#K"!%b-f"K$$kd%D6!e[BBJdNMdq!c5h!i"N#Kd1jGq
G94dY!c#'kVEmJ$,`68R''-Q8DD-G`@%lJZiX3F'DP(Cl+FH'U@b,bL@fiBq2`Bb
&4"N5VD0N$(S&5(8jjVLrEE5cl#AphBZU)d#AkZDV!Pj4(`q[A29LL6Jm(KC6im&
$rp&fC'&B`C!!9(T)plXAK98[-YCN!pDVcLM-diIYcG28F#p%1XPeKC)fA(h[hj5
"e'JqHIXYE0!lkeTFERC)Qp1fICJq66r6I5M-j(*X(dBkB$HPDYk#+QNQj)J*0XP
-,5e4cX"'!LNG9IrB*3kr@f[SLHSVM&'Udp$p5rlLTirL#LUKL$+3!"FI[UAEr*5
HjK"5h)eY-HjdV`e)+5pp[,KP"$CN)+9Dh)E"-NVQ"Va#DP$h$IY#erU[kH)(hAN
rMMDG'NfeV,r#N8,9Yp5+%ML$JI98Q#DNK&,f1KcGTL%P'!KKF*d0q3%T"C&fM!c
Xl2!Dc'c"JB*NQZ!+cie,5BCdLQ%1Tm5$5UCm5LCF,ihQaV9-HfZ&Z"4T"*!!("q
`%6P&)[r[eFZYDb(&M)dkQ5lQK(j-+68LLGF%*6(Sii0pVNPpjDMr,ja),"9mf$4
Flc0l'H+K3bXS6!cd3Md4iKhM)SK84Q`3CieSTB6)VQP+5QSREAG$8+fFE53"j6,
Ea&#IB+Y1Mf#3!$YDJ#&Zel32S((*aiY!LG[Za1!#DN5NfGrZJjL#K"iRT+QP)qN
9lHH!,QBS""&TGjLGS9JfN!$lA9b(QeCJ!@jaPT!!!42$&BiN*dqBIJC3Y'-lTpr
Z)fDDB"HZf-daY4#NiY96F2dq0`$5Th0$ZaeEKZVQDjX!kMD[!!H(BlAN@1#JcAC
,9(`8`X4K6*5mh244L#BDQqS@0k,EhQ'Z@k-2I44D"SFcLlk4Jj5HkPk&e1$Pr*1
T2h)(&29N$MP!'*-0q4SH1'E$4LUSZld`Rk@Hc&ZTEjB1p2Fp3k"lEdN+bD`P*IK
j*ar-lG)b5hG`8E[R*`&#RK%FTLQNECSDDKV8pLjU@a6`lp0%)*M(k6iA!+Y$ZfI
,$R5cQbjeDTZk%dZ(QS,D2CZ(QLjV'llSr+)0AIC,p(ImTIX2PAA1DFf*@UDi3`q
qLc!0[+jc"be6r#*cHGM&MJlkp5#!Nha[bG#6,2&GX-4(L54XI02C5SK%3h82ZK3
Pb*5('fDI)C52%Hiq2m)3SCC5La!C#lC1j*m-+rQNc'JM4VdA16-hb&Za[[HrmJ5
%'#ZD@DAZUfLrkXVRKYU[EKPU2bC[D,1TUDjr1DEUCRVZU,Zbj-rBUeB'lf&+l5f
9`L!B3NE%mq1c6BmYmTPCTcHCGDlpZXA(QH)fJ+J[!-8(JHa*Plm`XEbhl[8GPVV
#jGHab2(Si4eDA6mYiccc34J&,LB-eC@8#jNflb5&+NMN#KBh)1F*pSChfLF'SaZ
JDR3'b!dB-$BpX)rlaPeN0#0(F*,hpf(`&`d4PUSQ&#IId1iM#,1C&kbSQmp#*%k
H%6"J5Bk3!&p@1U'qr9S1$"%$,$m%JE28b84rH(*XNCQf(Q)h3K(f)#Ak(4MMHql
)&'XK)JC#rdP$dK8F46"YT#SYMa5k"4FbS3Rb*6ZQ+Kdcc"-@L3fLKFR(CrT``5d
iP1$c5!FcEB5KX'iQI553!%MF+kNafNCb,cr06GCE'4kM59)*!%[MFV2ep'"IqU,
93U9f-KUP6b6A*c$SPbNYiYlqBi33Y0'@B2[0#!G3i@Kj#Th,lL2K3ULGP4L%m!X
Nac&dHaLTdA[42)#KmXQ!ph%&CKaGe-aD"KZHSbCDJ@F1*q8Q,qfJe2(A'aNiDPf
e4*a!XVbhr@UiL+&SEi0MmHK*J#B*d*!!5A3$8reVeebDk82#*Uhd&kG6X%ASG00
+4RP5AqRGAe8#PEpB9[N)1XV844HR3d'DHDU+UD%,[P0FFldq)%B1XNY##H(UGpT
['P$6jl1jRJF)-"eC@A,NahpNQlJD2fZFI2XIS)*e)S&VVS(KGM9)E'p!3P*XP`L
pdbRFe4hDl8,19"Hpe(0mG3G%`d@rSUlRPkB,d3p3L$Sq+%@$M5iF3T!!`PhbiBb
X!Tf#`[4S'8Trl`Pi8mfak0F&fe%*V4'3!*DYD&iTqCUqa&ed#68V1P1Kq'U$3pb
0SK#`DU3!`*T6PF9[l[P+#T`%2Xk[+K-T5rr06rD@G!ZlY%"cA'[jZCQkq!YM%&I
MZ4(Z3!-65TM%J'Ld[Dh%3qa(jVe@m`q2[VUC$8UQ"e@N-'JD"fd`D"4Gm0(-"3m
0H[ha6aiT-I*aj9+U*Gca$ipkaIjEiF(mVM`FZUqrIYMbhE[d-f@"`rAdee9II1f
*J1jlqG&KSkcYm$AkklSfVrk*YMf"+L(L*T%r'X[lqQq&qX*3HaT#6H!U8Y``!9T
HIY3T[TpjR8FRUlF469LT-@L-pZ35Z,4U@Q4D*&@UjUHCcUmdH'5SI6k)r4jTZ(h
fSK5Fpk&JlhhrM[D-&`McQ&2,K&9b"C[Dpd)G#8ZjT-Vi'UQ$1i(%VS`FSY2)G-`
"%A(eqC8#,B)`LqJTHF&+9#kD+YSI0M@eGrNX$#ApcZ5Q[ARHFmIlHL4Ri'U*(QR
B39eb6SRNa!8+Y00Q6NP$HF)iRjY5*E,Zq5!f&Vi)Bd@UQS6KSf($q1Qpfma*j$2
c$lV4D0AYQ2,@j)eQCXJC4aK'UFH-MNkqH#NX2$X!e[BbS*[E6XaE3q)!%D"Q2SV
0'J@93Sj1lf&CU4G9@Eie3#''!LLk1'`Ff"i!D(DBflY#F0N6U9Je-Y6HjHMJr0-
Sd-qM**!!QYdmkFKjC"Ee3Y(5cAkHZk+$%HLdK-Mm#mL%,j+VA*9FBJ9AfarHI-b
2Y-rYpDQ+pKX2CF)M8%GBf%9#MiKJ(+#iPVQp(THmX5b$CL`)P!9Sq#J)6L@T)e)
$N!$'SkiI,X@fUpF6[+4EY`9E-16%ajd'9eZSD&3N)a#@(b[kD90l@ApI"AH8&A)
#$daIC4)+1BS9TV4!i[N5pp5iaa+eSGM@rI@$6eV%1kB3'&ZKZU)-,1iX@0`!9Bk
aQEfUG2(q[M"hG+H(2#d0q63lj02fKcd@h[1RZ@a-ZZciRfDVBb519f+lFeEE2Id
Vj`b2VPl!KTGmGF1adC9EbQHiIZB[YqP,Ne68djZ1G2pUL$lSFQ#L#$b2,QEdQAf
*Eerik`G&lTQBdAY(CQ(Zh4UZCHM#0medY6[CiIkG"RL#k15lHA[,IN%[E@c4-Q4
5LNCr%JL,-GY2AL4N(@DZ5i'4a0Uf+R&R4mAcqRL`Nj!!G4K)1kcYDMGi84TT"5Z
Nl5lNDLHEF$c(4bhH(iCj34iJ22(3Mr*i2AK2cR*[IIarBQS0TP4liAFj4*A-['1
*R'RB),#DR'-LIKc[VST'alLHZ,eq@FCTQ*b'5"8*m-cKS!TM-f3fS3'EB-8Qb'a
&$GL+V0L+C$Dp!CYZaDE,E%S$0X@+6C(CFJhBFPCX1CPYUJ(EP"AE9-L8FdKElLQ
Si+[RTDZPBP9U`F!,QUUC+Uj@Gei$14)!BH3JXD"fGZhI,Ab1lq1&r#3&XY9+NhN
cZY,"qc['NN,T89PFFBdePfSY8X1I80`VlZ2KN9b[8fqXhjGiS)kQpNp#h),3'%&
6JHIlqb*TdD1B1ScqQU#&8+hp9X8[)-j8fRHS&0*pmY1l@L#XRbh+DIcShRfI$YY
1A0[3NF`9mD1E4X5lAlMDpKbFKkpYk*5F-FrG,phIGK,1BqS6lfeSPGc+q0dhcc&
@8ir@Nf8@Xmca"6%I+i,ELPQhRC`mX9e!GhXd`aJ$ZQK[Z%LR)XKm#U!*@D@6Hbi
"m8)i8)%1VPGALqX92KG"4LUrVBjrl(IFHceY2"&iaAeN-P"8++*Ycmkr$dCBA5@
"L5NeRZp*ETPd5-CTP9i`$GbfLJqXFX`CbU#"P*NhYf89a)Nj@eCa199`#JUVeG@
GkidCk0*[r1V2Aa#MUhei3B9""B9K0T!!KM,8#P`8jl"0(%Qc1f!3`BZa&c4N[q#
B`mYZ5NYjImkF10JFEPqJ#5a!TBVfq`SC+QNCaC`hS`R9D+HdK#VcCeGmE8eI8AT
#4BB8R!3U'-XUfZFrRe-jc2Qj+NIZZVfbrqqNQ%ZeHr4aNBB1-!,M5$kIb#ehH'D
r!6XA!UIj0'aD*Aa*d%+*RYYD96,Pc"ZeVqjP&43Y9YdTG```c`ClDE0ZDjhNDAE
VEJ(XpFq92J,f`8kDHTK0[89(3TJj0LeZ6d4bHVZb5rZH1dq$bpe!53c[BX2rkfF
GVN+*"c"YZbd`b5Nj9E6&clA@B#qaS#$beDGJ0,ZjRr0@4AfMe@PmNYRr5Ylh*ld
`Q0L#jR,a6`*&q"`dPa[5jf9cZ5TppT[,"HRc&A0jA2UF-CFA5CmAcH@6p2R-hh!
p*#hA@V'GK@V@jhd2CK3eE0!brEH#kHNE%IIjV-Rj'i28U,8bIE[*9(MpMNe3--!
383Y!l%a+!RU"-e4$K04H[Tj8cC'VqB(Ua"#-*9-X@FM38P*a-3UBj[aHCCb1[CB
Ufe2qZEK5r2Xj,Keq,MY+d(cEMi%dSJ5'Z6*!Q013!!!b9`B0FkS5D1E+3'*133,
5A"PFc"QA`$9A"Kac&NQ!QbZ$N!!j*krI55!NT3%JmHM&cEfkqarV8rk(S*E#D[V
+8+jTTLk@8*8"Z8D9!FR--a&aH$q56ccq@jdec(M!eHddC`kjN!"-%Rjlm[aGKak
i@4qJ5NTmS+B9iS(cr&lQ'(BmF1e3)*A3pk2KG%Jr#V-rUF(j91!91H9ZqX+d$G2
LNVF9I[dacT12Sq#,q5",dP5ZZh@%ml2ka,)IVDZR!ZMEbP@![BZDD0e'2XC9Q-@
r9Sbd#!bQPFpaaICfkdKTI[cHeM+Bbp%a`TJV2Eb5eeBe(UPGp30Z)$d[a'c"cV#
Sf%CEelDq@[c64l'FarF$,RV&-$d+%ecfkhI`!0+Ahp9h8$!iR4VTTSRqHU8qE'"
"X#S"V3TQ`N%BFafcRh$qe)B8@Y@&2&BDBZC!"'M+EKr-ck%q9c25Z`AV1Pq[4E$
Sp!-6!0"dKcQm%!dVkN"Y"qVe`@8C,+ZL#5mmP-(K4#pIACP'jpIk!%DMHcZ!"HA
$Q[TZrDfF))A'`c`QSkh!`S2cTbK8h+A1fC@c5DP09`kTee0)R#1mRDif+IJZKIU
m"Kk9LZ,3#fPbIBJ,"'*A"UjeG#fQqRB"p,mS0ZH@FdRj,5,V2Pj6D29T2-6lSGe
1Sib%i+5rNeK[%HpJU5XeI-&CbckmXZ1L-mNq,XXIXc,$&GRa[,1CIFb4"h6,$(R
jBfb'AN#q(!`&rmJ5(Qc#`ij#Ke3"&S6kTidI!*bBLh!M8b!Gi+bJmGNhm3V3kbL
V('89(k[i@'@#95B#e9e80e"@IdBjcDGd5Rk'jJK!d6e85IRrkJ5RN!"R'b3CJ-a
ff08pKBF[#MhjCk$-LNBSA&h-G,KJb0JBj2TVYdClbrcCG)LMkV"c)02TLK8+*d[
CN!"*0X5')H*V0IP,''!TQj!!'SFBB+XUdePbC5@fG@UPcJY,XdX)Ep5m9J0KLU(
If+'C2UZPa+TcqM-V"R%%IkKqq*NrD(bP$M41)aQTbh`%!J@3!!E5'PFCkRYIFE3
3NMP,G`BZU$U8-4ASCCN`'0m)T+Xp*lLHdJ$SZ*Cj1q"+iQFD+YHQ"E3-8ka[j[!
)Mfj)&6dTID3`1(@+6chdSqa3!6r03Y*ZB,$KX,4aJ-a43(Ie1rq(ma8hSY&G,&4
Ja3f&d&rejTQCK`#a3B(C%kNd'I(*K1ZpRkSMAiER!A6aELi9T$6#ffUU%Glf,"$
HMeF0AjAJLBm5"BkJBirMF1+3!1eCpTHhEFE,QeI*F+Vh$[q46rhk"(G%cZ$K+Fp
XSi6)-)j`QiQBN!!%kN8ap%LA'pMQNe+N43XBlTjYR1Q6%CrE4'N*N!!3'3P(QJ3
4L(#pYq'#MRQ+UPX8N!$m(8L1B0%m%J`a"3([im-f'Lc1qeh'el)rqINp4"U21&f
CE4aYQHQlF&`ZMYcaJU+b*5hf5bVQV$0lN!!mccVGDHG)YE-flBaakq9aIH9EAN(
0UhLXURF)!)(C&36YVk+EPaf2VQ%J-,)JU%f$)&'FhTDre2",E--F#pb`R(bTfXp
!9YT)q8#*PE3YhqT#LUCEj1fUaABP[`)`p`)"*LP1Q'EckQG$%M,$m$SlT(3h116
`riY3IaSp[CmF4lVqQ&cYei&dblUi)`m!3'8D#(FS8S4e2i#4fV24creK0lZq12[
&6"p6k(P'B$-+iiL9@UrGG4bD#)9D+UjkUGbGmB**%cYZ3Gckm4L"%[KU)8p0K)G
C4ab6a4SLF%ifeP259S$idb*e)cX$&3[YMH9iJ)!PMP1R%EEIKp3H$Gi@2JdP3Jp
AS*Skj3ZJ8rG3C5-HKHdKd@@V&V+Ec*(cicXKI$c"TJhke+#U@LQY*$PET5%E-h3
Y#UqRUQ+5$LX*Sp4pN3$Q2m%VZHSrJ9KmCACCqU&Sq3%@JF,,@4J,KZU$5"a-2G5
&!`$Jkrr),9c%bmm02!`ECjdAYJ6E)dB-DFKk5J$'l4kB2NI'IK)NF+QV!+&C9Te
edDX3'Mc5"5%U@'#UrL@#ckiLP"E*RqJ0&SJf(dQ0VP!pa#@03XQNDUKH-I5YI)S
HP58#hp(Q)+PR*f4-[Q@Zd&h0)Nc$&8@SU+lNU0NeKKp(f*!!PE@3!"eqLSD(-rT
JhT)II4$U$8F8Z@Ap+0H!'2le%c`8&[%CXVmHVR+9,M)8UVjNRPeb#*d3d1HEA5k
-#j@iAQ'AQd%Pj(,MBN(mA!Q2dH2BqLJV*$&ZX8FdVbRF(GQ9GNZ)J66V,JC@eN@
[[db-f3-Q'ab3!%Ih+D-4YAS!$SbV2YM&hIQYA0YiLMBA,f`Z""q%+e+hb5iGBaH
BeLF)p"XK9S*"SiFJSZI`+,B3CJiSQh0XdU+(J"!H))4d,CKbdSQ2,`[iS2CY2#h
$Y@p(k6(&h5"I`PG'p[0"EXDVRe[`QZ%DAQ(ZMhc+51aCi-$qp%$6EQl"MiDIl"!
TI3*P$F5,#)5NXif5@!)a`3#kF9FF,i05LUbJa2VlX-8FJ9&aK!Qme@fH,DELiZ5
0ZlQ+`$"m$N2`HlP0$dJ&5Bp`YAJhMp-N+JDQK@9@did0TUA"+!k3!'r,Z4,KN`L
HJDK#BP,Cc4*2mD&IYrKDACk&KajX#4m(3j%V53bB&1FG`T4iS#CmPN3N4VB0aU!
L9X5k@#-)KG(hKGI`EF1rKH$m-"R8k2JM!P521$5)!JAa,0Ve,-`82hhd`#dph4L
"!ZX)(,LTHkSGpB%$,qMZDXI0J1iq8*mb(rJH#BYTp`Z"!brY41MSkbUp[+CeH)6
Ub%TRSLC!BEmS&*App5b8[M8b!J8a3N&i8+))I08S,)E!rTrdB"XD9[-9JG4'm*E
6r0mbD'5qMU!BJ39k#IU,+kiMD+f1rY%"(('pCB@P@Xb8'ZDNALKSV1SB#qFPX`r
!`CDi3%-*JDZk-9'%RcJQip)NT5iMER+N"la$c*2SbMS@0)RL*q+(bdKcJ6'r3NY
8VIaXj"G!3JNAIC1,#1PJ4%)R3Vr03"@(LCm2Zm[Ubkk9L%D'$lca#%!-P*13!+)
Dr6*fk)H+`&!c`X9f),6,Fd4!S!dj$$J3'PGb!imR[iNJd6H"FJBaBN(eLpf%YLk
M3L4fBQ&,S3K4JE"$GS1@-XK!k(&'D8+D6TY0b,MUG43Ld'rf%c3'lN,L`ZM[mdl
lF039A9j*CCR3i#,KZfZf-Ab[lUXfS%42X+!UZHX&J@+SXpTd&jIDJqTUUc"2Z(H
dIm8e2pfaqri(1Y-0GTeU!IXFT%r@UIkH1R[QA',IUDC*XNZXUkk5ZXdQ[5[qId"
50A+e9DSbXdA6YX85m2!5ZE&$flDB!-L8`K39H'8r(LlEch96)d,V9!SrB+VccC4
&L'I9FFMl5[!@TEaP4krABH@ih-"4k&9d5l-Jf+T*Z'VYUV(UKE#XV2LCXA+&#rr
i"8'6-'3NNX*60*'FeYUB-Gk3!)-5hK55bDI)5G-)b,SL6'G*Vr!LP4JZdQhPENR
NP)E2#cL,j`Ab#DPK*V2H6`IA@p*AX5*ceVVU5hUcbqIp`9[8Y39V'J!PD8HH3!5
'jU6GXAZVL9J"cjlTXM63MY6PkQ&@j+a"'[5Q*+**Q``Zr+q!X1#c9B0D[T!!0GY
pDH,Tm$IRC3TGcrX3Z1'QKh4YcAQY[fr(a2Xm(C*C(I#')82[)cA1YpUM[ZcFeS"
TC`2(A3dFMk3G8YL1(DP-&VRKB'&H61'bB&fC+8(*q@3i1bQ("UG*90+dIC!!#"k
kY@ADbXmFf*jf1fei4&SpGJBT%4D`,E6C$i#C$1%9bhC5j@-+BR@B&'kcCf(ZK&A
!ZF+Y`Q+TU8r#,Nb(FIccT&6HJhqIT1H[SpL*bRA&%l1YDhR9SB`M1&NP8Ce-Q3P
MQN3a`59#q0844QGEb9N3eK@[q[2@"rHZlq8T#)XkR!DFSUrP`VUFacS%9Q!"ZG5
Xm&&)XMIPKhQe1CG%U-XDAa"TMb3kRd@4JlUI3[S4"P4X9hR%VV,AV[+4A@@GA@9
2hMpc#eI1jAI`e-ikhPb#"h*i-il6c"la2JJcaPUqTCQ#9T2XD%9!dPSdZ1M"+RT
S[IQ$lShia(%RIN&Ki)Cp!%rkRbQFj-e*Ai`RA&8`J0[`8B+U!b'Y0Qqc#Cm4,)m
IIAEY2afkcFaYS6i`8'%JGSGh$RAfAR8)bh)"Va52`mbJ%rVSrQA(H4bLT#U&e2a
6-361e-N%A9B3lF0T*#'!"8q$X9K!Z#-+c0Ir`h3+KkA2[Hae9[H4S#&e,5LU(mr
qQHAJXmhI-2A8G0Ed[[fpbXmrD1fXHBR#2YriYkG2EqTCfl[9[!eemqbcrpIFEcj
VEZhSZHrCGhS@rI2G[cl`lBFIq0hLaB[rpMFp1lrmUl-G(llBmLqIIpIFrR6MhjS
[2,h(r,fR'mepYfS@IIr$ccmhrldjF2br($jVR[QEhj`erqpIhVVfC5-!!$`1384
$8J-!D53393YXT`$4A*IrZmplXfafiKVA0)3dZ5c,GSR*CJQ5559Sh-5iVKQ6VUN
0iXM@d9dV5G`MRTc8VmIZ*P'M@*U+YCEK-1)`0!S*5@!XNcV1BM-JBMN4V-qR$V8
J)+,L"#ZTD2Epr1qpqla41X`jhqF('k5R+#H#)(J5f59HhZPfimAre#`BJ(jj&j5
VH'N`aQ'5,(Z`hfGY!UT8QKD)Lp'r#q06&C-!fEC*qbHpP,+)TdTI%B[%8j+a4cC
N*@f9%-E8NF(QiKEhr1GM2ZYhdbjmk"F0l3'RD)')*RN`'&,`iiF``cET6CM!*(+
B5m+!$M0$cT1Nr2QUmM90%G&cX!L+j`AE3-LXUH2UDHq!F[V6JQ"!*'2IFhGc2m3
MLRK1R-89d45+aQB"9+K'VSEepArd5YF$%kLcP+f*0km)4(fRM,kIV!SjEG'3!!E
GQX4$h&mqLr[hqhfRp29V[CBLI@4'X'S0%JGYk$CNHLV0HT3VamZqeb@fZa#&k+3
FR86d1KDGG'&iD2KG!dJD89@B-%Hi(aX@eYcYR[Y8QNBjl5A'IUmNe3l6UXIeDpH
[jH35[CX8Be`NSkHdQ&GX$m9T14KZFKa*Y1"%*(8ZH@Jd%&c`lHMQUR-k9lm6Nb3
$YF1-*Sj`3deqe&+9(l@0NZ#+TX&T`*YMlBKijR8BP22E%0Q0,(A()@Zq4Sb$1!D
%!lCkBpa9PUmaMM4&L1(bdA@k"KbX%BCS2jU(F59Z(9%!+TEI4+GaeQQpEUH53C1
h0S`9qhNmpar%pYG(mhH`b!'Y5+HY1!6!"'0F&!B&(D*Xm"c%Y'Kk9Qm@jkp+cFb
SLbCENpm'4'D[$3-**4YUmL'8@6jBQNB$3k3QG%1,%,[rhmP#CpSC@%J$YIm1BPK
T'VC[F@%JC1i9-J3XMmcSU5S`HSjbIYlEbh@R4+CJC,BN"SK!Mdc(*M,'YYf`'$l
b+mHIJ&(EKRm0Eq%qD#e$h'@VqhYEi%J60aV32"@S3c1&CRp!4,-$cIm)Y+)jJ1E
aJ!R01*TT!Am6`+AZ`1a%S`()J,PM-4KP#Y8e1909q5EI+CMMqJ$SR1*!q4[lr5R
EZBfH'9*NB$%4C1T['0#),pA4-kbMrLBR@'k5ZcNL3Y3!P#`Hk$683A9$8'(pe1U
&U+1Ha,lPPE`q%%hCM#DGCGD,Y5&Pb8Xe-b-G*IVqjMNJ&Mb+e`#2I`"M!-a0Y[6
#p%)J3Uf'-Ej&h2UYLHljKUd!jA@m0FB(alKlkUJBY346YVAH!rGLQc6)T1YeHHN
jZX"3[eKhB6)lB('6ECDD$,8fe+R*KN2UfmI,lZp*mI5d825j2M@*a(U@@,p8BMd
5"eML`&+*!f+G4#BDEQ,%%QK*eDRR3mi'Ml!j*QhZ9FrEK`K4(c01m55!5cBDp3L
k3Ij1"5VlFKY(S$N3L#-SclCk3h,$U)KMERIAr3j5T##Ic0qBR[8%ck('Y4JIaA&
1FQb+NKJBCMQ6-5kHYZabD3lQfI+!J(V#6dm)"KE(r*Z+aHM"BQ5[H[&dk5jAMr3
CU0"lKS1L(pYC%Pf92J-9-8%XNNhN)c$A1Z*jPKRJGZZjk4"[jrld0*MErfMNR[-
%$LNcIR!&Y[&1HR')3$3!rKp!q#qHbLN-fblYNU)X`5RQq#(HaRfK1*m&'`YAPGB
9k06$a9!,Dl`9'Y"hGANN!3M,HZU0-$D2kQaq#j1NaYF"kJB8TLTk3L*@T&4-[#A
Zi@d"*iXka&8@U9!N@e5NMP`i'$SF!&e42!8'qipR[0C"4`%8i4!2dr*ZGhQ#d"Y
TND$fY5`bZ$9[G&c*@[V+++iB$R%I*5eM8hPkVj3N)NQciZSS4*ZY&-'$,-+)#%8
rQTLP+[%9'+kLMp-('+G+Qr@L)d,DV''ELD%U2U2dqGa$[&&0iM@SeZ0e5ah!Uep
Ya5YGEB&$KU)5@(i9%4I8mhL9UXIa-UU@$ai#2R3GVeje$+q!HJ'[rHSSAMCe%*Z
ke5'm8USCVcUe%Ce&9"+jMl,$2AUe'FEU@DU,I6jN(A@01MicBDi@2USF6I-IV)Q
MUT9p0&$6b2PF0M"Db-8@kPBET3()b`d#U8KC4khH$dEC!'2U++,Uj#JASUV9hKd
dP@i`h`$jSh[(U(S!AHAiM5%A'TImqfPLrK1D&AlZAVCMe*r*1Qm,Y6#fah'pbPp
P9(CFiAjr&6j2q"r5k`RTIfl8Rb@a,'4c-#fJRUFMN6T6VmZGGFM(3YdpT$iJGDF
qJ-mrU8p*hAA0mZprEP5p"%#Tm9a&9eQH*Vc#RK%5)!V!eIfUM-`2A1%3FErVUR5
[-YG3d#jPb5G+!"TDA*T2N!"9hBpIA15qBe,c)!%PaH!a`YI'YLIJP0#!hedf%`U
Jk'FMJ4$SqHiCF!p*VJ1S"c)qJ9eHHBX(H0XX)1-E3HkET'jV$VJAN8P8iHk+6dM
i2Bq3!(F-C9X-5,XB"FTI89jd,#PkHSU"EP9F89PRrPZdc#,h#h#5@"3lGASa$iZ
R,QlKi9KmmL[SSKa,Xq@aA-A85RHjl4`@0f2l#kBhrJjr)H8Q3%aEKqd3Mi6LYmD
ki%669Xm)*JT%eiNI$Aj-q+(NqieF@BLJZcAN!ZKX46Be8$EGd8ZI!#U9lMN0h!V
L!1*rL#YAZlS5$9a[`'%Nm9-2-3-$dcXZ)a1(2hN)L[rR,VbXp#0hjLbKchp(Cc%
NL`!4-(AUJ)J`'r$[-1"4U31BAqCN+Fbai&hRLc`+3SN!T$l%ikU#P`,!LKIhJqb
5,$2AUbei$E#XhXUbHJZbHTCl!L1P6J$H1Pd%"`(2a0"B$FM,RDYhPlr)`i'N!$U
0cELBbi""LJ'$1NEBC[9kqVj,qr6eki*6JmBE5!Lcj"4,4M#iJc*E+9iekP-lf!@
m'Y3([Rp8,AAr'U*XGYMkqUj#L2aYIIHT4KbGfIhV+@B+q0A5Ur9GLG6S9K)(6&R
hbY4AE#$[3-UQ"-*!5)"'PKG9041K#F38i*'"'%J*j$,(!15&R(`U*X'JXkSd,94
28@*Fl)HaCp88-hfQV&XR1MS1Sq01L)'$0mCe'TdQG)UXkd(@[DTA`kB*3+phA&*
&TM#,1pk1UrJ-Xmm`I4SeBRr1[Jr5X89UK%Z,RbS5ScdiI'4URqfS'Jk"9!eeUYJ
e5r8K-XBq`b!'40iH6&f%F1fGGBQYGde0X+41C*f-F24-TAX#NUB9")m4NF`amQJ
(P0KT)*'-c&%d-hSUhG05Sf$EUc5pVAH*Y4Z1UTeXQL+Qf@%VbKSh5FmfBC*dk&i
FZTb"+c3$Tlh)2Ud(b3RV'IBUSCIICZ6q9c&KS$jH"#XQKJ3&iVL%)B'`j'#-MXY
8",BdhQJCYfK!@"6--Q(3Lhk,b`!)Fp`9-SY01+lqJlY%ca6c`AfTIYX+)C0lkM#
GLB%@&Y4"I"[55!('e8EQ5P0K923qDK$JQ-'b$N`iFic+cDdBh+*")"V)Z(jN6cp
-&A-Sikk8-TSIl2F8"#Q3!"DbS(pDNkV2PP!&)!V0FXC"CJh*ML*!Li#UlqK6Uk'
B&c*50T-6$rdc)RHbb!Y#*"Xm9bmjKXr9G'3FRpq)9i`&2pAq%j4Pr%FTbrJISJ$
,RiRAerkUeMVr89cTC&dh8YIqUjJqQ!691rja4m)Ad9%`!ZqJJp"(L8(fie$AdA%
BNbaK$L@#qHMFXeFITDjjjFGf2CYe,6Uk&XGeI9MZ@PbUDa&Gjbc9XF)k(Q2GeMZ
kV4rAE8cZYRj*h6)Jhfa$4b[C-CZ1Cbbl,K[15ME!HBSG"&4+"2aK!!5r@1H
jfP9)J6K3rZ1K$V(1Rb8%`XCkh5hU*3C!b(d94"ki3YP%3N8$6S#ZESDF)Y#KMp0
H)K)!f#qD1B+Z944!@iqU#K$&9GF!b"TUdIcLH-D+e9C[LK-a,QUdGiJ"Y`Bk!"D
rJ2NP5ZDA82d1A&#l+9MA!,@Ql-AGaa35PR)h6-UV`VDc,02Xk)0UM1@JA*[GUij
R,0J'4cFSei&i3aXqejHQ5F'h('4RZ@I)'E6A%0%a&Yj"*JT5GE94#"JQ@2!1"QD
&VK-b)0SZE[&I"F"G4!$FAa@UPd((`(FaE'-V!43p"d*e&!G(,LB9p#%Y,c!EJ+#
#$$,58@1CXcL-5k&5B3(9+#bJ2["a#kLPpJA88Q%"p4)!V@Am!PSXk(8``'-hBlL
YK'""A-eF1FK*#@BbCj2EYMG8ea#j&Qe3MQFXr$aP&@Ya@&!`a91Nb[EG6STXH"d
TXSd3UF1`b6e$R9$e6RmKYQ(302MN0`QJAJ#3!*N(ef@P#FL-Ib%-keF[5Q+DQhS
p"RZB$@q['!(Ld)b)3L4ICmcKrJPkG9S34c'$b!Sr%`#X+"$YBH3MKJCd2Jf#QaJ
!9N`Ri5fYE9rVE!0BXa9"FG"hR53LaZ*hd!FCF2'c'"([LphPZIcmcLJ@Iaq(9'#
P(bK00!9*EDTpA&FY3J2#i0VE`DcQKNK$8SViei*"cK3MTi`HQaU5C1KHRMI),k8
Y"5+iZXS&K4d!Em)[lrV9HR6b&,+j$mBC-h9,9qGZ'H6)i%qa$%6QQJiS04[P)*c
cc3L!466@I6IY@K3Gj"`[UhMFd#i&b*MB2Q5CI@5)69R*($EBRT-@F#%cl6Xf4PG
J!&0"8Mik%M)X9T32YJI#FQIl'PBJDXeJZl!9RG%#j6!1p`AfAd!J(cU,TGTd&iT
pTi9L(l13!20M&m,83cF2Faa,1Rlkm3-#$CR&8f4!0Uq!%E3@@kI$!0S2Xf5Vf%m
*06RZG#5Cj#3VBkUC'Zjdr23hY%N-ENLfNmQ#NIkL-ic`B`LX6dfU)a-R1UYM$(F
b*i0Am#''Q[%KL[X3e0HbV@r+@pm%5d4NT3i!T"KP)J$XT*5Y#"3ZH*p-)C3G"A!
NQH$)P)6"1-P-5Mm0GAbrB"#"cf81!1XS+6rcABb`a)#*NLKU`H,d0&fM'TNa'(L
$fBe-+-J+$T8"f41#%l@a5BpAGC1"1VMhB4XR-bN,)Z)5SVSk'!05)%EYKL!0$eN
S3S8L&4M9#4kdJ`5h-!&Qk&+ZF4J`fh#dF#QYEE9k9a-L-Q#-5mNkbm5"I!cSSSZ
PLGZ$Ua-bXNDJj3*qMZ2(D,`UCjpLH@!hp,l936D9CMB9#`X!qaR)2NSSpqUJmF+
i5qE5)Q2GZ-J@[BLYcR(48AhpkU$Sd68#N`QUF8`G&%rlAZ)DJhV`)M2F08[0`*`
hA9bMEE$#3CL-8FXZ5k&cC8M6V!QC0&%%Ihi@r'h4D+c"!EmeF@E8S!V'+&b0f#m
$3'ZN$JkH$$QEdBQ61[%lJY"0V*193LGeJNPV#MRk0VQrQpEjBI*XFcZmeH'-$P!
fK9@-J+X6#bkfSINSSLISie1-YhJSILhbpHq64Z-3UM%NKD-1`D3(T!-"*!jd5Zl
VlG'9[dqH49E9L8Bf5ZDf$,C,L86QJP1`HlUJe$2!,URe`h3GaViXpc#"U`XNT%#
dN8FHG54jNE6j!S3'N9ADJ6Y2`YN%#hE0iK3dcLGe2FSCLMaIp$!&[G,YKBTZGRY
lLLM`a$!VMQFm53(ZUTL9%!Q3!)Y*%JpFD-Hb*i!bV()[NS,5#k4qR6I02RJkjbd
%6+qQqQqUTKH[p[rjIr%NNXBFUQXpQ3+IBmSU%0dSL5A81[bBmG-)-Kb3!)98'Q1
,[K99&Z,XC6+DF%NMI$)%Ed"@iU-%+L)-DDFU*-Rde0e`3*mpeNk9$1J3*98l@ac
NdT&+*RYi-lZK'(,eFHQDH(IqA3(r6EJ5cTa-l[F(Gei18B83eYfA"K,%2!X!aIN
N!Ac'fSpG&JpqF!)CXN-mq&`kUQ1F`*5DpFN2SC`KkJ42mNkpjX0JjLfSV"fbS%#
j8Hd3&2M`Airr9UMNp6#0qRQ(N4S40"3T`[9VJ$-!b-IbB#lYZ*4QE(BGK8(R++G
'+hkFq1Q!S+-6,[Crqr(*D)3K(11L$3'clhM'ICXEa[lMe-kI5C1N+5,`UFB8Bm)
%aABX'8C9)L$@h%F!KiHRQ'NCANIf6YG4P6D2ZDlqlfpUXFU(EN419EY8HfIp)$R
m1@''Le%RZ*l#MimaqdqAql5kS*!$&ef)ZPhJUSqZdT8l,rmX8qY++`8H@TY6Y0N
@#89aT+pH8fC1"RVeHDUI'CVfJh!deUS*&iKiR["D[Gq%%D59hp4FL4)K'@1'L19
FmeF`J%6P,'fS-MNqIR"-4T,HjcB2$25S`N,#$hc!JSeZ,9!YRHMBE"Y06d0fZ$"
dL0q!bRNMGBLI4H)0,,qIP[D[SNrpfj+j#-Ml)Kc1rMS2SSTJ,YT2,Q+8C39cNAr
H"3V3`N#"0M+&p3BjC3#Na5m`C99GimKS&UL,"eP@bf&Cl4)RdfmTXY"qbN,[P8`
Hba!1LSjEcUb0P''K[KkmU[%QB%UmJHSiTSX,*[4BdbQ,d3q1B5+UJ$46%PKLd%i
)QIaer"lS[6!J'6[&r[4ppZ`M'8b3!+Ak5bQk8eqrB4BhXH9%+-YMXN(&*cG5%%D
C5S03bX`X523"c6IMXj&pTPJ!kD-!mMDK'c+9'q6VNY%PeMmQ%@G1--@ePSZ[4AI
iD@6QfS-K-Q9h8,D!N!"1fI'f`@ITNc*'M&09M)*Je8B58j%UYq51-K#pAlP!KT[
8FqGN80C"S)`*V5NJ)jG+GYbULG"AA49ZFh0TQJ6XCB4[@%EiB&D#Q"QLHm-HS2,
[fK'QqHF&K+PT1d-NFJ"FVIMTr5Bj!Pa!GmLSeUcjjbP3!ATCcBB"j)SK9"*LCF+
'klU)9F9'#E(5&NpD(c0T+"!qX'$#1c&*0+@jTC%&6'3)MIJ)eANYl-p2q"1XqXT
A,GckUHMI(*6%1Cm&Eh&C"09&e`dRqhmI0mL"iM!#43-kVSI3UH@(Ukj`@h'!424
FIGJ4!,j2dlM9MLU#*0Cr(iN[JcN$SIL(B23rFP9[MUDLiYLa1d849De@29m@,Q3
LplekMCFBI88FDkV55VbJ9eR5S$KfpFp9ZNNqSF)L!Xe926d+JK31Q'8kL8UJr*L
58C6T6d8D2*)l"`@EYpV&C!k%JECc)Ir$4@)5`eGR"$1hLdNb`AE!i50J5l8*9mM
p)j38a2(MV`4%E'fcGdlJ1b3(clF3221T0L98ca5XB4",Cqj[Q02(5hDM[3jU-,r
'!Q1+!8DbLJq,pNHK#0Y0,5d0Y3d5dV))J@M,C)!UG$+2`#6-m9%F`N5YT84jU6G
rZ-US`H8SL6UKbQeQ961K)#pj1ic18#&$6LhbIPmLEc*(Q%Tdb)#j,N%P*qFdM4N
,r'Vp,qqLB"f([ZD43R+h*#IRQqVaM%II!I%K@+INV'BSY(X!T,[KrT'aI@ri3,L
`0!h"`L#KcVLmAM$FM2aS)KaUM5hMA4fD%5$3&QI3!!G8S%B6aIJMj$bd8)`r5Be
KFL3#BM3-Tk-qE0L%!%K58b"1DBGLZ[e-#f@GT#d58'a4!2*LXCE8%kU+m*Hj+@Y
T'N8)a`i#IP8dX3fS`2#A06(DB0,DF"0GYD,lNSCD9'Z!8m5$hH3Z$4+BaLTBcQI
9A49bHC%(XSijAT2VqRET)T`J2S6#YaQJCM-FFc!X[QJ%6LcZ"*bG4Vp[F@qi5DV
NA,N$US)`MjQY0J")LH3SmL&BcS6@4fkU)icCaqVJ8$TAl0BB4MQ-T`05"NG9&Kb
'CEHPPcBe4KR)h)D&jc)30aH6K!-)Q*Bj`RfR8$ea(ZYXb$B3m"PJmLFJHbBSUU,
0!N0VcUiTCZGmlX92d0+Ad`ZNRlU@0aB%XbELZ%X0IE%iL3+f6D8$&`ridPR@'K9
2K@dL'6F('4!QeD%9)P!L%CrMdJfY5dQa@li%d`K8f$JC&EF9dk(K!`(kYK'iP'6
mYD+VXU*b-NJ@aL20B8k%bS,SE'3L9!RFcUQD,4$mE"Tf9XF)Cq#+qbm6L@lG"(!
k)"2T$9*20CV6#&TN-NhUIq3Y)MA5f$QH8#QD0V&,380[+XiFJ$e2&YCa4U,Rh&Y
J*-J1062R*K`XULK#lG`k&eHcL8#*$!fpa)5YCjG!PQX-[5*6YX+RTTLEF&JdJ@-
jp+VQ"i0d!(9U36#6SI3-DI)'8L`!8YNR'G*Y*2Lhl"+9RT-()IChY4cXYI5a3qb
cNdI@#h)'3!CCYk3-B)-!8miJkciR!5C&k'bSDmA86[mm0'BJYBXKF'f9)6-MIG-
e!Nm`H$b)bPf8E3+Y1!`hBpYdGr#6+ffS3JAAbGA%,"JULJ)GibrD4YP&cSZ0&XE
5ITEYjK,c'QTeXYeQ-Tq`E,G*kJ6CVVbZ234a6+#E%B@`F-+am&Qi[mjM*(%$PdZ
1CkbpA5)*+0-55GV)l%e1Q#$+#ib3!*1-N!"l@&9@ZKUMikH$A$Yeh'861d!EQBU
0rK%LI'BBA[Xj-9NLlV@jGZ*HqcB4plBk3e3A[B$V)(2XZFN4)-p5hjD$j!kDYZ[
AK#cmGFi3-qj"i"a&NMpe9(dEj!54M3R'2TkcRbA`MBLXS`Ym#h8%CE-&lM2"jkc
Ufp*a$V9,AA$[6I@+#RFFFUr*6C%4)bY9aih'%i)ja@%5mSa(A$Bf$NN'S@j#HE$
K+1ZQ8"TL`%!AB)6*JD(SF4Jbc-Z0NSJ8D$a8iqaTACA,AeJGY28'P"QcB2Cm'8d
45ef5Kp-$e2U5,3+8Z*P0C5kbEMd#[+5)K5Dp#E6jE@+I5FIjVh0)FS[599`aA"H
kl@e)jVl1%$6jNa"S-KMB&9LSSi9fpCA3L"D(!RXklH)*J)@JS#30YB2&4bL,XXZ
MSGMc,6'V[G#&MlR82qPe60-*-N"`2[--"4IhPp1a-%$Y8+lX,ShZf3*4k%lVeRH
DPQHTDC&"Ha+U)Mclb9(ZFXm#Z#b[1FTlhF0!6'EVRjjLe*jf-jZfA+L!eM3`k3j
bpL46,Y!44f*$cB6UQ5mbmRBL36V!54ede$!Sc#b66!9`9&9SLNDDk+qd"k8cS13
8il8)-F'NjGE*c*4%#'YXSmK`*#lX6Y8-[a1V'Cjbb$,mcL%)NBDR5-J1`%N'El5
0AJ,a(1T$BZr`&"468MAmc[%-6DRH$m8rLB4+*"53!2Z(3cbaQ$U3!$FDT)SET$b
XR!`dC#(F@dQJ0pr496d"(rV"PLCXQBZU)!#-9,N$@D#$$9+d!6"J'&A$c`l2`'[
@F-BKG$Em,&k,KfITlFk3!&54Md6UrHQlR-krHRHr%b#qQ9be#i*-M+$N[lYcX9k
0h@dhhK*6l%0HGKMU#9LNf5M@$$qEI`D[@IQcZ'614X+bXma`bpLM)@0`Km0`Zj&
e4SJN&G0!bXd!-k#U8T5rAQkmMmC'kF0$CVZ0&1M!*3h9TI@4+HCVF+U61k'+S+*
p!GPed#NRhb6RHNNCBK'9mJ)"R381Mk"5lcNXJUjDM#dDUXEpPB%,b!mC'5B5qY-
(`Q+1Sh#Le1aFTc1)Q#Ck+8hAPC'Fl%!DZdP%`mPK$DSLR!088AfqNj5%d('4`,U
0E@KPVK0SL,BZEpK+!&kk1-9X(BR#0EE%5NCf%+-'$ST*!Z[I2j+b%[!lG#SIebD
ekcTYNQ-L15R#CEB9@qF*#4!LYX,!5BFN*CNZNG0ZUrBa!`bIS#9pKG4%B$"`[-a
G)PVHZK)kpbBXip5mjaF[lS*DJ1ENM1hCU!D"TUBaTiNl-5L0AE@8L*T95()-MlQ
lGe*8J`B,T4[SF,bPDFH5E$ZLN!#p(4IFAN,$L'#K-*M'`"6pY941E-AMqbB'U5,
(Bcm&kJ(('M(R,cf533GJ+%mmB0PML&Tk`cNVHRLc"$aaQ+1"XcIj#$q`b1hej8#
aMDC)X@dFDL'R0Ka5ip$VPjZIR*NAC0'[rD%`Q#"$$DSX0$Bh&`G6HD@[@-k9pZU
TU"60cZPNZ"9cB(!KTEpV"%")0LRT9U$e#S'&D+P**dE@`&`#`IJed4,6d$3F`a[
+00((e5&#PBe*pM&#(mJJ9F26+'0P,k3*R-B%#0P,@4b6q-SaLDpd*['9eL5qSNR
%mNVh15C4,dr#)Nr#41K!HKVV1*,LiPHQZ*3*d)AbM@"c+DS`I$8@heaSMikT5(K
+5R#0@NHPT'm%VGHP5(Z4&iKm!%YhXk@M1er9GDC[U#@(9#!kTU[FF0%()qb+mPK
TM"p4,5lV"2YRMYERHDh28Uh2keUIPl3qcqTmTPmdU2)"D+U+A9pVH%S!*H8J[EJ
JR$#[6,f%3UjHJJ,l%NMIdahdlJel*Tc-#q*B0prHSb6@(ReQj0'%f$EbfTEF@0X
pq`U$kq!iK)dR`p%*4GK)"lripP`H94*E[[M*qHd*8ERUI$JhV&`fdB(&,QiG&Nf
i8!3RQQ*f)Hlq%"IL5X)Rk[qb,5&'VLaER&XGZEcbbFTp`Hhl4!AELl&p,pYZFJp
MZdP*I2VIGbaDR4!p0j-EFqXmPeZI,0XGh!C"G(F`E2)Q`K(jJXEGK3XD*I'l+mZ
qA*F3Sdf[2CkELYlcbYlJkT0D8cc"RHlYf1a8%JIf[&qhp924G0Lj+0GX`Y#rI$R
iD*(BaLED*NqdfEd&fjZ94+kKH`@Ek$)fdCAb4,p`6(32Zp$KrK`A1T6%mZiIUQb
L56E49Tf*lR&-9(4lX9e8%Rm+6Pj(%f8Xpc#@lb@@XfP'jHdqphTXpbQ*9hV[rj)
1L$'p6@)k(,,QEU9+3d$pfB64N!#C(h1[`m@BNR#l(mKR8el'TVb56CNZY6(fYdh
!"lY5lGk%+p9+BYHPYG0SfZ`!&2N!pY!"`#3e&`FJ6G[J,XF&Jj*iU'GPH)N(X-G
a!%IFdl(j#&JdqIqmFCXmC$B90"b6+8(9q4*5+lT4)3N(JUCm*%2ZLHKJ5%Nmql1
qPaNEPM%f#%Hb#"Ga+'E1MJAGX'YMlM@i0UBN6RmHIfX*"f-#!a4T1kTH,9B5FcU
IZm'1j(8kNRZP)e(Bi4@c69Z8K(IdXp(Ej)&Hr3DE3XRPTfNJiX80`c*4aqRiF''
6NNLG[IiYGJ!$l!$Uf3%8XS116`L+EGlLB!+QSme+m,iCAmcD(J6M6Bca6TRaFFE
+1,%5A@jA%UXE02r''2ik-IaHLH%5#A[SF,"YRC,`pcS2E[K8M,0"aU8KJXRcee,
a("&'`%$"j'lA+)PeccqHB+`GB+bYPkHdL!4el1MRBa"&E(ZANRMXYLFQ-TDD'%Z
GM+@&K06*%e2S#T[DHLAieKpq3BU00Q2MM'6M-QXR+SQIreIEkY[N`N0NeXkA"Xk
!L`ki`)9K*6(hMhqrKkE)@"ZA@EY2bN)kV28U`A2AR3Z@`&U6R$%P*NaA%M-IZ5r
bRl$f3b8arjkr,D%MCB-d13lrjc*EKD2kA%Q%M[Qh%P1[$)"0a&5*64i(NiVB%-Z
9i%rVqRG[#iU4%40B4!ap33)(rifYq3RTi0hcIZ"LJ,'$!10p2m8NLXA)A`A$#Y[
L94*lrXqF"$[d(Hc3DfAQrC0SqR%`('AE3**9rq22BFVJ&1#C&HX"e`('Z,D`kE0
J1-+fi6L@2cPNBXaiQTKaq4Y2[JKfl"%pr`,fXNh)--p-fpK,C$$53F1q6`idIK)
-Yl%Y)*46Mrl2QBaC1aLcDKdC*Bk"HpJf-'V1MdmCL9%dT1SfDlHVQc&+#FFr%`B
1NTlf,p2eM!&2Xi$K'd,!i'!5MM$fciIICm2ZS'(I*`1M(`Y-fU`N0MlrlAQ-E(B
`XUN9JS#I#*-(DDfjah"5B&&BX9jdA@6$rN+-riX`E)##D1(h)b`62-db`6INij@
',E&J[C,BZUEV"`bS%*-mpqdEGl$P5Z,a[rcU5CEeGV#X9fX26Kf(L`cD2Z9+#3f
F(9Ymh,&*6!*a$Vp`ILF$hNmc8[q'RG5$*q9"J3PcA`Vh-MDe%*X@1!Jp@#3c!BI
59qIq*6Zk9RCd54Q!,&a,e9e"kN%dC'D!A&kFrHD[f54@XNNXFi#2K4+jje'9hB@
I8CAGl8T`rKZ6IN$NIU@@X@k(!h`X4-GllDcCqF"62fI-Db(Q,A!!MQ#ac"JFeQp
-kmrF4S1L!TaD'GKB+!eA!"YK%jD2XXAA39abcpcr[m%,!PM*#'#C(@`%ppK*qf6
a[feJM+aPM0ba"%BL`ah,2Ccf(4Q*JmZZIRccH%B+i))aaX1'YN8*rUhDjh`8J1[
+5JBZPYR"KB-T)2(MmCA2XdaAbd$&$KP8k,)&'HrqJiIc@'CTSFbb3!)@#KZq!a$
mpkf+$iLNQPSar$L'pL+E3&4R!L#TZV@hrjKB`4LQb!`VBL5`4bB!N!$j[AY[qbf
aJKeT9$l52Arjl9r2j0(Icq6aY61jUIrhQK*GYBL*"lPq'4RUYb3Q"!dH5ap8CHp
EL5MAY&aGjNfm&6c#*E1XM1,H2X*[STk0T(3*VUp-e9Kf*[M)VLGhR9X`R2h(6ie
*-I*N)I[`LLXf&9jGGL4URC!!mUIRAFmE6Y!L2N-eIh*hFG#AK`(8hPid)9LYKJd
GI0-ZRqG5hR"3hT!!q-2ZNfI#R[-BRPRHF$QjTXLq`HTbZ@K,1VE%,JTG@(5kd$I
rBGE*9rAAVLklr$5Z*X)VlYZ99el0*`4pLD[,I*iF$#PX$AqGbB@%2q`U1S2Yp@`
l5X%9%JJ38C,23p-)IlhHNB4&CKDGb6N*"DrASC!!DDTipMSG9BiCB#59PVG)aKK
9N8d,q1#&ZUj6XK,rQU`US3U9',4(X%T82IB)9+25q8a-YRqmTiXVjBXpiiFJVV3
VB"U[Z0+ZSY'RS-MKic9lp(Zk)#qT#GS0(ZdD8Z,k3$5T&BI9X1GbqkDC%rDB2Br
mjZ9%$"9lEUVK++*1eN8IqHRZa"8Z4VB8)J0f8!B8AmX[ePrc&PpFF0IKP-(%pGI
#dFfl*J3[,RMhm0lb$Kk1ZLjD,e,%&h,%j@CdKSKrBK'a52LeciUTJr@)d1eJeEJ
1*XS4d[AhTHYYjNKGp#FR,Gd'aAliEU-BHEJ`(,RF6L!Rp5N9!"0ZBam*L,IYMSf
QKPT*I$kFcCa8JZ+Tr2AlPG6@RkcI15peYiiCl@1fK[qL[G8p)K64b+TSCVP(B%6
aePa4hc`AFTI8A0ReiLrZBFC"4RK29$L"6X1jr(YFa@XHpq2e"2IJ04m9MV,FbhN
%VfbZi1AQE8hNR*idQQ1Sh'q%F`bUd[dS[m2eZJkJL'G'8HerNf6N@kid`5KJ@a'
i!dkIUq6K3'#M8k`MM'iD!NI-X-J-6#EQe!X$6m8q9Lff2T4XTq+SEd%N0K[QKB%
8Kb0$R)S0J+20B6L$q#@5JJ"iRM`--d4CU-"-#5T(FB6b*MHjD[)2H+"MD$VhBcQ
r[04PYJ4-X9M%!+2[I&Y0fDT3+a9+bcAB5-khm`eMN@@c6N!iEABX&!mB)-UF(fT
KaGH#X53SGBAJ#&ilkdiQM#UheA`CJ-YClN%d%$&*jrVVJ8Cfh5GFEaM6rrR11dQ
%K#i'U!Y+Q&Q&LbGF8JG'R3kD3KUGcr-35@ABT`eMeJYkrR`iC58RHA+6DKM,19H
DJkP8c&`Z`S(%AB&03F'"+Y@ZADf!$5eGFKp'S5mP9,5XpN!0I4"iV4#'DNqmFfI
Q6R,5`e*caNe%)alX@r"P`-)U+lcHpf@!()-Ki0QY-j(fBcICiMB-I*(fNZKb%ET
dcVU6R+*0P643pk,-jSpKIb-4e-b*aMS!1V#2GHrHhfV"Ka4e%B0C@3Q5Kq&DfNa
,"cTdMRdH-rC@66XkmkIX&A0CA$Nb38CG$I`@L*N-MTGKX$kI2BF%80RcFbq6%6A
h6SJ@H5X@JS-1LF3pJPPiIpL#+1D#ca%NmTA6qGpa1B)f&J4[2%VXS@iN0jGX$#4
lMRdJZFr6U`'$"Qh0004-bl4kFi,A8+M%Y#biYU'Cq`D'cR1,UAKA02E"A@4d3a8
fMX!ej!EVC!SqhXU&S"&$[T-9IAXC45a!I-fF04ERANE9I4qj#E#J5NI80[-9)NH
@55k3!#"DMC23dqfHHF9h0i3pGe*4c3)$K@a$N6LQH@6kaK(9Xb-DBpIEY+ml,TI
)SY1&-hmU4H+!5aTUTPPCj-YSpP-PJjQrPDV,#fki1Trq`$Bf6!-MNAN13KVKEVN
523N2YQ"!+fK!6"aEkElAU#(5B%%K9HrMF)&-cLbL)VTRYV0LVHr8AB6%8B,K1RZ
Z)!CUV5Ql5b)'e)fS+NGaMjSBFm@b9`2*!lLC5SQfQ2T'b)80hj8&rB25&44qh%4
092XDk9Z824G'rDcXZ44P2D(1KU[ZEZR`p'SkJ5i,*GQl#A6!DFJ%Ce)8J)`X(Vb
8*Qq(Z0DIBSij10L!4V6"aBN,8c9f3h3ffcVbY)B)K`UbY*')c!PAabL5AVChSMi
X4+)c$4'b**4`FkV5ckkA24J@KLYeplfcc0Nb*8e,R8e,`kRDM+`5(lIe#!SKXdq
eQ!4UJBR[M6'EVM)h6!e&V84Q9GmBS8*UkKJc9)NCL'Ka-,pCKrNQJDP'+YRr2E1
8VhQ[,*hrcXHaP2ImCbbeNa)9pl4TX64T2L)aTB(F$U6U3&5S8-D6e5`)E3eeXXk
`'C85CqX92#4!Pc8Dal48h@PTY!Tfd5NJ4G3Z)!8&[,5Jd!Vc8j)Epi$4*i[`)*+
TQ!c5G!S4el!9`jT-D)5pd0c1SE%adcC$YaKr[K1&dR53!)LkB5cpcTfA5@`lFe+
U2G@2606R5fp5$c*%U`UXdLmM-5Fjij)VejDJ-DTT1HdPdeF,UNC+cVe`P2+0he)
(YFGlFM*[(4Df`Bdr)V[j,[Zi#qYd,m3eNEXj48R$bH6ZbiIkma[&IT!!p%9-BC!
!Q[im0'ppG)AAjPmi4)A%Zr0(@F)C*245dh-EQPCU4TaSpQ2chqHRdqCDGlk&*IL
3!(#HQXT10+p6XqeC0-pLFhhq$GUm`TfrRbA-3-)*DXE[4c16QXNK029X%*IP365
a"#X5EP+cGKHDKkPT@S9Q(YZm9pjF1,l3SKK6BD,6V9@9Gm$0VkCm#d6SHS$BGb9
h$eG93E24iUXUhf)V2QC,43QPF-XSKGYpb&B31p4A8)eY4ckUbYpA),V+#UMBP*V
bLGDU!K,JI8JG%@P(&0XSR0192rjmFP(@M'Xe"FeBZ))L3e53!0!qV5+(C15BLUj
$`5HN6$K&PkJ*1f'H@CQI5#@S-20`0BFK)Ja46(lLfaFKpP[T@r%234r8Lrbm-&4
P1(hQKC)2lqCj4!P'rm1l88dPUS@%bp@0C%A1[*4SFN"5MTFXML3@YM@Ej5,fE[,
,2(8JjaAaJ#XhUZ!(eC!!`kI##9'e"0qN)P,8('V%4I8m08bL@NS0MDKHTiC69#p
4SeP%SEYSG-"GAda2Q")%FUSqT-kU9`)3(#RPAA[A"2ejK(L%2k[QhpjEc5dR-b#
%TSS2TEXX`U8Zm3"9,HhrII0Qqi#Ad@#CF!d$erLUSrjBG95")h@Kd@c*NlUYJl+
plU5rQ$kU$IhmVC2i`6+S[,LA#U)PaIbcee!"FJpFI&Hpj)VkAqU0+M"),"3@!KR
N#H#!JH36r$TlK-9CZ)JLNAeBE04-dSC$*lLa))qBh&#$UaPmM-!ph!rFaZUDUS)
mHK!(%Q0U2@e(Ja`p*KmD,FK,Tk)Zh03N3lHMB"i2246&#%AJILr3pCfSrZJ'-(k
(PTq@(P*QP&A1bB6$-A9(aHd``6fV2,LkV(+H[)d+ZJ$`q5dqQ$15Kj&+66NH8I,
Z"HBbTQ&$l,Ch*,L"8&%qf(DLUbJpM9Aj@iaUL9+hVDbi(`R)dkCH@L!pcIkJ!V[
E54-FS06cZP1QBSL!G-%&eGdLX3M&Iqbh&em8%`S`%UN3*1fVV'#I+DY(@A#GB5T
QP6#T!aqFj`FT1"cP!EqPEqQV!2LlGE1Ra&+JfbMP%iF9aQ-hb$df6Jq)S%,1#[E
3kmZGY%@V`Yq)fSpJX*FjfbY-k91BdTG#K&0@FPUS@#VC8'+Q"h*)D$`#lrTr+&&
aH$i,!VITfN9pbBqY+#XSh*R#N!"LYTVbbT!!4SUq@Y19!)%8'Ne5a+8JI3U2mfM
``)eTl!PbhGJLZIRP'P[E!leJ36%H%A*66)ISb`p&q`4AS$#Df8-fXU8LY$)lU4*
k)lNN5K(eF-G@h&YUF0QpX8P&`%0S0d$UJkq@TYN2Q$'3!%MR2*adiL`cp"0#B5$
&3(+I3P&'p'NmBL$#MeZV[Jb!M#US-3jY4b$26e)J,c'GVXQ)kcV"fB#U2+FNPrX
"9P'`C5Q5EC@FY)fGV%TNme)E@U30$,Q"F[RJIPG0`FXJUE++'B6kS*K9&#G#9Em
*BFPH"e!j"&)&N!$'$b'0TB614Li4%GkrPkSXKY+T+#jG3V-&dp1%`KKH(bei@8$
P!ZqYFfVQiBF&AS&qUNk,,!X9Q5Uc0BcGZ2Nc%FND3cXV92-Q#hMH8pI4CaR6m+J
VE)$VVA@%8-@5(PS)#'bRX"5FcI`ilK3Z*Z9PR$PTV%TQjNHMPHX2(IA[,mM&beM
`6%25&@**$ehM8M9lUH%TNKXRjB4-01kL5Y-0F)YSm&#Pk'LRIT5LN!#41d2+SD1
H``A2%%R"JEB@kK3bJ1RC5fQ-$5C@94&$UVJ$4SkDbLkU51-r)444%fTN&k[K"Vi
d8B'C&AXaQD28&4cD&)R!'L)dH5Tblm%VM&K3UCCeJ`*(*3DaTCI%PUM%P[RC%P[
8ka*E9!Za46e1E#&bBiP253a3(j!!'C)R0iVPK1Yia"B$HmJXrf9RMXH2+L#kc,P
Cm!`09DIbEP)i3,JqDV'Y9Jmd1D*cY%YNRhVqriCpM'h%)1l[Cf#J44jk@F8lK%)
6Jjl!`iUJcQNSHper3J+&NP-S#S0j&J8,c%)9Mf&bTK6F+&Q4#QBS+,-*D4!++2&
$NAC2Yp88r"561B,'Ed*Q1([@X8SDdd*K@dhP(d2KZ"Rp6`qeq,1bh4#)C19[KLL
'AY1-LK4TCelS#$*Y)hl-Q)LCCI``QNGLT,jrL*r2-4d66HI"',P'2hL,9Af+K$V
PBVeDf9![b%20%BCDFe4YG@r(Um@pQCDVjYqPS-%c(B@mdB1d8+c'9DJ'l)&Dq!M
JBh0k'V&"F0aN#`bLN!$6QXSeS6UDG-$h5@rfjTUql)H4Y4pR3'X5N!#,-rK%*`0
6+2JfeM[B2dZUcK&U49GY+&bJAL"JA-6MX13L"fl#J08MZi,h%)#LSN4kFZ'Nc#A
%B09j#6%)T-2Xe---AVG`C"HBb5D'KCj"*8Fc&EV0UZUIFYqL$cJ0@CR$HBp3R4q
6+mANB[VBErLBVdQd3+QE0,hi8UXFJS0JpD-&2)6PdVc0S)rBG)SS%lJ$`$p2
$2KJ4,3c&2d*4f*A[`mK99INq82BH9dhP)hU6&`lQ+!a5fJK&%&RDpG'jr"Cl&#U
jR%1d39+Ge6G)DE,5JeNL9Up31"H1,)k'"@M@f`M@4#!)U&32K3X9dPZTbUl$'0$
ZB4[L8N%J+"#4&6KL6Em@`3(P#J%2@(%'V(3DqjIZMMDeaf"@1+(qm0rA(FZbF9X
[8mQ25QSZ)ql)M9Z1kVa@&'YT3XR@q!(,1JYkN!$jep1$T3"XPJ(Ge2bfV#!A!A1
R'+HQX9AHCSmLKDB&+*03%A`E1912b8AciPMU)DLMThkdrf-86UcYV'*"NNL8052
A8#6$XPFC+3h!"2`UA"5h@9kaEi0a(SCD4'`MT)!C"lD0G%iHCD)l1*Hk0aFJ-$d
@r6iH[F+50i1B0X-NDHBUc*4bT#9)d4[)aI58e!N+e*+0rTl(f11cULPkJjNpQ%m
BQ*m0,)R(M1LC8A%c$8N2B'"hR&lZ%J55Q$3T'[AM!r[8+#SM!B8JYeHBHc)&``V
BBZEYfCP8l#5U8k!T"5i4'c*Z*L%H&-c,!*UVff)!(33iPYX%),KmX5i!A$jA&i`
#lBJ6q&Xq*q"ie0EbH`Nd"P"pCrQpicDEC-3DH8$R`NBmHNX'BmYR#i[4m"VDL%(
C!ma!N``P*C!!$`6LC3!6TD'00S&KHNbKGE$p)UD0kMc2iN%jXe$`RKC!Tf$JGqZ
BZXbMk4FaUI(!hBEKKK3fG)99NTb'U)dK*cE2AJUm(Y"aF+HZ$dYGHqBi#P)*ZLU
cTBSA@GNRPJ6BrZQ`$0KbE0JD1Si,!jpdClF5B-[Q-Q"V&('G!*XdZH`"LUK*caB
*Z'@IN!#!@lD[jN#f!9Zi"0a`j8ek)0[F,I+`M##-Iaj#%$pHq8PaTPcmKNL#+Q4
l"SdQ3F($Cda,ZAYF9lPErM(+hA+(FQIf-&GU0YNIhk#T%U[QjNL$mUmIKa!R*HA
Yai9,82#F$8QlH[IMJ+6HM9HU8T`4fiM@jP[8'BEV!K)bUSf)fRS*I,&L48HT-$q
lbQF@9$lc`9k3!0GPU8KP"NSJXR$V3AT8K%VQEQ3hbR)8*---@Q(D)aI#Xim+q`8
!L!L)0aR+(D3*JR82Ih)&S%q,2"qm*E&',5$#08-0)M*$FI2EDl+@fk4J2#8(ic-
F`AMY#rCJ[(D5&)`[NEa"!L'&Ck&SLqNI6pK,C`*G-UqB,!m4KG8!'HKHrNc0JHA
2%QNLick$JQT(TjLTHJJB6LML#d#Cb`V1K-i5NS!(GMiqa&&XFj5jSJrGLRlVR--
4)(kX2Vf2JMkjURL&[DTLCMe!Fp5H*(F@JcRN$*%e&Ga9-$A8LZ%Fah$5X@%U"R!
FQ`DJDZ"K@9SQL8b*E-@DbRNS9#q6MPBk8TM5Ap!pE*!!&bS[qE1d$reIXh812FE
366jrZfiK2,*b&jG0B,+!PT!!cAC8MKG%B#MDQ)V,([0XBBqcl%mlF!dIp)M9d"%
5mP!'3KBZUlMTXc*K6mfdANQ)3b)@'"5N5akkFLNYX&kRf*i5UJ`1FTq%RmP!5qk
!%'VRSDVb0HA$l19&d"V2hiIJp"db4,UUbVCMfhPA@GPF9ePPPQl!("Vi9[!"+Y,
`q(ITG4iSp)388!#G3$i+8,IYLPVR%522Gk)+4C`+CAri*+Tkmaq9C'j-9C9heBh
4aa8bh1q146++M[PM(TK'ZaZL`X&3GBZSjGb#bZldhHQlfD0*-qijE"K!aFmjee"
&HU()#1r'e')EN!!!KQBr%ZV3`hd5P89U#RUXhUjLSeq-0V"#iVE-6NmM3bQ*""Z
N)P!bdD'C'8mc)N1%!YL+k%K3l!fBmme2HpA6Rk)!3cbB"9A5)!1(Z*@%d[2)-2Z
MNUUi0!@M[miMG4+G5a1SMM4%(&1S+Hq#U[6be*25*9UN+Kk6,p+%meq@6-*Pkme
4RDRAP+qRap01,8D"8IYX*qRL-FiR#XaJ6*KhVDEb2+E3)Q8r2SZa`FIBd!NfR(5
`!B@4L3S,B$#FarET-%+4)U-hE-A%i'2lcbdS@kql4"Q!bD)2f4,@F3YSXlQ0,B"
K2eC0#q5rc"CSNb+MIXS8c"f"Cdq3!0MPH9qD[QFDUIlm'@44J)IlZkMb,Tq+M$a
**bJJFdh9phV`-i+I)(i+MjI0L`qfipSNjSia(T!!Rk8ZE(e3R+`JhMZk4k%#hq&
`Y!J'Y-aR61L5A)*bZGGZlX(M3FY+FMp#eURXdUPH[j!!9!"#`!"`FV1Bm41&(3,
P6m9&C)UZ3PS34#pp&P'Kj"3")&VLUd5a)TAdL%%@R'@*0G25S6#@C1k[UCU@lTk
[E659+Y"5m@@K&NI9[kfS9S3JI8'VhNfU,(piR"RfGM,9!U59E$K$EYqdd$'&G9q
LeAd*96DU@$-N"+eafNi"+Jf52ZKaMc5YZR(6SZ+3!+DH0%DTm8Z`J*bI0[`F4Qp
0Z""&CPdJPi#XCNFPbUdSr!R'Jm8"'#EFaNC'8LC@k4iCHP-&MY"$iZQPJf95jbA
80qTi$#`Q-*brS0b,5XC9j9k3!0SD0)D"'"jP+*5*'Il)!$aX+5XITS,+l)r[N!!
+epFeemeJ"dL6-&jbdH[m%SmK+6'+#MH5Lk@DZk6KhZqPDd1i*L0465L1H6iH&cA
IMMa05mpkQf8R*l*685!UHSaa18X9TEMV4@lk,p684$%ieAJFY[MY2Zi$#2,,(84
rL4F+*GV1@$Chb5a,ekSDKi)b-MCHB1)RKiK44`!9K9Y5q"$B8KR!be4j&!(!933
,QXUc"0L`42NJc)P%F"ZIcG%aXNV9eqaJ3bjB(`q0f(JBMifq@lGU(KA4p4f(d*L
bTEq5rSTK"A8e@-Fe+'3($r"'l@b4233"aHV`D[B)"+SbM%(*3i)"8,FU(N6*cB%
@4Q"1aZ4k@3#&BSBHhJe@84FY,1!GN!#BNk)UEU38UA39`YCppL[C%bM)E',U4N-
Ilj6G23D)Q-$S*LM`TJd!1(T09eR"fr6J9GP-MJSM1qZq-j!!Q[Qr$YeGm$B#U'G
+dpUV[Yb*SUZSmlJ%A*T*ZD0(eM*3-6L!)JG,b%(009[+d!@jakj#E*2V,M%H&3M
ffJ!Me9SCA-5[pI%K!)0C-X%ZA$,"5S5+l9IF@h(K*K(`N9`q1JJL&X!)UGaV[4Y
Q1e"l'@49`9(QQNFS('0*J%3("!c!+&"2B'#,m9S[[`A!95pY+mMG-"Y43l+$'d1
*1!FaePH@%RT5H3NIbFSQ(-D0L`J+#88@$RcTE4m"P9jkSldb,T(TT$Ge$6RN5!H
KL8,L5+LK,aYG3-15NRYAR5IQkEmb5S@CG)XfIAIAb8NqUCSp@%bLR9CpGhm89'V
C)&8NMHZl5FRA"9LNR$'a[Ve`Vfi"*$9iJ&,24H"JiTXQIB[!UEq)(KmYHZ5LNa9
H4#98V-AJk-&(8[EM1Rm!!$'*384$8J-!@#)293eQ4K%3)H2ZBIpY[jDUp1E[ZVk
jRZEaZDkVHUUfHN(c4(C50`EXbJ+pELDcXmLIapEbN!#1kjZjK4$#&HhRPae`bSb
)6Smi&`i6Dj,a21YN(VF3AXr#HS4`HJ-MK19CKp'!J5EGT*Yp-alVlprIrrGe(5#
rZb6[*5mr!"9hAL6c)$)L%L(a!"%L"PpTP-PB$$qbVeN!+5B(X%N)SYRX3H!NXqK
m-qI!,%8XPH"lmrkmEm))rVkc)1-pA,fYPL'2D24)kp"(KYjZD*%6Ym1&LPMXGlp
JaB0JVPf00MpR"2[Er4EIeiZN%86i'PB-T%ihN!"&B5"H'%MK$!,T!PpkJNQF,kH
f)L!Xl@q4T6JL15B1Pj&hV-mjhZJIm!m!E(rB(mI2CA9VFac+SM)DP"EI'%bdX[L
[!Cq&q8!X'3%VZ"`QA$UCK!QE-0hp-"Y%eALC0hZ+rpS@i@)C@UA8J!a16ace88Y
mM)Z2U%EmdBr-1*!!4SZ[pDK,@I4,bDd!L1[%j4#)bSY50Bh3lcYcb[(P&NGhLQ(
2i1a&GGF9mB$fqmk-mN#RrS!fAA,8CAV%CAbFM+MbT!VD*bfbCd1(VeQG-$4ELfa
'-0d-%$P%d(%G3U`kAmDBIp6Qm"[*BQeU58Ep$hZDe9SUrUKYkDjY3)jEaQd`h#S
Me0m&J#$-ba$%q@KjL!6bN!#aFE$E#kJa)k"'&LXUd0q"TICX$i-4`jqb`ApSmC3
B3C9!bT4eF'RTBNBK#E`8BC`G)Cc9HEk`I'[hC*!!8aF)[cr,hGe[HF*T,)F5E(A
Qe4iMfGB1d(LjmXK&jC%SPJEfhKm0pRFC)BF&X1kjfb&ejk-IU9T"HrlqC&*Ci"F
,cZibNJ,@*`1YB32P-,+3!*-Dc0"ZDfpXpeeKNd8#85Z+l2UL1p*J@I!C1@QfRD"
LbNPlfiP#IMM(`83f-LNa65@Q56'GA1i#N!!`'F#P1Hb`-QJb"S2pmrZNkQiCq3U
#4"Fc-VcLp(3SG6S@mb80+Qa!LbH3!-VU!82kX,&a0kZQ'Qp1@RHH+#ajPqqd'%X
%V$'mTHfd!$UTZbJ[Di#8V(caceV8e0*,X6TreL9"IVUAG5r8ZV@QEKB@8MHD0ii
L#KZLQhQaLC6cQJc$J!+1EPjSCLA+36("r5bqG0#`p1ML3Uib[F"%!I%'-EA5Y'i
EV*p9iQ3%8c-aR4$65DNAeVSAPF+UbU'B2X[UNmP`&`PH22+`)RJTVe-Kq9K!2[Y
SD2FAXh'SHcNmcmA`ZNAG4T@)qY64%'m`Lk3(2I#TH-"YrRi0%L%NX'hc[*@QFpX
Yf(3VLaH'efhNFkE(bjFKB2cQA%k'"5JiT8RCGS)hjTrhLF*m529RFY,`*)e8@`H
,@`d*Z*!!#hi5&qp$*EQi*dedD9DGBCiLP36"232$!CJ%D'Ac!963QfDL9B!PMbl
dZebP$)TmliP%J9IpLBSCRD(b#KHc8UMmB8`8UNH[bX9%TGfMbfqd`1KaZDPVVS$
8"J["'jL+S"Jf+8+Z429EF35UAmLV@&c)rp+U,dqV1+8e[V*6UITL1N5Y*`BBjRQ
&&3@+!U*Nk,Nf3pZGZG2Rjk3T91r1ZF$i4l[E+IKKCZKH"JN(*I#T-TD3!!,5Z,[
i1cbD(iNfF3!@[Zl9Q(Pb,Xh&Y`@jZ2cR22C,NIFHpQ3Z4I&6F5Q)(jGkl5S+jTQ
0Nb&5+a"Al'[BY$dMeGjMAe@I9PkY22C9j3VPPA(XUkqkP9FKfYUMMMZT$YkL,pb
!31TIC-aVD%29-#N[KX,XA0M#),)j@6TZDqbB,LeSZqmE8`#kE&Xl#rGblmDUaYk
09IUl82eEDFVQ!`J0T[c+r#*%1,b4KF[+R!$M()((!ka@250Ud98@QMBC),,%iNb
KURGjf`@T[RD`eqYH89lR$rEkUjZ8epjMAJ1#hEbJ[!`4Zr%S-aETP6G&SXp4F"9
'TGR9)Zdcci+!+)H6%-UCA!kb)jbN)m*RJ1d!%a1%IZ$M3jKNQ991fCBBT2H%C6Z
d'PjL!RT["288hU#l"+@cA!@Am5ik`(h!91JBaP6Iq'4idJjbrDjX2GA`pFI&"K,
1%LY!1%fBY&fB(KCV49&djaa-GTNaMfkd)[ZZj2$IKNU%Z6))S3&I5DY#5-b-p(F
!')abKc)X+K)U0'h(MrRVHe!4fPY)cdrpEGLU"(pf5PcAF*,0HAD3!2!ZEBkZjm"
qDA2N3dbUrR!!55fB3q6-(`lil(5XPBjY0GVG%Lpmk'3e!&4VMI1pi`L`l3XbNK8
U6U5C4#HcQZ-G)NA"#5$(q'm2h"DQpPpaL&Hm+Jl!R%U,06)`0Uf9C'EMC(*hBA`
qpDaJKSiSUBHAQE'Zr,rh8@bX+,Tl[3K"$22(q*aUNCbVV&`)cEd8UeE(mF(N$lG
$Fj@aGHULAK5c"Df&$8BFATcF@ar+EjGc0M#SeG&m-"E+Pq0@eBNZ@*NQKYHjL#h
'mLB10lLJ,84XL9@+Y-VraIq,r!rqLalcAe$j6m0r!IbR(j5e))9N#Hic,*[KI28
`rK#d8+1`)JN@&!DYX5(r`b(&N!"VrZ(333ej"kGffC!!r`Z,6NCZ$,FU5EUk&!l
I,UFVH2,$f-+fIcL%"bi1ijLj5+TGbR)jEI$NEf-,eT!!*4E,b1,Nmr9Yl5%XF(*
AU1ZGBU14&N"FfX@)kZ,EX+6EU$U6%QE#Yd'`*`$0P9Y0,D4D0+RF"P4VUZ@[B@Q
aZJAYBNK0ASabQL#f,PCA%3!,%k+!pVia),UKh-jQpiL0R8Fm6ZTF+kPcZDKcqDK
cADE1*H8&N!#l4M$frmEEK'llIrhRMI-8IYI98'VdrrG,*Gh-bL0[QKBm+Kj*G"H
[H1346VfrF,FKGJPP,@elDUXUb49NFMN-)aPp!cf@%kYKlZa%f,KB*UK!6#UFZ0S
Xhd!m*Y8*RN4Bm@-5PBA2T!8mR)3el5hbBhEJL0i,5BBJV#!ER+$NQf&qX4541*B
26p,K86AUL)YAY#45r2(HpEkNRB#C1&jl5B'Ejj!!2V81TRb*6)34c+8ZTAlfF0P
IIQq*NlT8J@1frSA,XCL-UNJmIL'25FJGiFRFZc+kL!,F-1$a+ZPiJ!rI49L,C$j
H-T1cj4bRU,qEPb'`HkD2`ll+)jMbV5!JY*hhQFdi)a&3"Q2[-pR,FMVS$fmaD,`
#K@)hiJ4l,)-,*iK2c&DibDi8RK3RjGLY%am2i2!rq'5d'JiXI`!j-jLmJD6C3D#
5I*`UShY"kRC-"Tqr$f$'CYal4Q%4rSQ*q-5BK'[R4S$r$mGa""F&)-mpfiM*RBU
%TAdXpJJAD0ZjSJJTm6)1X($N(r$RrD`pP8Gia3`Y1Df`-mbfi-pQ@#!1beAj6%J
*V92$SHM5SK$8mVhVb@&`24Ai+"Ai06)H12T4"j0b,h8h'@QPcJF!!N#$1fX[rU2
'*C!!4er@hTX[VVBYJD#hcH"JKJ![4Prp($'Spielhd8i2QaRF!j!AYLB`3GYNB'
-(!kCS%1m@EXMAaba(1b3!+SKKe30285@k"Z4,kC[T$Jbj*!!ZL'(e"ecb"Tp)r*
'qND+Sd-1U4eb51f3!%28BIXJDF@,2&b[0$k%4H+C@E4`XRRhfKhh!@0Qb$$Kp[)
H3K&h&$p4eB$KD6!3ke$6UAa10ad@Q8f)E',[HSpeCUNJYl4[[Hqmpr45V(VBMTr
+r[bL*6A'"Sb3!2SpQ%i*R%K[`M6+fGd6IrEKcfV!J[XirF9-C'`If,G$(#B"E*Q
$ZYS(SpS18pk(QqdrjL3Ch#X4lYD$I9L'X(QeJHiD@l(lcGjc63`(fY4NkKBV-&r
qM!6FYd,0X3,Tj9"P$c0VIH-J9f9-`RURZ,2hRFGRZcY&lU!Pf-b+$6Kk@PEZ9lC
q$F'I8CbhRI1pKSZ[D16A[AThi-2KbKI91`4e!c"J+e(FHMG3i)CSDN$T$-RKi,i
P&*e'R3$"p9HEZ41JL&Z[8X*dFm2)Jm%1Kkj[5BH"4#UHU`$!kq4P@CMU1qqFF[R
9APcZpFP3)I6mI6,eki2GH@+#Zh0'!M5i#DA`h`Q13`G!%AlfZb#YJ'hYH((5Pb3
!kq4ETj'Q2Bd%8CFahpLem!eqLBifKN8R8!40Z2'LX%iifM0)$J-)fmDh&b1[IZN
1MX`1Cq@VQiD(ml*a#4N*JYjGrT9aK[PGjl2cfbach6$c23!E6K5QA1GaFf#a3XC
'!CZScBA!mrGjBh2CV0``-+XY"XF!N66JXJX6qNZr1bYp@id3#VaHA",dGB$GQc)
EGfm#S5jK3Nd!IMQ$a[`!EPiFhDK@&!*A)SHr*")550,"2E%3S!per!'+1FcJ"bj
c!cZ3!*aJS'+bQ,+rZk&V`DB8F!eh2cK%m39Uk*'@f)Y51VU@BD[6-TBG&&ReGKf
1C@Ap[Aae@C&mkejeb@K`,(KCcSa99a&j0BZ$0KKaG5hqe(#!CCarT%5b3Kr`MKm
j,%fBU)X%"(($S-ZC$26TTUdEF4RIZ0M-5k$H"b#k+FmXL)[KJF((bTGHUUjdQmB
2rhJIh*9KFKcN)2a,S[1j4"!A+`FS`,"UDdjk#Vb!AG&GIqSf[GYjQ4%#3H$&9Z%
Q@C8DH3"6R',K-(RBfL45RkMffHSpNi&Rj#5"U-Z[Xa%#+aQVhXZQM@U@Le$5F!%
`X0V(UXZBQ%a&mKS!)@e,*cVrJ1,-0[kpXl(cX6aBqh'i8-+S2AD#Q5)q$JP6lVM
a('m1#F&a*C!!&Q'0J`M)#"%1(j%40a'2Ld3kVK4[*)*b!q(R18pamFIi+5T1dXH
ZiZAm8A9cN9GAJ4AmUC69GHVML3p4qM#5q+$4KkR%Kc"pU%KmL0#(h&K!cF#N@kT
,9'-Xi)kbb09Q6#-d6H@B!IZG@)CUqk[,(0dQM-4AK"4[@F%")[qi%GM5#D0crIU
qP)SbhF'&Ac$GH6*P#i@lmapf6!DCk@[VQ*4S@J!9h(B5)'Rm9-06XkaQFp,AE-3
j[HeNjR$(MpQ9C[Z40k"'ZdL00Pq@1V-"pjS`Em3MeffL$8PC#e'dXR,d*'REIi1
ZA#j#G#&8#,Z-K6dPmjVEqN*L642E!)PYR-3fPFC1pj,BqNKXGdPXa53d"`RY,JP
0*C(eUSk%X%iPa$53!"$3bS4SXJQK&#!8Vb+8RS43c)433N)S6ZTQMpVJ`*iT"2V
E0pb#BeqhTp@J)[*Zh2+Aaeq+p4lrGe-f[A'N(X8`ll6iZh`6U9[X$$XYM[NEI**
bVE(4BH&ZM`BkfK8TZV*DbY!j+Hm,h)N%K!E9`1aLf0'aiYEY&bR3L95Ah*j3)"G
!&&qTF6h!%9D!IKS61H(5$BFFZ+fabRQqN`&SE('XZZEd1GXj5dYeVG-5YF4UBc(
Fe$NY)$GjRGc`PP3VUBci`EVr8'#DA)M*)Bb9'J8(GMM"el%6[(FlXdZ+iJZMZl&
`adLiB4,VM(SCM[*),C!!`cSj,A#&AMU9ZDT!F#2'H3Ch%JqN"#-L1aA)VZ+S"`"
KbC[LYA+)p@!AHAQrIK&2r$[i6%9RrrAC@"@U$f))8*@,f-k!eXX@e`-#J!4!q&Z
#!p05+bD4BqjbIU3N2-2IC('NA$Vm#QD!K!@)DA*HE"L`&Aqd'VfRQJTAe@M43`5
c$3*Q(%5KU4'DQ*35G'ED'"llNZ5iYT5#MS[dZNJ2PQ)M#QaV3"QVkI!8IXCNTYJ
#&UCS%ZRKM@Yak@fR'MiriRS!"5#eA9!TGlNVdir9iaS,UR1&M9[Zk`ac`86k-6Z
,"")RG!%'$cME,dBqk@BA&,R0F2NcN6@qD2m&abdd5(+ZDTrqQ3MmN@$$"c6hH3M
Jf#+FUakHH9YFr,%qQ#B[CM8`JUB4eq3U)qQC`!-3i'-VAHbL[c$c0P6H#-bk'"m
,p2%f(KQ0Y1"$-hfB4I'-FN,0akD4iHA90Zi1XC%lqq9$e+$RSEi(r0,J`c+bp&6
$UfIjmV%40RAH['F-afCNckQ'4CYijEdQHiar`J0)0H%RqHZc-LHEmC19#2liq"r
`6I)(r!)2SB2TRqh5Kjq`21Z(dIXQ%KY-Z2M([R9RIf30b$BlqSfiNd5f9p20"0h
Xbr"0mrI&!h(kH+$!0k@2d-HP%VN+(p[SJ@*kJ0Ar#*(pl6`P0VHF([$4!h[%`NL
,B"(``LYBAVSTd%f0mY#(LV24L2ZQD#4&0fIT"R"r0%aL,49-5f2lJTf-c43334m
-"#PP*aECr+CR!!c&DQD$86clM(Ka[ZdF%b!$`(RX30X&h0K20HcIVK!M'GPRf"Q
10H`J%qpRQ#Lprq-,B)Zr4H*GcXIK6aZ1[-D1KJJAeQ*a$bef`r5AiF,EF@&RB6l
DcZ!#!dF!"q`mL8T25J!6!QM!`q@8$0T$4jHGDMKFbQ![HR%AUBjLVMSD6hKCDGf
HCIJA4FD15rX-9jDGJfUb&K$LDh"!fZ'1+bT59,f9'e8CGR5D&A##H,qTidJ6"a"
+aBkkG-QD)CFH)-0"QYkcmNVNUXB,$&0D3,NN#Lfa8,K!Ebl#iZDFr0j!E"NGm&Z
IKKX9+3H!$,&PRPjP8a1N%1`!F9BFDH)NC'beNkX8rh%695Tq*9*5IlJH@q8(icb
*lF%MGFSM9H)Ma#dQTU)D6&a+VYX[,SiT,aVaMk*VTC!!("MPV[AdfK(U@NTA6d'
S#p`pRliqmJ!hY`HlqY0Ak01Xk1K2h`4lqDa3'dqr0[+!#5SUTAV#4%jrUcBVV!T
9cYrN%f4f*bQd*#NLQ#Zf(f)PP1DFP4A0DmCh0j1E2a*G%dA'X[ECB5DCM9fqdG(
iFed0lG24'qf&`*El(%j"!F4"c!,2Gh+3!2GG&)6XG(`J33kdDfQ0'8c&6AU#'ka
aXJ'X8iAED,$-cQAQYhFA'5Y`l1[Y61`TL-M)6RCDpeP&Xc0LNYKP"5PUF[5`L)C
SiE3'4kC44-PICrX2lY%'`QN[D303aDQrrj,8(RR$Q#mb'R(*[hm$Ki3(djY@DfE
33541#D#*Cc3NVK6f)6E-$$XDeV(UQ[@Ip!fMfe94`Z9aN!![NafCIRU'(bT)Af&
QrNGSM#!Mq!%`KTpe-UKbZP(M,LijeCNX5(qlccSjIqbPUMNa1X%Nd'SpaN%JA$(
'5Aj1XcTlNA#b&rcZeNGXCj!!(1UhF)*q0,MhVkMJRN*aei)"l5`%GYpR)#)EEcb
pB1HNCH2Tk43p9)Z(RP*R%3)'$hq*#YpX2(fle0KiZ*k,R'mA6#1J(#fIZlAhVd!
+"ar2m''cl)C8SbbK6p-6B"j[SDP$$5h4q$)3fP-q'EZ%5DeReJMXeSA+B&eGe-+
Y[cc*U!)iUhHc)8k5H`1ldaU`['japX+PXij-!LCA-*NN4pYTXFN"I06#"e$6'[Y
EJ#4r9akVSZ+U3i96XDmEh""%T21VdKJhJ[&cl-J20JrLGk+S-d@!Fc)`0TP&aaQ
618URel#,$l1&,#`3J%SiR$@l)iIbGhmb%"M[([m*LTc*[HP!NNDiET%l@DAH,)J
J`&D`b42rF4P3HQe"G0YN38m#Rk",ISf0LeNddE"$jR4fl96$lZZ80TFqPCPF-0m
paMahE+rCH!l13Naq@N&f!%RhAq#+(MP*f`HdM5kI8`h$hQYTl&KJ!TAVEC%j"1f
e[5G9hCNUkAL$33k%l#Yj+lk#DLD10*r[j'19#kF',caE6JbElLb`Kmee$)@*JXa
G4N(L`B`K#T06mlG3P([SXp0JKbB8*c8iCRBj[&5LfCR-3Z8hXmT2G`d#+1R9LjH
D!j4C*32I@j4N1aV[h'-(N!!E&kL4&N&p-$*XR"0UKAafAN#`F(B+XH)D4B0iRj1
FQ1`NN!"G#&PfAB`UbV53!02&dK#RCL!QZmmGG5bUN!!Ta+PkflLCX0+)BJqDNl*
b[-pZ1+FDYZa8b2VMh''1A%"")*'3!-QV6LSHXkflmGCYSFCrSBlcaamfUGVL$hr
6M8e@+BAH5S9Q*J5H5JLR(H,'5dH6H+5a4DDQCI@1)3&+RD*'#M2h&TNC(Xffc`3
a'62E[iF`'5KM@%mMX!1Aai(+0R0#K!'bBH%i'fPVjk"9pK6b*N2i86LqLG6Ulj!
!a+rbik0(I(J8(dV`8"##UX[1d`8YHJU%R%T,5@@Bl+cPEkF'kR!bBrHULNppcBY
SCLqpaRerVqH5)VM(93FlJje$9d9aTml)8UQkR1Glckrme)cM-Ym@jX$'m-NY0S%
0&PpKX9Xjk)iR*`lbT-a4'D'+@e6V$'"C0DiNJ1l$50#!'qk(pIjHA`&'D",EBAG
(&bed%$8J%je@F91*$R&1UPH-RaXbCU"-XTFPQGB+-[LF3HS$C,m9C,r9i1CRF+8
[0Srm"BbqhXL$i@4JDj1DT!#b(Rmf+@j$9LL3!%CX[3G9I3pEkb%(!XfGa4C8I2a
(&-Sf&$klUMPam2ZX`+Kl+Fhj5A(e#-8&aY8(mM1M'k`bm%!j15f-a6EK6lfHp!I
lmBpS`Y,))5'kR[fUU6M#MZEJ-J(3SLEf(X$,lA"4h4-VKi2ZVPJCZqR'5[$bj9J
0f+'N`SM*5*9KGeJDEmd1i2LAm@FrrZcL)3pqbD9,KPakN5q0#QiRd[*b-lU6G5c
fhJE00q%2`S`1E-"R6&E2h2&V(ZX'c@-I$MMZL+B,B%qAIAFCR*8N6+R'-m`rM9M
Zb3$JMX4Uf)d+k-4E8"!m'GZ'TF+*PTB#pJ6S9VChR"[EUXc8P[F#p-bD"hm3,Z*
P-+EYG$'[FV'A2GD$E@K'!+I,1&6KTU0m#BJ[9iMV6G$L,1$&`F!pp[lNFP*#jF3
%!kMmr9NpG*!!c&lA3FdX&dT+(5$c-p'`S8`db)5+F#B8MXU[p3Z"'6B(UcCRqie
SiPIQfim0Y8)0@BR-'!N9C%!&'8)&aDT!8$L-UN6cRKV(bB*p`keTZHl$)BTS[Hj
5C6`K@c2X[-*KcRSLe@ZSZf`U%YfPRC4Mqr#l`UN3$p3,4JR&p,iaTA5A&3IT$XZ
S1mMJ0k"8XNUAD&4Pm%0UG00b@4),Y*U"GcB[dl`LV9*a'8&3SUXp&'1p8(Qa&B9
m(1T05B$fL)DX"0m8#*SE*9$Z&E@2M[i%!PfYhTd*3V9qJMqV9EqZ*S1R&*AIKDi
!8MCGUVZQ",FGmiT0I,8i8%fSe5#cr*piU%XiZL#DPYqc3EEmjGPBLh!lj)*591p
2m2"UX&kY-mG"a&Td)SB3'!`8%KIA$6L`JqR0ir8[P1B!qq!iCcjL3rT@3i1&I4X
'&PVK%"4U(*LfM`+f351"fN-YXI@F''L`$$E@Mahb5jrQlrIp$'`bh(*@FR&&'[+
HN!!lfT!!plh'54iBAj!!8P-(k#0BUpL"jcPaH`"QN!$LVA$D5R`qdN+JJ#eVNYT
'#[&-0#Z)cK*-[-er$F4'bReR0'Dl10Pm*BK8FjJE[h068re)*d1UqmM"%P85,TC
E,)rD'1S&djI(SY"rM-6DI1&A@Z'@B91C69d'*i#IS&)lZF%Kh2A+e@h1UGkTPDe
%DRkH4QT%dS1*6IL9!"f`65%R*c)-dEG"$E6"AEp8A8AE$f$lFGiFQJqeR)QLdc-
-BI-Ipa@iUB$(MNqEq01C+$'a[ifY89-dI3K6'8NTDQ&M3LR-k+!he%!M&'H@e)+
0e),Y9-2[qK4heM9`E)H#*&$lJZJBR%k8@I@dSKifTLN(FG&Im%APkk3J0JVe`%+
"FV"ab#qcB#+c@FY[MU-#Za3&BHKQh'pj)88K-lrMJdUJ,Mj34bPT)EVe(ZV-3aQ
r-Jc,BG8"'MkD1SHXj*6SQU&0jke@8KdQUBk8![Cp&Q#IMm#qciR3qDGZKM""MKS
iRHNCS2"iJ1#q9c*"e9R3&,L20k`$INk&UE5#r@YhG$#iKp"eam("[BL2R@5,)VC
f6cK*),@d$i*c2&3-Eq4M$!$%`"q5@dq!AABC`Yh45QV&6r$q4C(FPjYB99ep9hk
UZ15P&-$EcS35Je`i#4)#Umm'-)NNjlpRQ&"QZ#P!bjpPB9eH@9Md*er'$1krD9J
iKS@[r0N@IU9@@DLiQa)-R3CJC!i1B'J#`,"Dd`%-3'&+8bmDI'58e%NE&b'%E@F
(cI'AC$Lf"i6KFXE2!fYFPK`bCi,p(HSB!YlMYbFbJIk18Hfj,NFhJYFH*%2[+iR
4D12afHCF`0(&VrIqPIjU@FId*dEJF#HlDfIR'im[b1"elZL0akGPd&*JKBP%!"T
)6,$#K*U3!-'EV%jTm+9682$PLU,#8$&UR*4pZ6VQI`,$L'9B$G1KYFU4*FU"GFU
"G6K`KhS)#UXFPBVV4c&l4"FK94PpAA4GhEemY`@UG6YB3!ZP6c5S2M!-Fra3F)p
PTBcH3C[GB(3!VFF#5T-K(#U#(Q@M5Aqr4dEAmJDa*@T3TQbT#P[DbqkMM3-,cf'
5"0RBHFc'&"8H93JZe(*ik0BLZfKV3GUDM4S6J3%Qi9@#Y0JJ@V2YHL&r8HD#Hpm
C)Vj3IdG1+qpfG1ep"q),(EkIJ#SJ2NkTmqZplqL['L#q3ZL+aT!!"S%N%'$N%-%
N%'$%eZFhiMI$B*phB&ZZ`8FC&P1UY%-ThVLSa&3&H3bQ8"9He%T9L9*99JmYj)T
Jp,5-qHrif,#6k!0fGB`V1iIUEEL$MFaJ)r('1pM)SK#&)*pL8"-XX2T[XGX2,hV
dIeq8'ArIP'T0-mE6#f%bR01cB8Hh%@rXAYM,2h!-+'%JlQD5dbm-PkZAq%1L3U&
dFaP5)H&B'%&e9LDfHTbEl0*@8@6b(9%FBU[kBYk`fbkJHF@PlP(eF6K*Y,N$'ba
J%$5B$6IJhBld@Ta6C@S&$a#@M6-B0fG"f"2p%4c+-!PL%X3NJ)Q'54L6!#BIriK
Gb0#3!!+6M3`8BUJ@FDRbS5%D1DaEP449#Xd&0$!e@Xiq0VrXPQF#UKPZ@-BU$2e
dbqGFd8fI!1dCQhJ`+&qm`)!I$"EE6VTM'bb$3cGCdq!N0"jSQ'KJ`-M)CeaZmrZ
f+h!0-"RXUJ,c@$$bklr$c,,6K35e2eDT`ap`VlXXNJ`&[lV)MU*b"d'4$%#HG['
`AUe+dTMFJerYj%%fh(Z1f)``(UjhTakaJ65"I'hP4qla!(fT$SJJ-,d#MU$0HX+
`HM-IjV1c#S4T))4$LKS!+iDl+NqrR4k('+S+MZ1[bJYJl&ja4qBBV+reMKHPI[k
41iX"q4#1H-IlN!!3j4Xi#q+e%43[M1kC[1&!X[B#0m6!N!"I1'cpU*&+Dea4ai@
e8M6%QVJLM43A+)EmZi1'0@Y20Ic4,JE[jJ)m,06KFkLbLpQ%RCf&*E$h5GrM8*0
*hpG)D9BjR`$""j4Za!FX2lBi,'$6UNb'GKL8UAb'did3p13m"U&l6lMrC!2MYX-
@fUU,3r#fcN,q@6`X8`MrF0ak2m--(R(c(53m*abiS-'IS0#3!,E3"UXLQJ+`8qB
6+l(a-@HHKq$#m3lpD0kX4q[($fhE6P@B!'Z6%V"[FR2IJl3QLj8kG)dZ(!G$a!`
fZjNJ9B"!@+*#!*+V9`NJfGI$K*CHM9&PQr&bVAM*d&`iV5(Ni#"A$#UP(imEkmd
i+TL"HdSP&lGKCLaUcb4IY&8j'XRLkR(PXKH9bqS[NGLScLN[AjZNl54HSL&#YDQ
mR%'RJL#qejHjQJ!k+bkjLphFe6DbqjH*aeSTl4aL!D'l3,3B(,"1DMrJT(5B!-H
%UkT)%+GA*P&%[Vi(DBA5erFJN5)qD"(63UlN@')K9mY)h(*&iVcpeKZ&UmUf-Bc
DaN1Z"i-&ME38JmCK0!PPKM#P0K2XijV*2jfAeKQ!1"cX3J5IBIDPli(H1-*F0)6
*m@,"6*TJ*RYK(Sqc1['cQQ5PYNTjYG,Yr$Y[BGaBlN[pjX%V+k,'h0AaMj!!31I
8JT42'[h'-QClNG!&UpAc*+@C`mEp6$qRRRN3SCiA+A&F+C,dl!Vck4S-k!J'e$H
$3+6@H)lrrc+lKRckamU3!)qIqSfVNe)I!2,6Zh`lmcB1Ua+$([,#YmC4E@dQ4k`
Jf-V0*AdBSY")qJ63r+,DDb5&UZ%1dY3jGCQ6HG,i$VYQq,e6F,&)3Bf!KF-R0+N
4$BJQdEM&hFS66TD4qbA5,Hc3!,&Flq28'&Id0"*MB,b4b0H-mqXrck*6UTY$fLh
)K5IF#ic2Z"lSL5pK$%AbfAZ4$r(RKPXqQirmqFblNE@r4,$EK'!Tj9e+iS8M!Qk
+D2#QHV$hIU5R(q)1[Z9Zhi1$L,f-aFkN#0Xp9["l6M@%,h'MlU-%r`NeE2rNllb
CF50e-1&(1SaH%[jD%[N*%MJ'i,5q4!+[%Ph`bbX8BFmDjr@K'VhEMGjrJX!MDdM
J+,B[IbdKF,lek3,rFTJ%AJ23[-DGrcZ[YrIcih!8#"qp)EL)XcRfcX#p!%"S,j`
)HPK896YTF0%bER#Y')D8KcJ-GZE4UDlS+Kp094)Q`XXMhd#&B&C@Ja`8bVbpp`j
(hL16`5f)9`UEb8G@'5C2j#'i@P-+L6jr-21XXjI*,P`L9NdQ3E)UXEaPmQ0aibl
qZ3dh%0RQ0NiN&b6-#KIl85fEP@m8LEHEN4Cd,6"XkB(Uri&6dMFIL'D&J#Php!N
M"%NcTXJ)Ui3)IP4rF#-NK54JXH@HZ,1IL*R$-,NCb-E2HE5LKp6XUBE3,!KT#Qb
!Jj0RVhBD[B,!F%-L([acmj-`Z[leRqG%&6H#Ci26,p5AGL&QJ("3[0$,6[+SMVM
3@VV3+aK-YT+l+bk%LNDqJ3XjMVQ3!!dGZTq5fL(MTZc"8-+pI0R-#eb@`94*Jl5
3!$XF*5K!l"p5SA)#66!!`DbYBQCYF)$4eX33@ma!K9D,S@ap)@+0GSNKDIN(AG!
+NGB4)mA`Bjdl*j`i-[hZDpqhUF1$)6dHZ)F0G'1!!3VSQ8Ncc-1#PDT9@+RV#6D
UCLJEG5@LTM!dFEI(C,E1d8''S$Cfc1lATp0j(Y59Q+BQ-%ec#Y08-XJQSD-0hT3
BJJ(V8*LPTJ5c9(X`CSN,S`L&S@@B08)hi'&ZHi35aqF0c')URcAk[%k%iV%kU-K
0J$eJ2QQGE@HUqp,CErd,!2TZ*Q@HX*T#mmX8r8bSS5*1IV9J'!*jd`S"QJ$A",a
LS5-H`HZQV+D`89@$E"3DIbCT8)8TBRC1%iY@I4!@VGTjRPd)`DK9HjUT`@)BlVG
36C%*SGae9JaGcdRX&fmMb3bBf)K"3bdE1H'`KL'cfch@9$Zb`!mK*CcbT(#FF*%
EG6e3#!'+`ZiNT`S86U`+YmhF*G1+QS%NX2$4eDb'JJXdQ'h58da&#F@qEPB8T%G
PFTfb+%9S8BV36d@SF4(k"jkSQ0-89K$+TDfTN!$RS2NBCY#D+,!dKP$ZCiD`GFL
3!!8F$R(AaS#d*bZZBS[[S*YL@dUJGEVY3LE[QX*J`LPf4RErd3H1P9IG-3#Y8-P
[rQ,akMJ$hTh2"0jmAIrJ'b%`LSGD-AQ`k)+&1f0'L$HIH'`15X8r1IrQ"Ik%SF5
MEmE`k3F&+93p244(N`@)lUG9$+j"lE%DLLh,Hl4R3QqqhR!DNm#E0p)1d!C6aVU
,Rrm0$,)EaY*4r2R6"+YQmN!2r-!h-CaVE"dZmQ,K+SJFZr1X!k06r4X-8fZ4NaA
69bkGRAN@$eh%RmYZ@Ipj$'j,EL58A$L"Y06&f)F!A@l-m)#0Ri@cr%USM!Y)A9e
'JQZjCmikM`&EcR[pJ-,4)'(p'$m'KXDb0S9%$KV%rHVDi`ZapA"LECNqHlXSYXE
(%$d0MHa"9qI"V&4RiM%cm9L)(i06!Pd)3``P$[AXT-8J-1B&pk1#UD"YEU1(jpM
P0YD+alG"R4QS&SK,"+Ba*mFrmS"G0NGdG5Z'bGA9,9l0L+'%XH!%+I-3Na0@X)Q
KJ[QP1r%5L@hRCa+,qZK&@"#DSjDYe&rrQThlY,5&4YV#m&%,Sd-@TPe3PU3Y6"f
l8"iDXM$P6$5*SpHEKV`fdikpN!"fV2fSBbm0@@JI2*D(EPqqh[J-[iK5&p3r'4P
m5!`q`Z5XJ"3dI$lRLc!SEMDHbNIJj1$b1pShG%cAEZLBeBaNqZ!M2$!d@-2hL"P
Qm+#C@-9'"#CjBJ(I&F903d%VF%*im8T-'ECB$*p+d(cX-4j!0V,e0i,T!)YM+Te
qmHScQZML2+!i%`U!$U%V-6aH$c*33X1(B#Mii@@4V#!@%pX&#D'"H'p+F`50(m%
-9ARrZ1p2K4X,G`C&J8*P6T4"C8,T"+qp2B3&j3[bpX9&d88AQA9DGa)ZTjK%bSR
G%kqDh9PL"'IjS+6jYPF-irC#4mPGJ[eFGkC2B85$e`D2Nk[F,L+X,V"l+@+1MEH
("%C((AK#$#!+GJN9p[BMi$LpGJc$b[HM+5H8&c[$mN'Df&VY#fjY6S4"kiLp*h$
%jE@iml39$B(+FR,K3I@M04cB3M3hC[*UMJ-6CU)VGqN9NKG%-FRAF&4X"5Y12-c
$%d04QZP"Uc!lYiQQ-*AN!PYC-08H)LTT"'6c"hd2qYZ*h,6lpUB(-@b%a'Mf1c&
)2&5eRiH"&a[kDJR"%2+A22cja-02TMr-$%VT)VNdir+T,K&X&P`mp2Yr6[pUpTN
+D9(q13+!B))NVEc+,P14Xi*pS%'m1C@D("83)Ija!`SlUNjpmFPPZDY'k1h5c,J
3!brek!-ZM9&i!m0-QF+3!2P!VmQ$E'#iM5NMP'kmUFc)Jm+*)ZIh2c*5GbeA+Qd
GQ6aFac9h(`qVIGGLkh$Q-i"pfdimQaG0P'K+rc3)68d15fPU*b#DTeC-l64YaG4
+8`269TSk-69SQX(85G-FTKQDCM(0dA3ETPQD,Q+kMDB9Q#l50)pT"8d(--h6G"c
6!CT1B6T18aHQ8c6YaG4&dcj-HfNk!ZFcEbC!cBAN[fUC`%$(X`25a"mlrPMaTa9
r$#-`K$`R5BbqiPm*-6SrSc$bepNSm)m9A0$9MDj%UbmPKM6LCL,FA3j-,YI0)mK
*TP3"E!+BF[d&M&qV6AqKNrA9PkD[%&PILcpVQ+acD1NTaQdEEmJG`I"`AhbbQMI
"Vp#pZr6&rr+YflmkHV&[PVG8c3hqfY#pSb#jDf-KFJe)dB#i"TTke,SrAUXbSIA
0iD1"41LfJbeca`kq$-SmL&#p!bQZ)QGHZ2*rl#B$CBLNcHXSG[lm,q)-JJmUf&T
kV'Z%S)*U#eqLqMUDa,h$c%9eda)0JeRGaCHVjQ4`mhqFVEiH'k(,[mD[%FB[i0"
kFHMD-F%UmM$iF&T2%!K5-%LDki4#+EBECk5c9fP!A6FDai"'LhhXr&QT-jJZ#a'
2UIA1`4!Ij!M#BQ8&j[)#P$T$U"Sf-e))6&9NHA56deY2HZm*&3Z&U,$NN3Sah)m
[kVLPI'BeqG,JCk3hNND[!b%4Af+3!*PFFGS6T`ZQdSMF!9%SMV0F60@AL,Q5eA[
CP@"SL[LUG8`-f4`A`iBJNGYmq(l'[V@MF)r9T6'3!12K`*U45Q&RC3a43qQXXaa
i1,VjNBDZkE+'VPPf4qiaZP@IdFX$r#cVm#f1DQlM13ZR"YdQKUbE-S*k85REV'5
5J8+k)c9+3Cd8&bf!qAVfZ05qJ-ZJ)5XhD%Nb!%9K6Sr4aF9JN!$EFhUDi5SjVA,
A[(4YYMK0`6*3#!GD'-L(6"EAq`A89J!$!4H*MQPY3mGYmB#E(KM+b11I!CP8KKM
AFNULI$aaK%P-JQ2VPc"bd,YbYV%G$X"q)hLiXrKDfcQpZXT"FE"@pq5X$MD'LXR
mkh3e%&UJ$prQ`d(3l$T"BdJ0CUJL+,qHbA-!6m'HDj6GNLU4q$)jm$6Q!F&$4!`
CcYall*i-i`q5-SqKf1!-%[CNb%f+$F[%i%i9(+CaFQIGCSCe-[)a$0`28q[`RD*
&%eL82'S4`lZmk*1d440Be&0N2[)45!LT38Fp#Q0MrbeQ,')hViS")e(K`#S+-lm
YUKYS(#&5rqERdSG2%S16kS,mck'#,0%&'Eh"8!%*XN34C#KGN!$45r6!-B+-[ND
#"1J8R4@#M%iPMV!R"-N*VC3Zb&FlLmeM"4PY*N'QG""4qf#S),8E#8'@+&#-5'R
9*)3CIP8)dca+Q(DBBC166@#Um"cr6kD@)H!hKF4Y$i4McZ6a%bG"fHGJ!*l4SB,
kcd[rqLX@9'9TQU$X%"6qS5jDeXc(BQRm)%[*,,jDPVDdQCCUY05U,,8IY46NN!#
@IT!!YY6+5q8K@YUM,'dqb0,EY05GYV5(PME4dPCPUI9BJm45XGfjY+@Y@(UA&TD
qm-,r5CIFA*ffX"3,5`'RYiKrBL4Kc'(GQ+YeBfB6HM,GQ+0PC-`P3ieC$&"5),M
1##D'H463hPE9%1B!5+GRZq@El@",[iiYF"!8%Sm-(AcNkL+$INpf%Y3bbUcaNpH
9-+N9c'l8d`a!L!HJ#T[,S-N)@JI"cI1R'B6*6jiLX+[9EBJJaF1##9,3SG&aeMi
+BZ4*B[%Vq4r6N[@!GrfZmf2abac1c5[Kh(NdBlmeAE[XPZme1#*S'fljA+2"hQi
Sq%"4F(Hpbc+N`a3jHhm!"Fp$*V+6JZYmEU-DRlNherk&Hq`qb-`Q(GNp[4m2GBU
(jK#-15j3qP%6JkI3jYBJM!Pl6%ia249(B$$!(r43K!#G-,e%ZJV$b98`NI#-FYF
bA(!bYLGBG[f6QIi*2e1#PAmUKF,3&0Lf5JF5H*!!-E`-8CJ-)*!!QC1R3SS3T2a
c%S18(`,))XFm'2$e$"aAU,!YTaTU-l68cJ[rIB#6)H*bYD-i[Z'IGp,VP2ljRm[
TFiF)bQQ4K6kpN[CT"XId$UPDlj!!DNda#-e&6-1GLH4J8[a$6)"U**cYrH[r'iF
)0(`U,rS1TGc#4P`-CFC`6"Um%#6BfYU-KhL`9`$"BrKA*6K&Kd2AM`i1b-B2&[r
8GUkijrPk(M!RHSlp9bkC@pkdB&KNDI)(0#q'kb25NX*P+68)M2-rIX309r$a'-J
mDJR'T#`fqCml1GKVYT,LRU0ISbY+rZI`Z0PI,-C'm[,A1G4R)$5M,%E6*1R9dVB
'm8[V-FI`-+NTdA8"$5""4QiQ*KU*S!%``486-1GfT*Zim@2*B'2Jp''i!*!$)+p
"4%05!`"-hJp9$@C8%J!KiZj%ll9R2HUY1CVLA*UL2mTj(+Af#X-iRG,&pK3j6h0
hR-EFZPfSYRGAaEBhE@NkV*ZTY%S4PURJ1!l$ZLc,%M(8EG4TQPZA03PK@%1Bq[e
K$"'R)ieT3)dMrIkMYIIhrll[lhHrkrG+R1GjpYRR+aeP2K3"m3-!!C!$!#%'Le%
Z$3EmNAXrTd"+d#&0H+j-qN2(dPmPd!!FIRG4qUXKljmL)e8UPB$,CVCI@l9B1J*
JcN@Kc*QZPLECjplL3#JarG13!2I48BK!2`h`ma%Q*#GATRmd15$lQrdSbM(h2dk
Z0+`Ma"jh1T&Z`eQbThZ2$9R%J,'$`MlX@Xbpj6c#S3iCr'jS'F)rjp`P-cJbI35
GYHM`6blZ+A*E3TP6Jbc8[ZGAZI[6M&hi#@HjRCQc[1BXGkNm'XUFF#IGLYpP3qJ
@fE+Jb@9lfMR,Qa9NNlVe5@&p%M)RecGKdN&-dJqGT6Td@(9Sb5a[F)8F*NFipXc
bKVah(Q$Lh`A8QP$QABZCNpEJjad-9cUkBC5KJ1Xlq(N43Hj2(BHa,!aj(kH*KIK
C&r)qI!@2J#"0p`)a"aFAi')2ZcJ(2lH([,%q@Y!MG+cbmcD%JGY1b%"SNCM`dcA
XUMIF`CpX+)eHkMBBq28*2U$(jr!"TJh2j30XU#@E$l$0+c%qS%3-m!%PE`C1@*+
&h!F%I#CpfqjZQCDeM`h@NA10,3R(Y(q[&3Y#@fc'rNY`K11iYR&rD&'',BK16qD
[FUe$UIKMELYFPR@1(M2X3a(HKq-flTB3[B,#19PGk1`T*'F-!"6VR9I01jdjb1U
)Uh,l#$YqTqTiDE'*M6241XF(%&E(#TiJ%Q6*1b$XZaqpG$9+$#2'#aM+q,d9C9A
YlEl5'Tqe$,A8[IIqSX*ArR&L,'AG8bJFibJ3i@9MZk-@ahBRFrGi$2N3[MiN&Ge
!lSCB4KfeE0##EI5ML!AF@iT*K$-R,#kEiN63Q)IK(%-NG%M%KT!!9hCD)+C!q('
9K$'!K6NX1HVS5"UH-p8N)GJK'%rFEJX&f0&efX,%@lS5iSe3mATk'X4(`'hYN!"
#,2'3!$HkNd+aQ&3V!Y-9CH8RLSa+6A%4PXr9P"@AYbY&bVY+bDR5,bY1[1LVa$8
-FD$BH+,Q5epjHA'jM[)9'FXDG*`)b00KHU$AF84cAh-BjJIPL,&rreYQ%h0PZ32
'@R+3!-9@QF2#ZXX'p'H5fe!KV*0fBMi`j66$lAB9-d$`2Cafk+#dCp@+!q#D!9h
XiTlXG(r6a#Sa'#`)G!5i9j1jf,S*4&8J6-i+d$%4$eK#+CKXjXccG!b+3a)G[3b
)r@!qQ60,D(,@6Q4*DCK0K`)i3mcpY)h,a)L`q*lL8I,F*6Z'G$3"#FY5%TLXQ&U
%e"Z(3'[ZG*I-qX*GXRdq&Mm-C@l[&%p2d"-"62S'USB'QNJ'h-P91`EDFZq$-%J
lrTJ!K'[k3mjY-,d2XbQBfTE,h9mJa)i"3!-LKBe0@YLB*A*Z+XJ1Pkf+a()6K$#
GLH9kG-dABKQY6BLPZ*+0+a4%*&-Pc!6p%-U@X%Pd#L%hCa#B59LG+2l'N!$M@qK
d1m&%M-')jiHEc9f+%mcVXL-J#Q(%3e@E-3E(9eS%(3AXL8H5Z4CEPZA[If0QC&$
`Zfc+E4H)T3fa!mX`r8T@8r!TMUM#JMEQ4FM54'$b5hCTL`j)ZU!iGF#F2&@"3L'
+9([l+D[99e5P@)XVP1,RbT4LXe*qUXMSZqN#K9YI&TZrC,Id!Q@0kS!MX,54bH5
6e1bU,LVS8#e)J1Sa-Z`6U%Mii1TG#&&D'B1K""b)&hCb8MdL[J#ZDZ,JUe6%)FS
(i`5m92%%NH'VAT5Cdh56jJa-3#c)68S%E2,4-C!!$aUVHbF&UeZZ%LSkH*U%`pa
rJ5V`!KLr#EQH*@`R'pc$(M`R"Q%jNJ14lAV`fC%Fhf+(+)5p,"P6L3,TPL)K5Jj
$"ZN`",PM+3%Y'*r#B0HN+"iIq#Eae$LSR`%E0AbK'@[J)!Ti-LHKX(!RSH$eR'G
1fTSSH$e(98jL&l,cL-J9UJi!XRHl0f)5lTl(LYh*B6(-2SZ*Ar",1FL`If(4J0(
6c3kk)`'-RP#+Jh)kclC+(6!3STh8-El65aY'YN!YI''hcPkEMML1k-)A%F,ALSl
E(FIC8eNN@Uc!kb*iQ!d66&B63#DD'UYeRU8,aMi)4mc4TAF+KMY1c,e!E,YYD&0
1pLdL@X961hi[a%"F%F-'%SV[39$'%`qjQ+#%,kS)!R*'M*%%Jj8cT15cB&qj$(d
NCH()1P$(PQSEE5Qr85*V8bB5Qjj1G,KdiEk)S)a6ciE%Lh@jchVJ9)d[*IrkLKP
Bj3HSLmqC%4ZS#MrL9H*[UUN5Cc0#K"IG-VYS8T%V[2VH-%HZm&m&i%r*4UX&
eI6#+QT)'b$)SI$(-&b'qm2"&NLmLlP)l($hKiSFd0d+da"&(1QPdRVB&&DdB#+)
NTQGK%H',CVjSS8A35&988jQSX+NLUT6%4"CpQ$&A-TJ85ZYlhV55,Q[-QeEXCY9
#jNbVb"c*ZeR4KS,"H!-+q`T42E1UI"YRZjfLU(1b'e0R9Z,JFj&@U4K2@pmEBdq
2LDGl98q2X+FRm241r[5%%(EYkG5iTc&eCKNpl9dRPH,GM9hKK0J@+c$ZI4'f1iM
SFm&K5FF3AdE#pJHI*C8XX'YQ4Me49(MU`)NUTFMh-qANJH+DPj4U#0XiFPqrjLX
p89&'r&aeYrkVb(i[B'TaA+N""IdH99Bfi(KDlLEJ*I-Y0UKd[3[%ZmLk,%"KlBX
m,CA#k0HqM8VXDGQ1E*B&QDcKd+*Q#9+U'fSpdRUTEIi(Gi$SrEB--@)*JQB`N!#
b66SUqHQGY+#-m*ihHCD)d$&-l3XZSk13!,AXDaebfF##E[FZ1`PJT@p)!#XkRi#
9$Z$HG9)!+aeLN!!qN`"@p'ieX'MUKJ%#PRMmU8&'TSAjm0@`M$8CT$-2b00+[fH
CmT+-I*,MPr[cc1ZcJRcDME"%@%&#I8@U*l&VTSr4pH6[qpFC$2X[ipVd`qF08P`
mj-'Qa4-$l&KTD1(E)QIf+edC0U(#"3@KD-q3!2eief(rH`9(![prjeG0Rp4qUrq
"+hmGqfRIMiFI2RG"ZEIY[Z5Km&14CeUIEYl6j'Kjr0'rHq*[Grp0ajqfhpRpEpk
p0$SC[(Vqiq[[Zkmj$qlp5FKQqF#crr3[M[hFpAq2rSq-rrEKPeQR6YC8qFc'KK2
lAMT38P4XrD2bLV,R#Rp@qZF[rUmErr0lIjCfkmfmR)YRhmjprI+cErcAeriLHp%
lEbhlebAr-[XIA[LRjrrlQ[rhbVppp6prrPmqrHk+cpCpqi[-EImap6ZcPLlrqj%
IM2h3qhrQrBH2r[f@lrrSplIriECr[1-rVIl0)lpkl)mlGfcD[2A*MEqHrlZlIc[
RSEPr0ILA#alXrH@ZE`jmlCllekjDqIAerlcKVTRakDQ*EbaHQ,mph5#NYlJ3(21
j)UAU1CETUe)(EQ@GBTe3'L($Ul092S'UR8Jf+U$H"k!'@5M*H"U9M(&i)qYed36
ajVfV$*Qq*-LA!,)F!4*G'"rQppP,CHc(qmpHX%-*6)Jl3L'HG@#RVG+cGapHZqk
mP@%c"jJa!F@Qe@ka0D&61FbkRFjECY1HpaP,Q@%6,PYX#0dG(i2LB@%dUmL6"k@
FY")c&!P`N!!bY$m25K$(E[l!CjCCE+edi((9J4qV$Z`MCN22QYF95ZGCXc3dFdD
'C'pB``G`b&26JSM8`kF,A`&c9K(T#cZK)2LjBmrQ"K%8@0J,YlD"II6V'9Y'@03
#e8I6UCJIBUUUb1J5Qp`0p"K%re%DS2-06"e@A6BC#9LlkH+&NaBEVV8$dBjVbh%
YM1Pq3L6B6NbQ42B4dKk2,(q[meBBkM%QHrPNkLdb1CL[%"$++dM4drVH#+XD4PM
9X2"9&E[C4ZaQi5-KlmSC`@i@2S+I,e6XCTZDhE#T,c*fJ`bD&S3bK4Dp[h*Klr[
hfrf4JmKfZ&6ELi8@l8rlqCEcmS&4q346MNeFl!mY3RKP5)4Z0$5Z4#KBB9FKN8J
FQiarf!Q#eVL-K"`G(Qa[5mLlrM9DN!"J4(ViTJNp'm3Ue!GC5%BmJ-2K5#AHN@(
*`*ijXjaPK*Z-j,"A9&AT4maKmd,H9EGcKmh$cqHUUR4eR-0SUT-jM)R%IDYj"`&
Fi3-5'5kb*(+e'rJ!iPKlR8+m%&P@N4B9PbQRLT6*mJTIdBND4@FH[LS&4*h[9%P
G,15UjkT5dq#VHDRLZ4+Pj%4&bDQbQSBlLEUdJX#X1P9f5MP4SI#+Ydjfa!Lq4cM
"plYU#,iaX+f9LH#Arh13!&H2L%!($'iQ`dT'i&&)a-6*0MrBNmPL-lYC8#lKHV0
1(UeeZNY3G!9jK#*H%1'ZcfP-(YhIb9`2P9S9fHIR"r@c$,cl[JESLJCd8["&AhQ
a8P`18X9iUZa%S8mjqCcCl#YR9!FmS`6Cf&GeV3JZfmqmVSlFeHZdDcDe"q1)cPC
b5c)A3X*#2S+d2,a')bd,+L-YQH)Q)bh"1Nd,FX1YXRmNl@3-"DU993TiE,cRd$j
+))%%C')r6Fh1F8J&D*D93G#2Llq*a0pUB))I-0Tr[8lfkpRYa'DG3*YVQB*@'Jh
)R'%eC2A[a`#2"X$)!bD68'P9Eh4B$bp!!9(e5,IU%3qBI,mhTbUXf,-[1U3)R,T
5E(%fVV#XVTdP8`4TFhk(Jrm"A4Yck1(dAQ@)f+e1J(*K[CX,kcHV%GE"H'(YbTj
FYGRb&3PVJbkXAeX6,kb(Eh"Kc@dXV&p,9LHXDL&ParHrA('eX4*HLEbHJF"ZYM3
@f10REeCJ)BSQ*UijaJM!RHFJ-2[M33h"49)6iKXRM!a!KQhN#+Mjfa-X[4*aCBB
V`j[BLLkJ)(p)B#[C@*2Bf&KHMF+ZlD9Q(+``UEC'ST89FHDC#pLN#%Mj2QeLR$J
fhML%Ei!,iAMP3VJ3TN13!$C3*!rcF&-iVe3Q$`DK!ZV--4j9l0"@!a@%!0'%0BV
3d)6a1K1Jc2&h'3PH3-ER"ENr5-[U%NXHk*h!P!ifaIi$S8ikX5!YmBcCL`BSqG,
ZZZc*#H63%59[X)S9T!T85&'T#hAd41J6SKL`fc@(Xp"R-Q+h+cf$Z9#M$9clIU4
RD8j2$V'#5-YHqhGblMe[YdFZD&G3K#-mK%U16cEEl8KLQl,AP@[kkE8YE6hIZG9
cLkl6NfdY`h*T@P,Zcc%[H#C)$d@qM!Hf3i3Z[B&XaHPZ)**Y(&RjcGjN,[f"`65
*V'PrX"@K"UU3!!2*,e0NrGdT,i$)MJR6TbRTXU%"K(MF1f353KpSd)3q8'RfIc%
&Q3!!Ja"Ddh`iI6&cqQ,"D-(k#NMe@$"0P9%JB"`QpQ+m`SbL'PXbLI!EQKkSa'T
DL0A5S@V%UL1PSiidD)jb6UlDkUD%EhAIP+0#+5m`4qeN""X[LQThqG1%Zikdeqm
ZQ8J8FjZ@k'fUSNp&E#i,bV("Z-@P'qfmTV1UL@UR&5@FYG61RI9*0Fl+9MQV3)M
4eYA*h%2-H+-iAEC+A++)55+CFNBN-m0@H5)EXDf!LQhaE6HDBQV-f0M'!,BRKq[
H'%d5'qYDA2r',U3mqQ9Y6MGN2HQZfj!!T4%&!B6&6+$$#ia0D+,C@NJ00G[S5Q)
,%C!!*@3q-"BmN!$6)6ej)aGpFb0$LMfqHPpDb`&lS4V!$ZS#a-fjfl"9VpKUTB&
!FTkA1bpcCNApcR-FSDH)D'R,4R9YPrE`#@CJlI'mT9`,Ud$M'(+AM'd"!0ISKZA
af@+liqq-T&PX9Ah-A%Q)0hM(f55DY)(-f)YLX9-9b+S0IMIi&*!!c#4Q+'A'&Zl
Zm64ff8YKZC6284@Q1--Ae&@JU52&aXTS3ck6-Z4*FqM))Qj1TF(*T*X-Ic!8+'3
+'-p!0[F)EBbT+"cK)'3+#Vb`(N[QZQ`*)kTK!6P%L$5Bj'*-HB`eZ9Y)SI,a(l&
-Fm#)d!%-%G-#bC1aeB-NQVX4B1KJjN2UR-Fl4c48USXDr@@1Vh0+)NZ-GKlQAm"
8(iD-!@hUjaPFbB&Yi`l&Q@&61kJqdrRii-fCcL9YjHj+L[+,-1(#I&V9bJSC3k&
*4Z!G!L)cdib[G3R$S6GkP*%IMkS[eL6M*Q@1li+a0%"QKS"N$'Pf2#1RjPj8p8*
KU*`"VL`L8I"JNM2Z"R!$$,4-j)`+Hl!H`+)ij[KBTPEC#fD262EF$"UbCcE%XIX
!GmRH42-[FJ-9'UL,QXc#K(U8#pGD#,N6jRq6iPq3!$DB5rq[cHh-l59'8#XU-A)
ANYI#P)QiXN$Mk95d&kf3!%5HU+XbGI@3!$PGS'VUdm&$p3L148p5mUH(UIRlTSZ
cF26*N!"`04abX,,MD(2ZLJ`5&a*iEj3CejKb`R'1Z[*EU%b`+K`483%Z)S(HZN0
j6rABkleT6DaBMcH%,5#AlI-[XQ'kBQ*&)U!23AbLZ@#c$(H0RDf"3A8Xlq4L')Z
(f0EYSN"-Qk!+QbqH8iMi1m*#88F&#T0-bZ&IjMC,jH#1,4%SY4$4Phih[f$CF4Z
*8SC%eY(ZVS"))4RTmm3'k,)`S1Q(M8q`-)e)-RZL$8"hrp%0U$(+2M4DY[1YjiN
-QKk+%p8L#@iEK6E6d&KrN3XUDHD*DS"f4FAk&Flkpe61q[1PZRVDH*29%mX5-0)
8K6i*dP5K3J)6hk0-Q8G939%Kb,$jGUP*IGAfQ[MflUaQHbCG5350VJ,P#1)jhc6
fBD0CRDR$dX1*i),(CG3[8prdlDUFl*hD1lRUYlHKZPV(P(*-q2%V6NXe4!'EbSL
#UIEk+cCX[*XRi&Se#@K4J3G9cPfM1TRJEV!$-39#C8k'b0$D665`j2+K[p++Yjd
Q(G)QBqNAT#4lVNe8b00YGC'5#A,'VJSdAp#)`VZFPC%fr"J6NGkXU2A(Nj*hAHG
*ephMj1ljH6AZXB+aT#-T5i6BSB**e`-&iN"8(Gk(0L8f`-3l)Sk6abTed@jk-*R
,f+k6AI(kcfP$2$KrIPhZqB901mlVhqfbAC)F!6DpBE$P3Yb%+kS*8!rBX+Z&Cq2
59cL'Y'5!,%Fc*CP!%'P1"M22k`K&``MeDP23b)`4T1Ukh"TGjd'cIba"a"5P,lE
fV22X[Q$FLm%+95JP5cH(c6m09kGH'Z)'-DKF+VP-HB#Q(@eX%[[e4JURA'T+Aja
)b1%2HH#!%30#qDlQ9"&&9BZK++5B6aaJBC2V@-"i$Yc,#*!!r1486H1!5IVXVpJ
pAXdpAQXA,CPLVpI4I3Rra"p+V0@Z1Hd&PG1f-+H0`!f+jV34SE*jiE6QY)rLR)E
T'emPTiQM'&"598#Ch6J)$V9HlmBYfJ'cm20mb(YZ4M[!'hF!63pbS+3QJ(*mY3$
+pJ-TJ&+$F&@CVa&B"2C-!&-pb-rmFDC3bNPDpcj+Q(dG#lS8`Ud#XCS+%`V4BlX
[F06ccUZBXTHEqR8RKr33iT-CZT0C)!GUUJpRDdkf0!iMETe,6ZC93%!RBA@A(LL
ZS!46Y,p4fURV$*1q9Nmk#jEQJf!)C'-MB8N0V!q`"P&1,)ZKmUblBfJHZB-CK9J
'BF0@L*Z,2Z%35--h#Rl(h,*@j4D2VXL`pEVQ&M)%VS3#pSZD@kih9QEBI!HjK3*
L1l!P@ZLZ!FbVK1T,`KZ%2%0Rc0'G`3)j8ZjLS4`TjbVGIiD8N@0)EE-UK!h195A
`0Mf"QmdXJGf'@cb*pi5m2jkY*A'XF4)hlD)N#YIVlZhjX*&llaD&Q96AY50AF08
qlkBCcDAd#CY"("M4$R`KlN#DAUKf+3[@DZ)'a@8KAb`1,CckXr)6CEicF#TlJ%2
U6qC*J'P$JK&&HjJ#Bq0!rR@p'1lB'"r)rrTb(XJIE9`%Gf3`eiL2E368kLraCDj
Z&CL8!AJ3'Lj1F2LU)6Lb0@*k@m+XT4(!YI@6[3VlC%KUpM'BDe9%6MP)N9S5*Nk
@A&&I`+GFHR5%H*iGRkCk!-+FAdVKC2'Bi8-,hcJ3KG5*LUpNkC[S1UrU1LZZ)4"
BX[3G#V5V1TI`cKi-d1$!%,!NA0(#AI'+&NJXMG+L*d('bI,*93pee"rmHDK$#qL
9eNNNImV"XV3DX+6'NH`aPN%5QAh[m3%FYSB(mN63e93jf8l6Z+NP[miY,HGEqRi
e@pUL28rU8Aj5MF2L#!mJH3d@&EU(CG1TU!bMLj3TlEc,VR9eS'YBeHAAZNkMUdI
9CG+kV-K+$M!`LLj&khS$ABqTZNDeVKAS@Ll!bVV5Y#idcNPrJBP`&"ql'q3QZPk
fL-J"hZMLP8UFLiqKD13c2C-JVHQi&l8KEHZ!0U6YIkJ0NFadLcD%1p+$fK"Z5hq
#K8A)10QU%HFYPCS-0R$M9DXF-0Y4MIGUBI8BKG8$C#JS1#QMNCBlHlT##p'i58%
E8CFm+@r)*6*92L)(SMhbLY@!ci30)XcJ2N3IZ-+Rl0L6-YV"!NQ2N3*DY*PepQL
G`kac&ZXd@D2mL5j8+-1*6Ca1S`kQ`,B@A4fUl5@k0U(VG+,,NZJD3jFed99ZkVb
PG6k2cMG8RBUU-`fG+e5GSeTR&ETZ6h4eNB[d!aZcp&'GT6pL9bPCUY6VL-L)CqQ
rZ8`XA3")CqB9IejbX[J!XA1ZMC&SJPYFrT26ehp5A18ld0jZp*AGK&TA[KB-p-S
f4M#DpZb6[BCm!Mp9XQKBd#S(idd)U&jk2e3cDQl%C)$[,B`q3"pl(%$`D*!!'I5
LjLkBp(Zc6'cBBrBV3`rQS[,ZII"C1RKlEQ)U0R#(Q'EF!N23!)bQ[HVJKRkm1F!
VM"9b82p`PBS&rBLcS$qZKJA0Ep`mk@DV+&4YTRZ&fH0PAYF8*QVhTj9(rr+c3j-
LA!+eZ9V&[Mm(JDGKPE%A!B21[)eTSJ[N3HqKUdbTS,)`6bG2lN19*hHlbS!19Vj
40pcJ6cpp!T!!QI@aq9rQ1L4ASr9V"4mEU6kB3ipa3hb@5,kV(X-6I3"XE`3&a!3
Q'B"bPEq0M$R4rEH3!2K!f`$)BcB`cc3bE6`M!jfI5G0pZ+DF%+'kbI8"L3l6MQc
U6[e-pYFd"6m$)BJ*EFpScrBThm+RXR,$DHb4If*2L%0f*8,Mp'$*6Md)#*'bPk3
8UERFbIGAiq3XQMLjDUipCG@ZKrrdc[S&K5Z!$1,#pIV*K,RA0I2D(I99bSc0)23
c[9Fc9fC1Fp2pG,XU(!4#IIU*aL*IfB!Pk9&@b55Z0V&U4M`rUJS#9GkBE)*-V*5
"i&H)-'YLfBemM[*SlLr53Uq&ZQ)l)85fGAS@rh`R$6j&3aiaT-34dEb@Ghh)ZYE
bVK[-+"-c1RN$+8)ZBq&S6HaC3'5!GqE@mG5`H846p86bp@hUlZ%G'e9ElBcEkQV
9!GDi!mBUfHVYp@ceScUHLYpUNlTK*DPp*!9BeP)6PqNUl3'SF%blf'H+U1-,eM%
J+Lr@-F%(Er,Y5MQ2Sej3,0p"Sfck[!V2hZAc5l4iM9r1eblhSc'R31KAKkZG($"
[CHUEiX1RkmPid(-2%E%dj"YBS0VH((E0C$l(%DqPf(S!#VaZ9I23pETMR'mCL3`
JYGq%DfC8VPQ[FXek96,MYa`cdLG5mV8NXDC3lTFS+$FpN!"bZRP6m+hN3GIP3dj
T6ek1faJ[9Y1,pj-UcASaR++!arT%Jbd4`SaV20H3!'L`*CTL*F+#dc-`I+&51'5
K#S!EZ6+RQHUC*jXKU+#6dV%LQ-X"Y)jSEcp4K-E5CI&YHFkJ`GYmhHRZNVP(pDD
(8lZC8KifUK`8fjeU5EL'!JYLHe1Y$!4c"'LQ5,&Y'!CF!Y9m2Z8FQc*IZ(SUQA$
l9*F3%'13!#0LHS1bU9U1#U5BhQrHK%E'p&Qd6Gc!1mLD1"j8J5XG3#kCHbaK3TV
DcBYc1XLZCSXk)*mje8dXANmDccVdaeHPM8h$e*!!PMAVBd)1ikQ*8"aJ,LK&Ca&
J(5B"dUQJkX+E20'Np'AL5#'B4d$D-X(Frdk+#c&cCr`4DP-cUXQe[,Vm4MA9C5k
[,Uhe9*I@QkSZ0I*eG4+A&P2M+C!!9FHU88TTeLH"E$Q@D%LeqNEGkS1*KP6-[1K
GMHBYe%3*cC'DpHHF&d%!RD2'5BTG48iGSq('Y%-I5m@PDTV%cEiYL3CD8"0X$UC
fk`XlArMj)X!A*VlSjiXBA`aEmJ*j6)&ZK#Qci201NH-Ij&MphM4mNqF&6)XJi%m
0EA$"NaU3!"SUQJ,9N`)eP!*P6i%kRJ,9P3*e@%GCb)![$IY',PE&8Qk1+GX-B0J
5c#k-3['KKEU8[q[1ldcYcRm+Rm"8)5@3!"*)Z`TT"p)1T&q&p!2T"c+J3JD!$!"
T8L&03*U!l&FKqi(X"c+Q3XD!M!(*A5mR5U6KQ!$#JA19EGUMJfL"!&(dYDEM(l`
Y3"5p3@iBKK2JLUi)ZD+PECmmeYB5N!$hj3dcK#GeVq66SU3FJdrDG%@LqY3N9"A
[5fYZ2,9('6TpFe1(P+&M0cI9VJbjEQlUF@ASk-e0l9+'-ZUD1[4K'Nh(0)K5p4-
KA'rlC(TU9MJK@SeFHMEK8NpHma$%E5X3akLaIaJ6EZ#613"4#-THe23RL+BrEEc
KiaA4P!40'JY9c5'[d'Fek$LPbh-@ab5rPGS"$@*k00`#d1H-AI608VUJc$U4B*A
,H`5VA2l9DPMPLRJfpiGh*eIpeHbkfCbB&-rQrV$NjE1j2mbVRmdp'-IQ(Ub8c5f
Fd0NF0I&[BSViIk+X,SGBAD[pJiY@rpMrVUcZ)Q0e1G@`ZTarYeNG'QMP8`,$!Z3
Y6eRalA3lArUPRbm$-X#Ae-a",2YCi`jDaQ5-,iIPm2[h3bMe)ci[P&QY#FHfSN(
T`R`(#V&34TSk63K2DJBf488,lYl8HKLI%+$18&JbY8)fD*B3HhkTG5MFjAfENAL
$VILS-"T&`GLe[SqVUef(L1Z-JCV[XIpX`cqEm4LDD!X&T#PhNq6,%&T*JbeJNmP
2h[BcN!$6dci[Efk&Tlqq864CM@-2*XiH(Uk'2BbP9-GjFXRNUN&R-[G[aDGHUJh
Hd#6"'*im@eG)IrNj[T'Re4YalPRq1-XdBC[,d6apkZL2%IKErVM,*VCR5)@Jr2A
9VejprIc%j,(*i166SdY'e`DhMpT'XdEriRc(k-A4kk2AJT1M2aZGGI9IJ[mDr1U
S6I*r!!!Vkd&%3e)$!(*Q%&8,,DF!d@b6YpfPAXY+PPSlHjJ+elSXDbeY8j!!0!6
eERRrbd,DG9Zd1KahDEZl&2Vq0Qf"kM$M3JY@3+9!##E%'*1ML-TJK&,IEcE!1-5
3!%53!#MQ-!QT)*8!ib(%k6%-qrYrhlehllEEpa22R2-mjhN['fdh58Z3!!""%!"
"S"VrEY!#4L0q0&-G"9*-QKT584p-a4kT8%CkHBJ-cRq'CI`'8k,FLS"J21bTm)P
j6@*XEANF`F'E$-0hD1(KSXicBYlJ"%m6+U$)[m'k(Gdk$TreP6e'il"Mm#1Mm@X
'rP$TT5'ZU36+dS[rR*Flj*Sqh+&&"Mr5Y04f20VPac"rl!ID"!a8YBe&),ZBQ0`
KdD1'D,lRGUHdZ0f2Y5pSD%RTc@aXF"HFE!MZZXVFbl,K#m0&T-SjZ"FYdGQK,EL
&ZTK3mCT$$@AG)QMYcjkh&b*XZe)E-58KH'h&ScKlb&JCD09dYQNJ(K$eh#(IHb!
B4JHbbYi'N81UVB*M(He"`q92d)+2T`p6!(NdhH5Xm!iaCCICP$ehA"0G4G59`&l
HlX&'rL5q+'`DaSH1$`Fql2KS`dF%(pd*Gpa0kNl,V-f-SUiAqUV"69Ce,&!@HQ+
ZVjFU5VcJfjFhdhr`P6eDcR!A@rJmcQ+e8K+ccU9VB5fX$#m-c@3XCLKKrXMY2YN
JlpV[$JAp@aZ[e,B%8l`YGFVl(chVGUFhTTj-$lScXdcZ(kRM&l5lmc*VIAKIh8$
hVY$@"dSfBm[d&H5#2,0,rXdr%XJUU3fmSfQE0JDb(Qc(lAQUUNI#AR3A-ADdrKd
USq6I#1&`j0IXL%%qFKDh[iTkj0Imb-,GG'4KPhaN2Ql&D%F@lPD1I*XG5@&("[L
b&YE4NHmZchINfmU4kpL4pq8M@0E#Z9'2A-H2P$e,4mUXmK%XUqa5Y#0Pcl*ZVGR
VfN1[VQ[hQ2eDiH3GipGG!UKf'cjZKdZJJV'-@-I3UBM%h"9Q"6Z*)AA9dI(Vc#J
Qkr#a!XK%"cB6ipL"#h6JP[25!mI',h+J%CL'MbSi$MS`LpM'$ML+(l#-ArFq3+I
cF4f0j8CfS&8q%)Yk`0b6YHl5h3&Y%VpCj+!E%3q@+UdI`LVIp4UR``Ah'DH$eYC
%EACJ1J'aPIeQjIMlr2LL%)DlV$SDM!eXk`08A@aVjV$D"1HY&ih$JCdG1KV[pHb
!3*A&$KbK!rrM-qF$*9BFX)lSXhFCjl%$#DSUGL!TfS&&06MJk00R(cA1C3GdqF$
e83q-JrSK44RFP&Jj+dUX#L['J"@M'5Y'bkaB!9D-)9D`ic9d""dhVA!h3!2aLaj
[6bBFGkRmmPI&Abi8SlbXLr*bE['ACCGX,k&1J,S*e'CaR0ZG5JjaJC0$R(3-ER+
AkK3pQj!!1+"Tdr1!dL$JDJ*Ckmc-#CB&J!,UilVhq5-e@lLP6EGT1VE9"dZ9PfE
f-LapZFK4r1@kpk8[-@JF9FA!5V$'UMiZUZ'2LTK3mHd@M5XZZX3DC3NedTI%)0j
N0L,NS64He'##D3V$8ZTM'"T(q`F'p0lLd%4"#kQ(c6pX#,B8A2(,$[Ll1*bCk[C
RTJITr6A9%8p+hADbcYe5Gc+cT3'[hEZmep+M#qp-Ur$8U-*65AJU&dl"-EJZ#!a
XdlUG'Q!*X-%f#f4Q&9`*URY0qK(IUk'P,RJbUhP0e+EU%QpSZ&)FF$*rYq'GfY6
N5&8CV`KkVf&Eil@XNlA[*&FD#8-+KT',Ze+E%UccTcGHHa6LKSZ'Bi415N'd$TC
HdJLmGX"&')fj3rkN5pM30CABR`!LCkp#&dPAIbbq1m(!&[2q+ipb#6D&6!8R8rI
k6fDQ*dIFYAcLhQfmQRcZA$[8L&FpPMH(H'P"Q1T&+``fT4eGkK9@(&hLf+!%U3r
qm&@MbkkL53KSJUkE,M(YL**Q4G+!*Y8,bf395jep0Q"kZaBTAB0ZK!!kZ[60)+2
6Nik1-SjfKBq1dZcaZaSlHVCVEH)*-9BREMiG$$rHjjU+MV5LRKZljZ@CrIIh@'i
#12r`NZrK+"SNHq1Z5$H%YMfa4SZNG0&M#!2L!A[&@pV"Ze`$)#c$`f#P`X6H`G)
1c6YN-RjQpMRb)#$84'*U2a0MD!TlZG+Y$DBV,EA*dGLlPE`S9cSL9GS"TIAS5PY
*k4-BT)[KkT4qH2($)'Jq9T8@D$K8GU4-"D'K3f9#J,YFGPR4%8+@h#&#&epAr%4
SbN!68lH#U@X3`bVCChkhYF%A6+DkUA*c"$904L6TV3)a4',4'!EhQKSENL1AIr%
G2jh2c0r%pMDDJV9CM5R"kVEH5eXhq[h*f6SphflI)@%TQAA0,L)kJS[kKR,k0kV
mY[)D-hAM4N(f(K4`"`M)0R*hTPiaGPqj99Y+#,kB%*`4(3c*Hfe)EUI(E)ENr4A
llh*e[4+@S[GqlF!3QT3M[%P*2T)h!i4X[GB-NYH[Z*88$d0YR4-P8$amAhPFHpK
`Ni,NXZ)lC84h%+*$EIe52M5r4'JZ0k'%l0P6,NQ4rG1-)(ZD3+q-)h[eFKpSC+p
qkq3Kqcf"YICq$aELkk(QaeZH@dj*UchPK!MH8lQRH*!!bc,q,r[C6`pp$8*(TaY
jq'-pjDcamY+VdPZ4*,ZIAT!!B[`,0(Y618QXM8EBCK+!J%VqiZh@Kl,+6KR[f6f
ll"5pCX6'jRJ!@BVLm!8&-ES(5`Fd"YDc)6M@HmY@VCH%!lPkN!$b`B(PE3V9i`3
UCh,f0HIi-ZaD-XDm'KIl#GLB9a-iC-bE`jJh4fA0RTrQBaiV9-l-HcE$c'ZQ)'8
B9I-aEapRRT4eqC!!ETE#Z$$G4'1FM@er[kM@q%#K@JX&kUb%&NMmXS`bhK-UYqU
GGRV-,NF!GJU&RX5mZ"h*APDYh4qD[8fEK"3,q[QVMlViCh'b'J4[hSKGh-@'&E%
8fAYFQ[DCZ1ZKE9Ulm4p05-rUkM2qieRcEL@`mZEL!d-B-NhFbSCX8SCXBN0LmT!
!Uf+Hk%@ST,e2ImKVr0e$YFEI'8Z3!+453UR"(Xdr)"l&&kqDFYMa9mqD%CLTX*m
@mfCl%3cc-Z'2ipMMaR8)UUc!L`A'43$fN!"m`)iX@Qj'q&i*ek"bbRLB'&dKRfS
jBMC86D"6PAlH4RVj)"Me@c"P)k8pf+S@cGFh6%CdSRi$),H(UIpE9kHB63[[d-8
G@1),bK*I`"*h'-Zaa'bfQ)9BbN*+8N15XQdCYbR"DQb(3-Um42C$fk()DiU3!0I
1QQqaD1d)C5Im"pPAUpJAUmkD43pY#J#baAiDAbd`VQ3$hQ!UVf6$hQ!U)pN2eGa
+S+CPr-3ek#3GhB0#mH2lq5-&fA2,U@2C-RlM[)#A+Q4bH3JN"C+U+F54LdH@Z%f
hpe[j-2i#3pr+C8&12"C3#26hfbK%Md&M5448f`#NljkGKfjLUUJUTD*Hab*IVcY
L1)h8PSrp(9K%eE[EY(lMCJ6(0KHbi"JkHVV%RHKH)Z5E)L2I#68mCHleTepTf&C
G#DU(l%fEqe$FVX(Q2QS-Mp*p2+$1Y['"FVDEL&h%(#,)!p[c%H1EE-5i6Ge&(d$
G+8cG+DSblhA(!qLQ'E%T5"eB8+b0#IUj8mI9L05Kj[+YhVF0J91eb1cBj86qTch
#&CAiaj3DP[*j0DFeKiUHVqmY63'flDRGJ9Cd[8R!ka%3aTqDd8P9q&D1jiLrX&A
cK2eG8)"e@Qf[p""aARK9mm63+8D*edJD$lHbCAp('YC+qkU[DR,hIVqD3Yb(0$b
f@,XT3S9ILicN82(h!cb-Qc[Id-*``EG+f"SKXMHh@$$PDM1U@U&U'92eDJl8+C*
&Qdaf`d@iY4i2TS(jZMfAdb-F#ABi20M%EaZkUr0PeX@YX#GVJmG-S,e%@#*I9ef
EdPdA33HM%!IiIZDS"[$G`Cf!1aqJRABZCJ$-jSN8+UZGQ4L2`X51'+Z+)L)fI(C
28kfN%R,DcMI$BL3I'EpL,$kIidRb55Y[[3QeM'N@EIiN*MM"Q,h2dj4qd)RCdN1
VU$(3f[)31+#2`fCI`K9[e9`MV6RiBU"1Cih42KZK9JV4VUQYK5jEK44JLm+hY1'
`H!5*`U`,16`IiC2UUl#rZ5T8$kBA@)Ai&$U3!$XNZr6-I-4,fUXcHD6,1V9L@31
EK1+T&Gi'aREkRXDV0Rqf6'bf`dRVq#KNNfU@bCA@0PL+aR8CT@)",*J!9YJ93H@
XJHj(`p#'$cZl&I!BB4h5!VDa!-bS3iFq8S@e&b0Y)'F6"m1"bi&rB@M"1[-D2r-
!(E,)F9M&1c4VhKZD&@%JZlKA5i6Hd",fbkML)bi(ZZ*CPpHf)Zm34b)r(3T6U#Y
NpZqFM@f-mciLT'XRp#YG*ZTSrZH**kS,,f'BRBC4k)%8bLN,6B'B0Z-BL'N,DNB
['c)+#4E+)"$e$ZTq3*2q"`!GTakUeAjJA)0$#6D&DNh!($!!I,UAUDGdidX8l#9
!""08V(QVQ*)4HS(1P`4#QBQZ6FB('@$c)%Kp(-E([DV#%,UHJ@6VQG**E1#DN!$
j#f8a!+eS39@NKME@ZIMLF+95J0IC#R!FU4+B&,Te0ffQ0'G#*AId,!fMNc&dEXP
+QD&,'%2RLPZECHJ5QD(E3Nf-REG$5&Y`PX,-frN!J*kV180pmGepfJqNbm#50c"
e0l#P*$%3G$@8A-fD&cXrb#B,KLN43bjF2m`IMNplkFU8%b!L[-'KC#08V(L"X6b
ALScIbP#kKm+,l(8RN!#5!IHq!h,$JDpG(8UK#KI3X1kmP640#5(**2V#hU3)32)
)KDBF2%LcTeM)181VPcD@V(JAS(MVrJ0TEpCpV&"Vmk6Z6#lJBIP4PamGY)@[6aC
T9CdlGHJ`B90)B5!VTSP4X&Dmi'SP"mPF%E&Q1f1S[I--VrSIMSNMM1F+1#1`08V
cikR!P+%c#+HaJe[,iKT2$&*&GHiN8A*&F8BV)2@9j'%)"kNrMH*1Yc''ec+'E`0
LVj9CRXM2FU$fcaPUraaXjiLp&SLpPM1rF&rDQ8q-42(5M6@fB#(F53fa'kjX,Q2
Y355-eC!!NpLYU5bQLDYJmVCL6U*+BI1R0MBM,Dh+1-D$G,*'N5E2+k*SFSI#H",
(@"q4$&#UJ'r&e,fGXbVR2C!!VRmdrK0$(#eR4'Q8`c591kkEl*[,rIUjlFJ'lEm
D$M9*'E"d#3E0`iYKaSCDGX-B`BV8*JJPK9YFVUJ05d,5X%a9'aE'UL)qf(m!C"H
@JfNMj,6#aY&SY-)2,m%NIk4q)C8KI'iA(Np`Tq#"+&qkb9jL$Nj`TB""BaSr",2
')#f[%bK)5B8+JlKE)"EjpV!0+T30+R%EAVUN3qrM@e4LLk0ih-&85P!M!FDY##D
aE9C5SUMXj[B8kf6,)"UcN!#UhK0!j6YQ9S'K0h,"a6S#-baBGCqmH*4ZJ4-`C`$
F$Z2))!2k"T`!2[VL%J1126,4FCD)$PrKphk*`P)Y3#dHPaeXEfTkBd-`Z39rT8S
F@XEIepEM33*d0FPf$'fl+4$"N[`B%*!!aM5rPEDLKfeQF'+GUZT1PRbSK$ZYl-'
U#5`&JJ#Y6TS#cC-eC**dV%+5MP&*8LE)4TD1b8H@rXbf13h&a2*ST1Pbjf%63Cl
bC"U&40dDM@"23`S'rqCCpkjM*hCSb5E'hiIU6c*Lr%Q9'(rPe#%PaKp,)c'H`35
3!',%q#4*Xph$dQ!PK@B2T8iNmBkI!iHF*+m[c53C*2PY'5,*LbRF5`U(E3Sh3jK
lTB5jCr#3!",QhJ`6jSHNqqZ3!",QmI20-2SpB[6e0NBA)mqVST!!jeiTHDk`A(T
SA6(b[0r9$[+meiNmliMHMIU!NqVH4d@U(qT14QG5ADFN)jF@)r!bj$[!L282C'"
[8JD)G9A8[LMNZPFQelhBk$'!C58+ZEkXPj(V0*AjN!!3kdPX'BApC*`"+-B4c9m
J)GX(9E*GLJ5B!T%Q)Ylj%*'BA1e#DlBc8GpK)qU,(k,%9Fh"&bFKp#HrLm*RV1+
%2NYZVD+T(-NNmpFbmRfY61C[M%,QFhD&D5XT`j`*rTaqVQ61cM56r*T@,Qjp48,
dlqU3!$BSM1!ZN!#3!2k$+ZPIV&,5%!LSVP+d@GR5d)"QV,8&"iSI!NPeRl4LI#1
B1Z53!+V`,J8-U&Sf506Jj09pB09p2Xl1EUNB[blLTDC4-+8r3d'%qK,kU%(R4Kl
ffi))I!NY9*MprDbSG9#kLP8,U88M&i8Qc)-*20d0`1))qqSp1Cc!KrBGTS##,GQ
&K4Ak,pYHbFU4'BFMUU'(0)3BkNPm4'",-46"R0*f4[+QC"4Bm5N159Z4`9"$Vc6
8)'fZd1LS3UF4-bJCRj*Q+"dI,b[)eA15K!fVBa9J#cZdAfSZl("[G@'(`*K,qF)
14pqka013!*5d(0RTa96$&I@%(qVVd$0%Db)+Cl(UZ-UU`i6LmU"F)4hj+`4&TBB
9P4Uj8RK"H4!&j8'eDJSl-a5)m,*!a%DjF5S5b@`%K5(ZCkbQ--4'Tc"%1aPeL4U
'@+1`hH!8KPM$`K"VmS8KeUJ93H+LKb'1[X@hBNU29BZ(iMB2B,VK@1-'*4cK8F-
4FAh$(2ShDXi0j690Q#)b$k'**KDD1)(34+&6D!+TD`K2d%6FpAMCTi3ReN[$%c!
NXi%aSY@9mZM#%c!`dd4E5N)8KQC#&&GCm'#+UjD&+,Da%-8Se`PTL#)`4JTHXd#
&`,DUN!"XaB-9KRU#&D18B-@Ea1S-"#[U6Gh1(kb3!*Z)jf[-D3aFe,Y*P-$&a3`
6*@Vi`UZ',a5!@!eIH"q`m%9pMN-5[YMi2b9mXA&F2H%,Vabq#$Q&,cJ42eBKiXH
S42`$&,ji,1hKLhV6$56K#iC3ST+QVJ5"LaAk$K6kP8UK4c&#J&`Yp%9USBpVeKJ
&b*5'*1'K5DIGLSS*YHXK4+##Y+P48!CC$bNrbVJq"3q)#R5NKbP`-+S#FTJq6FZ
[2TC8S+ESlZZ&m4lGmfVCTrkLd+YP6pf49IC8fDIaf@@ILMZXhJ35l6HM%+6dL,(
90+&k0%r+I6-JHTFLC6FH515*45LmQVE&0S8h`DI`fLhMEiJR@#'bM&pGN5JAGm5
pqEFD`9E@*$&T-iM+)+C-VZi@Nd*QN!#UI0V[E@bDC&MCR,Rj2lRijYC!r)3e6h4
JUhMHDfKN4V5`2bbHF"@@EV(U[Liq@9""F%cC1M!%eSIMTe49a"h$p[c++"1HH3"
SPpYp"Fl%Ic)ef+*1bNeYHFF8*!4`ZqP&rN#9`Zpf&*&YMI"%GCJG@ic9Lb8-@!a
@,miJUaFABl8$)4Z'6)G(B0L$XpPT'l"jmIqLE2jQF6B$Ad(YTejY!DiLD64Mh-l
2lLd54Q`"ZlFF1RCRhbZcffNEX([,rilX[TBmGUmJGP-k+Far18b16mfT[&Yc"CQ
F#Ac!$)mL#40'+#IL`aj)ekc$)h,6iaJXMF#X(&aLM-bM`%hZ9m*J5IM3AEe-f*[
RFf"'GB`&%`53!!jC$8(YFL#S`mchcY`bFL1#ZKFEACKB-#D4VL8LG`8U!SZMZQL
Va%AE94GYVk#%#B4SLMLj5B'($SdQ"M%R2$8d*p48FM(VVba`CjFC[2pDA@C,X$d
CIG2F6-XDeD6D@eSVM!NLP"M@FS#'kimapBer$*Ahk5B(1Q`jNkFRpMkDKJF33*J
kYa9aQd06a&LSLGJiX8)RJlCVKUr(cara-@VB%6$PDS'pU,ilj1V$91&Z,8+*&Q'
PqZ+SYUP+pE@j)T38S&6,U*PE1Qjd*6e%!2BIZ@S`6cH*0AGpeTLRb8HL%hN9G-$
H(p!S6B356jfD[b*2KAmH#`hpdCEq5FhJJZ3fJfZU3H!a$)81U#MdD0MF%@DS``@
2'kK3d'F9X9JT))c*T(V!Y%eM,jd,LVeB3BP)#NS5"ApG!QFZ@'VhpF@6X(`5NFK
ViLcYVBkP6E8fPR*%rLka0$PiA-#G3UA+e+X`)1Z)-53fB"Q9ZH8M1Md`i*R-BbG
4Ke-qCGX)($dBSb!T!Dp3YNZ#9ZQZl8J+U82&9)V(BAaTG-V69%%$IaGS#Lc*3"&
[)QDb)Kj6LcM[D'9**ed,)6Vi)TCrK#(U#6*0V"Ec+l80fc,p,FRY*LhZ-YA!c+K
L6V-V68jcM`3CLPcl&A&[RLq8h@CK"YaQ`32J0MRSl9"3rr(q$,M0kU(`c'[0ZXd
Da@f1c9EGTKV8+$a%MP1YZ*p@icV(CX"e@P&jGU85"e`(HEM6fAQq5`9mV1`mqjM
cl'I1Xk-HjmNV3)Il[-%Tp0#mmkb(!)VL2&@@9$*8q[!3ZNp9p0Zb!he4iN$(CYL
"(R3#0"a-[-"Cc&aS2h1K(I@i8*@a6E8UBp2L3T["kImRZ0$k3M@,B@cR"Ep*6@!
i8@3CAlB1,&R-Q*&9YSi(C!M8CN'0$C*8L+bb&fPkbYZp#-iXjLCjLL8qG,&M@fc
(Q0'H&fJECKiU0IeN!bhBl33NUjhr#"Z#E,"(*aZq+)%TS#*ek4m)-0*BbDIhV9j
Z-SE-RSMrIM+-6H&(HSN*0[cJ3CE%S4JEqGUUBS[ZiC2l[j9eFQr3AId+HGM#6KF
+B8Cli6ME%PY,TU4d[0+P"TL'jSUHdL8pqSERkGqSjqHAejcq@h0%bckeD0Q"SH!
0E1S0$`GG5QR%[$jhIJTj+dd%T[qm-rG(rI`ECJ8Pkf6$APY!%3[S3Y"YkX*E8j'
3!"l"XU3,'G!)b3`9(Sf#m&M!,i-EL+"4!RllXAe$kXRDk'ZSCR1qY13X`9Gm#6p
8Pe$Ef*,a04#k6&I#MQ5dcllSPbPpPlV8cT%F,4MZMlQS`a9KCX[ifq[H0HQDF6T
ef8`bXmA-Cq&2AKNp@%a,ia@6#H4CP"T4eFl)PU25XLALeXe[#@-9C,U$)4a#RQe
2,%XTXNF#jRE$%mZ#piJRV0`XaGd3Gbdc*9JE&Cp5kImeC`0X+JS2,&U@dSd%kEC
A$NT-BNb#'c3X@ZBG#QjN+-X0HCc$0V8RkqTX`ICLD*[U6C8hfNfALA$B'*3L-fG
&AAqrVP&b"L81`68QQA3!&bh0$)kTJkRE2+)e-c4*1[3J($Pef&$cda81R!lmKK+
)X'%10JcEMp!AICVK)Pi98QUl2D`10cb$Pj4Lm[0Q0K0P&3id-m`Z8E5IdTDE'5c
)Jm-QPmYPhk1pkASkM3F%9lpNk)$c8(D*$,1k%!Jfmk3YMCZTiRl2rdk8UP94TiF
&q'q)pj6IMB*2`FQUXHc'SHPh!Ch3MISkZJJGF,k,DATejb-)eaaMU0-Z$AdVXP2
*j%%eaEcJF,TUUN8amcL*YNZ8Sr[$iD-d*4jDFL&)8q4,iJ&6aDb8Na&'lYUG66$
+qpZFZV43@`HkU$QANl[*K'E--[i2G8K!kdGh88kE186&H9kD(%JUP3dUJ4RCE%h
pQd9c(F8ffdHG@ffPC"6$UG-4Vd@mlZl3VE(lTTcA2UY)XCr2L4qTQB0P&,TfdQX
b`iZ"pZU0Tl$153aC5P-l)k`cTR[TBY`NHXVY58!Y$V)X`))EVmMmcamfflSVP-Q
G4iKqi8Nl%TS)Tap$NS`@fU!TBp3e6k0qS+I2+DbSkBNJrJmQ,2Qec8iVMI%l
(pI(Vr6TAU-DQd*&U&5*PPLM+K1rM#KNN#R(![jdDlYVQpD&D#$'hki9HULYRD5@
mH6bm#JKpUkd6Ld6r59T+mJ[H*4F*U4J!1QY(T8P-UV-BeZP*jN8QETk3!*j%6B`
VV)UBQ3Ap-QhKc%cmMq)#(-`&(-$@[*!!@k8lYbp`(`h@"ZX!59@M5(&KDb[5,-a
*(8`A8)bS*MDalXB`TTb2aS@aHJ&-KTf-Sq*L4R%c%RE$Z"5%a05S2*'m5TR1lP(
0QCU[1EQZ3fpDe&[0GdS4S-jdT*3U`1[pZFUNk8aQd-Y"aZUD3@IZ-"iMcqk6-IE
ClmUcPV'ikN-ZDYckC$SYV+@a6MA%G&JaCcHG-jdP[6*dr+T@lID&!Fpp$&%C!*l
E"pDLdhDe)H"9c*!!-D1'pdH8#GQLBPa,G-,Gr#b48BI-ia#"CqAQQZd`q6Y#h3,
+9(X3$Spi02f4R9VB@K%2Jd!$mBl+ea-cFdrP0INVCE-e2j6DUPh3khCI$DD5TUE
'&2IKG(8K#f`X`&YD4fMVBG9S$BLLbB&hL*!!8%a"[Xf*%j[48K"FbiLFmLFa8QJ
CA[aDZINeERkPh2`+0cp4ERk#QpZ8QpY`Xe5j@BUEqFV0I0aFTpaFKjZjbXeFh2a
BZINaEQj3EQl!c8h+c8hb4DYDBD1"#&D3!*Kh#'Ace"I228j$,TmXD+aV88a8[PS
fchm*2qXE$qEK4jaGYRieJ)Z29SJ!Ff&D'5pVfA6#m#EFE239L9PP'`FRG1*'4C!
!jjJ$V3LfCVCSXYJ061!'#0a!!XYX!MI8hSZI+LDULSQUHRd-LEMSGNZ%U)AI&$1
Mq--d-K8,acNN(ZL9FBphMRG1jmY%3TUUB)MF`6Z601e!0Rq"!lUTdN"T#Mr94j-
`q[T[2'4`3A8#,h8#!IE#qG5Ld&a*EC'6m"JDdL9F)1)e)'1,2TUQmb%GiqR%mDZ
9lmqdaNSZTqa,)1%&Yj2,QP)+VE&&[r36FZSB0URNFV"'M%fiA1G&)AB-(q(E(pJ
%3fT-j#1NaQL%#9JRfpqX%6hH)GA8e&0m@3eA#YL6CL03V8Sb0bh"p1qrQ5NHAlS
N%6"pl6F6cZ'##PadiX52$FqGLRIjHX@YCf$U$N$@ATB#i6J6)X2-H036Fl"e&fh
pr`F6jI,0cbMTee@8Q(-'Jr!"pF@3!'&#A0[mQUDRKKrCbSbI-ZGcLLmb2E0@A5$
-FPf`+Se2AHAb8P2Kk9*6q236!1Nj%drFC(KZcJ[AqF2aec8(([61QCd3M-X$`1R
GQFQ@LKmm1M$Fc3QJ+AbM+l@5VFK9QR+!&2DlF9(9RNh-p&8EQS$`k9)m4RaGY$N
KLqArk"TH6h$TG(Zh@4p03LIR+Db9eV`+@,'JkIP+keh,+Nb&KJU9D)KVLH-r(J@
@6$HJ#a1A+BbTAh9S`pM%8$&-,#$AU+!K+[d)5,bN#4`j13*N-d2P9Yr!ZEfN*L9
-h3QAGSiBlX%,Z9[b+AQ4$DEd60X#p3K62f`Sp6qGH!59AQJik`Z,aeb$m@2I@fk
krMFc6CA%r[PRPjZECZ,VQIkLeXSYTI21RUN)M'B%TrHMAk!$&99LBlb9QKfidcY
2d#AZN!"1FHc%Rb0f"M,)#mN+e[Q#EPa'33DZ`a(eXRLSiTNG@Xrak`bQ`X4%`eP
r#)Xi1rmbAj!!iI4T[T6`QG14dHa4"p+q%+%8f["T2-5c&f*4eMH!'(2pKCfcSU%
%PL4'@e*YX,A&KKLH9crTaT6pV%qkHbD)Mpej6![IM4Yd'q0(I2k1BjpdZiVSTqI
jZipaNf!98L5q3#Vel0A#,rc5AcMc&`[(Ip,Y$p-"m8DIhM16Lk4NrmkCiM(Z4-V
GcZK*S6qki'a5NkECrlD`b@LmAA-dJ@l68T*`SDFFZK3MFmeY#)-9+8PH%CLeBbM
bp"lqm''k5+l+SCURI)UfJ,,Ah!A16U'I0N1Prf"qdh*c2-IN,6'R&&leLV2"L#4
5fk@%)MmFLk5D31+iiXJ'N8#Y&pJfAJG!kS)AiC`l2$Jd!YF@AN6Uce125jEE*6f
'$[rMhR+9L2QHdUDL3lfZ-FYpp53eZShT$C)&Jm@2cH%&#CG2NKfcUC!!dX`063J
JGh((6CH2"5)erG5XQXZRS+h#S%e+3,DI(#IIr118B$hEmq+0k6L1-d6@dK6`0QU
F(ZaCDNJ%cRMaC9GZ%ejhpc#eMi34i`ACd+U*4r,S8VNAcrrRqXYdJi[PR8l0KE0
GBTd$S#4Xp4bD4fp&fFAJ+YULc*`b)0dJ9-&I"pGBjp$#kaam#SYPr'FVPKTbb`%
FHF&51%$9L8cHPGPDRD2VlVfUlB$LVR$ZU4#TV'qHA$!'*N5Ga-B$ZHA@J'H#(j0
MIr!QIHAq8)))ZEMFVZHjmJlG-%&eKeB03&Z4Z%2d)VP6Gl%Qf&MjQ,PZc'fRKc9
-ah-!HHiLN!#+9k"V5[`8%$f5b,B#a%6k+K+%Fm[9T["Mj`VeClB'8jbV0**I%3F
T3Q$$FkIbUf-PGI4cB*1i8cb&C",G,bDb%@DJk5T+DVCV+K84+,J#EQKRj`39T2a
kIZ3UYTKKQMLP-mCB66YKCN!2fP8!kH5-4)"5#G8Aa%CE%10L&T1Y14F5Q+rI!`B
II`j9DjL!a2b3!-c50iLP52AI@@)ZQ!U'XLDRi%1N8bTT[kkTZA+aU2$A"B-5N!!
+l'V[hj0M-%$T&3'IdUfdr5cFJ`I&rS6R$QfU6fR'8YZal)1&HkHrJJXdl08-B&d
4*SKeB!Lj`40LNAqG#Nc0!Bc2-NfKMFd9XZU4EQKA0UcNDDaAME3T"+fhQH+&+'k
l5KC&VTdDVaklQ*0hQP)UfLDL%k93ZpQIe28TdVFGl,E)(mEYcD(Rq6$rcj33%I!
I-c0DH-h"LF+C"K[U%9h%40qXL,kCL5jb&[epQqL@aRb#@GSTM$*V#Ib)5&keDK(
$+QfN&)QXH"9")"BLRR46LfTbShr((kbcXBe0Af@-5UNdjC!!19!bM)!dFSK#L#b
!JN32hF0N[RI2)%!d8f'*Q8hC)M,0kL(M'%`aN@i4A"&MVKlUX-+dQ!JZ4Kr6M[M
YUKLfdCX!66@e#TiN#ZeN5Y5&89FANYflilS[qpa@c4T9h#k3!%Rj&bV33QPTY0"
LbfY6PbFVMZ4EZIP688*GNCaSbJK9%Y1"5R,B%%e*,&PX4d"aM4l4B1`A&kb&)Bf
TTPl!E1&lG6)ejlHc#@`hN`KfB*BT9Q,1kV1(ml3rk,KQmiE#$X`)d%ph%"P#+8D
SK(j8Cq`,-`*jlIT%-FIe)4qNd5AqGAlK!+j%X*dCP`#"L14`Ucp1#r!lE&Zkl2`
SHq93&Q'R,N9TakqDf(V+lBBP9MF4mjT6P6LJ(+Pj)@ShCCfLGKJr1M0rSV1!j01
N8,S)KDcXiM0@@3dA-ih-4,T%rK#+rH&#B8aPac-GYL(%LPXfD4IdL8K6Gl$8V`Y
UY9fm8SXPTqCE,V[BTH&pUUEMFY@&28f+SBF)SE+I'8DX[CeARcq!9)hHj94Y0mB
Tb0m,!,M*"j-!0)Q4Uba2hd6k!#Tb[Ub1D#Y+Z80F),qN0+8@j+[qFDBN3SiDCFK
KT3ZHd"h*r+*IP&6ZVF4Lhe3R%8p,+mm1YUJ#"c4CC$r5rA96%DZ)qJ3@X3FRTJ)
0B)AB#3hJC1%NA[e+p0-&[8(+il'2-a#ATL*$H`k2N!#0-)QTm!lK+p(9CIP[G&Q
Q1`*P943Fq%UmQN21PaAme'e""9jS9+HB-b+FT9"Q&RM-E"-VAIL&Zr&KkKCNcDa
Q6CL"B*098)#U3bkqe20[NeZGi'k*Z(h1iVa$A0K,EMI,M(&H*$G(rj,D"$PpUES
*0$+%q&k*Nb#`8P!ET,M'h061`3Qi&[PfD[)k*m1jK@(`F)Ke6(5V65+3!*8Z4Q@
E(-m+k%8rfeh,jbk,r'b$e0%dREdD0e@Q1L890IdFMGq8)LaerQLaS%2UEU3$$TZ
jmmq(j%Am!!4kf8A2P+hc1&#Y02rT"C4`A`mk+Zi+6Mr#%9-Zk(lQR5ANH6Y8A*k
*MBlCFr)dL3)j"8QH4l5E-FRkEU"H!Q,lfKl"JY(FLSpS%CF)JLp4qL!!m%Hd5I2
,@H-E#j)KS-,$jXPQ-BH(LI`Y`A3e8+F#9A[(XY#@mTfN5dDh-Gc'B+S+6&&APk(
Pp$JccQmYaSi"#6[NJpSDhN$lfcVa``rX(4[AEN*$"c2EKI5PVmkjJVm`qeam1iP
Md&P+5mbrL`'aD!K6LN!365U"S&5GXpl96ep1D!+DS[X#Nm3S@5JbJ3HlV&,%F#A
a@m@"GJ,!l39!18+0-S@G!f33S'Y`*R1DGPpE&0AXj0$CTFZ8kPB"5V#IjU6Ef'q
AGPbNRqI9`-G%'e,ES3D`,fB&Xh$T&9[`K5%2JVpd'ABBpM+*)(G!G*PL(6IZ[(`
V,Mm`lE*i,25m[5R[X[mH!!i$BL`JG!SpXCE)kYGKmMAfPh,ckB[QM[#D*dH1q#D
*ah+I&j[5rJ1abplDI@[&4MTH*,qmaa6EBQCN$Gqm`Rq2fJ8'GicdR(5%)V)80FL
j'ZI"Z@j8A"m#cCQ0EY!0YX!QN9ZrhkH!ZJh[0,J9q&m&(0rFV3LR,bAJZdcZSdR
25M)PPG!Ii3#Qa#M9h6,q+ra4,Ck$UH+%ej5cb1!Vl*c*(SV)"6(3J`Vm!0ef[Xa
$`6"0'aZF6)#@@VQAd8R3%*4FZSKG-)-9S'fbbmbQPkCqd(T(UR5@,[BH2LkjpK0
`emMqf!@&9ZdRfK'!&U*fa$9!Ak6EREk`Df5%`H&+UX-I3D(1b![fC6pP1MJ$jY3
4FPpjY9dKV&2TQ@ZSJ&36%TM`pd1Kmq9r+KF16rRqU5m[@m*VkDqPYUUUDJNq,1k
[I8eS%CSXHhEHE(R@mY$RA`S"I*3q-mh5mFrVa`Q,KFFY'baZi3A,+X%rIRQ*-)Y
Hri2`IcY[Y[aHq-5bQ,ffp,iS[24ABHCIGbckhHSTclcmfM1GIhkU-qQPTX[#0`A
I'jp-#EMK$65Y`r,PfVA#IkeGHh6mei@QV`[R[bk8rV2`m2F[0`P2I9diB"Qrii$
`AjE41qke[2Mj0li5r[[Rici9rSc2(CrYFPKL@pm4(RZ$,S#VrDY!kbkiD,QHba-
1#i'U+L',r4Mah8H@2ChAK21@(`K[6aBZ@rlK2jCECN`@2[aBH%IiI),`iLIM,$%
m62LmA,JGkRj,q0fiji8T`X,268m*PKR#XLF&pm8RK*52KI2#f3R#ki*PR1A1caZ
%9crIDfRrr%r#,i3b(*JPr-[R"8m*hj`KV1F(JM0Q,C`adh+AX&$iq63KEiE`JA"
dKR"#q2BdBI)d)AZ'N!!V"'B)JhMaTI$"-pm[%AB+PUd[rFk5KfAPPVmKl(VTAkG
mH9&iiVH@LA-UK-"I9Ui@K'N93YNU)I"'qFU,(mpj9CLelZAI#`9I#UNc5S@KH8+
SiUr2Arc@UE*Cii5KFZ(T9kF*re%U,!B!N!-B!!!Kq!!!8c!!N!-)!*!$)!!!2c`
!"kR`!*!$#PM!!&h!!!"G`!#3!aTZ!*!$!AB!6R&+JfBL3Hd!)#!m2c`!!#)mUI!
!!8T"CJ4+3'F+5%")35#!)8%!"%+R3IVrcY$m!3![##mm!!!CELm$B3!#V&52Cd"
#1!TH3UF[2%4"9%%r2!69U"p`!4(!#Pj+RfFB6R%`2+P`TdC$qJ!U)SK"qJ!J-$b
TF+C(5S0R"(!"6R91l3!L6R&+JfB#UI4`!%jeB!B!N!8"6R%I1[rf5KpQ%NMRi1"
"q[rU80"1ZJ@Z60m("bmkrpj1G@"b38a"4%4$69!!!`#30&"b3@e)jf$`G&#I`Lp
)!#!J6b*8-@N!&!!B)8!!*$&m!!%!,0+4)8%!,U!#hm*-h`m'6R9+1!THC``J+J!
)C``J3#!3C`B[1[q%6R9)jam'3IVrRR!-)LS!"-+i!aTKT'B!!6j)H[q16VS(EPK
2X(Vr@QB!!3kK'Li)##S!3!!%C`BJH!+QS"XX+J!%+LS!#"JU!!5Ae*A8)$Vr9U%
H2cJ#)'B!!1a86ba))$Vr4#)'`VJ$'PK"B3$r6#!krcc!Z!-D3IVr1##!5S9Q"+%
LB!3J4D!RCJ!!Y#T))!j3J%(kr`JJJ#!kr`T4J%(kr`!JJ%*R5(S![#m95(Vr!Lm
krZ)[1[lL,cVqbLmkrXS[1[l+B3!06M!ICb!r!%U&C`JJ6D!US#YJ"#"0S#-J6U!
I)%HJ'c(I!L"JB#"1S"mJ4k!EFJ!5"1F*iaRN%3!"!#!#!3$J)%fJD3)!!"q!!5"
0S'V9e0I83IVqGNU3!'F)F!'JQ(!$S*JJ659)!!K`!%cIB2K1G8cIB2KJ!2kq2`!
J6U!I)%HJ'c(I!L$9e0I8-$J#)$(!#Q#4b#9)!!K-hf$i6R919J!!51F!1#KZ!!a
(q[iU4IVq+L!8X**Y"#!5+)"+J'm5)&-LEJ!)SLiJ&0'6NC*`!'!%-$crf8cI(!"
1ANje6PErb%MR(MJQ,J!)+#i!$#KZ!"""q[fk,8Mre%)ZrmLK'Le)rma96kJF-"m
k!!a&!!"[A%KZrq``"90&2`#S$e92,blrl+J0-"mm!!a'!!"[h%)RUCYC6bmZrq`
`"P0'2`#S$L!I,8$rm()"(`'TQb"Zrr"+N!"R%&92,`LTTM!I5-"b"-#"Cm3[,[r
`UD0J["!Z!"4R#PP2,VJ#TL"IS"Xr2+$m6VS%KP42,8$rd%U!C`!"RLm!6VS$ePK
25J"R#R!"(8!!&Nlk!KK)E[rN5'lri%KZrpK1ZJ9U6qm!$#!Zrq#K(Le)rp`J#'F
!!@3J,[rNS4iY52rS)!KR!!&8,blrj#m)6VS&Z&"2)!0Q!!#Q@8m[2%024%9#CkJ
I)"mY32r`5S"R!!#1)%!L8()Bdm%[#8kk",4B6h)$X%&QGL!0)%"`+0(!,8Mrp#*
Zrr!N8A!BeF!Y5[ri,`T1ZJ5k@%mY32rm)'lrm+!T8%SQE[r8*dS!+&P2,blrm%k
k&F`J(h,Sd)&4J#G!!#a96dKkrM)[,[rd5'lrr#m-,`3[,[rF,blri#mZrqK1ZJV
'9%m[,[r`UD-NE[r8*@lrd!!-*@lrh!!3*@lri!!8*@lrk!!B2cbKQ%kk!eC86bC
!2cbSRdkk!dT86b)!)!Z`J@B%F!"J!R!")!!P3!!F*83!)#9-!#4)H[[-2cbJr$m
mS2a1ZJ,i9%mI!%kk&9)r2+'B6VS$$&425S"R"(!"S*JJI!!!!9S`%%M!i)"b"V#
"CJa"qJ#Z)R`!!!-m)SJGI!!"rmJJE[r-S"Y96kJF-"mk!!a&!!"[G%KZrq``"90
&2`#S$e92,blrl+J0-"mm!!a'!!"[h%)RUCYC6bmZrq``"P0'2`#S$L!I,8$rm()
"(`'TQe92,blrm+QQ-"p)`()%`)&R##mZrr#TSQ$#*'lrm%U5Ca"96bm+UDB`(dM
!FJ6!J@HU,`UTSf#N%#lrb"e!!"C-haai6PiJAdr[!!j1d%j@rra)j`!`3Llrr$m
mS2a1ZJ)X9%mN3%U!Ce`[!%kk!B"B6dS!Ce!J#LC!)%![+!!-2cbJr$mmS2a1ZJ(
H9%mI!%kk&$JJ5b"S!"#J(b",)'J!'+!I)(`!!!&D-"")`1#!FJD`J@B+F!!JI!!
!!c`JJ"em!!(rr"!Zrra-h``!6Pj1G8j@rqK)jami@8qTG5!I+J")E[rSU(3J$5"
!)""bKY#",8$rr#"!A%K$l[rX)YJLf&P2,ca%394"2c`%eDQJ)"mS3#"!*&!b+J!
)NQS!"$`"0#S!"T4U!!)q!MBZrr*)`cJZrqj)a*D%1!&)a*D%DJ*5Jq+$282rpMB
Zrr")`cJZrqa)a*D%1!*)a*D%DJ*5Jq+$282rp$BZrrE@36e$rrSb,[rddN)p3Ir
i@8p#TdKZrr4)HJ"QFJ%I!A)"2`&brbm"3LG#TkN6)"mQ3#m!U(-'K3#3!hJ[$#"
,F"$4`#m)U2CC6kPe)"q`K@3#B2496kPd%"pQ!Q$fF2mr!%*R)"qJ-Lm,U43[$+Q
M,blrk+Kc60mFq%jH6R8!!J!!6PB!!%MR!$!NEJ!))!SQ3#"!)LJ!!Jb"38a"4'B
@)LJ!"Jb"4%008'B+-#J!#R)$X%&R"(!!B!*`!8cI$!"1ANje,`TC6cmmU'j`!4m
!6VS5H#"I*%KC6cmmUQj`!4m!6VS5CL*I)%Uab@B'-$`#!'!%-$`%!#4I6R919J!
!,`-f,J!)-!0)`!+!!!!)!%U!E`4`!@!#F!!Q(djH6R919[rm51FF!$BZ!!Jr!dk
krma86ae!rrab!E!"CK!#3`Ir6VVrJ,"$EJ4`!'!S@8mr2+LIF!%I!%kk%I!J(bS
!@8mr!amZrra1ZK(J)"mS!,#&CJ*`!%cI!$K1ANje6PB!!%MR'$!i,J!)*'i!#L"
+)"!Q3#"!-K!-38&%CLJb+!!#$%&$8QBH0J4brlC"CaSJ+!!%FKMLU!+!!*!$rc)
$5-'`J@F%F!"J!R!"(8!!$NcI$"K1AL"IA%p1d%j@!!"96dKZ!!K`rcm!6VVrNK!
ICa)JEJ!))#J!"()BiUJ#3!$rB!*`rdjH6R919J!!98p)EJ!)F2mr!%kkrf33(fF
3)'i!##!S!!3#J!$rN!0J!R$r6Pj1G8j@!!")jaJi*Qi!##KZ!!`J5c#m!`&`!#4
-*)!Q2!!!!56ANJD5!!!#5!D5!*!$)#Jm!*!$J0Q5fC)S2!!!"*!!fC,ANYQ5"T)
!N!0m"T)!!)!!F!!NEJ!3*)!'NJ#3!b3'NJ#3!b!'NJ#3!dJ'NJ#3!cj#3%cI("K
1ANje6PErj%MR(cJQEJ!)+Li!$#!,+%!Y32rSF#6C`#e-rqa`)0R!,8crm(")fF!
Y62rdF$lC`#!-N!#,X)9M"R"P6[S!XN*!2J"#3$e!rq3f"h!NYN"N5(!%YN"N"(!
!B!a`!$!$@B"U!PD!j)"i!$J$,86rq0LZrqJN4"5!)#lrq0#!d+lrm#"!-+lrj(!
"&"*b!")#if$4E[rN8NGJX%*!2J"`!6`!0JG`(lC!C%4`!EC!C!4`!'!-F!!`!e1
!DJ*5J1+!H!!i!be%rrcBV[rX*%38J#!Zrrc3J0#Zrr3J3$#'F!%8%R)!%J,MB0a
!8NGJY%*!60mFq%jH6R919[r`51FI1#4Z!!JQEJ!-1Li!%#KZ!"*#3$`!-J9`!$!
"d)!d"R)!-J+`J@m83N!d"R)!-J,5JG+-)%%`J&*'B0T#3$`!F!)p32rb0JDf4@3
!!,K#3$i!3N!p32r`F!!`!q@!d)SJ3#!3,8$rp$)'F!!`!G#,)%!B%(B!&J5f4f-
!!))`,[rfFJ(!3G&Zrr"`!$!$8i!d"h)!-J+`J@mq1#lrm(B!0J3Y3rrmeS2@M#"
$5P"Q%L!Zrrc3J0#-)%!`V[rb9'lrmM)Zrr"`!$!"d)$3M#"!-"!p32r`B"B`"G"
!d%Bd,[r`FJ!b!Y+"dS`J36#!8NFJ,[rdiSJY32rdB!$rE&*'B!$r4%cI(2K1ANj
e6PErr%MR($!NEJ!)0Li!$#CZ!!ib!h!!-!(QJ$J!-!0b"m""1J"`!#e!rr`d"()
!-J,5LL""%K"`!"!"0!9b!$)#iU"b!F#"dDlrr#)ZrrcMLG+,)%%b%(!!-!%Y32r
m8N8`"A))X%&Q"N*!1J"54$)Z!"*`!$!"d)#`V[rmB`*JUK!Zrrm5,J!6dJ'3!!&
-h``i6Pj1G8j@rra)jamJ*'i!#$JZ!!`k,J!1-J4`!$!"jS!m!$)%G!I#3Mi"GJ!
f!0D+)%-3%(3!&!!Y3[rmF!!`!63&FJ!b!Y#"jS"b!V#"C`ab!E#"Cb"+J'FdB$)
d"R)!-J*8JG++)%%5%(!!%!&b%11SJDlrr$3'FJ!b!P+"dSSJ34)3F!!3!H')JDl
rr#!Zrr`d"h)!-J,LU#e!rra`rh)J0J9d!$3$NS,LU-"Zrrj-h`6i6Pj1G8j@rpK
)jami*Qi!##KZ!!iJ2!!!!564VJ!5)$`!!!*)dDi!%L!Z!")Y32rXFL$6VJ!5)Li
!%Le"rr!N2!#3!i$9VJ!5*#i!%Le#rr3N5aJ5GJ!@"#e$rrMQJhS(aN953ce$rp`
Q,[riiS0k!mC&9%-p3rrQGJ%k,[rQkf-p3rrSIN$)"h`!(!3p4[rLH!(VC&0%286
ri#SZrrKq!FU(C`Kk!$S%8i9J!RVr28ArhRJ)286rj%T'CdB[,J!5,`!r!e*+,`T
1Z[mk6qm!$ZG!d@lrj#mZ!")[,[r`2`-[,[rX6VS,#%r[!!i[,[rd2`-[,[rX,bl
rm%kkr+a2l`!13N!p32rB-#lrf,"Z!!aN!!%k-#lriQFk*%!r,[rS,blrp$mZrq3
[#dkkrBj2l`!-%J!J#R!!%!%p32rDG!!d!05Zrq`J3K!3FJ!5!00Zrq4J($mZrqB
r,[rN,`Y1Z[h`8%mp32rD-#lrjY&Zrq3`,[rDX'lrhQB@-Llrf&*ZrpK`!$!"d)`
J3%)3B!$rHM!ZrpU`E[rJCJ!!P$!Zrq*R1L4!2blrk#mZrr3r,[rN,`Y1Z[d'6qm
!$")!)!T`!"!"28$rfR3!0!$8V[rX)%)3%()!%J$6E[rNB"`r,[rQ2blrj#m,6VV
pD&"228$rfM!ZrqE4E[rN9QlrfM!ZrpT6E[rD5N"R!2m!1#lrf(B!0J3Y3rrm8i2
@M#"$%"!L,[rmdS`J34#!8Qlrf'$1%#lrhG!ZrpXd,[rB8Qlrf()!-J,5M#""%)"
J!2kq-Llrj(!!-!&HJ1D!60mFq%jH6R919[q-51FI1#CZ!!JU,J!-+'i!%#`Z!"3
Y5rr)F#6A`#e,rq"`)0I!,8[rc(")em!Y5rrN,8crP#Bm!!!"*0HZrj3J2!!!!NM
4V[q8F#$4V[q8+$`!N!1!fDlrP0QZrj3YE[q8rl3S2!!!"*!!fDlrP#eZrj6rZ0H
Zrj3YE[q8rlcCV[q8,@lrP2r8F(c4V[q8,@lrP2qN)$`!!)!!dDlrP#!Zrj53!)b
`K@-+F'8p3!!S6[S'HR!!,J"#3$e!ri`NE[qNeI`!!)!!,8VrU#eZrk6rN!!YI!!
!J!$rk%KZrqJ[,[qN)'i!*%k3!&"2)#lrk'B+F'Fp3!!S6[S'0#4Zrj!!8NUel[q
SBfJJE[q3!&*)NHlrU#e)rr3JE[q3!*(Zrk3Y52r`)'lrU*(Zrj!!,8Mrl#!)C`i
JE[q3!#*Zrk3J,[rXSLiNE[qNeHlrl#e+rj!!5'lrm#mZrk3JEJ!N6T!!8%mJ,[r
`X+lrp'3+F'Fp3!!S6[S&`#"Zrj!!8UlrN!!3%"e!rk"b!")!dN&636e"rp!`,[r
3d%!p32r5)'i!(#!3d+i!)#e!rl!N3#m-,blrZ$mm!53[,[q3!%kkqr*2l`!1-J!
J#R!!-!(4V[q3!#m-,blrY$mm!53[,[qi6VS(ZNr[!!i[,[qm2c`"*#mZrlJ[,[q
d6VVjA%r[!!iN3#m-,blrZ$mZrp![,[q3!%kkqk"2l`!1-J!J#R!!-!(4V[q3!#m
-,blrY$mZrp![,[qi6VS(D%r[!!i[,[r82blrd#mZrlJ[,[qd6VVj#Nr[!!j`!#i
!3N!p32q-,@i!)2qX)'lrV,(Zrl"N!!5S3N!p32qB$'i#52qBC!!!`M!ZriaQ!!#
-*'lrN!"55VAZrkKMD#"Zrj!!8NL4l[qS,8Mrp#"Zrj!!NHlrT#e)rr!JE[qSNHl
rN!!Y52rX)!KR$L"Zrj!!)QlrT#!ZrqbL,L4Zrk69l[rX,8VrN!")E[r`,blrT#"
Z!#41N!"36b!Zrr#`V[rdC!T`Cce!!#K1qJ4#)'lrN!"5V[q3!")3F!!3!5i!F!J
p32q--!Gb!F""d@lrQ$)ZrjK`!$!"d)$3V[qm)%!`%$e!rjJJ"q+),J"6E[q-B!$
r1!4Z!NMrQ!aZ!3$rQ'33)'lrV&+Zrk`3V[qCB!$r#!4Z!3$rQ$JZrjKf!$B%,82
rq0D$eUlrc#"$-"!p32qD)Llrq0+ZrmJJ34)3F!!3!6e!rja+3'F!!-)-EJ!Bria
L!!#B*'lrN!"55VAZrkKMD#"Zrj!!8NL4l[qS,8Mrp#"Zrj!!NHlrT#e)rr!JE[q
SNHlrN!!Y52rX)!KR$L"Zrj!!)QlrT#!ZrqbL,L4Zrk69l[rX,8VrN!")E[r`,bl
rT#"Z!#41N!"36b!Zrr#`V[rdC!T`Cce!!#K1qJ-S)'lrN!"5V[q3!")3F!!3!63
Zriab!$)#ikL1J&"ZriaJ!2pLF2pb)$JZrjaf!$B%NS2LU-"(d@lrQL!(jUJZ!*P
Zria#3$e!rjJ`,[qBX'lrdQ3!!-)`,[q-CJ!!M#4Zrj!!8NUel[qSBfJJE[q3!&*
)NHlrU#e)rr3JE[q3!*(Zrk3Y52r`)'lrU*(Zrj!!,8Mrl#!)C`iJE[q3!#*Zrk3
J,[rXSLiNE[qNeHlrl#e+rj!!5'lrm#mZrk3JEJ!N6T!!8%mJ,[r`X+lrp'3+F'F
p3!!S6[S#@#"Zrj!!8UlrN!!5%(!!%!%Z!(!)28$rM$!(FJ(!3G&ZrjJb,[qBF!!
`!G#!d+lre#"!-"!p32qB)!ILL#i!8flrM'!!rcB`,[r5N@lrQ$JZrjKf!$B%,82
rr0D$eUlrj#"$-"!p32qH)Llrr0+Zrq!J34)3F!!3!6e!rja+3'F!!-)-EJ!Bria
L!!#B*'lrN!"55VAZrkKMD#"Zrj!!8NL4l[qS,8Mrp#"Zrj!!NHlrT#e)rr!JE[q
SNHlrN!!Y52rX)!KR$L"Zrj!!)QlrT#!ZrqbL,L4Zrk69l[rX,8VrN!")E[r`,bl
rT#"Z!#41N!"36b!Zrr#`V[rdC!T`Cce!!#K1qJ&D)'lrN!"5V[q3!")3F!!3!63
Zriab!$)#ikL1J&"ZriaJ!2pLF2pb)$JZrjaf!$B%NS2LU-"(d@lrRL!(jUJZ!*P
Zri`JE[qX-LlrRR!!-!'4`#e)rj5alJ!JC@!JE[q88UlrP"!3)'lrV&+Zrk`3J#"
Zrj45V[q8%"!JE[qX8UlrV"#!)'lrP&+Zrj33%#"Zrka5V[qX%)!`,[qD8flrQNT
!C`$lhL"Zrj45V[q8%"!JE[qX8UlrV"#!B0a@E[qD)'i!'0('-LlrRR!!-!%LE[q
XNqi!)*!!LC(!,8MrP$!ZrjTR*L"Z!"M4aV(Zrj4M'L"Zrj45V[q8%"!JE[qX8Ul
rV"#!8flrQQ$8,@i!)2q8-#lrQP0ZrjT+3'F!qfBJE[q88UlrP"!3)'lrV&+Zrk`
3J'$F)'lrV,(Zrl"R#("R28!!+'!8)'lrV*(Z!#!LEJ!F)SK#3$e!!#K-haci6Pi
JAdr[!#"1d!"`2!!q)!!!H#!q-#!Q*L"i)$`p-c)!!$T$Efe`FQ9cFfP[EMT%C@0
[EA"bCA0cD@pZ-$-`-5jM!!!m!$iJ!!"i)$i`)#BQ)(JJ2$dc-J!!1N0[EA"bCA0
cD@pZ1N4PBfpYF(*PFh0TEfi`-c!a,Q-!!%j@rqK)jami2Li!##KZ!!`f,J!+F!!
`!cJ(FJ!b"*!!JA)"X)&[!!'d286rk$e$rqT5E[rS-#lrk,"Z!!TN(()!-J$5M#"
"%"!d"h)!-J,5M#""%K#`!@3#B0C6E[rU-#lrkV"(Baab!$)!dS`J34!30!Gb!$)
#dS`J34)3X!&M!Q$B-#lrk,"ZrqTP!Q"b1#lrk(B!0J3Y3rr`eS`N3a)5F!!3!6e
!rq`k,[rUH!!i"5e%rr6BM#C%%"-8J"DZrqdJ,[r`d)$3VJ!3)%!`%$e!rq`L,[r
ddS(5VJ!3)%%b%#3Zrr$8JY5Z!"!J3M#")Llrp0+"dUi!%#""-)"J!2mb-#lrkV"
(CJC54f!!r`3i"hB!0J3Y3rrieS`N3a)5F!!3!6e!rq`m,[rUHJ!k"Le&rrcDM#C
&%"-8J"DZrqdJ,[rid)$3VJ!3)%!`%$e!rq`L,[rmdS(5VJ!3)%%b%#3ZrrM8JY5
Z!"!J3M#")Llrr0+"dUi!%#""-)!J,[rm)Llrq*!!J63Z!!Tb!$)#*#lrr&+#NS+
`J@`H,bi!%#m-2`Br"%kkrPa2l`!--#lrkP*!2J"J!2jF,bi!%#m-2bi!#M!ZrqT
53$m!6VVq0Nr[!!`pE[rU!!TJ!2ii60mFq%jH6R919[rN51FI1#4Z!!Jk,J!-*Qi
!$LKZ!")Y62r`)$`!!!%NfF!Y62rd3N!m!$B'YN9N,(J!1!-Y42rif)SJ4"!3)Ll
rq0+Zrr!J34#!)#lrq0#!d+lrp#"!-)054Q$1,blrp#mZrr!r"8*R6VVpXNr[!!a
#3$`!0JDf4@35F!!`!p#Zrr!J3%S3CJ454Q$SF!!Y32rN0JDf4@3!!+K+3fFb)#l
rj(J!1!-Y42rmf+lrm#"%&""b!")#*Llrr&1$eUlrm#"$&K"d!"3$NS,MU#e!rq3
d"R)!-J,5V[r`)%%5%(!!%!%q!#eZrq6rl(!!,8$rk$!(8dG+3'FJ)#lrk11))Ll
rl(3"`S+!J5e!rqJJ,[rXiSJY32rXB0Jd"R)!-J,5JG+Zrr3J36)3F!!`!H@!d)X
J3##ZrqK54P+Zrq4J!2p860mFq%jH6R8LAb"IS#8ZJ'S#3TG1d5*I%Km`(dS"C`5
R4Q!#SdBZL%l4)Pm5(c!I)&p+!@F%TNGJ!U*(6Y%!N!-+!$LJ!3!&!*!'!3!!!D1
+!!'LLJ!!"8Y66e*8"Vi!J!!F"()!&N&-8P3!#J#k399c-J!!!6j#6N4-!!%"5N0
19%`!!!&L3dp%43!(!@j%394"!!!"cN4*9%`!$`(D4%a24`!%!TT'8N9'!!3#eNC
PBA3!!!-55801)`!%!aj*3dp1!!!$@P"*3e3!"!0Q8(0PG!!!!k*659T&!!!$VP0
88L!!!31k8e45)`!!!p*KGA0d!!%$hQ0TBfi!!!2fC'0dBJ!""!*NE'Gi!!%%'QP
ME$J!!!3bGQ9bF`!""$i!J2rr)!#3#)(rrb!!!"!!N!@#rrmJ!!!J!*!&KIrr*!!
!-!%[)M3!K[rr*!!!3!&!B)`!Krrr)!!!8!#3"BMrrb!!!'!!N!3#!2rr)!!!FJ#
3"!)"rrmJ!!##!*!%"!(rrb!!!*)!N!3%Vrrr!!!B@!#3"ai!!"KS!*!&J2rr!!!
BM!#3"!%!rrm!!"M%!*!%!3Mrrb!!'13!N!ErrbJ"Kq!!N!8"!*dF!#D[!8$8@!!
#!+FF!,"m!51ZQ!!$!,%F!-fI!8$81!!%!,XF!3Qa!8$8-!!&!-8F!6Xq!5+0"!!
'!-mF!9[a!8$85!!(rrm!!BJ+!*!'rrmS!)(X!*!&J2rr!*!$SJ#3"B,rr`!!!3#
3"SArrb3!!9i"3'6J!)Errb3!!E3"31*m!)Irr`!!!M8!N!@)rrm!!!+&!*!&YIr
r)!!$A3#3"!%&rrmJ!!22!*!%!3Irrb!!'2m!N!3"#2rr)!!CS!#3"!)!rrm!!!4
m!*!%!J(rr`!!",S!N!3$k2rr)!!&"J#3"!3"rrmJ!!8b!*!%"%X!,33!'N-"303
!"+rrr`!!'T-!N!3""3!!)!!&XJ#3"!%(!$NJ!"V4!*!%!3J!5L!!'Zd!N!3$k2r
r)!!&e!#3"!4,!'B%!"X*!8$8T!#!rrm!!"XL!*!&JIrr!!!E,3#3"B,rr`!!'cJ
!N!@$rrm!!"Y$!*!&K2rr!!!E6J#3"[rr!!'LI!#3"B$rr`!!'eN!N!@"rrm!!"a
G!*!&J[rr!!!GB3#3"B2rr`!!(Q8!N!@%rrm!!"pT!*!%"%[rr`3!)'d"304`!),
rr`!!"I!!N!3$k2rr!!!(%`#3"!4-rrm!!!iK!*!%"%hrr`!!$pS!N!3%6[rr!!!
4N`#3"B$rr`!!%b%!N!6rN!3!!BIm!*!%!J!!"b!!&eJ!N!3#!3!1)!!AD!#3"B$
rr`!!&h3!N!Gb!!!Jk!#3"B6rr`!!)8-!N!3%5rrr"!!K4`&!e(3""Irr!!!AY!#
3"!%)rrm!!#*Y!*!%!38!&`!!&q8!N!3"#!#"!!!LS3#3"B6rr`!!)UX!N!8"rrm
J!"I[!*!&![rr)!!B-J#3"!C6G'&dGA-'F(*[EA"d#-3JFh9QCQPi"P0dBA4eF`j
2GfjPFL"bCA0[GA*MC3Y*ER0PFR3J4'PcDa"&H'PcG'PZCe"KFh0hEh*N'd9iDA0
dD@jR8'&cFhG[FQ3Y3A"`C@&bB@jMC3Y*ER0PFR3J4'PcD`j2GfjPFL"bCA0[GA*
MC4Y&H'PcG'PZCe"KFh0hEh*N,8&`F'9KFQ&ZBf8*8f9RE@9ZG#!a#90PCfePER3
J-JP6C@GYC@jd)$-*8f9RE@9ZG#!e#90PCfePER3J0JP6C@GYC@jd)$E@I3:
|
Changes to mac/tclMacResource.c.
1 2 3 4 5 6 7 8 9 10 11 12 13 | /* * tclMacResource.c -- * * This file contains several commands that manipulate or use * Macintosh resources. Included are extensions to the "source" * command, the mac specific "beep" and "resource" commands, and * administration for open resource file references. * * Copyright (c) 1996-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | /* * tclMacResource.c -- * * This file contains several commands that manipulate or use * Macintosh resources. Included are extensions to the "source" * command, the mac specific "beep" and "resource" commands, and * administration for open resource file references. * * Copyright (c) 1996-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclMacResource.c,v 1.8.8.1 2002/02/05 02:22:03 wolfsuit Exp $ */ #include <Errors.h> #include <FSpCompat.h> #include <Processes.h> #include <Resources.h> #include <Sound.h> |
| ︙ | ︙ | |||
145 146 147 148 149 150 151 |
OSType rezType;
int gotInt, releaseIt = 0, force;
char *resourceId = NULL;
long size;
char macPermision;
int mode;
| | | | | 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 |
OSType rezType;
int gotInt, releaseIt = 0, force;
char *resourceId = NULL;
long size;
char macPermision;
int mode;
static CONST char *switches[] = {"close", "delete" ,"files", "list",
"open", "read", "types", "write", (char *) NULL
};
enum {
RESOURCE_CLOSE, RESOURCE_DELETE, RESOURCE_FILES, RESOURCE_LIST,
RESOURCE_OPEN, RESOURCE_READ, RESOURCE_TYPES, RESOURCE_WRITE
};
static CONST char *writeSwitches[] = {
"-id", "-name", "-file", "-force", (char *) NULL
};
enum {
RESOURCE_WRITE_ID, RESOURCE_WRITE_NAME,
RESOURCE_WRITE_FILE, RESOURCE_FORCE
};
static CONST char *deleteSwitches[] = {"-id", "-name", "-file", (char *) NULL};
enum {RESOURCE_DELETE_ID, RESOURCE_DELETE_NAME, RESOURCE_DELETE_FILE};
resultPtr = Tcl_GetObjResult(interp);
if (objc < 2) {
Tcl_WrongNumArgs(interp, 1, objv, "option ?arg ...?");
|
| ︙ | ︙ | |||
492 493 494 495 496 497 498 |
if (limitSearch) {
UseResFile(saveRef);
}
return TCL_OK;
case RESOURCE_OPEN: {
Tcl_DString ds, buffer;
| | | 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 |
if (limitSearch) {
UseResFile(saveRef);
}
return TCL_OK;
case RESOURCE_OPEN: {
Tcl_DString ds, buffer;
CONST char *str, *native;
int length;
if (!((objc == 3) || (objc == 4))) {
Tcl_WrongNumArgs(interp, 2, objv, "fileName ?permissions?");
return TCL_ERROR;
}
str = Tcl_GetStringFromObj(objv[2], &length);
|
| ︙ | ︙ | |||
1231 1232 1233 1234 1235 1236 1237 |
*
*-----------------------------------------------------------------------------
*/
int
Tcl_MacEvalResource(
Tcl_Interp *interp, /* Interpreter in which to process file. */
| | | | | 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 |
*
*-----------------------------------------------------------------------------
*/
int
Tcl_MacEvalResource(
Tcl_Interp *interp, /* Interpreter in which to process file. */
CONST char *resourceName, /* Name of TEXT resource to source,
NULL if number should be used. */
int resourceNumber, /* Resource id of source. */
CONST char *fileName) /* Name of file to process.
NULL if application resource. */
{
Handle sourceText;
Str255 rezName;
char msg[200];
int result, iOpenedResFile = false;
short saveRef, fileRef = -1;
char idStr[64];
FSSpec fileSpec;
Tcl_DString buffer;
CONST char *nativeName;
saveRef = CurResFile();
if (fileName != NULL) {
OSErr err;
nativeName = Tcl_TranslateFileName(interp, fileName, &buffer);
|
| ︙ | ︙ | |||
1289 1290 1291 1292 1293 1294 1295 |
*/
}
/*
* Load the resource by name or ID
*/
if (resourceName != NULL) {
| > > | | > | 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 |
*/
}
/*
* Load the resource by name or ID
*/
if (resourceName != NULL) {
Tcl_DString ds;
Tcl_UtfToExternalDString(NULL, resourceName, -1, &ds);
strcpy((char *) rezName + 1, Tcl_DStringValue(&ds));
rezName[0] = (unsigned) Tcl_DStringLength(&ds);
sourceText = GetNamedResource('TEXT', rezName);
Tcl_DStringFree(&ds);
} else {
sourceText = GetResource('TEXT', (short) resourceNumber);
}
if (sourceText == NULL) {
result = TCL_ERROR;
} else {
|
| ︙ | ︙ | |||
1416 1417 1418 1419 1420 1421 1422 |
*-----------------------------------------------------------------------------
*/
Handle
Tcl_MacFindResource(
Tcl_Interp *interp, /* Interpreter in which to process file. */
long resourceType, /* Type of resource to load. */
| | | | 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 |
*-----------------------------------------------------------------------------
*/
Handle
Tcl_MacFindResource(
Tcl_Interp *interp, /* Interpreter in which to process file. */
long resourceType, /* Type of resource to load. */
CONST char *resourceName, /* Name of resource to find,
* NULL if number should be used. */
int resourceNumber, /* Resource id of source. */
CONST char *resFileRef, /* Registered resource file reference,
* NULL if searching all open resource files. */
int *releaseIt) /* Should we release this resource when done. */
{
Tcl_HashEntry *nameHashPtr;
OpenResourceFork *resourceRef;
int limitSearch = false;
short saveRef;
|
| ︙ | ︙ | |||
1458 1459 1460 1461 1462 1463 1464 |
if (resourceName == NULL) {
if (limitSearch) {
resource = Get1Resource(resourceType, resourceNumber);
} else {
resource = GetResource(resourceType, resourceNumber);
}
} else {
| > > | > > | | | | 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 |
if (resourceName == NULL) {
if (limitSearch) {
resource = Get1Resource(resourceType, resourceNumber);
} else {
resource = GetResource(resourceType, resourceNumber);
}
} else {
Str255 rezName;
Tcl_DString ds;
Tcl_UtfToExternalDString(NULL, resourceName, -1, &ds);
strcpy((char *) rezName + 1, Tcl_DStringValue(&ds));
rezName[0] = (unsigned) Tcl_DStringLength(&ds);
if (limitSearch) {
resource = Get1NamedResource(resourceType,
rezName);
} else {
resource = GetNamedResource(resourceType,
rezName);
}
Tcl_DStringFree(&ds);
}
if (*resource == NULL) {
*releaseIt = 1;
LoadResource(resource);
} else {
*releaseIt = 0;
|
| ︙ | ︙ | |||
1968 1969 1970 1971 1972 1973 1974 |
* string, attempt to use that as the key. If the key already
* exists, silently fall back on resource%d...
*/
if (tokenPtr != NULL) {
char *tokenVal;
int length;
| | | 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 |
* string, attempt to use that as the key. If the key already
* exists, silently fall back on resource%d...
*/
if (tokenPtr != NULL) {
char *tokenVal;
int length;
tokenVal = Tcl_GetStringFromObj(tokenPtr, &length);
if (length > 0) {
nameHashPtr = Tcl_FindHashEntry(&nameTable, tokenVal);
if (nameHashPtr == NULL) {
resourceId = ckalloc(length + 1);
memcpy(resourceId, tokenVal, length);
resourceId[length] = '\0';
}
|
| ︙ | ︙ | |||
2185 2186 2187 2188 2189 2190 2191 |
if (err != noErr) {
/*
* The ROM resource map does not correspond to an opened file...
*/
Tcl_SetStringObj(nameObj, "ROM Map", -1);
} else {
p2cstr((StringPtr) fileName);
| | | 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 |
if (err != noErr) {
/*
* The ROM resource map does not correspond to an opened file...
*/
Tcl_SetStringObj(nameObj, "ROM Map", -1);
} else {
p2cstr((StringPtr) fileName);
if (strcmp(fileName,appName) == 0) {
Tcl_SetStringObj(nameObj, "application", -1);
} else {
Tcl_SetStringObj(nameObj, fileName, -1);
}
c2pstr(fileName);
}
|
| ︙ | ︙ |
Changes to mac/tclMacResource.r.
| ︙ | ︙ | |||
8 9 10 11 12 13 14 | * * Copyright (c) 1993-94 Lockheed Missle & Space Company * Copyright (c) 1994-97 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 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 34 35 36 37 38 39 40 41 42 |
*
* Copyright (c) 1993-94 Lockheed Missle & Space Company
* Copyright (c) 1994-97 Sun Microsystems, Inc.
*
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
* RCS: @(#) $Id: tclMacResource.r,v 1.4.18.1 2002/02/05 02:22:03 wolfsuit Exp $
*/
#include <Types.r>
#include <SysTypes.r>
/*
* The folowing include and defines help construct
* the version string for Tcl.
*/
#define RESOURCE_INCLUDED
#include "tcl.h"
/*
* The mechanisim below loads Tcl source into the resource fork of the
* application. The example below creates a TEXT resource named
* "Init" from the file "init.tcl". This allows applications to use
* Tcl to define the behavior of the application without having to
* require some predetermined file structure - all needed Tcl "files"
* are located within the application. To source a file for the
* resource fork the source command has been modified to support
* sourcing from resources. In the below case "source -rsrc {Init}"
* will load the TEXT resource named "Init".
*/
#include "tclMacTclCode.r"
|
Deleted mac/tclMacShLib.exp.
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
Changes to mac/tclMacSock.c.
1 2 3 4 5 6 7 8 9 10 | /* * tclMacSock.c * * Channel drivers for Macintosh sockets. * * Copyright (c) 1996-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | /* * tclMacSock.c * * Channel drivers for Macintosh sockets. * * Copyright (c) 1996-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclMacSock.c,v 1.8.14.1 2002/02/05 02:22:03 wolfsuit Exp $ */ #include "tclInt.h" #include "tclPort.h" #include "tclMacInt.h" #include <AddressXlation.h> #include <Aliases.h> |
| ︙ | ︙ | |||
134 135 136 137 138 139 140 | * Static routines for this file: */ static pascal void CleanUpExitProc _ANSI_ARGS_((void)); static void ClearZombieSockets _ANSI_ARGS_((void)); static void CloseCompletionRoutine _ANSI_ARGS_((TCPiopb *pb)); static TcpState * CreateSocket _ANSI_ARGS_((Tcl_Interp *interp, | | | | | 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 | * Static routines for this file: */ static pascal void CleanUpExitProc _ANSI_ARGS_((void)); static void ClearZombieSockets _ANSI_ARGS_((void)); static void CloseCompletionRoutine _ANSI_ARGS_((TCPiopb *pb)); static TcpState * CreateSocket _ANSI_ARGS_((Tcl_Interp *interp, int port, CONST char *host, CONST char *myAddr, int myPort, int server, int async)); static pascal void DNRCompletionRoutine _ANSI_ARGS_(( struct hostInfo *hostinfoPtr, DNRState *dnrStatePtr)); static void FreeSocketInfo _ANSI_ARGS_((TcpState *statePtr)); static long GetBufferSize _ANSI_ARGS_((void)); static OSErr GetHostFromString _ANSI_ARGS_((CONST char *name, ip_addr *address)); static OSErr GetLocalAddress _ANSI_ARGS_((unsigned long *addr)); static void IOCompletionRoutine _ANSI_ARGS_((TCPiopb *pb)); static void InitMacTCPParamBlock _ANSI_ARGS_((TCPiopb *pBlock, int csCode)); static void InitSockets _ANSI_ARGS_((void)); static TcpState * NewSocketInfo _ANSI_ARGS_((StreamPtr stream)); |
| ︙ | ︙ | |||
167 168 169 170 171 172 173 | static void TcpAccept _ANSI_ARGS_((TcpState *statePtr)); static int TcpBlockMode _ANSI_ARGS_((ClientData instanceData, int mode)); static int TcpClose _ANSI_ARGS_((ClientData instanceData, Tcl_Interp *interp)); static int TcpGetHandle _ANSI_ARGS_((ClientData instanceData, int direction, ClientData *handlePtr)); static int TcpGetOptionProc _ANSI_ARGS_((ClientData instanceData, | | | | | 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 |
static void TcpAccept _ANSI_ARGS_((TcpState *statePtr));
static int TcpBlockMode _ANSI_ARGS_((ClientData instanceData, int mode));
static int TcpClose _ANSI_ARGS_((ClientData instanceData,
Tcl_Interp *interp));
static int TcpGetHandle _ANSI_ARGS_((ClientData instanceData,
int direction, ClientData *handlePtr));
static int TcpGetOptionProc _ANSI_ARGS_((ClientData instanceData,
Tcl_Interp *interp, CONST char *optionName,
Tcl_DString *dsPtr));
static int TcpInput _ANSI_ARGS_((ClientData instanceData,
char *buf, int toRead, int *errorCodePtr));
static int TcpOutput _ANSI_ARGS_((ClientData instanceData,
CONST char *buf, int toWrite, int *errorCodePtr));
static void TcpWatch _ANSI_ARGS_((ClientData instanceData,
int mask));
static int WaitForSocketEvent _ANSI_ARGS_((TcpState *infoPtr,
int mask, int *errorCodePtr));
pascal void NotifyRoutine (
StreamPtr tcpStream,
unsigned short eventCode,
Ptr userDataPtr,
unsigned short terminReason,
struct ICMPReport *icmpMsg);
/*
* This structure describes the channel type structure for TCP socket
* based IO:
*/
static Tcl_ChannelType tcpChannelType = {
"tcp", /* Type name. */
(Tcl_ChannelTypeVersion)TcpBlockMode, /* Set blocking or
* non-blocking mode.*/
TcpClose, /* Close proc. */
TcpInput, /* Input proc. */
TcpOutput, /* Output proc. */
NULL, /* Seek proc. */
NULL, /* Set option proc. */
TcpGetOptionProc, /* Get option proc. */
|
| ︙ | ︙ | |||
1197 1198 1199 1200 1201 1202 1203 |
*
*----------------------------------------------------------------------
*/
static int
TcpOutput(
ClientData instanceData, /* Channel state. */
| | | 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 |
*
*----------------------------------------------------------------------
*/
static int
TcpOutput(
ClientData instanceData, /* Channel state. */
CONST char *buf, /* The data buffer. */
int toWrite, /* How many bytes to write? */
int *errorCodePtr) /* Where to store error code. */
{
TcpState *statePtr = (TcpState *) instanceData;
StreamPtr tcpStream;
OSErr err;
int amount;
|
| ︙ | ︙ | |||
1342 1343 1344 1345 1346 1347 1348 |
*----------------------------------------------------------------------
*/
static int
TcpGetOptionProc(
ClientData instanceData, /* Socket state. */
Tcl_Interp *interp, /* For error reporting - can be NULL.*/
| | | 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 |
*----------------------------------------------------------------------
*/
static int
TcpGetOptionProc(
ClientData instanceData, /* Socket state. */
Tcl_Interp *interp, /* For error reporting - can be NULL.*/
CONST char *optionName, /* Name of the option to
* retrieve the value for, or
* NULL to get all options and
* their values. */
Tcl_DString *dsPtr) /* Where to store the computed
* value; initialized by caller. */
{
TcpState *statePtr = (TcpState *) instanceData;
|
| ︙ | ︙ | |||
1381 1382 1383 1384 1385 1386 1387 |
}
/*
* Determine which options we need to do. Do all of them
* if optionName is NULL.
*/
| | | 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 |
}
/*
* Determine which options we need to do. Do all of them
* if optionName is NULL.
*/
if (optionName == (CONST char *) NULL || optionName[0] == '\0') {
doAll = true;
} else {
if (!strcmp(optionName, "-peername")) {
doPeerName = true;
} else if (!strcmp(optionName, "-sockname")) {
doSockName = true;
} else {
|
| ︙ | ︙ | |||
1650 1651 1652 1653 1654 1655 1656 |
*----------------------------------------------------------------------
*/
static TcpState *
CreateSocket(
Tcl_Interp *interp, /* For error reporting; can be NULL. */
int port, /* Port number to open. */
| | | | 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 |
*----------------------------------------------------------------------
*/
static TcpState *
CreateSocket(
Tcl_Interp *interp, /* For error reporting; can be NULL. */
int port, /* Port number to open. */
CONST char *host, /* Name of host on which to open port. */
CONST char *myaddr, /* Optional client-side address */
int myport, /* Optional client-side port */
int server, /* 1 if socket should be a server socket,
* else 0 for a client socket. */
int async) /* 1 create async, 0 do sync. */
{
ip_addr macAddr;
OSErr err;
|
| ︙ | ︙ | |||
1840 1841 1842 1843 1844 1845 1846 |
*----------------------------------------------------------------------
*/
Tcl_Channel
Tcl_OpenTcpClient(
Tcl_Interp *interp, /* For error reporting; can be NULL. */
int port, /* Port number to open. */
| | | | 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 |
*----------------------------------------------------------------------
*/
Tcl_Channel
Tcl_OpenTcpClient(
Tcl_Interp *interp, /* For error reporting; can be NULL. */
int port, /* Port number to open. */
CONST char *host, /* Host on which to open port. */
CONST char *myaddr, /* Client-side address */
int myport, /* Client-side port */
int async) /* If nonzero, attempt to do an
* asynchronous connect. Otherwise
* we do a blocking connect.
* - currently ignored */
{
TcpState *statePtr;
|
| ︙ | ︙ | |||
1894 1895 1896 1897 1898 1899 1900 |
*/
Tcl_Channel
Tcl_OpenTcpServer(
Tcl_Interp *interp, /* For error reporting - may be
* NULL. */
int port, /* Port number to open. */
| | | 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 |
*/
Tcl_Channel
Tcl_OpenTcpServer(
Tcl_Interp *interp, /* For error reporting - may be
* NULL. */
int port, /* Port number to open. */
CONST char *host, /* Name of local host. */
Tcl_TcpAcceptProc *acceptProc, /* Callback for accepting connections
* from new clients. */
ClientData acceptProcData) /* Data for the callback. */
{
TcpState *statePtr;
char channelName[20];
|
| ︙ | ︙ | |||
2221 2222 2223 2224 2225 2226 2227 | * * Side effects: * None. * *---------------------------------------------------------------------- */ | | | 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 |
*
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
CONST char *
Tcl_GetHostName()
{
static int hostnameInited = 0;
static char hostname[255];
ip_addr ourAddress;
Tcl_DString dString;
OSErr err;
|
| ︙ | ︙ | |||
2422 2423 2424 2425 2426 2427 2428 | * None. * *---------------------------------------------------------------------- */ static OSErr GetHostFromString( | | | 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 |
* None.
*
*----------------------------------------------------------------------
*/
static OSErr
GetHostFromString(
CONST char *name, /* Host in string form. */
ip_addr *address) /* Returned IP address. */
{
OSErr err;
int i;
EventRecord dummy;
DNRState dnrState;
|
| ︙ | ︙ | |||
2445 2446 2447 2448 2449 2450 2451 |
*/
for (i = 0; i < NUM_ALT_ADDRS; i++) {
dnrState.hostInfo.addr[i] = 0;
}
dnrState.done = 0;
GetCurrentProcess(&(dnrState.psn));
| | | | 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 |
*/
for (i = 0; i < NUM_ALT_ADDRS; i++) {
dnrState.hostInfo.addr[i] = 0;
}
dnrState.done = 0;
GetCurrentProcess(&(dnrState.psn));
err = StrToAddr((char*)name, &dnrState.hostInfo, resultUPP, (Ptr) &dnrState);
if (err == cacheFault) {
while (!dnrState.done) {
WaitNextEvent(0, &dummy, 1, NULL);
}
}
/*
* For some reason MacTcp may return a cachFault a second time via
* the hostinfo block. This seems to be a bug in MacTcp. In this case
* we run StrToAddr again - which seems to then work just fine.
*/
if (dnrState.hostInfo.rtnCode == cacheFault) {
dnrState.done = 0;
err = StrToAddr((char*)name, &dnrState.hostInfo, resultUPP, (Ptr) &dnrState);
if (err == cacheFault) {
while (!dnrState.done) {
WaitNextEvent(0, &dummy, 1, NULL);
}
}
}
|
| ︙ | ︙ |
Changes to mac/tclMacTclCode.r.
| ︙ | ︙ | |||
25 26 27 28 29 30 31 |
* require some predetermined file structure - all needed Tcl "files"
* are located within the application. To source a file for the
* resource fork the source command has been modified to support
* sourcing from resources. In the below case "source -rsrc {Init}"
* will load the TEXT resource named "Init".
*/
| | | | | | | | 25 26 27 28 29 30 31 32 33 34 35 36 37 |
* require some predetermined file structure - all needed Tcl "files"
* are located within the application. To source a file for the
* resource fork the source command has been modified to support
* sourcing from resources. In the below case "source -rsrc {Init}"
* will load the TEXT resource named "Init".
*/
read 'TEXT' (TCL_LIBRARY_RESOURCES, "init", purgeable) "::library:init.tcl";
read 'TEXT' (TCL_LIBRARY_RESOURCES + 1, "auto", purgeable) "::library:auto.tcl";
read 'TEXT' (TCL_LIBRARY_RESOURCES + 2, "package", purgeable,preload) "::library:package.tcl";
read 'TEXT' (TCL_LIBRARY_RESOURCES + 3, "history", purgeable) "::library:history.tcl";
read 'TEXT' (TCL_LIBRARY_RESOURCES + 4, "word", purgeable,preload) "::library:word.tcl";
read 'TEXT' (TCL_LIBRARY_RESOURCES + 5, "parray", purgeable,preload) "::library:parray.tcl";
|
Changes to mac/tclMacThrd.c.
| ︙ | ︙ | |||
125 126 127 128 129 130 131 |
if (stackSize == TCL_THREAD_STACK_DEFAULT) {
stackSize = TCL_MAC_THRD_DEFAULT_STACK;
}
#if TARGET_CPU_68K && TARGET_RT_MAC_CFM
{
ThreadEntryProcPtr entryProc;
| | | 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 |
if (stackSize == TCL_THREAD_STACK_DEFAULT) {
stackSize = TCL_MAC_THRD_DEFAULT_STACK;
}
#if TARGET_CPU_68K && TARGET_RT_MAC_CFM
{
ThreadEntryProcPtr entryProc;
entryProc = NewThreadEntryUPP(proc);
NewThread(kCooperativeThread, entryProc, (void *) clientData,
stackSize, kCreateIfNeeded, NULL, (ThreadID *) idPtr);
}
#else
NewThread(kCooperativeThread, proc, (void *) clientData,
stackSize, kCreateIfNeeded, NULL, (ThreadID *) idPtr);
|
| ︙ | ︙ |
Changes to mac/tclMacTime.c.
1 2 3 4 5 6 7 8 9 10 11 | /* * tclMacTime.c -- * * Contains Macintosh specific versions of Tcl functions that * obtain time values from the operating system. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
/*
* tclMacTime.c --
*
* Contains Macintosh specific versions of Tcl functions that
* obtain time values from the operating system.
*
* Copyright (c) 1995-1997 Sun Microsystems, Inc.
*
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
* RCS: @(#) $Id: tclMacTime.c,v 1.4.8.1 2002/02/05 02:22:03 wolfsuit Exp $
*/
#include "tclInt.h"
#include "tclPort.h"
#include "tclMacInt.h"
#include <OSUtils.h>
#include <Timer.h>
#include <time.h>
/*
* Static variables used by the Tcl_GetTime function.
*/
static int initalized = false;
static unsigned long baseSeconds;
static UnsignedWide microOffset;
static int gmt_initialized = false;
static long gmt_offset;
static int gmt_isdst;
TCL_DECLARE_MUTEX(gmtMutex)
static int gmt_lastGetDateUseGMT = 0;
typedef struct _TABLE {
char *name;
int type;
time_t value;
} TABLE;
#define HOUR(x) ((time_t) (3600 * x))
#define tZONE 0
#define tDAYZONE 1
/*
* inverse timezone table, adapted from tclDate.c by removing duplicates and
* adding some made up names for unusual daylight savings
*/
static TABLE invTimezoneTable[] = {
{ "Z", -1, HOUR( 36) }, /* Unknown */
{ "GMT", tZONE, HOUR( 0) }, /* Greenwich Mean */
{ "BST", tDAYZONE, HOUR( 0) }, /* British Summer */
{ "WAT", tZONE, HOUR( 1) }, /* West Africa */
{ "WADST", tDAYZONE, HOUR( 1) }, /* West Africa Daylight*/
{ "AT", tZONE, HOUR( 2) }, /* Azores Daylight*/
{ "ADST", tDAYZONE, HOUR( 2) }, /* Azores */
{ "NFT", tZONE, HOUR( 7/2) }, /* Newfoundland */
{ "NDT", tDAYZONE, HOUR( 7/2) }, /* Newfoundland Daylight */
{ "AST", tZONE, HOUR( 4) }, /* Atlantic Standard */
{ "ADT", tDAYZONE, HOUR( 4) }, /* Atlantic Daylight */
{ "EST", tZONE, HOUR( 5) }, /* Eastern Standard */
{ "EDT", tDAYZONE, HOUR( 5) }, /* Eastern Daylight */
{ "CST", tZONE, HOUR( 6) }, /* Central Standard */
{ "CDT", tDAYZONE, HOUR( 6) }, /* Central Daylight */
{ "MST", tZONE, HOUR( 7) }, /* Mountain Standard */
{ "MDT", tDAYZONE, HOUR( 7) }, /* Mountain Daylight */
{ "PST", tZONE, HOUR( 8) }, /* Pacific Standard */
{ "PDT", tDAYZONE, HOUR( 8) }, /* Pacific Daylight */
{ "YST", tZONE, HOUR( 9) }, /* Yukon Standard */
{ "YDT", tDAYZONE, HOUR( 9) }, /* Yukon Daylight */
{ "HST", tZONE, HOUR(10) }, /* Hawaii Standard */
{ "HDT", tDAYZONE, HOUR(10) }, /* Hawaii Daylight */
{ "NT", tZONE, HOUR(11) }, /* Nome */
{ "NST", tDAYZONE, HOUR(11) }, /* Nome Daylight*/
{ "IDLW", tZONE, HOUR(12) }, /* International Date Line West */
{ "CET", tZONE, -HOUR( 1) }, /* Central European */
{ "CEST", tDAYZONE, -HOUR( 1) }, /* Central European Summer */
{ "EET", tZONE, -HOUR( 2) }, /* Eastern Europe, USSR Zone 1 */
{ "EEST", tDAYZONE, -HOUR( 2) }, /* Eastern Europe, USSR Zone 1 Daylight*/
{ "BT", tZONE, -HOUR( 3) }, /* Baghdad, USSR Zone 2 */
{ "BDST", tDAYZONE, -HOUR( 3) }, /* Baghdad, USSR Zone 2 Daylight*/
{ "IT", tZONE, -HOUR( 7/2) }, /* Iran */
{ "IDST", tDAYZONE, -HOUR( 7/2) }, /* Iran Daylight*/
{ "ZP4", tZONE, -HOUR( 4) }, /* USSR Zone 3 */
{ "ZP4S", tDAYZONE, -HOUR( 4) }, /* USSR Zone 3 */
{ "ZP5", tZONE, -HOUR( 5) }, /* USSR Zone 4 */
{ "ZP5S", tDAYZONE, -HOUR( 5) }, /* USSR Zone 4 */
{ "IST", tZONE, -HOUR(11/2) }, /* Indian Standard */
{ "ISDST", tDAYZONE, -HOUR(11/2) }, /* Indian Standard */
{ "ZP6", tZONE, -HOUR( 6) }, /* USSR Zone 5 */
{ "ZP6S", tDAYZONE, -HOUR( 6) }, /* USSR Zone 5 */
{ "WAST", tZONE, -HOUR( 7) }, /* West Australian Standard */
{ "WADT", tDAYZONE, -HOUR( 7) }, /* West Australian Daylight */
{ "JT", tZONE, -HOUR(15/2) }, /* Java (3pm in Cronusland!) */
{ "JDST", tDAYZONE, -HOUR(15/2) }, /* Java (3pm in Cronusland!) */
{ "CCT", tZONE, -HOUR( 8) }, /* China Coast, USSR Zone 7 */
{ "CCST", tDAYZONE, -HOUR( 8) }, /* China Coast, USSR Zone 7 */
{ "JST", tZONE, -HOUR( 9) }, /* Japan Standard, USSR Zone 8 */
{ "JSDST", tDAYZONE, -HOUR( 9) }, /* Japan Standard, USSR Zone 8 */
{ "CAST", tZONE, -HOUR(19/2) }, /* Central Australian Standard */
{ "CADT", tDAYZONE, -HOUR(19/2) }, /* Central Australian Daylight */
{ "EAST", tZONE, -HOUR(10) }, /* Eastern Australian Standard */
{ "EADT", tDAYZONE, -HOUR(10) }, /* Eastern Australian Daylight */
{ "NZT", tZONE, -HOUR(12) }, /* New Zealand */
{ "NZDT", tDAYZONE, -HOUR(12) }, /* New Zealand Daylight */
{ NULL }
};
/*
* Prototypes for procedures that are private to this file:
*/
static void SubtractUnsignedWide _ANSI_ARGS_((UnsignedWide *x,
UnsignedWide *y, UnsignedWide *result));
|
| ︙ | ︙ | |||
169 170 171 172 173 174 175 |
return offset;
}
/*
*----------------------------------------------------------------------
*
| | | | 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 |
return offset;
}
/*
*----------------------------------------------------------------------
*
* Tcl_GetTime --
*
* Gets the current system time in seconds and microseconds
* since the beginning of the epoch: 00:00 UCT, January 1, 1970.
*
* Results:
* Returns the current time (in the local timezone) in timePtr.
*
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
void
Tcl_GetTime(
Tcl_Time *timePtr) /* Location to store time information. */
{
UnsignedWide micro;
#ifndef NO_LONG_LONG
long long *microPtr;
#endif
|
| ︙ | ︙ | |||
283 284 285 286 287 288 289 290 291 292 293 294 295 296 |
if(useGMT)
statictime.tm_isdst = 0;
else
statictime.tm_isdst = gmt_isdst;
gmt_lastGetDateUseGMT=useGMT; /* hack to make TclpGetTZName below work */
return(&statictime);
}
#ifdef NO_LONG_LONG
/*
*----------------------------------------------------------------------
*
* SubtractUnsignedWide --
*
| > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 |
if(useGMT)
statictime.tm_isdst = 0;
else
statictime.tm_isdst = gmt_isdst;
gmt_lastGetDateUseGMT=useGMT; /* hack to make TclpGetTZName below work */
return(&statictime);
}
/*
*----------------------------------------------------------------------
*
* TclpGetTZName --
*
* Gets the current timezone string.
*
* Results:
* Returns a pointer to a static string, or NULL on failure.
*
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
char *
TclpGetTZName(int dst)
{
register TABLE *tp;
long zonevalue=-TclpGetGMTOffset();
if (gmt_isdst)
zonevalue += HOUR(1);
if(gmt_lastGetDateUseGMT) /* hack: if last TclpGetDate was called */
zonevalue=0; /* with useGMT==1 then we're using GMT */
for (tp = invTimezoneTable; tp->name; tp++) {
if ((tp->value == zonevalue) && (tp->type == dst)) break;
}
if(!tp->name)
tp = invTimezoneTable; /* default to unknown */
return tp->name;
}
#ifdef NO_LONG_LONG
/*
*----------------------------------------------------------------------
*
* SubtractUnsignedWide --
*
|
| ︙ | ︙ |
Changes to mac/tclMacUnix.c.
| ︙ | ︙ | |||
8 9 10 11 12 13 14 | * * Copyright (c) 1993-1994 Lockheed Missle & Space Company, AI Center * Copyright (c) 1994-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | * * Copyright (c) 1993-1994 Lockheed Missle & Space Company, AI Center * Copyright (c) 1994-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclMacUnix.c,v 1.3.28.1 2002/02/05 02:22:03 wolfsuit Exp $ */ #include <Files.h> #include <Strings.h> #include <TextUtils.h> #include <Finder.h> #include <FSpCompat.h> |
| ︙ | ︙ | |||
202 203 204 205 206 207 208 |
if (Tcl_GlobObjCmd(NULL, interp, objc + 1, objv - 1) != TCL_OK) {
Tcl_ResetResult(interp);
return TCL_ERROR;
}
resultObjPtr = Tcl_GetObjResult(interp);
Tcl_IncrRefCount(resultObjPtr);
| | | 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 |
if (Tcl_GlobObjCmd(NULL, interp, objc + 1, objv - 1) != TCL_OK) {
Tcl_ResetResult(interp);
return TCL_ERROR;
}
resultObjPtr = Tcl_GetObjResult(interp);
Tcl_IncrRefCount(resultObjPtr);
if (Tcl_ListObjGetElements(interp, resultObjPtr, &objc, (Tcl_Obj ***)&objv) != TCL_OK) {
Tcl_DecrRefCount(resultObjPtr);
return TCL_ERROR;
}
Tcl_ResetResult(interp);
/*
|
| ︙ | ︙ |
Changes to mac/tclMacUtil.c.
1 2 3 4 5 6 7 8 9 10 11 12 | /* * tclMacUtil.c -- * * This contains utility functions used to help with * implementing Macintosh specific portions of the Tcl port. * * Copyright (c) 1993-1994 Lockheed Missle & Space Company, AI Center * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /* * tclMacUtil.c -- * * This contains utility functions used to help with * implementing Macintosh specific portions of the Tcl port. * * Copyright (c) 1993-1994 Lockheed Missle & Space Company, AI Center * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclMacUtil.c,v 1.4.18.1 2002/02/05 02:22:03 wolfsuit Exp $ */ #include "tcl.h" #include "tclInt.h" #include "tclMacInt.h" #include "tclMath.h" #include "tclMacPort.h" |
| ︙ | ︙ | |||
49 50 51 52 53 54 55 | * * Side effects: * None. * *---------------------------------------------------------------------- */ | | | 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
*
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
#if defined(THINK_C)
double hypotd(double x, double y);
double
hypotd(
double x, /* X value */
double y) /* Y value */
{
|
| ︙ | ︙ | |||
416 417 418 419 420 421 422 |
return err;
}
/*
*----------------------------------------------------------------------
*
| | | > > > > > > > > > > > > > > > > > > | 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 |
return err;
}
/*
*----------------------------------------------------------------------
*
* GetGlobalMouseTcl --
*
* This procedure obtains the current mouse position in global
* coordinates.
*
* Results:
* None.
*
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
void
GetGlobalMouseTcl(
Point *mouse) /* Mouse position. */
{
EventRecord event;
OSEventAvail(0, &event);
*mouse = event.where;
}
pascal OSErr FSpGetDirectoryIDTcl (CONST FSSpec * spec,
long * theDirID, Boolean * isDirectory)
{
return(FSpGetDirectoryID(spec, theDirID, isDirectory));
}
pascal short FSpOpenResFileCompatTcl (CONST FSSpec * spec, SignedByte permission)
{
return(FSpOpenResFileCompat(spec,permission));
}
pascal void FSpCreateResFileCompatTcl (
CONST FSSpec * spec, OSType creator,
OSType fileType, ScriptCode scriptTag)
{
FSpCreateResFileCompat (spec,creator,fileType,scriptTag);
}
|
Added mac/tcltkMacBuildSupport.sea.hqx.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 |
(This file must be converted with BinHex 4.0)
:'(4ME(4V6@&M3R9TE'46GA"`Eh*d,R0PB3""8&"-BA9cG#%!!!&&V!!"U0AR-&0
dG@CQ5A3J+'-T-6Nj0bda16Ni)%&XB@4ND@iJ8hPcG'9YFb`J5@jM,L`JD(4dF$S
[,hH3!bjKE'&NC'PZFhPc,Q0[E5p6G(9QCNPd,`d+'J!&%!!"4D`!N!0b!!%!N!0
bCHd0TD95CA0PFRCPC+@P!+@3"!%!!$d!4,5KD[qhp$6M!*!0$ECD!*!$d`!DkRX
!!86C!"48Bf`[9'XJ4QpXC'9b!!"m3!![!!X"b3)#!q!!$`!2!3lrr!"C`83!!)!
!N!HPN!3"!!"%!%5f)!%#Z#2G,!#3!h)!!+m!N!4b!"6@k3!!!6X!&d5S!!#Ya3!
%+&"bEcBJ3R9TE'3J8h9`F'pbG#N!!&c*!*B##!+R!lN"`!&!!)%$$[rirr$,4!!
!J!#3"k@3"!%!!%%!%,B4*!Dh@L%I!*!$d`!!&&%!N!26!"&FR!!!0!)!!"'q!*!
%$`"#G@PXC'PZCb"0B@08Bfa8D`!"1-C849K83eG*43%!rj!%!*!+J!#3#3'D!*!
$j3#3"!m!3X(8LR4EN!$liA)[FeASdGZ205Y@hHE6j4cNr)Ya6*h%@#pTaXU*Hl9
"%C!!GhmQ"eD#%i8PT%lB`raI#bMjNR*d,JBml$fEkX(8c-fcb9(cN!$$B*3r!SE
[@3@h4IAkX+Q!bPi&2QNMPa4',0i30M!S[Cir$K!r1adBr"*X0"R2TjUqbB+eQT@
X%%SQ#G4'A*rl,KESi[P2F'"hlJ[E$l(0'pGq`-rUccaDRXD@[eGUQA")+8lLZ%S
R2e81(@$3k&IP!4+[[$1`M'%"eV0i+EXLilKjfVZM1-8!"",r!aM3[LM)T(R0S%,
"e3PkF*)Ni"XaM+M8rZVT"J01'fB%CU2K-4YdYXV2MZCaTIL2h0&12mDKJJE(DQr
-Z&5Pap(9llMV`$Z+&3Ijp2Y(KX$k6C5U+"#5q[V9fTrD-%S`TKb5J!9@T`NF,TL
UDYhA6N$N5cLL0aiFelEZIN#CP2)"bZLSGjfce"Fij$HXG)+&[ec#-''p*HjNfA9
X8Fr'K3Jd'b&Hb2&,`5QqN!#b!-2jN!#96#K%*JNYK"J1aI1d[B-PqBhB!bKfN!"
pkPrT$l,Z6b-cY5lU,G23@lB`JE#"BM6GIPN1PJCfBjT-i5Gc"X1R6Q1a0il`2KG
liQBI8jq9leJhQI)`@ea&XM68+cNNUK,GUa(!pbj5iiM`BFrGUKrY0-2bhBQA!eG
b#JPYa+(pmF8Z)%b,1DJ&B('*@l445DMf&@[L&#%[&[iRRKBfPJa%p0TCFbf-Q#B
5A)LaBmAT*[5LrprD9`L3!*q*VRi(1Z-lU3&)##`H`Hm&m2D)q[!@j'f-pr+FA'l
P3K$pa$fAfBaE6)#jA4N9RI31QB#'!%5m&&a-[4FU+2k'GkBA3AXeq,6Q#L!hc+4
XSGKVCQhZ`8N,d3i')%3l0!+UYMECiA+A8h01&-6f#h)65@,,JjAHjb9'-51YADA
Ak6&8G0YfTkTqF9)Y[11GZ11Uai6dTHe&[#jTIS'Vk@6&3%#2RSZEJqZMi&#jl*R
Y"H%I$eJ[QTkTqJT3j-mM4Y&hC9Va-N)hi-3XYrF`4hKZTTcI5PkN*Vk&UpYSD@i
f&KNcjp!d8$0&Sbb)dkA0`d4@3lAX2!`3(E"Z)h%)FX"N"[j3CI8fXE)9EZMH&HM
61qDkDkJQmjp2+ff5QrDa`ik!!qIBF"[m**1F31BQ-F5!`ihN521(NRR6jecDUNi
&D-(%U`H2!&H5T$3KdI*X1BdehaHU-UGISXfI6Xh)['c+[ZBiP+9FLHTQBNXqJ#q
iF8D*GQ8MGbSlEq!+DN(32C[KF,4m[AbImlG-10IVYlIGPi64FJb[[H4Vi&@rV-(
0,"ZEjFpaa3TNm$fqY!43",3mM*NGGZY`GSl&Ia9m*pRmcm6jZU%J211r3!kEC2`
"Ja*Cd$U,dh6LF*@4JMf1!+efbD)a!MHL"!VV2Ek!X*!!Y4-6FldaIf9T9KeC8%S
CTQKcFLi`6CL2mkcD`2m3BD8cD$D!brCBNGMjAka@XGcjGYj[Y%Bkm",8T"(NqiV
f)#2hmRjPqqiV0[R"eGR92Pk3!1cF@XRD5r0XdIPQS'q+I'Z3!#Kp6Z8@jGDG'aq
'3%ah-lMS0h$R1j-kBH#QZ@r!,!("dIR,IG@GkVF63b`6!99TD(4H!pVM,R1%!#f
Z)JGX"(!p*dhqS3LB&PiU'&,$[d+[jMU24cB98KKUIqT8$*4$1UjUli,9JXcEB@F
'Nh*%#XqdRl$bFHY@@&*R3h1&c!`iS+MIf!cJ$9Yjf1@P1812kjeSkMaAr9V&"4Y
Um&[5B094Jd&aT4mm4M#lY8Lb@0Z#f4P#iI8fYG'C`rKj(F8&%$2VR%Yk'YBX1rB
bqN@`abXK5qSFEUZSaH#L`KBLFAil5%6CZM1q`ZRi$mSKZ0SFb$5Ym$h+6JmhbCG
Bk[J@#9Y2Zckc#5bD(3!J[ak,r1dQ2(pZEahD$*T`K#PVQlDZT2#J#C,SRJ'&Hcl
hTceJlD1VQDN$6X0@%-MGM%3QqT9*hr+pN!#Pl)mcNhmNdYcViC8EPq+*C83JC!N
9LMm)Ma8V[$-G92AkiBJ+'EA1rcYk3kH1BAA9**AEE@YBGZEqV[DS5X+MrYH(6q#
k,eL&&l$5'NKJ[cRKFr(G*[''I,@4M@iEhkJIKHd(G&#Q*6UI1Eqc50Xc'N![SGY
JkX2*,3JI4l2T"'kE`IkKC5'9$$qQl-SjhZ9m%KDedpZ0,"X,#LZp0+--%h4[TIS
ha$YhEC6ZjJ9B,60ZkVD[NHlqJm%b!+5e(ebk5k!$IMf68kc5-JkhpPFP2(S&m-Z
S-"[&lhURDcp1JqZp`$IaIRKqZG,,d)b@%C0'ZBUG#'aGUU-+f!(@qCfXb*0Z!mK
[lUG$[eM6%BB90h4,K)[@IHHQ`+(6Nl,TP#eNCTjTPYfB*$Q3!&G+BZ8#Eq@f!F%
Nkj!!Ge[4I9U8hFY22b*000`!@)+%5$L6,6@VB+JHU@Ef&KJb)dJ4$rpp3a&JBcH
FZ(VdBH,**P[H105dpm8AkZhMjL"+9H)9B5U`mc@$P(iB`NB"[lr@'B&M[d@3!,G
IbHr)PdUb0`0H,jI*bLMi,Vqa@DpHIC-C#cEBIiXdULIbeRJ5DYkGEk!)PSNmm*r
Kr8lN,5*Rkel(M)6!LjhJkY+U+cK+@!pICQU*j(FNqh!LA*--N3K(AJ-31M5)$Fd
`mX1RRJ-q+VB$pT!!%SEiJ(R!`CTF&-Cm5`j&$I!X*p,A-!jST(e,Q[Yf9a+FD*!
!3mVkD0UMkQk',Z`dB3`iG9Y$ErY$&5'b)IcGfhYYif-I-aq3!*HL,PhrB41cBiN
V[hk6MVjlfFbT'Dceeb%'5br[`NmYQh*re6q!ZG%k4kMYUj6mp0hBa@0I8AH`8Ll
cJMhl-EUid%)1B0%DHI&AF*PU(IajFhf&PfS-P$p@re@i#RHX4BXf1-'Blmj@lT'
QcBcPMZ"QH@&p8K&9B(kE`E2!TeY$he3mVQ&`Xp"6%8c[pZS)Jh4SN6BcAlhk$Aa
"GMACYLcYVNNC4!D6e0!X9A#3!24&9emCB-8RZ(%K-kRIUllI`$"4451Tf6CFNVS
hcNKF!m!V3TLm+Bke)GqkMBFj(!J,*'iA#P0l`f%`YGK*hEACb@#4D8fEG4aPJkX
KAY48NXTkC9EQ`3i@U8f)YZbKkN$QpDcX`')f&1MLXA*!-Rjm[CA[Rrib$NA+AU4
VRZBQhD@8TqjLX+cElA"GC9QJ-d5UflKA6@'HVQ5M9'RF6NhU(qB,9,I4QMF2%qU
0GhlQpAD#ZpiZ0PG%(hi#II0iKJNPR#RCPhqIbpcIqG$iE0Q1T$lM6p#iY5eKpB*
E'G`RUVX453e1Tc,JG5dk"USEBm&fE,T4NCb4)AMQ$k2D!'@[#-5j@@CGTfl8-@V
2[9&-mAPKXjbcQR$mcX#S3#S[qSAQH*0IF@HUBU[NU&3XM*2,&[(CUm,EG84C!jI
m%aS*$pHJN!"[*0%eXXYVe-[QBF(P2bPU-8*lr@%'P`bcXMRk#MQ[A#0X@k@jCd&
p30Z4kGI@Sf8j"B++U9Abq#F5F4c!i2-`jYlrd[YH5S@Ij1IrHkE[bqQN$H%MZk6
M@FLIEBPe+P11Xrd2jhmfB0-6[6!C"-'Z%e#3!0"cl)HYET',HPQf,%*%lidLcea
$q(GqPRC,$RLhpEj1kcGfjA[J9JZ6kPFI+e"LZ-83lS'$(%QYU"K3T5+HYR9K%S5
@!83M-hY66XCCR'dJ1hpfT'#9TY`kFjlS43YQl23h"G2Mrc'MY#4CV2mRc1``djm
S02lK#e$f&NU@M'CMjr%JH('LiL)#Q0RPS2'P&8Mb(KfE(!,Ud,+ZPV,!k+2E[Q8
2BHD0Kl"TDff-Fc#IJ62liJ[XHbP)mLA$D)"!64B)KDF@5m)&m((jh,',8NQpI&b
A'TG!R*pL8T(pV`r8VH5YBp#'2B0I"*q"J5V(Q*6jCGpH!F5X25IfbeZ0`KpcFDA
$8+5$2`)F@i[d0ebiaHNQB2Q9SAH4q%R%C5&ebKHNLY-E*)Nb@U$S-T9UmF@U*b'
"T6`H%ZPlC[bA!l"j1`U9B![@d@`QBdHCacb,ED,j)0"Jc*lB)@*"-bKi+kqc#,5
V8F,,-J0#%EkIN!$V"+ZFY6CeP,h0bRp&JJ-lqbbF"LTa9'9E4T%%!BYi0ILN&QN
I6k&iTLr$rR`V(@U5PmC8#SUq`p!m&G#e4cER#)#!%5c,$Z1D&8Lp4G%6F4i4QHB
RHHk1qkcGQ2-ibiI"'E9jEY5k&d1KM3$f+Z2@Xk)-kTUcA`UVbhF&!dK*Ak#)%,)
2m**YL3Hj)iRl+-Vc8EKId4i8"fV2,fN1+kN96[[$8"UT*-92-$#QmZJ93(S&[Uc
"d,ED0!j&YZ)kYS3619F3&LCB3Z56%Jq59)*NM6@K[@rejAjmVE*03b5CCe(biP*
Tq5YqXA6(1-fjT!QhENA)AZr'X(i#34l&IK*rB+MLX&'HdmRhJH1I&r+)5KD+B@5
3!(KmGdG@JFrR(f'%"'HN3B`d$-)PpC!!`&2Kf%EEMkL-c86"'H@l`la!Ej%%Vb"
BK6pB1+)"GBrLJ#I)P'cEX4q!60I3&"98@!K99XPRKMk"j9M!RfPja$XCUS,ZI*e
"Kr1Gbijh[PZ)Ydj6DeHiXA*"Mqc5e*X+'[4JVd&QkSiQ`qKFYlkZT4k)Riri4B'
[Ce[03M11AmAYAVSlS6P*c&i`KK)-XSJH$-D&2@'aq0[B2JDf%$hJI2Q(Uea'k6U
f+dUbMS48+aIU0iYq)H+AML4rrp,Q5A#*@%XZB`#d*X(r8%5HGkSSHK%QPUMV*0L
`*cm6mdeN1D5+LZA[,6Ij*1G8,d*@-JVNa&NR)Dc[PTUf6EikQRI'6mmiTN-63V(
mfVbkBQ,`hDD4R+e[ac+L-Ep6016@fYq!$ZL"e(Dq9XcI1fj+%(lRpTRDPHAVNXf
fqH`fD#c"0@[FAM-MeK-&q+"ZJK9A@APGKP-K,K2#&@1#YQ`qk4I`%hEFqN!JEk2
"Z!D9bGhS'`EF-jh(#"Iq0VS4+J!"3LRmNK$"K$J#8XpDa#$i%5IEAM[8lHHL*C!
!`K6NLjSScF5"jRifA(q"`ALk)3Mc1cHIY1'4'rF2Hcb#MJj`!pdNb(04DmiB6'0
PRNQ"B"1M-5Tl+hDK-UE3YU!%Q#8Q$IG1Q"UYpJ0hL9%dbIK-ZmE`(GC3hka@-IM
85kI)'%[P6cVa!PAmhNf5PXqSPT0I8B&KJfUMCbNSE*1GR8T+'ecM$pfrY-8jm&p
@SLTMF*G&Bl56HB*r@C2r)bpb[al"#9#50jl(%V$jI2i!m(Bi2IKFHHX3EZYmSK,
!IDLp0pV#C@)!k)LDiULji3k%bQpp!ME@I0R5!6I)6J)2'qAU"a'L2eZ9rBIQRp8
UZpmNY4hHXGALH6hQmmcPR*cmJ(k&5(+Yi3`#'Xjr&G5#B"pIF1If9K-Y!DG10N%
,2ea#S)Ri8b@$Z2FJT8S!%iAfk`E2j5`bY6jcaES!`N2@,rPMiYT44hfR9dN*8&a
Df9$['L$T-el6-PL+iMV&),`pNp9h0+q!&8[)4G(-B!#5ek&fjjR1qNaIDKPR!@i
AccF)CCS@KcQp*@-iYM+4Jide6QXE(FJXC@T#X0A"UCeYUp)(1ZlA1V3VS%TQZ15
%40CF[DL1F$(*Lq,+h6-r#(38`Ze&ZXTr(3@Q5UKm%Y'Ya20bCGVP@l`M!UHkV*+
`#XMhCJN+CLGaARe90MJq-lHY`GDQE8335`l@(i+!5N@$-Eq+TKrM)-PrR1Dkcqp
A2!ETi!V14*CH1aNX0NQIH%#LY'!0STc&N!!,8e65i0(ZkUNN&aXl@C)N64GeQ(C
V4L2C+c)4Je[aBK1&94ABD815RX*(qf44Ra0ikiH"Xj'h!6dRU*L$3Pa*(E-i45%
DSX$l$#PEZaK8TVZAJ!Q@T'Xj5L%bZ)GBQ#YGIMlAEAZhX'GJqHdcbNQ9"p3@r%A
KT`Ai%`P@S+U!P-JiK@Rj$m+khjZ6Q9qrUp8kMkG&C@`m6b*,&`@AD9LJ'rAr82A
T[#&rR`8bV,p`0DGNN!")V'P@Fqkm`iEdCSLD#@$1@Q4'djhhFHRDVYbD-I6$EMZ
4CfR+AFqDh(UH&BCT+j410a1f4ZAT*[5)Zi4ZK23HqSV@S2a)lhidkC!!SV3SCfk
Jmp[kmHqSLZm5MCDA$+k#k,qER[PI6"EM+B9QE$#*@iTB,r[K[BR"pdQ-hi'5'B)
B'`3H)kqeZ-+m"JN1%qS$DFPZE05i2(fT65"0`5[#2p6!L`h%RmAkZmjFZ33[@Dr
JdHZ*a,+KRpGPKm,5`R$F4eG5Hcclr!8hlC'Y'(%@K28GMJpX,c`UI1%j2kddl*4
b3l*LeLKicXHZRbZrJ2Ti*C9RahLa+Qr1)c$YTlM2G`*AmF,69PhU59&EDZ@hdqr
c'$&d3+@3"!%!!$m!%,BJ"!bhErdd!!!"1`!!'h)!N!26!!pAZ!!!$CJ!!!B'!*!
%$`"$9b"3FQmf)'0SB@jRCA-!!Iai9%9B9%0A588"!2q3"!#3#S!!N!N"QJ#3!kS
!N!32!%,"e,`&0p1V1$f(d,@h8%@T)cVXrC(jM+$e%T!!1mjB63je4"23CK3Pl!G
FR5X,X0TFJaUNVVeK(#),MTbCVe6`c"h"86`d-DJ3[K0N`hNG(cpq*$Fqj5dGGKr
9b+c$9([bR-BJXl39"BG+KcU-'M[@F(keic6FeKI!LV@(kE!b)c9[Qc2[@+h5f`J
+YJ&@1*q!bMq+km#0ERZ$eqA-S@m18mZ6@@KI"'hld%,"e-EPFVE')&d-q4bZJmY
fHU)AGDXdZMGV&a"R+3TqrkEDD,+Xh`Ec5m1Y`1P$rMXaEr[FCTlS34F(SY9k8ZD
5`Z63CGZ)1@jkr,P8P)f1CXRY-kX%-HjXfQ*pC1$BeA#`X+64PYP"`Z#N@l4EGaL
Eee+SkR1iL2*r3`2'5jSD-"jXKZYiSqVb`l!hq5NZTVX#1@,+iE0CAe%GHkJYRfc
bPUHZr6mh+YDcZNi1I8H$)S"rUh)LR9dk!LRBHF(Lai+#hIfcBp),I4MIXEf6R&'
bVa-Pq"$Bb`kfGEXIp+YDeeSp"+4(T'h1H%40'jlZGJk,PbpB[MqS2-JA9BqCVjM
rm26hEkU$(!%FLZa+#rl`a40pA['HVN0`$lcUKIMf)@XKMJrXK,YR'a*VID8+CIr
,#&[p@G6d*S6@J'T-h,!5[F#ZQ4c*)bBD1EkreBNc[6aCfZCq$ebjY2q0)p*3rfD
DFPTNe3jHU*!!B@2),2Il0+TmX15@J!6*SIb@&3-1UiBq"Arc6!Zk5%1VafGah!d
lpmBQ905,ZNRVeKK`b$)UYPGMS"f+-2+RNA+Q#5)[%G#LQZ4G8f-X2SbI$XXq9-H
-hEdHp#k3!--k`VJSGkKh`p4%HUA2c*qHqDRip`@ZFdFMT[Fc!#D%PJkR3Vf0"+)
6P&G[)J5eEAXd)DK+G&S8rYdE&jN1G%@9qRrT5bYRcdRe["%ah&,q1)C,RHAheq1
U3h)pZ*!!HmXMP@M6fY0Q%IAjB&@V!@5aq#T'C4$EGC!!!jFZe5UY)PSA(d#`XGF
F@JS2$9AJpp0"$0X5(K)NGdZSmSa(83$PM-k#Zk9$c&qI'H'Q3H(iakHCDI*S1U"
[&)F"ZKR0j$BTSY`(hD4(Y4!S&(E@'Ih-l)DaG#%&9QlIP5kBK',@G*dS[ahb**S
F!I-Y$dF"c'0ZbhC'0I@3!"Y$YX2f$`*'XA(XLqSd8hZ@K8J!PVjf93@eh[ZpT%Z
+#V6PFJ3Sp1#@$,ki$LU6jV5EBfKkhcl-N!"S,,RhFal@(3h6G9hdTX)DlkY3Y`D
"SV*Nqli&`2D8S$l&FSB)UL'5Kk4Sf#FHc6dCE6A`FQXpUH*mi4p'DBRB-6p%0KE
k)feE'c@d*D`94**JCc$VP'2X`aN+Nfm0L5@X%9C(CV%Tl6YBZhB)Xj3%ReKiUK6
AId+F0QPTK-d&A%Lf!a)5br2HFYmqB6QLJUmSI$%B-MFhTak4)-&K6-Z,Z2NkI3b
pY'RrJb'm""KeT[[[&Z9ekhimbQj%lCNh!Tl8IB$+[ia&J4*"b6GTFch8Y@&`DUd
Z"#RpCXMUPP`82VPdDCbq"(J08eBcGSqYhCR'EJC+NYJ'FVhlfq$',MSfKFPrLcc
iG$$(BLVSIfRj#$A,fiESA"3jCB-*Mda$f0d5-Nq%`RAdXcT"cH4#LbM#e334LE%
[68#dTQD)61K(j@jq'+Um'GD41l5X&&5Rm6)DGeQb[M&LZ!h,[a$I$hQ-B@4Q8qk
(0r)I&h-HGdjY@r@+)V64iSDp%'dri84Pjd-U5LlNk0T`4,*TPB,AAQ!T,BA8pP8
B[,YkedIlaLVqj1IJe'H#$j-Bpq)#KBJ%KHrVQm[r0EAM$8bB[+Ad5#ZifYK@iTk
l%jZRFSP@(CQUaPFN,-kb5E+@b+L([-m!&lE8ZNDCaRSB26U!%)A9E)qq"-N+[5m
QHdIClU&65'k5b@Ec5#d68`GHNX98Lf[$libEkMaS*Md565e4fjhf"S43CflG"&+
pafbV@U6)mk(X2[N6,NFqfbS#Re(EjE*b,+S$aQUjSkZ"aKS*1*Y@l)rqLdmCVTF
(QUNYXH09lBG!iEaHEX[%8m5R2mAHM22`G&r%H+rRQhLKjRA)+jQdcm"9S55BdFf
QRb'e-VA8mV5IGUF&aGqMdCMhkP+YNiGUB[Gjk*NRCrMV&j*#,N*LI[G3K+P&93e
!YRLU-Hd@UH,(Q$`3KNCeZr%8Sf!T(6ZJ24!aK"Zla+-pEF#YP5NM%FlH85`a@%&
L,`a"L9H(#BQNISEHhLmfGc"#fhf&4NLLI1DNYKj38Z&AA$%bIZB(B2VZq+@3"!%
!!$m!4,4-GVfi)plb!!!883!!T%8!N!26!!pd0!!!'p8!&Zf,!!#)F!!'6@pbC8C
TE'9c)$%Z05ib!!$SY`#V!)i#e3)!!F$rN!3$([rmrr,,4!!!J!#3"k@3"!%!!$8
!!,F!pR'h!2Ca!!!EFJ!!(&N!!"Yb!!8pS!#3$NPMEfi0!!&af@PMEfj0380633#
3$i!!N!N"(J#3!ad!N!32!%,"e*p01e'D*Nbb+)*qmhM42'+Kj"mB`+Y3jZ!!TC!
%!3!!23!3YAP)LE9p'e!!!"[9!!!KK`!!'h)!$D,#!!!*e`!!!e8!N!32!%e[FQ9
'D@aPFbjPH(!!!6aj9%9B9%0A588"!2q3"!#3#S!!N!N"QJ!!!@S!N!32!%,"e)T
c*VcEhXaFq!Va@cmJ9kmAd5RfqQ+1LZ`))l6dK0lNh(f$TD)e+3r&b2-0&(`B+cQ
[PpJQ1D2+VG1@NliFp"Gd5qa!$ZN'laLT0F@!hSf!r9PYXjHPqc!AV$m(@JmQ"!#
Mj-*P0Acp8S)2R#Kpe9NB"!(8%3pqeJkTCQF*m$)rm3)mk+KAhSY!G-U'2kGe6P(
k1RmXr0CH0"F`SmM&2[2Ta!FL*bQ+c$9GTUI0IjYDbc2e0E9#9cKiq-3X!E""+'A
RR[aU[)`i!NZV#*!!P6"QU-fd"!)BHK5Z0MD45%0XiFR31eMlmrbAefITHB+&5r5
D*a$Hm-[6%m1Y4Z(4`BKUYep)C5d1Gc1cZ8a*1qhG[Q"e0erfp'f@@S@P$Vimmr%
U&fPpK1BAX@R@e%DK#NQh30j[L&&-6"VbVe9r1'Sj1m$60&,m"&RmKZCHGC!!@!T
$jlp%6-8cmq1GmSY%N!"5V[GGQ4Vl&J-J3X(8hC5Z1SUfeJYkk[H8!d*rLMc%d&B
RlY%mUHF*PkL#Dp[(EphbCLGA)mhj*(2*XL3-[Nf4kE,H@b`U)6@h,9ED'KYZdFr
c8XX3lZ9HFEkM9-,EjjQePQdS4(MZTdFY%m!4fK2"P9l,l,4fGMph%,aRD%0C'l$
H2bf0qZ@m9alk+bD+A-6d2kTkml9HaI)GpE"Irlkj"3Fh&32[4)d8r$$%bE[lR(8
,0*3[%YbS+fKBTIAhA*H,cU#K-3,KPKhS2LJlI3Dj6I-!14"lGN2icXVS0Np),J'
Ie[pVbNL+pVf*89ilI!GU+3$a0ZZVTH&Qk"r9UQ'h$eBkpb!JG-bj5pZL4!Hd3j-
UQYVHY-!k@q9PM[K*hYbZmjjJ"mbBehSR+(NqeRLH(k)Ik@kH%)Zm-%T$!9KmTEX
ilF!HJeCZ%KG&,[dMh+k[DTRdjC,NeE6""%mQCHQ)`Uc&pJ#NZD+JC9P%Rm@e3Z@
U@l4Da`8i$j)3)eV@jKS8CZ2r06a(SE@qRjflX%C,AZAJA3'L%UE-kJZJp[hZI)-
$$a#,!)k1-@NeN@UA,8U*62,pJ"513KbR$Lh!r9lGU86kp[@c&26R&&1*$!UXTK)
l@'pGMX03Nb'bAFZ%Ik"dZCBHk`ae)3e$&VBld2rASR"ANhH3!$[bEC4!@23%cpk
3!+)0GJdUJYHi#B"XKAHI&B)MZNDCAF%9FYCY8mBKNDRJ"eB$GR`mDU%")N)Y3AB
"2H4q3*TS!8l3HIe`Sa1kC*DeDB0Zb@V-iZQE1lDdVVJr!$)qPKjF&SKbKeVMplU
kYX4VBe9E-Vl+8UKZ'0@FUN3j-[klkF!41H-T0)$+)p5'$j&+mDdjdC!!UfaZ2&1
fPGeq8dCdREF9hI&I#3#ADbhdXFd1f[![bdA3-*S892$-NEIT-BRX8B(2q2A$[`N
`BH&k05C%m-i&JMLZcH&aQY+M39ahpe1X%SI[@N(5SF+'[pR)G0PimGK&iK@pBZ4
JZK@XkEmQq96XV5hYF%BT4bcX*A(b1P[Pa1"EF,S8*mM$#)dFUKLeT82kEIRR1Aj
6S,6G9UbF`CR3`d)YqM&+39QiP8B6J6CNr,DE85QYKYEQA@2B((#H,YjKaDq)ik#
R1L(@r!r*-B1E6X%HJ@@YB+@3"!%!!$d!J,F%NCHhFV2P!!!F@3!!EiF!!"Yb!!e
M8`!(rh`!!%fI!*!%$`"0Eh*P4QPXCA-ZE@0`!!"3c8e08(*$9dP&!3#3$i"`!*!
'3X(8lEUY0$mk2cj#6DL`k5Cq+,'X'5#9Q5*K(0%[+qH')HNbQHN3SNBPNBik+$C
eqGGZhq9T(,h9(Gel6-j,[VcUKZ`k(0(%YUM@i$+TI8HVrQU4j3)eq(4IScVQHR'
48XMh#N5e$`I5aJ!Tembi4%$A"+VjN!#i&A2rSZp(61p(SQT%B-rTp+!F(kHU1F+
Phm"fr1Y$"XQ`ql-r5"aG5KL-P9$%Q'IHUC!!1`1%5kQ('Y3Pl*N(&aHTljD`jcd
d6`G"cKrQAlmQTZ9[@M6DNlTRX(kU2R-SS5(erccNi+i0+Hd#!"+-X!cGNeQFf%H
EL3MiEd'c*FLBF1i)(4b&'krD0F+"-6IRP@Ybji0(ci3HNUkdE@e@8J2&j3r3SX*
G3YL912Hqk`P(pJ50JamD,QR`2jr04%MQ6,*[V8iYKl&VH@b`a4Hh$-'NZq-YX5f
QV,Yp$qQiKdVU"4kk1&,S1HC1hKSH,PI[$a4GAbeI[%M#XZ4a6QfE(2+H12CaMX2
p9L-%Lpp6*%2Zp-a"EG2ak98L&%pYBR8B`CNJmSZM(['B8q32bb9F%$b1jXC-!,R
&DV0D[T(B%31Di%QM)XA+9+61b3ML*S`R)pJ-hm`Q&KaRham5&"@2Um8S*k&AjlI
UNe2I[CN1qPdFVI*e6a*-h`&($&5!5YdG42(THS*'-LHPVUJ#+C6S0MdRTp&1U-X
[`2f3!"TV[Sk#@V#bKh5jmPB9q8Vj+1[-*P`RF)[,RDTRpp,dDd$0jDfiSR5cM8)
FXTZBq0SJ#P!HF6c"J+G0mqi8J,`3+Ye"ja8YqP&'q0f#j53F,dPIC"+j'*hU'5p
+8eM211IK@,VBCL+iF5&T"Q+YK95,0jC)Qkfe6@H+"C2f++0jb,pAhEc@MSPAN!$
mSF[I&E"8f*!!3!bqEqZ$E'iZG*l2'-QZ5)03mL5T(0IBq*!!erGUS2m'p53Nkj!
!Mmkd(RfGEa5"Ta["L&PUT@RC4*Q2c@kR,MEa!)2GENV1T+2@+`UV"a0`LJb3!)M
JShSDE*[NE3j&0K!,R@GK(YH@$2`VUrX*FjZ%RM%$[l*ehp1h-m*Be5+0[@SDiJB
H%#V1`Vq8-r)a59Y-LmjlY,+"BNUhbNEFNf(rG$S[QF8c0"""2[0,6lqY#p,0b(Q
D4)LEBLmEE"iD4i`"'FUQ&Dj0U'XGq%$ebdKaKkYp1Gqa[akmr'li(X+rDIbMZ&8
TDMBDVF6GE3LcY%N`2Ia"TI`AjQZVB`m1(YYM*YQTfXXm90,l4Q+Hqbe3lZ8-IBa
`$'!3Y0)+abU2j,eFIM!3aP!"2F[M$dE3*XJI1*hdV5NeHDYJH$'4UNUlPZr0Lf1
P-HeH)cjE4H5Spci8XHlfI"BJ8TJ2mm4#X!i$&FKAL+LY`cQ!j9@'Di!MBHj1cEh
8IP*Uj1H[AE)IVM+0J6V4AqC&Aqikq)CDh4cj8#U9,KB@ZX2Mf$p#djjbP8E-bc3
)J8L2C,P6dCYHliDGPlKHQS)XDHMMLX-%T8%+ZEI"aM'06l9Q%0aQHfllB6'mK[5
Zl-ih%A*Xb$(eHDId&+LHplqPRBQp6@H2JZ'Ffm5,HFb`Tia+Pi+-jZ@eZ&)U3d%
6i,i1Z-@5+6(JR4(Pmk)F0%aBAmU(aQ*8BlTG6%KT)2QU6@-0##J"E80SjjbJHaE
J%Mm)89*ZXr(pkGQk"T@dHVb5CNMQCGV4)1h1%G*N4PkY8),6c9eUa!*cY4MFJa(
mEimCVT`6i#1i$QXdGq6pDc*q1YUIHJJZY#k`@X*cVmMI+'"9BCk(k)9jEKPdVhB
&'Rc"BkAmqUh9-UPj2Mr8jc-M8NX9-Ri'PmeGUXr@4@,*E9f!--83-*(Y*jZ2@Um
LQ2@M6hEL'#pKIaIFk&2J*4C##$aY#Ke+#cAK8D&9QebGI(#!#,Z9c`dN&T!!5Hd
hM'`Ub"FTA)J4p#`pb2H5X2&3P2K2(R[iD-4p@S&&GLY1`faBcb"%3E1SpATL(eY
qRk*XA"Q-3mfGf0BRQA#c@@[`180U5N4Mb+mb+PQEM4X$5+4'FL(R$(,V',RlLQT
2eFeEjmjd"R,N[TBT!lhiqiE'5)marN6lX4UDGSV`RUfb-JS!HQCQ&0`d*4-'V*d
#fQ[rLEe1LifR5Y9*CZdpeq89[j2E&8BPR%ihpL!ea3PaMbl,SLXmd#I*"N%jV[8
leY23M(0Jj9dL23@baakrHeYk5Gq,8ZF3)39I[PP8F9'9X#"B!4Tm4kGC*5"fc)6
T0qD'S$JP[i155MlB4,k9R-G*JU$eUk9,VaK(@U8L%dqr@ff8)rQLr!'B8X"&4"&
TRV-$i8)R8-I%Y`LN$$ZLTk51D3kcKM6VrT0V@F*3kj0Ij)c@358ckY$k50IZY-,
,2M@N3X*RV+Zc3+CB(AFrjJU9Pr%Q8r`TRek2ak&iBlQafq9S[8`!`JTQRC(3,1-
r*3,N1-mPi,lE2MMFpAEI6L5aikbcPdh'TM+c[JBkBFC)*PLj*5TpMaPP!V@df)D
Tl`Y2d6Gmai6Ld*3P+i,QkGF51XUhDb[%B+RYJ4IXbKVMf5YpCGhXRDbq'jJ45d@
kGqXQQ"1PI%%5NASK3`)I`'4fi(K6Vq[Pdq5d1V`N"H"9FrMjLc#eREqim2LQD,D
Y$A)1,5h*E+k"Pr&rcib'+Y&"D`ZqTmh$aF%31&fXAL6PRI"25P5&0I*(2Rq!hre
%8Ha5)MXF`*RreB5&#Z"DqKF"+(qZZBAGpeZY2IAXr5&%d(e5)90E%QkP0V6VQPi
cUB2Aajj!V8dp$E(ENeYi"I,A-IQ5L6UTkXGq3&#p9Ak4q0CY&&UlQ$[&eCXh5Q`
G-d95)VLdSq[c,GdG0+le(iNB#5K1HEkVN!$SedHjVmT@h`#*qAcI9j*Kpmj''(-
,@SDBU8iri1cTji,C$G'4%(QeH3QLprqGClh#GMFjJPA!jP(%i@%)U[N+B,rkprh
H)3'Va1i9bKcCUpBejP6"&4+c'UiY%eC!$%X2(qM"mi,*X3)#fQf6KIQ1SFjd)H-
DQPa**qJ4H1%f24Nm+j+!bd[r,"+lVQm1XBaY0[pIHXq+,KIV('m9*RYQT8i3j)8
mKpP5HK9'l%82e[QAe4IRei$$lAFVDPN8DKh(E-Blp"b5T+#N"Qc!Nk#Ea4jrUF%
kJ5mq(Y9M(6k,d+G"q11))E2b`!k0lLVU0UjNI$E'@L6Nf6-38rT$kCHUI8kYiZH
r958(b$rZ!XP1J#$a1#mSj+[NANL,fIQUl@PSF(-5DUdrfJp&V5Z5CFdaSc'X@f3
1T$"cTb,X[f6(FMl`S8GiFiIbjmd[MK[p6M4@j98-ZR&U6Z#Y"bClp%bI'&P6-he
#2dQ,1,QQYB'Kp9Bh2UNC[`SYT9H)!!lZp1,r&YZYP+`#I-[DjeI',6VbT*a31q(
dm`GP%UiD"pP8h0B0J1ll4%f%k*mmVlS&-'HmQTHCG(HXj%"qFlJYPK9ZXGk(U9G
YGB1pe(3a5rmJ)!NacSMCrc%GeJUd,3H`5ASH"q+PPhJIJ4464&4YlIPX3)UDTaZ
ke)lak3N`GDHH5$kj6rAhUhRcf8EGR29e3E`HPjId6+&@D&T9KGhHeZ'8I&(@D)K
HiLU3!*4LG,P3&VA1m5KHe0F'rM,6"!jL-'L`$a2aealjDPSm#1Z9iS%d%ETc-,,
6G[rekT!!dRqRkYPEHBR)c@qM*f'ecC'6IjS`XXN"$UTCCCc8-IN9hI`28q#f01a
K#,,i+$FKqHZfR'K$%%iNf`-M9IQVUd'(P`iaXApNlRG0%3l9N!!*)`,&Xa!4"A(
SX4I)ZTT)"rFLUibCI&G40ZqSPkA'4qK`J$X,6-Zpp'p+Zl#N2j*)-#HIb48b6pk
FCpL%bhjaliJ&8$%G0ZPb+[[*j[VF[k84b[rI)0fHR$(pMi02H$m"[(YUNe0f6),
S6rGS4,ir,EI`qecGAlrC+,YIFK"!)Ji##+!ZqU3"#6l&`JCZHS3(e`F"X(h2(qA
-Xeb"@lm!H1J!(Q4(I(Zlc%XC,-Qmd9%941P*B$'`D5K!M*IfRX*)Ml5`jiCLXQ2
BAXZfI+'+h*iBNR@*&dpXcpe8X)am!F#hqAj26Ll-5ZHSTi)&M-#RX[+"hEabT@G
Jj%efHM9!fj3+FBFEQYjS$9lDdB0EUb+haNfUZ'r,%f$9p3IM6J(9%3RmKV)-QC!
!QJN*PCqIIcDNF@(#1l%A0a'LCDYLl8BMjNSBUUI+@JED[5Ll20C!&AR"iALm3*`
CR[i6$MeQVh"Vq3j#L'Xk0m6Zhm1B8#1*[JK0Ka!4#kpq2q@KTcNhkB@er(LS1Jk
kqR[`PQr-H8@r-LF'ViMIDpb@V%B3!fMR"#RQ#NR626-TR$j(8f"r(GI1Va'IMFf
EFZLPC8e,&q6+([TAi+mQhVK9pD#1R8EL&lhmE*,Ib)X'a9TTii8KNfZCRGMKmSR
"9Q+FbGc9T8*h2eS@IH`Q'p)`'(Hj&@H60$'l&8TB-$Aeh2RJiN&S$pcZXI@)`b0
NY"Me@"&9Z)IhfNLAlDpHT08,Ql2mfXd3G#-i#EKd4#NP1V`5FhmUQ-4P`M4Z!4+
GSL9+L%pBekG!6X9h[@Uar[epFBbfZDm#MKPlJjJ1T)m#'Y+Bi'Q!q#FBq3'Z6YU
RZTS[$$FPL,YrMIiIfbP22C%'8F9ei0-T6eITmTc8e1&PjVLR&RFAPkfBAYci*JS
2DlXH92*MFG+Z4RUbfP9N2FNIDBXDf'F0!bd#YriKb`aca%"Cc`'ELQ4B*R2Tj(Y
!-h8ZJG9kT)5pLA"YF#*H"!jKQKm0%'`[&X!e,IQBH+je`QjB1(TF*jm5KZ%IffL
jC,4[eFFD-54S5b6cJ@-12r)M#$H%8i9,65'Ta5,H!*b+i%l3VHrHdN1CD+p%9-D
c'ASLh[bM"hDi2GQ2%#A&[m2D'CeH(KI#2Kcm3[E-J2FCpU-EqSH`lLiqE%![M0F
JjF2FIr4V0Pd'mlYP8h[GGf[P",3Y3PAE[1RG-r"6,h"-,i8-AQ1er8Ia#efliC!
!-b[iERb#Jl0Xf1,T&G4,%%8!Y3q+[[CD"2c-+Ch4[202k+(N+eJ'U3LciMda9Cf
iCm@8)-B9(Kj!Q&pPT$EI0T!!!lE%N`B&@Kr+'`jabK#p$f-Gm)4PSFY[LUh+VIl
3KXi*N6b*YBpdeLNKLdma,'TN)3X9&F&hNk)e6m)!N!"F4b6M$J)[U$r,+cA'3+Z
dVGC[[(P2Va%''Yd!HTXVe("ECCd*@mck2(6-qEercAqNe5VcY6L[2@VXD,X8bf6
p+FE,8&'0fLAl"$ULci(f0[P2M04S*-C$2Me0Plc)idd[pU@JD#h"*F,D3FSX*1f
qrcQpqPTBSMc*(0EVd9RFG`#K[rHq'r2[$#)IF5D%S%P!SXUH0rdllZkbE983VS+
(V2Bq["J0DTN`hL5C)Jam42-3$BBl[2(eF6fHjV3@fBZRD9AMCVPUKakGAp$1qF'
HR6G2BjYJUTpq4)d$8YR39ch1[hQQP9!UNbDZ)a6G5[b&-))RVG"eIFQcT-SY"J6
9Z15MhC!!U2h0&b3"K4`S6BSlq')eb@Ha0@B@F3S(drmm$,QGhpkN*p,bY-ieP2B
j0&fii8`(Dm#JPC`#DCd3j1@K+Q+b*@!J`F)&imAfkSX35VKSk"DiY-5dKfI,KT)
k0&K6pP*8fAM8%MLLG6TeJfP[Ji*B[1+5BREUD"&-bbXD8Ae@rjY'G5'C-P-SJ"N
`SaaG"J#(K0fHXKG3l+RiIq#pR!N+4iSN,k[5T`efBa2d3'+#[j1"5YGjc2B&A@!
ieM&iDBJ@0l1K3r*`#ZKl52UbU-AhM05[DG`6'HDm#!8d[$4j%D4hdVA@D`SMhf)
c[[(kThTh*&4$@J@rj[6M%hRM5l-K!h&aAXa$f*q#qQCAIXa`RNCP(-(J,ei1R@E
Y4-iU5cb)*DST$Q`JG50q-B2$ZBb2%p1#8P`%M6Dj+A(Md0C&JH38JMG4PArAL)@
`SHRL,T,rGH8(8iF&Kf!lC8q,Z3YRSh`Kd)0VF4jRi-%Jj2a(2X0e1@&a*Ufb9Dq
$Q8*HSdX(42'@TC`IbfY`1KPY0fZ,RZ[4LDI8UdNCbMp0a3'[LjLD$lEAaEMQfc*
Z#Zk8*QbDkY`q3BE2#H9#A141d9**aBp-))L!9$6@','JNl2BTR3l03ZT-LN6E"X
j*q$'$'a+*TjV'E0d3HS2+p[V9Pi4Y$LPYjSXffjMVS+029TXi)Z!m#0k+E9U3%a
6U95reSDh,IHV1H@!Dh"fGFlBEiIGKUjk)jH0(,E$p2)$hJJ#"EiEd5,p2!5*XYP
V8BD(A'YG9N'-mE%i!IC1)`0(k`)KUq'*Zh-Dq3fQhaq+fp!D8LK0Nb$Kc%0l(kL
`aX!BqIZFa2c9a'crhYdc$KGIM93E0f12[CR2&-)X3l0LILbXi)c!3KCr$"MGl2-
8-5@G@dbNh4N!F)%*92(arfkBdD$cf$@VEAerCFT(PYkQ)KZP6TdjJZb&-kRC3Im
N#YZp0&pUiA')PmFUAYlElM9eipV5#22hEN1Skl2c1TmaNd-D4UC+Se#X+#rS!(q
!G"fVT%&LL0#99fQ+L+33pN@(d*%XjiJ0a$1"*)[5#EbU-IKcf!kX,0rT1HEYl32
5R(-HI10klAT@0XS[!MHVNr%LRPkj"T1CZEJSFa)b")KN*6[#lT0,N!"eJ[N9P@T
[ce0LH&`4Kf9d%jqX'G"9N!#3!-*Yi2-RYAJT`&Hj"2Jq+68aB5N#rqdR8Ekf&U@
aLilDBjVm&)Va(TXSfD[Z&GmRK,Kj1&8U0*G(FpNDUkEf%'"NafF@mq4NA(%'8Gk
Mhh1@fl`U"8L[hZNBXNH"i6@Gpq,q*NH#&B%91XbB*G@LGHIel'$J8*f!0!P&j9a
XH'hcQT@m5CDFL!R!5%DfhL5AQVICN!"449rcEZHl*30kS)ebZX*3H+#edi@Ql)+
`H#c[1c"rdpYEH&Qj(eYENmB'#Yc`YG96BBV9N!!mkHDJmEQKFV288iekBpj6"`l
9ZDm+P(2-%phUT'%Ep$pD'b6&+F%`c[Zf(a$%1C5Gaee0NK5#pq"aR-a2c0VRDEk
mUQK$40`%(5`,SK0)Qrp542+1bN!ARqEqY`284R"kke0eA#dMa5f3!+ElmScA(Aa
2K1f&q,`1ai)aApf[YZ#-fCH`5P14@@04DJZJK3i25dK`D[Y!D!U3!&Rhr8(BIAq
(Q3)fJl!eA-QLe-f3!"8a`@%%D0hpCbf+V$SSUq'lXS+I@Z'6&6T%p'9),Krh#f"
-iaIp)63A&ip$%+pXLR0c6h+RUCBKbJYJpe'&GXCV2,R%3NdICA)dbd$@M[BAVr8
G&ZMP),HfqlEEq#!U0iS@CIc1kjT9Sl6B538P#*NEB@kZ(djEkEZkYZZXhH0DCm+
4'8j*#9ICiA(LU1mq+QJBmH$0jjHlM"Q`!dP$X9dBT6#9i+2Y&0hRAjhHMLCBmP"
5F$-[f6VZBHJm)SZ%8UGI2JbcilPbT1aH4`bVHV$Z(!%jQ[1bjTJjCE+R0bjJh5X
*566V#jdT@RjY"m4T$Fjd5PHV65HSS++Z[Ac$@"'*25!1%#N+`G4LkC@BG+FSN!"
@1)abM(0-f"I6pE8lqUGZ0C@Ah[*Scf#1A03h-lTdLhiV()GHH$AU*2MTUaf,a$@
C+rY+`)Ca3lBZbBAr(&6'YrM&kr5YIJ&aCkN,flJXrd(0q*VQlNLQrP)M[MMMZJ,
b3PH)@[KT`N0jI"N`mZmHb4N-3e**6!cZKrbUH"rb!qGlNTBA'%BTX0[BqERLYP3
#h4p%M$ldPdSCU21f&%iH$6Jm,QqmJ`p$SMeGlkbpPNMNaT!!S`&rX*CD#2"DXbB
r4IEkd)26*qU"Id-CK9l-5mUMf!ek)'VDNGB)c-FEEqX&j9bZ,0N`&Me+d3CB*MA
cDrXmNqKVNPAC2Z6@B$pT9"9a&c5Yqh`X)#!iTe9LZ&rRca!SA&V@Jab&K)$lNh-
9*RA!E*,k@DV13ZZjT"ljc,DU@b1eT3J$M)N,DhRcbR+dJLdXTCHde9F6VS&(6Sf
Gke5kBiXj3N[%X-,Ad`BjRPJ40k63E-Kh6$Y!Y,RM5RA"eK$#R8mb&KQC)6kXG()
H!@#dFbAHY)cJrLG9Eq1bjJFLCU*TD+@fI6!#"pB4+X$Na&Gf"MSTH81M2-`Q'3X
@J3P#H+Q)lh2p1fq)2!q"Ki212f2680j%F3Kcbi%INQ%30"GDBQ9[5L3eI`MjC6j
+(5fX&MijF6[a'Q6ZhPMqX3(h4&4mmPKGZcLi-389UL'1IYiF+i$$TJ[r8h6@4,9
U*2ID(4*'+L4#b@6UMdDDZ@J,d"T2G30,6DHA$HY(hBKjZQ)6&l+Nld*Nki&l@Q0
aqidKU3m&&#$XlH#f3peQ`6RDKX1E,TeF4)hFliUX!NQJH[eBVaCh3mlKd*GarHp
ZjLIY,mP00lX5hIp4M*&%j4%*Y#Cm%Emm$Q2E1NVdm04X0cN+j-+#H@(Eh0`$d($
E2QGk@8&q-MQ+)qJP4&FFQHZ%HjCjP(d2QL#@H0A3*5Ri[Y4,J"PQ9Z-UNQlDTZ`
B5#M)QrhFaHCeq$p2F0Ac$R'`r"@G+FlZC##jKGH[eZM)N4iP1%U#bS'1Mk!9mRT
1Qd9DEl2RbDH8k$kf3biQ,1ZGEF'&K+URILmZd5"SLPGf5'HY&r1'KU"+KI(T3be
%FkKADN"qE30@b5Vf0J'm2aFM3lh&j09[$Lk,I%E%dq)p@"Ip4bFI-$"XCHqmKSp
Y9lG%XZSqVlY"[,NATqprP%a*"e38iEk)rU`QPCDrKSLk'%UkG%cakPr*Br$MV,%
MH!#eLBP,0b`2d#NRE5UNMS@9HX*F+Sf*JN%McM%aI'-kC&0R)FMY`cUQ(2HGGIa
N16aTFSCAPS"KkEb4lXD[M-I@I)c#6SLXY$1b1A8!Cl*R!S6qUlY(%3+fqaZ&,Cj
FqG@8K"%XXQfT@!ZD&H,F,PJ@l"Dpc-9*KZ4[%X$(m86pYdCN"IQN$YJFZ-SKe+'
9a4)b@[9&J`Z%k'bC+Y"h5aFd308*%Hh2&bFJ4,Gleq$P5&TX0KIhG4dNLc1dhAA
L8rT8M#lrQr1H&Y+eMA*c4D9B'F,r,Kr-@3rH5re@Uc,6T,bI@RGeaD)SeGpR#[E
&+PQ,`dmI!1G4JP&#Z-R8Q-f+*4d-[Z20%4&Lfc3[S[eq)pj9`fiIrA%[*[DFJmN
a")$d3TGLk6$@5MA2RCiCE2(%!*T$V&438YlFfc#e&(-3*RQH&21fmY9,N@X"+rQ
3!"Dr+jM"'9bN`@Z-k9YJ5S(eA#Q$jD80V-YN8[9jA2JeR0TSZS1ACL!'GCQh"Z-
HGJklZ#iIGpY$1SHX(jrGp!ibVN4q+lT8[)LidNLPIq5jP#6fph"qHq)8i9`J`31
HZLRUl!k6[c0dG(U"22FVmcXC!CF(K8h6%),HAG,LY@ek$MY5hd`0!24P)0dr&B0
ACk&1A&YAM&5qkQ('V(EhA43SlpQ`CcK`ANX1*`I)KPD3!+TQ@fk(RqJdbKJDB!H
Lp9VbL"I)f)Kf'@-K4d1SF6epi!a6fKiL&q*D0Tq#5'*k&@-2Y@(GS1*4,lf`e!D
#,ff)1H0ZN!#[%+R&a3M#2YILFBJA%3Y1Jq@rHpi%E[3DI"f#0RaAZIF(pH0#ER$
%319hpN'cdNEAAl4%a-,TKQiAEb4Bm)JiV`LrQVk00qI5UNmr#K'q4kIF@PF!8Vc
F!6R*3kf+FiSf2MMfCQTTLi162Ij+bXjYHj1KjT3@mQ$P&ff!"0M9PNMZ2E0BddV
)Ni#e6XPL84%THhZDjTBYcCGX6ME))R`eDr&RiiSAa`T5JJ+0ih5h3&@IfE+-*EZ
AiNCDlP1-BMlk&#Me-@eN4krIG82#e5aNUmE*H5Sc`beqfL3h+h%CB'eaSPQZLAd
NYlBTbVr8HJFI("*a'1&Ae)$fGljm('ld2l$)$l(Il5(a,DqX&2kk1&-RL+h@J[X
k!UMRMLhdideipdH-$'`!6M5XK,Q-LY&mCX3E0'AG5AS2e-MNNA('#eRAlh%jRab
QEQfP6mD!5cE@8lK2bk$-(L(EMMe(-1ISP&ImZ6Mbp&1U%)@Gr,+9pqY)6CE19S%
harZlhBCb++"ie6Lh8h[@M2mjLdYX5KLpCY"TM&1m0hE9I2JR$D$[G4l5"*J4*jD
GFdpA1fYR-[Xd)NGZ+F0TG#rp8ia&$99i+Pq3!'[hV35Q!($l%),A[A$b`HB3!)-
@CqmD[Nb+0aL"JH!"[V[!2M-(-i+8Ff@hJ0e$c("mk1NT("3qhp+!Z0ULQmL`Q04
b"6ij2JI)"F2dXQSH!L#N3*``-f")9`ERVe4#H!H!RXBVAlCqI(B@FI#jKmq&Rqc
eEbf()U-Q'ip)qmpiheh-i$*Bm!5B&N[%I+QCGjPVp,)cf@[Y4JK(([MGGSGY[`3
C9NaXQJKE$Mc"c0Z)RX2d$&*A+G$2KM`iV[F&bB2BXlCePhcq&pYi0$fZp1TGM'&
+a2FLC#"9pHI&SaKilq*4391-B'85Y*UlA%3fE-FTdV'r$l&)'6!1-bJ6,jC6hkR
YcUl[!5e"LNC'[I[b"AZ0`CAq6Yq+rr,+JB#ak(E2G`pMDL+!Rq"kFkr6X`lrYL!
j+&-AF%$(U'4Q!4,%@RbA!KH@(MHb)AZ$hUGfrpKh,eRV9a[CU'NK&kFbP9DY&B)
X+PlE"Q3Bk[06S)b@DFB`B$Dhb&1e!pL-1l%P9jqF@rKbU-S4lj[(mS'$a`CXQ+(
dl06d!,TLGjk#JlmK+8(Dc*EjDN8PV2H&1$9mKb@r(3heA$JLc1bk-jFdZ$kJFZ#
'--'k*BYiih2SYlN+5m1-b0@(`L9FNUP"k$p406@fT-qlEihJZJ0('ImKbJc"Zr9
iMiYY%P!9L3$k-085rNK"RIphf@f(mFfGhi5[SK(cfJ%Z-$N`*JfT0P@A`M!Akd[
pmE!'8#Xl*c)5@I1NeX!KD9Q-+k46P#"%`#H)1PUm%CBJPpAE1@L4%C5,!4R`LfP
K&QM[&V'XE*-CFYmRL2E-9TC3T(K@r*I5bKPG%,L-rjr'V'q"63ipZF8l4fR-6Y"
(r9YT!&CFiejM($'5kMi(rX31Qkb,l,8rC0UGD*M#bL2X"E`'Mq0("1ZPHmrUV&U
M*R-ZDUdBRJB`cYb$V&%E#N3ITpL0QXe[K'IG'RPRUP-4p'ia,#aLk6D2i*bHY0*
6GK42M`&3XMf2T1I#,2C$QJF3*6SD5+#HK6#,H!kQM[fd*!rFLV840MJJmGjC1kf
DJU4l,BH*34he1SC4FZh$,8)1@L%5!@EcBAjM&!SM*&iZJD18r'a[lLMS8BLH`ql
L&9dRmq+3!$(m%k&[adZ%'V'acI'C0)3jcH3URTpD*f"IDC9$ViN!*D2&)kikGLG
NT&pV3I[I9D,TLFRSJNeJJE[Ga)!GM28&F9)A$+iTYp,CJllYD9JZ%&GPp[h"Y5H
aIiBXHN(P!*eprRZB'FbXaQG1ZeE`cbG3mSb5a%aM4$2'B#iFhNYFDZPIbM`4#SI
jV`j$M4!e26md)KG"(BSb8RBk2F8j0BLYZ$`Hik)X8Y1eL@A@TrSdPGMrq81JGPk
KT86!Yq@93Z,Qh5J`TfPcTI12aZ`[L[eI`e&0(QL$@j!!FDr`&eJ6TIaJ'&Aj$F(
Xq+0d@5+8HIaNFQ5G%9,I6p85lFmF*T4Al!5M,V6,!q1V6#!4YDp1"F1mE5cmrl)
q-iFH%UT0F%,)i($#pP'`V&lU,@q$)'`2Kb0HdjF1qfRVMeiYaYM84B"ka%jkH,d
eSmHVIKdrpaZ"jLJS$%#m`Q+GqVd$dljLh,r!QqNEIVP4d3(X`4DeQ'N,r2-*K*0
A9Ck2KbVI1Sr$4[3B!##a"M9E[[,Xl,R-IpcZ13aaS4ccPAm*PR"NQBi4cMY30%c
5A5Za25cmd'MXclJ'QVP5+r1-@fVAkNJhHPBe[%RD,MX+C(mRaj`H%3Y9Y"r-GZS
0N[FX5LmQQECkCVB5aL6")II#2lI2CEr[%EF#A%LVqR8MqLa'*!%S`NY1$9d68%Z
*f2*$I9lNI[S`L`H!Naq%M-22$EAd2Ap,iYA43"M*hq26@3TlK#5Db%U1Yjr)PKC
'![b4hhG&AmZj*U%lqJCMLc'!hGfC%bd,PY38JeE,l6kfE,[9jm2H8X(Yh+FB9-,
P!"+"Aff`d`rQZbLCira`,GmB"dUD(S88L(feU!KU(U5VmTG@q#kET+Y`+S@)le4
RDqAa$Xkq4i,jTK&L*!,h'Zc8MB@MIrf`XLPLch`c%Gk-a96+aIIUphZIEd6eaE8
,fZD0i)GDImjia8h6[rDh*AQ(AR@EV23,`Iq3!#N8+3DImAXkj'lS[+AjP1Hp@5f
$&qeI1MISIAcSqEIHGXHjrU4CDEQ#SSjbkL*)6r&C[edmC@FA"+i4!f8MTYK!Uhd
*AX*UXNJQE3a@FcNq6YaY@PMkm,p3858N("pShY31ZKarJD5I4DJc%5GQBDHH2+f
'c6HM4E`4KSBRYLYHhFj%%M`cA$L[AEjNYS%3%MU8Glq82VA8&K9%A)R`hXd,$fk
@[%dp),FF&JBJKS32F%"$bqakGUr@Um6R"e9+qSi9dFlREV8(EN*2Zf-hLFf4rSN
dV)Z#6Bii#HZqpH3DMSY3ZI2@SMY0llfHPmj`)M,*m!6ZHi'`cRGhLHFc!XAI2`&
"efKNhVI+T'-[B[Z5CV6ccUY)-aLiQ+-fj1DV(LS80RNaiY"1Vmi9fjq@UQ8KlNE
M)N4hKTlM!lH''0ZLfT0,d`HR1,,2'#d&j'S4&GGjQmRKe#IK$M*FbU0VUkPfPB1
-+M62h",X&D5XFSr)8V4jrI$q-NQ3!1,eSlef6eC*$hY++mQKH%3ErbqY)mjZ%+H
qYH"A$K,FENpLr0-1$*E,BQCV`ZFp@5K)9fDpb[JD%!!dp4cmFcMPia*a,GULXX9
X9[fPZR+XKSB(+R[ie9e3h+F"-dGPU)qi+kDqLe9Ihc0e@53,hpN8XP9!"FkYimZ
#+(qLDc&Gm0R#Ac1micF-D*f!)ppjEIUCaF%$cKMC'@+KdN3K'rJLUae2X&0H34V
342)96ZrC,EBQYEBb1&6fbdp6BTA`m@16LPFTh3Dm0U4DHAXQd"0f4"d9IhT"Xdq
'D8D)4lmkEaL[Lc6d%+j)HD8ck$(%JYf@clB`+YG"&(I5i[i9MRY""DPKe+NBYHQ
5Y8-Y$LAq`[3%M01F1"dj3VcKqlA5jk)jh2`c#p-Hre1aT@&4J#8!+4d,INcpVN1
rb%TC+rlS"b4Ij@@UjC!!q*rMX5l@hpF'Fh'I565,jJYB,!,m-k&&Xq!9c#HG`Zf
F8YEhJ&iE6FMIESNMp!S",#jMRZQqc8XDba1I8rjRPa2DfDbadk66%%bpVUUP!3H
,+1e3q$cP*42fYdRNaV'QfAKaYc)`HKBQXji3HPRE@6h[U%*6G8pfLfc!5BDfqVi
rG@`I1CkN%FB6PKK+a1mA(PA"LY9*L-cd-Nb"PD$(&AS-mFPYD'5!@'FkR,YZ%Xl
&'F$),e96Dp-meBrGeLL-[*`-FXH)bEeqPZESJNmk@LHRr%5h!Ad9B*5IPr@9ZFf
ekU[36K58d[U20rCe&jEL!ibmGdE9q'FjAP15F9q1hLV&%eLF[lrRZP0Y8B@JrHQ
![d("d1C$B)Ibj29@()#H'e-"GCqFZ8UIR8+UdRmS5AhpG9,X60!QYmbH1c`1kQ0
&Z0)9j''i)D2SIr8"I%Y3%GEe,2464Yf,ibrS''!T,YQqFddfG9"CpSH%ijQi``c
GEMTK5U*r*Ld#(TIe""96V(3j8$$"f`YS,GT(G&QbLHm$E,@S0lH[)&2![Rpdm"9
Jfc&f0r88YUc("hP+hQ$rh8bq+!hR!EmcPjP4S9*X'F)NXi3D2a4cFBMYkcJ'2jM
J(URU@lk[hTi,Q$+lHkSH5H"[dVrpdhKeD#FB"0L)jS,(Q8b'PG,JN!#@6A8UA@+
Drhp8*1Z&lV*[9`ejbXK-9`*+G,Fk+likb`Vqr%%fSV@"0!8GJ&h4L[*6)q31MQ!
5"&1M1eh2KYBKIJpb!4Fp#D(&J6h5`U"NC),X#H`UNi"k!Il$B5"!0#hE0SHb[$#
P6%!X8&RU2cD$a6)X,Zi(S$R"$-4eKcGEG3[jB+*8j8LBeB-RijiYShhmp48bRS,
JQY#8B$aJad4h*U+LUrXF`jdkUVJdbGAK`XMP"Y8#lSDm,VB-%QdQPaQ4jfEqF0,
JVf+25!LRlZEU+j@mIF5(hK2R(5NZLJk!h"15mN%KqS`)Yc%eU6h6I&"@6S2j5$5
k`BJJlqK&H(c8k[YdkEAaXZPJ)1U`NLPBLU&YNeXXY$M8i(&I4lBc-Zi@T@&BGmD
l)5%43',FLI9$'RV+5Pe&0!(ZCqAQ$&Q%Yqj'Z1rM8k"UX(FF!"`NK1&BJ2L'(2b
kC#AUkLqL(i*5UUmRijYmj19*EPSFKS&8CPCM#'XN9NUH"TKEf`Ch&+FKJE2dKD(
Y*($XHaB[!ibZSGKCCU2MPfamLh5NT6V,f0kq*MYiNp)1"4JVLUeirF[1%VPN5%i
&I6AE4djib2-&)Z"jA,N11HFMPMCK#q'k+*jjdia+d"kJA5bYC[+c"Na+XjA61)V
Z2'J`bjR1K8ScmC[+NLPlZ69(X9F"*%&c*3rbQb"Q-fR%Y0lHD)QriUYG3[3hP)V
KXL8[8iL6hX*qG*9FU3)ANZ-em#*+95&D,EpV2KK8C[mB5J!eMP*P0B#(YfECe41
E29,XNYCLQAKeUAdEc"(1kQp)`,2"SQ)ric$0rM+$"LraB%$dc@!j-lY+9QRDq%c
0qZ2IpBqP1f3*2#@SNi(aN!$MUJY'iIMhk9abNHaUMR+28&ZJ4cIr2Y*Yq8NQ"SU
HfDLiVhabVF!AqqU2PYjlKd@L34@%h4N1@,c4LZJiV#5mdNLM5!Qp[#ii6BP`drK
YMNrE`c6DiSfK!#L6I%BV$RBk-*9!j#8rfI(%l8cGRIje[2Db,cMX9D)&Z$!(#1$
IT,2JV!LN4KMFp8(d"VMY(fZdd#TSJZUe@2E896a!XTLEHH`M"'BGNlebShXZ'F%
Q*p,IPh0*#&V&15Bd*)1rNZAP[UEHhMT5[22$'2Ta'GEqe29e6+`R2V)`!Pj&9IA
DDXk&qDTF)HBr'@+ACqa[LLLB1$aVQ&I5dB9&6Vc#BZ5!*$b)"B,D!Q%@-F%pIqP
-ZNR0%qVfKlD[(IM*B*k%Dlm8LM&%Dic60JcH#LRI2@l&+d8,8Fi,)"S1i"McZQF
`-8@!14IZBD'jBfZA3qibCIc6BKI4qlB9DGlL4cae1HBlE9)(qYkGcVc4+@a8k!f
#aYPPRYeSKMCHf#U&Y8Mpb#D4UXf6liHBI*!!ACkd%dMTV[%40$qdUcA(&+H[KVR
i5MS#U(jbbkc(c0X!TUBlX&N1Hj&KBNbd!4T*B,mR$0$5V(p4L6c'bq[V4#+`p2b
N)GacKrH1X6Y+V)SAFNiDG)h02A4l@JDVdCdr@FSZ(BJhA`Q3!)1CjJX"LkZUiUk
+"dp&0Id4HF@CH[*[@YbZ!VH2bkZIRILrXeN5+4h03k'@aMi',`mA'(F)h$1"EU+
Xpji8N4$!(Ze#EGde-kmjer0F2mEUaZRhLrEF'"+ZK@KFa8MUeT!!RYMLLBT3HeL
*V(24%%S%L*1D`aQZlRd2H5l3PNb5NQ09P!GbYQpGQPb)I+*0TB*kkPMS5R+8GZ9
$bRXJUD`lKN%SlGJ(BY@QG%JBblS$AB5jX6iaKGK[ell0)"8"XAh%@#82&ACT6Pd
l,HbXf$p2HkG(-N`D4!k`6K1lAkLCMINXP"M`dff,FHb5I0S'L1A%%`jd%DjLNAd
@M%4`58*a"+h9VMq*QrU$!'%&)"EZ0+aI6P4@Ya'b3V0aJ%T@V[A&$0hR(bm5+8F
e3eki(,$M%r,3Y))Q6V6U*@B[GiXT`9"IQ$a9YPTX#2Rm*r'l33%1N!$dr(Ea-Q,
U#ZUA[DhY"[XVc(4NXS[5'*l@U!pl)iEQ%pjVD!*&+RUa3[l(UbIYA!hal)XQ5a9
-3%Eb5ZQ)4@rHY+-XTCjY0iYqq'mq'fCX2kq,TQpjm`C0!ZJP+[D9Z[1N`+l13")
Q!!E+4%eNar)!UR*fpQG-aII#"eib,F3SG1EYii$a%)&afR-6QpQVV,)Blp0lc5q
AMcRcP0VqSM4D!S@CPNIM+[L'CefG0$)L@hYL4i&LrC8hdf"CTHjV(iaZ)aC6&fb
"#2G%A,'*Z2%VI!`(i)k9TBS'pFJ"BKX93'5LXYD1B8-,h[,$r8*#lFRlU[dHLLK
35#)eXG1#4fMi"H"c&p%HA(6lVQ)p&10jR#UZ1ffATBKJ'kAf@MeQP%#f&5[4d[#
UKEqX2%5,91(0!GLl`1lkXjbGFJ(fckZ8+J+#NP"`X'Sa8IjCK5[X%'ViRY$bqS,
&58UMVX-[5HS(AC[`*Sc+ZF2B+F)Ub-j`ll&Jm,'dh0G+2bD(VT%a9B8dPaFMI%e
!jGkf5PY5CS"dl[fa30VVejaMqD9!*!Z)eep)QR#X@[1QTe&4+(1&JU")DLHCY!R
XBTU%c(1'8X[EGXHrScG5b!q88cmC5a%fHMY3m4Y6rJ++j9*@q@S,+kI*ffXH3ji
QI06(%SXKV(PX#aUSFii"Be0i5TQk'Z2+,PDbjINYkpIUcAaL-paKpJkfAFX$bIB
('39U`&QGVIC10JUMTT!![IYl%(+ZB*XKG4fUTZF@macIp)5H!3p'J)+T)hV*&Ka
3"0DkF`eqZa-RkCA5B4)@cYi(`AB`Hq+T6cM9,IR(GrBJ5bmadmk`LBekj`2$5&8
m$+SXF!QEee0ZmfVRG8j2cSf4IY)DX,F91[dNSl8QpP22[8ia@M'@pJabD6FHV1I
VAF0*90AX'KCj!CFcHa3YE"QEj%kP-P3C5F46AGS2QLFV(Z-A0!qi"cj5eV+'Ef-
L'"Y0G(KAJ16PfYb,+--cG+!2+(bLc,2`Gh$!CJ'lLkq58(1011hDJZIk!I-+VMk
fk0MU4-5jX4"VaE!$d2*HJ&Gb"H5G4Z4!H'[bkT-!"pll0('-"jNhMQQ@)A#X9)F
XSCeGi)[$*-$KdL)KD3+,kRL3!$c0ET)8N@F$50CIGUe#F!pN0,fJ[#d@KFMA(Y2
%&GkXb@D!bm(cAUcB)$#Vf&UJ33D8*NkUr#01VF$YU'2B*#Uif$%UJ!Y*rBV(dEI
UQJ35K"GA0Jh@I*r+hXI#IP4e0D#lAa*Y2+G)A)J2c`LYV0#0MJc$DfVSYAA)#ZM
)p$(J+m1CNMfRjJ'5qG"qX!2)iaaZ9aF4i@Ydc@rh+9X@cUe++VMr%IhIF9JAPAK
'2YL%m2R"UT@kQjI!JiN!GqCP6j)ZipTe!1fDTY%af,T9dY1REHkpLDSNDEFXqdT
AShG*aEm,IGG8e3I3b5k`'S#3!0M&)mI2)@qC,C[3VLH`%aM3C3"Y3U$PC!p*Dil
K$MNK5rUdJ)"b(1TD,Q8B,LD*6++C49rc1[qB[)Q$BPc8G-*'-bhlGqJF4b1Z[MM
GKS!aCP)mj))"V[YZ'"RM03D$b[#lrdNe-VB2SXhbPBJQ(1G,8c[)+KaRIX9d0DP
6!#$DR"9dh#GK9F5a)5YdcdJL*e&PZBFD1C3'i(C5"EB!2XP4#McB+4Nkr31qc*a
N$pE-E-Y*40CeaHMTC'5H&8fiI)86AaXURk4ZBE+[,fEiHT+H$p68maZ52%$`9h'
j`iX&%5PUedTVRUCI&B&dXf-6"NFK&6'!UpE3P$rQ$"LaDF'#a&eHa(&E(H1)USj
kaESCTP"hr3+a)C!!D8)"90#q`Va"$fq2Xi9hcCi!)cZTXiL9fJkjJi8&hAF#(bU
kZheNJ(aML)$pJ-T5l!,Qi&3cdNafG&(QBQ`1qDj%*d,r8`BTCDD9GRFbS[dLHS)
&DPK&!QiCFF+0"ZUqj"kMFUK!`%9!9kFALTEplhkX`8QNK26k9&)3B@'ZdEm!#pF
$)NPIp51$iLG)hEGGmF$-%0B'-*QfYN3(hC!!FlkDDFSU-U#U-J1,rQa&Er8Qcp'
U-!++,$5ZCk"P8D&38Jf!M)5P"0mXLjb)8QcE%`ZEi4`*I@c(hQqb&5-3p$'3!%V
+Ij5&i#+$!UA9MaZ1klk505Y6`b1&l8TDml[9'`k(NT)hD!ArUE[qJ-('Ia6H032
2rj4-Y%6CGdCXKje[S(!fYQT&YTUT)ah'!pKkY*&lrSNd'mK)$Dj"Fer2dSmrH1'
CS"&NDCR@q+'LCZE0IX'LU4H22HG8h$40kh9q`kkpcm8mPGkPq$,hK0!#X61&,jk
fN33%KpiYUh#rh#!1lhipmP(&r)f#EimecBcFc5G,`q&BQL@#5%-fde``e9EP9HM
Cd,D9Ur(PAh9%K8'*#N!K'$"Y$raPXJT3FY""a"rqF*KIcA3IcX`1P`'(X,A@%fI
L3&40Q6Yfm@RkNp8$$*Y%6Ghjd64bD"+h`J[lU@4lLMi--#UjFXjq!CQ9f+Aj8E&
T@Afb[kp-qET2QHJZEC3c+hNe8A*()*rGGZJMMXGF+kVXkLRp*TZH,Ba(qpL+EZI
AU-hAS@RB*(XR*brA'C%RXbX5RrQdPBk"jH[X42!j6-DKeTlT[iP"qbKYJ51`m2l
BLV[RHeQ,I!QT"q(&plcARpJLmLN3,(8kV,0FCM`h'fNHcEe%BRS5,59YU+R%ea%
Z@M'56@-%HXFq$cp3ZkmfZUcEb*DD#D'P"HMG8&mH,#1PMCk#c(YQhpM!#pmQV3[
IZd3e[p+%cf+9*iIL`Fr%`!V+@rRdX5#RUYb(Df$#ZHakK1T!1jRCDaamM-3A6,-
k%i12XMSM()PI(NPQ-2-BHU2U1P!bd"H9!Bi'*`)2$Fh0hV$pbH)%d80@3)96bLe
K+TP+1Z0*i"dJD&IhVJ2d(kFL(HVaE,G!)e#pSQj#f-E$`)VlEXUN@kQ"MZ@0ZIc
eEeh88iJVlc0-$Q'Cb245Tq'YZQ6[m"U4)[Y@9U5!ir(,2qfYTeXT4GPD5Y@1MY@
8(qp*G`4J$HD,Mq%'eVYP32-!qNQ#ZmlUF$65mSqj5Kr`06F6NrRer(cA`lf&8Nh
b*+%)AK![Grc,cjN0!H!Sr6`l`c1UTPG`F@8bpYQL`B3d$B1&h5hKiqM(Li!Eh!h
C&dl0VeQJX0ZL9#C(8mSVcd!1a$6324k&hRTRK*%%q!a*[4@EUI3-ZZ*Q'mcXC$I
m*f[6Q0BY!"-%,L!DU-PqQeMLqTmkRKXY,Q%MhI+$kLZ"p0e,ZAK`VC,Y`qjL'bJ
,5Zh3b6K'-Rl*YX-Uq-1jjN8KBeh'pJk80N!LVX()mEpTpG-hj1X(Lbh-d2ZL$VL
M-JT1Cbme#!-mM)DGkd@Ka0FYhqTF*h-)rVcK'RF#Q-F"3IIId-d@[jlrma%P'lZ
2cK"5"hP@9b-ETrC,$8[AHCr95(T2"e`G90)mh%,mR#S[dbC-!bXaj3cCC-irhdZ
6XVf@U#G*4cc6SKY-f&fG2HYT!L(1$m4U1D9+i'"[@rjX&Np[5)A@-N,he"EE%%q
L6mNmeV3$8Cc4IZH[@`dNNLG14aCd6Y%H1!,lM,ri"L"IJf)6FX3)'-e+jR"bQRi
m!CciNImYLhEJ5Ap@QY`')(-X$iLAL`!MRa9NQYh9j2'pRk)C,YZ+[!#j#-8$p`j
5G9C(#X`f)j+&V[V$R0Z1r"8YR"K-QP@[3N2cG$SZ4dfN2&QU#K(63IrpF[(P#j,
I$c&@$K5XaK9d1PJURiG4)5GZp`p"FlN%mN2EcA$%!TM`q+20rM-Jal4qm-+FaXD
1@@E9V3QiPCBa&k!6ma%[2BjXmYM86[QFlb[N!!QqM%6b8p"MNVc`ak2MRMVA1Ib
Kep3"e3KQ6I#)Y`C"`$Fe-@$09EihN9a#U0a!j30LiGcLqT6m0ES+r$GB5P%2M$8
"r9phD!RG+Nf90$cL$5$j`Q2ANPD2*3XT[P"fDV*QDEike3!ESU['###aR+d6'r+
IB!j6,[$%664mp1h9ZMZ%"4AFJV)b$BaH[F$8D!cbXI+3!%'c!F40CS0CXpiTiGA
j8NK%!jc&CQ,B5ia+5NY-1Y[aICBZ`ZBHNiI%a[4SMc,8SeNIUNh2pb8V[DALZ+d
`D2HZIXed[N*)D8A#RU&M5Y!B0DKk!9*p%qD[8LUN'[cq8USS#(hFkb9Y#1NCM&f
qYUE*3hMIeR#mQ"b*i'fim)CmTVm&li+Fi0JTG)d9ql8'Y+I5k8(#Sm5jrRT9b@1
lZcHj%L09Hr4LXfq$NEhYNc1#TE@&B3!#fiZH0CjUcAa'*CMYMqZ1Zp[E%aKQZ'*
i%0-)%&@dAX,#qKCm2T&eR1H`baaLe3+Ck%aU%-c!EmiEk+(Jf"qVhdDflF8A'!+
q`b5pNkZ3!#ZdZJ$Q96hrE5B9A`bJkq&60PD2FPbATqAUm,8S`V'Zb8*G%q`QA%L
Y*'1[N!"l(63Ge+JpMkSCcbIq*MJr5fD0`qKj-2Z*K,B,Nj8q!UE+`Q0m(b1E0k)
e5qIEckYS8d1Mp(RK2"#MN!#LV4XbDSe,$dQdcq82F1Qe)&rl60ZcQXiX1&(ZM(l
K#llQ%PQA2,`Dd&BXeIFYcE946p!$$Y2a1RKrQkGcN!$E"b#B(-IQS6#Tb)EPqKN
YQI%DV")4$RB`e#k*VJ6,Qe6IT899E(#5@[YGk`1@V+3+A`h[*4diMJeCA1j#YGb
V#(36$d[PpTAGrFfK$a-T*V,5FKNPVmNGIS'e$fIeVjT,Dq`i"8#B4$`d4DH5pKl
@@LU0De*)2hD8R@EIf9,8DGf'@E"Xr`!Q0c`Hm1UHdaR6UF@fm1D[8QpHqJ-!hAc
f!)rB0#0H6YmjQfd,26c%2N,FS'I6aC[X*PE1$-(&6Pe2qe+jC)BaE2$pl4kdrjh
i#GJNLBFKL@9*&MbZ"HfIU'LbjaaP'bQL-j8+'QGS0mf6deI9QEFda!3r)8P-"YI
5hdbFC`N(2X)f0%NS1))L5MjLX"B['jc'kPC'+&JVB#@-eMQRQ+J1q&pP&qEm,Ke
r&4#8pr0dK1l8`fYi+FrQUVHMLEjf@$-hPPerZD2FXP82PcJ4jmQ@CaaEGGGHrEG
cJZ6bQp*S2`V,(iINA`+1EQMq`bX&*ideIX3&33M5Z3`3'N,dES"@6JfTVkm5KQ2
09c-q`GJDRfk&99XTiIKDb!8$E)YJRY4m#Z'R`-FI[lS$[3e@fLAe`aZlPEKH8Ze
Cq9HFKN)DGkeV)F@Z*X5KhaLFIlR8McYc$Q)'rMT2,f3($c5kerFJjLMB%jEAP1S
6ei+j12eLhNPFC2Y*TP2c1B3SFZ'0K%ASZ`DZJmmK'V,1hYBTSkS(`XUj5HQB(m5
-lV&50!V#!5`q5ZYqc&0h0R!Nj6%CI,A#4qI%pfB(YmRLEZH'hJD626H3!+VMI9R
M(ik(akMajRfXGfA(%#qJT(diJSdK33Q&$#drQLGFB*14D"m*EZAJ1381Gc2P[0j
Q)`BMAVK[d!ETbH)J04#UGIIS!2F`emQPhZK2#"26mL4@$k5&EDE+@cd-DbP[(pH
e5*6GK$$[0bN6TX%GKIhl"%LfC`rDS@apbR6G6&6IB2`He'kC0AA5)-*+4J&(l$d
eYY"2[B[JrTlBVRb+[Br(D,YM#E-&GCFk)[,,i-e3&SN5UGX)UmDa1fiEG"2kL0S
%+mb#,QRc&"-C2ac`YbqPm%5&qe+"K1fepfde-XTm#,rbJp-&D2VLlr,$&Qj,*44
$S3qGQpSilS,"1XK`mCS!j(Q%m#$pe%)J@'"&F)NF-DN0'I#kHZPDEZ1a6!T4Nfl
GkMRST`0Re-H3!#G#V+TY2hVUG2f#6*CUUe4D$*F(TKc8f5aqbPlE&(2b$VA$4Cp
k!9-VK@fDQNjl)&0#-+CSK$$bBJhQ1NZD`%A3*mpK*BYD08+TE&"$r!!#84mELh@
b(Cl#4Xqj("MJa@!2!4pJ(B4q$X!KP"@Z3VDa+G`5[-rE@G%CY(#*$VV1i'5,C4I
0RZrYmcbBJ)JmC$-fr(A[MfDNINGmIA-!BqBNY*056Q%JbbGGCiAD@@YNI%Um#e4
Bjc&C8alH9VAK,dMlP``@K(T&$0BbN!"1ffYB,HiI%*!!#MCSM*PF3SXb"Rk&aq%
j%MY"Lj-533f"V!m'94TJ`,1k3`#Z(AEJ,5+4eZIdH9k&%`$`4bc1j!MDCIN48C2
MbcYGA0c%29#Y`DG8b%3%P[V1Vfi[iUNk&Yr&RSM6@))`Q9I`QKK-H*rdX-1UKC!
!(K(P![M@mbT@6iMd[a!T('GiC8-bZ&(*4q"bFpACITT33dV[298@"GJc"U[PlhU
e&FMme$d,C*YeFD8,AkAZqpCdhP1[H&kIi5[p01311,i)N!$,AkX1(5aH,38ci[T
m,!@'LCrM08@pa3)dq*UGAeSeVMJ-A(S413pGH'%Y[qVR@,iBNXhJ&DP4HU8kB`I
!cLjKmqrej3KT$k4Q@Fjd'6db(j&HH13QfI,A2ITDQMpp1f$d*QU!*3R'ESLIZI*
EEGS6M&lDX"%(3Y"D+H#2A!TX@[Q8#&jaC&ZS,BhA"&0'q85I"2bC0EcdCfd+mPD
kjYrjZ"@k"UUrEPc%#$Ydl@G5dpATFl1e$cjaRfXHVQ(VXr[N5*(J5CZCBY9,U$-
Pk-MdQZ"XKJ)`E()[M`'HH[eqYqXBlREFrE[NLqp)cRf6mblAX3LYQ[(96rPC22N
1hNNHZ'C'FbGTU1*a[N-cB2ZRXc3LUhX+*@f)1A38aiTP%@FABbV8dLZS`&Fk691
HS'98TSbkTJ5SfacUDlJbNqTH)lb[$*dr*)M`$@cTA(kbIDN(kQadk84(2953!0i
'#SCp0*b!J)C5lK61Vq9%"cX[K2G0$Y+[0P&MdDSUUGTC5KG#)#9L0S$ddp@SX[i
kS@A!QU5SNIN8am+Q8kUcAQiK65)$1p88(!!4bmh25LZVSAHjdAINVZ*YSY8(aXN
G!,)f-h,J+VJ9Lb3Qj#cq%YQCaJrkTNRB&b+,mkjP&5Pc-PKNHF&"96B`6L*lkSL
JL#1N(%q1d#T9bUA@5dkm@%(4hX50lhkjl5G$6E!03Lib#r4jF(V095Nbm`#IF3Y
eJDP,KMKSF5emaZlYPMc#*iq'a![81YQ+*'2r$Z8f!)aUFT1GZ%%JPELEJr4dp2+
X6dQiR'8C'V4qKp9KhcBDVLF@V4[rki8)-PU*("8$M$Tpem8LF!fSX4`%,cJ1ELD
&ZrG(IlVG3f#Si"c"fd9I+i+H8!E#fa-N8VIJa!Ah@IM0"Y%,IE1SMjTN511"4"h
$KRIh&cmME*!!6EKc0XDZ##i+2I8jVl)``HRd8925IIQX#+iBL#8,8i3dLF-[5aC
[AdDT8Y,L&%Q@jlZpYkNQHKT(#$ZA-NHi"aFpC5l#e,d@A6ESje!Q(T*Ta[5L2I2
5kq8l,Ha6Xpf5bXBS"YZr$81+B-XdNl'Z(Z9i%50mACiN8QVpXS-[ST0FF5-E2%q
"`hi3)Q'4k@e@PC-pHd'LppQ$*@[QT`'K5(bL-#!%AN(T'9Gh!i6&[(R)lapkPhJ
he0eQ9Ri+hiRQGAH#$S&a#C0)X$ecM,'`%q!(3QGTXF%Q*`aX##@k1"BQa21[fhk
SUL'j2j6dkk(T1,bF+BES3SF15XHBX@p1Q`aH4S%AjCVKDALlEm3J2M(+eFNc!"&
Hd,dP*@,19E%QV&3lqH)XqJS[6Z4UqPbKNNCiKCc"Rq0B%LHK2QY-#kb&GJC2&Zm
d#`!`m30[E#XNkG2c28D%8YpClDM,!ReB`Si[A)@'1Z['j*dY2(B!0T!!k#YR%fl
,RcTLP4ISRq-TDNBF3ASm8Q1Zb#!'QlrB`Ak`G(`V#[+eCb$0lLMlQbAYIJMh4+U
$B`@NDJ9m4MCS62ScmU@Ee$pD!H*ae4L"PV-Jh`+XH#,5SIVR4"%B&@2PAUZk15B
eQ828!VY8j+1U[I,LMDI4`T(+#iFa0EhdF!M'5#Sq@I(C!HC'ARF,qM%$,)2f'NI
ql"8[XL%A5c`HLq""42h$41Nr*kVEb3BH+)`mEaV382df-(bQPP8PJ+Y`1NBKqrq
@1a0Z#KQ&q(-'8,-rFDUYJ[fi+E8EUH!r3fJL-@5KaB2S$h*d1a9eea`Rq60lpqq
6b-pT`QX9fU1P$JJeq('6GYL$pcBPZdF2TmG@FDB)bqG)Jeb`c"ikQhiL*F2B(d'
KT!L2"#Q8$Td++64V3("CPdZ!Q5Q0q2mejYQlcDKPm!"#afeE(#N*T(IR[eVL@C+
TUK9MCGUBpf,5eiP6Y9`b`T!!`hJh0N3QUEUJ93XqVGV,3#iHNb[R[B0CRU46[b,
@hGl8dF(65%2K+9SmR[R@Gb6CBRaJaUPHR`H3!!2#9[E,0j@mZZPDSBL&C)dCYje
-*p$EiPFGV@"24Y`&1!%cCF$)J9*#pm3rK`Pj$8G1326'3@DY`Hk9G&NmGPk,8pB
mN!!DjRTcQ(Pp,HL*AhZe"R,H-3l0XPhc@J0rX6dGNH+FFl899ST0X[@l(39j[lQ
dkI4ZBlcbS+6!JRbVmF9fP"Ch&P"M@f84p)-CqLli!+aDh`hZ#EBJ+m(ASmR@f1[
`9%$MRKLI[658qhGA-CMERlM9S2NL8r2Z-A$-I[$hQR(V*k,[RFV4E1EhH$FlG0'
%[SQ[IF5GB)$M#lk,jU0)RFH6[kad"[YkRIbm0*e"lk"Z(0DP)BG#m0l+"0!'QqV
%ICb89,"K!Xd@d(**jC2B'2*T9a,S8HejY*aLPFS8Ghdf'bi3c'5`8Y)9H5LhF&1
V1ZTjj$i#+J0hEH-a`ZJ1@`bF&&04CA6ApbEm)hRcZ-&22E#rpLZ#hXHdJ#A[[N5
baX+$fE(&`lbq+i*,S`9%S8PUI0ST1[#B@6f00'XG3Rq3!,l9b1dL-G052@fFrVN
#F#0rQ8!9PbeR1B2P@'S0q,dTAE"j'93$d#N`Y&)dpI(eCC@VRc'afE#J(Dl#AcK
TI'KAh1EVmb209Z5"pqlfMm5JQ6T5Y`%H%VbAjFKQBTM'YKFD[6m@cHRefTd02ZG
3dJ5MD'V@1UYX,c#pa#q4)1IRC46XKQ[JpfQ2`VS[,LkFAeQ04QLp#ZF*SAV)`!@
NLCH4TLk(MGhfBS8TaZSI!iCR2SS8+IEX(ET)pi&3MCHHhH%[M%aCBN[)dSjPiAl
LbS#0cYaikU$,MH3iU[*#EFUV28P1X@Rf[,i@3!"G31eSUYV38i+`p`,Vpa`1j@Q
m1BCa1q)R1q2MmH&rh[%`MNiPM@r($DXk3Lee#b$cIM8"fS6Pf6*dcH[Kdd2e-Ac
dq5d[rNiRLMSPJm1j!#CXV%qb%843C&J$hVBL58idf5`)U*Vl*TeLbbBd[l&YAFR
-)fmCMB%5HK18jFj(93h"U*-@$H,p+VkZ%Sj*#INEPa'C,f4#r+0V6'rmI+T5U4X
Aj$Kdm+i@T2#)8(1VP2b-1#KPQUiZ(RDb5hjKl*!!)2$N`Q&+kR3)H'I%G!BN)#Z
N#mq!Z`ENjE%lJ2+8#BjCAD#H"TJ*"&hNQR0rh#llSC!!Y"$R`(6[f-KfIMJFI+@
KLP%(I&SL2Bpa*b-mMTS01X`Y4!QNd#eX4r1m1eJ3!Y+dPe!+&pCb2X5E-YKhX(2
NB()U(&NXhjAG[B%aq5*Cc0hU$S2-MF+j)dlrA&lYleQR6SACH#1A&RSp@(Y+!*+
aF"DCm[96hj%Z,dFml8D'S,5Q`k`hlTr,E3kll8U$6e4E(*@HeF8pUPZqAIYlIN2
Pf1h&TI*RaS3C8BLP(p6XBFcAYhKX0Q!QQAM8f`LPjPP*C3SFL&k@"FN"rh'Hld)
lUDK,1m+!(Tb"mGMEl+336qS&D4(M)-DZ,1!*NP$XRH%2fX3e%XppB+LQcr9MfqT
(&5#kaMRSSP1TK!Y1hXQPQ&G%p!dm!E"JLi6GX63$%e-+M%2hDaACf'fCI!3B4"q
!*%DdF[6Z`KU5Sr)XERSCHcje-hA6L&Jq$X!jVT,4`j&UA8-[T*@)pTJ#*k`FYI*
QQSrMe"LddlLc!%+pK'lJ%*ph(@dXaG!Dc'QYMq*5I2TqB`3TFKLpRf8eLdPZm-q
q14H1eS5cif$E-a"U!Gj0c,rl8[!li*B32I3el"&d6M[c,a(kGb22cep2MNNZh$@
QA,hcU09iF9SEkVa49$9fS9QClUTD2GkF["U8*-+mdXQcdAG&3bYTANX6`p#DE5c
8E,`(C,&j*6Er3*IVmPX0NL681QNrDUY+*501cqL+kMVqJ'(2Z'b00KpUq,['LJb
l1#4)CFFG4hfrlK6J+fPRrM*P!P$TQEF5i(06L5VABiCR$a'DL8-XQPkk#E6GV3f
21Qc-l#[C$AhkbVBc`FRTMDkPCc5DY((HDU8YAJNH4p-"-D3jb4HbLmZqBc8)!bG
[3kI3"AerD6Nic&4L9'Ep$'kd)8k%[!pV-AcC$rbBcN,66$2D[A`(a30U#A[5H9K
qYf9D+`QG5,C99mRe3Zi@&GFK3pZV0K#c%b4FXGdlmj,G@Ak!KVK[+PUUPM#9G96
8N!#@aPLN6"YL9J"[,qb6NZ*cm,5T8`U48)a2JHpP@lSBICTQTMNADQ#*Vc0jVJL
MPK3j5N8['JJ(IFkVbQ0X-i[#hjFj6MBMkl3mVIS#a8(Y,irl-5Ie6QIX30QNmJj
&-F$iMhGLr%MdqPEea1$&A#'[5`!01!D"#HI'&,amd5`N!K@3!"U%UR4fN4ZY)pM
ZT%h8%&Mj@&LI6dlceIY(aSR5Marj("[jhC4`mL)i`JfC01E`9Y1Qp8YRAXF6E$e
3CGHY2Apq(&f6#NAYdQJICidYG&Ei!+@3"!%!!%%!%,Id-J'hp$)"!!!KK`!!S(F
!!"Yb!"%9K`!1hC%!!$#,!*!%$`"0Eh*P4QPXCA-ZE@0`,RKYE!!!Fm&849K83eG
*43%!rj!%!*!+J!#3"d,"e)T#9+X$-1)'pP0RDk5a3Mcck#%,V--83D*%ba0fV")
!r6@XlQ#X*L'99p66M9@EYkLLEk@m&NhFr3L2L`3UHRPp*K[X'Z(`GhHSV(84MYl
+&Vd&,(c%M4iUq9I1drI#ahMT'k'iFQ2#*Nmm%mU%HVQ9"*(E+PQB@[Aa-ijURR5
DaN0ANDMq+ZG-VRN9E5"-IU9*`2T`eq,UVH3CUCI3([DiGUC$54P20qL6+VDZTHa
kbRfkACRL$&lq$(Y$,4rSBRj!2EGSCVAT2irdP![qlX!c#eVpVd5TQ*!!b-ZQ)M8
r$bmAjAYfYJ`'R@pGZ+dD1alV'5AJbXZ+3S"6rd$@EXibiMZhKX-YL`U`C+JC'85
-#-Id!G[b*MFZT13r%Q[PAGJ3RJYhj4!MpB$HNlP!S9Jri)-fNMLLE#+q-RiKGXH
h&$4h&c2*QrI-DSRq[r#Kk,dE4Z)8"NQjSjqIKqYXV@Lf8%%)89iLmp9fc&d[LX*
$@#2SeKj@hRKRhe)C)2alZ9CFf$-f9Fd'HPdc3Akem1k0R%m0YTZ*-$B1PaM1HVZ
TF1"mP"cf8Uh#)LVqF$P@$ed(5P9kV1Q1!HlAE4#',LD1"ITGL1rQD1Ba#39!#R3
4+$5Uqb5UD9h00[`K(T6Jqjk&QX386T9e(RB1GRr3GfSZaraSKTS`0TQXIB5mI#I
qTkFJDaY1d%hTC,-rqY6S-(V%4Ddc6Pi%LTm@$D[U,!rFb,S3YRiM1*3(q`@X!RZ
@delm54)P58q@58@%*LKr00m,D#`miAe-jBpLc[MaZNS1a5kc5bJil82`dMYphPH
FP(R!L",!NJ8*%`,9A&TbE''N+mM)fP(FU&AI3jf#iZAQ0%6k1EFRlbFkIIJ'K1l
hVFp5AY6L0-A10faN!2GaV)$P8[Aq46EdHa'V&N0fq`aNp-qNI2#6+(4B)4*-Y[i
-#&iKT@(AMX#%mkfDJUq+fcG!NaKlqr,[XT8"461K[UFU,Q##ICrYkmm55!)p'F[
`8"4U%B+K6$fp90@(ZldLV24XqJY$aiC@1JYhfPSf)$L(aABmpDmN8GXHidI21e"
-Pij(RDT"mVf@&dLMFD'S,PJIDd+f28!FRl``+-@G6VQh2j[DmI`HI+%@p0TdfEI
TKEIdQ0&3LMh`,aKp0b[lqhK0-4hC(CaM"aLX#Zj(i[aIJCRer9Zj-)II1EeY#b0
dV[TY5%Mh*+0dKJZ82I'rk6l[#Jc%h880``#4TBk%DEFR[2SmS5IITKjD)4cAQ8R
3SNpX5&m&)Z8MXB@Y-(%3T65#UCp@#`Q+5Y0'1B`Ia8[,T-!rJ%BU!f`l92XE@6V
Jq98YQ88hHJq3!(aamCH1V+kmSQHmr#Rp#E*Ip#AhES$aNP8-Qi8NQUBMUF5Ul"(
b[+5KZ&VS!P2h*emd""h46hQ#L"#i[A'ZqF4Hi9-BRq0Gq5YbZJ(ATH6"MZlTiXZ
YPA6&3B0AF4I3b&jh-JNVA'P4F'!$VRAK4pRSQ)&&h1*%-hCKjU9"j!V&BH2(5k(
0EE6HI2$AAUeT&92MC3j'Sd##lVpF08e@q)fM3CE`K3,@'*hL&DXQCfH5EJM%*jZ
Rm&J%9+riMT!!VQr`i4r5J-6P9qEKq%8IlUAEF@4I8,C3dQL1[D6+1Q@KNcaFiV#
Y2ife5F5MJLR(i4'BbU$(T6"ZF"9`SIV[Vp"4kGip-FAZIL35c+'a6&`ImDjqZ,V
QFaUX1b0i2A8-TqaH*Nc8P#`384Z3!!QA!E)U!3GS+QF#HdUj5CiPCpMk3@aBSj!
!lVUd+"aKQBQ$IP!*kkiT#L%lZ8"Kd4He(`2NUN-c-Pa)%i"Qbk4*e$8QmY-S)-X
2dqGUdRljim#6j30%2S4K4p12i)f+NK$ZaVKGQ#q'"SI1Xde(04jiFjC81q,k,,b
528l"cZf"e0(1"pEfe@3R2)PqHIc`+X`BAF'cl)BYcdP$U'FCC&`CGcId1"*X0b[
)#5U`Ak-pEe4HbhkJJN[d2K21k2!I("PcVl2NV[6aE&R%E0DBK*!!+`B6Gh)&0iG
iJ+J,TU`SaZLM@N&ZT+6YjB5rei,'BdNY"QeAa"+1JHH@0B"dT54B)&X*-9"aM8q
D-M$al5X8"#*@q,fpfEAQE2[$NmQfF#6%,6%I-rXB`-40aH8mSRa#Pi`5KpqZ2NT
[M#HV&`eIV2&rSM*4NrB*"d`eAQ,NlF8kIhLE$F6lPf+1HrIU+[U!QEI49kdX*jC
'66rHkf(IQH!CcS!)3@Gm*5Z"SMF$f%I%N!"#+`A"9Q'cJdhY$XHH9M&',paepjc
A!T@YlpX$q4bh,11LA$,,FMV,AcR`d-1mFdMMBPDVD!D5qakmVEYVphKMaPBrpM,
+FF4KRY`f9FVIYFj++X*9&Efi6CQ&a2XX+k*e,Eq*rRl+BiU+CC'dVX(5l"m0`P!
KUHF#Z)45N6rch6$**QpDSmUIlk[*A,U"%%2dqM""2dKPIEZ(cDAHDi1PA&(XE2p
a4Fa[*r'ceblYkYi'p!TC%%T)#aE5)d6qGjPF,&4JT6M#$pZ`IpVGXpKZ5N5U'eA
G5+(+@f,G9*hr'MXebZ)C`5!E2($a([,-K28`-VH$,Vh&SLXL4iJ%hk`Bm*-M6JN
k@cRCi@!U`G+3!,qETV6+aeiEXa8q-"'D,Jl%T%A-a*!!rd'fU"IHVL3&lA-8p!A
+QNRa1Zq"SjBm$$fLGjmNlSQpflTFk$ZMaRTm'dXFjYS*4@5d%#TGkm9(M9%+i8r
eM'N,8$qSJ4EFp4D#F`)4[SUbA)f"pSA[M0Q2(E(846&+UY6HkTYM*haA&bPV@N$
dLBJT+S2P&K$%f01I*$QmRl$&F0)U*d@kM6P5&qPZe[!VemqESrh8XQ6(Zk!iJUr
I`!lXL1#jFb@MbZh9TT[R(IafRTRT,0VZ5BHJVS*9ifVLA+!"Vf$A(AhlMjIHML!
CA2+LV,Di3(A&,X5HE0+R%3lmfTG#Q2I&e4%e5$Q&lCNI'd"DAhdNbBac8AGi0V!
S85ZLPCA`NMi!VCN1l%IKL-bYf@J2UT35D8'RCV(J6!@05DkG@J1b"iE2X@bZrl9
NdaaN"9[FVC`2q+2GJB%f3LDUV((e5NeIa"$*r03ea!)`[ZEA0ZHrhIN04DGmqX!
lMU&MRDNpIMT,qT(HSUKf(qbIDHF58f%Ed$df9q-5med8(Q*GRTR-3Zi*1mG*l8#
1X<4ihUKUpi`mkGV9AVIXG#*Bi1qhhLhRrBJ0I3eqDZJJTq9l)KU-LmF2r@K`E
DX*3lVq!(e18fk[K&VF5$5f)c'#4)$'Y*'-Ed[ZSY$BBk*AE&BARYX4b0-bk0BaN
fpX+Tl)bAJICTdA5)EQH-KC0R6Z*bmNi,"KL*&BUjZb@AE*IfN!#laNarRpR$Q*-
3!dMd"LYI,k14IlPpq3R!hCUj(ceQ58ab,5m5rXKX3a,%HB!UYp0aPaYHKMlZLiL
CB9"lN!!pGJ*hGVYMEp`2X-4$NN60QAR"#*kel6dJaX)Gd'8$KIH3!2!q6Me0Ca[
403kVbi@"[+i@mf,8CVE01i@DYK%HKDqr66*3TYI8h-Z%HIB&X@rhHpp&5N`b[ec
QAdPUY[QYT#PUZ9Ai)FpNiNbFYiE1(,dDaLXlk%dj3q8bh98Fi8VkQQqRq'U5cP"
eD`P%K#c8L!bFcpQ[a2T'KQrGN!!GFL!216pEcle4d*hqLel9)fK)@R3S@[`RYQ)
VNM+d-BjRPU4TR5P%11E6p!BH)80U5-)F,64bJ%A[m[ULp-@ITfKQXr453Y,BYGH
!E0[PLaYHGJBB!C)VKkQb$%S["4l,R**QN!!4F5qVkME5m$bY8)GHmKbccEE4PdK
[cLFdM@"LZX5L9l0p"DZ1j3KcZ*mYjB5K4caKS!JX[9),im$+"qTqe@0mN!$)eHh
P"V9L)R%PAGHi,N)q`ahQZ5jQCMbI#NBVh,a9&QZ&1[C%f"qHKX)Di"fV#$PHZAm
%G(VmF0RND),kB$HH(P!`EfqP)!SGcCD@jCXNqIZA0##1JbHQ,GV%"a$ER"%jlMJ
GRmmD+ii'A8Z!SX5fc,G*TT'D1(-dmGcJcP50-,H3!%2%LJQR$SeI,c(8cRBcFB0
6UALUZXLL9X'-e-(*lY#h@E(5[fJ-Be%qEBRlp($L)`B4FDIFCZB,NUmda99i,c,
$51X$AAM3ZefDE8ZQN!!Hb8ZGi)ABfpE$Bq!%3SEf&GeTk*CS0a@rHir,D6*&U6G
H$%*eXI!dlF+LKTk%*i+*4c22)'1@XXL[lTGAJ8m'[@aq`TA(ijNcA2S#+iA'1CF
pmUEp'4Hme@Ce'mXBdceQSLIHqpp-@SdfhlipaBXk'cL1PB4UiL)FG&NP&qHq1US
X"KZAYqhm9fLD8j!!YE@P#h@5$K`3+S)1RGbFdASP2P"L0FRep0TT'p1MC-BaTh0
QPVhIIlN'JH4cE6Xa`r`XCCaNbd*0iA6&AD0@25pmE,Zm,&H+8!%*V$NdI"*8Ri4
j9++$p&F)D["i6c25dZpGXA(S'M!R"&r+Y"[RaP82k&`6L0)hfI34`M5e)2R'!A%
F-X@FqrTUSE*RM%JdNBm8&LhpbG%b0G0aHY8jP0rIbYT"9HlXq#PIeipbX)khH1X
HVYlJXU["6ekj`1!5d3%r9SRYQd&YIZkVY`0IZ#V@K2PKH`BBE`'bKE(aTLk%JKI
i4fM*J#N8IQ(h@)Yp[h8ZVU0EkAX#SFab$1D,9"(NdfcKj0"(f6Jbb#J)39fC[Df
&*bjlQ""KeMEMbH+H5)0XU596U&AD%KC-MY"iIX+c#K9VPafLe3+e-X8&mGCIkB1
T@hF'+[193R@pJ"$dKm[MX28Nd9"C!#CEKdC2VDNRVVBqqk-S@m%@F0jHr"6*qHU
BNj,DMLSpJTADm`%%i8pZhX#H#""Il!8jDk0@N!#Yc$*a!ZU!Ec9C@lN!Alb!HR,
cH##@jM6GVQdDB[`+dD"H4,XLRQc31$`q1DEc%6KT*"ER3R'FQ6BhP*0fjGh1!%E
M*Af[5*4*UDS%J%q@bm@V$F%a5dV%[2[HNS1KkJBPfKVUG2i@f-(%"*%[*$i0lDm
&dj&GjG06eJ%&N!$RN[4'il(p0jZ**c"LCj39@d8HF6ELMYBh"1J6Fb5S5i`&@6#
[1j&b2FZ1C!L$')d0V4D1Y3VIMYq!miXZ`0Ci[0p!!c)LF!0l#3K)9[0+dXZi`4H
NJRdfTDF@r,UG9PIUJMM2Y89MdT3'AdcNN!$B*&rP+86!aNl-`)$!A,E)E&LpT1+
6'5k"RUa[&T+2S-RL8*,'%JAdad9&GSF[4Dfa&E-GXSXcb3c#&[T`EJLV24,MU2a
PrhXNGK'jhr08+"0FbfU9)XI(j1+i6XJCP18LfGqk1&Ca@0*4"Z!m5GhU68)PACR
UD+XB9Ik%L*4`-FclL-""A&*R3[dqB&iN#(C(3iblUjej"cX,)GP9Q5-96p9H0BR
23eSZm&V&bZXfZXp#R&4Bf`BrK4`T$D%h&a-+&f#idUZ+iN[6HR@)PD)Tk4mYdr0
Hp+,iB30Sdce1C*!!DC!!,Bi`$`E`XBmV9ENBNG4''N6cI(3Jb*E'f%8IeJLlMYI
IQ0epE6iS!faYh@a)fYh3NYrckZ1q#4'i9`RK"hpC'rcQCk9'Zd)SR#EI+8qRB5[
XbN9kNm3SN!$H'Y0Qm$FT%Vq,H!i8C@9eYTC$[@&4!"-8c-!Yd')223+$ceZ2390
[l8(bK!d!GmhB8"#Fe*Cip*bS4B,r&$S!eERaYCA[%@E6)LfPmbJ+DH-A11dJVd4
N2V(H%8Tl4q$)f9PFJYBCMXS0C'G@Lc%@5q'#'*6!$Kq*r5@5P"l6PIbBiqhB#MZ
4j-226*@k!8S`9a`-C("qX,C)R4,#QGI8+(YXhMTP$Q)qERUL,6Mf4E9S8efG)U1
4HGVKp$95dD,lbmIhlIf%[BEj-!krcUjTq2jNjE![$HS*A)$!r@4k8jaMQr)-!md
C(R4*C,'m,!!k(q"S@#*b85AA4M6"VUB-PbVm#jA6AQ2r`('D&,h0H!VQ+JBK'aX
8C0QkT,R)MTa"0LEp5K$2f(L8VAE*L"*YU)+@KqLMi)LdU4kb1D8DKdGR2-ihE#-
DYreHAAUH,R54HlQ[fFFNbpa2"JI`hANdrDl%JUHJ%&ZG4EZ)RpH6Gr1r5ZAJYj9
pYUJ5@#HfJ#d'Y@ZpeP,U(AS)TEecG6lcJL6%TVKI!V$*cjmMXi+S#C8-#VqN#(#
jaPbl'!lrZSm#ic+q%1Q@,48HYhFE-V!iKR#fkVT+HCfjSR*IbBhA(TpV)k50+Be
[KDC(R9pKYmbR*Q0M1HM)"0fbcb4XI(MBhj'6,EqZ$&c3!YMfclA$%`F(R"PCMId
$BM6bHXN+bdfd2b2hdQU21jj2f0MQT[+dp!)8r0iZZee38aNB1Q[UZ%9d!Xebc3$
YCZMLL*kl@JlQmAqIiR#!faQ`"`E$NFMl2qIJc"KT$qk-Z'+Dr@dPTY)cD[eY#m*
rB3[F-(@EDR!'lZrh8IFXXVU(ZP1MZCb4EFNRNH+`ffjp9$YQN!$0&kLIHfH*!48
H$TR`fULEAk5P4)-@hEl"e51,X'rGkpVUh(PfJ[%G%B[D`#&FfF9a`dSD2P3Y*b@
E2R*'6e$ZLh+fEQ-Qb*E[8VbH*c8!hF0#V(JbV+ii'jilcmcErY*1ELb!V`*`KBi
,V5`dmI9ME1BlhajTlNTp[UR`kjUKj9TPk3lqP3I[M%cBL`9&+AAPc&@aGdi&13H
l8%#Z$jGl4Gkp`pERGR%+lV"[[,r112S6DhTVlR$D24@T,8XD`i,hEja+h0TZ)25
[K1,`PE8h&L&cUUN[3JXAb1Cff8b*aX*Z`VUrf9$'qM'+cD*Qqd48@XTGMIHeC88
Z3M+MTVqYbU(q5*DXIG#`&XIEZ06iC,"CQ4)PrF8HkiL1HDNBkkeCC(`fD4AiH@f
H3qTUdBr9Ph2a1Cm%`5,1Vm2Zh@[E(RIG@i`mV)[2i8NLKN*(bMa$iSXC@S0pXLH
%$[rNr+(JN4E"RUdiNfeK6%b`KlI2YqbQP"0Zj,VPlV2XqEY#%p)DDV01q)r13l*
pLcGFDSZk,pAkINZlDiPRNM@6ERJ++@I!4+cIl$jr58X86*9Z1RNGV0lIq0dHXiY
8)EpTAMBD@&JjJ3d8#e6[3KB%$HrVk$9b+H@q#M-'K3rU+d9f8SHpCMFVjiYcPah
bJABU5VjhGp*ZR+jXG@6Uf8UVVR"IerB&k0Rmla[5Hfc8QDECbcbVckTYZDT4jBJ
DrY3$%@BA",Hp&Cr"Y(23"D#i"K!FBSQC8UUdC"E"9"E'$b"XH$dRKpXX&!Mdq"I
1I6D5i6+P'A@pIP)mBhLMZj@L-1KG0iYr[+CCYmA-BJPf2HTlL`S$$CeIJSbC#HU
Qq'bp+rR+dYB-mp8jZjpD2A+ULafUi9JeVVJHA)SEeDrK96bpN3,6*DSpb5&GAY0
5QBM@I-MrJ98TZF6'Me(69,,M'(8SAYTBfQec03-jAfG2rJlQq'(4A9*!4U*ff@F
VX8L(bmR8V'd6R4hFk,[+-0jQl@i-JBr-Dd9#CVCj83L2l33Ejbi1Z&UZYE2,K-p
j9A+'D`f8Acd'AchN36k)Z"4(,FMm&N@A*4De9dJ+fpef1e"aLG9i1FApp9$blPS
KrK)[rL+SB("@G(3IPGm$"j,c*Ue&GdR@3bQNE34cCBZjmN1+4+cFrXNRah@Uj,-
F`S$iP9,E0E`YNH4[Hle[bDF"dcl+-m51H(hZa8qipPM%-59NmT(ADK-LrHmeKZP
3RS5+)QNb$lejjHYX!fFjrh)#VY+KApJUB!Hj[!ARMkX9LQRpV%5(FFrKUk,M+ea
T0kA-U(CllMcVQP$KlYl-%+(JqJXAcB4512ri*&ZV#EAa3+EA%0aqQX[fVRTi3'V
P5U*SS"AkBAb2-1PRJXkFfk,R@0NI549(NeTpdB-Ek`CGa'`SkLJGiTYLG+LfZ-@
8dY@k4I3i+(k"a$(q"3,(Ed$arU,+dK8AB1*5I)YQ[0G8-VEJ5YaqIPe-cS9mX&Y
r"4'j#-CC+$(JlK1Z,I%+Cq`-HXIr,!h'NUJ4r2*dj[@VJTAep#%pm%qe-f&K3e[
)C0#5(jF,Q"i"UeL*G6L%kZd4X9`9qcmE5@FN,`EQfcXThXIAea"Z@)%@JT'50qA
&2fm`EBYpD8[rm0MDPYLh+"cRQKD@SkM[qELQViQmX`ah&bV'dGl#CB*Q+)k'mTa
``65c&jXI$$pTFC!!18Crq0(S$ik+U%m%D[#"'JY1Dbmf"V2%NDHF43RSkfPqma,
*'8ceR2(*6q!*4a`"8c%h[Yk)KIc,E(p[hlPHVPqU8"Z-!81(fk(XM'LpY!HmX6E
1YD3c8(`Zp5@&l('e8AHF-ieANapT0ph#UUAY&FL&@'RarINpi`cMQ`jq"%2TRPf
T$SebaR8%@'KERE,6@I,2h%p9qqU+3FCriRD+ZM0l#mG6R6TLJ%mc$l,Q%0lHCq,
215RJ*825'J[APBj+kP8)*#k4j[l+1GR,%TN3M-,'FNJd6L-qRKQ3!&hj'Kb,JmA
3YRJ03+L6fcY8!1MXA920T4BhV3CCA#4)29eiPlTaR3Ec&9m!(pGl0C+9h!mRri,
QS6&[EIP5`3fJ66r[4hI231m`TpMbLN+)S(M-"8D%c28-MSaKXE65,BdK$"$@Ec"
))+Sl#HL$QhIMKTIp#2!I%VL%m,mJkL@HZH9ZJR!eXZ'd9ASV!#k4r2@jL9E(N8T
T4JZK4XJ1UUrGhF!Eje8&THpb*jRDLN5XDB,rF&i+$Lb9(#352Z*`HGhle1lH4V+
S&amFiacFTe8I@qUBVI$-9$J&+TdPLpSkNFcq(mrUJb+VlDHDHU*Cd3r`lqYJP#[
jTc@G06$IcbG*'@*$&-$H))fD[-QZ#djil$mZaTjiSIPQaN(cYfY4Q%"h1E4*)S$
UGGj%5*qfXC0&3JYFFQQFZ*!!h"+%JNVN''!9emYc*56RL`m`T1GmIUfd8I%dNr(
9qMT+6K*Z@m0Aj"1(Mb"E85L[Br+%1LB!lmh0VZM+3p2QH*J'dM)KXY6mek[HL4"
k0NaVm92&Lm'6GYhBF#XJVQ+1`j8A!2jB!(!2[X-6P*p2fmS!')41[5*E#1*i&D#
p!C+rf-PN)4QHA)kD9Be+PQ-a&[6GlGDK!4rEqUQ&5N4X3+rZ#&Q93i9ShpbKF'B
5bVh-#FJmRj-PjU[P&pLS"(`NkDd,fZq9p&PKQ6(@)fdfe!GflTjQ[Sdp&-rbl[I
H23LkBE[NRm!-(aI6kl`q+jT`Zj`NX!pKCB9eVrIf4RD3!#'2JC3"0[ZrV!4U$Qf
mNmUd!+YF$TF[Df$aqd&aN!#,4KI"BXC@MTIq'U'2K@V+qLRTCcE-VeY@eJ!NHUM
kEpV0BNhA8*Apa*TA$RVe5mZGDQIf*3(m)BCrcZ60EjSd4*-Ni(`TI2HFQ*(rHqj
IEa#Fi`UG'PkkQ%3Li@h4pmE*DdE(HkJV&X9G)eY8Up6(8G%X3Ga@FqA8!$XDPcr
!$9H"I5P664B8KZSR9$C0ST&-4N22`maBRaIDL-qGJ[-5FeV*)!Fk2C+,F2fqMQb
fm0TFNNf4GqI89KKM`f*I!!Sbj4$$d,h8Qm&M[dbUFIcT"X5R%S*bP`"c66D)GpF
(&`KhP(")e1f(F$i)T01&&$Ai5i+!0PA0hEb,cCC%ST(B',mqmM1PJVYdVM,Gh0D
+fRYjI(6QDqZ1rhpRf5fmTlY(irjUQ,lbQHC!2XH1mCMHrlj4EmXMSZRP0T8`pbJ
B`lDV&)3BVC`f`dE`FXUd)Fqi2#5Hda2QI&F5fY0qAl)m3!bBcH$J,`'c6aITJIj
*6Y&!ND8IlrKRX3NN#U1D5CTG![ej2RGNBZi1`(h28!ZaR+MqL-DYE8ZN9'jl#-2
Gr)GVG,44CRG8j91$5U6J2&Hk25cZE'a2Y'(aSakFLRjF%%i5MZ`MVQ(&e,f3!0V
c3qN@5+hMQIQUA6Pm!F4f*&'bU'DMmEEAZQqiNjk[A*C!KmhS"r0MP!Yjb)e#JK2
CrlBkA4VlB42&9Bk-T,5&V5FNJDb@05cV'b)6HD"jB$*De!kYbPLlEJrB-*E#"k*
iNRpU"BqS*fQ0hXbX$0[)Ab"NC0kBB`94)2kCQZXBLR&Ze0dJ5Rj"[TVS2fqej,b
'SA2IcRGpEl'Xd4&Ll&ibi)'$qqXFIP'EQGNGV8!X$fi8YmS#1MZp0,"RNU3P0!(
60[dX%L@5bDaI'Jmbi9X%!j(+c-KAAH`E5U(,qL'0Naj0JaNIdpEfBbLY"GCdMTJ
(R*0'4fE9D"$L$LrICb#(KVdhJ-N$be[EL#J)0cPr80)a2k0r5PMfF0ahY5&1[0J
8GqK9`K@C06YG8l@cM,#$)K-0'mqifT'2fPd(ekhTf8riZ2Y%V6Lilah&i-2c&$c
GB+I,Ipq`HTZk1hfLrjdbUdVaa"3[`j0hiV'fhfD9Dd4e[#%V@fe,%9aGKZp9R9K
TAlSSc1G5#!GRK"rQ#408d",5N!"i"G5L$mmr2QK`cAaeD-1ZN8d1liPcqe-U'"`
NiVM(YE22KLKMK$9mY+K-U3GMI(UlQCqUF%N-!!"%h'+Kd*0H1F5l00@kamRJ#H'
#%q*PZ8m5QG@I'88aL,YBh88`c[p1Jc@9bMl2936Ja1+cp!*"e0K)JpKQh8cLK[3
[Z-%J*HM1mp(46IddhY'kL@2c+f[PCZ6&28fl*k9J"q@8qap!8Zci'&RIIbB#SN-
-"V!Vi3MNY$),%,X(cV`(r"2)V'JDA"[iJ0-M26P`Tc&h$rblKZ1Z!3AXGmi"Sr4
9(,"#rUpF2f)I#rkHRG$c4IKm%!l4lX`C'1r(G)0*8,!IhY`NYq)MQ64EH9N#-Tr
IqEBf(@RFDF-Z*39JBB4qk*P6(EZ86Gm92[XXCq00HN4mYTU6[*qH6TQCD&K(@*B
ZGc2B$a1-2d&9ZTLQmr9I[iN[MKUN3mEcr8&QkRSRc1r!"$E9GHjTL%aCj,!0AYN
Z2BfN@U3$j""&cY(R[Y"%cRak!$QjY&',5cm9c"-b5imHVJ3BC#2")hmajCq[5-d
GQ6dk$0ZAipZJFDIGfh,%45M2E)i*8YV`l,j%hT85e3Q'H'V8qBV&b8&HN8G6q0R
mRU56D'G#-r!'ffKAR$0bE*F8QHDH81b,NRaN)AFMd)`K!A*I)kl%i`QZ3@QMSPU
&p4VfU)#I!Aj%2SQJYKi*R1&#dS*rII6Tp@1bD-C9hXIkK3amF$J0B[)0jRTjm-$
(C[4@B![ae)NAP4TmbdMbqc$F5#$RbNV"i+)H58FS,I2CTYG#fMUe&"X*[UkM!S3
eUG2BbD4-iperD2`qT5j81TdA%ceY),G3YpXMDGQZLZ$9$)U-QD,UX@q0*Q38bKQ
8E&KEB-h"*N-e,SY9%jk$"EN$,j[FlMcNP6j@bfGCm*3lDQRI,d(P0-4iSMUGk$,
PV3bXIG3D9ILU@`4JS"SaTZPlikj)BpEJl2GKM'l&jTq-Mq%"#dGhlpkY&*q'@Q`
3lQ6qH"j3`bqN%R*mC%UVY4[HfQB"LEGLlGK2HM@&lV,[*$FFNY0hcD0*A%A+MQQ
SLj[M%5*6dQ,S[$E%-0[!J5E2l*A$DbXC0mp-[[9kU(#i-6#ec5Z#!a0%Z5eASb%
j+JLCFh"Z(,QeTKfLq(S!bKGh%h!02lHj2I'QSaSaSB'f#*!!"UYYI#iEb)ReMXG
p)hQ9#p%C#-"bqilR'@*1rA"#qGrZ(Q2Fl"E1+cDCX1k$6'IGpU#5,&`0S2T-!*j
T1Ki9aklE1BYeU8iKKNFmG*c,6adJXphmm5!HMSZ[(+JCNFXKjbiEI@LpRHHZ5fi
+[rZZZe@AGQ5-jLINb&DD&N6`U[ADEAqC[4``$'fX)jeNjT`aN`rVSPbdA#L))Jl
[lR+#)q,EJZ5Pa9Xr6LpG+(6V()qV*@6E%6PZb2CG!("C(+UqURa*AlBPJ!P"$0b
DA)p'$UYVdZ%,`P$GX0PD4MbP#[VXVC@eR8**2@BYaTA3"V9dYfPDFmSP#TZ62PI
*ha6K3Q,9blEPR4`BQ3hidLE3)@Mpc@h4-mRk)l%56hQ4plJceDDMA4#'5NK[ZZ@
fYmGNh[p3@"l89J5BV1+Fq2*%`"*efCA"f9Z8J1,pDV&#Y4h(fr-8Km0KYM![p",
Z#Fq-2)L3!,U(J!&Z$a'!mq)`(ce6H%[p,q8rdNT),%Yk4[8pTQm)V$lZlPKRG##
e!Mfrk#4FC#J1Be0jUJA+6%pR!(jIC,@+9k*S1JFfE2JhU!,dHlX(FHF0$`6cH04
BlHTA&m%GLZi32Rid42dGT+6K-N(%GMADcHh$Y+UE8T3UaTQcYXk*c0441m1#dUa
8rFb'RGH!jLDT2$-k&CKFeFfY-"%Sa5D18@[fAT2%DB45Lq(U4C1LMVEBb4Y"4Ff
4BGRZAX3#mZV9LfYcVkl*59kNE'U,AQL&cRS'C6U'YIapBj,(hG-#9%SSNQI)V!R
dpPXd6NZP*r*dZ"'c1Nqej"X61!"!A&C[`JV$%b3R#B1$J6ZBYMS'PE9LA[GS#CD
G!M-0%h2l@VSGId[T"$Acam3jp!6F2*V`'0$DDkQ)3N*,@DSJr*2,#ikI*-$EfLJ
1"P9!(!+,bAmCLmP)iF4ppAk*llUPQ3aL%c50T5"6rZ8j(D90[`+#iZq*RDk`"P"
T5S(4lk&mS@D3!1a5l"(QTFJB-#*L(*aISmRmF&Q#KcfUK6qU2miqF4Kj6B,8S,d
F-e#!E0"SGi,q9rlpaAJ4Lm`Y'dNU'q*J6LGKlQ"U$8LVf)N[[VI-"QNJXQh*1j)
jRk*rrd`dc,HCjiSPl)C3,aIGR4"&X$h5!SR-QjHZDP"b499T+V,@rINr1KaFC)Z
,j#MmDZlbCAY33-SKm-'CICN),A4)LP+4H4L!,PL00JB"&(6%)Ee$+-`1Urldi`2
!UH0FbX5)8Gc#)XY"Hqa9La1MKfVp"X%(3hpi-d&`T6iCMZX5Re@Sf-JSlI9'dJ(
hJ2b1-DCJc*Q&(dcDmPGrH(*"pmQ*M3heT')C!Z2(6(3Qdd49913eJ&,alYm%Bch
,Ym%lM'p9HilpmE",*Z'1h2GLlMU"T0T93D9`b4qHH-E#+@E&2dp%&L(ZI`mNaE&
ZG5N&J5YlZ[M3k&,k[bGeKh))lMXDb[%EMecfeeK!"i*B!&(1%'A8H8[&Ma`8LK6
GTAp0&3*,*Pqm5LBQ-P0S8k*iH`6+r4qicdI29'0l8Mac'*2dmfYFkmEL![jNRE@
XJGLR(fT*+09Sr,LlXI`[MZR0qi19lkZe4-iP021h&aXbiDLHJ5idERY!FEb!RIE
p6@%TU0GSV1Q$,Lb*FE'd[`Jl8!IRcX-Aia6Iq90Y+fZ"KUaITLaDN!!Q5XP!jcl
%b[00'ePJUcK0ml2aVH2Z*Np@bb4kZaP4DB+)U$clNl$Q-Q9!K-H!9Ea)3hPNEmL
)p`rIfpUF4fT#SVah&CG9MFPcrG[Nm@2ZLhjKSd$!-f+Q(,#(,bb!60[P+*ZrKDi
)rq2$!I$qLLJla-c)-CAJ3H(i*Qm)qER!J46LR5FfS+%BaCQj,f+KZCRKP,db[k!
@$iA*Zdph+pp!ZSm!ph0qJVeb31%5VpV3$5fimp@VCrXb9Uj@S3'T5BjmXcDhAi&
&i''ekY2#``DYYVX@pTMhY"&bjI)M*LJK*DaBQr#j3'eZcGA9K&r503`[LqVDe-P
$UDXIDPAmF!Jlrl''LNfG"1I!&`#("@+V)NPl&K`l5B$8lGXrec0"KjbQ$!56J0!
([F9)GfSJ,)l1-3qP$AhJ(kflNJRALVZELQZ)#*G6iSNRcK@QmA@UF*LkRdUG-kP
TlX5lMMEb'rlDXRbILB&G8IMlN!#DbCA$fJrJqXS!$!S#r)N)PGVCXF8E(-p`$FA
50pb2d!RT@fFr+Yrj5f`06&TbB%Ebk)(krh$P)kBDJNiqrhYF4M18A+KN3#85f%S
lDplX,Rp#36Z5$M%,S$!#QUe3)k$T+p'[A,@#p#(cZdBce[#UZe289S-[&J*L22C
fbX!#TU(BN86ki!Lj4"+b)NAA$I@JC1AP0)hB"L3E%VD'TN#J*J[0jFNPbFMAR@1
@%lMm*r$qZ!Rk6Bq#J,HP'e+cf8mRhPrKhIiq,c`'qH9AR9Z'EVH15('(JKf%M34
LH5p!I%mQX*LD#L04S'`+P60L+b3e$0XiEVYX*AjQ-Tj,G(CVUV8+irj8[N-$Aa&
#UMdX66CAG33SSMSRr)VB0VI,@N,C2YZ$ac6CleBp@UI$L)Y3@C0RdePFf"$#i!f
rpK!h5%CQ$jQEPEQM,cF4)pkCeBa"&%,SR3%6[I(6fMZUpKS,DajGI32VU-"$Npm
r@J-bHmiE6c)b*,XmY!94r)X$i[#m-+$JA`DAr(&(SQSQqqI!3CL6i0B(fS8jB2+
,1YjAqD)8XrhYf1%FCrBj9Q4-Jp'023[(N!$84UIIDk&3p%qJ*Aa5U,D5mL0iP2Q
NUm*%pX`X1f8Ri`$"*r!h'8004@5i3E*AY$DJTcI!$VGm9ldI(68j08RUqi3+Db8
Gf6(fF*!!jD1(a`c-F#HVQH5f2jTR41Xh@b%19fCBk#0,9khCDhRNHZdm(-mHCfd
64Y6ET+9,R@r,&a6b3D!9&P'%pj95D3F-i*S,aaK`N!$Qa0(JXEp,"Tb3!*FldmM
H'I"4bK-A2j,9cmMXT('FbX3DR4dTQM-6IIrhViA1#6Df"D[)ZLmA%1D+d*+HLX*
FRhG-2i*$G6hLViHLcG08-bN@XBFQZ$UB,XZ*MML$PA1r,q!b%c$dRY3f3XrjpZ6
'ICrr!%JJhN1N-[hAj+"Ya8D)#rr#*+HLf-N6Q%6Y3YSkMIacEqRjmdHrhjII)i%
`PhRiK5+VC%Ed4rD@Z&6FZkbkZ5rD#Xl5h#)Z!5hl,bK$hl4jjMcd!!Z4m@j&EpG
04e5A[MM6#M%2PD#`"R8aj4`%L5XG[T(fpG48*1,T!`eK&cDT6DhK9KX5D'@2lEF
JS[GG3CPbr9T'Xq6h@$phT9DZdE9dLJdFhMFQ)a(M'+Mp*NN%K8aRRG[("[fcU#e
rZZK31A[rT!I*Y9KBV5C!*q3cFH-kmIAFCbTf5JC1FMmep2k%,bP+-Sjf%9Z5%!H
UE5"I[XSQAL5r-aFEjrJkV[Iq"-2$Fe(!21!Pd,cccP&-YHKBERU8D&%KHLT5U8@
*Mk#(MT!!IJXjLb-qq`(@Z6V+4+jclXj+8MJ@",-+e)(bRY05M@aHI*-3*#F#-'H
4fBhj$k*[aGAfB9ikQNp%bLP40'Ai+)NY*p-EEZ6Vj$Q@BGD,Yp'j8LIVAqPX5G0
rQZ6c[r'GbFNmRr&D)pESISJlBf)RP&KH-mX-FVP%[!FeYR!G6IVbEH)+-qV&d"V
cT2U'"SFhU3'Q@CYj,-&lpdpQE-DU0q[f@p*M'i'c6h6G@TEr3ZG``H@UPC&k!`M
apC-$5*Z,baKD"RX&rM0j2)Xa!8X)0QX*lb,ikMIJ&+ES9CSVam`+%!ERX'3@f,!
c+`-JY@l4fp[rI8k4523XEMA1p6H24)DlrE6b$+hBTAlR4##kFAi,PkE6bl$"*Sf
)kH0P3XL+Xb$U4DK2RmT'VHi[QGa'-SY4Ye$')EVjeNU-(6NGrc`Jk+`'$kESdkr
CR9Cb0q&AYfa)K6dL9B,(,re)d%@`FHKeB+9-*DaJJf#T#[Af$ZZ`2IX0UF!-YVc
-BUmNYEj6Pb-[e`dr!Im&i,I)1eD4qiATU@2`ICLrpKPl@P!f3p$q#a5)f*alCYL
D)[BZeerH#LXL&M'@'jT'62-,A,U$aJ$0+E#&jC92rr"@0b8#5S5$-GQ%qV-`SVZ
'`H+)hVR1@)%ma8EHHeTIi9!PA2jSP""JHF!cL9DAdR'8&'fkX4cC2SB,Y3HkABL
aaICVdG4)R6Sd53#Y+(5!R('hZ0-*K492)kh*SUYlRlBD"'-bE%GR5IE%81Bc8'N
Y!%j5r4`kU$5*S1VHheR8H%h4Ib&P6BFrbDllT`pR0Ucr%UFTqjE'd@Jic'c5XrJ
1$NXK40ZlY@9f#FVYr!pCN!!p3`VMpk&U40'Kc#f#,M+X[G6$H9[fZ+4F'ZJf-5@
J,NM69Q[r2fQiJ+2rMj)$8@VV*+l#Z%D%fq[bKAk#CU4A38jTUc(iam"LG)lI3eY
f(0BQJPIFE$PQM@mRU#T,6icdi8%)Y[#+!1Lhka`2[kG&frX'-pkhep#fl+6m%H4
`2@Q+c"#1hHq1A1RXQSa2Kh@S%L%[&F,UeMLbqEqS'$Elq2BQVKA-`UJb9MQ&q`Y
X"46V8ej+T8RaE)QRJ+V5UMTKdY$&f"(0PrmCQdpU3ESl&DGVih3`,SD5[`5ZB2C
Bkj+b-`bpK2PAUpkKiBJ#Rcj)eKl*VrdLR$PmC6+(CCXM"Vd0B(a+B"P!9D(K+1Q
3!0SkR02443abmlPb#"&KQBTF1fGa4[b2P"d[qGCHYYqe%'0fd2I&LC8+!ceqVb9
G[d(*!!FSpDH$2T5['[)kF,MM9J#T)ReY1[Z'J5r0bX,+F2&'HGa3hbV`NE&lpRp
FlJEHI-ST%M"@+Zp@,dHqVjNBd&@$NmTILH(A`SrFBb*lP"98Q@R#Q1kbR`*C'K9
,Fqj%GHk1cN!GHU"-)-%(GmcdIEFZrlV,EbV#[k'5("Zp%I2brF1k5-)ld'4L0[$
BqP$bN!$!0%BXc#(E*Q,"dJ@eP`BJ%C5FiamhcG((@D@NJNkGhiHmhDcTPCf`EHK
3+p@aPJ#PN!3"!!!q!!#f'm*aYddBP3!!EiF!!+*X!!!EFJ!1AYX!N!j0Eh*P4QP
XCA-ZFR0bB`!"MfT58e*$4'peC`%!rj!%!*!+J!#3#3(&!!!"K3#3"!m!3X(9"a1
Qk3SH50!Dl6Fh-eaGHm)[iNNEG@(9iqKK&L)q%TMLMN(@5l"3DMXX%)p4Z@&lP5T
0"%GPHIPGapVfjA@1hQ*pckl-*jI0kbj9jClQ026FX!5lN!#&[p#"TTNKLG#%U8d
YfCb(3%d4IfA%QkcL@`JeL3R@rI0*RH)BhS(9LZDhT`9#G@21Q!)Gad[h0`PT9FS
PFJ,DdTF8FR*3NFD)3M(Vrr#)M5mF,T%X%15Gl2C1Y3Ar`$PcVIpfS#$hCae$JrC
&(r"91fhPJLp'!l@a-NU(*`"lerLfE4Ri-q!q4BS`'"0,'pRK'UjBid0BLRe'p[D
)6I,8iMJY,+elXfk')2+KEYM*&'C)SNVA$V"Bq8UPHCXNamN0HV@Ql40Id3H##rY
Z*TaE&48mc,+X(U,lCjLVj+E19H98J)-lVhc,pd[NFSYA9HEraS"f2AfB"T)V8[-
i)k1QkP'+i*ZiKe#1e9mmiFXN[)Sm5)mA[BMcm%id&9I(@bY$B[DbL9(6mD2G835
`TC!%!3!!4`!3Y@5-lVG0&rN!!+"h!!#N&3!!'h)!&d'5!*!$N!!!N!0f!*!%$`"
0Eh*P4QPXCA0$BA*LEfj3FQ9QDAJZD!!"2@P849K83eG*43%!rj!%!*!+J!#3#3'
D!*!$ZJ#3"!m!3X(9&4RFHhj"k`rXApbELa5Uj`ETN!#P)N0,rB8@"4#6TMX2Y%0
eG"pjZ2PL-SPA4pk0Vpr+a*CaGf[13`lk,!YcFe%QDI'&hN$*[ZVK#+XN-2IJ9eJ
lPhBDY%chclr+[3`cVEXYNH0+CATbmbf&S5KbTZI%4C!!5iSFNYraI1qQSTUlM"4
S!EPQ`8f+KU1m+E"6XeNifG$"Qm(*YePq+Qr`F"1c%Z-IYZ9-V!LUIAl0r#8eDaS
1kpQh`X"#`G5CE+iejM'$M&1[4Fe"pDkA4Ckd`LCYLFJ,KI2aLT8j2Q`4NrT""AI
b')I,Q2$lLaHK3[@,Pb2EGBH"2A@[QB98)qFMD4&LKl3Arpk9d6FS*`P*cHemm(I
,p8pb*U5#FlC8-L%LlLpB--q#iphl1!-*6K4JTC!%!3!!-!"!!*!+SQ`!N!BEFJ!
!lP(rN!3!N!UPN!3"!!""!%#f)!%SZ#2HeJ!!'h)!!+l3!*!$d`!4Z"`!!+5U!!!
56`!!#LB!"e*eER4TE@8J6'PLFQ&bD@9c!!$YfJ#i!%`"Q`(a!F$rN!3$([rirr$
,4!!!J!#3"k@3"!%!!%B!!,IcZDUhmlQU!!#N43!!TJJ!!+4&!"ESC3#3$Ne[FQ9
'D@aPFd0A,N0KFQ*[ELj%6%`!!DL3!(0SE')rN!5"!2q3"!#3#S!!N!N#K`#3!qB
!N!32!%,"e-LrjBqL#YE@Z-$C0!X#&#Gp,,aSUmFfAbNjjIGMF6@AfTm(J"iQFC-
Qq('2Y%L4k)EbhSdHh*!!P-&6mi[mMHM5U"b+5J8e[F`D6)%PrEBCGkM`)mA+VLa
,&k$YS1r0mi4YBq+`Kd)+6%""*,UC,efC,3),PpfPicFR!Dl)lUh*bCC*3[)mZ"i
JrXFD,NkR&dqZREkNJ0QCf9q638lV)JX8H$J`$[AMD4pB'f$e3H*4eplUd`0Zbqq
9dATBT)B!$L$G)Q&4@15K1,#V(Mhicd6TP#qU4P')RRBBHPSDa-25ZBCIm+@3"!%
!!%B!!,IcZDUhmlQU!!#NUJ!!TfB!!+4&!"E!P`#3$Ne[FQ9'D@aPFd0A,N0'66B
iDbj%6%`!!DL3!(0SE')rN!5"!2q3"!#3#S!!N!N#K`#3!qB!N!32!%,"e-LrjBq
L#YE@Z-$C0!X#&#Gp,,aSUmFfAbNjjIGMF6@AfTm(J"iQFC-Qq('2Y%@B6#k(&`-
(!!dFjUPJYf[dR8BI[Drka*lR,6X"6E%ERS%3q,Q3!+mZ+ii%3#b`X02C&r,IS%&
[p@pB#rqbh3Kk3rq5NF')hX-(#N1kFjb)KBqPhrjVAZ$J)LCRp'B&3,ma)Q34BY0
q$a8PiaJP[1fJ%,!mbMq%N3(rSeTk&2a!BLe*8f#[cclGXj!!Vh@9@U9,jN+6KU$
FS5CN-Hf59V$kE6E(56H"8UcTV-VXdMc$Vj4aGrVTZS#PN!3"!!"$!!#hmlQUYr1
jUJ!!TJJ!!+Lp!!#N43!6@h`!N!j0Eh*P4QPXCA0$9bj38%-Z4%a-!!%Fch0SE')
rN!5"!2q3"!#3#S!!N!N#J!#3!q)!N!32!%,"e-LrjBl84CE@Z-#Hc&-#&#Gp!Y0
SXfplAbNjjIGMF6@AfTm(J"iQFC-Qq('2Y%A"XE9d5&%!lk@L@M)Zf*M"%[RL0ec
R3rj,B(lKTMH*hjq&-GUb(`hGkL"dj`*M%XdNkk(2fIe%H),a-[i#)RA*C,BkQD,
AUl62G`J`P@4a0G)fX(S*V3X'IKc!qYR5k&aRj*)8,I9DE4lFU`C5'lABf+6mC@I
R#PI,P#e)YP11(&*MRq((H[X!'ZZ''M4bTdRMR*36d')M!Bridm%Mmr"G[220#DH
BHSG&E&E-D40[YF#PN!3"!!"!!!#hp$'$Yr3aJ`!!TfB!!+Sc!!#N43!31G3!N!j
08d`J3bj$4Ndf1%XZ4%a-!!'5e(0SE'*MCQeRJ3$rN!3!N!U!!*!%"8Kp!!!#V3!
!!33!N!32!%,"e-LrjC2Z&PX(i`b,J"3hd&qQJ[d-FT,Dkq+,q"GJ[TpJ`fHQ1UZ
Qfe9[0!0!6ZmmG4aBjhlbN!"P415aUR'1bdHSQiLkm2R`4`[2NfRcMJK41+42)qp
8BiJB2!,pBK*%I'l3B66LHIVRZ3dk)Y)EQmKXE)piU(mq+-m5AD5!cDAki@"fa`k
2GPPkZSjii3NSaXfbpI!B,K!,fK&%S",(f#SmKcLX+Pb)MA8963iS4iXa@SDrS&9
`R!LY5H&-jE8TVdIlP'Rh(Nh$BjQ*89QN$Rk!1"m859Krf%jed29A1T&6"8YrL"E
kcHqI1Tr0L`Kd5V*&H30q24+CacJR@G-"6X&a3+@3"!%!!%B!!,Id-B1hp$'$!!#
S[3!!Ul%!!+4&!"DZj!#3$Ne66#"09e*eER4TE@9-D@*$4Ndf1%X!!D+fFfKXBQ0
QE@H"!2q3"!#3#S!!N!3&5(d!!!+j!!!""J#3"!m!3X(8b,rPP)KU5`ILhbhBSfq
APIVQ*-$c$`V(JS[i&f#qST%@q[R,PG0YUVHB'3+GhRD,Y'RG%H6G5hPX@)Ld-hT
$"4(V4PQC"hR$A+N,lr2VHFP5M$-JND2ajL#B"f0D)&HNZeiGBHml5lC5ePF5T,i
T#hH&SJM&**fTH*lr!'@D"Ndj`AU%!%SJd*IQLT6,jYL5a!2mSf&TKkK1X,)KTVa
rVe@&ab)SV'Bj4B[$T%2BBaF@L3m9#+Z#2'9"SQJbFh(+1#HTK8IqL4X''GjdqUJ
+8%*T4L'CFG@j4#6bD,BUPpr1RjH**`'VLGDa92e21dVjX0'bKAIBNc*rm)%h'&B
KXHBB!+@3"!%!!%)!!,Id-B1hp$'$!!#U-`!!V5S!!+4&!",)Y!#3$NeAAde66#j
$BA*LEfiZ8fKXBJ!"`UpcD'aLBfCYCi%!rj!%!*!+J!#3"!9)I3!!!V%!!!%&!*!
%$`"#`G6)[q@8)BHV"mQ%fP`MQbGC02lS#EAGG#JG3HVYJM(4)64B6M#"jCB'H55
$)bqEiRr1%AZ516@9H*P86A8*kMIZaPJGF5TLJm)KdqcAK49i!1AQVEd$%&G*MNR
fZ#Q&cbH`eRKrrQN''HdN"MDHXkdfBT`qAmYTF&Daq)XVilrA3Vkm-e8[XIYP-dA
PNF)IpIU8hAC[ia09*!lf1[paq&RC+A*qj0K1dda2ai"F+i%eb9h26"Mei9SQM1$
S+alH*Y#15V%#ZV0)jASl33@r!c&ZJP$bQ!N-q`NSI2PhEelbQj!!2kde2l*LIah
2"jM'FDkcc8qZXkfBm$$c!Ara)V9"X@8!TC!%!3!!2`!!Yr3aJlId-B-!!+Za!!#
ZS!!!T%8!$e4$!*!169GI690-,P"33bj6D'aL!!%QhR0SE'*MCQeRJ3$rN!3!N!U
!!*!%"8Kp!!!#UJ!!!38!N!32!%,"e-LrjC1kT3X(j`@J,T0[Pj@@KZH$aKeBIA!
ATHb'B@f95#&-cb)"5`VeSQrr4B#`JcH5mNJA#jp%FQJB3U*eQ'jH@Yj@)D1UllP
*2R6+HE$@IGhX&Bb`%+5-%pMY0!peiF$ACKr6J&58a*GXbqlQKc!&d&1,Z%im4T%
J9Qia'6+IJXXUSX3Aj$"8@&Gj5dR3'I@l(JYiK8jq&b*E*+bK5iDT4YqB@UpBKN4
JJbJ)3*1dXb"[p'G'i2Q"hIM8AD5`4LZYMc8,$hQP)1Gc`#4KK,Mr0U*U05E5$3m
4Uc&bc)"aS92N5q36FTlL(Pl'8`%AH[9!N!#c2UD,mZr$#0P"NjbVL!#PN!3"!!!
`!%!!N!UY+J#3"U4&!!#l3Iq3"!#3#U@3"!%!!$!!3!#3#U4&!*!(d`!!k&MrN!3
!N!UPN!3"!!!e!%#d(A&SYr3`M3#3!p-!!2&m!*!$FJ!&N!!b!!#[@3!$!Gm!!%)
M!!4#G@PXC!!!T4%!1J'F!Z!$N!!"`!$!!)%$$[rirr$,4!!!J!#3"k@3"!%!!$J
!3,B)5q1i)pm6!!#[!*!$`T!!!!#[!!!)(Vd!!+qe!!!VH3!!%YX!!bK$BA*LEfi
T!!"M8J")!'N#13)V!F$rN!3$([rirr$,3!!!J!#3"k@3"!%!!%-!3,BAYX'f*KN
U!!#[@3!!Y!S!!+pC!"-$(J!!X"`!!!G-!!!$lJ!$+&0eF("[FR3J6'PLFQ&bD@9
c+3!!q4!!6`"@!N%#!!(!rj!%!`lrq2r`bd!!!)!!N!HPN!3"!!!e!!#f&lE"YKH
f`3!!Vl8!!,%$!!#[Y3!&GL`!N!j*BfpZ$3!"flaTBfpZ68&$8d%!N!q!!*!*!HB
!N!1!!*!%$`"#`G5L`,pNj(cG#Y)Cd!IRq+M!r(hll(3c@PLL`hG1JM48Mq6Q'G&
-*Hc%K&&%8h'&K0UT'Zfc3E*aKEATDa*Y5D&A@c8$F*!!96'kY5GBbhpPh%XA-p&
!GPfq@cePdiQVK09[X$`C[ipDiYkQ4KbjUd`aC8Qim`"CJlm[2'*mT!#PN!3"!!"
'!!#f)"fCYr1m)!!!X"`!!,*e!!#[Y3!@`@`!N!j0Eh*P4QPXCA0$9bj$BA*LEfi
Z4%a-!!&TXR0SE')rN!5"!2q3"!#3#S!!N!N#Y`#3!rS!N!32!%,"e1T!eK"XkhF
c*h%SLbp#G)QPe2G2m0M&)BRK6d32JKf2T'6IhJZRG()5#`P#$+RS0`0jZV(m`FQ
!U"-fJ(cTMdSbjZjE)i2K58-%iS!862ELFY("5icQm`"A5"e*k*bK(Z-jAmbf'!B
DA!$dI4$fM4"hZb'ZS*!!rEHqVVlH$l!4XY$[fR1@C1ZS6+Y`*(@R34Gkq"P0iLj
&kM69bh!'Nc%+GYmH*4JeXiV9MGE)$RRml[5XX8%riilGB"cI9F9adrkX*r`(5U+
#22%8q9504fCl('D8'L,*%pPkE5I&SkBDV%C`JNXZZGVq)3!LDqZQSJh&ada+3(!
!TC!%!3!!3J!!YL!GQEIcZpi!!,%$!!#cfJ!!Vl8!%MNj!*!169GI690-,N0KFQ*
[ELj6D'aL!!'[)h0SE'*MCQeRJ3$rN!3!N!U!!*!*!Um!N!2a!*!%$`"#`G6U30B
2RbBh-bH9pcFb`R88qYT2qjZl$V'LrfGm)(IflXVj8AQV0LfM"M,8HVjqc&%c0P@
2BL)%`Fmb*$X6I)RFeE+Y+3phZTcPp9PUN!!pkX338G,2U2V4A%IU(K9c6D3lK,*
!U0SNP)(&!`r8KJZhk)HGQq5JV)NKM3rf*iA6QV#*Z&C`XCGK(9)%rQKmGiErCMR
RR![l3dj'[8eeNiIk4B*-D,L[l+f#00NDr9l19AF@hB)M[m9CqB@)qH40pL*@@TL
P[129*a02E(Mb+!F(p-%$rTI0&H%LYM%,FPeILFA4K6!AC+&IP4@84fG)!+@3"!%
!!$!!3!#3#V*e!*!'Vl8!!0qLrj!%!*!+TC!%!3!!03!!YJK,ilB)5q-!!+qe!!#
e2J!!VeN!"C,R!*!15@0[EJd!!GmKD@0[ENe"3e0"!*!2J!#3#3(Q!*!$c3#3"!m
!3X(9'K`iM&UE%LIfj)N+[0G%EAlahS2&B5A#&XUH%QdSf'9hQeZlG#I2kL!Iki0
r$S0)X-QR&0k9F[DTpQTcaUf0F!35MGf#UhF3R3@4mRG[TcBB1!X"D%6!X%&HfV3
KHQbXNq(p#[r,b,QfcE2%a[kChdEa`DF8qkP+e5F"ddFYGVQMQ*l5XYdCZ!R5LmH
*C%Rk6K@9T@I&01G()&IrqI&KQE[k,aqEc)S)ie8'I8KITKjDlMU-3DliH)P+NKa
L(&04'T)614F`ah"$!+@3"!%!!%X!3,BJ&cbf*KNV!!#d#J!!`Q!!!+pC!"Y*V3!
!YDd!!#*(!!!-X`!%F(0PG@4[3f&bBQpZ8h9`F'pbG#"6Eh9bBf9c!!#eEJ#h!IB
#U31J!F$rN!3$$[rirr$,3!!!J!#3"k@3"!%!!$8!!,BJ&cbf)"Fm!!#e2J!!YT-
!!,8q!!8'D!#3$NPMEfi0!!(8XfPMEfj0380633#3$i!!N!N"jJ#3!hm!N!32!%,
"e+,![f6NI0d+dKR3"qJJFB@i'fB$qIiJ1HD-D*5U+I&6mb&Zk1dBm6QRH3)J09f
1'eJ5!$,8kUe4E@Z0'ZRqTMZB9rqc02$ZcNd*D,"1kIiR%SkHZ@X9&ZeAYm[JD&1
PME&Cl5IaRe$GDP"-RNkEh@43G-eM$A*[4),BbJ#PN!3"!!"&!"#f"mkqYPTP,`!
!YDd!!,j4!!#e2J!9qEd!!"PF!!!'S!#3"!m!F(0PG@4[3f&bBQpZ8h9`F'pbG#j
M!!%mT&4&@&4$9dP&!3$rN!3!N!U!!*!*!CS!N!1R!*!%$`"#`G5FhSaD#LedD)U
4T@*PhAF%')*Ei96P"ER(A-BVEYNMMKYKGTEjD'!"AfrZlKXr&Fll8C!!,EELQp4
2[eV0T3pPmeIVj#-I*#&1I'4Q&eKSq-fIjX9-HL810$-)(@"Kd,RHK[2UQ%A,,XH
LlMISE!SC@YI)ARM5V%CEa&(iJ#R#FI0K8`$'eM-dM%"kXLKqMYm$8F)if60-cbK
Ym+jf&(R)P$dFd!"#`G5'ak"X1EA1D(Z'9d-mUL6b*Rm@ZHHbFX+(al&2FmTcAE-
4k+DcT81(H#@*B)mcmERSHiRCS1(IkIEDfhCl@J45MKc'4LaPjBMf"jfaqPjB`QF
LPY8C'#1J8,#m6L1acd-lD2Ebp9dQJXVdQ""%U!NY3K)@$2K+,S!TQl,'b-&C+Il
-rN3mN`(p(pNaP%"@h@50qPeUr-8S+0AklIf)C`prTKXXI"iPEU5FP,L0kISSe4&
!,PMd!L)IH#ZiR$85Ce`2p6NSCK2"-erTpl+J&ScKDYf2p2ZfpA5@d"I[L@86,-1
dI+G&jr6TN@94jYeErh3FHl#MpDEXD"&01Dpb)RZp'ClfG2CT)iPmje,6$hFD&Gq
Gc%p$bamNj850P+U#dJ*"bffaTiZY9ZhBrJ$J!N,Y([5KJR4)P3&'cdq$!L%XZp0
'Sjk#S&beSE8[2),BQ588q$$,F+$i(Mbk"'DF#MMmX@G20!XBbhqN`0[kBSRe5JB
LiISTN!#5b'K!KF!A4#Lr4d6Cq[68hhCKPCPp3m+Tk@(B#DUD8@*(1!0q#N8PBkX
HARBlImYJA+b!N!"&ZX&TddD%aGPH'pl`(ALZVJ,iVLGQ"N9m9QI%"+P!JF3#B[B
2*(VC[H2`,Z%eb!,-E0-A0ElRFb0S"D@m&)6V#CjbKGm%Rk%2kK2rNk6a*#,6mNB
"cHF$&CjXGm1D!,IVer54mYIZA`ci3+@fp8)mYGBEDq9rdE`XJkB6P-rB1L$+0LQ
**EcLF)EcI9EM88crE[k#dZr$1MJr!-IZ&EVX9IL[QpBNI`j0MfF$R!BDF-Le&rI
GSh'rJ66eSd"P4jJ'CYk5$'EdKrq1R[k+9Qi*R6$lASeNIUa#C!,T1p!P*qFP52I
&b5c552Y3GAJR&ZpZm4B@B6"+DK`lEX+TE`rIfZ(&6-AZXPV(4[hSC%13!)DrZep
jcJZLd'lF)iR'A2P&[`!$-@edm"QL6"VAQNjP5+!HQcDLf(FAr3D8K+NR%2Ca1#e
#ampZ2D9RdXV**ATYC)G%V&qY%K'm@FG-m@r4fpqf3UmjF&Na(q"@GfVFpbNFRda
%NZ,%CJkhBm6K[*%NTSE&Ei['Yf*QqE44i123TIGkKp&aKIGpL%p9eBKhjHG'Zla
+bR$jU)ZrP5fPQ96q%Fj,DmIC)k"239R5eklfGmr2QkI'hq2Z*cGl[%JHArF(RX"
6If8mq1'bRNqH[P-()KTaX+I"RLeMPBBX@mq1#&#r!0#-U*CqF38dK-EabNhCjB5
TM4!jerH"bJK$GDI(-[AG3QC$l`V*FhCKpf8+DVS(@rmp`2[&a5-Rdk4c26b4@!9
I9H8+"RYAcG5'ZDJq*Y'4)+Mq(AHj*%J@JEYdMGN(IhZ[M9SFR8*-NTNIpai9#0V
!%5C'DYAQSHUpVINMT(Bl*[jP@4bY,T8`4Dl3RRmj@pN-C#iR96EATqZhapj2-8!
DH*3CBSlPZJ4lM(B1BQq3!!Z5pZqq@3H'mI[B"QB"-G3SEj)qQlZ!%4-)3dM,Lc)
09kFe*f31644MJh2qKb0UVHIb0S+q-51'TJZ+k6TBJqCGPjKQC9XZ9FVYhqX*4V)
9H6(PHFq4f1@2XK(AV9bXXB0K-[45M3e$3UD2DhSd"@3&3B0r[PaMcPCXX`4k4jk
@Y0TU*&mVaabCfpD2212I0*)4$q`QRJ9KhI3Uc$&kbL)-Ule"#$V(DH%[0b%0XB4
aH'Eb&p@kpY,FA,LqLdI)j)BV,EDUE`AE(TXC`DPHX!2XVmrMRkQRbQ,fcZ[@E'V
GHVIi1B1Fq"FHm2%PGLVbMbhkUHFQCcZJleMa"aR(Nf,@Mq,b@YQ)!Xj"!B9SlZ5
d*#0Q4"E-VEFqGJc+F"0,Yi,Bj6)Qe8DY'YFFaHNa#&M(3ZaP0X$&!+Ummh3J(p!
D@a8a(K3&9j[e)0YbjiR3l'!ihF&9$eDb!XMQk!K*X1-`RiC0H+rrHerhhk30#VR
YX-iB8L*(hpE)[)NJ*2@b@c'Y!Tc[@P5J,9f[4P9Q1D(I@4Y!$NPe)f-EcZcB61)
hZqSc,5LQS4C!3d!IYSm6`(!3S6cJLY$5J"25cG1EC&GH+ZHA0f(G@QY1eP08$iE
qUh'&-2+CMV*b2l0%h1fAYKSF+hA"$(NQ1leq'MIHKlFBTkmP8'M!&3KII1,@%R[
,&PlFPU1cXSr1hCdr+Lja,cH-B`+UMD*F9S8NPRAaT%aLqJbqr2LjG@31,")AIpp
8TY`L-"85D+Pq4F-$#,Z0JM3h2VS'AbpN&5ZXLd05J+@3"!%!!%F!%,B)!lqf#&X
p!!#fN`!!`&)!!,8q!"F[Z`!!!A%!N!2b!*!%$`"`Ff9eC'p$BA*LEfj6GA"`Eh*
d,Q9iF!!"ri4849K83eG*43%!rj!%!*!+J!#3#3'D!*!$PJ#3"!m!3X(8dC'I&!h
mR%YDGk#l$(h0L[pq"r4%hU*"+4FVZc2r++hJqlXd$b[8+Z`L,[lC8qldUM`QZkk
)qifUC%U[GFaE#+$&AMN324PKrSGR9b9If`jFLa[8F9$K1VeL$cpE5*!!l"(JllG
"`(p#0jC0V9F9&5dC`mqI%$EjY@A`e**9mS(5(Uk!q#SkkpQLZ5VN&HGf0f@SJ%,
"e-NiZ4Tfr2LD35$-+@X)k5@#9V6HJfHNil44"KB&l6qP9$,#2c)@!MkrX''"El2
r8&i9c9fGE5M2@hlf39Fpp5+9+#-iI'2(bfi@pZaXRUFY-dMdR2L(Y+CT31YqAZZ
8I*ca$LkqB6fdMjd2+*lhfbNDe&'MG6!DH@a2ZcU0$cmFN!#13,GcU"#hQM`A%$3
aJKhZf`e8QC*'2q#lSa'HJR@P4C*R4lE3j&Q#aKbp@[EY%(-`chFfXhf''UPjP1l
'E$68j81&Smmb$E24MaBeik'P$[##QkVHJjI3326QUe2PDq&J0NC8BFYJNI#aY'X
0J+@3"!%!!%N!%,B)6Dbf#'+E!!#q83!!`M!!!,8q!"Q(#!#3!mB!N!10!*!%$`"
`Ff9eC'p$BA*LEfj6GA"`Eh*d9'9cG#jM!!%la94&@&4$9dP&!3$rN!3!N!U!!*!
*!CS!N!2@!*!%$`"#`G5L[rqGkf,&!4+hZGE(N!"i'[(Shbp3qJe2)%EiRDJHeLK
MZ3V[6hMJ,!,%E(Tj8%fGC9XaMEm0,iq(kX`al52f%YNG11A94NBc#VNclc8`k'P
YP3h6B!SC$rfK-q%,i40%)$YI3*'I!--l*kIVPX"YCm`4a5T`E!4C2k8mX2pG4[(
2VX0YI$RTGhSl,@89UQAQ@3D+dq+YA#3U9@S9KIJ0q+8SYH(V@%FccbTbZNGT35V
CU1+mE[%AN5XYIQ+!+%'L'%Q$[JSJbdbm5c*FfG0(fY'2U%,"e-C3'4VA6BI&93E
3LqJ%P581*FF`VMdFNH(qJ[KJLFBXi+qS)cP$3Cl$(!q!MHbMCq6MJ9Pq5QG--ZY
!UJ!(4-dqDGA5S3$8JUJjSlY*S!li3-pdEJc9MHrIp*8,Mff6LSjcj((EJrNJe)(
-K(D`RMbPi!EHL6&9'N%0$DF&I6J9l98kK[M9%)cf3+@3"!%!!$!!3!#3#X"5!*!
'Y6i!!%qprj!%!*!+TC!%!3!!-!"!!*!+Y6i!N!D[@3!!Y`VrN!3!N!UPN!3"!!"
$!%#f&i+MY`Y51J!!VeN!!-Yr!!#[!!!6eZN!!-,h!!!29`!!#)J!"LK6GA"`Eh*
d)%aTBR*KFQPPFbN!!&f0!,F",J+T!YJ"`2q3"!-HrrMrm-Y%!!#!!*!(TC!%!3!
!03!!YKH#SlBAJU-!!-+3!!!!a$N!!-+3!!!&U+!!N!j*BfpZ$3!"(PCTBfpZ68&
$8d%!N!q!!*!*!HB!N!2E!*!%$`"#`G56kGAZ`HYlHG!LV4m!frPBR2QHBhj!4Br
i+(X,#ZMR4&*VXRkUJ2CF84B$f[$`jeE&C(!CPPM06$CM"2QiPiL#!4612e-a%Ip
2YG$!,!l#+MY0TYD+1A4VLliK,m`9H5dYeAUNfjE1JeU!1fcIY2iTqMle`m&L,`,
Sk#cA2cLpLVKCp!EJ0[*I%SQ)IYLR64S'"eVk[,Qq0J'kaI5'ZHA22R5Q@r[Zr1G
C'1$,'QD$SELMES)Jmf6d*$A5G*PedZ!4QXX'd2M*kUE6rbfiVMXJ[c)jlhqE"!#
PN!3"!!"'!!#f)"f-Yr1lZ3!!`[F!!-@Y!!$#N!!!&RLe!*!16@pbC8CTE'9c3eF
Z3dC00MKV,N4-6!!"DG4cD'aL2j!%J3$rN!3!N!U!!*!*!VF!N!2m!*!%$`"#`G6
)[q@3!'r3&YF"C4Nd$*1!(+SC6Zd$H*-m#3&4GKSe6SSll6Z[R`Sm)YUYh$J+ZFq
!acM0E,1Rd*!!'iP6mirl%61iXBX%JLJ$Kd@a"S)#qGAQe6J"fF4*+q8XMmi))ZH
-X9KEAP!YCNm1fGG'ATR-1MC+0(Y4ddM%eG1$dXKEMBc8CRcT1*RB$(eG5IkeS23
M&*V2c5%iFdqcb@q9A-#qE(LMEHa3V%)46Y-N(3#-Ph%%AGZY`P2"Tp@LM@ccSpd
1AJa!fpc"lHK[le,Z--Qa%CiBN!"S'`FlP`@2VPlmS&h28-F5qa@YMp(DlKrNQHi
M0!i(BEF92Z*NcJ#PN!3"!!"$!!#f)"f0Yr1lY!!!a$N!!-FC!!$#N!!!%fc`!*!
16@pbC8CTE'9c3eFZ8&"$,N4-6!!"hA4cD'aL2j!%J3$rN!3!N!U!!*!*!V!!N!2
h!*!%$`"#`G6)[q@2SJV@e`&NhXa8Ni!FUHpPc30iNc`*!9&f)R,JLM[Y1kqI#M`
LfUhF1!Ujci#jjV#B1-1UYVj*,0JR8Uj"#FhS[QcAKPd!6Mki3U9'!2Z"43V)dL!
!5i6[%p`Ye[c(!q%'+G(M[JF2q86mcBlaUG8AEYDHq&Yp[hpDKBaUSXlB#Gl5d$Y
RflMdP,aB(c+H!Rk2B((jT0J+Kk!-EJm2"'rPD@f`4aYkHRP(mT2lDff'dZ`8NJc
)2dAJ0Ua8#KcrF5P$J2,K2U`YB#L)%@0U,LPCC@D9rV(rMFDKTEcmbVTEI8(%Q1F
qT%d9Nkrql,bVCP%!TC!%!3!!3!!!YL!GMEIcZkN!!-@Y!!$)J3!!`T!!!"#HI!#
3$Ne66#"$,N0'66Bi5bj%6%`!!9p!FfKXBQ0QE@H"!2q3"!#3#S!!N!N#U`#3!rB
!N!32!%,"e-LrjBml+$EA!@5NC*b6J"bTfR%p!hKMYU!Ml![!CrAFBL'Z9%%eG4[
(`RN5[bdrP9AqfeG@1X)kJZLV+hPEKlhTEeG,44k[XBeQXkLr,%m&Cl08XFB8"R8
Y%Tj4#SCeZ&4`"@,RCL3#Mea[a%Pr`AC&(A`fRYd32eDl,*hBEZELa#)6T!d3!8G
SXXmQ%X-0fhMT`b'@(eQT"K0-#q8(6kLR&A6m"NBZ@elEeT-30#Q@jdN83P`Q5h`
X20c*`LGp4Gd@LXdhf$-Cm%L58fLP-"$020BVV4YhZh@KF5&V&Yq*LPPbP3HmbbC
FQk,pih(i0b!di+@3"!%!!%B!!,BJ(BfhmlZZ!!$('3!!bHi!!-+3!!!@$TS!N!j
08d`J69G5G@jdD@eP6'PL3dC00MK,!!(2'(0SE'*MCQeRJ3$rN!3!N!U!!*!*!VF
!N!2e!*!%$`"#`G6)[q@3!'r3&YF"48pN$*1!(+SC6Zd$H'1fS#2Vkm%2VlM%3eb
SJQVU0bmlFL9q@RmT[X9k$J(`J0UZ#SI"c`G1FPq,TkLF"R``Hck+f$fdIDFpZM(
aklKC!`Bd#p%k*[Y$FQ,`+r`94iD)R$)AHcZaUHH2"e*$VZpU'@U'JQ[!m([Xdc,
$#lS6'I9%L636'[U)b[TM543Zj6GFK6,-j)DE6V)hPqQY+Q+,MEGEKCFNY(Xl-&"
ra'r!$0&9-Y'M@#'[CL-VTSN*X9N(Ph4DIEeBV1YV@LGcl#8+TVLYVB5XP&!NVMP
&QUP-#A`dldi'8hSVI%#PN!3"!!!r!!#f)"f-Yr1lXJ!!b)%!!-Y2!!$#N!!!$i,
X!*!169GI690-,P"33bj6D'aL!!%E+A0SE'*MCQeRJ3$rN!3!N!U!!*!*!UJ!N!2
`!*!%$`"#`G6)[q@1e%@@e`3Ik-bdNi!FUF9mV30iBlDJ)q`,`'Ieh')KX9#R0A8
EPjfj%VmY2j3VB15h"C(QZ#Li-6*+Relc'%cV"D8`bq%@$6EVX9!KP+a9(rVr*Ra
((E23dmN$`F#fXGpc)!AYJ+a*r!BiC)%jP)ZmK(ElhR'NpbfCcmULlhiL6dajQqC
Xa)c3G$8`S4[bi#6-9A"ZADK5,6+Mf*BKHdfj-SYaN`(#d1HKB%Z&NZ0lTE*&Sql
J9e(2rM#UMmh[JM2Gb@HQ'()M80mpqT*lZHXYqTbRb'ep`ZRpYN,$H3I`JGN"TP0
aeJ[$FJ#PN!3"!!!`!%!!N!V*lJ#3"X+3!!!!i'2rN!3!N!UPN!3"!!!c!%#d(A&
cYr3`U3!!`T!!!!$`aJ!!V`!!!kje!!$,eJ!#a`m!!#6`!!*dBf`!!+c3!)N!c3(
P!Rd"`!!I!"m$([rirr$,4!!!J!#3"k@3"!%!!%B!!,B(cTqh64Ve!!$,I`!!h0X
!!-Yr!"C9[J!"#rm!!"#E!*!%$`"`Ff9eC'p$BA*LEfj6GA"`Eh*d,Xq!!!#(`de
08(*$9dP&!3$rN!3!N!U!!*!(3X(8adCl8UQpJX1%0e%p$,V,iHa2El(jCkKc2L&
2DTY3K2lHELeF"Yrdk+m!j1)+'QkeLm)BKq9qM,SpjjiX+0%SBF'Y&V2l2IdIVH6
C`YJebhVmbI9ec'UeH4D'lV`#jTLN!rKSUI1P61i!+6-Z"3dII*8N@l1T$+FRb"c
kYa%l2X,&cJKD0G15"-pqSB-[(#fITib1-#%raKS"F0LA94Z3!0&e5UTTB@FSl4Z
6'RYlKSMhrrhAa5IH80aSCr[E`X!LXV-R8@hQX5(ZT1h@*6U)6(2G%F!r4lL$h5!
52LNV+'Vibb,c`SR5"E&FT34&ZUa-p5Uqh"*CPZG(%JaeVKC#CNFe6iBNUZ2#XeM
qX@C3-XkUQ,S)L@6j@`l)YV,F*+X&a$HT2!qXq5!2ATC82ZMNqN-LHN@qK[LiC2d
RRB@*eJT#Nem-Yhi(Z2[Y&'eDH-ZAJ6b1rEhe*$*VI-%NaQid)%bUJSk`q,()4q-
#bp-T+fd5-)e!8GDAV%N*ALhTlhac!d$S(Q458LXVdP%9-"VEiq#VLRSRjCC94VL
GJM@@Z1J-4"Lf2pcippU*4&4*%F5iT&e[a5p,KdA(LM$d1ei2Y(dBC6(&,B655H!
Ce#1rq1A'CEAj&L&#h23H!rDi05l(`M@QQ0hKR5&[aS+RNUrFc51LB&[XeFp6$U%
9m$P[)*iDKLMb*%14kF6r`%Ia&&VCEU+qXEe&J$q"8BNHFL`jch$2CBVQ5hXY-$p
[+ASefJrihjlJe`YB1-GibE)kkN"f%JE-C`P!REZZIjA`A(flk+Al6bY),Q!XJ&N
rTF,df2h`fSA6UUAj6Y+SlZ#r)8fk[,YAUqXbEUj*%1D8[ZmpXpUL%k,&e!-XJm*
P1U$KT(mkX89EA%mfLSXY93fCi@8d2)IJB42+LMFNRGB"G!PUbI#3!2LrR5(@3V-
l*q4%S$$@'ia5#jbrbb)YBVTjYV)HpFAeAS#5%6pjX')D!2Z9%8QeiP%dbqpH8K1
rZIhVF!qpa5m9!HF4JDH1E0Db3b08hrK6#3%b0%U%E-F$JkShB(1e0M9LC&F!l29
fMYpD(S)5pCPP0,&!"YX0UJ&BmP9Eh9(!6)[(iFH"Nc!fkVpibEj0)D"k6FUFTQ,
$1`YCMadL1i[cGm2kR#`kKQ!HYckl*3-NT228TVpI$d+%VUhI0dZN4VLDHG"RCfc
`9jX@p@U"F!ihKcET*@#)BQ$C"m6pkRIQUjH,!*TKIr)3Y,'T$`*XNTcp[Nj)R`H
C42f8%E'cTC@UYPX%3`B9$#6ECKR62(4G6&%3X0dqFIZ45chjl'kilYRm!Mq%AEF
i3B289F5MY-)RaLhNL34'&!d!,bM4rIpV4qLLbj+DjcY(K8!9mF-e&URX)c4iqB!
$(3b`,MIP'`!SU`F(fZk'5B9bK02T9ZYM2hH[8A&akDKZ&Y45lrXrb3`JjXe1ApM
@#(XDU6!bFl"!9p@rirh%k+@rE`KjCrYBcb!MRpfdNRikb%T4HBG@!Nj1edF$k2b
48qT59)r(@4'Gr9j)H&`#(pf,P`[3kEcE)i8@pM&bNGEM+X5GjEhNV'D3!+!9H)#
&$$)*I`D#**!!dfS4I[*iS8KL"J6D32&C`h[IN5T%[qC`b[aHI$6[iS2T2&qAq&#
0$VN1Qcj4I9K[p+U-cSiC$pL!p!'&Y$"Jm0rf9"a&G'#JT%q92VBFE'qrPj(D@`M
,14UrC3A(1R(Kb`l9qJcXjdhS!J9hKBI80T,HE"kEZ@cD2hA,9ric'VK+-)$f#[a
P1qD'#k51(M-B@Ya#HJJBaD0V"cYqCHGJ[%-e&CTiTr%2##BMMGq!dRZi8D62Mmk
`[IXpk6q8Y5`Qe#h@@E*"ADd!jHc&q9$mXHX6!Cbq$T!!*dQ8mNYVIj4%iqfaK[[
lPQBD-M%q#CX9dLTq*@QrELYml"13!18LGkH4S'B!`eSbeaeSYb*`hq*$Y!pPU@J
5486-#24F!V(Bl9#bV4aRLHL'51k1)p44KIcG$@M!Hi%"rD&&MdPIkP"%`!)fk$R
(BkT+XV9q"ZG$,ab2'lpYcBS-XXGBm5h3'4d#'`AUAm*ql+,PeQ[6Z)[K'cjBc31
1ZXS+drjEai3i6-9UCHd9fS@qdj%j@-Z$c,q"N!$-Qr9PrH(2L[hX"VXih9fYZ&h
l-kk-kNfmdl#q*ELp90GA2d)RCT)M(KqX5EL&`,R(,@h*lmm9Qb#IV$NCpjH1FA2
aN!$fCR-jfE0cjIkVX'HVQd3c922+L!U$a[qrKUYra('RA8N-'N2[MHQbKdiqK(0
ij%86Ai,eTN%HS%)m,!hcHed,f`c[Y1Jqj&hLZiGIF)"hBNe)h,YjTfG(&fabGEm
8@Pf1&3N9@aibb5a9(dC35(S0Kk2$fQmK"ef`r1EpYfPpkZ-iG,b`9l-SQ33hYkq
bX$*F!&lA"Vala8Km&!RjQfD8id*QLRE&PVEcjFmiJ*3#9+hU%TihVqF!*UIX'df
a644c$HHJp2R!J9Akih+NYM%G%G58p$5%[VQX*b!9IE#BT"Q8+-'(m#CPZY!Ke@&
+UC+lT%1M$$@k)RQk9#`9aVI$5YS&,$E6NS`#q@Ur&H8E5ZBq[j`(bQT+HA*&m`C
`mZ!hBm,IC`C1)e68'S%)1LC1)3%k1)aejB$cJaje1j5D"8-MQ!V&-Ue+H!LEMbd
e)B4YG&ae`imBp8kSKNCHB',)eJB38QiUar2#lV,Y44!"Z4VA2XV[&PGElHD")Z&
hZ"aR3hE``*!!h,d+&P#(L9P4)+"aC!eEcTV@CUkakJ'KrT!!jdP1$Nd+EaRK6'"
[PB*XDpCa`Bd3m+D*0ABZ9(9"03ACH-8L[!a%qKabfY,""32D)eXG($i**jFIr$c
02@M-8RLI`abDSjcI1RV,#Y0E9TjA)lVlJX*+#YcQFQ[fN!$k`iJ4akG5DEc&a`b
06iZK5U@!@R0@[`a"6G1')S"8ZYK-"FepDe#q2I*DKR%c52jl1m9[k8RNP0qXU&S
d55+A[N#%@`[A-"'hM1!,IUE3,0eC@mCj2Pbc4$0iF6RTcY9PTdEJCCI%iR(E"`C
a3%aJJ8kKK`jcM!5H8[KD6ANZ'Tm9(9!b[0&GScHl41*K$Jd4fM+i3[!bUV6EY$#
)%5TEa8"GH4Eb#4Z"-V,20pI+FD6X#J!8hM1(b'*6q9Fh@BG#U9(L4NS0S9[jI3R
f!dlEdQ*A*3T%flU*jq3Jf"TbQEhCP3L9(6alPC*QiJ%cqHf#K)kX5q'2AeG%kjR
l)2ThpbN8MD54@8#b1l$2M'kL0LlP5@+i*13#IX"qKA5@5[$8`mI6TcQ1rdU9Z"9
KCTBkb5JMTp[bjiKC,SJaich3PEGZPSI0liM-Z"B%r612`i"GRKRqE2amrSL0STK
mB01ABfKRk+R6Bk+"L+cE&K+-rJ!%54@0XGekE)IT2K9mp4[*BZN`Dea94"Ghbl9
$@iD$0JIN(18N#$&B0G-jjed&ZE3Qi19&@K3X)H92PUmb[ifN0+)Q+cPYU5G+kb&
[4D8K8"j#0NU0MZ1h[hm@+)eVCiiD`6j4294JB9dB(%`VeTM6B-((R2*fCI)U!b8
PLE4NiT0j&-Vi2TVMeDYNL-,ELSQi0B!3('EdpJLdCM[FUK8UlQ0i(Sp[#NTNeRJ
`'Uqq"S)PRaPlmH$h+SI-&)A8VG"el@Hf!ShaE2V53h1bAQ`!1SXS@hU$BXC!bGS
Y5CA3R1q0'SpT1*+3!0%2c+UL#6)N)!2Me`qEa[N#D(aD28eZSle60SPc*'hM6[k
FF141m`[BrF1c8jEl$48r+U5L,ZKf[#HT&iTjD8E43N+K@CLGUhN-2I4$Y0ddFm@
pSe)RXREZAj['r0+-"P+R2Mk&-%[JdaYcYH2,AIh@c@(VASXFfCHMJ*8@40R&ZP1
jV"N,Fhj`X!53!%0m9Ee4l84k"#`p,#dd%Qm&"j8AfrYS$Th@8a&UU`dE)UaL$DV
FmQ*``$PS4)rbVq!r9AElkNa&r23k&I$%MD2TFQiR6S%36EY3Ll&[AHHemYMP#km
b&XMkk06"5VPR,GLHQrST!(kXD6+54M3L[0a#G+2!Q%,62#IGeHjXd'+e-HJ%ir6
k+bK*j%aH$q'+6aBc[rRLBG%'82iABjG6$iV-4AdGK%(H%UFXJfj`)RC-,Q`c(ri
!KadV(%m+'b`RJal(KL4%QSC3AUhfY,6N[VYI95@iS#"b1i[B@aB(a`YU2![S450
%%[kQQ*i*!`F%-2'LUM%9NU'A9TGR'jU&Y9)VUU!'cXL)aA($YSSf4U[!J8RG+9+
j-3lh5Neb-,9*jb$Hkrj+rb#!0`%D8lUjYSl2"(4eCX4d05Y#dpmSE(E"[9UeTUR
1kD0C0EflqPe+b@c*qD#dcYrmfa8)+5cj4haJXKYVcC'+irl'"0rNRZcGBkq)N!$
LrXL+V&jhHCi)6lJ['TFQV!bCqAS@S(N4Trb0IKKhFcUKe4fU8Ubi9&0L$'c`'8k
mH'Q91Shjkh1CdaI53drFhD%)d24-%ELZl[FbHCYp)4l!k%*0K8,q1-#)G[D2RXH
P)lmCHLRKbliM2Vq(GSeQ[@A"$3&e$"6FG1E)h1fr'#H"3Er12ql*DX4ESGj(hN)
[K*UeRFpbD@N4q)SM-2rNJBbfHKKpr"R+@FFGh[1j-fZVrfkeP"503f3Jca1CfUT
S5Aq(6FikJM3hPh$lI8iX5@UjiqTk&68@5i9r3ZHeX)RZ+YiIG!HF0H9!-SbL`k*
@$$B4Fmr"EXS+1iJCkMb"Gfbk-bT&H1KMQacCajKUV-d4DEq%UV%&&#c9DmkJV3%
qaRe!BKA02b1*`*c%Pj[pHIMZ0[m!fj1Q!Y9$6i@QJ&-l[@K(8bCE4+l2B(U15lG
hcI0NG2%bG&IlJ3h`#ZbbTT+M8MYR(%Ta1e&j@#G#hliP[h-)#h"l2N-,,Bi89IJ
S&f`""UM#-J-CI'SL+D("6lb&KP-`B(Fb+rM!KXf@83-pB@)UV@mf@PJMdfqSike
RNqHSGE%b+G"Y2kG)5dKBa35+-)aGU13SZ0aP0MYDUdh82`82!$f6Lmme-D8mJq,
YP$i1GNMXcZCV#kJ8blJfLbKUjpl-lCL83XmBQ604$@E#H,hl1Zm4`8J(ciq5Q$N
6GqK33mMHq%*JUf%5i$b$,deC#K-&3l@kh!QrIc8K91i3hhL9-cm3PqF8GDUKqJc
r(rdIS#qSNdk+$EUrk9GMPP%SlYUS`jNGX#5iQ0LaLq'd)D&6rFB4m,jhK3XV'Nm
8f0q+d(2M+qH#ma`1R"fIQ'L4!"C$RHi(31*03[4f"D+jpL*UVlmE4RZ9$k"mEl6
K'"2HrX)`b[Ylf-K+Yeh-C6#4h$c)!kbBGG9`F`4B,&RAEjFm'kZQRj1c8mF8%!H
Xh2G3C--UeriJ[m82aC,*UElX6&RXRN!iAh$!5-&IrcNmSLNV%JL#l2``8f3ebBR
mb[`0CUShj4h%NXU('ahbabiUH*L-MQfcG0#0YRk@41[T$*2+CZRXAMCkeNHFmI$
1Aj*G@4!9NZGmQjB11iC,!p!2)-3E-TK[HRrB+K3-"Sai,Em*(Xfj0kQ0XIDNC5i
+M%lIP&8A'+F0U!eZ35S+E[!j6(NZLM[1eG0M5ahHKmeA1#(NpdKG1cCVLh$P*I8
0mR@Xq+c3Y9r2'kI'hcrMBSH5!!kZD8UYC[H*DHqYYUrU%"P#'#YjC19[mZPj%@f
QJ2,[9`UCBCkaDqLPN!3"!!"+!"#hp#hiYr3Yq!!!bpB!!2#@!!$,I`!D09N!!EX
3!!!663#3"!m!F(0PG@4[3f&bBQpZ8h9`F'pbG#l2J#jiE@`!!(2"9%9B9%0A588
"!2q3"!#3#S!!N!G#`G6Z@rThq#(8#D"k6++U-,V$`FDj`@-#5@3ZGNQUd+JLDeJ
2q8I1#mH-Cll[9QQB$*F6"95X-R(6Hd01rUAV!dZ9mjF`AAI9@-!hBLh#EhJkD&e
PQU58[C'paVaF*P6T6Rf,8@4KHD0-ZR2ZLRar41qY-a-[T#mR(F4*)H%h3E%1e2N
pT#%1!5kr0a8CIm)"DCcG100,j4pJELlVFkVX)3CCYep""2ESZBNdaqB2aDk4I-"
3T0PA%XSA`Si[U(QC+6U2e9MS+DrfZ!Mm#[9rG9-Fr5,FF4f(P1a#Ai@crA*h"hY
P,j4LQ$kU-("jS"k"V$B2(IbrSihj)[QF#IHU+RDj6A5plpV),rdE#SLjY(mBH,S
"9YZEF6m&IMQTVLhcG$I0KU,@8(SZeHS"0NQ`rKH[e8HhercPHEMPc3$CRXPYkRS
%,mNL"HiYBka0LTpaLCmXC)-JkppYTcdKqd-PMpGDYff`5BjXNBDH$JldXVLFaDI
BPhURQ-aja""5J`e-NQk$eN$BV0XI&$cJ'p(VbJDkATEFcr%Y,V!Rj9PJi&9CN3Q
8SU!BiZQpSHBl6CcR-G'i"&bl&%jr4"(fh[`T0[5e2[II@3Up-KMaik6iJ41ICiA
m@D@6CY'c'J#f4-L[+p1jU365ML,lFXQRbIRK8UjiE#2QU,biU'LEAm3EPdqN*&R
3KMS-rjBVjBT1lR@(kRQ8'$Up8Y!e4Ii'PEGLebL0pRD`8N$mDX*e4#H0[0Lb`N[
P'GfLKdC[S9A0IQ&q*prc-%$"QZ#IL%fY`9!KUQ$c$T1dVrFk62Vcr9NK1dVeVf#
[G,f+"@*kmTIIQehPAQV+bD"Yd1,aE3[*4FDU)!PSXV%fa9PL(ZDii4FGiAd0+Ta
"'M3-6Ykmr`Pa81(Xi68R5I-8)cr,+0lX28Fq58EN@'-Zm&-EQ1@JXpE*@lK4Vk#
k-NHSe@fNQIDD$S'd1KZMTSJ%'B,GN!"UAT5db8p*f*2B9R&`5RN#0q4[%!CBNfm
E(%i,`HpQVkA%JMfXCIX@*[L'@`V5MN(d+lJeD@f105XFX,R"VfF"efjAIE`(*qJ
TYZ[)+M9YR2#!iNjH9A!aC82(UGJhb3,!8QP(#FT95diDFUK8HH6Sk"T9PZGR",c
D[5dV#S(U0K4jT(8+N!#5&!V`Vr32!ekYQa5+!IPam6*Mlpc5pFafk3h(LiZZhPP
Q5VHq'kqkG9Ib6H+)rM5dlZ9[XUcrF&ci-N31bRG*VaVI)p,,--R,a)X9M4r'Yh4
3d[ZH"93$VC(J&(,id2lmrD44'1`E"95!V`!38G1dR[Xc4XLXb*2`Ipa4!0E[%aV
%,lMDiNd[eGbpC0bhZ#ErD9qBY#*c''XCeaiYcDPUeLEY5PE*T[RkSc**rhM-rYB
Z8+5Q"'0A0[S#8Pp20%H5K93LL@epTGBMaTS3r&EANDBD[k"0'%,QSqMC*$M9Ppd
X[BJ(T5M0#DrM%M8ZdF(CaI9hT&m1BULeFGfQR*5SLMek@G2DHS)mIX`HiFI3"GE
(qGT4@fGQ*k6J@L5q$Sj6p8*%rp`Ll'GG$r4'RY+dHc)i4rRN5-4m2,fAl`N9l"*
b+,AI+$TmY34S9b6-H`Db)1RJb!+G)SKh2jP8f1J1TMZEj&ND*(i(Y@*IKb+"e8V
Lm-HS@*(S#ZKmmq@TdfHX8`'LJJK-Fb"NXZIpjiU5T$VSY-hPp63XF@LGhR-XYpA
dh14V1!Y3Yh-hDiYca,##!IUjJEBETC9jiR"E6Ic2lc1&YmAak@hTp6JHfpT4A1Q
!-aBp'P[Y2r+)T#2Kfqd-l@Mjq4XQ3'IU%2Q[4&b6KD%R2S63T'q$LU'ALEP-XSf
Ub6Lj[f81+YU`ZqZA(pjj&m3r@`lEdKSj4eEaN!!pUqDcHV5N5E2[`FQdL0iYp6K
4$Uj8dfJVj8`,ZU(iPP"4l5C!G,,kM*j$qhEaDpR2$k&8G1S5B3+NU&!lY5fc+aX
1p8P,GSh$+[9iB-Z1p$[(X'Xf5dQGH"S@Z*p+0(ck!jFK8l[l%0J'BG1,SA2,HGN
'I9$6qpCI)VNH1E2jYF&m@Npra0ke$NFQS*9+4%"XM#q0(X05QA&G5L92CMK0MX*
aH#bkXAk)c1R[(jd0'TVPMQK0[!&CZkFp54Y0Bp!FiM3Ufr%'$lkBDiMjj6qcAqE
"liSf,,)K)4Z!('IBkjFE`'*T)D3A4T+Aak$AH'qapAC8%2T[`rJj%)pTUeJ-imh
rDD%(5"$BYESHQ)kmi[R)0TpHGLb25Y`4VZGL1IVlSmQ,@J@CCj!!BYSQA&Z3!+b
M42DSQV`PjU#GKjK(8TM-a+JadQ3U6H1Z-bAmJ&@arCl%c5XNi6K!,IMk@&dHeaD
VM&QfQarUdAiUc'rVFmF9`F6&cH0HkS%"89F3e*H)J1*$D*2qGDpKQMqLCfD&!#8
6%f2DZ!qLdbY+QV9@)4Br2fLJU,0)NB,42#`D8b6eeaHUABXN('@%lTU6c5ci5VS
$I@bfi0"J#U'$9-QAAK0YApq5lmEm6)X'2(C2!(8#pleRT`fTkZrrhjpm*r'3!1*
5*U-Kbp#bq+Xd(P1CiTLcFqKS4k0%a*6Xr#[Q,XMkHR%#d()NThcDcA!a0'ID)'j
ka99ZL%RZV1-5"T2!U&S3S+a(+CQi'([He2LRf-cM#6V#J3LqD#&0@YkCN!"k8Dd
jmFq,qEpe$k(#p6+Y,GZq%jrQ1$[E)j&1dUiNJfhiJCfXVLr6IjKi6@[F'lM,BGI
Dkj81JI-hR-p6HL4f0qIM65-8PqM9@hIGZe9f%(@4'1iU0#r*,ZX1IQr8j&UH6aF
[,k*If-@Qe(0P+`A`Z`GJpdN%kFR8F$"PdY(!S*FAY$R'#&1mb4`a)pcp)-rlFSD
4833XJJV0qMR%(2P8G1SIae`*a'5kP9CB43aGQl`ad&!9`ajrH2baYaRR#aE&8e%
bjLP@c04`JX[cd"&e@8J)IJ1dRmVa33lhaX,d&HfYNK3jN5'DLCS5M6E#I%bb%S5
jelRLerF2$R9*Icr-#IIpc!D9eqpYH)N`[++Z)J5$A)rRp#kmF82MpbTm06@@BfV
dGjdU%V8`RFIU5r3*0HDTrT`U0BZI'q,YjL6H#Np&#IYB0pkH-bPAUG8A4M%fG!*
-j(A5mE&,ip#14ZJPUSEYpNN-$di81LP8fC)rXa,F#CX+%M0i0[0iH$lj(6fF5Ld
HA`YVfp22j2RZ"kGB22Rk5T'@ALR-C!*U,Y2U&TC6I+I-5QEUC`)@q#0LNI%,S`,
PjKQdDZ&f-MfCKE0VBiEpVR6593lF6SKZ-G)3eU+CPSP,m3#JGZ9261N8[B,QpPP
RhX3dfa@bC8(p)3J5imAp"PDC9A1XYNX&+)cM51BdMYc(Um,&#qC+E6N'FAmR)HY
)lCLc[85)bCB`0lpk4VZqS,XYj""Al9`GDCL#'1kJaFI9h3dkkXmL-(#eJLM5#La
h&RQhkHbjKS`d$!!JIN[%lVRdZEMUm&,-m(540#m,4a1)Y5("*Q"T6H#Bc2bATNZ
[lHY6a8X%V$e"TC,3TE2brHRI!kq'ara,(qX[)l($A5M1r@-U#YDNd!m3-kIVYQ9
f!JNdcNhP(q9dM5`HTkaJ[("%Q[0Y2`(i$Vb'GL@*8fJZdQcFJl5F$eY-pRH4pAG
3[-SiP[$*M%ILcJfS)jj40-RBfh1ddfJILJqFpb@TDLFRR1kb6#AK`V#8i(LVc$m
)JjhfL#BZT2D!k6qDbda!c+I13@`"KiH+G)P-I[S-h1%)jZ4V4E``AS#Q44pA0NV
DUK&@KfpSPE$TB#Ca+3Hr-EUJ8H'KeU9!`c6KLMVreCV)e'#cIbSJL%TJd)b*%B'
fiB3p-b#m-HUF'q@pjUZDakm[1h#J5Q9+bV`V`!2()9$HEDfFFhJc[ZM9Hm2M+G9
&Cdk%G&pF`R"V3)(KEAB9rrTIda$MCa%$6%5rV1!hHi+%Q@3IEN%YHXJ5B[YHH#d
G&dQXe`,M39JH(UrFZe)M0Q54F6FeH5X$jD$(*Mr!!qh69qcL1GTTjqj@mrLNr98
YBRA"*dG53-[S5U2XrlMa*c!U9ID#r9ZZK,!D$q8M@i,(c1*E,e,5eUjR-(ICJ$b
p0J0U5GpBpNT8i+GC5U+$@!IkJZch*1l39-P(H&"1[4f$ma0PQk0HC)YXAZ5`hk6
%b-RH3KkU`Y$6,`T[!r0-J4LPE1fAYikr0#iC+VYGi8c8b$mUd1UJVM3YHiYUj9H
Q3%8Kf8c#(jCePLcU[6&qr!X)48UYC+l[*f%EfHIEBpBQ1A$ZmSP[$CVE[N()IP(
em6LIE"rrB+k6EF#N)4C$MR306UbL-+HGG"B40I$[VELb9YehLZ(3MlDhqN0iJCM
4Z5``U3I-`9U@)ZG*HXjI&bVeQM"&QJr-SX,fE`9FNZ52DIdYr,ZlUN'q$$&@4@V
LakH!5X185`EB8c$q09LlcDR[9,H6D41&fS6ZCbM,%`Pfjd4V-H!(a!P[5BHXT*d
cNr)(HAl"HSFEBb"2*0D9#$DQ'(bj'B0h19)8)'BJSb'ASKii)T&TC(VeYX!jQ%(
I36K(DBd'HAHYrNq[JMfZ,E9qS[#CHQ'PC9aUC8RGmheZqaSb0$A[6k'K,,'ZGR%
HH&k#Bb"+2KNNQ(%US+*DV(TSG'J%8#m#6paXQ,H%X4U*TI24hMJiImqA*h4HHDX
ie`VX+1289e'ZJ'b4-49)kZGKX35iXr4EXNITQ("pR*!!NqqN)ZQ(K*3J,C8MSq`
IiGbD$S%9+2Lci6kPIm)01mJVXNm#PU&8E!"-iLM@5)@d[-YqdH8#e-`fX5"-c5#
r8bZTc9f(ET!!a++d2d'GRFAN$(GHYidR"2FJPIl,M-FS03I5G6pGh4qTkmDqcbc
$C&*YKL1Pk2-V9"d!Vb#5XZ'H63f*`@e(Kl%Am6,BpMBfr[P"YlSI()ibQJU[LmP
)9IZGrUri%G26CfP![l0Q9ULfl!JiE"(QM!Y8K2'B5-4F#H-aS!k2d5&YEc$d,4c
)C3Ch(GB@daL!2Z6Bf5VGkMGjiqiC%#Q!Jk1@X4[Y6%%amKLMPiN!9Eq#2cECK2+
aTBi(&11k4hk![,-69Kbl2hCPVZJ#5LpiJ-(EC8AcSApHbkei#SKAcEVfZ10*NZj
c1LFX#jHSr!-JI8J,,8BeMJ9C%Shb0ZKeY6%lq,JqUTb(G!adMRJXjYh'D`apB!0
`p6ml6p9ENfMhNk@kAJb[[Uq%"HQ3!*4NVl&cYHUmNHp!-3E+j!MCGk*PleTCDl6
GIJGIiLklQY()h[`L6Lk-%Ci)!(Mr*h-Y9"$4rM*mPEm0#E1$pP'iU#p"4HA$Yr"
NjZD5[cE[230,6MiI%R@RPZYrYIh!!5Q20Rm!%R1Vd#N0Af6i"S,pNX1@E2a9qdD
K(CbbfXaSU"YkV04NSmF,&"`d@@Y'E`'3!2-KQ4E$5BeIN!#-1YV"$bD-Yj!!H8G
VJXp81pB8U1mLD##rYa@UfhRH8%plc9&#@pDr)5,k16`b`&Bqim$I`QGRMm-d$($
6)qX()2MG,q$$&&$IJ0E*$2[e`C!!+&I3eT%JG141Uh33hkUS[ieq[R3ld0GH2Ra
kHbA`p`6-GXdDA*i'JmGk"[r(R&1mmrk+c4Z9eCdZ'AQ!p2-hE!IGIr,S4VVEQmP
iN!#E#iFQVLd,jQU*HbR'@XBhiNb&Qq`@++U!%LQ1m""LYr-l)Y8cZ3bL4NViT$k
ZCE9!RQpYMI8EZfUGH1Br$*pCqM3i1aU&Q`haGFXl)JfR"b)$$ccBhL+iiBr4S8q
QpbAiM*BM',BQ3mLlpAE0ECN@iTQ((1,`-fQj'YJ!0kJm[2bDHdbVf9XP9P6l5aU
d9"*[l,68F0m6rVXB+h$e&,,r,a$p"0XX+R"NF0UHJXX[H-q'1r3`6XRClf!X3fZ
$kqSrUJPHaq$I)+@Z*Di[KEAU4BGl9$%@q4f0C`RAT*-EV!9k9LfbpHGK-abS!A2
J"4CRP%UUK1b*hD,k@h`brjiS8J4SrR+h0eLjfY5'Q(TA-RUbpCaVBr"3NDLSc,E
9GKf)C-iAF")@R-GldVKi,e,4T1-5k2'+F@Vm5'U+(XFZ@`lkCBV`jaCQhIH@F0T
c$5ZXbK[m9e8Lj!da*N"hXIrQBGEV%6Vq)[2c[@N1FGBG1!JQ8+pPh'Abh"4&GC*
3m+eeAh5cam@TCh0k%LFZi9#a+-h6-X-`Pc5YrcfSERjY$PMpfkm&ZkfbVjfkNTX
2M4d%jdYP$)Uj9Jek-X%5a%lITr3#Ar`00bS@IfNFkZ)C2KAFH"4Z0PD4kjkVK$f
[a$G[SU#XTdhI6&V-$'Y$9j6XlE!K`2i9FBFU4qUE1,f(Sl"XQcTYXIj9B@!hEfI
9P84h3keIja@qrbRPUM*D5FkR16"`16p8fb!fE5ca9Y&*344N2#BpI&2hHU@B,T9
C)FGr8-,M9bSbaKp@M@,[Hd6DXT6Hr8b3!$MTkDHk!,4PTdp@Y69jpEqXe("lCrF
qU$hK9imhapp+Ta61*&3SCV!DMV`f(ZH4h6-i8k%(qM589TX$CT0($G@T25`3(N9
mrU'Q2([kE1ESCZAX`d0-Hi'$h8-CD,dUP+L@e#p3D%JY(5%$YXAY059LPfaHmb-
hl4Fh2a"p(3C5K0hc6ifAXeAq$(P2)[1mTC!%!3!!-!"!!*!+h0X!N!E,I`!!JRR
rN!3!N!UPN!3"!!!b!%#d(A&fYr3`NJ!!bhm!!2&-!!#[!!!#BjN!!2%F!*!(-!!
!G'X!!"l4!0%!0!)$!H8"`!!2!!m$([rmrqA,4!!!J!#3"k@3"!%!!$!!3!#3#[$
'!*!'m-B!!$TMrj!%!*!+TC!%!3!!-!"!!*!+m-B!N!D[!*!$!8rrN!3!N!UPN!3
"!!""!"#hmlTeYr1kG3!!V`#3!r,!!*!$FJ!4iQB!N!j#G@PXC'PZCb"0B@08Bfa
8D`!"9%K849K83eG*4B%!!-!#!3#3#S!!N!N#E!#3!p%!N!32!%,"e-LrjBXf6IE
@[*RS$)-CAAA,2Y8F3TQGqX3NQYV)0bB949kiRNI64C-l'V%JT*XMZj0B'X5U@Er
aKkiC5cL$Ll9F*85hjEX2am@l$ScA'#+e,GZcA48`X94piY@jmbHem`Q`QCa83VV
Qic3#XRcXB'(XC+k-Y%KqY&S,N!#R#pE&XCTMCaI9!l3+'ef#[a2GRjF*'6`4kN(
KMF4B2L!m5-)rE4,*h[YGFrKr"lKTmQp6UhXU!c9rDY43!m,YdUL+3Bf[E1aAaJ8
H'L8'QhaNJ+@3"!%!!$-!3,EbmJ'fm[)"!!$aI!!!p9X!N!0b!!2dN!!!!2-A!!!
"c`!!!N3!"%0@8`!!YcS!N!K!!*!2J!#3"k@3"!%!!$F!%,EbmJ'hp"SD!!$b`!!
!mi8!!2,!!!IImJ#3!a-!N!-6B#N!N!4&ER4bD@9c!!"M[P4&@&4$9dP&!3#3$i!
!N!G%,h4ME#q3"!e%,h4V,j!%$D@3"!%!!$S!%,EbmJ'fm[)"!!$c&`!!mr!!!2,
!!!VDa`#3!`d!N!-0%p3!N!45CA"[FfPdEh*j!!"M[P4&@&4$9dP&!3#3$i!!N!F
[BhCcFQp[G#pdBf`0TC!%!3!!0!!3Y[,b!EId&53!!21&!!$dd`!!mX!!"!"R!*!
$1!#3!cM)d`#3"&*[Eh3!!Bj19%9B9%0A588"!*!2J!#3#3&f!*!$43#3"!m!3X(
9'r8F&j[NP6c%-XlSeQFR96hbCQY+(EpV8L%)GL#J33C3kEr[p56q'N)EdNX$aLV
em'343ZJHi$dXrX()N!"k!LNd)$T`Ff9bGQ9b1Q&ZEfjjE@peFd"MGR-ZG'0X,R0
[GA*MC@C[FQGP,QjPG$S[BhCcFQp[G#pdBf`0TC!%!3!!-`!3Y[,b!EEbmJ%!!22
`!!$e+`!!mX!!!ha%!*!$!3#3!`(&`3#3"&4KC`!!Blj849K83eG*43%!N!q!!*!
($D@3"!%!!$!!3!#3#[66!*!'mX!!!(CQrj!%!*!+TC!%!3!!3J!!Y+*M-lHRN!"
2!!$b`!!!r(8!N!0b!"+Qm3#3$N4bB@FJ*L"%FQp`)&4ME'9dF`!""6pKC(*`9dP
c5)8!N!-#!3#3#S!!N!N9Z`!!"UB!N!32!%,"e4c*I1qX6@CD[ql!B3McI3A8`AI
j-Ll8b6NJ1ET3hGY[DL*f9P3%(FS*ImZM&3N'Sr%i%HcS8@PG4h3YD[Hd6#Pkr[r
#N!!@"R'hL$#FQhiFCe0[*VJ`R&GVc$f5KjF+9%Mbf6TEQc0QCbmhJP'*A`&EFFp
B&ZQdh2HBCi3"b@,c,V'@JU8pY6La(4Fb%EKF5+T4&Y+[LhN4*#"LkhJ6a-VH@4i
YcT%fI,GfbrPr%i"GmDfDV-1mh15Zp4TrlF$N&1&eXiccBkS'(*JlPF5(5CkE9-B
6G8VU6K',"1(*V5dU-!L@r8I"A9TQMibAm)"`dkRH$Zmk[lpB0m`dYYfA)Vac1,5
I`G$##eCT5k,)M[jfh'U(k#ck(e2Up0l,aNND+2SMq[)V6Zk(E"MdJ0ahZIC&BD#
3!,*,A2-I%"CleLi%rZb#ehkbq*Z&RUVe4&*[&&IFKc0TbZMV0QG)#e2ef%@m3$-
L$Vc$GM"KG)KrYrlV1NY[j-VieF3(l)((F4efSIcKDmpLiIQ(YC9P09L2i3V*2[[
GNU2!j"G3pHY298k&F9X#EkBH1Tq%cU"#FAGmQ@mqp%mH[02XEi4brN59r(!*pqD
6ak&FX1CM%STq$iNQ@RI4r#mch@Sd1"$4`kp1%EL2`'CD,N(L3i-dMl,'2'm&3C@
(aV)RIFI(&Kld06[Bia3bF[eSJZJGLUL4`Qa'i-ablrSq%`X$fN'YiEcHA+B!A*R
+d#8Sf80kYmBF!&C5&U#h@X!+Crap4jHLHk&EFU2Tr5V2+`U9N!"(C(QVUa%5,6[
*j5T(4N#FcJ8fi,)Ma9DJ"hCDSSF"jTHc&akHb9jr-4S5H3!qfGhrPZAfbI+jI+#
5TQ"UY1q#$M[ZRZdU0[S5cI1HVrC#&j+b"0UIGS-+"YRVkTQj!qVkS'm)RF0PGNj
FA%6q3HL%f'AJc[aF8+TV5[@YG6LfhEPC1[p,mb',,&eRa9$XKHT#NL-TBhSN-fh
%PRe@jTj31FL0VBIlki8i,VQlj#fRR90rUa+%2V,1+,6*FaiXrE,-1ZAS-&KX,-4
PL'Zjj0D8A!Ei)62ZaBdHV-1,V)lh@D0,rPXR3M-!'4PBUU8%c&#k'q6B!%Add6I
3Xr2eJ`Amfec+2jiBD50'5U&l[-kVGHrY'bKc$0"5m(j4MN+QXc%NPlHY%lIaPh)
Z9lZfCS(&kmrXiRRl1A$q'`(lVe(EI$4CGXQ6&GLZa#qB`4Bl",6k[3*6-"#1+jR
V4!&HPU@j1U8a6!UpLDQ'AjT#H[,rpX!k1k*e5!iP`[rbDJJ(H&p'R-bZ9"FCZ4p
5Y8BAJUjLjTQ[&13U`3e"8BcdX+[f0rPbA%@dh-Lcl!dfF#@HX2+6,XmI'Y#bXTR
1PDSl(FUG9@,k,FGf%i%4A&fR,EN$JjV"%S![5`(@fiYq#Y!DkIm!hcQMC6,C1P@
lm$N*cl6Nr8f)Fm)GR5$B82Q)XBrVM-`&(2+d5&TGK#2CfBPp9dE*GM4bj$L6haB
0qE#RTq3M(FBhL8YPG,CBX,5f5YheQjHPP6FEI@#I#jde*c5pYZ$8&6*M#Yd-#0b
`Yikk"TmC@Ucp*$S5el&cJ(!ICE3TZXDjEXhKUPX0ikLV6`V)S*K"fhJ#'%mal4`
dI#+EZZh82a,r)SrR%#H(X$YLFCd8C4a)HfTXmU8Z6,'DK[!UFc1#54hq&X,)9#-
bb@H"!mAJcAe"K4$!`%a2C#!`b8aff(HU"&R"'bHpj$8Q3Q#@kI`ih"F4C-mVTcb
MhUQ6H!T5j%1YMa'aDHF(4ak)-CSak**d"TP@H2R1mLeaEm3H+R`kke[%MiIZl`!
G3EThHdlk0HfpVJT41iK-I#ir(dP[80CjY$GiiaTr)aqKK,8eX(J$*'819+He@qA
Gp#5Vk9blYT!!"pN`0cm$%bibAZj(@Ej'8UCECE"L5cZ1'M-,8SfN!"SE!Y3F#[Y
(#5qaU,rhHI@SadT3#Y5rpQ*jLUpbk'f3!#AheB%UI+-8Lk`VG$N[p8kSm3Yb``4
q`INI'[#hAlAi06lPZUPEYM)0UV+88TpCU9Ui61!@'E0#-md1L6MZ&iRUmDhXcfT
L4qYkJZLD(M4M"KrXXiN4(l1E*rfMT9K-8i"bi'L6'X`D6h#4F#Fe&-ZB$8(5aYK
lKZ*fEi!3,'`aQ'qYSQ+3!$6%NiV-2X%kMCqFCSU9-*S`mMZR*3'#XTQ!5SPjM1"
2QcpmrF&U-EQ`3Zf@Kejb2NGR1YI&YE9S2AUEQqf6UKJfp0i(P"i(1EFc"TI$FZ8
@S8cl98#PN!3"!!""!"#fq0V*Z#2G``!!p9X!!5PK!*!$FJ!4d*S!!$i9!!!9C`#
3"!m!6@&M)&4ME#p8Db"5C@&NE@8!!I)(9%9B9(4dH(3"!!"!!B%!N!U!!*!*'RJ
!!"F5!*!%$`"#`G6*LrFGfXb#*VSG1"qLe1Yaj@H,NV5IR4Z4ER(lK"ImC[S@#4*
h%*c@X&6&aLpq43E$j$Y"m%r1dmIAEN#XKU@if%ZM6BYd+KcK0F$SD5c0"fV@$$+
0q#9r$%mfYEDU8(%'f9YL6EpJ2NB*fP'ZPIJM2)IVqdYLKA$+0E%D)Pba4ifBAD#
,YK("GXHCFel@DP6Yj@IGmm9T4JVfYFPS#rKJadAlVcD,lVefi@p$)@aSZ,NmZ'k
1Uk1m89e(R%"`IiB2hcq(*cqh9BER#+%iEPCPc6*2mPjiNj+*TIUm0Uk%hBq"1%e
dlZ+MKC!!TMDiG[F#"rf[8("pkMk5eA!SM5GU1"#LQ0LUi2mQmAVD)Aj$rckVbVm
rXH!hUh3DA*!!3rcpMFr[Gql1qTkY$*XIb2K3PBD+K)YR%K#*0$'J`Z2ML`VFQlM
c(h04UPh'3D"P6LmX'(BB+HdrbD$Pq3EbE%p`NQNC#(4f@KFb[['iT!2HNZj1EMc
jHFE+eA9J![Hdea`"JaPj)`,R&*!!&K4`A4#X'+)J3,H$T,GU'Vh8""A%5-FmpS1
190G*a"851R2"2!XZN!$"derrCL@KDj!!2HM4rF!*JVKmZLIQh&#PXG`D-([akM[
%9N,A('q'f!AN'HbEfjLP0CNZ-,5IhiUEl*B"6Ye&3h1HIN#"i"S`R-%TBPHGH0&
0p(qHeBDi[fI3&$"H$!6BmbIVbd[YV&DfB"kHd("3VZKf3PEP3mqYE8'G@i5#cZ[
EecM"C&-DY2H[FNPEL0KNj[c"$`N!k3i0L54T4A))!1Ml96PI(b-T8!8+G'[L+$!
Y`[-P*Z3+6k1"cKk#13hf!b@R%0N8L5&$E+ZD+9MV,K!Ah5Bpp8JM4maLp5,L2#H
6mjr6,'LF6hKhDUC(cTLjYj)$*q8d8rI'Al3!a5SY!`)$2$K%erJ*CCTEN!#TBXD
ZNHR,i3V2c6b1rh8qYY5`4"XqUFiX3R2G24ITC-RX%@MVq6AfcRpR@!998R$8fjF
Q""qP*TDp&)4L!f$rS5C&`)HDLal0UlQ`EJYY'$a!kK8eqT`B%hPNVFXK9LiK((5
M-eLV)BdI[ieq9BIDV-kZqBd3M5mRHiihIa@e%cFrj$M#11riZ4qX$2`%AV4pGDY
M#b&C0%5[VbiBj[qp9HGG5m8iV8peSrIaCcD#MdQIr[0!9F&eiK1&#'AjUQaUQQ1
Jfc4FhYSTdcdqINMMX#Y!&%8jC3@`0pA8Bb5&Sa5cC2[&jhYjm@KM0028Uhr('*9
VaL*%XN&*h6"2[%RJdh-0CbNTaV2bC(Z54*pE`8QXLH$iJF)!KP996dU0j23'UZB
Nmr%E8MZ"Q$Sh!C2R3lp0b6XZS86ccG*TT&X%MH8LJJJi809fqmT"f!Eib%[U,j,
D!R#$iP!P"Lr@"GC*6Gl"GZ*PpXYF,9FRk,XIqbl`j&r#`aQ5JC[S8f!-P$-TI1(
4Z,8iYHA("GKr0iLpS8$K1j%iLG'Re`FTNViQMQ#T[#1Q@ZU4[6pU,Fe'D*A0p4(
[VJk29JTf$`A55QKS1([03LhRc2X(-"#q"+FC%Mqi@LpM&KcR[)Y&J1+*6YSkG0r
r8a1'mZXdm8PhU,NY,)M2c&)43iTAUlI6N`FE`Ph#2EQTI)SM$be4+`q,5q-f&1V
QFV+TBZ4Y0MCH0G)e5&#Hh%-DH(29`8ch82d1rp&*l#FEG6[TCq&JETR'Ad@4M+f
ddU8XLIE4),kSieP"*IdBhp!,@GeNhFd!'MHhcAYH-RBrBZMPSXf5VQ#kG&V,MGa
MX'8M2QIfI(N258P453N'+&JL1pUF9$jf`Dc&2L8JD$6mR#JN''`j*p'8NYED2Zj
cqYP)SM["6FLS1VBK#C`aCCfqjU!G1m[affa(HjDf&NGd)ph*l"d3'G[2UeM(F+I
Bd5%Xhh$ZYHm"E0hp-"SBCipfd(JEhaHiDKXV,3r9pB`@)"Vb(k-'T,*1&1Pad'"
bj0pT02SQ58J@c!pMPAZ("``@l'PbA@kq8V64qKA&*XIl#Ea-#9C%4H38d%PZ+6q
*aDpp3lY@8&#GZ!`HXbRL1e1"AHZmT`-eePCD&4G`U0Z&Gl!mYNDVGNRVe8(rr9i
Mc8,Bmq3"LH9TQi+,mSG5bHqIR)kAELE,F'hrm-!aaAbBU%4IcqIl@40)*GC&k'@
V%GAikh-1-phQ!YP5,TSMNVY62YmrH4D3!#F'%bbR-fK5d-Mdd`-r"1M8qm+IDqF
Z5*0m5UNejpB,00%c)cN*ACKcmXZ'E3[Y63`(K#Qb&3ik)RM`M,p8"EhYF"P2&F`
!(JErCf)XSak2aI20#Q(IC@K*[lJbleDPb#)53M9'4pq[492hCVeC-N6Af'lr6)J
`B(TM'jN6&[)F6-VBHY4[ar$iTV%Tl3AfZI[jHSaS9FA+bA%qQ3$3,K0pChJZeG"
jXQ%k5Ed)Mc[e*9Qi`K*2j1`dl63bN!"KCjjiZQBl*,6ccmB@Kp!qRj3BLY0[1rB
-a&(Ac5lS!L#3!!6Ql3X$*8Ffl`PGjNT9+*j`1B4*FI#E2'eRAVH)IZR"-#3&jfE
bJaXLh-1+e@U11$TlidTQr8UDbGKAV4j-hBb1P4jZ!6N0)EDG8*++Xb1b*H(0CdU
BRm0cGQ)JDe$hPi$MM3[S",IFUb(+P&PYGS!9c#J-+"Dl61Tead%b14T[d4-r1Tr
ha*I8[+E`d5EEUCEK2Q6C@U2T6HR2'$+e1&KJZR'G+8djA&[XK(!9,qqY9MSd`b9
S@!mU-H@4`6$kbDbrX#&rcNU@ZMT$J`"Y$p4908D4eM[p$Qp([SU+(*8Q,Gp8[E@
lATk`RDN[%(,VfB5A'q[8&EE)8!@G"'c1Uq+Rf4JV!VN+'e#d5Jp4a&"jLA-0fZN
U$%Hm'CLlkpGJe*Z3!#*(r64b,c"SXpY%+rc0IRGAF%$TFaIQY+2pTh25mK0kAV"
p4qb#SYN'*`,#E"9Ff&h`iDQhN!!dLG&+)C5!ikEDqNa2@&M#SS5T3(ScT,HC2bJ
M0ql4AqjfE&R8FM2iEh[1%6"jZr2ZpMG'h@cZ,elJRF+,Qq0L288K,h)TK*i5!am
)ZbG'TPQLIek5aDMTD*9f"LUr9Jh`bNNN(,q(T)fNX3ZrZcMNTB@@1mP@G4[kc*!
!bCG`'hfDYp8&R"PYAfBAmS3jcG8[kmZiC-LMibm-Sqq%"TfVGN1Ak$425h*j0Ua
f(R,-#Cdcm`MI6&FP'YA1NL*6al4ZFDP9[Hl@,'rrF-($f#$-T95!5A5AUeU[pQT
jC!Zp02$&[I)YfZE0PNTNe+)Z*0i9Y0I9lHj@2q-B4eD#AB4+Fl@'8mSa&c3Bebq
F##**M5!!'A5hmpGTSfbC03CZ!eebd4#1,*JCE4JYTBq"lb-MfaA&X'R6@-Ueh&h
[K`$Z-[9,q5j%db!R-U6"*mKAVUD$C(!HbZ`BLfeTM+C6+VVqdpA*MT0H8J+[0CG
Y[!@Har!lADS4$p2-Eij)kJ-bJJk"&kLrQR,Db6[A-BhZh,QKjrkcU6Zp!(UZd"q
j"&VMlY`JZH$1C10S3&pISEj1,1ApH%+%39cijDj,13)6mE4K1A!@[89R-YSLkGA
`2e&kdXJp6qi"a%M"`3[Y5-"[,X&bS#'"[hTaa&F1N8XNp6h&Ime39Ej[Sh5'[Ce
e-%$2r5B[L%Nr%K5VcA+#P,QQ4`lbL-2!03)Y@GVjKkcYI"GK*lLcPXKeCmX3r@A
MTRcUDa6Nmd1a*JqNG(1,A2XNUUhflXS#QSi-l'mXEFjT2"SU&e(GLdbNll0QXQ3
LDV6-%,i4X)jV1KB!YhV43NC#$NB@dMmK-!FI%qSJB5P%lK(CI!h#-!"laCi)JN3
dia,ZKRP,Ma5GH-VZ#!QF'J)!MjQdTm+*4$Z3!-2VL,cZK9fH#)X,)jMY`"*,C#L
l`1Y3cCBMi8r+5ec#**%a('1JTU5Dm4E'U-Gj'dY"E$kH6*!!A'$r'!-C,U,"[I%
L1!X2XqN)K)M$"jU$(4NrJ1JHme@aq(A[&i3#YBBX6Ge5dj*%aMrSmA8+),4mDIZ
k[6-cN!$ieB&5Pibp+kAZRZ5p(&M)LB4[kT&)Xe3')Gm#56@XDXZ@MdPPAQE3b*+
Qmi9T3bkUll4GrcjGA[14E%[Dj[D!-1HGNF'Z#9LYE1ZBcYJHY%iNR5G%iDP$frd
CLI"#jI"UR)mIk1DD+T+G6'&%JfFeCcBGZU13!(kbrBTTPDm-4[J2(b%KH,1NFVF
KqYKEd2cS'1HGB,5L%GQ6IQmdP4p""VeB1f(%a1Y!VHNI3DX`k2#fUAB66HdLG-C
LP&Q@r`,2*8+T6I+Q`rUC&a0*N3V!SR*XP'LLT('l1a')"KYVV"aFd6#T0l[(q83
YjK[Q&B%3iD,"(5kGfkJM,KL,`QQ"FY-N*YdfQ([MpA1B"SFDDXUYUe8#1bbV[4m
3'&@&Z0,hY*lB#Qm(PZbG)"aU,9`Y)@Ekfi-Il&#F`k%MaLbM3HUDf1,NGSQ[%8#
)0rTZ1,6GF6AbP-EjKK1AVj4--V-#'@kSkCABJI5A"!Z3!(JY9@f3!"ri%4D4mQ%
2JH%8Pa`4mm"c6N*63&Z)30kQeTMe$+,8@fJL4D2h5QT6Kd&mdES6VBliafN,1lQ
@@AkIpNTN$hpLp9%`I!%*EA2"QKVArm5pNN8fZIf+"j0-hl,bfEbY484P`G!'LM5
Nd666ILAm&@F6X%U,2DA%43UcTX!HpjeVi8j&&L*lB,6G'EYa82Je'qF&SjT[VaD
D#E@6FY4h-jeCpEU[Mqi%6Il89e&EM+La2%ePZ!05G[*$FKd*bReVCm6@"(CQQ"Q
1`+!"hF"aD9iLf"2b5@C%$+lJG+dR`d0r("qAkN!ID4i`I)[dX`m[ljU#TK'@e)3
Sir&RaZ&`rCKND5@DfqmM$+k,(VrBMBY[%,aq$iTEPeH,BYc`GX,NDLJeX[Hp%qT
(ple3GeLRD&"(6V$D[iYRMPp%%N88*i,Hp!hF8a!rKdeiqjG[qr@"MQCrh`Bb9dI
*ir45(`F0NZJ6Um@qGDV%JIl5rT5biNh@DKhJ,V+TcAa"a8U"m`B(pp@GXX)X91q
209DI(aAD)%&#jhPUhTR*33JrMYY,eVrYh4V%Vr+H('XbTl8SJU[3U'IF%'NS"ep
dJ9C5D,$RlA,K,!lEZQN`!m2D(`KKhkM$(Kh3[H6UI-hNf9GBrH3%D@4c,mq[Khm
LT05UZV!3mZ`"KlpNr*SACV#-l)X0QK#'6P)q&cK$%f1$#KcMG8)rNbrEhH[$9d8
#p`dC*12V!QIBhe)BRe%S[DHS%Y`2&[Y+(Z8hm"BP&NRk@6hI'Bc#)U3iEj*mM`h
Ej4YL9IRf-KZQLc(EKcD'CkS$aNm'3Vb"R2J44CE#'cCIN!$)+Ph[beNckG-B$[h
XU&KY5%i!a9"$44LUF9"rf0NpUiD1e2fDH8a*cckY6rXLUD9%P(pRF+-G,$2XjI&
M9SXSQB`k%!3c!drVe@%Aja#66mGj'%TJFLAX9+Rc!CjKcD!6EB("MM*NK8YrYhN
(-C+Mdqek6f!5BKTYCUBq[bA!!ii$'CZ)CU"QV9qd*)(d+RfV&SGII&BkQZdlFCK
kNYN6EZL!l&$qJ1lSN!$Z%QSNF-rGE2Ra,X*k1b#FYcQ(ilGp,f6d0Ye5c2+!BVY
$k8P5a+8A'e6Iq0p3GBE--&G301VJ1k`'TF@Yc%'TZf"6qB(C36c%%+@afX0Tahr
C$9DVemlB1JHKLr0IX-dCGZTaE5!c5IS(p0XDN!#Qpk-+RG1H0Vfilj+k,Z'Aj',
9+q*@DriQ@6hTGf!LlkXTNV-`f+aR"lJP(B4IHF1eB+"H3qd,5TSdMb!*!@iGK0q
bmRZi#*F`aFKMBEGM!1LBNKc9Z@THH9Mr'U[5L1"1*jd'rT1CPPNT&6B%&L4$'+f
$6G0DqD(HT0kXp33E!p[6Ak,5i[0YDRfES#C1J0LLiFe-4*c,I$(ljHL0[fECLDE
DVfCrDRUJ1Y!CJEU0%TBF(@+%()hpd8m[dJH2Vfh#`lLe2NdG5F!j`k"i,&me6dc
rpHdE-PE)RF8d(e&&PT`#K"iTMBi[4ESTYq"-Aq!fQ`XHB9fVB"DpHc`BRS@#kS)
lZ)I#$8kCBQ+DNiX0Jf)K*1j0l$aecM`m8PG0[*BNT60AVa&@iDU!mp6K`k2ZkmQ
kD[Q2CpT$YRmP,&YA,Z%&%je5R6iE2b+1Z'h5q[laUb$lX2c#X)Cd2Q"H*M`(hQM
2I54i@&eeRk@[T,"f,Nr1%XT6Jj93P5V%6DUi!!pjQVAdZQ4H4A$Td"&cCBfj&Xh
JmJL`hMmPl%GLckX*rLKB0B'LreJ5H1aCMRIl`'[QAeC91d`j0C2q&!4&p5mjf`R
Hf**DU0Y$ZfN5R%cVQ&dfjUQ)e,AhI6cHQPh-,S0KreJU,R"5mbTT5eVifZC4M)B
!ck%@MAiFe#pT2h-(jGYF+L86e0`J#C)32Um!GLRfU1@fC#AGPI*1G0#*%[3Z$R(
94"PY(QGaPZ3(Abb4'Djk0qq+TmmGBTP)bj,MZBbB$5*["LF-+5A%qbYI$+MV[Z[
bRY@XCk-&*K`'GHbN9@m'pd-*"YVibphQ1J%(R25$AI@G%h"Z"`VPdR&aHfQ9(m-
bZD5)*iaF6-I'BJ69KPXe6DVJVMe,CF*1QGI1Fq)HSY5MBF1hkK,dE@#p2VAYDE&
S10+phmFBa"l`)#ZMMGK1-@Nh)F1(pHId*+P-SQ8k(pQlMb@VCJ0$cZL%r*TP&dQ
*e'c!8BaAL3f%k'UaAcpQ6ZC$4E-HhiijK92!2c9BD&+$#VE(3iBe14QVcG`IUc+
h"fR`Ab88XlL@L0K)HEN5qSjRPL2Y)#1jFTm#(fA92!mbN!#"dIph9mD45bGRI@N
jUiD"r[aiA!HT(&Yhi18PiZhM&rHjQIQGpEf'CiC$MDN8i9P!eBq2NY5he6HEV*%
ck8Y8jfd[`8R"CY"VVBb8a&iC(0'%5jrS54S"XQ[L66b*cYVlCA'm4j6i%,+hI-F
8F+$4jhB@-RSYRCjNXY1cENb0'0-lr+'3!,@F$*hiZDEeVZ#HAhLbKk@4MeiLa,&
Tj#CaX0RReM0EF4Jh50beM0J55r&f"HAQ@p4q,8mEeaCd@)@NkNAYHLef&I#$c"J
%Dh+SBS@N2Y,qb!IEMjp5"`B8S`99'6ApEh4LQF(E'UFLI-F`MXCdfE$KbAZ0ZD"
`FZN+ceaRZ26L89KQ21d$ajj@R-qma'&10pk3!-a)$j,,cDQdHbfd,`MEQ"T394q
@#$qhV83Q$3$E1r2i+1f8@[d1Q9A0r5GdHECHaUXMQd)A1+M![k)#3PPJe2JDUEM
Y3KYLI,Q%F0*bairNK$'ca5*!(EHI3`Xa`L')5Hlfdhkl!r3bke4'5PU9&M+G5D6
QJQ3)`i![q8Hc6!+-B!+6TjGSbE#)LL9bTMK[J@XIAJ2I8IbiPPS!LI9)"%bH)(q
h!e"*D@F-56RdcV')phG"LThSBiFR(i5&S"&41C8)J(dQLQ[HEiVMI2"B#ZF!Y&Z
BH9@Q%cm)+Fe`[ZC@CC+YSJq2bZ(rfX)q'I0I-+(E8L$Z6""m-XAYr6H&UV*rN4K
I5-#R!@2`m(0"$6p3IRRj,a*p'mr!ik*eYMf6)XY#m+2G4#'fpJpV@(m38$C`4q+
K#IbDCSb1A#YU*4Q#8QpfcNC5f!0e9mS%NQd2j+aGRRDhXTVq4r*3T(&m31Y)('L
R04PVRLl'0Sqk`pb&"KjdG#L%FQ&mi-Vf6(AEXR+%A34&Ma-G%ErcTPINq32(QD"
PKS-(NHc$E2'QIEZ*DRrUQJM-0L(%p@AKGSKS-A10F'LMi+1mRbNa0*8jdh9B%p2
[AT!!+@Q2V1h*5Cf'Q#[@501S`2`AGMNqYHVZj00'@eKXTlHL'-p`rCp9HcR!*bG
+5DkB9fB#Vp0RP5lmSF')+M6jRr[-HMXQa@h,,faV24AL%AK#`G4qXZ5LMY3R"A+
m,ERSRBdXJl+FYPkK@@"3qZ@Y-fcC6"$U+YJhA'NF*bdejQJGc&D$DMi+m9UR[FK
*b3M15%+!bpLUSRKM#f&ZP9aR1TCdAGSD5&%9@RM@pd%9k*JXdheYd@+0PfVfcAF
6U'CACED`j*Mq@!TUHlaMH#6M`Q9rEJ$rNaYcJC0q"XF[AZ!#[q4SX(ED)l'r@jc
Ri3$PEcDR&PU(+!qkIrUmaC4Le`kDdrpFcmjPpTB(cm%q9E%&cij0rrqIBrY)H@#
QXTpjm(IGpPT16ir2"R&(jpM$*@&l'f'6USkXGielAUV3+T!!HQBU2&$H0T+U3D0
r60Bq,lVR%M4NGp$UcGA!NEFB8cZ8VDb"cNDiehl(LTkDX5$ra[c-J1`U9hRE-FU
K9djeEJi3F6cdN6V9*CiDQZbGF41dZP8K'i)fE[jBC!dq"*!!A6fL22('b8$Z6#e
TNlV8$AN-0M[VpD6RV$*CfcMC[MV(%D8L!68TYqdUXR8D6k`Q2El5pTqf-!00*PH
6@MRpQpLJY$Q2@d9PhaB5Q!a&N65'*YY!FNmD`miBrMaMTHcmK5`2M+fRbDiSY4Z
VNJf,LQU@dM6JmY'-*E[+**4C'D-C4T-&j!ii01X!iV2L,HdNl39h4CfLTBr[MX[
IhEBJ'-IS9rf8-Km)B`@D)2fak#baj)Lal&r$(E$i$q(j4,m''&X6IckEM6X9'aT
kNXbl&8pMD#%4Q1qRkf5+B@MpI(E'lr0FKGh8XbYZ!Yd&IaCp'NfU68PqFFr*C4$
LUUM,,B(LeGf4XaRi!A@EL"&kRkcBibjbaXkR2"UNJhf0LG%KaJRG2ie1*VhP4p)
cP9*#MB5l[jd"RIRMFk+"161f5EKe,3SYH-)lR[8BmSpaAmB3!EldE)@$#5k#f,c
Ce+4VDC+92l0i*R-Pk0HJ(B'ErCq`pkep!'D1)6K2'[)DC)hN-SEYU)%fI"V&cYP
R2jj&hM&jL1I,AL8e0l*0H()8Ge#@rA[cH(4@@h(f3$d#&mQFRrJ)jCT&mG5GGr!
!M@m6b2+S0C!!9l9f2C)+TI['"TA1r,0r([$%krY9KIL!,eLBL%K'3SBqMJiredY
f-j,QIl&rI9c4H9!MBZ%2`HXbM#-A4Y!iKRYNRZ)M0fMYJcGPTqVk*e2-h+VI51m
i'6ipITGfNLQ9X`$!!E4Y[&3NEme[4R`p2XX4fY3Vj8`&[j!!a#AK1#'k@HV4UB"
UCbf`hML4T5K"FD!KUT-KUFTkd%H,H[m['@38X8bir&SP+Dbi$G(arPBVmC!!9PZ
ikrG(#`dDE$dIBh-pVJHYUphcAdabmdh(I$Dr)Mk-"FNbD(NJA,a()iYV0#YZ61G
+Xi2b!Q,%9@N&Cl60X$9p&R[r!R%$Pd*NeF2,LdMGd`(-IpGJM#H'[r@@M2'Z$-D
HU[Mj+qU%19p5N!![Q*f#D#IIK8&mea1m1hl&f*12Hh6PU98ii3+*YEBZFK-2X#H
a@(PK-aUa64-!3R#(9L3@@6IcmHk4a"%8m(4i6'qT#h55a4[0p35`GE)jNK`T$lp
iJ"`9Zq!SrjNT4-#N,N4E(h8M+iJmddqIAB6jcBURK*&EM![(,cSdh,K3+Q(XJXq
V8UJJ`emKSkVPV6(X,Ue,)KRLZ5C`U1QR("BKh9r&ZDlDRfI6DAAX!kX)FLDC*&l
6%RGrK(j3AcRJQ4cX4R&,m'SE6*SC9-"+Z3bPC4PIVM9PZ+qF'&$E6!RpJi8lcV4
pELSrJ"#BBkI1db34pA66Udaj&bfqfQ&crYe`+dFV+35mL3MNp3l`[fC(Qc5CT9'
-'3E5ZKcN-)M$H)a1KJJ'INLLfPJ"AAl0a0Re5BYX`,c$*Vj9Y8Q"k*h1)H`VDAS
k!bfpG0,rr%`$HKaRdZS%$I)l2QpIjf*h+JreHBZPZ%UU-0Ji4mm8Y[cC#c#$PaZ
iqhTf'+qH+fTKICbcTdaQ`1Fdh`6(C#NFpbfaeHUMXBMSV(H2i3AXD!ISTC!!pq%
iTX20@5@0fUf9U)&6F#4cPIRXpB2aV`%K1)!8%rd,cXc!dZYCUk1@&4j9DQZ&E6d
4Y23T(jC'5@2Q0cKh(Eh`K2@mBfQ'YAA)RmcZ6$"TEA0LXa$)HZPP$E2F"Gc4mdG
IM4,Nj!"iA$9l-*hZrpFF!"39-`)8FBMfQIHApKjEM2`'%2m@aE`T*&B4&mQTEkQ
'f[20-e[h4+XR1))0b+VY!EQ*Q@e@bX#)&EFSA!Vr[KBE55LAYMS!BmEJb(iMQ`,
Ab(h&)NJRiZPpMqcQ&lm2&MVd-U%)+C0l!Z#DHcCbHd#DXM+D0ECK$ECMLmRG6He
dULK)(kLk@H5[MkaArYD(1Xcq0KeVf,TA#f"U(f%m0%5HBD2M"F9(iYQ4ZL2I'&I
TmLM4dYP8pBcq-46@pP0,F`p*KT!!#Ilphk0m-BN2GG@*)%5QNM-5KUH@9"l*(lC
[SNFM4BGJ3Mc01)"r!rB8,0,3cY!U#"!50H*`26#hYq9c*HDr"USCG1k1CDJF!)J
(NVA(kSHk*cBe3h1c$PGQhDb2E&Ll4"R1e&%BK,f)p44AXDi(RC%UEFZ9-paSCip
b25Ar4D',)C%*5MDXHC+d!b+"qI5cMUPZh!pLGCLhDh(BT&m'Sh6)jEJ3[eLN-AP
5E[+e2hC(!1mE3p*L'bNkaG)NIV"6+"ZEb2VPEM**-6ZCj-Q`U$j9bJ+djHFIbAM
2%,c6b,cel`pEXGZ9Y4YF3Yk+@ATH4D#1Q)A+R3mb'2K24TmDH+I-lppR8Ckahl+
"rSVLGr)k5bG[lAAr,-'FJd!p%FH2L'E'2+[B,QZ5EN',K-9IXebT$"$90T6`&%4
!FcqTTQ,TCq`YdkG'[8L%rlHjYMaU@jUqka@2c%)2ci!mmUTpaQLj38AShE3*3S9
4aEpAq%H[PM)G[Q#+9kZBVk%(LM(IDal%C``aTET5MPDHXCFjUZFHPQi0Ye-,4kk
"j!F@*c,a+P*p9AFh9'rYE*36K'bIf`0jU2[aX)EP8K'#fF$jLCVcqBAXd$&29CX
dT9VBr,eZ*1P22&1JMmh[(*IDR8jd'!rkU-'Ie8#hrE%!X%fj65(`RqqREM1*Hbj
1`i,8T0%@pcl@XR8Fjpq5A2F%jNp3-P[pfj4X'r)9BF0K-`&aA(J(1EblH2!8+rd
6aB1iicf4"jPQ829*3e3CG[hR!+&'c!iPplhl'JP''L*qJYH#R)+8@V5$0#XfH#6
`aZ',&G!hUZd92`#rqM[!VUA$IAZq+h1kA$k@bmQ"A!mEmp%8YQ[8ckeK0ZHA[*p
C,4h4$f'Hi@dDkN2%l'SflbG2J@FMAM(iLNP-le2KNEE%lIrji69'Ca'i#TBRZa1
)fe(N[pE`qd8UaUeSYG6jL%H8!ApRMJASAi+6A8U*d3mh[fI[#I'-$mqPp`%%A)p
SE'($R1SrE&Q9$+r6iK1lG#4fKLmXF[HL)R&HVJ9l#Nle'LqdKhZVIi(GNK(Z+Gl
014%'")JMkN"djiYb`Ad8(e9a,ipBEcIVH&ejpTbSGd!C(#ERC5L3!0(X($+QGTK
Dka#$!DrApVd3fESL+FB+k5ifpU&HqS&TIefkVp0QR5mNHTkE1km[&4kM$4Y'I(U
a8kB!-j21#X*@l[L9*`@)LQFHaJc2`qd&S`43kaE%DANLaKKL"&q3!+Rp5Qr%3"p
aN!$UU8kH9V-NVe`8eNRd2$,MVfTAXRVXQl-FC#)jeU4'ZV6TjTmf!C[[qJd%c[1
$%[!j%"ADDVD$T5Hj-bd()p#N)L5%!`5*aV(Q3qpq@hP`accHVkRf5XJ`YmhFN!!
f[5Bakm2[6E&QL9K@60!l2A#X)40J#-QSphiDVi*HGH*-8bK`!pj#m!BFDh*jQeD
H44DhJ"2pI21!2Nd1*2brKIFC&hH%',-b(5,#kH#ISDQ6e)X!CQ-p"AT+ac'3!(M
iqV4fUZ-eaIHf"GdlTC3F+(Ra"X4&bdh1RZQ#b,dV!Rkbb(LMr"SDY&CGh2@Rk8%
3'ph#CBJ+6TYMCHLHRVNac@M*GLd+)S4l+PJ&SZj6@Q4,9K[!AT!!%H`bGE8J0`B
F,h(reKMZS+'(B'5rCJ1HQhUF,XqpHadS[5`qVMqbfjbc1!j('G)[mlPJhFHE5QJ
NDCd02pQZ$jc-RBhf6FAl!c'Zl,mrQ!pa8`'2VF"hC(jeYa2GN@@D08+,3#)"BTr
$+389YPr!VFmjNG6m,j`QjdFrkP+`&eh#Z##eJlI$r$p)IU)kjBZLLhD*84rH%Xd
GD+hiD%'2UPSVCB+*JPiYi'HC15i%K8HPU+VJ(1m3EpX8C)pPm-6ceh(%#@HMjP3
(@@bHYe#1eZQeePUKM)2,0$Vlj8,$'4QArVk-dle@P-lPj9KDB28`GV$j+!d)q"J
[j"2H[C!!`P4f0)eqUHFpR&q*G8-)Efq250EIN!#MB&`cXK3hMCF'HK2`jK9MZc)
qX#0!EV@TXiVcBP#fjTQr!2MSCeI%&SKBM1'Vi2)3H&lPh)fh8'lITZCl6+a,`Nh
B#I`U8TF3rbcSm'9jfAii1VI(&AKXEBZqVNQT,k(biQUehE"J)U9bJJ[iMh"'N!!
ZV4IRY32jfM*3&j'1$f4qqHr3E9FAal!hKbR([L,*G%bNUVESkBk%SGk%HESFQY!
(M'1N&3fXY6#Y0D5dM4%S%%Vcf!M56)m[bYJlR(*Q"a,-CP,VE09%I+)ZKSXeQTa
mj&4#rjT`Slhkj9NNMCD-6HQ2YEq9(cpX(-Er0#)Pc0cijJC,qcGk%&5GAESUC'G
(c(V32c(lV44#[9d#+S`41ISHc6`&8*[TjJD(A[)p-TGi'(Jr038)&(54Z!TUGl6
*&c'MaCh3P4Eid'j@Qp*Xr+9mGj*#(V2+h")CBaCGSjd@'fj'6Pq#dlSVa["1(KX
ETE90*MV!Zr6F1Ic@GDEI5"iG'`'IE&V1+!U-XaTaDD'IUDmaV)"fGR9I6d6q,Ri
f*1&XDETY[5KCra3JJ''GiHXcm#J0a2`afa9ic-&,qNBka9)[dFT+k0$(alX9+$R
40r10b+2M3)'m)i*!")3(q,cfAXeN[`A-cek0(E0af@E*T+2NXjh)8CIB,kJh`+2
'eTNajFqlL(G`1b,2YYEF16IK@RD`-qhee,*$TFZ"qU@daC+6V-liHkZqc(i1Z3M
IXr!idkKYrmE!f40[fDU*RTXB`"#fEdf1A8Virk$MqRArKJpH6`UVP,G`KmA@#4K
&-bf625JX@88Ql$idlFGkQCfCYQh44@#RU(DGZ5lBL&(8%E(Y*BK1#*Uf&95%VQm
M2A2'EN@-CdRE8BFk84qDfpJ!"1"e6AQ4&h2C@KK8Z8cmfPTaD-F4P*m-fHdNiUI
kTT+6i53)dcP5%PEb8TE[(E*)lmkhB'3L"3B!kYICB!k"G%q#A"9&!N'6)Z)G4A'
+[1LC49XL8&Z&@l(LSe"-4TJAE#LbI6#ZNDbXa-pi@#"Bi(-A-fMPr-ANBJb(1%L
VcTaAL5abZHHVmlc"*(CBi5E"hVBGEG5`-Zd9-9Ak,[(jm!I&29Ur(ZI6*AIGKZ!
Z&9QTK"dC"NDJaSb`[#YUbmZiRV"qTm6FLN"@*L+Ii`j[4&lR[rD&c86Cb$l'#,p
KeY#4NHHGEV5!%Z3Kl24bXac5IKN)cD$`b+12&f)QScmhI+,YH)Afr1bS[MQp''#
q[(U1,3-1p&0YHJ3R6C!!$S2kIpkVG+#HT!kbEf6fA@[ZBqkrjGe'!p2fMB)MTVD
RPEa3EL9#Ba40G$BkXlR#%3MRa-eZMEdLTR#cfSC[(($VImfSE[Q%LEGP6@P1LZ-
(fdVFE0[aB%H*I%eSi"V(DJ6%N6,'QkjV-"AeSfd(%'[&fCrN&e*@`2jC[DE)3M-
J(#P%SE%*ZU!*V1[Gf(JJdEmELCfJrm(iA"@l(5TIf%M8+0qGfDrTkFh-QajLq(@
D[ZV4U6&'e@A"j&(q2V6JX$&HVd)j,Y$jL!YCmL8rhMmbJ6%d'qSr4`9dZb&eA!K
1d-6H))$cZ%[8"k4J2M--c1Y`QlJ9&'k$M-NQ+U)9UEKiG0LIdEK'2aHJ6C[%KAH
Ucc*4)a21)%Q-5GQ[[Lr1$6!Q$"hfTd)[BH-4P"6&jFLV[1LliIPIbSi[TK)5ZUd
mD"S6@)R%,PHZcL,3L3+HQc@j)Q8ZhAVie#S4EN+6TV6GlKBT`P)CR9'kchHYXCT
G$BGEULbj5AURf"eUY#j%A$&ljVA5,eMGe8mkcX$XmIKN9C0fVh,a$#TCMe8JYa#
ZM4mcHYX`%84f&ede38i+Sk!5L*a+aKSAa+"qml9j0,b!SY0!$e*,8YRb#VaBPZV
E1rp8Z@L4k9(fRe3D[%ETH1Km#eq``Y,N&XNT3@qI(pp)qE)VD$%qZaZlP&aRIJX
T1j81P-VJCf1ALbX%eb"FcNLF``K6&H4L*#&d+C*$RLXe6$FdLVc6*e&'fi`p&E"
08X&(UUiFbV)GlB`$[IQQrcCF2ZX(#U[CJ@+m56EVY(XfSi1FfX[(!HAc%"2f@Ub
ViD0+1hN@l5Q9kNXP-0Dp[p)kcULl!HNbFIT2T`)A0L)Jr@d169F#1N'@JDl8(88
C@Gp$q@cm)D4cLAmpGi`b-MRedrX+DrdJ8HIEdG5,T0*cPhG+&,f!Srjf-U+CiZ3
RD+'Z1["ad(MrSq0'LP2$Z3+I92-CQrDrCP9Z&'KBGLD8L0X%`QDefA`JpE#Y*C6
!GJPA0[`URm61MFb`N!#UI,f2R&hTX!*d-,m@0S+T88E6IT)d+HNN9M"#q)mrb9X
EAH"REqc54@13!)AqEXr*0MMFYJeFHJS@iVVmD@X$5iVfRjR9M`c'F3"J8TR!aDY
0ZNFdY+fhNEKZLXKQUcGYL,YV3kXKA3FpfLj'00&4jHhA6YPSkdPerU"HSiVB+Ma
XX6,+*bb$VTGQ5JkK!XY2"Qa"GNZYH,HZdADM8i('@d+46#c"p#I4m+&KV5YA,(4
TRVZAjFfjhce+i%lQ!*)1P16iifRf64DF9FRAr#CRl8H5dP*AD2-QXfcj,i4U-$8
CYq'#Sh@N#k1&Nk&+p'FTRp45Ra3BR,(Gd6A(IhlrfP&(Ympfj"'BNQpi`Y$k'"S
c$JEJ*DpX98FdG+lRC6cTdIU"iI$2&Xc+3G4dhNaMZcH1amLbbNY#VmDmKK#pc%K
C[++Y+*h4K[%J%r@'cEbXZK*b+',`Q0J1#!H6[T!!*K!4"pLq#,9lI2#+l2ZEBYY
S"Ydb'`+P0(0$%4REGR6&bE8VhV[pGVZdil8&`IEGrm)DTBf,q1UXQml8abXh@0d
SK*j`hJeA@YpQiTdeU`JGP)RD$Q[Kc(4Q$5#P185jMfip&l2dpfd*F44"9dDBQ*h
K,!A,r5dP@dNPP9,-KB,JTC!%!3!!23!3Y+*Bpl5L@2F!!2ae!!%UdJ#3!h)!$G-
$!*!16@&M9'0X)&*&384043!"Dc&849K83eG*4B%!!)!"J3#3#S!!N!N#D`!!!3)
!N!32!%,"e1([a"`98*Gl2&p'k6NM2S[af+k8b&((4T)MQLhJVY!,L5f-@Pb!Xp+
TdS0#SlJpDYm28MCp`*E8A0iY`M,k+JL"rpe52F+AZ2lT-Nd[065GVj+U`QYK&*%
ZFh%qMpNBD19H*R61T51%l%+kj!XQ`@j,EQ(%'m0Hhb+$Up3Z-R6Pk$AQ`S@J'bE
G"c"90h8m@k!Ri*akX,(6-9!C%'cP0[!Ub"hTM*5#k`B*prRqmY(E@9QSqjKmS##
1DH-BX#Q%8G(TK(pN)52M)H+MSRe4*-(,)X(d[dh%ZSi8ZFciRI95r0(Mp2)&*!c
4JE`%LR"550$Qk0e'jGkP#e@fhlD3!!#PN!3"!!!m!"#dSPN5Y+*C%`!"+@%!!5`
r!*!$FJ!-MUJ!N!j0B@08Db"548&%688!!HRG9%9B9%0A58@"!!#!!J%!N!U!!*!
*!QX!N!2r!*!%$`"#`G8*JM0'M@mf!`(CPYbb,E@B"B1QUSM,A4%EQbi+acDf,VX
pB5`fR4%d2pEd*!QrFFaHrp[!A6jp6&ehbaNU6U!JSEm8F4IAdq02D4@&)-ia&mj
b#bp@&4pT(a,[h9I+c-QkSkHm2F*eE(!CCKGI53I@c$5XET[)81XfaZPbe41F9KA
DcZ6k66pf69'kdSIfm6ZD')4%25k,N!$lANm@!iZKSSQf0aSUe`S!2'&LNH,($Z%
$NbrAV2m1[pP,5ZZ,&@Uq#6bp!#mTC-8X9pi%-qJ!C1HC5&5V`j!!ALp29kcpqL'
R+&Q28$kDjP`P$'qi[V`AN5hQ`hcm13@4$UX!!+@3"!%!!$N!!,IcZPki)pck!!%
UdJ!",Cm!N!0b!!Nff!#3$Ne[FQ9'D@aPF`!"&"*QC(*`68&$8i%!!8!"!3#3#S!
!N!N#R!#3!r8!N!32!%,"e-LrjC,XhmX)*RCcR,-#&#Gq8KYPX[!p@`*i*U"#k,-
3j@E4**,Faf@A*aF5dJk%qm'jXUVAI9XhTN3&bheT!Xjm-Xr)@GHRS@P+'e50XTB
C#`fRYb[QV-9J$Kd6Z,+$iUDGe1jA`@kTi-cNZNKG'"[&FQSK!&N,(!G-8R(JrcK
6GXGe9DM@k)[i$FA13$q"aSD%b@NC'8b`0G94eYTii8TT(J$Ab-+(Nml2V''cGY%
!'ddX'Q6R6@DKFMA$)h!Pf"b@3**%lr,*0p)qqm`f%+H-BL``)Cld9FD,h3!$e,3
'H"kr[e9Jk**+JiIBDjjZ&I$STC!%!3!!1J!3Y+*BlV5L@1i!!5`r!!%Zd!#3!h)
!#JXj!*!19'0X)&*&384043!"AQC849K83eG*4B%!!)!!J3#3#S!!N!N#B3#3!m8
!N!32!%,"e-Lrj@rM&,rpRB1ed3p3qG(kU8-hh@9iG1@S@m(mQSfmaNkfic"+@AD
mDlijT2hF,f*e29jbrV(rd*5MRL!H*m@Hl1qIT-q[maTc('*%LI'Ik9,CXTMfq9$
F%BS,+EZDTph'4FbHKhG98E-!V9`*@dAP*cU-Tj!!q%L2e8pkIT42QUY6i'6qhN-
IeQHVGZj1QdFTDPYIbpGSS&`kSH-+&'X,b'`BAUXpk'@&[Uk29JGASf)(5FFUKqd
ImaKR,G)M*49Ak+@3"!%!!$X!!,B0PNDf-`r5!!%YR`!"-+!!N!0b!!ZD*!#3$P4
ME%*2390SC@aX!!'3!'jKC(*`9'0X6)%!N!-"J3#3#S!!N!N#F!!!!@-!N!32!%,
"e1T!eI3iD5hjjh#)@MVZJjS4ZaXHlL6YHM6JIcAB9!*3q*!!URr@fNF&MLY3Kr%
8eJc4@#p6#F(ASmDH`591HHGp%F#qI3[(I-bPp0Yb8kSp03DC*rI%AR9li(lBX,h
G$"1V[d%0A,mj@KQ419jl8j8qa@*6cEQ9%VPk%#CF#qT!8')&4hR(2CUXCY`H%GJ
R`b!83N*H(1NY!I"[,96N"0N(&$J"5(Xqhf0'+*L1Zc,AJ!(S55k682F8+L8SLS`
mZr%kXZIkqL55mNk[9,DjMJ,`U&)IYG1qh#2UD2aYlDR19GV469J(PbNMZ-'bLNk
Uq@p@a)KX39EcLA#%&HQp5eCI#'N8a2mfR*5M%VSa-2'q-6)T9"V0Q4Ji6F)cjNJ
d-hmETf"Ie)rMFSfB9e`3V3"Ll'a&f6!%35N-!bc[#*Q1X(q,Rb,lI!k2Y!2J+(b
GcBq#Q[ErCPN[RAkFP*E$F)3!TC!%!3!!1!!!Y+*BDEGHL'S!!5l3!!%b"`#3!h)
!#"d(!*!19'0X8fKPE'`!!55VB@4bF&4ME%b"!*!%J3#3#S!!N!N#D3#3!rd!N!3
2!%,"e,BMG3r`(XarHL6)EZ[G*,efQfCCK'9C+r`b%`d&!C`G@UCY%&H`T)biYhp
j)`dl08A#NEmHZQ*kYBH`RDb[Y-ZVp32Bq*fp46#YZM(LU`5a2TGMYi$50hj2*Hf
QHM!&hZl'9qmfJB56r8[IaIqMTd&p&9`$Z56Sr5DJGil'&``6XfZQ[VrR[0R)SND
J56Ukb31%)+BTmJbHNKDb!Li!@39*0[LpfAP#X9*m$U'e$H2B1(9qaTJkUQ9kG)+
"@JI-)#j&l)Yc@jI89NQRBZK%CjMNmDlL2pQ%Kcqbl2$a)p,X*[BGM)iEM1L)[H-
h"UCE2#[#A6)EB%92#!#PN!3"!!!l!!#dSPM&YXf[%J!"-+!!!61H!*!$FJ!,NQF
!N!j8Bfa6G(9L,QaTBJ!"pFj08%a'3eG*4B%!!3!!J3#3#S!!N!N#F!!!!5S!N!3
2!%,"e-qAT`Sbp*!!1P59K8N(L&e*3HdP6KC)q+Nk-HfpMA-Bq--af8L2L*[hj`q
+JMSZ(pRA@qV1NeZhNqMh4'ZV%b82!qTIkpk!BF)R@26CKYP)C,3kq!FE@X8%d+D
fijEaL[!Jc6PPL2`i2QNYPD[cNL"ecHQ!-hTj'JN&'Zh5hH&0Y`d'2$BTiEr&+e5
*qla52c0U&"fj6Z#i%h4SRpbY"@GHd#8pUa`+PRceQ+1bL)IN4"q#cUKf0)elM+b
S-9-&kf1KT)&ha,Ja54TqCFNb4iS6-RH)5)K#19aNm2kEf9J,FL[p'De"P+H4LKm
9eXBNJ6!ARZkeV%6KmJmD-)SV%ahE6SVMj8cH)(XD8C43BZ1)q0kdlr+*BE,Xkl@
(+4+4Te6X)C5@9i8!TC!%!3!!33!!Y+*BaVE0Va%!!6)(!!%e43#3!h)!%Bp0!*!
19'0X8h4eBN0'66Bi5bjXD@)!!8N169"-4N0A58@"!!%!!B%!N!U!!*!*!R`!!!%
d!*!%$`"#`G5L`,pb2XUMI,4[j@dC4,i`Ul9Ih$"iM#B2&U4$Ec6cQ8bjDrhhR(P
)K4ZZh-)jT[`GH6&H5jMbM(afeY-Q(,rjUBAar`6J%hljUj*[df8'hV#Y50+CNi+
q*&Gr)bC&#%80Va'Eckc*A'U)3[@[KRe9E[pV[pBpj("1%IJ@,D2KiKD0m2S1KFI
!L-B%$IaCN!#jrS-4K[19ZY,R'-!fd'*L6*L*$8NhVDQD!S5#e[kNIX$b!p6)drk
4RF,Yebq-m*BSe,`rk+U6hUMbJ%Z(GaGP***Sp-MB(T*i8h`K'QLdk4TQ91l66BM
ac,Hee[JR-A,4+a'4(I"ImVLhC+MhK"39ARlTrSRHdY"iE9NKTKlcEJ*5K#iPi)*
DpS2XK8X80hXNGir!d&16dG9jEQdI3qFSb0LPN!3"!!!j!"#dSPN+YJI6'!!"-ji
!!6DR!*!$FJ!*%rd!N!j8Db"548&%688!!@kq9%9B9%0A58@"!!#!!3%!N!U!!*!
*!Pm!N!2h!*!%$`"#`G6Klm3F3&63["mBeKi(c4[8HU$jV*6UXG&GaAp`X"aX0Sf
@Eh$m2$)XD82+I!V-M%R"PNUBK"8#aQAb2@E+NpH)Y5,1L4L`915Kqa0Clj`!8,U
jC1"d484(JNS5T+Yk2JDS%XkRK50`$"5XL9PcML`U#HXHe4[&SZp1jYDTJBN1qlj
$F9Z%hbr%6[F5b"#a"[I1kAVqD(Z"(f3mM$6k(&Z""VeY-Ua+$6TBd(Cf`[@"ISA
cJ6ePABZiRMM+*YI64`LQRd1SJd!%%EQGk2rXCrpTILhB[$`*1a3PXIBMD'kb[4E
)ji`!XB88DUMqq%4LeJ2&T5Z!TC!%!3!!1J!!Y+*Bb,B(daJ!!69&!!%i0!#3!h)
!#UI$!*!19'Y6G(9L,QaTBJ!"3KY08%a'3eG*4B%!!3!"!3#3#S!!N!N#E3!!!5%
!N!32!%,"e+,![f!HQa1'!*(Mf3K&b96VlIlGF@'iaeH$lFi*Z-&#$$)SZeL,JG[
hMc@&(eLM+-X'r[3'"iPa!VTL4TEEpm2FHp0C(q*he@rY"qH$5-ASV"N&RZT21ER
kCkUU"A[GNbbG'Qd@b6'PHAabj'PUD`jA3X"i%HFEV%cRH*BdI%b6H85,@f-ZDLF
dc+jaDkbb9M!Am%jh+mk5(NC!VR,cq"40C'R,D+b@LAEa-GN[+U302Pd@&cbJD,r
"pF)XHi55YULja(G0fp`H#URmq*IIl5X'$aLKc([8kVEI@5`FU88$Bd1E("Hff)r
aAKA%Z--b)mRcL2JCceSQ+MP!j+2qD`Y6TlfbeEEr!NL23VFpK"#5'!1jBMG(hHl
ZQUelpB#PN!3"!!"!!!#dSPM)YJI6'!!"0UF!!6Q9!*!$FJ!3lB%!N!j8De0dG@*
$4Ndf1%XZE'PL!!(&Y%e36%C$9dP&J3!"!!)"!*!+J!#3#3*j!*!$l`#3"!m!3X(
8[R5'I"$LREVIJYe1PA2'keL1RQN5CLR3GPX`16%GKk3jeYQ6KeBUR3Tj[BCiVMj
+@HC$jMph6+DeN!$q'c@Cf-'eX!&j(rH"PK"T3BQ++bLjZT[!Bc"ETdRfaM&a8%Q
HYTK(j`8$bff(05'ERiZbCR-N[Gk!E2XhCkkhcf*h5e`Y5Rb8QeFb4(iK-f@N2V&
%A44*+M'3!2hQN!$HG0!(&BqJM6eC2b'FS6rjh3`-TF'F2jkCPb8c9#i$m41rGKk
mJIJHer5r'e&VU@+"m!,E@X+q4IrAMha'8aKdQj!!rre%Rq8kAj!!BG8b8r@9hMk
PJ+@3"!%!!%8!3,3T(VQi)pcV!!%i0!!"3VN!N!0b!"@51`!"1Ii!!"$N!!!)Z`!
(9'p[E#"$EfeYB@jN)%aKEQGeB@GP!!$mD3&$!"B#(3'*!F!!`!'3!`i!I!"Hbd!
!!)!!N!HPN!3"!!!f!!#fm85NY[&%T!!"1C8!!6X8!!%jP3!'EDm!N!jdBf`i,M3
!!61ZCQ4bF%e"3e1"!!%!!)%!N!U!!*!*!MJ!N!1Z!*!%$`"#`G5qG(0DTHcVNTB
Ri'U%cH600+96l,PPMml@MC0AhZGR51,L@Ld3`D@rhlS1bjaaK%mB2R#ppSb$X-R
04d931hXq2V,"qc+k,1`%Q[UbV%-3VJ3Jr*R,rK$hRKcCTUmN6[HbBh"+6@6LpY8
PUP))&NbK#8kR%DK,'S+dhN4*l3CSSF%rL`lGHl-D9TDA"3&3AXpQ@ZillpUbQ[P
RME#U,kQJ2SHG"!chkY3k!`#PN!3"!!!l!!#hl8M,Yqe)b`!"1Ii!!6`e!!%jP3!
,k%!!N!j8Bf`i,M3ZFfKXBJ!"ED"cD'aL9'0X6)%!!)!!J3#3#S!!N!N#3J#3!l3
!N!32!%,"e25-0F`HShlCi'VrBPFI59(eZBXZ(4)3,,L6)9i6Bq#PBiLVKieP3Qb
93UlD5&fLmc%D2daK,1rYmeMND+YY9T9ANK'N@r"GBEQpDBA0La8)QkI0@m0rEVl
+dY-PTk)ABlcKFeNUQ9JL$(Z)Y&Zq-0b`R%rKQJfQ#fLm9!3&+&Q*a'klS`N5ZG3
UY(m6bRC)cEmMpIP*V`jXFJVe+4UYTcRD9eT!2XLJIPQY&m`$0l,fi+@3"!%!!%%
!!,IY5-Zhl8M,!!%l&!!"2@B!!6Q9!"(I"3#3$P4ME$JZ0%0'66Bi5bjcD'aL!!(
fG(0SE'*8Bfa-J3!!`!#"!*!+J!#3#3*1!*!$[J#3"!m!3X(8b,rPI"$MQ1bQlCH
fp5j*$[Fi41R,02'@m(p`,SMb0RJeVq!r2L,j5dX)9fpA$dmk4A9-,q*LGU,8D%M
[PqAi$9"XXj!!Z1ErRrh'Q`36254d#&a`8Ec&LX!'f)SV4l19N!!pJXS3J`aeU6E
HIDH#dV$Kj3dT1,4je2Yl[DdYYbET0k"hDE`a0LQ+Y8U4#M%k5h'%@2A43hYRe"i
2B8,T1T'*(P[Zl%3[)BTl@-DMHFF6fC4ZPaPj3`&Ym6Q`TC!%!3!!3`!!YJf@dEJ
Mh1%!!6`e!!%r,!!"1C8!%a5@!*!19'0XBA"`E'9cBh*TF(3ZFfKXBJ!"d8*cD'a
L9'0X6)%!!)!"J3#3#S!!N!N$AJ!!!9%!N!32!%,"e-qAT`kiYZYI-TRUbph(A&Z
R["1YlKN16iFQYRCJBlQM%BUY)4SrMdh+biK`*GLMCQ%d1+`q$l`21Y$%dkU6qJZ
eM`%e4qD-me"V`,(dEjT(E"X$KMYJ8M3p"5LGCd$ReHKTdd06XkB-FXMmKm0EV#)
Q46Zf(RQ2KV"b+cTd'V5J,f&ULF6J!qH5I4jmX'XZ-r%5LRfidM8CVbG9DUSp9LK
#IR43X"lj8SG*TENJPrlqm!3Gb)kG-,8,eP2i4f86"L"*A@!M2j8mK1Ml'VpK20"
6R-j@,5'1cBXAUTjfAqS+T&K-03*-F)r!Di(CDBl$3bcL3C99MjjmhQ6e,bHA``i
DedMTLpTZbcAr3D6A0eRKHZp43f-R&2r9&q*a&[ckAR*T$mMCS"a6bcdf!Vf+G#5
@qQ,+@j8YLZJeTbl8$Fh561Jh[QGZfG-r5$$Q4X#PN!3"!!!e!!#fm85XY[&%V!!
"2@B!!8!p!!%jP3!&)J8!N!jdDcJZ0!!"Z04QC(*`68&$8i%!!3!"!3#3#S!!N!N
#0!#3!kS!N!32!%,"e,jd3S4%,`KNG@ME5HfT'j*30Tq,Z4$dSqm[F9kHZRRj*&"
hdcmH0Ipakqpic8CXr+XK%A)*A*NJL5%84A#2JF6b('mpj93[9i!M,$-*S+b#DIa
2N!!U4`@Li6i&$"hR'!5U*NNMSHU%a'*0Da9V,2f6H[AX1(BM)i!6Pj,S%ACGbKZ
C3Hr[AK0khkpkPH88#Z`k"h0p-!!FHP8e1*9hG+G1a`j#6@BTe+@3"!%!!$S!!,I
Y5-Zhl8M,!!%r,!!"39S!!6Q9!!VIEJ#3$P4V1#id,R0SE')!!4YNFfKXBP4ME%b
"!!#!!3%!N!U!!*!*!Mm!N!1a!*!%$`"#`G6dM$A2lmMVUN$Z6&KE*ABTKGr8&6m
NBiS'RNi$+-3TYc!5JTYE5Jq(P3U-p9X"VCe4mJUh*'"[X+`PL62X,QN+%hZ@3lP
cq,'CT6rAX0Aql$1hCab0XCdVkNNNM0CrmGmFhF5ZMKIFl"'-AkZ9L6e'HCT[dm@
VrXbVah,0P5b!EqNA,T1KrTXiJHBFB9Fd5r&"AXi2VSAL%KZRiXBA)MBD*'f-+G0
CD&aD$fQ28i#PN!3"!!"!!!#hl8M,Yqe)b`!"3$d!!8+*!!%jP3!3$Qm!N!j8DcJ
Z0%0'66Bi5bjcD'aL!!%K9R0SE'*8Bfa-J3!!`!%"!*!+J!#3#3*,!*!$[3#3"!m
!3X(8b,rPH0R1Q2")[*l3p#+%lhh5G!QhIUp[*J(aa4YXCjBiK3Al@m)+'qj5XXP
&)C&`keZ&2MAP58!()N69L)r&XKeLar$V3rcPDiFX26d(@GJ*p)&i6e)L6Sa&L92
2mbFL64)@'!TXl@5G8(6h#4Pe@CYVJXFf`12U,2`D6![Q-S[V8(R#93Um$@C)R1'
Ba$!1km165ZD,L[Qe5@QKVUC'90VB,6Rh*GQI4CGACREGU`Pkcj`'lJjc0##!TC!
%!3!!-!"!!*!*!8&D!*!&!6Q9!!!QjIq3"!#3#U@3"!%!!$`!!,Bc,d'hTfFa!!%
jP3!"3rB!N!0b!!bk@J#3$PGTC'GPG#"%C@e[F`!"kkpKC(*`9dPc5)%!!%!#!3#
3#S!!N!N#F3#3!mm!N!32!%,"e-LrjA4R1$I`)QliL[5%m2LH3,ifaqa2$lDTeJj
l+K&I(XMLGmY0`fc5$XcGj-5,j0-rE`&QA2!Iq&R[C0'R*rXj&42c-`e4ZrF)SfM
chSHMTj!!b+LD32[1'd8"mYhGIiV)paVL-0bUKKGC2N4FP(h%)BH`fjR%8q30rGc
BVA0G#9f#3(iTd2F8[,5"182GFeLraDJJ0`1,lQ0I'B)P*R@l"Y"`k@6hYD9Pr9$
JA,YL%Sm13aQ$"diXpY,@XK&L@3Ih@H'QVK5DXcGrU!#PN!3"!!!d!!#f-`rlYM-
2q`!"3VN!!89m!*!$FJ!%+*i!N!jADA0S!!'rV@&NFR"A5A0)J3#3!`%"!*!+J!#
3#3-r!!!")!#3"!m!3X(8FULL1PS"fFm#keHBF6ICaSY%b&X6EZCSM3AJVE%H6bT
j%##H46Jj668f20Z'Q-jfHdr[cU#1F5[kJQ[kFFH"c6@pC#a4BFri3YP#PN3("3&
mmfE2PNL9P!riP&-QmIIlhlcd(KAGGGh44SY&29B,CG$[jCi(Xk@K9C)6H,bBSTY
F8bcUeVrq8GSfpfZBF`X6"iZRC(ZLJ',SV)`'R8,K81V"Tmm@%i&'mXMKahArZ1Y
#DX"S`qX#U$Ea3k$A[aB%&0BhB-C3I,`fXB$J,cRQLip[`!FRcfCiak$5a*EV3NT
6,b&&j0`UBZ`&"@5DaNIhR1*#q9H@!e-&pP!(,CI9F65qG58D`qEFc-mp)G@Z"mC
rDpfIhUh$)FDhM*J!TC!%!3!!-!"!!*!*!82f!*!(FJ!!a@RrN!3!N!V(2J!!!3!
!!D1+!!'LLJ!!"8X!N2--!#!!#!#L!4`!J&99!*!$$!!S!#J!VJ&1!,9993#3!``
!)!!)!+)"(!##998!N!--!')!NJ$`!CJ!K999!*!$$!"'!+B!ZJ(@!)C993#3!``
!+!!S!(8"2!#(998!N!-1!#J!+!$#!D3!L&99+!S!N!--!#J!+!#8!4)#!&99!*!
$$!!S!#J!M3%A!J&993#3!``!+!!S!,B"(!3"998!N!0D!!%!N!9G!(!!F3#X"!*
25`#3"dS!93%6L$T6Eh*bH5iJ)%PZFh4KE'aKG'P[EL"MB@iJEfjXH5"LC5"`CA*
QEh*YC@3JEfiJ5%C6)(C[E(9YCA-Z!*!$@J!"!*!&A3"`!(%!V!3#6dX!N!G+!&8
"%iJk9'KP)'CTE'8JdPi`db"YBANJBQ8JC'&YB@GPC#iJ)&"XC@&cC5"eFf8JDA3
JGfPdD#"MBA9dD@pZ,J#3!e)!!3#3"@d!CJ#"!+)%!Np,!*!&"!")!'F"!iJb8fp
bFRNX)'*eG#"K)'4TFfXJFQ9XBA4PC#"PFR*[FL!SAM!T)'KKFb"[Bf0eFR*PC#i
!N!0p384$8J-!!(i08`U6K!'ME3$X#h)$Y,)b+b[M@dhH@qpUpkCZ*YH!-3"!!`#
3!lUe$)!!#@NUrZ!"94)XqdV)@`lMjA1kK9'1XMr2MrqZ)$NhV"Vi%FU'0AQ'BU0
RDr#XAMm&lZ`,`,#T"L)i6&Fq[H[,VD-C!m8F@8XE1!X!N!0-!!)!N!8a!'F!43#
Y"!44G@Pd!*!&#J"3!"`"%)JD9@j6G(9QCQPZCb"hBA-JFh9MBf9cFfCeE#%!N!8
)!!i!+!!ZS!)!!3#3!p4"4%05!`!"%Je6#TXN!$Z+L)S9caE3Fka%E"$e,$pr2qc
ARErRlXi-TeMBB58U@)999@,P[r%%XDS&#l*P1diJqC!!(`&8**Mk0Eb&Tph&fGe
0dXKkNVep(bj$h-@Aak8,&[Q01&G2PI8,*$a+MT*"[ZKdYI"dDK@D)Mi&jNl(,(@
,TA1"CHpm&"bi0FV-TR9!6`FK$%aAP&QFVF'lCA-L&paq$(JIm$a!SNrM'Ub)p-`
20hNS80Z-b('VTjc&BeY4ZFc0eZQ"Uj3hhmRl$1Rr92r*E3#3"'i!!3#3"@J!HJ"
m!,B%!Np,!*!(5!"H!5@)6P0[E@8JDA4PEA-JGf9bC5"cDfP`F'9N)'*PBf&eFf8
JG'KPH5"KFQ8JEQpd)(0eF("[FR4PC#"LH5"dD'Pc)(0PE'BYCAKdFQ&MG'pb,J#
3!kP"4%05!`!!YJe6#U-#!ZrN"*hp8l%2ccCldpY8G0M(R)VSe!Q+HRCclXET1"!
2&6YXCe8*9P@3!b(HE41VqJ%,NJpJLErjN!!"IXTN0pFP'NhFXXeN0%iKA-1K3f`
f6F6Y%d@+CqJd-B%kIc8'8cl'BkDNN[dmr5K3rf[-JcXqPd"rAJ@qC[AL9b'HI%[
ErHjf82f*dc00USVP-@0*@#ld!T-Q34*[(afX!J#3!cS!!3#3"9!!@3"N!*-%!Np
,!*!&!`"%!%J!k)JC9'KTFb"KFQ0SDACP)'Pc)'4KE@&RC@3Z)!#3"%J!!3#3"8F
!@J"E!*3%!Np,!*!&!J"&!$%!k)JR@@pe)'KKGQ8JC@jdCA*PC#"KEL"TEQ0[FR*
PBh3JF'&cFhG[FQ3Z!*!%+!!"!*!&UJ#%!,i!h!3)3fpZG'PZG@8!N!8%!!3!SJ&
L`!)$k!#3!h`!!3#3"@N!B`"p!*m%!Np,!*!(23"J!21)A&4SCA*P)'Pc)'j[G#"
PEQpeCfJJFQp[E5"[EL$5AM$6)(4[)'0[ER4TER9P)&9Z8h4eCQCTEQFZ)#""EL"
KC'4TG'P[EQ&X)&ia)'*jG'9c)'&bC5"ZC@9NC@3Z!*!$(J"Z!)B!hJ(N!!8!N!J
""3C6G'&dGA-!N!BB!$3!&!$m!AS!!3%!!3#3"32S!*!$P!!!!4p"4%05!`!%jJe
6#Z3L!0pf!ijaTdl&mUcH4,(Q2,#(q+cH9#bRS)Kh8fIe-m%!(3BLcP*d9JmlV2,
rhrHH(0lClA4B!JZJSh!C1CSEIBc9-`eYXf"Ff#fYQQ'1,jP&KSEYjm6pGcSAFZk
N#TXV,[2qG)1bS4Qe!@`Z(5aUJ)P9k@!e1(J5!34(NB2(LB1,(03eclf$l3L`iF+
X%J6F'S0JXl6il#@GkD58+,c`852HDVRR[`kmdL4l)`0+SX-VH`PN#LR5[Prekb$
B0H1"HRlSb-b0H$[Lm'Y,QFJ8JNX+D&I&*,8a6r(j0cd$)jiaM1pda%d1,6c8J$X
CIc6R(cVq1QXMZ3b5Gj+JfBF@rQV*&dhfI-"IFkGepNBLP"U2&J!!"`T"4%05!`!
-+!jG#kb#*$lU$0r[lMJ*S8U(8"UT8H%%4d"jA`GQmk$CJS396f3i9T6&AQdmXj+
5fTjY@'XlmI[U3fJYC+e#"@Y1,T!!K!PlLpp[GI`qaIAlb-+J@E@NcZ`ZY40E&*)
`,mQbT%Z&%0,h1lh[a1,DFq[h"`hRjc3a!53d)c8I4Z31T3kNrfV)cfB)`E"CDAM
H[$jm`EhR45H,`KpKrA+I2!Tf$"FqLC@*(Uk$BF5(K)QYSFSSU$L!H&mN#)-cK1H
"L2N3'6Y3bQk`+kPpM0MZ-2d6L91I[hfmJIfmqZj`[2rfCi2MVZ)rfm!hBF98HDN
qhlQ5[@NNcfG2*mq%PCmZKV,&30d!E*Nmi2Q&q#FhMHQ&iZQ(CmB$c0lDEFAR$E!
[5(&K*XlcR3X3E(iK'iRPNJXTImKA*!1$VCElqHr0a$19pHPi+$+FZc'b1,MT+Rp
6+f*P&2i&IAXASS&Qpm)&fid25YMA+1a'aNrQF4)CK$q*5pXH#[M1AJ-[LK(UcI!
caDX#EP'['B8h-8FL$H-6mEPR95lQe8qIR"PbRq3q(YjYi"ZANZ1jBMC9PTiVG[L
PV9qF6mUqf[2ET56hblPYb`4m9-'[H#Ml5L@m(VN@JXa3(i0EGcYL"VkdEc`jqF2
jd'TjlVNC61[pUBTqkSG4q!rmV"@`ANGK&a)L9,bFRJ5"$N)bpqJ#(85Ld!fVi'+
bQ1GP-EFSLrU2C"(RC#%S9*431)3++GbQkN@U9+AE!dqcj23V-9P'qjbm,*QrjKK
C5UrRNV*FIVhRX5aVhSRZ-M!rVM!`T6pd',c)l(!B")hq4$$i)$I9+Kr'#rIqa)0
Dkr$Lb&p@l["+'bE$-%Q'b60-ULlC"Vr"@f`@"MiYi[LiX![AZcA8ThZaI%12UYe
N6B'P4p5ATP%rD,851XZ(kJUZ6'pJ5@mji#J9,PpBZk!f(&dc)qPZH0'%I+L9f$k
)`3lDeXb08lTE`%P!9MEJqaDhPZkP#!kD[U)#mG$A3$*(lA!13(#D)QUEh4a$,E6
LNG%-lKP!X'+-ELY"0'I'6JrKeNV6Ij-2N6!$$Ym4V`l4(1Rl9r5$CE9*V-L-L+3
pUQA8MGSqf*T$B3djmSU(YILq*'jjFekp$jY9ElbKfi6qi85e!p9IHmc5Hi*F6*Q
NUPbr,TXUZAM43D@H"Q1[rmT"2-Lq3$Id&S%1jP1LFc(Q9)HTSi+MrcmB(H,A`i*
6CHpGqFI*(D23QV[h2p!+qJ11M5Z&rKV5e(CS&-LR+'aJe+Qqp2h-p+%2"4r1LL"
8,9hPrV*2lH[lP(,eBX!TI)hdhLRYc"ae)ZZGfR'!D"DIQp@1$DY!$J"aIi2HNGP
T"3[D"S"RMc@E3FN%6JpTYpf[1*'MS-AT*L-ZRqS9UAD4HJfRf(X@lFrZbj!!N@R
,5i0fYq,UqmTRm%&Je0j#m`0hM4-CbTc9()i0peQfHDbT636,Y%h%%Sb8NX1Np@B
0ikJ*FG,aeNF1$2Q6b(,3[S)kTm,G'GXSqML[d*a5S#"qId[pqdKV9eU)B94!(J2
dAK-XV(!lp!IDJf%UKZ'Hj#)"AZ)JPJJ"`)MrZD[R32$hlJfHEfbd9EfhqZ6T4*r
rrHq1rjlpMQ[r6ApehT20I,2TBQbp)Nj$mlikI0FRmGHdE-LBA&)hTFM)GZR0h()
ifF)r+SDb+5D4N!#$ep8pZFAe50ULL115&"&q*h(4j,I4&Yl1K"jP'-Xq8r"fAjf
8U*3N[`lR!!pd5&`ZH4U#AbU'fK9QGYi8h2DiVTC[l,(P8kYM6j2pUVmR%Zq9dTd
GirkJje)TP+L1jKYS5KJ8fZ!X6P-q`q*1kqi25[iC&%Ca(9$qfU+#mcc8'P@"3p@
(V(AqKU)-M#ZarpR4bl13!'Qi*Fl685e5iNaZTXl4J)NlYXZ6q@FZjNIjl40Y9ip
8pq`XAliK6qbBEade`DPLBc!BbSBh+iemhE[5V9NMeaJF-Fhbf-+2QJr+,aIp`@$
Y0K&qFN[5IQlNr-%Kdj52,I)C&LJE+Xl1dlJ*b9p*fB"TqVI'eF'VYL%T[qQDM3B
EQ,D%p+aa1cFN"8aP!6lB51%[a#Sb-!L%[ES5RTL%8r,q#l4F!%CXlE"%VqYXchi
3AE6pX%a!J,M#G,NQdlBaJQ3B-ZbK26DkBBC`biFRiYa(Mqp'SThr!iMKH#KMQL'
*3Pq292plheIrM8Th)pLj5EBVYED$YlQUc*k*pEIY*LU3!2h-Z$3ElGTaXkPpNaL
9aCC+[ZGD+#5%XiC8RA'*JiYI%B95k6m"PG0U3L[KP%aGST6#m)%)4bRZ"bf9LCa
r-F6S3P95kYKBpD[eb4&29fQb8$e''VK(eFIjY[abU#Qm(,-QcB&H"JQNM8!a'UT
%(,Sffi%+Xm+#`8*DS4[UbYFrIQXL&[Hp!!!"Y8&%3e)$!!,)$98,P+,%l'%%6fI
9hG8KK#TVE3N-Q,3F5@6!j!5S-MQC5!B")YqKT#8IN`iP0aaj4AiQbCRmE@$"0Yj
1RfPhKB4*-K2C*!h)*pZcBqiY3rcNHikZZ@16JTYM[DbS%!2Y$2J5,dk3!$a4j*!
!l(JkrRhpM1h!i,9"F,Lm2$iHaj!!GR6dr"bSXeJ0,5klPS2N$lpFhZ"LfR*Tm$`
jcj`A2'pjDdUD,e(Aq8A)h*DS*"k!q[rmh[,1DD4iS8D0NMVk&2$A0@ikiqNk,I%
ki0iRDDcZjklVJ@m@h+URcc)PUA[Vqkk%$qUGTVa8%C85rTdiRP1pDFkU'96Icb!
ZAZrKjD*NJ`BULMIeM*Jce!qTH[Vf+*a56Y)@m!hC9X2,ic[H$YbNURj4`V3pV`E
@q2qV0%8LmbGHhh#SUR[SES!XCKB14DcA$CYUpi"+Lq)5-P*q8XR%"jaAG49Q3P`
Qp*+$Y5N`1bZD36AC19qB#`E$0U%8NP#CE2EU39RCCN@*i5`kKBi6MZS8p8203ja
CI*lQ0B8#KVi@GBD`3LZ-'rr!JQK"Jf8,44+h(j'i,rDm$mj(!!!"Y8&%3e)$!!,
d$98,h,,!V3m%*bHdICbfbLeFk&A8ka+IfckUi[jp4HX1LJYe1mDP$K#Aip@ViEK
IhECY(k!9)5rI5h+a8A(E"`[V-3TF*'@dADrmPp,k3UpSbrd*p580Fl3r'j6@3[D
pm8'ZDT!!DSFB&c0GA*pH["p!'VA"SZAkqZ&KZkeGYK%E0UH0,m)rRDH[hrc(M9,
MjjVG*h0QI"2pDrb2NVYD"DCJ'h"8!5Nq!PJCG!"1*XSZ*NkCXT3`@L[8!U81Va#
S"FF*Q"AT&F04!31&UCk2IN6QaM)A#5YGV8,E(p2"`UFN3Y,fViVrHZYN5Xc*'J(
T%PQrI(52,Uc)#(rVm5kV-5HTCAGIiTXI6q*ci5*0e6mREq*bqr4l51GXmGFP(Ym
5FXjhP9',lp"l4Uk8La0r'rVVGrimaNGiSQKECSGIHqp3A1pp[,b(JQDCm%"S`FG
)8QMGqf%ANc4F9(%66V8RYGi[G3L+9!AQ$X@hk##B'RK$-QYRC'$DeC!!+1BT%&+
HTh!4hC!!'KaQ-Ckl&Z'!TmLDUB0j+4ENcMkMK+a))HmE(rH)EAH)@CQ3!2CFlI%
8!J!!!BT"4%05!`!#Y!e9#j`8aI94!0mNH8NDejTXll9CVF"r6Th+90rTHeCq&GJ
+[!TX"3#q9SffYEQjEqk5GGF+$"2C%3-j%-eA"ZIhc2'6(lNrGdrX5RCcE(mE+%I
Lk9RiqRhe!Z5,SM15ch`Grllp(9GNV`dLYmqa@6)fpjiTl0-[c6Xd+Me[@V()DAE
Kh21Y#UNqU@Ra5mjF6fS8(U(kIrlSqC5N-M`S9@U8K9kb[Y[U+J1ZCC&*ekblPqK
8fl!X$ATFZ"DR@m`PY'PVbb3IaC-8ZdQ%a#6r,Yc2&&Fa%c&!V3d!9MZ$9iYK#JX
N"(GTV)9c8ZrPD-'j@)Pq9'rN4@JI`"k$j%M3Z[)a8BYS%kSJLrD&$fq!LF&ZKA5
UKXGB216r3mG1lL"BY8BUb#KfN!!!M9A(4e4N#2B(25`c,4Qj6`M-LR[bN5S3,)Y
FLP13!*KeF(&!1ShC3+&i$`YSficAp!VDL6U1dX*Y(VB3#TMRDT8""j9(BGhq$aK
8c4BFHKK5Z2k-a1[iY@Yf0!)!!!3c384$8J-!"RF093e$)K)4jPjZ%'3Y'84UmN3
N#a"CUkBQ*lFpLicJGZI)5EFc8r+CIhHrlpZ+2"[Ic,He3*,9cZc*j%RB[MZ6%C,
P9Z5*V-M[(j%rNjr*[0R@GK&*&K1b0bh*)LK!iJIr6PQ'N94%1+J,1hML*hBK,0+
!l9$&S4Cf%PiIcijT$+G2[eNUFK-MbHfpC'm6p0EIcBDF5mJT4aqj[p)@X[AQGIR
'*!P,+@RBhU3A&C159eN[%2cJbH(#&ajm5X-QD0&L4-VGcEkQ`r)XP,P*,SMR)FN
FrFAJLaU$lM`9cA8P820dQ"q1j-RJ+KhQ[L68+ciKBT!!RHr$(BZ5%%MI@aB0YUm
G+cH9Fc#*FlDI2+6+KXfGMlqi[`EXLf[bq5DTS"GBJ&RSpE(k4UNSE)5VZ#(4a%4
T(NC4T5D'+#Hca)G5#DG%eC'a54-U)Z$aJ`C3q')!Y4*YQG#!*634DR+,6CR$@+Q
N(kF-V(@SLpVJf!+P0U0c9&M$',E[r55!`Li$a$PLQ,KZKIc2X5Gal+,YACH#6FZ
"UHV$eS-Ujc5-Gh6@aB"d'i-,eVDeLc'L6-mKjM,F%r*FlYZBmf)r3FhBZqB8*mK
FDkBmH&M*CEjpUU5NcqMUMHZl,G$)FrP&YX*lJ%6&V")5fb&&5#AJ#$hRCZLJ)NB
Kdc[fS@lc&8+41k84G`VH8bAIPL!j2GVYU6-RjVbF3lRZ&DPJc0[DAFTb'rRhYdi
*$'iYhrbA$q+6*eD"#2hXL3&E#6aS*Xkh8XD5XZL!8d`D3&(YeTiH)j,QXMTfCIr
BQ',QaYKL5NVMZKb[jqBq*1K-Xm!cl6p*FZL0,qj368Vlrpap[%LPH%SI@AC!''T
Aaj91(AL#-@"3aPPimHVhYlZRfC3AeqX$cDJ8$@fJmqd&j*@%XYf`G)B2KUU3!"S
i!i4'pV`UFE3TZ%Vi1,Y29L@qKkdk$`8SRBhC9E-k+AX1V!#*JeYF)Z3(X`,GA!A
9[Q0'IDaq[E"flB1d$rZ$9epp#4ZUUbq"F")bcdZiN!#&AS+9c([M)*1*kmMQF"*
$DeK5eBS,0G(8$DlUGG,@)I*P,r@PJf6iV!k3!+U,`iQMEf'*D&FHY3@1%H!C2CV
f%Lk!`1`-EZQV3EfDc)k)alY-h[lIZ!qhTr,*MDZ6TKGp,[+bNp-`jPQCpEJ64GU
kaD!DXF'80&)2BbYeEc[GB!TTEhMfk&f2mYQTP@l1bb2j`E4mDbafS5aG4rV(QBS
,DAF-pIPCbZIRk[pq5'N+mhpAIXl%CM(qp[IPf*a9Cbj2D@i@qUC8h'a@H[,JJMD
NfrH5e-ha@AMdST,jr-qAljL($06eY9h'+bI[Gal`F%%Abe@eJpQRlELVUi0e"4+
H`Fl,5pZHa$lSC'#l'ZAeThN#F3DQm&#m#9iTh-1AH$!(GljqYG"C`e[Aj!i!N!-
-#e9Z8h4eCQBJBA-k!*!$#!FJCQpXC'9b!*!$2!!&"#"[CL!()'PdC@ec,J46G'p
`'dPdC@ec)(*PE@&TEQPZCb"dEb"9EP0dG@CQ1JY9EP0dG@CQD@jR1J#3!be"4%0
5!`!!-!e,!eYX#lGU!*!&U!&ElEm'"J2`%G[bI`KB3XQ2"YBE-CF6!*!$"J#3"3d
!N!-r"J'!!*!$"6BZ-#ia-MBZ-#ia,#"$Eh"jFQPRD(3JU5!a16N`,6)`-$%J3@a
KC'4TEL"6HA0dC@ec,#"*EQ-Z!*!$)JB"J!#3!`8f,M!Z-496G(9QCNPd)%4PE(9
iCDSJ0Li`,M%!N!--!#J!+!"r!A!%Ve99!*!$)"qT)$%j16!Y16JJ3@aKC'4TEL"
6HA0dC@ec,#"*EQ-Z!*!$0%&9Fc)!N!-"5801)`!$!*!$J!!"!)%!!J##!!-!JdC
548B!!`#3!i!!!3#"!!)!JJ!$!)-!N!-FBA9cG!#3!`&*3diM!*!&K%C548B!N!@
%!*!$&`#3"4!"5J!!!3!!C!!!!4)!N!LG384$8J-!!+J0@`TD3!*hq"a@G@ITa$j
8l""l8cGeGYLKMlFEHlVGQfq(XapX@&9L959B9@)pKKe@"3QS+DEi#q$Kbe-!CQR
mTQTq!Zi``mf2ZkL'Ld9k''%[lENXFkBX&8b2crC)HHcSaD`df)"XN!"VQK,Q&'Q
)A6F&@rG%"d@fP0"GLc#jbB*P-N%ak6ATZem5+jHST,h!2bF2)QX!N!1I384$8J-
!!+S08`UF!J,[eZ8-S,kJP[&E'CpCQD@Y&Xr+1VFhGlAHVGZca@qF!B!"!'J!B'4
c@4N!!`QS+DEi#a6T`jXZT(iHTmIX+fkNG)fEVG@5Ne4'kQM[fe09jBc#*)clFhe
!EKZmQ"@M#m+PF)ED5!k,d6C0(9`f!!X9GM$5Aj03pe-%abL$LY'cdGq3!#CfI@,
Tfflb+rVM'-Rl$J#3!d`!!J#3"3J!0!!D!4Z)'e"XC@&cC5"TER0PFR3JC'PcDb"
H-#"hDA4S1J#3"JX!#`!V!#ZJ!J4,!*!&(3!d!#d"')J#AM%!N!-k!!%!N!8f!)F
!5J$""!*25`#3"3)!43![!6q)'9i`)'&`F'9KFR-JG'mJBQ8JC'&YB@GPC#j,!*!
$'!!m!%!!Y!'B!!%"!*!(!3F!!#J+!*!$'!!m!%!!Y!'B!!%"!*!(!3J!!#J+!*!
$&3"8!'3!L`''!!%"!*!("%X!N!3(39"36!#3"JG6C@Fb!!%!N!3(8f9R-`!#I`#
3!`G6C@G1!!2r!*!$"d&38%`!N!8"!*!$J!!Ird!!)!)J!#)%N!!!*JR)!#)6j!!
L)!)!)N!"!##(i)!K$r"!)K``)#3Cra!S'SS)-M++*#BbmM*10!Bj*QAd-K*P
)Cr`)"($!%!)ri#!"!B"!!)E!J!"!!3!!)!)!!"2N!!!*b!!!"*!!!!!#)!!!!8!
!N!1!!*!(J!!Irm!!2rrJ!$rrm!!rrrJ!2rrm!$rrrJ!rrrm!2rrrJ$rrrm!rrrr
J2rrrm$rrrrJrrrrm2rrrrRrrN!-rrrrq(rrrr!rrrrJ(rrr`!rrri!(rrm!!rrq
!!(rr!!!rrJ!!(r`!!!ri!!!(m!!!!q!!!!(!!*!$J!#3"`%!"rrq!!J!J`!*J3+
!#N)#3!L%!L!*#!)3#p!$q!JJ!!J)3!!)#)!!#!N!!!J+!!!)$!!!#!J!!!J)!IJ
)#!2m#!J($!J)"Rr)#!DJL!J-S)J)$!')#!d"L!JCI3J)'8F)#"Rr#!JF-!J)$rJ
)#!"J#!J"X!J)!!!)#!!!#!rrrrJ(rri!$rrr!!rrri!2rrr!$rrri!rrrr!2rrr
i$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrr
i$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrr
i$rrrq!!!!3!(rri!#!#$!!Z"!S!)3J*!#B3#)!K)!K!,N!!$q!JJ!!J)3!!)#)!
!#!N!!!J+!!!)$!!!#!J!!!J)!IJ)#!2m#!J($!J)"Rr)#!DJL!J-S)J)$!')#!d
"L!JCI3J)'8F)#"Rr#!JF-!J)$rJ)#!"J#!J"X!J)!!!)#!!!#!rrrrJ(rri!$rr
r!!rrri!2rrr!$rrri!rrrr!2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rr
rq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rr
rq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!!!!3!(rri!#!#$!!Z"!S!+3J*!#N3
#)!T)!K!+8!2i##!!#!K!!!J)J!!)#3!!#!S!!!J-!!!)#!!!#!J"q!J)!r`)#!F
-#!J'ImJ)"U#)#!bJL!J-!BJ)$3')#"Pp#!JC4`J)'Im)#"``#!J2q!J)!'!)#!'
`#!J!!!J)!!!)$rrrq!IrrJ!2rrm!$rrrJ!rrrm!2rrrJ$rrrm!rrrrJ2rrri$rr
rq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rr
rq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri!!!
"!*!$J!!!!8!!!!)J!!!%N!!!!!R)!!!6j!!!)!)!!%!"!!#(i)!"$r"!!K``)!3
Cra!)'SS)%M++*#BbmM*10!Bj*QAd-K*P)Cr`)"($!%!)ri#!"!B"!!)E!J!"
!!3!!)!)!!"2N!!!*b!!!"*!!!!!#)!!!!8!!N!1!!*!(J!!!!F!!!!2J!!!(m!!
!$rJ!!"rm!!!rrJ!!Irm!!2rrJ!(rrm!$rrrJ"rrrm!rrrrJIrrrm2rrrrRrrN!-
rrrrq(rrrr!rrrrJ(rrr`!rrri!(rrm!!rrq!!(rr!!!rrJ!!(r`!!!ri!!!(m!!
!!q!!!!(!!*!$J!#3#(G"4%05!`!!J!e6#eXJ!`1QB-1UDV-`X!%LBQ!h5l(E@C@
J)',$(ZVC`*K9-3YM+VVhTe1X#JZ*BmLfiRI@!&)SrH'p`)*+Z-9!Tf0)-Sk[fIF
Q)JkrkFEqqpLI1PG2++D4"4f4ZS)CZ+2&'UkSDLHN6c)+ldA1"3#3!eG"4%05!`!
"!3e6!Yc@"T2hdNE0440Y!,6j0bkmfddECX*X[UX,hi6GX0[NhAE9eA9K!!NiTBM
rG!Ak'M5Q0Klla*eVf8k#LE$6%2V!XqJ!D*!!aElq",i'!*!'!5*"4%05!`!$LJe
6#TXN!(q'4E$G16N6X-81A8Y16ahE!48$fl(kf!a@pFiq++KBI@c"EUcUaX!rBhp
8p,rrEircGPBCaZS!#jNe$9a@MI6"MNEhVP-Dl!5cmbJ8h-AL-N+fe,NJbA-,N!$
IEi*fJZR44(62+AQc%pfmbHiVKB3cc%YDkTT5LKd,2KqEdhm%m(Vq1HV+dqTUrjp
IEXHVRre$rrZ4PL8#Z$0USi*Y9X&)*Va&Ufb-9E9H@cjLQlH&l@%9IG`AaY*D6+5
8Y!*a(daqM-2AVK[QKkBCkP2EpNhG$lS3D&U!*`6)!*`!6,hk,3$qkJN$%Am!m+*
bi3)3()+!!B*LB#diLj&"M0m-3Z351Z,UBj,-[5Ka(dcIG2P&a#YXbaJ!N!-`!*!
("!!!rj!'!!%!N!F#!*!(!`#3"`6rN!B!N!-'!*!&$`!!"!#3%B%!N"k"!2m!N"b
"!&3Vr`#3'S%!92p8+rm!N"L"!&6rN!08+rm!N"D"!&6rN!98+rm!N"5"!2AfN!0
8pT!%+rm!N"+"!2AfN!6ipT!&+rm!N"#"!2AfpS'3"PEhp[BVr`#3$S%!pIEfrIq
3"[a@pT!$+rm!N!b"!2AfpPErIrH3")(rprD3"#[r!*!+J3$epT!$r2hh9Rq3"DZ
3!hrfpL[r!*!)J3"8pT!%rhrfIbTr!*!$9&4r9L[f9#[r!*!'J3"8rrD3!eErq2G
r+Rm!N!089+[h+rEr9#[r!*!%J3"8rrrfN!2mrIG@9#T8N!9rUrIfp[rr9#[r!!#
"!&6rN!08q2ErIrCr+T!&9&4rIrIi92q3!e6ir`!!rbY8rrrfpPErprGr+S'3"+a
8UeEfN!2rre6ir`#3"2mV92rfp[cppPDV+S(fN!1"IrrhpT!$re6ir`#3"[mV92E
frIhh9UZVrj!'IrIfN!08q2m!N!Mr+rEf9[jrpj!%ri(hN!6fN!2hq2m!N!Vr+rE
f9[hrN!D"pT!&prMr!*!-rb[fN!ErJIH3!rD3!rIir`#3$[mVpT!$rrrirrripT!
$prMr!*!3rb[fN!2hprMhN!2fprMr!*!5rb[fN!48pT!$prMr!*!8rbY8rj!&92M
r!*!@rbY8rj!$92Mr!*!BrbY8re6ir`#3'[mV92Mr!*!FrrMr!*!Hr`#3-9Xj384
$8J-![YB393e94")!)@,Z9Xpp[MQ2i`K(#'NU`Eb%N!!Hd55Rf%a'SLBA$HH4*XF
P5Q3X16rIh#NNm6B'59hrR&1L""%3F4R(-M39"T+!)9L@C9bA#BcY@0CPa&,'8TC
D5kPPaE(@X6E'h2IhHjlhlVdB46UG[rr2!"UPTb6+J5")JL!))J-!AC2rFGAj9c@
L-`Kmhd+'[J6(q1Z+$jQDR`!TmAH2rm!G0q9pqYpU+dC[8UlHIaY@h2#0fJUk5X4
"[[S'%EA9"aehkAlc'3AN81hq9hXVl%r[hIRZl*(IJGKC2&,llQa-X$%q$eVkhrf
$%d5U$`Fk8Nk3!(ZI'2MdTf(E4b"C[[Z(82+ADja$cFXr(0KVI[Ff6(r2daQBVZ6
TrI4kY#*qj[0Rk29S4D+0TbY"&+llr*Q#I`))2NLIY"-J))jBqjHF#mFYBD!#0Ck
jr+VP`i*r!KdT$d6Ql1D9LZJl5,kIcbmrTE+`4+9Zh[2RSVp35Ic%mC0S1kAdAre
$f8IQPj`*%+ZLiF*iVrVRcPpNpPTlUaHlEq(QXA!K6cB'aXaj[mTccq+Z(VCKF&'
JGpp(EMR!&!E"6Pele0lj(E("jmk%!a&3*il2'R-qTf)&8d'3!(3VQmT5Kj5PDNT
RRph12lrSr!8Pc%66,d6$9qJfifGjaK4U#NcKjJbY16"&$K8[KMB1U@ZE[a(Bl0L
X%VA+AU`r8TA2*)0A1Y,1jiqF8SiprePd(SXrMm@I9iR5Er8SGflh0de*AVTMHY+
80%I0HIG(hDip4fJS[aS,1jcIqS0jlKLr+Y5ZYhhV$e2Q6Y02)A2T8*hhY,Y8jL6
VT-TfI@G9IQN4%8hEGREFe@'MU""lY+2rhGQLdi1*R&*d5KX45ZAJcImUAJ4SZ+H
lZF2Qk64S9rjIKA,jiK3GU,*,Mb+a8I[ZE9BXd4I"G!BL'@fj2he5CH5$")arL*D
Vd&m[H+AhKdTe,mcV8kD("e2,#ek"b*,BpV1-I2-ICmrHpEiU"N)8krh[hK+fk@-
E333[@*VaURqal4201e%MH5KI'BBY3H3(41iGkVlAfR$RJR"%(aXrVVmarVaHS[[
ee2JZN!$p8diD0-pqFF4mcbU&a660eNY'I[Ic95S#XR0m*19f[(bP!!cq[&R&r@m
pYXLqa!U[4*%N[eb$`fihXT6ldpflV3h*rR#mfFl,S1ai(D*bE&K!b[%9EH3lkJ!
"Am9UFajI*!k2Al#-50@VlJ"P$"kf6X2,qfXbeVaFU8FpM'&TTFLBGJBaZ-l)B&Y
*hBp4%,a51RaGK,`[!Z9qpXM,+D#NjkD!JTG'i,Xlp`EHAE&ab'l[3!5%MJL)JU@
AmpYUhefKfh`h8h#ErqK82I'#U52+EFY0+L*[1`THD90QbrbVbj2QhKrNhGpVYPJ
XH9I2QLCI"PdCp9a*@LaQLbqV%8NpmeJi&Vhk!$Ca*QLLaq@J!rc5E#P2jPalrl4
lSZd[e8H@[K5)2rB0,&d-+[LKh9lK*$*F4i+L&C01[H5H2RY69)hhMamE[HRG#Q5
@elG@YMCe)($XGSUJD1jZGMB[4#6(rfReReEMMB'A3"51eUl3Kd)jTiiKBUE[Pc0
("KZ9cd3&%3LldA!X&2mJkNX4QMB[FMX+jS9[4`C-Nh@Hb)09(BQpY62pAIILNp&
eDm(-aANJjMNX(q,D),,"ZCIc3mP4!0lM5cqUY2pEecmm"q#lDiBqj$ZRkpUaeM&
I+K62!d&2LmllD+cV2QGre`acRJ-4!E[9jEc0#Sdr2keNjNl4RFMHCb*lAfGI"D,
rd-P3+%IEd*bR44Q!'85RdYEKq1RN4ldcVmI4PFGcYR[dVr5KFch(I8'$NM8'65q
BqF-ccefj6R9G`jqmjklBl9hc,E9Gecph46Qk&KA-r*SEiSLDKq-+Nk@iB$)2Sd#
SEHr"6kKJhMI(R%8NA%5&Gq*9r-QI*K!jHHF#$&q%U%j0a#Xk+'S'J!b5,488M@U
Z[H'VjYFl1,T2fCUr4p&bbJCf9i`r0a+P&bJk[bHZ0`%8FQS%p3BB(U`*N!"hA!V
2#I#Yb3T59ALIm`&cAUPblP84Fpl55EPA8T4Va@C0FKqJ9iHd9j0(e1bhk'rG@p1
MFimidGLQCNqK[h96lSr1"5JhIE)cf8JAiZDm1J9JVBNfU(&aViTKZcG,eHcAk@r
GkrG'jdjDIH6H0`qJ'*beqHXSXVkq3m@GDHDm@C24MD%B-C!!`bQD%5"#E[ic%%Z
UHE`0N9r)m+cMcjF(L1(pa1jh9NFEdXcc$d81pXrdQkmqd$mc`hc0fL0VXehaf42
SEpf%'G2QCZIBCKcC6qaqjb#aGI@b5HDVkj,lqfF'c0r"T8Zi0'RYNG+iKp9TFbF
eCY25Cdh@!iI"+MiDXfpb8icCfjQ4U`FfZP4hmhKr#8HApieE+IU*SXV+EJFJeGr
e$f'A+d$4a-S'BP(r0BH+$LREaN-+dF%Jf5*#NJ+cjC(b%VHV[&X-60"![4FaE6C
X(c5dqIm[*e'8kSpi3@&%!0U)SG(F3%C0F4(bQH&j1lS"b0kR@e'ifC!!h8P"9p"
`C0Sh`+YaKij[RVbPa0k%a95-Pe,JeKLm,'M`QpXGl!XD2#RG`8X)p9[2'6c!%Sk
kVE3[ERkG2Ke$pMjlAfXcXVQ%5V6q@6BUNc+eYQ159-R@2hXfJr$J%5LLUVYFI5m
D0S95b0jFm!k&&%85hJ0MRhKlPdVj1NNd1,+c3c*lfTr[2K0+F*DBKNZADDL-S#a
A1AFK!L0'VhfE"DZGJY8qBVIjG3Tmh3q`hD9ZG2!e4(2#icQl9+IhQ,kb82*b[Sb
Bp36$BLF#f*`(m(daAddl-H4m,Li"ZF[+JEm$p)0%ZSQ3!%bCp[UlEYi,3,Q,!2m
qIe3I3p0kEPVZGKA9UAdiVUa)(Q[#mB9kEIX-CLjM)f98bi%'*Q[rqr@q0NVmK)[
2BpQC%*Hld&cEY4ir0f2B+RmqJG4G2r1J'3+)&N)$D#!+LTJA"9Rd+&K8jbe[Clj
8Zip"-(%&'D2ZRj,j%KeFIBYhm44e6HK0#,*4$Pc6U!K*ICY0r9h(Fd`)Y1k1rUl
6%U@5TNB&!ETfj@YS4GGKp('9XqL#aNmDLj`*,BXP),f))m""[,GG6!iRRp[FG@,
[MUl6cr9fA4kpkAhIAR0AeHK0A31KkqDi84`SYGV$`SZ(`%*(M+212l#1AFi2Aj&
GYGaFqlk21c0r1)iSQ64U`1'EQ#&23qGd&!-3r3r0eM%53RKDB20&31Rf+mCKAkC
UA(YkU!J4'P8EBh6e)U,Z-[*abHcF$4$"krN6Tj9(J22XCFaJJEG*j6+6AK'2Xk$
kZeV%-FXm`[-fMML,'T9NQ4J1&Q5@fLq0VQb@Q9*SFcUrQ0PefVF2aER2R(F`cAc
eJUM2`FAPC4S`rQ9(C'-DYQZP!!`Adc*ac)#cb2M#YmTS8J"!%dAD3d!U4!kh`1b
RNVb"EJdp0-GY3#!H4J2)D`!FaZFK[p)j+c89c,Yfe8-PUZe,X+,kj4B2A3QGI+9
D0@#VND#YlT5Em9AbY-@Y4FKXl``hm2D2M$rr8#C[M%LSDjIaYTAUBmqfa+MB&)0
,B5Vb4&Y*HBP"E"b9bP&(B+f4XT!!B@4"LBkKREd&$m0S+SdMrdi6Q%$0Cip9(r!
dZp'F%-d0RQBVQL1bqCahL`0S6K20hLhfS$NQQVeE8(4L0U*229'q3+IE21"A(kD
[INMJ9ap!Ec+Ud1HiJ4LpUT-4SJGJp+@*'L'Q8,IfVT[BK)bQ1a#G8hG&@EVXKIM
Th)+VpZ,4G40[aUBMS@*NGH8!&q-K*fdAMMN6EKA2dHXQhN)CVNRj%'Q2*MHZ01'
+f!!CS-eqd&*Thm1AVc0FEJ5KC-4q%8"Y13jm%$p2mk9a,SbRB+(P@dSQpPNV*rE
j9$a#Jm6Q6f2$Td!DZ`'E6JPpHikEMjQ(TQQ8TFRV%h2-`dNNImEQimS5-[[bC$8
f@)-P@rGY+@PUSQRcRjee63#(+,)("-De-2%DXK4XcQfp#i@IfN)Q99G3q#N*mUT
NV8TH1Lm')F,S#Nc)5R$)C$Eb!r(@2TP3fMkjcGmIX%pcY"#US2!UGPRp%jb(#'$
l`f#1EIU%k9&%B[HjLh@VIj!!!mlPH6Ni2HSDa6)V%!hG"q*%&adi%0JaS1mJi+)
9QE&Z!rPPDAQJlJ'BPhhY0!aJ'V#jHi5!b)-%D&eYcS0a@#'EK(eY5mq"P(fafe3
e*G",3"+Clbb)RTTZaH9`+@e2E')jLmAQCG6Tf!h`CCS8D"m93)8hG0N[KSZG-5'
-X@S(PVTNa2r`QmG9B+"U%SLb&95X3Q!9"edD'kH8IB`&8iS0*cFrJ@%NdLX(5Da
L5&-AALla(MKeaNB%5r0U0Uc%)H-21qXQpKP)L8fF!4CZe)UVHBjl#9MC#0-#eFf
)RLUiY13Lc%fGPUkTeaa9`dPT+1J052@CZE)[Bf1NpGV656,pkmXJ8d($J1KjEYk
BD#eX+qQ`JE8QA$(Kjd"cUk1,J,Hq$0mQ#8lcY6GV#`hGYdpPHEYT!l@GKQjPCBb
0"b-!qDb"AL-$)RK3i'JX(ia`Nl,l,3!"X26qpTk1r[D3!(Ri1K-K-3%,5&U133`
hHiZYM2``HmYB06,p#KTd')NFCAN5b4be'4Fb!$,-S"H@9R@F%N%S6LU`m3bmQ#@
+[G64C1MihV'ZLR3(1(`UEDjSQXeEZC+2!QMCa@!B$"c$HbcITUYJ+@99Eh"bmIh
kbi+eY1R@0#$bXPhjG"R)2BC%P"rQTpFlLd,((jpjJhm['VT@p)mYqF!lL-"!%26
Q6D``,KDX9"NfUPcb!3T'C!'fXKV$$Mk(&ee0q-5l9MVlhipV34iZ41*`%GJbKHa
lafl`$k[bL!6$('F!Y,lS'm%f,J4r&5C1+RE4qD4JhMXI(%f5-1"92cLUq!8#"Lm
3bH2S9j(hIIlmBjH3!-Rf[qpl)dU!bcej[H[k$J6H#NA'kq"&)hd(+0[V1c"kd`d
CCVrPfd9-J,SZ$Q2'ICjA,hTIT9E"4#jb(KZ5jmh-#1JEKq**5N63B%Si[$1#!q[
k$Z38,BXH5XV$firimdp&2KTJaJp)X1'G1Mm1@$+[B0iEYa"V[HZ@c1[p8m3QVe#
K!,0-"#!CCbkCCkkXZ+CMD#2qb3qZ$CSVTrk!LN9kLBBm+`'$Km+(4-2iFaM3AVQ
hFZULpUp'edhp`H9",,k6f*ZkN!!1U-ThGiV"235m[Pq2*T@B8$![--"J%#8LSK$
(FFRb)cG3`[Sk8brBa6B0ejPS'rPbb#@Z42M+3GPXZ5LDdlJj5cD2@[I@YRr9$Q%
XH3d#k5bBGhEG+)+&J-VRDYXVZbk$D(!#blX'Vad!RJF+jM@X#pREJCC%EUc1)1(
['!jPN[Pf@`Pe#ekT(D"Z1@@L*MhJ-XhSkR0NCZG@MNAkB$!BlY3c$rV*V(Y60`N
0%jZINEEFT5i"JD*'&,2#!jfU4L(lqDbZTLpQd9E4h%UPqK`c%!%bX3A0'qkMk5I
`EQ-Q"63H!i'[6'c3B-kVbLG$ibfI3k4Pb%"I)fmjTR`fHIL@ekVbMBG9VV@q&&E
a`Lq3!'%Hfk4(PQ+5@dF(GLJTY0e2DkM$*"2m0,p0*+8)Y[[pF4Pm!2C9mRVV$Tq
Ea)V-i5YN9j@861!X`qBE#ASalpGGe'cdSXN*R-99dL!D$,,-9`Li@,"(6[T)@*B
2+5YilLNUq*Gd)4XDmqI$P$U#(bapIb-#HZ'1GAe9PkG3GJE@BYBGiCLPIm'VlQj
Q"#"9H!@a[Z"9mJS9m!UM%%C(AF80q*QR#4SLU&`b'3FdH!p!dd8d+34HT'B`i,K
1hclM8S@SUkJJG@p,1+jJi5aC&LbFF%S+fAfQSflLCaee66p)j`K#cc)@b-8,"(+
PB0lQqrcjR*!!l0B#[eaam+ZQ@cVUPLc!6aH'"L#)@rhj32SA[GNUR"Pd1BX+jK@
mLkcb#pj'NK6I,*Mh,aY!8J4"e6&X-04P!$U8,#p0a[*H#X1BaP5DQ#36fll,S43
D1iY,ilA)+#-UiV2b*-eR`D48lBjAKaY#6Xr&E('a,45KLf@PbEr!`!3ZG[-NM8c
Kk@)5@E@eIm%%`Gb4JRRV&Ph1Pk,MS*iJ$Dd"4,0KVh8irYSl)miKYI5*J4%c*J#
PIlXSE+*S0L4hVKYIZK%%TB*A%+N"XV9+MTMGXF3$Gm+p$EUQZ@1CBjBU%-$l$Qj
3F6JSkRVj#S#3!,M$"EZfkm)@+d#f5[eP5Xl%q5MRbq5`#Cdl4ljU3bF1Z$R,FTD
[a$%BK5kD)fL1BC*3FEb-1"T820P4D6-e*$X#B`q-UGfm@@'U38AZ(!R((U"08il
KMIEiDbGNpcT63h`2SMMqiL!ba(EpM@mJ8RIdj9&PXcE%(hqRZ,XK149VZ0B"FSc
2"XC[Hq!-+,Th[6`F0kP#kh"L4HeQ(&f)kd1@--MFIAVqi@&EP5S1THDiI@f(ci$
)86CRYfrINfI8LmVjj*8GJCf2U+a3%UpM,jp4CDS3U(K8hcN#Sr"0'fl2,VL(d)+
LHQ8d)%h(Ch*%B#&-2"dJkJ*G4JEGjBM@Dh31hIiB6$dG#pD%BpBei@lhLYi+TIp
m&L)hD9L8c4C-C,,JIl9J&SB(h1Y1eqHF!j+iDdmH1i2*mA2I2hFDNd%LT@1bc"G
k"FB*kYRrI9bRbDTh6Kc(*,R[C%re1jKBDQYT32*icXPDQJa@BdB6*Ii"FDD0))K
$%FGCp3UFS(8lcXC2!lb2"-EF-91$ilHA+6,I$@*@3r*&6+RBjb"$aiT!M#3l`Jd
Ld!lSq8Z!dVrqY[0EG@E(@&&aZ-`aYV%iE-+R)9b)TJDBE#Kh)BkeKB!1S35K,EC
5-U!VXf5bVie&q9lL``'14PHI$ITLZ+,F-6CIT)MkUb3bU,)4FhGa@$90Ak"m+al
rKTl#b`@-c,(GNE68G6"CC[3S#d+2&+%(`,VG'*iY8E'fM*EQq04"J*-$Rd4Y*(0
--YMN0M*'b9'p)CRkE""1V9k&KbaVI98[`V$pGab0$5rR3!3Pa'!U0SqC[QRYJ+1
p3RaLiFK63fl6q*!!fb'lR`mKNR[)"RD+J"CXaZ*J*cKA!@f"-(!k!`-+C51%b3$
#2(De1qkr@JjiNJESKiNF8!cNFMcjQ'UcR&'(!"EA@C1qb(MF(4p2i(Sh[4jTK5(
5*b0dK)e3fTl(@pK80ap80[iPKKE5N!$,Vr)!bB)$,0a)VaKp@e9@ZN1+$82U,KK
5U)Tji#&QZ@jmXr3#)q3&5&J44,QQ%-Q`$Ti#cM!Ji++k+#*KaL"!NcYL@U@5b+J
U,#Bah0rm%iJh-M+)$#l&8A2`S!+NI*L-1TV(DFQ@'r@Lm!K&"cU,BBLH#TFY'$Z
"6$Gc0"`c&Gq6jejK-JA'aZXdc`L'&hBNQ2Kj+a,T#qGd0LU3!#)F--1Ibmik%'A
M*)%b5F)3@!YaUG"q+`J"$[[FIL)(p2%'*0*Z-G6'3l-l%KK@CPq0BGhfcrMLJdJ
+2rXaAIiaQeq-ih*fD"m4(HKB(2md(e[X1GCdpcDEBlZMV9$NU5eN(VHDL+SJ5Ac
'BZ$YH![iICq,c3RPP["02L+61-M!&`XQ`XCRr1SZ1#1)i*!!I5#`&BYMZJd-Gc,
$*Ml#3F34,$DQ,4BLrSaC,21`+"fNC@qK5k[jdQGmT*Hjkbi8mhD'MpkYiCB,KLp
NFXpF#Z"3I)lEicRc036L4FjPBGh#JF$)&0SY&JNb2F`*b3P3&j2BDG'VdPhdHL)
#)*V0"L*H)FLJhCS61XGB608f8QEeb`(TF+YeRh4#0E9(1YaLXQFD5'ph&P'8acj
R%D%YR2)XZQ)h[L*(KdL3!(l@@14c%''#ZP1c'iYJ9T4bp0Vr(U6T+EZN!lGeC13
)JXTY'0c$JpGTN5Fb%XSHakXAD6JGJ+'Vd!"'p$[(GhA!84XGf$ar#!6Jj[FELaa
G+*ILpX@q6Vk#lB6cJJ804Hj#V4(X9$@!(9qm%F6(`cqeZCda@SS%e`aHF$fCaE"
6$1Pma"3NV0)JBAdNK99K&X*b5)'dIS5%6*iQ(L6r@6KpDic#U6J$eR[Y[r*eH`B
b)0qhJB6Q1aSXV+RYZ1a,6eJ6lm1VA+q`TQ)$R`f%h%qh,jkTDi2&8l%r@$c53Bd
AA6PEC$*6aEX`hNJ4f$JjG2$BZCiF4DD,&A2)-4d%e`f!Yq`d14PZ)`I$PQ@@4e&
m+h@lG@ElF*K)dIhY`a6CJD6'A%3e(h5"iI+ZLP9YA4AV6bHYABS)HfZYj$`BbG+
+16*L*0PN9IlmF%"EZRL&a%XbKa2FTV#M("kKVFZqq(65l4N)XS(El"G$c@,S!F0
39lT$piLK0Zp3Q(!&X#5(C4QB+lBmLX[GQ"D@EmMB8CA4YX(I@j9a1QP+5'H!XLJ
"10j&C!)!5)9L#N-F#+6Fd8AAj)[MTmkG&#m+V460Pm,(!FH+5@fMmrP)!JkM@0U
C8BmSL$L+SjJ&!R8h5S(#@6f4Q1Ce2UXAqETPSb58P*N!DTKN%`EXei[S)LIF$fC
mR`hC214q$U*LEI#hU[3Lcd8F5F%23cC[e!"l%cec[iQFDQNNT'Sb4$$$'!*0TcB
0UlE-Amh2Q-*4DK#XZSD$XC1b,le&a6$Ta!5'%1l1N!"T4K6%f650r&FlRa06"XH
DMQ)A!3E)mSC9FHH"#"&b6af(N!!2U$TGq3,11"N,%+P`@64`T2[)F,)mpaqq%hM
ElA*ZENXpm*lG2UMf(AC4X+5TNr@&2$Pk)KBj$'H5+["fB$2!K"X&UA%K!CfC&YU
dmQPLTGMTLA5*%)"#@@ma'80'!KDk5+S)&N6C['2%'Fqd`1baQ-!f[2LQH''6,hb
V3NQA*fV+e0rqJKD4B3Ph$2P194qAR[[ApeY,L*`8YUAUb&MQdY9jbFd+6NhCqcf
qXhHAHI65MS'G"CX(mR-hl`L`#6&[FV,kl$QabG,YEI+Sf'3dGqGSjZp'#dDIdED
Kj9NS@5mRD@)5imNCZIb3!)+5#TYi95KH&BJ'2dAp%qNDdH0R&",6$cLPZB&bM+j
5bj!!P#N2THNrSQ5Mmh%UhN45"XAIi-lH3'E'D#"$UAh&[6Re*h[Up@1R+ReR`kr
NR1b"aE4qmYaqBV1TBcH@bpP5l"!4"#pHjBjERR(ZTSKTjDL$N!!*U(Z60mchmp*
HSk)5*LN9)c-1,S@*EJ9!$SM+IS-%FlBJQ@T[JBHUa0!5LV$C#0'dSYjY`#H,
D[(PR)01rSjFc2rZ8MYhBYM"SfcQml3BklM*&Ecc,3&dVEce"fhT6NHm6!9$0SFQ
6b1j9(%%9XEGFbKY"T-4SD!'-f#pG(8@bi',5l566hUCp@'bjA$TjFfcj0N8DK"b
Y$fmUZT3AVE1r$I2%C$Kq-ERP'G9Gaq$!VAf8PEmeN!#r#`Lc-hF(Xll%r-IG$*T
Uc1[5LjP!T2b6#S5ZP8(%E&GS`VBA!URqG[0ZdfjIhC8NA5(8N!#$0XENS+EE5@b
PL"3**GXRKHqe6U)V(cp$4DkD,4K#N6XPXhHd3-0IGT!!cSK65!XVNXB1)RV$00*
I)N%SZ44iJ!!KIfpq`F$1Cca,ZYhmab5CckG)9(h[3P4l1SBSEqU!19QpMcEYF*L
V&4*U*#kh#f641*'bU"KFYaK"8QB*Se$XNm2`!UCP+d+ELL"+4qj269&LS3TSqKU
GlNHFP)&pqqH)9Z6MbI(T4F9HMaabGi-)iLI2Kd#jb[SQ[pKMhIbpUj'mkV4Z[R5
004iZ,(HmmAIc%p2L0BHp34I,i069C%0L0#q*jK4XQ!TTQ'9!'rM&`#Fmd2+K-hC
e(db'HUK)Q&KB9d61Mke[SN#p`6*J5F2![1idZ9ABbB(DlEf#"Aq1DlIX+j+0C#$
A#h0Kr8I1al(40DBd5Q,L`!D`B!SIj'"IJJ#I6!&HThbkh&)BQY"QUrF9m6EVB#D
)EH3@[)!4H*AepXrK9H"SKX5%3HmLH`$LMF`Ja$ZD0+AjBR8`J*ci#CCJBZ6SPKX
A$YB9X@MIT%L9'd'JkRq'&&#B&JXN!I#l"NMbc)k#(B(4h*Ui3X'e!XK5V$QN[kL
XKj4ILYihY#A6[U,r(3+G'""E!C!!DAiG)L2dA2rJ#&3[D&RA0iR3P'BjT'+5N@p
+4N`S-+*DKVD@-L$N&MX(cYGJ3A&L"CQK-a4*2c0FKXZEG`b-lXV0S'X&Slr$eE,
1RC8pp6Q9p6fk(dKGRe0IHDcq('pS)Q!mQJN66[cBh#D+[S8M"-F@)U6Ch"&,T6H
C-F'r)r#lM2b"6*SB'#*NK@(K9C6TJHLL[*RIflhQ(Ef2l#c)h,PCHMFB[598PXc
S8aC#pF)0Z2j'ANjm!8fZlNPq&R[MQQ[LR)%Tpb%D`JGN#Bm1mpZlUMNS8e+%F,!
MJl`HJZa'GT(RpI4[$q3(HRGi'C!!#`j,a!#!8IJ8-SP#`A5KTScKpF#1h"fMQ8%
A1mJTE)U#r&)H&iJ1Dl8U#*14@d(cDJXk#&5rUd4EH'iq0KM)pqmSi)8[0[ra@N)
Efci`)&(R8Tiel3h+U#8+T8b)M[E&,rk#[4k+&$DIJaNGXT9#*',5i'RmcL*+3#c
jC+J)S0MldJZ&IY813H6mD-'E[&fP+Fd6S#Qhfc)!-EiB[&d(&a6b8c"[qG'')Z0
V!!'Pk4drFESmr[HcMFH$AFGI$DL#Eqj!%Aj)T6Ph4mEXeiGMIc%@MSZ!1BQ!JE)
,dh*0`&4J@hBmXl0!HUX+$JjNf42EUFMALSfQ+4qAf+G5XDLKdf4Fh&'`QDmeNG-
RpSb@ZUE&Kak!X9Q8`-53!&f2KT4VM$FYPX9Gdjq`HACGd4Yjj&$-#U#$XdM*RSm
c4"L`FAC,MRF3ZGDdQ%"0baL4DFaj(8S[)Y,ER$SHM!2IZ0SkqA[A%0Kp+5J,4Y!
p"H%JX84()3+JS(Q09eKi24Q-3I!"2ah5UVY+[+peKmr$%JU9$cYJRVcH9&S8LV4
21L9I(FHV6AVDq5J@Qd(&lXK5CL,2qLLc2l,KdHS8$chKMKpk31qXLRC)JlDBYS5
0NHBeZL-F)38[3NKe*+#qQb(ma6JJ8JG$"J4C&V)N,@[X4-(,@@-'&@"+mmULi%4
#9#rkj8MGS1[(P[#Q,q+k@'iC(m$QHF`%)JaY[VSLajZd5&pR4bGG"%'c63+(H[5
L`X(&@U'*Jd%N@ZSpf$`+!a+4&4-J`XGI*-&"q!b1VH3Jq&`H,%#GAb-V4YB2Y(,
JX,0lSPP&',B[Q$QT5!G4CTr8dHXp2,L8R6f[P%`DPiBK1Jpj[ZB5a6E&G88GMU+
BLDjq*GLTBeBZPY)"mESdRB,Y63ifQ-aUSK!#Q1d9J!Df'#8JMD&Cr#5i$*-TE`0
&p!5LQe3('f%551Y&@qVHXeB6,"86VrIQqmq$CVQci*RmA4NHNC+(kS6aPXRbM(i
RJ3NqPr94bPCmZRA5pfK5h%%!&ic$rR4k"!Ui[RGN!EpJp(r'&h$Yq0(2aB",KiT
)J'!ajQ@&JlUXrBb+Ak,YpibB5@h1JXFqSFfT1(!F0*Q[hR#%0ieX'V)rJff4X*G
E-8R843EC`9[+aPN6J!*,'*!!3&3+-T!!HkNM%a4*DVMHfa#RKRRHKJ3eY(JE)Y5
`QMH(fLJi3eZbE-,5)d`dLflK3#Sf"0,EZ`VmSlf2l#M)#*cAK(NY#G0%4+&dK*N
G,-a9T8+Bf8(#h+`*Fj@Y9!Sc981BUHd+-dA#R"FXc!'j%5FL,K5PD$bNET[3%5-
a!Vd'[1MP(Eb&!I2Lj9l!I-,!D'B'I+U3!)*@f*-BZ1Ld%&U0Q4k`M(Ch,KLV(0B
k5dH(!24I6++KXrfCfJ#FS)fCARE$,00CK%L5Nr9+&@,bIq$N-"B"[,%TbN-1K,B
ca&R8AN,&$j`"2Z2qA'lp29PX%k#9ThQ$ehCQJULb!m9mIX'P83'5SkK1T)6D#`G
P,aaijGDe((KlN!$adk5-!`pCp#f9&(J,*TGiLr*LbQ`k1'&$a#*NVR0NaL'mGji
AG9k6fG[[4[eH`69Tk-2+0e#mp9(#B141cLb+1qj%dG&(iJXZQJ5MhB*4'iUT2J0
i8@dC1+UBX644f,jS,I&GBM"X$"&9C4['[NI*JJCU5L%KVllN3Y*&"&3kNPi)MeA
HM5AMT36L"V*`hCA'k!22FQr8[8BN-3UY!m%&VDp6C*LX2%mQ`qZ+T&Jmb!5ar&q
)4FKNjij-,ab,i&Q**$aYBS+Ma3b0Y)P)pY-!YRAjUS--m6c*`$4NkG5%l29K(0A
T5G`kT2KaN!$hK06Zhm(acGR+-"dP%!&CV#Y+4**MSFSHQF(2VBE`D$&$P#e,3#V
dC'ZTkmI@Y6i8`&%9"D%3!cJcCZ-D%*&D5qZJdJYEGBC5VD@%%SF8E5l"Ie1HJCc
4+mJC'N,+4#jYKD53!0a+JNRHVEKBLI9cST0!B%()k283-V3#fd'-BjpP+,6hA&"
S`hK*cqK)#4#X!L`ADJY"FVHBLNF8@*d3Cj'"H8r"JL-&ldB3`EU@R&%4!'"heK@
jEG,VV!Y4-8PEpAZ5bJ,-NeaV#Ba#++4%i0+d`k3Pm,')'#I+5bQCljE!KX'im9p
Z#8lq!j!!5#G*a`Gdi`!A(p$GB8*N!Id8'JkbU6hLS$,h(TQNV$N-B23"'Z"05[l
VcYjYT#6&X3iFQmA(1MT-(N4*L+0-lQj*%*2ErckE'M8aJ`bA6[T`Za[IZBf0Zi`
E!pLi)1dSYV9jYV@aN!"56!C*%pX@LQeY4EcYVdh8U)(l3!S"lB[0LMd#,fB@[3#
8h0LNBQ,M,#(`iTV$F%J6$I!#U'q4`!9m+JlUa%&YI&!R(f3ma+(Da#(&lKV!S$c
JhjkQPd'!D%diE1X1fVIpJeCq%(c3Ujk&H-%pNFaH'LlQBe)iKV)#QpMDi5l8NP"
,&P#$p%L6G[CbDNPXB2*i)e1(N89%p)Z01S8h-V"Am4Upm'DCVqrX$FSaYdS%@GX
A`3m,Jd@`PJqj)2IIZX-kYhrBBMhiX0GCh0lb9cLKF8+PKS1-r5Q"H9S0Uk1+J1K
6Tl13!0"da03rRdM"XAK[)0YG"C*pM+-bCKd[KkP'R!#fkrCh4Z(3`d&1bM1b-hU
2fYh1`*4!GXEE'EeZ'TEJBCdmV&!k2Eq8IBN'TQMJTEF[pG+")Q*M#Q90HVBccHY
iN!$Bh1-F-V!jV"#*%S(DZjJd%+p@UDIfJ9e6@S30LjR*Ick"NCUc+e$d#T0CbG*
N3h)JQC%mN3`P,bBR*&FR@j-I*1FRTbGR*pFPqq+fH('m2(iJESRlijr%Uq0(ii2
a"q02a4I%mq,6il2Mkq*p#9XL+e'DD%J-*$)5[N42BPTLE@*1SMea6@*@BQjLC53
H-89')JFL!j'-L#r5%jN@@4Tj0[*ZC&jN8H5qb+V)LV48fVid9eTMQMRY8YVaY*b
dD0TVD8qRGDAPT8e2ZcPY45`9+iZjBSfacE&,X61aSl%*X@GMlE&VBV0LFf-VGmG
fGqiHfHhF[@PhlZiAGjrCIAThpZjPZmGh,pLGYrZUhEIY[RhhLP3m9CMDPbT2(8a
Y5PP6Pe)R1[[8hq%R1q-PYpVY%pe*h+d5h6HjDaAGYlJl*,U2FlG1G"rNVLkk6h1
h@h4rbGf)k)j60lC#G1G`GjAS2XAGHdAh#HiZ&0erjqi0S[XKGpY&YjQlFd5hPEY
V4EH&Zj0&pchZ$S[Z61jq*EV[F[Hbk(CaYd"dhqIZQ1KqbYf$S[YElVD*lJ,ZPSR
ZCpa0LHi(e%fV%0hr`GheSMZ2ZlH+lMpaGjESrMrZAL1k'lMl'DCcm4-PS9kL*K)
!$@VR!@Y&Pd@F0PPd@DKT`k,,BNclbV$9(0kU5Jb3!!aV#2"MlJk*PbbJY$V4j5"
)dm9@fCkY#X8!&N5D%Pd1SXJ5-I`YE3Q4fH+Sb6aJZZLZiHjm-A`32mrbm!9L1`k
1b&1'lClL!FX-6Ir169&aKC%TNL1k("#4iiB$T[(`J+(TF@iD-c5pbNdNJ,mRiI%
QZQ(!Hca!%`#MB836!!GfJJ4`P5Dma-eLZCpcpcl4rB+lLm6&Iq6Z20&PMj9i9h3
CI422'PKB65`N*Q$k!r`Xi`%A$8)Cj!(9KLZ6ZHP&X59lPN5Zk$)5*MBCN!$PFaj
q5!aJMjhB)aKRJ54-S[X5Gq1LqhqT'eq*kAFdaZ+hL1kMh*eK11C41LEq!d26@Qi
bHS#RZ@Q1SHNrZ'QTS@N00edd02dR0e8,Y[iA(rf*'2#[q*R#!h,&!"CqI*0JP!-
QlK6$Ma$5mh!5`,m3qQY)(AFBM[`RDNT@'*VQFG-UFBd#m`Jhh@GSBR4-cMGFqb8
hD4k!@8mqC4M!3CpFCQKL,j1-'TVDZDP5,'mDEq)@h5RF$BMZ%HjZ&YfhZGXSZS2
FGBRZkpcG*lU[FGFKZUp59c@*lJ6Z,KGG$RCQMETVZAZr%-%6*(aL9QNC)+1-qNa
d9h2hFp(p-hIAL1jrFKHUF04mN9&F`H4rLL`Q*$T8A"dA`U5-[NUmS)`R9h4SUc(
4S5-2L!Z%##laiMr3b4)GBX3N1P5-4MUr%hJTm,B44+P9Ah-cD!09#8BMH1()1Z8
NKr,56#6Z8j',j155JCPVZ2'Z%mLd2%l)Xf"*Nj'S6$`9H9(q*@lJ5AQ%6$P,9C+
[M[29)LMLQq'jqS&k9TQ9Aed&,D&AU8ZU4je4%e5,HJVG%qSD1%diLZP9UP*0KN2
e4@S$1XY81cGHTGD8$DPINT!!-CQ$b64-RR!IaHFTG`mqRlXVm@PeRm'RfAd#RrI
FPr&jehd*RdrGIR`qFe[aq4rZcIMm2rFQI$Di'r$*Far%jfVh)AbZFCIMmlGZ(Cp
&lRhiA1rZa+I2ABM2BRF+RjqiB9PYJP24Y"c$SLASYr'%LVXmS0rRb9N!mGl&NJG
KUVddHCYDNl`qH9pbCA*ZFP9bAAb2'Sr(NK9aH$,9'Yq6A!SJd"([9Zha2HK'9Cl
k!U+BS@DTfFNeDT9DV*B$R%`PLk(R5%qk--LC(!0JD8j@*Ih*,j,Mb60*0`$-BGl
J"M!,SqrNDNb1N!"(a@3D*L4%mM)Na'a-5)b6--R"C$)QAf(b*LBNaN&-AX6N,I+
SQ%c"K-6i0LB@6+$@-,NINpFa)6'qKNNT*UpL-S,*8[+SQ$b156FQbc#aBI)S*R&
-eL)`+c$j[jJX`H4"-NR$j&r*Sf+b"T0l-B'D6c8GNp@BA)r*RmQMB[)d*[-`q3p
-&Q$b,#BYQ2`BNcQBI)J*#D!,%a,!q`+*EK")p)q-42q6N@JK)p&rBb5kMj&S"L2
4(aL*EQ%NqL-Md5T'SMma%Yh1526I'BR@-a,Ga%LdMT(SAaL*IXp)Y)54k0H-4#X
e*%V8554Lp2R8&c-0UAq6aZU*6J0k,3XANNS&lM`8"L%!Qec&'ripErJMEF2iVBB
0Pr''mq@'mIQ'$5H(4l#KQ6XhFUF02qAiUF-2R(1&GEF6'krJ*Af0Pr4$AP)&,fN
U,fNLXp$%,0Jp,&`fX0$-,2`A`B,&m#V+Vrj*[(,aCm53!"R"d$"Z+L2eJJPZQ!Z
(9H03SBd0I[)fEa5(%l-%,5(k+"`iPfC5T5LPjqR6Q1RpC1bL6h'Qpf1Q*V@81dl
kU!Pd6Fep,-U$kak,mXZ8r,#3!+iRGA3d6H`*(qI*E$4Pmm@Rj!@9MH[$@JH[FKq
,rN8dR--Er0I`DCi8Kq[`DMm'ED+'Zrj!4T9NPJS4MJYNrRH"c#d#Q@F+C'iAb,a
!)20["6*r)*!!qAma-Rr"b$b2NIR['*Qr`mMm!dEQEc!bcf*N[SH4H6SMmmmCQHp
RC2i9)r-rF0$Ibd&r'`IpIq@JRme"2jH$rQFFp$H,S$rK#DarmIPV"TAM*DAHR4B
qa"1S6U(*%rmBYY&NcMLLd)ZaeA,Hr"HmqDfmq8r&jM&@Sf48G0,($ZVl"1'"9&2
XB@8I$Tp$'%Z4J`LR9pR%a-QDfS6qVf"1[fE,9c#Y*bIlFh6VR0f0&'em'p3GEGj
IUS#SF+kqLBfiSpbTBp2)+"clVi'bpDHKkK2Qia-R`i$XFe*m(9If&RD3!,q!ZK(
&T[+6aq1mE6D)'CAQ[8eahp%lhJ$(e69&b((Ma093[9JhF8l'NClVrY$-M[)pfiB
M8&93"iH6Nk9h-Hm04djIjGlh81A%,Z@8aZF62f#QZbBZ)#&5iHp4c&$4B4[23M4
Ha9+BYF,CU+qb(!+m&C%*RG+FQ"b8Ji$bF5X8SlP*bAhUhdIDc1i86Aq*U@ie+Xd
3jQHYH''$`fU6jGY-+)*MAhCSC6-10rqa-0@*3#1$f[#*%D(%)JXPRc[52Cm8mX&
T8@,NZQZL[ZA&-AFXFp)$f98U9*3hbEF5,jd`-BhVNCm-$NEeL(R--SE*6YI1(hh
RY`Z2GqVcJrmqA9Lr(J6[N!#fE(hSP%'&'-ch+majF'!'Sc+U-NG6eH9G'!a[Xm-
(B'UEhI`5c(1cmA-&2h"mhpc'bJK58Q9$FjDeIqEef+UfIB0q*QQ$SVQClA"8K+Z
$V6r#P8%dE!McJ(%bp0f!9e$[hEm!DPVk,2hYViG89Ej"T2dB`N,YAd((XiR[2Uf
k#pU'RGRFrb3jZCP"KJ&He6L,RD```P4Y*UE#KkcplHrlbXPaBI[lZmKX1%S1$k'
iSr*i26Z1VQer(ii&Ze[11BXm+RNUDDZ[,@DRidlHU*3f!N'`rikh)3CKF(SE1l4
Bc)iZqY`k1BdRP9-85F5456-A&p23!)CbG3-INR2Z+*cZ3UQHGq"b$06*bDV(UHM
-a5kT!-$h,V1f56,8I)+L9XJa,&mb1#l9Y[0HjD#*`TL`UEPH%fY(`L2BK5cB@Ie
Re2eB`"Ne!aZie!cmh)qI@IKCk"Ad+C1mD&p-&f&%-i[C'U"Q422HCXlEU,4VJVR
L4M,BP30ZeFL2*)5`L4P,0"qMeiGleDdHP@ih5`E*!pl6UZC$k%qfRQ#d+qk[[@(
BI[1@fKZZX2,pfe[f849J,9r#L3XMLl99,DSY(M'A2km@2BM,eTGUT6)51$HihSH
!JG(4MIZJLT'mrI,Q9hRE''rej6BB@&5$JB[-`,5lcm!hET%-Q&EI!32V@E@6*%$
hYbr$cfY!ZYI)N6-G!Z2%KD6%fc2)'rMVY8&E&D!0&`BSHc"aU#(J-lkE!Be-i6A
m,2-U4[)5dqea1'rI)&mdV8H8,JF&)SQINJ1HRdkNEUJ4ZL5&f,5NH5Pp0$0NkH$
JErfQ)T!!`C@kT8EJC6HY4q!00LdRX``+[+Ee,9q5&jAE&RDK5UbQ"f&#$29c2iG
kM(*5Yk5a3"'fde,ffDhrSk%SI)B-riA#LXZlmZ&`BiVChcUKSBLGDI1&eJR1)K)
%UeCTH(!cLK5mbR5TTp)I9$PEEU1pa(+,rIQ#04mY@(YP3*`PK$LD)6mCX'8T-Hb
i&*PVR+)3X%@E%0Nk&YQkB*(pB)m3fA5+MQiPY5ECVHGUL1qeTP83hl+Qp@5Sc1*
Ej4%IMVJV"+AF&3eT,-3G'KZda&N3DB#FN!!el9HVd9RGDlK@j3f!ZqTq)C8i,Qj
f'CSEfCLp#B!%[fap3P`0')4bA!U&(0fcB0DeI%Q'9P69Q+BB5iL(!#CFJQQj(KU
$N3-k!&VJV"l+jf-hAS%0#'AJF-EN@1)9'DRrU#QdqEG$-BJ8fETYL'`YLf`0Lfa
*$C(4%C[5%CQqAC(4YA,43@CbCpm&)N1c)j+1b1LUEK#CAN0N5eKNki`L8ia-`L(
X`SI2)(%H-460f6#LV3c[Bk$K5ri8dDGJhVF,Le4cPMXQ'`PdhBD!9YZA3d$2XXR
&#Xj-PlI`9V3pXTILjQ%*E[#!,`&N6DGAB0r86'U-qPV2H44j!Sb6acZkK0H-N!"
D9(18-jkaC*cC'8%QBq(T`jS534D4B0"+TVbXhU'p#iE+rHeG-Z[MJMHEPS+L2dj
&2mahf1bA+bZNjYh8l#lh0+5iSFc$X-YYmhDSN!$f-#q,d8)%%Jb4EFq5UVViD5%
`+$-9,lSKUQT8iY*r3c8bf2iE3Z6%U)2-%HF5%-!Q'#EPcIj[jqarRCEpHl,c2DF
UF6b860MRNR)Z4([LLL%l[aG$68B`4)!`+6Qm3cVIZah0dfX1V3(dd%XA$)8rp&i
c!#El06CU--#(D4I5h6+&T-9L#cNiT5,h6$+1K1@',9F+G2X+rUcNca)),kHPNd6
BqNXf+*8("B[$9!hK*UhZ&k@h5%EN&D%HXePM3)UG3DlT`5#A%*QL6!AU&Q**p4`
q'%i(cb(aX1IUI!l"Gd1)UZ!*M$dhTJdJC6154H1ah26%pTN'q@McEmaHb-!HHdP
mpV3Hdlbp9l@`5G@k'$e(4!@2-pXIV#mMj!5+1eV1bHE,dEeMl3pkNMh$T$j38h"
Tcb2LUplI[KV9)U53!"$,%eYefI2U95*'hEdPlD[j'*IRQ'IV9IcfG!m#f5XqUkE
hL+dd#V!4!U%U(B1m#B2+*0$RcL69$G8NA[BSUpLMV%r(Si!8SRNV8@(B+J03&0+
U1NMA'perKpk)0d6c`Uhb4LTj5$Y`'ak'0dcrXPSZ2''0493VGCA--*+&aS#"PSi
&jr0ECj!!ZVA@Smre#R6p2a,!5hE2'XYC2VehqYKcShL&i1E0Q6PR8L$L`JX3N85
LDSKN2M9+P*6,5YViU"8iq2[iqC&fT$N[%)ALC5JA9kR$SmPZB[86cYUI(%X@5U9
#DTk@-@MX'**$@V!jB2brR**UpTAm8RUJK'"lrJ9X,`aQ%DJ9!N2+!1*fKXF1pk,
HCc0R4AXimlQ&2cIcCbkfZDhPQj44LqaSMLIML[(,cL#eVV)J)[A(-CQ&'CA&5T!
!+(,8Qj6EQU6(IkQ@J%(%BP#F[3!&m,Kp0SU9Te$G@Zd0Rp[[4DI&ILXPdPQ&5HF
[pq`eYfm!NBQlrmjG6[,L!2`X`Xp#r-c#crhiJGSjJ-NQI)lM4iHhM($a28)1eG@
djJe3UBrV$jZ60RfRj8bbfp+D,'3LJTA)$b##1SMFJ1bJKG!2Nd%Q,UK%0ff46+0
NXphHI!@[X[P+SCIXJ'aK2CBaaQS2qbMlJL0+ZbmNc5[h%+#AMF3*8!NQc@@8,9"
9PZBm9&e8!6A@dE9(jNlEBV%hEIVLcKC+AY-&$)@jm`%AXNNSakC+FXeA)`YEi#3
[PVIdb0*T(QAJAIB&!0Ik-[*hj@YE(#4'VZjC2hhDJQKeQIBLKNTqD#K)B*d5C+(
%16RfJhV-McJE(++-A'CXm5`"H%a(iZ#hCRm4+pe$TZ3R4iV0'4"&P)CB`XkK4+6
PM,1)RIU6QITXcJlM(814JNJZ2VN49!IbdDh)3VmJS#pX388Hma#NRc%63d`)Qi@
I$D3U!!V8460AaYEIrKNh[dBI5G$*JXSkE0'1,GV&i1[`'UU`l&rJCj&RLqZ`a3r
3DHIQef5P$XN(FI%+)j0,c6jmj@mENK(qa!l$m@XbPF&**!mb288)&E,$UDmE2al
%'c%c8$UIXN-!9[GV@6b4C'JM4FMm[VHB8&G484NB%b#KBN#29'9r)%((H-qf38G
i5K4J,,Sk0&aK3P8*HcdX`8I!lTAQ0`4`29XQ[MjUJfVXBQe3@!kUdTEY!B2IYHI
"klAEji19@aJ-cT0JF21ARS6H,D*T*!KiVC!!##5*Q16dPG@&[qj4kPhM0B%L)Q"
B&6F3X%jFHLfG5a9#5IF5UD4Ebh6B8aieJ[@)bNLKX2e-*Q6$Hd#ZQ#18+PmQ,dS
0V6pp$JQ*'cklR1pCq!F-rXql%2bR5`,dMdR3RlDS!I+,4*@QRTQZ%hSDe*mcSRl
6*a-hV)`daNZ--)&&ZlC#1"2&0ICq)!Zc1JD3!2S!I"5fp%"jJ4r#UT!!hVjFb3a
Qk8["D[ZR[l3afISS#981G'N$XfX-c-E!ad@LAE+dR04@D*83$1Z@6-VqT5TI0Dp
a!cXj@JjKfeV2JB5rdL+CAYP+)-MbeR0EU$"E6*9j8eAH1(EPV+p8*f8bU#i!K(p
+4Tl2EhQHbEJq9Zbl@!m!68Hi1'U"mq609+%k2-PG,H5%[9&dVq@Z5`qJb[-bh3m
5Mdk[,'&kiBYE-Ve+E+[M$DKUSm2@XTH1mDef4S`U+))R9-'BM*`iV8MG2%FLhBS
)TG2ib8%hJ)PH3K&5Rcd'T38!IQkPJe&jpdHY8#-+T4FUZ4!9NF3r[BQ+M@5H3%1
KUTiF8ql-BdH0)kH6P*a+2QXB[N`1Kk(bpEc90"HTUmmQjbLd"5PR6%,&KLQb8fB
'GHqFME"#3!"9qN!"RjUQXB)+FmbrR#LE`JLUBN!#+l[J)%PZTSN4XAr1Kr8@
NAJ,9m84pqmlcLqBYF#DhR#SZ)kHRC46XkmM$5BE9A)RfSFJA8Cm6"[58[H,4!,j
eQF%AZI'UjSFX+2c`Bd'JMVA##@E6)0409SB5Z(B'h@Q)#,+*a1lrjN6UBYU!9I"
AHp6YfR`0r*,!*cJkEMjMH,@(+qaIfIbLAN40hpi(96-X#VP8(&+'j4jNjAmSH(`
%c,IT*Eb-,#Pd9"253Nk,Y!"D2Sd#b15*VY%G1bY8c*9KU"CSJNcH@rp+U5Grlf[
EP8p95Ee`"BKC,$Z[0*)k)(Z6,r9!(`l'-)mU%Ei8YSQ"T$*43d3de$S4"B5%Z0,
aNj@Z36L'93iKbmpbPaN'mL"qZ5CBPETRfd*#9qVQ2!853+-Pm(8UM',m59N3C*E
5*(lLq%RJ*i+I0*ZP*8BrK3m41Yd-C`M*)a"@+-kI#(pqHM9prT%qm4C!0rmX*de
f1CPS*mF,04@mAmK@ccMB)S@fAbQU%$p#RXVDJL4j$0l%02k`*pU4)JUN8q`i4aL
&3,L86RCLNK35f8fA%I&R)m@"9#Af+9DpiKh)`N4P0ZGdSH*Q*6Zd'9B$P+NjKd`
fXB9$%f[YTDTm!XM*-aK)a&$96`(DI6dYa)-%F9*fS`eV@ZXam`'B9je"e9#F+V"
#&EF2bQ#J!J+##fq#ikHe5#4!m9I6@SU5C'8ElI!HFI[m,3&l#k)GedS9kElZKiJ
d(UHK)pE,Ed'&Hjd49)H$*jqKmjU"R,eYT*Sh-@SB5!ej`3e0!iB'`m@QN!!h-TJ
%m)j,&X(NBIN`cGP$FBG8X8iAG4TkcXmLlZDK*UU#$8J3S8DCYALMMHfY8%lS-[[
aD62$1E'pP4)1cEH,D0*@4[[l3jb4+hARjRSIkJ2S+6KC@bmG&CPB(3p9)f)*I*Q
TiPqq!bqC!-T(m*2fpAG8,L+rJ'Vik86!a--R52N6rViYNA&h6+#$PG5r%pVSMc#
k5B4Cl"a+255'Z#3#Xb0E[)KG*er)iXf$eVeK1KV93MP5BSP"Mbd!pA#Qd0S'H[L
!4r"i&&"`L%qNl59XSXLF2RiCDS%ImCY"0(d%$J-Fr))Udq"SZJBmB)Af8!+V5dU
1pC58($kBqIhD%kHUFdqGHZH9d'ErVQ1lUTAh%4GB@G%M5+UP`[#!EBp8@EQJME5
m#)$h%B#a80,DFPjlV)8(5dU1AlMTDBp$5*-(D*!!&GaEaU#5l4&p!kPiSSKH10J
FJZV0Npl+Uj`*hb&@aSA(Ni#RaH$DaSChh-9#3CGS$,d31ZD10%+9*a[4XHLLccp
6hj2jrA-ppE@M1FI1R1fT2pEc5Njp1NZ@#fk#8lFXMk$KC,@cR&99prFfVD5Up"d
[8GHh4iJq!Y,i5Uj@SGbI[ep"E9%%kYdqGh34JddVI5QSjcEC*lV,(&h%RQK+SLQ
b(ibb8#1q8U!0d,jTC5J*4ib29*NjQQda1BZRSUVP4ASm$5XT%E"+*d1qX9e5m"(
KJHL"3UMDU$62i"5VF5KfPjh2Eb2(4GdG%6LlRKK5,HIeSVBS1D$)iX)VZVIh9'8
Pj**a+[IXLCb61Gp2$amb$ZqUp[Z2HCcK+Fr$($$)#K%d)G%J&di+dq!9,lR-)ir
)DLe*aEDE'J089B'a@AZdNqM$#+L"R*2Kf[T+pTRTF3%Um9d&*dqI$E-L)l!,ij`
D$3)XCIC#Dj&9N!$MS0P`)$NX&1Gp3"(Qb#bAPjYGCQLZ5Qf12KlG(%9"8dE0a#!
91!!G8`9,b@ZL#PNP,Lp"&Np+&4h5qdK90UX,4Lr"hBa`,,CjjbJUX-VhCm!CEDC
5@I[!)*BQXTc0Cdp@R`VRKiMIFjiUDlA(@5((jQ#m%f)PC9eCSE9$Y)"VlE5!+a*
mQVT#,'!99C1-Rm9"LfJ6VrSidi6$I+VLT#10)b6&NSD8-lC*bHhkG#aT0jE8CUL
q0`X+$V!Srki-kCE1BF-Lr+rd$*bYVKF#cQ+QZGSPC%-Nj!3a@5N8lJ@f+H4LSj!
![8b4XXVp3Xa6*i#TY#hX2$QV3A11pbTBkXhrR6mAVUScSA4,G9m,YUK@i1VkR[V
-NkIVYa2ieA,VLRQrHH"AV%J[m)QYc6XcrG"[%YMKccd[fGTmpPcSe,Rk3(fSq[[
5S5ka45b&S'%9$&f@a*f+8X(3bMCcH6"$hG6X)S#N*M0dm5["6%V,aYm%)lRjSjZ
9E6FBb$eemRLk"hmL0rMKJYrXi"mZUAR`@cKi9`%IlEJ14qqUV0B1KbT)%am13Yr
kN!#*'4!)mX1$@N"F`%!R0AXC-"AK83$@im%0eY1MLiMVe9Ajp)JU(dY'T$Sh-))
`Z!4AIU35+l#V3(AH#)Bbkh01Ri9fRpk6PB&A+Md&N!!Hr1JNBAj`%S[b2"j*,P@
lZY[HU16MQG$MT"6-qh#mjZ1CI2LDH$b6Pc!U6)qTJiN$5I%hlY-U)4ERV[!p
5mZ%RfKEDSjCmQ#Zfm$cX$*)8[+6A-h*1KNC2RcaEII*%GEe36XG9!lDm5"@@CY#
M[d!K*M,HY5bQ2NdSG(fY35#MPdChjSjD2)idYF`E@3`jV-m#J@j$fb!U0Y,9f0I
*U-EeG9)9A2Te8QKm#*pZ9BG2Th,L8kB1IMe$(IJkP(ZT4R`LUZ(VQ@Sr3+5i'X)
RJJFHD3(Be-)90$N)D+,#)AD[EU9+Bcf2mG-RJA`Nl!p*"QKBr$M!f6Cl(mc6BPb
ahX25e2386,K!)[0Aj3FEUAN"#6$4b8b8-42&q-682XYA+JXrHkKL`U9iM5S(4kM
+`k@CQ1S`H4cM#Z)kNA`HqB1CAjFURDFk%KB4Ab8$Da%8V$SQR9UP"93&%i+k$%U
c2fk%DZ2dKb&Ua61)!6TX@Bk"U-DKl(ZS8NSRTmMIHZpMRL6IqpK%LCQ81$3PYX[
DlU%A$%[Rd"316@hh8)Fie,&9KcUfiP!($R9Xpe#6106%P4AHdD%A$%[R8"-10@h
l8#mSlDhf5`4(frQD9q,[I3`#4B3lNIFq&N'AfXlJP'&`5Lar@i-GKX%1`IDf"TX
-JdhHbXAXT*,*dHpR8kN)Cif,+BUKYCA"-9Rai'eLm#e8B,F*TCZiY)i[,@%&ZGU
PGH3"qeS)"D&LY*[32q`Jj)$bI!SZ)QC9#+,Ml6SjP%jllf-Q!cNdYPdPh'$5'XU
,Z#(L'5!E8Ti"*6$Z2@#[`+F4d3TIU3BBMD#f8VTNZ0V0!NQTf(XISqU04Nq&X,H
)+PcEZ!VA@m*Cb&M6#$NTUS'0(8!!*3rCqJ49e@'[!$'@Zc,+Q&Ja-'3iaKLaV'p
'mZN"pYD8QE#Lf0EeY'c$iVGaQDkd2J&`iSd4rmKC%!NHGk8k)YbmJJ4P%0GfYd$
PaiHD0lL+$*HhJR@STHJ9c'GT2khI3X*j"CNRT([P!Cd#'#TdD$!VJK),eT)+4,L
RBTf3!1R#`(-KmiBbVFlb$#ESNb,JdXDAie"Ckfi--9'C6+AY&G1Mh'fDG84%3L@
S',EEL6MhcrCMXFC542e'm#QPST-Lhl4LAS)d*NkHYEf$ifaKU[lUBBlQDrrPb,I
0D-3,PjmU00ZBB,)0NX2*6SifV3$"HE'pDHZC)E2SBl%$la&$q*4Q6!Qm4+E`DNE
Y(#p6hU))60IKJ@YD9*ZlR*3%jrCQ@,#%FDSiX*c%FbHL8ZjXAZC1FC,a)&HMlYP
'+[jbQR+(C03Fb1p(eKdK![cdk1`MXirmA4qTD5#P40S390)lEGddUUEhrZMXDE1
RI3FU*qmIj8'4E@dchH*-HL*K%NkU[M1PTm6bfmajC+kY43k5mE@H%0(AEEPALQP
#$YC',D0D&ipRdZFCG1(,TPMPPl[X&IcTidq68,THFCLU@SXB5'98VC!!"3@p@CL
S1iX-a#K%HR4[&&@ENU+4M5)LK%6jYG)fUV*bRfic%K(CH(fI!$1kfE4CmibTJXF
['dbjH@Lh4V)5Ja`&M`F0F"J83AK*BAH1#"#Nr%G"Iir,i(5B90'aL'Q$+[*@#kN
jI-L"`ZS!*B400hjD$(N&MT!!)Q3S6llGD`T2&Bh8-)ARaa)L0)e698'J8e8(QF3
$Y%,a4Pi%+,C"1KCS+8AN4U#m9Bemqi`U4c9rR8c5TiHmk%1c#FfG+U*&p0k6D5K
SeM&K#Y9@G9!8rPqe[NS9Ke*"J1lIH,Y#fESGc9ZSQDVRXRXHZ!N'Cik`%"iH6b$
I,4`M**'3!!NTlh+0&AL,j8+TMl'#EM&iGJFrd"482"@+VA5Up!XHr8VP+pA95"K
IqGeSEkCp0T(McTd09r+MPJd6Z3B2lXA%1#Kk2mM%1Kb+cbXK8KZpRLU,PqV[R%0
hGY)`AZ"k,f%1%4YGC+Ua5h1#d3He3`pM1bH$V-r6TU4!QVSG*Sjk!1MrjdYNEUd
Gc80,X9NjElqbBkJIrq53!*L*$Z)A0hZ1T@V1"8JXV`K!D*3"Sf&L'STVKqlkPZI
b5ZfbKd5DS4'CG5Y9S@E2B%Fr-5,#)0'9`54PN!#4"8'CLFYHNM)UhHa&C5q(3)c
ZXXp(F0MG1Pl2eVq)1a#Yepj2@HYm[Q#M#c6F5(+'SP%(4Cm8DF6Mfi1*rI#LjD2
d%!@TYN&bXN'G'fp['a3*!"Y&!0MY0C-!l$&e19K@r5-ZL'J3FD95*STiB)@Bc%l
[q"XclXla2-aDde[VMq-"p!#bi406X5H4f8!ap9QUdKP0U-!DR@j8pA)@i'XC2X@
Uq-DcDTrDKmp(kL1mcP*CH+%V(Cd40D+Rr[+1Z*'2`1GKpE"q)AL-`pSHj349K"0
8XBIHSF2``@&S`Q(Si$"dbMMT9Fa*,abQ2`*Mrk`4+ib9XqLad16I`4Q849qB&Gk
G*6h*5cV-bd"RMpSM"B@QFP@1MdZjm!(iJ-mKG3LI1P@(38j8-A8@98iG3&1$DN"
R[pU2cLBi)IXZ#eQbGb1cKdq4+RT5#p)f2*EJGTNmc%bLdkJDM8bLJdHQ`'HcfSb
2@CRab9@jIcN)BQ6i5BeKX2SNXaTm+-#0e!AH@4qpDGETYN%i28$5IHSCkC8ZjkH
IP*IA4$8(-kHkj@@ZAKRCP6qrjP"j`0m[paaJ[PX(M-R,GhM!jhq0!clILJ-fD3G
-,0kU!fLS59lN#UJM4&4*Ir1V&SR0jeA-Z)20CE(F5CGN*UTPQ*c*hD4PVFCQDN*
&AmqVPR$ab22UFcfjY&R0HAK8cG&h`Z2[HGLXRVf!,4"kVJUd$G)(JpV`8)LGF[N
9blI()TRkD-lQ+PE4GFQ3!,B4GA&JTk`!!#,IaiSB@p8F-IQF*MH5)Zm@QK+$iY+
cI)QLVD0bZ*Q)MM2lSK3Y6kC(SR%1)PUH"8&b(a&%b9$'-*J&`qCFFq44JZhEYH)
@dB8YB4X5dA0m&+AA`JfGL,"q0Y#LR[hBElGRYV#bK(%-fZGM&+TB61#-@K1L4cP
E5B3H`9DIp[!""'aK%l$85#ceL8'$ePiNhc1)Y-PQK$m+Qk8+IY@++LP6L)$*jHK
4'*C@&*YVTik,b'di[jUkaLq(S!*C1#ZF6D#3!"K+aVKl#+!6MdBJ#RC8,A&FVmr
*1C@MRkh8G`ac"-(1bY!V2CNpH&QlIcm0F6d2B`BmGFAqrIA$aqSjjZ2**hGijc[
c$6f2HMH2Jc)K4J+jdK9PSha%J[*50HF$$+VQ"e%LmA*@#0(!S3`qpd$B0(PF#RX
H#l[-%e&0hPD*+RMRN!!5D4Mf2)L*L4kQ84jK#)B+cF5-eI"kJk&LZm'!DS[X)b)
B"MJB9KL#J8&S3c#m'"3-+l4JS%AFc3!iGZCN6ZNKrGcCSr8P2FrIVF!J-*H0qFN
,dd2D,+8+)I!)MXYNp5K6mm5#6**GVJB+V&e`b+jcp6R'[C8d"`Jb&*JjYDUF!b&
-+V"6)&+KqMDU8)FG+MYJ%L`*Ih6d8LL)pNEq9r"@Y)@rA)AX(e#ed3FqlS8Ad6D
U)!)E'jMDf5'XYP8&E99'U%h*HVYKdffc4mQ'K%FS+8dS&4HP8#VH&8,Tp!T&frK
Z#+E'FJ$8$j-"l3A(TX5aMArGB`e#Km%89r3K&fmb#Ti8C,,(k+`KRQ%Ym)9$#TM
q"5@R6GlN0&fME0jV'Nk1LHRa8ib2&L'+$4H-B5+NE*R)E84Q*a8#XX#J)lGCU!8
G)3Uj$#XFF2YXQL)#Q66)E1A(4%cjU(+HP$[qq#)0"E`LS3&)J&&PqK4*3mA'Q!S
#JQJ)*A$5"B5@D)@abYUDJKlAR,Mf@GXJL8DhLXFM+THEr$Te4mZAb5)K9LSfGFq
a0Z(mh*!!,!TfaNU!`+`P&aEjm[AAeK&MmV933Ci5l0PUESM'&`04VN"kjZ)U3Nr
"MXY`A#QpU(RG!mLQ6$rbiH%bJ`6Y0hC$8-0Y,IC9'"Xlb!P2ZGJBbN'mKNjHp2)
q#L4GU4S-AUCp6MU#B4ALPU8e'G8-3`fL+%2KlH$SpCPIQi&18ihY'i-DCLjf'`Q
!*0cZTHNE8RNAS&@J"H-e8ilHIU3q![1+3RSNQT(VZQI!3,0LC&6I'55i-el['4`
&*aqC3PhX&q!&"kb'G2Y$56)[J[FAhP"i`@k!E`jqX*5X#lbG16fd)L8AM$ME%#%
#*C%(a%@&[DP,4jC&pD44,*i1Y[c6)+-8(a0l(mAVHV"8XH)eEqGVLlbGIlYBdf2
GXcr)Bk&JP4lVApUhll%B%#89YEI6*Y)6%*!!#'q45qMQ3B'C&IilmK`e!e55F!b
!EM$5Zb)4'cX+-6E,c9-[eN6qTX+D642l,QMbN!"Ij#2'',2b#VIR!B"%9MNeLc*
1HZ`fP3Ud5RAjEM0Akjq8AVhT1"0J(IhjM%!Tq4!Sj-%CU0V(3dAM$j[J-9B*$l,
F)1#E1fbXKS)HIp%KRH)eJ5+Y8i68L0MD*,044#QBq'&SdCeB4aYk%eQ5!1SPB(3
mJ%(M'RUEhk&NNa6Ha-[TSrI%!icHh9cXl)9J5SRa[K!M[-Y)`$"QmrFXm#5j'Zm
`bD84NMqRLaGQYc+Vddd'Xh0TEN82%Y,p3IEaH(Q%5+"pLmS9(MXimX'NU[cM!4)
546eL33R[F[TmKZAF+4Fcp5P2XAUR(,EiqSGk9B3H5m$Ye`,(2I$"T'-@ei9EGKU
f&1+C'["X+BVTaF2DPYlS)dpKU6R'RU9&ji#`q*j+eFId4bJTj%%Z)%&IbSYFj6D
1*%$ce&YF%MA+m8+L$)+@&+P2,@HN+`3B49f64)p-E'qPKr8GSbS$++1U-1Yim!1
!fiC!VTM3pQJ0P$@4"`p'@@28MbkCKlI)-"Er@j&a)f'bdiJ5B)XbiQiU-U9AY#m
11JB4"4GipLk$!Q4&963F9DH6`mSkqG3H!r"9A2!i9G!IMNpjk@G["l+rQ&`l9iI
jRc*@Y-mQRLb+[EJ`,lR#T4$&PLS(Z[Rc6k5UTYbhl)2XBiYj5%*2,&h'JLZQ`VE
FpL$%Hr0,%2QGAR"26d#8a8E(&'#5(8rJBCP6TE(F1VJ%Fm!*J`Q*0mHD55382+4
2jr&#-Qjp%)Q`h*J642m(*qRGZk*(NcqCqF'N%hYqpMC($(ZLD%BLH2$4U#Y*AZ$
BA+#F!`m+$-1ab("`-FG'e("%+31@f2ERXe'rJapJ&bc-(84Qi%"Lh%5!RLFld4i
[#"@GUmR"KjFV*1&6%N6hQ@9&EVmI%i"i*5IaqJa*2%ki'j*iA`8PmISm5Eb%6'D
2hR5['j9I1P'c1)6dNqDA`+bIf#YP36R`)'Bj@P,`,+AkG"r5IhTpjI&cqLZ9pF-
K@(6@(bF$Y,ZAr"DC'N4#M`S"JBjaej6l&6N@kH"#1$0+M`@KE%E5&LQG)FD1afL
+aa+Td`TZqbS'5IGi`,0$-S1XZJ!J64p`NNU*1'Rp49"'dL@,fHr1-Abp8c[-'&(
iPhHSB@QcYRd-26B!GI1@'T-Bk6@1h[3VFh"aiJ'&EUTBl1e-9BBAbqA9qmcE"2[
R"'meYGM3d3dGTk&MdU*pJN4P5*C-cGY@XL4pBE'3!&hX3-'3!&3NKq1H4#K9JSK
#BGXE!(b*'"I)6-%!lVlbS1LME5564()a3J9BcH4LqS$GKBhdB,2+m3GkE,mqmFU
KqqpCC`m#d[b$GfpEH[L`Aee[%-@X'NRIf,BDJJ[NQSQXV6hqVlr3#`kQT0*fNRi
`J8m&CRlaQNirRS+ab-0)%XB9C'#Ch%q6'XbYP*RFPd4%2`K5B*Z2+d`&i(+3!+U
j[Tb2Tepq'6r8l@EJYif-L$f15f!+Uji5fIJK,m&&C-DRcT@F1(QZA[I"GK0%1L,
1(DZZ2jPcB8E-$GU&rI[&MH#-Q"-Y[kS)*JBXhbG"cEPp@d%+`G*A0G)Qk5AFP`G
USMLU2cVSVB$Ea!rdL-T68p1LTQ4k,kia["!E[+`K3C%iV!LC)d85-c'&"N9V(JZ
br-(Y)ZNC20"R6E!lPaa(FXEE`k5G3aZ(%'ZP08)8p$#4bQNG)h@()"HM)LJ8iA&
iN!![B-Lm(G05-JVL"jRN"6U60D+l2&9C#j9+p'#6d`R4H,%N3&5hCPAHV*N58dc
'lJEK1XQ40h%#D$h-hX*S9Z"Tq)'HUXVRD!,Cm!%60*Ka6q-#[T6UK$0E!#F6L"(
YCGp+2%6,F&!6(YI1l6-f0CQN&fPbX[#iFNM2bkmN!D9Tk,,R`)QcHBRDN!"ZHAh
L%QBMNRkLcK0i"fU!XK#50IT'--LX&ETCAP*K5&e)X[%@QP0RA%Kq@EGQqq5ALQH
eM%3mp!%b2f-f9A%a1*Z5"Ea@#DG'HY`f+HhZA[!JXi@6MXUk&1)XCa!9NAXGR1$
piHhD9*d3K+dpmM%kYih#fb#"EVFJq)d'X`Gh5G+9kG1&afdM5kX'Upk#8Xm982P
T"!p4((K*0pj+C(A2j@1aKr92&jkS-&i8KkHmQIcGB8mDGQfl@#H!CHTL!PMkG%2
(CHJ8'dPc`H5Vh`JjXZ6,L@2E!K@0dCj-B*Sj8IGlb+F6UlC&3!YQaljdqq`%(H#
ki`2BU,K64KGb3[@52eqSkqN69rQKd635iME!JjU%hR6%UMN#a5)d!qBqcc%J*IV
c[BGi5E9D&P$cm26!DB25aU1'*4U1XAF&(E2`JUXc*cCX$b$b,1fahmib&!0pQXN
B48D)5pd'NG8!H)6kZXMf2+FFQKl!f24XqSX,&Q'6Z`D!,B6I0$qG4IZh)FE#G"C
B+PiH0#b`E&X!RX'4mDTY"-NR3@c[[b2fM%&3Sk!a%U8GfbG+ema'QB$cf*25q)*
0E8Dk1'V!p141,a!GFT!!BQJF&*6G"3AEd$rA)1IUTZdMclD43PE[D$$lAh+Kep`
@ZJ3(q[DpcEE&jI9ip[RT#,V-Fa8QB0X6pGC'&KJVY,4rd9rlf`SiJkMpEC-SdQI
qYZ**G)-pMPHX-0@)b*HXI"bQ8L2H#*GB"eAGLFH5+18(i5'5fNKmqU5j4cDdCkR
k5"ZFLC8QpE5Pda$*FSXH,bdk9"38EA9'AD+L$U$MBC[kb9YSF1%4*`kR92B429j
MU)Z'2Y#P(NK4m@LD28MAkB'&ASlZ8qN*5HY%YjbVlcRaLUqNj,'$,b-4FH!`%K"
RMj@FifKrH[1#H(Ai!-AqPr6NR$cEF`l0*32q&kS09G9[hAE(dYhZ''eh6'i(!2G
1$bJc2(V6c8q6SFqI$T,4qrpD&0i$m0k254NeSM11MM#UY$Y4,0R#"h'T%mDA9M)
Ea)23MAL51eNdE#S+-MbQ)S&ek%V!,RhM6%QFMrk0G)%Z'ArjVq55L%#fII'F6RF
j2hY`DjI60&YEcXrq2e[1YS2RY!KU`h,`i)Ccmd#qMp$%2eJe1")B'5`2d#2N2Ii
riAaL2aiEe)(($8B$'#r'-$Ipah[J2i6"bJC2B'iL(SAUlV0l5Z,6(3SrL&dm4Z*
F-c&!Nf"fUi`-MmJQ!mX1`E,M0fIjl'r#-J6mNl95`$pCZc8#rXRqlkk!laBk3-!
r'C%#rXR)eJUB@IiZ#RJV@0BBEU2M463E(f`!FLm`dBkq((6Xem@aTmlGc52RZ[r
k4fj&PU-GZIQlPAN`5hpPC1RZC1hT-IEGbD+hKV%lpR4%@MDcFFI6adq9[($fH(f
PYPr$XCl[KqSa[(IJQ-I*Xe3+J)8-)%)cATj4YPFG,%lNT#dkBShip-Dp9!8*4Ec
ST$T$)aBaHMFYV8SA[68Rm0&0BM%[hkd-Vr%Fp&cNI*p@C#"KX,-l&QLVr`+"DUB
3dD&`I8reU@1r3F$frZ8FZ-ePLJ-&5FdK(m#Y2SEJ+m6MC09"H`F1H"C"@(N5KS`
[T"1',`L9)dhH,C+U2NBGGjPXr"Q+jh8j@d)Ta5VXQV40Hdj9RhUK2LHpAEGUdqA
TE[T++,6G66I+4e[Pc0`HJX0m1j0,(83ZYGZ[LAi-4h'QT!ED4jhBpHbjG$D8#(A
B+CZ)4(bJpZ5jGekSN8@0M0ldKfafYK+ML)cY19Vj9k1[maa&3832m`@2[9mh24D
pjhdNCH#djId&aZEcRKIYl[5'IpUGr["2mfUbZqVbeV%ErED4hi-[Pca6AeQI!l`
lGZTirE(62H!GZ@XkQ6B1q@2fGqQ3!'2"Ke$L!)mp$p-d*"iiBE00mbXLNp!4$fd
,ZimKN!$p[FI`rc(r-81fYPd[3EH1(8Z2RFkYBZIKEH5@AQid&6pp-S[P4p6Y#d6
Cb9HhG0BhHY2Y143e$4D5frGXacbCm2Bhr1rTE*LH4cYQb05PBm#S#k0V6`kA90G
AKR[1P(KcSU!Je$)qUZLQQ"h2Gd*d*P,iBYBH"SXmE+Y-L%IVX1dGE4RS25YP4TU
M$#cYaH@6e5qFr2kjNXT6H2#Ldp[PbRLe(&Ia,$+RMZ1C#qjJ+@3`ajIkFHQ9bR0
Rc[TkYX2V@6p#0Z!hS%ka,NNAECKNLFd18QC8ZGepH-8"4K5aihBfI"NERRUPjfl
ZU'Sk'rRM1[E1TUhhf-mDrAA0FfZ+rBj3k)8l3L&kR1,f`HSB(&8ZGNI)!DYqiaf
Ld3[E4#1eY@Md3NddLQm&'Ve`pp(SK@fJN6'3!&CGV`A5eQE`f`LN&bl)FS0)89'
re&Ihf-Z(REqVlmQKA1HGFhpc[,i(XDIR$[b0pYq&8(qm*(6bE%l*fGU3!(E'bbH
V!F@Fl$Q98l+VZS4q$TF-N!$B!3!!,Sa"4%05!`"6E!p9$88d!J"M4Zicljdl$#-
L-T-4%H'JU%LN4'CN,Vhh$YI8h%pQCUk@SSKLXG#&D&DQlldcXKp489$4h%pQlKq
5QC!%$5kAbe9QDQUZ9-4pd8c0c!M(iIHq-q#iRrlUrc[RlrXrhpR2Gmi"'ef""-%
6j*+8d*a[HcSaFBEbJ2aiM&9qR&[p5IHR1eZX@4l"%8*hFfIEHT'kK-!kT**9I*A
8-*EUY5h@MUdG+eT,aUk3!+qZ&1@AfiRdT%"YrX*%@92qSqRiIM9*R+CjE#Rd(f)
brfrKC0QTc09LE9hS9q)arRhKE$P15H0I&RiKVeIqU5fcZHKmFD"@CRZ#rN9mKJm
Ur&BZ9NTjIZ%%qEBb9R[59Nd(Lp[jN!$#SI)$bRIDIECb1P`FSGPYpp-I4#ZI96K
2,P)@D!ff0a2Tdq)Er*(#UA+GFT(2,(a3IP&j@([*GSC1%FpaBf&c'3P"@fYE4`e
LJREHpJ*Y)cl2(bp-NUZ8'TjEf&mHS$bPI@kVTm2%K9S,@`qk52bD2eXi4kj34QN
PYNCdM0L+MbYF,$G6f[,4K52PMXTiVGEQThPLHbh'YMZ4[Lk'mpF+ZmUVPD@m8f&
[HBRbYKCU@d8lL&'mS2"(qGr+(pSQ@c4Y,'CTRpNqTVh%jEaRB4mj6,R+@aIq+Rq
Sr+DpE(Z96K4RD#GY4qNhiL[mpm,TmLQPR4CKfdar%MrL2aHfP+mTNEa*i5rb'Z9
2l9qfME5TZ)9R&pjp@RjIbG%qX'fM9m6,fJ(E1r5kq#kr9*JTleHkDjrBrNElLRY
iYm,1mPlP)1pAq*Em9q@`pTlY%-d3Jl@9YK8d3(b1hbX-NIFT1rQ4`K[b9Z@XYXZ
fJkD,PGa5H%'@P#$Y8pX''LLUQQ!c8BGI9"ab)CApLJ0e$dh)dVM18rJaITZ[j8G
jSTDS*kBN(NZmREJfNEZFXHBd6jbf,,Q,[MlPQ+JQ$e`[bBGFNUc!f&`E+1,9&%R
qh#2*fj-P14DQ'ZBCQ29!&Q(Lak3+3Q8`!jG9UZX(aPDU'NfV9$edID@U%hZ-!TP
#V*-#"-'Cf5d42NCX#V(,'1r!@%Pf3V0QP[aQ58l4*9Ph5V)V@G%QI8klq0m1fKD
k*M6b@ZJUrpZ+qN(%C[r5`"84rTV`!@rkReGIr"V"8Z8AShEl9eeC(Zhri--e%D(
rAP2KAa%GhU,#(qD2N!!hR[IhU2h)d@)h%8TI(VhQ`c8Yd1IeB-T#9N6dk**@c,Y
m'KAUM`ldLj[A4#b2r[m%D@S2T8H2R[4Ve#P46I4VIUGI8e3Rad`Jd53lZ9pMeZm
8(8lbf*I)b%j0SNl4l`c81-%k49Pc3Mq4K"iX)BJ8bjeB`&LBP!3N(K3lU@EbJ41
SNh%3B!,9+KNS4S(JJ$C0""6U0+P1TT!!-J)a8k%Y(JaP8URA&'qQU@4*&pM-@3Q
Y38k+ETab+P!U@M$R4C8"IPV%#G*24E+Ja%"%K49T8@83%q"&9!cd#CSSVI3TS%@
#Jk"&kUq8LkJ3j'-[-XP!"6-4`LeHB"#+4"AhJS1)L!5#+CL"K(Ur32d-9fPK5J"
ET)3NRNTH%&Y!Z&,e8SL(qb'-HUm1JCVp,Vqj8R@CZGqP80,8X)NS%ib)rkU,Qp(
GqXd1c)#NCK2KNJJMq%@r@C&GCY%#&5l1f&8cQBQi*$`ZJBK5D)+%3$3Te'8L+p&
KMPHZ%$!EiZ(ke%!%I$59[(KjTJ94*R#BK8U4N!$QK5J5!UPCB&*qPm0,'9a&0Ym
[%b1N-`IK'j8-3r$)4A#Rc&`+!5TA"T*lbR)B0JZZ*Il6f#kE`#"Hm#SJppijf9-
aN!$TKBTl-[GTi+HeVJ3%)F!VcVJYj2SdA4B[-j9p8&9#AB"ILkH@8#Skr,l0p&(
MeBrGeR"kBN49))N!EYDi)XJ%SlJ)4MaV"MeBF%K``58iA%3%cN*2*j,HlUl#EVc
'c"EJjPSP&33,8bp3`54le4%iJXU3!&iikB*22i-Mb1!1*&c!H38*5S9ZN8!@K!X
-$1YR4HJ0L'GPj$0d-1-R$BLSiTh""',mISA-NAVBP#ZLkSIe,H#0!%c`bJ#,*+B
893CkPdJG4%aaN!#&%!`GR*P+[m*d#DU#P+%Se-qX305D,M#CH$`"!4U+#$8!C[%
#B4LQ3fDLD#%&Rp*+"q%AN!!b(4!PH-VSL+I*j)0Q#[CKF0!JTjqERGaPPR*FR%b
3!2R06Mm@IV)J,5MC-E06F""4N[3J*YjMei`9$DX+&P%&#k%5#a253M$63r5C`'j
b%*h)bLlLY"X%%M0-(RYe`DZ101K-K'JM1RcN#%L96Qb[Nkd&k2R8`PD9&SBbUB3
1"e'+"#X'3PN4,e*B)q9%5qJX8PK,@)4m!NHJU9H+R'))ZH"1i*eSlTb-JAMF+6)
IiN+`-!NaJ(%38b5J@[#TKDfm3ZJiL*6JMGJX*pN$Ni9a%&8A#(L1*KFX6,fAh36
5'%fQB#mK2&iJ#'M1VJ*p*++$BT!!dFCl*38#4k5D98i+JpQ)Y&fl*Q+9rlaPpHj
9HhElSp40iEALMGTGZm0AE*@ZKSGZM-"RK9VaapTh8BXlMH'eEJ[TDX5'j9'K+k)
hESli)#)bG2HraAYZ+fk9[mSc1BL-L2N8did6a)R%()&Z4d``DE209RQfh3fRc@j
QdVkD#h3,Q(f5(0*JPBd+c%UB,D+F(Sd*hX+-B86!6ZH)FQBIQ'bBlU,PAJdlBR"
S2-NJBrB4dpRMMJ3LCRF'p%kBY)1a5A*!2c((-NhB(IlaNXK0Qk0Al9L1ZQPdD+3
BP$U&j"c6$6%m,'*cp**i00%e%lS-9[Rl1,,3[Lr'HL$@E@%Z3[8kXHICKC@l)hE
$&4'KNHl1Z"P&I'(5[Pm&jQYNSAf[BVd6ka#BcT)FR#r+4c,&S#2lYN4Z@K)CkPp
cppCU[+`6`6B%*KHX*dAjaQVaqT(Fdp4Xh4cKYT((,Dhb['V6h9[)iDEHT-fV`f3
$@@McYQ(Ya2`J6$3JPBTbGJQJ$E4DfL5a$3Q-fV4NHILH8(qN[)Qj%[kIG`6bl@%
+*2RZ*k)PTjc*"N@&4Lq*##2#kLEQi-lD[!,)6iEXF*KKN!"[*XSjjD*kmfE2FTS
#h$GkeRD60UXDNfB`GC+Ff8k8,eP%abe5JRT,8TQ'[9E,V)hX2Rh6jSJpQjEZLG`
G[558!G"QRB+)"I2,-&Q5I$e@$-STMpqH(1PDD(6%ZFh4DjB[LFD,8G5Qk#AVL1*
*fU`m,D(+G%5-A"-D[6`mrYZHIdd`cQhb,HjZLQ3D+TH[fEJl)Mb-CEN4XGS)T*0
C5CJMRB`iVb9XY-S*f6"ABDL@%#`,H'&k+c3bG*9laMJqNibiCVTPjKQ"R$-#q@e
%Gl,34[6"HMAQ6@%QD`RBXi3q9NG#8`,M"S(aQ0PSa-`lC+-IR#EYKeK-r'5Kr9!
"1(QBRi&CU5AB!'FHc%$Vk`RcRfhYm*rBNKa2p3qR8TZG(l+e(i*CJr,$CF#)`U3
c6"-YBB&lBf+9fr$6MFN269KMd[G,Q#B`-kah%j+)aXFmh4"A+YJKTGU3!()'GNJ
*`-l%T!*'dGS8(3r@H!LJ'laJKbJ-E'Gdeje4hqQm(D#0Z)G2fY4BZl8TZhQ$MMr
hN!#ZfT!!aLCY#$Cr5%ZB59SE`'QcaCV6jY"$510$TQT$1IMcVI*3&mafV3h)DS2
Xe1DUp@bET11K$6fM$F@"U0BQq)KEPm&[6SG$`ij2Kd1[QV5K&*-3XY#'BQ1'IS)
j0QCS%ke0Hj)U6Gi8',4mdjSpUhH[#89LA,TlHG6Q51*HTQ%f*SYKTNVbkf'LT8-
QilJ3Y5Pm0li)R,FXh4dH'J(Ti@RDm&,TE1Hj*aahH*df(!I)eGSJ*l4*%ZK#J4i
3+'Er%@KIJAB6D'1"9JMd4i&q*G!5KZf%ecU"PJRd9i'q,P"9S*X&fTp*[b[3T3,
p6+#"![fA3!F,e-)dAQEKGEDq+Y#I"9V(j(5"ML4e@fTP5P%2U45S3b5[N5Cf9bh
3"8`GT$m@k$('mc9$h5I3Pe&R%1K-[2Fa[Dmb'1-&ZNLJkH`L5+$2#E5h3%F,p#1
"*JLd0DZj,f4V'c[2!)'mTV9L&0X&QXFJc4,S+B'Q#64!S+m`4C-CLB8#I91JI`L
dLT%5*Y"R"(T0S"m+G+e!"`Rd(`aeN4%(U1(am',CiKiM&-cA"IU@3,m6k!f"MKA
S9)'qaQK+CkjrRY(d#b2)+Y!iGPU"R41E-9QJ9`6kRN$R-j!!#U0JP8$EX3dS&QK
RJ4S%ZNHJ(S'H%kM)2$*%S&N#c@!(aPlHCRl[`mif3U$Y"CV$VKFa@Z(pCjPh*JR
d+AD'rJa'4hEQ8S%f%ZJl!XdAD$q"ILr3S`)G)p#*$0J`p[mL)k@'Z3D(fFYbc%l
QeL-#2F4f#m$Z-MS!qlIi,,+#HI"$GXK(Q1K@J@i6D(FQqK(cIMec(%6R#I5`3(H
"G,Bp-G$&FXpQYNqcQC!!RkPqKqh(``*Y*Y$2"4SLd'rB!D$#)G!c!TdL*0l(U@,
cYir*+mVH-UqKkFB&VZ#9mf[kK1@@C4`D@0AkDT,68MQjT-1U8GXcp`mjdbjL5Qc
kMVN9"9&cUVYr-[MFp&0'XbT-DYYep@MlP@dMkTT%6Nd,fIGPIGCR`iVl(Icfr-4
A%cb"'kBekl4dFIRP!m-[YV`f-ql)cYNY'NF[,1fm0hrGM*1*"Nd@#fYIhchHH[I
p@@rqqDqRP`@Xq1H!RX[l2h(i[EmmrqZ(MbGIN!$qfqMYd$%2A(Thk%XrEAkibpP
GAhhpilqIIE,[hmEqrIGAQZX1dhmk[KBqm[kF$hjiijFeMkbrpp`ARrIkq+PRh[V
VS"GqHlP05Y#RrfM9HmQiqkkrmpf,2hrdi,%E@lr[mFHQ4EHllCQ`pTZM4@H&j4'
28C-GY2(@(H3Jp2L$d1-2ZN`@fU#Z@+-E'C3&-d-cSL([ea50pb(60Y-EGHjY%$q
K34Sdj`jpib$8M3HEV8'$bjN5!"eFV`e+3"8IVI6JYVj*!`"rLdN9c(jYm(l5U)P
bTebBH6#$#3,p6"Q-hhV"@12VU3B(Di12D-DUQlXPG)ECaV#E+L3CQb,KU9fE9S9
'mB1KNCZf4Ui+M@4VSQli,DS`JCY1#bc'@4CDjE'%j-AD@05R"U0@1KD9XV%0QM%
$B(0K50F-kJm2%E-2Alkc`V-h%6!f8KZ,#XYBd$m@[F[BbjUacde+EabqI$2R$'h
XE-fBPbTp&Y,HfMfVFK'CKGTBSpEFGIh%@VrE5d'qAmY(I6JI[A`qkX6jkl6QCFq
j[cANlpAb`l6QB9GmapU`Hdh%SkMXj@IH`X(HQR%qH[jmp2VjAj+&PMmFke0@2cV
cr+PDFeq9X$QV%Q*#VCN*`6j9(d4YqZK4%$'KlSj%60KKdLBJkdd))`YY3J6@aCL
IJXR@QQIlU-M`8G(HHL-Kq2JAcPY9ibI-2llq-'%Jp1CCcdiBjPl[)"ID",aq6F$
V9ekDEkhPP3,9'LM8qI-%VAP6dA,*iJ85AlF!Epj",3rl-Ym,rM,3U2CMfdJ52"F
HYMZb`XqZET!!aCk)b0h,)pD`#rqkH*,Ge6Af99qZq$4Y@[-rD3(AG*1@KpHD[+P
NJDi)%9eCV*B(pihh`"4,mTmf-V(M-B,FZTT)5*BQNHj%EhTS4(YKZ,``A0Ti[,Z
04piBR`iBGM+adb64dYV$0"`qhKmIH4Ake&pa9qql5rA+TG-1H%KXAMH-(f@94jH
PZQ&d#A($q!*-8BFHV8KbdaJbB@liH5'4J"Y'ZG1kkG(3QZS-!XQPMFBV`ZJ1-+d
PqBmQC-+FmI0!TL6$#m%,B2AQTIqcTdF2e%EL5GN["kbbS8D8Ijb2#G+()8D81`#
@!C9r!pSV!jTJ!jTJ!jTJ`aDm+mphhpHPD+dI%VL4X5CY*&V`N5V-%8PZ$'FDN!$
JQU0C-q#GcB$fd)#A0X0!(ebm94N)66B[A%0VT[fY%mrj%&djFS3fLT`@fp*m!8l
l+Y3'`j!!j)lZai$8B8"'-m$G"M55"QbcB52!qYfh,rkd$a(S+*aj&-im#T!!4QA
Lc1A3L[-fcl-6Ka+i#qbdKS#f8lqGPYNTJEh4hYQ9qREKHlI`icPNH&6SlNKHHd)
lj+qpi`Z*[lE5HhNh21,$MD(aa+hc[JQ&-'amdc$QM+pTZ2NpCF`1E8`PbiKMBNc
D',cdM8%q'A0+NRm14%B(j99fLPb2`J-YjpST[Rkea)%1LA+l3$Y&EQTjd@i*UqF
QhNVVD'l!%k1[A680M9`PlHYSLDXNTNjTkk,DdD2U,FKD22Q1C#dHE(*RB6Q0H(h
a%%EViJ8QEA'5e6)ZM8Qehr-TkHL`LH(S@-1[4IKbV$FXMik)EaR5I3,a*)cEUBf
,598j$She1*aq(%lI1Z1[ATk-1qNNr2(-fMK8amDKV4L(ER$FBNQH[P58Tq0&qVI
*--%`qf'+4ARL$0%b-CKTlR!6eDNjlpC36&SZmPJZFPIZIP"iaNGK[mIJ&pf*c0d
2&DJbjZ+6BqiN5Ck4CUFCGSVhhYpR`r5$L4(Tli)mRCbL9%ZN)"Ll$rTrcE96I0c
XA)&j#-`Rk!L-'mKVbhEfLPTTNY2SqpV[I[)8d5VrlYqU*HEC+GJ@D2e9215`ihU
klhVkFGFM"09FK1[II0HrZ9m2DhYd5k*QeTh*RK6AXV6eX9hLMK9ClIG[Ik$m[V)
RLTqTIV,dYVqfEFH54XeDe3bSrlcLkaBp'YkXHq2-5aGIV(Vqr![RrVjZVE*lGIL
Ud+9,`TCrpR(8[k-hEI`AZUl0eckkqZ'VIrhNEh[ha0aCi196Vj`m'M)hrHb4brf
k"38(K0c$r%Efh5XjQCFZAmmih1qYlRdlGf[rHYIA1VcGUAHIRPQp#RkFm8h62j[
mdZkRPMqhrRALEp0rRr'0VA$5IbErGpSrj[rcbq"lErQr$jShDm323iB1rmir-2(
E3B2(jNr)'cpkj+L!l+#l0kjNAXUjIRK"4[I1I4qHq@$5i`PYM-d0LIcrV3p%`93
TEIKdjBTpcqhBYA2VP[HhIE$rh32[((V[NB0H*pa4iL"c!T99Kq9#i,J[aY#jQ2G
IR$[XfDIQ@"Bq[HM#9e1R2"*i[!mDrh'm$aVriHD$,qCqjCppfJGrFII"Q-AMF[X
2HfV1X`XA,AKkkL06M[2"66pckNpl#$rb!1L@2bA41fZiaHpifICZ2rS3Iqi+BYa
qLYX[8H&hrX9cDbGS9KlelrM6Z#2JJK1*GGdNVpcKkM4&0c241bJid8eGilee+lr
jIT@*C-pel'3bpk$-NSX[ifPm2BrPAAJF5M!9F5[',0b2-9%2m(*q(brM6r"LrJb
[jNrb8T4[m[0DhTChj#@m%@r'@r%D2S$Ammpj"ImDB`4kB,[I4-'j0c!DjL@-X(U
49r(RqARq!NV%rTf[3qNSE04Z[TU(SfaG+&r+Pr!`[TaraMrQ8IcI2*T[`R#aIr&
)[SC(m-hm'[q)Aq8ImPIjArNRr'pm,pq$AIqr8I!b2m9Ii5G41#Z%*kEcXr`)[mc
lm@imL!Ic!'$[F5rk"XrQGrN9RX-cq58)AHFCr$"%hq,GH9rH'5cYqHZm+hq0Gq"
[mdkm0qr$Hr)XhSXAm"rj$2i0EmVrj%hi,l`GriQhj$rce[aA2T(raUIchjQ!$8@
)q#6q(ckCrjG2irrJmrNrqCHJiakJI)rI2$k,Mq!rm#&m+"r1[q-$mIZ@$q+$q9L
HcbI`2$kHMqBMq5K3RSd6h!A99aLp1D$h-&m!QVZ$eVlmB6k62mL6q1-mJEIK4Yk
F'hLLm2pm&K"44-$%+lR%0r"2q8UqJZrMcr%GI"IIbEIb,Iap[Ser`2IcGrN"rJi
ra0rM"ir,![mh#NjR!3`GNVR+(Gc#,r"!2Sjr`FF!1jGldIhjBTl,Kr&Rq90m$S3
@mUIj)SKqaDIb+I`4X$a@&QM-rhM-,%!%E$ca9PRJ#p$`&Cq0hiPCi#rih6S,M!'
eid"[Ie"-k(d@p#j#&RJDe$i#HQqC"ELfNciZ1P*fl%4`(54Kf53@&T+3!(D&K28
V@9K!3Q`P#FH'N!"3j#,"rL8*a9%NP'Dcd*Q&*La-*H&f,!Y&,%5`F*Q&eLcNNq"
R3[kf,-`RSABl#hYCQ%a#faBN0+TLi4!*c4MJCZe)D&9-`PT'U-)![-qZhbdPi3!
,lm5ad)b%JqbSRc$8ANEdhX%NV'D+9V0MKc&(K-eN`8##c"KNJ36,44)ZP,(`+JZ
M53KN$JeN"`[U4d)`B`YQ4!6[Cq%N#icdB#BD`!iFX)i&jUB!aK``Mi33*`X0,%5
5N!#qQS4X4NVf0KDBZZaK*0beXm#1HTGYf*AZ,-aQJ4hebK`5F[Da`,BrKlNXam)
#fm)FjUBFYXfC'eNia3)$PTP!`U9S&V*BQ-i#!h1*NA+GEHee4ZMe95b`if@3!+2
5$$r,JiHCK`kAX(#1"HDR`ib@lQGB#'5"HD8lJpbAXI@0BB&Tl4[-!MYVhq%XX&0
fCRQY-f2VaRDX'f2VaQM[eTJ&4R8hYK[G'&[l!b``UYXc!1e9&KL!VQa2ZPDc8-%
#fiHZE'Hk-Y(A@"lT`"4eZ-B#CB%4e)(jY32,C@phBU%P#b`IG@,(km48G'+le)Q
4fkQ!K5NNp%jM)Bb&G"Bb@'"TU$Fl4ZmN%[S`&AhB-IU`p0'((E[2Yb`B5HM*dQK
2YJdpf6EdC)I[bA*Vcb-XX,65Na(DFb!,,-ePXIBJLlNMLl86@@`,XeLHbQ,-@Hb
3!&Nc@'$%C6(![9Lklm95GLrQa&jXHhTGCB'e3leBcZSeP`9fT!,QS!+@a`ZBL`Y
BGLPJa"@`22iMfq`I5Hk6Iic@HDaCjpeK@TTec@2@c6YJSXbk6Q&'i,8Jbk`R3bL
j`U`[ffr@ddV-HTG!Xhl-DGC,QTMe9MDB*,0H)m"%``6$6$EVpABBA(`1KXm9Q&8
`+X`9Q+B`8mak45P-!``Z+V*K*TVe&VPQ[8Fa6$h-1TLG-(YKS,`(P*[6G0fm@0F
pJUkA$G2eQ[QkAM&6ee[8k,TBVZZQ8ESZ3@!&&[YQk2TcKh4p9aP-LDl[2+$V@qY
eIFY&Q-kkrKiZpN*S,aK@fA9pD3ZB[6!C-&0dI8Q5VSH9`Qc3pHSV6VdKd+Qr81R
8rhlHUDr&C'f"8krFkp5PE+Iq$SI""Bp0eRPaXUj[K,%Pkmi#Q+R*HR*#-SL'`88
+&Li)ZDBPkmX@*qYG`04PIV)HecCC2jD4V0ZMNrAlCb6VjFCN[H`F6'kbrN3*6*p
N[AK1X[j-"-aPQ-R*HR9&X[kN#M-T@5re`ab!!D*d@,*qHbF-%,HKm$BBEMH''3i
$aIikQ"d`Z24R`R`*!d#eD6"9-)%`B+LGPkbhpF#d50BlVS-"`58!@J+KNLE*HLX
+!m*D3A&018`T$"!eqFRkJ*8`10!!%$F!31XrJc%NkaA9bAU,SQ5p"i!eJ1R0kFP
kA43-'1XJq!BFmJB1mmEFC2f-'@B[$)KmD@+brM`BRYm(%jbXRhI#`"RRXf$bN[8
A0X#%`A5#'3)$ajq,JB(bFeH6pA9JA,XD"KZJJ'!4!!8i4S#`U3B'"*T!l+IBZ*9
a-&YJ)23F$V1M!@BT0VIFSr-k$h+K4drK(Yh9!*-1Nq[4PmA!p)'CiY(6"*M*(Rf
p(3BAk`Gkp0J5Q)d`FcakPbU2(PIKdBm9`f4kp+)bMfiYmZKf$`cek19C(VdB5Tm
CiY'V6hRd*aGlp0Xc2(TE-(F%N!"'X4kpe3L2AP2[dHXM22VR!&)4jp'r2ZR4Hi4
jp$G!f*NdMrj5L%H[!V*UY%II!D@l32bZGKjp*`MB#F6@DTJS'!"k[j0(h`D#YS&
Kfc#2rX%"MliIK,dEkG%26I6Slef&kHV49q-b()V#MhMdjC-mqQGJqQbT4imfHc$
k(G9HBK@,hlb"P$5R+D3JSYaKB@9`6&NcRPE+8dLCDkYGcD9&'r$e,bLAqf2EmLj
aSQ-lGp8*-XAR((amDf1MD5MELdFH59[%'qIUZEf)Tj9"N!$lLrL6!P'4af64MeA
aqbYTJcZ'h-qR3#qe"mhRLja422NLbZek93BRE6N4&`$FlJ19["CP3BZ9'qrZjh&
PI'84AeI1hbcLV85LH3V6(-X1p-[#5TTLTk3FL`hR!D49GM@,!q`N0j(l6E,Q14i
(N@rG45TTRMZ+qHCH&PlDk@LHCZFTc36Q,4X4(@DrCq0VLqP#RPE%8lClVaD6UbR
fHi[aGqI8(BbTfR[9MK"JhQm2DFF6bdSCdlTihi1Ta"k5biq@9E)E[pX05KcQLJ&
PjG`9KeHK9(ba251Alpj@c"q)`pr8i&ffmfH+H,fGPa6a@P%qc[@0#81TEl,8VZB
6l$5b#LB6Ucdirp'jqm$rk1i$0l[l`2(Z2R#6Z`qNZVZ5IZ[ZlZP%G,6phR3iL&b
GGRHZ9mQpA1*Z*f-UGRGhl2q*lJk!Zp2#H&S*6aC2XlTBkCaB8@ib5NM(9aUD[S2
rR8lMjp2%R"Dmf8jHPmCVD6B[2X2[,qHe1pJHi(PcJVq5aQ)h40Q5EQ+Nc"6pl9$
%'Q1QBZcU[0-SUpZ5REJe5I1Gl!'Y(jZJ5#(!"C&VMd9b31aMLd55H#ZrhX(Gk@L
(bPUFJ+pl$(a-fDS6m'&h`VG%GT'hbd[jRPMq53Pr0jBr@F,2ar)A5hK$,)D%mTf
ar,N5AKR,a4+q0*EAPr#1XGbrejY0ZP1Ve@'B3KbXHpJ8f#*L9c'R'mR-D[G6YTa
,CVLX)%Yc*c,$FL9EA[20Y1j-,GX3,+0m-r0`HhB4McQcNeHAF5ZDff,HFI[TP-I
56k$G-CH60R1peC'dKHaR2lXk#NRaCRc)+$kbl!"TY&2Lh$,m+RX!8S,&T5lNRR1
NZ@G&1!+DZrK4Tf-brUUD0e-CVHR!aG63$,,*+E(H9*C(G,HdBcbBSrSmkemJLdG
b[G0%Il9#h6!C'!$9i0B$pFkS$26(bDHiTcJH`Z%%-NVR2(qaQ$F8m`(&[#dqja6
cl4Km*c!f&*RS)kKpq1P&ZYYLSpYL[pZLbQe4RDT)XX3T2,PBm!%2"[$DNS1m5lA
Sf-pGeGk,+5Kb@Z6Y!!1)a(CUiCjUNkp2C%a&B6bj1Pj0#&#D(!BRa8&4*9p@lI@
SSBPA%kBYI9+(U!TG[RYXD!*+lC[ASEKq2)PA-EE!YdK!%6`R'BP"r1GY,$X95!&
P4G`9kjkeYpZ$FhPYk6THG*k-&*,A9j[)j@K#A3*jjH2BVT@TQ(4Jr'ASSfKhRZ)
56YF#3T!!+J@eQ4Xm5hVPK9Tmd%SZ6qfL56f!d9$N6N0CDS*Zkij[B(MlIKk,jVB
B3lfp$L0HL@9RE"-Q2HEp5Tahq`PD@hL"hBcr-CH2Xm68m!SAEeA'2kVQEDYjH!R
(heXX+qC2dMjm(j,mD[iQ9Jfm)YE%-[eF!Sq6D6[b&XqQVFNl2*Z1XMU-C8a`(UB
ZKTcqU&PXB+Pk5#`@X+3Qi%FPk(jp!pH*43+2UqI,k&`H&eXCRkfV@-,%if[A,9f
)@Q"Yh!'h"()@4edNPpCcr#PIkaP8%C9!Db8[,qBS2%Qbm'+[8Na(NqmKh*ZYih2
pD0(5rBaEEDp9p8VHTCL-"R)9apF`I8Q0T39"M8M0I5#b3F&I-l-Vpak`mrA92)j
QmBiZ9TPS5TkacpU"4iRIJRC1@Xqb%p%3c-lPiaX1mHefRPB2`,bYPhfH9a!&(aR
h"VVh"#5Ni)PaC3*2VJ+G[UY)qi9FRPIh#IIE&BZVJJ`N)ZTQa`Z%q05Y2J%*+G*
p9D2lXUHk'i*eT#VL,e[*QQCADQAFblQ6C2*!F`Z500#cTMB)'$QGQM52M'rB`Nj
AcVZd11jdAk'`kf8I23G13%)UK252*6bYfKh`"RV4Ql"ZEPj)Xh!aY4%R9Bm0*cB
6J@JNCkBfkM1pl@BjECQ+5r+eGGIFGMKKJ@+@peBSYPH,q1BL[P(J+hI`Sq9mC4c
rV5eIHBDEl(aG'RmqPTmTiMhX[,k-0fT'`TPBJPeAb4mmb$pHacHAQ3L-bFK-0Sl
CB2*0NmbbV)if4@4f$DRM+TQp#U(fC(D&I1XNXmlN3bFR(QU+mCF9c'eBfE#ULPp
eaXS5[dV(UVX[hjRENaR*kc2)9e!fl432,*Tm0Q8*S5X5l(cZ63JN`Ij[J9[r[`,
1!A$@KbJFD*c['`FME`SAC1XU5EDJ@-+&0&'fSZL"03VQkJVC5Ndh&G96MaY'!rl
iN68hPk0aNr,ABSbc`"UlZ10lV)$F9%C"YPH!NR6aL'8DiA@r+F-0LX0BCSLb[4)
'"4MX&5YNqjNlNCKq[!T,(Tj+1F9l&(q-$a@kY$LHmSPEULZf@h,[G)lM9H%S[K1
IH#%@16aeC+JIY@XEj"R$4IRqFk,X`9#cZTfLr)44S"L5YEaXPhbSI*HmSi-S&ip
#X9iUb4XM4IRf+Qakm(X1baB-a)36*)GP0TPH5*13!)``aC-"&Nkbd)k&I")#YV1
`MS8)&[S4eS"j%M)"QBB!`,%b8Ek(SQR(-,`jIE@%3A@L($G(Y*aG5-NJa52lU%C
L*Y8mL,PXH@1e0`iN-QTf#Df8X`9*cGj'+ahC5iRUl!jBYb-A`b6eEPH-m,il"-Z
l-k%G$VL#)@&a0P'pXKVB+kp+kT9Jb&cT6TDYX4a-PR1`c%Q6b1JZ1Dk$U1DF*jK
pNTS6KIXF#eNfN5`jAe)bX$qc'0M-HQ!cGdKUjLNbbjE``)(3NiRbdR&f8EfN31V
5IPaHLTE85d6(T3c-XXKX1QDcb@bB+(G"jIMb38a'L*E,A@Q-8m"B,NR&i)9+q6T
5aI8)A-*NV*2N$1aLPhS8,Sk6e-0`KRVi(,%%c1%)bA(i-MeQFK`H3X00MRlRD3q
6T9p63V,F$d"L0iL1Yr))MGf4NlZI!DTH9,Y(JVPl)$!S$T3f'*L""*-JbAhMJ)(
RqZi!TQq-T2BPEZTVP1619EK#JE$19l&!@Ne$(ZX-ChBV!cAG+M!-[jY#pN[Z"VC
Zd35V%RZCf-E%cS#UEV0a#jdUbPE!EJGIqaV'ehkPT,CI"CRf%CKe*cH6U4m[(+q
(B3K1Bd#dLr,VJbA8CmPjZSk5j0FZL[)bR,*$#dRYF!#m(D)NfX&2CTQikSiV82K
f+E,0fcX*epZGX'i*b'p2Jp6E`l%F6CC6XHaNPY41&mN-@D!6$N!l3CAD+C[JfNY
Ulc3XHb12@(U(86+BZhFkX"N%-Gq,Q#0CHLHK8!2H9HV!e@HIC1N6`E*`RmX%d4L
)Eld))a!pLb4,ch2Xm$eA5@V2N`4j"-L@AZ4!)"F!QH@5e+`MC!EbXiJAXr)NY9G
Ec(T95CCH9`K-Z4Hb9d%FD#aSKTX#(++!Z+6J+LQbL0DJ384T68bfLiirQY!BNk0
T$!PrfPQ`NG!NNL6L*U1)Uhij)-V*5H46'#D$56&!LA`m''Q5Im+9%pRNTfPS1%K
a`BZ5j@FrFB(Mjd$#qr0!bG(k$0(91J0"E8e1qqXRN[TV#*RP5TD*-aM0[a9,MZN
X18rr8R,-5#26'G'l,09&0"%Erq4+bI(NCh5h55j9*8IT**TSNQpMr+BIKHcX0Y&
5JNXiUJ3Mk1bV4EN4LZif!R(f3k+P84-kXND3!&[C*,@'*0ND3E)-f%i6Y`Z1HMZ
"8jmN16j[5QY0mZFSjQZG,+S9b#Cb4B0N`6!JXNF9*2G@C"2EQGJ#FMpa*dAT[Q-
Y4)ZqND3aLfkM'JC#1pY,$QF"R#JlTk)P81%dp"9a5$,*#C,&Xj'1Ke6+![ce'["
h5FHJp@Qd)mkiE$%5*!ECGN'TeLiNFFiA(9hQ%`VM-2!L&NheX3a-d&$Bd@c'SZT
d2rUK0'a-1C,NI@MPd[U*MV*ca0YPTfK(K&bbH++%YM,*6r54j#F`1L-Y!Nr#jj!
!LfFU)+3q%i%8mFaPKTN-M&aG)9QUpp0`E%Ve&(LGT$$(Nj-3,+AB@SqJPT,-a2B
KLeb@$L0%hYiTUEGaSpiQbIdfbH5h'dZ1fm1*c'dMfA`r8S,U4f2Lm%F6Y$q6SEm
Nk&``e++AUDdLe0B'5QSYfJP(l6bL[#hqR&$E&L#q"XrATp(a*VRM1U4T[!eeA%`
FA9)K18UUL-i5E,E*dBKd3fSMG!Q@4R0T)M*'+c3SVF)!T"@9(+f'Ni2@P%Z1QUZ
%UkB2J9+6,mN$20!E+$S'V#3D"L""U`-QJ@d!2&`2$bpE,6VU2b1Ap@Jjj(S$F(M
(U+M'"#1$@f!Sr$+d6$e3Jh(K@e`$%TYVS#Lr14d6P!UYLj,8ZMa`eKNPp3eN*FF
EF`RX-fE*FDDHd(*Q,d1JD2%C`V45G,`dND!ZEX1b6V489E,@[!T0I98`18E99-R
aI!'C2Qq8(1FVL24j0*S[S!Gd[$#9V-qK`h@"a(-aNZAFG0BQR9X-+XkKRh+"e,q
M0'J+LTf[fdGMbJ6,fY8d"RpDB'd#p51M+ZK!8iD,&K&13VXQ)NX)R$KGZ#`j6'C
#Y+Q'KFr)cTNQ34j9bNpYNZ06P[e@aV'`K9b[a(MjP#a4ILjIFZc`N!#,(DaUX'2
T6PU(1i`@JpY5QSN1E3l0-mNkUJQH(D+DJ[j"GM8Jb@#)86,d,iZ4("JdL#5E0KP
rG3T&NT142YDMXBRG50#aD(kl90&a5*9a&A3NA(DX@,)8P6'8YBLKl-K9pb-9*@0
dqRB&%r4R$jc#"+58JdSRc"-6-E'JMJ6!cRV4mF`3G+Pb0F4dY)92)XAUU,$H4MV
8'b0[cN'h+hI%+I8MD)2`a90(5Qde!KQYRP`0!$JcK1[4PjYALBl2BiLk#V5ICZc
4eb!%IcG%lK''PpCFdI&'!ef#[)!GdZD,mNXSJUY"GG9*E2eSSZjjM"R%"pBAkNK
5If%+JZ9F%lS)4eZ(dCaShYI#Rr0%Lj*%&fdA,%)P65`A,+E@G"'L&%XAZ36,KRT
fqHQVl(,P&(DjEbHjP*q,`M"58Gi"4mH)MKeC5(H1AA@NBV'V(5&JCjANf"T&pQR
V%-QaVCMXj$D3!2I"!9)&f9p'Ej[8rFKSkVZS$mM[4NVb!3bK4+RXGe"jNYpTL9'
,SZ03#p+0(*TS`[-Tmkk)AXB#r,)($P5fqFcqJ31R'Bh'+BB%Jf'UaI+$`6#6@-b
(NRR5H0K&8ip'3-KS-#3aj05M6B)0"N-Q--D3!+5&"N2#D%2m2f1#mBX6EXIiVXK
PAJ*4m@d#L`Q'K-PX0MB9-5EID(cBb!LB#46SHR#8aC*JX8ce58`GG2akM0(i#"J
5M%mEM8qVUMV61)F%JTVJR6("4B09pQq"m8',`6M6#f*+'fJBCNRb#6hbbQF@+(M
%5+KHD25K(jaM56*1Y4JX6'Pr#r&8JR&@b"@$C43d@Y5&c#Q2$`r1(NE@mBKF,iq
Ac&c'j`A$f+B5,5#q2d%rcCb8m1!LXRS+diG618H5f4MIFT4[-U8r%FU,"qGceS,
(jaTH2A#bb'$!CVp`S@P)0f@NXNKmUI[6IpllGIVMl&r,+ffb3h,DC!F%+ArVFq(
)"@ArZ#BrcMRmp*aaij5$,)4Ib,JE%R+PcC(ATribY@rlUAmHk6hepial!38K)BS
kqC[*Nj@MEUC$rmN)3a'8bb%'5q#[0dM!Rkf-I,PamrqrrAYj'mR'aL55Qa2qqCd
[ahpaY0a)X%I6EFE#IbBBK`Gq15A`D2[!Va#b6cBaI'miHX4L12VR+bhQ'%BII3I
CiZJ[&X2*A(@5qUdkhS$0,63B*KJ-X`hr9Er)cVeL-9bY99A1PbfppT-L22bESM`
bmj(q5Y2'mE1hJejr+fP+Rk"dr-5A!J+8R`UQG&*QB21H)cZB092j6MQSE-ZmS2a
-0ZB`XGe8CB9k9ZAHImmV9)c$8aIq8Z0RqbQjcq8%"Ta0$lEF#``)fGmq*bK%-4'
l-d$C%Z!0[`3d$@JG&2)Ed*m%0!Rk-dMTS)M+1dh%1#9I'3'9pbR4MK!SE"qB'Ca
c*#4)U3a5YQBUp&*)AmlrqR$k[A3#'!!!(4p"4%05!`!bcJp9$@8e%3!LBqj6[lB
[cD1mLFp5XjQB54kC8TiP55XAf"aJT'N+2TVHT$B4ScF(Hc@d,*0!0i1j(#p('r,
j'J)kNA&RF-kXLqlX$M)N4'DAJbc(@aLFpDTR0M#SM)IVB(!9hFK`@!iEQ3cpr[h
HDp0'CSklGqrR(aZQ*`9"N!!%34!%J'Kr&qBMd5KHI-XX-d'j'GLAr1[B$UhpR'N
l,c%TLHmbCj`j9k(LF*Sr(%YT1hcY*h6IXJ)N'MLQ#TBa`45ImhY1Q1QM8[jJ@cN
ZINJ%lL-#6pr1+JYl6MaGLBpLqH0aqH-Z'-4N`ijNmNPib-38i*Fc&TkHLSa6@N%
RS`Y%q+A#D+"L4,XR0IiFRrlYX12[faaYC*6UZH1MiLfjDDjYLMN1GcV)9"MpIZG
SS'SK$FYeaJB@Y*5CHiHedpbMRB604rjjljETCqGAmN1c6@GK&TRT)l0Fp@9Sq,'
%VikV,Zq`S,DYAa%DpBV(H,KIEF2h%+[i-4'bA'%9F`a!%EKD4bmdmd4UM#5,R&a
&fUCNQRe-Zj,X`cKLX)q[[HSiaNFlAD,2i9dS1+`[Ea+UM@&L%61%iBJ[2cjXa!a
LL!X!@$c[pl@jZT02-B*Z,da"US0rc5['%q'il$55"IaVF)M*6I(%D+HA"(4$1+5
IDDcMFIp[L[6XXD'@bH")$&QRfkRqkh"+dpe)9J@G#56Y$0fAhP"QLTK#F`Y'(!+
@eq2m2A"[2LT)Kr!RL&3qT"p%j9cXB'S80[S%PP'T`CJS9lJcZLk!3Zb'Q0@Z*'%
3h$*VY)23Ua+KEGe)eUeldHYdRLPqmIEkmRKaQm,eL5@TYrZHAqI3j`biY(4L"ee
VJ6laB4kGB)&V5d5FEITR[k**E)0pAPeAAC-`I"r%GUr5"j!!`KT%!QYLb4pL+N1
8QljHVeZrRJSjhFZfFK(9%8Sr"VGbBcLj2M#QkPH3!1C,"LqYar9UKA!Y((YQeE!
((h$PE08+%%!6)cB'%-2V34T-$@pKL$5526i$0,F$J'3+(3lPhje9(5d$-)EUY[b
!-["05FBBbC4TSah"B6Z#lLa"`CU8GRXTaiDTE)[+*EEKMir"M)9%'4+YSf3-HJ9
)G6RQZ,pYY,2X*IhGLkSM3*IUjUX#AP%I$kpFp@+*1$`H&P2M`82rdACNB9M"N!"
8HNMhZaH&95mbeQ3$eU[1+-c6Kqh0dp4`,d3kbA@&NMCFIHrIP)(8D$jjqbeXd$[
V@PaZGNLEdlCpQ$j02p0p+-cNFQ`I4MTJ0k9UhS)UD5ENL!Nfb8`Y,9(1`%B#+4e
9rpJP$VpEDqL*kLZ-8DV6d2e,rZ+RMq)++U')-T!!&aqqTG[mP*lQ%&,FM@dalR5
[$8JT,hfmZ'8%0Q3JT9VFKX%b5ZB'[%*U82F0qd,AqUrTiJIGH6q10TdD6E@X[m+
43Y@he)S51)1"p95B*U5%8[Bk(0fQ)58B#'&`R3hj!5N&NAD-$1cXm"V-E-'"JQ5
Di!V2M8Y*KR5+B3kRa)0+TRa+*P`[MHE'Y8alDi@i&'N%N!!F(l!4188Lrqr9bke
V)F@-M6UC,ZD%IN`T05+*e`3P-HMMJhfZ5AhPU2m[R%JX&AcB0&c[-hXCiU&$+bK
-$24#24(L(H-LL&4'E""RM@LPK-LZD8T+DLGYGd03VCaY*!(P-Y[%8*pJUdk2B*!
!1eU!)@lAY!qJFFR(Ld#*fql%i!*U4+6Chqk$Q)+%(LHNUD8Mk4AYji!ZCLJ%%@P
hQ*fK@$D3!2YGA)HE9Q!"ER'@N!!"%m-9ML3R6jKq"P#dBcZRhqiMCTTJ&klBc6'
e%+6Le90`r6ih!0+RFd1l(9Z'kZCVQ`$U0Um!"iGMYH4Bi+$0GNY8I"6#a'&-P,c
Fp&')*KUEkKBhSY[HBDjES`pp&&S'Kc1,[T'$P*lUASA8i1AmNkNrFJF8p@3118!
BN`hj'KiiCX0'+ULl[6#ITCl-@kP[PJldpce$S(Y[53V*V#8Pq(NR(mcYdM*,Gh"
4ZqFR!8+H%4bQ+D4YQKTU'Y6f,QTE&2$[dd3JQ-IT2KF!Ud1lCmX1G,1E,R9UQlS
65iHDJYSpQiHD,QXE[ZMmSJeGpN[dGrbPq`q9GFjTcBPDTVK$$lk,-!fmVR-(,92
m)R0jf-@1$[Ve))#6I'r*d*-Xm9f`a%H**'amdpP+L%4$G3qk&#A)P)FECTmKP)m
4lMir`K#KPP+,%"N,YNlNR``VqD6-D#0'[4Fj-cI)@l'qplrb")3B+jTCTHkVD,r
UbZH'fUpZ'@Sr*QpSXkQTVRmjTZTQHZkSZl,NcpLV9JE[B8VY,CA#)"K#4X6cil0
0MbhbQ9QR0jPeV[fkaFHCiMD!U#m!a3H"l%QA[c#a[,IZp4f@ZX,Pel()mHMK(9T
G2bhM220"'!8Z*Jc9PC3,Q6E[*)8U513+&MFJj`RfKRID*`DM'k"UG!E)$4J`0Mf
`Mr['A@3d)dG`N[IhBI!A$4'@ULB8*pr3lL-)XjNAV+LEcd)N6Ti4-'"*MT!!AeB
kSElp@Ji-%3-X2`5"Xp6*4(piFQb4QEBHBMG#%IBJ*ISG'10llXJ8Db%L"N,r582
5&4a&-'fN+Lf2&,S&&c+K#I)P1kBU(62-%aD*$D+&bFGRqR$",6L8i20)"c0YK+'
`ELCp**!!50`VU6(D4R)[2me0ePXC(U0*8JN!5q0bXrAdB&rkSY9#TABb'U92*0F
R-1LA+5hLh[jMK"#ddCCJqmd)"e$KD(N+RF[Z)q&#U*f9')6`#b6(-A4l'+R4Hp%
mJ+(bbB$hF39Q(&h8c&S''jkM*PU"C`iRj5B[lD$8mGFE'6KUAE9%R%#b[,IpDVL
)S@K[Jf2ak%Q!*JR3N!"*G!06r@[AA*VT3m)QVI3ATe1`4HKdddT'H9*IkGeI93+
9[eK@q3JkbY4&&kG$3CTjUSUTS3Zq8eac[6iJ4Jkb5d)*iHThfQmD802RXlQH"`J
`(9PCFZ6(If5EZ"SrDjamqaqJJR8LJ@ZZJH&f08KXEd"#8QbA#,h6+Gc9(GVY3Xj
8&lh8Fhae"d6$4EqLVZHATJ[4$e#)1MiS4B10,Ka#N!$#AI,KM+`#RB,#p'JC5Rr
[#AK6cE(Se`AE83QY%C!!PUeSALRjQVl%AA3*05Xk8k(iDS0$h)fL%,"UT!$!QP1
9a@rZq8S+R!3qcUmU%bP,rme2pTCd#lZd3(0FDrQjQEVi#f-39q1j%Hj!!a0+Q-5
!D,5pVF4$l%IQ[9Ec$iqqZTN05UB(9D3`D"S(E6"S&&h`dF`&$`ekrI&2(LNamR(
P8USPh2%2MhV&rP[K`IbZ2"bkVlpqf2,GZr3cCB($pI6A99pmlBQ!lR[jd@'MV1h
`0IVVZMD[rSQf2B%U)H)QN6mDbr[kEiAk`P"l'N*0i#T5h$!"@Pjqe#QqRhQG4bH
VYa&0@+NaD)cfj"+iY'TDC&SN9DVQTjR1Vc4iC+Kp2SMp(QQiIIDL&*chS@$[IIq
1pS`A#21B8mZ%9A)&QpVh3Kd*5lQNb[JDUB-lJF5ZM"bLdmKdc!%4FIAjP3)YJM#
,k#Pj`8T8,TSUfKmf0E9hq5`-*Ih1j+DpHGjcarYk*'IJDSNHDGK"AA*1LH6%"3U
ddfC1580j`MLIQe)PXZlj)$B@[JKM4DUDK1'MBF2ikEhEc%RN-r-2ZY&SeHfBmYE
NM@CQb"P('%DTaib16Vji+5`m1`$@pM+JQpY1c&Y$iJ!4S'BqLXdD"C9#MNl[B9Q
T&e9C[M9!)BB#+,SiE"cB(J"SGTMEZd*`f41T@$8be0lPk1$mdbM3ck-NN!#Dh6c
Tb(PN&[9#dG,0ITklSS-4k,5%b2`,b)3[NUYFP9aL"9IE(pjmc)qdcqheUBVf'`p
P`L034eMB48+2L'!FS,L@ZEdHPlba,)0Q,!L8"@Mi+!K1*DNM8J13!-DMVKmZaED
Vea1mT&Zh"9X`j-6(R3CA@kKS9#3M%*BI+rTT8hYCIem&Gj39FJ)26&pP%JSjLK@
QY%$Lq4,he,M(%V@Kf0EppB02@X3lTK!B@k'kSJ`XlLaBh!"9MV'C[DTdmIkq-(G
dTiFm,3hj0$[NdrD(24EHmkHjE%bkl2LICUYM*)jABVYc9YXpr5[R$)qZAX#'Pha
e`l(4P9[+ClKqjLqhk8Z69066QijdrfU)2ZKbB+))2)mZC[5CIBP[ArMV"dAZQCM
4HdGQBHlG'UjPk-)hcA5e1pRKrTd'H),Sj,YjHmYq35pYE0%bC&++4Rm5#)Xafdp
H*'3GCUj,JC(%fVBUF@G(aI2kH,#6N!"e'%JlV1eU0hK4'QN&+k6Y,Z4U*jY`2-G
(,GiIKRP"(L!mmG#2mRJpH%r1FQppr(pLDJfQ9([KGcP%PFbmBiQFDGJJX*UFBb*
q(1qZLNE(Z*ki[AjCaQQBR)C)&3R`c1'J#Q-cC$DK!CYJa5E)E%80f)UXf)TN0Vd
"Qfl&TXYX5J-faBT0NGPb$GKb9Q`jQ@fU!GZ8&GY8b*4c5&[Z+DMJUqHPUk9L9@V
"`!ZDUTNUVPChAJ-j%J"Kj##aS(CflGmYI)l[iiAm*!@be8U6H61kdX(l1mD53ZP
4@9aaM6@ADLe5`jp3h#[Ziq'4A+p6EkcIPhLJMUEf6d,FJY!B391"jr[l)QR4SjJ
kM2kDS)93VIe@a5mJcP6DGkJ8dRhbdlYD)+bI,FTTr1MHICm1fdjFfp#4c"AaSjY
'a,YIZ0Vf(*b(VfhSP*`acpd[hGpf%XjMkK2[E@L9h-Vih6I2-9C6MpD6C4Dcc2%
&-4mVJYZ+@EHGR$baA8"hHc6$'!1kD'qi5+FLb(`+S!PCTC0l,J(a3MK3J3kZ9eH
,ka8q&d&'+VqYMRrXGpal2@dm%AM&I@3b8&3SSQh2cVm24PKG*B'*+6@HldPZQA4
)aQQ9AM!0h,D+$kabc"R+S)'8Q6HhC4A%L6PE9R%j9A!+#U[9eChVM4RSdQrmkXp
I%+1VIAK"K8%&K@%fN!#'-Y3+A"6RX%dF5E-lB"$"Ll%A0'5ri*M$bfj+5hPrcT`
if"aZAk!*,%#PL[El#KNUD4R&R$HM#G9STl5%+[0R9haY69p4HN*&KK5F"#SBbbV
DjcqI8cR-qENU4qkk[E,rlk5B5l9lp('4KJi`!Z0)2Tr),AGiCVm"1aF#TrNdE&S
PI%R33SQHfeT9-ZA-'l@[lQ89&#e@h5Ph$$$2"RYTXfjVRH4TGZYZ!Hcecj8q![E
"6TTkQ%fp48G#Q$Nf,@j24(*kZl*,qjil6i2,h8"*$1pL`rrVCafZ3SN(-'fl,6$
*+6P9Y-A2YGCJ,l'J)2,9Tf!dZlQImeC&ID29DAb5fIp+h[FR[6#Bf),QF[&2!NA
i($5A'p,RCA1j+RhfQmX&kI-9FhPFqT`aPaG*RaI0jC2dqFcIF$dN,GGDXCf&DYE
RI3pQ&$9Xd$,pYi,Tk4X4prQXbINEJp5SY6*pZmP8H2f169!``""4#d$X6%S#HS%
c9%1%e&kqRP60ND[jJHV%%)`P8baCb0"58R%a#TMQr&jPR)kpPLVE8rkjZ&,mqcN
Z(AiZ1dV3I0Z2J65L")Dj-N#Bdj!!!$*A"JecUK*SjXT!BNj"!Y*F'9c-'CI!09F
'((-@5B#E+i13!$NRVpp*)#5P!5$ak-A0[EVl(qY6rSHJPX*UqXT3VQQQ,TC3P3'
j4T8"bF`c%A&i2j*222jER6A-H-$9l64R$VQ3!%`5IR[br&f((VKC(k"+5RbJTKA
LJI2mAZBBGMa`l9!JPG$hSq&d5$m+XcqT`IP8i"8jj@lk`V30dq+5Ya9qr6(1Niq
Mi)[j)%[59+klGB6cXrV%XKqYUkF#k0[+9B#pLjTSh8BqaP@BaEp@M,3)$+D9ch(
&pREV5'Pqr0l@-TM,d6(#Q#Xp[*,A9M8HU9he!fiJ25r%E-(1X+MB4P[AYVjDr00
(XCc(p`-ZHX8`23S6A2EVGr!!dTIIeAG3-$LG'ZQQLIjkT6jXB%'`+J'Y#QE#34K
c(E1IF2l8KK4DeB8m9KTLjN!%D-TZ(mc2S6jA-p+l"HXkAkp&X1Md!a-!d(5(1E`
3$5[U3'd(k[A"C4NXUk)*,cb8`H&%,epGQ8ERerS!4U0l1i!&jF1DqQlpVC`JKFE
$2#DMVF$#Jr1R+&6FTFlCPE0*U8eA$URA8dLF)lbGVMBTq#k&qV`'(T@+iY!,DA*
pL!X%BPF'VR9d,DEkGJ(d[bJfjjCc5INY)ZXqAP0Sp@Nma2ZKh8kMM)6JT,q6@'m
4lf#T+c9m`9R,2Vbbik)cb6iZbaqc-X-9fI'mXjPpc*%(G-X-HIPME)CH3,iF$!A
rb")HE-,$MN+(9!%@K2URM4m!R*L,F#06)"hJV+$af6Ia#Y$V++XFC48IUrKBCB*
9*J,9A93h8&Cr4MR0Th4+ISEQ#%$4294*qIrU"+H3!'FE*"Q!c(EBe6f&Kbm+2IP
RS-b+4LKFAFadZ'$)f"MNqQZh4R[,r0PdL+2UX(-JdqQ+&3SR5pQ3!%Nfa)BKiQX
eq8XBB#QEN!!DKaKJUbV6@A*P*ECeDUA1#dZc5`K[e,a@!f'+SGrBSCNqUkA%UR2
k-bX'F34rU(liQ6pSI+810%iM'DR,I!3#"C!!"Y)D9aRUHepaY"#518Yh"LkS1T3
a&HKPQ6!Bh`LNUcdRZ*l5!1LiPRNli%VLCaSUekB&Y!a6V'rQm!L2ENJ925PpT$!
iGBT22I5Ml&!"2me#dQjJX1'`Y('!c&&!Gr8lriIc&6HLd9dX9'$&$BA3ArAQQCQ
(!,&"JGN6U63CmFQ%klfIUL0IKZF"G2&Z,K@N0-,EDUS4h[BX%0k29`eIPH#*Ma)
&MU"MMq0`iT!!l9RfPlGYaXZE9mP`U[F1rj&2rIS%Gd61i1%TcfbMK-J`MR#ELCL
3!!6U46(d5*FEf1D68U4&#aMZRQfFkC-4RpY%D3Q3!"!C#8HD""')F,fhiB+1HBU
U@a53!2`G5)jJd6`5$$%&!HrM`cBD,-llAFEAXMrjq6e%'SmiACPY('fCkEY`A#k
1h2'#SV)P,IC,+ZDX-hZ3!$c21YeTjdLeXcEYM((VjA&pj9YH3FfVH+bUG`J!JGN
9"1f[STZA(BqZB5!`XL#S6B-J8CcHPVr8m%YX`a`,h,#FI+RDcd"@fNMj3)Q9Y#h
IkN++TP[NlDV&GL@r!M$h!J%Q+8kBC[2UCd-5-X2`1MZNG$Fij2$rLe"r'MfpRaa
(Z[kBA1hAJA6,ZVJM$`"!C4S)GbK5K(8rJ*(DXp(2r@%hZliiqm9-(e2SH8CJ-`V
ML*9DVpee(*S)K9SUVRUTh*haJNN61fj"h2Va')%5q'SK6df%KeP((*2&'L*`6ME
@8p*@J2M6)R8M1`-9#qf0jAL!J#@18kF4YYq(e"i0hKBq$59#$eHJQMVP#k"6pe"
P)ak&l5(4CDX@XT[-NI2M1b&m2-'Q$IV8S+TD+DdN19ZP)4XcG#d+VkHUBT)1+`Q
Me(f4!1Br`5ZjkMq"@(aPGPRkS@Mj!4D"`XYC'!Z'kS0)(%`pe)8$!1$VrmJYA-6
,c`dm$"YRR4Hf"0XM4JaTb(T+!-EY(TJq4mCq%L4`UDX!S9P@RAA4Ua!D20)&)5T
BB+Vq*B,2VL+8&XQIk!d@L$BI5BfZ8$h%*Be#bD4UU&iap+emLKk9*3,IdHBJU@F
RC%bqCDl3AFdL6--94DLSVZ5Sf6@'(dIBN!#9YC!!(Ak+KSFcqQ$HNKpp%1S04a5
jCIdSei!Br[862"3@m4Qb[akZFT8Z-K5U[Q5HAA))R4$3jjYG,S`,PEKHBCHE35A
NFZ0L3IaF#Br4ipMk+#XN-@ka4c5[+G`GfC9f5iL"01XZ"PE@4Dqr6)cC!bBE(*!
!4rFTSa'eHJ!1M+Xqf-AGqDeFfhL+0KF[E#i%(i3V8VI*,KeM&jM@*`Md'b&@JN'
MKb#Ljr!SYK"Q$LLEFfc5SSH!%"iJK(3YQ(,5LBm[#rLJpQdm,F1eEdIT-FAG)&r
#9dEfmd&ZaUZI@r#Di4THBHk2I-T)l&RJ`2ld300ZEX'2KTrX%#Pp!Q80a)X)K+5
cMC*B!M("!,Ta9a`[Je++V+$%q[Z`a4b"8A'%#Ec9ECiYTZ,Lj)flZBV!-(`13r"
lZ8d25!9*Mh#eH$H2db3U"UD&C9E6M3fQTF%S$T!!EmZj%Z'6#*k"U%*L8YR0%Nr
aS9qhq&TGRS@((Q`*(`G$N5Y*$*J8jah#P(LJ*Rb@4#4'YJh'S#*@a,TB)`L&dIH
&er"Y`lq&i2``'G6Sq#-#9)mi0)J#"I%Xf[8Xc"3rII6!,6hG')%#k`JFZ+PlUKh
eJ3-[k1jUamf!lMj3Rc)Iq"i*LfRh#i%$,qe%k1MV+VfmTR9iK1V)5QHL*N"K[bJ
8PIhe,*5q06)#"6AK3SJKme5JXKX$qRr4J'aT@ma@"e%E`PY2mhc*SC,k1S"L
""AS*qSXVVL0SVBlqd3%FFEePKD9Dc*3DjU4H+'LXkKJ,jb@c$m$"PVK!3`Q"UlS
a8B5I1#EMdL5P,L0ZFU3([%2-NqM+1KBdLH)RiSI,5(1"-Ep#5e5Yr'cN&d"##4G
pNiX)k@"%3LG#[me!&BH*R`qlbqV,VT@)4SB2[2%)3!b8Nj!!SKVp-RESKiV!8$2
#aABJY-Yc4%#J$6N-1"!D9h)$MbHrL5$40i&b"M&L3I@,hB5f,U0#*(CLB8ZK#&'
"X%0fJjBbb%$SF8CT3TT1Qdh)Z1Te&#,3ErB60!EZ3Z,#k1rc6[Y`e"9GANPPQG$
J)Z'lDlBaI+rZUcDJ4%q`S#Ujk`@"BULcfR3APpU$kQUV-%qiGl4ra68rhE(lrJF
kd`efR@S"qabN6pDTrTikHqCFBYqTTNQb5kbVVT+kc5Dp+rjr3&)eFV99UM+c4G1
fa4,`m"+jX82EYTJ!b*6#&"9iC6mH,Y[2G9-M3ZY8#MpJU[20P%@)Cp9ab2Y+m"D
P['9(VpGKjEMF`&(S9A4,Xb$BUNQiDZfUXHU&X+bXq*QaFS8,rrJ&3C-`C#55`P-
dNCc@fTJahT!!Ja,H&*,*TmK*d`M)ZL*-CdQ[m#+9'#l5EH9Z5H58KXm,1)[R"I)
*U@%QXpj2"pGEdPHa)R2@ZZT,HV2,jrh"@p5e"@XD!#9T4jj!")EQT0faHkZ*@!(
2RZQb00#1e1AUB9ENV%%Dp+BNSNQE$#lmVi#`i,09JeUqN!!efheTiZR`0qGP#Ph
2qa#iiDD(G'h0HDfrEmI%qc`GNPNGm)BK3qmM0FkhfU1ql0c@J'PR!mGG$4b2T"e
5f)iGU8`@ZH&JB9j-iE*JACNT3FRjC$Jl+BF'TdP8dV4pN!!)(VUeCGV+cacBRRB
lEAK%@Mef"LN4&V!YY0N2J*N-i4A,GP,PB`TLGCJ8EV0RBHk%9F#j`Uh#BUQT6m)
Z6)Gar21N90k$IjqNjkqMf)R+GF86XkeVHG@KM#-i@594R8bC#@1D4$("*8,ie4&
'Ce[*@4$@&DrkmpB(pkl[j5N)LcUF"TbLVqA#ZTc(1J4@B!'je+c`88Lb0q@(HE8
jPd5SbaTI%'Q2*$UI4C'$ZTp#qK%'9'aAHF5ZXYHZmT&GCCeGC8rH2h-,9mlPGr$
8cMVHA))(FRJcMY2-([%q#$2'@VkPQB*@NqaS48$5@M5ik-%UHQLpqB2ZMIM%F5G
q3@(JKRd!6rUI+CcNc8PIM#GF96#!fr"4JUS$)DdfEl-*Ra%XMappGZdr(EV0c'f
K2M"3B5"fKhF1GICHG3M,FJ'[&)r$c+!6qZMqCFGj(++N+SA8r&-a"-l8b34G9K$
Y`fNN)B!&6i1a@%#i)`V-err$G!U(TFqpl(9@pj'J)A8Y++SIcrkCjH#ccGm`pG4
de[5qrEh+ccpSlDajLF)qhrLhTdp[kPREZp@m$AAcl,2repa[2QYZlHLjlpPhHKE
pmpfr2[$YKarihH,&Lrrf0cdl[rbVXadI[YMb,jprepcqG12IQLmm[FIm[DFEcAf
hDKCprm222cIr[6P`r,mF2QZHqC[IR$ArlerHZ[CP)`!!2!j"4%05!`"T*""9#fb
R!0&FPrqlchZcE(EL'YFdK$5j,-YfLFPQ#C***@MFa,LZ'C1ZU3hLb0E4A5Y*h#1
HR05[aqiQ8D0BQSUePZ%`iM!d#JP*B#b61XjL-b"L14'XckF1Y5!JSZ)%+kPSp[h
mllhl[&%kc$RIj`FET+FS*i)JH",C*9lHkAEMaIr8,"L!IRNAP+YiD6$'BC)XHl$
ICfd#UP5D&SL,dEm,ie-9N`$CYNRl*lf8XSLR5Pm4Lm46NV&(0Q3PEC83aY54`HE
L&[Imjf-qkhI6,RcS&`hY!DGSJBJQH6!B8[$MKc$$0ZP0Q-!NFTK,`S!1-d21Nk6
mqDVb08d4dA1`#)VR"GY!b+bTiqTTli"bqY1#B%!NBppcGh-ra#1+H%kFa4A4&)V
'CJ&8U%DZK[AeIr4+e`-6U,18VBNhV`K%IDH-[TqX#MPYdC!!"YfDa%2FAck,qrI
lIDIdp@ZpPL*pC%D`DJd5"fhS0Q4k+XekP#[(bllA*EDl%)AST"bG423k&TedBAK
Sq&d$5"T49CJ`4lJI'aE@h1fHqe5D4MRY*FCqVb69$Y1Uar9VekrPj"+pQa4MA#5
MTl5B9f`2a@Nj''jb(%Qdi%3NG5jjD$33A2$Yk1DUFcTA[a16*!1e`i`QMR"$6Al
88T8IYBf5i)UQ`@R!Qf2YL(MQG4L8mpX3fBdXGFFKDlj'M)-i"S3$YRTMh&@@Vc'
10%@)iI,4GES'(+`4KQJrQSGa*@iG83!UPYp%Th(@DEeZTj*"NlFfM"AlH6ch(m6
fedIcGl$)!De)Tkdi"-!%Be`8"J8GSQc`(-5dD(T@EaERVdV0c+L,*PZ6h`C%CUm
0!`NP'fVb)C4C2PLD4J0$T#Cd3iX3ZrrIb8*RfKPB5!1er`jL@'NDYQpaB5"NlK8
b"#b2c1LT+M"kMR*qhY[,GDG%TQ"NYL3'L%#26-FQ-XDfhE!B2[)Vajq!8GZ'I`e
[i6jS,82FCD[lHe[J5"-h'Y!m&DK$-i9QId"%X`20r`LdSMQ!j['!#FdiQQN"Ia2
!THl!l%5M!FL!Z@-a''8+e68j8eAj*YmTQ12k!1LFiN$j'r[p+GZjMCiC8Q4J-4&
NkQmBd)J[eG%cV+2q*LGBET+l15*#e!#8,"lS004"G803BIh8kS@SSjl%[Z@9[$i
36GQ-*TePeSZe)@A*5c8c)adPq[lQ15!@2)VA!)pr!'-!c%ffp-,d3L"#VBBa[NA
FqUf*l[Q'V3$PGE`eaJI(Z([UU"Le"&1fYGi$pf+E0-LNkh9jk6Qk`&#r@(GK-MY
JFC0YPTS-Y6E8UFQ'3qVEam[ZldRap,43p,Nq0BR%HTCB[e4L24)(@1,!8SN$BTe
%*KTZBX35D%R9UHG$cJD2X$NQEHj9cpZ(#&%I-dla*)",0KVe#,T"rNi&+[Yb'dH
J14#))bM2YRT$FX1SL'0ZGpIp$P+N)*r-hjLHp362SFDe'"r&F8jbE)U5'"KQ1C-
a,Tkfl(*T$ZECmS#!HX*26`J'&XImQiV&k-&LC+pkmA6T,PH2p"QSd(Z'Jk)IfeN
5AC8q!a8a35b56H3M-0FkiRQ@'H"fklRT%'rRr[3dQ0[rD15Hm`31+60qF!@fm8j
kFBK!0!$q(d$i,jl++3cE,Zf5SLc"+HEi)Gl'ID%iR`8E#eH9eKASe-2&8!YV["8
Dd(GeH53"#-YkkSd`0SrUE(i,Nk6'e`(U"K5Q+RT#)PDN9%bm*HlKE3%RLcV%94D
T8#4E9+51A$JB1K`!A9%m"3ElMfHmeN&(!46K%!r6mQjhHB,3'fQ4S2De,$+i0@p
dA-PDqXSSVKJ1F4mP,@06HAU[P#3L5E2LkLK%Qkd8`B-X`SJ)46qDQ+8Um48BVU+
2d`FBTdUEpD)M3YUXBCZ*S5SqSr6jh%1m88hL0DM@ih9,(F#VAfh&+eeYJ81'SK*
BIK84&p6cH*@Uar%bUTB2(J)qG"f[AR8-Vi"k!DrpkLKH0R83QlV9)Ea5UKQ[1V8
4R898%VQ2XX-pHV8CaZTCUSYp2Q3GGBdk2M0KVKBqUKa0maqXLD1UPAdd802)q9`
f-&V)a4EU9KZP!FM,$3+T5&P(VGi24YN!BqSSSZVN+"HLUYAH(659EM$I!2QMHmH
SHJ"GjIL0)4FDPrclD@,q%jS9IZjHYQ28RmNkE`Ze-,E(FEh+Af98GPcKIRm92Nr
i(p,V#HPrEY5I*E%XC(-`,D#HTb141P1[bjeeb-G#h6fN2L"eTck!ccqT6dRGGFh
blhpZ9,d%3+RaA%9A@CiQ[-+H%4)J#X$9rDU-c!pFi4"a[qZUG+mbee$3,QA**dS
!'PTFQNq3!&AGMepFj,jM8[-J!5A&i$(#emDf*q#8d)$IA6B6#U$SCb1"%1MjlKP
`$dQZ!kJ(-Mk"A9jjL`Gifb`JiaY"lTZNEQX1Z"H4596KlST252JpMj!!G`aP@`a
)ZaJ&bPp4AR3X+ATkLS&Z99a4@@Iq@l6-)[F,F**B&$YeHM%2LkFZEZ(K@(cb+qL
L(%ZcjE&FaG4+GlRY("BhBrX,TMIq$RmKj5C!6&Z(l4#2K1+haVVJ400@c`JQ#N6
AL4m0INciSH6lM9aCL+#l0H3#k'a&0M930Yh45jm!+TAZ13hF#Z)!iRq)+eHlZK)
0A'r!B56a8`ma!`261biM%iFrH3L+rqFZ[+cd)hIQ,+(2IdGR-55,!"%`GHU!L$!
Em1m`i&'T!jKIjQ3Tc,(JAHH,2!T#L3#N2X6MUS+A!X#+&rH$l*)X-pHV,AJ0X+c
HbV*k#l*kPRX#)k91!0ikA33(!Fr%d&J0b-ZGUhHA[mM$JD3!1Sh0Z*M,J%'+!B-
k4YKQpAVk[N[lp2AVJP1$aKY)#,2N&%Y'-,L$-PXTAMAU8c[B"E`De!HqIe3YGIm
DSQaff2VkVN+)r'eppkP'(*hCrHXTCJVieG+Vp9f*e1K@%JG-@II+e&GX)1p!bUB
%`N")J%D@&e8e%k%*a"6JNB%B5!RN-XF!j)@FI#SQ`D#cUM3Y9%p4BPcXKl&Re43
cIDDX@bFk1JkMidk)JB-haR8DR5CdLUcV3GDpUPI$TJP!VhGF8N@Q-)XlhSkVq!b
ccc"p'M9LImkq$p+a4@U%5iZI+K+M26KmC'UIlDJD$S&8$A@Uf$9,p5%baMl$)!C
%hKj-AB4`lCeeLDeh68f`T%jNRBa`p%bPH`+5TK8%Ma'4c$(bD!H8f'NJNBc-863
cHLVGde+MB0ZV0,fYGiQe'ikUR@bD)UECB5[+'MG*ccCKNR6SAKbkR)%V0!1R[FJ
qV3I*#HXCpLUKPppQj2jA-@'J2Pi%+bD'"!ALZ)3KJE$NB)b1be3%YM6HD"QhD%"
B&-`bBG#,IS[,!!Kch"8bLddiV[k$Zd62&22"IDPqf`SKNh[U-*f*J4B@e%&m'p*
)!FE94ZC+8f&8p$jU%1#B`E)16$KcM-V0V4MFSN%J'XLiIQ422d`9FbMMVT3bQKr
Xpa3%+C!!&V+JIeU6UXq@8!8J#XebaN&Q$FQ1)N#,J+V[k&1VSCJA-P)fNa-2r6-
LGl,)#d)N'caA,cQ'cp9dC"bIhiKAM!8reIi6P'Am4bR,q"qL!-ZILGIArUV@1[p
4A1PNA6G5erkVQ$kB"08lrR&(`KI486!#lk#$d%H*3IEM80I4F4L6,'%1*B,jk0b
c9aqPVRRPahBpQh8Y1VS@ah9p@1jDA+TV%9hR,0@a`MSHBph@1lUY(pGY61kfINR
G-L$IE%0()8+c@pNaQijR,,XZ'mj+0X"jLKd%9%S%r'%!",pBjlRD98L"1&$qik%
1XFkI*36#aRVG,HSP"N$)I49%(VK#f84#4301J+jZKT`Ld+'2deiL%J$B,jSjJUj
9&%"EMkS+%-99e`$)'QV4r1*iaSV99Qq+%c%ZDV4hL!'h"MS!&Vq!q59+jTG3r3j
F8,XT@0F!YDEXaGh(&"+@FMG-bU[#YV-XdqcSJfU-jD"FQpfVMQFXf!C(0bMAJAK
$'clAPkC*`EFFC'HjCmJCY0F3d6%@hN%Q#P*eY9%)'#CBm!i'CS@Z%c)JfLjZm9m
&`&e%!0aI&DUA3FI!Gc&XBbX"&$d(3R88"dFZ*KAd)5d[-"Z!S))--Y*4BjQc1)a
,S9*K!G8S,+!qm(%,U+Af"G45B3(e%J#YCI`#@LcSG6$!BcGMZ+f%B%&Fc9`jb%N
*CM*RNpZf0e6A%,N@E9#1Cbcm2'89Dh&B8$$&8k6+pYe1LQai(5QbM4#T`l$*281
G8291Ib'fBG!dq13h#D"H!*!!Q3IACD8*b)ar)3cV9bp+BTUEHMd'HjJ0EkmB!H,
3M)K#*&pRc1(q#ATe@K"(-B2)#Mm6!+`S%1eKj#1'"R3q$B+E'!"@6#IK,DeYAqY
X!eLc&8&ad(HG*#,'iRI3"aP`mE-B%Hq,hH@jr2c1+"Cr(iG8B+8I+%dd"8PYURe
F9be#!m,JfY["V1D'5%05L[MAJN(1RM"kE'T*Nk&kH0mJ[T5d&)VLkbJ@&(3"
[`Lr[qY9kG2)8XVN2aKNcG8YAjfiCj-MJ6l%-41DD$LJe'q8JR220#)"&00Cp0qe
D&"hN(#qVH0c3,JA)Q0JqC*PpC)K0@FNF0YLHNaC`)62Y1cC'9f!!8d&52MS5-La
@P!qf"m*bCrXD9L"Uc@#lX"@Gd3,P-!lh"ICI3#!I1SZPfR3ALRfRK@)IXj!!mf-
A`Y4$0`pc(%XkI[Va!`)0QF96C%!fVi!4Y"CETm-!fJqcC+[B6`Ne1Hjd**RN*#Y
MUTNDlR6mp$Hd53aZ5,D6bB+4rU)cM2"M#+a26DSM%bFkUf--Gc)RJeI`)BDDm5'
+qa$8el+YEmTEh`4,4'5P$J#N''8L!1bNP+d)&#jiRd`KP"d&F#5Ci-L8K-%ib8a
+2`eeI,pJ%)(2C3i!kbJT2r0GM,$%J)Q5+'V"i[3dAD-DQ6%BH)2CM8`Sb!S1P3(
C%i)6YE&*MeGeNi%kZ2GK'bFc+3XLiK+LZMSB!e)J4Zf')!d2@5K#K5)9'08*(V5
$",F`!@ES8Uja'$$EF,4`+DeYYATA%b)bB)a,b6V,a)&m$1LLLk@*fi1V%c+b4U$
P!Rk1imGS[#TRRf*jB$Id[Y9"0T9Q0K8,#`$l'FJq5LMhkU$a`VK,jY)LBpfib"D
pL+h1FG&4IIhUS1M403+6#DTa6"d86rYHiKU$H[!L-p`e5mh!R$GGA+0YX-*"Q)a
4bbj,SA0P501X#CNd834rIKEmEG&SV-%"[c9aCY5J#XBSA)hB,`0!Dk31$Ti-1C[
4LC-km6Z#d%fXNj9#*h@#5@X+1ISfZEqEe[PKmQac1lc9iB`18$D&9Bb!Ua-,,VD
Kq5LL*qMM8ibhH#Kq,I,elj0'ia#U-55&S`l"T!HN!`%N$R4+lZ[YdC@r6jj&9Y@
*4MC+jVB-YNZ*41D#8l"lZU$8-m!ZUIA$G"h'[Lch-)'V#b5N3,544aje*(Q4Y2N
#K!D49GU"1dr#f33,GXhL&$61*h8pbKQ+2&rd-!@pdZf&LQjfHhZ++2$%-#Z1Cca
*!HkUQ*83#C!!LdN5$eaSal)RJ$+XFLq5JY),T(kG0mdqH$VR,34-VkEkEkUQ&kr
frrPrm555aKbUDcfC!TpMbLS3h5L**G3kr*Mad`Jb(*!!K93DBiZq&98@iZaP-TT
`550m-J4[3&ELS`3U)JaTTbSNbI68hA"!Rch@6T8-k"!P96YE(165N8SQHhJcZk%
BF[9akCTiGrjG!Ip0Z",1R%cZp`GhAJj4K4$@hCF'%X3m#`$&q53"I-EDMed@$hj
`!KQb3cciA$UUBjc!P*Veb3qKR#(U"%rb6VhQ`f$Q,DLX(E+J3,P4l4!8q2"IMrp
@U16e-)hkHBH4'K%d&#R#p@Z!-`$)ar*J,ZfiP'CXGKf&3HFSTdBVITcikB#JSa-
ZpRrlmFPSK#%Fik)0!E2[H-CpQa['rZ28cTp*Nk3T)[#TaK4M`J6&GL`C4P8L)0E
F4`#(KkHBD4PH4rC1ee'90SqjV[l[EfUabSGZ4%j9Ze4lCrdJ1I`jBBD,85HiRX+
2Mc(l6jIlY,UJN!-AABLkAH#UMkl5P6X[rba6kdSV"4jDQe1df4B*4A'NVej6CNi
'H[9jUTmCQ[D$F$6@UJNAL(LHm&Uphi34T*AIe&b*%L%CBiD)j9cc9c#!418XEDJ
b16jqF%a'NYlR0Jm-p+M#3X)2I-##M@iY8#fGk0KX'de23hDi-(5)hi$+H50eL*p
&iJdX[jq@pUqL6rhENVN)b2XL(-lq1JqLLQ!ZfNmZBT4P"A14Ipi&#Y$#3)%f-SA
e"MPP!+6&,c"P99hMb'J@U)X(@9E,B9RY%LI6EbQbd(l+3Zq96"l,%!k+MP[1V)f
8BD'q(VbUm5CJ5Vb"kMLQL`XQp&M6+B[4$ijK)UU!0&-5@',36JLCr(Am(ZLp-#!
C1mAqp(hfl#-C6*!!TIT,+ET6AlpK&MHaj83Sbf1b3F8R0e)34TP+Je$+c#a)p!(
00q1cNAfQ@!$TS`$b0U%E-T8Ej1Z5d5A@2bB4Cdi`aE@@Lkp&GrKTC1EDJb%bCAG
3YS#3!%lCmEE"CqQ6-ND-8e@-JQ$94K*6N5Uhj)ib%,eIZ8#'Qp4cjf43eN'JM!Q
Y+5!MPdTfh+U*d&GG&@jcFfQD"1aPK'pB4[KJ9S+B'D*l`akJmZrD%DEjj`@%U@N
l3b4b!&bYq1Rp*MN#A%"hb+M@V2RR+9!"HPR0KJ(NLL&8%Q*P`SEVZSK9a8B*XG)
@6eSI-fNS%$k`B-)l-8NdTEQPN39-C!L0q!M9H5hXcdri%kckbPFYh2UTk0mFP-3
jR`9[F9N%e8AA$5IlIamhb)(L-!*&!cUZKp#TjBHVVR"EFB"%p&apf"%![Nr6Z0@
1+S)NeRmIL5q$131Kq)GJp$pb9@q1TU,Lf,%l44&9V9BpAaBZC#,h[AU0PaKp44a
VUY*+[+"A@G+J1(Eece@k56kK`L)#c98p23U#&!kBC6U*5U$mQ**4P1P244SmNMX
("CZhfX9N$S5"YR-Krm0&BK,$9fF%-lH,56,"GX$K)f",Y3PAb2dMP"6%mH1["%4
XEE0h6Z!l*!I2Ya!mmkNf*962&+aK%%YRlQqBdmG,GU1p$QS`[mB#BiS"4V++$i[
f4k%)fddY,3fe$4,5XJL"D-YNJ#Td-Sr!*-ca84c#4+fP4(QT0hqibUM"j5L*1U(
+E@C9-k%J,hNlM-j3)801,I*qAb*[-NHB5R6)J,NZ358Rjc50'3[mD[d[lk*J(BH
qjT&#FVFN*qHEk['-4pm"m5&BTq5XCLLdH`#NZq(qNE&pErK!Z,!d$F(#)+(1Z,a
H-0b-r'JL('U0,H0G(CS4)0!@Cp!!"e5J4K2&q#2N2,43M$p*M@&b*!*L0!bRScj
Xf)3!5&*6)%jTKf+kr8`,CCfN,4*3E&%!mQ+aPY36USV`PlNTDfND43M($J*q965
a$DM!m*Fe-GTJdYT`%efeS[Z5KPT8Di"6a)2Gj#i0%TM'+PM1Cp9G&A*jN3HbMMP
HNq[kGZNLR#!qK-+h'D"Q-aac-#bqD!41,1i%R*e'[fpaElK*UZ4FZ31UJM#2QDd
f!%L*j#Mb)9M1K0C(EUSMM0R(kZ"31PIXeKK'1BbR!e)'4e8@()CPYk@A0M9''FM
FKSAR-K!h&j1%!`LBPMR#IDG32A%Hkfc)0K$`'@$b*b"l*LLUSXd#3f[1VLPQjhc
Za8r3dTI6#k5IZTBh&J5c*Z+i5`epX6L*!VC0T3-A$rM5@GBD&8q&E5)C0`FC%#E
9S48L8#)4Rq25$De,5E&E[J66#&6B1"N9YaA6SH%$!IUf%EL8C2beSUZbSR)b5"E
')meK6S6+JZKXC#*8#Gc1UCSY%2aX'RC@a`KRi)Vl,a1*EYd%F$SJ%qN08NmeQY-
)@Q3b6HTrj#dL0G,B1Cj3+CSfX8Y"3fmUcKb!28m@eR&'SZIF@f!Nb!ie-qFQ(#b
U+%,Yh$SA9l1*3)N-$Eh%K+eRPd#@D`bp)P1f`UHQQ*Y`@$5"BcRdUZB(Jh3!G@T
"-*1Kp!aTmJC5,!"5f5FCdQdNq,IX%T@HN`FKpRHe(1bep,&$l,164pB,FJC!"PQ
hT!aJJ`"6cL$V2LF"*NASE+KVaG41rc`dCL#eLb&`EC8K-b0pdc8#6c"i2)M+AC4
Y!Udi$$GMfh4hm*-VEDK#"GI*eF3X'#U+!KhM,pT'f8A1Lid@aY*qPZhQ%[-DDR@
bh@BbRl"XYdRU"0QZ[+ip"(&-S*X4KE"``V(`@ELrcQ-NF31A5ijRV,eG)JNSda*
*fXMX68kB)-S,M*!!Nib3!(YB99Dk'U2MTi0F1hAFC4-l3"ZCLShq%5*mCKKHqcN
a@5,ZYEPfiPll0K(hYMT$9"HpJ1XJFqbjb4%Jce,IPS2N$TUfkpH%,2aecK!clN(
J(%@52h98I4[N"*'0#FBqRV1I*I#0L+bM#h`,G34PX`AZ-m(RV1VEdR%1Y8YGF1p
0pBS+GaabVmP0N4%M+eA(MFB6JMR&B4,bM%GF0MB153DKEN*jX1%SkkC3'Q,!3"G
JK-Q"SHKa'$,-bif5L"4S2&6Ml'PGPFYI@"fdp3D8'E0JpR`C64&,AC+(d`28qT)
Y!T5iQ8eP,V*Z23+mT)L&*Vd*Y2PYBTp*arQ[FdKbLp*9A$&F&lVYE8MQ[Xi302Q
6%'Jb'0J9@+LMKAEePG#)&SF#HcVYiJQ!KD#J*!feJm9(+)Zbbk1Kf2-Y-DZpd)@
2ZG3rkA9-d`Nb3(!qm``&&rHAdl%`31e3VZ`ZMHlC!P(S6Z[@GjU@CkPTN8&l%US
L22[*8Hjbc`+i,+mjbR[G`d"-CZZIRQ,8RRBcQlCFU)$@0$$T$R,f*&-Zd"&(BN2
0K1UC,c,bGL*"1X"*(A68-#M-,*0-"A"89@L+4TVSVl3(T61Jj"6MY3Ja`D6PeXR
-P%3)DfbMb(!N,Za1e3br%kXCRR,)-[c1)3L4KUG)b!l!53C[Y)eH![%FkN0Llr!
8&&050Ic1m3a0UGi2a6q*K%SN&*!!qiG$2,'B1T!!0aUNLKZN2+bF$$4N)GaE5D!
hhp&923%IqX'@*QbCLkSJ!)a8Z30CS)-08V3"-'!B9F22$Xr!DpC`aL&d0[`XASZ
(CqRYcT!!9*'241VpkEZFcVpkGlm6),kCA,8,JNb-S15rZh1aAShGE6IH%P2X3ej
f'1S*@+6C+0B-2jYr"UpCqE1iC-j'`V+cc($,f+-KBh#(`h#lNA9'L#39dd$+c3!
cS+T5P,pHEVb2aNET`d0QZid8k-!P$G@PpC%TjQY`UT-lSBUJSRd"fAA3+5II*1G
k54PL%CAb!J'G"3k2S&,[15b#VPU-,4UUa[f9J3[)$aNC*K,kd`I#BSkMF+,8l&b
R-iLB*RST6GH9NCcX3"Ul586$b@%0UL+F!e44IEk6P)63FC(!ZSeYD'@Z%fL)YLj
[f%S!AVSia@`GLF)eYX4+4RB3S`B1LNN#kpmrNV)5m$Yd+KrA*VAV1Qf5Bb)j+F*
PYK9Ej`N*%#+f`X"*Kb3PQ5k4dfkVpM%$$*qJ*Af&e%4J-(#mc&dL@Ykk%MVh*Lc
Me,cR&brZJPU!jZ5-lGQS"S'QTM'RL6Xa+)eGYC5)QP9)FJb2ZEYh8P5$"JZP'qK
`[+9Taj*X1k+3!,dG&paH3X1)B+%`Q-E!&2fe9%jXaH2l*JDT)XGM2`AU!FFD-HF
[2C*""f!S6caJf@1)@RV$15YkH,-%2('BSi'c0rN)2l$)lIAP3,'0TNLaE4aU)DF
f(&,Md1ZAQjqFQ4GNdDrpS6#B)%-0UL`d0MFA"e0jTDpBcTAfkUQS&-h1k@5i&A0
JF#'P[fX%3%Jf+HP@S28+JB9SU8NR4YE!A!,"q$A4%Y230"c$'mSddFI9)8+9M8R
f-8)Ib#"9`p-SBf8[T!QFaJ3)f8YC(*2ibM'*Vh3QmCA@*,kL5F6b5[Fj*P%[6m)
L6m*%k%"k'ZXiNZ,L9kDiP!R3KI+0B(-TUM"m04EIA'L2MUP)H%T+F)eD4k@NE`5
Yek9)Hj%AL(`!5hHcTD-lAp9eTQqS*BG8)$UQUpa`d3FMl)Vb@'Q-(e%Y,ZX%qfH
1eZGjVFp5VFrV@TqAY$l2kRbQAc5SmJ&SUSTGAfYi5J!Pj5#pZ##F-+p-[B4#VPk
#![X550r6(I6Z$AXQR-`,iPJhhpkM*0BHI@ENdB6B0[,DPYaBfchl#S2Vi$L%M5I
$d3P&f%J([rMfA"j9%PZqq-Rjl3P4ZHTm1$HXA$E4JF8ZEKd@6EK3"#HDBRBKl[i
3&q*+`LIUrl)Y)8DZ,&ZF@afj[2,*bRh"lIY%"GZ,XAd[ffjb$f1l58PmqYph,&U
G%$dhNaYckcbA@jmXfahF"N&dGc"XmLE#%IQ#aYf&#aSPmEXVbljFPa#M6DmpRTZ
+h[2+hZ$UNeT62-'GlZhBl&35"rDmAlIe8p&df,NSefc#d,pm1IKSNGM'*YSQ6l6
C[3AEQj9%VU&l"C[S-ME4PI*%[h"-G!qld1(q("FkP-6blKqUE+**0Y&@RBRZF8a
8G(ZaA935I`T1ANF6C5ch-*E[*CDcD8EPl6lhHQch+BPAHZrrNJk)-Ee0BMSFXZC
ZT8T$32hCK0'3!*NIFkr$aCL5F,XIb'G6AXDQ[**0Q5ke-IDh6F!(Ze,YhS3Ve8T
Lek@edfMDl!!8q3$fd!(!*$8A"b"0fq!Za`@$NRLSCf9iL3H`ah%!4pc6XIN)@$6
jrlaaQcaN0K8d(*-T3GAj%P)VZP%K#3H#TR`N3qk*k'")56clXlkA'4Z@-6B)4l)
)&h%SCXk1"Gf`Df2Z0EJfTL41IajrD`N(B`)$&'NlUPiY9K*c1Tql`BlNG6U5Hk8
M8GMK&E00@j5%Gr5cdG[NJ9lp"TY#bH@RD5$La3h$-P((kIK`BC155*fprLef!!2
X!1VC!45bJij2#)TYhZ*J!UDMc8V`[KPIc0SH"100M2&1QI&aaXSiX4*GEPF5UaX
drmBBrMSar&k*i4)*HqK`X'fGN[$h1JpZq&5-Xd('T5'#bI2A8[%F%8E!3-(NEYF
SLAA22jjJV"eJV+fATl5)"(AXk1GM%%9XHjH5H1bf*bBbPTSB5jf-TB@%e-N68qJ
+QpTk*IM@(hj"LSdfBq1-C1-bDbFULCrr9p[Ufq6#3f6@cTF'cS#,$VM!K@%P-IH
2Ilq(TXKB'jGCZdr+3MUXp5V"FpHG#jE!@T1F-58Q6&F5-aqj,r+IX2C$*6(rRVm
YS50PJc3j$[rR-PZ&SrTF5B51qEF58km-J%h%9)P0(JH6LYJ3bjAJ6q[kGfm,LT%
4%eK%$(e"!JIrMDhj#HRJhI0qi'+!XB-!ihdra55+aFKI"F-+fq*9%R[qcj`%1r3
Gl0"VCHEpNfMkF6!FCGY!NPArimpKbZ!8i*N9k`(A!FDiYV$TXf!i`VEK1*Br1@4
Lc(LDQ((j'dqq#(EX%6hr![Db6FJ`cdcEf%YN-0*"`lj2$M4q%JbhX5dJP&12rXq
CM&Nl',0U(4NPMS&lf$B`DXk26aQ*865NkMCVYkZE-8S*acm6"Jk5R[B[dr@-!8q
cJ1%E3X$JB"+1-2E2KppR`qkJBGmR!k-I#dcDV#3f2[rYHBaXGM#bU4@#J*m)N`G
TVER(F&*J89LaAR4GC-2q3ScrLc"XJ)*SiIFM,"-mc6,"0q6MPBBYX@#pNYLkTZX
($+J3Ncchl4YhX19+i['rr1T*P[9fX+aAD`p1(BH,$0Sqj8S*$C`G@hcFX8P-!R%
1[h"q*`2H6c05riDGe)-Rj8'"#A0I#[Fb0V83QaBi#$eB*$-"Kp*AjriP1lT@GR4
*'B!XA%[9A8(U364NCS"FATcpjUrC*&Db55acJ)q&%VRR8CAGKCp4PGhY5R$q'j0
q314qTCDaESF$I#a%ah[YV0Rj`&-rCmaV)HBYF!#1B,(-'"c@EdcVcpa'Jk)#R&S
Cf&JS$9F!'f%6PSqbaGG"A(,2h2qr`3X#@-N)B*NGE!6hf%RlC2'rE@#-V'@-h,%
%4L,$(FXpR2BG'BQ$bkjqI20i4JVJJM('`iDf43RqVGVRI"5!kmT+"Lk@fF'&JbN
JmH2aPFqc6&I,3-81'96SXJ8Clrk$Kr0BCQQKc,*!!KB+'li$%2chVBS2L+5D@M(
m1)Ef)TY!9'F#)+QkYEIrQ&M"'+E)$#YL*,"(*J#3!2QpHfrl,E'#(@P82Y)pIrR
YAmrNdGr2j2'e-lQTrrHD%PfeL)N(ZAiC'HUh*#B%$4j,(e4PleZ*+0HdA&hQ6E`
92-)PXkb-iYiq`QqLRSfNG!QZVdc9@(BQq-LZ*hHG@c#FrFG2M8NamQ3Kqr#++cB
9APef*'UGN!$bTqGGcaY1d#)q3c9rFRGad*H(!G6HAM3K@+f'$4emdbkIje,HF&$
HN!$i`qk6Cm+HmaLH@Gj`1EQQb,l"kR+jD%XkYX3Z#PeBG,V30rpKeXPApGHZ,V[
m0+iQ`L[Zfj9AAXdR"(f*UmYmRK`-+@`0Ijh*KB3rl#SkJqheE$Y+`485#""4NXp
$d`Kr[Gk4K%9Q&Th*13N&VpHKN!"TURMf1Ke9MKPJ**@@YdM''&@463[ii)@kVP1
b%[qDV#UK#T8BY%H`5P3ppJK8Sp,j6%bfIlbRLb[PLchMKb#ZY#YJ'UqidUkLdDH
Jb1(M0A[dHlSJ,kN*fJdHl4T5i[T!0+N9Kp@`jh,lTTN6pTJpMrcQj83-&AYZUZ%
SSNl@44rjkHl%&5j'YK3L!hC3"K4Ibbr@Ar-@Aea`eq'8`F6eem,4cEXQ"#mZH2I
`h[)1(Skk,PS[8X3AFX6PCR5'L(pL%E&)q,A2LUQ$pBM3l@$9Z!iQbK(5pIHPkfh
Q5&hd*bFYh3E&I[KZSaKjZ$!FZGa1)#Ie+48!%fjM(`Q)Yqf1MDD'@NPm2Tc0R&5
#iURmpIZ9e0DIV0mj,h@hMKRYBlD'rk+pe6dL&0()UQKQZ8GJ42(@A&(I2"GbPp4
FfIAL,qjKaN&'H%p81)&1`lRmHec&Dalhir8%pq!e(a@1XYc,H35[E+lJjHCY6H5
FRM5DBkMFEi4c$+V5r5Lr`r@k$U#)CdC4lAq6C14EVM6"+'"E%EJ$6TqVj1&!B+0
6V#1-EKS#4mb`b!a-*ZE8#`02a6j@,EBqP'bRiUK[353f'qD&J45()d1FLJf!Sme
K1)2i*C+#!(LH2!`c4&QS`%`*+NGaK2)Q0lPUmJpiS'0S1[GM1Eqme'@f"%ba@-3
!Sqpm@dhCUP!V&8V,0GK)cVIc$@14CE013$KYGL`8$aJJbT`IDQ(&ei+a*#KeKH!
)AM[V6LD-+VI9I"Q!beRZ3633-8RRqZZ"4REG*ea['02rqFil5B5%,JDS#dUB@B@
,*ea5"dDG$TT#'Th2ma"*CGLR$@2@#hVqI$KP*5GjFT0U'-Xj9jU$U96-A#l#JF4
GJ8e"`B%UeDjGVB!0,9eb(dDK,b98Y+cf3!ep%(LY%)CU6lacCqC1FY,$8R2'683
M(ZaEm'A!`LSV[0lhCB!FJb(JfDdcNICM0pRL0JamNID5k()4ZR61ZT1FSNf90&$
hSXcQMf&r)a(8c)R'1J!kX)pelplIDX'(&(84JePC#C+(i9VD6%X(1R51I4icpPC
01cVcTq`9FePF16*"4Pd0r"D)Q3b1Pf'`2TmpK`43fI0c,j-40IG1L"Cj+aD#J`k
*a$f#@AKrf))SjS,2%56bPG2jhh%jJMB@"'mm5ZbKEL3hPf`-*(Z1I5#jcp1V!B-
'EFdde%c,Y(TcJYG3U-5d,,LfSCRl"SE1FiZTH&FdpX&GC(4$&6D1`$AN"ZYN#Ml
HbS@J%81qNa9pHaP&,%"mcC`e&ZGH4Y9p(lN*X+"+4p3fma8L4jC*,T!!)&U0Np$
6lCjjaAFhK$eh8P(0!J1&E%141+CjC2V'%G@c)aTMepZdVcXZPmLLdi8cIbT&iS"
,'QUQ@9RNbfMf8b@$QEq9UXX,EVJkRrl!0MC-!b14H3j#'Z&ZZ4)p#3qfB%!VD%"
-(&[T[YHS)G*J35&9lq0`J8c1,+)LZQHfXf+Ylp4GK-44JZ%kHkiJ"QUY+EY,)JE
8MDJU4h'2QKKcaE*A!mN$Z*P+LEDBqNE)K3hIP3ApJp)9&(lF4%e8qaVT@j3p&dE
pV1bj&'8pSFk'UqjZkI$dDMU",JXPfEX*G-"Tb!4R8K5!M#`H[*3QEiHieTpLMMN
if)"'Y-(&L3Y60AC$G$EE1[+dKJL(#V+dNBM-#9I(+**HYRHL2La%SM-0%E)NP("
cUY,2VTFp'"D'+hAh[E2-f6)P68ZG68[$UGU-V")IYr8)#L'c6l@B"'U"LHq0-CZ
Z-MG-$8@Y4'C9haLK3QVU'$08L4Q)D(%`[eQ(q5D"U8BUfImpXj5[HDmXRIr1al'
8praR,,@6%KAhY'Qa0'Nq)M'PJG`1T1T!9+K3aT29,!KY$A@bcV!CP4*Rka8m*%#
A04V(Y&6GD@Qd#RE4+5"&e#iJ"3@mY+$3#[06NK[hJ0%RLr!JNUQB$0*d#K(AX"A
$QNaSK,h3h-kKX6(60N1h'(qq%iA5G*!!L,TK,2h1RCG*E$Yc8USpeBp-e1G,Ee)
2-N5V#Uc5,b-a*cRMNL[APU!aUQNjl5A69`ZU4NV1[A#8mShI8JHeahYb-QmG&VE
"M6mLZrNZqlJ,kh3[a$@4ZcP&5F2*j1l,KrVc'm9qN!$d48aKN!#DrM`dEhedKGI
QAcK%KF5lmdGC`KNNp&,6FaZD9QT'R'MfBr2IjkI6jPTh[S8Pq*!!F*kDbNidVe1
cl9Ndcf*cIIi0fVc#REqI*Fa!`JPUaZp(-j1Db5%dp@`3Pq9"0,%%+a*Z8V0f&jU
(U@PDK@BHflaAhP`i[Y#L'&0KSY1Y9C9h`-f[TR`,41KkJ0Kh*AF29e9"Xp(LUbV
IBLXqCNY&#D9`bbL&fhh)9K!le&G3M@e(2UV+heFJZXS+U0L8Q[+*eUS#%Z"p5"d
4D8F8fbLFdj8rrRab8GD-Dc8&c9LiJL*$9*!!d$kY)SGNj*L+VN2"*k4-1%@AU!N
lBCjCQCp)*DJ`mh!eKb%L$&&-IZ,E&b(f@qPEm3p"(p5,r,``9'8iIHD&NJr[jRP
%#8Er`lY465@UKB6,eBeN4FkmP'Kb3&+1Pbb1*"Df0C[P)[CZmXXmG5$R&I'!+cH
Ui!I9N!$$Tm)*8E8%hk3L8Y3FDX4&p6`e6+*D5Jf0U&kRKP08,e'M@85KZfKd`&e
I6%qB%J4bUMkNcUTA!K!F+H9GHpF%rAQ%H)3rUqEIhP[0,5Fc))5QLJqPZbc#T5l
a!&8YlIppmfElJ*I4B*P`$32Aq+UMrPKe9)%MGD(4E-Q6ZUf$XVhZT,qB2US0rIb
YNrM"-ULmZ*F+SLA&r,2A8!&b$eam9lhNL[TIkSdU-%JX&"B#'H3*i)#"j"2m1RZ
%a9QiL#+4I9KXe%c5KN-RZ,%JMjMF8)1V'Ab-`$hF$pc'kTUUJMak%!F5BfSpE8H
$($dQ(aSYb%ZRSLlFe#4$Yk0J(Jmp&-8)4H"q,p$eRDMqk!B`ISH@RjBH8QD89Fl
*K--aG8I&l6$"2DXmZ,UXFTkmM3Uk!2$j,6kB-j+(N8T014j4mZi&jM+QB82XYRF
NZ)&386lBGU+V+$f09IPEM'U*8VHYV,JI#FM6TPjD)$h0rU!#ZpY*%abJe21k8kC
LL)"d`3A9h5+a#-9rl,FAAa36#M!5U4!NlDZXB*mTUdGCF*eK+QD9-+N$(jcR"bN
i(18"[k9[kDX!q,YeXkI%8U$E+186KaA'BcI)26C1$iLJ3Xi+pY$Vbjfd4D[#hiM
DMf#`PcRE+dcT8jM5Pd+%8eCb@UKB+YP3BUB(FNKS2!,[qRmS8A&i2JX#YqRD4Ah
*MkdS+bMFQF+3!'+fQ[,+N!"'LVjDdj8!J43D69,%T5"p#SrcD2$!M@RX#A,Gf#+
jqH8D@pX$[@""-4i4FP0-KqM,$dAl"&HJ-*VC3cDbT5+d-MZT%RSMZ54+%I9`aeE
F@fT`fEfa58A!3fJh31U$VjDQf3qB-C!!51FmR(6L,$2d%d*K)-9!FTp#88EdD6a
L)-+2@kZq$)#-+UJa$Qe()-p28L![-CfZbBMV1X(CJ+SmTb5Aq`&@8E"P+C*YPCb
dMCfX5Q6c8KYDT!d-ZB&bqH"q9dh"bb#TXSSCK2UJQ&88*d*9[`PKb9i(8$N%8J@
3!-B2)BfPK-j',K%4hVqAULb'dUNS,Pe#X`A6di6#'&iI,AKC318#lkecDZEKK`9
HJAkU6SXX#a@C+V-eM0fiq6-4b4T$1bY8mbB,H0j6ep&R'G2`U#YXJ1ZYGB43aC)
H@JJ)E+H`&*c0r$MZ&#iQj@@F1@QX5QEQ4k19k`mGpHm[b-A,@2"-3p)9BNN2AH0
50AZTi5Q5'bIPK%`dlU*+d`e`LfM`8+ASD+GqP++3!*%l3mUKSjl$"Fm35F'"YKE
U&$+!kGP,DB`0*PC9%81UZ!0'MTV+,UT)icmK&&%6DQ3AUq%'[M44JCN9Hc'CSp3
9(0S8LF!D)M4j+R,[`5Z-@&#TPR@$!NFP"V'PPm5@U-5@qGN5@p6V%PY8#l&&28j
X)A*ML8p*$&!IN!!CNLFhLZ@%khM%&J0lb#crC@H1aimU),V-Z9R`$!e9Tr*Z8MK
!Z$jUXDe@$c3jSR1d5f5IH[lrKRf-EF3JlZpRB+"&(RTCa6Z%3K1$RX$$LU$1D5K
lhAp#!S@58bJ+JhN@"3[-3K@2BA+Q&0`S@C%+CLJSX`PT%!SSm814GNqhe46m&*-
jJXC[3QBiHpDa5KV63Q&E6H8I3q'i'Ie2$lAiXl,G%)KNj@q'+)CHdib+&'PRAZJ
)-QdMIXbBL*PPr$#D4f+N[Rq)Rmma(400jm%BZ8BrH)Y9IBU%1Z9L[9VC8#r)3md
4KPTc9'eeEmHVaEfCPU[Qhk@J`6-GKEc4Jl43V-C9U!EXJ9Vi#1"MFhSDX8&`h'3
,$++3!01DbM@K1TTd`2G*ErEQQVlXKj'e(fG!Da+3!)Xcq%3R!e-Sq$E@1pJr5kV
1%@T&9fdSA+"H)'"Fa11`j#)(EX+!e51lJ[F3J++L4(TbiD6-*F4JeAN*-3LN`qc
8``aHYh"N&jM**SD&RN%P4c-9ZXfUkTpbhk)21!eCQF0jMe#G(j-VaH4LqYJ8)p[
q*L[5E4!UCXd[IK5Uab#Jf$eS`8mK1A5[-fJMpKdLLJ6Z!2!2dm-q'"%Y$-8r3P(
BPHr$b&99q6j3pKjA6H8MHT-A$ZBS$&,D#%83@GVedERm&RX8+VQF3l4"8Th90dK
TXY+$@5*@Ve!i&iiXMSB&D0EE#0C%)!LS9!q&#aA5@kR+VX-Bd1jK'q*535!S%*%
91'*0[aE"!H8+!3pBF3DXG"VlPqk10VA(B&BiSIl`hpFGbl*a@bp6bBp+DLiMlXL
0@ilU[&B8DfP#bGEi!FXk#hU3!2RAdi1P!'b@!Gh8r,DX)"F"FkFBTkDa9GjQMb+
&TJ8SNe!4I"Xj8ir*4I2L@1SKU+1RIV6rBa41V1fXBN'55*3e)pG3*-1b9aNT$F!
%r#TF&,GCAV&[Jh%HKPT%E#1NJ"N(YSed6KjPSMXiPlSh&b!`24Ep2Kkp`T)hJjJ
f`b4TjLV-P(+N*8M4'mM&p*68#3V8NShqRXIBil1U+AU$Q6fB6aLBR`dXLFH-k*P
4F6-053pJB(HFAZi5"*+B0#NDpH-$qp3S+L-"K5#h9jKl-JA$#YKLjZhCQ96X*+T
6S#N&,K%E-QiQ)4i8c-X!QU[EBJ!G"$L@f`3JZ(ba,J"F2PFAM!,YL"2i@ciRi(M
8e[*l#63'8(eRqEhM0TYNa"Tj31I#4Mak5`CMbfF,Lp(`'YU)3GN$c%#6$#8PN!!
2"1*P!"1PSBdfJ@&k6+&eX2dLTShU2-rL36Qc82#H&N#RB1"hkjLkc+2T&c'TmF$
GKZ''&$CdK9@5R)DSM5%R0XpH#V`Hd(&`Tki25eeljMJ+8JQk+V1PLKGCf5H@"0M
qkE!-f(*Xf"SkMJX$Rh4RYa*JbqBbB'X8FCd!Qc5jl!'+U%R2&JQiCCq3!)"EYUr
Q3,B"@lJ%h($P6ASJfp`YmV#-))ar(N)32elj5A'QA2b'5))UC(X'M5C"`F0R6%Z
jHeaAZ9[q-FVGFSGbCrB`9fSff4rIS+N5UqEQ5)2bVaq(%#FPjHh(K8Y3m*`05EY
kpq1!T0k09kT5R"(EL0EQ@p3CKZX#%M+UMBMDHJPmX@*&4kN`2l[+CaC82[2"AT!
!ef@T5'8'5L#bF1Y"HP5%5ZCZC$I+FK3N``aDBGSM&m+cM`Vl"3#)#)Jh'FSGT!Q
#G3prFJ@J6iXm(l`PX8BY)-)e3`dL-N0ampYVXTEET'!m*3IM-ac"H1d,pQ#mGT)
8M#q4[%%#)B9RS@L,k4p2f%YR!PdbVjJX$a'&e3!Ck&lq6-f"jFm5D5,M2S1#DNH
RQ+Pk#"K1+1),3*R,#Xk%cK+5J!Gf2Ml%8@acP,QL$pf+IZZF`a%JIU`q[Bq#2VQ
UH)@pUQ*Q28"ce*iNGaD$1H3-N689h&8`0G5+i4c(F0+aB5S'F"bE"U"Ui'&C@LD
*6)PXaCV+H5K8,j119MT5Q0*Id$eXN!!A+LrjXl32r9qcG3ipaY"02RqlEL%mXR)
APdeJXS#@N!$0GP51&d4J+0UBLXXHmfaKMl2X6cY`$4rdL0A3%4,b8!C#&LkVZ1Q
c-Q&2cE4H5BK$)KBB&+4,(VTb+5f`AUIBRK+U$!jbRi5Ib8",lS!3DZHKU[)ejF2
Xj8A3'XrIKq$d(6*%ZUV+YQ2EH9GCf9aA@@@@EX!F'[K@m!%Ud[$iGqPe(LMdK"4
3!*e!2JT3Yqf+@ZF4)mphSJT&R!TPIrJNURVc(j9NENa9PAI9MG((&6,Flij&-SU
1q@-HQ%Dl'k,#`9"eLkMPh),+l[6GkE[CSdNclMPX'%$&ccRA8%9kSFJ)lmE8BKZ
3!!#'CMm5kY$$I4+94@S+HUcHVQ+MAi`fX%,LYXa16b0$+BN%'k3L8$,4SCNC6c-
L3i3#f)VS5&$X$CMcc8pleG1ISJ"$2*J&9G)J!iHiPB65mmJ`qk15UVJd"D1rcL0
e%Te,%kL10%3F8kJTli+Up2,8Np)P@U3U(T-[dS6cAjC-`QAVc9'GUGH8VkI(ddi
Y4S&4qf`RkH)acLF+c'"-Q(HYT[)mTY!LC6mqLl("apM3#6DFG,!"KC'*#JYJ-*c
(pZN`3T%LScGXaF6JBr[2,5KEVlY%'B$*SJrC%YCa#fLcZBdYJ'%r9Nd,j,r-&QL
6)U0qbK6-(B&R6j!!f19jAjUqCaUTr[`CC&'!KrZlU2)ZRiU-2%NR+#"c6GAhH[!
cJTmJIJU2Pmf,$lEMfL6QMM%HN!#IT5jXI9#FV#$H1lT(S3,IiA#d#!Ddc'G-k**
FJR+jeflZ`H0"bdTb2d,@UHc5U9krN!"8!%,!!("bXjMa%i8G!Z92a89NLUj#@K"
%,hd@8D(N&!%J@Z+V4,%LPI5)34DFCBNedp+K-*CNlUqTQTEZRUpY0*8Ud&,aCD%
@4p@rVDK@K#"p3D[H6DSXIhLF'ICf-Y8#T*9X1%0Zhl63-B9eAk,9I3P90UTB-b3
%VA(D6J%U$C)qk('20+fkFG1LiT!!TTid4URa5l#!R*mfr"a'Edfi%%9QA5#AJ+a
Q4bA+V5Mm#FD$a3%B*Yc'4NC5*PET(KPk8`@1d%2LkD@$C9,R*G3hkRJ-,#B`R,q
Jh)Y+aPAPAT!!fKSdKS%B(Q8SP)NCrXJ!2'`T+aqQJXVXMqq3!!VAecAAc@!(5*-
`AR,4kr`5Mb%T-BS+0j+,TCUlT1(Hlk9V3lJQ)e&0+)jj2KiA0Gq12%e,chUEC5F
RXP04)#TkM(%j5a@PZ1Y&E[S[e04%-6M9H"bfq1dqlJ-)mXXG4(q*&`SPfXjB0RI
*,%[AUKU(JM)b0PjJiLH(L&&(!"@&@e,i%0K5'F$,9(N8!F"9"!ZDbV-%f,"%q5$
-L84`'jr0d6'b5YAAl'"$,PJI$ihBH"L2MEjEYfSH&G(e(BI3Q,+P[j,qLQ%&G69
Bac8SC!F2m%EYE*%p"!(&k["UpJJ%UM+-3FP$JJ&3YbSH4-R0J4C'B%l'j(TC!)9
LKKlH$9C4&bdXi"f3!*L6SLTZT"5TG"A#eRhf+pN6+-KXBZT'3ar[P0dp"SLB`1J
Q+2#Q$3!iHNeA@F(Ep1"9f8b1#L-lklicN!#DqEm1h9h`0J+SCdV6fUZqh)QLUkM
cZ!4FQNQjSdI@-P!a1)!L"d[)3Fde@mV3"ER(VN*XNqXZ-4i9#2ED!#29@KPFa+r
em5%!JeNb`5jF-X&+K)VY9paEFH%Q%I#4A$ik##)@`!LTh'Zp'fBl8(XCC&A"8HD
D4bJFBdQ!4!F%$-!S8%pJB)[a@Lqr"F"9,fdVb0d`'e&$XS-E3iNi"c(@9jB5HP*
j#4r*bLBFaSf,#!S*44B1I1PY(`'9ARUM[6)ZNHQN0h801H4)"k'*3Z*)U+%['ee
!`j+5HeHG*qET[c*+KCPdLcCpGpI*56kTQMeB6++G9RehIa48DYNJ9550klY*bGF
&@+5F-E'q[A#[EJ%N0AL!8Xp&i'$LQbCpLm#T[iJH(bekj++6&9j%*95XaH$S`8G
5pZ-kI`!!-BP"4%05!`"B)Jp9$@C'%4!KiqjKrffrPUVdjZqk[VQHj['jVUYkUVC
k3I0%GP)h"Zc+!VeZ*V1cb*r(e[+3!)lVQlQ&%-)9lHHA(A$+M)K1McJA$K0VN[%
mkf3HYa"Hcm*kK("k!b1%j9Q(dB#"*YfNQhdc(Z[[hprrph8G),ql*1mP,cm!&AG
H*2-J-L)5)I%!%5)'AfQ8b9J-2l+[@3!T*JH`53LLfHa"i#5ck(`cjm!X45b9i([
crVa[`JMq[V-JiceF[Df@)BpSp%MVd%H'hQjSN41h`i@+@1ah[f$&Jf#ZABdf2fF
%qp[p&YrALk3442JD9JbN6MH3!%9K)&iB51%-!ZN#AhU#5C`[TlBL)#cYEj'P1#)
j*JkANAHXccRHk"r`$`"XIpJIampPG@Yc(-UL-KU8&YmB6,5bq+m"RiAj3#`C!5Z
i(#CF1TQ%#CX`hId`'d69H*NhHiVrfKEKBKPDTG5!$%j2(2945hb-LiqS4[c4Mm`
iN!"'LkreU%YCp%[*V3#)km6P%)M+Le)eMG$[1h2+mH8@4hH+BFrJl%9eeaAaJ2E
lcScb3+IqJ$CGFY4PHX4PI*b-U2+N#YSR,E*R3iH[@Cd`0&Z,E%B`h3`31863F4e
#V$TIaTKre1E`'mPLE@T*4[d2HjV9@LVqU'hTVQe!MP['E6$F+L28h`@!)-c,%-6
jD(Q)"2+3!,&aX0X,U$%MS%B@+bV3hi'PpQ`2Ja($Rl,"IfMaP"K"P8$+P(9`DHP
L4L%*["4KR"dKR09j[V"mDrGNN!"6&`Lr2m[Gh@pj`QNXKa*XGHE9(L2CeJl3H,R
bb%APN5L@"[EH(`hfGaNKK`@`lVRE)AARSaqT@N&lr[jN8PRJ&`[1lM+5!YBR!ke
K!q8`XT!!NaV-d'jVEfchA@'643*4+iVXqU)ldQ"Cm"NjDEDGS',+5A[EL8*q1-I
"4$Bb+6&0*DC*-CeFlJ+3!$!C`+8jl,!bD$)'Jrhcqk6UEKRj#S*%&c-b[1,dG#K
e1KEc*3dUE%#,*j!!bZS"3rU`XA%hUkBDEdjDGjiS,(QAll3B5`5X-EbPlE3!1UQ
l+#pVJ*5XI2(2@Y68dNZa1Rr@*8&qZTGe,p5kYDCZ&KC50jShML)+'k+EHE'*P21
D$-1!!SjZAQKQ*FT"-F(p,,jdd,$dk1*#VM+p`%3"m3BaYG+dEKZXReALC!46-c'
G%00*U4I@ZKH9`UV+SCJqbqU6bA!A#9immV!LH#Q[8b(j@%!qqfKSpaHcFDKl16c
2aI#k4Ge'PBMke0%3Ec#,T!Fpm+Pi`'hqIJd5)55`EI1mPDCcfbhBG#Z,&iEAEH4
cTXI,Pb&Jr1CF6SB&+$LP5GPfJMIQRrH*`Ra)p@Gbd[!NM94E"iYE$3QiN!!,IK)
Ald-PZEJR6A4T9TeKRL+9"-%p!m-"Q!4SCI-"90#ECU*9J#@2,[5lA+8-LRc[L85
"9rf*LKQGSI)+&l05U2aK6"5U4kr+a85PhD2,El6!k('jU@ZZJ03'#m%EQ)UJ'$B
T3Uj%p9Ya"+TIb+YBA-MrdUS[6kXiT6@qXP1TqQ)k4+dR"KMQHB89"BS#SQ6SZ6C
$fjfjdqIRT#P8lmkj`2K(ZpXTq'&Qk&i'#3FPm+NbPT!!!Y+iZrJl2*SIL6Ca!"D
qlY@BHA)ZcF@h"EQir1FmpNZ4palfC#j&m90a+BJIPhVY+JVQQBf6)9)V%&IXDpL
d2529hQ0I9Cp@AUdmpPAP#Z@9FHbVVlU99b(DfU111kN1hU)[h)"!kPpNc'YS3p8
`+5q'`ZaFf-)JXMPC1QjVl*JZ,@LllaY6!,TX@cX,ph,[aUV'hSe9qVY3r9YTbZB
$#!fQr-Vm)N3i[*'&bmUF!1-FJFF$V&Bp)fV494DD0KNJXX6L6+'UGhRE"DQqGV$
Akej4AZF2p[UVQj6AhQ0H!i,G[+#m$"'lm5Jc&ZQ90d@Lce&`&8DPfG8Ll622JS!
SKj-3bTPF$V)MR+3M`QH!l3!6%i4qi10$Q'5C98lCPKLNpi4P1l3DAQ)#HQm%p46
HS,X%TE0F"CIa,MV!IF"8k"M'90riC(M5$R,pVQ`peI$eam8'%Xi5+d!i6CLdACJ
H&QY&8A6R(%afQ6'2EV3LqklNm0q'5S5j-JLK!9p*Ud*)c)cdG`!BM(+(-L`U%LS
dEFH2qHYl8"(D@dM26reYf+S%IhC+A0G`NXejGT!!m#jYMUlR`(jTFq4$6+VqF!"
*,CK$j-`I$[MXG+b9MQdefYd5,hcSC$8!9'Z0mlhM#,$Y#c+5&5T1T*P%*l1Diad
L4F%*)-IiE`rF&UEfAh')9l`U$X#F5SXe-M!fVC9NCZ0NFRGKI$leV'#'MLLTKjH
CXDlm[rG4E+`SZRZp#%%-mmIiR'U4R+ZXA!M0[45V9XIa`H32Yd0cPE&ekU*H&,-
&VB804KaHR0aE(mT[Ph-f-+M9dA``&XUAieE9L5jBQ5D'elQ),FEb*JihZ+!Y4'b
*9BUdb[r&ri[m$rk,([0I82P2`hm"r+FIP,8JK@3*lM-XQq&mp6$q%,43Sl!L#4B
8"Ufa)Ir$)F@3!'[qiG""$AN(ThECN!$r#iY14Qi-YbT*ZVS8$YmZTbYimX2B`VC
r1)3(,JlMQ,P)UPh+FMPYm14[B`[@N!!P&X[)iZ6cp@hY)5a`FPHSkjeLSj%@3&c
DaBMUiYZ`T0ZS1T-5CX+h3E!R!-f9@ddYT&SdUG`'9'ZUjDpKDE'k"HeL5%eHM(+
D),BZ9PF4!!X6SS$f[M%JZU(FcQEhL)fG4ca1kP`VUA1jU(2jU(0GTXiPj3@3!,Y
'-2EraYZ%E[YrrHH0ma4qep93D[6rpdXPhFc+)fqD&M`U(NPd&kpij"&1[Ep`Yb&
f#@8YEAYUUbV*&@4b13`M'Ad$2CB6Uf(Zl%6BZ&JQU%"-+TbifLcI3$`Qe3QH4&M
aBa+9KFqN"6bFK$AY,I*MGZ#)hJY*KL#X)"ZFS15EBAka&*%iPJp2dZ&40HU)LeH
d*&,mmGle[U5GJ*NiARY*JC[RN!!qY3kQI)P-K"(-T5kPI[C`f9pqEiQ6ZP5"BlE
qKFZaQ)bU5$aq)Bp*b"hKbGbl-VU)!Y``i2%UkAL!$pp&@)YN2PibNl2P(+HS[jZ
A)E"lTSr$[XSMQ2+Y)##dRIHCc6JM%9!'BqmcfFYb1ZJ2Ec&S[!+&BMIL"(XXJ`X
RL%r-9VM*VK5H&#IPf+d6(`rJm$riC,3D$Lar!$NcQ,b"T0P"S**mR#UMHd(UGN`
'Rlm2B-CQh(Y'B4(qLBRia*L%DqG'J2m2ah%%&`8JcchEL-QGLS5PI5cf#"GSflQ
L##Ra-Jk`F13Im1IpV$f94hM&$#djVE!cc,EJcfCB)!l,9IP-5!QY8m1Kk0+L%06
b[H[*BA!p&IJS&IJe-KiiqP%(Nh)[G6FCDDA1"`!#3)-lDbrqSmBPN!"(ApEHQbq
ZYLf"S,I0i'#'!#p'ArdF-DMhMA[I46JqE'G`$N"Hf*M""ff4JB`F$TQJ3laCZb0
I(,%Fl*!!UL'(9!dp4*ES'j%[TQqN1$,NN!#k)BI8(A2)'RdMmNEk4SUM3`kT(A*
)lC!!3p4Kqb"TaBXmA+md2S4&iTPCY(#bHIID(IF"BfE)-1(fmKj#%AF82e(9J1&
T-"$V801TI%ih(4DC6BKXBZpkMh9QU5#hY'qpllchp&+XHYL1RmVqr+)P0FB'M*!
!qMfB6JQF5'r#0-VCh40rpZ(2DX##qcMpa8aNE"rBYd-F*J&XQB1kfJHMfJj6hSH
El6rQ*"RF+a(ZeS0p@)D`HE@"lKTEXI[0hR00$!IDe'6U&LX`Ark-"0bh3Xfa!ZR
P8'82-fYpib"AC8c#HUHiXrHGafHl1dAZS#ABc)S01(TD9ZjAYRi0`Cp4R,HGmlf
'LkpSj0HpHRIJ`q(+&p8l"(8$-'!V8Gak0e$JKQKU31N-bH(J[L88R8DG!-(e9jZ
j%k#)@kp5`R4c`mL$`3k(VQp*Ki&%+TkV!-$Vj'9CQ1SlljabqG9HA1leb9!Kp2a
p-[AVJpejBS+lFdB#0,J*TI$I#Bj$"d!4I[Dl)+f!EHeiFG+A*!$Vj&ZRNDBpM34
4Pc(If,A`$Ak*MMD'45G3"%fimD+`6MMD-dJ1!`MEaVFA)kpqk3k1c!jRjDZEKSI
cXR%*'3Q#hPhqPA''q9hRXr2E,(2G-2-p!"Y1&+CFjh&cB,&#aNB"QkM0KF$cphP
MFpQXh$!`Ubd'a`#401#b#a2k5lml+heEM4!+[&jF%[4eJ0fE-KYhE`+K,Q?"
q1B2'r!"ZAKcGU&B8!PFLKlmN%K*)dX%pX4#J$hAm!BSjc1!(,R-$1j!!R'#JBV+
BXVqlS@["TK4`$AFr1%6a"@VSNCEBLe)kZTCKUp-bPKd8@I9f(BjPCIfpI(9CNAc
VARA*D(!XH&R1M&9A%ANeLi-f'(&e,Il8F)"PR(qN4,*#(r#1(cNX6CLSL`3%FF1
JbjN-p1QQV4Ya'Gqif-a,S0i(),STcbb)Lq'"`FI+PekUVR5EaJrrH"rFP@&b(13
Jr%ZLmlP%%"FV"bM!X'TV6RS+[)"Gd9erkMDpfhQC%3*"i-9@i5CCP4Tj!&1FBZ%
`HGMD*&+IU2ECkMf6J@IN*)'Sbkqc%3)V'D[HbkD0DTD,80*`!6#`fXHUbjLB6%A
b'J!KE8XR1[q!iX`frVfcXI1a2&MlFEK3`UJpGS+C)Mi1#92ZZ2%FE`i*`A%PN!!
@BBf$#-J)%3iIN4%h%Bq,4$UZ&'mNJR)$iHFj6h(aarJT+Nl5aklLjIa4GA149eH
"&IbTP09ekZ1*$e(k-*,iS0'(UF5(-(fS5(b)d)IF@%$0`+4EUNY8BbcJMV,)e@C
-)c40jCJ"qjeBKQVlUmXFh5D-a&H%&'pC`3%LrlJ4f0)*Sh2pqVk8LM,G`B9I-0e
j-Q8,KE[c(hC-"TRTDqZBP'KD!"AFGK)JDIa8`e1cV'CcdYGXa$Qpl@6QF-H2fC9
Qqj%hS%Dl5)dfAjBkX`(hQM"[a#2AED)059N,8E5bF[3NDGYrJkjF,N*d)93)Zib
&25AcQY[k3Q*0%pX!L@fFa$D9aNlhNYMk5'ah5@c&*$3(#HdZ#8dPNI@UMS5`6LA
%0*!!%0$+K'Lb#D%8)"5[)T5HK&$-K&"#3LK1kQD2fZ$!RLN%qYXhh)*MAlHReD!
LmQlFmTI(AiVe([ph8cDpFD3Ha6$[Y2LlI"1T@q`-1bf1q4YmNR+YXG&Ki@k2"MV
D&5QkXPV+d$NTl`[FL35%"YA!l',BdE(LeZdA+G#*9*IFRP!J&d!8AkPa2F!49S"
q'K-jiG)0KabiVE(+HEk6!@KXFDbkj[3jfcP,5h@Yda+ea'TM-Gc815dJ0hQGh2#
@9#ZTM2M"Z[p3B*TFL-NKM*8D"3Gf1-(AX41mGcZc5iVL#k1lXA$(5,KK%ZZ-HKQ
1mNJYN!$$1MNYF)9H1T@jUN"`)mCj"RF5$k3%)b)l&FLZiUJ(!'(*Qq+eFSMeB"G
jHEpq%8rm1rK-4@IrpGPB&DS2BJK3PB[BcS$@baEA!`+!"%$i@i)$de)V*T&MlR*
qT#3m`ppNFD4F1[`+CS#%"BKTFPjX',!9Il3D[DHD#PI9D0&$",-0!QBF4+'T%CU
BP"*dCYSB([Z5j,LfP)+1Lr5k5!q@BL-+E'Y!'D[Tm"4qaQ5Qf!)@TQJ5kH'0Dh(
TEDFD2MrLHJ!&),9G8#PhZ5[6MpAM'JZUFi@0@qlV$(2"42Sa1iX%%LGd!3B210X
[4MlTCKF8ZFe`q6140EjSr`A(,64)FUjURrkC#2b4B--(02Gj#1$B)TbV(Tjj@ec
mX6kB*LpQ06##TK(Aj#SMkCR!!a$JBbYGl++r-2-f90i)c,SB(`[dm6BH'Bfdi%-
cICK&mBab3Xh(TT(KjG8flJkaN6[lj828S1HK[JImdZ$$-V,d9-1VCrRbX4%fGGk
mC`c(CQ62UBC&QhMP[5ClM(r#!dJei5Ijkl-b*j[aNj8)r[Mi(r"0mJIm!JqKJqQ
IlG+(Rl!mkiI4qbB5'dbiq-HqG@GrC!h)0M[kMEL64,CAdmd%hHc,m%hcpm8$FIT
iS-!hTBr3ak85Z3SIfqL"BRU!eIm)NIhY2#8fYj`Hm0%$Hm6#5)YJ%I$#+eKHZLR
36Bhbd)H+Xp')qkCS*%8hCqN'F(md6')Y&8a,BrZ#RBc0&"""(``%+@8R&YRmTQF
!$-9UCS0422Z-H('ql4`6)!2!HHa!f`AFf%mel0qZ%#-Cf@IB'Biel#!6lfHB+,h
ri`YJLlp&iPh1aq&2'ikmaSk'#"I@BR%2,AE$p*IK`YYaB@GK2YV1i!)$4`!(l$b
*5Np+!"-#D-$$jC3-fN0(PjeU1&c+B#pkF4HTMQ+Z1KT2H&PThCjPq"G&aSj,q`a
APTf$DV)@%1*VF%$DiBiV+P*8[C8E94PfG*S9F)*i[kRM5"-(%%V&MVTdbCSKPai
J`d'DhV2b5Z5UaJX-8eT!Z53+,E&3Z%"[,X,LjTcmhN"X'4h`@jq''a8T"i!-X@@
HAQ96%k33l!"a9KaTiL4NE,@6Ua6rF409+RiP8P*rZ"jEj3IM2)RY`50ebL09iL2
%,5DQSKT-A%UZfbmZMLN['['2SQZPN!!F'1@ZpI6D%HTD5PG23DJ,h$fI[Mlb!$H
h"l[kdeISdkcSk%rI"([jV&!E6lmfmS!*+LUPHX*%6RqV0LZX#PA1hq36C(BR+E3
N+5+B+lBIBL@8jTb9&FeVaRFhNjXr%Pd64FDbpYPK*TQ0AEl4dIKcA3hYdp%ElBA
!P[XF6N%"a%(-!XphFT!!ped8K1adI#""$V4VDBdC6-90HS)EV('b!Da6KGYSX-c
1CHDhGaFC+h$Xkqe-l#Q)b-K1GPVh@8@c-f+5f'8&+@Tbp,#)KQMKY!C(TP&%b9p
Rq`rZd3E#D5pT!e$&UErrNY3HHF1B,c)DFFQrI`1(K!I6QeCVCY""*%i*S)PR0#5
Z&2BK0X`-1aV@XHUDpCrd$D2E99(#jA'3!#q6(CPqHSBI+NKIB@Eq4fL-)#2i!6#
'Rh8bU(+k8H-Z,MR9Q5a)Il[21MPrl+@U16%k`563DMh'35"F-FC*INkc1RZ4F,)
Ar1l@4faRN!!FkVG`JRidZ2H[U1#H3R(AJJ(Y,!4fhfFJ)KY[2,eJjk4PiqRT&$e
8LiHH8QF4!JB2IiN+hf`mIE[8f(LiRSZFEaG-)k!F,CqlYIH[3!S((mr`BE2XKP5
M,+&2da0J(QqKU8-0,G(i-K$D8ciCZi4*V@I@#1c@KFTJA9h8`Ufr2-QS!MLVGl-
K6T*l!l[6'V#mER(f`U@cMN`#*PF`Q54(ffQab3&me-)(80-DqeZ!*(pA(UZLiUT
$K91aVa[F%%5Nmk[5'$H#mA2Xb!mf$q*hSUJc4B"c-M!fQ8A('C-j5UIAX)X2Xi8
X,"#!5MLF0EXMKr*hIc)3'1mHr`Q+R-Qpk8#54VKZN6YCTGiXL#$!9V$*%rpa'9"
kE8&dff4"6`+IS%YqMBf,@664X%2QG(EY9-2Zkj3fPck9Q9``hch'2(GXVpPi$Xj
#6(jD3AB!5IGIi)SH18RE"l50,Tp6$F2HDfRX@'!#PHYYN6N%lE@p*eAGQ5VTH)0
"$S6X+hNV[S*U*SidRqrNBj8,T`B[2&Y1$*[Z,,#(cA8-KBQ#c&e'3H,"M#%+Ne2
cYe#8HqLcdf#(*K3R06KQGMQm9+,CQFa#j6HcbNph$3)SkG@,PjS$P&NP!ppEP'3
l'ZrFB`H3!"XAU*%@3Ad`-QbF%fU&I(CH3,"`GJUaiKT&JhLINjbBl#53!&d)@AC
GM#V+Y*!!dmA5%+GQ)#Dlcaee,+U3!#R%UAVEZ*Q`dSKL$jU6XR+mcfiiTaUfl&6
)qZ2FBBjF3%%JNC!!bDY1+KkcVE[aeQfKaRqKM[2((cDTfZ)2Ip1069BTKGj+K@B
Q"*j+#+FGiXC,4j0iT,&&TUCPpBiK!8UGSNB+-rF@Q4NHcEE2"$%C-pZrKc!C+'0
B6b1`!jI(JFSfFd+%!E*Ki6JED@[RS&Af&2)Q3rK41,k*e1V[N!$%Vr,MSdGmH"3
I5["3%)+Ubml6"5ek#S5F5NY*CCMXV19[T`EUF$*MpkU+6hh0LfKQ,lh'IAq[jj)
LZ-G9"cZ$R80A4A'RcXK5UEUFjh[2Vrc8M1-bhaEQ`-E`b5dfJ3d@Af'a@cRSMLF
R$[+Nc&%CSBTE91X-B&NeVL5!lX0)d)!ElSIerPjI!8CS%YYKGdFA,A3305!6R9C
a8iN1F8kU9ibI'c*QS%bbPb@CeJSbq*a"kJ0N[a9N[pAJjQG`T5mfMr`&M,lHb)2
KC'"VNjUN!,)HIcBTEN0@+*!!4Qbp"e9p$e[V)3F#cCh&&P4mr%F8bMB82VZU1A(
`qkc!U(XTcIP*FI8)a3A'e3Ib-k-EV$,`3$Nj,Bc&0Z&2[Cld"r[aMfM#dXJK)EU
HrDUT1-+1jZ!b!G#L*[BH`-[YF&(G%bZ(JqkZ@"QlkFC+m2,P@!hBSD6#L-P)P@&
h@"T[c3lJq*IaCcrql1)K$hl*T8Z'A(U4,id+ELI5mR)cZT0e,2EH"Xdhi3r#M!j
X`'G-9XrFm@XHk`E0Bam111k)TJYJ6jGpGaQFP54-UFBcc$q0@1l*!1#1a'VBM3V
Sa&Y3%$`CfiDP`SQ@PJ,f"1K@YRHF'pZUc05@p`,dc*S(Ia!ZiQ8`TZed-DpbXCF
peS0YD%B!TmXi91'QSh`*L#pAL1Y0d1)Xi-A"`$hfrZ4b8N,Pa!3$U2cp@6edN!$
-AYG"c5`A5NSG)2-cdE#K6$6)K)T`*K51bUre#i%C0JHV0QIlM@ML9qEEM`fe3Je
CLF`B#49N3!8C3JA&UN"31)bU421H'XI*JRh$V@QjlX-KLQLplP*P2#&E-qbm`Q(
1HL,9DkLlE#S5hD@GP'2lm,[#U4!2e!Y'#FAd[M'PG*F9"qN1bkJlb1!hS&5b5TG
S9'A`3fTddh*C%JZdQS&h0Lr6[#+Y8R%C39#LUcd8Ble3HE%9KA`FkNe*J2D)KU`
%ha3)QKXP81i9YBq1rJ3#ADhHR3P#YAk#2kY9[kiQJkF8PGq&VJ"50PfUZkB%Yah
cLNemY6K36DM9),2mRhLS5cLk)*U@hl0"Y[cPf9L,F$[NJP*8ldr`m'U`AUdcad(
%@R3LKK!B$"35&pF01,#$kFhMp5q8jJ$li$KR2Q*$qPC$Ji9p'`B@@Z%3&'SFQ,D
2!VC")i(D3bfapC`BD,!-0YD2(I*,RqE[prd-E$,FFPCbF88DmTk3!$[DN!$h[FC
*(KKIN!"58`IS)eLVf)(R1A&l!'D3!1+YF0T+I$l53U#!,@Z5fNB+m8`d+iM1%Nb
mcAm0a%E+I@FdCVXifA`PL&4cQ"ZrFe06r8JR3kVlb-%594)ZPPXXMpSBkJA6PmH
Ld(q-a0Tmi9GDiCCK8jP0A3BRJ*qJ8MZj`5(FpFV9EFkThUQ9V84UITj'DN65JiP
0q*8!(E"0)5FR-Jc4Yd%0Y-&G[e4G4GX2B2YahKbD$l@FLD,6-`aKmarh&ELTJ-H
16j[idjNS-E'rMDe48c4p#&-C55PUB@0#+FcSS$I83#-8CjE8JSh8JZe8`qrk&(I
@0A"XKi)N82Z#k"LF6T4CpE5L(MDQ+3Gad9r`4HAVT#!f#[A!3S&bX((),l0J)V0
Cbfq1S`+l&!9Kk'EFEhNK45%c[q1$5U!Z2P"(+@NKZ[8HkXa$'Emb$-YKe3%D2TS
kKkcNP1LDS8hRV9C5(5DTMT3#pRd@B*q2`,l2LG$jTfk'-%'1'MLGk4QJm(L!i,j
A-N(9@G!8Z)mhV!0q6S@TY),pDhGd-,L(d(A(`F'pL)qGC)XLYRC21%NJYE32JR-
m9!a[j'--!-6!(j*E6i"GGKR#hG&+DX92m2j&NGbAQeK9AAeAIUUij+88`0[1K"+
$A$J*%J+Vc`B`L56R[fHB8'Di+8$,Rf9KA9jC@23RAmB-lVpT@$L'KDrmf4CqT9C
CU,LE%JbG"Q"N$JjJD!,!X&V6!3a!B8T6,aTmC*6854XA)B4YC`I0mCGN1,B(K1&
baXm$Deb@($*RJ[dGkKJ#hZ1h*c+"rSj4lENZ4cH#eaiN3qmVLG&Sir(CjPc!dF@
[prk9rQTCar3R4Z"`*lYVCqFEMbr)i(AZk)h(TfA38Q#&L83!'NK-X-+%QT!!`CZ
X6QR`T903m1@+SX*3-@UFP(fj1ZCr!X1)C9J0dk'ebT%PbS&ebS&e1(#(HJJ+Uab
9LZY(-AY%&b&9'AeGG&hG[Abh"DTe1eK!#k920+Jq-!acr&"`Mf@PM0j"QpeJG!#
Ya`*+Nb%F+S)HCD0*Ilp(4YIb"V%PDP#QE+N+@pV,lU10!`[2BC)%fGKjc-B8&4j
9##l8FRMSeL+lD'Y"fTU0'K1"!5EK9B+df#"DXqek)Ap4jS*lhaNL[P"r4diVlhC
dlAd(iJXG[Tq!+L!q6URcklh[k+mD),j#k)V'N!!'J533B133`533B-6@jcIL0m0
JRhGJ@kl"4aN@8kUd3bRHZ+M%9!9j$+C3&9l85P@*8P9@$bhNLQ$dY)cjlrMBX*2
S!hCeM#XlKqTYZ)10c'!MmFBlf-LL%)8JRf*3%bb`qQqaf`m[H[4rAj3CIpq8DNd
caY-,B6+Fdl0K4lF4EqaHf-XrF!`SB5$ZCT,6,`bAUjIi3k*#SA4c'9)Ki9JB3A9
@*VCkR*[XdPC4C2)G84aLUrTLhV$E,U"jaDAZ8I9a1%QdZ3-E,'!30*J00q$GM[4
DR&0PDJ82%*D0-aJhCd(B%rd4(-S`#@)5a#5!LBC*'*-!*KrrL&h)d*!!!T10$"4
LU"CaUI+K)4SjV&Z9&&8+c38d-$9DcMif[qb@C`+U'@jBaLS-rA6,jec46Cm!l4Q
EH$!SAlc!J"m-&YY1ZQ-E,)0$0eR6i#3d(QLBD'$!b-KRA'lcqlBVF!d`'HbU![0
B-2,V[m2-XY1&",8r9UR$(h#[Zbb5$!@rZXL1SR)(3C%-3*jfmE"HV8V5Q0b$Aqh
N36EFHilBM$!HVRHR(V'"0)&mEH9(l[%!IDN1L#!`[3+1S-ek`V"k-arQXl-+K'N
JK%1+'J!VKVXU6lqG(SFBUJU1ikr+#f$XAR&(jKLXVr@1&k9qrT%lL`(j%)jiarZ
3!"$P'cJ,iV84&#q-lTQmi8#bpJ)ha-#3!&miE2fSN8TVA&((KE950-5DZ#+0&"F
SK[blJiBeDdmer0%Z"ZrQ!M`Xe1&cU,+,fB5GRB8PX2G*hq03NdRIedKT9MQI!-%
(P'l%"b`rYMJXB01U6)Cf'*5TI)E6M4$dj$`'SAY2Z2pN!q1f`aEDUSY$m,E13[j
C2#a6#2p`h(Sr```HFI-G*$`R(,LJ`CqJd*!!YY!'Ub+D!V"6jK-VXI%aCjk(i-,
a$[eShUa(kmF2EGY19CJ!Dj-5X'pbFpq$Y#D,P6TdM5iF"d2%$$DlQ5"9J%"BSN)
!NUYA#5$Cem1%PPk08@@EmA+YH-R3A$LY)H6J)&F-+U8IMa[Vc6JUQ)&l5L8AYf&
Q,'V2*&qd96NDbH,UFH@b&jA,kLq4f+M1+5pIQk6Y*&kL)8+eUEbF3DH#),lAPlQ
D!$SV,VQ,hGc90V,lPiR(@LRY(')"SEY!Y"JFX%jU2q#NG*J!ai5VUNJ3TeFQ885
q[JGTKG,Apb#4)MjS%G0#VZ4BBL&AbdMFFNAL[2h@'i@VbVBaM0V'3ki(J`@0Y"5
$aQ%d#@@'-+8f%qcMQXNrRCI@'B!i(1a#"*pKpUA[JGii`P`dK-RaBX&-QQ!QHf%
HMl-kmE1DC+@f5RQedZhm1fpKh&MZ5rhQ`5XVSXEFeI'2N!"!jp5#P%mDrFBbCRZ
4d!@VeI-NTCR$a[e-2kHHH4#KRKFTF9`TN[6X#[2T'JcS#!E80i0!T0CiM[rr-VZ
'I2V(bT!!MjrkMDZ68Km!mY1lI$[c0JkV%S-HmX+haP&YE5C(V#$BbXdPI4LLd%M
k"0$mSYTV*)@Ui3l5e$PeQC0jd[J1ZfEi[90`X8K"MB#&`bFdU4%0L#E4Z-AGbK0
1PT(l*G)Yl0!!X9c[ip3B9r3d%Q0J[*()eicckcr2SP1UQd2D,FL&*p`,M-qi(ZL
*,f%-4I,CHj%2mHH'@ckEMrcjc,Z4YEp%X0Z%B#RPA8VLK5-#ESTSm+CkX2GqT+F
IiJkqj@lIJi1)[Bc&cU3)fce@m(Y10B3[FD2ZS`6r#69Xrq6[[*Pa)h8`i8FkM&i
5rPS5q3N51!EJY,j%!Um5AI$,+a4KcaVRpD%D[GZ0hRq#`#0V51!SYLpr,5&`[[A
T![pbQ!4H!p#maThr1kqhpr2MF"3)(ldKZ)Lc1IE1`,d!3'J[R!Kk@&491fP`d6*
ZF+dBKT5(1!afjY'TVZJU(de9%LE#bb2I3)9J9PD$("6+[,hh$NIH)j2",BKA#T[
*4eBC*NrN)EKD8`U*2Rm`mkbcPmNZA#*@65C"XLUa['AbBh(M,[kj$6F3fHBf6L3
A*-`+&rY4,CZ9Ea5*YjZ4&R3Y-'cTJHVrJ9250aq)CS@!+AId#5-%561Qb!LVK!K
q9(p`)b5&*'#ajCkiXjq)QF-`Z4R)aXpjY++(e1bTKY!X#'N+E)#$NfH[GKUpJX"
`3b)Hr(2cNc#kr[@Ijd390i*RJp-[e*Gf)@D!F&#md-Y1mUL1Z0"DZY!V'%bfNVX
V,S5+4Vk"#cQ1ZC!!$4fkRj,D)H1Ql-&3`VemfF`,A*E"9%Q$Y*!!1a`P+%$X(e+
KFJ*0-!$"V+eLCQe`J0(@a""Ec%#&9SZKE(dKBSefL5&Tq3GGd!U4eK%MaI"MR6X
RR$JbrHjVhlHT`i-K24kiK`edBi!"#ZLC562-`i+9UP9BUHX*0UTQ+"Ye*D+Q-$4
aYmGNYXl43BDJ0RE-lYHRdhNHe*@BTLB`6A-+de3bb#DKS`hHP"L#!HY3Q+@Q",0
8Hc"QL3ZM#)@KCCJe3MIJB@jlK",(j`h-BLUI0IUm6S6LX6USb%f!2@!qDCeYCkV
ldYP[r3X!qQiQCCk`QN,cba6p6+LK)NjqY@!B!RR6#J'D!0F%['+K)al"kkDXTV"
49B0X&"Tr*QP3K5PLGNi6LeCp%"DYfRQHA3M"U&9lQUR"BKMZYe"0N3QKh(9@$&h
25H`AEb2*$*MBL%&$,4XjiE#')E2E2GC81l,!$b%PR2+NF*a`N4Ye29!)!BV#lL5
R#K41V!UhcG`PdiUDJ55`m0(9V)D##c5BEG*66%8*aEjZ9K5N4f9bRE)S4@K4LY"
24DKa%IS(RULBda4@%-UPVDQ3!1HJq4KQd*SSX$5'81jRKV"eb*!!"4`1FGI'J,3
R+kjLLqqJQf*E5U"eZZe#*ZqD`Q$#+AC'G[r4"ik99pda!+e3b@rqB[(U1!2HRFm
%hRaGrq!E)6#+KeSaHE$SJS8lBdD)0jpiE!j+a6mjrqB&rS5Ka+0[a[$T"`8T9$d
p&%H6"BMZTe8-VN(YX4U+,FYlY'G#EllHF"U6`*XhdJl3"P2'ZSZIr`d-XK['dP(
mqG-%UfEb3!rm`$FaR'YX(5lbBZ%UL"blmk`$Se2p'`a6Dj'6&G0A,TfGH4B2AF5
IbfjCrhN-ENYZ**4F1)'de-ABK`"GEXc`J)fIKE2m5UL-#dKGA8D#DlPRcMU2!9[
1Hrf!`Y%JBIdB2`D'aV)fK831'X6pkYVM#l(eF'*YQ6jlZbLfaXF323f0l%&Ajm'
X9'IL-62a@)JIJe-#A3K$$#81pHbNa5!`jJAhSi+TS'eZSiIRf18feSV(Yd'G'DJ
@L%X%TM%RacrbJ&df4h4e+iE*eG8YAXf)SB5ai!3Tma#6%eD`LD'#qD8lm4+*EHG
R%S[kk%9B%*UMPUh8ArqDRIZdY)9'fX,`83ZM3aDQA9#@T#e-(EY3(KUb-19-0)Q
MejZ'[$E6MVf3!(DXrDKM,`eCD"mmPSGZAllHq!brL&)Ae$mC'Aa)$$l#j+b!&$4
m2ZH,-#KZ0Tl+4q$Ni2)lfMGd60GZk*M9M'6ki#-m-$4B`rH)'@E`S*PBa8B%*RP
L!Gm9a8e$35Y`3RMa5N`CYPJ-RdV3I1`a(N!fX[8hJZN!Lf-URAlakM1Dk1)mS$J
6#S!1S5Xa2&i2-P"#`iGJ+2MKCC'X)"B6f`8*SB&iEdTc")dI`3a9HIqildq&'`Y
h"N@"3Q91P%&P3ZN%VldpK!AP#r,fa8A444HCG9Th%LkRQ%6+LGd6VjVG@@)%CrQ
JT2Qf9`cMpN*(b9f#r9ahTNpK4)2A"Sq6Up`Z)U`ZX(XTBSk0YiF%4NFGH%)-)!T
f#4AfpL2J1,ef$-2+pk-T*j3A1m2b3CVB@Zd,EQe1K%(VL,dRF-6PYEMcY"80JFT
bFZ&"pD-e(0K#0$GQmQU1!a0QSLYhk4@5&d3abGG`9'`&+dimc--63e'Dk8'V-$Z
hLDB`PH3#@eN`e4iL+QN%C2-(I3rkfiRFY2[fTJFaE)6%D2Bl-8Jm9,@IKi%A'rT
U#F%3mTFmr2R%`dqQ2m`-5ZNLZ66MmUNZ%@`@A$cdqhp1rfVfQ3TT8Iij!S"JJL5
Y[-SZ8j'cJRfJ3E`jPCSF&4!KrR%$#MZU6Rhab@@jUdESlG,-Z"!$,rAS!bk08AJ
$`dbC`T!!q8#[bB0XB,L0+518EVbTc-L$`SNLjrFr-P*h,9FUE4fC2&c(0AFI$kY
pef,VF1BcJ(hE6MbE&df8D%Vr0!K063j,D@SR)*UR9NcY0'h&e%T6!p0@QMSa0@L
D`G4*dabQ'CTQ-Fh4G"ZQ@CSZBVU0TK@B,Y)dMfN&63F`cG0d(0-"QNjK1Nj6&kC
601h&e%A62NalD6S#jc0[*N$0KH5rDTR!3-Hc!p,%(c[q@2'R&Am-)c#%2#G*M,l
LA`Na1MqM-2,Af5M`Ma9Fd0@0VN5V,b@'01*Q)YaG$N`ZemdMb%QQ9!&X!TKbr3@
-AkY0Ik'6pG@ATUm3@9q,2fZBV(0Sk5R'E4Y[b"h"m("II,+D0m'[d,flp-ArmUh
E[cTkX@q@Ye60$IlDd,fM),PVBb&b$8M4J,J'QRV8ZMpHUc+KpFhKSi&%k,D$,A2
($Vi-bMb)8,d$+DiLCekimRrX*J0PL+60kbKfr[`[iJb#$bVB@RUXDi5JJQS,Ak,
k1TV%[F2-4AA6%Jf$@Gh&Pk[QC($cIjbY[KiESFZraUm4aLrJd(Tak0Sa`5Vb-2K
`@Nm3#&)`5*VVK%)TYKYRT,0AD8"G0aV(J%D,IHcm@DNcQ#i,%BqTpFl"%"rN#-*
LC3AQmJ+81N1S'MBc8JK-9@4jG*26@dpkl`N9#i@SX154#M(FMbrUZ+9mCMAjdZ"
RT$H54Um$)4&IBT!!Q9aafK1R#kE5L0`"85L1Xea-eCH)ZC,9HpQ9B'L+q+Te6!c
C("I$KL#4fhciIXDqYD0`Mp@P-C!!iq(!QT&+B@GP$&&$kDbc((JiZ[Q4KUlTXSD
Z@AC(lM'k9Cr4b`2m,1[`,BjUEZ-j#kF'h5D'V*XbJRT4+GZXC*+"3VSM08T"R43
A,B$jH[Die,k!bk!K+cGS56)!4@&1Mp(&a@#3!0YcHTVK+MQYFYHmG'ff1%h"-P!
)"eSBb)G-&YIl"G4@!!-"&iQ1D@e$afhaJ*XH'-V)ijm"Q95''0Gb5U*m2('%58b
#BqZA-(,3Zh+fX4d1`(iMH,Lcq&VE1EfkbN&aX&Ehj+`10SD+bIcVG$83@U!2hqE
$3G$X1N&M5!eQU#)S[jl*F`"2`CjVP0f5+T(i-MR`01B"`80%$"R1h([XRJcM$j)
bMk(Bi!`5pQ6)6BS0bm6J6K8FTR&bCpeQKR8bmM%-h!p6kr#GSN86@*3mDK($Zlc
SNl4&%eM88f3qmK&)#+P"4cd+Bf2r,@BXBMH[LJ%M8H(!+JSc[bfU'fJF)9,rjZI
5Kdm5Jj2UJ[c2SB)Xd38C[F&3!3Qb4"&N+&f3!0&,p-!aJSbq4S)%k"5G&B+-6L@
1X#F%b3QYP#l)9cZ,c@-&'@dQ3DCd%&(lB+JJY4X*3CBS8)a)DG8NK"Pq93M62%U
BGTKKNj00B+V`(2p2TTBKi$H&a'd2K'21j2%6*d(Cjf!!RY'KJ[V25rrk+aC8C@Q
DS1`3&2kK,PV@c-GLDI`J5mNX[PU@YV5CPQUde+SXY4qe&153!*CqN!#fe-T,j5&
DfU-XE6l)dYZde*ffY)H@0Y(59Q@Tp9L$a&+ahEQdTDeBHTF@PVl``[p*PpaFRED
`&!Y,!DHhL(pL*'(-BGfBUh9MCK0k-YfBSf9Nc#9$M9N-8&)JZ-i)*SCj&0$H9Y8
3jJ")TfHljC[YB%ZrMLe`%"35M``GI16U)S0q6hB5e$,+V2'6ej8`U4A-EY66$%#
)"k!+QmZJb3KD"m(0mkFCK-P2RL+`Up9YL#$&`i)*8Y#KdA(@2JTLj%PLm5[j(p1
5pB"hrDlcBr(,(-l0+q(FH64M[c9GZqb@lc8i)QJEE[PFSm(HELMi3&&`Glh,-U6
$&$PlI`!&cd-QXT1#khaZSaUIZ6IArS9ll$l)c#BGf6fp(`peLSIQ%)`j,P$k841
$Tp$QeL#-#AY-6M%p&8GJ--!Ip&#%!*d`[85k#X2*96#4m)abec*FF$+f*eKfrC1
CrJNr8i+9IbU&`Y!8f,C+"a*iN!!a[!a4Q!`JN!#CNkG#LK#Nr(-5Jj3I!XJLac`
Bm28-(&HSX#fR'QScY061#rppJ*-KiR+eScLqiCphdZZ8r[QIbqPcK`M+DC'&2Vf
5pQN'ar31U9V[N!"U66%)c89-`jf*j'"5r%0-J'SNR1hpkrmEK`JdI#S[qJkPh-*
'A!aPaR"-'V`3*0MDfSb(H,"A!-&Mq&FP1%@(3pH2$Jl)aJm@rp4fVVMRqASH-#G
kM[eA,TPEhV4J@'4TmJFd,iEV)p+5`Q8T03L-mcpqa!eAm2%Bb$aU#FDN,$EjRcX
jf'ZfNZ+HSeqM+dVqjr#if9mXaNEbmYFje'FJ0+-X4Y-NkGA5YJEa5qXaar!`U5R
4G3%0)%&'ELBQ'SQJ!6$"&4-`jhDNQlMaBmPJBq$dBEJ!N!-JVd&%3e)$!%cH$e8
0CP35!#(LlN6[Y@FpkUdjQZ*FQU)rbRNFTIB+`cLGdXAf&$P2FhHFaYbkADLfGeI
&YMGYD6UXQkQd5K'@UH!i$X1k,-X5-G4Ye'QD@jFe#@&B3jMkr@%-%DFMM@P!M52
prU1eprIr[Zr[GlrVpdUFjhRffHFV(@8q&!(a!`!"N!-!)3D,85i0"[b4HcqR3%V
3)8eiVNck3mI5AbA3!"aqGe(kUb([Rb)M95U9J-YQYPpEY9Jk!Q$14D(-QDk@*YR
RhZ*!+$(pdj!!pp&4L%!r$I$c%5BN*eHQIc3j)2ZEr5M+-IFr6UidV#2%(RFkN@l
$@E+RHim0@F5!XB2#2ZaDc,hP2-+K$KRmEQJC`MrRh#8c1$*p"*fek2"2,ZiTFPY
#Q91$,05qjeHjqp1-AIJ*ClQGQE1mjLahU6`DbTa`*pf+hf9$k"ECXU$*CA[D1FZ
E&@56Z[9*BAd5-LIA0f(538c5$jfP1R4BG@M*,'p`K4`Q4cMfc2+'[(FHB1,I"G5
D81CGLjQ6eZ$R(3aA1VTKP+'!kc[iH4&"lNmGKl%X$(NITiQ&q&NAmMjm"Bq!)%h
h!M%(&aIJBJql1!FrYiHmX6jDd#0dV2,c0S5"fdl)3'L4Q2$60HbU0pc"Rf`SM9l
U0KMip3NqS-IRm!'Q$FrP!fbS*CX2X-dV-6kJ4!c`!59["NjBNSAF"`4m*RhElQk
CPV@2$GD4FidY#FHdIkm9#d*EE-Eq5h#%ilLfFApS8BBYL%j2jUpbV81Tq'0Z+eb
@GBiH-qa$%Gk(icEZPK#pJX)j@9hSl#NNC``!&1ZG9mdlR6R)kSLVF[X)1hkRkRK
TXBQ0-p%ka`F39XF+RL!5C-Nl)1bl(led08S-)mB,'-Vi[49P9HhY[Y)DRl8-YG5
pprkL`PIqF@)XCGe6+"cM+"$KC@1lSaE(GLGcphJ-q4#q2L39h8$ZKPK'(E9Xd)*
Yp+1)"GaELNQ%-bFX,T[L40#BKq%F3b4d5-5'N!"AGPSJTN$iFC@%-B#&15`jkZK
)'Tice53Kf#%B6paZ#`ABdAAD`X4EZK,LM9$aHRSDa%I!EHf3!%)XmC!!0lU63V'
B9#X#da9Pj5H+M%T0F4'@cp@8&CHh+dA+ZdV*UG)[+dkmk+[%03aaS0KiSZC,AhP
jFEQ1mK8CbaTdR!M)df&kS0Ga4(0IFaMQ"q@)XArr@fB6Ff@j!mCDFT!!a9DC`m+
kb`EdCj,E8#'XNhCL2M$P0-2YGK8c32!pR(ESS,4ReBS$i*S"AHcLRZadIp2%+M%
B,!Kd",KANlRBZJP%95"-cJV3-4%2@%)TQ'cQc20d$)T$%Kfp$)MpB$kC-dYSFYC
1C%PTQ%f(!MK$c2fdMF[%L,$iRZ*4mY`P1iCd0!%*be)5Q+bB@S68'iG!DqjdPmc
k`PfbI6i@2`aPEZm86dr3%`&-qJDUKJDD5!EFb98l"YTbli-`5$[qQ!#%DrT$cQd
`[3qc+CMDPX[GAb$%MJ&!!b+&M8eDf*JPFQiUb!kAVBV%FK1%-*f*jATdc4GL'De
0L+@iNSdV&%3N8bA-"2d3bTD`5A3+)6GR%*K*@*dSrXD3!10Ek(3l`85-`BMRKj[
0ABS6c1Zb)b!+BF4$9CXa"XGA@J3G"Hb*4j+j&PZ@jHprBfCN82#lE-TY&iLP$E%
$bc$p5PC6m#Q1U-+#0ZC&b0*%B2*,GQQ,$NLkS$Ke`*`m9B&#)BT8HrXTUp9A9+9
BLbZ8iZI+P'+c8RkUb1Llk3+&@em@QlpNYr3#CBhUJ#1`Y*(*j*28l+SZ+ZK3,8L
!kM%bl"1S52MJkPd)89SCJk%%()JAGR*525+q!+jUiZ#V9-3KbJIM",a8m354iDY
HP*R6G*2Q$%a!,-K05J4XmY%aN!!2'UYl*`@V@ki5+MTiQS6$h(q"+[!#',m*ZCi
PE#FEh--H2#F'B6Q5!j(YH[$CN4cIBSFSK,dX'91*!ZQ@)L&+$N-'k6!%Z@-T!5d
BRm*Jek3S(Kri*[(81+LI!4XeI+%CDq!J#RJb*k'`F#HKi2@FCdlDQLKi28G96Q)
AX[1)b"@U$J#bGlXhBK,ZRXH+hFPK-F`qLiPIm%Xjb,"rBG'!dG20$VSM!BbH8)U
$FMV2YNSG-"#LRG3a[Y0,'dDf3#emBEI1ATZ11)lS`KF4`YH+MYXGapP6@54DV-$
V)RLB$40-9K0!*TSDUh@HT3['2JK(c0'PG`U'1dl-[8"XZfeS8dlf,5*Da9-lILr
%3&`4``B5LZp"8-B6$lQBS)3[UJJ#FND-N35$P61Nj,0JAlN-I54PiFJk8-H@DKY
Y+Ep4)QY6*K+ERNjdZ(6K[SLJM&22KX5,GER2HZ"8M5mPrrU+'9MP"kL,cjN4'kJ
+2q*9iQqUU4*R-d+%%8*0pdbZfK5N5ZmqYi`4kl`A`AJ6mP'U`A9p-)UDNJE)-LK
m-F`A)El`m%@5,b,Z8MXF2H(LKc3h3V6%%8FkDA5HYJ89V4J)SL5QCf%4iBYQ[QL
K4G")9946QDL`U5+UP-4%&RfB-9FbQ"4+kh[HY*)ZDmbE9ZaQe8,Q6+[)(-Ql@G'
'JX&i!`Vl#P%pXkTm'fHlRD+SFl)E8fG@iZ"cN9DT'%pEhaYM6iq*ThY96iq`TbI
`p%lqp)33GZhTe,LR-A9Q'6hYA5H9iYf0AH'%f"BV-1jp%EBlL1Kc`@&*aa"I4X,
f"jmPP5b`DfC'29&8H1V!L5UPb2FcjH5"iTUAP'S)fcKbAlrQ+ce488EmA(@hrU[
)ILpJDR&FU3%&r4j99MEJH&VZ*Z!PmbdfU(5p#m5lb,SX3'(YLc`YPF,Selk05Za
TfBjXPJ@CV1(3SQB*8USEDMh5HUPYrJGhJ1MpYJ`aBJQ#CM#3!,*01LVjkCfdS)c
`RMGjPSM3-8cY#bkMSj!!YHaV(A,C`)*Zpbil#@#PEdJ!+cUIJ*81i0je8J!V(@+
3!$k6!&EdEM@`D1U'!3+@H2bT38DQKIR`eE#-04QN-`r)ddUrCjRbNSamNZ1Aqr2
-kl1#I0U0X%4B38*p4DSRX@ZQMp(ej1rleaN-qbrMf[6$j`e5A$cN`DE&%`2X@'P
SiGXLCrBVA4NfSF)&"D&Scj!!rAMABIpl"8F#rhrR9dfIe(kVri%VIahlDGq2Kam
qGd'jYqfqj+(`8j&R@TpZhY2ND(RmdEpliQphrdh(RlEIfIe[hVdd1KQmH[lMkqq
lVcN2l[e*b'Ej`,2rp#q1rGceIirqMicrpZ'A@DG1eP6jc-D'%rYH1P"59'cpSr+
+XZF+IeEkjbrqVa[rmhYrPREVcEbFLfIIcRhpmV0[r0IArL*ld6Y[,I[A*Imbqap
Hq+IRrrZDrrI+[hhe2hrqAclplSV2eRhlLmaYrc(e1l1@,[rlN4q-rG$lIqEpKir
qrCE[rqMhYrrKYRqmicqYrXdM[hVXMcYhE0UmpFQ0[jlrZlYr1qHKZAmeq*F,(Zc
pjDj[$RcYR[[AVPVjpIAr[1'ZQI(TUBP[,&kB[chG)+5hZ"!FmlNLTHSjPZQV8JG
ZCCeLR9!D)F1VXe8qJDUG5$BUS0i(S!CC+-Pi'T@-FAJMkhA4"2(Q[DX-QEiNb*F
!XK`"%PdB(qEhf8YPl-Ilcek`3`P-L$Y#)CjeB+HYdV0h(ekllVb9B6-(Q$%"aDE
9EV%eS9-jc,UGcPYQdjlh'8ZCB4-Z@f`)h4dIJq*KB65Vb*-(TCbd%M-8#A#3!$+
d2`p+%-GZrX"RPPPXVA6JFG@"(kX1l#0Q3mqDea9+jeQc0$4c4SCNEeM$"h$)8p1
#L06$T`YI!A0@%HN,1k%Jq,PMcqB'%44Bf!ZhYS&pp1XC@dCBe!,94p1TQ"pLUUV
)k"+Eh!hd'%6r84UJm`e-(9CG0KN*@,[TiS@6&KZZY324MQ[,F5f-kAj#*0K16+C
%pK(5(SmXIkrc9KMU-5Clq@6U,6)jQ+m3%-SV50(6qYi)UaT'@0@`m&89ZpP'l'E
K)b([bKR"EKBqJTm[91aQQjVGX+N[-RD$$*S@K$+&&VfrFQ([qrIErC'$b(Di90Z
,K4EY6r[jP[2bJ9(j"&1169cX$be#H'9)K'id0+j%+&KK9b'45"bEM(rB#B,@Z)b
%("dHE'p,b,[q09U3!'"%H[LQ#6dEa#V8"eP)4Mb!`q&)*Gk4BFR!RMQcR'@%Qic
NX&G89HP(c'(c3Yj9Yh1(cF22jkUUG(@F`fLUNcQ-LF4pUhN(!9cK!a)C,V)NFV8
Eq!$L@(ZG3V`3@9D4&K@A+DH+P-Rb#Pr4L4T&Cakq+J9%RHp859dXj+VRUP,6i+Y
jUH+j%UAN4%A*UE+DKMZ*ZV5#`+`k9AC+19'Km)Uh6RE%#,j(1-(hZfS)[M'`VC@
*i*IrFj!!9iq)3!F-ELE$5NEJ88M%a-Nf2pL6b@)cZeP3,Z&kXdiHVA@k5e"d"AQ
%)Pi3iDl2D8`HhGr*A!q9@KACjqF(pE--[2Zq"ZL+"R45m%9IHE&5A!j5aALUl%5
K6cRjR0RX+fG8"cbM"0RB9h@Y##lEclbZMYc9kl4V0V8(iiM19R*,-KG#`N)qJV3
m[%BM,3XU)bfCiLBM,F%k63Yb`kfbIb6YC!`&UT99#RKX[1I32NSJJ34NBMp0cFj
a5!9SPT9"d)q,[iR%hfTJJKm`fRqp6[EVfHh%CTe!QfZCJPBD$FLFB69NpHr(!)m
'`-J$*T03D99[G&J2,d!"8I9)YqS4$jKm[cHR+UcBXbmkT!LFZP*XF6DZX+bZR59
6"'PcISH$r`&G'h2SiI4HCBMBV8k!FQ'pQ`[V0kX4eX&iBHh+RPbefI)9#@Z$,Ua
I@a-[V)G[F'(0E5bXAdY@*kaU)@A(plpFFE@a%Pk*[*k"`'kf0"EBifG[9Q!KLLB
QVMR'#-#Gjb!`qq0"$F&&8K2L'bH-$%#'EH3)U2RE%bbp%R&PKL[$QpL+,U!JIdK
J+pPBNpMB@&k0`UlYT@BFV$#TYNDLP49ajTN,f+3)52NqE@+F1$EH1)4[J![KH19
#Z"#Q3j!!0P!N$r0`8cL[9#B2"U%#kX`a(PAXd&B$&B3!dB3eLY$3K2%k%k$-mAF
C#9j!aZF&Z6p)bqS55alSRF#8$ME&rJ1K6MUa)#haM0Q,"LMjdZkkl-N*j0!4*@q
`LK@N#P4)8DN,GI4%k"1L',$E0BHcd'FbBVFV2B1j8+-0A2YqT'GT6Nm1XB*)bel
lGh,Z2@qh4bjS9e#%)cb%5Sj20Y[Y5'+EXYH9DrVTY5eY2GqjeA1,VY16E5h$FQP
D8Zl2-5pi*NJ24Ek-"lC$K#kpJ@c&k@iJNQdF@IR0hQ3ZrB("0)QXDAq`&D%'UT!
!!mN[8f6ph5N[J-L1#G1R+HQbS3'%H0`lC"*#(fM3K$j3DICr-3@C!!#$%&V6I$K
p-A2kBX&S`IS+529B-%f985"J(#EfBVc#M+)D@c+*m"ZD(UM%DPU)eG+KDX5U)k@
MMM4SMR*1VYVUTS4[GGq8Sd)T,c"(l@3%'bq+DRIjdi5lMV6AlbkC5"4cQjESEDU
L6d9X,J[+XF'iaD8ElEbQXkU*DUF9*Cbee-kGp8NecXT@1DY!L0(@eFRF3maiScK
GYNTFSSK*)TPb4L3c`eCj)KZaVB#+EI&Y0jTLDXcBf-B!YLH(kpiB64)EkeTFrmB
ZT$ckC@e10f3pkDlEN!#P%38"K-9-S--,M%eSSYPD5!defqK+BJX4N!!PC$i`&Mb
3!0-K2ANM&hec)d1+2EjkAeV,!AZK'X!1kJ,%cEREX&@[f'UPJ8"bRTFl,h0Q4Ih
1FabKTiKSDFY'G@fAp[!*CQ$YmEbPA!ZV31-BFTH-E3%!eqL'jI(CBV[MlibN@@a
9IFaF5BJhH-IC**UdJFcBLf+a8aA)UJeq0rJ8N!$-*'BSCFB@lZla0(EC5f'jP-p
4&DBi`aI89D#T)mA'bQK$2T-bj%Pck-JLENkP`FQNQ`ar-"3SC!SBcd!fp`KYM+N
S(1%JC!S+[,!H5qDkE!NMUQ%"185)0*MNBNajM$@j@dLKm[%IX8ac`)M3!3`4d`,
*Nl(9Jb5DZa&Jk'$Q3qUFacY(0&5ULaVpCBk[FdSL5iaf(ZCI`&3IKS`"EHVR'9c
*J@hM$X@CB9-lU$l6qIMJcCR1*@hPlNU+mSX`iF*m@YA+#KP$S8P'i"d#)M26M+p
e#F1K0hU8N4q2ULr@*1-QCBl[JV%d3'D'J'3-DABm)kIQAP6e3Q'SR!'Z,#*4m'#
5-qi'F!--Y%cNM!TlX"l!SMMQq&LQ9YN,CSp-pY`-'V*R0X5aq`"hbGj%mbpb!a8
DU)ZDc-+%HT3,eeS)Z42QIj2LAj!!0TK,rkr0lFcY*8C3+bSaFKH5em+8LELb312
T9,3AVC!!4*kSUc*epC!!19fJDZV6`82e#)j&6e,bTiHTqIZQLl0`p-Q3!(!e((+
`XZ0SFqk+$")A%RK[P"RAQ(,#FBkkmPZS6,!U("&4!5iLJGkk3hP2pGMV[@P0V&L
20i3Y)*IYmbqbBETLBN8LS!p"I++jB,--GifGVB&"G5c[j')BLiIBeZfL3%bES!U
E,jj6L2Jl`N*44`8+Ndc+i9rQ0N[Pi)iY%5Le%0'AIMHrB0Pa'iP5KN6@dHkZJ%J
K'HRca!ESXM#JkBH06l!`M8JbHk)03(Ird3fS-FSq0&UfmkhRL3bD(SS6e5)*EKZ
&0Y23@(q4#bTTjSPUJ(C&aIS9c[Vh9-lkmk@kHYTiNp86ba)`dK5&2JR59+&#!K2
ISdbC4e9"85()X2PfU8PpeIDDq2EZV'Cl*Pe*")fZ!Z8)iMRI02CKSeQGUF25`iR
JJXGPe#p6hr6YUTcXRGSlZHUhYk'k@XH8FNcim5Y15c9%!C[+L)+Tp[SV0QbmQbI
J@M8*D&'""eA1AD-kQH"ZX!-a"8*P6SE)d0T00,$NmU'rdSUhR5BGdLCMk4HN*(Z
Z696)dfeeNC)*FXDZ#M4Id)M#Zjb9N6Em'"14hUbSpFH6NRGGjdRAhH2Nl[Pj0Hk
aJV'N)bP,K0LKJNRA!`AL3&3GhSFf*6E!a$XLMT2(+RA4ERS`QF[BVT0GmIV2D8-
m1(pqAHljK8dlcZ[IlE*GNK`"0VeKX19#h)3VUJP3$pL`Ui9Rip*A1)DdC)!X4c-
PQ8!3D8i'-mrV#%A$#29U8p$)M"'NkVVF'PhR3E0r,%(%&+8[Y[DXmqbqB0b,`3T
9+#9,0iI02`eATeiDiJBaU&`UZ8ajJ+BGE@`5qr9'#UGFDNTIR%M)i3pji)!4!d,
jVZC8%899Lk%ST*K2('"KNqYB`(J1h-X)N!$mj&40ii"*qZb[f$eHc6eHDaFYQ@+
[ep&p#Ir%(dUXeDijl3@9dlB`Tih!$BVQY"'KXRRKY1DdMq+FKZNEAb@RLD-B8&*
93*RG1!J1Y9l[aLhD!E2`mhc)Hfj'1m!EG`"0$h+JT#D!FRbe!-Vf!bQ!8S0`9CQ
[%9J%pN`!8ch)craaTP$+59Vh2NUBI4d,ZK6#V3+aQJS6#Y&MZbp`e221UjLbPj[
kG5H(p"$LNaQkNeNJ"fUU$fGV6VBd$L0ZR8Y1jP9!3#GKGCFH++kJ"&1d[e(DUHX
-Nlj@6cS,PZD$B!KNBb0K53fX$l!'88iXLk(bV,YMD"kjJaQ&@!CK`eD)QiXqi4"
)`cF+IXIFXPEP&SqZb,$eZZB@-J5ZK!,fLjTEVMG@CYKm"lQ&!Q)lX#9Dk+i"c+Z
%kN[#'i3m3fI-dCh"!MP5lQ+K(#RR+YerKT54BdKYXbU%$Fj9*I!f2B'Ec5b"hBC
E2)RhK,`rRUdPFDaa%MIYSL3+eq[ZlIQ`NA[[&S@C90He)eG`e6l[TKR0TI3*Qd%
F'0%1I#(Z3*THU(BT#pCUiJE&C5&I,!iYR2UcmK0P[M0`+RZ!3qT2jNQ!D81#%89
lQ!*Mid$qGEdBlYJB(mMrqR)Hb"pYA!4hC$$AL)pY"06U,r&PVQi9Q*3"H"!D,Nj
`q+SK1,)eBRTE`UbP%F#epC1p#[YN5'Vf-CKV984118L4@K)Q6TCF89r!TeakG)4
iRKfITRS!`TaI5Z&NmCMK3`[I1"#&e)Q+Vf6TQqJkVqSk+kiK%&Lbp"d+Y+XkPr$
1(Jc3i-!3X#4FdF*GmBS@5#b0dU)R3FE*mXP9$hA8(rajU%-,k*A@554rbX'bY"U
`T-D4l$'@34+CIHra!4bfKJIb40$99$RC6Y1iU5@rcLdYje[kIM9EfU)p6qT4IP+
0`q))$b"j$4B9ZSGPdkQS$+1,P#RY[-ZZGA@JDeM9jGHk6U1V4p9PdVUXb%S1-$#
+,NAVHJ0GMkQk4V@Z&HKD,X$+ZY+d,M615Aq"LA!8(lXEj#DkAVD)b!(Hk1+95Tb
,Mk&Sj$-pNb#YkEJAY5&Yki!fT1erU!f4c(5,0S3ldS2D%'j,Ii+&4FJifDS4jbf
9QJ`fF109Ua``fe'0pfTKp4L&e30N+#Ji+D14PMYlZN),dEK*34Y4Pc`TEmJP-P8
q)JHL2I++eB$2K!dLc1!q4"qi`UIXf*-bfX%#5Bq4!PUdQAAfD*h$V(-@kc4CSrb
*,P3S`iP0R%kM$UE!YKCG(DVY*ESfSHYdSXZ5k"T$PcA49@lU[+9e2Sr10e5GLUS
c$CdV9*fM@QF9ZQj2G(@4Lr3$'l2d8CfP2f*A+9QUe1Z)b)KRkEqj6#aG!%KRjK9
rAR+bq!#aFkk0N@L#@ecqNp2AIe*Fj6[3hQldPGf%@PHq&JcdbMC'-*Vfl*1pKR`
#2e@bD&M3+JIM63LSARSr9$0UEX4NJ1mYM$j!(hXF32"SN!!Cp+,Q,TMdHl0-E0K
MpLY$$qDLmZjpm&NkH(YZBLSfF)HBCY`#3p!!M+DpkZ#'IV`j`#Z-&A*3rh#9LJA
pL,1J2kk'"Fe[h$cTCUXS9'fQHiACif9Hea3QD[HRP8IrmV0$Nb*F!V@j@X@q2`H
"Tf'9X4F"JmkmM@QL#q4"lk'V6+QJXM"2*drZ3j8RGl[+J!j@[P%hh1"22hd#N!#
CpE(jAqBk*&HMp@X&(aZT2TK$Mh&$I*C)[UXH`a0p!'a["!A%"#BCJ(+9[if-1G(
pYj!!q%$E!-KM0M$20$*Y2#-$RCp*dhfiTT`3SEV*p3'*$Y11E1T1r8cfec3&2`-
KL!PYcfM2pLRI`UHbFX0Tl*&rBNq)3hBP3Z2dB-P123J)NE+AT"5TZGc*peIMj#b
D1,PUVMePeDk(rr61qJ@&+i!-iX,eqXQ%ZGFempSGp9A+M-dJp$1p9c0ACNjcdre
dZbSF"%*pqSR')PrCJ#AT89E**+ifX@T'2$qU#J*9hTKXJNbXP)(J9iJ`Df,CMAb
1mQMZ,p*#Vi@kBMXK4,CeHKErI#F02N9$(M'Na"(4[*ChIFLke[+Z'm`S%c-kH3-
T3LjMi@K0l&P!C)"hjYEae,"j4&2e42,eEHVZi4dE99[YM0[UDY8"eVJ$aLVCkZh
eE2@M1Tk+hfU6ZQ%PUAdN"9M@8K1Ak5VY!DK`6,[BCiUSi`[@-5!U,pBa`3G[mZe
+1BqMAP!Xhd'ME2Um#XrHjI0,Y(L0AmlA,[HM-DG!k&H(UjdF-'pPkT[L`kIVbAM
3F`m4X66N'eLJfYiFGXeN2XF4VkABHJ!+['j9mp$eZQ1FEaQ*$##ehi4VCP5Z@Dp
bcAT9-Z1h($25*e,bY55aTP$ZPbJS0cf3!(+kH92`VH4"eq9$6QP2ASlE'#p@di[
hNbV0HM'FSS$(qN5$,4(#M'Xmej!!D,!PQQ)P`S,6-c"mS9)iC+%+J"Zj-UHCkTN
RQb'SS*25X5+Bb`'dMQK[2e'%aY*Pm@ejcU$"fhcGkHk5Z8IeTSG6ZjP5(MDU("6
ER@T*Z)B##f*l8kd-"(-%D+C)X@dB"P`#eA`qj4bE-PqiHLUCF2Y8Pa!3Bj!!)f*
kJl+T@Si+T*MHEpk%4XEd@E40h-!lb*Si(P5"+ae!,TPl,'&#QYV0Lh-kb+jQLcS
JRcR965aH6aV21[6(9k@06F28N!#@0HYM3JlMUBP3('!Z+%9R%@!G*J(5UD$U`TX
mdD6dCH*))CK(30Sb`Gcr6SS,-A0Rr"&U8c1UbE@mZ[a'0G9P,UmZVI98PpDEULi
emR9e%TF@8q-TN!"9akT45QR@*i&X1CCS5,Ak4YhUJiQ'9-bmk&f0jLh84!R0NCV
ejj`A33#GSmC*LPe&6KfMiFDd3ap,aD9UQX60[Lf*"PT3%f`1TREV#cYIq2NL`"F
Q[ZMRLaKI$&[b!RP-J@k%+E2Jmdk4iarN@2hH0(b6j`9-Lb$J6`eYF-'6'T!!'LU
D!Y@6!M@8!Q92J6UH!Y@9!R9B4eR)J#m0qdBZ9X95ESiTf`aJf",-,Sa#mD'&ZT5
rkml[61h1I`UI`&3K*C!!%NLl#QN(dJkNAiAd!qN(-U"#"S!-!'P5)8e!QS$X9b(
lJH`(-UC#aS#-!FPG,bG+T1'B!-+"Fj9YfU1$D)%!8I5eTZ-I[#e!&,e"EKL'%q#
+VJLjSU9YRcc@eK+3!2IP$61%*h@[j01LT"b$6pTd4D,ke#48&Hp,DfimY8FC1Re
c8iH8S@-h0p@Z$,PZEZTaCHMSc8hY8SBbkTSkp'%D6FFdL&,e%b&FErYNHQT@1#&
DM9ak0Z&56elc%-4Y+a$(U,&r'"0Zi*-j!&%)bPl8p#H)TMpY[1(M&G'8"%dD#eA
0)Dr3CcAS1+A,FaE(*,q9fJ%0BRSdh!,3jiaGp-e5ZU$-1T&JPFYl"+YFrY9U@1@
+H$EhKhFR9rh9l,VCR*J8cqEqX16PXlNrc+ZIc6dBaqBHV*60,Cc3f4`em@pLL[K
rSU`ZKeKGUrf$LeErf2qZV1iLBh8jeE#kR(qh@4dDD196!X-#j#e2@I(YG$YIqU@
I,`-b`*I8c%%XqeRM$PV'C)`[KqA`qrG$+28M2Lq8@Dd*alDL3HR#I!F+X9"'QMT
0#%pU"MC&43[ZhY4k'*m3S-j3@$+e3MCSPK"lIUPe+0cPICZ4H)1Yq+J`'NA"f,@
qMkZVABH)kib"QZqarfc$2j[a'*TS#`@N+AH6j-X3@NQ$,@#6b8rHpM13!0262Lp
[ES@R[lj40&Q0B`mQcKiHVSBpM+98ahPbbH5U3@Fbpfr&TekU$Gl3*-%BRMaE9dK
rq6QqNDI9'h(Z@Iiibc4KQm[42(hUk)m4q&[qZ-XQYQG)KD$mpG@[ARhpr-6NXFR
Jj01M5dEA"VH2fNDc4[rLI-ISaG(VSpH#Nk-r'jeep9q#raVmkUK0mRm!!#[V384
$8J-!FQB393XYT`$4E*1hhD9HbdU@@MYlQ!VAZLaV,@e6N!!d"29ZHIr,3YTe@l3
k((GTZlX8q[ifEB(U-10##eC!T8!)*X3BNk1)bQ#%8Yp[0X!ia*!!4*!!+1B`#DN
JP3$M)F6T-3clqhrI[AI[YY[h%mqFmccRH5mEE6G*5j!!!%%3!%'J'[pZd!*')hi
d8ad&8NbD'P*4(dc&(UP34RTjL!c1IiCPr!C6SYb+J'!ml+R`LAP0BQaYH4c"`CX
-`hGSiH'LcM0LhZ!%6a-US-Lr`ESGh6S1Rr@928EMX'2`)k2aD`Eq81QP)DkT"-V
5LrqFPc[NQMlFS88'2p+de(BmfZA(-(rX"pS%$&5eM88JZjLBh#(4SiCS[ZGfTl5
ihBqe,fKS5HR0E'a`&jaX#1kkbYc,XZ%,`d@NbMQi&bh4fD%YZ)@kQ&$aQN-0CGd
LD1h2RVFA)Qbl8KXa*5&iEF@M1([)@"PSeA5fD5!H%2AF)Gpl)"K'"l,+hJD43kU
YJQ-Gl8($j8r3JSqR$e-!H66Gj+c`$M&PPpQ82AGF%ee&e*A!AYlZ`8Eq*,iSE"V
'Kii2"clXq'M$4`3Ih3Phh%hU6XZXcBbLVKIkUX&09R8X8"CkBUk[PbT+[1$EPcI
6Ir#929V1F"GEq$c1BV95%V21T@YK,D`-,`c0C#aQ+'(qb1dqf5$[fZm1"IeE'kr
8YJ46[#eeb[XI2HYfTcHQRN`2ZM1c61iIUH-AY,[c-QYpH&rG32HZd0B(5MCMbr3
9j))mXd[qc6m5b#UT$EbMDCXf"V)HE-IYHDUU4m*HG"FaGV6q(5UMj0m)iA$Neqb
)36jb&VHrLRVNerc)`YedC''AI'3qEX9S4aEZ9SjmQae*B8F'q,)@eY'4lbl2Gq6
EbT(Vf*(hj50BeX+j8BpFaiq828Y(bUcb%5bVl&+d)fA2XQkYfH[D3kqZDrHBr9V
Kj"hMeed#U(BE2Qk(5k##XBaBap#TL-6F&@B&1iNKGGA4mH[-+#EVm,%#b%3(0K2
Mf)%,G1#@mp)$amB[FU!4Q)D2+MJ11M#,f-B11)SIX)aIpcj!Tr0a(BhP4RDJ96i
3LhV!h*1elY,G!@d5[eRNS"X4$jBUV4r#+Yre'UI$"IFCTi2@eN4YGQ!k!E'9r@E
Pq2[mq+)3KVZX1KU-$@cV!e4GE'[QX0S%jkdAMF1"R4dk'Zrel)"!PF81(+%$rq-
cj`-P9Kb`MZLcGaRRX3-*ULTf)#RDJ88e11$SdfFI0FjP"h6j`294$ib$qL&&'Gb
8@$NV5U`++mD!&D-C+dE,V&J"9S`K9V$M0A3%(6HYF$G!!r',(Qp2*KahUIcb9m9
I,K5M[+b,mR*ZmCGPPf`[S8k!ZJR8CR'Ffje+$R'"Nd1FG!aZFTIU&$fEN!!iS'R
6mi$5)1"U!PRVc-`*PJ@!!ZVMZ[Ij)c9EZ+90YfNkYY8(5j@AC[Bb,(fjb&(mjEV
hT5maD"a9aF"+X-DU2LkUiBq+Q&$al4D0+bkka"TP#6A5Pm3JhQ3f)Z5K0&l8B)*
T#X05kQ-B'NIl"`EdhZ,34%%,UBI02f`)YK4FmFX1q,XiR*RUpQHQ"qRp0G846dV
GGV,1h9*h-V1P!DrGZlcAdU-,ldbVm05S`P0*H#SA6X%aZ#i)$'c6ZTdDB!Q``6B
,C'B9A!QUHdhk%GqVSD8ZH$+VH8h8TZS5EfLi8Ka`-RqhiChDe14)94Q[#(U[B9[
MYDb6YHmN9aS*3`U'NBZl8TX5V21R0ejl&1+'LiCMK%j+3E31PPl5#,af`%8BMEP
$rU4,f0!ePGLI!#*RVd)A59Gr,,il`F!@mriVMh)*0S9-"5G6prT2CUBR4pbeI1,
HEEbDI1jF1p5)9cf@0iGiD8'BkN8V$$DP(9hU&9BFAH,BS!5T$rl`9D2,VU**#'L
#VTXZ-Hf)NQC&dS!Qe3[,C"9,RAdfB(Ul&LPGJfk%!$Ukp-dJSp16MSibMRD&Mil
5l2'l'MYkYQYYiJNa9LGZ2Kd-2plRQSU1Y++H'l[QjCRpprGBEJ)irr#5lq%S'L4
likj)0i5f2E&'Lk4dd@-)!q)"Hm9EfX'lA!-J,-2$B+A#a0l"dJl01f3bIQEf1I)
J)04%BQSr%f0S#RZjdUd0TLXYYFR4f,Z9[#KA1L*9fJ'PpHK+@dRT%aLNLq(UP(j
imF-JD$j@P4CS1&4fT%`&SD&$C8+!Zeaf@G%43TEF)8)AAeIm4'M+3"06Yi+TDa$
$+YPRIVHe`4G-TVUTFR-%08e'*1QY!M&%BY%B"[HD'KZ5)jGrm4drRFr-hm6f0TU
#Y9Q0+F(UYYj,@cIkrFRC1MhIEYmKB5QCGFdZ)MU#LrU'F[ShU[bfmKScGH0'3IB
H&(!(#-JfFRHQAM&fAlP9@dS)[TJ3R"%G$-PlE8KZTmGXKZ6p&I[[FR@p%TDLphl
Y`"#DP#1m58NqNMF$K'bpeJb5ekqiP4323ffG%b932(aIH9alf(#6JZ5biMYP4(F
3SN0Yr9)q0,p%D#ihSB6Xf9-Z5C(pdi`JHjT!Vi`MHr9b(fKNVhlVj#(l2B'epRi
2&Z,VSHE(@jjE6NQV2H@%#0j6ZDGiN!$,-[i[qpP2$hd03NHR'hRiBchPV2(bdU[
5@j%NZjpHN!"Lr!XdHe-j5Db04YKQ%S#!5[lLlGD(XXT1'HrC2E[X&,eQa-EQH!"
CLZ,`"38aZJG,"c3'eV-K10ClbeDYPi3$ZAU3!2,"JH9Y#YAM"#TRF[BejrJbl&S
baV`D&rX*f*KA%cKNc*[$Q$G(CFfHRqCM(LY8cXal0X2-DkBJC4K9mc&[(fHHP(A
jN!"ZPX+i-0e%Bjb0EAqrU0Ei3+&D#`AUV)3@52bbM$,H%bUhkTefHX`Z4`"f#S@
Ha,bi(FPH9UhG(jUp6CZ%&![kqDZ2Z[KRFE)D"'rHL&hFaBB9X46CHebDpTQikk&
Y@V[a(de)cqVU-rlM@I0Z*E$bjZ)$3aJb6Gc+KQa5KQaL3f,bN!#VBTlS4DLN[8p
rb'[mh81eaYmC5j!!T&*#UF%Hc6mJ(X8AVjTbf2&AcjS4Q+Q`RaEcCRX4$2-biBr
Mf12'G3LUV-#,"FC&!2D3!(c!MLaDENEiAJRAS(,+H*JBA5'IDMPL0P40S&19IYj
'H[NJ'29E-'8MT6hBUKE0ecG-4R5LIJ-JYiHTreYATjK0#qr3a4eBiJ[+%Pr!%RF
Bbl(%E,DBK9M+3NT53j+bE4Qh+F&UE)G!bVa%pN2ESFKVLT!!emkDEl&Sl3KP*r`
(f9HVf"HVcTT&$fd+!,,&IKTI,6#ZC!2HB#U[C-2HB#SMf3r9h%UJTQAma$AS*"h
GJd,air[j)`ACFmZTBpNbIZ1mJ*FUC(*j##3&NUSTa*',4jDi6EIh@rN`rJ*$hmT
P38im&P!)p2IE+%523@0*&&6E!+6[RTf(EQ+UU#UPSPl()Pq[1f)iMG5@MrdG@%6
9ZpZdIZ0Q"-Ff&l,J'$TkZX5Gk&iLj*XL)pm*06aPl[@RAfRB9Pd*USIX6C[l80b
Z`HBqDJb2dRdmS-kfmB&bYTZ)AF3F)XJ$fr-4ijYXa,K0h88I30dT60dTUM,[GFF
$k+BCX5P)(9K3V)d*qVP6ap@)e+(QmUhHY`f"8lA)l0MP42kR2F)9PIM(P"U@mRN
eTc@(LTk[lbe0!EEYUGf"9R5p5F$V%4$'RjV459Ai9SlRL,q`9I1%r9e3J(9DEDr
d%(&HH&Aca0!T4SRA5"S2Yl*PIdFDeNVlUUpUF[Gq[jT#h)Fd2,CBZbP#K9q,M14
3mIF$2)bE1pr3`R$"YdVB'L'b0lGB-19U-kTDS@SC8r9U$Y3TNN@E6(E$4ELe(Jq
QJIQk2CI6)a`*GMJmf-4['lUVmfA@aDf`*fZ$adbJ[84B)PpAAC[5A4G""k-3"rK
qjUJ'm0h"RB!l(k#GGLjQ!-cQL43UUjfC')r#a)iBUiSL)MCmGNp6VD35FYV10m0
L*"mC[f)X2TrM5I**+fqp#E@-D4CYrL3Q1-'B[Fr6P(l3LGR53kZS-G$DmK!iS)r
$CPr#&@r9A#1Y1IKLS%jRMG%q'k&@#Y'ZUDf&,PZ&&'#,`VHdiE"i")R#V!Xj2"r
KNqUVX,qj+P32TKGBKIJ81T!!1b5lp-ama%[DUc0jT-XkY@*C!jZ%iUN9hJE'G[U
HaUXfIlC-E,E$5H[i+'56DTE*PGBf@)V'G4QPBJ%XQ!"@f"9"jDb"lNI$d)B21lX
9m"KK(G)#YV%!c+K$Kcj5KE8A)fdJCa-(`i(,JApKD-%kmaSrm`!GXXKa@-8l0'[
H'jS9B5#lZ&G,K0l3%[E,U1)M,JHkiPQAelBLla"()MmG#P1S+f6fljb0EBcc2L+
NDbId+edQkQMqjiNRUJX[BCLGKP(SJ46++3Y0JCJfiaL)D3YU4LmE-JS*&XSJ%28
1kRj!Nri(!"fR(UV9IQ"FJd-*0S9U6F!F-!"mZTHTTh6M5a6X*8!%%e5XHDZBNK&
kJFkA"%+CLDj0aJFCB2-J5(dFaXHpUX)3ZTk"C1ZCdNPXi*U3!2N,C6%!V@K"9D5
'0YDjq1*`T9+!epN+F"bT%TJ8ZR8hEDBdCd)PGr3X$D16-A4Zb8UCS8XB3qH+@jY
Pk"+CSGY#6BbGYd0)@h#@`XcEq3#!RUXj3hhahAhD$k6,`*)h-(8hX+8N-4"d0C4
FcCSA1cr)*JZ'+4&$,P`rc"q16h[TbT36)#+m`D&N)e5XH)'a2*H+M0r+8,U(`S[
XG5H3!*)"pli$FX1"VedG5U%+&p#`lVb90%d*)FNNqX,HT!K!mJL&TK`m5,1R@-J
j3kZA0TDXH"HJH1[q!fP[eRfX8'[cT1j-,Z"Kq9'A(afdKDp2&QP9R6Yek$"K8dK
K)#ZQL9'`9VcJDL8(b9`4X@BlBkLpm`b[qKq1L51-j`Si)l!e5[2MUF#8S6-)Tl'
$@m[L'Nm-8N9elL44FN9a4LXJpCANB3J(U6q0iNkh-BEA-SC[!f+[P9QHb-pbS2E
2'@Vr('cRL,d@L,f@-lp`ApUC6ia%mG+00ECJ)Ga*$E%EVQ`ZBqe"*)c9N!#6f+f
T,+D*Uf$bYQ*1SNTKmkFf0L-YVFSiaS0dXND4*XmVSQKbKm*i%XGB(j%-8+U!EmA
8[Cfc+ZFpN!#ZIc6q%d-F,@G%DC6$0*8lVT[XQm[pqVRYb!EY[aS108NCX(3*"Xh
$Lf('KPTf`aM"LY3Q##@&@ebZU!e,3Y+`6&8E&XDU)MlBI`"N&jD$D52NY-,'d@L
d`Jm[`54rT(iKP5&mEKFH6h#Ri)%SAlV*AQ)16R#PJ%&M'Mm%XmBJ,Dm6+%K*K3U
$Z&XJ&[RfX!dUP!dUF4YHZU4$lq0E9'+,ShMF`94+8#-"aUd)*V&Y9P+LU1cQpK6
VC-XJ'V13!+VH%d$P1fC@JD%hFX(&1J)c,&KeRlaiP'k"%c"R!0`1imJJ!rS'R!!
qqZ)5!iip-Y&aPSJ1Aq(hISR#8Le!,4kA(@a[DRTM3c#j"AqP5KaDaYrAeZ0"!R3
ebAB-EEXT%-'5r"J3N!$'0,q9YU+(E@C`BTfUkNk@I+L%1khX`DS*,!@#!+e1QJ,
0Nc9NNR5X3T+188P5*XK'PSl*4jEqc,Bj$FA%mQLNkA,RB40"R[*N'S9%h4U0B%p
$#JErjPRhVQ-RGQM**XEIKqT2-Q,m5C8BIqA8)5A'(dXM-Cl""*!!BX6i*%QchF2
5B#@&CJqP6L6aMTm$Kj`NVbr0*"NNq@dC)XQ,+Ga,#SGY#MG$Q(ZPK,PRm*!!%ZE
H$"2QKk6lkj!!%ZEammd`qMeLp28f4KFMckZLN!$RALPjVV"FHQKG-I+mhp81mVc
AL6c[L0k0qS#6kYj(4DSIkNj'Ce*GTb3MPaBMm$,N1m#)p3pNB'p5"SKe9G5q+15
k9bEA[GMS-B"P*3Uj[UbANHXdPIQ3!"$V5@`CKIeNR!%SaK(0Ab!Kf`G9XPf+"*J
#N5BLh[N3NCKFl8*VYM04hf%MkSXISX49cF%A*b(d*lq,`QHXiS3q5fkYSUNFb56
cec,bIDe-jQq-3ZCcGS9T+bR$R!RqR(kZC-l10*2mQPBZERe&3[6[kT!!0LL-i#k
3!*!!rS-Uk9qX8Y)3#+LZ8V4CfG,3J'DXY38(LKm#5A@IY'*m)jJkj*!!U[!Z"3b
S@MC)e1$NeAeJeAdqcXjZU4Lr,Z+PTP%`T6p$3B6k%[US3HG'([EEJJKm#5e8Q2h
pV+Ke8,U+93ZT45-AK5E-J`Nmh3h!iJMlkMdjR-#(pKfQJ))YfB@&&IS[fel*bT%
CKb1USBFdK"MU5Aa%B%Xa&-'FdRC'mUCN&&Ma+3j*@j("8%1[003JEDl3k+K#Ta%
c+"QINQBS(4m[+mM9Fj+%$DYM&@!,1l4IDLlXF'peBBI!Q%[j`Jj(hlV%dj!!P,3
FfHR&9--9pB3IkZ[3-d4V)JTRXHUibUV$K1,bS&`K(INV"%@PKK@9'VP5H%&j%!A
P3E9U#MXc&)M`XN$%4VPa+K,*E!5&)HjRV+B`a%DR-%3l'A@*'SCBSl$Gi"5'@-2
#%'[bK5(@U"9"iU+()BkqaEGL5Sp9LiIL0JpJZZ&Bi`BP(1&4`a&aIF-FqMGUcJh
P08fB)M)2SBNQ&TSiJG"%S90S!UPV#%r340ceH0QRK#I@5m-6-#5cJ6'LeCAbk-)
6-$$64&Y+3K5'CN)89eR`B)UVPS8SYV%3a5MA#@Q))M"'#Pkc3)A!YUU3!'c&Ja@
'HS)9Sj4JaC[%kJ`%+qT0hFiIV*!!QiMRDmaT$&c8ZdQ8`-A&$"-PD[M#UiB[&)"
B$9pi(l$`4Af13a+qf2Jr*AbaF9`pi3Z[(,i)1B8[1"%r9L(LakK%r!-8[RJXlH'
,HY-0*1%,KP#LNUDZ")',&IS1&2U95U&(-8+!A#hd4@UKMf[@'!A)P)BNiD&*Tpf
+LJQekb&%S)+dU9&3"PN2+6r+Z$i&$iJ+G+5(+A!`UJ*bQ$j0bkmqPP5JTZMZkiA
a(YhcDYQRrU,3Uf92hC&9pP6CTr(CCCq+1kcH"",Y0k-3T25)XG8dSASd6mTp-b"
kPb*P0aj)j)P&+,bDYX8fK6I"Tr$D,H0[L#GB)E+-Aef4+"Gha,hjYaV"9YBN-@N
cL-SJTNbZlKD63QD3!+TmfZpYE*TN@0QFZINrZIMQeN$mK$92G'#VH0jVD'4'Y,!
r,*j`&CCZXHUq,MjC8%&`60Nk-!6@Kq1R9&A%(F2fr-SS%jjj!'LAfhd&cX4r-MA
BSNl+6@ejaa3N"(#lk8Aq3*A#lhB8N@f0m%4eQ"eEM0@,*3aB$&B[cL#V&aGMY3-
K'iC-KdGJf)1cf@NEX(Rark*XrQCa0J0I3HfRAQd"VL*T0'2FcXrZ,4*'E!'lYa`
kGQII+l2ED4Z`Hm[rMZbqPMafVb"f8cSTc(mj6)j2cDQm@h-&QC`*I-!-Mb)*%dB
S*q,$(NMAV--MFY2M'#b0`+`FA'+-c+2!6HjA`Q"*q0"G[8cBQqGcB%CeM!86"*!
!$PN03Heb)+M$c2I1h$*b)i+k&aYGQ&J`*T'Z*5*h"5S#Lk1kD+[%4GY9&ff[S)3
*K'L+1,P*JBF1M5B'-5Fm063Re&4b-HZ[,("RPaQmreTGCNZ`24Ppdpa-baV9T0T
E@LZ-#5+8'0CbJ)EVMc(eMAm-PIIT*JFkE$Q6TbIf2TU'"a"!Q$Uh&A'E3e2%@+L
*f$La3LH$YQZ'VmI2(r%aDYJ4-19UJEfS[M[NkX08i@iY3SN@BDAkiULfU8VeYEN
LP"5J9-ZSQ9XkER3P283!pKqjDM"20iNeGhh@Q+I*4k)6H49d`0iId#K0K"*2RCU
r)Nq&Iai,$Ih4P[j*cH##j$D$DkT"i$%-K3kS+24Sf0`4CUM$"BmEU&$3Ca@a@#N
JM-QNHX#d6@-[R3Z+[9K"L8J+5K)&Ied#CbjBD[IeaC1`I"+4b'[L,1fYMU90Y6D
@FN6q,V%d1AKF`*e#TFV8Uc!JkiJa*$CJ'C@jj5-k26$JQFaM*e'(8cjPf`JF24L
M)#N"Ve#f5i*@kDlY5!UT3m98LXGKI'PdbY08330r&fJ+,-P!%@mLCV)L(P1,11p
SC8NRA3XK1[JLPRq%)HS*-NfX&[-VY3hE-[dYbHdQ,HibeF$-U'*1XbY06R12""Q
+A2X9F@qH,j6GCQ%'h'E"!q!f1HMY8&$rmIi-Z-hUSI$-Dmfkc4V&EBl09YfQ'Y3
S2%518kfiReEM1XGQ`(9D8APfT4)(A!GjZ02CHEj,"AbXl$clQ22XCmkcSalRb5Y
!KrZm`5Rdd,ccV)F!LZ)m9CC8-P6km"#k6eAdfl)$I9(L3-GQf)%HG!)d(%bm`&R
-A'JrFk%GpEK3PE&0Y5TMdq*#Qm(TrbHid2T#0BYKE1F&[dP0B$K4C"PIYJiX@Fb
BN9@fMJGN#04Q3Bd0NP5)V,)ADAV+fld)cLcQ*RQ+*6jdX@0EE-HBdCiAD"YQ(LS
er@3$,GMY"#5VRIm)'i*XX%FR'liSJ5QJ)RAT(`J`dPM*TrHYAQibKXbHL2pq-Sa
0i8GkL3Nfr1""PX5K'"[jfUTLLqlKNrZrPA9bEp"Gr3Tjf-*1&`TK4R[K10X5@dZ
QT(5mdU8'Q)EQLTl5*6hkKZIThkMRjjIAR2jEFd6,2V9SfB'Ki!eXkJd2"ee+DF5
m2RGq#RNV635Qrl`cpdIpr"YQ"5AVC-0H@d!4#qK#d'hU`PY6NC!!(X'bT!XCd!M
*$"8HMB,`@-![JaZ)S&%#I[ZaI82UbGVSDkKQFlkdj#c"9h`*2e5A80[BN[%e%,T
-9m+1C,62[ZLA+AfAZY61N4`Y'1k2ZDM$&@&QbrMEkpiekCTa1RAC6$+caFaRi8p
H'6eB6%[M&C-*j&Q8'P(9cXL@Sp+b*H,@c@m*Ba9NZS-K(%+HE8mX5bQb4`,QGX-
6bi,hL#HXh#c&h4"h,6-P@"X9Re,Trc9R!f`U#JmX@TE5M36TYPF15NaL6))E0#a
DjKd+EQ3Sb`ejR--fY5IVkQc"pQ*SQqT0P6ID6CH*F0JBP#)cCd9GIlqZ8A)'*3l
"05DCG!!A,Fd-MUQ$UGXmSM8c0%Nkp#!F1AAB8226&3kF$[b'%SL`B3if$0Z2d"G
pQZ%LAK95DVXpV!ih2)1AP',bmfBf%f89$M3cc#j4Y*r5PTXC,-L$`bDAbfAISlh
THMU0"`4A[f6SJ203GSN-XlS3#$EcT#f0QkRLIXrr6T5U99'RK`AiEiMhP0q0JNr
"bDUal-DKkAF"RG#0qMUk#"e`[SYTHRAR)`MA('1Sdbi0I5Zb8mRN36A&[1"`ZQU
U46(c1)Qf5j5Mqm2KSc3P(PTb)8K6j%[L!92&V*56%8EZfTe0--VlfjbkY&"E"lU
S1CH6ZmQ%CX`brJpe5%$V4hG46TXj4-9jATSF5#U9$5U"'GPX6IfE4A-Ga6EE4je
EED9N&-1Tda'[4EcZlY#YXIZQR0FqUdLaRmq*(kQCJf88ZRE5Dc,$Li(fkSfRX-j
*$&P+8cXMV$1QHqPLh#4kbZe*3#d1XLc!JKZ[b2c2(cEEZLZ8bCe(L(lK38*16X5
QJLR(d15M"EDS#PMe$92ShkJTmmTV+MTL5$q$bBXqEA06LZ0m6XIemH[p1PHSaUE
3N@S9)Q@@+-U%lq-+'53+FF#rR4VZfZEeS9S)-EIVK9kU+fGT*Eaj2,`+#(fVV41
,42p*@NVb#piP&`QT'!!kDdHP58bUXaM@k8RQ45CZRT!!RN40M#ZXLTLC"IdbEH(
-62b2iJ)Fc!8F`0DmN!"ET6Zh,h!I$GB'k`"*9D0)F@&V+p)Xc%NG6"G3M+JQ0V(
ZaM#QR)r'KE&k!8b'RBbMiQ*'F6-5GX1i&)6%e+JmNEa+QFlZ8FfCQUmjZDj$EeV
8@meh5K'JcR5NP#V!krfjbU6T6'E3bd('kTT"Cqi`(L22lT-apYR[bV1@XEMU3bj
Uh2TN1LfXTE&10F4d@$&R0jdcR5@p-R6mUPEYpS8"chd-84N!RYX(eU,6GV8Ki&A
-N!!aSiEh4j3*fD*LA%Yd`Yhm,*&4KmcM%)&RjHDDl6$j1d,G!XT8Ha!1MhJdrC'
G@YKD%3q$3!2aMXVA%c0c6q8eq5YPXc8rP0UUAG$VGPm0TT+QTXB8pq&dG5%,E#c
!@eT(D1YKe@J0L+,*JAH)N!"36%'qcBN6Qp&5%&c,L*cb*c&5D"PHr&Ujq69ZIUA
Fr!Sh2e&ZIS+Efj5Efh#c9,PCLT[jbXemh&bRh&b(QlR+c9cFr&Ljq6&ZEP"ZEX$
06FV06I*&UeTKSi%)9T!!Q(F)CI28&mmp6N-ZRbaSV'Y46&5q@ME2I`NrkaX2jZ&
(R&ffIM@!Lip@L!"cB9SC,f[CG-,`*YaXp"@*@@8E"bGdiNC&N!$RQ!1Y#,CQYQL
bf!e-i!B)h%!#bf`#0p6HLjmU*UU+LDTkI3b*Z1Kf5i5SKGm8-k2i`c3b&3[(153
Hk*9aMhH1GdlRbd4#QUTJL0c"1j-dl8!fIi%$ZUR53'N+2p9(Nc$kqQmmC(""G3)
[G3)"pX,je+,3A%PYNC2`'"V5*9`JiM8JBiXqQUEc)4hMkF6aUjA[cl6'5LkRl%X
Ji3@hNmZD8JUYX8@rp"0bkKJfUH4bX%D-6EKFjd8KGJ`IiGXIf!4$DNcN)k6'D)3
*@#IEhk`42GiKeG688haC$9F+f*0Q)e#Y5M)h,F(dllqC+4jIZL34-(hY0a21iB)
+A(6La)m0cjf+GrPkaDeRB1S130CHPJ,K1"-L`maie"0cX(8AEIhr"a2PmXh2+1R
A9C5BF`D$m!(eaC!!B8*FfrbDTUH'(pR+M*mbjh1+,c)pXeCG)-abAE!UM8pGjI*
58q(T8P2ip"-!k6N66paNH'l1#pIj`r(A03FHp-kCR4#-b`2!kGfCbCD+(c`k-0c
0#D!TI+-VYC+Yb&@DFS!8pVYa8G@H6Fcd94ZDJ2$T8Ma'I&fd15',jIrS'Pj2F1P
dHlGC(de#*qFTV*A@[!TBXD$Tq8VVAFXU6)@'#T9SL'Z*icmH"CC-0k!,%jFTM+P
IG@M$f-43-8`X)0HSS#%Ur3K)[+3*($Nj!Q3c3q9@hm#j[D3Q*8cG#CGfMKMZ`3Z
j@r)THC%0T[4-f`,e#&-rE#Me2jei"*9HD$MV#i[(A)2aBppEEVVq0c00PF6qq@H
AQjYQiZZCrU,@bLfPmmkHU3L-CJ5Rpk0IS!-99@*M[*@D(EM61dr3*Hk3!%jal-5
I)hB'-XJ,b3V@qB*ZA%C""Ul$%I@bH+MLQ4eDcr(V$+E#a%6$@Am)LcJlrc*IN!$
Kp'QqP2#Cdj(4l&%(dVi3S46Dm'Nma,-ABP(@0i!BFrf&RE1LS35@*%CE8Qf`YF@
''*jA2qR'P2fX6lTl*SL2hAP-#pq0'h3EidGmrSjMRh5lLZLRjrQlMh'6B"95*,j
!+[AXeF)[r0*I12-A#mGrdZd2d`(a4TrH-j1,T'6rcTRL-Hj%bYh1k%QK2lVJE&+
6TYRrYV$*D,aGFc5"EY05NR#KTabk�cc@d)Ja8T59i4Q,9M+2,d([l`BET)VXU
KQUGmLVD!XYIF"Fj1SCmf3kArB(l6FR-maq3Y-DF8A[@+Xm')*&,ETB3L2ab,T*T
!iVMLb!D43+dAf$CH"d$UJKIKR$Xm1$3#eaCH41V28ip,PYXP2BB1rq2HFT@)qCl
5TU*$[Diabhhe*$@kMHN0NJ@$aBr0i38*Pdq5(E1TN!$5c!e0##"hFFG0Pim&)MA
pe+bDbkHJVF+J68T!YTmF*prmij4J2G[ciShT1)ic40E5&2!fDT`Hl&PU5!61H2&
P9fi6ARIh-,@2K"(M"GR3USP(mZK5Z4I2rqIkbh5$Lq@G6Xf&XeeLR31J*'ce(*T
(EdACaH!UfU,-R$)Jh5"8`9m(eeMRd-,V((`+LfAmCbZ@'R,,!4aj`9)i30@*60k
9f9UGSq[Z[DVYJ1+ZF1kT%+QXEjjF-!BQ4*h%aJ1jjGD!Ci)INf0rm#CpjIj3JJL
jZ0bZjlRb$Yd`3A@(9Je!@j'i3r3LZ90hX5EB@2QBZ@l-EDH(08c(F`"jlL+3!)T
AS'Y+r"332C,)YJ,%42SU%S4cbp@Qm'2R#[9RYJC6R+XdNPm4"bP#B-0cTr+VBb9
ep(0JNlK62)9N%Yd[*V)4CU$T+NTUYQXU&4%SZ!*ZD'IR""@Nr(Tqj#UfQ''D1+8
caPK01f&Q3!rD93$Tj)a%J&)*e4I%4PX3if)@Nkdj&a+BVpm$"Kpr$P9VQ)$%r*!
!c0)hL+9)pGpCBLkB#SDb*UIJ3k46+QQrVUQjFV'Sm0F&Ja+3!!VXDZrINf-`31N
9!Cr5VE6p,0b$"mAqK1F1EDT2DFC5fl(XJi9lTlq##c6Xe3aJA4%QL(9J#,R"%f+
4Ijd+6-d"M-mb6D'0c4@bkT&ZD&FfV14TV&H0Y#N%VEHCiS8SEVY+&N@ZR4U[(VZ
BNhHD8LVD*U)6T9#lfCr8p5R5YahXYXJIaZh0SHIj-2r2P"!4m"mc-eTicF'*`TN
''qS4AF4%hkb)[TQ*,R)@rAfEk*E'I)*CfLQ--QX*r)K)AV9U%F-UED38LDai&8%
J&L+HG&1,DR+MImFIV,1aM8eICBa+U66PN!!j8$+-J$4bL%+),)##4!rG`f5qGmm
J3$46BBQC6GNL-XhU)H-B6$'4EK&F%@1Z(ZU``V5B##j'(p11q1fU',E4Q`"00E8
+RL3+l@4+e)949aH5hE[MZLrlh&E0'PAF,T!!5INA+Y"#D@Qdd',,De1A*bZ1j&Z
jq9043Pf4R'M+#&85di&+FYJ368NX@@a(3('0(Y&Jl"FAV)8KMDQQAX"XiAYe-MA
RYl-*E$H6#(CJPLP@BXlUXiIcY$rSZ'EcKX)1c!M36hF3'8)T4UL%IP4Rl!Xc!RR
YqN3aar8K(k64*IjeIZ%!VN5`R4QA!)')j(#V2di,m$YX@lVXr#Klj9!@BDFZ4@R
(VjVBHXVYKL9@0a(cQP191+!FUANKDMGPRD*f'$mk-hqLXi$Ndk43ZJL&V1cL-eC
C$4FcMFa%ZN6q%)Vpi8*K6'A(-aff)F5+@cCT&r5*5&0hX05[#fUeAEa5Lb@RjPX
ZZpLPiAfUTZ0beB8p6BUKK`LKXTmC4UbpR9HI2i"8MGlP9'dhaLR)h`X!Z-N(N`!
dLC'V,%rI42S!+R+qV)jS+dUj3e`J[k3dT4ENUrjaTL4#MKTPb''P#jl3(FRmSPq
891kYa',I9#F46dXVc`kfU!)(0&PN2p,pG9-4UiMk""Da"bHQ!JeJKGJ*$H"Ni54
Hr8Vdd`@p3FVMXBmc%*HQ)N0l$Sq3!)d`LDR`$Z%VdG9Pq@pd@DBl!Q99&"ci5Vb
D3mkA&Ic8E8%&AQK8TjJc)TbP8'B@H-aX%bYGq)@lm@(U&Q60V'C0Q)&JNe93J+T
$,Vl8mfq6@jhJESQiIFlL[%0Ff%YZ0mZ-F9iN0dIrNYS%1AfTZJNd-S6iASQ6),"
58"ZNZ-EFe-l"#EJ@qACUmMSR`lQ&BI"`L(9-G+Y0)T!!P5j'CCXFc`VS46rEAF[
R,S[mE)28d65G[4Sh9DBk*48er4b0hj3L,(AqD,'J3qTZT!-1QlRcciIN4I`!"(V
C4Fq8VI-i8+ddrqN&P("I$cSUlJT12m)48blSIZDG*H4j1e4FRSQ0MYPcmM5*!MN
&5Cj(Y*XabITZS&i#B[[D(X'#dGb+MfJ4P`L#,e(k)!$`4l4*mmYCiaX,NL'J`X2
Qb@BaKiH*r#h"G$93T`*9HmHbd*EbRD4,4VFah-CJUJT-89HASHAd1$21Ebh'MJ%
*1q5$fKVH32[E1[($$q`G'pGZ3N-(-pZ&p+@[cVQ#[c$lA(`lL@23@8T,c,q,!E&
S#&1+3""0+S'J9*fchY92AdjS!TULq`+6a#KC+$+""lZX8X4`*I&EaB&f!X$Y"8!
j3SdbKCd$C"#JDh!QFjTfAeX8eHcNd0QPbj6U9J&+X*rQT0[BEjGfA+5IjpA!ad3
E8YZK"V![CJ@cF1N9@r#&)3q#[h3CGKMf-SNJGd"dQ@)G0qkmI#XZ2c$YXRJXp,b
p+Hqbrai!$J0L,#"d#MfaPXMUef(b0IDAF[2TLqD1m*SR4ili*SR(FTmAQp,q!l(
,hYTpDm9'1PiN[lc(&0YLCQ30hlc#IirD"3ChM25FG)3LXK3eb,NDjm'jEP4F(`,
0QBeZd!ff`#D4@lrITi#k$HmdZ"AiA`8FhpbY#+F[*H#l61kM5Fp+-L@9d"rK!+E
%+0AG-[iVr&%YRS1TiS6AP,2)i#[XR-NHLXJ&-G#$#[`!hADqc%2"-%dE'ja-J*C
DZCI45G!3P&bkL&d`Ja@JEE,,c+DATRl3HNHUG*BZpKiq,VRf%h$Ab2lB"B9@l5I
D%B!@SRE%08"IT0ZG[V"VC)6"i8UU`ap"SFl)#rCP2f8k1!2Qe"&bAhQeA5'X8qQ
CDkL!9"-5Q2$h3k(cjAmU&`j2qIkT,bpE`Q[TVk@fUUTU#6iXlUpp6@J4QLalGYj
XHGEbd1GI#J&mP$iccG,acq[(#BZ&abdE,'lK"FXU`6pqHBN`LelrJr"r1fqfr&l
ia,+B[EEd[LLmp&GKjPph,2VGkLR2[2cD-jerIUSckD@Qbm)h"GmERd`*Z1%00+h
$mZADYF*rV9elG2cAKDD[#qHr,T6qXr$`pbmh#8ppA6KJ'ErMJ2"IPY%llV@mq2N
h[K,qqqIM2KAqM-mGRqeb@'*Eha%HHi-ZJ+[pUd$V,VKSZCl,%`i,JDSU)B[p'2(
G4jBpRGH%mjBI#'p2&LjErZ%rPPYQ6"Bqr&Ki4rKmJ[$L*q-X-6a-q,aFZ"hUIN[
ihEMRK5R#`Xp06`Q@'F+b*`Aha5H%P)q&mm,C#F,VJQ@FjFl2'i4A2ppVDIrm6m)
[K$)FQ#AmbqF&6`RIR#'Xj`H#-fBYR$(6FTH`82Mj0#&[K[#"F(5'F%,ipM4KmM3
KHiD3!#X%CJL$H2'Pm-%chbm4GJU@V5rpcT+(CH@@[b(XHZPIThaj8AMLYjD*FbU
%`&p@VKD%D49#f5SKm%EjbSXIchP9Q,AZjGm,"9m+U60+KD&j3UMLVmpIr0DTXPR
MK+&biHPAT`Rr85SX"J#3!aJ!!#(i!!"6-!#3!`J!N!-J!!!r2!!(UI!!N!-+@-!
!AF!!!&h!!*!$'Qi!N!-"GJ"1F8U$CL*"l3!J)$`r2!!!)MbTm!!"5N&Q"%T!C`T
)3%K"))!K33!%3UG"q[r1d2`"!#m),c`!!"PZ,`0K!!+X9)pR3%)i#Pj#Tbmm4%&
836mm"0@S(h!"%F!+ANUICaK1F6!mUA#R4N2k!#SLL%(k!#!`2+P`TNG+JfF%F!&
1G8lY!#*1F8U$CJ+Tp(!!6R9J"J#3"3&1F4mkrrC+(fB551IJi%(krqT3d%kk"Dj
-h`F(,cVrhNjeB(*"6%&%4%008!!$!*!d8(*"E8MRB2"d8*r#,dJ!)#"2)P3aD3!
8!"JK3!!N-A`!!3!XdT%K33!ZS!,I`NcI$`C1G8Si#PjR$#!U!!KR$#"!)""R"Lm
kri41G8MR(`C"q[qHF!`L+J!%`VJ$'Q'NCJ!"2NKkrij1ZJGZ@%q`H[pDCJ!"$U%
D,JJ)+J"!!!4R"L"i!UDJ'b`U!!3U+J!)'#S!"*I8PG3J1[p@S4ir1!)JCJ!!l&4
2,%JJ1[p%)JE#Z!-D@%&K!2p-)$Vr2-#i!aT"q[mi))"+K@B%S5*J"#"&S#GQ!!#
d+NJJ$P#!3IVr###!)$Vr#P'!3IVr!##!3QG)HJ#m,a9)H[m#,cVqiLmkrZ)[1[l
+,cVqbLmkrXTK!!e1-"pR)$m!5S9R##"0S#UJ+f!%)%fJ)b"1S"mJ4k!E-Gm#)'"
J)%kJ(b"(S"Yb!")%j`RM'H34!!%!)!)"!1!J6D"T!J!!(i!")%fJDYA8ep4"q[j
f5T!!C`K`!D#BF!1JQ#"0*8J!#(!!60pJq%je60pJq'!!rVir!#"1S"mJ4k!E-Gm
#)0A8ep3`1!)J-F!+B*()*8J!#%cIB2K1G8j@!!")j`!i+'i!$%IkrLT&q[iU)"5
`NQd%)")SJ%U!Ea)J8b*Z!!LL,L!8dC14NR!!B!3`22rC60mF!%jH6R919[r)51F
H1#BZ!!JS,J!-+'i!%%(krESY52r83Llrb+%D,8Mrc&92U"``(cS!$%8!!'pF5'l
rl$!&8d8r!+J298m[,[rXU!d`(c`!$%B!!'rF3LHTQeP2,blrl$!'8dBr!+J1)"m
Y32r`FJ%I!DQE)'lrm%U3!'F398m[#+QQ-"p)`()%`)&Ra#mZrr#TSf#m%#i!&'F
+@8mZZ!+Q)&qJ'cmmS2a1ZJ5'9%mY32r35S"R!!'H,`"1ZJ2@@%p+!'F+F!%G3!!
@6[S#'%KZrq4)E[rJ5'lrf%kk"@T2l`!-)#lri+%H,8Mrh#!)C`!"C#!Zrq5K(Le
)rqJJ#'F!!93[,[rN,`K1ZJ@i8%mJ!fB!!+CC6bmm3dp%48*RU"mJ(be!rr"+J'F
!!)iJ3#*3FKM6`5m*6VS%Y&K2FJ1`3@Cf)!dJ3(!SdF!Y52rd)Qlrm#44F"M9`#e
+rrJ[#Nkk",TB6be!rr`JE[r`S#P35LCZrp3R5J!S@8m[,[r`6VS9c#!IFZM3J9'
!*d!!,&925(Vq-LmZrr4)E[rm,``["#mZrp`[,[rJ,blrk%kk#XC86bmZrr#TSb4
Zrp3PE[r3!!`PE[rF!"!PE[rJ!"3PE[rS!"Jr2+'B6VS$9P42*N!r2+LI6VS$5P4
2)J!J#l#"CJ4`!'!#F!%J!#9!!"`P4!!J*8`!*%Kkqm`r2+$m2cbJr%kk![K86am
!6VS98MmmSCK1ZJ--9%p+J'F%F!'JQ#"m!!!"@M!35-$JJ()'X)&Q$%(k!+iLI!!
!!c`LL"em!!(rb#"ZrmbJ'e92U"``(cS!$%8!!'pd5'lrl$!&8d8r!+J298m[,[r
XU!d`(c`!$%B!!'rF3LHTQeP2,blrl$!'8dBr!+J1)"mY32r`FJ%I!DQE98m[,[r
`UDB`(dM!FJ6!J@F),blrm+QLB-)NE[r`5T*R%&92,`UTTM!I5-"b"-#"CkS[#UQ
MB+33,[r)(8!!&NcI((K1AL"I6qm!$Nl36PErr%MR!$"#,[rm2cbJr%kk!La86b4
!5S"RA#m!6VS"J&K25J"R8#!+*N!J3#mS!!`r2+$m2cbJr%kk!Gj86am!6VS81#"
,)'J!%+!I)%XJD!!BS"mJI!!!!9S`%%M!i)"b"V#"CJT`!#"m!!!$2##!(A`!!Ir
m%#lrr%cI$!"1ANje6PErk%MR(cKC6kPe)"mU!%KZrqLSG#!0)%!J%(+'d)%Y32r
m)%"F5%2Zrq`Lf#,B@8m[2%4"9%%r2!69UD!J(bK!)%!N8$)U!!L5DJ!%2!%d+J!
'P'S!!Mi#0LlrmNM$1#lrlNM%PS3i!8M%PS4U!P+$iS-p3rrf0Llrm%M$1#lrl%M
%PS3i!NM%PS4U!P+$iS-p3rrd0LlrpYC"282rqM)Zrr653Me"rrKC6d+R5'lrp%K
k!'Cb!4m"FJ%r!A,r,`&#*d+RU4-J(bC!,`#SF`D&!*!$H#m-)%Y`%0(!,`LSpPP
2UA8J(l#&C!*Jp&92UA33(fB#B2C`rcm!3QFJ(k!b,`ZT&#m-UD-[,[rSU(0-hac
i6Pj1G3!#!!"19J!!51F!-#4Z!!JJ#LC!)%!L+!!#$)&"6%&%CKBL+!!'$)&%3de
3CJS`+!!+FJ1`3@F%F!"J!R!"60m-!%jH6R8[#PP22cbSER!"(`"1ZK*i)&mN5&P
22cbUER!"(`"1ZK*Q)PmJ5V(*CJB`2!)!B!3`2!3!*&p1G8j@!!![!cBZ!!J`!dM
!!S!!!!J!5S"["(!"B!*`!#BI6Pj1G8j@rra)ja`!0Li!#$m$6VVrc&42(8$rr()
"X!&Q%!*$"rp1Z[q!X%0Z"(!!B#KC6cmmU*p`!4m!6VS4m#!I+J"C6cm$(blrr%k
k%H!J(bJ!X)9Q!R!!60m!1%jH6R919J!!51FB-$JZ!!JNEJ!+)%SJ%#C!)%!b%!a
"384Q+$)S!!)-3805CKif"(,rYN&R'L!S!!4b'1+S!S!!N!2r-J0)`E#"C`4`!'!
#F!%G3!!160m-'%jH)&pF6dl36PB!!&925'i!#($r2`"1Z[q5%"pR%L"Z!!JJ+!!
%FKMLU!*!!2pJ!R$r6Pj1G8j@!!"96dKZ!!K`rcm!6VVrC"!ICa!JEJ!))#J!"!+
!!2q3!f!#F2p1ANje6PB!!%MR'$JQEJ!)+'i!$#",-,`$!A!!*%`NJ#Bm!!!"*0H
5"T)!!!*)"T)!N!-J+$`!N!1!fC,CNLJm!!!%N!$CNYH5fC)'NJ#3!h`'NJ!!J!"
`!#4Z!"!NJ!D5!*!$*!D5!*!$)!D5!*!$5!D5!*!$2N*!60mF'%jH6R919[rN51F
I1#CZ!!JU,J!-)!XS3#e!rqK`*0R!,8crl(!JfF!Y62r`F%MC`#e-rr4`2YR!)!b
3!)Z`K@-'F'91qJ#b3N!q!%*!28$rj$B(F#5f3'4)F!5f3'3%F!"J$(!!-!0CJ'S
#9S$NJ(J!1!-Y42rif+lrk#4%&)!J,[rid)$3V[r`)%!`V[rNF!%8%R)!%J,MB0&
Zrq454f#`3N!q!(!"2!!f"h!IYN"N4(!"YN"N"(!!B!a`!$!$8i"U!P+!iS"i!$J
$,86rr0LZrq`N4"5!)#lrr0#!d+lrp#"!-)C`!435FJ!5!Z0Jh%"54f#d3N"-hac
i6Pj1G8j@rr")jami*'i!##CZ!!`k,J!3+'i!%N*!2!!b"A!!-!(3J$3'FJ!b!V#
"Ea4#3$3'FJ!b!Y+"dS`J36#!8NCJfN*!2!"`!Me!rr)f"VC&C!!!Z%*!2J"#3$e
!rr"`!$!$jB$3LL"!)"!Y32rd-JC`!$!"d)XJ3"J3GJ!@",C(B`!!JM!ZrrCb!F"
"d@lrm(!!-!06J$3(FJ!b!V#"Ecii,[r`GJ!f"#e$rrc@JpD-)%0+8'B5)#lrr0#
!d)`J3$#Zrr*8E[rb-Llrm(!!-!(3J0#-)%!`%$e!rr"J&M!&d%$34M3Zrr"b!$)
#dS(5M#""-)"54b!Zrr6LL#e!rr4J!2pX8NCJ!2p%60mFq%jH6R919[rm51FF-#4
Z!!Jf,J!-*Qi!$M)$F!!`!HD!1!!`!h)(`%%k!(!!,8$rr$3%FJ!b!Y++)%%5%(!
!%!%d"A)!-J,LS()"`)(4V[rm)Llrr11*dSXJ36)3F!!`!5e!rra546!&FJL`3@B
'3N!k!&*%-Li!%R!!-!(3J,#ZrraM!Q#U%#lrra)Z!"25!C!!!8cI$$K1ANje6PE
rr%MR(b!NEJ!)1#i!$$SZ!!ib"(!!-!(QJ$`!-J4d"m*#2J&f!$B!eSSJ3a!3G!!
8!#e#rra`!$!"0!9b!$)#d)(QJ()#X)&R$()"X)&R)%U!Cc4J-M3'FJ!b!P5"dSS
J34)3F!!3!A)3ikL"V[rm0!Cb!$)#8S(5LL""%K"`!"!"iBL"V[rm)#lrr$3(FJ!
b!Z+S,8$rr($rFL!f"A3!0!15JZ+S`'lrrNcI"2K1ANje6PErf%MR(cJQEJ!)+'i
!$L!m!!!"*0'Z!")J2!!!!NM4VJ!5)#i!%Le!rqab)01Z!")L,J!5,8(rm#3m!*!
$J0@Z!")N,J!5,8,rp#4,'"*f!"B%,82rq1D$HJI'49*$282rh#BZrrMLJhS$aN9
83ce$rqCf!6SZrqEVBce$rqKq3-J(I!!F"$e'rq*i!HYN8d3p42rJ+Llrq(i"bSG
R#(S!1J46K@!#H[mp4IrHH!Jp42rN5NCR4LmZ!")[!$m$8NS[#NkkrcT2l`!1jd$
4E[rN,bi!%LmZrr!r!bmZrqa1ZJX)6qm!$LmZrr3r!bmZrq`[,[r`6VVmV%r[!!j
#3$e!rpJ`,[rBX'i!$'3!!6S`,[rLCcSN3$mZrqJ[,[rd2blrj#m,6VVpMNr[!!`
5!#!+F!!3!6e!rpTd!$3!e+lrl#"#%""b!")!dflrj'!F2blrjMmZrq3[#dkkrI"
36ce!rpS`,[rQd@lrj$!ZrpU`E[rHCKBb,[rB8Qlrf(!!-!(3M#"!3K"J!2pk-#l
rfV"Zrq"Q!!#8-#lriQFk*%!r,[rS,blrp$mZrq3[#dkkr3C2l`!-%J!J#R!!%!%
p32rDG!!d!05Zrq`J3K!3FJ!5!00Zrq4J($mZrqBr,[rN,`Y1Z[eS8%mp32rD-#l
rjY&Zrq4@E[rD-#lrfP0ZrpT+3'F!r`!i,[rBGJ!f"#e$rra6JpD-)%-3%#)Zrrc
5M#""%)"5E[rBB-i3,[rGd#lrfc3ZrpK5E[rBFJ!b!Y+-)%%3J'!!rVib,[rNF!!
`!9k!jS"-haci6Pj1G8j@ria)jami*Qi!##SZ!!`SEJ!3,#i!&#e,rmK`*0I!,8[
ri(!Jem!Y5rr-F%MA`#e,rq3Y62q8*M`!!!%NeklrP#!m!!!#50'Zrj4`)0'Zrj3
S2!#3!i$CV[q8fDlrP#eZrj6rY#Jm!!!%N!$CV[q8,@lrP2qieklrP#eZrj6r[0Q
Zrj3YE[q8rp4`I0'Zrj3YE[q8rk3J2!!!J!$4V[q8)#lrP*!!M,#&B`T`C6e!!#K
1qJCkF!!Z!%*!28$rM#4Zrk69r!!!J!!Y5[qS,@lrT2q3!#em!!#!!2rS5'lrk#m
Zrk3JEJ!N6T!!8%mJ,[rSCJT`Cce!!#K1qJBd*'lrN!"55VAZrkKMD#"Zrj!!8NL
4l[qS,8Mrp#"Zrj!!NHlrT#e)rr!JE[qSNHlrN!!Y52rX)!KR$L"Zrj!!)QlrT#!
ZrqbL,L4Zrk69l[rX,8VrN!")E[r`,blrT#"Z!#41N!"36b!Zrr#`V[rdC!T`Cce
!!#K1qJA!)'lrN!"5V[q3!"!3(8$rS()!%J$5390"28(rd$!Zrp$33$e!rp)JEJ!
F)"$3VJ!J,8$rX#4!,``[,[qi2c`"*#mZrj!!6VVlmNr[!!ib!#!+F!!`!G'Zrj!
!,``[,[qd2c`"*#mZrlK1ZJHk6qm!$LmZrl`r2!%N,blrZ#mZrl41Z[PF6qm!$L4
!,``[,[qi2blrd#mZrj!!6VVlS%r[!!ib!#!+F!!`!G'Zrj!!,``[,[qd2blrd#m
ZrlK1ZJGS6qm!$LmZrp3r,[r3,blrZ#mZrl41Z[N+6qm!$R!!,J"#3$e!ri`YEJ!
Jrk`JE[qXXHlrX'3!"+K#3$e!rjJ-EJ*)rjKN!!$#-#lrM'B!!)`NE[q3!&*+YHl
rU'0S)'lrN!"55*(ZrkJY52rd)'lrN!#4l[qN,8Mrm#"ZrkL4l[q3!#e)rq`J#'F
1)'lrN!!LE[qN)#lrl+)Z*'lrT0AZrq`Y5[q3!%KZrr![,[qN)'i!*%k3!&"2)#l
rm,#Zrr4N#R"R28!!+%lk"%)JE[q3!&+Zrj!!%K"`!"!",J"`#$e!ri``"h)"`%(
4E[qB-LlrQ(!!-!(3J0#Zrl`J3$!328$rQ#!(iSJZ!&0ZriaJ!2mi"'i#52qB$'i
"!2qBC"!JE[qX8UlrV"#ZrjPJ!2m)"'i"!2qB1#lrQ(B!0J3Y3rrieS2@V[r-)%-
`%$e!rjSL,[ridUlrb#""%K"`!"!"28$rR%T!C`!!`JaZ!"MrM')!!*JNE[q3!&*
+YHlrU'0S)'lrN!"55*(ZrkJY52rd)'lrN!#4l[qN,8Mrm#"ZrkL4l[q3!#e)rq`
J#'F1)'lrN!!LE[qN)#lrl+)Z*'lrT0AZrq`Y5[q3!%KZrr![,[qN)'i!*%k3!&"
2)#lrm,#Zrr4N#R"R28!!+%lk!bJJE[q3!&+Zrj!!%K"`!"!"0#lrM()!-J,MU)k
!8'lrM'!!rf*`rh)J1#lrR(B!0J55Jq+S`%I4E[qD)!IQU#i!Q@lrM%*!28$rQ$!
ZrjL`E[r5C!!!`M!ZriaQ!!#-*'lrN!"55VAZrkKMD#"Zrj!!8NL4l[qS,8Mrp#"
Zrj!!NHlrT#e)rr!JE[qSNHlrN!!Y52rX)!KR$L"Zrj!!)QlrT#!ZrqbL,L4Zrk6
9l[rX,8VrN!")E[r`,blrT#"Z!#41N!"36b!Zrr#`V[rdC!T`Cce!!#K1qJ*B)'l
rN!"5V[q3!")3F!!3!5i!F!Jp32q--!Gb!F""d@lrQ$)ZrjK`!$!"d)$3V[r8)%!
`%$e!rjJJ"q+),J"6E[q-B!$r0M!Zrp+4E[qB1#lrQ(B!0J3Y3rrmeS2@V[rN)%-
`%$e!rjiL,[rmdUlri#""%K"`!"!"28$rR%T!C`!!`JaZ!"MrM')!!*JNE[q3!&*
+YHlrU'0S)'lrN!"55*(ZrkJY52rd)'lrN!#4l[qN,8Mrm#"ZrkL4l[q3!#e)rq`
J#'F1)'lrN!!LE[qN)#lrl+)Z*'lrT0AZrq`Y5[q3!%KZrr![,[qN)'i!*%k3!&"
2)#lrm,#Zrr4N#R"R28!!+%lk!9SJE[q3!&+Zrj!!%K"`!"!"0#lrM()!-J,MU)k
!8'lrM'!!rf*`rh)J1#lrR(B!0J55Jq+S`%I4E[qH)!IQU#i!Q@lrM#"Zrk`b,[q
HF!!`!C(!,8MrP,(Z!#"PB#"Zrj45V[q8%"!JE[qX8UlrV"#!)'lrP&+Zrj33%#"
Zrka5V[qX%)!JE[q88UlrP"!3)'lrV&+Zrk`3J$!ZrjT6E[qD5N"R!2[H)'lrP&+
Zrj33%#"Zrka5V[qX%)"Jh&CZrjSJEJ!BdFBb,[qHF!!`!5*Zrkb6lJ!JN!#*NF!
Y52q8-#lrQQFQ)'i!'0('XHlrP'-D)'lrP&+Zrj33%#"Zrka5V[qX%)"6E[qDB03
YEJ!Jrj3`,[qD8flrQNT!C`$lCL"Zrj45V[q8%"!JE[qX8UlrV"#!B0`JE[qXXHl
rX'F)F'Fp3!!SB"3JE[qXNHi!)#*Z!"`LL%*!28!!+%cI(2K1AL"I6qm!)%l3!(!
m!$iJ!!"i)$i`)#BQ)(JJ2$dc-J!!1N0[EA"bCA0cD@pZ1N4PBfpYF(*PFh0TEfi
`-c!a,Q-!!$`!2L!!!(JJ2M!J*LBJH#!m26-b!!!k3fpYF(*PFh0TEfik4'9MEfe
`FQ9cFfP[EM!c-$%ZB`!!6PErk%MR(cJq,J!)+'i!$$BZ!!T`!$!$1!Gb!$)%N!#
"FJ'`J@m!!E3p42rS282rkP*ZrqJ`,[rSX'i!#Q3FFJ!b!0+-)%%3%$3(FJ!b!Y+
-)%%5%,!"C!*JeP0ZrqS`,[rUX%GM(()!-J$5M#""%"!d"h)!-J,5M#""%K#`!@-
#B0J`,[rSX'lrkQ8#B()i,[rSGJ!f"#e$rr$@M#4$%K*`!"!"28$rl$SZrqTi!$J
&,86rp0L-*N33%a5!&Ulrl5!Zrr$3J0#Z!"!J3$!328$rl#)Zrr65JG+Z!"!J36)
3*#lrm05#e+i!%#"#-)%L,[rddS(5VJ!3)%%`J'!!rc)`,[rUX%GQ"P*(B!$r"$J
(GJ!f"#e$rrM@M#4$%K*`!"!"28$rl$`ZrqTk!$S',8Arr0U-*N83%a5!&Ulrl5!
ZrrM3J0#Z!"!J3$!328$rl#)Zrrc5JG+Z!"!J36)3*#lrq05#e+i!%#"#-)%L,[r
mdS(5VJ!3)%%`J#!Zrr`L,[riN!#"0#i!#R)!-J)N,[rm8S+5JV#"E"i[,J!3,``
r"Mm%6VVqA%r[!!``,[rU8N!q!'!!rP`[,J!3,``r,J!+-#lrkP*!2`"1Z[if6qm
!$$eZrqS!#Q!!rMK-haci6Pj1G8j@rq4)jami*'i!#$SZ!!`QEJ!1+'i!%Le-rr!
J2!!!!56C`#e-rr4#3$`!0JDf4@3XH!!i!be%rrMBLL"%%"!L,[ridUlrm#""%)!
J,[rid)$3V[rd)%!`Je*'B-i[,[rd,blrm$m&3QG1Z[fb6qm!$%*!2!!f"VC&C"*
`!$!$d+lrm#"!5K"Q"&*'B1K`!#e!rq3f"VC&C!!!U%T$Cc)J,[rNH!!i!be%rrc
BV[r`)%38%()!%J)Q,[rm8i2@V[r`)%-@%(3!&!15JZ1S,8$rj$3'FJ!b!Y+Zrr!
J34)3F!!3!6i!,@lrj2rXF!!Y32rS-!G64dT!Cb!J,[rSiiJL,[rXG!(#JS#",8$
rk#!ZrqcLL#e!rqaJf$3'FJ!b!Y+"dUlrp#""-K"`!$!"jB$3Lb"!)+lrk&*'8Ul
rj'!!re4-haci6Pj1G5*I)&qJ*5k!DJ*#Pdl4)Pm5(c!I5J&R"+G'B!+M4Lk)6Y%
LAa)I-"mJAdS"C`5Q4f!#SNG1d3#3!`S!1+!"!!8!N!B"!!!"SiS!!D++!!!&5e0
28P3([J#!!"`%FJ!@38a59!!+!,T"9A-b!!!"2N*14%`!!3&+3dj86!!!!@*$6d4
&!!F"EN4"9%%!!!(14%P86!!2!GT%6%p(!!3#QNC548B!"!,@4Q9KG!!!!a**3di
M!!3$(NP$6di!!!0D8%P$9!!%!fC3Ff9d!!!$SP0*@N8!!!1Z8e45)!!"!lT69&)
M!!!$dQ&eFh3!!32HBfPMEJ!!!rCNBh4L!!%%!Q4XChJ!!33DD@0X1!!!"$*fCA*
c!!%%2J#!rrmJ!*!)JIrr)!!!%!#3"B,rrb!!!#!!N!@&rrmN!!!`!8$8F!#'rrm
N!!"!!8$8G!#(rrmJ!!"3!*!&L2rr)!!!B!#3"!)!rrmJ!!"b!*!%!J(rrb!!!))
!N!3%!Irr)!!!NJ#3"!5[rrm!!"KB!*!((J!!''J!N!@!rrm!!"L-!*!%!3$rr`!
!'-3!N!3"#2rr)!!Bj!#3"[rr+!'(i!#3"3%!R4`!*Um"303i!!)!Ta`!X(`"303
`!!-!X4`!cCm")kkB!!3!Za`"#E%"!9Z)!!8!a4`"1ci"303X!!B!ca`"@r%"304
F!!Irr`!"L!S!N!ErrbJ!JH`!N!@!rrm!N!1L!*!&J[rr!!!"!*!'KIrr*!!"AJ&
!e(J!K[rr*!!"Y!&!e'J!Krrr!!!#03#3"BMrr`!!!S8!N!@errmJ!!0G!*!%!3A
rrb!!!mm!N!3""rrr)!!Br`#3"!%)rrmJ!"QJ!*!%!J$rr`!!"(`!N!3#!Irr!!!
%ZJ#3"!2SrrmJ!!8'!*!%"!(rrb!!"6)!N!3%5`!Y"!!D3`&!e'3%Vrrr!!!DN`#
3"!%&!!!J!!@b!*!%!3F!15!!'Y%!N!3"#!"+)!!Dl3#3"!2SrrmJ!!A8!*!%"%X
!CJ3!'`N"3'(J!)$rr`!!'b)!N!@"rrm!!"XY!*!&J[rr!!!E1!#3"B2rr`!!'d-
!N!@%rrm!!"Y1!*!'rrm!!D*m!*!&J2rr!!!E@3#3"B(rr`!!(&d!N!@#rrm!!"e
K!*!&Jrrr!!!HC3#3"B6rr`!!(fN!N!3%5rrr"!!JE3&!e&J!J[rr!!!&m!#3"!2
Srrm!!!F6!*!%"%crr`!!$L%!N!3%6Irr!!!2fJ#3"!41rrm!!"'6!*!&J2rr!!!
6)3#3"2q3"!!"Kr`!N!3#!!!()!!A@!#3"!)"!!iJ!"GS!*!&J2rr!!!AG!#3"h)
!!#$S!*!&K2rr!!!K3`#3"!4,rrm%!#&(!8$8B!%&rrm!!"Hd!*!%!3Mrr`!!)Qd
!N!3""3!A!!!Aj3#3"!%)!)%!!#+K!*!&K2rr!!!LU`#3"3(rrb!!&qm!N!8#rrm
J!"Jb!*!%"P0dBA4eF`C`FQpYF(3)a#"cG@CQDAJ'8h4KG(9c$NphEQ9b)(*PFfp
eFQ0P#dPZFf9bG#"%DA0V%%9iDA0dD@jR8'&cFhG[FQ3E4AKTFh4TEQG3BA0cGfp
bC#e"F("PBA*KEQ0P#dPZFf9bG#"%DA0V$NphEQ9b)(*PFfpeFQ0P'd9iDA0dD@j
R8'&cFhG[FQ3Y3A"`C@&bB@jMC3P6C@GYC@jd)$%*8f9RE@9ZG#!b#90PCfePER3
J-`P6C@GYC@jd)$8*8f9RE@9ZG#!f#90PCfePER3J0TmS:
|
Changes to macosx/Tcl.pbproj/jingham.pbxuser.
1 2 3 4 5 6 7 8 9 |
// !$*UTF8*$!
{
00E2F845016E82EB0ACA28DC = {
activeBuildStyle = 00E2F847016E82EB0ACA28DC;
activeTarget = F50DC359017027D801DC9062;
addToTargets = (
00E2F84C016E8B780ACA28DC,
);
breakpoints = (
| < | | > | | | 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 |
// !$*UTF8*$!
{
00E2F845016E82EB0ACA28DC = {
activeBuildStyle = 00E2F847016E82EB0ACA28DC;
activeTarget = F50DC359017027D801DC9062;
addToTargets = (
00E2F84C016E8B780ACA28DC,
);
breakpoints = (
);
intermediatesDirectory = /Volumes/CodeBits/jingham/Tcl/Build;
perUserDictionary = {
PBXWorkspaceConfiguration = {
ContentSize = "{876, 673}";
LeftSlideOut = {
ActiveTab = 0;
Frame = "{{0, 23}, {876, 650}}";
Split0 = {
ActiveTab = 3;
Frame = "{{243, 0}, {633, 650}}";
Split0 = {
Frame = "{{0, 319}, {633, 331}}";
};
SplitCount = 1;
Tab0 = {
Debugger = {
Frame = "{{0, 0}, {484, 208}}";
Split0 = {
Frame = "{{0, 25}, {484, 183}}";
|
| ︙ | ︙ | |||
51 52 53 54 55 56 57 |
Frame = "{{0, 0}, {484, 208}}";
LauncherConfigVersion = 3;
Runner = {
Frame = "{{0, 0}, {484, 208}}";
};
};
Tab2 = {
| | | | | | 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
Frame = "{{0, 0}, {484, 208}}";
LauncherConfigVersion = 3;
Runner = {
Frame = "{{0, 0}, {484, 208}}";
};
};
Tab2 = {
BuildMessageFrame = "{{0, 0}, {635, 0}}";
BuildTranscriptFrame = "{{0, 9}, {635, 260}}";
Frame = "{{0, 0}, {633, 267}}";
};
Tab3 = {
Frame = "{{0, 0}, {633, 295}}";
};
TabCount = 4;
};
SplitCount = 1;
Tab0 = {
Frame = "{{0, 0}, {219, 650}}";
};
|
| ︙ | ︙ | |||
90 91 92 93 94 95 96 |
Tab4 = {
Frame = "{{0, 0}, {250, 650}}";
};
TabCount = 5;
};
};
};
| | | 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
Tab4 = {
Frame = "{{0, 0}, {250, 650}}";
};
TabCount = 5;
};
};
};
productDirectory = /Volumes/CodeBits/jingham/Tcl/Products;
wantsIndex = 1;
wantsSCM = 1;
};
00E2F84B016E8A830ACA28DC = {
activeExec = 0;
customExecs = {
};
|
| ︙ | ︙ | |||
114 115 116 117 118 119 120 |
};
};
F50DC359017027D801DC9062 = {
activeExec = 0;
customExecs = {
};
};
| < < < < < < | 114 115 116 117 118 119 120 121 |
};
};
F50DC359017027D801DC9062 = {
activeExec = 0;
customExecs = {
};
};
}
|
Changes to macosx/Tcl.pbproj/project.pbxproj.
| ︙ | ︙ | |||
150 151 152 153 154 155 156 157 158 159 160 161 162 163 |
buildPhases = (
F50DC36A01703B7301DC9062,
F50DC367017033D701DC9062,
F50DC3680170344801DC9062,
00E2F84F016E92110ACA28DC,
00530A0D0173C8270ACA28DC,
00530A0E0173CC960ACA28DC,
F5F2500E016ED0E001DC9062,
F56570CE0172204201DC9062,
F59AE5E3017AC67A01DC9062,
);
buildSettings = {
DYLIB_COMPATIBILITY_VERSION = 8.4;
DYLIB_CURRENT_VERSION = 8.4;
| > | 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 |
buildPhases = (
F50DC36A01703B7301DC9062,
F50DC367017033D701DC9062,
F50DC3680170344801DC9062,
00E2F84F016E92110ACA28DC,
00530A0D0173C8270ACA28DC,
00530A0E0173CC960ACA28DC,
F5C1D51801B8730B01DC9062,
F5F2500E016ED0E001DC9062,
F56570CE0172204201DC9062,
F59AE5E3017AC67A01DC9062,
);
buildSettings = {
DYLIB_COMPATIBILITY_VERSION = 8.4;
DYLIB_CURRENT_VERSION = 8.4;
|
| ︙ | ︙ | |||
505 506 507 508 509 510 511 512 513 514 515 516 517 518 |
shellScript = "if test \"${STRIP_BY_HAND}\" = \"YES\"; then \n strip -x \"${SYMROOT}/${PRODUCT_NAME}.${WRAPPER_EXTENSION}/Versions/${FRAMEWORK_VERSION}/${PRODUCT_NAME}\"\nfi";
};
F5A1836F018242A501DC9062 = {
isa = PBXFileReference;
path = tclMacOSXBundle.c;
refType = 4;
};
F5C88655017D604601DC9062 = {
children = (
F5C88656017D604601DC9062,
F5C88657017D60C901DC9062,
F5C88658017D60C901DC9062,
);
isa = PBXGroup;
| > > > > > > > > > > > > > | 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 |
shellScript = "if test \"${STRIP_BY_HAND}\" = \"YES\"; then \n strip -x \"${SYMROOT}/${PRODUCT_NAME}.${WRAPPER_EXTENSION}/Versions/${FRAMEWORK_VERSION}/${PRODUCT_NAME}\"\nfi";
};
F5A1836F018242A501DC9062 = {
isa = PBXFileReference;
path = tclMacOSXBundle.c;
refType = 4;
};
F5C1D51801B8730B01DC9062 = {
buildActionMask = 2147483647;
files = (
);
generatedFileNames = (
);
isa = PBXShellScriptBuildPhase;
name = "Shell Script";
neededFileNames = (
);
shellPath = /bin/sh;
shellScript = "cp \"${OBJROOT}/libtclstub${FRAMEWORK_VERSION}.a\" \"${SYMROOT}/${PRODUCT_NAME}.${WRAPPER_EXTENSION}/Versions/${FRAMEWORK_VERSION}\"";
};
F5C88655017D604601DC9062 = {
children = (
F5C88656017D604601DC9062,
F5C88657017D60C901DC9062,
F5C88658017D60C901DC9062,
);
isa = PBXGroup;
|
| ︙ | ︙ | |||
1232 1233 1234 1235 1236 1237 1238 |
name = tclUnixFCmd.c;
path = ../unix/tclUnixFCmd.c;
refType = 2;
};
F5F24FDE016ECC0F01DC9062 = {
isa = PBXFileReference;
name = tclUnixFile.c;
| | | | | | | | | | 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 |
name = tclUnixFCmd.c;
path = ../unix/tclUnixFCmd.c;
refType = 2;
};
F5F24FDE016ECC0F01DC9062 = {
isa = PBXFileReference;
name = tclUnixFile.c;
path = ../unix/tclUnixFile.c;
refType = 2;
};
F5F24FDF016ECC0F01DC9062 = {
isa = PBXFileReference;
name = tclUnixInit.c;
path = ../unix/tclUnixInit.c;
refType = 2;
};
F5F24FE0016ECC0F01DC9062 = {
isa = PBXFileReference;
name = tclUnixNotfy.c;
path = ../unix/tclUnixNotfy.c;
refType = 2;
};
F5F24FE1016ECC0F01DC9062 = {
isa = PBXFileReference;
name = tclUnixPipe.c;
path = ../unix/tclUnixPipe.c;
refType = 2;
};
F5F24FE2016ECC0F01DC9062 = {
isa = PBXFileReference;
name = tclUnixSock.c;
path = ../unix/tclUnixSock.c;
refType = 2;
};
F5F24FE3016ECC0F01DC9062 = {
isa = PBXFileReference;
name = tclUnixTest.c;
path = ../unix/tclUnixTest.c;
refType = 2;
};
F5F24FE4016ECC0F01DC9062 = {
isa = PBXFileReference;
name = tclUnixThrd.c;
path = ../unix/tclUnixThrd.c;
refType = 2;
};
F5F24FE5016ECC0F01DC9062 = {
isa = PBXFileReference;
name = tclUnixTime.c;
path = ../unix/tclUnixTime.c;
refType = 2;
};
F5F24FE6016ECC0F01DC9062 = {
isa = PBXFileReference;
name = tclXtNotify.c;
path = ../unix/tclXtNotify.c;
refType = 2;
};
F5F24FE7016ECC0F01DC9062 = {
isa = PBXFileReference;
name = tclXtTest.c;
path = ../unix/tclXtTest.c;
refType = 2;
};
F5F24FEE016ED0DF01DC9062 = {
children = (
F5F24FEF016ED0DF01DC9062,
F5F24FF0016ED0DF01DC9062,
F5F24FF1016ED0DF01DC9062,
|
| ︙ | ︙ |
Changes to tests/all.tcl.
1 2 3 4 5 6 7 8 9 10 | # all.tcl -- # # This file contains a top-level script to run all of the Tcl # tests. Execute it by invoking "source all.test" when running tcltest # in this directory. # # Copyright (c) 1998-1999 by Scriptics Corporation. # Copyright (c) 2000 by Ajuba Solutions # All rights reserved. # | | > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# all.tcl --
#
# This file contains a top-level script to run all of the Tcl
# tests. Execute it by invoking "source all.test" when running tcltest
# in this directory.
#
# Copyright (c) 1998-1999 by Scriptics Corporation.
# Copyright (c) 2000 by Ajuba Solutions
# All rights reserved.
#
# RCS: @(#) $Id: all.tcl,v 1.14.4.1 2002/02/05 02:22:03 wolfsuit Exp $
set tcltestVersion [package require tcltest]
namespace import -force tcltest::*
if {$tcl_platform(platform) == "macintosh"} {
tcltest::singleProcess 1
}
tcltest::testsDirectory [file dir [info script]]
tcltest::runAllTests
return
|
Changes to tests/appendComp.test.
1 2 3 4 5 6 7 8 9 10 11 12 13 | # Commands covered: append lappend # # This file contains a collection of tests for one or more of the Tcl # built-in commands. Sourcing this file into Tcl runs the tests and # generates output for errors. No output means no errors were found. # # Copyright (c) 1991-1993 The Regents of the University of California. # Copyright (c) 1994-1996 Sun Microsystems, Inc. # Copyright (c) 1998-1999 by Scriptics Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# Commands covered: append lappend
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands. Sourcing this file into Tcl runs the tests and
# generates output for errors. No output means no errors were found.
#
# Copyright (c) 1991-1993 The Regents of the University of California.
# Copyright (c) 1994-1996 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: appendComp.test,v 1.4.4.1 2002/02/05 02:22:03 wolfsuit Exp $
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
namespace import -force ::tcltest::*
}
catch {unset x}
|
| ︙ | ︙ | |||
351 352 353 354 355 356 357 358 359 360 361 |
bar
} {0}
catch {unset i x result y}
catch {rename foo ""}
catch {rename bar ""}
catch {rename check ""}
# cleanup
::tcltest::cleanupTests
return
| > | 351 352 353 354 355 356 357 358 359 360 361 362 |
bar
} {0}
catch {unset i x result y}
catch {rename foo ""}
catch {rename bar ""}
catch {rename check ""}
catch {rename bar {}}
# cleanup
::tcltest::cleanupTests
return
|
Changes to tests/basic.test.
| ︙ | ︙ | |||
11 12 13 14 15 16 17 | # # Copyright (c) 1997 Sun Microsystems, Inc. # Copyright (c) 1998-1999 by Scriptics Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # | | | 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#
# Copyright (c) 1997 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: basic.test,v 1.12.4.1 2002/02/05 02:22:03 wolfsuit Exp $
#
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
namespace import -force ::tcltest::*
}
|
| ︙ | ︙ | |||
491 492 493 494 495 496 497 |
} {{expr 14 + 16} {expr 14 + 16} {set stuff [expr 14 + 16]} {set stuff 30}}
test basic-39.2 {Tcl_CreateTrace, correct command and argc/argv arguments of trace proc} {testcmdtrace} {
testcmdtrace tracetest {set stuff [info tclversion]}
} [list {info tclversion} {info tclversion} {set stuff [info tclversion]} "set stuff $tclvers"]
test basic-39.3 {Tcl_CreateTrace, correct command and argc/argv arguments of trace proc} {testcmdtrace} {
testcmdtrace deletetest {set stuff [info tclversion]}
} $tclvers
| > > > > > > > > | > > > > | 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 |
} {{expr 14 + 16} {expr 14 + 16} {set stuff [expr 14 + 16]} {set stuff 30}}
test basic-39.2 {Tcl_CreateTrace, correct command and argc/argv arguments of trace proc} {testcmdtrace} {
testcmdtrace tracetest {set stuff [info tclversion]}
} [list {info tclversion} {info tclversion} {set stuff [info tclversion]} "set stuff $tclvers"]
test basic-39.3 {Tcl_CreateTrace, correct command and argc/argv arguments of trace proc} {testcmdtrace} {
testcmdtrace deletetest {set stuff [info tclversion]}
} $tclvers
test basic-39.4 {Tcl_CreateTrace, check that tracing doesn't cause memory faults} {testcmdtrace} {
# Note that the proc call is the same as the variable name, and that
# the call can be direct or indirect by way of another procedure
proc tracer {args} {}
proc tracedLoop {level} {
incr level
tracer
foreach tracer [expr {$level==1 ? {1 2} : {}}] {tracedLoop $level}
}
testcmdtrace tracetest {tracedLoop 0}
} {{tracedLoop 0} {tracedLoop 0} {incr level} {incr level} tracer {tracer} {expr {$level==1 ? {1 2} : {}}} {expr {$level==1 ? {1 2} : {}}} {foreach tracer [expr {$level==1 ? {1 2} : {}}] {tracedLoop $level}} {foreach tracer {1 2} {tracedLoop $level}} {tracedLoop $level} {tracedLoop 1} {incr level} {incr level} tracer {tracer} {expr {$level==1 ? {1 2} : {}}} {expr {$level==1 ? {1 2} : {}}} {foreach tracer [expr {$level==1 ? {1 2} : {}}] {tracedLoop $level}} {foreach tracer {} {tracedLoop $level}} {tracedLoop $level} {tracedLoop 1} {incr level} {incr level} tracer {tracer} {expr {$level==1 ? {1 2} : {}}} {expr {$level==1 ? {1 2} : {}}} {foreach tracer [expr {$level==1 ? {1 2} : {}}] {tracedLoop $level}} {foreach tracer {} {tracedLoop $level}}}
catch {rename tracer {}}
catch {rename tracedLoop {}}
test basic-40.1 {Tcl_DeleteTrace} {emptyTest} {
} {}
test basic-41.1 {Tcl_AddErrorInfo} {emptyTest} {
} {}
|
| ︙ | ︙ |
Changes to tests/clock.test.
1 2 3 4 5 6 7 8 9 10 11 12 | # Commands covered: clock # # This file contains a collection of tests for one or more of the Tcl # built-in commands. Sourcing this file into Tcl runs the tests and # generates output for errors. No output means no errors were found. # # Copyright (c) 1995-1998 Sun Microsystems, Inc. # Copyright (c) 1998-1999 by Scriptics Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# Commands covered: clock
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands. Sourcing this file into Tcl runs the tests and
# generates output for errors. No output means no errors were found.
#
# Copyright (c) 1995-1998 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: clock.test,v 1.16.8.1 2002/02/05 02:22:03 wolfsuit Exp $
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
namespace import -force ::tcltest::*
}
test clock-1.1 {clock tests} {
|
| ︙ | ︙ | |||
413 414 415 416 417 418 419 420 421 422 423 |
clock format [clock scan "next july" -base [clock scan "june 1, 2000"]] \
-format %m.%Y
} "07.2000"
test clock-7.3 {clock scan next monthname} {
clock format [clock scan "next may" -base [clock scan "june 1, 2000"]] \
-format %m.%Y
} "05.2001"
# cleanup
::tcltest::cleanupTests
return
| > > > > > > > > > > < | 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 |
clock format [clock scan "next july" -base [clock scan "june 1, 2000"]] \
-format %m.%Y
} "07.2000"
test clock-7.3 {clock scan next monthname} {
clock format [clock scan "next may" -base [clock scan "june 1, 2000"]] \
-format %m.%Y
} "05.2001"
# We use 5am PST, 31-12-1999 as the base for these scans because irrespective
# of your local timezone it should always give us times on December 31
set 5amPST 946645200
test clock-8.1 {clock scan midnight/gmt range bug 413397} {
set fmt "%m/%d"
list [clock format [clock scan year -base $5amPST -gmt 0] -format $fmt] \
[clock format [clock scan year -base $5amPST -gmt 1] -format $fmt]
} {12/31 12/31}
# cleanup
::tcltest::cleanupTests
return
|
Changes to tests/cmdAH.test.
1 2 3 4 5 6 7 8 9 10 11 12 | # The file tests the tclCmdAH.c file. # # This file contains a collection of tests for one or more of the Tcl # built-in commands. Sourcing this file into Tcl runs the tests and # generates output for errors. No output means no errors were found. # # Copyright (c) 1996-1998 by Sun Microsystems, Inc. # Copyright (c) 1998-1999 by Scriptics Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# The file tests the tclCmdAH.c file.
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands. Sourcing this file into Tcl runs the tests and
# generates output for errors. No output means no errors were found.
#
# Copyright (c) 1996-1998 by Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: cmdAH.test,v 1.15.6.1 2002/02/05 02:22:03 wolfsuit Exp $
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
namespace import -force ::tcltest::*
}
tcltest::testConstraint testchmod [string equal testchmod [info commands testchmod]]
|
| ︙ | ︙ | |||
1174 1175 1176 1177 1178 1179 1180 |
test cmdAH-20.3 {Tcl_FileObjCmd: atime} {
string tolower [list [catch {file atime _bogus_} msg] \
$msg $errorCode]
} {1 {could not read "_bogus_": no such file or directory} {posix enoent {no such file or directory}}}
test cmdAH-20.4 {Tcl_FileObjCmd: atime} {
list [catch {file atime $file notint} msg] $msg
} {1 {expected integer but got "notint"}}
| | | 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 |
test cmdAH-20.3 {Tcl_FileObjCmd: atime} {
string tolower [list [catch {file atime _bogus_} msg] \
$msg $errorCode]
} {1 {could not read "_bogus_": no such file or directory} {posix enoent {no such file or directory}}}
test cmdAH-20.4 {Tcl_FileObjCmd: atime} {
list [catch {file atime $file notint} msg] $msg
} {1 {expected integer but got "notint"}}
test cmdAH-20.5 {Tcl_FileObjCmd: atime touch} {unixOrPc} {
if {[string equal $tcl_platform(platform) "windows"]} {
set old [pwd]
cd $::tcltest::temporaryDirectory
if {![string equal "NTFS" [testvolumetype]]} {
# Windows FAT doesn't understand atime, but NTFS does
# May also fail for Windows on NFS mounted disks
cd $old
|
| ︙ | ︙ | |||
1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 |
# mtime
set file [makeFile "data" touch.me]
test cmdAH-24.1 {Tcl_FileObjCmd: mtime} {
list [catch {file mtime a b c} msg] $msg
} {1 {wrong # args: should be "file mtime name ?time?"}}
test cmdAH-24.2 {Tcl_FileObjCmd: mtime} {
set old [file mtime gorp.file]
after 2000
set f [open gorp.file w]
puts $f "More text"
close $f
set new [file mtime gorp.file]
| > > > > > > > > > > > > > | > > | 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 |
# mtime
set file [makeFile "data" touch.me]
test cmdAH-24.1 {Tcl_FileObjCmd: mtime} {
list [catch {file mtime a b c} msg] $msg
} {1 {wrong # args: should be "file mtime name ?time?"}}
# Check (allowing for clock-skew and OS interrupts as best we can)
# that the change in mtime on a file being written is the time elapsed
# between writes. Note that this can still fail on very busy systems
# if there are long preemptions between the writes and the reading of
# the clock, but there's not much you can do about that other than the
# completely horrible "keep on trying to write until you managed to do
# it all in less than a second." - DKF
test cmdAH-24.2 {Tcl_FileObjCmd: mtime} {
set f [open gorp.file w]
puts $f "More text"
set localOld [clock seconds]
close $f
set old [file mtime gorp.file]
after 2000
set f [open gorp.file w]
puts $f "More text"
set localNew [clock seconds]
close $f
set new [file mtime gorp.file]
expr {
($new > $old) && ($localNew > $localOld) &&
(abs(($new-$old) - ($localNew-$localOld)) <= 1)
}
} {1}
test cmdAH-24.3 {Tcl_FileObjCmd: mtime} {
catch {unset stat}
file stat gorp.file stat
list [expr {[file mtime gorp.file] == $stat(mtime)}] \
[expr {[file atime gorp.file] == $stat(atime)}]
} {1 1}
|
| ︙ | ︙ | |||
1614 1615 1616 1617 1618 1619 1620 | file delete gorp.file file delete link.file cd $cmdAHwd ::tcltest::cleanupTests return | < < < < < < < < < < < < < | 1629 1630 1631 1632 1633 1634 1635 | file delete gorp.file file delete link.file cd $cmdAHwd ::tcltest::cleanupTests return |
Changes to tests/cmdMZ.test.
1 2 3 4 5 6 7 8 9 10 11 12 13 | # The tests in this file cover the procedures in tclCmdMZ.c. # # This file contains a collection of tests for one or more of the Tcl # built-in commands. Sourcing this file into Tcl runs the tests and # generates output for errors. No output means no errors were found. # # Copyright (c) 1991-1993 The Regents of the University of California. # Copyright (c) 1994 Sun Microsystems, Inc. # Copyright (c) 1998-1999 by Scriptics Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# The tests in this file cover the procedures in tclCmdMZ.c.
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands. Sourcing this file into Tcl runs the tests and
# generates output for errors. No output means no errors were found.
#
# Copyright (c) 1991-1993 The Regents of the University of California.
# Copyright (c) 1994 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: cmdMZ.test,v 1.8.10.1 2002/02/05 02:22:03 wolfsuit Exp $
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
namespace import -force ::tcltest::*
}
set tcltest::testConstraints(notLinux) \
[expr {![string equal Linux $tcl_platform(os)]}]
|
| ︙ | ︙ | |||
74 75 76 77 78 79 80 |
# Tcl_SourceObjCmd
test cmdMZ-3.1 {Tcl_SourceObjCmd: error conditions} {macOnly} {
list [catch {source} msg] $msg
} {1 {wrong # args: should be "source fileName" or "source -rsrc name ?fileName?" or "source -rsrcid id ?fileName?"}}
test cmdMZ-3.2 {Tcl_SourceObjCmd: error conditions} {macOnly} {
list [catch {source a b} msg] $msg
| | | 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
# Tcl_SourceObjCmd
test cmdMZ-3.1 {Tcl_SourceObjCmd: error conditions} {macOnly} {
list [catch {source} msg] $msg
} {1 {wrong # args: should be "source fileName" or "source -rsrc name ?fileName?" or "source -rsrcid id ?fileName?"}}
test cmdMZ-3.2 {Tcl_SourceObjCmd: error conditions} {macOnly} {
list [catch {source a b} msg] $msg
} {1 {bad argument: should be "source fileName" or "source -rsrc name ?fileName?" or "source -rsrcid id ?fileName?"}}
test cmdMZ-3.3 {Tcl_SourceObjCmd: error conditions} {unixOrPc} {
list [catch {source} msg] $msg
} {1 {wrong # args: should be "source fileName"}}
test cmdMZ-3.4 {Tcl_SourceObjCmd: error conditions} {unixOrPc} {
list [catch {source a b} msg] $msg
} {1 {wrong # args: should be "source fileName"}}
test cmdMZ-3.5 {Tcl_SourceObjCmd: error in script} {
|
| ︙ | ︙ |
Changes to tests/compExpr-old.test.
1 2 3 4 | # Commands covered: expr # # This file contains the original set of tests for the compilation (and # indirectly execution) of Tcl's expr command. A new set of tests covering | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# Commands covered: expr
#
# This file contains the original set of tests for the compilation (and
# indirectly execution) of Tcl's expr command. A new set of tests covering
# the new implementation are in the files "parseExpr.test" and
# "compExpr.test". Sourcing this file into Tcl runs the tests and generates
# output for errors. No output means no errors were found.
#
# Copyright (c) 1996-1997 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: compExpr-old.test,v 1.5.18.1 2002/02/05 02:22:03 wolfsuit Exp $
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
namespace import -force ::tcltest::*
}
if {([catch {expr T1()} msg] == 1) && ($msg == {unknown math function "T1"})} {
|
| ︙ | ︙ | |||
72 73 74 75 76 77 78 |
string length $xxx
}
# start of tests
catch {unset a b i x}
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 |
string length $xxx
}
# start of tests
catch {unset a b i x}
test compExpr-old-1.1 {TclCompileExprCmd: no expression} {
list [catch {expr } msg] $msg
} {1 {wrong # args: should be "expr arg ?arg ...?"}}
test compExpr-old-1.2 {TclCompileExprCmd: one expression word} {
expr -25
} -25
test compExpr-old-1.3 {TclCompileExprCmd: two expression words} {
expr -8.2 -6
} -14.2
test compExpr-old-1.4 {TclCompileExprCmd: five expression words} {
expr 20 - 5 +10 -7
} 18
test compExpr-old-1.5 {TclCompileExprCmd: quoted expression word} {
expr "0005"
} 5
test compExpr-old-1.6 {TclCompileExprCmd: quoted expression word} {
catch {expr "0005"zxy} msg
set msg
} {extra characters after close-quote}
test compExpr-old-1.7 {TclCompileExprCmd: expression word in braces} {
expr {-0005}
} -5
test compExpr-old-1.8 {TclCompileExprCmd: expression word in braces} {
expr {{-0x1234}}
} -4660
test compExpr-old-1.9 {TclCompileExprCmd: expression word in braces} {
catch {expr {-0005}foo} msg
set msg
} {extra characters after close-brace}
test compExpr-old-1.10 {TclCompileExprCmd: other expression word in braces} {
expr 4*[llength "6 2"]
} 8
test compExpr-old-1.11 {TclCompileExprCmd: expression word terminated by ;} {
expr 4*[llength "6 2"];
} 8
test compExpr-old-1.12 {TclCompileExprCmd: inlined expr (in "catch") inside other catch} {
set a xxx
catch {
# Might not be a number
set a [expr 10*$a]
}
} 1
test compExpr-old-1.13 {TclCompileExprCmd: second level of substitutions in expr not in braces with single var reference} {
set a xxx
set x 27; set bool {$x}; if $bool {set a foo}
set a
} foo
test compExpr-old-1.14 {TclCompileExprCmd: second level of substitutions in expr with comparison as top-level operator} {
set a xxx
set x 2; set b {$x}; set a [expr $b == 2]
set a
} 1
test compExpr-old-2.1 {TclCompileExpr: are builtin functions registered?} {
expr double(5*[llength "6 2"])
} 10.0
test compExpr-old-2.2 {TclCompileExpr: error in expr} {
catch {expr 2**3} msg
set msg
} {syntax error in expression "2**3": unexpected operator *}
test compExpr-old-2.3 {TclCompileExpr: junk after legal expr} {
catch {expr 7*[llength "a b"]foo} msg
set msg
} {syntax error in expression "7*2foo": extra tokens at end of expression}
test compExpr-old-2.4 {TclCompileExpr: numeric expr string rep == formatted int rep} {
expr {0001}
} 1
test compExpr-old-3.1 {CompileCondExpr: just lor expr} {expr 3||0} 1
test compExpr-old-3.2 {CompileCondExpr: error in lor expr} {
catch {expr x||3} msg
set msg
} {syntax error in expression "x||3": variable references require preceding $}
test compExpr-old-3.3 {CompileCondExpr: test true arm} {expr 3>2?44:66} 44
test compExpr-old-3.4 {CompileCondExpr: error compiling true arm} {
catch {expr 3>2?2**3:66} msg
set msg
} {syntax error in expression "3>2?2**3:66": unexpected operator *}
test compExpr-old-3.5 {CompileCondExpr: test false arm} {expr 2>3?44:66} 66
test compExpr-old-3.6 {CompileCondExpr: error compiling false arm} {
catch {expr 2>3?44:2**3} msg
set msg
} {syntax error in expression "2>3?44:2**3": unexpected operator *}
test compExpr-old-3.7 {CompileCondExpr: long arms & nested cond exprs} {nonPortable} {
puts "Note: doing test compExpr-old-3.7 which can take several minutes to run"
hello_world
} {Hello world}
catch {unset xxx}
test compExpr-old-3.8 {CompileCondExpr: long arms & nested cond exprs} {nonPortable} {
puts "Note: doing test compExpr-old-3.8 which can take several minutes to run"
do_twelve_days
} 2358
catch {unset xxx}
test compExpr-old-4.1 {CompileLorExpr: just land expr} {expr 1.3&&3.3} 1
test compExpr-old-4.2 {CompileLorExpr: error in land expr} {
catch {expr x&&3} msg
set msg
} {syntax error in expression "x&&3": variable references require preceding $}
test compExpr-old-4.3 {CompileLorExpr: simple lor exprs} {expr 0||1.0} 1
test compExpr-old-4.4 {CompileLorExpr: simple lor exprs} {expr 3.0||0.0} 1
test compExpr-old-4.5 {CompileLorExpr: simple lor exprs} {expr 0||0||1} 1
test compExpr-old-4.6 {CompileLorExpr: error compiling lor arm} {
catch {expr 2**3||4.0} msg
set msg
} {syntax error in expression "2**3||4.0": unexpected operator *}
test compExpr-old-4.7 {CompileLorExpr: error compiling lor arm} {
catch {expr 1.3||2**3} msg
set msg
} {syntax error in expression "1.3||2**3": unexpected operator *}
test compExpr-old-4.8 {CompileLorExpr: error compiling lor arms} {
list [catch {expr {"a"||"b"}} msg] $msg
} {1 {expected boolean value but got "a"}}
test compExpr-old-4.9 {CompileLorExpr: long lor arm} {
set a "abcdefghijkl"
set i 7
expr {[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]] || [string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]] || [string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]] || [string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]}
} 1
test compExpr-old-5.1 {CompileLandExpr: just bitor expr} {expr 7|0x13} 23
test compExpr-old-5.2 {CompileLandExpr: error in bitor expr} {
catch {expr x|3} msg
set msg
} {syntax error in expression "x|3": variable references require preceding $}
test compExpr-old-5.3 {CompileLandExpr: simple land exprs} {expr 0&&1.0} 0
test compExpr-old-5.4 {CompileLandExpr: simple land exprs} {expr 0&&0} 0
test compExpr-old-5.5 {CompileLandExpr: simple land exprs} {expr 3.0&&1.2} 1
test compExpr-old-5.6 {CompileLandExpr: simple land exprs} {expr 1&&1&&2} 1
test compExpr-old-5.7 {CompileLandExpr: error compiling land arm} {
catch {expr 2**3&&4.0} msg
set msg
} {syntax error in expression "2**3&&4.0": unexpected operator *}
test compExpr-old-5.8 {CompileLandExpr: error compiling land arm} {
catch {expr 1.3&&2**3} msg
set msg
} {syntax error in expression "1.3&&2**3": unexpected operator *}
test compExpr-old-5.9 {CompileLandExpr: error compiling land arm} {
list [catch {expr {"a"&&"b"}} msg] $msg
} {1 {expected boolean value but got "a"}}
test compExpr-old-5.10 {CompileLandExpr: long land arms} {
set a "abcdefghijkl"
set i 7
expr {[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]] && [string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]] && [string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]] && [string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]}
} 1
test compExpr-old-6.1 {CompileBitXorExpr: just bitand expr} {expr 7&0x13} 3
test compExpr-old-6.2 {CompileBitXorExpr: error in bitand expr} {
catch {expr x|3} msg
set msg
} {syntax error in expression "x|3": variable references require preceding $}
test compExpr-old-6.3 {CompileBitXorExpr: simple bitxor exprs} {expr 7^0x13} 20
test compExpr-old-6.4 {CompileBitXorExpr: simple bitxor exprs} {expr 3^0x10} 19
test compExpr-old-6.5 {CompileBitXorExpr: simple bitxor exprs} {expr 0^7} 7
test compExpr-old-6.6 {CompileBitXorExpr: simple bitxor exprs} {expr -1^7} -8
test compExpr-old-6.7 {CompileBitXorExpr: error compiling bitxor arm} {
catch {expr 2**3|6} msg
set msg
} {syntax error in expression "2**3|6": unexpected operator *}
test compExpr-old-6.8 {CompileBitXorExpr: error compiling bitxor arm} {
catch {expr 2^x} msg
set msg
} {syntax error in expression "2^x": variable references require preceding $}
test compExpr-old-6.9 {CompileBitXorExpr: runtime error in bitxor arm} {
list [catch {expr {24.0^3}} msg] $msg
} {1 {can't use floating-point value as operand of "^"}}
test compExpr-old-6.10 {CompileBitXorExpr: runtime error in bitxor arm} {
list [catch {expr {"a"^"b"}} msg] $msg
} {1 {can't use non-numeric string as operand of "^"}}
test compExpr-old-7.1 {CompileBitAndExpr: just equality expr} {expr 3==2} 0
test compExpr-old-7.2 {CompileBitAndExpr: just equality expr} {expr 2.0==2} 1
test compExpr-old-7.3 {CompileBitAndExpr: just equality expr} {expr 3.2!=2.2} 1
test compExpr-old-7.4 {CompileBitAndExpr: just equality expr} {expr {"abc" == "abd"}} 0
test compExpr-old-7.5 {CompileBitAndExpr: error in equality expr} {
catch {expr x==3} msg
set msg
} {syntax error in expression "x==3": variable references require preceding $}
test compExpr-old-7.6 {CompileBitAndExpr: simple bitand exprs} {expr 7&0x13} 3
test compExpr-old-7.7 {CompileBitAndExpr: simple bitand exprs} {expr 0xf2&0x53} 82
test compExpr-old-7.8 {CompileBitAndExpr: simple bitand exprs} {expr 3&6} 2
test compExpr-old-7.9 {CompileBitAndExpr: simple bitand exprs} {expr -1&-7} -7
test compExpr-old-7.10 {CompileBitAndExpr: error compiling bitand arm} {
catch {expr 2**3&6} msg
set msg
} {syntax error in expression "2**3&6": unexpected operator *}
test compExpr-old-7.11 {CompileBitAndExpr: error compiling bitand arm} {
catch {expr 2&x} msg
set msg
} {syntax error in expression "2&x": variable references require preceding $}
test compExpr-old-7.12 {CompileBitAndExpr: runtime error in bitand arm} {
list [catch {expr {24.0&3}} msg] $msg
} {1 {can't use floating-point value as operand of "&"}}
test compExpr-old-7.13 {CompileBitAndExpr: runtime error in bitand arm} {
list [catch {expr {"a"&"b"}} msg] $msg
} {1 {can't use non-numeric string as operand of "&"}}
test compExpr-old-8.1 {CompileEqualityExpr: just relational expr} {expr 3>=2} 1
test compExpr-old-8.2 {CompileEqualityExpr: just relational expr} {expr 2<=2.1} 1
test compExpr-old-8.3 {CompileEqualityExpr: just relational expr} {expr 3.2>"2.2"} 1
test compExpr-old-8.4 {CompileEqualityExpr: just relational expr} {expr {"0y"<"0x12"}} 0
test compExpr-old-8.5 {CompileEqualityExpr: error in relational expr} {
catch {expr x>3} msg
set msg
} {syntax error in expression "x>3": variable references require preceding $}
test compExpr-old-8.6 {CompileEqualityExpr: simple equality exprs} {expr 7==0x13} 0
test compExpr-old-8.7 {CompileEqualityExpr: simple equality exprs} {expr -0xf2!=0x53} 1
test compExpr-old-8.8 {CompileEqualityExpr: simple equality exprs} {expr {"12398712938788234-1298379" != ""}} 1
test compExpr-old-8.9 {CompileEqualityExpr: simple equality exprs} {expr -1!="abc"} 1
test compExpr-old-8.10 {CompileEqualityExpr: error compiling equality arm} {
catch {expr 2**3==6} msg
set msg
} {syntax error in expression "2**3==6": unexpected operator *}
test compExpr-old-8.11 {CompileEqualityExpr: error compiling equality arm} {
catch {expr 2!=x} msg
set msg
} {syntax error in expression "2!=x": variable references require preceding $}
test compExpr-old-9.1 {CompileRelationalExpr: just shift expr} {expr 3<<2} 12
test compExpr-old-9.2 {CompileRelationalExpr: just shift expr} {expr 0xff>>2} 63
test compExpr-old-9.3 {CompileRelationalExpr: just shift expr} {expr -1>>2} -1
test compExpr-old-9.4 {CompileRelationalExpr: just shift expr} {expr {1<<3}} 8
# The following test is different for 32-bit versus 64-bit
# architectures because LONG_MIN is different
if {0x80000000 > 0} {
test compExpr-old-9.5 {CompileRelationalExpr: shift expr producing LONG_MIN} {nonPortable} {
expr {1<<63}
} -9223372036854775808
} else {
test compExpr-old-9.5 {CompileRelationalExpr: shift expr producing LONG_MIN} {nonPortable} {
expr {1<<31}
} -2147483648
}
test compExpr-old-9.6 {CompileRelationalExpr: error in shift expr} {
catch {expr x>>3} msg
set msg
} {syntax error in expression "x>>3": variable references require preceding $}
test compExpr-old-9.7 {CompileRelationalExpr: simple relational exprs} {expr 0xff>=+0x3} 1
test compExpr-old-9.8 {CompileRelationalExpr: simple relational exprs} {expr -0xf2<0x3} 1
test compExpr-old-9.9 {CompileRelationalExpr: error compiling relational arm} {
catch {expr 2**3>6} msg
set msg
} {syntax error in expression "2**3>6": unexpected operator *}
test compExpr-old-9.10 {CompileRelationalExpr: error compiling relational arm} {
catch {expr 2<x} msg
set msg
} {syntax error in expression "2<x": variable references require preceding $}
test compExpr-old-10.1 {CompileShiftExpr: just add expr} {expr 4+-2} 2
test compExpr-old-10.2 {CompileShiftExpr: just add expr} {expr 0xff-2} 253
test compExpr-old-10.3 {CompileShiftExpr: just add expr} {expr -1--2} 1
test compExpr-old-10.4 {CompileShiftExpr: just add expr} {expr 1-0123} -82
test compExpr-old-10.5 {CompileShiftExpr: error in add expr} {
catch {expr x+3} msg
set msg
} {syntax error in expression "x+3": variable references require preceding $}
test compExpr-old-10.6 {CompileShiftExpr: simple shift exprs} {expr 0xff>>0x3} 31
test compExpr-old-10.7 {CompileShiftExpr: simple shift exprs} {expr -0xf2<<0x3} -1936
test compExpr-old-10.8 {CompileShiftExpr: error compiling shift arm} {
catch {expr 2**3>>6} msg
set msg
} {syntax error in expression "2**3>>6": unexpected operator *}
test compExpr-old-10.9 {CompileShiftExpr: error compiling shift arm} {
catch {expr 2<<x} msg
set msg
} {syntax error in expression "2<<x": variable references require preceding $}
test compExpr-old-10.10 {CompileShiftExpr: runtime error} {
list [catch {expr {24.0>>43}} msg] $msg
} {1 {can't use floating-point value as operand of ">>"}}
test compExpr-old-10.11 {CompileShiftExpr: runtime error} {
list [catch {expr {"a"<<"b"}} msg] $msg
} {1 {can't use non-numeric string as operand of "<<"}}
test compExpr-old-11.1 {CompileAddExpr: just multiply expr} {expr 4*-2} -8
test compExpr-old-11.2 {CompileAddExpr: just multiply expr} {expr 0xff%2} 1
test compExpr-old-11.3 {CompileAddExpr: just multiply expr} {expr -1/2} -1
test compExpr-old-11.4 {CompileAddExpr: just multiply expr} {expr 7891%0123} 6
test compExpr-old-11.5 {CompileAddExpr: error in multiply expr} {
catch {expr x*3} msg
set msg
} {syntax error in expression "x*3": variable references require preceding $}
test compExpr-old-11.6 {CompileAddExpr: simple add exprs} {expr 0xff++0x3} 258
test compExpr-old-11.7 {CompileAddExpr: simple add exprs} {expr -0xf2--0x3} -239
test compExpr-old-11.8 {CompileAddExpr: error compiling add arm} {
catch {expr 2**3+6} msg
set msg
} {syntax error in expression "2**3+6": unexpected operator *}
test compExpr-old-11.9 {CompileAddExpr: error compiling add arm} {
catch {expr 2-x} msg
set msg
} {syntax error in expression "2-x": variable references require preceding $}
test compExpr-old-11.10 {CompileAddExpr: runtime error} {
list [catch {expr {24.0+"xx"}} msg] $msg
} {1 {can't use non-numeric string as operand of "+"}}
test compExpr-old-11.11 {CompileAddExpr: runtime error} {
list [catch {expr {"a"-"b"}} msg] $msg
} {1 {can't use non-numeric string as operand of "-"}}
test compExpr-old-11.12 {CompileAddExpr: runtime error} {
list [catch {expr {3/0}} msg] $msg
} {1 {divide by zero}}
test compExpr-old-11.13 {CompileAddExpr: runtime error} {
list [catch {expr {2.3/0.0}} msg] $msg
} {1 {divide by zero}}
test compExpr-old-12.1 {CompileMultiplyExpr: just unary expr} {expr ~4} -5
test compExpr-old-12.2 {CompileMultiplyExpr: just unary expr} {expr --5} 5
test compExpr-old-12.3 {CompileMultiplyExpr: just unary expr} {expr !27} 0
test compExpr-old-12.4 {CompileMultiplyExpr: just unary expr} {expr ~0xff00ff} -16711936
test compExpr-old-12.5 {CompileMultiplyExpr: error in unary expr} {
catch {expr ~x} msg
set msg
} {syntax error in expression "~x": variable references require preceding $}
test compExpr-old-12.6 {CompileMultiplyExpr: simple multiply exprs} {expr 0xff*0x3} 765
test compExpr-old-12.7 {CompileMultiplyExpr: simple multiply exprs} {expr -0xf2%-0x3} -2
test compExpr-old-12.8 {CompileMultiplyExpr: error compiling multiply arm} {
catch {expr 2*3%%6} msg
set msg
} {syntax error in expression "2*3%%6": unexpected operator %}
test compExpr-old-12.9 {CompileMultiplyExpr: error compiling multiply arm} {
catch {expr 2*x} msg
set msg
} {syntax error in expression "2*x": variable references require preceding $}
test compExpr-old-12.10 {CompileMultiplyExpr: runtime error} {
list [catch {expr {24.0*"xx"}} msg] $msg
} {1 {can't use non-numeric string as operand of "*"}}
test compExpr-old-12.11 {CompileMultiplyExpr: runtime error} {
list [catch {expr {"a"/"b"}} msg] $msg
} {1 {can't use non-numeric string as operand of "/"}}
test compExpr-old-13.1 {CompileUnaryExpr: unary exprs} {expr -0xff} -255
test compExpr-old-13.2 {CompileUnaryExpr: unary exprs} {expr +000123} 83
test compExpr-old-13.3 {CompileUnaryExpr: unary exprs} {expr +--++36} 36
test compExpr-old-13.4 {CompileUnaryExpr: unary exprs} {expr !2} 0
test compExpr-old-13.5 {CompileUnaryExpr: unary exprs} {expr +--+-62.0} -62.0
test compExpr-old-13.6 {CompileUnaryExpr: unary exprs} {expr !0.0} 1
test compExpr-old-13.7 {CompileUnaryExpr: unary exprs} {expr !0xef} 0
test compExpr-old-13.8 {CompileUnaryExpr: error compiling unary expr} {
catch {expr ~x} msg
set msg
} {syntax error in expression "~x": variable references require preceding $}
test compExpr-old-13.9 {CompileUnaryExpr: error compiling unary expr} {
catch {expr !1.x} msg
set msg
} {syntax error in expression "!1.x": extra tokens at end of expression}
test compExpr-old-13.10 {CompileUnaryExpr: runtime error} {
list [catch {expr {~"xx"}} msg] $msg
} {1 {can't use non-numeric string as operand of "~"}}
test compExpr-old-13.11 {CompileUnaryExpr: runtime error} {
list [catch {expr ~4.0} msg] $msg
} {1 {can't use floating-point value as operand of "~"}}
test compExpr-old-13.12 {CompileUnaryExpr: just primary expr} {expr 0x123} 291
test compExpr-old-13.13 {CompileUnaryExpr: just primary expr} {
set a 27
expr $a
} 27
test compExpr-old-13.14 {CompileUnaryExpr: just primary expr} {
expr double(27)
} 27.0
test compExpr-old-13.15 {CompileUnaryExpr: just primary expr} {expr "123"} 123
test compExpr-old-13.16 {CompileUnaryExpr: error in primary expr} {
catch {expr [set]} msg
set msg
} {wrong # args: should be "set varName ?newValue?"}
test compExpr-old-14.1 {CompilePrimaryExpr: literal primary} {expr 1} 1
test compExpr-old-14.2 {CompilePrimaryExpr: literal primary} {expr 123} 123
test compExpr-old-14.3 {CompilePrimaryExpr: literal primary} {expr 0xff} 255
test compExpr-old-14.4 {CompilePrimaryExpr: literal primary} {expr 00010} 8
test compExpr-old-14.5 {CompilePrimaryExpr: literal primary} {expr 62.0} 62.0
test compExpr-old-14.6 {CompilePrimaryExpr: literal primary} {
expr 3.1400000
} 3.14
test compExpr-old-14.7 {CompilePrimaryExpr: literal primary} {expr {{abcde}<{abcdef}}} 1
test compExpr-old-14.8 {CompilePrimaryExpr: literal primary} {expr {{abc\
def} < {abcdef}}} 1
test compExpr-old-14.9 {CompilePrimaryExpr: literal primary} {expr {{abc\tde} > {abc\tdef}}} 0
test compExpr-old-14.10 {CompilePrimaryExpr: literal primary} {expr {{123}}} 123
test compExpr-old-14.11 {CompilePrimaryExpr: var reference primary} {
set i 789
list [expr {$i}] [expr $i]
} {789 789}
test compExpr-old-14.12 {CompilePrimaryExpr: var reference primary} {
set i {789} ;# test expr's aggressive conversion to numeric semantics
list [expr {$i}] [expr $i]
} {789 789}
test compExpr-old-14.13 {CompilePrimaryExpr: var reference primary} {
catch {unset a}
set a(foo) foo
set a(bar) bar
set a(123) 123
set result ""
lappend result [expr $a(123)] [expr {$a(bar)<$a(foo)}]
catch {unset a}
set result
} {123 1}
test compExpr-old-14.14 {CompilePrimaryExpr: var reference primary} {
set i 123 ;# test "$var.0" floating point conversion hack
list [expr $i] [expr $i.0] [expr $i.0/12.0]
} {123 123.0 10.25}
test compExpr-old-14.15 {CompilePrimaryExpr: var reference primary} {
set i 123
catch {expr $i.2} msg
set msg
} 123.2
test compExpr-old-14.16 {CompilePrimaryExpr: error compiling var reference primary} {
catch {expr {$a(foo}} msg
set errorInfo
} {missing )
while compiling
"expr {$a(foo}"}
test compExpr-old-14.17 {CompilePrimaryExpr: string primary that looks like var ref} {
expr $
} $
test compExpr-old-14.18 {CompilePrimaryExpr: quoted string primary} {
expr "21"
} 21
test compExpr-old-14.19 {CompilePrimaryExpr: quoted string primary} {
set i 123
set x 456
expr "$i+$x"
} 579
test compExpr-old-14.20 {CompilePrimaryExpr: quoted string primary} {
set i 3
set x 6
expr 2+"$i.$x"
} 5.6
test compExpr-old-14.21 {CompilePrimaryExpr: error in quoted string primary} {
catch {expr "[set]"} msg
set msg
} {wrong # args: should be "set varName ?newValue?"}
test compExpr-old-14.22 {CompilePrimaryExpr: subcommand primary} {
expr {[set i 123; set i]}
} 123
test compExpr-old-14.23 {CompilePrimaryExpr: error in subcommand primary} {
catch {expr {[set]}} msg
set errorInfo
} {wrong # args: should be "set varName ?newValue?"
while compiling
"set"
while compiling
"expr {[set]}"}
test compExpr-old-14.24 {CompilePrimaryExpr: error in subcommand primary} {
catch {expr {[set i}} msg
set errorInfo
} {missing close-bracket
while compiling
"expr {[set i}"}
test compExpr-old-14.25 {CompilePrimaryExpr: math function primary} {
format %.6g [expr exp(1.0)]
} 2.71828
test compExpr-old-14.26 {CompilePrimaryExpr: math function primary} {
format %.6g [expr pow(2.0+0.1,3.0+0.1)]
} 9.97424
test compExpr-old-14.27 {CompilePrimaryExpr: error in math function primary} {
catch {expr sinh::(2.0)} msg
set errorInfo
} {syntax error in expression "sinh::(2.0)": expected parenthesis enclosing function arguments
while compiling
"expr sinh::(2.0)"}
test compExpr-old-14.28 {CompilePrimaryExpr: subexpression primary} {
expr 2+(3*4)
} 14
test compExpr-old-14.29 {CompilePrimaryExpr: error in subexpression primary} {
catch {expr 2+(3*[set])} msg
set errorInfo
} {wrong # args: should be "set varName ?newValue?"
while compiling
"set"
while compiling
"expr 2+(3*[set])"}
test compExpr-old-14.30 {CompilePrimaryExpr: missing paren in subexpression primary} {
catch {expr 2+(3*(4+5)} msg
set errorInfo
} {syntax error in expression "2+(3*(4+5)": looking for close parenthesis
while compiling
"expr 2+(3*(4+5)"}
test compExpr-old-14.31 {CompilePrimaryExpr: just var ref in subexpression primary} {
set i "5+10"
list "[expr $i] == 15" "[expr ($i)] == 15" "[eval expr ($i)] == 15"
} {{15 == 15} {15 == 15} {15 == 15}}
test compExpr-old-14.32 {CompilePrimaryExpr: unexpected token} {
catch {expr @} msg
set errorInfo
} {syntax error in expression "@": character not legal in expressions
while compiling
"expr @"}
test compExpr-old-15.1 {CompileMathFuncCall: missing parenthesis} {
catch {expr sinh2.0)} msg
set errorInfo
} {syntax error in expression "sinh2.0)": variable references require preceding $
while compiling
"expr sinh2.0)"}
test compExpr-old-15.2 {CompileMathFuncCall: unknown math function} {
catch {expr whazzathuh(1)} msg
set errorInfo
} {unknown math function "whazzathuh"
while compiling
"expr whazzathuh(1)"}
test compExpr-old-15.3 {CompileMathFuncCall: too many arguments} {
catch {expr sin(1,2,3)} msg
set errorInfo
} {too many arguments for math function
while compiling
"expr sin(1,2,3)"}
test compExpr-old-15.4 {CompileMathFuncCall: ')' found before last required arg} {
catch {expr sin()} msg
set errorInfo
} {too few arguments for math function
while compiling
"expr sin()"}
test compExpr-old-15.5 {CompileMathFuncCall: too few arguments} {
catch {expr pow(1)} msg
set errorInfo
} {too few arguments for math function
while compiling
"expr pow(1)"}
test compExpr-old-15.6 {CompileMathFuncCall: missing ')'} {
catch {expr sin(1} msg
set errorInfo
} {syntax error in expression "sin(1": missing close parenthesis at end of function call
while compiling
"expr sin(1"}
if $gotT1 {
test compExpr-old-15.7 {CompileMathFuncCall: call registered math function} {
expr 2*T1()
} 246
test compExpr-old-15.8 {CompileMathFuncCall: call registered math function} {
expr T2()*3
} 1035
test compExpr-old-15.9 {CompileMathFuncCall: call registered math function} {
expr T3(21, 37)
} 37
test compExpr-old-15.10 {CompileMathFuncCall: call registered math function} {
expr T3(21.2, 37)
} 37.0
test compExpr-old-15.11 {CompileMathFuncCall: call registered math function} {
expr T3(-21.2, -17.5)
} -17.5
}
test compExpr-old-16.1 {GetToken: checks whether integer token starting with "0x" (e.g., "0x$") is invalid} {
catch {unset a}
set a(VALUE) ff15
set i 123
if {[expr 0x$a(VALUE)] & 16} {
set i {}
}
set i
} {}
test compExpr-old-16.2 {GetToken: check for string literal in braces} {
expr {{1}}
} {1}
# Check "expr" and computed command names.
test compExpr-old-17.1 {expr and computed command names} {
set i 0
set z expr
$z 1+2
} 3
# Check correct conversion of operands to numbers: If the string looks like
# an integer, convert to integer. Otherwise, if the string looks like a
# double, convert to double.
test compExpr-old-18.1 {expr and conversion of operands to numbers} {
set x [lindex 11 0]
catch {expr int($x)}
expr {$x}
} 11
# Check "expr" and interpreter result object resetting before appending
# an error msg during evaluation of exprs not in {}s
test compExpr-old-19.1 {expr and interpreter result object resetting} {
proc p {} {
set t 10.0
set x 2.0
set dx 0.2
set f {$dx-$x/10}
set g {-$x/5}
set center 1.0
|
| ︙ | ︙ | |||
672 673 674 675 676 677 678 |
# cleanup
if {[info exists a]} {
unset a
}
::tcltest::cleanupTests
return
| < < < < < < < < < < < < | 672 673 674 675 676 677 678 |
# cleanup
if {[info exists a]} {
unset a
}
::tcltest::cleanupTests
return
|
Changes to tests/compExpr.test.
1 2 3 4 5 6 7 8 9 10 | # This file contains a collection of tests for the procedures in the # file tclCompExpr.c. Sourcing this file into Tcl runs the tests and # generates output for errors. No output means no errors were found. # # Copyright (c) 1997 Sun Microsystems, Inc. # Copyright (c) 1998-1999 by Scriptics Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# This file contains a collection of tests for the procedures in the
# file tclCompExpr.c. Sourcing this file into Tcl runs the tests and
# generates output for errors. No output means no errors were found.
#
# Copyright (c) 1997 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: compExpr.test,v 1.4.18.1 2002/02/05 02:22:03 wolfsuit Exp $
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
namespace import -force ::tcltest::*
}
if {([catch {expr T1()} msg] == 1) && ($msg == {unknown math function "T1"})} {
|
| ︙ | ︙ | |||
26 27 28 29 30 31 32 |
catch {unset a}
test compExpr-1.1 {TclCompileExpr procedure, successful expr parse and compile} {
expr 1+2
} 3
test compExpr-1.2 {TclCompileExpr procedure, error parsing expr} {
list [catch {expr 1+2+} msg] $msg
| | | | 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
catch {unset a}
test compExpr-1.1 {TclCompileExpr procedure, successful expr parse and compile} {
expr 1+2
} 3
test compExpr-1.2 {TclCompileExpr procedure, error parsing expr} {
list [catch {expr 1+2+} msg] $msg
} {1 {syntax error in expression "1+2+": premature end of expression}}
test compExpr-1.3 {TclCompileExpr procedure, error compiling expr} {
list [catch {expr "foo(123)"} msg] $msg
} {1 {unknown math function "foo"}}
test compExpr-1.4 {TclCompileExpr procedure, expr has no operators} {
set a {000123}
expr {$a}
} 83
test compExpr-2.1 {CompileSubExpr procedure, TCL_TOKEN_WORD parse token} {
catch {unset a}
set a 27
expr {"foo$a" < "bar"}
} 0
test compExpr-2.2 {CompileSubExpr procedure, error compiling TCL_TOKEN_WORD parse token} {
list [catch {expr {"00[expr 1+]" + 17}} msg] $msg
} {1 {syntax error in expression "1+": premature end of expression}}
test compExpr-2.3 {CompileSubExpr procedure, TCL_TOKEN_TEXT parse token} {
expr {{12345}}
} 12345
test compExpr-2.4 {CompileSubExpr procedure, empty TCL_TOKEN_TEXT parse token} {
expr {{}}
} {}
test compExpr-2.5 {CompileSubExpr procedure, TCL_TOKEN_BS parse token} {
|
| ︙ | ︙ | |||
85 86 87 88 89 90 91 |
test compExpr-2.12 {CompileSubExpr procedure, TCL_TOKEN_SUB_EXPR parse token} {
expr {27||3? 3<<(1+4) : 4&&9}
} 96
test compExpr-2.13 {CompileSubExpr procedure, error in TCL_TOKEN_SUB_EXPR parse token} {
catch {unset a}
set a 15
list [catch {expr {27 || "$a[expr 1+]00"}} msg] $msg
| | | 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
test compExpr-2.12 {CompileSubExpr procedure, TCL_TOKEN_SUB_EXPR parse token} {
expr {27||3? 3<<(1+4) : 4&&9}
} 96
test compExpr-2.13 {CompileSubExpr procedure, error in TCL_TOKEN_SUB_EXPR parse token} {
catch {unset a}
set a 15
list [catch {expr {27 || "$a[expr 1+]00"}} msg] $msg
} {1 {syntax error in expression "1+": premature end of expression}}
test compExpr-2.14 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, op found} {
expr {5*6}
} 30
test compExpr-2.15 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, math function found} {
format %.6g [expr {sin(2.0)}]
} 0.909297
test compExpr-2.16 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, math function not found} {
|
| ︙ | ︙ | |||
153 154 155 156 157 158 159 |
expr {$a==15} ;# compiled out-of-line to runtime call on Tcl_ExprObjCmd
} 1
test compExpr-2.34 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, special operator} {
expr {+2}
} 2
test compExpr-2.35 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, error in special operator} {
list [catch {expr {+[expr 1+]}} msg] $msg
| | | | | | | | 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 |
expr {$a==15} ;# compiled out-of-line to runtime call on Tcl_ExprObjCmd
} 1
test compExpr-2.34 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, special operator} {
expr {+2}
} 2
test compExpr-2.35 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, error in special operator} {
list [catch {expr {+[expr 1+]}} msg] $msg
} {1 {syntax error in expression "1+": premature end of expression}}
test compExpr-2.36 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, special operator} {
expr {4+2}
} 6
test compExpr-2.37 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, error in special operator} {
list [catch {expr {[expr 1+]+5}} msg] $msg
} {1 {syntax error in expression "1+": premature end of expression}}
test compExpr-2.38 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, error in special operator} {
list [catch {expr {5+[expr 1+]}} msg] $msg
} {1 {syntax error in expression "1+": premature end of expression}}
test compExpr-2.39 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, special operator} {
expr {-2}
} -2
test compExpr-2.40 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, special operator} {
expr {4-2}
} 2
test compExpr-2.41 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, special operator} {
catch {unset a}
set a true
expr {0||$a}
} 1
test compExpr-2.42 {CompileSubExpr procedure, error in TCL_TOKEN_SUB_EXPR parse token} {
catch {unset a}
set a 15
list [catch {expr {27 || "$a[expr 1+]00"}} msg] $msg
} {1 {syntax error in expression "1+": premature end of expression}}
test compExpr-2.43 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, special operator} {
catch {unset a}
set a false
expr {3&&$a}
} 0
test compExpr-2.44 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, special operator} {
catch {unset a}
set a false
expr {$a||1? 1 : 0}
} 1
test compExpr-2.45 {CompileSubExpr procedure, error in TCL_TOKEN_SUB_EXPR parse token} {
catch {unset a}
set a 15
list [catch {expr {1? 54 : "$a[expr 1+]00"}} msg] $msg
} {1 {syntax error in expression "1+": premature end of expression}}
test compExpr-3.1 {CompileLandOrLorExpr procedure, numeric 1st operand} {
catch {unset a}
set a 2
expr {[set a]||0}
} 1
test compExpr-3.2 {CompileLandOrLorExpr procedure, nonnumeric 1st operand} {
catch {unset a}
set a no
expr {$a&&1}
} 0
test compExpr-3.3 {CompileSubExpr procedure, error in 1st operand} {
list [catch {expr {[expr *2]||0}} msg] $msg
} {1 {syntax error in expression "*2": unexpected operator *}}
test compExpr-3.4 {CompileLandOrLorExpr procedure, result is 1 or 0} {
catch {unset a}
catch {unset b}
set a no
set b true
expr {$a || $b}
} 1
|
| ︙ | ︙ | |||
237 238 239 240 241 242 243 |
test compExpr-3.8 {CompileLandOrLorExpr procedure, nonnumeric 2nd operand} {
catch {unset a}
set a no
expr {1&&$a}
} 0
test compExpr-3.9 {CompileLandOrLorExpr procedure, error in 2nd operand} {
list [catch {expr {0||[expr %2]}} msg] $msg
| | | | | | 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 |
test compExpr-3.8 {CompileLandOrLorExpr procedure, nonnumeric 2nd operand} {
catch {unset a}
set a no
expr {1&&$a}
} 0
test compExpr-3.9 {CompileLandOrLorExpr procedure, error in 2nd operand} {
list [catch {expr {0||[expr %2]}} msg] $msg
} {1 {syntax error in expression "%2": unexpected operator %}}
test compExpr-3.10 {CompileLandOrLorExpr procedure, long lor/land arm} {
set a "abcdefghijkl"
set i 7
expr {[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]] || [string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]] || [string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]] || [string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]}
} 1
test compExpr-4.1 {CompileCondExpr procedure, simple test} {
catch {unset a}
set a 2
expr {($a > 1)? "ok" : "nope"}
} ok
test compExpr-4.2 {CompileCondExpr procedure, complex test, convert to numeric} {
catch {unset a}
set a no
expr {[set a]? 27 : -54}
} -54
test compExpr-4.3 {CompileCondExpr procedure, error in test} {
list [catch {expr {[expr *2]? +1 : -1}} msg] $msg
} {1 {syntax error in expression "*2": unexpected operator *}}
test compExpr-4.4 {CompileCondExpr procedure, simple "true" clause} {
catch {unset a}
set a no
expr {1? (27-2) : -54}
} 25
test compExpr-4.5 {CompileCondExpr procedure, convert "true" clause to numeric} {
catch {unset a}
set a no
expr {1? $a : -54}
} no
test compExpr-4.6 {CompileCondExpr procedure, error in "true" clause} {
list [catch {expr {1? [expr *2] : -127}} msg] $msg
} {1 {syntax error in expression "*2": unexpected operator *}}
test compExpr-4.7 {CompileCondExpr procedure, simple "false" clause} {
catch {unset a}
set a no
expr {(2-2)? -3.14159 : "nope"}
} nope
test compExpr-4.8 {CompileCondExpr procedure, convert "false" clause to numeric} {
catch {unset a}
set a 00123
expr {0? 42 : $a}
} 83
test compExpr-4.9 {CompileCondExpr procedure, error in "false" clause} {
list [catch {expr {1? 15 : [expr *2]}} msg] $msg
} {1 {syntax error in expression "*2": unexpected operator *}}
test compExpr-5.1 {CompileMathFuncCall procedure, math function found} {
format %.6g [expr atan2(1.0, 2.0)]
} 0.463648
test compExpr-5.2 {CompileMathFuncCall procedure, math function not found} {
list [catch {expr {do_it()}} msg] $msg
} {1 {unknown math function "do_it"}}
|
| ︙ | ︙ | |||
306 307 308 309 310 311 312 |
list [catch {expr {atan2(1.0)}} msg] $msg
} {1 {too few arguments for math function}}
test compExpr-5.6 {CompileMathFuncCall procedure, complex argument} {
format %.6g [expr pow(2.1, 27.5-(24.4*(5%2)))]
} 9.97424
test compExpr-5.7 {CompileMathFuncCall procedure, error in argument} {
list [catch {expr {sinh(2.*)}} msg] $msg
| | | < < < < < < < < < < < < | 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 |
list [catch {expr {atan2(1.0)}} msg] $msg
} {1 {too few arguments for math function}}
test compExpr-5.6 {CompileMathFuncCall procedure, complex argument} {
format %.6g [expr pow(2.1, 27.5-(24.4*(5%2)))]
} 9.97424
test compExpr-5.7 {CompileMathFuncCall procedure, error in argument} {
list [catch {expr {sinh(2.*)}} msg] $msg
} {1 {syntax error in expression "sinh(2.*)": unexpected close parenthesis}}
test compExpr-5.8 {CompileMathFuncCall procedure, too many arguments} {
list [catch {expr {sinh(2.0, 3.0)}} msg] $msg
} {1 {too many arguments for math function}}
test compExpr-5.9 {CompileMathFuncCall procedure, too many arguments} {
list [catch {expr {0 <= rand(5.2)}} msg] $msg
} {1 {too many arguments for math function}}
test compExpr-6.1 {LogSyntaxError procedure, error in expr longer than 60 chars} {
list [catch {expr {(+0123456)*(+0123456)*(+0123456)*(+0123456)*(+0123456)*(+0123456)*(+0123456)/} -1 foo 3} msg] $msg
} {1 {syntax error in expression "(+0123456)*(+0123456)*(+0123456)*(+0123456)*(+0123456)*(+012...": extra tokens at end of expression}}
# cleanup
catch {unset a}
catch {unset b}
::tcltest::cleanupTests
return
|
Changes to tests/compile.test.
1 2 3 4 5 6 7 8 9 10 11 12 13 | # This file contains tests for the files tclCompile.c, tclCompCmds.c # and tclLiteral.c # # This file contains a collection of tests for one or more of the Tcl # built-in commands. Sourcing this file into Tcl runs the tests and # generates output for errors. No output means no errors were found. # # Copyright (c) 1997 by Sun Microsystems, Inc. # Copyright (c) 1998-1999 by Scriptics Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# This file contains tests for the files tclCompile.c, tclCompCmds.c
# and tclLiteral.c
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands. Sourcing this file into Tcl runs the tests and
# generates output for errors. No output means no errors were found.
#
# Copyright (c) 1997 by Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: compile.test,v 1.13.2.1 2002/02/05 02:22:03 wolfsuit Exp $
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
namespace import -force ::tcltest::*
}
# The following tests are very incomplete, although the rest of the
|
| ︙ | ︙ | |||
226 227 228 229 230 231 232 |
test compile-11.6 {Tcl_Append*: ensure Tcl_ResetResult is used properly} {
proc p {} { set r [list foobar] ; incr foo bogus }
list [catch {p} msg] $msg
} {1 {expected integer but got "bogus"}}
test compile-11.7 {Tcl_Append*: ensure Tcl_ResetResult is used properly} {
proc p {} { set r [list foobar] ; expr !a }
list [catch {p} msg] $msg
| | | | 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 |
test compile-11.6 {Tcl_Append*: ensure Tcl_ResetResult is used properly} {
proc p {} { set r [list foobar] ; incr foo bogus }
list [catch {p} msg] $msg
} {1 {expected integer but got "bogus"}}
test compile-11.7 {Tcl_Append*: ensure Tcl_ResetResult is used properly} {
proc p {} { set r [list foobar] ; expr !a }
list [catch {p} msg] $msg
} {1 {syntax error in expression "!a": variable references require preceding $}}
test compile-11.8 {Tcl_Append*: ensure Tcl_ResetResult is used properly} {
proc p {} { set r [list foobar] ; expr {!a} }
list [catch {p} msg] $msg
} {1 {syntax error in expression "!a": variable references require preceding $}}
test compile-11.9 {Tcl_Append*: ensure Tcl_ResetResult is used properly} {
proc p {} { set r [list foobar] ; llength "\{" }
list [catch {p} msg] $msg
} {1 {unmatched open brace in list}}
#
# Special section for tests of tclLiteral.c
|
| ︙ | ︙ | |||
281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 |
} source.file
set res [catch {
exec [info nameofexecutable] source.file
}]
catch {::tcltest::removeFile source.file}
set res
} 0
# cleanup
catch {rename p ""}
catch {namespace delete test_ns_compile}
catch {unset x}
catch {unset y}
catch {unset a}
::tcltest::cleanupTests
return
| > > > > > > > > > > > > > | 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 |
} source.file
set res [catch {
exec [info nameofexecutable] source.file
}]
catch {::tcltest::removeFile source.file}
set res
} 0
# Special test for underestimating the maxStackSize required for a
# compiled command. A failure will cause a segfault in the child
# process.
test compile-13.1 {testing underestimate of maxStackSize in list cmd} {execCommandExists} {
set body {set x [list}
for {set i 0} {$i < 3000} {incr i} {
append body " $i"
}
append body {]; puts OK}
regsub BODY {proc crash {} {BODY}; crash} $body script
list [catch {exec [info nameofexecutable] << $script} msg] $msg
} {0 OK}
# cleanup
catch {rename p ""}
catch {namespace delete test_ns_compile}
catch {unset x}
catch {unset y}
catch {unset a}
::tcltest::cleanupTests
return
|
Changes to tests/error.test.
1 2 3 4 5 6 7 8 9 10 11 12 13 | # Commands covered: error, catch # # This file contains a collection of tests for one or more of the Tcl # built-in commands. Sourcing this file into Tcl runs the tests and # generates output for errors. No output means no errors were found. # # Copyright (c) 1991-1993 The Regents of the University of California. # Copyright (c) 1994-1996 Sun Microsystems, Inc. # Copyright (c) 1998-1999 by Scriptics Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# Commands covered: error, catch
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands. Sourcing this file into Tcl runs the tests and
# generates output for errors. No output means no errors were found.
#
# Copyright (c) 1991-1993 The Regents of the University of California.
# Copyright (c) 1994-1996 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: error.test,v 1.8.10.1 2002/02/05 02:22:03 wolfsuit Exp $
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
namespace import -force ::tcltest::*
}
proc foo {} {
|
| ︙ | ︙ | |||
43 44 45 46 47 48 49 |
test error-1.3 {simple errors from commands} {
catch {format [string index]} b
set errorInfo
# this used to return '... while executing ...', but
# string index is fully compiled as of 8.4a3
} {wrong # args: should be "string index string charIndex"
| | | < < | 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
test error-1.3 {simple errors from commands} {
catch {format [string index]} b
set errorInfo
# this used to return '... while executing ...', but
# string index is fully compiled as of 8.4a3
} {wrong # args: should be "string index string charIndex"
while executing
"string index"}
test error-1.4 {simple errors from commands} {
catch {error glorp} b
} 1
test error-1.5 {simple errors from commands} {
catch {error glorp} b
|
| ︙ | ︙ |
Changes to tests/event.test.
1 2 3 4 5 6 7 8 9 10 11 | # This file contains a collection of tests for the procedures in the file # tclEvent.c, which includes the "update", and "vwait" Tcl # commands. Sourcing this file into Tcl runs the tests and generates # output for errors. No output means no errors were found. # # Copyright (c) 1995-1997 Sun Microsystems, Inc. # Copyright (c) 1998-1999 by Scriptics Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# This file contains a collection of tests for the procedures in the file
# tclEvent.c, which includes the "update", and "vwait" Tcl
# commands. Sourcing this file into Tcl runs the tests and generates
# output for errors. No output means no errors were found.
#
# Copyright (c) 1995-1997 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: event.test,v 1.13.8.1 2002/02/05 02:22:03 wolfsuit Exp $
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
namespace import -force ::tcltest::*
}
set ::tcltest::testConstraints(testfilehandler) \
|
| ︙ | ︙ | |||
271 272 273 274 275 276 277 278 279 280 281 282 283 284 |
lappend errRes "tk:$err";
}
after 0 {error err1}
update
rename tkerror {}
set errRes
} bg:err1
# someday : add a test checking that
# when there is no bgerror, an error msg goes to stderr
# ideally one would use sub interp and transfer a fake stderr
# to it, unfortunatly the current interp tcl API does not allow
# that. the other option would be to use fork a test but it
# then becomes more a file/exec test than a bgerror test.
| > > > > > > > > > > > > > > > > | 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 |
lappend errRes "tk:$err";
}
after 0 {error err1}
update
rename tkerror {}
set errRes
} bg:err1
testConstraint exec [llength [info commands exec]]
test event-7.5 {correct behaviour when there is no bgerror [Bug 219142]} {exec} {
set script {
after 1000 error hello
after 2000 set a 0
vwait a
}
list [catch {exec [info nameofexecutable] << $script} errMsg] $errMsg
} {1 {hello
while executing
"error hello"
("after" script)}}
# someday : add a test checking that
# when there is no bgerror, an error msg goes to stderr
# ideally one would use sub interp and transfer a fake stderr
# to it, unfortunatly the current interp tcl API does not allow
# that. the other option would be to use fork a test but it
# then becomes more a file/exec test than a bgerror test.
|
| ︙ | ︙ |
Changes to tests/exec.test.
1 2 3 4 5 6 7 8 9 10 11 12 13 | # Commands covered: exec # # This file contains a collection of tests for one or more of the Tcl # built-in commands. Sourcing this file into Tcl runs the tests and # generates output for errors. No output means no errors were found. # # Copyright (c) 1991-1994 The Regents of the University of California. # Copyright (c) 1994-1997 Sun Microsystems, Inc. # Copyright (c) 1998-1999 by Scriptics Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# Commands covered: exec
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands. Sourcing this file into Tcl runs the tests and
# generates output for errors. No output means no errors were found.
#
# Copyright (c) 1991-1994 The Regents of the University of California.
# Copyright (c) 1994-1997 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: exec.test,v 1.8.18.1 2002/02/05 02:22:03 wolfsuit Exp $
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
namespace import -force ::tcltest::*
}
# All tests require the "exec" command.
|
| ︙ | ︙ | |||
224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 |
puts $f "Line 3"
close $f
exec $::tcltest::tcltest cat gorp.file
} "Line 1\nfoo bar\nxyzzy\nLine 3"
# I/O redirection: input from file.
exec $::tcltest::tcltest echo "Just a few thoughts" > gorp.file
test exec-5.1 {redirecting input from file} {execCommandExists stdio} {
exec $::tcltest::tcltest cat < gorp.file
} {Just a few thoughts}
test exec-5.2 {redirecting input from file} {execCommandExists stdio} {
exec $::tcltest::tcltest cat | $::tcltest::tcltest cat < gorp.file
} {Just a few thoughts}
test exec-5.3 {redirecting input from file} {execCommandExists stdio} {
| > > | 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 |
puts $f "Line 3"
close $f
exec $::tcltest::tcltest cat gorp.file
} "Line 1\nfoo bar\nxyzzy\nLine 3"
# I/O redirection: input from file.
if { [set ::tcltest::testConstraints(execCommandExists)] } {
exec $::tcltest::tcltest echo "Just a few thoughts" > gorp.file
}
test exec-5.1 {redirecting input from file} {execCommandExists stdio} {
exec $::tcltest::tcltest cat < gorp.file
} {Just a few thoughts}
test exec-5.2 {redirecting input from file} {execCommandExists stdio} {
exec $::tcltest::tcltest cat | $::tcltest::tcltest cat < gorp.file
} {Just a few thoughts}
test exec-5.3 {redirecting input from file} {execCommandExists stdio} {
|
| ︙ | ︙ | |||
428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 |
close $f
string compare "foo" [exec $::tcltest::tcltest gorp.file]
} 0
# Make sure that background commands are properly reaped when
# they eventually die.
exec $::tcltest::tcltest sleep 3
test exec-12.1 {reaping background processes} \
{execCommandExists stdio unixOnly nonPortable} {
for {set i 0} {$i < 20} {incr i} {
exec echo foo > /dev/null &
}
exec sleep 1
catch {exec ps | fgrep "echo foo" | fgrep -v fgrep | wc} msg
| > > | 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 |
close $f
string compare "foo" [exec $::tcltest::tcltest gorp.file]
} 0
# Make sure that background commands are properly reaped when
# they eventually die.
if { [set ::tcltest::testConstraints(execCommandExists)] } {
exec $::tcltest::tcltest sleep 3
}
test exec-12.1 {reaping background processes} \
{execCommandExists stdio unixOnly nonPortable} {
for {set i 0} {$i < 20} {incr i} {
exec echo foo > /dev/null &
}
exec sleep 1
catch {exec ps | fgrep "echo foo" | fgrep -v fgrep | wc} msg
|
| ︙ | ︙ |
Changes to tests/expr-old.test.
| ︙ | ︙ | |||
9 10 11 12 13 14 15 | # Copyright (c) 1991-1994 The Regents of the University of California. # Copyright (c) 1994-1997 Sun Microsystems, Inc. # Copyright (c) 1998-2000 by Scriptics Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # | | | 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# Copyright (c) 1991-1994 The Regents of the University of California.
# Copyright (c) 1994-1997 Sun Microsystems, Inc.
# Copyright (c) 1998-2000 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: expr-old.test,v 1.11.12.1 2002/02/05 02:22:03 wolfsuit Exp $
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
namespace import -force ::tcltest::*
}
if {([catch {expr T1()} msg] == 1) && ($msg == {unknown math function "T1"})} {
|
| ︙ | ︙ | |||
436 437 438 439 440 441 442 |
# Various error conditions.
test expr-old-26.1 {error conditions} {
list [catch {expr 2+"a"} msg] $msg
} {1 {can't use non-numeric string as operand of "+"}}
test expr-old-26.2 {error conditions} {
list [catch {expr 2+4*} msg] $msg
| | | | | | | | | | | | 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 |
# Various error conditions.
test expr-old-26.1 {error conditions} {
list [catch {expr 2+"a"} msg] $msg
} {1 {can't use non-numeric string as operand of "+"}}
test expr-old-26.2 {error conditions} {
list [catch {expr 2+4*} msg] $msg
} {1 {syntax error in expression "2+4*": premature end of expression}}
test expr-old-26.3 {error conditions} {
list [catch {expr 2+4*(} msg] $msg
} {1 {syntax error in expression "2+4*(": premature end of expression}}
catch {unset _non_existent_}
test expr-old-26.4 {error conditions} {
list [catch {expr 2+$_non_existent_} msg] $msg
} {1 {can't read "_non_existent_": no such variable}}
set a xx
test expr-old-26.5 {error conditions} {
list [catch {expr {2+$a}} msg] $msg
} {1 {can't use non-numeric string as operand of "+"}}
test expr-old-26.6 {error conditions} {
list [catch {expr {2+[set a]}} msg] $msg
} {1 {can't use non-numeric string as operand of "+"}}
test expr-old-26.7 {error conditions} {
list [catch {expr {2+(4}} msg] $msg
} {1 {syntax error in expression "2+(4": looking for close parenthesis}}
test expr-old-26.8 {error conditions} {
list [catch {expr 2/0} msg] $msg $errorCode
} {1 {divide by zero} {ARITH DIVZERO {divide by zero}}}
test expr-old-26.9 {error conditions} {
list [catch {expr 2%0} msg] $msg $errorCode
} {1 {divide by zero} {ARITH DIVZERO {divide by zero}}}
test expr-old-26.10 {error conditions} {
list [catch {expr 2.0/0.0} msg] $msg $errorCode
} {1 {divide by zero} {ARITH DIVZERO {divide by zero}}}
test expr-old-26.11 {error conditions} {
list [catch {expr 2#} msg] $msg
} {1 {syntax error in expression "2#": extra tokens at end of expression}}
test expr-old-26.12 {error conditions} {
list [catch {expr a.b} msg] $msg
} {1 {syntax error in expression "a.b": variable references require preceding $}}
test expr-old-26.13 {error conditions} {
list [catch {expr {"a"/"b"}} msg] $msg
} {1 {can't use non-numeric string as operand of "/"}}
test expr-old-26.14 {error conditions} {
list [catch {expr 2:3} msg] $msg
} {1 {syntax error in expression "2:3": extra tokens at end of expression}}
test expr-old-26.15 {error conditions} {
list [catch {expr a@b} msg] $msg
} {1 {syntax error in expression "a@b": variable references require preceding $}}
test expr-old-26.16 {error conditions} {
list [catch {expr a[b} msg] $msg
} {1 {missing close-bracket}}
test expr-old-26.17 {error conditions} {
list [catch {expr a`b} msg] $msg
} {1 {syntax error in expression "a`b": variable references require preceding $}}
test expr-old-26.18 {error conditions} {
list [catch {expr \"a\"\{b} msg] $msg
} {1 syntax\ error\ in\ expression\ \"\"a\"\{b\":\ extra\ tokens\ at\ end\ of\ expression}
test expr-old-26.19 {error conditions} {
list [catch {expr a} msg] $msg
} {1 {syntax error in expression "a": variable references require preceding $}}
test expr-old-26.20 {error conditions} {
list [catch expr msg] $msg
} {1 {wrong # args: should be "expr arg ?arg ...?"}}
# Cancelled evaluation.
test expr-old-27.1 {cancelled evaluation} {
|
| ︙ | ︙ | |||
539 540 541 542 543 544 545 |
} {0 1}
test expr-old-27.10 {cancelled evaluation} {
set x -1.0
list [catch {expr {($x > 0) ? round(log($x)) : 0}} msg] $msg
} {0 0}
test expr-old-27.11 {cancelled evaluation} {
list [catch {expr {0 && foo}} msg] $msg
| | | | 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 |
} {0 1}
test expr-old-27.10 {cancelled evaluation} {
set x -1.0
list [catch {expr {($x > 0) ? round(log($x)) : 0}} msg] $msg
} {0 0}
test expr-old-27.11 {cancelled evaluation} {
list [catch {expr {0 && foo}} msg] $msg
} {1 {syntax error in expression "0 && foo": variable references require preceding $}}
test expr-old-27.12 {cancelled evaluation} {
list [catch {expr {0 ? 1 : foo}} msg] $msg
} {1 {syntax error in expression "0 ? 1 : foo": variable references require preceding $}}
# Tcl_ExprBool as used in "if" statements
test expr-old-28.1 {Tcl_ExprBoolean usage} {
set a 1
if {2} {set a 2}
set a
|
| ︙ | ︙ | |||
642 643 644 645 646 647 648 |
# Expressions spanning multiple arguments
test expr-old-31.1 {multiple arguments to expr command} {
expr 4 + ( 6 *12) -3
} 73
test expr-old-31.2 {multiple arguments to expr command} {
list [catch {expr 2 + (3 + 4} msg] $msg
| | | | | 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 |
# Expressions spanning multiple arguments
test expr-old-31.1 {multiple arguments to expr command} {
expr 4 + ( 6 *12) -3
} 73
test expr-old-31.2 {multiple arguments to expr command} {
list [catch {expr 2 + (3 + 4} msg] $msg
} {1 {syntax error in expression "2 + (3 + 4": looking for close parenthesis}}
test expr-old-31.3 {multiple arguments to expr command} {
list [catch {expr 2 + 3 +} msg] $msg
} {1 {syntax error in expression "2 + 3 +": premature end of expression}}
test expr-old-31.4 {multiple arguments to expr command} {
list [catch {expr 2 + 3 )} msg] $msg
} {1 {syntax error in expression "2 + 3 )": extra tokens at end of expression}}
# Math functions
test expr-old-32.1 {math functions in expressions} {
format %.6g [expr acos(0.5)]
} {1.0472}
test expr-old-32.2 {math functions in expressions} {
|
| ︙ | ︙ | |||
846 847 848 849 850 851 852 |
} 0.1
test expr-old-34.1 {errors in math functions} {
list [catch {expr func_2(1.0)} msg] $msg
} {1 {unknown math function "func_2"}}
test expr-old-34.2 {errors in math functions} {
list [catch {expr func|(1.0)} msg] $msg
| | | | | | 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 |
} 0.1
test expr-old-34.1 {errors in math functions} {
list [catch {expr func_2(1.0)} msg] $msg
} {1 {unknown math function "func_2"}}
test expr-old-34.2 {errors in math functions} {
list [catch {expr func|(1.0)} msg] $msg
} {1 {syntax error in expression "func|(1.0)": variable references require preceding $}}
test expr-old-34.3 {errors in math functions} {
list [catch {expr {hypot("a b", 2.0)}} msg] $msg
} {1 {argument to math function didn't have numeric value}}
test expr-old-34.4 {errors in math functions} {
list [catch {expr hypot(1.0 2.0)} msg] $msg
} {1 {syntax error in expression "hypot(1.0 2.0)": missing close parenthesis at end of function call}}
test expr-old-34.5 {errors in math functions} {
list [catch {expr hypot(1.0, 2.0} msg] $msg
} {1 {syntax error in expression "hypot(1.0, 2.0": missing close parenthesis at end of function call}}
test expr-old-34.6 {errors in math functions} {
list [catch {expr hypot(1.0 ,} msg] $msg
} {1 {syntax error in expression "hypot(1.0 ,": premature end of expression}}
test expr-old-34.7 {errors in math functions} {
list [catch {expr hypot(1.0)} msg] $msg
} {1 {too few arguments for math function}}
test expr-old-34.8 {errors in math functions} {
list [catch {expr hypot(1.0, 2.0, 3.0)} msg] $msg
} {1 {too many arguments for math function}}
test expr-old-34.9 {errors in math functions} {
|
| ︙ | ︙ | |||
946 947 948 949 950 951 952 |
if {[info commands testexprstring] == {}} {
puts "This application hasn't been compiled with the \"testexprstring\""
puts "command, so I can't test Tcl_ExprString etc."
} else {
test expr-old-38.1 {Verify Tcl_ExprString's basic operation} {
list [testexprstring "1+4"] [testexprstring "2*3+4.2"] \
[catch {testexprstring "1+"} msg] $msg
| | < < < < < < < < < < < < | 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 |
if {[info commands testexprstring] == {}} {
puts "This application hasn't been compiled with the \"testexprstring\""
puts "command, so I can't test Tcl_ExprString etc."
} else {
test expr-old-38.1 {Verify Tcl_ExprString's basic operation} {
list [testexprstring "1+4"] [testexprstring "2*3+4.2"] \
[catch {testexprstring "1+"} msg] $msg
} {5 10.2 1 {syntax error in expression "1+": premature end of expression}}
}
# Special test for Pentium arithmetic bug of 1994:
if {(4195835.0 - (4195835.0/3145727.0)*3145727.0) == 256.0} {
puts "Warning: this machine contains a defective Pentium processor"
puts "that performs arithmetic incorrectly. I recommend that you"
puts "call Intel customer service immediately at 1-800-628-8686"
puts "to request a replacement processor."
}
# cleanup
::tcltest::cleanupTests
return
|
Changes to tests/expr.test.
1 2 3 4 5 6 7 8 9 10 11 12 | # Commands covered: expr # # This file contains a collection of tests for one or more of the Tcl # built-in commands. Sourcing this file into Tcl runs the tests and # generates output for errors. No output means no errors were found. # # Copyright (c) 1996-1997 Sun Microsystems, Inc. # Copyright (c) 1998-2000 by Scriptics Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# Commands covered: expr
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands. Sourcing this file into Tcl runs the tests and
# generates output for errors. No output means no errors were found.
#
# Copyright (c) 1996-1997 Sun Microsystems, Inc.
# Copyright (c) 1998-2000 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: expr.test,v 1.12.12.1 2002/02/05 02:22:03 wolfsuit Exp $
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
namespace import -force ::tcltest::*
}
if {([catch {expr T1()} msg] == 1) && ($msg == {unknown math function "T1"})} {
|
| ︙ | ︙ | |||
134 135 136 137 138 139 140 |
test expr-2.1 {TclCompileExpr: are builtin functions registered?} {
expr double(5*[llength "6 2"])
} 10.0
test expr-2.2 {TclCompileExpr: error in expr} {
catch {expr 2**3} msg
set msg
| | | | | | | | | | | | | | | | | | | | | | | | | | | 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 |
test expr-2.1 {TclCompileExpr: are builtin functions registered?} {
expr double(5*[llength "6 2"])
} 10.0
test expr-2.2 {TclCompileExpr: error in expr} {
catch {expr 2**3} msg
set msg
} {syntax error in expression "2**3": unexpected operator *}
test expr-2.3 {TclCompileExpr: junk after legal expr} {
catch {expr 7*[llength "a b"]foo} msg
set msg
} {syntax error in expression "7*2foo": extra tokens at end of expression}
test expr-2.4 {TclCompileExpr: numeric expr string rep == formatted int rep} {
expr {0001}
} 1
test expr-3.1 {CompileCondExpr: just lor expr} {expr 3||0} 1
test expr-3.2 {CompileCondExpr: error in lor expr} {
catch {expr x||3} msg
set msg
} {syntax error in expression "x||3": variable references require preceding $}
test expr-3.3 {CompileCondExpr: test true arm} {expr 3>2?44:66} 44
test expr-3.4 {CompileCondExpr: error compiling true arm} {
catch {expr 3>2?2**3:66} msg
set msg
} {syntax error in expression "3>2?2**3:66": unexpected operator *}
test expr-3.5 {CompileCondExpr: test false arm} {expr 2>3?44:66} 66
test expr-3.6 {CompileCondExpr: error compiling false arm} {
catch {expr 2>3?44:2**3} msg
set msg
} {syntax error in expression "2>3?44:2**3": unexpected operator *}
test expr-3.7 {CompileCondExpr: long arms & nested cond exprs} {unixOnly nonPortable} {
puts "Note: doing test expr-3.7 which can take several minutes to run"
hello_world
} {Hello world}
catch {unset xxx}
test expr-3.8 {CompileCondExpr: long arms & nested cond exprs} {unixOnly nonPortable} {
puts "Note: doing test expr-3.8 which can take several minutes to run"
do_twelve_days
} 2358
catch {unset xxx}
test expr-4.1 {CompileLorExpr: just land expr} {expr 1.3&&3.3} 1
test expr-4.2 {CompileLorExpr: error in land expr} {
catch {expr x&&3} msg
set msg
} {syntax error in expression "x&&3": variable references require preceding $}
test expr-4.3 {CompileLorExpr: simple lor exprs} {expr 0||1.0} 1
test expr-4.4 {CompileLorExpr: simple lor exprs} {expr 3.0||0.0} 1
test expr-4.5 {CompileLorExpr: simple lor exprs} {expr 0||0||1} 1
test expr-4.6 {CompileLorExpr: error compiling lor arm} {
catch {expr 2**3||4.0} msg
set msg
} {syntax error in expression "2**3||4.0": unexpected operator *}
test expr-4.7 {CompileLorExpr: error compiling lor arm} {
catch {expr 1.3||2**3} msg
set msg
} {syntax error in expression "1.3||2**3": unexpected operator *}
test expr-4.8 {CompileLorExpr: error compiling lor arms} {
list [catch {expr {"a"||"b"}} msg] $msg
} {1 {expected boolean value but got "a"}}
test expr-4.9 {CompileLorExpr: long lor arm} {
set a "abcdefghijkl"
set i 7
expr {[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]] || [string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]] || [string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]] || [string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]}
} 1
test expr-5.1 {CompileLandExpr: just bitor expr} {expr 7|0x13} 23
test expr-5.2 {CompileLandExpr: error in bitor expr} {
catch {expr x|3} msg
set msg
} {syntax error in expression "x|3": variable references require preceding $}
test expr-5.3 {CompileLandExpr: simple land exprs} {expr 0&&1.0} 0
test expr-5.4 {CompileLandExpr: simple land exprs} {expr 0&&0} 0
test expr-5.5 {CompileLandExpr: simple land exprs} {expr 3.0&&1.2} 1
test expr-5.6 {CompileLandExpr: simple land exprs} {expr 1&&1&&2} 1
test expr-5.7 {CompileLandExpr: error compiling land arm} {
catch {expr 2**3&&4.0} msg
set msg
} {syntax error in expression "2**3&&4.0": unexpected operator *}
test expr-5.8 {CompileLandExpr: error compiling land arm} {
catch {expr 1.3&&2**3} msg
set msg
} {syntax error in expression "1.3&&2**3": unexpected operator *}
test expr-5.9 {CompileLandExpr: error compiling land arm} {
list [catch {expr {"a"&&"b"}} msg] $msg
} {1 {expected boolean value but got "a"}}
test expr-5.10 {CompileLandExpr: long land arms} {
set a "abcdefghijkl"
set i 7
expr {[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]] && [string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]] && [string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]] && [string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]^[string compare [format %c 103] [string index $a $i]]^[string compare [format %c 105] [string index $a $i]]}
} 1
test expr-6.1 {CompileBitXorExpr: just bitand expr} {expr 7&0x13} 3
test expr-6.2 {CompileBitXorExpr: error in bitand expr} {
catch {expr x|3} msg
set msg
} {syntax error in expression "x|3": variable references require preceding $}
test expr-6.3 {CompileBitXorExpr: simple bitxor exprs} {expr 7^0x13} 20
test expr-6.4 {CompileBitXorExpr: simple bitxor exprs} {expr 3^0x10} 19
test expr-6.5 {CompileBitXorExpr: simple bitxor exprs} {expr 0^7} 7
test expr-6.6 {CompileBitXorExpr: simple bitxor exprs} {expr -1^7} -8
test expr-6.7 {CompileBitXorExpr: error compiling bitxor arm} {
catch {expr 2**3|6} msg
set msg
} {syntax error in expression "2**3|6": unexpected operator *}
test expr-6.8 {CompileBitXorExpr: error compiling bitxor arm} {
catch {expr 2^x} msg
set msg
} {syntax error in expression "2^x": variable references require preceding $}
test expr-6.9 {CompileBitXorExpr: runtime error in bitxor arm} {
list [catch {expr {24.0^3}} msg] $msg
} {1 {can't use floating-point value as operand of "^"}}
test expr-6.10 {CompileBitXorExpr: runtime error in bitxor arm} {
list [catch {expr {"a"^"b"}} msg] $msg
} {1 {can't use non-numeric string as operand of "^"}}
test expr-7.1 {CompileBitAndExpr: just equality expr} {expr 3==2} 0
test expr-7.2 {CompileBitAndExpr: just equality expr} {expr 2.0==2} 1
test expr-7.3 {CompileBitAndExpr: just equality expr} {expr 3.2!=2.2} 1
test expr-7.4 {CompileBitAndExpr: just equality expr} {expr {"abc" == "abd"}} 0
test expr-7.5 {CompileBitAndExpr: error in equality expr} {
catch {expr x==3} msg
set msg
} {syntax error in expression "x==3": variable references require preceding $}
test expr-7.6 {CompileBitAndExpr: simple bitand exprs} {expr 7&0x13} 3
test expr-7.7 {CompileBitAndExpr: simple bitand exprs} {expr 0xf2&0x53} 82
test expr-7.8 {CompileBitAndExpr: simple bitand exprs} {expr 3&6} 2
test expr-7.9 {CompileBitAndExpr: simple bitand exprs} {expr -1&-7} -7
test expr-7.10 {CompileBitAndExpr: error compiling bitand arm} {
catch {expr 2**3&6} msg
set msg
} {syntax error in expression "2**3&6": unexpected operator *}
test expr-7.11 {CompileBitAndExpr: error compiling bitand arm} {
catch {expr 2&x} msg
set msg
} {syntax error in expression "2&x": variable references require preceding $}
test expr-7.12 {CompileBitAndExpr: runtime error in bitand arm} {
list [catch {expr {24.0&3}} msg] $msg
} {1 {can't use floating-point value as operand of "&"}}
test expr-7.13 {CompileBitAndExpr: runtime error in bitand arm} {
list [catch {expr {"a"&"b"}} msg] $msg
} {1 {can't use non-numeric string as operand of "&"}}
test expr-7.14 {CompileBitAndExpr: equality expr} {expr 3eq2} 0
test expr-7.18 {CompileBitAndExpr: equality expr} {expr {"abc" eq "abd"}} 0
test expr-7.20 {CompileBitAndExpr: error in equality expr} {
catch {expr xne3} msg
set msg
} {syntax error in expression "xne3": variable references require preceding $}
test expr-8.1 {CompileEqualityExpr: just relational expr} {expr 3>=2} 1
test expr-8.2 {CompileEqualityExpr: just relational expr} {expr 2<=2.1} 1
test expr-8.3 {CompileEqualityExpr: just relational expr} {expr 3.2>"2.2"} 1
test expr-8.4 {CompileEqualityExpr: just relational expr} {expr {"0y"<"0x12"}} 0
test expr-8.5 {CompileEqualityExpr: error in relational expr} {
catch {expr x>3} msg
set msg
} {syntax error in expression "x>3": variable references require preceding $}
test expr-8.6 {CompileEqualityExpr: simple equality exprs} {expr 7==0x13} 0
test expr-8.7 {CompileEqualityExpr: simple equality exprs} {expr -0xf2!=0x53} 1
test expr-8.8 {CompileEqualityExpr: simple equality exprs} {expr {"12398712938788234-1298379" != ""}} 1
test expr-8.9 {CompileEqualityExpr: simple equality exprs} {expr -1!="abc"} 1
test expr-8.10 {CompileEqualityExpr: error compiling equality arm} {
catch {expr 2**3==6} msg
set msg
} {syntax error in expression "2**3==6": unexpected operator *}
test expr-8.11 {CompileEqualityExpr: error compiling equality arm} {
catch {expr 2!=x} msg
set msg
} {syntax error in expression "2!=x": variable references require preceding $}
test expr-8.14 {CompileBitAndExpr: equality expr} {expr {"a"eq"a"}} 1
test expr-8.14 {CompileBitAndExpr: equality expr} {expr {"\374" eq "ü"}} 1
test expr-8.14 {CompileBitAndExpr: equality expr} {expr 3eq2} 0
test expr-8.15 {CompileBitAndExpr: equality expr} {expr 2.0eq2} 0
test expr-8.16 {CompileBitAndExpr: equality expr} {expr 3.2ne2.2} 1
test expr-8.17 {CompileBitAndExpr: equality expr} {expr 01eq1} 0
test expr-8.18 {CompileBitAndExpr: equality expr} {expr {"abc" eq "abd"}} 0
test expr-8.19 {CompileBitAndExpr: equality expr} {expr {"abc" ne "abd"}} 1
test expr-8.20 {CompileBitAndExpr: error in equality expr} {
catch {expr x ne3} msg
set msg
} {syntax error in expression "x ne3": variable references require preceding $}
test expr-8.21 {CompileBitAndExpr: error in equality expr} {
# These should be ""ed to avoid the error
catch {expr a eq b} msg
set msg
} {syntax error in expression "a eq b": variable references require preceding $}
test expr-9.1 {CompileRelationalExpr: just shift expr} {expr 3<<2} 12
test expr-9.2 {CompileRelationalExpr: just shift expr} {expr 0xff>>2} 63
test expr-9.3 {CompileRelationalExpr: just shift expr} {expr -1>>2} -1
test expr-9.4 {CompileRelationalExpr: just shift expr} {expr {1<<3}} 8
# The following test is different for 32-bit versus 64-bit
|
| ︙ | ︙ | |||
335 336 337 338 339 340 341 |
test expr-9.5 {CompileRelationalExpr: shift expr producing LONG_MIN} {nonPortable} {
expr {1<<31}
} -2147483648
}
test expr-9.6 {CompileRelationalExpr: error in shift expr} {
catch {expr x>>3} msg
set msg
| | | | | | | | | | | | | | | | 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 |
test expr-9.5 {CompileRelationalExpr: shift expr producing LONG_MIN} {nonPortable} {
expr {1<<31}
} -2147483648
}
test expr-9.6 {CompileRelationalExpr: error in shift expr} {
catch {expr x>>3} msg
set msg
} {syntax error in expression "x>>3": variable references require preceding $}
test expr-9.7 {CompileRelationalExpr: simple relational exprs} {expr 0xff>=+0x3} 1
test expr-9.8 {CompileRelationalExpr: simple relational exprs} {expr -0xf2<0x3} 1
test expr-9.9 {CompileRelationalExpr: error compiling relational arm} {
catch {expr 2**3>6} msg
set msg
} {syntax error in expression "2**3>6": unexpected operator *}
test expr-9.10 {CompileRelationalExpr: error compiling relational arm} {
catch {expr 2<x} msg
set msg
} {syntax error in expression "2<x": variable references require preceding $}
test expr-10.1 {CompileShiftExpr: just add expr} {expr 4+-2} 2
test expr-10.2 {CompileShiftExpr: just add expr} {expr 0xff-2} 253
test expr-10.3 {CompileShiftExpr: just add expr} {expr -1--2} 1
test expr-10.4 {CompileShiftExpr: just add expr} {expr 1-0123} -82
test expr-10.5 {CompileShiftExpr: error in add expr} {
catch {expr x+3} msg
set msg
} {syntax error in expression "x+3": variable references require preceding $}
test expr-10.6 {CompileShiftExpr: simple shift exprs} {expr 0xff>>0x3} 31
test expr-10.7 {CompileShiftExpr: simple shift exprs} {expr -0xf2<<0x3} -1936
test expr-10.8 {CompileShiftExpr: error compiling shift arm} {
catch {expr 2**3>>6} msg
set msg
} {syntax error in expression "2**3>>6": unexpected operator *}
test expr-10.9 {CompileShiftExpr: error compiling shift arm} {
catch {expr 2<<x} msg
set msg
} {syntax error in expression "2<<x": variable references require preceding $}
test expr-10.10 {CompileShiftExpr: runtime error} {
list [catch {expr {24.0>>43}} msg] $msg
} {1 {can't use floating-point value as operand of ">>"}}
test expr-10.11 {CompileShiftExpr: runtime error} {
list [catch {expr {"a"<<"b"}} msg] $msg
} {1 {can't use non-numeric string as operand of "<<"}}
test expr-11.1 {CompileAddExpr: just multiply expr} {expr 4*-2} -8
test expr-11.2 {CompileAddExpr: just multiply expr} {expr 0xff%2} 1
test expr-11.3 {CompileAddExpr: just multiply expr} {expr -1/2} -1
test expr-11.4 {CompileAddExpr: just multiply expr} {expr 7891%0123} 6
test expr-11.5 {CompileAddExpr: error in multiply expr} {
catch {expr x*3} msg
set msg
} {syntax error in expression "x*3": variable references require preceding $}
test expr-11.6 {CompileAddExpr: simple add exprs} {expr 0xff++0x3} 258
test expr-11.7 {CompileAddExpr: simple add exprs} {expr -0xf2--0x3} -239
test expr-11.8 {CompileAddExpr: error compiling add arm} {
catch {expr 2**3+6} msg
set msg
} {syntax error in expression "2**3+6": unexpected operator *}
test expr-11.9 {CompileAddExpr: error compiling add arm} {
catch {expr 2-x} msg
set msg
} {syntax error in expression "2-x": variable references require preceding $}
test expr-11.10 {CompileAddExpr: runtime error} {
list [catch {expr {24.0+"xx"}} msg] $msg
} {1 {can't use non-numeric string as operand of "+"}}
test expr-11.11 {CompileAddExpr: runtime error} {
list [catch {expr {"a"-"b"}} msg] $msg
} {1 {can't use non-numeric string as operand of "-"}}
test expr-11.12 {CompileAddExpr: runtime error} {
list [catch {expr {3/0}} msg] $msg
} {1 {divide by zero}}
test expr-11.13 {CompileAddExpr: runtime error} {
list [catch {expr {2.3/0.0}} msg] $msg
} {1 {divide by zero}}
test expr-12.1 {CompileMultiplyExpr: just unary expr} {expr ~4} -5
test expr-12.2 {CompileMultiplyExpr: just unary expr} {expr --5} 5
test expr-12.3 {CompileMultiplyExpr: just unary expr} {expr !27} 0
test expr-12.4 {CompileMultiplyExpr: just unary expr} {expr ~0xff00ff} -16711936
test expr-12.5 {CompileMultiplyExpr: error in unary expr} {
catch {expr ~x} msg
set msg
} {syntax error in expression "~x": variable references require preceding $}
test expr-12.6 {CompileMultiplyExpr: simple multiply exprs} {expr 0xff*0x3} 765
test expr-12.7 {CompileMultiplyExpr: simple multiply exprs} {expr -0xf2%-0x3} -2
test expr-12.8 {CompileMultiplyExpr: error compiling multiply arm} {
catch {expr 2*3%%6} msg
set msg
} {syntax error in expression "2*3%%6": unexpected operator %}
test expr-12.9 {CompileMultiplyExpr: error compiling multiply arm} {
catch {expr 2*x} msg
set msg
} {syntax error in expression "2*x": variable references require preceding $}
test expr-12.10 {CompileMultiplyExpr: runtime error} {
list [catch {expr {24.0*"xx"}} msg] $msg
} {1 {can't use non-numeric string as operand of "*"}}
test expr-12.11 {CompileMultiplyExpr: runtime error} {
list [catch {expr {"a"/"b"}} msg] $msg
} {1 {can't use non-numeric string as operand of "/"}}
test expr-13.1 {CompileUnaryExpr: unary exprs} {expr -0xff} -255
test expr-13.2 {CompileUnaryExpr: unary exprs} {expr +000123} 83
test expr-13.3 {CompileUnaryExpr: unary exprs} {expr +--++36} 36
test expr-13.4 {CompileUnaryExpr: unary exprs} {expr !2} 0
test expr-13.5 {CompileUnaryExpr: unary exprs} {expr +--+-62.0} -62.0
test expr-13.6 {CompileUnaryExpr: unary exprs} {expr !0.0} 1
test expr-13.7 {CompileUnaryExpr: unary exprs} {expr !0xef} 0
test expr-13.8 {CompileUnaryExpr: error compiling unary expr} {
catch {expr ~x} msg
set msg
} {syntax error in expression "~x": variable references require preceding $}
test expr-13.9 {CompileUnaryExpr: error compiling unary expr} {
catch {expr !1.x} msg
set msg
} {syntax error in expression "!1.x": extra tokens at end of expression}
test expr-13.10 {CompileUnaryExpr: runtime error} {
list [catch {expr {~"xx"}} msg] $msg
} {1 {can't use non-numeric string as operand of "~"}}
test expr-13.11 {CompileUnaryExpr: runtime error} {
list [catch {expr ~4.0} msg] $msg
} {1 {can't use floating-point value as operand of "~"}}
test expr-13.12 {CompileUnaryExpr: just primary expr} {expr 0x123} 291
|
| ︙ | ︙ | |||
559 560 561 562 563 564 565 |
} 2.71828
test expr-14.26 {CompilePrimaryExpr: math function primary} {
format %.6g [expr pow(2.0+0.1,3.0+0.1)]
} 9.97424
test expr-14.27 {CompilePrimaryExpr: error in math function primary} {
catch {expr sinh::(2.0)} msg
set errorInfo
| | | | | | 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 |
} 2.71828
test expr-14.26 {CompilePrimaryExpr: math function primary} {
format %.6g [expr pow(2.0+0.1,3.0+0.1)]
} 9.97424
test expr-14.27 {CompilePrimaryExpr: error in math function primary} {
catch {expr sinh::(2.0)} msg
set errorInfo
} {syntax error in expression "sinh::(2.0)": expected parenthesis enclosing function arguments
while compiling
"expr sinh::(2.0)"}
test expr-14.28 {CompilePrimaryExpr: subexpression primary} {
expr 2+(3*4)
} 14
test expr-14.29 {CompilePrimaryExpr: error in subexpression primary} {
catch {expr 2+(3*[set])} msg
set errorInfo
} {wrong # args: should be "set varName ?newValue?"
while compiling
"set"
while compiling
"expr 2+(3*[set])"}
test expr-14.30 {CompilePrimaryExpr: missing paren in subexpression primary} {
catch {expr 2+(3*(4+5)} msg
set errorInfo
} {syntax error in expression "2+(3*(4+5)": looking for close parenthesis
while compiling
"expr 2+(3*(4+5)"}
test expr-14.31 {CompilePrimaryExpr: just var ref in subexpression primary} {
set i "5+10"
list "[expr $i] == 15" "[expr ($i)] == 15" "[eval expr ($i)] == 15"
} {{15 == 15} {15 == 15} {15 == 15}}
test expr-14.32 {CompilePrimaryExpr: unexpected token} {
catch {expr @} msg
set errorInfo
} {syntax error in expression "@": character not legal in expressions
while compiling
"expr @"}
test expr-15.1 {CompileMathFuncCall: missing parenthesis} {
catch {expr sinh2.0)} msg
set errorInfo
} {syntax error in expression "sinh2.0)": variable references require preceding $
while compiling
"expr sinh2.0)"}
test expr-15.2 {CompileMathFuncCall: unknown math function} {
catch {expr whazzathuh(1)} msg
set errorInfo
} {unknown math function "whazzathuh"
while compiling
|
| ︙ | ︙ | |||
623 624 625 626 627 628 629 |
set errorInfo
} {too few arguments for math function
while compiling
"expr pow(1)"}
test expr-15.6 {CompileMathFuncCall: missing ')'} {
catch {expr sin(1} msg
set errorInfo
| | | 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 |
set errorInfo
} {too few arguments for math function
while compiling
"expr pow(1)"}
test expr-15.6 {CompileMathFuncCall: missing ')'} {
catch {expr sin(1} msg
set errorInfo
} {syntax error in expression "sin(1": missing close parenthesis at end of function call
while compiling
"expr sin(1"}
if $gotT1 {
test expr-15.7 {CompileMathFuncCall: call registered math function} {
expr 2*T1()
} 246
test expr-15.8 {CompileMathFuncCall: call registered math function} {
|
| ︙ | ︙ | |||
729 730 731 732 733 734 735 |
set var "$counter + [concat $extraargs]"
}
}
trace variable exprtracevar r [list exprtraceproc 10]
list [catch {expr "$exprtracevar + 20"} a] $a \
[catch {expr "$exprtracevar + 20"} b] $b \
[unset exprtracevar exprtracecounter]
| | | 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 |
set var "$counter + [concat $extraargs]"
}
}
trace variable exprtracevar r [list exprtraceproc 10]
list [catch {expr "$exprtracevar + 20"} a] $a \
[catch {expr "$exprtracevar + 20"} b] $b \
[unset exprtracevar exprtracecounter]
} {1 {syntax error in expression "1 oops 10 + 20": extra tokens at end of expression} 0 32 {}}
test expr-20.3 {broken substitution of integer digits} {
# fails with 8.0.x, but not 8.1b2
list [set a 000; expr 0x1$a] [set a 1; expr ${a}000]
} {4096 1000}
test expr-20.4 {proper double evaluation compilation, error case} {
catch {unset a}; # make sure $a doesn't exist
list [catch {expr 1?{$a}:0} msg] $msg
|
| ︙ | ︙ |
Changes to tests/fileName.test.
1 2 3 4 5 6 7 8 9 10 11 12 | # This file tests the filename manipulation routines. # # This file contains a collection of tests for one or more of the Tcl # built-in commands. Sourcing this file into Tcl runs the tests and # generates output for errors. No output means no errors were found. # # Copyright (c) 1995-1996 Sun Microsystems, Inc. # Copyright (c) 1999 by Scriptics Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# This file tests the filename manipulation routines.
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands. Sourcing this file into Tcl runs the tests and
# generates output for errors. No output means no errors were found.
#
# Copyright (c) 1995-1996 Sun Microsystems, Inc.
# Copyright (c) 1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: fileName.test,v 1.14.8.1 2002/02/05 02:22:03 wolfsuit Exp $
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
namespace import -force ::tcltest::*
}
tcltest::testConstraint testsetplatform [string equal testsetplatform [info commands testsetplatform]]
|
| ︙ | ︙ | |||
300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 |
testsetplatform unix
file split ~foo/~bar/~baz
} {~foo ./~bar ./~baz}
test filename-4.18 {Tcl_SplitPath: unix} {testsetplatform} {
testsetplatform unix
file split foo/bar~/baz
} {foo bar~ baz}
test filename-4.19 {Tcl_SplitPath} {
set oldDir [pwd]
set res [catch {
file mkdir tildetmp
set nastydir [file join tildetmp ./~tilde]
file mkdir $nastydir
set norm [file normalize $nastydir]
cd tildetmp
cd ./~tilde
glob -nocomplain *
set idx [string first tildetmp $norm]
set norm [string range $norm $idx end]
# fix path away so all platforms are the same
regsub -all ":" $norm "/" norm
# make sure we can delete the directory we created
cd $oldDir
file delete -force $nastydir
set norm
} err]
cd $oldDir
| > > > > > > | 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 |
testsetplatform unix
file split ~foo/~bar/~baz
} {~foo ./~bar ./~baz}
test filename-4.18 {Tcl_SplitPath: unix} {testsetplatform} {
testsetplatform unix
file split foo/bar~/baz
} {foo bar~ baz}
if {[tcltest::testConstraint testsetplatform]} {
testsetplatform $platform
}
test filename-4.19 {Tcl_SplitPath} {
set oldDir [pwd]
set res [catch {
file mkdir tildetmp
set nastydir [file join tildetmp ./~tilde]
file mkdir $nastydir
set norm [file normalize $nastydir]
cd tildetmp
cd ./~tilde
glob -nocomplain *
set idx [string first tildetmp $norm]
set norm [string range $norm $idx end]
# fix path away so all platforms are the same
regsub {(.*):$} $norm {\1} norm
regsub -all ":" $norm "/" norm
# make sure we can delete the directory we created
cd $oldDir
file delete -force $nastydir
set norm
} err]
cd $oldDir
|
| ︙ | ︙ | |||
1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 |
[file join $globname x1.c]\
[file join $globname y1.c] [file join $globname z1.c]]]]
test filename-11.25 {Tcl_GlobCmd} {
list [catch {lsort [glob -type d -dir $globname *]} msg] $msg
} [list 0 [lsort [list [file join $globname a1]\
[file join $globname a2]\
[file join $globname a3]]]]
test filename-11.26 {Tcl_GlobCmd} {
list [catch {glob -type d -path $globname *} msg] $msg
} [list 0 [list $globname]]
test filename-11.27 {Tcl_GlobCmd} {
list [catch {glob -types abcde *} msg] $msg
} {1 {bad argument to "-types": abcde}}
test filename-11.28 {Tcl_GlobCmd} {
| > > > > > > > > > > | 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 |
[file join $globname x1.c]\
[file join $globname y1.c] [file join $globname z1.c]]]]
test filename-11.25 {Tcl_GlobCmd} {
list [catch {lsort [glob -type d -dir $globname *]} msg] $msg
} [list 0 [lsort [list [file join $globname a1]\
[file join $globname a2]\
[file join $globname a3]]]]
test filename-11.25.1 {Tcl_GlobCmd} {
list [catch {lsort [glob -type {d r} -dir $globname *]} msg] $msg
} [list 0 [lsort [list [file join $globname a1]\
[file join $globname a2]\
[file join $globname a3]]]]
test filename-11.25.2 {Tcl_GlobCmd} {
list [catch {lsort [glob -type {d r w} -dir $globname *]} msg] $msg
} [list 0 [lsort [list [file join $globname a1]\
[file join $globname a2]\
[file join $globname a3]]]]
test filename-11.26 {Tcl_GlobCmd} {
list [catch {glob -type d -path $globname *} msg] $msg
} [list 0 [list $globname]]
test filename-11.27 {Tcl_GlobCmd} {
list [catch {glob -types abcde *} msg] $msg
} {1 {bad argument to "-types": abcde}}
test filename-11.28 {Tcl_GlobCmd} {
|
| ︙ | ︙ | |||
1703 1704 1705 1706 1707 1708 1709 |
} //[info hostname]/c/globTest
test filename-16.13 {windows specific globbing} {pcOnly sharedCdrive} {
cd //[info hostname]/c
glob "\\\\\\\\[info hostname]\\\\c\\\\*Test"
} //[info hostname]/c/globTest
# cleanup
| | | 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 |
} //[info hostname]/c/globTest
test filename-16.13 {windows specific globbing} {pcOnly sharedCdrive} {
cd //[info hostname]/c
glob "\\\\\\\\[info hostname]\\\\c\\\\*Test"
} //[info hostname]/c/globTest
# cleanup
catch {file delete -force C:/globTest}
cd $oldDir
file delete -force globTest
set env(HOME) $oldhome
if {[tcltest::testConstraint testsetplatform]} {
testsetplatform $platform
catch {unset platform}
}
catch {unset oldhome temp result}
::tcltest::cleanupTests
return
|
Changes to tests/for.test.
1 2 3 4 5 6 7 8 9 10 11 | # Commands covered: for, continue, break # # This file contains a collection of tests for one or more of the Tcl # built-in commands. Sourcing this file into Tcl runs the tests and # generates output for errors. No output means no errors were found. # # Copyright (c) 1996 Sun Microsystems, Inc. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# Commands covered: for, continue, break
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands. Sourcing this file into Tcl runs the tests and
# generates output for errors. No output means no errors were found.
#
# Copyright (c) 1996 Sun Microsystems, Inc.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: for.test,v 1.7.4.1 2002/02/05 02:22:03 wolfsuit Exp $
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
namespace import -force ::tcltest::*
}
# Basic "for" operation.
|
| ︙ | ︙ | |||
664 665 666 667 668 669 670 |
"set"
("for" initial command)
invoked from within
"$z {set} {$i < 5} {incr i} {body}"}}
test for-6.7 {Tcl_ForObjCmd: error in test expression} {
set z for
list [catch {$z {set i 0} {i < 5} {incr i} {body}} msg] $msg $errorInfo
| | | 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 |
"set"
("for" initial command)
invoked from within
"$z {set} {$i < 5} {incr i} {body}"}}
test for-6.7 {Tcl_ForObjCmd: error in test expression} {
set z for
list [catch {$z {set i 0} {i < 5} {incr i} {body}} msg] $msg $errorInfo
} {1 {syntax error in expression "i < 5": variable references require preceding $} {syntax error in expression "i < 5": variable references require preceding $
while executing
"$z {set i 0} {i < 5} {incr i} {body}"}}
test for-6.8 {Tcl_ForObjCmd: test expression is enclosed in quotes} {
set z for
set i 0
$z {set i 6} "$i > 5" {incr i} {set y $i}
set i
|
| ︙ | ︙ | |||
771 772 773 774 775 776 777 |
} {}
# cleanup
::tcltest::cleanupTests
return
| < | 771 772 773 774 775 776 777 |
} {}
# cleanup
::tcltest::cleanupTests
return
|
Changes to tests/if.test.
1 2 3 4 5 6 7 8 9 10 11 12 | # Commands covered: if # # This file contains a collection of tests for one or more of the Tcl # built-in commands. Sourcing this file into Tcl runs the tests and # generates output for errors. No output means no errors were found. # # Copyright (c) 1996 Sun Microsystems, Inc. # Copyright (c) 1998-1999 by Scriptics Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # | | | | 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 34 35 36 37 38 |
# Commands covered: if
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands. Sourcing this file into Tcl runs the tests and
# generates output for errors. No output means no errors were found.
#
# Copyright (c) 1996 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: if.test,v 1.6.4.1 2002/02/05 02:22:03 wolfsuit Exp $
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
namespace import -force ::tcltest::*
}
# Basic "if" operation.
catch {unset a}
test if-1.1 {TclCompileIfCmd: missing if/elseif test} {
list [catch {if} msg] $msg
} {1 {wrong # args: no expression after "if" argument}}
test if-1.2 {TclCompileIfCmd: error in if/elseif test} {
list [catch {if {[error "error in condition"]} foo} msg] $msg
} {1 {error in condition}}
test if-1.3 {TclCompileIfCmd: error in if/elseif test} {
list [catch {if {1+}} msg] $msg $errorInfo
} {1 {syntax error in expression "1+": premature end of expression} {syntax error in expression "1+": premature end of expression
("if" test expression)
while compiling
"if {1+}"}}
test if-1.4 {TclCompileIfCmd: if/elseif test in braces} {
set a {}
if {1<2} {set a 1}
set a
|
| ︙ | ︙ | |||
176 177 178 179 180 181 182 |
set a {}
catch {if 1<2 {set a 1} elseif} msg
set msg
} {wrong # args: no expression after "elseif" argument}
test if-2.4 {TclCompileIfCmd: error in expression after "elseif"} {
set a {}
list [catch {if 3>4 {set a 1} elseif {1>}} msg] $msg $errorInfo
| | | 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 |
set a {}
catch {if 1<2 {set a 1} elseif} msg
set msg
} {wrong # args: no expression after "elseif" argument}
test if-2.4 {TclCompileIfCmd: error in expression after "elseif"} {
set a {}
list [catch {if 3>4 {set a 1} elseif {1>}} msg] $msg $errorInfo
} {1 {syntax error in expression "1>": premature end of expression} {syntax error in expression "1>": premature end of expression
("if" test expression)
while compiling
"if 3>4 {set a 1} elseif {1>}"}}
test if-2.5 {TclCompileIfCmd: test jumpFalse instruction replacement after long "elseif" body} {
catch {unset i}
set a {}
if 1>2 {
|
| ︙ | ︙ | |||
508 509 510 511 512 513 514 |
test if-5.2 {if cmd with computed command names: error in if/elseif test} {
set z if
list [catch {$z {[error "error in condition"]} foo} msg] $msg
} {1 {error in condition}}
test if-5.3 {if cmd with computed command names: error in if/elseif test} {
set z if
list [catch {$z {1+}} msg] $msg $errorInfo
| | | 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 |
test if-5.2 {if cmd with computed command names: error in if/elseif test} {
set z if
list [catch {$z {[error "error in condition"]} foo} msg] $msg
} {1 {error in condition}}
test if-5.3 {if cmd with computed command names: error in if/elseif test} {
set z if
list [catch {$z {1+}} msg] $msg $errorInfo
} {1 {syntax error in expression "1+": premature end of expression} {syntax error in expression "1+": premature end of expression
while executing
"$z {1+}"}}
test if-5.4 {if cmd with computed command names: if/elseif test in braces} {
set z if
set a {}
$z {1<2} {set a 1}
set a
|
| ︙ | ︙ | |||
676 677 678 679 680 681 682 |
catch {$z 1<2 {set a 1} elseif} msg
set msg
} {wrong # args: no expression after "elseif" argument}
test if-6.4 {if cmd with computed command names: error in expression after "elseif"} {
set z if
set a {}
list [catch {$z 3>4 {set a 1} elseif {1>}} msg] $msg $errorInfo
| | | 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 |
catch {$z 1<2 {set a 1} elseif} msg
set msg
} {wrong # args: no expression after "elseif" argument}
test if-6.4 {if cmd with computed command names: error in expression after "elseif"} {
set z if
set a {}
list [catch {$z 3>4 {set a 1} elseif {1>}} msg] $msg $errorInfo
} {1 {syntax error in expression "1>": premature end of expression} {syntax error in expression "1>": premature end of expression
while executing
"$z 3>4 {set a 1} elseif {1>}"}}
test if-6.5 {if cmd with computed command names: test jumpFalse instruction replacement after long "elseif" body} {
set z if
catch {unset i}
set a {}
$z 1>2 {
|
| ︙ | ︙ | |||
1104 1105 1106 1107 1108 1109 1110 |
set var "$counter + [concat $extraargs]"
}
}
trace variable iftracevar r [list iftraceproc 10]
list [catch {if "$iftracevar + 20" {}} a] $a \
[catch {if "$iftracevar + 20" {}} b] $b \
[unset iftracevar iftracecounter]
| | < < < < < < < < < < < < | 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 |
set var "$counter + [concat $extraargs]"
}
}
trace variable iftracevar r [list iftraceproc 10]
list [catch {if "$iftracevar + 20" {}} a] $a \
[catch {if "$iftracevar + 20" {}} b] $b \
[unset iftracevar iftracecounter]
} {1 {syntax error in expression "1 oops 10 + 20": extra tokens at end of expression} 0 {} {}}
# cleanup
::tcltest::cleanupTests
return
|
Changes to tests/interp.test.
1 2 3 4 5 6 7 8 9 10 11 12 | # This file tests the multiple interpreter facility of Tcl # # This file contains a collection of tests for one or more of the Tcl # built-in commands. Sourcing this file into Tcl runs the tests and # generates output for errors. No output means no errors were found. # # Copyright (c) 1995-1996 Sun Microsystems, Inc. # Copyright (c) 1998-1999 by Scriptics Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# This file tests the multiple interpreter facility of Tcl
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands. Sourcing this file into Tcl runs the tests and
# generates output for errors. No output means no errors were found.
#
# Copyright (c) 1995-1996 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: interp.test,v 1.12.14.1 2002/02/05 02:22:03 wolfsuit Exp $
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
namespace import -force ::tcltest::*
}
# The set of hidden commands is platform dependent:
|
| ︙ | ︙ | |||
255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 |
} in_master
test interp-7.4 {testing basic alias creation} {
a alias bar
} {in_master a1 a2 a3}
test interp-7.5 {testing basic alias creation} {
a aliases
} {foo bar}
# Part 7: testing basic alias invocation
test interp-8.1 {testing basic alias invocation} {
catch {interp create a}
a alias foo in_master
a eval foo s1 s2 s3
} {seen in master: {s1 s2 s3}}
test interp-8.2 {testing basic alias invocation} {
catch {interp create a}
a alias bar in_master a1 a2 a3
a eval bar s1 s2 s3
} {seen in master: {a1 a2 a3 s1 s2 s3}}
# Part 8: Testing aliases for non-existent targets
test interp-9.1 {testing aliases for non-existent targets} {
catch {interp create a}
a alias zop nonexistent-command-in-master
list [catch {a eval zop} msg] $msg
} {1 {invalid command name "nonexistent-command-in-master"}}
| > > > > > > > | 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 |
} in_master
test interp-7.4 {testing basic alias creation} {
a alias bar
} {in_master a1 a2 a3}
test interp-7.5 {testing basic alias creation} {
a aliases
} {foo bar}
test interp-7.6 {testing basic aliases arg checking} {
list [catch {a aliases too many args} msg] $msg
} {1 {wrong # args: should be "a aliases"}}
# Part 7: testing basic alias invocation
test interp-8.1 {testing basic alias invocation} {
catch {interp create a}
a alias foo in_master
a eval foo s1 s2 s3
} {seen in master: {s1 s2 s3}}
test interp-8.2 {testing basic alias invocation} {
catch {interp create a}
a alias bar in_master a1 a2 a3
a eval bar s1 s2 s3
} {seen in master: {a1 a2 a3 s1 s2 s3}}
test interp-8.3 {testing basic alias invocation} {
catch {interp create a}
list [catch {a alias} msg] $msg
} {1 {wrong # args: should be "a alias aliasName ?targetName? ?args..?"}}
# Part 8: Testing aliases for non-existent targets
test interp-9.1 {testing aliases for non-existent targets} {
catch {interp create a}
a alias zop nonexistent-command-in-master
list [catch {a eval zop} msg] $msg
} {1 {invalid command name "nonexistent-command-in-master"}}
|
| ︙ | ︙ | |||
437 438 439 440 441 442 443 444 445 446 447 448 449 450 |
test interp-13.3 {testing foo issafe} {
catch {interp delete a}
interp create a
interp create {a x3} -safe
interp create {a x3 foo}
a eval x3 eval foo issafe
} 1
# part 14: testing interp aliases
test interp-14.1 {testing interp aliases} {
interp aliases
} ""
test interp-14.2 {testing interp aliases} {
catch {interp delete a}
| > > > > | 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 |
test interp-13.3 {testing foo issafe} {
catch {interp delete a}
interp create a
interp create {a x3} -safe
interp create {a x3 foo}
a eval x3 eval foo issafe
} 1
test interp-7.6 {testing issafe arg checking} {
catch {interp create a}
list [catch {a issafe too many args} msg] $msg
} {1 {wrong # args: should be "a issafe"}}
# part 14: testing interp aliases
test interp-14.1 {testing interp aliases} {
interp aliases
} ""
test interp-14.2 {testing interp aliases} {
catch {interp delete a}
|
| ︙ | ︙ |
Changes to tests/io.test.
| ︙ | ︙ | |||
8 9 10 11 12 13 14 | # Copyright (c) 1991-1994 The Regents of the University of California. # Copyright (c) 1994-1997 Sun Microsystems, Inc. # Copyright (c) 1998-1999 by Scriptics Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # | | | 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# Copyright (c) 1991-1994 The Regents of the University of California.
# Copyright (c) 1994-1997 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: io.test,v 1.21.4.1 2002/02/05 02:22:03 wolfsuit Exp $
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
namespace import -force ::tcltest::*
}
tcltest::testConstraint testchannel [string equal testchannel [info commands testchannel]]
|
| ︙ | ︙ | |||
81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
test io-1.7 {Tcl_WriteChars: WriteChars} {
set f [open test1 w]
fconfigure $f -encoding shiftjis
puts -nonewline $f "a\u4e4d\0"
close $f
contents test1
} "a\x93\xe1\x00"
test io-2.1 {WriteBytes} {
# loop until all bytes are written
set f [open test1 w]
fconfigure $f -encoding binary -buffersize 16 -translation crlf
puts $f "abcdefghijklmnopqrstuvwxyz"
| > > > > > > > > > > > > > | 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
test io-1.7 {Tcl_WriteChars: WriteChars} {
set f [open test1 w]
fconfigure $f -encoding shiftjis
puts -nonewline $f "a\u4e4d\0"
close $f
contents test1
} "a\x93\xe1\x00"
test io-1.8 {Tcl_WriteChars: WriteChars} {
# This test written for SF bug #506297.
#
# Executing this test without the fix for the referenced bug
# applied to tcl will cause tcl, more specifically WriteChars, to
# go into an infinite loop.
set f [open test2 w]
fconfigure $f -encoding iso2022-jp
puts -nonewline $f [format %s%c [string repeat " " 4] 12399]
close $f
contents test2
} "\x1b(B \x1b\$@\$O"
test io-2.1 {WriteBytes} {
# loop until all bytes are written
set f [open test1 w]
fconfigure $f -encoding binary -buffersize 16 -translation crlf
puts $f "abcdefghijklmnopqrstuvwxyz"
|
| ︙ | ︙ | |||
5011 5012 5013 5014 5015 5016 5017 5018 5019 5020 5021 5022 5023 5024 |
update
fconfigure $s2 -translation {auto auto}
set modes [fconfigure $s2 -translation]
close $s1
close $s2
set modes
} {auto crlf}
test io-40.1 {POSIX open access modes: RDWR} {
removeFile test3
set f [open test3 w]
puts $f xyzzy
close $f
set f [open test3 RDWR]
| > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 5024 5025 5026 5027 5028 5029 5030 5031 5032 5033 5034 5035 5036 5037 5038 5039 5040 5041 5042 5043 5044 5045 5046 5047 5048 5049 5050 5051 5052 5053 5054 5055 5056 5057 5058 5059 5060 5061 5062 5063 5064 5065 5066 5067 5068 5069 5070 5071 5072 5073 5074 5075 5076 5077 5078 5079 5080 5081 5082 |
update
fconfigure $s2 -translation {auto auto}
set modes [fconfigure $s2 -translation]
close $s1
close $s2
set modes
} {auto crlf}
test io-39.22 {Tcl_SetChannelOption, invariance} {unixOnly} {
removeFile test1
set f1 [open test1 w+]
set l ""
lappend l [fconfigure $f1 -eofchar]
fconfigure $f1 -eofchar {ON GO}
lappend l [fconfigure $f1 -eofchar]
fconfigure $f1 -eofchar D
lappend l [fconfigure $f1 -eofchar]
close $f1
set l
} {{{} {}} {O G} {D D}}
test io-39.22a {Tcl_SetChannelOption, invariance} {
removeFile test1
set f1 [open test1 w+]
set l [list]
fconfigure $f1 -eofchar {ON GO}
lappend l [fconfigure $f1 -eofchar]
fconfigure $f1 -eofchar D
lappend l [fconfigure $f1 -eofchar]
lappend l [list [catch {fconfigure $f1 -eofchar {1 2 3}} msg] $msg]
close $f1
set l
} {{O G} {D D} {1 {bad value for -eofchar: should be a list of zero, one, or two elements}}}
test io-39.23 {Tcl_GetChannelOption, server socket is not readable or
writeable, it should still have valid -eofchar and -translation options } {
set l [list]
set sock [socket -server accept 0]
lappend l [fconfigure $sock -eofchar] [fconfigure $sock -translation]
close $sock
set l
} {{{}} auto}
test io-39.24 {Tcl_SetChannelOption, server socket is not readable or
writable so we can't change -eofchar or -translation } {
set l [list]
set sock [socket -server accept 0]
fconfigure $sock -eofchar D -translation lf
lappend l [fconfigure $sock -eofchar] [fconfigure $sock -translation]
close $sock
set l
} {{{}} auto}
test io-40.1 {POSIX open access modes: RDWR} {
removeFile test3
set f [open test3 w]
puts $f xyzzy
close $f
set f [open test3 RDWR]
|
| ︙ | ︙ | |||
6605 6606 6607 6608 6609 6610 6611 6612 6613 6614 6615 6616 6617 6618 |
if ![info exists fcopyTestDone] {
vwait fcopyTestDone
}
catch {close $in}
close $out
set fcopyTestDone ;# 0 for plain end of file
} {0}
test io-54.1 {Recursive channel events} {socket} {
# This test checks to see if file events are delivered during recursive
# event loops when there is buffered data on the channel.
proc accept {s a p} {
global as
| > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 6663 6664 6665 6666 6667 6668 6669 6670 6671 6672 6673 6674 6675 6676 6677 6678 6679 6680 6681 6682 6683 6684 6685 6686 6687 6688 6689 6690 6691 6692 6693 6694 6695 6696 6697 6698 6699 6700 6701 6702 6703 6704 6705 6706 6707 6708 6709 6710 6711 6712 6713 6714 6715 6716 6717 6718 6719 6720 6721 6722 6723 6724 6725 |
if ![info exists fcopyTestDone] {
vwait fcopyTestDone
}
catch {close $in}
close $out
set fcopyTestDone ;# 0 for plain end of file
} {0}
proc doFcopy {in out {bytes 0} {error {}}} {
global fcopyTestDone fcopyTestCount
incr fcopyTestCount $bytes
if {[string length $error]} {
set fcopyTestDone 1
} elseif {[eof $in]} {
set fcopyTestDone 0
} else {
# Delay next fcopy to wait for size>0 input bytes
after 100 [list
fcopy $in $out -size 1000 -command [list doFcopy $in $out]
]
}
}
test io-53.7 {CopyData: Flooding fcopy from pipe} {stdio} {
removeFile pipe
removeFile test1
catch {unset fcopyTestDone}
set fcopyTestCount 0
set f1 [open pipe w]
puts $f1 {
# Write 10 bytes / 10 msec
proc Write {count} {
puts -nonewline "1234567890"
if {[incr count -1]} {
after 10 [list Write $count]
} else {
set ::ready 1
}
}
fconfigure stdout -buffering none
Write 345 ;# 3450 bytes ~3.45 sec
vwait ready
exit 0
}
close $f1
set in [open "|[list $::tcltest::tcltest pipe &]" r+]
set out [open test1 w]
doFcopy $in $out
if ![info exists fcopyTestDone] {
vwait fcopyTestDone
}
catch {close $in}
close $out
# -1=error 0=script error N=number of bytes
expr ($fcopyTestDone == 0) ? $fcopyTestCount : -1
} {3450}
test io-54.1 {Recursive channel events} {socket} {
# This test checks to see if file events are delivered during recursive
# event loops when there is buffered data on the channel.
proc accept {s a p} {
global as
|
| ︙ | ︙ |
Changes to tests/iogt.test.
1 2 3 4 5 6 7 8 9 10 11 12 | # -*- tcl -*- # Commands covered: transform, and stacking in general # # This file contains a collection of tests for Giot # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # Copyright (c) 2000 Ajuba Solutions. # Copyright (c) 2000 Andreas Kupries. # All rights reserved. # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# -*- tcl -*-
# Commands covered: transform, and stacking in general
#
# This file contains a collection of tests for Giot
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# Copyright (c) 2000 Ajuba Solutions.
# Copyright (c) 2000 Andreas Kupries.
# All rights reserved.
#
# RCS: @(#) $Id: iogt.test,v 1.2.14.1 2002/02/05 02:22:04 wolfsuit Exp $
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
namespace import -force ::tcltest::*
}
|
| ︙ | ︙ | |||
508 509 510 511 512 513 514 | read query/maxRead read query/maxRead read query/maxRead flush/read | < | 508 509 510 511 512 513 514 515 516 517 518 519 520 521 | read query/maxRead read query/maxRead read query/maxRead flush/read delete/read -------- create/write write write write write |
| ︙ | ︙ | |||
561 562 563 564 565 566 567 |
read %^&*()_+-= %^&*()_+-=
query/maxRead {} -1
read {
} {
}
query/maxRead {} -1
flush/read {} {}
| < | 560 561 562 563 564 565 566 567 568 569 570 571 572 573 |
read %^&*()_+-= %^&*()_+-=
query/maxRead {} -1
read {
} {
}
query/maxRead {} -1
flush/read {} {}
delete/read {} *ignored*
--------
create/write {} *ignored*
write abcdefghij abcdefghij
write klmnopqrst klmnopqrst
write uvwxyz0123 uvwxyz0123
write 456789,./? 456789,./?
|
| ︙ | ︙ | |||
620 621 622 623 624 625 626 |
}
query/maxRead {} -1
flush/read {} {}
write %^&*()_+-= %^&*()_+-=
write {
} {
}
| < | 618 619 620 621 622 623 624 625 626 627 628 629 630 631 |
}
query/maxRead {} -1
flush/read {} {}
write %^&*()_+-= %^&*()_+-=
write {
} {
}
delete/read {} *ignored*
flush/write {} {}
delete/write {} *ignored*}
test iogt-3.0 {Tcl_Channel valid after stack/unstack, fevent handling} \
{unknownFailure} {
|
| ︙ | ︙ |
Changes to tests/lindex.test.
1 2 3 4 5 6 7 8 9 10 11 12 13 | # Commands covered: lindex # # This file contains a collection of tests for one or more of the Tcl # built-in commands. Sourcing this file into Tcl runs the tests and # generates output for errors. No output means no errors were found. # # Copyright (c) 1991-1993 The Regents of the University of California. # Copyright (c) 1994 Sun Microsystems, Inc. # Copyright (c) 1998-1999 by Scriptics Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # | > | > > > > > | > | | > | | > > > | | > > > | | > > | | > | > | > | > > | > | | > | > > | | | > > > | > > > | > | > | > | | | > > | > | > > > | > > > > | | > > > | > > > > | > > > > > | > > > | > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > | | | | | | | | | | | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 |
# Commands covered: lindex
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands. Sourcing this file into Tcl runs the tests and
# generates output for errors. No output means no errors were found.
#
# Copyright (c) 1991-1993 The Regents of the University of California.
# Copyright (c) 1994 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
# Copyright (c) 2001 by Kevin B. Kenny. All rights reserved.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: lindex.test,v 1.8.10.1 2002/02/05 02:22:04 wolfsuit Exp $
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
namespace import -force ::tcltest::*
}
set lindex lindex
set minus -
# Tests of Tcl_LindexObjCmd, NOT COMPILED
test lindex-1.1 {wrong # args} {
list [catch {eval $lindex} result] $result
} "1 {wrong # args: should be \"lindex list ?index...?\"}"
# Indices that are lists or convertible to lists
test lindex-2.1 {empty index list} {
set x {}
list [eval [list $lindex {a b c} $x]] [eval [list $lindex {a b c} $x]]
} {{a b c} {a b c}}
test lindex-2.2 {singleton index list} {
set x { 1 }
list [eval [list $lindex {a b c} $x]] [eval [list $lindex {a b c} $x]]
} {b b}
test lindex-2.3 {multiple indices in list} {
set x {1 2}
list [eval [list $lindex {{a b c} {d e f}} $x]] \
[eval [list $lindex {{a b c} {d e f}} $x]]
} {f f}
test lindex-2.4 {malformed index list} {
set x \{
list [catch { eval [list $lindex {a b c} $x] } result] $result
} {1 bad\ index\ \"\{\":\ must\ be\ integer\ or\ end?-integer?}
# Indices that are integers or convertible to integers
test lindex-3.1 {integer -1} {
set x ${minus}1
list [eval [list $lindex {a b c} $x]] [eval [list $lindex {a b c} $x]]
} {{} {}}
test lindex-3.2 {integer 0} {
set x [string range 00 0 0]
list [eval [list $lindex {a b c} $x]] [eval [list $lindex {a b c} $x]]
} {a a}
test lindex-3.3 {integer 2} {
set x [string range 22 0 0]
list [eval [list $lindex {a b c} $x]] [eval [list $lindex {a b c} $x]]
} {c c}
test lindex-3.4 {integer 3} {
set x [string range 33 0 0]
list [eval [list $lindex {a b c} $x]] [eval [list $lindex {a b c} $x]]
} {{} {}}
test lindex-3.5 {bad octal} {
set x 08
list [catch { eval [list $lindex {a b c} $x] } result] $result
} "1 {bad index \"08\": must be integer or end?-integer? (looks like invalid octal number)}"
test lindex-3.6 {bad octal} {
set x -09
list [catch { eval [list $lindex {a b c} $x] } result] $result
} "1 {bad index \"-09\": must be integer or end?-integer? (looks like invalid octal number)}"
# Indices relative to end
test lindex-4.1 {index = end} {
set x end
list [eval [list $lindex {a b c} $x]] [eval [list $lindex {a b c} $x]]
} {c c}
test lindex-4.2 {index = end--1} {
set x end--1
list [eval [list $lindex {a b c} $x]] [eval [list $lindex {a b c} $x]]
} {{} {}}
test lindex-4.3 {index = end-0} {
set x end-0
list [eval [list $lindex {a b c} $x]] [eval [list $lindex {a b c} $x]]
} {c c}
test lindex-4.4 {index = end-2} {
set x end-2
list [eval [list $lindex {a b c} $x]] [eval [list $lindex {a b c} $x]]
} {a a}
test lindex-4.5 {index = end-3} {
set x end-3
list [eval [list $lindex {a b c} $x]] [eval [list $lindex {a b c} $x]]
} {{} {}}
test lindex-4.6 {bad octal} {
set x end-08
list [catch { eval [list $lindex {a b c} $x] } result] $result
} "1 {bad index \"end-08\": must be integer or end?-integer? (looks like invalid octal number)}"
test lindex-4.7 {bad octal} {
set x end--09
list [catch { eval [list $lindex {a b c} $x] } result] $result
} "1 {bad index \"end--09\": must be integer or end?-integer?}"
test lindex-4.8 {bad integer, not octal} {
set x end-0a2
list [catch { eval [list $lindex {a b c} $x] } result] $result
} "1 {bad index \"end-0a2\": must be integer or end?-integer?}"
test lindex-4.9 {incomplete end} {
set x en
list [eval [list $lindex {a b c} $x]] [eval [list $lindex {a b c} $x]]
} {c c}
test lindex-4.10 {incomplete end-} {
set x end-
list [catch { eval [list $lindex {a b c} $x] } result] $result
} "1 {bad index \"end-\": must be integer or end?-integer?}"
test lindex-5.1 {bad second index} {
list [catch { eval [list $lindex {a b c} 0 0a2] } result] $result
} "1 {bad index \"0a2\": must be integer or end?-integer?}"
test lindex-5.2 {good second index} {
eval [list $lindex {{a b c} {d e f} {g h i}} 1 2]
} f
test lindex-5.3 {three indices} {
eval [list $lindex {{{a b} {c d}} {{e f} {g h}}} 1 0 1]
} f
test lindex-6.1 {error conditions in parsing list} {
list [catch {eval [list $lindex "a \{" 2]} msg] $msg
} {1 {unmatched open brace in list}}
test lindex-6.2 {error conditions in parsing list} {
list [catch {eval [list $lindex {a {b c}d e} 2]} msg] $msg
} {1 {list element in braces followed by "d" instead of space}}
test lindex-6.3 {error conditions in parsing list} {
list [catch {eval [list $lindex {a "b c"def ghi} 2]} msg] $msg
} {1 {list element in quotes followed by "def" instead of space}}
test lindex-7.1 {quoted elements} {
eval [list $lindex {a "b c" d} 1]
} {b c}
test lindex-7.2 {quoted elements} {
eval [list $lindex {"{}" b c} 0]
} {{}}
test lindex-7.3 {quoted elements} {
eval [list $lindex {ab "c d \" x" y} 1]
} {c d " x}
test lindex-7.4 {quoted elements} {
lindex {a b {c d "e} {f g"}} 2
} {c d "e}
test lindex-8.1 {data reuse} {
set x 0
eval [list $lindex $x $x]
} {0}
test lindex-8.2 {data reuse} {
set a 0
eval [list $lindex $a $a $a]
} 0
test lindex-8.3 {data reuse} {
set a 1
eval [list $lindex $a $a $a]
} {}
test lindex-8.4 {data reuse} {
set x [list 0 0]
eval [list $lindex $x $x]
} {0}
test lindex-8.5 {data reuse} {
set x 0
eval [list $lindex $x [list $x $x]]
} {0}
test lindex-8.6 {data reuse} {
set x [list 1 1]
eval [list $lindex $x $x]
} {}
test lindex-8.7 {data reuse} {
set x 1
eval [list lindex $x [list $x $x]]
} {}
#----------------------------------------------------------------------
# Compilation tests for lindex
test lindex-9.1 {wrong # args} {
list [catch {lindex} result] $result
} "1 {wrong # args: should be \"lindex list ?index...?\"}"
# Indices that are lists or convertible to lists
test lindex-10.1 {empty index list} {
set x {}
catch {
list [lindex {a b c} $x] [lindex {a b c} $x]
} result
set result
} {{a b c} {a b c}}
test lindex-10.2 {singleton index list} {
set x { 1 }
catch {
list [lindex {a b c} $x] [lindex {a b c} $x]
} result
set result
} {b b}
test lindex-10.3 {multiple indices in list} {
set x {1 2}
catch {
list [lindex {{a b c} {d e f}} $x] [lindex {{a b c} {d e f}} $x]
} result
set result
} {f f}
test lindex-10.4 {malformed index list} {
set x \{
list [catch { lindex {a b c} $x } result] $result
} {1 bad\ index\ \"\{\":\ must\ be\ integer\ or\ end?-integer?}
# Indices that are integers or convertible to integers
test lindex-11.1 {integer -1} {
set x ${minus}1
catch {
list [lindex {a b c} $x] [lindex {a b c} $x]
} result
set result
} {{} {}}
test lindex-11.2 {integer 0} {
set x [string range 00 0 0]
catch {
list [lindex {a b c} $x] [lindex {a b c} $x]
} result
set result
} {a a}
test lindex-11.3 {integer 2} {
set x [string range 22 0 0]
catch {
list [lindex {a b c} $x] [lindex {a b c} $x]
} result
set result
} {c c}
test lindex-11.4 {integer 3} {
set x [string range 33 0 0]
catch {
list [lindex {a b c} $x] [lindex {a b c} $x]
} result
set result
} {{} {}}
test lindex-11.5 {bad octal} {
set x 08
list [catch { lindex {a b c} $x } result] $result
} "1 {bad index \"08\": must be integer or end?-integer? (looks like invalid octal number)}"
test lindex-11.6 {bad octal} {
set x -09
list [catch { lindex {a b c} $x } result] $result
} "1 {bad index \"-09\": must be integer or end?-integer? (looks like invalid octal number)}"
# Indices relative to end
test lindex-12.1 {index = end} {
set x end
catch {
list [lindex {a b c} $x] [lindex {a b c} $x]
} result
set result
} {c c}
test lindex-12.2 {index = end--1} {
set x end--1
catch {
list [lindex {a b c} $x] [lindex {a b c} $x]
} result
set result
} {{} {}}
test lindex-12.3 {index = end-0} {
set x end-0
catch {
list [lindex {a b c} $x] [lindex {a b c} $x]
} result
set result
} {c c}
test lindex-12.4 {index = end-2} {
set x end-2
catch {
list [lindex {a b c} $x] [lindex {a b c} $x]
} result
set result
} {a a}
test lindex-12.5 {index = end-3} {
set x end-3
catch {
list [lindex {a b c} $x] [lindex {a b c} $x]
} result
set result
} {{} {}}
test lindex-12.6 {bad octal} {
set x end-08
list [catch { lindex {a b c} $x } result] $result
} "1 {bad index \"end-08\": must be integer or end?-integer? (looks like invalid octal number)}"
test lindex-12.7 {bad octal} {
set x end--09
list [catch { lindex {a b c} $x } result] $result
} "1 {bad index \"end--09\": must be integer or end?-integer?}"
test lindex-12.8 {bad integer, not octal} {
set x end-0a2
list [catch { lindex {a b c} $x } result] $result
} "1 {bad index \"end-0a2\": must be integer or end?-integer?}"
test lindex-12.9 {incomplete end} {
set x en
catch {
list [lindex {a b c} $x] [lindex {a b c} $x]
} result
set result
} {c c}
test lindex-12.10 {incomplete end-} {
set x end-
list [catch { lindex {a b c} $x } result] $result
} "1 {bad index \"end-\": must be integer or end?-integer?}"
test lindex-13.1 {bad second index} {
list [catch { lindex {a b c} 0 0a2 } result] $result
} "1 {bad index \"0a2\": must be integer or end?-integer?}"
test lindex-13.2 {good second index} {
catch {
lindex {{a b c} {d e f} {g h i}} 1 2
} result
set result
} f
test lindex-13.3 {three indices} {
catch {
lindex {{{a b} {c d}} {{e f} {g h}}} 1 0 1
} result
set result
} f
test lindex-14.1 {error conditions in parsing list} {
list [catch { lindex "a \{" 2 } msg] $msg
} {1 {unmatched open brace in list}}
test lindex-14.2 {error conditions in parsing list} {
list [catch { lindex {a {b c}d e} 2 } msg] $msg
} {1 {list element in braces followed by "d" instead of space}}
test lindex-14.3 {error conditions in parsing list} {
list [catch { lindex {a "b c"def ghi} 2 } msg] $msg
} {1 {list element in quotes followed by "def" instead of space}}
test lindex-15.1 {quoted elements} {
catch {
lindex {a "b c" d} 1
} result
set result
} {b c}
test lindex-15.2 {quoted elements} {
catch {
lindex {"{}" b c} 0
} result
set result
} {{}}
test lindex-15.3 {quoted elements} {
catch {
lindex {ab "c d \" x" y} 1
} result
set result
} {c d " x}
test lindex-15.4 {quoted elements} {
catch {
lindex {a b {c d "e} {f g"}} 2
} result
set result
} {c d "e}
test lindex-16.1 {data reuse} {
set x 0
catch {
lindex $x $x
} result
set result
} {0}
test lindex-16.2 {data reuse} {
set a 0
catch {
lindex $a $a $a
} result
set result
} 0
test lindex-16.3 {data reuse} {
set a 1
catch {
lindex $a $a $a
} result
set result
} {}
test lindex-16.4 {data reuse} {
set x [list 0 0]
catch {
lindex $x $x
} result
set result
} {0}
test lindex-16.5 {data reuse} {
set x 0
catch {
lindex $x [list $x $x]
} result
set result
} {0}
test lindex-16.6 {data reuse} {
set x [list 1 1]
catch {
lindex $x $x
} result
set result
} {}
test lindex-16.7 {data reuse} {
set x 1
catch {
lindex $x [list $x $x]
} result
set result
} {}
catch { unset lindex}
catch { unset minus }
# cleanup
::tcltest::cleanupTests
return
|
Added tests/lset.test.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 |
# This file is a -*- tcl -*- test script
# Commands covered: lset
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands. Sourcing this file into Tcl runs the tests and
# generates output for errors. No output means no errors were found.
#
# Copyright (c) 2001 by Kevin B. Kenny. All rights reserved.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id$
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
namespace import -force ::tcltest::*
}
proc failTrace {name1 name2 op} {
error "trace failed"
}
set lset lset
set noRead {}
trace add variable noRead read failTrace
set noWrite {a b c}
trace add variable noWrite write failTrace
test lset-1.1 {lset, not compiled, arg count} {
list [catch {eval $lset} msg] $msg
} "1 {wrong \# args: should be \"lset listVar index ?index...? value\"}"
test lset-1.2 {lset, not compiled, no such var} {
list [catch {eval [list $lset noSuchVar 0 {}]} msg] $msg
} "1 {can't read \"noSuchVar\": no such variable}"
test lset-1.3 {lset, not compiled, var not readable} {
list [catch {eval [list $lset noRead 0 {}]} msg] $msg
} "1 {can't read \"noRead\": trace failed}"
test lset-2.1 {lset, not compiled, 3 args, second arg a plain index} {
set x {0 1 2}
list [eval [list $lset x 0 3]] $x
} {{3 1 2} {3 1 2}}
test lset-2.2 {lset, not compiled, 3 args, second arg neither index nor list} {
set x {0 1 2}
list [catch {
eval [list $lset x {{bad}1} 3]
} msg] $msg
} "1 {bad index \"{bad}1\": must be integer or end?-integer?}"
test lset-3.1 {lset, not compiled, 3 args, data duplicated} {
set x {0 1 2}
list [eval [list $lset x 0 $x]] $x
} {{{0 1 2} 1 2} {{0 1 2} 1 2}}
test lset-3.2 {lset, not compiled, 3 args, data duplicated} {
set x {0 1}
set y $x
list [eval [list $lset x 0 2]] $x $y
} {{2 1} {2 1} {0 1}}
test lset-3.3 {lset, not compiled, 3 args, data duplicated} {
set x {0 1}
set y $x
list [eval [list $lset x 0 $x]] $x $y
} {{{0 1} 1} {{0 1} 1} {0 1}}
test lset-3.4 {lset, not compiled, 3 args, data duplicated} {
set x {0 1 2}
list [eval [list $lset x [list 0] $x]] $x
} {{{0 1 2} 1 2} {{0 1 2} 1 2}}
test lset-3.5 {lset, not compiled, 3 args, data duplicated} {
set x {0 1}
set y $x
list [eval [list $lset x [list 0] 2]] $x $y
} {{2 1} {2 1} {0 1}}
test lset-3.6 {lset, not compiled, 3 args, data duplicated} {
set x {0 1}
set y $x
list [eval [list $lset x [list 0] $x]] $x $y
} {{{0 1} 1} {{0 1} 1} {0 1}}
test lset-4.1 {lset, not compiled, 3 args, not a list} {
set a "x \{"
list [catch {
eval [list $lset a [list 0] y]
} msg] $msg
} {1 {unmatched open brace in list}}
test lset-4.2 {lset, not compiled, 3 args, bad index} {
set a {x y z}
list [catch {
eval [list $lset a [list 2a2] w]
} msg] $msg
} {1 {bad index "2a2": must be integer or end?-integer?}}
test lset-4.3 {lset, not compiled, 3 args, index out of range} {
set a {x y z}
list [catch {
eval [list $lset a [list -1] w]
} msg] $msg
} {1 {list index out of range}}
test lset-4.4 {lset, not compiled, 3 args, index out of range} {
set a {x y z}
list [catch {
eval [list $lset a [list 3] w]
} msg] $msg
} {1 {list index out of range}}
test lset-4.5 {lset, not compiled, 3 args, index out of range} {
set a {x y z}
list [catch {
eval [list $lset a [list end--1] w]
} msg] $msg
} {1 {list index out of range}}
test lset-4.6 {lset, not compiled, 3 args, index out of range} {
set a {x y z}
list [catch {
eval [list $lset a [list end-3] w]
} msg] $msg
} {1 {list index out of range}}
test lset-4.7 {lset, not compiled, 3 args, not a list} {
set a "x \{"
list [catch {
eval [list $lset a 0 y]
} msg] $msg
} {1 {unmatched open brace in list}}
test lset-4.8 {lset, not compiled, 3 args, bad index} {
set a {x y z}
list [catch {
eval [list $lset a 2a2 w]
} msg] $msg
} {1 {bad index "2a2": must be integer or end?-integer?}}
test lset-4.9 {lset, not compiled, 3 args, index out of range} {
set a {x y z}
list [catch {
eval [list $lset a -1 w]
} msg] $msg
} {1 {list index out of range}}
test lset-4.10 {lset, not compiled, 3 args, index out of range} {
set a {x y z}
list [catch {
eval [list $lset a 3 w]
} msg] $msg
} {1 {list index out of range}}
test lset-4.11 {lset, not compiled, 3 args, index out of range} {
set a {x y z}
list [catch {
eval [list $lset a end--1 w]
} msg] $msg
} {1 {list index out of range}}
test lset-4.12 {lset, not compiled, 3 args, index out of range} {
set a {x y z}
list [catch {
eval [list $lset a end-3 w]
} msg] $msg
} {1 {list index out of range}}
test lset-5.1 {lset, not compiled, 3 args, can't set variable} {
list [catch {
eval [list $lset noWrite 0 d]
} msg] $msg $noWrite
} {1 {can't set "noWrite": trace failed} {d b c}}
test lset-5.2 {lset, not compiled, 3 args, can't set variable} {
list [catch {
eval [list $lset noWrite [list 0] d]
} msg] $msg $noWrite
} {1 {can't set "noWrite": trace failed} {d b c}}
test lset-6.1 {lset, not compiled, 3 args, 1-d list basics} {
set a {x y z}
list [eval [list $lset a 0 a]] $a
} {{a y z} {a y z}}
test lset-6.2 {lset, not compiled, 3 args, 1-d list basics} {
set a {x y z}
list [eval [list $lset a [list 0] a]] $a
} {{a y z} {a y z}}
test lset-6.3 {lset, not compiled, 1-d list basics} {
set a {x y z}
list [eval [list $lset a 2 a]] $a
} {{x y a} {x y a}}
test lset-6.4 {lset, not compiled, 1-d list basics} {
set a {x y z}
list [eval [list $lset a [list 2] a]] $a
} {{x y a} {x y a}}
test lset-6.5 {lset, not compiled, 1-d list basics} {
set a {x y z}
list [eval [list $lset a end a]] $a
} {{x y a} {x y a}}
test lset-6.6 {lset, not compiled, 1-d list basics} {
set a {x y z}
list [eval [list $lset a [list end] a]] $a
} {{x y a} {x y a}}
test lset-6.7 {lset, not compiled, 1-d list basics} {
set a {x y z}
list [eval [list $lset a end-0 a]] $a
} {{x y a} {x y a}}
test lset-6.8 {lset, not compiled, 1-d list basics} {
set a {x y z}
list [eval [list $lset a [list end-0] a]] $a
} {{x y a} {x y a}}
test lset-6.9 {lset, not compiled, 1-d list basics} {
set a {x y z}
list [eval [list $lset a end-2 a]] $a
} {{a y z} {a y z}}
test lset-6.10 {lset, not compiled, 1-d list basics} {
set a {x y z}
list [eval [list $lset a [list end-2] a]] $a
} {{a y z} {a y z}}
test lset-7.1 {lset, not compiled, data sharing} {
set a 0
list [eval [list $lset a $a {gag me}]] $a
} {{{gag me}} {{gag me}}}
test lset-7.2 {lset, not compiled, data sharing} {
set a [list 0]
list [eval [list $lset a $a {gag me}]] $a
} {{{gag me}} {{gag me}}}
test lset-7.3 {lset, not compiled, data sharing} {
set a {x y}
list [eval [list $lset a 0 $a]] $a
} {{{x y} y} {{x y} y}}
test lset-7.4 {lset, not compiled, data sharing} {
set a {x y}
list [eval [list $lset a [list 0] $a]] $a
} {{{x y} y} {{x y} y}}
test lset-7.5 {lset, not compiled, data sharing} {
set n 0
set a {x y}
list [eval [list $lset a $n $n]] $a $n
} {{0 y} {0 y} 0}
test lset-7.6 {lset, not compiled, data sharing} {
set n [list 0]
set a {x y}
list [eval [list $lset a $n $n]] $a $n
} {{0 y} {0 y} 0}
test lset-7.7 {lset, not compiled, data sharing} {
set n 0
set a [list $n $n]
list [eval [list $lset a $n 1]] $a $n
} {{1 0} {1 0} 0}
test lset-7.8 {lset, not compiled, data sharing} {
set n [list 0]
set a [list $n $n]
list [eval [list $lset a $n 1]] $a $n
} {{1 0} {1 0} 0}
test lset-7.9 {lset, not compiled, data sharing} {
set a 0
list [eval [list $lset a $a $a]] $a
} {0 0}
test lset-7.10 {lset, not compiled, data sharing} {
set a [list 0]
list [eval [list $lset a $a $a]] $a
} {0 0}
test lset-8.1 {lset, not compiled, malformed sublist} {
set a [list "a \{" b]
list [catch {eval [list $lset a 0 1 c]} msg] $msg
} {1 {unmatched open brace in list}}
test lset-8.2 {lset, not compiled, malformed sublist} {
set a [list "a \{" b]
list [catch {eval [list $lset a {0 1} c]} msg] $msg
} {1 {unmatched open brace in list}}
test lset-8.3 {lset, not compiled, bad second index} {
set a {{b c} {d e}}
list [catch {eval [list $lset a 0 2a2 f]} msg] $msg
} {1 {bad index "2a2": must be integer or end?-integer?}}
test lset-8.4 {lset, not compiled, bad second index} {
set a {{b c} {d e}}
list [catch {eval [list $lset a {0 2a2} f]} msg] $msg
} {1 {bad index "2a2": must be integer or end?-integer?}}
test lset-8.5 {lset, not compiled, second index out of range} {
set a {{b c} {d e} {f g}}
list [catch {eval [list $lset a 2 -1 h]} msg] $msg
} {1 {list index out of range}}
test lset-8.6 {lset, not compiled, second index out of range} {
set a {{b c} {d e} {f g}}
list [catch {eval [list $lset a {2 -1} h]} msg] $msg
} {1 {list index out of range}}
test lset-8.7 {lset, not compiled, second index out of range} {
set a {{b c} {d e} {f g}}
list [catch {eval [list $lset a 2 2 h]} msg] $msg
} {1 {list index out of range}}
test lset-8.8 {lset, not compiled, second index out of range} {
set a {{b c} {d e} {f g}}
list [catch {eval [list $lset a {2 2} h]} msg] $msg
} {1 {list index out of range}}
test lset-8.9 {lset, not compiled, second index out of range} {
set a {{b c} {d e} {f g}}
list [catch {eval [list $lset a 2 end--1 h]} msg] $msg
} {1 {list index out of range}}
test lset-8.10 {lset, not compiled, second index out of range} {
set a {{b c} {d e} {f g}}
list [catch {eval [list $lset a {2 end--1} h]} msg] $msg
} {1 {list index out of range}}
test lset-8.11 {lset, not compiled, second index out of range} {
set a {{b c} {d e} {f g}}
list [catch {eval [list $lset a 2 end-2 h]} msg] $msg
} {1 {list index out of range}}
test lset-8.12 {lset, not compiled, second index out of range} {
set a {{b c} {d e} {f g}}
list [catch {eval [list $lset a {2 end-2} h]} msg] $msg
} {1 {list index out of range}}
test lset-9.1 {lset, not compiled, entire variable} {
set a x
list [eval [list $lset a y]] $a
} {y y}
test lset-9.2 {lset, not compiled, entire variable} {
set a x
list [eval [list $lset a {} y]] $a
} {y y}
test lset-10.1 {lset, not compiled, shared data} {
set row {p q}
set a [list $row $row]
list [eval [list $lset a 0 0 x]] $a
} {{{x q} {p q}} {{x q} {p q}}}
test lset-10.2 {lset, not compiled, shared data} {
set row {p q}
set a [list $row $row]
list [eval [list $lset a {0 0} x]] $a
} {{{x q} {p q}} {{x q} {p q}}}
test lset-11.1 {lset, not compiled, 2-d basics} {
set a {{b c} {d e}}
list [eval [list $lset a 0 0 f]] $a
} {{{f c} {d e}} {{f c} {d e}}}
test lset-11.2 {lset, not compiled, 2-d basics} {
set a {{b c} {d e}}
list [eval [list $lset a {0 0} f]] $a
} {{{f c} {d e}} {{f c} {d e}}}
test lset-11.3 {lset, not compiled, 2-d basics} {
set a {{b c} {d e}}
list [eval [list $lset a 0 1 f]] $a
} {{{b f} {d e}} {{b f} {d e}}}
test lset-11.4 {lset, not compiled, 2-d basics} {
set a {{b c} {d e}}
list [eval [list $lset a {0 1} f]] $a
} {{{b f} {d e}} {{b f} {d e}}}
test lset-11.5 {lset, not compiled, 2-d basics} {
set a {{b c} {d e}}
list [eval [list $lset a 1 0 f]] $a
} {{{b c} {f e}} {{b c} {f e}}}
test lset-11.6 {lset, not compiled, 2-d basics} {
set a {{b c} {d e}}
list [eval [list $lset a {1 0} f]] $a
} {{{b c} {f e}} {{b c} {f e}}}
test lset-11.7 {lset, not compiled, 2-d basics} {
set a {{b c} {d e}}
list [eval [list $lset a 1 1 f]] $a
} {{{b c} {d f}} {{b c} {d f}}}
test lset-11.8 {lset, not compiled, 2-d basics} {
set a {{b c} {d e}}
list [eval [list $lset a {1 1} f]] $a
} {{{b c} {d f}} {{b c} {d f}}}
test lset-12.0 {lset, not compiled, typical sharing pattern} {
set zero 0
set row [list $zero $zero $zero $zero]
set ident [list $row $row $row $row]
for { set i 0 } { $i < 4 } { incr i } {
eval [list $lset ident $i $i 1]
}
set ident
} {{1 0 0 0} {0 1 0 0} {0 0 1 0} {0 0 0 1}}
test lset-13.0 {lset, not compiled, shimmering hell} {
set a 0
list [eval [list $lset a $a $a $a $a {gag me}]] $a
} {{{{{{gag me}}}}} {{{{{gag me}}}}}}
test lset-13.1 {lset, not compiled, shimmering hell} {
set a [list 0]
list [eval [list $lset a $a $a $a $a {gag me}]] $a
} {{{{{{gag me}}}}} {{{{{gag me}}}}}}
test lset-13.2 {lset, not compiled, shimmering hell} {
set a [list 0 0 0 0]
list [eval [list $lset a $a {gag me}]] $a
} {{{{{{gag me}}}} 0 0 0} {{{{{gag me}}}} 0 0 0}}
test lset-14.1 {lset, not compiled, list args, is string rep preserved?} {
set a { { 1 2 } { 3 4 } }
catch { eval [list $lset a {1 5} 5] }
list $a [lindex $a 1]
} "{ { 1 2 } { 3 4 } } { 3 4 }"
test lset-14.2 {lset, not compiled, flat args, is string rep preserved?} {
set a { { 1 2 } { 3 4 } }
catch { eval [list $lset a 1 5 5] }
list $a [lindex $a 1]
} "{ { 1 2 } { 3 4 } } { 3 4 }"
catch {unset noRead}
catch {unset noWrite}
catch {rename failTrace {}}
catch {unset ::x}
catch {unset ::y}
# cleanup
::tcltest::cleanupTests
return
|
Added tests/lsetComp.test.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 |
# This file is a -*- tcl -*- test script
# Commands covered: lset
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands. Sourcing this file into Tcl runs the tests and
# generates output for errors. No output means no errors were found.
#
# Copyright (c) 2001 by Kevin B. Kenny. All rights reserved.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id$
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
namespace import -force ::tcltest::*
}
# Procedure to evaluate a script within a proc, to test compilation
# functionality
proc evalInProc { script } {
proc testProc {} $script
set status [catch {
testProc
} result]
rename testProc {}
return [list $status $result]
}
# Tests for the bytecode compilation of the 'lset' command
test lsetComp-1.1 {lset, compiled, wrong \# args} {
evalInProc {
lset
}
} "1 {wrong \# args: should be \"lset listVar index ?index...? value\"}"
test lsetComp-2.1 {lset, compiled, list of args, not a simple var name} {
evalInProc {
set y x
set x {{1 2} {3 4}}
lset $y {1 1} 5
}
} "0 {{1 2} {3 5}}"
test lsetComp-2.2 {lset, compiled, list of args, scalar on stack} {
evalInProc {
set ::x {{1 2} {3 4}}
lset ::x {1 1} 5
}
} "0 {{1 2} {3 5}}"
test lsetComp-2.3 {lset, compiled, list of args, scalar, one-byte offset} {
evalInProc {
set x {{1 2} {3 4}}
lset x {1 1} 5
}
} "0 {{1 2} {3 5}}"
test lsetComp-2.4 {lset, compiled, list of args, scalar, four-byte offset} {
evalInProc {
set x0 0; set x1 0; set x2 0; set x3 0;
set x4 0; set x5 0; set x6 0; set x7 0;
set x8 0; set x9 0; set x10 0; set x11 0;
set x12 0; set x13 0; set x14 0; set x15 0;
set x16 0; set x17 0; set x18 0; set x19 0;
set x20 0; set x21 0; set x22 0; set x23 0;
set x24 0; set x25 0; set x26 0; set x27 0;
set x28 0; set x29 0; set x30 0; set x31 0;
set x32 0; set x33 0; set x34 0; set x35 0;
set x36 0; set x37 0; set x38 0; set x39 0;
set x40 0; set x41 0; set x42 0; set x43 0;
set x44 0; set x45 0; set x46 0; set x47 0;
set x48 0; set x49 0; set x50 0; set x51 0;
set x52 0; set x53 0; set x54 0; set x55 0;
set x56 0; set x57 0; set x58 0; set x59 0;
set x60 0; set x61 0; set x62 0; set x63 0;
set x64 0; set x65 0; set x66 0; set x67 0;
set x68 0; set x69 0; set x70 0; set x71 0;
set x72 0; set x73 0; set x74 0; set x75 0;
set x76 0; set x77 0; set x78 0; set x79 0;
set x80 0; set x81 0; set x82 0; set x83 0;
set x84 0; set x85 0; set x86 0; set x87 0;
set x88 0; set x89 0; set x90 0; set x91 0;
set x92 0; set x93 0; set x94 0; set x95 0;
set x96 0; set x97 0; set x98 0; set x99 0;
set x100 0; set x101 0; set x102 0; set x103 0;
set x104 0; set x105 0; set x106 0; set x107 0;
set x108 0; set x109 0; set x110 0; set x111 0;
set x112 0; set x113 0; set x114 0; set x115 0;
set x116 0; set x117 0; set x118 0; set x119 0;
set x120 0; set x121 0; set x122 0; set x123 0;
set x124 0; set x125 0; set x126 0; set x127 0;
set x128 0; set x129 0; set x130 0; set x131 0;
set x132 0; set x133 0; set x134 0; set x135 0;
set x136 0; set x137 0; set x138 0; set x139 0;
set x140 0; set x141 0; set x142 0; set x143 0;
set x144 0; set x145 0; set x146 0; set x147 0;
set x148 0; set x149 0; set x150 0; set x151 0;
set x152 0; set x153 0; set x154 0; set x155 0;
set x156 0; set x157 0; set x158 0; set x159 0;
set x160 0; set x161 0; set x162 0; set x163 0;
set x164 0; set x165 0; set x166 0; set x167 0;
set x168 0; set x169 0; set x170 0; set x171 0;
set x172 0; set x173 0; set x174 0; set x175 0;
set x176 0; set x177 0; set x178 0; set x179 0;
set x180 0; set x181 0; set x182 0; set x183 0;
set x184 0; set x185 0; set x186 0; set x187 0;
set x188 0; set x189 0; set x190 0; set x191 0;
set x192 0; set x193 0; set x194 0; set x195 0;
set x196 0; set x197 0; set x198 0; set x199 0;
set x200 0; set x201 0; set x202 0; set x203 0;
set x204 0; set x205 0; set x206 0; set x207 0;
set x208 0; set x209 0; set x210 0; set x211 0;
set x212 0; set x213 0; set x214 0; set x215 0;
set x216 0; set x217 0; set x218 0; set x219 0;
set x220 0; set x221 0; set x222 0; set x223 0;
set x224 0; set x225 0; set x226 0; set x227 0;
set x228 0; set x229 0; set x230 0; set x231 0;
set x232 0; set x233 0; set x234 0; set x235 0;
set x236 0; set x237 0; set x238 0; set x239 0;
set x240 0; set x241 0; set x242 0; set x243 0;
set x244 0; set x245 0; set x246 0; set x247 0;
set x248 0; set x249 0; set x250 0; set x251 0;
set x252 0; set x253 0; set x254 0; set x255 0;
set x {{1 2} {3 4}}
lset x {1 1} 5
}
} "0 {{1 2} {3 5}}"
test lsetComp-2.5 {lset, compiled, list of args, array on stack} {
evalInProc {
set ::y(0) {{1 2} {3 4}}
lset ::y(0) {1 1} 5
}
} "0 {{1 2} {3 5}}"
test lsetComp-2.6 {lset, compiled, list of args, array, one-byte offset} {
evalInProc {
set y(0) {{1 2} {3 4}}
lset y(0) {1 1} 5
}
} "0 {{1 2} {3 5}}"
test lsetComp-2.7 {lset, compiled, list of args, array, four-byte offset} {
evalInProc {
set x0 0; set x1 0; set x2 0; set x3 0;
set x4 0; set x5 0; set x6 0; set x7 0;
set x8 0; set x9 0; set x10 0; set x11 0;
set x12 0; set x13 0; set x14 0; set x15 0;
set x16 0; set x17 0; set x18 0; set x19 0;
set x20 0; set x21 0; set x22 0; set x23 0;
set x24 0; set x25 0; set x26 0; set x27 0;
set x28 0; set x29 0; set x30 0; set x31 0;
set x32 0; set x33 0; set x34 0; set x35 0;
set x36 0; set x37 0; set x38 0; set x39 0;
set x40 0; set x41 0; set x42 0; set x43 0;
set x44 0; set x45 0; set x46 0; set x47 0;
set x48 0; set x49 0; set x50 0; set x51 0;
set x52 0; set x53 0; set x54 0; set x55 0;
set x56 0; set x57 0; set x58 0; set x59 0;
set x60 0; set x61 0; set x62 0; set x63 0;
set x64 0; set x65 0; set x66 0; set x67 0;
set x68 0; set x69 0; set x70 0; set x71 0;
set x72 0; set x73 0; set x74 0; set x75 0;
set x76 0; set x77 0; set x78 0; set x79 0;
set x80 0; set x81 0; set x82 0; set x83 0;
set x84 0; set x85 0; set x86 0; set x87 0;
set x88 0; set x89 0; set x90 0; set x91 0;
set x92 0; set x93 0; set x94 0; set x95 0;
set x96 0; set x97 0; set x98 0; set x99 0;
set x100 0; set x101 0; set x102 0; set x103 0;
set x104 0; set x105 0; set x106 0; set x107 0;
set x108 0; set x109 0; set x110 0; set x111 0;
set x112 0; set x113 0; set x114 0; set x115 0;
set x116 0; set x117 0; set x118 0; set x119 0;
set x120 0; set x121 0; set x122 0; set x123 0;
set x124 0; set x125 0; set x126 0; set x127 0;
set x128 0; set x129 0; set x130 0; set x131 0;
set x132 0; set x133 0; set x134 0; set x135 0;
set x136 0; set x137 0; set x138 0; set x139 0;
set x140 0; set x141 0; set x142 0; set x143 0;
set x144 0; set x145 0; set x146 0; set x147 0;
set x148 0; set x149 0; set x150 0; set x151 0;
set x152 0; set x153 0; set x154 0; set x155 0;
set x156 0; set x157 0; set x158 0; set x159 0;
set x160 0; set x161 0; set x162 0; set x163 0;
set x164 0; set x165 0; set x166 0; set x167 0;
set x168 0; set x169 0; set x170 0; set x171 0;
set x172 0; set x173 0; set x174 0; set x175 0;
set x176 0; set x177 0; set x178 0; set x179 0;
set x180 0; set x181 0; set x182 0; set x183 0;
set x184 0; set x185 0; set x186 0; set x187 0;
set x188 0; set x189 0; set x190 0; set x191 0;
set x192 0; set x193 0; set x194 0; set x195 0;
set x196 0; set x197 0; set x198 0; set x199 0;
set x200 0; set x201 0; set x202 0; set x203 0;
set x204 0; set x205 0; set x206 0; set x207 0;
set x208 0; set x209 0; set x210 0; set x211 0;
set x212 0; set x213 0; set x214 0; set x215 0;
set x216 0; set x217 0; set x218 0; set x219 0;
set x220 0; set x221 0; set x222 0; set x223 0;
set x224 0; set x225 0; set x226 0; set x227 0;
set x228 0; set x229 0; set x230 0; set x231 0;
set x232 0; set x233 0; set x234 0; set x235 0;
set x236 0; set x237 0; set x238 0; set x239 0;
set x240 0; set x241 0; set x242 0; set x243 0;
set x244 0; set x245 0; set x246 0; set x247 0;
set x248 0; set x249 0; set x250 0; set x251 0;
set x252 0; set x253 0; set x254 0; set x255 0;
set y(0) {{1 2} {3 4}}
lset y(0) {1 1} 5
}
} "0 {{1 2} {3 5}}"
test lsetComp-2.8 {lset, compiled, list of args, error } {
evalInProc {
set x { {1 2} {3 4} }
lset x {1 5} 5
}
} "1 {list index out of range}"
test lsetComp-2.9 {lset, compiled, list of args, error - is string preserved} {
set ::x { { 1 2 } { 3 4 } }
evalInProc {
lset ::x { 1 5 } 5
}
list $::x [lindex $::x 1]
} "{ { 1 2 } { 3 4 } } { 3 4 }"
test lsetComp-3.1 {lset, compiled, flat args, not a simple var name} {
evalInProc {
set y x
set x {{1 2} {3 4}}
lset $y 1 1 5
}
} "0 {{1 2} {3 5}}"
test lsetComp-3.2 {lset, compiled, flat args, scalar on stack} {
evalInProc {
set ::x {{1 2} {3 4}}
lset ::x 1 1 5
}
} "0 {{1 2} {3 5}}"
test lsetComp-3.3 {lset, compiled, flat args, scalar, one-byte offset} {
evalInProc {
set x {{1 2} {3 4}}
lset x 1 1 5
}
} "0 {{1 2} {3 5}}"
test lsetComp-3.4 {lset, compiled, scalar, four-byte offset} {
evalInProc {
set x0 0; set x1 0; set x2 0; set x3 0;
set x4 0; set x5 0; set x6 0; set x7 0;
set x8 0; set x9 0; set x10 0; set x11 0;
set x12 0; set x13 0; set x14 0; set x15 0;
set x16 0; set x17 0; set x18 0; set x19 0;
set x20 0; set x21 0; set x22 0; set x23 0;
set x24 0; set x25 0; set x26 0; set x27 0;
set x28 0; set x29 0; set x30 0; set x31 0;
set x32 0; set x33 0; set x34 0; set x35 0;
set x36 0; set x37 0; set x38 0; set x39 0;
set x40 0; set x41 0; set x42 0; set x43 0;
set x44 0; set x45 0; set x46 0; set x47 0;
set x48 0; set x49 0; set x50 0; set x51 0;
set x52 0; set x53 0; set x54 0; set x55 0;
set x56 0; set x57 0; set x58 0; set x59 0;
set x60 0; set x61 0; set x62 0; set x63 0;
set x64 0; set x65 0; set x66 0; set x67 0;
set x68 0; set x69 0; set x70 0; set x71 0;
set x72 0; set x73 0; set x74 0; set x75 0;
set x76 0; set x77 0; set x78 0; set x79 0;
set x80 0; set x81 0; set x82 0; set x83 0;
set x84 0; set x85 0; set x86 0; set x87 0;
set x88 0; set x89 0; set x90 0; set x91 0;
set x92 0; set x93 0; set x94 0; set x95 0;
set x96 0; set x97 0; set x98 0; set x99 0;
set x100 0; set x101 0; set x102 0; set x103 0;
set x104 0; set x105 0; set x106 0; set x107 0;
set x108 0; set x109 0; set x110 0; set x111 0;
set x112 0; set x113 0; set x114 0; set x115 0;
set x116 0; set x117 0; set x118 0; set x119 0;
set x120 0; set x121 0; set x122 0; set x123 0;
set x124 0; set x125 0; set x126 0; set x127 0;
set x128 0; set x129 0; set x130 0; set x131 0;
set x132 0; set x133 0; set x134 0; set x135 0;
set x136 0; set x137 0; set x138 0; set x139 0;
set x140 0; set x141 0; set x142 0; set x143 0;
set x144 0; set x145 0; set x146 0; set x147 0;
set x148 0; set x149 0; set x150 0; set x151 0;
set x152 0; set x153 0; set x154 0; set x155 0;
set x156 0; set x157 0; set x158 0; set x159 0;
set x160 0; set x161 0; set x162 0; set x163 0;
set x164 0; set x165 0; set x166 0; set x167 0;
set x168 0; set x169 0; set x170 0; set x171 0;
set x172 0; set x173 0; set x174 0; set x175 0;
set x176 0; set x177 0; set x178 0; set x179 0;
set x180 0; set x181 0; set x182 0; set x183 0;
set x184 0; set x185 0; set x186 0; set x187 0;
set x188 0; set x189 0; set x190 0; set x191 0;
set x192 0; set x193 0; set x194 0; set x195 0;
set x196 0; set x197 0; set x198 0; set x199 0;
set x200 0; set x201 0; set x202 0; set x203 0;
set x204 0; set x205 0; set x206 0; set x207 0;
set x208 0; set x209 0; set x210 0; set x211 0;
set x212 0; set x213 0; set x214 0; set x215 0;
set x216 0; set x217 0; set x218 0; set x219 0;
set x220 0; set x221 0; set x222 0; set x223 0;
set x224 0; set x225 0; set x226 0; set x227 0;
set x228 0; set x229 0; set x230 0; set x231 0;
set x232 0; set x233 0; set x234 0; set x235 0;
set x236 0; set x237 0; set x238 0; set x239 0;
set x240 0; set x241 0; set x242 0; set x243 0;
set x244 0; set x245 0; set x246 0; set x247 0;
set x248 0; set x249 0; set x250 0; set x251 0;
set x252 0; set x253 0; set x254 0; set x255 0;
set x {{1 2} {3 4}}
lset x 1 1 5
}
} "0 {{1 2} {3 5}}"
test lsetComp-3.5 {lset, compiled, flat args, array on stack} {
evalInProc {
set ::y(0) {{1 2} {3 4}}
lset ::y(0) 1 1 5
}
} "0 {{1 2} {3 5}}"
test lsetComp-3.6 {lset, compiled, flat args, array, one-byte offset} {
evalInProc {
set y(0) {{1 2} {3 4}}
lset y(0) 1 1 5
}
} "0 {{1 2} {3 5}}"
test lsetComp-3.7 {lset, compiled, flat args, array, four-byte offset} {
evalInProc {
set x0 0; set x1 0; set x2 0; set x3 0;
set x4 0; set x5 0; set x6 0; set x7 0;
set x8 0; set x9 0; set x10 0; set x11 0;
set x12 0; set x13 0; set x14 0; set x15 0;
set x16 0; set x17 0; set x18 0; set x19 0;
set x20 0; set x21 0; set x22 0; set x23 0;
set x24 0; set x25 0; set x26 0; set x27 0;
set x28 0; set x29 0; set x30 0; set x31 0;
set x32 0; set x33 0; set x34 0; set x35 0;
set x36 0; set x37 0; set x38 0; set x39 0;
set x40 0; set x41 0; set x42 0; set x43 0;
set x44 0; set x45 0; set x46 0; set x47 0;
set x48 0; set x49 0; set x50 0; set x51 0;
set x52 0; set x53 0; set x54 0; set x55 0;
set x56 0; set x57 0; set x58 0; set x59 0;
set x60 0; set x61 0; set x62 0; set x63 0;
set x64 0; set x65 0; set x66 0; set x67 0;
set x68 0; set x69 0; set x70 0; set x71 0;
set x72 0; set x73 0; set x74 0; set x75 0;
set x76 0; set x77 0; set x78 0; set x79 0;
set x80 0; set x81 0; set x82 0; set x83 0;
set x84 0; set x85 0; set x86 0; set x87 0;
set x88 0; set x89 0; set x90 0; set x91 0;
set x92 0; set x93 0; set x94 0; set x95 0;
set x96 0; set x97 0; set x98 0; set x99 0;
set x100 0; set x101 0; set x102 0; set x103 0;
set x104 0; set x105 0; set x106 0; set x107 0;
set x108 0; set x109 0; set x110 0; set x111 0;
set x112 0; set x113 0; set x114 0; set x115 0;
set x116 0; set x117 0; set x118 0; set x119 0;
set x120 0; set x121 0; set x122 0; set x123 0;
set x124 0; set x125 0; set x126 0; set x127 0;
set x128 0; set x129 0; set x130 0; set x131 0;
set x132 0; set x133 0; set x134 0; set x135 0;
set x136 0; set x137 0; set x138 0; set x139 0;
set x140 0; set x141 0; set x142 0; set x143 0;
set x144 0; set x145 0; set x146 0; set x147 0;
set x148 0; set x149 0; set x150 0; set x151 0;
set x152 0; set x153 0; set x154 0; set x155 0;
set x156 0; set x157 0; set x158 0; set x159 0;
set x160 0; set x161 0; set x162 0; set x163 0;
set x164 0; set x165 0; set x166 0; set x167 0;
set x168 0; set x169 0; set x170 0; set x171 0;
set x172 0; set x173 0; set x174 0; set x175 0;
set x176 0; set x177 0; set x178 0; set x179 0;
set x180 0; set x181 0; set x182 0; set x183 0;
set x184 0; set x185 0; set x186 0; set x187 0;
set x188 0; set x189 0; set x190 0; set x191 0;
set x192 0; set x193 0; set x194 0; set x195 0;
set x196 0; set x197 0; set x198 0; set x199 0;
set x200 0; set x201 0; set x202 0; set x203 0;
set x204 0; set x205 0; set x206 0; set x207 0;
set x208 0; set x209 0; set x210 0; set x211 0;
set x212 0; set x213 0; set x214 0; set x215 0;
set x216 0; set x217 0; set x218 0; set x219 0;
set x220 0; set x221 0; set x222 0; set x223 0;
set x224 0; set x225 0; set x226 0; set x227 0;
set x228 0; set x229 0; set x230 0; set x231 0;
set x232 0; set x233 0; set x234 0; set x235 0;
set x236 0; set x237 0; set x238 0; set x239 0;
set x240 0; set x241 0; set x242 0; set x243 0;
set x244 0; set x245 0; set x246 0; set x247 0;
set x248 0; set x249 0; set x250 0; set x251 0;
set x252 0; set x253 0; set x254 0; set x255 0;
set y(0) {{1 2} {3 4}}
lset y(0) 1 1 5
}
} "0 {{1 2} {3 5}}"
test lsetComp-3.8 {lset, compiled, flat args, error } {
evalInProc {
set x { {1 2} {3 4} }
lset x 1 5 5
}
} "1 {list index out of range}"
test lsetComp-3.9 {lset, compiled, flat args, error - is string preserved} {
set ::x { { 1 2 } { 3 4 } }
evalInProc {
lset ::x 1 5 5
}
list $::x [lindex $::x 1]
} "{ { 1 2 } { 3 4 } } { 3 4 }"
catch { rename evalInProc {} }
catch { unset ::x }
catch { unset ::y }
# cleanup
::tcltest::cleanupTests
return
|
Changes to tests/macFCmd.test.
1 2 3 4 5 6 7 8 9 10 11 12 | # This file tests the tclfCmd.c file. # # This file contains a collection of tests for one or more of the Tcl # built-in commands. Sourcing this file into Tcl runs the tests and # generates output for errors. No output means no errors were found. # # Copyright (c) 1997 Sun Microsystems, Inc. # Copyright (c) 1998-1999 by Scriptics Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# This file tests the tclfCmd.c file.
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands. Sourcing this file into Tcl runs the tests and
# generates output for errors. No output means no errors were found.
#
# Copyright (c) 1997 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: macFCmd.test,v 1.7.18.1 2002/02/05 02:22:04 wolfsuit Exp $
#
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
namespace import -force ::tcltest::*
}
|
| ︙ | ︙ | |||
28 29 30 31 32 33 34 |
set ::tcltest::testConstraints(notFileSharing) 0
}
file delete -force foo.dir
test macFCmd-1.1 {GetFileFinderAttributes - no file} {macOnly} {
catch {file delete -force foo.file}
list [catch {file attributes foo.file -creator} msg] $msg
| | | 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
set ::tcltest::testConstraints(notFileSharing) 0
}
file delete -force foo.dir
test macFCmd-1.1 {GetFileFinderAttributes - no file} {macOnly} {
catch {file delete -force foo.file}
list [catch {file attributes foo.file -creator} msg] $msg
} {1 {could not read "foo.file": no such file or directory}}
test macFCmd-1.2 {GetFileFinderAttributes - creator} {macOnly} {
catch {file delete -force foo.file}
catch {close [open foo.file w]}
list [catch {file attributes foo.file -creator} msg] $msg \
[file delete -force foo.file]
} {0 {MPW } {}}
test macFCmd-1.3 {GetFileFinderAttributes - type} {macOnly} {
|
| ︙ | ︙ | |||
76 77 78 79 80 81 82 |
list [catch {file attributes foo.dir -hidden} msg] $msg \
[file delete -force foo.dir]
} {0 0 {}}
test macFCmd-2.1 {GetFileReadOnly - bad file} {macOnly} {
catch {file delete -force foo.file}
list [catch {file attributes foo.file -readonly} msg] $msg
| | | 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
list [catch {file attributes foo.dir -hidden} msg] $msg \
[file delete -force foo.dir]
} {0 0 {}}
test macFCmd-2.1 {GetFileReadOnly - bad file} {macOnly} {
catch {file delete -force foo.file}
list [catch {file attributes foo.file -readonly} msg] $msg
} {1 {could not read "foo.file": no such file or directory}}
test macFCmd-2.2 {GetFileReadOnly - file not read only} {macOnly} {
catch {file delete -force foo.file}
close [open foo.file w]
list [catch {file attributes foo.file -readonly} msg] $msg \
[file delete -force foo.file]
} {0 0 {}}
test macFCmd-2.3 {GetFileReadOnly - file read only} {macOnly} {
|
| ︙ | ︙ | |||
107 108 109 110 111 112 113 |
list [catch {file attributes foo.dir -readonly} msg] $msg \
[file delete -force foo.dir]
} {0 1 {}}
test macFCmd-3.1 {SetFileFinderAttributes - bad file} {macOnly} {
catch {file delete -force foo.file}
list [catch {file attributes foo.file -creator FOOO} msg] $msg
| | | 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
list [catch {file attributes foo.dir -readonly} msg] $msg \
[file delete -force foo.dir]
} {0 1 {}}
test macFCmd-3.1 {SetFileFinderAttributes - bad file} {macOnly} {
catch {file delete -force foo.file}
list [catch {file attributes foo.file -creator FOOO} msg] $msg
} {1 {could not read "foo.file": no such file or directory}}
test macFCmd-3.2 {SetFileFinderAttributes - creator} {macOnly} {
catch {file delete -force foo.file}
close [open foo.file w]
list [catch {file attributes foo.file -creator FOOO} msg] $msg \
[file attributes foo.file -creator] [file delete -force foo.file]
} {0 {} FOOO {}}
test macFCmd-3.3 {SetFileFinderAttributes - bad creator} {macOnly} {
|
| ︙ | ︙ | |||
143 144 145 146 147 148 149 |
[file delete -force foo.file]
} {1 {expected Macintosh OS type but got "0"} {}}
test macFCmd-3.7 {SetFileFinderAttributes - directory} {macOnly} {
catch {file delete -force foo.dir}
file mkdir foo.dir
list [catch {file attributes foo.dir -creator FOOO} msg] \
$msg [file delete -force foo.dir]
| | | | 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 |
[file delete -force foo.file]
} {1 {expected Macintosh OS type but got "0"} {}}
test macFCmd-3.7 {SetFileFinderAttributes - directory} {macOnly} {
catch {file delete -force foo.dir}
file mkdir foo.dir
list [catch {file attributes foo.dir -creator FOOO} msg] \
$msg [file delete -force foo.dir]
} {1 {cannot set -creator: "foo.dir" is a directory} {}}
test macFCmd-4.1 {SetFileReadOnly - bad file} {macOnly} {
catch {file delete -force foo.file}
list [catch {file attributes foo.file -readonly 1} msg] $msg
} {1 {could not read "foo.file": no such file or directory}}
test macFCmd-4.2 {SetFileReadOnly - file not readonly} {macOnly} {
catch {file delete -force foo.file}
close [open foo.file w]
list [catch {file attributes foo.file -readonly 0} msg] \
$msg [file attributes foo.file -readonly] [file delete -force foo.file]
} {0 {} 0 {}}
test macFCmd-4.3 {SetFileReadOnly - file readonly} {macOnly} {
|
| ︙ | ︙ |
Added tests/main.test.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 |
# This file contains a collection of tests for generic/tclMain.c.
#
# RCS: @(#) $Id: main.test,v 1.4.2.1 2002/02/05 02:22:04 wolfsuit Exp $
if {[catch {package require tcltest 2}]} {
puts stderr "Skipping tests in [info script]. tcltest v2 needed."
return
}
namespace eval ::tcl::main::test {
namespace import ::tcltest::test
namespace import ::tcltest::testConstraint
namespace import ::tcltest::interpreter
namespace import ::tcltest::cleanupTests
namespace import ::tcltest::makeFile
namespace import ::tcltest::removeFile
# Is [exec] defined?
testConstraint exec [llength [info commands exec]]
# Is the Tcltest package loaded?
# - that is, the special C-coded testing commands in tclTest.c
# - tests use testing commands introduced in Tcltest 8.4
testConstraint Tcltest [expr {
[llength [package provide Tcltest]]
&& [package vsatisfies [package provide Tcltest] 8.4]}]
# Procedure to simulate interactive typing of commands, line by line
proc type {chan script} {
foreach line [split $script \n] {
if {[catch {
puts $chan $line
flush $chan
}]} {
return
}
# Grrr... Behavior depends on this value.
after 1000
}
}
# Tests Tcl_Main-1.*: variable initializations
test Tcl_Main-1.1 {
Tcl_Main: startup script - normal
} -constraints [list exec] -setup {
makeFile {puts [list $argv0 $argv $tcl_interactive]} script
catch {set f [open "|[interpreter] script" r]}
} -body {
read $f
} -cleanup {
close $f
removeFile script
} -result [list script {} 0]\n
test Tcl_Main-1.2 {
Tcl_Main: startup script - can't begin with '-'
} -constraints [list exec] -setup {
makeFile {puts [list $argv0 $argv $tcl_interactive]} -script
catch {set f [open "|[interpreter] -script" w+]}
} -body {
puts $f {puts [list $argv0 $argv $tcl_interactive]; exit}
flush $f
read $f
} -cleanup {
close $f
removeFile -script
} -result [list [interpreter] -script 0]\n
test Tcl_Main-1.3 {
Tcl_Main: encoding of arguments: done by system encoding
Note the shortcoming explained in Tcl Patch 491789
} -constraints [list exec] -setup {
makeFile {puts [list $argv0 $argv $tcl_interactive]} script
catch {set f [open "|[interpreter] script \u00c0" r]}
} -body {
read $f
} -cleanup {
close $f
removeFile script
} -result [list script [list [encoding convertfrom [encoding system] \
[encoding convertto [encoding system] \u00c0]]] 0]\n
test Tcl_Main-1.4 {
Tcl_Main: encoding of arguments: done by system encoding
Note the shortcoming explained in Tcl Patch 491789
} -constraints [list exec] -setup {
makeFile {puts [list $argv0 $argv $tcl_interactive]} script
catch {set f [open "|[interpreter] script \u20ac" r]}
} -body {
read $f
} -cleanup {
close $f
removeFile script
} -result [list script [list [encoding convertfrom [encoding system] \
[encoding convertto [encoding system] \u20ac]]] 0]\n
test Tcl_Main-1.5 {
Tcl_Main: encoding of script name: system encoding loss
Note the shortcoming explained in Tcl Patch 491789
} -constraints [list exec] -setup {
makeFile {puts [list $argv0 $argv $tcl_interactive]} \u00c0
catch {set f [open "|[interpreter] \u00c0" r]}
} -body {
read $f
} -cleanup {
close $f
removeFile \u00c0
} -result [list [list [encoding convertfrom [encoding system] \
[encoding convertto [encoding system] \u00c0]]] {} 0]\n
test Tcl_Main-1.6 {
Tcl_Main: encoding of script name: system encoding loss
Note the shortcoming explained in Tcl Patch 491789
} -constraints [list exec] -setup {
makeFile {puts [list $argv0 $argv $tcl_interactive]} \u20ac
catch {set f [open "|[interpreter] \u20ac" r]}
} -body {
read $f
} -cleanup {
close $f
removeFile \u20ac
} -result [list [list [encoding convertfrom [encoding system] \
[encoding convertto [encoding system] \u20ac]]] {} 0]\n
# Tests Tcl_Main-2.*: application-initialization procedure
test Tcl_Main-2.1 {
Tcl_Main: appInitProc returns error
} -constraints [list exec Tcltest] -setup {
makeFile {puts "In script"} script
} -body {
exec [interpreter] script -appinitprocerror >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
removeFile script
} -result "application-specific initialization failed: \nIn script\n"
test Tcl_Main-2.2 {
Tcl_Main: appInitProc returns error
} -constraints [list exec Tcltest] -body {
exec [interpreter] << {puts "In script"} -appinitprocerror >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
} -result "application-specific initialization failed: \nIn script\n"
test Tcl_Main-2.3 {
Tcl_Main: appInitProc deletes interp
} -constraints [list exec Tcltest] -setup {
makeFile {puts "In script"} script
} -body {
exec [interpreter] script -appinitprocdeleteinterp >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
removeFile script
} -result "application-specific initialization failed: \n"
test Tcl_Main-2.4 {
Tcl_Main: appInitProc deletes interp
} -constraints [list exec Tcltest] -body {
exec [interpreter] << {puts "In script"} \
-appinitprocdeleteinterp >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
} -result "application-specific initialization failed: \n"
test Tcl_Main-2.5 {
Tcl_Main: appInitProc closes stderr
} -constraints [list exec Tcltest] -body {
exec [interpreter] << {puts "In script"} \
-appinitprocclosestderr >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
} -result "In script\n"
# Tests Tcl_Main-3.*: startup script evaluation
test Tcl_Main-3.1 {
Tcl_Main: startup script does not exist
} -constraints [list exec] -setup {
catch {removeFile no-such-file}
} -body {
set code [catch {exec [interpreter] no-such-file >& result} result]
set f [open result]
list $code $result [read $f]
} -cleanup {
close $f
file delete result
} -match glob -result [list 1 {child process exited abnormally} \
{couldn't read file "no-such-file":*}]
test Tcl_Main-3.2 {
Tcl_Main: startup script raises error
} -constraints [list exec] -setup {
makeFile {error ERROR} script
} -body {
set code [catch {exec [interpreter] script >& result} result]
set f [open result]
list $code $result [read $f]
} -cleanup {
close $f
file delete result
removeFile script
} -match glob -result [list 1 {child process exited abnormally} \
"ERROR\n while executing*"]
test Tcl_Main-3.3 {
Tcl_Main: startup script closes stderr
} -constraints [list exec] -setup {
makeFile {close stderr; error ERROR} script
} -body {
set code [catch {exec [interpreter] script >& result} result]
set f [open result]
list $code $result [read $f]
} -cleanup {
close $f
file delete result
removeFile script
} -result [list 1 {child process exited abnormally} {}]
test Tcl_Main-3.4 {
Tcl_Main: startup script holds incomplete script
} -constraints [list exec] -setup {
makeFile "if 1 \{" script
} -body {
set code [catch {exec [interpreter] script >& result} result]
set f [open result]
list $code $result [read $f]
} -cleanup {
close $f
file delete result
removeFile script
} -match glob -result [list 1 {child process exited abnormally}\
"missing close-brace\n while executing*"]
test Tcl_Main-3.5 {
Tcl_Main: startup script sets main loop
} -constraints [list exec Tcltest] -setup {
makeFile {
rename exit _exit
proc exit {code} {
puts "In exit"
_exit $code
}
after 0 {
puts event
testexitmainloop
}
testexithandler create 0
testsetmainloop
} script
} -body {
exec [interpreter] script >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
removeFile script
} -result "event\nExit MainLoop\nIn exit\neven 0\n"
test Tcl_Main-3.6 {
Tcl_Main: startup script sets main loop and closes stdin
} -constraints [list exec Tcltest] -setup {
makeFile {
close stdin
testsetmainloop
rename exit _exit
proc exit {code} {
puts "In exit"
_exit $code
}
after 0 {
puts event
testexitmainloop
}
testexithandler create 0
} script
} -body {
exec [interpreter] script >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
removeFile script
} -result "event\nExit MainLoop\nIn exit\neven 0\n"
test Tcl_Main-3.7 {
Tcl_Main: startup script deletes interp
} -constraints [list exec Tcltest] -setup {
makeFile {
rename exit _exit
proc exit {code} {
puts "In exit"
_exit $code
}
testexithandler create 0
testinterpdelete {}
} script
} -body {
exec [interpreter] script >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
removeFile script
} -result "even 0\n"
test Tcl_Main-3.8 {
Tcl_Main: startup script deletes interp and sets mainloop
} -constraints [list exec Tcltest] -setup {
makeFile {
testsetmainloop
rename exit _exit
proc exit {code} {
puts "In exit"
_exit $code
}
testexitmainloop
testexithandler create 0
testinterpdelete {}
} script
} -body {
exec [interpreter] script >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
removeFile script
} -result "Exit MainLoop\neven 0\n"
test Tcl_Main-3.9 {
Tcl_Main: startup script can set tcl_interactive without limit
} -constraints [list exec] -setup {
makeFile {set tcl_interactive foo} script
} -body {
exec [interpreter] script >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
removeFile script
} -result {}
# Tests Tcl_Main-4.*: rc file evaluation
test Tcl_Main-4.1 {
Tcl_Main: rcFile evaluation deletes interp
} -constraints [list exec Tcltest] -setup {
set rc [makeFile {testinterpdelete {}} rc]
} -body {
exec [interpreter] << {puts "In script"} \
-appinitprocsetrcfile $rc >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
removeFile rc
} -result "application-specific initialization failed: \n"
test Tcl_Main-4.2 {
Tcl_Main: rcFile evaluation closes stdin
} -constraints [list exec Tcltest] -setup {
set rc [makeFile {close stdin} rc]
} -body {
exec [interpreter] << {puts "In script"} \
-appinitprocsetrcfile $rc >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
removeFile rc
} -result "application-specific initialization failed: \n"
test Tcl_Main-4.3 {
Tcl_Main: rcFile evaluation closes stdin and sets main loop
} -constraints [list exec Tcltest] -setup {
set rc [makeFile {
close stdin
testsetmainloop
after 0 testexitmainloop
testexithandler create 0
rename exit _exit
proc exit code {
puts "In exit"
_exit $code
}
} rc]
} -body {
exec [interpreter] << {puts "In script"} \
-appinitprocsetrcfile $rc >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
removeFile rc
} -result "application-specific initialization failed:\
\nExit MainLoop\nIn exit\neven 0\n"
test Tcl_Main-4.4 {
Tcl_Main: rcFile evaluation sets main loop
} -constraints [list exec Tcltest] -setup {
set rc [makeFile {
testsetmainloop
after 0 testexitmainloop
testexithandler create 0
rename exit _exit
proc exit code {
puts "In exit"
_exit $code
}
} rc]
} -body {
exec [interpreter] << {puts "In script"} \
-appinitprocsetrcfile $rc >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
removeFile rc
} -result "application-specific initialization failed:\
\nIn script\nExit MainLoop\nIn exit\neven 0\n"
# Tests Tcl_Main-5.*: interactive operations
test Tcl_Main-5.1 {
Tcl_Main: tcl_interactive must be boolean
} -constraints [list exec] -body {
exec [interpreter] << {set tcl_interactive foo} >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
} -result "can't set \"tcl_interactive\":\
variable must have boolean value\n"
test Tcl_Main-5.2 {
Tcl_Main able to handle non-blocking stdin
} -constraints [list exec] -setup {
catch {set f [open "|[interpreter]" w+]}
} -body {
type $f {
fconfigure stdin -blocking 0
puts SUCCESS
}
list [catch {gets $f} line] $line
} -cleanup {
close $f
} -result [list 0 SUCCESS]
test Tcl_Main-5.3 {
Tcl_Main handles stdin EOF in mid-command
} -constraints [list exec] -setup {
catch {set f [open "|[interpreter]" w+]}
catch {fconfigure $f -blocking 0}
} -body {
type $f "fconfigure stdin -eofchar \\032
if 1 \{\n\032"
variable wait
fileevent $f readable \
[list set [namespace which -variable wait] "child exit"]
after 2000 [list set [namespace which -variable wait] timeout]
vwait [namespace which -variable wait]
set wait
} -cleanup {
if {[string equal timeout $wait]
&& [string equal unix $::tcl_platform(platform)]} {
exec kill [pid $f]
}
close $f
} -result {child exit}
test Tcl_Main-5.4 {
Tcl_Main handles stdin EOF in mid-command
} -constraints [list exec] -setup {
set cmd {makeFile "if 1 \{" script}
catch {set f [open "|[interpreter] < [eval $cmd]" r]}
catch {fconfigure $f -blocking 0}
} -body {
variable wait
fileevent $f readable \
[list set [namespace which -variable wait] "child exit"]
after 2000 [list set [namespace which -variable wait] timeout]
vwait [namespace which -variable wait]
set wait
} -cleanup {
if {[string equal timeout $wait]
&& [string equal unix $::tcl_platform(platform)]} {
exec kill [pid $f]
}
close $f
removeFile script
} -result {child exit}
test Tcl_Main-5.5 {
Tcl_Main: error raised in interactive mode
} -constraints [list exec] -body {
exec [interpreter] << {error foo} >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
} -result "foo\n"
test Tcl_Main-5.6 {
Tcl_Main: interactive mode: errors don't stop command loop
} -constraints [list exec] -body {
exec [interpreter] << {
error foo
puts bar
} >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
} -result "foo\nbar\n"
test Tcl_Main-5.7 {
Tcl_Main: interactive mode: closed stderr
} -constraints [list exec] -body {
exec [interpreter] << {
close stderr
error foo
puts bar
} >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
} -result "bar\n"
test Tcl_Main-5.8 {
Tcl_Main: interactive mode: close stdin
-> main loop & [exit] & exit handlers
} -constraints [list exec Tcltest] -body {
exec [interpreter] << {
rename exit _exit
proc exit code {
puts "In exit"
_exit $code
}
testsetmainloop
testexitmainloop
testexithandler create 0
close stdin
} >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
} -result "Exit MainLoop\nIn exit\neven 0\n"
test Tcl_Main-5.9 {
Tcl_Main: interactive mode: delete interp
-> main loop & exit handlers, but no [exit]
} -constraints [list exec Tcltest] -body {
exec [interpreter] << {
rename exit _exit
proc exit code {
puts "In exit"
_exit $code
}
testsetmainloop
testexitmainloop
testexithandler create 0
testinterpdelete {}
} >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
} -result "Exit MainLoop\neven 0\n"
test Tcl_Main-5.10 {
Tcl_Main: exit main loop in mid-interactive command
} -constraints [list exec Tcltest] -setup {
catch {set f [open "|[interpreter]" w+]}
catch {fconfigure $f -blocking 0}
} -body {
type $f "testsetmainloop
after 2000 testexitmainloop
puts \{1 2"
after 4000
type $f "3 4\}"
set code1 [catch {gets $f} line1]
set code2 [catch {gets $f} line2]
set code3 [catch {gets $f} line3]
list $code1 $line1 $code2 $line2 $code3 $line3
} -cleanup {
close $f
} -result [list 0 {Exit MainLoop} 0 {1 2} 0 {3 4}]
test Tcl_Main-5.11 {
Tcl_Main: EOF in interactive main loop
} -constraints [list exec Tcltest] -body {
exec [interpreter] << {
rename exit _exit
proc exit code {
puts "In exit"
_exit $code
}
testexithandler create 0
after 0 testexitmainloop
testsetmainloop
} >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
} -result "Exit MainLoop\nIn exit\neven 0\n"
test Tcl_Main-5.12 {
Tcl_Main: close stdin in interactive main loop
} -constraints [list exec Tcltest] -body {
exec [interpreter] << {
rename exit _exit
proc exit code {
puts "In exit"
_exit $code
}
testexithandler create 0
after 100 testexitmainloop
testsetmainloop
close stdin
puts "don't reach this"
} >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
} -result "Exit MainLoop\nIn exit\neven 0\n"
# Tests Tcl_Main-6.*: interactive operations with prompts
test Tcl_Main-6.1 {
Tcl_Main: enable prompts with tcl_interactive
} -constraints [list exec] -body {
exec [interpreter] << {set tcl_interactive 1} >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
} -result "1\n% "
test Tcl_Main-6.2 {
Tcl_Main: prompt deletes interp
} -constraints [list exec Tcltest] -body {
exec [interpreter] << {
set tcl_prompt1 {testinterpdelete {}}
set tcl_interactive 1
puts "not reached"
} >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
} -result "1\n"
test Tcl_Main-6.3 {
Tcl_Main: prompt closes stdin
} -constraints [list exec] -body {
exec [interpreter] << {
set tcl_prompt1 {close stdin}
set tcl_interactive 1
puts "not reached"
} >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
} -result "1\n"
test Tcl_Main-6.4 {
Tcl_Main: interactive output, closed stdout
} -constraints [list exec] -body {
exec [interpreter] << {
set tcl_interactive 1
close stdout
set a NO
puts stderr YES
} >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
} -result "1\n% YES\n"
test Tcl_Main-6.5 {
Tcl_Main: interactive entry to main loop
} -constraints [list exec Tcltest] -body {
exec [interpreter] << {
set tcl_interactive 1
testsetmainloop
testexitmainloop} >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
} -result "1\n% % % Exit MainLoop\n"
test Tcl_Main-6.6 {
Tcl_Main: number of prompts during stdin close exit
} -constraints [list exec] -body {
exec [interpreter] << {
set tcl_interactive 1
close stdin} >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
} -result "1\n% "
# Tests Tcl_Main-7.*: exiting
test Tcl_Main-7.1 {
Tcl_Main: [exit] defined as no-op -> still have exithandlers
} -constraints [list exec Tcltest] -body {
exec [interpreter] << {
proc exit args {}
testexithandler create 0
} >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
} -result "even 0\n"
test Tcl_Main-7.2 {
Tcl_Main: [exit] defined as no-op -> still have exithandlers
} -constraints [list exec Tcltest] -body {
exec [interpreter] << {
proc exit args {}
testexithandler create 0
after 0 testexitmainloop
testsetmainloop
} >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
} -result "Exit MainLoop\neven 0\n"
# Tests Tcl_Main-8.*: StdinProc operations
test Tcl_Main-8.1 {
StdinProc: handles non-blocking stdin
} -constraints [list exec Tcltest] -body {
exec [interpreter] << {
testsetmainloop
fconfigure stdin -blocking 0
testexitmainloop
} >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
} -result "Exit MainLoop\n"
test Tcl_Main-8.2 {
StdinProc: handles stdin EOF
} -constraints [list exec Tcltest] -body {
exec [interpreter] << {
testsetmainloop
testexithandler create 0
rename exit _exit
proc exit code {
puts "In exit"
_exit $code
}
after 100 testexitmainloop
} >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
} -result "Exit MainLoop\nIn exit\neven 0\n"
test Tcl_Main-8.3 {
StdinProc: handles interactive stdin EOF
} -constraints [list exec Tcltest] -body {
exec [interpreter] << {
testsetmainloop
testexithandler create 0
rename exit _exit
proc exit code {
puts "In exit"
_exit $code
}
set tcl_interactive 1} >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
} -result "1\n% even 0\n"
test Tcl_Main-8.4 {
StdinProc: handles stdin close
} -constraints [list exec Tcltest] -body {
exec [interpreter] << {
testsetmainloop
rename exit _exit
proc exit code {
puts "In exit"
_exit $code
}
after 100 testexitmainloop
after 0 puts 1
close stdin
} >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
} -result "1\nExit MainLoop\nIn exit\n"
test Tcl_Main-8.5 {
StdinProc: handles interactive stdin close
} -constraints [list exec Tcltest] -body {
exec [interpreter] << {
testsetmainloop
set tcl_interactive 1
rename exit _exit
proc exit code {
puts "In exit"
_exit $code
}
after 100 testexitmainloop
after 0 puts 1
close stdin
} >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
} -result "1\n% % % after#0\n% after#1\n% 1\nExit MainLoop\nIn exit\n"
test Tcl_Main-8.6 {
StdinProc: handles event loop re-entry
} -constraints [list exec Tcltest] -body {
exec [interpreter] << {
testsetmainloop
after 100 {puts 1; set delay 1}
vwait delay
puts 2
testexitmainloop
} >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
} -result "1\n2\nExit MainLoop\n"
test Tcl_Main-8.7 {
StdinProc: handling of errors
} -constraints [list exec Tcltest] -body {
exec [interpreter] << {
testsetmainloop
error foo
testexitmainloop
} >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
} -result "foo\nExit MainLoop\n"
test Tcl_Main-8.8 {
StdinProc: handling of errors, closed stderr
} -constraints [list exec Tcltest] -body {
exec [interpreter] << {
testsetmainloop
close stderr
error foo
testexitmainloop
} >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
} -result "Exit MainLoop\n"
test Tcl_Main-8.9 {
StdinProc: interactive output
} -constraints [list exec Tcltest] -body {
exec [interpreter] << {
testsetmainloop
set tcl_interactive 1
testexitmainloop} >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
} -result "1\n% % Exit MainLoop\n"
test Tcl_Main-8.10 {
StdinProc: interactive output, closed stdout
} -constraints [list exec Tcltest] -body {
exec [interpreter] << {
testsetmainloop
close stdout
set tcl_interactive 1
testexitmainloop
} >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
} -result {}
test Tcl_Main-8.11 {
StdinProc: prompt deletes interp
} -constraints [list exec Tcltest] -body {
exec [interpreter] << {
testsetmainloop
set tcl_prompt1 {testinterpdelete {}}
set tcl_interactive 1} >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
} -result "1\n"
test Tcl_Main-8.12 {
StdinProc: prompt closes stdin
} -constraints [list exec Tcltest] -body {
exec [interpreter] << {
testsetmainloop
set tcl_prompt1 {close stdin}
after 100 testexitmainloop
set tcl_interactive 1
puts "not reached"
} >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
} -result "1\nExit MainLoop\n"
# Tests Tcl_Main-9.*: Prompt operations
test Tcl_Main-9.1 {
Prompt: custom prompt variables
} -constraints [list exec] -body {
exec [interpreter] << {
set tcl_prompt1 {puts -nonewline stdout "one "}
set tcl_prompt2 {puts -nonewline stdout "two "}
set tcl_interactive 1
puts {This is
a test}} >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
} -result "1\none two This is\n\t\ta test\none "
test Tcl_Main-9.2 {
Prompt: error in custom prompt variables
} -constraints [list exec] -body {
exec [interpreter] << {
set tcl_prompt1 {error foo}
set tcl_interactive 1
set errorInfo} >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
} -result "1\nfoo\n% foo\n while executing\n\"error foo\"\n (script\
that generates prompt)\nfoo\n% "
test Tcl_Main-9.3 {
Prompt: error in custom prompt variables, closed stderr
} -constraints [list exec] -body {
exec [interpreter] << {
set tcl_prompt1 {close stderr; error foo}
set tcl_interactive 1} >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
} -result "1\n% "
test Tcl_Main-9.4 {
Prompt: error in custom prompt variables, closed stdout
} -constraints [list exec] -body {
exec [interpreter] << {
set tcl_prompt1 {close stdout; error foo}
set tcl_interactive 1} >& result
set f [open result]
read $f
} -cleanup {
close $f
file delete result
} -result "1\nfoo\n"
cleanupTests
}
namespace delete ::tcl::main::test
|
Changes to tests/namespace.test.
1 2 3 4 5 6 7 8 9 10 11 12 13 | # Functionality covered: this file contains a collection of tests for the # procedures in tclNamesp.c that implement Tcl's basic support for # namespaces. Other namespace-related tests appear in variable.test. # # Sourcing this file into Tcl runs the tests and generates output for # errors. No output means no errors were found. # # Copyright (c) 1997 Sun Microsystems, Inc. # Copyright (c) 1998-2000 by Scriptics Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# Functionality covered: this file contains a collection of tests for the
# procedures in tclNamesp.c that implement Tcl's basic support for
# namespaces. Other namespace-related tests appear in variable.test.
#
# Sourcing this file into Tcl runs the tests and generates output for
# errors. No output means no errors were found.
#
# Copyright (c) 1997 Sun Microsystems, Inc.
# Copyright (c) 1998-2000 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: namespace.test,v 1.17.4.1 2002/02/05 02:22:04 wolfsuit Exp $
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
namespace import -force ::tcltest::*
}
# Clear out any namespaces called test_ns_*
|
| ︙ | ︙ | |||
1132 1133 1134 1135 1136 1137 1138 |
set l [list [namespace eval ns aaa bbb] [namespace eval ns aaa]]
rename unknown {}
rename _unknown unknown
namespace delete ns
set l
} {global global}
| | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 |
set l [list [namespace eval ns aaa bbb] [namespace eval ns aaa]]
rename unknown {}
rename _unknown unknown
namespace delete ns
set l
} {global global}
test namespace-41.1 {Shadowing byte-compiled commands, Bug: 231259} {
set res {}
namespace eval ns {
set res {}
proc test {} {
set ::g 0
}
lappend ::res [test]
proc set {a b} {
::set a [incr b]
}
lappend ::res [test]
}
namespace delete ns
set res
} {0 1}
test namespace-41.2 {Shadowing byte-compiled commands, Bug: 231259} {
set res {}
namespace eval ns {}
proc ns::a {i} {
variable b
proc set args {return "New proc is called"}
return [set b $i]
}
ns::a 1
set res [ns::a 2]
namespace delete ns
set res
} {New proc is called}
test namespace-41.3 {Shadowing byte-compiled commands, Bug: 231259} {knownbug} {
set res {}
namespace eval ns {
variable b 0
}
proc ns::a {i} {
variable b
proc set args {return "New proc is called"}
return [set b $i]
}
set res [list [ns::a 1] $ns::b]
namespace delete ns
set res
} {{New proc is called} 0}
# cleanup
catch {rename cmd1 {}}
catch {unset l}
catch {unset msg}
catch {unset trigger}
eval namespace delete [namespace children :: test_ns_*]
|
| ︙ | ︙ |
Changes to tests/obj.test.
1 2 3 4 5 6 7 8 9 10 11 12 13 | # Functionality covered: this file contains a collection of tests for the # procedures in tclObj.c that implement Tcl's basic type support and the # type managers for the types boolean, double, and integer. # # Sourcing this file into Tcl runs the tests and generates output for # errors. No output means no errors were found. # # Copyright (c) 1995-1996 Sun Microsystems, Inc. # Copyright (c) 1998-1999 by Scriptics Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # | | | > > > > > > > > > > > > > | 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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
# Functionality covered: this file contains a collection of tests for the
# procedures in tclObj.c that implement Tcl's basic type support and the
# type managers for the types boolean, double, and integer.
#
# Sourcing this file into Tcl runs the tests and generates output for
# errors. No output means no errors were found.
#
# Copyright (c) 1995-1996 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: obj.test,v 1.5.18.1 2002/02/05 02:22:04 wolfsuit Exp $
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
namespace import -force ::tcltest::*
}
if {[info commands testobj] == {}} {
puts "This application hasn't been compiled with the \"testobj\""
puts "command, so I can't test the Tcl type and object support."
::tcltest::cleanupTests
return
}
test obj-1.1 {Tcl_AppendAllObjTypes, and InitTypeTable, Tcl_RegisterObjType} {
set r 1
foreach {t} {
{array search}
boolean
bytearray
bytecode
double
end-offset
index
int
list
nsName
procbody
string
} {
set first [string first $t [testobj types]]
set r [expr {$r && ($first != -1)}]
}
set result $r
} {1}
test obj-2.1 {Tcl_GetObjType error} {
|
| ︙ | ︙ | |||
524 525 526 527 528 529 530 |
lappend result [testobj refcount 2]
lappend result [testbooleanobj set 2 0] ;# must copy on write, now 2 objs
lappend result [testobj type 2]
lappend result [testobj refcount 1]
lappend result [testobj refcount 2]
} {{} 1024 1024 int 4 4 0 boolean 3 2}
| > > | > > > > > | | > > | | | | | | > > > > > > > > > > > > > | > > > > > > > > > > | 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 |
lappend result [testobj refcount 2]
lappend result [testbooleanobj set 2 0] ;# must copy on write, now 2 objs
lappend result [testobj type 2]
lappend result [testobj refcount 1]
lappend result [testobj refcount 2]
} {{} 1024 1024 int 4 4 0 boolean 3 2}
test obj-31.1 {regenerate string rep of "end"} {
testobj freeallvars
teststringobj set 1 end
testobj convert 1 end-offset
testobj invalidateStringRep 1
} end
test obj-31.2 {regenerate string rep of "end-1"} {
testobj freeallvars
teststringobj set 1 end-0x1
testobj convert 1 end-offset
testobj invalidateStringRep 1
} end-1
test obj-31.3 {regenerate string rep of "end--1"} {
testobj freeallvars
teststringobj set 1 end--0x1
testobj convert 1 end-offset
testobj invalidateStringRep 1
} end--1
test obj-31.4 {regenerate string rep of "end-bigInteger"} {
testobj freeallvars
teststringobj set 1 end-0x7fffffff
testobj convert 1 end-offset
testobj invalidateStringRep 1
} end-2147483647
test obj-31.5 {regenerate string rep of "end--bigInteger"} {
testobj freeallvars
teststringobj set 1 end--0x7fffffff
testobj convert 1 end-offset
testobj invalidateStringRep 1
} end--2147483647
test obj-31.6 {regenerate string rep of "end--bigInteger"} {nonPortable} {
testobj freeallvars
teststringobj set 1 end--0x80000000
testobj convert 1 end-offset
testobj invalidateStringRep 1
} end--2147483648
testobj freeallvars
# cleanup
::tcltest::cleanupTests
return
|
Changes to tests/parseExpr.test.
1 2 3 4 5 6 7 8 9 10 | # This file contains a collection of tests for the procedures in the # file tclParseExpr.c. Sourcing this file into Tcl runs the tests and # generates output for errors. No output means no errors were found. # # Copyright (c) 1997 Sun Microsystems, Inc. # Copyright (c) 1998-1999 by Scriptics Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # | | > > > > > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | < < < < < < < < < < < < | 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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 |
# This file contains a collection of tests for the procedures in the
# file tclParseExpr.c. Sourcing this file into Tcl runs the tests and
# generates output for errors. No output means no errors were found.
#
# Copyright (c) 1997 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: parseExpr.test,v 1.5.18.1 2002/02/05 02:22:04 wolfsuit Exp $
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
namespace import -force ::tcltest::*
}
# Note that the Tcl expression parser (tclParseExpr.c) does not check
# the semantic validity of the expressions it parses. It does not check,
# for example, that a math function actually exists, or that the operands
# of "<<" are integers.
if {[info commands testexprparser] == {}} {
puts "This application hasn't been compiled with the \"testexprparser\""
puts "command, so I can't test the Tcl expression parser."
::tcltest::cleanupTests
return
}
# Some tests only work if wide integers (>32bit) are not found to be
# integers at all.
set ::tcltest::testConstraints(wideIntegerUnparsed) \
[expr {-1 == 0xffffffff}]
test parseExpr-1.1 {Tcl_ParseExpr procedure, computing string length} {
testexprparser [bytestring "1+2\0 +3"] -1
} {- {} 0 subexpr 1+2 5 operator + 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 {}}
test parseExpr-1.2 {Tcl_ParseExpr procedure, computing string length} {
testexprparser "1 + 2" -1
} {- {} 0 subexpr {1 + 2} 5 operator + 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 {}}
test parseExpr-1.3 {Tcl_ParseExpr procedure, error getting initial lexeme} {wideIntegerUnparsed} {
list [catch {testexprparser {12345678901234567890} -1} msg] $msg
} {1 {integer value too large to represent}}
test parseExpr-1.4 {Tcl_ParseExpr procedure, error in conditional expression} {
list [catch {testexprparser {foo+} -1} msg] $msg
} {1 {syntax error in expression "foo+": variable references require preceding $}}
test parseExpr-1.5 {Tcl_ParseExpr procedure, lexemes after the expression} {
list [catch {testexprparser {1+2 345} -1} msg] $msg
} {1 {syntax error in expression "1+2 345": extra tokens at end of expression}}
test parseExpr-2.1 {ParseCondExpr procedure, valid test subexpr} {
testexprparser {2>3? 1 : 0} -1
} {- {} 0 subexpr {2>3? 1 : 0} 11 operator ? 0 subexpr 2>3 5 operator > 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 subexpr 1 1 text 1 0 subexpr 0 1 text 0 0 {}}
test parseExpr-2.2 {ParseCondExpr procedure, error in test subexpr} {
list [catch {testexprparser {0 || foo} -1} msg] $msg
} {1 {syntax error in expression "0 || foo": variable references require preceding $}}
test parseExpr-2.3 {ParseCondExpr procedure, next lexeme isn't "?"} {
testexprparser {1+2} -1
} {- {} 0 subexpr 1+2 5 operator + 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 {}}
test parseExpr-2.4 {ParseCondExpr procedure, next lexeme is "?"} {
testexprparser {1+2 ? 3 : 4} -1
} {- {} 0 subexpr {1+2 ? 3 : 4} 11 operator ? 0 subexpr 1+2 5 operator + 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 subexpr 4 1 text 4 0 {}}
test parseExpr-2.5 {ParseCondExpr procedure, bad lexeme after "?"} {wideIntegerUnparsed} {
list [catch {testexprparser {1+2 ? 12345678901234567890} -1} msg] $msg
} {1 {integer value too large to represent}}
test parseExpr-2.6 {ParseCondExpr procedure, valid "then" subexpression} {
testexprparser {1? 3 : 4} -1
} {- {} 0 subexpr {1? 3 : 4} 7 operator ? 0 subexpr 1 1 text 1 0 subexpr 3 1 text 3 0 subexpr 4 1 text 4 0 {}}
test parseExpr-2.7 {ParseCondExpr procedure, error in "then" subexpression} {
list [catch {testexprparser {1? fred : martha} -1} msg] $msg
} {1 {syntax error in expression "1? fred : martha": variable references require preceding $}}
test parseExpr-2.8 {ParseCondExpr procedure, lexeme after "then" subexpr isn't ":"} {
list [catch {testexprparser {1? 2 martha 3} -1} msg] $msg
} {1 {syntax error in expression "1? 2 martha 3": missing colon from ternary conditional}}
test parseExpr-2.9 {ParseCondExpr procedure, valid "else" subexpression} {
testexprparser {27||3? 3 : 4&&9} -1
} {- {} 0 subexpr {27||3? 3 : 4&&9} 15 operator ? 0 subexpr 27||3 5 operator || 0 subexpr 27 1 text 27 0 subexpr 3 1 text 3 0 subexpr 3 1 text 3 0 subexpr 4&&9 5 operator && 0 subexpr 4 1 text 4 0 subexpr 9 1 text 9 0 {}}
test parseExpr-2.10 {ParseCondExpr procedure, error in "else" subexpression} {
list [catch {testexprparser {1? 2 : martha} -1} msg] $msg
} {1 {syntax error in expression "1? 2 : martha": variable references require preceding $}}
test parseExpr-3.1 {ParseLorExpr procedure, valid logical and subexpr} {
testexprparser {1&&2 || 3} -1
} {- {} 0 subexpr {1&&2 || 3} 9 operator || 0 subexpr 1&&2 5 operator && 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}}
test parseExpr-3.2 {ParseLorExpr procedure, error in logical and subexpr} {
list [catch {testexprparser {1&&foo || 3} -1} msg] $msg
} {1 {syntax error in expression "1&&foo || 3": variable references require preceding $}}
test parseExpr-3.3 {ParseLorExpr procedure, next lexeme isn't "||"} {
testexprparser {1&&2? 1 : 0} -1
} {- {} 0 subexpr {1&&2? 1 : 0} 11 operator ? 0 subexpr 1&&2 5 operator && 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 1 1 text 1 0 subexpr 0 1 text 0 0 {}}
test parseExpr-3.4 {ParseLorExpr procedure, next lexeme is "||"} {
testexprparser {1&&2 || 3} -1
} {- {} 0 subexpr {1&&2 || 3} 9 operator || 0 subexpr 1&&2 5 operator && 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}}
test parseExpr-3.5 {ParseLorExpr procedure, bad lexeme after "||"} {wideIntegerUnparsed} {
list [catch {testexprparser {1&&2 || 12345678901234567890} -1} msg] $msg
} {1 {integer value too large to represent}}
test parseExpr-3.6 {ParseLorExpr procedure, valid RHS subexpression} {
testexprparser {1&&2 || 3 || 4} -1
} {- {} 0 subexpr {1&&2 || 3 || 4} 13 operator || 0 subexpr {1&&2 || 3} 9 operator || 0 subexpr 1&&2 5 operator && 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 subexpr 4 1 text 4 0 {}}
test parseExpr-3.7 {ParseLorExpr procedure, error in RHS subexpression} {
list [catch {testexprparser {1&&2 || 3 || martha} -1} msg] $msg
} {1 {syntax error in expression "1&&2 || 3 || martha": variable references require preceding $}}
test parseExpr-4.1 {ParseLandExpr procedure, valid LHS "|" subexpr} {
testexprparser {1|2 && 3} -1
} {- {} 0 subexpr {1|2 && 3} 9 operator && 0 subexpr 1|2 5 operator | 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}}
test parseExpr-4.2 {ParseLandExpr procedure, error in LHS "|" subexpr} {
list [catch {testexprparser {1&&foo && 3} -1} msg] $msg
} {1 {syntax error in expression "1&&foo && 3": variable references require preceding $}}
test parseExpr-4.3 {ParseLandExpr procedure, next lexeme isn't "&&"} {
testexprparser {1|2? 1 : 0} -1
} {- {} 0 subexpr {1|2? 1 : 0} 11 operator ? 0 subexpr 1|2 5 operator | 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 1 1 text 1 0 subexpr 0 1 text 0 0 {}}
test parseExpr-4.4 {ParseLandExpr procedure, next lexeme is "&&"} {
testexprparser {1|2 && 3} -1
} {- {} 0 subexpr {1|2 && 3} 9 operator && 0 subexpr 1|2 5 operator | 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}}
test parseExpr-4.5 {ParseLandExpr procedure, bad lexeme after "&&"} {wideIntegerUnparsed} {
list [catch {testexprparser {1|2 && 12345678901234567890} -1} msg] $msg
} {1 {integer value too large to represent}}
test parseExpr-4.6 {ParseLandExpr procedure, valid RHS subexpression} {
testexprparser {1|2 && 3 && 4} -1
} {- {} 0 subexpr {1|2 && 3 && 4} 13 operator && 0 subexpr {1|2 && 3} 9 operator && 0 subexpr 1|2 5 operator | 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 subexpr 4 1 text 4 0 {}}
test parseExpr-4.7 {ParseLandExpr procedure, error in RHS subexpression} {
list [catch {testexprparser {1|2 && 3 && martha} -1} msg] $msg
} {1 {syntax error in expression "1|2 && 3 && martha": variable references require preceding $}}
test parseExpr-5.1 {ParseBitOrExpr procedure, valid LHS "^" subexpr} {
testexprparser {1^2 | 3} -1
} {- {} 0 subexpr {1^2 | 3} 9 operator | 0 subexpr 1^2 5 operator ^ 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}}
test parseExpr-5.2 {ParseBitOrExpr procedure, error in LHS "^" subexpr} {
list [catch {testexprparser {1|foo | 3} -1} msg] $msg
} {1 {syntax error in expression "1|foo | 3": variable references require preceding $}}
test parseExpr-5.3 {ParseBitOrExpr procedure, next lexeme isn't "|"} {
testexprparser {1^2? 1 : 0} -1
} {- {} 0 subexpr {1^2? 1 : 0} 11 operator ? 0 subexpr 1^2 5 operator ^ 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 1 1 text 1 0 subexpr 0 1 text 0 0 {}}
test parseExpr-5.4 {ParseBitOrExpr procedure, next lexeme is "|"} {
testexprparser {1^2 | 3} -1
} {- {} 0 subexpr {1^2 | 3} 9 operator | 0 subexpr 1^2 5 operator ^ 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}}
test parseExpr-5.5 {ParseBitOrExpr procedure, bad lexeme after "|"} {wideIntegerUnparsed} {
list [catch {testexprparser {1^2 | 12345678901234567890} -1} msg] $msg
} {1 {integer value too large to represent}}
test parseExpr-5.6 {ParseBitOrExpr procedure, valid RHS subexpression} {
testexprparser {1^2 | 3 | 4} -1
} {- {} 0 subexpr {1^2 | 3 | 4} 13 operator | 0 subexpr {1^2 | 3} 9 operator | 0 subexpr 1^2 5 operator ^ 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 subexpr 4 1 text 4 0 {}}
test parseExpr-5.7 {ParseBitOrExpr procedure, error in RHS subexpression} {
list [catch {testexprparser {1^2 | 3 | martha} -1} msg] $msg
} {1 {syntax error in expression "1^2 | 3 | martha": variable references require preceding $}}
test parseExpr-6.1 {ParseBitXorExpr procedure, valid LHS "&" subexpr} {
testexprparser {1&2 ^ 3} -1
} {- {} 0 subexpr {1&2 ^ 3} 9 operator ^ 0 subexpr 1&2 5 operator & 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}}
test parseExpr-6.2 {ParseBitXorExpr procedure, error in LHS "&" subexpr} {
list [catch {testexprparser {1^foo ^ 3} -1} msg] $msg
} {1 {syntax error in expression "1^foo ^ 3": variable references require preceding $}}
test parseExpr-6.3 {ParseBitXorExpr procedure, next lexeme isn't "^"} {
testexprparser {1&2? 1 : 0} -1
} {- {} 0 subexpr {1&2? 1 : 0} 11 operator ? 0 subexpr 1&2 5 operator & 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 1 1 text 1 0 subexpr 0 1 text 0 0 {}}
test parseExpr-6.4 {ParseBitXorExpr procedure, next lexeme is "^"} {
testexprparser {1&2 ^ 3} -1
} {- {} 0 subexpr {1&2 ^ 3} 9 operator ^ 0 subexpr 1&2 5 operator & 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}}
test parseExpr-6.5 {ParseBitXorExpr procedure, bad lexeme after "^"} {wideIntegerUnparsed} {
list [catch {testexprparser {1&2 ^ 12345678901234567890} -1} msg] $msg
} {1 {integer value too large to represent}}
test parseExpr-6.6 {ParseBitXorExpr procedure, valid RHS subexpression} {
testexprparser {1&2 ^ 3 ^ 4} -1
} {- {} 0 subexpr {1&2 ^ 3 ^ 4} 13 operator ^ 0 subexpr {1&2 ^ 3} 9 operator ^ 0 subexpr 1&2 5 operator & 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 subexpr 4 1 text 4 0 {}}
test parseExpr-6.7 {ParseBitXorExpr procedure, error in RHS subexpression} {
list [catch {testexprparser {1&2 ^ 3 ^ martha} -1} msg] $msg
} {1 {syntax error in expression "1&2 ^ 3 ^ martha": variable references require preceding $}}
test parseExpr-7.1 {ParseBitAndExpr procedure, valid LHS equality subexpr} {
testexprparser {1==2 & 3} -1
} {- {} 0 subexpr {1==2 & 3} 9 operator & 0 subexpr 1==2 5 operator == 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}}
test parseExpr-7.2 {ParseBitAndExpr procedure, error in LHS equality subexpr} {
list [catch {testexprparser {1!=foo & 3} -1} msg] $msg
} {1 {syntax error in expression "1!=foo & 3": variable references require preceding $}}
test parseExpr-7.3 {ParseBitAndExpr procedure, next lexeme isn't "&"} {
testexprparser {1==2? 1 : 0} -1
} {- {} 0 subexpr {1==2? 1 : 0} 11 operator ? 0 subexpr 1==2 5 operator == 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 1 1 text 1 0 subexpr 0 1 text 0 0 {}}
test parseExpr-7.4 {ParseBitAndExpr procedure, next lexeme is "&"} {
testexprparser {1>2 & 3} -1
} {- {} 0 subexpr {1>2 & 3} 9 operator & 0 subexpr 1>2 5 operator > 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}}
test parseExpr-7.5 {ParseBitAndExpr procedure, bad lexeme after "&"} {wideIntegerUnparsed} {
list [catch {testexprparser {1==2 & 12345678901234567890} -1} msg] $msg
} {1 {integer value too large to represent}}
test parseExpr-7.6 {ParseBitAndExpr procedure, valid RHS subexpression} {
testexprparser {1<2 & 3 & 4} -1
} {- {} 0 subexpr {1<2 & 3 & 4} 13 operator & 0 subexpr {1<2 & 3} 9 operator & 0 subexpr 1<2 5 operator < 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 subexpr 4 1 text 4 0 {}}
test parseExpr-7.7 {ParseBitAndExpr procedure, error in RHS subexpression} {
list [catch {testexprparser {1==2 & 3>2 & martha} -1} msg] $msg
} {1 {syntax error in expression "1==2 & 3>2 & martha": variable references require preceding $}}
test parseExpr-8.1 {ParseEqualityExpr procedure, valid LHS relational subexpr} {
testexprparser {1<2 == 3} -1
} {- {} 0 subexpr {1<2 == 3} 9 operator == 0 subexpr 1<2 5 operator < 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}}
test parseExpr-8.2 {ParseEqualityExpr procedure, error in LHS relational subexpr} {
list [catch {testexprparser {1>=foo == 3} -1} msg] $msg
} {1 {syntax error in expression "1>=foo == 3": variable references require preceding $}}
test parseExpr-8.3 {ParseEqualityExpr procedure, next lexeme isn't "==" or "!="} {
testexprparser {1<2? 1 : 0} -1
} {- {} 0 subexpr {1<2? 1 : 0} 11 operator ? 0 subexpr 1<2 5 operator < 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 1 1 text 1 0 subexpr 0 1 text 0 0 {}}
test parseExpr-8.4 {ParseEqualityExpr procedure, next lexeme is "==" or "!="} {
testexprparser {1<2 == 3} -1
} {- {} 0 subexpr {1<2 == 3} 9 operator == 0 subexpr 1<2 5 operator < 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}}
test parseExpr-8.5 {ParseEqualityExpr procedure, next lexeme is "==" or "!="} {
testexprparser {1<2 != 3} -1
} {- {} 0 subexpr {1<2 != 3} 9 operator != 0 subexpr 1<2 5 operator < 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}}
test parseExpr-8.6 {ParseEqualityExpr procedure, bad lexeme after "==" or "!="} {wideIntegerUnparsed} {
list [catch {testexprparser {1<2 == 12345678901234567890} -1} msg] $msg
} {1 {integer value too large to represent}}
test parseExpr-8.7 {ParseEqualityExpr procedure, valid RHS subexpression} {
testexprparser {1<2 == 3 == 4} -1
} {- {} 0 subexpr {1<2 == 3 == 4} 13 operator == 0 subexpr {1<2 == 3} 9 operator == 0 subexpr 1<2 5 operator < 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 subexpr 4 1 text 4 0 {}}
test parseExpr-8.8 {ParseEqualityExpr procedure, error in RHS subexpression} {
list [catch {testexprparser {1<2 == 3 != martha} -1} msg] $msg
} {1 {syntax error in expression "1<2 == 3 != martha": variable references require preceding $}}
test parseExpr-9.1 {ParseRelationalExpr procedure, valid LHS shift subexpr} {
testexprparser {1<<2 < 3} -1
} {- {} 0 subexpr {1<<2 < 3} 9 operator < 0 subexpr 1<<2 5 operator << 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}}
test parseExpr-9.2 {ParseRelationalExpr procedure, error in LHS shift subexpr} {
list [catch {testexprparser {1>=foo < 3} -1} msg] $msg
} {1 {syntax error in expression "1>=foo < 3": variable references require preceding $}}
test parseExpr-9.3 {ParseRelationalExpr procedure, next lexeme isn't relational op} {
testexprparser {1<<2? 1 : 0} -1
} {- {} 0 subexpr {1<<2? 1 : 0} 11 operator ? 0 subexpr 1<<2 5 operator << 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 1 1 text 1 0 subexpr 0 1 text 0 0 {}}
test parseExpr-9.4 {ParseRelationalExpr procedure, next lexeme is relational op} {
testexprparser {1<<2 < 3} -1
} {- {} 0 subexpr {1<<2 < 3} 9 operator < 0 subexpr 1<<2 5 operator << 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}}
test parseExpr-9.5 {ParseRelationalExpr procedure, next lexeme is relational op} {
testexprparser {1>>2 > 3} -1
} {- {} 0 subexpr {1>>2 > 3} 9 operator > 0 subexpr 1>>2 5 operator >> 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}}
test parseExpr-9.6 {ParseRelationalExpr procedure, next lexeme is relational op} {
testexprparser {1<<2 <= 3} -1
} {- {} 0 subexpr {1<<2 <= 3} 9 operator <= 0 subexpr 1<<2 5 operator << 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}}
test parseExpr-9.7 {ParseRelationalExpr procedure, next lexeme is relational op} {
testexprparser {1<<2 >= 3} -1
} {- {} 0 subexpr {1<<2 >= 3} 9 operator >= 0 subexpr 1<<2 5 operator << 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}}
test parseExpr-9.8 {ParseRelationalExpr procedure, bad lexeme after relational op} {wideIntegerUnparsed} {
list [catch {testexprparser {1<<2 < 12345678901234567890} -1} msg] $msg
} {1 {integer value too large to represent}}
test parseExpr-9.9 {ParseRelationalExpr procedure, valid RHS subexpression} {
testexprparser {1<<2 < 3 < 4} -1
} {- {} 0 subexpr {1<<2 < 3 < 4} 13 operator < 0 subexpr {1<<2 < 3} 9 operator < 0 subexpr 1<<2 5 operator << 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 subexpr 4 1 text 4 0 {}}
test parseExpr-9.10 {ParseRelationalExpr procedure, error in RHS subexpression} {
list [catch {testexprparser {1<<2 < 3 > martha} -1} msg] $msg
} {1 {syntax error in expression "1<<2 < 3 > martha": variable references require preceding $}}
test parseExpr-10.1 {ParseShiftExpr procedure, valid LHS add subexpr} {
testexprparser {1+2 << 3} -1
} {- {} 0 subexpr {1+2 << 3} 9 operator << 0 subexpr 1+2 5 operator + 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}}
test parseExpr-10.2 {ParseShiftExpr procedure, error in LHS add subexpr} {
list [catch {testexprparser {1-foo << 3} -1} msg] $msg
} {1 {syntax error in expression "1-foo << 3": variable references require preceding $}}
test parseExpr-10.3 {ParseShiftExpr procedure, next lexeme isn't "<<" or ">>"} {
testexprparser {1+2? 1 : 0} -1
} {- {} 0 subexpr {1+2? 1 : 0} 11 operator ? 0 subexpr 1+2 5 operator + 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 1 1 text 1 0 subexpr 0 1 text 0 0 {}}
test parseExpr-10.4 {ParseShiftExpr procedure, next lexeme is "<<" or ">>"} {
testexprparser {1+2 << 3} -1
} {- {} 0 subexpr {1+2 << 3} 9 operator << 0 subexpr 1+2 5 operator + 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}}
test parseExpr-10.5 {ParseShiftExpr procedure, next lexeme is "<<" or ">>"} {
testexprparser {1+2 >> 3} -1
} {- {} 0 subexpr {1+2 >> 3} 9 operator >> 0 subexpr 1+2 5 operator + 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}}
test parseExpr-10.6 {ParseShiftExpr procedure, bad lexeme after "<<" or ">>"} {wideIntegerUnparsed} {
list [catch {testexprparser {1+2 << 12345678901234567890} -1} msg] $msg
} {1 {integer value too large to represent}}
test parseExpr-10.7 {ParseShiftExpr procedure, valid RHS subexpression} {
testexprparser {1+2 << 3 << 4} -1
} {- {} 0 subexpr {1+2 << 3 << 4} 13 operator << 0 subexpr {1+2 << 3} 9 operator << 0 subexpr 1+2 5 operator + 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 subexpr 4 1 text 4 0 {}}
test parseExpr-10.8 {ParseShiftExpr procedure, error in RHS subexpression} {
list [catch {testexprparser {1+2 << 3 >> martha} -1} msg] $msg
} {1 {syntax error in expression "1+2 << 3 >> martha": variable references require preceding $}}
test parseExpr-11.1 {ParseAddExpr procedure, valid LHS multiply subexpr} {
testexprparser {1*2 + 3} -1
} {- {} 0 subexpr {1*2 + 3} 9 operator + 0 subexpr 1*2 5 operator * 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}}
test parseExpr-11.2 {ParseAddExpr procedure, error in LHS multiply subexpr} {
list [catch {testexprparser {1/foo + 3} -1} msg] $msg
} {1 {syntax error in expression "1/foo + 3": variable references require preceding $}}
test parseExpr-11.3 {ParseAddExpr procedure, next lexeme isn't "+" or "-"} {
testexprparser {1*2? 1 : 0} -1
} {- {} 0 subexpr {1*2? 1 : 0} 11 operator ? 0 subexpr 1*2 5 operator * 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 1 1 text 1 0 subexpr 0 1 text 0 0 {}}
test parseExpr-11.4 {ParseAddExpr procedure, next lexeme is "+" or "-"} {
testexprparser {1*2 + 3} -1
} {- {} 0 subexpr {1*2 + 3} 9 operator + 0 subexpr 1*2 5 operator * 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}}
test parseExpr-11.5 {ParseAddExpr procedure, next lexeme is "+" or "-"} {
testexprparser {1*2 - 3} -1
} {- {} 0 subexpr {1*2 - 3} 9 operator - 0 subexpr 1*2 5 operator * 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}}
test parseExpr-11.6 {ParseAddExpr procedure, bad lexeme after "+" or "-"} {wideIntegerUnparsed} {
list [catch {testexprparser {1*2 + 12345678901234567890} -1} msg] $msg
} {1 {integer value too large to represent}}
test parseExpr-11.7 {ParseAddExpr procedure, valid RHS subexpression} {
testexprparser {1*2 + 3 + 4} -1
} {- {} 0 subexpr {1*2 + 3 + 4} 13 operator + 0 subexpr {1*2 + 3} 9 operator + 0 subexpr 1*2 5 operator * 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 subexpr 4 1 text 4 0 {}}
test parseExpr-11.8 {ParseAddExpr procedure, error in RHS subexpression} {
list [catch {testexprparser {1*2 + 3 - martha} -1} msg] $msg
} {1 {syntax error in expression "1*2 + 3 - martha": variable references require preceding $}}
test parseExpr-12.1 {ParseAddExpr procedure, valid LHS multiply subexpr} {
testexprparser {1*2 + 3} -1
} {- {} 0 subexpr {1*2 + 3} 9 operator + 0 subexpr 1*2 5 operator * 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}}
test parseExpr-12.2 {ParseAddExpr procedure, error in LHS multiply subexpr} {
list [catch {testexprparser {1/foo + 3} -1} msg] $msg
} {1 {syntax error in expression "1/foo + 3": variable references require preceding $}}
test parseExpr-12.3 {ParseAddExpr procedure, next lexeme isn't "+" or "-"} {
testexprparser {1*2? 1 : 0} -1
} {- {} 0 subexpr {1*2? 1 : 0} 11 operator ? 0 subexpr 1*2 5 operator * 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 1 1 text 1 0 subexpr 0 1 text 0 0 {}}
test parseExpr-12.4 {ParseAddExpr procedure, next lexeme is "+" or "-"} {
testexprparser {1*2 + 3} -1
} {- {} 0 subexpr {1*2 + 3} 9 operator + 0 subexpr 1*2 5 operator * 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}}
test parseExpr-12.5 {ParseAddExpr procedure, next lexeme is "+" or "-"} {
testexprparser {1*2 - 3} -1
} {- {} 0 subexpr {1*2 - 3} 9 operator - 0 subexpr 1*2 5 operator * 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}}
test parseExpr-12.6 {ParseAddExpr procedure, bad lexeme after "+" or "-"} {wideIntegerUnparsed} {
list [catch {testexprparser {1*2 + 12345678901234567890} -1} msg] $msg
} {1 {integer value too large to represent}}
test parseExpr-12.7 {ParseAddExpr procedure, valid RHS subexpression} {
testexprparser {1*2 + 3 + 4} -1
} {- {} 0 subexpr {1*2 + 3 + 4} 13 operator + 0 subexpr {1*2 + 3} 9 operator + 0 subexpr 1*2 5 operator * 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 subexpr 4 1 text 4 0 {}}
test parseExpr-12.8 {ParseAddExpr procedure, error in RHS subexpression} {
list [catch {testexprparser {1*2 + 3 - martha} -1} msg] $msg
} {1 {syntax error in expression "1*2 + 3 - martha": variable references require preceding $}}
test parseExpr-13.1 {ParseMultiplyExpr procedure, valid LHS unary subexpr} {
testexprparser {+2 * 3} -1
} {- {} 0 subexpr {+2 * 3} 7 operator * 0 subexpr +2 3 operator + 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}}
test parseExpr-13.2 {ParseMultiplyExpr procedure, error in LHS unary subexpr} {wideIntegerUnparsed} {
list [catch {testexprparser {-12345678901234567890 * 3} -1} msg] $msg
} {1 {integer value too large to represent}}
test parseExpr-13.3 {ParseMultiplyExpr procedure, next lexeme isn't "*", "/", or "%"} {
testexprparser {+2? 1 : 0} -1
} {- {} 0 subexpr {+2? 1 : 0} 9 operator ? 0 subexpr +2 3 operator + 0 subexpr 2 1 text 2 0 subexpr 1 1 text 1 0 subexpr 0 1 text 0 0 {}}
test parseExpr-13.4 {ParseMultiplyExpr procedure, next lexeme is "*", "/", or "%"} {
testexprparser {-123 * 3} -1
} {- {} 0 subexpr {-123 * 3} 7 operator * 0 subexpr -123 3 operator - 0 subexpr 123 1 text 123 0 subexpr 3 1 text 3 0 {}}
test parseExpr-13.5 {ParseMultiplyExpr procedure, next lexeme is "*", "/", or "%"} {
testexprparser {+-456 / 3} -1
} {- {} 0 subexpr {+-456 / 3} 9 operator / 0 subexpr +-456 5 operator + 0 subexpr -456 3 operator - 0 subexpr 456 1 text 456 0 subexpr 3 1 text 3 0 {}}
test parseExpr-13.6 {ParseMultiplyExpr procedure, next lexeme is "*", "/", or "%"} {
testexprparser {+-456 % 3} -1
} {- {} 0 subexpr {+-456 % 3} 9 operator % 0 subexpr +-456 5 operator + 0 subexpr -456 3 operator - 0 subexpr 456 1 text 456 0 subexpr 3 1 text 3 0 {}}
test parseExpr-13.7 {ParseMultiplyExpr procedure, bad lexeme after "*", "/", or "%"} {wideIntegerUnparsed} {
list [catch {testexprparser {--++5 / 12345678901234567890} -1} msg] $msg
} {1 {integer value too large to represent}}
test parseExpr-13.8 {ParseMultiplyExpr procedure, valid RHS subexpression} {
testexprparser {-2 / 3 % 4} -1
} {- {} 0 subexpr {-2 / 3 % 4} 11 operator % 0 subexpr {-2 / 3} 7 operator / 0 subexpr -2 3 operator - 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 subexpr 4 1 text 4 0 {}}
test parseExpr-13.9 {ParseMultiplyExpr procedure, error in RHS subexpression} {
list [catch {testexprparser {++2 / 3 * martha} -1} msg] $msg
} {1 {syntax error in expression "++2 / 3 * martha": variable references require preceding $}}
test parseExpr-14.1 {ParseUnaryExpr procedure, first token is unary operator} {
testexprparser {+2} -1
} {- {} 0 subexpr +2 3 operator + 0 subexpr 2 1 text 2 0 {}}
test parseExpr-14.2 {ParseUnaryExpr procedure, first token is unary operator} {
testexprparser {-2} -1
} {- {} 0 subexpr -2 3 operator - 0 subexpr 2 1 text 2 0 {}}
test parseExpr-14.3 {ParseUnaryExpr procedure, first token is unary operator} {
testexprparser {~2} -1
} {- {} 0 subexpr ~2 3 operator ~ 0 subexpr 2 1 text 2 0 {}}
test parseExpr-14.4 {ParseUnaryExpr procedure, first token is unary operator} {
testexprparser {!2} -1
} {- {} 0 subexpr !2 3 operator ! 0 subexpr 2 1 text 2 0 {}}
test parseExpr-14.5 {ParseUnaryExpr procedure, error in lexeme after unary op} {wideIntegerUnparsed} {
list [catch {testexprparser {-12345678901234567890} -1} msg] $msg
} {1 {integer value too large to represent}}
test parseExpr-14.6 {ParseUnaryExpr procedure, simple unary expr after unary op} {
testexprparser {+"1234"} -1
} {- {} 0 subexpr +\"1234\" 3 operator + 0 subexpr {"1234"} 1 text 1234 0 {}}
test parseExpr-14.7 {ParseUnaryExpr procedure, another unary expr after unary op} {
testexprparser {~!{fred}} -1
} {- {} 0 subexpr ~!{fred} 5 operator ~ 0 subexpr !{fred} 3 operator ! 0 subexpr {{fred}} 1 text fred 0 {}}
test parseExpr-14.8 {ParseUnaryExpr procedure, error in unary expr after unary op} {
list [catch {testexprparser {+-||27} -1} msg] $msg
} {1 {syntax error in expression "+-||27": unexpected operator ||}}
test parseExpr-14.9 {ParseUnaryExpr procedure, error in unary expr after unary op} {
list [catch {testexprparser {+-||27} -1} msg] $msg
} {1 {syntax error in expression "+-||27": unexpected operator ||}}
test parseExpr-14.10 {ParseUnaryExpr procedure, first token is not unary op} {
testexprparser {123} -1
} {- {} 0 subexpr 123 1 text 123 0 {}}
test parseExpr-14.11 {ParseUnaryExpr procedure, not unary expr, complex primary expr} {
testexprparser {(1+2)} -1
} {- {} 0 subexpr 1+2 5 operator + 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 {}}
test parseExpr-14.12 {ParseUnaryExpr procedure, not unary expr, error in primary expr} {wideIntegerUnparsed} {
list [catch {testexprparser {(12345678901234567890)} -1} msg] $msg
} {1 {integer value too large to represent}}
test parseExpr-15.1 {ParsePrimaryExpr procedure, just parenthesized subexpr} {
testexprparser {({abc}/{def})} -1
} {- {} 0 subexpr {{abc}/{def}} 5 operator / 0 subexpr {{abc}} 1 text abc 0 subexpr {{def}} 1 text def 0 {}}
test parseExpr-15.2 {ParsePrimaryExpr procedure, bad lexeme after "("} {wideIntegerUnparsed} {
list [catch {testexprparser {(12345678901234567890)} -1} msg] $msg
} {1 {integer value too large to represent}}
test parseExpr-15.3 {ParsePrimaryExpr procedure, valid parenthesized subexpr} {
testexprparser {({abc}? 2*4 : -6)} -1
} {- {} 0 subexpr {{abc}? 2*4 : -6} 13 operator ? 0 subexpr {{abc}} 1 text abc 0 subexpr 2*4 5 operator * 0 subexpr 2 1 text 2 0 subexpr 4 1 text 4 0 subexpr -6 3 operator - 0 subexpr 6 1 text 6 0 {}}
test parseExpr-15.4 {ParsePrimaryExpr procedure, error in parenthesized subexpr} {
list [catch {testexprparser {(? 123 : 456)} -1} msg] $msg
} {1 {syntax error in expression "(? 123 : 456)": unexpected ternary 'then' separator}}
test parseExpr-15.5 {ParsePrimaryExpr procedure, missing ")" after in parenthesized subexpr} {
list [catch {testexprparser {({abc}/{def}} -1} msg] $msg
} {1 {syntax error in expression "({abc}/{def}": looking for close parenthesis}}
test parseExpr-15.6 {ParsePrimaryExpr procedure, primary is literal} {
testexprparser {12345} -1
} {- {} 0 subexpr 12345 1 text 12345 0 {}}
test parseExpr-15.7 {ParsePrimaryExpr procedure, primary is literal} {
testexprparser {12345.6789} -1
} {- {} 0 subexpr 12345.6789 1 text 12345.6789 0 {}}
test parseExpr-15.8 {ParsePrimaryExpr procedure, primary is var reference} {
testexprparser {$a} -1
} {- {} 0 subexpr {$a} 2 variable {$a} 1 text a 0 {}}
test parseExpr-15.9 {ParsePrimaryExpr procedure, primary is var reference} {
testexprparser {$a(hello$there)} -1
} {- {} 0 subexpr {$a(hello$there)} 5 variable {$a(hello$there)} 4 text a 0 text hello 0 variable {$there} 1 text there 0 {}}
test parseExpr-15.10 {ParsePrimaryExpr procedure, primary is var reference} {
testexprparser {$a()} -1
} {- {} 0 subexpr {$a()} 3 variable {$a()} 2 text a 0 text {} 0 {}}
test parseExpr-15.11 {ParsePrimaryExpr procedure, error in var reference} {
list [catch {testexprparser {$a(} -1} msg] $msg
} {1 {missing )}}
test parseExpr-15.12 {ParsePrimaryExpr procedure, primary is quoted string} {
testexprparser {"abc $xyz def"} -1
} {- {} 0 subexpr {"abc $xyz def"} 5 word {"abc $xyz def"} 4 text {abc } 0 variable {$xyz} 1 text xyz 0 text { def} 0 {}}
test parseExpr-15.13 {ParsePrimaryExpr procedure, error in quoted string} {
list [catch {testexprparser {"$a(12"} -1} msg] $msg
} {1 {missing )}}
test parseExpr-15.14 {ParsePrimaryExpr procedure, quoted string has multiple tokens} {
testexprparser {"abc [xyz] $def"} -1
} {- {} 0 subexpr {"abc [xyz] $def"} 6 word {"abc [xyz] $def"} 5 text {abc } 0 command {[xyz]} 0 text { } 0 variable {$def} 1 text def 0 {}}
test parseExpr-15.15 {ParsePrimaryExpr procedure, primary is command} {
testexprparser {[def]} -1
} {- {} 0 subexpr {[def]} 1 command {[def]} 0 {}}
test parseExpr-15.16 {ParsePrimaryExpr procedure, primary is multiple commands} {
testexprparser {[one; two; three; four;]} -1
} {- {} 0 subexpr {[one; two; three; four;]} 1 command {[one; two; three; four;]} 0 {}}
test parseExpr-15.17 {ParsePrimaryExpr procedure, primary is multiple commands} {
testexprparser {[one; two; three; four;]} -1
} {- {} 0 subexpr {[one; two; three; four;]} 1 command {[one; two; three; four;]} 0 {}}
test parseExpr-15.18 {ParsePrimaryExpr procedure, missing close bracket} {
list [catch {testexprparser {[one} -1} msg] $msg
} {1 {missing close-bracket}}
test parseExpr-15.19 {ParsePrimaryExpr procedure, primary is braced string} {
testexprparser {{hello world}} -1
} {- {} 0 subexpr {{hello world}} 1 text {hello world} 0 {}}
test parseExpr-15.20 {ParsePrimaryExpr procedure, error in primary, which is braced string} {
list [catch {testexprparser "\{abc\\\n" -1} msg] $msg
} {1 {missing close-brace}}
test parseExpr-15.21 {ParsePrimaryExpr procedure, primary is braced string with multiple tokens} {
testexprparser "\{ \\
+123 \}" -1
} {- {} 0 subexpr \{\ \ \\\n\ +123\ \} 4 word \{\ \ \\\n\ +123\ \} 3 text { } 0 backslash \\\n\ 0 text {+123 } 0 {}}
test parseExpr-15.22 {ParsePrimaryExpr procedure, primary is function call} {
testexprparser {foo(123)} -1
} {- {} 0 subexpr foo(123) 3 operator foo 0 subexpr 123 1 text 123 0 {}}
test parseExpr-15.23 {ParsePrimaryExpr procedure, bad lexeme after function name} {wideIntegerUnparsed} {
list [catch {testexprparser {foo 12345678901234567890 123)} -1} msg] $msg
} {1 {integer value too large to represent}}
test parseExpr-15.24 {ParsePrimaryExpr procedure, lexeme after function name isn't "("} {
list [catch {testexprparser {foo 27.4 123)} -1} msg] $msg
} {1 {syntax error in expression "foo 27.4 123)": variable references require preceding $}}
test parseExpr-15.25 {ParsePrimaryExpr procedure, bad lexeme after "("} {wideIntegerUnparsed} {
list [catch {testexprparser {foo(12345678901234567890)} -1} msg] $msg
} {1 {integer value too large to represent}}
test parseExpr-15.26 {ParsePrimaryExpr procedure, function call, one arg} {
testexprparser {foo(27*4)} -1
} {- {} 0 subexpr foo(27*4) 7 operator foo 0 subexpr 27*4 5 operator * 0 subexpr 27 1 text 27 0 subexpr 4 1 text 4 0 {}}
test parseExpr-15.27 {ParsePrimaryExpr procedure, error in function arg} {
list [catch {testexprparser {foo(*1-2)} -1} msg] $msg
} {1 {syntax error in expression "foo(*1-2)": unexpected operator *}}
test parseExpr-15.28 {ParsePrimaryExpr procedure, error in function arg} {
list [catch {testexprparser {foo(*1-2)} -1} msg] $msg
} {1 {syntax error in expression "foo(*1-2)": unexpected operator *}}
test parseExpr-15.29 {ParsePrimaryExpr procedure, function call, comma after arg} {
testexprparser {foo(27-2, (-2*[foo]))} -1
} {- {} 0 subexpr {foo(27-2, (-2*[foo]))} 15 operator foo 0 subexpr 27-2 5 operator - 0 subexpr 27 1 text 27 0 subexpr 2 1 text 2 0 subexpr {-2*[foo]} 7 operator * 0 subexpr -2 3 operator - 0 subexpr 2 1 text 2 0 subexpr {[foo]} 1 command {[foo]} 0 {}}
test parseExpr-15.30 {ParsePrimaryExpr procedure, bad lexeme after comma} {wideIntegerUnparsed} {
list [catch {testexprparser {foo(123, 12345678901234567890)} -1} msg] $msg
} {1 {integer value too large to represent}}
test parseExpr-15.31 {ParsePrimaryExpr procedure, lexeme not "," or ")" after arg} {
list [catch {testexprparser {foo(123 [foo])} -1} msg] $msg
} {1 {syntax error in expression "foo(123 [foo])": missing close parenthesis at end of function call}}
test parseExpr-15.32 {ParsePrimaryExpr procedure, bad lexeme after primary} {wideIntegerUnparsed} {
list [catch {testexprparser {123 12345678901234567890} -1} msg] $msg
} {1 {integer value too large to represent}}
test parseExpr-15.33 {ParsePrimaryExpr procedure, comma-specific message} {
list [catch {testexprparser {123+,456} -1} msg] $msg
} {1 {syntax error in expression "123+,456": commas can only separate function arguments}}
test parseExpr-15.34 {ParsePrimaryExpr procedure, single equal-specific message} {
list [catch {testexprparser {123+=456} -1} msg] $msg
} {1 {syntax error in expression "123+=456": single equality character not legal in expressions}}
test parseExpr-15.35 {ParsePrimaryExpr procedure, error in parenthesized subexpr} {
list [catch {testexprparser {(: 123 : 456)} -1} msg] $msg
} {1 {syntax error in expression "(: 123 : 456)": unexpected ternary 'else' separator}}
test parseExpr-16.1 {GetLexeme procedure, whitespace before lexeme} {
testexprparser { 123} -1
} {- {} 0 subexpr 123 1 text 123 0 {}}
test parseExpr-16.2 {GetLexeme procedure, whitespace before lexeme} {
testexprparser { \
456} -1
} {- {} 0 subexpr 456 1 text 456 0 {}}
test parseExpr-16.3 {GetLexeme procedure, no lexeme after whitespace} {
testexprparser { 123 \
} -1
} {- {} 0 subexpr 123 1 text 123 0 {}}
test parseExpr-16.4 {GetLexeme procedure, integer lexeme} {
testexprparser {000} -1
} {- {} 0 subexpr 000 1 text 000 0 {}}
test parseExpr-16.5 {GetLexeme procedure, integer lexeme too big} {wideIntegerUnparsed} {
list [catch {testexprparser {12345678901234567890} -1} msg] $msg
} {1 {integer value too large to represent}}
test parseExpr-16.6 {GetLexeme procedure, bad integer lexeme} {
list [catch {testexprparser {0999} -1} msg] $msg
} {1 {"0999" is an invalid octal number}}
test parseExpr-16.7 {GetLexeme procedure, double lexeme} {
testexprparser {0.999} -1
} {- {} 0 subexpr 0.999 1 text 0.999 0 {}}
test parseExpr-16.8 {GetLexeme procedure, double lexeme} {
testexprparser {.123} -1
} {- {} 0 subexpr .123 1 text .123 0 {}}
test parseExpr-16.9 {GetLexeme procedure, double lexeme} {nonPortable unixOnly} {
testexprparser {nan} -1
} {- {} 0 subexpr nan 1 text nan 0 {}}
test parseExpr-16.10 {GetLexeme procedure, double lexeme} {nonPortable unixOnly} {
testexprparser {NaN} -1
} {- {} 0 subexpr NaN 1 text NaN 0 {}}
test parseExpr-16.11 {GetLexeme procedure, bad double lexeme too big} {
list [catch {testexprparser {123.e+99999999999999} -1} msg] $msg
} {1 {floating-point value too large to represent}}
test parseExpr-16.12 {GetLexeme procedure, bad double lexeme} {
list [catch {testexprparser {123.4x56} -1} msg] $msg
} {1 {syntax error in expression "123.4x56": extra tokens at end of expression}}
test parseExpr-16.13 {GetLexeme procedure, lexeme is "["} {
testexprparser {[foo]} -1
} {- {} 0 subexpr {[foo]} 1 command {[foo]} 0 {}}
test parseExpr-16.14 {GetLexeme procedure, lexeme is open brace} {
testexprparser {{bar}} -1
} {- {} 0 subexpr {{bar}} 1 text bar 0 {}}
test parseExpr-16.15 {GetLexeme procedure, lexeme is "("} {
testexprparser {(123)} -1
} {- {} 0 subexpr 123 1 text 123 0 {}}
test parseExpr-16.16 {GetLexeme procedure, lexeme is ")"} {
testexprparser {(2*3)} -1
} {- {} 0 subexpr 2*3 5 operator * 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}}
test parseExpr-16.17 {GetLexeme procedure, lexeme is "$"} {
testexprparser {$wombat} -1
} {- {} 0 subexpr {$wombat} 2 variable {$wombat} 1 text wombat 0 {}}
test parseExpr-16.18 "GetLexeme procedure, lexeme is '\"'" {
testexprparser {"fred"} -1
} {- {} 0 subexpr {"fred"} 1 text fred 0 {}}
test parseExpr-16.19 {GetLexeme procedure, lexeme is ","} {
testexprparser {foo(1,2)} -1
} {- {} 0 subexpr foo(1,2) 5 operator foo 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 {}}
test parseExpr-16.20 {GetLexeme procedure, lexeme is "*"} {
testexprparser {$a*$b} -1
} {- {} 0 subexpr {$a*$b} 7 operator * 0 subexpr {$a} 2 variable {$a} 1 text a 0 subexpr {$b} 2 variable {$b} 1 text b 0 {}}
test parseExpr-16.21 {GetLexeme procedure, lexeme is "/"} {
testexprparser {5/6} -1
} {- {} 0 subexpr 5/6 5 operator / 0 subexpr 5 1 text 5 0 subexpr 6 1 text 6 0 {}}
test parseExpr-16.22 {GetLexeme procedure, lexeme is "%"} {
testexprparser {5%[xxx]} -1
} {- {} 0 subexpr {5%[xxx]} 5 operator % 0 subexpr 5 1 text 5 0 subexpr {[xxx]} 1 command {[xxx]} 0 {}}
test parseExpr-16.23 {GetLexeme procedure, lexeme is "+"} {
testexprparser {1+2} -1
} {- {} 0 subexpr 1+2 5 operator + 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 {}}
test parseExpr-16.24 {GetLexeme procedure, lexeme is "-"} {
testexprparser {.12-0e27} -1
} {- {} 0 subexpr .12-0e27 5 operator - 0 subexpr .12 1 text .12 0 subexpr 0e27 1 text 0e27 0 {}}
test parseExpr-16.25 {GetLexeme procedure, lexeme is "?" or ":"} {
testexprparser {$b? 1 : 0} -1
} {- {} 0 subexpr {$b? 1 : 0} 8 operator ? 0 subexpr {$b} 2 variable {$b} 1 text b 0 subexpr 1 1 text 1 0 subexpr 0 1 text 0 0 {}}
test parseExpr-16.26 {GetLexeme procedure, lexeme is "<"} {
testexprparser {2<3} -1
} {- {} 0 subexpr 2<3 5 operator < 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}}
test parseExpr-16.27 {GetLexeme procedure, lexeme is "<<"} {
testexprparser {2<<3} -1
} {- {} 0 subexpr 2<<3 5 operator << 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}}
test parseExpr-16.28 {GetLexeme procedure, lexeme is "<="} {
testexprparser {2<=3} -1
} {- {} 0 subexpr 2<=3 5 operator <= 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}}
test parseExpr-16.29 {GetLexeme procedure, lexeme is ">"} {
testexprparser {2>3} -1
} {- {} 0 subexpr 2>3 5 operator > 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}}
test parseExpr-16.30 {GetLexeme procedure, lexeme is ">>"} {
testexprparser {2>>3} -1
} {- {} 0 subexpr 2>>3 5 operator >> 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}}
test parseExpr-16.31 {GetLexeme procedure, lexeme is ">="} {
testexprparser {2>=3} -1
} {- {} 0 subexpr 2>=3 5 operator >= 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}}
test parseExpr-16.32 {GetLexeme procedure, lexeme is "=="} {
testexprparser {2==3} -1
} {- {} 0 subexpr 2==3 5 operator == 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}}
test parseExpr-16.33 {GetLexeme procedure, bad lexeme starting with "="} {
list [catch {testexprparser {2=+3} -1} msg] $msg
} {1 {syntax error in expression "2=+3": extra tokens at end of expression}}
test parseExpr-16.34 {GetLexeme procedure, lexeme is "!="} {
testexprparser {2!=3} -1
} {- {} 0 subexpr 2!=3 5 operator != 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}}
test parseExpr-16.35 {GetLexeme procedure, lexeme is "!"} {
testexprparser {!2} -1
} {- {} 0 subexpr !2 3 operator ! 0 subexpr 2 1 text 2 0 {}}
test parseExpr-16.36 {GetLexeme procedure, lexeme is "&&"} {
testexprparser {2&&3} -1
} {- {} 0 subexpr 2&&3 5 operator && 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}}
test parseExpr-16.37 {GetLexeme procedure, lexeme is "&"} {
testexprparser {1&2} -1
} {- {} 0 subexpr 1&2 5 operator & 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 {}}
test parseExpr-16.38 {GetLexeme procedure, lexeme is "^"} {
testexprparser {1^2} -1
} {- {} 0 subexpr 1^2 5 operator ^ 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 {}}
test parseExpr-16.39 {GetLexeme procedure, lexeme is "||"} {
testexprparser {2||3} -1
} {- {} 0 subexpr 2||3 5 operator || 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}}
test parseExpr-16.40 {GetLexeme procedure, lexeme is "|"} {
testexprparser {1|2} -1
} {- {} 0 subexpr 1|2 5 operator | 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 {}}
test parseExpr-16.41 {GetLexeme procedure, lexeme is "~"} {
testexprparser {~2} -1
} {- {} 0 subexpr ~2 3 operator ~ 0 subexpr 2 1 text 2 0 {}}
test parseExpr-16.42 {GetLexeme procedure, lexeme is func name} {
testexprparser {george()} -1
} {- {} 0 subexpr george() 1 operator george 0 {}}
test parseExpr-16.43 {GetLexeme procedure, lexeme is func name} {
testexprparser {harmonic_ratio(2,3)} -1
} {- {} 0 subexpr harmonic_ratio(2,3) 5 operator harmonic_ratio 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}}
test parseExpr-16.44 {GetLexeme procedure, unknown lexeme} {
list [catch {testexprparser {@27} -1} msg] $msg
} {1 {syntax error in expression "@27": character not legal in expressions}}
test parseExpr-17.1 {PrependSubExprTokens procedure, expand token array} {
testexprparser {[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]} -1
} {- {} 0 subexpr {[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]} 13 operator && 0 subexpr {[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]} 9 operator && 0 subexpr {[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]} 5 operator && 0 subexpr {[string compare [format %c $i] [string index $a $i]]} 1 command {[string compare [format %c $i] [string index $a $i]]} 0 subexpr {[string compare [format %c $i] [string index $a $i]]} 1 command {[string compare [format %c $i] [string index $a $i]]} 0 subexpr {[string compare [format %c $i] [string index $a $i]]} 1 command {[string compare [format %c $i] [string index $a $i]]} 0 subexpr {[string compare [format %c $i] [string index $a $i]]} 1 command {[string compare [format %c $i] [string index $a $i]]} 0 {}}
test parseExpr-18.1 {LogSyntaxError procedure, error in expr longer than 60 chars} {
list [catch {testexprparser {(+0123456)*(+0123456)*(+0123456)*(+0123456)*(+0123456)*(+0123456)*(+0123456)/} -1} msg] $msg
} {1 {syntax error in expression "(+0123456)*(+0123456)*(+0123456)*(+0123456)*(+0123456)*(+012...": premature end of expression}}
# cleanup
::tcltest::cleanupTests
return
|
Added tests/regexpComp.test.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 |
# Commands covered: regexp, regsub
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands. Sourcing this file into Tcl runs the tests and
# generates output for errors. No output means no errors were found.
#
# Copyright (c) 1991-1993 The Regents of the University of California.
# Copyright (c) 1998 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id$
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
namespace import -force ::tcltest::*
}
# Procedure to evaluate a script within a proc, to test compilation
# functionality
proc evalInProc { script } {
proc testProc {} $script
set status [catch {
testProc
} result]
rename testProc {}
return $result
#return [list $status $result]
}
catch {unset foo}
test regexp-1.1 {basic regexp operation} {
evalInProc {
regexp ab*c abbbc
}
} 1
test regexp-1.2 {basic regexp operation} {
evalInProc {
regexp ab*c ac
}
} 1
test regexp-1.3 {basic regexp operation} {
evalInProc {
regexp ab*c ab
}
} 0
test regexp-1.4 {basic regexp operation} {
evalInProc {
regexp -- -gorp abc-gorpxxx
}
} 1
test regexp-1.5 {basic regexp operation} {
evalInProc {
regexp {^([^ ]*)[ ]*([^ ]*)} "" a
}
} 1
test regexp-1.6 {basic regexp operation} {
list [catch {regexp {} abc} msg] $msg
} {0 1}
test regexp-1.7 {regexp utf compliance} {
# if not UTF-8 aware, result is "0 1"
evalInProc {
set foo "\u4e4eb q"
regexp "\u4e4eb q" "a\u4e4eb qw\u5e4e\x4e wq" bar
list [string compare $foo $bar] [regexp 4 $bar]
}
} {0 0}
test regexp-2.1 {getting substrings back from regexp} {
evalInProc {
set foo {}
list [regexp ab*c abbbbc foo] $foo
}
} {1 abbbbc}
test regexp-2.2 {getting substrings back from regexp} {
evalInProc {
set foo {}
set f2 {}
list [regexp a(b*)c abbbbc foo f2] $foo $f2
}
} {1 abbbbc bbbb}
test regexp-2.3 {getting substrings back from regexp} {
evalInProc {
set foo {}
set f2 {}
list [regexp a(b*)(c) abbbbc foo f2] $foo $f2
}
} {1 abbbbc bbbb}
test regexp-2.4 {getting substrings back from regexp} {
evalInProc {
set foo {}
set f2 {}
set f3 {}
list [regexp a(b*)(c) abbbbc foo f2 f3] $foo $f2 $f3
}
} {1 abbbbc bbbb c}
test regexp-2.5 {getting substrings back from regexp} {
evalInProc {
set foo {}; set f1 {}; set f2 {}; set f3 {}; set f4 {}; set f5 {};
set f6 {}; set f7 {}; set f8 {}; set f9 {}; set fa {}; set fb {};
list [regexp (1*)(2*)(3*)(4*)(5*)(6*)(7*)(8*)(9*)(a*)(b*) \
12223345556789999aabbb \
foo f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb] $foo $f1 $f2 $f3 $f4 $f5 \
$f6 $f7 $f8 $f9 $fa $fb
}
} {1 12223345556789999aabbb 1 222 33 4 555 6 7 8 9999 aa bbb}
test regexp-2.6 {getting substrings back from regexp} {
evalInProc {
set foo 2; set f2 2; set f3 2; set f4 2
list [regexp (a)(b)? xay foo f2 f3 f4] $foo $f2 $f3 $f4
}
} {1 a a {} {}}
test regexp-2.7 {getting substrings back from regexp} {
evalInProc {
set foo 1; set f2 1; set f3 1; set f4 1
list [regexp (a)(b)?(c) xacy foo f2 f3 f4] $foo $f2 $f3 $f4
}
} {1 ac a {} c}
test regexp-2.8 {getting substrings back from regexp} {
evalInProc {
set match {}
list [regexp {^a*b} aaaab match] $match
}
} {1 aaaab}
test regexp-3.1 {-indices option to regexp} {
evalInProc {
set foo {}
list [regexp -indices ab*c abbbbc foo] $foo
}
} {1 {0 5}}
test regexp-3.2 {-indices option to regexp} {
evalInProc {
set foo {}
set f2 {}
list [regexp -indices a(b*)c abbbbc foo f2] $foo $f2
}
} {1 {0 5} {1 4}}
test regexp-3.3 {-indices option to regexp} {
evalInProc {
set foo {}
set f2 {}
list [regexp -indices a(b*)(c) abbbbc foo f2] $foo $f2
}
} {1 {0 5} {1 4}}
test regexp-3.4 {-indices option to regexp} {
evalInProc {
set foo {}
set f2 {}
set f3 {}
list [regexp -indices a(b*)(c) abbbbc foo f2 f3] $foo $f2 $f3
}
} {1 {0 5} {1 4} {5 5}}
test regexp-3.5 {-indices option to regexp} {
evalInProc {
set foo {}; set f1 {}; set f2 {}; set f3 {}; set f4 {}; set f5 {};
set f6 {}; set f7 {}; set f8 {}; set f9 {}
list [regexp -indices (1*)(2*)(3*)(4*)(5*)(6*)(7*)(8*)(9*) \
12223345556789999 \
foo f1 f2 f3 f4 f5 f6 f7 f8 f9] $foo $f1 $f2 $f3 $f4 $f5 \
$f6 $f7 $f8 $f9
}
} {1 {0 16} {0 0} {1 3} {4 5} {6 6} {7 9} {10 10} {11 11} {12 12} {13 16}}
test regexp-3.6 {getting substrings back from regexp} {
evalInProc {
set foo 2; set f2 2; set f3 2; set f4 2
list [regexp -indices (a)(b)? xay foo f2 f3 f4] $foo $f2 $f3 $f4
}
} {1 {1 1} {1 1} {-1 -1} {-1 -1}}
test regexp-3.7 {getting substrings back from regexp} {
evalInProc {
set foo 1; set f2 1; set f3 1; set f4 1
list [regexp -indices (a)(b)?(c) xacy foo f2 f3 f4] $foo $f2 $f3 $f4
}
} {1 {1 2} {1 1} {-1 -1} {2 2}}
test regexp-4.1 {-nocase option to regexp} {
evalInProc {
regexp -nocase foo abcFOo
}
} 1
test regexp-4.2 {-nocase option to regexp} {
evalInProc {
set f1 22
set f2 33
set f3 44
list [regexp -nocase {a(b*)([xy]*)z} aBbbxYXxxZ22 f1 f2 f3] $f1 $f2 $f3
}
} {1 aBbbxYXxxZ Bbb xYXxx}
test regexp-4.3 {-nocase option to regexp} {
evalInProc {
regexp -nocase FOo abcFOo
}
} 1
set ::x abcdefghijklmnopqrstuvwxyz1234567890
set ::x $x$x$x$x$x$x$x$x$x$x$x$x
test regexp-4.4 {case conversion in regexp} {
evalInProc {
list [regexp -nocase $::x $::x foo] $foo
}
} "1 $x"
catch {unset ::x}
test regexp-5.1 {exercise cache of compiled expressions} {
evalInProc {
regexp .*a b
regexp .*b c
regexp .*c d
regexp .*d e
regexp .*e f
regexp .*a bbba
}
} 1
test regexp-5.2 {exercise cache of compiled expressions} {
evalInProc {
regexp .*a b
regexp .*b c
regexp .*c d
regexp .*d e
regexp .*e f
regexp .*b xxxb
}
} 1
test regexp-5.3 {exercise cache of compiled expressions} {
evalInProc {
regexp .*a b
regexp .*b c
regexp .*c d
regexp .*d e
regexp .*e f
regexp .*c yyyc
}
} 1
test regexp-5.4 {exercise cache of compiled expressions} {
evalInProc {
regexp .*a b
regexp .*b c
regexp .*c d
regexp .*d e
regexp .*e f
regexp .*d 1d
}
} 1
test regexp-5.5 {exercise cache of compiled expressions} {
evalInProc {
regexp .*a b
regexp .*b c
regexp .*c d
regexp .*d e
regexp .*e f
regexp .*e xe
}
} 1
test regexp-6.1 {regexp errors} {
evalInProc {
list [catch {regexp a} msg] $msg
}
} {1 {wrong # args: should be "regexp ?switches? exp string ?matchVar? ?subMatchVar subMatchVar ...?"}}
test regexp-6.2 {regexp errors} {
evalInProc {
list [catch {regexp -nocase a} msg] $msg
}
} {1 {wrong # args: should be "regexp ?switches? exp string ?matchVar? ?subMatchVar subMatchVar ...?"}}
test regexp-6.3 {regexp errors} {
evalInProc {
list [catch {regexp -gorp a} msg] $msg
}
} {1 {bad switch "-gorp": must be -all, -about, -indices, -inline, -expanded, -line, -linestop, -lineanchor, -nocase, -start, or --}}
test regexp-6.4 {regexp errors} {
evalInProc {
list [catch {regexp a( b} msg] $msg
}
} {1 {couldn't compile regular expression pattern: parentheses () not balanced}}
test regexp-6.5 {regexp errors} {
evalInProc {
list [catch {regexp a( b} msg] $msg
}
} {1 {couldn't compile regular expression pattern: parentheses () not balanced}}
test regexp-6.6 {regexp errors} {
evalInProc {
list [catch {regexp a a f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1} msg] $msg
}
} {0 1}
test regexp-6.7 {regexp errors} {
evalInProc {
list [catch {regexp (x)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.) xyzzy} msg] $msg
}
} {0 0}
test regexp-6.8 {regexp errors} {
evalInProc {
catch {unset f1}
set f1 44
list [catch {regexp abc abc f1(f2)} msg] $msg
}
} {1 {couldn't set variable "f1(f2)"}}
test regexp-6.9 {regexp errors, -start bad int check} {
evalInProc {
list [catch {regexp -start bogus {^$} {}} msg] $msg
}
} {1 {expected integer but got "bogus"}}
test regexp-7.1 {basic regsub operation} {
evalInProc {
list [regsub aa+ xaxaaaxaa 111&222 foo] $foo
}
} {1 xax111aaa222xaa}
test regexp-7.2 {basic regsub operation} {
evalInProc {
list [regsub aa+ aaaxaa &111 foo] $foo
}
} {1 aaa111xaa}
test regexp-7.3 {basic regsub operation} {
evalInProc {
list [regsub aa+ xaxaaa 111& foo] $foo
}
} {1 xax111aaa}
test regexp-7.4 {basic regsub operation} {
evalInProc {
list [regsub aa+ aaa 11&2&333 foo] $foo
}
} {1 11aaa2aaa333}
test regexp-7.5 {basic regsub operation} {
evalInProc {
list [regsub aa+ xaxaaaxaa &2&333 foo] $foo
}
} {1 xaxaaa2aaa333xaa}
test regexp-7.6 {basic regsub operation} {
evalInProc {
list [regsub aa+ xaxaaaxaa 1&22& foo] $foo
}
} {1 xax1aaa22aaaxaa}
test regexp-7.7 {basic regsub operation} {
evalInProc {
list [regsub a(a+) xaxaaaxaa {1\122\1} foo] $foo
}
} {1 xax1aa22aaxaa}
test regexp-7.8 {basic regsub operation} {
evalInProc {
list [regsub a(a+) xaxaaaxaa {1\\\122\1} foo] $foo
}
} "1 {xax1\\aa22aaxaa}"
test regexp-7.9 {basic regsub operation} {
evalInProc {
list [regsub a(a+) xaxaaaxaa {1\\122\1} foo] $foo
}
} "1 {xax1\\122aaxaa}"
test regexp-7.10 {basic regsub operation} {
evalInProc {
list [regsub a(a+) xaxaaaxaa {1\\&\1} foo] $foo
}
} "1 {xax1\\aaaaaxaa}"
test regexp-7.11 {basic regsub operation} {
evalInProc {
list [regsub a(a+) xaxaaaxaa {1\&\1} foo] $foo
}
} {1 xax1&aaxaa}
test regexp-7.12 {basic regsub operation} {
evalInProc {
list [regsub a(a+) xaxaaaxaa {\1\1\1\1&&} foo] $foo
}
} {1 xaxaaaaaaaaaaaaaaxaa}
test regexp-7.13 {basic regsub operation} {
evalInProc {
set foo xxx
list [regsub abc xyz 111 foo] $foo
}
} {0 xyz}
test regexp-7.14 {basic regsub operation} {
evalInProc {
set foo xxx
list [regsub ^ xyz "111 " foo] $foo
}
} {1 {111 xyz}}
test regexp-7.15 {basic regsub operation} {
evalInProc {
set foo xxx
list [regsub -- -foo abc-foodef "111 " foo] $foo
}
} {1 {abc111 def}}
test regexp-7.16 {basic regsub operation} {
evalInProc {
set foo xxx
list [regsub x "" y foo] $foo
}
} {0 {}}
test regexp-7.17 {regsub utf compliance} {
evalInProc {
# if not UTF-8 aware, result is "0 1"
set foo "xyz555ijka\u4e4ebpqr"
regsub a\u4e4eb xyza\u4e4ebijka\u4e4ebpqr 555 bar
list [string compare $foo $bar] [regexp 4 $bar]
}
} {0 0}
test regexp-8.1 {case conversion in regsub} {
evalInProc {
list [regsub -nocase a(a+) xaAAaAAay & foo] $foo
}
} {1 xaAAaAAay}
test regexp-8.2 {case conversion in regsub} {
evalInProc {
list [regsub -nocase a(a+) xaAAaAAay & foo] $foo
}
} {1 xaAAaAAay}
test regexp-8.3 {case conversion in regsub} {
evalInProc {
set foo 123
list [regsub a(a+) xaAAaAAay & foo] $foo
}
} {0 xaAAaAAay}
test regexp-8.4 {case conversion in regsub} {
evalInProc {
set foo 123
list [regsub -nocase a CaDE b foo] $foo
}
} {1 CbDE}
test regexp-8.5 {case conversion in regsub} {
evalInProc {
set foo 123
list [regsub -nocase XYZ CxYzD b foo] $foo
}
} {1 CbD}
test regexp-8.6 {case conversion in regsub} {
evalInProc {
set x abcdefghijklmnopqrstuvwxyz1234567890
set x $x$x$x$x$x$x$x$x$x$x$x$x
set foo 123
list [regsub -nocase $x $x b foo] $foo
}
} {1 b}
test regexp-9.1 {-all option to regsub} {
evalInProc {
set foo 86
list [regsub -all x+ axxxbxxcxdx |&| foo] $foo
}
} {4 a|xxx|b|xx|c|x|d|x|}
test regexp-9.2 {-all option to regsub} {
evalInProc {
set foo 86
list [regsub -nocase -all x+ aXxXbxxcXdx |&| foo] $foo
}
} {4 a|XxX|b|xx|c|X|d|x|}
test regexp-9.3 {-all option to regsub} {
evalInProc {
set foo 86
list [regsub x+ axxxbxxcxdx |&| foo] $foo
}
} {1 a|xxx|bxxcxdx}
test regexp-9.4 {-all option to regsub} {
evalInProc {
set foo 86
list [regsub -all bc axxxbxxcxdx |&| foo] $foo
}
} {0 axxxbxxcxdx}
test regexp-9.5 {-all option to regsub} {
evalInProc {
set foo xxx
list [regsub -all node "node node more" yy foo] $foo
}
} {2 {yy yy more}}
test regexp-9.6 {-all option to regsub} {
evalInProc {
set foo xxx
list [regsub -all ^ xxx 123 foo] $foo
}
} {1 123xxx}
test regexp-10.1 {expanded syntax in regsub} {
evalInProc {
set foo xxx
list [regsub -expanded ". \#comment\n . \#comment2" abc def foo] $foo
}
} {1 defc}
test regexp-10.2 {newline sensitivity in regsub} {
evalInProc {
set foo xxx
list [regsub -line {^a.*b$} "dabc\naxyb\n" 123 foo] $foo
}
} "1 {dabc\n123\n}"
test regexp-10.3 {newline sensitivity in regsub} {
evalInProc {
set foo xxx
list [regsub -line {^a.*b$} "dabc\naxyb\nxb" 123 foo] $foo
}
} "1 {dabc\n123\nxb}"
test regexp-10.4 {partial newline sensitivity in regsub} {
evalInProc {
set foo xxx
list [regsub -lineanchor {^a.*b$} "da\naxyb\nxb" 123 foo] $foo
}
} "1 {da\n123}"
test regexp-10.5 {inverse partial newline sensitivity in regsub} {
evalInProc {
set foo xxx
list [regsub -linestop {a.*b} "da\nbaxyb\nxb" 123 foo] $foo
}
} "1 {da\nb123\nxb}"
test regexp-11.1 {regsub errors} {
evalInProc {
list [catch {regsub a b c} msg] $msg
}
} {1 {wrong # args: should be "regsub ?switches? exp string subSpec varName"}}
test regexp-11.2 {regsub errors} {
evalInProc {
list [catch {regsub -nocase a b c} msg] $msg
}
} {1 {wrong # args: should be "regsub ?switches? exp string subSpec varName"}}
test regexp-11.3 {regsub errors} {
evalInProc {
list [catch {regsub -nocase -all a b c} msg] $msg
}
} {1 {wrong # args: should be "regsub ?switches? exp string subSpec varName"}}
test regexp-11.4 {regsub errors} {
evalInProc {
list [catch {regsub a b c d e f} msg] $msg
}
} {1 {wrong # args: should be "regsub ?switches? exp string subSpec varName"}}
test regexp-11.5 {regsub errors} {
evalInProc {
list [catch {regsub -gorp a b c} msg] $msg
}
} {1 {bad switch "-gorp": must be -all, -nocase, -expanded, -line, -linestop, -lineanchor, -start, or --}}
test regexp-11.6 {regsub errors} {
evalInProc {
list [catch {regsub -nocase a( b c d} msg] $msg
}
} {1 {couldn't compile regular expression pattern: parentheses () not balanced}}
test regexp-11.7 {regsub errors} {
evalInProc {
catch {unset f1}
set f1 44
list [catch {regsub -nocase aaa aaa xxx f1(f2)} msg] $msg
}
} {1 {couldn't set variable "f1(f2)"}}
test regexp-11.8 {regsub errors, -start bad int check} {
evalInProc {
list [catch {regsub -start bogus pattern string rep var} msg] $msg
}
} {1 {expected integer but got "bogus"}}
# This test crashes on the Mac unless you increase the Stack Space to about 1
# Meg. This is probably bigger than most users want...
# 8.2.3 regexp reduced stack space requirements, but this should be
# tested again
test regexp-12.1 {Tcl_RegExpExec: large number of subexpressions} {macCrash} {
evalInProc {
list [regexp (.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.) abcdefghijklmnopqrstuvwxyz all a b c d e f g h i j k l m n o p q r s t u v w x y z] $all $a $b $c $d $e $f $g $h $i $j $k $l $m $n $o $p $q $r $s $t $u $v $w $x $y $z
}
} {1 abcdefghijklmnopqrstuvwxyz a b c d e f g h i j k l m n o p q r s t u v w x y z}
test regexp-13.1 {regsub of a very large string} {
# This test is designed to stress the memory subsystem in order
# to catch Bug #933. It only fails if the Tcl memory allocator
# is in use.
set line {BEGIN_TABLE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; END_TABLE}
set filedata [string repeat $line 200]
for {set i 1} {$i<10} {incr i} {
regsub -all "BEGIN_TABLE " $filedata "" newfiledata
}
set x done
} {done}
test regexp-14.1 {CompileRegexp: regexp cache} {
evalInProc {
regexp .*a b
regexp .*b c
regexp .*c d
regexp .*d e
regexp .*e f
set x .
append x *a
regexp $x bbba
}
} 1
test regexp-14.2 {CompileRegexp: regexp cache, different flags} {
evalInProc {
regexp .*a b
regexp .*b c
regexp .*c d
regexp .*d e
regexp .*e f
set x .
append x *a
regexp -nocase $x bbba
}
} 1
# There is no exec on the Mac ...
test regexp-14.3 {CompileRegexp: regexp cache, empty regexp and empty cache} {unixOrPc} {
makeFile {puts [regexp {} foo]} junk.tcl
exec $::tcltest::tcltest junk.tcl
} 1
test regexp-15.1 {regexp -start} {
catch {unset x}
list [regexp -start -10 {\d} 1abc2de3 x] $x
} {1 1}
test regexp-15.2 {regexp -start} {
catch {unset x}
list [regexp -start 2 {\d} 1abc2de3 x] $x
} {1 2}
test regexp-15.3 {regexp -start} {
catch {unset x}
list [regexp -start 4 {\d} 1abc2de3 x] $x
} {1 2}
test regexp-15.4 {regexp -start} {
catch {unset x}
list [regexp -start 5 {\d} 1abc2de3 x] $x
} {1 3}
test regexp-15.5 {regexp -start, over end of string} {
catch {unset x}
list [regexp -start [string length 1abc2de3] {\d} 1abc2de3 x] [info exists x]
} {0 0}
test regexp-15.6 {regexp -start, loss of ^$ behavior} {
list [regexp -start 2 {^$} {}]
} {0}
test regexp-16.1 {regsub -start} {
catch {unset x}
list [regsub -all -start 2 {\d} a1b2c3d4e5 {/&} x] $x
} {4 a1b/2c/3d/4e/5}
test regexp-16.2 {regsub -start} {
catch {unset x}
list [regsub -all -start -25 {z} hello {/&} x] $x
} {0 hello}
test regexp-16.3 {regsub -start} {
catch {unset x}
list [regsub -all -start 3 {z} hello {/&} x] $x
} {0 hello}
test regexp-16.4 {regsub -start, \A behavior} {
set out {}
lappend out [regsub -start 0 -all {\A(\w)} {abcde} {/\1} x] $x
lappend out [regsub -start 2 -all {\A(\w)} {abcde} {/\1} x] $x
} {5 /a/b/c/d/e 3 ab/c/d/e}
test regexp-17.1 {regexp -inline} {
regexp -inline b ababa
} {b}
test regexp-17.2 {regexp -inline} {
regexp -inline (b) ababa
} {b b}
test regexp-17.3 {regexp -inline -indices} {
regexp -inline -indices (b) ababa
} {{1 1} {1 1}}
test regexp-17.4 {regexp -inline} {
regexp -inline {\w(\d+)\w} " hello 23 there456def "
} {e456d 456}
test regexp-17.5 {regexp -inline no matches} {
regexp -inline {\w(\d+)\w} ""
} {}
test regexp-17.6 {regexp -inline no matches} {
regexp -inline hello goodbye
} {}
test regexp-17.7 {regexp -inline, no matchvars allowed} {
list [catch {regexp -inline b abc match} msg] $msg
} {1 {regexp match variables not allowed when using -inline}}
test regexp-18.1 {regexp -all} {
regexp -all b bbbbb
} {5}
test regexp-18.2 {regexp -all} {
regexp -all b abababbabaaaaaaaaaab
} {6}
test regexp-18.3 {regexp -all -inline} {
regexp -all -inline b abababbabaaaaaaaaaab
} {b b b b b b}
test regexp-18.4 {regexp -all -inline} {
regexp -all -inline {\w(\w)} abcdefg
} {ab b cd d ef f}
test regexp-18.5 {regexp -all -inline} {
regexp -all -inline {\w(\w)$} abcdefg
} {fg g}
test regexp-18.6 {regexp -all -inline} {
regexp -all -inline {\d+} 10:20:30:40
} {10 20 30 40}
test regexp-18.7 {regexp -all -inline} {
list [catch {regexp -all -inline b abc match} msg] $msg
} {1 {regexp match variables not allowed when using -inline}}
test regexp-18.8 {regexp -all} {
# This should not cause an infinite loop
regexp -all -inline {a*} a
} {a}
test regexp-18.9 {regexp -all} {
# Yes, the expected result is {a {}}. Here's why:
# Start at index 0; a* matches the "a" there then stops.
# Go to index 1; a* matches the lambda (or {}) there then stops. Recall
# that a* matches zero or more "a"'s; thus it matches the string "b", as
# there are zero or more "a"'s there.
# Go to index 2; this is past the end of the string, so stop.
regexp -all -inline {a*} ab
} {a {}}
test regexp-18.10 {regexp -all} {
# Yes, the expected result is {a {} a}. Here's why:
# Start at index 0; a* matches the "a" there then stops.
# Go to index 1; a* matches the lambda (or {}) there then stops. Recall
# that a* matches zero or more "a"'s; thus it matches the string "b", as
# there are zero or more "a"'s there.
# Go to index 2; a* matches the "a" there then stops.
# Go to index 3; this is past the end of the string, so stop.
regexp -all -inline {a*} aba
} {a {} a}
test regexp-18.11 {regexp -all} {
regexp -all -inline {^a} aaaa
} {a}
test regexp-18.12 {regexp -all -inline -indices} {
regexp -all -inline -indices a(b(c)d|e(f)g)h abcdhaefgh
} {{0 4} {1 3} {2 2} {-1 -1} {5 9} {6 8} {-1 -1} {7 7}}
test regexp-19.1 {regsub null replacement} {
regsub -all {@} {@hel@lo@} "\0a\0" result
list $result [string length $result]
} "\0a\0hel\0a\0lo\0a\0 14"
test regexp-20.1 {regsub shared object shimmering} {
# Bug #461322
set a abcdefghijklmnopqurstuvwxyz
set b $a
set c abcdefghijklmnopqurstuvwxyz0123456789
regsub $a $c $b d
list $d [string length $d] [string bytelength $d]
} [list abcdefghijklmnopqurstuvwxyz0123456789 37 37]
test regexp-21.1 {regexp command compiling tests} {
evalInProc {
regexp foo bar
}
} 0
test regexp-21.2 {regexp command compiling tests} {
evalInProc {
regexp {^foo$} dogfood
}
} 0
test regexp-21.3 {regexp command compiling tests} {
evalInProc {
set a foo
regexp {^foo$} $a
}
} 1
test regexp-21.4 {regexp command compiling tests} {
evalInProc {
regexp foo dogfood
}
} 1
test regexp-21.5 {regexp command compiling tests} {
evalInProc {
regexp -nocase FOO dogfod
}
} 0
test regexp-21.6 {regexp command compiling tests} {
evalInProc {
regexp -n foo dogfoOd
}
} 1
test regexp-21.7 {regexp command compiling tests} {
evalInProc {
regexp -no -- FoO dogfood
}
} 1
test regexp-21.8 {regexp command compiling tests} {
evalInProc {
regexp -- foo dogfod
}
} 0
test regexp-21.9 {regexp command compiling tests} {
evalInProc {
list [catch {regexp -- -nocase foo dogfod} msg] $msg
}
} {0 0}
# cleanup
::tcltest::cleanupTests
return
|
Changes to tests/socket.test.
1 2 3 4 5 6 7 8 9 10 11 12 | # Commands tested in this file: socket. # # This file contains a collection of tests for one or more of the Tcl # built-in commands. Sourcing this file into Tcl runs the tests and # generates output for errors. No output means no errors were found. # # Copyright (c) 1994-1996 Sun Microsystems, Inc. # Copyright (c) 1998-2000 Ajuba Solutions. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | # Commands tested in this file: socket. # # This file contains a collection of tests for one or more of the Tcl # built-in commands. Sourcing this file into Tcl runs the tests and # generates output for errors. No output means no errors were found. # # Copyright (c) 1994-1996 Sun Microsystems, Inc. # Copyright (c) 1998-2000 Ajuba Solutions. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # RCS: @(#) $Id: socket.test,v 1.20.2.1 2002/02/05 02:22:04 wolfsuit Exp $ # Running socket tests with a remote server: # ------------------------------------------ # # Some tests in socket.test depend on the existence of a remote server to # which they connect. The remote server must be an instance of tcltest and it # must run the script found in the file "remote.tcl" in this directory. You |
| ︙ | ︙ | |||
843 844 845 846 847 848 849 |
} {3 1 0}
test socket-7.3 {testing socket specific options} {socket} {
set s [socket -server accept 0]
set l [fconfigure $s]
close $s
update
llength $l
| | | 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 |
} {3 1 0}
test socket-7.3 {testing socket specific options} {socket} {
set s [socket -server accept 0]
set l [fconfigure $s]
close $s
update
llength $l
} 14
test socket-7.4 {testing socket specific options} {socket} {
set s [socket -server accept 0]
proc accept {s a p} {
global x
set x [fconfigure $s -sockname]
close $s
}
|
| ︙ | ︙ |
Changes to tests/stack.test.
1 2 3 4 5 6 7 8 9 10 11 | # Tests that the stack size is big enough for the application. # # This file contains a collection of tests for one or more of the Tcl # built-in commands. Sourcing this file into Tcl runs the tests and # generates output for errors. No output means no errors were found. # # Copyright (c) 1998-2000 Ajuba Solutions. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# Tests that the stack size is big enough for the application.
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands. Sourcing this file into Tcl runs the tests and
# generates output for errors. No output means no errors were found.
#
# Copyright (c) 1998-2000 Ajuba Solutions.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: stack.test,v 1.11.4.1 2002/02/05 02:22:04 wolfsuit Exp $
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
namespace import -force ::tcltest::*
}
# Note that a failure in this test results in a crash of the executable.
|
| ︙ | ︙ | |||
39 40 41 42 43 44 45 |
}
test stack-1.1 {maxNestingDepth reached on infinite recursion} {minStack2400} {
proc recurse {} { return [recurse] }
catch {recurse} rv
rename recurse {}
set rv
| | | 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
}
test stack-1.1 {maxNestingDepth reached on infinite recursion} {minStack2400} {
proc recurse {} { return [recurse] }
catch {recurse} rv
rename recurse {}
set rv
} {too many nested calls to Tcl_Eval (infinite loop?)}
test stack-2.1 {maxNestingDepth reached on infinite recursion} {minStack2400} {
# do this in a slave to not mess with parent
set slave stack-2.1
interp create $slave
$slave eval { interp alias {} unknown {} notaknownproc }
set msg [$slave eval { catch {foo} msg ; set msg }]
|
| ︙ | ︙ |
Changes to tests/string.test.
1 2 3 4 5 6 7 8 9 10 11 12 13 | # Commands covered: string # # This file contains a collection of tests for one or more of the Tcl # built-in commands. Sourcing this file into Tcl runs the tests and # generates output for errors. No output means no errors were found. # # Copyright (c) 1991-1993 The Regents of the University of California. # Copyright (c) 1994 Sun Microsystems, Inc. # Copyright (c) 1998-1999 by Scriptics Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # | > | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# Commands covered: string
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands. Sourcing this file into Tcl runs the tests and
# generates output for errors. No output means no errors were found.
#
# Copyright (c) 1991-1993 The Regents of the University of California.
# Copyright (c) 1994 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
# Copyright (c) 2001 by Kevin B. Kenny. All rights reserved.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: string.test,v 1.29.10.1 2002/02/05 02:22:04 wolfsuit Exp $
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
namespace import -force ::tcltest::*
}
# Some tests require the testobj command
|
| ︙ | ︙ | |||
255 256 257 258 259 260 261 |
string compare [string index $str 10] \x00
} 0
test string-5.17 {string index, bad integer} {
list [catch {string index "abc" 08} msg] $msg
} {1 {bad index "08": must be integer or end?-integer? (looks like invalid octal number)}}
test string-5.18 {string index, bad integer} {
list [catch {string index "abc" end-00289} msg] $msg
| | | 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 |
string compare [string index $str 10] \x00
} 0
test string-5.17 {string index, bad integer} {
list [catch {string index "abc" 08} msg] $msg
} {1 {bad index "08": must be integer or end?-integer? (looks like invalid octal number)}}
test string-5.18 {string index, bad integer} {
list [catch {string index "abc" end-00289} msg] $msg
} {1 {bad index "end-00289": must be integer or end?-integer? (looks like invalid octal number)}}
test string-5.19 {string index, bytearray object out of bounds} {
string index [binary format I* {0x50515253 0x52}] -1
} {}
test string-5.20 {string index, bytearray object out of bounds} {
string index [binary format I* {0x50515253 0x52}] 20
} {}
|
| ︙ | ︙ | |||
850 851 852 853 854 855 856 857 858 859 860 861 862 863 |
} 0
test string-11.49 {string match, *special case} {
string match "?\\*" "a*"
} 1
test string-11.50 {string match, *special case} {
string match "\\" "\\"
} 0
test string-12.1 {string range} {
list [catch {string range} msg] $msg
} {1 {wrong # args: should be "string range string first last"}}
test string-12.2 {string range} {
list [catch {string range a 1} msg] $msg
| > > > > | 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 |
} 0
test string-11.49 {string match, *special case} {
string match "?\\*" "a*"
} 1
test string-11.50 {string match, *special case} {
string match "\\" "\\"
} 0
test string-11.51 {string match; *, -nocase and UTF-8} {
string match -nocase [binary format I 717316707] \
[binary format I 2028036707]
} 1
test string-12.1 {string range} {
list [catch {string range} msg] $msg
} {1 {wrong # args: should be "string range string first last"}}
test string-12.2 {string range} {
list [catch {string range a 1} msg] $msg
|
| ︙ | ︙ |
Changes to tests/stringComp.test.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # Commands covered: string # # This file contains a collection of tests for one or more of the Tcl # built-in commands. Sourcing this file into Tcl runs the tests and # generates output for errors. No output means no errors were found. # # This differs from the original string tests in that the tests call # things in procs, which uses the compiled string code instead of # the runtime parse string code. The tests of import should match # their equivalent number in string.test. # # Copyright (c) 2001 by ActiveState Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # | > | | 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 |
# Commands covered: string
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands. Sourcing this file into Tcl runs the tests and
# generates output for errors. No output means no errors were found.
#
# This differs from the original string tests in that the tests call
# things in procs, which uses the compiled string code instead of
# the runtime parse string code. The tests of import should match
# their equivalent number in string.test.
#
# Copyright (c) 2001 by ActiveState Corporation.
# Copyright (c) 2001 by Kevin B. Kenny. All rights reserved.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: stringComp.test,v 1.3.8.1 2002/02/05 02:22:04 wolfsuit Exp $
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
namespace import -force ::tcltest::*
}
# Some tests require the testobj command
|
| ︙ | ︙ | |||
340 341 342 343 344 345 346 |
test string-5.17 {string index, bad integer} {
proc foo {} {string index "abc" 08}
list [catch {foo} msg] $msg
} {1 {bad index "08": must be integer or end?-integer? (looks like invalid octal number)}}
test string-5.18 {string index, bad integer} {
proc foo {} {string index "abc" end-00289}
list [catch {foo} msg] $msg
| | | 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 |
test string-5.17 {string index, bad integer} {
proc foo {} {string index "abc" 08}
list [catch {foo} msg] $msg
} {1 {bad index "08": must be integer or end?-integer? (looks like invalid octal number)}}
test string-5.18 {string index, bad integer} {
proc foo {} {string index "abc" end-00289}
list [catch {foo} msg] $msg
} {1 {bad index "end-00289": must be integer or end?-integer? (looks like invalid octal number)}}
test string-5.19 {string index, bytearray object out of bounds} {
proc foo {} {string index [binary format I* {0x50515253 0x52}] -1}
foo
} {}
test string-5.20 {string index, bytearray object out of bounds} {
proc foo {} {string index [binary format I* {0x50515253 0x52}] 20}
foo
|
| ︙ | ︙ |
Changes to tests/switch.test.
1 2 3 4 5 6 7 8 9 10 11 12 13 | # Commands covered: switch # # This file contains a collection of tests for one or more of the Tcl # built-in commands. Sourcing this file into Tcl runs the tests and # generates output for errors. No output means no errors were found. # # Copyright (c) 1993 The Regents of the University of California. # Copyright (c) 1994 Sun Microsystems, Inc. # Copyright (c) 1998-1999 by Scriptics Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# Commands covered: switch
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands. Sourcing this file into Tcl runs the tests and
# generates output for errors. No output means no errors were found.
#
# Copyright (c) 1993 The Regents of the University of California.
# Copyright (c) 1994 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: switch.test,v 1.6.18.1 2002/02/05 02:22:04 wolfsuit Exp $
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
namespace import -force ::tcltest::*
}
test switch-1.1 {simple patterns} {
|
| ︙ | ︙ | |||
158 159 160 161 162 163 164 |
list [catch {
switch a {
a -
b -
c -
}
} msg] $msg
| | | | > > > > > > > > > > > | > > | | | | | | | | | | | | > > > > > > | 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 |
list [catch {
switch a {
a -
b -
c -
}
} msg] $msg
} {1 {no body specified for pattern "c"}}
test switch-7.3 {"-" bodies} {
list [catch {
switch a {
a -
b -foo
c -
}
} msg] $msg
} {1 {no body specified for pattern "c"}}
test switch-8.1 {empty body} {
set msg {}
switch {2} {
1 {set msg 1}
2 {}
default {set msg 2}
}
} {}
test switch-9.1 {empty pattern/body list} {
list [catch {switch x} msg] $msg
} {1 {wrong # args: should be "switch ?switches? string pattern body ... ?default body?"}}
test switch-9.2 {empty pattern/body list} {
list [catch {switch -- x} msg] $msg
} {1 {wrong # args: should be "switch ?switches? string pattern body ... ?default body?"}}
test switch-9.3 {empty pattern/body list} {
list [catch {switch x {}} msg] $msg
} {1 {wrong # args: should be "switch ?switches? string {pattern body ... ?default body?}"}}
test switch-9.4 {empty pattern/body list} {
list [catch {switch -- x {}} msg] $msg
} {1 {wrong # args: should be "switch ?switches? string {pattern body ... ?default body?}"}}
test switch-9.5 {unpaired pattern} {
list [catch {switch x a {} b} msg] $msg
} {1 {extra switch pattern with no body}}
test switch-9.6 {unpaired pattern} {
list [catch {switch x {a {} b}} msg] $msg
} {1 {extra switch pattern with no body}}
test switch-9.7 {unpaired pattern} {
list [catch {switch x a {} # comment b} msg] $msg
} {1 {extra switch pattern with no body}}
test switch-9.8 {unpaired pattern} {
list [catch {switch x {a {} # comment b}} msg] $msg
} {1 {extra switch pattern with no body, this may be due to a comment incorrectly placed outside of a switch body - see the "switch" documentation}}
test switch-9.9 {unpaired pattern} {
list [catch {switch x a {} x {} # comment b} msg] $msg
} {1 {extra switch pattern with no body}}
test switch-9.10 {unpaired pattern} {
list [catch {switch x {a {} x {} # comment b}} msg] $msg
} {1 {extra switch pattern with no body, this may be due to a comment incorrectly placed outside of a switch body - see the "switch" documentation}}
# cleanup
::tcltest::cleanupTests
return
|
Changes to tests/tcltest.test.
1 2 3 4 5 6 7 8 | # This file contains a collection of tests for one or more of the Tcl # built-in commands. Sourcing this file into Tcl runs the tests and # generates output for errors. No output means no errors were found. # # Copyright (c) 1998-1999 by Scriptics Corporation. # Copyright (c) 2000 by Ajuba Solutions # All rights reserved. # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# This file contains a collection of tests for one or more of the Tcl
# built-in commands. Sourcing this file into Tcl runs the tests and
# generates output for errors. No output means no errors were found.
#
# Copyright (c) 1998-1999 by Scriptics Corporation.
# Copyright (c) 2000 by Ajuba Solutions
# All rights reserved.
#
# RCS: @(#) $Id: tcltest.test,v 1.16.8.1 2002/02/05 02:22:04 wolfsuit Exp $
set tcltestVersion [package require tcltest]
namespace import -force ::tcltest::*
if {[package vcompare $tcltestVersion 1.0] < 1} {
puts "Tests require that version 2.0 of tcltest be loaded."
puts "$tcltestVersion was loaded instead - tests will be skipped."
|
| ︙ | ︙ | |||
461 462 463 464 465 466 467 468 469 470 471 472 473 474 |
puts "testdir: [tcltest::testsDirectory]"
exit
} a.tcl
makeFile {} thisdirectoryisafile
set normaldirectory [tcltest::makeDirectory normaldirectory]
# -tmpdir, tcltest::temporaryDirectory
test tcltest-8.1 {tcltest a.tcl -tmpdir a} {unixOrPc} {
file delete -force thisdirectorydoesnotexist
exec $::tcltest::tcltest a.tcl -tmpdir thisdirectorydoesnotexist
list [file exists [file join thisdirectorydoesnotexist a.tmp]] \
[file delete -force thisdirectorydoesnotexist]
| > > > | 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 |
puts "testdir: [tcltest::testsDirectory]"
exit
} a.tcl
makeFile {} thisdirectoryisafile
set normaldirectory [tcltest::makeDirectory normaldirectory]
if {$::tcl_platform(platform) == "macintosh"} {
set normaldirectory [file normalize $normaldirectory]
}
# -tmpdir, tcltest::temporaryDirectory
test tcltest-8.1 {tcltest a.tcl -tmpdir a} {unixOrPc} {
file delete -force thisdirectorydoesnotexist
exec $::tcltest::tcltest a.tcl -tmpdir thisdirectorydoesnotexist
list [file exists [file join thisdirectorydoesnotexist a.tmp]] \
[file delete -force thisdirectorydoesnotexist]
|
| ︙ | ︙ | |||
494 495 496 497 498 499 500 |
switch $tcl_platform(platform) {
"unix" {
file attributes $notReadableDir -permissions 00333
file attributes $notWriteableDir -permissions 00555
}
default {
| | | | 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 |
switch $tcl_platform(platform) {
"unix" {
file attributes $notReadableDir -permissions 00333
file attributes $notWriteableDir -permissions 00555
}
default {
catch {file attributes $notWriteableDir -readonly 1}
}
}
test tcltest-8.3 {tcltest a.tcl -tmpdir notReadableDir} {unixOnly} {
catch {exec $::tcltest::tcltest a.tcl -tmpdir $notReadableDir} msg
# The join is necessary because the message can be split on multiple lines
list [regexp {not readable} [join $msg]]
} {1}
test tcltest-8.4 {tcltest a.tcl -tmpdir notWriteableDir} {unixOrPc} {
catch {exec $::tcltest::tcltest a.tcl -tmpdir $notWriteableDir} msg
# The join is necessary because the message can be split on multiple lines
list [regexp {not writeable} [join $msg]]
} {1}
test tcltest-8.5 {tcltest a.tcl -tmpdir normaldirectory} {unixOrPc} {
catch {exec $::tcltest::tcltest a.tcl -tmpdir $normaldirectory} msg
# The join is necessary because the message can be split on multiple lines
file exists [file join $normaldirectory a.tmp]
} {1}
set current [pwd]
test tcltest-8.6 {tcltest::temporaryDirectory} {
|
| ︙ | ︙ | |||
547 548 549 550 551 552 553 |
set f3 [tcltest::temporaryDirectory]
list $f1 $f2 $f3
} -cleanup {
set tcltest::temporaryDirectory $old
} -result "$normaldirectory $current $current"
# -testdir, tcltest::testsDirectory
| | | | | 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 |
set f3 [tcltest::temporaryDirectory]
list $f1 $f2 $f3
} -cleanup {
set tcltest::temporaryDirectory $old
} -result "$normaldirectory $current $current"
# -testdir, tcltest::testsDirectory
test tcltest-8.10 {tcltest a.tcl -testdir thisdirectorydoesnotexist} {unixOrPc} {
file delete -force thisdirectorydoesnotexist
catch {exec $::tcltest::tcltest a.tcl -testdir thisdirectorydoesnotexist} msg
list [regexp "does not exist" [join $msg]]
} {1}
test tcltest-8.11 {tcltest a.tcl -testdir thisdirectoryisafile} {unixOrPc} {
catch {exec $::tcltest::tcltest a.tcl -testdir thisdirectoryisafile} msg
# The join is necessary because the message can be split on multiple lines
list [regexp "not a directory" [join $msg]]
} {1}
test tcltest-8.12 {tcltest a.tcl -testdir notReadableDir} {unixOnly} {
catch {exec $::tcltest::tcltest a.tcl -testdir $notReadableDir} msg
# The join is necessary because the message can be split on multiple lines
list [regexp {not readable} [join $msg]]
} {1}
test tcltest-8.13 {tcltest a.tcl -testdir normaldirectory} {unixOrPc} {
catch {exec $::tcltest::tcltest a.tcl -testdir normaldirectory} msg
# The join is necessary because the message can be split on multiple lines
regexp "testdir: $normaldirectory" [join $msg]
} {1}
test tcltest-8.14 {tcltest::testsDirectory} {
-setup {
|
| ︙ | ︙ | |||
621 622 623 624 625 626 627 |
switch $tcl_platform(platform) {
"unix" {
file attributes $notReadableDir -permissions 777
file attributes $notWriteableDir -permissions 777
}
default {
| | | 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 |
switch $tcl_platform(platform) {
"unix" {
file attributes $notReadableDir -permissions 777
file attributes $notWriteableDir -permissions 777
}
default {
catch {file attributes $notWriteableDir -readonly 0}
}
}
file delete -force $notReadableDir $notWriteableDir
# -file, -notfile, tcltest::matchFiles, tcltest::skipFiles
test tcltest-9.1 {-file a*.tcl} {unixOrPc} {
|
| ︙ | ︙ |
Changes to tests/trace.test.
1 2 3 4 5 6 7 8 9 10 11 12 13 | # Commands covered: trace # # This file contains a collection of tests for one or more of the Tcl # built-in commands. Sourcing this file into Tcl runs the tests and # generates output for errors. No output means no errors were found. # # Copyright (c) 1991-1993 The Regents of the University of California. # Copyright (c) 1994 Sun Microsystems, Inc. # Copyright (c) 1998-1999 by Scriptics Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# Commands covered: trace
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands. Sourcing this file into Tcl runs the tests and
# generates output for errors. No output means no errors were found.
#
# Copyright (c) 1991-1993 The Regents of the University of California.
# Copyright (c) 1994 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: trace.test,v 1.11.8.1 2002/02/05 02:22:04 wolfsuit Exp $
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
namespace import -force ::tcltest::*
}
proc traceScalar {name1 name2 op} {
|
| ︙ | ︙ | |||
52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
proc traceCrtElement {value name1 name2 op} {
uplevel set ${name1}($name2) $value
}
proc traceCommand {oldName newName op} {
global info
set info [list $oldName $newName $op]
}
# Read-tracing on variables
test trace-1.1 {trace variable reads} {
catch {unset x}
set info {}
trace add variable x read traceScalar
list [catch {set x} msg] $msg $info
| > > > > > > > > > > > > | 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
proc traceCrtElement {value name1 name2 op} {
uplevel set ${name1}($name2) $value
}
proc traceCommand {oldName newName op} {
global info
set info [list $oldName $newName $op]
}
test trace-0.0 {memory corruption in trace (Tcl Bug 484339)} {
# You may need Purify or Electric Fence to reliably
# see this one fail.
catch {unset z}
trace add variable z array {set z(foo) 1 ;#}
set res "names: [array names z]"
catch {unset ::z}
trace variable ::z w {unset ::z; error "memory corruption";#}
list [catch {set ::z 1} msg] $msg
} {1 {can't set "::z": memory corruption}}
# Read-tracing on variables
test trace-1.1 {trace variable reads} {
catch {unset x}
set info {}
trace add variable x read traceScalar
list [catch {set x} msg] $msg $info
|
| ︙ | ︙ | |||
136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
catch {unset x}
set x 444
set info {}
trace add variable x read traceScalar
unset x
set info
} {}
# Basic write-tracing on variables
test trace-2.1 {trace variable writes} {
catch {unset x}
set info {}
trace add variable x write traceScalar
| > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 |
catch {unset x}
set x 444
set info {}
trace add variable x read traceScalar
unset x
set info
} {}
test trace-1.11 {read traces that modify the array structure} {
catch {unset x}
set x(bar) 0
trace variable x r {set x(foo) 1 ;#}
trace variable x r {unset -nocomplain x(bar) ;#}
array get x
} {}
test trace-1.12 {read traces that modify the array structure} {
catch {unset x}
set x(bar) 0
trace variable x r {unset -nocomplain x(bar) ;#}
trace variable x r {set x(foo) 1 ;#}
array get x
} {}
test trace-1.13 {read traces that modify the array structure} {
catch {unset x}
set x(bar) 0
trace variable x r {set x(foo) 1 ;#}
trace variable x r {unset -nocomplain x;#}
list [catch {array get x} res] $res
} {1 {can't read "x(bar)": no such variable}}
test trace-1.14 {read traces that modify the array structure} {
catch {unset x}
set x(bar) 0
trace variable x r {unset -nocomplain x;#}
trace variable x r {set x(foo) 1 ;#}
list [catch {array get x} res] $res
} {1 {can't read "x(bar)": no such variable}}
# Basic write-tracing on variables
test trace-2.1 {trace variable writes} {
catch {unset x}
set info {}
trace add variable x write traceScalar
|
| ︙ | ︙ | |||
472 473 474 475 476 477 478 479 480 481 482 483 484 485 |
# when the trace is deleted.
catch {unset x}
set x 123
trace add variable x read traceError
catch {set x}
catch {set x}
trace remove variable x read traceError
} {}
# Check to see that variables are expunged before trace
# procedures are invoked, so trace procedure can even manipulate
# a new copy of the variables.
test trace-9.1 {be sure variable is unset before trace is called} {
| > > > > > > > > > > > > > > > > > > > > > > | 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 |
# when the trace is deleted.
catch {unset x}
set x 123
trace add variable x read traceError
catch {set x}
catch {set x}
trace remove variable x read traceError
} {}
test trace-8.8 {error returns from traces} {
# Yet more elaborate memory corruption testing that checks nothing
# bad happens when the trace deletes itself and installs something
# new. Alas, there is no neat way to guarantee that this test will
# fail if there is a problem, but that's life and with the new code
# it should *never* fail.
#
# Adapted from Bug #219393 reported by Don Porter.
catch {rename ::foo {}}
proc foo {old args} {
trace remove variable ::x write [list foo $old]
trace add variable ::x write [list foo $::x]
error "foo"
}
catch {unset ::x ::y}
set x junk
trace add variable ::x write [list foo $x]
for {set y 0} {$y<100} {incr y} {
catch {set x junk}
}
unset x
} {}
# Check to see that variables are expunged before trace
# procedures are invoked, so trace procedure can even manipulate
# a new copy of the variables.
test trace-9.1 {be sure variable is unset before trace is called} {
|
| ︙ | ︙ | |||
859 860 861 862 863 864 865 |
test trace-15.3 {special list-handling in trace commands} {
catch {unset "x y z"}
set "x y z(a\n\{)" 44
set info {}
trace add variable "x y z(a\n\{)" write traceProc
set "x y z(a\n\{)" 33
set info
| | | 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 |
test trace-15.3 {special list-handling in trace commands} {
catch {unset "x y z"}
set "x y z(a\n\{)" 44
set info {}
trace add variable "x y z(a\n\{)" write traceProc
set "x y z(a\n\{)" 33
set info
} "{x y z} a\\n\\\{ write"
# Check for proper handling of unsets during traces.
proc traceUnset {unsetName args} {
global info
upvar $unsetName x
lappend info [catch {unset x} msg] $msg [catch {set x} msg] $msg
|
| ︙ | ︙ |
Changes to tests/util.test.
1 2 3 4 5 6 7 8 9 | # This file is a Tcl script to test the code in the file tclUtil.c. # This file is organized in the standard fashion for Tcl tests. # # Copyright (c) 1995-1998 Sun Microsystems, Inc. # Copyright (c) 1998-1999 by Scriptics Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# This file is a Tcl script to test the code in the file tclUtil.c.
# This file is organized in the standard fashion for Tcl tests.
#
# Copyright (c) 1995-1998 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: util.test,v 1.9.4.1 2002/02/05 02:22:04 wolfsuit Exp $
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
namespace import -force ::tcltest::*
}
if {[info commands testobj] == {}} {
|
| ︙ | ︙ | |||
63 64 65 66 67 68 69 70 |
concat a { } c
} {a c}
test util-4.6 {Tcl_ConcatObj - utf-8 sequence with "whitespace" char} {
# Check for Bug #227512. If this violates C isspace, then it returns \xc3.
concat \xe0
} \xe0
test util-5.1 {Tcl_StringMatch} {
| > > > > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 |
concat a { } c
} {a c}
test util-4.6 {Tcl_ConcatObj - utf-8 sequence with "whitespace" char} {
# Check for Bug #227512. If this violates C isspace, then it returns \xc3.
concat \xe0
} \xe0
proc Wrapper_Tcl_StringMatch {pattern string} {
# Forces use of Tcl_StringMatch, not Tcl_UniCharCaseMatch
switch -glob -- $string $pattern {return 1} default {return 0}
}
test util-5.1 {Tcl_StringMatch} {
Wrapper_Tcl_StringMatch ab*c abc
} 1
test util-5.2 {Tcl_StringMatch} {
Wrapper_Tcl_StringMatch ab**c abc
} 1
test util-5.3 {Tcl_StringMatch} {
Wrapper_Tcl_StringMatch ab* abcdef
} 1
test util-5.4 {Tcl_StringMatch} {
Wrapper_Tcl_StringMatch *c abc
} 1
test util-5.5 {Tcl_StringMatch} {
Wrapper_Tcl_StringMatch *3*6*9 0123456789
} 1
test util-5.6 {Tcl_StringMatch} {
Wrapper_Tcl_StringMatch *3*6*9 01234567890
} 0
test util-5.7 {Tcl_StringMatch: UTF-8} {
Wrapper_Tcl_StringMatch *u \u4e4fu
} 1
test util-5.8 {Tcl_StringMatch} {
Wrapper_Tcl_StringMatch a?c abc
} 1
test util-5.9 {Tcl_StringMatch: UTF-8} {
# skip one character in string
Wrapper_Tcl_StringMatch a?c a\u4e4fc
} 1
test util-5.10 {Tcl_StringMatch} {
Wrapper_Tcl_StringMatch a??c abc
} 0
test util-5.11 {Tcl_StringMatch} {
Wrapper_Tcl_StringMatch ?1??4???8? 0123456789
} 1
test util-5.12 {Tcl_StringMatch} {
Wrapper_Tcl_StringMatch {[abc]bc} abc
} 1
test util-5.13 {Tcl_StringMatch: UTF-8} {
# string += Tcl_UtfToUniChar(string, &ch);
Wrapper_Tcl_StringMatch "\[\u4e4fxy\]bc" "\u4e4fbc"
} 1
test util-5.14 {Tcl_StringMatch} {
# if ((*pattern == ']') || (*pattern == '\0'))
# badly formed pattern
Wrapper_Tcl_StringMatch {[]} {[]}
} 0
test util-5.15 {Tcl_StringMatch} {
# if ((*pattern == ']') || (*pattern == '\0'))
# badly formed pattern
Wrapper_Tcl_StringMatch {[} {[}
} 0
test util-5.16 {Tcl_StringMatch} {
Wrapper_Tcl_StringMatch {a[abc]c} abc
} 1
test util-5.17 {Tcl_StringMatch: UTF-8} {
# pattern += Tcl_UtfToUniChar(pattern, &endChar);
# get 1 UTF-8 character
Wrapper_Tcl_StringMatch "a\[a\u4e4fc]c" "a\u4e4fc"
} 1
test util-5.18 {Tcl_StringMatch: UTF-8} {
# pattern += Tcl_UtfToUniChar(pattern, &endChar);
# proper advance: wrong answer would match on UTF trail byte of \u4e4f
Wrapper_Tcl_StringMatch {a[a\u4e4fc]c} [bytestring a\u008fc]
} 0
test util-5.19 {Tcl_StringMatch: UTF-8} {
# pattern += Tcl_UtfToUniChar(pattern, &endChar);
# proper advance.
Wrapper_Tcl_StringMatch {a[a\u4e4fc]c} "acc"
} 1
test util-5.20 {Tcl_StringMatch} {
Wrapper_Tcl_StringMatch {a[xyz]c} abc
} 0
test util-5.21 {Tcl_StringMatch} {
Wrapper_Tcl_StringMatch {12[2-7]45} 12345
} 1
test util-5.22 {Tcl_StringMatch: UTF-8 range} {
Wrapper_Tcl_StringMatch "\[\u4e00-\u4e4f]" "0"
} 0
test util-5.23 {Tcl_StringMatch: UTF-8 range} {
Wrapper_Tcl_StringMatch "\[\u4e00-\u4e4f]" "\u4e33"
} 1
test util-5.24 {Tcl_StringMatch: UTF-8 range} {
Wrapper_Tcl_StringMatch "\[\u4e00-\u4e4f]" "\uff08"
} 0
test util-5.25 {Tcl_StringMatch} {
Wrapper_Tcl_StringMatch {12[ab2-4cd]45} 12345
} 1
test util-5.26 {Tcl_StringMatch} {
Wrapper_Tcl_StringMatch {12[ab2-4cd]45} 12b45
} 1
test util-5.27 {Tcl_StringMatch} {
Wrapper_Tcl_StringMatch {12[ab2-4cd]45} 12d45
} 1
test util-5.28 {Tcl_StringMatch} {
Wrapper_Tcl_StringMatch {12[ab2-4cd]45} 12145
} 0
test util-5.29 {Tcl_StringMatch} {
Wrapper_Tcl_StringMatch {12[ab2-4cd]45} 12545
} 0
test util-5.30 {Tcl_StringMatch: forwards range} {
Wrapper_Tcl_StringMatch {[k-w]} "z"
} 0
test util-5.31 {Tcl_StringMatch: forwards range} {
Wrapper_Tcl_StringMatch {[k-w]} "w"
} 1
test util-5.32 {Tcl_StringMatch: forwards range} {
Wrapper_Tcl_StringMatch {[k-w]} "r"
} 1
test util-5.33 {Tcl_StringMatch: forwards range} {
Wrapper_Tcl_StringMatch {[k-w]} "k"
} 1
test util-5.34 {Tcl_StringMatch: forwards range} {
Wrapper_Tcl_StringMatch {[k-w]} "a"
} 0
test util-5.35 {Tcl_StringMatch: reverse range} {
Wrapper_Tcl_StringMatch {[w-k]} "z"
} 0
test util-5.36 {Tcl_StringMatch: reverse range} {
Wrapper_Tcl_StringMatch {[w-k]} "w"
} 1
test util-5.37 {Tcl_StringMatch: reverse range} {
Wrapper_Tcl_StringMatch {[w-k]} "r"
} 1
test util-5.38 {Tcl_StringMatch: reverse range} {
Wrapper_Tcl_StringMatch {[w-k]} "k"
} 1
test util-5.39 {Tcl_StringMatch: reverse range} {
Wrapper_Tcl_StringMatch {[w-k]} "a"
} 0
test util-5.40 {Tcl_StringMatch: skip correct number of ']'} {
Wrapper_Tcl_StringMatch {[A-]x} Ax
} 0
test util-5.41 {Tcl_StringMatch: skip correct number of ']'} {
Wrapper_Tcl_StringMatch {[A-]]x} Ax
} 1
test util-5.42 {Tcl_StringMatch: skip correct number of ']'} {
Wrapper_Tcl_StringMatch {[A-]]x} \ue1x
} 0
test util-5.43 {Tcl_StringMatch: skip correct number of ']'} {
Wrapper_Tcl_StringMatch \[A-]\ue1]x \ue1x
} 1
test util-5.44 {Tcl_StringMatch: skip correct number of ']'} {
Wrapper_Tcl_StringMatch {[A-]h]x} hx
} 1
test util-5.45 {Tcl_StringMatch} {
# if (*pattern == '\0')
# badly formed pattern, still treats as a set
Wrapper_Tcl_StringMatch {[a} a
} 1
test util-5.46 {Tcl_StringMatch} {
Wrapper_Tcl_StringMatch {a\*b} a*b
} 1
test util-5.47 {Tcl_StringMatch} {
Wrapper_Tcl_StringMatch {a\*b} ab
} 0
test util-5.48 {Tcl_StringMatch} {
Wrapper_Tcl_StringMatch {a\*\?\[\]\\\x} "a*?\[\]\\x"
} 1
test util-5.49 {Tcl_StringMatch} {
Wrapper_Tcl_StringMatch ** ""
} 1
test util-5.50 {Tcl_StringMatch} {
Wrapper_Tcl_StringMatch *. ""
} 0
test util-5.51 {Tcl_StringMatch} {
Wrapper_Tcl_StringMatch "" ""
} 1
test util-6.1 {Tcl_PrintDouble - using tcl_precision} {
concat x[expr 1.4]
} {x1.4}
test util-6.2 {Tcl_PrintDouble - using tcl_precision} {
concat x[expr 1.39999999999]
|
| ︙ | ︙ |
Changes to tests/var.test.
| ︙ | ︙ | |||
10 11 12 13 14 15 16 | # # Copyright (c) 1997 Sun Microsystems, Inc. # Copyright (c) 1998-1999 by Scriptics Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # | | | 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#
# Copyright (c) 1997 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: var.test,v 1.17.8.1 2002/02/05 02:22:04 wolfsuit Exp $
#
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
namespace import -force ::tcltest::*
}
|
| ︙ | ︙ | |||
323 324 325 326 327 328 329 330 331 332 333 334 335 336 |
set ::test_ns_var::test_ns_nested:: 24
proc p {} {
global ::test_ns_var::test_ns_nested::
set {}
}
p
} {24}
test var-7.1 {Tcl_VariableObjCmd, create and initialize one new ns variable} {
catch {namespace delete test_ns_var}
namespace eval test_ns_var {
variable one 1
}
list [info vars test_ns_var::*] [set test_ns_var::one]
| > > > > > > > > > > | 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 |
set ::test_ns_var::test_ns_nested:: 24
proc p {} {
global ::test_ns_var::test_ns_nested::
set {}
}
p
} {24}
test var-6.4 {Tcl_GlobalObjCmd, variable name matching :*} {
# Test for Tcl Bug 480176
set :v broken
proc p {} {
global :v
set :v fixed
}
p
set :v
} {fixed}
test var-7.1 {Tcl_VariableObjCmd, create and initialize one new ns variable} {
catch {namespace delete test_ns_var}
namespace eval test_ns_var {
variable one 1
}
list [info vars test_ns_var::*] [set test_ns_var::one]
|
| ︙ | ︙ |
Changes to tests/while.test.
1 2 3 4 5 6 7 8 9 10 11 12 | # Commands covered: while # # This file contains a collection of tests for one or more of the Tcl # built-in commands. Sourcing this file into Tcl runs the tests and # generates output for errors. No output means no errors were found. # # Copyright (c) 1996 Sun Microsystems, Inc. # Copyright (c) 1998-1999 by Scriptics Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # | | | | 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 34 35 36 37 38 39 40 |
# Commands covered: while
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands. Sourcing this file into Tcl runs the tests and
# generates output for errors. No output means no errors were found.
#
# Copyright (c) 1996 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: while.test,v 1.7.4.1 2002/02/05 02:22:04 wolfsuit Exp $
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
namespace import -force ::tcltest::*
}
# Basic "while" operation.
catch {unset i}
catch {unset a}
test while-1.1 {TclCompileWhileCmd: missing test expression} {
catch {while } msg
set msg
} {wrong # args: should be "while test command"}
test while-1.2 {TclCompileWhileCmd: error in test expression} {
set i 0
catch {while {$i<} break} msg
set errorInfo
} {syntax error in expression "$i<": premature end of expression
("while" test expression)
while compiling
"while {$i<} break"}
test while-1.3 {TclCompileWhileCmd: error in test expression} {
set err [catch {while {"a"+"b"} {error "loop aborted"}} msg]
list $err $msg
} {1 {can't use non-numeric string as operand of "+"}}
|
| ︙ | ︙ | |||
306 307 308 309 310 311 312 |
set msg
} {wrong # args: should be "while test command"}
test while-4.3 {while (not compiled): error in test expression} {
set i 0
set z while
catch {$z {$i<} {set x 1}} msg
set errorInfo
| | | 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 |
set msg
} {wrong # args: should be "while test command"}
test while-4.3 {while (not compiled): error in test expression} {
set i 0
set z while
catch {$z {$i<} {set x 1}} msg
set errorInfo
} {syntax error in expression "$i<": premature end of expression
while executing
"$z {$i<} {set x 1}"}
test while-4.4 {while (not compiled): error in test expression} {
set z while
set err [catch {$z {"a"+"b"} {error "loop aborted"}} msg]
list $err $msg
} {1 {can't use non-numeric string as operand of "+"}}
|
| ︙ | ︙ | |||
623 624 625 626 627 628 629 |
}
append result [p]
} {00}
# cleanup
::tcltest::cleanupTests
return
| < < < < < < < < < < < < | 623 624 625 626 627 628 629 |
}
append result [p]
} {00}
# cleanup
::tcltest::cleanupTests
return
|
Changes to tests/winFCmd.test.
1 2 3 4 5 6 7 8 9 10 11 12 | # This file tests the tclWinFCmd.c file. # # This file contains a collection of tests for one or more of the Tcl # built-in commands. Sourcing this file into Tcl runs the tests and # generates output for errors. No output means no errors were found. # # Copyright (c) 1996-1997 Sun Microsystems, Inc. # Copyright (c) 1998-1999 by Scriptics Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# This file tests the tclWinFCmd.c file.
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands. Sourcing this file into Tcl runs the tests and
# generates output for errors. No output means no errors were found.
#
# Copyright (c) 1996-1997 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# RCS: @(#) $Id: winFCmd.test,v 1.14.4.1 2002/02/05 02:22:04 wolfsuit Exp $
#
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
namespace import -force ::tcltest::*
}
|
| ︙ | ︙ | |||
958 959 960 961 962 963 964 965 966 967 968 969 970 971 |
close [open td1 w]
list [catch {file attributes td1 -system 0} msg] $msg [file attributes td1 -system] [cleanup]
} {0 {} 0 {}}
test winFCmd-15.10 {SetWinFileAttributes - failing} {pcOnly cdrom} {
cleanup
catch {file attributes $cdfile -archive 1}
} {1}
# This block of code used to occur after the "return" call, so I'm
# commenting it out and assuming that this code is still under construction.
#foreach source {tef ted tnf tnd "" nul com1} {
# foreach chmodsrc {000 755} {
# foreach dest "tfn tfe tdn tdempty tdfull td1/td2 $p $p/td1 {} nul" {
# foreach chmoddst {000 755} {
| > > > | 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 |
close [open td1 w]
list [catch {file attributes td1 -system 0} msg] $msg [file attributes td1 -system] [cleanup]
} {0 {} 0 {}}
test winFCmd-15.10 {SetWinFileAttributes - failing} {pcOnly cdrom} {
cleanup
catch {file attributes $cdfile -archive 1}
} {1}
test winFCmd-16.1 {Windows file normalization} {pcOnly} {
list [file normalize c:/] [file normalize C:/]
} {C:/ C:/}
# This block of code used to occur after the "return" call, so I'm
# commenting it out and assuming that this code is still under construction.
#foreach source {tef ted tnf tnd "" nul com1} {
# foreach chmodsrc {000 755} {
# foreach dest "tfn tfe tdn tdempty tdfull td1/td2 $p $p/td1 {} nul" {
# foreach chmoddst {000 755} {
|
| ︙ | ︙ |
Changes to tools/checkLibraryDoc.tcl.
| ︙ | ︙ | |||
15 16 17 18 19 20 21 | # Note: Each list is "a best guess" approximation. If developers write # non-standard code, this script will produce erroneous results. Each # list should be carefully checked for accuracy. # # Copyright (c) 1998-1999 by Scriptics Corporation. # All rights reserved. # | | < | 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
# Note: Each list is "a best guess" approximation. If developers write
# non-standard code, this script will produce erroneous results. Each
# list should be carefully checked for accuracy.
#
# Copyright (c) 1998-1999 by Scriptics Corporation.
# All rights reserved.
#
# RCS: @(#) $Id: checkLibraryDoc.tcl,v 1.6.26.1 2002/02/05 02:22:04 wolfsuit Exp $
lappend auto_path "c:/program\ files/tclpro1.2/win32-ix86/bin"
#lappend auto_path "/home/surles/cvs/tclx8.0/tcl/unix"
if {[catch {package require Tclx}]} {
puts "error: could not load TclX. Please set TCL_LIBRARY."
exit 1
}
# A list of structs that are known to be undocumented.
set StructList {
Tcl_AsyncHandler \
Tcl_CallFrame \
Tcl_Condition \
Tcl_Encoding \
Tcl_EncodingState \
Tcl_EncodingType \
Tcl_HashEntry \
Tcl_HashSearch \
Tcl_HashTable \
Tcl_Mutex \
Tcl_Pid \
Tcl_QueuePosition \
Tcl_ResolvedVarInfo \
|
| ︙ | ︙ |
Added tools/eolFix.tcl.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
## Super aggressive EOL-fixer!
##
## Will even understand screwed up ones like CRCRLF.
## (found in bad CVS repositories, caused by spacey developers
## abusing CVS)
##
## davygrvy@pobox.com 3:41 PM 10/12/2001
##
package provide EOL-fix 1.1
namespace eval ::EOL {
variable outMode crlf
}
proc EOL::fix {filename {newfilename ""}} {
variable outMode
if {![file exist $filename]} { return }
puts "EOL Fixing: $filename"
file rename ${filename} ${filename}.o
set fhnd [open ${filename}.o r]
if {$newfilename != ""} {
set newfhnd [open ${newfilename} w]
} else {
set newfhnd [open ${filename} w]
}
fconfigure $newfhnd -translation [list auto $outMode]
seek $fhnd 0 end
set theEnd [tell $fhnd]
seek $fhnd 0 start
fconfigure $fhnd -translation binary -buffersize $theEnd
set rawFile [read $fhnd $theEnd]
close $fhnd
regsub -all {(\r)|(\r){1,2}(\n)} $rawFile "\n" rawFile
set lineList [split $rawFile \n]
foreach line $lineList {
puts $newfhnd $line
}
close $newfhnd
file delete ${filename}.o
}
proc EOL::fixall {args} {
if {[llength $args] == 0} {
puts stderr "no files to fix"
exit 1
} else {
set cmd [lreplace $args -1 -1 glob -nocomplain]
}
foreach f [eval $cmd] {
if {[file isfile $f]} {fix $f}
}
}
if {$tcl_interactive == 0 && $argc > 0} {
if {[string index [lindex $argv 0] 0] == "-"} {
switch -- [lindex $argv 0] {
-cr { set ::EOL::outMode cr }
-crlf { set ::EOL::outMode crlf }
-lf { set ::EOL::outMode lf }
default { puts stderr "improper mode switch" ; exit 1 }
}
set argv [lrange $argv 1 end]
}
eval EOL::fixall $argv
} else {
return
}
|
Changes to tools/man2help.tcl.
1 2 3 4 5 6 7 8 | # man2help.tcl -- # # This file defines procedures that work in conjunction with the # man2tcl program to generate a Windows help file from Tcl manual # entries. # # Copyright (c) 1996 by Sun Microsystems, Inc. # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# man2help.tcl --
#
# This file defines procedures that work in conjunction with the
# man2tcl program to generate a Windows help file from Tcl manual
# entries.
#
# Copyright (c) 1996 by Sun Microsystems, Inc.
#
# RCS: @(#) $Id: man2help.tcl,v 1.7.14.1 2002/02/05 02:22:04 wolfsuit Exp $
#
#
# PASS 1
#
proc generateContents {basename version files} {
|
| ︙ | ︙ | |||
95 96 97 98 99 100 101 |
#
# Arguments:
# dir - Name of the directory.
proc doDir dir {
puts "Generating man pages for $dir..."
foreach f [lsort [glob -directory $dir "*.\[13n\]"]] {
| | | 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
#
# Arguments:
# dir - Name of the directory.
proc doDir dir {
puts "Generating man pages for $dir..."
foreach f [lsort [glob -directory $dir "*.\[13n\]"]] {
doFile $f
}
}
# process command line arguments
if {$argc < 3} {
puts stderr "usage: $argv0 projectName version manFiles..."
|
| ︙ | ︙ |
Changes to tools/man2help2.tcl.
1 2 3 4 5 6 7 8 9 10 11 | # man2help2.tcl -- # # This file defines procedures that are used during the second pass of # the man page conversion. It converts the man format input to rtf # form suitable for use by the Windows help compiler. # # Copyright (c) 1996 by Sun Microsystems, Inc. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # man2help2.tcl -- # # This file defines procedures that are used during the second pass of # the man page conversion. It converts the man format input to rtf # form suitable for use by the Windows help compiler. # # Copyright (c) 1996 by Sun Microsystems, Inc. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # RCS: @(#) $Id: man2help2.tcl,v 1.6.18.1 2002/02/05 02:22:04 wolfsuit Exp $ # # Global variables used by these scripts: # # state - state variable that controls action of text proc. # # topics - array indexed by (package,section,topic) with value |
| ︙ | ︙ | |||
267 268 269 270 271 272 273 |
tab
font R
if {[llength $args] == 3} {
text "([lindex $args 2])"
}
tab
}
| > | > > | | 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 |
tab
font R
if {[llength $args] == 3} {
text "([lindex $args 2])"
}
tab
}
AS {
# next page and previous page
}
br {
lineBreak
}
BS {}
BE {}
CE {
decrNestingLevel
set state(noFill) 0
set state(breakPending) 0
newPara 0i
}
CS {
# code section
incrNestingLevel
set state(noFill) 1
newPara 0i
}
DE {
set state(noFill) 0
decrNestingLevel
|
| ︙ | ︙ | |||
506 507 508 509 510 511 512 |
set text [string range $text [expr {$index+2}] end]
}
| {
set text [string range $text [expr {$index+2}] end]
}
o {
text "\\'"
| | | 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 |
set text [string range $text [expr {$index+2}] end]
}
| {
set text [string range $text [expr {$index+2}] end]
}
o {
text "\\'"
regexp {'([^']*)'(.*)} $text all ch text
text $chars($ch)
}
default {
puts stderr "Unknown sequence: \\$c"
set text [string range $text [expr {$index+2}] end]
}
}
|
| ︙ | ︙ | |||
701 702 703 704 705 706 707 |
# name - Section name.
proc SHmacro {argList} {
global file state
set args [join $argList " "]
if {[llength $argList] < 1} {
| | | 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 |
# name - Section name.
proc SHmacro {argList} {
global file state
set args [join $argList " "]
if {[llength $argList] < 1} {
puts stderr "Bad .SH macro: .SH $args"
}
# control what the text proc does with text
switch $args {
NAME {set state(textState) NAME}
DESCRIPTION {set state(textState) INSERT}
|
| ︙ | ︙ | |||
823 824 825 826 827 828 829 |
# argList - List of arguments to the .TH macro.
proc THmacro {argList} {
global file curPkg curSect curID id_keywords state curVer
if {[llength $argList] != 5} {
set args [join $argList " "]
| | | 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 |
# argList - List of arguments to the .TH macro.
proc THmacro {argList} {
global file curPkg curSect curID id_keywords state curVer
if {[llength $argList] != 5} {
set args [join $argList " "]
puts stderr "Bad .TH macro: .TH $args"
}
incr curID
set name [lindex $argList 0] ;# Tcl_UpVar
set page [lindex $argList 1] ;# 3
set curVer [lindex $argList 2] ;# 7.4
set curPkg [lindex $argList 3] ;# Tcl
set curSect [lindex $argList 4] ;# {Tcl Library Procedures}
|
| ︙ | ︙ |
Changes to unix/Makefile.in.
1 2 3 4 5 6 7 | # # This file is a Makefile for Tcl. If it has the name "Makefile.in" # then it is a template for a Makefile; to generate the actual Makefile, # run "./configure", which is a configuration script generated by the # "autoconf" program (constructs like "@foo@" will get replaced in the # actual Makefile. # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # # This file is a Makefile for Tcl. If it has the name "Makefile.in" # then it is a template for a Makefile; to generate the actual Makefile, # run "./configure", which is a configuration script generated by the # "autoconf" program (constructs like "@foo@" will get replaced in the # actual Makefile. # # RCS: @(#) $Id: Makefile.in,v 1.83.6.3 2002/02/05 02:22:04 wolfsuit Exp $ VERSION = @TCL_VERSION@ #---------------------------------------------------------------- # Things you can change to personalize the Makefile for your own # site (you can make these changes in either Makefile.in or # Makefile, but changes to Makefile will get lost if you re-run |
| ︙ | ︙ | |||
162 163 164 165 166 167 168 169 170 171 172 |
SHELL = /bin/sh
# Tcl used to let the configure script choose which program to use
# for installing, but there are just too many different versions of
# "install" around; better to use the install-sh script that comes
# with the distribution, which is slower but guaranteed to work.
INSTALL = @srcdir@/install-sh -c
INSTALL_PROGRAM = ${INSTALL}
INSTALL_DATA = ${INSTALL} -m 644
| > > > > | < > | < > | | | 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 |
SHELL = /bin/sh
# Tcl used to let the configure script choose which program to use
# for installing, but there are just too many different versions of
# "install" around; better to use the install-sh script that comes
# with the distribution, which is slower but guaranteed to work.
INSTALL_STRIP_PROGRAM = -s
INSTALL_STRIP_LIBRARY = -S -S
INSTALL = @srcdir@/install-sh -c
INSTALL_PROGRAM = ${INSTALL}
INSTALL_LIBRARY = ${INSTALL}
INSTALL_DATA = ${INSTALL} -m 644
# TCL_EXE is the name of a tclsh executable that is available *BEFORE*
# running make for the first time. Certain build targets (make genstubs)
# need it to be available on the PATH. This executable should *NOT* be
# required just to do a normal build although it can be required to run
# make dist.
TCL_EXE = tclsh
# The symbols below provide support for dynamic loading and shared
# libraries. See configure.in for a description of what the
# symbols mean. The values of the symbols are normally set by the
# configure script. You shouldn't normally need to modify any of
# these definitions by hand.
STLIB_LD = @STLIB_LD@
SHLIB_LD = @SHLIB_LD@
SHLIB_CFLAGS = @SHLIB_CFLAGS@
SHLIB_SUFFIX = @SHLIB_SUFFIX@
#SHLIB_SUFFIX =
DLTEST_TARGETS = dlpkgs
# The following symbol is defined to "$(DLTEST_TARGETS)" if dynamic
# loading is available; this causes everything in the "dltest"
# subdirectory to be built when making "tcltest. If dynamic loading
# isn't available, configure defines this symbol to an empty string,
# in which case the shared libraries aren't built.
BUILD_DLTEST = @BUILD_DLTEST@
|
| ︙ | ︙ | |||
250 251 252 253 254 255 256 |
-DTCL_SHLIB_EXT=\"${SHLIB_SUFFIX}\"
STUB_CC_SWITCHES = ${CFLAGS} ${CFLAGS_WARNING} ${SHLIB_CFLAGS} \
-I${GENERIC_DIR} -I${SRC_DIR} \
${AC_FLAGS} ${MATH_FLAGS} ${GENERIC_FLAGS} ${PROTO_FLAGS} ${MEM_DEBUG_FLAGS} \
${COMPILE_DEBUG_FLAGS} ${ENV_FLAGS} -DTCL_SHLIB_EXT=\"${SHLIB_SUFFIX}\"
| | | 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 |
-DTCL_SHLIB_EXT=\"${SHLIB_SUFFIX}\"
STUB_CC_SWITCHES = ${CFLAGS} ${CFLAGS_WARNING} ${SHLIB_CFLAGS} \
-I${GENERIC_DIR} -I${SRC_DIR} \
${AC_FLAGS} ${MATH_FLAGS} ${GENERIC_FLAGS} ${PROTO_FLAGS} ${MEM_DEBUG_FLAGS} \
${COMPILE_DEBUG_FLAGS} ${ENV_FLAGS} -DTCL_SHLIB_EXT=\"${SHLIB_SUFFIX}\"
LIBS = @DL_LIBS@ @LIBS@ $(MATH_LIBS)
DEPEND_SWITCHES = ${CFLAGS} -I${GENERIC_DIR} -I${SRC_DIR} \
${AC_FLAGS} ${MATH_FLAGS} \
${GENERIC_FLAGS} ${PROTO_FLAGS} ${MEM_DEBUG_FLAGS} \
-DTCL_SHLIB_EXT=\"${SHLIB_SUFFIX}\"
TCLSH_OBJS = tclAppInit.o
|
| ︙ | ︙ | |||
417 418 419 420 421 422 423 |
doc:
# The following target is configured by autoconf to generate either
# a shared library or non-shared library for Tcl.
${TCL_LIB_FILE}: ${OBJS} ${STUB_LIB_FILE}
rm -f ${TCL_LIB_FILE}
@MAKE_LIB@
| > | > | 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 |
doc:
# The following target is configured by autoconf to generate either
# a shared library or non-shared library for Tcl.
${TCL_LIB_FILE}: ${OBJS} ${STUB_LIB_FILE}
rm -f ${TCL_LIB_FILE}
@MAKE_LIB@
if test "x@DL_OBJS@" = "xtclLoadAout.o"; then \
$(RANLIB) ${TCL_LIB_FILE}; \
fi
${STUB_LIB_FILE}: ${STUB_LIB_OBJS}
rm -f ${STUB_LIB_FILE}
@MAKE_STUB_LIB@
$(RANLIB) ${STUB_LIB_FILE}
# Make target which outputs the list of the .o contained in the Tcl lib
|
| ︙ | ︙ | |||
440 441 442 443 444 445 446 447 448 449 |
objs: ${OBJS}
tclsh: ${TCLSH_OBJS} ${TCL_LIB_FILE}
${CC} ${LDFLAGS} ${TCLSH_OBJS} @TCL_BUILD_LIB_SPEC@ ${LIBS} \
@TCL_LD_SEARCH_FLAGS@ -o tclsh
tcltest: ${TCLTEST_OBJS} ${TCL_LIB_FILE} ${BUILD_DLTEST}
${CC} ${LDFLAGS} ${TCLTEST_OBJS} @TCL_BUILD_LIB_SPEC@ ${LIBS} \
@TCL_LD_SEARCH_FLAGS@ -o tcltest
| > > > > > > > > < | 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 |
objs: ${OBJS}
tclsh: ${TCLSH_OBJS} ${TCL_LIB_FILE}
${CC} ${LDFLAGS} ${TCLSH_OBJS} @TCL_BUILD_LIB_SPEC@ ${LIBS} \
@TCL_LD_SEARCH_FLAGS@ -o tclsh
# Resetting the LIB_RUNTIME_DIR below is required so that
# the generated tcltest executable gets the build directory
# burned into its ld search path. This keeps tcltest from
# picking up an already installed version of the Tcl library.
tcltest: ${TCLTEST_OBJS} ${TCL_LIB_FILE} ${BUILD_DLTEST}
$(MAKE) tcltest-real LIB_RUNTIME_DIR=`pwd`
tcltest-real:
${CC} ${LDFLAGS} ${TCLTEST_OBJS} @TCL_BUILD_LIB_SPEC@ ${LIBS} \
@TCL_LD_SEARCH_FLAGS@ -o tcltest
# Note, in the target below TCL_LIBRARY needs to be set or else
# "make test" won't work in the case where the compilation directory
# isn't the same as the source directory.
# Specifying TESTFLAGS on the command line is the standard way to pass
# args to tcltest, ie:
# % make test TESTFLAGS="-verbose bps -file fileName.test"
|
| ︙ | ︙ | |||
475 476 477 478 479 480 481 482 483 484 485 486 487 488 |
# via `make shell SCRIPT=/tmp/foo.tcl`
shell: tclsh
@@LD_LIBRARY_PATH_VAR@=`pwd`:${@LD_LIBRARY_PATH_VAR@}; export @LD_LIBRARY_PATH_VAR@; \
LIBPATH=`pwd`:${LIBPATH}; export LIBPATH; \
SHLIB_PATH=`pwd`:${SHLIB_PATH}; export SHLIB_PATH; \
TCL_LIBRARY="${TCL_BUILDTIME_LIBRARY}"; export TCL_LIBRARY; \
./tclsh $(SCRIPT)
# The following target outputs the name of the top-level source directory
# for Tcl (it is used by Tk's configure script, for example). The
# .NO_PARALLEL line is needed to avoid problems under Sun's "pmake".
# Note: this target is now obsolete (use the autoconf variable
# TCL_SRC_DIR from tclConfig.sh instead).
| > > > > > > > > > | 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 |
# via `make shell SCRIPT=/tmp/foo.tcl`
shell: tclsh
@@LD_LIBRARY_PATH_VAR@=`pwd`:${@LD_LIBRARY_PATH_VAR@}; export @LD_LIBRARY_PATH_VAR@; \
LIBPATH=`pwd`:${LIBPATH}; export LIBPATH; \
SHLIB_PATH=`pwd`:${SHLIB_PATH}; export SHLIB_PATH; \
TCL_LIBRARY="${TCL_BUILDTIME_LIBRARY}"; export TCL_LIBRARY; \
./tclsh $(SCRIPT)
# This target can be used to run tclsh inside either gdb or insight
gdb: tclsh
@echo "set env LD_LIBRARY_PATH=`pwd`:${LD_LIBRARY_PATH}" > gdb.run
@echo "set env LIBPATH=`pwd`:${LIBPATH}" >> gdb.run
@echo "set env SHLIB_PATH=`pwd`:${SHLIB_PATH}" >> gdb.run
@echo "set env TCL_LIBRARY=${TCL_BUILDTIME_LIBRARY}" >> gdb.run
gdb ./tclsh --command=gdb.run
rm gdb.run
# The following target outputs the name of the top-level source directory
# for Tcl (it is used by Tk's configure script, for example). The
# .NO_PARALLEL line is needed to avoid problems under Sun's "pmake".
# Note: this target is now obsolete (use the autoconf variable
# TCL_SRC_DIR from tclConfig.sh instead).
|
| ︙ | ︙ | |||
502 503 504 505 506 507 508 | -e 's?SCCSID?RCS: @(#) ?' \ -e '/#ifdef __STDC__/,/#endif/d' -e '/TclDateerrlab:/d' \ -e '/TclDatenewstate:/d' -e '/#pragma/d' \ -e '/#include <inttypes.h>/d' -e 's/const /CONST /g' \ <y.tab.c >$(GENERIC_DIR)/tclDate.c rm y.tab.c | | | < < < < < < < | < < | < | > > | > | > | | 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 |
-e 's?SCCSID?RCS: @(#) ?' \
-e '/#ifdef __STDC__/,/#endif/d' -e '/TclDateerrlab:/d' \
-e '/TclDatenewstate:/d' -e '/#pragma/d' \
-e '/#include <inttypes.h>/d' -e 's/const /CONST /g' \
<y.tab.c >$(GENERIC_DIR)/tclDate.c
rm y.tab.c
# The following targets generate the shared libraries in dltest/ that
# are used for testing; they are included as part of the "tcltest"
# target (via the BUILD_DLTEST variable) if dynamic loading is supported
# on this platform.
dlpkgs:
cd dltest ; $(MAKE)
install: install-binaries install-libraries install-doc
install-strip:
$(MAKE) install \
INSTALL_PROGRAM="$(INSTALL_PROGRAM) ${INSTALL_STRIP_PROGRAM}" \
INSTALL_LIBRARY="$(INSTALL_LIBRARY) ${INSTALL_STRIP_LIBRARY}"
# Note: before running ranlib below, must cd to target directory because
# some ranlibs write to current directory, and this might not always be
# possible (e.g. if installing as root).
install-binaries: binaries
@for i in $(LIB_INSTALL_DIR) $(BIN_INSTALL_DIR) ; \
do \
if [ ! -d $$i ] ; then \
echo "Making directory $$i"; \
mkdir -p $$i; \
chmod 755 $$i; \
else true; \
fi; \
done;
@if test ! -x $(SRC_DIR)/install-sh; then \
chmod +x $(SRC_DIR)/install-sh; \
fi
@echo "Installing $(TCL_LIB_FILE) to $(LIB_INSTALL_DIR)/"
@$(INSTALL_LIBRARY) $(TCL_LIB_FILE) $(LIB_INSTALL_DIR)/$(TCL_LIB_FILE)
@if test "x@DL_OBJS@" = "xtclLoadAout.o"; then \
(cd $(LIB_INSTALL_DIR); $(RANLIB) $(TCL_LIB_FILE)); \
fi
@chmod 555 $(LIB_INSTALL_DIR)/$(TCL_LIB_FILE)
@if test "$(TCL_BUILD_EXP_FILE)" != ""; then \
echo "Installing $(TCL_EXP_FILE) to $(LIB_INSTALL_DIR)/"; \
$(INSTALL_DATA) $(TCL_BUILD_EXP_FILE) \
$(LIB_INSTALL_DIR)/$(TCL_EXP_FILE); \
fi
@echo "Installing tclsh as $(BIN_INSTALL_DIR)/tclsh$(VERSION)"
@$(INSTALL_PROGRAM) tclsh $(BIN_INSTALL_DIR)/tclsh$(VERSION)
@echo "Installing tclConfig.sh to $(LIB_INSTALL_DIR)/"
@$(INSTALL_DATA) tclConfig.sh $(LIB_INSTALL_DIR)/tclConfig.sh
@if test "$(TCL_STUB_LIB_FILE)" != "" ; then \
echo "Installing $(TCL_STUB_LIB_FILE) to $(LIB_INSTALL_DIR)/"; \
$(INSTALL_LIBRARY) $(STUB_LIB_FILE) \
$(LIB_INSTALL_DIR)/$(TCL_STUB_LIB_FILE); \
fi
install-libraries: libraries
@for i in $(INCLUDE_INSTALL_DIR) $(SCRIPT_INSTALL_DIR); \
do \
if [ ! -d $$i ] ; then \
|
| ︙ | ︙ | |||
668 669 670 671 672 673 674 | sed -e '/man\.macros/r man.macros' -e '/man\.macros/d' \ $$i > $(MANN_INSTALL_DIR)/$$i; \ chmod 444 $(MANN_INSTALL_DIR)/$$i; \ done; @echo "Cross-linking command (.n) docs"; @$(UNIX_DIR)/mkLinks $(MANN_INSTALL_DIR) | | | | | 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 | sed -e '/man\.macros/r man.macros' -e '/man\.macros/d' \ $$i > $(MANN_INSTALL_DIR)/$$i; \ chmod 444 $(MANN_INSTALL_DIR)/$$i; \ done; @echo "Cross-linking command (.n) docs"; @$(UNIX_DIR)/mkLinks $(MANN_INSTALL_DIR) Makefile: $(UNIX_DIR)/Makefile.in $(DLTEST_DIR)/Makefile.in $(SHELL) config.status clean: rm -f *.a *.o libtcl* core errs *~ \#* TAGS *.E a.out \ errors tclsh tcltest lib.exp cd dltest ; $(MAKE) clean distclean: clean rm -rf Makefile config.status config.cache config.log tclConfig.sh \ $(PACKAGE).* prototype cd dltest ; $(MAKE) distclean depend: makedepend -- $(DEPEND_SWITCHES) -- $(SRCS) # Test binaries. The rules for tclTestInit.o and xtTestInit.o are # complicated because they are compiled from tclAppInit.c. Can't use # the "-o" option because this doesn't work on some strange compilers |
| ︙ | ︙ | |||
1062 1063 1064 1065 1066 1067 1068 | # # Target to regenerate header files and stub files from the *.decls tables. # $(GENERIC_DIR)/tclStubInit.c: $(GENERIC_DIR)/tcl.decls \ $(GENERIC_DIR)/tclInt.decls | | < | 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 | # # Target to regenerate header files and stub files from the *.decls tables. # $(GENERIC_DIR)/tclStubInit.c: $(GENERIC_DIR)/tcl.decls \ $(GENERIC_DIR)/tclInt.decls @echo "Warning: run \"make genstubs\" to regenerate tclStubInit.c" genstubs: $(TCL_EXE) $(TOOL_DIR)/genStubs.tcl $(GENERIC_DIR) \ $(GENERIC_DIR)/tcl.decls $(GENERIC_DIR)/tclInt.decls # # Target to check that all exported functions have an entry in the stubs |
| ︙ | ︙ | |||
1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 | $(TOP_DIR)/win/tclConfig.sh.in \ $(TOP_DIR)/win/tcl.m4 $(TOP_DIR)/win/aclocal.m4 \ $(DISTDIR)/win cp -p $(TOP_DIR)/win/*.c $(TOP_DIR)/win/*.h \ $(TOP_DIR)/win/*.ico $(TOP_DIR)/win/*.rc \ $(DISTDIR)/win cp -p $(TOP_DIR)/win/*.bat $(DISTDIR)/win cp -p $(TOP_DIR)/win/makefile.* $(DISTDIR)/win cp -p $(TOP_DIR)/win/tcl.hpj.in $(DISTDIR)/win cp -p $(TOP_DIR)/win/README $(DISTDIR)/win cp -p $(TOP_DIR)/license.terms $(DISTDIR)/win mkdir $(DISTDIR)/mac cp -p $(TOP_DIR)/mac/tclMacProjects.sea.hqx \ $(TOP_DIR)/mac/*.c $(TOP_DIR)/mac/*.h $(TOP_DIR)/mac/*.r \ $(DISTDIR)/mac cp -p $(TOP_DIR)/mac/porting.notes $(TOP_DIR)/mac/README $(DISTDIR)/mac | > > | > < < > > | 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 | $(TOP_DIR)/win/tclConfig.sh.in \ $(TOP_DIR)/win/tcl.m4 $(TOP_DIR)/win/aclocal.m4 \ $(DISTDIR)/win cp -p $(TOP_DIR)/win/*.c $(TOP_DIR)/win/*.h \ $(TOP_DIR)/win/*.ico $(TOP_DIR)/win/*.rc \ $(DISTDIR)/win cp -p $(TOP_DIR)/win/*.bat $(DISTDIR)/win $(TCL_EXE) $(TOOL_DIR)/eolFix.tcl -crlf $(DISTDIR)/win/*.bat cp -p $(TOP_DIR)/win/makefile.* $(DISTDIR)/win cp -p $(TOP_DIR)/win/tcl.hpj.in $(DISTDIR)/win $(TCL_EXE) $(TOOL_DIR)/eolFix.tcl -crlf $(DISTDIR)/win/tcl.hpj.in cp -p $(TOP_DIR)/win/README $(DISTDIR)/win cp -p $(TOP_DIR)/license.terms $(DISTDIR)/win mkdir $(DISTDIR)/mac cp -p $(TOP_DIR)/mac/tclMacProjects.sea.hqx \ $(TOP_DIR)/mac/*.c $(TOP_DIR)/mac/*.h $(TOP_DIR)/mac/*.r \ $(DISTDIR)/mac cp -p $(TOP_DIR)/mac/porting.notes $(TOP_DIR)/mac/README $(DISTDIR)/mac cp -p $(TOP_DIR)/mac/*.pch $(DISTDIR)/mac cp -p $(TOP_DIR)/mac/*.doc $(TOP_DIR)/mac/*.html $(DISTDIR)/mac cp -p $(TOP_DIR)/license.terms $(DISTDIR)/mac mkdir $(DISTDIR)/unix/dltest cp -p $(UNIX_DIR)/dltest/*.c $(UNIX_DIR)/dltest/Makefile.in \ $(UNIX_DIR)/dltest/README \ $(DISTDIR)/unix/dltest mkdir $(DISTDIR)/tools cp -p $(TOP_DIR)/tools/Makefile.in $(TOP_DIR)/tools/README \ $(TOP_DIR)/tools/configure $(TOP_DIR)/tools/configure.in \ $(TOP_DIR)/tools/*.tcl $(TOP_DIR)/tools/man2tcl.c \ $(TOP_DIR)/tools/tcl.wse.in $(TOP_DIR)/tools/*.bmp \ $(TOP_DIR)/tools/tcl.hpj.in \ $(DISTDIR)/tools $(TCL_EXE) $(TOOL_DIR)/eolFix.tcl -crlf $(DISTDIR)/tools/tcl.hpj.in \ $(DISTDIR)/tools/tcl.wse.in # # The following target can only be used for non-patch releases. Use # the "allpatch" target below for patch releases. # alldist: dist |
| ︙ | ︙ |
Changes to unix/README.
1 2 3 | Tcl UNIX README --------------- | | | 1 2 3 4 5 6 7 8 9 10 11 | Tcl UNIX README --------------- RCS: @(#) $Id: README,v 1.17.8.1 2002/02/05 02:22:04 wolfsuit Exp $ This is the directory where you configure, compile, test, and install UNIX versions of Tcl. This directory also contains source files for Tcl that are specific to UNIX. Some of the files in this directory are used on the PC or Mac platform too, but they all depend on UNIX (POSIX/ANSI C) interfaces and some of them only make sense under UNIX. |
| ︙ | ︙ | |||
30 31 32 33 34 35 36 |
(a) Check for patches as described in ../README.
(b) If you have already compiled Tcl once in this directory and are now
preparing to compile again in the same directory but for a different
platform, or if you have applied patches, type "make distclean" to
discard all the configuration information computed previously.
| | < | > | < < | 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
(a) Check for patches as described in ../README.
(b) If you have already compiled Tcl once in this directory and are now
preparing to compile again in the same directory but for a different
platform, or if you have applied patches, type "make distclean" to
discard all the configuration information computed previously.
(c) If you need to reconfigure because you changed any of the .in or
.m4 files, you will need to run autoconf to create a new
./configure script. Most users will NOT need to do this since
a configure script is already provided.
(in the tcl/unix directory)
autoconf
(d) Type "./configure". This runs a configuration script created by GNU
autoconf, which configures Tcl for your system and creates a
Makefile. The configure script allows you to customize the Tcl
configuration for your site; for details on how you can do this,
type "./configure -help" or refer to the autoconf documentation (not
included here). Tcl's "configure" supports the following special
|
| ︙ | ︙ | |||
98 99 100 101 102 103 104 |
directories to do this. The installation directories are
determined by the "configure" script and may be specified with
the --prefix and --exec-prefix options to "configure". See the
Makefile for information on what directories were chosen; you
can override these choices by modifying the "prefix" and
"exec_prefix" variables in the Makefile.
| | | < < < < < < | 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
directories to do this. The installation directories are
determined by the "configure" script and may be specified with
the --prefix and --exec-prefix options to "configure". See the
Makefile for information on what directories were chosen; you
can override these choices by modifying the "prefix" and
"exec_prefix" variables in the Makefile.
(h) At this point you can play with Tcl by running "make shell"
and typing Tcl commands at the prompt.
If you have trouble compiling Tcl, see the URL noted above about working
platforms. It contains information that people have provided about changes
they had to make to compile Tcl in various environments. We're also
interested in hearing how to change the configuration setup so that Tcl
compiles on additional platforms "out of the box".
|
| ︙ | ︙ |
Changes to unix/configure.
| ︙ | ︙ | |||
9 10 11 12 13 14 15 16 17 18 19 20 21 22 | # Defaults: ac_help= ac_default_prefix=/usr/local # Any additions from configure.in: ac_help="$ac_help --enable-threads build with threads" ac_help="$ac_help --enable-64bit enable 64bit support (where applicable)" ac_help="$ac_help --enable-64bit-vis enable 64bit Sparc VIS support" ac_help="$ac_help --disable-load disallow dynamic loading and "load" command" ac_help="$ac_help | > > > | 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | # Defaults: ac_help= ac_default_prefix=/usr/local # Any additions from configure.in: ac_help="$ac_help --enable-threads build with threads" ac_help="$ac_help --enable-langinfo use nl_langinfo if possible to determine encoding at startup, otherwise use old heuristic" ac_help="$ac_help --enable-64bit enable 64bit support (where applicable)" ac_help="$ac_help --enable-64bit-vis enable 64bit Sparc VIS support" ac_help="$ac_help --disable-load disallow dynamic loading and "load" command" ac_help="$ac_help |
| ︙ | ︙ | |||
531 532 533 534 535 536 537 |
ac_n=-n ac_c= ac_t=
fi
else
ac_n= ac_c='\c' ac_t=
fi
| < > > | | 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 |
ac_n=-n ac_c= ac_t=
fi
else
ac_n= ac_c='\c' ac_t=
fi
TCL_VERSION=8.4
TCL_MAJOR_VERSION=8
TCL_MINOR_VERSION=4
TCL_PATCH_LEVEL="a4"
VERSION=${TCL_VERSION}
#------------------------------------------------------------------------
# Handle the --prefix=... option
#------------------------------------------------------------------------
if test "${prefix}" = "NONE"; then
prefix=/usr/local
fi
if test "${exec_prefix}" = "NONE"; then
exec_prefix=$prefix
fi
# libdir must be a fully qualified path and (not ${exec_prefix}/lib)
eval libdir="$libdir"
TCL_SRC_DIR=`cd $srcdir/..; pwd`
#------------------------------------------------------------------------
# Standard compiler checks
#------------------------------------------------------------------------
# If the user did not set CFLAGS, set it now to keep
# the AC_PROG_CC macro from adding "-g -O2".
if test "${CFLAGS+set}" != "set" ; then
CFLAGS=""
fi
# Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:576: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
|
| ︙ | ︙ | |||
594 595 596 597 598 599 600 | echo "$ac_t""no" 1>&6 fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | | | 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 |
echo "$ac_t""no" 1>&6
fi
if test -z "$CC"; then
# Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:606: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
|
| ︙ | ︙ | |||
645 646 647 648 649 650 651 |
if test -z "$CC"; then
case "`uname -s`" in
*win32* | *WIN32*)
# Extract the first word of "cl", so it can be a program name with args.
set dummy cl; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
| | | 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 |
if test -z "$CC"; then
case "`uname -s`" in
*win32* | *WIN32*)
# Extract the first word of "cl", so it can be a program name with args.
set dummy cl; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:657: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
|
| ︙ | ︙ | |||
677 678 679 680 681 682 683 |
;;
esac
fi
test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
| | | | | 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 |
;;
esac
fi
test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
echo "configure:689: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross
cat > conftest.$ac_ext << EOF
#line 700 "configure"
#include "confdefs.h"
main(){return(0);}
EOF
if { (eval echo configure:705: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
ac_cv_prog_cc_works=yes
# If we can't run a trivial program, we are probably using a cross compiler.
if (./conftest; exit) 2>/dev/null; then
ac_cv_prog_cc_cross=no
else
ac_cv_prog_cc_cross=yes
fi
|
| ︙ | ︙ | |||
719 720 721 722 723 724 725 |
cross_compiling=$ac_cv_prog_cc_cross
echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
if test $ac_cv_prog_cc_works = no; then
{ echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
| | | | | | 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 |
cross_compiling=$ac_cv_prog_cc_cross
echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
if test $ac_cv_prog_cc_works = no; then
{ echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
echo "configure:731: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
cross_compiling=$ac_cv_prog_cc_cross
echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
echo "configure:736: checking whether we are using GNU C" >&5
if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.c <<EOF
#ifdef __GNUC__
yes;
#endif
EOF
if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:745: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
ac_cv_prog_gcc=yes
else
ac_cv_prog_gcc=no
fi
fi
echo "$ac_t""$ac_cv_prog_gcc" 1>&6
if test $ac_cv_prog_gcc = yes; then
GCC=yes
else
GCC=
fi
ac_test_CFLAGS="${CFLAGS+set}"
ac_save_CFLAGS="$CFLAGS"
CFLAGS=
echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
echo "configure:764: checking whether ${CC-cc} accepts -g" >&5
if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
echo 'void f(){}' > conftest.c
if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
ac_cv_prog_cc_g=yes
else
|
| ︙ | ︙ | |||
786 787 788 789 790 791 792 |
CFLAGS=
fi
fi
# Extract the first word of "ranlib", so it can be a program name with args.
set dummy ranlib; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
| | | 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 |
CFLAGS=
fi
fi
# Extract the first word of "ranlib", so it can be a program name with args.
set dummy ranlib; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:798: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
if test -n "$RANLIB"; then
ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
else
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
|
| ︙ | ︙ | |||
814 815 816 817 818 819 820 | if test -n "$RANLIB"; then echo "$ac_t""$RANLIB" 1>&6 else echo "$ac_t""no" 1>&6 fi echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 | | | | | | | | | 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 |
if test -n "$RANLIB"; then
echo "$ac_t""$RANLIB" 1>&6
else
echo "$ac_t""no" 1>&6
fi
echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
echo "configure:826: checking how to run the C preprocessor" >&5
# On Suns, sometimes $CPP names a directory.
if test -n "$CPP" && test -d "$CPP"; then
CPP=
fi
if test -z "$CPP"; then
if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
# This must be in double quotes, not single quotes, because CPP may get
# substituted into the Makefile and "${CC-cc}" will confuse make.
CPP="${CC-cc} -E"
# On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp.
cat > conftest.$ac_ext <<EOF
#line 841 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:847: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
else
echo "$ac_err" >&5
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
CPP="${CC-cc} -E -traditional-cpp"
cat > conftest.$ac_ext <<EOF
#line 858 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:864: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
else
echo "$ac_err" >&5
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
CPP="${CC-cc} -nologo -E"
cat > conftest.$ac_ext <<EOF
#line 875 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:881: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
else
echo "$ac_err" >&5
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
|
| ︙ | ︙ | |||
897 898 899 900 901 902 903 | fi echo "$ac_t""$CPP" 1>&6 for ac_hdr in unistd.h limits.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 | | | | | 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 |
fi
echo "$ac_t""$CPP" 1>&6
for ac_hdr in unistd.h limits.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
echo "configure:909: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 914 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:919: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
else
echo "$ac_err" >&5
echo "configure: failed program was:" >&5
|
| ︙ | ︙ | |||
940 941 942 943 944 945 946 |
#------------------------------------------------------------------------
# Threads support
#------------------------------------------------------------------------
echo $ac_n "checking for building with threads""... $ac_c" 1>&6
| | | 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 |
#------------------------------------------------------------------------
# Threads support
#------------------------------------------------------------------------
echo $ac_n "checking for building with threads""... $ac_c" 1>&6
echo "configure:952: checking for building with threads" >&5
# Check whether --enable-threads or --disable-threads was given.
if test "${enable_threads+set}" = set; then
enableval="$enable_threads"
tcl_ok=$enableval
else
tcl_ok=no
fi
|
| ︙ | ︙ | |||
966 967 968 969 970 971 972 | EOF cat >> confdefs.h <<\EOF #define _THREAD_SAFE 1 EOF echo $ac_n "checking for pthread_mutex_init in -lpthread""... $ac_c" 1>&6 | | | | | 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 |
EOF
cat >> confdefs.h <<\EOF
#define _THREAD_SAFE 1
EOF
echo $ac_n "checking for pthread_mutex_init in -lpthread""... $ac_c" 1>&6
echo "configure:978: checking for pthread_mutex_init in -lpthread" >&5
ac_lib_var=`echo pthread'_'pthread_mutex_init | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
ac_save_LIBS="$LIBS"
LIBS="-lpthread $LIBS"
cat > conftest.$ac_ext <<EOF
#line 986 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char pthread_mutex_init();
int main() {
pthread_mutex_init()
; return 0; }
EOF
if { (eval echo configure:997: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=no"
|
| ︙ | ︙ | |||
1013 1014 1015 1016 1017 1018 1019 | if test "$tcl_ok" = "no"; then # Check a little harder for __pthread_mutex_init in the same # library, as some systems hide it there until pthread.h is # defined. We could alternatively do an AC_TRY_COMPILE with # pthread.h, but that will work with libpthread really doesn't # exist, like AIX 4.2. [Bug: 4359] echo $ac_n "checking for __pthread_mutex_init in -lpthread""... $ac_c" 1>&6 | | | | | 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 |
if test "$tcl_ok" = "no"; then
# Check a little harder for __pthread_mutex_init in the same
# library, as some systems hide it there until pthread.h is
# defined. We could alternatively do an AC_TRY_COMPILE with
# pthread.h, but that will work with libpthread really doesn't
# exist, like AIX 4.2. [Bug: 4359]
echo $ac_n "checking for __pthread_mutex_init in -lpthread""... $ac_c" 1>&6
echo "configure:1025: checking for __pthread_mutex_init in -lpthread" >&5
ac_lib_var=`echo pthread'_'__pthread_mutex_init | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
ac_save_LIBS="$LIBS"
LIBS="-lpthread $LIBS"
cat > conftest.$ac_ext <<EOF
#line 1033 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char __pthread_mutex_init();
int main() {
__pthread_mutex_init()
; return 0; }
EOF
if { (eval echo configure:1044: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=no"
|
| ︙ | ︙ | |||
1060 1061 1062 1063 1064 1065 1066 | fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthread" else echo $ac_n "checking for pthread_mutex_init in -lpthreads""... $ac_c" 1>&6 | | | | | 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 |
fi
if test "$tcl_ok" = "yes"; then
# The space is needed
THREADS_LIBS=" -lpthread"
else
echo $ac_n "checking for pthread_mutex_init in -lpthreads""... $ac_c" 1>&6
echo "configure:1072: checking for pthread_mutex_init in -lpthreads" >&5
ac_lib_var=`echo pthreads'_'pthread_mutex_init | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
ac_save_LIBS="$LIBS"
LIBS="-lpthreads $LIBS"
cat > conftest.$ac_ext <<EOF
#line 1080 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char pthread_mutex_init();
int main() {
pthread_mutex_init()
; return 0; }
EOF
if { (eval echo configure:1091: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=no"
|
| ︙ | ︙ | |||
1105 1106 1107 1108 1109 1110 1111 | fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthreads" else echo $ac_n "checking for pthread_mutex_init in -lc""... $ac_c" 1>&6 | | | | | 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 |
fi
if test "$tcl_ok" = "yes"; then
# The space is needed
THREADS_LIBS=" -lpthreads"
else
echo $ac_n "checking for pthread_mutex_init in -lc""... $ac_c" 1>&6
echo "configure:1117: checking for pthread_mutex_init in -lc" >&5
ac_lib_var=`echo c'_'pthread_mutex_init | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
ac_save_LIBS="$LIBS"
LIBS="-lc $LIBS"
cat > conftest.$ac_ext <<EOF
#line 1125 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char pthread_mutex_init();
int main() {
pthread_mutex_init()
; return 0; }
EOF
if { (eval echo configure:1136: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=no"
|
| ︙ | ︙ | |||
1146 1147 1148 1149 1150 1151 1152 | tcl_ok=yes else echo "$ac_t""no" 1>&6 tcl_ok=no fi if test "$tcl_ok" = "no"; then | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | > | | | 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 |
tcl_ok=yes
else
echo "$ac_t""no" 1>&6
tcl_ok=no
fi
if test "$tcl_ok" = "no"; then
echo $ac_n "checking for pthread_mutex_init in -lc_r""... $ac_c" 1>&6
echo "configure:1159: checking for pthread_mutex_init in -lc_r" >&5
ac_lib_var=`echo c_r'_'pthread_mutex_init | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
ac_save_LIBS="$LIBS"
LIBS="-lc_r $LIBS"
cat > conftest.$ac_ext <<EOF
#line 1167 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char pthread_mutex_init();
int main() {
pthread_mutex_init()
; return 0; }
EOF
if { (eval echo configure:1178: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"
fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
echo "$ac_t""yes" 1>&6
tcl_ok=yes
else
echo "$ac_t""no" 1>&6
tcl_ok=no
fi
if test "$tcl_ok" = "yes"; then
# The space is needed
THREADS_LIBS=" -pthread"
else
TCL_THREADS=0
echo "configure: warning: "Don t know how to find pthread lib on your system - you must disable thread support or edit the LIBS in the Makefile..."" 1>&2
fi
fi
fi
fi
# Does the pthread-implementation provide
# 'pthread_attr_setstacksize' ?
for ac_func in pthread_attr_setstacksize
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
echo "configure:1216: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 1221 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
|
| ︙ | ︙ | |||
1186 1187 1188 1189 1190 1191 1192 | choke me #else $ac_func(); #endif ; return 0; } EOF | | | 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 |
choke me
#else
$ac_func();
#endif
; return 0; }
EOF
if { (eval echo configure:1244: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_func_$ac_func=no"
|
| ︙ | ︙ | |||
1225 1226 1227 1228 1229 1230 1231 | # If we're using GCC, see if the compiler understands -pipe. If so, use it. # It makes compiling go faster. (This is only a performance feature.) #------------------------------------------------------------------------ if test -z "$no_pipe"; then if test -n "$GCC"; then echo $ac_n "checking if the compiler understands -pipe""... $ac_c" 1>&6 | | | | | 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 |
# If we're using GCC, see if the compiler understands -pipe. If so, use it.
# It makes compiling go faster. (This is only a performance feature.)
#------------------------------------------------------------------------
if test -z "$no_pipe"; then
if test -n "$GCC"; then
echo $ac_n "checking if the compiler understands -pipe""... $ac_c" 1>&6
echo "configure:1283: checking if the compiler understands -pipe" >&5
OLDCC="$CC"
CC="$CC -pipe"
cat > conftest.$ac_ext <<EOF
#line 1287 "configure"
#include "confdefs.h"
int main() {
; return 0; }
EOF
if { (eval echo configure:1294: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
echo "$ac_t""yes" 1>&6
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
CC="$OLDCC"
|
| ︙ | ︙ | |||
1259 1260 1261 1262 1263 1264 1265 | # set flags so Tcl uses alternate procedures. #-------------------------------------------------------------------- # Check if Posix compliant getcwd exists, if not we'll use getwd. for ac_func in getcwd do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 | | | | 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 |
# set flags so Tcl uses alternate procedures.
#--------------------------------------------------------------------
# Check if Posix compliant getcwd exists, if not we'll use getwd.
for ac_func in getcwd
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
echo "configure:1317: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 1322 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
|
| ︙ | ︙ | |||
1287 1288 1289 1290 1291 1292 1293 | choke me #else $ac_func(); #endif ; return 0; } EOF | | | 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 |
choke me
#else
$ac_func();
#endif
; return 0; }
EOF
if { (eval echo configure:1345: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_func_$ac_func=no"
|
| ︙ | ︙ | |||
1321 1322 1323 1324 1325 1326 1327 | # Nb: if getcwd uses popen and pwd(1) (like SunOS 4) we should really # define USEGETWD even if the posix getcwd exists. Add a test ? for ac_func in opendir strstr do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 | | | | 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 |
# Nb: if getcwd uses popen and pwd(1) (like SunOS 4) we should really
# define USEGETWD even if the posix getcwd exists. Add a test ?
for ac_func in opendir strstr
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
echo "configure:1379: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 1384 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
|
| ︙ | ︙ | |||
1349 1350 1351 1352 1353 1354 1355 | choke me #else $ac_func(); #endif ; return 0; } EOF | | | 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 |
choke me
#else
$ac_func();
#endif
; return 0; }
EOF
if { (eval echo configure:1407: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_func_$ac_func=no"
|
| ︙ | ︙ | |||
1379 1380 1381 1382 1383 1384 1385 | done for ac_func in strtol tmpnam waitpid do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 | | | | 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 |
done
for ac_func in strtol tmpnam waitpid
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
echo "configure:1437: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 1442 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
|
| ︙ | ︙ | |||
1407 1408 1409 1410 1411 1412 1413 | choke me #else $ac_func(); #endif ; return 0; } EOF | | | 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 |
choke me
#else
$ac_func();
#endif
; return 0; }
EOF
if { (eval echo configure:1465: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_func_$ac_func=no"
|
| ︙ | ︙ | |||
1434 1435 1436 1437 1438 1439 1440 |
echo "$ac_t""no" 1>&6
LIBOBJS="$LIBOBJS ${ac_func}.${ac_objext}"
fi
done
echo $ac_n "checking for strerror""... $ac_c" 1>&6
| | | | 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 |
echo "$ac_t""no" 1>&6
LIBOBJS="$LIBOBJS ${ac_func}.${ac_objext}"
fi
done
echo $ac_n "checking for strerror""... $ac_c" 1>&6
echo "configure:1492: checking for strerror" >&5
if eval "test \"`echo '$''{'ac_cv_func_strerror'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 1497 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char strerror(); below. */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
|
| ︙ | ︙ | |||
1462 1463 1464 1465 1466 1467 1468 | choke me #else strerror(); #endif ; return 0; } EOF | | | 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 |
choke me
#else
strerror();
#endif
; return 0; }
EOF
if { (eval echo configure:1520: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_strerror=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_func_strerror=no"
|
| ︙ | ︙ | |||
1486 1487 1488 1489 1490 1491 1492 | cat >> confdefs.h <<\EOF #define NO_STRERROR 1 EOF fi echo $ac_n "checking for getwd""... $ac_c" 1>&6 | | | | 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 |
cat >> confdefs.h <<\EOF
#define NO_STRERROR 1
EOF
fi
echo $ac_n "checking for getwd""... $ac_c" 1>&6
echo "configure:1544: checking for getwd" >&5
if eval "test \"`echo '$''{'ac_cv_func_getwd'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 1549 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char getwd(); below. */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
|
| ︙ | ︙ | |||
1514 1515 1516 1517 1518 1519 1520 | choke me #else getwd(); #endif ; return 0; } EOF | | | 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 |
choke me
#else
getwd();
#endif
; return 0; }
EOF
if { (eval echo configure:1572: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_getwd=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_func_getwd=no"
|
| ︙ | ︙ | |||
1538 1539 1540 1541 1542 1543 1544 | cat >> confdefs.h <<\EOF #define NO_GETWD 1 EOF fi echo $ac_n "checking for wait3""... $ac_c" 1>&6 | | | | 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 |
cat >> confdefs.h <<\EOF
#define NO_GETWD 1
EOF
fi
echo $ac_n "checking for wait3""... $ac_c" 1>&6
echo "configure:1596: checking for wait3" >&5
if eval "test \"`echo '$''{'ac_cv_func_wait3'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 1601 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char wait3(); below. */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
|
| ︙ | ︙ | |||
1566 1567 1568 1569 1570 1571 1572 | choke me #else wait3(); #endif ; return 0; } EOF | | | 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 |
choke me
#else
wait3();
#endif
; return 0; }
EOF
if { (eval echo configure:1624: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_wait3=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_func_wait3=no"
|
| ︙ | ︙ | |||
1590 1591 1592 1593 1594 1595 1596 | cat >> confdefs.h <<\EOF #define NO_WAIT3 1 EOF fi echo $ac_n "checking for uname""... $ac_c" 1>&6 | | | | 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 |
cat >> confdefs.h <<\EOF
#define NO_WAIT3 1
EOF
fi
echo $ac_n "checking for uname""... $ac_c" 1>&6
echo "configure:1648: checking for uname" >&5
if eval "test \"`echo '$''{'ac_cv_func_uname'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 1653 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char uname(); below. */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
|
| ︙ | ︙ | |||
1618 1619 1620 1621 1622 1623 1624 | choke me #else uname(); #endif ; return 0; } EOF | | | 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 |
choke me
#else
uname();
#endif
; return 0; }
EOF
if { (eval echo configure:1676: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_uname=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_func_uname=no"
|
| ︙ | ︙ | |||
1642 1643 1644 1645 1646 1647 1648 | cat >> confdefs.h <<\EOF #define NO_UNAME 1 EOF fi echo $ac_n "checking for realpath""... $ac_c" 1>&6 | | | | 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 |
cat >> confdefs.h <<\EOF
#define NO_UNAME 1
EOF
fi
echo $ac_n "checking for realpath""... $ac_c" 1>&6
echo "configure:1700: checking for realpath" >&5
if eval "test \"`echo '$''{'ac_cv_func_realpath'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 1705 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char realpath(); below. */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
|
| ︙ | ︙ | |||
1670 1671 1672 1673 1674 1675 1676 | choke me #else realpath(); #endif ; return 0; } EOF | | | 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 |
choke me
#else
realpath();
#endif
; return 0; }
EOF
if { (eval echo configure:1728: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_realpath=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_func_realpath=no"
|
| ︙ | ︙ | |||
1706 1707 1708 1709 1710 1711 1712 |
# - some versions of string.h don't declare procedures such
# as strstr
#--------------------------------------------------------------------
echo $ac_n "checking dirent.h""... $ac_c" 1>&6
| | | | 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 |
# - some versions of string.h don't declare procedures such
# as strstr
#--------------------------------------------------------------------
echo $ac_n "checking dirent.h""... $ac_c" 1>&6
echo "configure:1764: checking dirent.h" >&5
cat > conftest.$ac_ext <<EOF
#line 1766 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <dirent.h>
int main() {
#ifndef _POSIX_SOURCE
# ifdef __Lynx__
|
| ︙ | ︙ | |||
1734 1735 1736 1737 1738 1739 1740 |
d = opendir("foobar");
entryPtr = readdir(d);
p = entryPtr->d_name;
closedir(d);
; return 0; }
EOF
| | | | | | 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 |
d = opendir("foobar");
entryPtr = readdir(d);
p = entryPtr->d_name;
closedir(d);
; return 0; }
EOF
if { (eval echo configure:1792: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
tcl_ok=yes
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
tcl_ok=no
fi
rm -f conftest*
if test $tcl_ok = no; then
cat >> confdefs.h <<\EOF
#define NO_DIRENT_H 1
EOF
fi
echo "$ac_t""$tcl_ok" 1>&6
ac_safe=`echo "errno.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for errno.h""... $ac_c" 1>&6
echo "configure:1813: checking for errno.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 1818 "configure"
#include "confdefs.h"
#include <errno.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1823: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
else
echo "$ac_err" >&5
echo "configure: failed program was:" >&5
|
| ︙ | ︙ | |||
1792 1793 1794 1795 1796 1797 1798 |
#define NO_ERRNO_H 1
EOF
fi
ac_safe=`echo "float.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for float.h""... $ac_c" 1>&6
| | | | | 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 |
#define NO_ERRNO_H 1
EOF
fi
ac_safe=`echo "float.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for float.h""... $ac_c" 1>&6
echo "configure:1850: checking for float.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 1855 "configure"
#include "confdefs.h"
#include <float.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1860: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
else
echo "$ac_err" >&5
echo "configure: failed program was:" >&5
|
| ︙ | ︙ | |||
1829 1830 1831 1832 1833 1834 1835 |
#define NO_FLOAT_H 1
EOF
fi
ac_safe=`echo "values.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for values.h""... $ac_c" 1>&6
| | | | | 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 |
#define NO_FLOAT_H 1
EOF
fi
ac_safe=`echo "values.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for values.h""... $ac_c" 1>&6
echo "configure:1887: checking for values.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 1892 "configure"
#include "confdefs.h"
#include <values.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1897: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
else
echo "$ac_err" >&5
echo "configure: failed program was:" >&5
|
| ︙ | ︙ | |||
1866 1867 1868 1869 1870 1871 1872 |
#define NO_VALUES_H 1
EOF
fi
ac_safe=`echo "limits.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for limits.h""... $ac_c" 1>&6
| | | | | 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 |
#define NO_VALUES_H 1
EOF
fi
ac_safe=`echo "limits.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for limits.h""... $ac_c" 1>&6
echo "configure:1924: checking for limits.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 1929 "configure"
#include "confdefs.h"
#include <limits.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1934: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
else
echo "$ac_err" >&5
echo "configure: failed program was:" >&5
|
| ︙ | ︙ | |||
1903 1904 1905 1906 1907 1908 1909 |
#define NO_LIMITS_H 1
EOF
fi
ac_safe=`echo "stdlib.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for stdlib.h""... $ac_c" 1>&6
| | | | | 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 |
#define NO_LIMITS_H 1
EOF
fi
ac_safe=`echo "stdlib.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for stdlib.h""... $ac_c" 1>&6
echo "configure:1961: checking for stdlib.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 1966 "configure"
#include "confdefs.h"
#include <stdlib.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1971: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
else
echo "$ac_err" >&5
echo "configure: failed program was:" >&5
|
| ︙ | ︙ | |||
1936 1937 1938 1939 1940 1941 1942 |
tcl_ok=1
else
echo "$ac_t""no" 1>&6
tcl_ok=0
fi
cat > conftest.$ac_ext <<EOF
| | | | | | | | 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 |
tcl_ok=1
else
echo "$ac_t""no" 1>&6
tcl_ok=0
fi
cat > conftest.$ac_ext <<EOF
#line 1994 "configure"
#include "confdefs.h"
#include <stdlib.h>
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
egrep "strtol" >/dev/null 2>&1; then
:
else
rm -rf conftest*
tcl_ok=0
fi
rm -f conftest*
cat > conftest.$ac_ext <<EOF
#line 2008 "configure"
#include "confdefs.h"
#include <stdlib.h>
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
egrep "strtoul" >/dev/null 2>&1; then
:
else
rm -rf conftest*
tcl_ok=0
fi
rm -f conftest*
cat > conftest.$ac_ext <<EOF
#line 2022 "configure"
#include "confdefs.h"
#include <stdlib.h>
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
egrep "strtod" >/dev/null 2>&1; then
:
else
rm -rf conftest*
tcl_ok=0
fi
rm -f conftest*
if test $tcl_ok = 0; then
cat >> confdefs.h <<\EOF
#define NO_STDLIB_H 1
EOF
fi
ac_safe=`echo "string.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for string.h""... $ac_c" 1>&6
echo "configure:2043: checking for string.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 2048 "configure"
#include "confdefs.h"
#include <string.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:2053: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
else
echo "$ac_err" >&5
echo "configure: failed program was:" >&5
|
| ︙ | ︙ | |||
2018 2019 2020 2021 2022 2023 2024 |
tcl_ok=1
else
echo "$ac_t""no" 1>&6
tcl_ok=0
fi
cat > conftest.$ac_ext <<EOF
| | | | 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 |
tcl_ok=1
else
echo "$ac_t""no" 1>&6
tcl_ok=0
fi
cat > conftest.$ac_ext <<EOF
#line 2076 "configure"
#include "confdefs.h"
#include <string.h>
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
egrep "strstr" >/dev/null 2>&1; then
:
else
rm -rf conftest*
tcl_ok=0
fi
rm -f conftest*
cat > conftest.$ac_ext <<EOF
#line 2090 "configure"
#include "confdefs.h"
#include <string.h>
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
egrep "strerror" >/dev/null 2>&1; then
:
else
|
| ︙ | ︙ | |||
2058 2059 2060 2061 2062 2063 2064 |
#define NO_STRING_H 1
EOF
fi
ac_safe=`echo "sys/wait.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for sys/wait.h""... $ac_c" 1>&6
| | | | | 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 |
#define NO_STRING_H 1
EOF
fi
ac_safe=`echo "sys/wait.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for sys/wait.h""... $ac_c" 1>&6
echo "configure:2116: checking for sys/wait.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 2121 "configure"
#include "confdefs.h"
#include <sys/wait.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:2126: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
else
echo "$ac_err" >&5
echo "configure: failed program was:" >&5
|
| ︙ | ︙ | |||
2095 2096 2097 2098 2099 2100 2101 |
#define NO_SYS_WAIT_H 1
EOF
fi
ac_safe=`echo "dlfcn.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for dlfcn.h""... $ac_c" 1>&6
| | | | | 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 |
#define NO_SYS_WAIT_H 1
EOF
fi
ac_safe=`echo "dlfcn.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for dlfcn.h""... $ac_c" 1>&6
echo "configure:2153: checking for dlfcn.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 2158 "configure"
#include "confdefs.h"
#include <dlfcn.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:2163: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
else
echo "$ac_err" >&5
echo "configure: failed program was:" >&5
|
| ︙ | ︙ | |||
2137 2138 2139 2140 2141 2142 2143 |
# OS/390 lacks sys/param.h (and doesn't need it, by chance).
for ac_hdr in unistd.h sys/param.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
| | | | | 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 |
# OS/390 lacks sys/param.h (and doesn't need it, by chance).
for ac_hdr in unistd.h sys/param.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
echo "configure:2195: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 2200 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:2205: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
else
echo "$ac_err" >&5
echo "configure: failed program was:" >&5
|
| ︙ | ︙ | |||
2184 2185 2186 2187 2188 2189 2190 |
# Determine which interface to use to talk to the serial port.
# Note that #include lines must begin in leftmost column for
# some compilers to recognize them as preprocessor directives.
#---------------------------------------------------------------------------
echo $ac_n "checking termios vs. termio vs. sgtty""... $ac_c" 1>&6
| | | | | 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 |
# Determine which interface to use to talk to the serial port.
# Note that #include lines must begin in leftmost column for
# some compilers to recognize them as preprocessor directives.
#---------------------------------------------------------------------------
echo $ac_n "checking termios vs. termio vs. sgtty""... $ac_c" 1>&6
echo "configure:2242: checking termios vs. termio vs. sgtty" >&5
if test "$cross_compiling" = yes; then
tk_ok=no
else
cat > conftest.$ac_ext <<EOF
#line 2248 "configure"
#include "confdefs.h"
#include <termios.h>
main()
{
struct termios t;
if (tcgetattr(0, &t) == 0) {
cfsetospeed(&t, 0);
t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB;
return 0;
}
return 1;
}
EOF
if { (eval echo configure:2264: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
tk_ok=termios
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -fr conftest*
tk_ok=no
|
| ︙ | ︙ | |||
2229 2230 2231 2232 2233 2234 2235 |
EOF
else
if test "$cross_compiling" = yes; then
tk_ok=no
else
cat > conftest.$ac_ext <<EOF
| | | | 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 |
EOF
else
if test "$cross_compiling" = yes; then
tk_ok=no
else
cat > conftest.$ac_ext <<EOF
#line 2287 "configure"
#include "confdefs.h"
#include <termio.h>
main()
{
struct termio t;
if (ioctl(0, TCGETA, &t) == 0) {
t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB;
return 0;
}
return 1;
}
EOF
if { (eval echo configure:2302: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
tk_ok=termio
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -fr conftest*
tk_ok=no
|
| ︙ | ︙ | |||
2267 2268 2269 2270 2271 2272 2273 |
EOF
else
if test "$cross_compiling" = yes; then
tk_ok=none
else
cat > conftest.$ac_ext <<EOF
| | | | 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 |
EOF
else
if test "$cross_compiling" = yes; then
tk_ok=none
else
cat > conftest.$ac_ext <<EOF
#line 2325 "configure"
#include "confdefs.h"
#include <sgtty.h>
main()
{
struct sgttyb t;
if (ioctl(0, TIOCGETP, &t) == 0) {
t.sg_ospeed = 0;
t.sg_flags |= ODDP | EVENP | RAW;
return 0;
}
return 1;
}
EOF
if { (eval echo configure:2341: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
tk_ok=sgtty
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -fr conftest*
tk_ok=none
|
| ︙ | ︙ | |||
2306 2307 2308 2309 2310 2311 2312 |
EOF
else
if test "$cross_compiling" = yes; then
tk_ok=no
else
cat > conftest.$ac_ext <<EOF
| | | | 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 |
EOF
else
if test "$cross_compiling" = yes; then
tk_ok=no
else
cat > conftest.$ac_ext <<EOF
#line 2364 "configure"
#include "confdefs.h"
#include <termios.h>
#include <errno.h>
main()
{
struct termios t;
if (tcgetattr(0, &t) == 0
|| errno == ENOTTY || errno == ENXIO || errno == EINVAL) {
cfsetospeed(&t, 0);
t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB;
return 0;
}
return 1;
}
EOF
if { (eval echo configure:2382: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
tk_ok=termios
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -fr conftest*
tk_ok=no
|
| ︙ | ︙ | |||
2347 2348 2349 2350 2351 2352 2353 |
EOF
else
if test "$cross_compiling" = yes; then
tk_ok=no
else
cat > conftest.$ac_ext <<EOF
| | | | 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 |
EOF
else
if test "$cross_compiling" = yes; then
tk_ok=no
else
cat > conftest.$ac_ext <<EOF
#line 2405 "configure"
#include "confdefs.h"
#include <termio.h>
#include <errno.h>
main()
{
struct termio t;
if (ioctl(0, TCGETA, &t) == 0
|| errno == ENOTTY || errno == ENXIO || errno == EINVAL) {
t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB;
return 0;
}
return 1;
}
EOF
if { (eval echo configure:2422: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
tk_ok=termio
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -fr conftest*
tk_ok=no
|
| ︙ | ︙ | |||
2387 2388 2389 2390 2391 2392 2393 |
EOF
else
if test "$cross_compiling" = yes; then
tk_ok=none
else
cat > conftest.$ac_ext <<EOF
| | | | 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 |
EOF
else
if test "$cross_compiling" = yes; then
tk_ok=none
else
cat > conftest.$ac_ext <<EOF
#line 2445 "configure"
#include "confdefs.h"
#include <sgtty.h>
#include <errno.h>
main()
{
struct sgttyb t;
if (ioctl(0, TIOCGETP, &t) == 0
|| errno == ENOTTY || errno == ENXIO || errno == EINVAL) {
t.sg_ospeed = 0;
t.sg_flags |= ODDP | EVENP | RAW;
return 0;
}
return 1;
}
EOF
if { (eval echo configure:2463: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
tk_ok=sgtty
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -fr conftest*
tk_ok=none
|
| ︙ | ︙ | |||
2443 2444 2445 2446 2447 2448 2449 | # systems like OSF/1 have a sys/select.h that's of no use, and # other systems like SCO UNIX have a sys/select.h that's # pernicious. If "fd_set" isn't defined anywhere then set a # special flag. #-------------------------------------------------------------------- echo $ac_n "checking fd_set and sys/select""... $ac_c" 1>&6 | | | | | | 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 |
# systems like OSF/1 have a sys/select.h that's of no use, and
# other systems like SCO UNIX have a sys/select.h that's
# pernicious. If "fd_set" isn't defined anywhere then set a
# special flag.
#--------------------------------------------------------------------
echo $ac_n "checking fd_set and sys/select""... $ac_c" 1>&6
echo "configure:2501: checking fd_set and sys/select" >&5
cat > conftest.$ac_ext <<EOF
#line 2503 "configure"
#include "confdefs.h"
#include <sys/types.h>
int main() {
fd_set readMask, writeMask;
; return 0; }
EOF
if { (eval echo configure:2510: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
tk_ok=yes
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
tk_ok=no
fi
rm -f conftest*
if test $tk_ok = no; then
cat > conftest.$ac_ext <<EOF
#line 2522 "configure"
#include "confdefs.h"
#include <sys/select.h>
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
egrep "fd_mask" >/dev/null 2>&1; then
rm -rf conftest*
tk_ok=yes
|
| ︙ | ︙ | |||
2495 2496 2497 2498 2499 2500 2501 | fi #------------------------------------------------------------------------------ # Find out all about time handling differences. #------------------------------------------------------------------------------ echo $ac_n "checking whether struct tm is in sys/time.h or time.h""... $ac_c" 1>&6 | | | | | 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 |
fi
#------------------------------------------------------------------------------
# Find out all about time handling differences.
#------------------------------------------------------------------------------
echo $ac_n "checking whether struct tm is in sys/time.h or time.h""... $ac_c" 1>&6
echo "configure:2553: checking whether struct tm is in sys/time.h or time.h" >&5
if eval "test \"`echo '$''{'ac_cv_struct_tm'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 2558 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <time.h>
int main() {
struct tm *tp; tp->tm_sec;
; return 0; }
EOF
if { (eval echo configure:2566: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_struct_tm=time.h
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
ac_cv_struct_tm=sys/time.h
|
| ︙ | ︙ | |||
2533 2534 2535 2536 2537 2538 2539 |
fi
for ac_hdr in sys/time.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
| | | | | 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 |
fi
for ac_hdr in sys/time.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
echo "configure:2591: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 2596 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:2601: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
else
echo "$ac_err" >&5
echo "configure: failed program was:" >&5
|
| ︙ | ︙ | |||
2570 2571 2572 2573 2574 2575 2576 |
else
echo "$ac_t""no" 1>&6
fi
done
echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6
| | | | | | | | | | | 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 |
else
echo "$ac_t""no" 1>&6
fi
done
echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6
echo "configure:2628: checking whether time.h and sys/time.h may both be included" >&5
if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 2633 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <sys/time.h>
#include <time.h>
int main() {
struct tm *tp;
; return 0; }
EOF
if { (eval echo configure:2642: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_header_time=yes
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
ac_cv_header_time=no
fi
rm -f conftest*
fi
echo "$ac_t""$ac_cv_header_time" 1>&6
if test $ac_cv_header_time = yes; then
cat >> confdefs.h <<\EOF
#define TIME_WITH_SYS_TIME 1
EOF
fi
echo $ac_n "checking for tm_zone in struct tm""... $ac_c" 1>&6
echo "configure:2663: checking for tm_zone in struct tm" >&5
if eval "test \"`echo '$''{'ac_cv_struct_tm_zone'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 2668 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <$ac_cv_struct_tm>
int main() {
struct tm tm; tm.tm_zone;
; return 0; }
EOF
if { (eval echo configure:2676: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_struct_tm_zone=yes
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
ac_cv_struct_tm_zone=no
fi
rm -f conftest*
fi
echo "$ac_t""$ac_cv_struct_tm_zone" 1>&6
if test "$ac_cv_struct_tm_zone" = yes; then
cat >> confdefs.h <<\EOF
#define HAVE_TM_ZONE 1
EOF
else
echo $ac_n "checking for tzname""... $ac_c" 1>&6
echo "configure:2696: checking for tzname" >&5
if eval "test \"`echo '$''{'ac_cv_var_tzname'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 2701 "configure"
#include "confdefs.h"
#include <time.h>
#ifndef tzname /* For SGI. */
extern char *tzname[]; /* RS6000 and others reject char **tzname. */
#endif
int main() {
atoi(*tzname);
; return 0; }
EOF
if { (eval echo configure:2711: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
ac_cv_var_tzname=yes
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
ac_cv_var_tzname=no
|
| ︙ | ︙ | |||
2678 2679 2680 2681 2682 2683 2684 |
fi
fi
for ac_func in gmtime_r localtime_r
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
| | | | 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 |
fi
fi
for ac_func in gmtime_r localtime_r
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
echo "configure:2736: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 2741 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
|
| ︙ | ︙ | |||
2706 2707 2708 2709 2710 2711 2712 | choke me #else $ac_func(); #endif ; return 0; } EOF | | | 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 |
choke me
#else
$ac_func();
#endif
; return 0; }
EOF
if { (eval echo configure:2764: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_func_$ac_func=no"
|
| ︙ | ︙ | |||
2732 2733 2734 2735 2736 2737 2738 |
else
echo "$ac_t""no" 1>&6
fi
done
echo $ac_n "checking tm_tzadj in struct tm""... $ac_c" 1>&6
| | | | | | | | | | | | | | 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 |
else
echo "$ac_t""no" 1>&6
fi
done
echo $ac_n "checking tm_tzadj in struct tm""... $ac_c" 1>&6
echo "configure:2790: checking tm_tzadj in struct tm" >&5
cat > conftest.$ac_ext <<EOF
#line 2792 "configure"
#include "confdefs.h"
#include <time.h>
int main() {
struct tm tm; tm.tm_tzadj;
; return 0; }
EOF
if { (eval echo configure:2799: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
cat >> confdefs.h <<\EOF
#define HAVE_TM_TZADJ 1
EOF
echo "$ac_t""yes" 1>&6
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
echo "$ac_t""no" 1>&6
fi
rm -f conftest*
echo $ac_n "checking tm_gmtoff in struct tm""... $ac_c" 1>&6
echo "configure:2815: checking tm_gmtoff in struct tm" >&5
cat > conftest.$ac_ext <<EOF
#line 2817 "configure"
#include "confdefs.h"
#include <time.h>
int main() {
struct tm tm; tm.tm_gmtoff;
; return 0; }
EOF
if { (eval echo configure:2824: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
cat >> confdefs.h <<\EOF
#define HAVE_TM_GMTOFF 1
EOF
echo "$ac_t""yes" 1>&6
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
echo "$ac_t""no" 1>&6
fi
rm -f conftest*
#
# Its important to include time.h in this check, as some systems
# (like convex) have timezone functions, etc.
#
have_timezone=no
echo $ac_n "checking long timezone variable""... $ac_c" 1>&6
echo "configure:2845: checking long timezone variable" >&5
cat > conftest.$ac_ext <<EOF
#line 2847 "configure"
#include "confdefs.h"
#include <time.h>
int main() {
extern long timezone;
timezone += 1;
exit (0);
; return 0; }
EOF
if { (eval echo configure:2856: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
have_timezone=yes
cat >> confdefs.h <<\EOF
#define HAVE_TIMEZONE_VAR 1
EOF
echo "$ac_t""yes" 1>&6
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
echo "$ac_t""no" 1>&6
fi
rm -f conftest*
#
# On some systems (eg IRIX 6.2), timezone is a time_t and not a long.
#
if test "$have_timezone" = no; then
echo $ac_n "checking time_t timezone variable""... $ac_c" 1>&6
echo "configure:2877: checking time_t timezone variable" >&5
cat > conftest.$ac_ext <<EOF
#line 2879 "configure"
#include "confdefs.h"
#include <time.h>
int main() {
extern time_t timezone;
timezone += 1;
exit (0);
; return 0; }
EOF
if { (eval echo configure:2888: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
cat >> confdefs.h <<\EOF
#define HAVE_TIMEZONE_VAR 1
EOF
echo "$ac_t""yes" 1>&6
else
|
| ︙ | ︙ | |||
2853 2854 2855 2856 2857 2858 2859 | #-------------------------------------------------------------------- # Some systems (e.g., IRIX 4.0.5) lack the st_blksize field # in struct stat. But we might be able to use fstatfs instead. #-------------------------------------------------------------------- echo $ac_n "checking for st_blksize in struct stat""... $ac_c" 1>&6 | | | | | | | 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 |
#--------------------------------------------------------------------
# Some systems (e.g., IRIX 4.0.5) lack the st_blksize field
# in struct stat. But we might be able to use fstatfs instead.
#--------------------------------------------------------------------
echo $ac_n "checking for st_blksize in struct stat""... $ac_c" 1>&6
echo "configure:2911: checking for st_blksize in struct stat" >&5
if eval "test \"`echo '$''{'ac_cv_struct_st_blksize'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 2916 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <sys/stat.h>
int main() {
struct stat s; s.st_blksize;
; return 0; }
EOF
if { (eval echo configure:2924: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_struct_st_blksize=yes
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
ac_cv_struct_st_blksize=no
fi
rm -f conftest*
fi
echo "$ac_t""$ac_cv_struct_st_blksize" 1>&6
if test $ac_cv_struct_st_blksize = yes; then
cat >> confdefs.h <<\EOF
#define HAVE_ST_BLKSIZE 1
EOF
fi
echo $ac_n "checking for fstatfs""... $ac_c" 1>&6
echo "configure:2945: checking for fstatfs" >&5
if eval "test \"`echo '$''{'ac_cv_func_fstatfs'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 2950 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char fstatfs(); below. */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
|
| ︙ | ︙ | |||
2915 2916 2917 2918 2919 2920 2921 | choke me #else fstatfs(); #endif ; return 0; } EOF | | | 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 |
choke me
#else
fstatfs();
#endif
; return 0; }
EOF
if { (eval echo configure:2973: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_fstatfs=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_func_fstatfs=no"
|
| ︙ | ︙ | |||
2944 2945 2946 2947 2948 2949 2950 | #-------------------------------------------------------------------- # Some system have no memcmp or it does not work with 8 bit # data, this checks it and add memcmp.o to LIBOBJS if needed #-------------------------------------------------------------------- echo $ac_n "checking for 8-bit clean memcmp""... $ac_c" 1>&6 | | | | | 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 |
#--------------------------------------------------------------------
# Some system have no memcmp or it does not work with 8 bit
# data, this checks it and add memcmp.o to LIBOBJS if needed
#--------------------------------------------------------------------
echo $ac_n "checking for 8-bit clean memcmp""... $ac_c" 1>&6
echo "configure:3002: checking for 8-bit clean memcmp" >&5
if eval "test \"`echo '$''{'ac_cv_func_memcmp_clean'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
if test "$cross_compiling" = yes; then
ac_cv_func_memcmp_clean=no
else
cat > conftest.$ac_ext <<EOF
#line 3010 "configure"
#include "confdefs.h"
main()
{
char c0 = 0x40, c1 = 0x80, c2 = 0x81;
exit(memcmp(&c0, &c2, 1) < 0 && memcmp(&c1, &c2, 1) < 0 ? 0 : 1);
}
EOF
if { (eval echo configure:3020: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
ac_cv_func_memcmp_clean=yes
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -fr conftest*
ac_cv_func_memcmp_clean=no
|
| ︙ | ︙ | |||
2986 2987 2988 2989 2990 2991 2992 |
#--------------------------------------------------------------------
# Some system like SunOS 4 and other BSD like systems
# have no memmove (we assume they have bcopy instead).
# {The replacement define is in compat/string.h}
#--------------------------------------------------------------------
echo $ac_n "checking for memmove""... $ac_c" 1>&6
| | | | 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 |
#--------------------------------------------------------------------
# Some system like SunOS 4 and other BSD like systems
# have no memmove (we assume they have bcopy instead).
# {The replacement define is in compat/string.h}
#--------------------------------------------------------------------
echo $ac_n "checking for memmove""... $ac_c" 1>&6
echo "configure:3044: checking for memmove" >&5
if eval "test \"`echo '$''{'ac_cv_func_memmove'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 3049 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char memmove(); below. */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
|
| ︙ | ︙ | |||
3014 3015 3016 3017 3018 3019 3020 | choke me #else memmove(); #endif ; return 0; } EOF | | | 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 |
choke me
#else
memmove();
#endif
; return 0; }
EOF
if { (eval echo configure:3072: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_memmove=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_func_memmove=no"
|
| ︙ | ︙ | |||
3047 3048 3049 3050 3051 3052 3053 | #-------------------------------------------------------------------- # On some systems strstr is broken: it returns a pointer even # even if the original string is empty. #-------------------------------------------------------------------- echo $ac_n "checking proper strstr implementation""... $ac_c" 1>&6 | | | | | 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 |
#--------------------------------------------------------------------
# On some systems strstr is broken: it returns a pointer even
# even if the original string is empty.
#--------------------------------------------------------------------
echo $ac_n "checking proper strstr implementation""... $ac_c" 1>&6
echo "configure:3105: checking proper strstr implementation" >&5
if test "$cross_compiling" = yes; then
tcl_ok=no
else
cat > conftest.$ac_ext <<EOF
#line 3110 "configure"
#include "confdefs.h"
extern int strstr();
int main()
{
exit(strstr("\0test", "test") ? 1 : 0);
}
EOF
if { (eval echo configure:3120: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
tcl_ok=yes
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -fr conftest*
tcl_ok=no
|
| ︙ | ︙ | |||
3088 3089 3090 3091 3092 3093 3094 | #-------------------------------------------------------------------- # Check for strtoul function. This is tricky because under some # versions of AIX strtoul returns an incorrect terminator # pointer for the string "0". #-------------------------------------------------------------------- echo $ac_n "checking for strtoul""... $ac_c" 1>&6 | | | | 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 |
#--------------------------------------------------------------------
# Check for strtoul function. This is tricky because under some
# versions of AIX strtoul returns an incorrect terminator
# pointer for the string "0".
#--------------------------------------------------------------------
echo $ac_n "checking for strtoul""... $ac_c" 1>&6
echo "configure:3146: checking for strtoul" >&5
if eval "test \"`echo '$''{'ac_cv_func_strtoul'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 3151 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char strtoul(); below. */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
|
| ︙ | ︙ | |||
3116 3117 3118 3119 3120 3121 3122 | choke me #else strtoul(); #endif ; return 0; } EOF | | | 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 |
choke me
#else
strtoul();
#endif
; return 0; }
EOF
if { (eval echo configure:3174: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_strtoul=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_func_strtoul=no"
|
| ︙ | ︙ | |||
3140 3141 3142 3143 3144 3145 3146 | tcl_ok=0 fi if test "$cross_compiling" = yes; then tcl_ok=0 else cat > conftest.$ac_ext <<EOF | | | | 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 |
tcl_ok=0
fi
if test "$cross_compiling" = yes; then
tcl_ok=0
else
cat > conftest.$ac_ext <<EOF
#line 3198 "configure"
#include "confdefs.h"
extern int strtoul();
int main()
{
char *string = "0";
char *term;
int value;
value = strtoul(string, &term, 0);
if ((value != 0) || (term != (string+1))) {
exit(1);
}
exit(0);
}
EOF
if { (eval echo configure:3214: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
:
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -fr conftest*
tcl_ok=0
|
| ︙ | ︙ | |||
3179 3180 3181 3182 3183 3184 3185 | #-------------------------------------------------------------------- # Check for the strtod function. This is tricky because in some # versions of Linux strtod mis-parses strings starting with "+". #-------------------------------------------------------------------- echo $ac_n "checking for strtod""... $ac_c" 1>&6 | | | | 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 |
#--------------------------------------------------------------------
# Check for the strtod function. This is tricky because in some
# versions of Linux strtod mis-parses strings starting with "+".
#--------------------------------------------------------------------
echo $ac_n "checking for strtod""... $ac_c" 1>&6
echo "configure:3237: checking for strtod" >&5
if eval "test \"`echo '$''{'ac_cv_func_strtod'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 3242 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char strtod(); below. */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
|
| ︙ | ︙ | |||
3207 3208 3209 3210 3211 3212 3213 | choke me #else strtod(); #endif ; return 0; } EOF | | | 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 |
choke me
#else
strtod();
#endif
; return 0; }
EOF
if { (eval echo configure:3265: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_strtod=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_func_strtod=no"
|
| ︙ | ︙ | |||
3231 3232 3233 3234 3235 3236 3237 | tcl_ok=0 fi if test "$cross_compiling" = yes; then tcl_ok=0 else cat > conftest.$ac_ext <<EOF | | | | 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 |
tcl_ok=0
fi
if test "$cross_compiling" = yes; then
tcl_ok=0
else
cat > conftest.$ac_ext <<EOF
#line 3289 "configure"
#include "confdefs.h"
extern double strtod();
int main()
{
char *string = " +69";
char *term;
double value;
value = strtod(string, &term);
if ((value != 69) || (term != (string+4))) {
exit(1);
}
exit(0);
}
EOF
if { (eval echo configure:3305: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
:
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -fr conftest*
tcl_ok=0
|
| ︙ | ︙ | |||
3273 3274 3275 3276 3277 3278 3279 |
# terminating character under some conditions. Check for this
# and if the problem exists use a substitute procedure
# "fixstrtod" that corrects the error.
#--------------------------------------------------------------------
echo $ac_n "checking for strtod""... $ac_c" 1>&6
| | | | 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 |
# terminating character under some conditions. Check for this
# and if the problem exists use a substitute procedure
# "fixstrtod" that corrects the error.
#--------------------------------------------------------------------
echo $ac_n "checking for strtod""... $ac_c" 1>&6
echo "configure:3331: checking for strtod" >&5
if eval "test \"`echo '$''{'ac_cv_func_strtod'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 3336 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char strtod(); below. */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
|
| ︙ | ︙ | |||
3301 3302 3303 3304 3305 3306 3307 | choke me #else strtod(); #endif ; return 0; } EOF | | | 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 |
choke me
#else
strtod();
#endif
; return 0; }
EOF
if { (eval echo configure:3359: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_strtod=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_func_strtod=no"
|
| ︙ | ︙ | |||
3323 3324 3325 3326 3327 3328 3329 |
else
echo "$ac_t""no" 1>&6
tcl_strtod=0
fi
if test "$tcl_strtod" = 1; then
echo $ac_n "checking for Solaris2.4/Tru64 strtod bugs""... $ac_c" 1>&6
| | | | | 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 |
else
echo "$ac_t""no" 1>&6
tcl_strtod=0
fi
if test "$tcl_strtod" = 1; then
echo $ac_n "checking for Solaris2.4/Tru64 strtod bugs""... $ac_c" 1>&6
echo "configure:3381: checking for Solaris2.4/Tru64 strtod bugs" >&5
if test "$cross_compiling" = yes; then
tcl_ok=0
else
cat > conftest.$ac_ext <<EOF
#line 3386 "configure"
#include "confdefs.h"
extern double strtod();
int main()
{
char *string = "NaN", *spaceString = " ";
char *term;
double value;
value = strtod(string, &term);
if ((term != string) && (term[-1] == 0)) {
exit(1);
}
value = strtod(spaceString, &term);
if (term == (spaceString+1)) {
exit(1);
}
exit(0);
}
EOF
if { (eval echo configure:3406: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
tcl_ok=1
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -fr conftest*
tcl_ok=0
|
| ︙ | ︙ | |||
3379 3380 3381 3382 3383 3384 3385 | #-------------------------------------------------------------------- # Check for various typedefs and provide substitutes if # they don't exist. #-------------------------------------------------------------------- echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 | | | | | | | | | 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 |
#--------------------------------------------------------------------
# Check for various typedefs and provide substitutes if
# they don't exist.
#--------------------------------------------------------------------
echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
echo "configure:3437: checking for ANSI C header files" >&5
if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 3442 "configure"
#include "confdefs.h"
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <float.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:3450: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
ac_cv_header_stdc=yes
else
echo "$ac_err" >&5
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
ac_cv_header_stdc=no
fi
rm -f conftest*
if test $ac_cv_header_stdc = yes; then
# SunOS 4.x string.h does not declare mem*, contrary to ANSI.
cat > conftest.$ac_ext <<EOF
#line 3467 "configure"
#include "confdefs.h"
#include <string.h>
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
egrep "memchr" >/dev/null 2>&1; then
:
else
rm -rf conftest*
ac_cv_header_stdc=no
fi
rm -f conftest*
fi
if test $ac_cv_header_stdc = yes; then
# ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
cat > conftest.$ac_ext <<EOF
#line 3485 "configure"
#include "confdefs.h"
#include <stdlib.h>
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
egrep "free" >/dev/null 2>&1; then
:
else
rm -rf conftest*
ac_cv_header_stdc=no
fi
rm -f conftest*
fi
if test $ac_cv_header_stdc = yes; then
# /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
if test "$cross_compiling" = yes; then
:
else
cat > conftest.$ac_ext <<EOF
#line 3506 "configure"
#include "confdefs.h"
#include <ctype.h>
#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
int main () { int i; for (i = 0; i < 256; i++)
if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
exit (0); }
EOF
if { (eval echo configure:3517: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
:
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -fr conftest*
ac_cv_header_stdc=no
|
| ︙ | ︙ | |||
3483 3484 3485 3486 3487 3488 3489 | cat >> confdefs.h <<\EOF #define STDC_HEADERS 1 EOF fi echo $ac_n "checking for mode_t""... $ac_c" 1>&6 | | | | 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 |
cat >> confdefs.h <<\EOF
#define STDC_HEADERS 1
EOF
fi
echo $ac_n "checking for mode_t""... $ac_c" 1>&6
echo "configure:3541: checking for mode_t" >&5
if eval "test \"`echo '$''{'ac_cv_type_mode_t'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 3546 "configure"
#include "confdefs.h"
#include <sys/types.h>
#if STDC_HEADERS
#include <stdlib.h>
#include <stddef.h>
#endif
EOF
|
| ︙ | ︙ | |||
3516 3517 3518 3519 3520 3521 3522 | cat >> confdefs.h <<\EOF #define mode_t int EOF fi echo $ac_n "checking for pid_t""... $ac_c" 1>&6 | | | | 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 |
cat >> confdefs.h <<\EOF
#define mode_t int
EOF
fi
echo $ac_n "checking for pid_t""... $ac_c" 1>&6
echo "configure:3574: checking for pid_t" >&5
if eval "test \"`echo '$''{'ac_cv_type_pid_t'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 3579 "configure"
#include "confdefs.h"
#include <sys/types.h>
#if STDC_HEADERS
#include <stdlib.h>
#include <stddef.h>
#endif
EOF
|
| ︙ | ︙ | |||
3549 3550 3551 3552 3553 3554 3555 | cat >> confdefs.h <<\EOF #define pid_t int EOF fi echo $ac_n "checking for size_t""... $ac_c" 1>&6 | | | | 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 |
cat >> confdefs.h <<\EOF
#define pid_t int
EOF
fi
echo $ac_n "checking for size_t""... $ac_c" 1>&6
echo "configure:3607: checking for size_t" >&5
if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 3612 "configure"
#include "confdefs.h"
#include <sys/types.h>
#if STDC_HEADERS
#include <stdlib.h>
#include <stddef.h>
#endif
EOF
|
| ︙ | ︙ | |||
3582 3583 3584 3585 3586 3587 3588 | cat >> confdefs.h <<\EOF #define size_t unsigned EOF fi echo $ac_n "checking for uid_t in sys/types.h""... $ac_c" 1>&6 | | | | 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 |
cat >> confdefs.h <<\EOF
#define size_t unsigned
EOF
fi
echo $ac_n "checking for uid_t in sys/types.h""... $ac_c" 1>&6
echo "configure:3640: checking for uid_t in sys/types.h" >&5
if eval "test \"`echo '$''{'ac_cv_type_uid_t'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 3645 "configure"
#include "confdefs.h"
#include <sys/types.h>
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
egrep "uid_t" >/dev/null 2>&1; then
rm -rf conftest*
ac_cv_type_uid_t=yes
|
| ︙ | ︙ | |||
3624 3625 3626 3627 3628 3629 3630 | # If a system doesn't have an opendir function (man, that's old!) # then we have to supply a different version of dirent.h which # is compatible with the substitute version of opendir that's # provided. This version only works with V7-style directories. #-------------------------------------------------------------------- echo $ac_n "checking for opendir""... $ac_c" 1>&6 | | | | 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 |
# If a system doesn't have an opendir function (man, that's old!)
# then we have to supply a different version of dirent.h which
# is compatible with the substitute version of opendir that's
# provided. This version only works with V7-style directories.
#--------------------------------------------------------------------
echo $ac_n "checking for opendir""... $ac_c" 1>&6
echo "configure:3682: checking for opendir" >&5
if eval "test \"`echo '$''{'ac_cv_func_opendir'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 3687 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char opendir(); below. */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
|
| ︙ | ︙ | |||
3652 3653 3654 3655 3656 3657 3658 | choke me #else opendir(); #endif ; return 0; } EOF | | | 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 |
choke me
#else
opendir();
#endif
; return 0; }
EOF
if { (eval echo configure:3710: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_opendir=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_func_opendir=no"
|
| ︙ | ︙ | |||
3685 3686 3687 3688 3689 3690 3691 | # "union wait" correctly. It's needed because of weirdness in # HP-UX where "union wait" is defined in both the BSD and SYS-V # environments. Checking the usability of WIFEXITED seems to do # the trick. #-------------------------------------------------------------------- echo $ac_n "checking union wait""... $ac_c" 1>&6 | | | | | 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 |
# "union wait" correctly. It's needed because of weirdness in
# HP-UX where "union wait" is defined in both the BSD and SYS-V
# environments. Checking the usability of WIFEXITED seems to do
# the trick.
#--------------------------------------------------------------------
echo $ac_n "checking union wait""... $ac_c" 1>&6
echo "configure:3743: checking union wait" >&5
cat > conftest.$ac_ext <<EOF
#line 3745 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <sys/wait.h>
int main() {
union wait x;
WIFEXITED(x); /* Generates compiler error if WIFEXITED
* uses an int. */
; return 0; }
EOF
if { (eval echo configure:3757: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
tcl_ok=yes
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
tcl_ok=no
|
| ︙ | ︙ | |||
3723 3724 3725 3726 3727 3728 3729 | #-------------------------------------------------------------------- # Check to see whether the system supports the matherr function # and its associated type "struct exception". #-------------------------------------------------------------------- echo $ac_n "checking matherr support""... $ac_c" 1>&6 | | | | | 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 |
#--------------------------------------------------------------------
# Check to see whether the system supports the matherr function
# and its associated type "struct exception".
#--------------------------------------------------------------------
echo $ac_n "checking matherr support""... $ac_c" 1>&6
echo "configure:3781: checking matherr support" >&5
cat > conftest.$ac_ext <<EOF
#line 3783 "configure"
#include "confdefs.h"
#include <math.h>
int main() {
struct exception x;
x.type = DOMAIN;
x.type = SING;
; return 0; }
EOF
if { (eval echo configure:3794: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
tcl_ok=yes
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
tcl_ok=no
|
| ︙ | ︙ | |||
3761 3762 3763 3764 3765 3766 3767 | #-------------------------------------------------------------------- # Check whether there is an strncasecmp function on this system. # This is a bit tricky because under SCO it's in -lsocket and # under Sequent Dynix it's in -linet. #-------------------------------------------------------------------- echo $ac_n "checking for strncasecmp""... $ac_c" 1>&6 | | | | 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 |
#--------------------------------------------------------------------
# Check whether there is an strncasecmp function on this system.
# This is a bit tricky because under SCO it's in -lsocket and
# under Sequent Dynix it's in -linet.
#--------------------------------------------------------------------
echo $ac_n "checking for strncasecmp""... $ac_c" 1>&6
echo "configure:3819: checking for strncasecmp" >&5
if eval "test \"`echo '$''{'ac_cv_func_strncasecmp'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 3824 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char strncasecmp(); below. */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
|
| ︙ | ︙ | |||
3789 3790 3791 3792 3793 3794 3795 | choke me #else strncasecmp(); #endif ; return 0; } EOF | | | 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 |
choke me
#else
strncasecmp();
#endif
; return 0; }
EOF
if { (eval echo configure:3847: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_strncasecmp=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_func_strncasecmp=no"
|
| ︙ | ︙ | |||
3811 3812 3813 3814 3815 3816 3817 |
else
echo "$ac_t""no" 1>&6
tcl_ok=0
fi
if test "$tcl_ok" = 0; then
echo $ac_n "checking for strncasecmp in -lsocket""... $ac_c" 1>&6
| | | | | 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 |
else
echo "$ac_t""no" 1>&6
tcl_ok=0
fi
if test "$tcl_ok" = 0; then
echo $ac_n "checking for strncasecmp in -lsocket""... $ac_c" 1>&6
echo "configure:3869: checking for strncasecmp in -lsocket" >&5
ac_lib_var=`echo socket'_'strncasecmp | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
ac_save_LIBS="$LIBS"
LIBS="-lsocket $LIBS"
cat > conftest.$ac_ext <<EOF
#line 3877 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char strncasecmp();
int main() {
strncasecmp()
; return 0; }
EOF
if { (eval echo configure:3888: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=no"
|
| ︙ | ︙ | |||
3854 3855 3856 3857 3858 3859 3860 |
echo "$ac_t""no" 1>&6
tcl_ok=0
fi
fi
if test "$tcl_ok" = 0; then
echo $ac_n "checking for strncasecmp in -linet""... $ac_c" 1>&6
| | | | | 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 |
echo "$ac_t""no" 1>&6
tcl_ok=0
fi
fi
if test "$tcl_ok" = 0; then
echo $ac_n "checking for strncasecmp in -linet""... $ac_c" 1>&6
echo "configure:3912: checking for strncasecmp in -linet" >&5
ac_lib_var=`echo inet'_'strncasecmp | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
ac_save_LIBS="$LIBS"
LIBS="-linet $LIBS"
cat > conftest.$ac_ext <<EOF
#line 3920 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char strncasecmp();
int main() {
strncasecmp()
; return 0; }
EOF
if { (eval echo configure:3931: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=no"
|
| ︙ | ︙ | |||
3911 3912 3913 3914 3915 3916 3917 | # but they have a BSDgettimeofday function that can be used instead. # 3. See if gettimeofday is declared in the <sys/time.h> header file. # if not, set the GETTOD_NOT_DECLARED flag so that tclPort.h can # declare it. #-------------------------------------------------------------------- echo $ac_n "checking for BSDgettimeofday""... $ac_c" 1>&6 | | | | 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 |
# but they have a BSDgettimeofday function that can be used instead.
# 3. See if gettimeofday is declared in the <sys/time.h> header file.
# if not, set the GETTOD_NOT_DECLARED flag so that tclPort.h can
# declare it.
#--------------------------------------------------------------------
echo $ac_n "checking for BSDgettimeofday""... $ac_c" 1>&6
echo "configure:3969: checking for BSDgettimeofday" >&5
if eval "test \"`echo '$''{'ac_cv_func_BSDgettimeofday'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 3974 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char BSDgettimeofday(); below. */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
|
| ︙ | ︙ | |||
3939 3940 3941 3942 3943 3944 3945 | choke me #else BSDgettimeofday(); #endif ; return 0; } EOF | | | 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 |
choke me
#else
BSDgettimeofday();
#endif
; return 0; }
EOF
if { (eval echo configure:3997: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_BSDgettimeofday=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_func_BSDgettimeofday=no"
|
| ︙ | ︙ | |||
3961 3962 3963 3964 3965 3966 3967 |
#define HAVE_BSDGETTIMEOFDAY 1
EOF
else
echo "$ac_t""no" 1>&6
echo $ac_n "checking for gettimeofday""... $ac_c" 1>&6
| | | | 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 |
#define HAVE_BSDGETTIMEOFDAY 1
EOF
else
echo "$ac_t""no" 1>&6
echo $ac_n "checking for gettimeofday""... $ac_c" 1>&6
echo "configure:4019: checking for gettimeofday" >&5
if eval "test \"`echo '$''{'ac_cv_func_gettimeofday'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 4024 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char gettimeofday(); below. */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
|
| ︙ | ︙ | |||
3989 3990 3991 3992 3993 3994 3995 | choke me #else gettimeofday(); #endif ; return 0; } EOF | | | 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 |
choke me
#else
gettimeofday();
#endif
; return 0; }
EOF
if { (eval echo configure:4047: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_gettimeofday=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_func_gettimeofday=no"
|
| ︙ | ︙ | |||
4016 4017 4018 4019 4020 4021 4022 | fi fi echo $ac_n "checking for gettimeofday declaration""... $ac_c" 1>&6 | | | | 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 | fi fi echo $ac_n "checking for gettimeofday declaration""... $ac_c" 1>&6 echo "configure:4074: checking for gettimeofday declaration" >&5 cat > conftest.$ac_ext <<EOF #line 4076 "configure" #include "confdefs.h" #include <sys/time.h> EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "gettimeofday" >/dev/null 2>&1; then rm -rf conftest* echo "$ac_t""present" 1>&6 |
| ︙ | ︙ | |||
4046 4047 4048 4049 4050 4051 4052 | #-------------------------------------------------------------------- # The following code checks to see whether it is possible to get # signed chars on this platform. This is needed in order to # properly generate sign-extended ints from character values. #-------------------------------------------------------------------- echo $ac_n "checking whether char is unsigned""... $ac_c" 1>&6 | | | | 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 |
#--------------------------------------------------------------------
# The following code checks to see whether it is possible to get
# signed chars on this platform. This is needed in order to
# properly generate sign-extended ints from character values.
#--------------------------------------------------------------------
echo $ac_n "checking whether char is unsigned""... $ac_c" 1>&6
echo "configure:4104: checking whether char is unsigned" >&5
if eval "test \"`echo '$''{'ac_cv_c_char_unsigned'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
if test "$GCC" = yes; then
# GCC predefines this symbol on systems where it applies.
cat > conftest.$ac_ext <<EOF
#line 4111 "configure"
#include "confdefs.h"
#ifdef __CHAR_UNSIGNED__
yes
#endif
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
|
| ︙ | ︙ | |||
4075 4076 4077 4078 4079 4080 4081 |
rm -f conftest*
else
if test "$cross_compiling" = yes; then
{ echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
else
cat > conftest.$ac_ext <<EOF
| | | | 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 |
rm -f conftest*
else
if test "$cross_compiling" = yes; then
{ echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
else
cat > conftest.$ac_ext <<EOF
#line 4133 "configure"
#include "confdefs.h"
/* volatile prevents gcc2 from optimizing the test away on sparcs. */
#if !defined(__STDC__) || __STDC__ != 1
#define volatile
#endif
main() {
volatile char c = 255; exit(c < 0);
}
EOF
if { (eval echo configure:4143: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
ac_cv_c_char_unsigned=yes
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -fr conftest*
ac_cv_c_char_unsigned=no
|
| ︙ | ︙ | |||
4109 4110 4111 4112 4113 4114 4115 | cat >> confdefs.h <<\EOF #define __CHAR_UNSIGNED__ 1 EOF fi echo $ac_n "checking signed char declarations""... $ac_c" 1>&6 | | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 4232 4233 4234 4235 4236 4237 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 4306 4307 4308 |
cat >> confdefs.h <<\EOF
#define __CHAR_UNSIGNED__ 1
EOF
fi
echo $ac_n "checking signed char declarations""... $ac_c" 1>&6
echo "configure:4167: checking signed char declarations" >&5
cat > conftest.$ac_ext <<EOF
#line 4169 "configure"
#include "confdefs.h"
int main() {
signed char *p;
p = 0;
; return 0; }
EOF
if { (eval echo configure:4179: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
tcl_ok=yes
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
tcl_ok=no
fi
rm -f conftest*
echo "$ac_t""$tcl_ok" 1>&6
if test $tcl_ok = yes; then
cat >> confdefs.h <<\EOF
#define HAVE_SIGNED_CHAR 1
EOF
fi
#--------------------------------------------------------------------
# Check for support of nl_langinfo function
#--------------------------------------------------------------------
# Check whether --enable-langinfo or --disable-langinfo was given.
if test "${enable_langinfo+set}" = set; then
enableval="$enable_langinfo"
langinfo_ok=$enableval
else
langinfo_ok=yes
fi
HAVE_LANGINFO=0
if test "$langinfo_ok" = "yes"; then
if test "$langinfo_ok" = "yes"; then
ac_safe=`echo "langinfo.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for langinfo.h""... $ac_c" 1>&6
echo "configure:4216: checking for langinfo.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 4221 "configure"
#include "confdefs.h"
#include <langinfo.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:4226: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
else
echo "$ac_err" >&5
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
echo "$ac_t""yes" 1>&6
langinfo_ok=yes
else
echo "$ac_t""no" 1>&6
langinfo_ok=no
fi
fi
fi
echo $ac_n "checking whether to use nl_langinfo""... $ac_c" 1>&6
echo "configure:4251: checking whether to use nl_langinfo" >&5
if test "$langinfo_ok" = "yes"; then
cat > conftest.$ac_ext <<EOF
#line 4254 "configure"
#include "confdefs.h"
#include <langinfo.h>
int main() {
nl_langinfo(CODESET);
; return 0; }
EOF
if { (eval echo configure:4261: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
langinfo_ok=yes
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
langinfo_ok=no
fi
rm -f conftest*
if test "$langinfo_ok" = "no"; then
langinfo_ok="no (could not compile with nl_langinfo)";
fi
if test "$langinfo_ok" = "yes"; then
cat >> confdefs.h <<\EOF
#define HAVE_LANGINFO 1
EOF
fi
fi
echo "$ac_t""$langinfo_ok" 1>&6
#--------------------------------------------------------------------
# Look for libraries that we will need when compiling the Tcl shell
#--------------------------------------------------------------------
#--------------------------------------------------------------------
# On a few very rare systems, all of the libm.a stuff is
# already in libc.a. Set compiler flags accordingly.
# Also, Linux requires the "ieee" library for math to work
# right (and it must appear before "-lm").
#--------------------------------------------------------------------
echo $ac_n "checking for sin""... $ac_c" 1>&6
echo "configure:4297: checking for sin" >&5
if eval "test \"`echo '$''{'ac_cv_func_sin'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 4302 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char sin(); below. */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
|
| ︙ | ︙ | |||
4180 4181 4182 4183 4184 4185 4186 | choke me #else sin(); #endif ; return 0; } EOF | | | | | | 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 |
choke me
#else
sin();
#endif
; return 0; }
EOF
if { (eval echo configure:4325: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_sin=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_func_sin=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_func_'sin`\" = yes"; then
echo "$ac_t""yes" 1>&6
MATH_LIBS=""
else
echo "$ac_t""no" 1>&6
MATH_LIBS="-lm"
fi
echo $ac_n "checking for main in -lieee""... $ac_c" 1>&6
echo "configure:4346: checking for main in -lieee" >&5
ac_lib_var=`echo ieee'_'main | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
ac_save_LIBS="$LIBS"
LIBS="-lieee $LIBS"
cat > conftest.$ac_ext <<EOF
#line 4354 "configure"
#include "confdefs.h"
int main() {
main()
; return 0; }
EOF
if { (eval echo configure:4361: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=no"
|
| ︙ | ︙ | |||
4243 4244 4245 4246 4247 4248 4249 |
#--------------------------------------------------------------------
# Interactive UNIX requires -linet instead of -lsocket, plus it
# needs net/errno.h to define the socket-related error codes.
#--------------------------------------------------------------------
echo $ac_n "checking for main in -linet""... $ac_c" 1>&6
| | | | | 4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395 4396 4397 4398 4399 4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 |
#--------------------------------------------------------------------
# Interactive UNIX requires -linet instead of -lsocket, plus it
# needs net/errno.h to define the socket-related error codes.
#--------------------------------------------------------------------
echo $ac_n "checking for main in -linet""... $ac_c" 1>&6
echo "configure:4388: checking for main in -linet" >&5
ac_lib_var=`echo inet'_'main | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
ac_save_LIBS="$LIBS"
LIBS="-linet $LIBS"
cat > conftest.$ac_ext <<EOF
#line 4396 "configure"
#include "confdefs.h"
int main() {
main()
; return 0; }
EOF
if { (eval echo configure:4403: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=no"
|
| ︙ | ︙ | |||
4280 4281 4282 4283 4284 4285 4286 |
LIBS="$LIBS -linet"
else
echo "$ac_t""no" 1>&6
fi
ac_safe=`echo "net/errno.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for net/errno.h""... $ac_c" 1>&6
| | | | | 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427 4428 4429 4430 4431 4432 4433 4434 4435 4436 4437 4438 4439 4440 4441 |
LIBS="$LIBS -linet"
else
echo "$ac_t""no" 1>&6
fi
ac_safe=`echo "net/errno.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for net/errno.h""... $ac_c" 1>&6
echo "configure:4425: checking for net/errno.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 4430 "configure"
#include "confdefs.h"
#include <net/errno.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:4435: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
else
echo "$ac_err" >&5
echo "configure: failed program was:" >&5
|
| ︙ | ︙ | |||
4335 4336 4337 4338 4339 4340 4341 |
# 4. On some SVR4 systems, can't use -lsocket without -lnsl too.
# To get around this problem, check for both libraries together
# if -lsocket doesn't work by itself.
#--------------------------------------------------------------------
tcl_checkBoth=0
echo $ac_n "checking for connect""... $ac_c" 1>&6
| | | | 4472 4473 4474 4475 4476 4477 4478 4479 4480 4481 4482 4483 4484 4485 4486 4487 4488 4489 4490 4491 |
# 4. On some SVR4 systems, can't use -lsocket without -lnsl too.
# To get around this problem, check for both libraries together
# if -lsocket doesn't work by itself.
#--------------------------------------------------------------------
tcl_checkBoth=0
echo $ac_n "checking for connect""... $ac_c" 1>&6
echo "configure:4480: checking for connect" >&5
if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 4485 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char connect(); below. */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
|
| ︙ | ︙ | |||
4363 4364 4365 4366 4367 4368 4369 | choke me #else connect(); #endif ; return 0; } EOF | | | 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 4510 4511 4512 4513 4514 |
choke me
#else
connect();
#endif
; return 0; }
EOF
if { (eval echo configure:4508: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_connect=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_func_connect=no"
|
| ︙ | ︙ | |||
4385 4386 4387 4388 4389 4390 4391 |
else
echo "$ac_t""no" 1>&6
tcl_checkSocket=1
fi
if test "$tcl_checkSocket" = 1; then
echo $ac_n "checking for setsockopt""... $ac_c" 1>&6
| | | | 4522 4523 4524 4525 4526 4527 4528 4529 4530 4531 4532 4533 4534 4535 4536 4537 4538 4539 4540 4541 |
else
echo "$ac_t""no" 1>&6
tcl_checkSocket=1
fi
if test "$tcl_checkSocket" = 1; then
echo $ac_n "checking for setsockopt""... $ac_c" 1>&6
echo "configure:4530: checking for setsockopt" >&5
if eval "test \"`echo '$''{'ac_cv_func_setsockopt'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 4535 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char setsockopt(); below. */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
|
| ︙ | ︙ | |||
4413 4414 4415 4416 4417 4418 4419 | choke me #else setsockopt(); #endif ; return 0; } EOF | | | | | | 4550 4551 4552 4553 4554 4555 4556 4557 4558 4559 4560 4561 4562 4563 4564 4565 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 4600 4601 |
choke me
#else
setsockopt();
#endif
; return 0; }
EOF
if { (eval echo configure:4558: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_setsockopt=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_func_setsockopt=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_func_'setsockopt`\" = yes"; then
echo "$ac_t""yes" 1>&6
:
else
echo "$ac_t""no" 1>&6
echo $ac_n "checking for setsockopt in -lsocket""... $ac_c" 1>&6
echo "configure:4576: checking for setsockopt in -lsocket" >&5
ac_lib_var=`echo socket'_'setsockopt | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
ac_save_LIBS="$LIBS"
LIBS="-lsocket $LIBS"
cat > conftest.$ac_ext <<EOF
#line 4584 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char setsockopt();
int main() {
setsockopt()
; return 0; }
EOF
if { (eval echo configure:4595: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=no"
|
| ︙ | ︙ | |||
4478 4479 4480 4481 4482 4483 4484 |
fi
fi
if test "$tcl_checkBoth" = 1; then
tk_oldLibs=$LIBS
LIBS="$LIBS -lsocket -lnsl"
echo $ac_n "checking for accept""... $ac_c" 1>&6
| | | | 4615 4616 4617 4618 4619 4620 4621 4622 4623 4624 4625 4626 4627 4628 4629 4630 4631 4632 4633 4634 |
fi
fi
if test "$tcl_checkBoth" = 1; then
tk_oldLibs=$LIBS
LIBS="$LIBS -lsocket -lnsl"
echo $ac_n "checking for accept""... $ac_c" 1>&6
echo "configure:4623: checking for accept" >&5
if eval "test \"`echo '$''{'ac_cv_func_accept'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 4628 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char accept(); below. */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
|
| ︙ | ︙ | |||
4506 4507 4508 4509 4510 4511 4512 | choke me #else accept(); #endif ; return 0; } EOF | | | 4643 4644 4645 4646 4647 4648 4649 4650 4651 4652 4653 4654 4655 4656 4657 |
choke me
#else
accept();
#endif
; return 0; }
EOF
if { (eval echo configure:4651: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_accept=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_func_accept=no"
|
| ︙ | ︙ | |||
4528 4529 4530 4531 4532 4533 4534 |
else
echo "$ac_t""no" 1>&6
LIBS=$tk_oldLibs
fi
fi
echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6
| | | | 4665 4666 4667 4668 4669 4670 4671 4672 4673 4674 4675 4676 4677 4678 4679 4680 4681 4682 4683 4684 |
else
echo "$ac_t""no" 1>&6
LIBS=$tk_oldLibs
fi
fi
echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6
echo "configure:4673: checking for gethostbyname" >&5
if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 4678 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char gethostbyname(); below. */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
|
| ︙ | ︙ | |||
4556 4557 4558 4559 4560 4561 4562 | choke me #else gethostbyname(); #endif ; return 0; } EOF | | | | | | 4693 4694 4695 4696 4697 4698 4699 4700 4701 4702 4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715 4716 4717 4718 4719 4720 4721 4722 4723 4724 4725 4726 4727 4728 4729 4730 4731 4732 4733 4734 4735 4736 4737 4738 4739 4740 4741 4742 4743 4744 |
choke me
#else
gethostbyname();
#endif
; return 0; }
EOF
if { (eval echo configure:4701: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_gethostbyname=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_func_gethostbyname=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_func_'gethostbyname`\" = yes"; then
echo "$ac_t""yes" 1>&6
:
else
echo "$ac_t""no" 1>&6
echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6
echo "configure:4719: checking for gethostbyname in -lnsl" >&5
ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
ac_save_LIBS="$LIBS"
LIBS="-lnsl $LIBS"
cat > conftest.$ac_ext <<EOF
#line 4727 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char gethostbyname();
int main() {
gethostbyname()
; return 0; }
EOF
if { (eval echo configure:4738: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=no"
|
| ︙ | ︙ | |||
4639 4640 4641 4642 4643 4644 4645 |
#--------------------------------------------------------------------
# Step 0.a: Enable 64 bit support?
echo $ac_n "checking if 64bit support is requested""... $ac_c" 1>&6
| | | | 4776 4777 4778 4779 4780 4781 4782 4783 4784 4785 4786 4787 4788 4789 4790 4791 4792 4793 4794 4795 4796 4797 4798 4799 4800 4801 4802 4803 4804 4805 4806 4807 4808 4809 4810 |
#--------------------------------------------------------------------
# Step 0.a: Enable 64 bit support?
echo $ac_n "checking if 64bit support is requested""... $ac_c" 1>&6
echo "configure:4784: checking if 64bit support is requested" >&5
# Check whether --enable-64bit or --disable-64bit was given.
if test "${enable_64bit+set}" = set; then
enableval="$enable_64bit"
:
else
enableval="no"
fi
if test "$enableval" = "yes"; then
do64bit=yes
else
do64bit=no
fi
echo "$ac_t""$do64bit" 1>&6
# Step 0.b: Enable Solaris 64 bit VIS support?
echo $ac_n "checking if 64bit Sparc VIS support is requested""... $ac_c" 1>&6
echo "configure:4804: checking if 64bit Sparc VIS support is requested" >&5
# Check whether --enable-64bit-vis or --disable-64bit-vis was given.
if test "${enable_64bit_vis+set}" = set; then
enableval="$enable_64bit_vis"
:
else
enableval="no"
fi
|
| ︙ | ︙ | |||
4683 4684 4685 4686 4687 4688 4689 |
echo "$ac_t""$do64bitVIS" 1>&6
# Step 1: set the variable "system" to hold the name and version number
# for the system. This can usually be done via the "uname" command, but
# there are a few systems, like Next, where this doesn't work.
echo $ac_n "checking system version (for dynamic loading)""... $ac_c" 1>&6
| | | 4820 4821 4822 4823 4824 4825 4826 4827 4828 4829 4830 4831 4832 4833 4834 |
echo "$ac_t""$do64bitVIS" 1>&6
# Step 1: set the variable "system" to hold the name and version number
# for the system. This can usually be done via the "uname" command, but
# there are a few systems, like Next, where this doesn't work.
echo $ac_n "checking system version (for dynamic loading)""... $ac_c" 1>&6
echo "configure:4828: checking system version (for dynamic loading)" >&5
if test -f /usr/lib/NextStep/software_version; then
system=NEXTSTEP-`awk '/3/,/3/' /usr/lib/NextStep/software_version`
else
system=`uname -s`-`uname -r`
if test "$?" -ne 0 ; then
echo "$ac_t""unknown (can't find uname command)" 1>&6
system=unknown
|
| ︙ | ︙ | |||
4709 4710 4711 4712 4713 4714 4715 |
fi
fi
# Step 2: check for existence of -ldl library. This is needed because
# Linux can use either -ldl or -ldld for dynamic loading.
echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6
| | | | | 4846 4847 4848 4849 4850 4851 4852 4853 4854 4855 4856 4857 4858 4859 4860 4861 4862 4863 4864 4865 4866 4867 4868 4869 4870 4871 4872 4873 4874 4875 4876 4877 4878 4879 |
fi
fi
# Step 2: check for existence of -ldl library. This is needed because
# Linux can use either -ldl or -ldld for dynamic loading.
echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6
echo "configure:4854: checking for dlopen in -ldl" >&5
ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
ac_save_LIBS="$LIBS"
LIBS="-ldl $LIBS"
cat > conftest.$ac_ext <<EOF
#line 4862 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char dlopen();
int main() {
dlopen()
; return 0; }
EOF
if { (eval echo configure:4873: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=no"
|
| ︙ | ︙ | |||
4753 4754 4755 4756 4757 4758 4759 |
have_dl=no
fi
# Step 3: set configuration options based on system name and version.
do64bit_ok=no
| < | | 4890 4891 4892 4893 4894 4895 4896 4897 4898 4899 4900 4901 4902 4903 4904 4905 4906 4907 4908 4909 4910 4911 4912 4913 4914 4915 4916 4917 4918 4919 4920 4921 4922 4923 |
have_dl=no
fi
# Step 3: set configuration options based on system name and version.
do64bit_ok=no
EXTRA_CFLAGS=""
TCL_EXPORT_FILE_SUFFIX=""
UNSHARED_LIB_SUFFIX=""
TCL_TRIM_DOTS='`echo ${VERSION} | tr -d .`'
ECHO_VERSION='`echo ${VERSION}`'
TCL_LIB_VERSIONS_OK=ok
CFLAGS_DEBUG=-g
CFLAGS_OPTIMIZE=-O
if test "$GCC" = "yes" ; then
CFLAGS_WARNING="-Wall -Wconversion -Wno-implicit-int"
else
CFLAGS_WARNING=""
fi
TCL_NEEDS_EXP_FILE=0
TCL_BUILD_EXP_FILE=""
TCL_EXP_FILE=""
# Extract the first word of "ar", so it can be a program name with args.
set dummy ar; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:4917: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
if test -n "$AR"; then
ac_cv_prog_AR="$AR" # Let the user override the test.
else
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
|
| ︙ | ︙ | |||
4811 4812 4813 4814 4815 4816 4817 4818 4819 4820 4821 4822 4823 4824 |
if test "${TCL_THREADS}" = "1" -a "$GCC" != "yes" ; then
# AIX requires the _r compiler when gcc isn't being used
if test "${CC}" != "cc_r" ; then
CC=${CC}_r
fi
echo "$ac_t""Using $CC for compiling with threads" 1>&6
fi
# AIX-5 uses ELF style dynamic libraries
SHLIB_CFLAGS=""
SHLIB_LD="/usr/ccs/bin/ld -G -z text"
# Note: need the LIBS below, otherwise Tk won't find Tcl's
# symbols when dynamically loaded into tclsh.
| > | 4947 4948 4949 4950 4951 4952 4953 4954 4955 4956 4957 4958 4959 4960 4961 |
if test "${TCL_THREADS}" = "1" -a "$GCC" != "yes" ; then
# AIX requires the _r compiler when gcc isn't being used
if test "${CC}" != "cc_r" ; then
CC=${CC}_r
fi
echo "$ac_t""Using $CC for compiling with threads" 1>&6
fi
LIBS="$LIBS -lc"
# AIX-5 uses ELF style dynamic libraries
SHLIB_CFLAGS=""
SHLIB_LD="/usr/ccs/bin/ld -G -z text"
# Note: need the LIBS below, otherwise Tk won't find Tcl's
# symbols when dynamically loaded into tclsh.
|
| ︙ | ︙ | |||
4848 4849 4850 4851 4852 4853 4854 4855 |
if test "${TCL_THREADS}" = "1" -a "$GCC" != "yes" ; then
# AIX requires the _r compiler when gcc isn't being used
if test "${CC}" != "cc_r" ; then
CC=${CC}_r
fi
echo "$ac_t""Using $CC for compiling with threads" 1>&6
fi
SHLIB_CFLAGS=""
| > | | 4985 4986 4987 4988 4989 4990 4991 4992 4993 4994 4995 4996 4997 4998 4999 5000 5001 |
if test "${TCL_THREADS}" = "1" -a "$GCC" != "yes" ; then
# AIX requires the _r compiler when gcc isn't being used
if test "${CC}" != "cc_r" ; then
CC=${CC}_r
fi
echo "$ac_t""Using $CC for compiling with threads" 1>&6
fi
LIBS="$LIBS -lc"
SHLIB_CFLAGS=""
SHLIB_LD="${TCL_SRC_DIR}/unix/ldAix /bin/ld -bhalt:4 -bM:SRE -bE:lib.exp -H512 -T512 -bnoentry"
SHLIB_LD_LIBS='${LIBS}'
SHLIB_SUFFIX=".so"
DL_OBJS="tclLoadDl.o"
DL_LIBS="-ldl"
LDFLAGS=""
LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}'
TCL_NEEDS_EXP_FILE=1
|
| ︙ | ︙ | |||
4878 4879 4880 4881 4882 4883 4884 | # AIX does not have a timezone field in struct tm. When the AIX # bsd library is used, the timezone global and the gettimeofday # methods are to be avoided for timezone deduction instead, we # deduce the timezone by comparing the localtime result on a # known GMT value. echo $ac_n "checking for gettimeofday in -lbsd""... $ac_c" 1>&6 | | | | | 5016 5017 5018 5019 5020 5021 5022 5023 5024 5025 5026 5027 5028 5029 5030 5031 5032 5033 5034 5035 5036 5037 5038 5039 5040 5041 5042 5043 5044 5045 5046 5047 5048 5049 |
# AIX does not have a timezone field in struct tm. When the AIX
# bsd library is used, the timezone global and the gettimeofday
# methods are to be avoided for timezone deduction instead, we
# deduce the timezone by comparing the localtime result on a
# known GMT value.
echo $ac_n "checking for gettimeofday in -lbsd""... $ac_c" 1>&6
echo "configure:5024: checking for gettimeofday in -lbsd" >&5
ac_lib_var=`echo bsd'_'gettimeofday | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
ac_save_LIBS="$LIBS"
LIBS="-lbsd $LIBS"
cat > conftest.$ac_ext <<EOF
#line 5032 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char gettimeofday();
int main() {
gettimeofday()
; return 0; }
EOF
if { (eval echo configure:5043: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=no"
|
| ︙ | ︙ | |||
4959 4960 4961 4962 4963 4964 4965 | DL_LIBS="-ldl" LDFLAGS="" LD_SEARCH_FLAGS="" ;; HP-UX-*.11.*) SHLIB_SUFFIX=".sl" echo $ac_n "checking for shl_load in -ldld""... $ac_c" 1>&6 | | | | | 5097 5098 5099 5100 5101 5102 5103 5104 5105 5106 5107 5108 5109 5110 5111 5112 5113 5114 5115 5116 5117 5118 5119 5120 5121 5122 5123 5124 5125 5126 5127 5128 5129 5130 |
DL_LIBS="-ldl"
LDFLAGS=""
LD_SEARCH_FLAGS=""
;;
HP-UX-*.11.*)
SHLIB_SUFFIX=".sl"
echo $ac_n "checking for shl_load in -ldld""... $ac_c" 1>&6
echo "configure:5105: checking for shl_load in -ldld" >&5
ac_lib_var=`echo dld'_'shl_load | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
ac_save_LIBS="$LIBS"
LIBS="-ldld $LIBS"
cat > conftest.$ac_ext <<EOF
#line 5113 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char shl_load();
int main() {
shl_load()
; return 0; }
EOF
if { (eval echo configure:5124: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=no"
|
| ︙ | ︙ | |||
5021 5022 5023 5024 5025 5026 5027 | LDFLAGS="+DA2.0W $LDFLAGS" fi fi ;; HP-UX-*.08.*|HP-UX-*.09.*|HP-UX-*.10.*) SHLIB_SUFFIX=".sl" echo $ac_n "checking for shl_load in -ldld""... $ac_c" 1>&6 | | | | | 5159 5160 5161 5162 5163 5164 5165 5166 5167 5168 5169 5170 5171 5172 5173 5174 5175 5176 5177 5178 5179 5180 5181 5182 5183 5184 5185 5186 5187 5188 5189 5190 5191 5192 |
LDFLAGS="+DA2.0W $LDFLAGS"
fi
fi
;;
HP-UX-*.08.*|HP-UX-*.09.*|HP-UX-*.10.*)
SHLIB_SUFFIX=".sl"
echo $ac_n "checking for shl_load in -ldld""... $ac_c" 1>&6
echo "configure:5167: checking for shl_load in -ldld" >&5
ac_lib_var=`echo dld'_'shl_load | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
ac_save_LIBS="$LIBS"
LIBS="-ldld $LIBS"
cat > conftest.$ac_ext <<EOF
#line 5175 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char shl_load();
int main() {
shl_load()
; return 0; }
EOF
if { (eval echo configure:5186: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=no"
|
| ︙ | ︙ | |||
5147 5148 5149 5150 5151 5152 5153 |
DL_OBJS="tclLoadDl.o"
DL_LIBS="-ldl"
LDFLAGS="-rdynamic"
LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
else
ac_safe=`echo "dld.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for dld.h""... $ac_c" 1>&6
| | | | | 5285 5286 5287 5288 5289 5290 5291 5292 5293 5294 5295 5296 5297 5298 5299 5300 5301 5302 5303 5304 5305 5306 5307 5308 5309 |
DL_OBJS="tclLoadDl.o"
DL_LIBS="-ldl"
LDFLAGS="-rdynamic"
LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
else
ac_safe=`echo "dld.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for dld.h""... $ac_c" 1>&6
echo "configure:5293: checking for dld.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 5298 "configure"
#include "confdefs.h"
#include <dld.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:5303: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
else
echo "$ac_err" >&5
echo "configure: failed program was:" >&5
|
| ︙ | ︙ | |||
5214 5215 5216 5217 5218 5219 5220 | DL_OBJS="" DL_LIBS="-ldl" LDFLAGS="-rdynamic" LD_SEARCH_FLAGS="" else ac_safe=`echo "dld.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for dld.h""... $ac_c" 1>&6 | | | | | 5352 5353 5354 5355 5356 5357 5358 5359 5360 5361 5362 5363 5364 5365 5366 5367 5368 5369 5370 5371 5372 5373 5374 5375 5376 |
DL_OBJS=""
DL_LIBS="-ldl"
LDFLAGS="-rdynamic"
LD_SEARCH_FLAGS=""
else
ac_safe=`echo "dld.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for dld.h""... $ac_c" 1>&6
echo "configure:5360: checking for dld.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 5365 "configure"
#include "confdefs.h"
#include <dld.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:5370: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
else
echo "$ac_err" >&5
echo "configure: failed program was:" >&5
|
| ︙ | ︙ | |||
5279 5280 5281 5282 5283 5284 5285 | LDFLAGS="-Wl,-Bexport" LD_SEARCH_FLAGS="" ;; NetBSD-*|FreeBSD-[1-2].*|OpenBSD-*) # Not available on all versions: check for include file. ac_safe=`echo "dlfcn.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for dlfcn.h""... $ac_c" 1>&6 | | | | | 5417 5418 5419 5420 5421 5422 5423 5424 5425 5426 5427 5428 5429 5430 5431 5432 5433 5434 5435 5436 5437 5438 5439 5440 5441 |
LDFLAGS="-Wl,-Bexport"
LD_SEARCH_FLAGS=""
;;
NetBSD-*|FreeBSD-[1-2].*|OpenBSD-*)
# Not available on all versions: check for include file.
ac_safe=`echo "dlfcn.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for dlfcn.h""... $ac_c" 1>&6
echo "configure:5425: checking for dlfcn.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 5430 "configure"
#include "confdefs.h"
#include <dlfcn.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:5435: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
else
echo "$ac_err" >&5
echo "configure: failed program was:" >&5
|
| ︙ | ︙ | |||
5316 5317 5318 5319 5320 5321 5322 |
SHLIB_LD_LIBS=""
SHLIB_SUFFIX=".so"
DL_OBJS="tclLoadDl.o"
DL_LIBS=""
LDFLAGS=""
LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
echo $ac_n "checking for ELF""... $ac_c" 1>&6
| | | | 5454 5455 5456 5457 5458 5459 5460 5461 5462 5463 5464 5465 5466 5467 5468 5469 5470 |
SHLIB_LD_LIBS=""
SHLIB_SUFFIX=".so"
DL_OBJS="tclLoadDl.o"
DL_LIBS=""
LDFLAGS=""
LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
echo $ac_n "checking for ELF""... $ac_c" 1>&6
echo "configure:5462: checking for ELF" >&5
cat > conftest.$ac_ext <<EOF
#line 5464 "configure"
#include "confdefs.h"
#ifdef __ELF__
yes
#endif
EOF
|
| ︙ | ︙ | |||
5365 5366 5367 5368 5369 5370 5371 |
UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.a'
TCL_LIB_VERSIONS_OK=nodots
;;
FreeBSD-*)
# FreeBSD 3.* and greater have ELF.
SHLIB_CFLAGS="-fPIC"
SHLIB_LD="ld -Bshareable -x"
| | | 5503 5504 5505 5506 5507 5508 5509 5510 5511 5512 5513 5514 5515 5516 5517 |
UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.a'
TCL_LIB_VERSIONS_OK=nodots
;;
FreeBSD-*)
# FreeBSD 3.* and greater have ELF.
SHLIB_CFLAGS="-fPIC"
SHLIB_LD="ld -Bshareable -x"
SHLIB_LD_LIBS='${LIBS}'
SHLIB_SUFFIX=".so"
DL_OBJS="tclLoadDl.o"
DL_LIBS=""
LDFLAGS="-export-dynamic"
LD_SEARCH_FLAGS=""
# FreeBSD doesn't handle version numbers with dots.
|
| ︙ | ︙ | |||
5451 5452 5453 5454 5455 5456 5457 5458 |
LDFLAGS=""
LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
if test "$GCC" != "yes" ; then
EXTRA_CFLAGS="-DHAVE_TZSET -std1"
fi
# see pthread_intro(3) for pthread support on osf1, k.furukawa
if test "${TCL_THREADS}" = "1" ; then
EXTRA_CFLAGS="${EXTRA_CFLAGS} -DTCL_THREAD_STACK_MIN=PTHREAD_STACK_MIN*64"
| > < | > | 5589 5590 5591 5592 5593 5594 5595 5596 5597 5598 5599 5600 5601 5602 5603 5604 5605 5606 |
LDFLAGS=""
LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
if test "$GCC" != "yes" ; then
EXTRA_CFLAGS="-DHAVE_TZSET -std1"
fi
# see pthread_intro(3) for pthread support on osf1, k.furukawa
if test "${TCL_THREADS}" = "1" ; then
EXTRA_CFLAGS="${EXTRA_CFLAGS} -DHAVE_PTHREAD_ATTR_SETSTACKSIZE"
EXTRA_CFLAGS="${EXTRA_CFLAGS} -DTCL_THREAD_STACK_MIN=PTHREAD_STACK_MIN*64"
LIBS=`echo $LIBS | sed s/-lpthreads//`
if test "$GCC" = "yes" ; then
LIBS="$LIBS -lpthread -lmach -lexc"
else
EXTRA_CFLAGS="${EXTRA_CFLAGS} -pthread"
LDFLAGS="-pthread"
fi
fi
|
| ︙ | ︙ | |||
5553 5554 5555 5556 5557 5558 5559 |
# symbols when dynamically loaded into tclsh.
SHLIB_LD_LIBS='${LIBS}'
SHLIB_SUFFIX=".so"
DL_OBJS="tclLoadDl.o"
DL_LIBS="-ldl"
LDFLAGS=""
| > | > > > | 5692 5693 5694 5695 5696 5697 5698 5699 5700 5701 5702 5703 5704 5705 5706 5707 5708 5709 5710 |
# symbols when dynamically loaded into tclsh.
SHLIB_LD_LIBS='${LIBS}'
SHLIB_SUFFIX=".so"
DL_OBJS="tclLoadDl.o"
DL_LIBS="-ldl"
LDFLAGS=""
if test "$GCC" = "yes" ; then
LD_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}'
else
LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}'
fi
;;
SunOS-5*)
# Note: If _REENTRANT isn't defined, then Solaris
# won't define thread-safe library routines.
cat >> confdefs.h <<\EOF
|
| ︙ | ︙ | |||
5626 5627 5628 5629 5630 5631 5632 | SHLIB_SUFFIX=".so" DL_OBJS="tclLoadDl.o" DL_LIBS="-ldl" # Some UNIX_SV* systems (unixware 1.1.2 for example) have linkers # that don't grok the -Bexport option. Test that it does. hold_ldflags=$LDFLAGS echo $ac_n "checking for ld accepts -Bexport flag""... $ac_c" 1>&6 | | | | | 5769 5770 5771 5772 5773 5774 5775 5776 5777 5778 5779 5780 5781 5782 5783 5784 5785 5786 5787 5788 5789 5790 5791 5792 5793 |
SHLIB_SUFFIX=".so"
DL_OBJS="tclLoadDl.o"
DL_LIBS="-ldl"
# Some UNIX_SV* systems (unixware 1.1.2 for example) have linkers
# that don't grok the -Bexport option. Test that it does.
hold_ldflags=$LDFLAGS
echo $ac_n "checking for ld accepts -Bexport flag""... $ac_c" 1>&6
echo "configure:5777: checking for ld accepts -Bexport flag" >&5
LDFLAGS="${LDFLAGS} -Wl,-Bexport"
cat > conftest.$ac_ext <<EOF
#line 5780 "configure"
#include "confdefs.h"
int main() {
int i;
; return 0; }
EOF
if { (eval echo configure:5787: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
found=yes
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
found=no
|
| ︙ | ︙ | |||
5682 5683 5684 5685 5686 5687 5688 |
#
# Note that the modified COFF format used on MIPS Ultrix 4.x is usable; the
# `struct exec' includes a second header that contains information that
# duplicates the v7 fields that are needed.
if test "x$DL_OBJS" = "xtclLoadAout.o" ; then
echo $ac_n "checking sys/exec.h""... $ac_c" 1>&6
| | | | | | | | | | | 5825 5826 5827 5828 5829 5830 5831 5832 5833 5834 5835 5836 5837 5838 5839 5840 5841 5842 5843 5844 5845 5846 5847 5848 5849 5850 5851 5852 5853 5854 5855 5856 5857 5858 5859 5860 5861 5862 5863 5864 5865 5866 5867 5868 5869 5870 5871 5872 5873 5874 5875 5876 5877 5878 5879 5880 5881 5882 5883 5884 5885 5886 5887 5888 5889 5890 5891 5892 5893 5894 5895 5896 5897 5898 5899 5900 5901 5902 5903 5904 5905 5906 5907 5908 5909 5910 5911 5912 5913 5914 5915 5916 5917 5918 5919 5920 5921 5922 5923 5924 5925 5926 5927 5928 5929 5930 5931 5932 5933 5934 5935 |
#
# Note that the modified COFF format used on MIPS Ultrix 4.x is usable; the
# `struct exec' includes a second header that contains information that
# duplicates the v7 fields that are needed.
if test "x$DL_OBJS" = "xtclLoadAout.o" ; then
echo $ac_n "checking sys/exec.h""... $ac_c" 1>&6
echo "configure:5833: checking sys/exec.h" >&5
cat > conftest.$ac_ext <<EOF
#line 5835 "configure"
#include "confdefs.h"
#include <sys/exec.h>
int main() {
struct exec foo;
unsigned long seek;
int flag;
#if defined(__mips) || defined(mips)
seek = N_TXTOFF (foo.ex_f, foo.ex_o);
#else
seek = N_TXTOFF (foo);
#endif
flag = (foo.a_magic == OMAGIC);
return foo.a_text + foo.a_data + foo.a_bss + foo.a_entry;
; return 0; }
EOF
if { (eval echo configure:5853: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
tcl_ok=usable
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
tcl_ok=unusable
fi
rm -f conftest*
echo "$ac_t""$tcl_ok" 1>&6
if test $tcl_ok = usable; then
cat >> confdefs.h <<\EOF
#define USE_SYS_EXEC_H 1
EOF
else
echo $ac_n "checking a.out.h""... $ac_c" 1>&6
echo "configure:5871: checking a.out.h" >&5
cat > conftest.$ac_ext <<EOF
#line 5873 "configure"
#include "confdefs.h"
#include <a.out.h>
int main() {
struct exec foo;
unsigned long seek;
int flag;
#if defined(__mips) || defined(mips)
seek = N_TXTOFF (foo.ex_f, foo.ex_o);
#else
seek = N_TXTOFF (foo);
#endif
flag = (foo.a_magic == OMAGIC);
return foo.a_text + foo.a_data + foo.a_bss + foo.a_entry;
; return 0; }
EOF
if { (eval echo configure:5891: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
tcl_ok=usable
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
tcl_ok=unusable
fi
rm -f conftest*
echo "$ac_t""$tcl_ok" 1>&6
if test $tcl_ok = usable; then
cat >> confdefs.h <<\EOF
#define USE_A_OUT_H 1
EOF
else
echo $ac_n "checking sys/exec_aout.h""... $ac_c" 1>&6
echo "configure:5909: checking sys/exec_aout.h" >&5
cat > conftest.$ac_ext <<EOF
#line 5911 "configure"
#include "confdefs.h"
#include <sys/exec_aout.h>
int main() {
struct exec foo;
unsigned long seek;
int flag;
#if defined(__mips) || defined(mips)
seek = N_TXTOFF (foo.ex_f, foo.ex_o);
#else
seek = N_TXTOFF (foo);
#endif
flag = (foo.a_midmag == OMAGIC);
return foo.a_text + foo.a_data + foo.a_bss + foo.a_entry;
; return 0; }
EOF
if { (eval echo configure:5929: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
tcl_ok=usable
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
tcl_ok=unusable
|
| ︙ | ︙ | |||
5875 5876 5877 5878 5879 5880 5881 |
echo $ac_n "checking for build with symbols""... $ac_c" 1>&6
| | | 6018 6019 6020 6021 6022 6023 6024 6025 6026 6027 6028 6029 6030 6031 6032 |
echo $ac_n "checking for build with symbols""... $ac_c" 1>&6
echo "configure:6026: checking for build with symbols" >&5
# Check whether --enable-symbols or --disable-symbols was given.
if test "${enable_symbols+set}" = set; then
enableval="$enable_symbols"
tcl_ok=$enableval
else
tcl_ok=no
fi
|
| ︙ | ︙ | |||
5912 5913 5914 5915 5916 5917 5918 |
#--------------------------------------------------------------------
for ac_hdr in sys/ioctl.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
| | | | | 6055 6056 6057 6058 6059 6060 6061 6062 6063 6064 6065 6066 6067 6068 6069 6070 6071 6072 6073 6074 6075 6076 6077 6078 6079 |
#--------------------------------------------------------------------
for ac_hdr in sys/ioctl.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
echo "configure:6063: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 6068 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:6073: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
else
echo "$ac_err" >&5
echo "configure: failed program was:" >&5
|
| ︙ | ︙ | |||
5952 5953 5954 5955 5956 5957 5958 |
fi
done
for ac_hdr in sys/filio.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
| | | | | 6095 6096 6097 6098 6099 6100 6101 6102 6103 6104 6105 6106 6107 6108 6109 6110 6111 6112 6113 6114 6115 6116 6117 6118 6119 |
fi
done
for ac_hdr in sys/filio.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
echo "configure:6103: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 6108 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:6113: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
else
echo "$ac_err" >&5
echo "configure: failed program was:" >&5
|
| ︙ | ︙ | |||
5989 5990 5991 5992 5993 5994 5995 |
else
echo "$ac_t""no" 1>&6
fi
done
echo $ac_n "checking FIONBIO vs. O_NONBLOCK for nonblocking I/O""... $ac_c" 1>&6
| | | 6132 6133 6134 6135 6136 6137 6138 6139 6140 6141 6142 6143 6144 6145 6146 |
else
echo "$ac_t""no" 1>&6
fi
done
echo $ac_n "checking FIONBIO vs. O_NONBLOCK for nonblocking I/O""... $ac_c" 1>&6
echo "configure:6140: checking FIONBIO vs. O_NONBLOCK for nonblocking I/O" >&5
if test -f /usr/lib/NextStep/software_version; then
system=NEXTSTEP-`awk '/3/,/3/' /usr/lib/NextStep/software_version`
else
system=`uname -s`-`uname -r`
if test "$?" -ne 0 ; then
system=unknown
else
|
| ︙ | ︙ | |||
6051 6052 6053 6054 6055 6056 6057 |
#--------------------------------------------------------------------
TCL_UNSHARED_LIB_SUFFIX=${UNSHARED_LIB_SUFFIX}
TCL_SHARED_LIB_SUFFIX=${SHARED_LIB_SUFFIX}
echo $ac_n "checking how to build libraries""... $ac_c" 1>&6
| | | 6194 6195 6196 6197 6198 6199 6200 6201 6202 6203 6204 6205 6206 6207 6208 |
#--------------------------------------------------------------------
TCL_UNSHARED_LIB_SUFFIX=${UNSHARED_LIB_SUFFIX}
TCL_SHARED_LIB_SUFFIX=${SHARED_LIB_SUFFIX}
echo $ac_n "checking how to build libraries""... $ac_c" 1>&6
echo "configure:6202: checking how to build libraries" >&5
# Check whether --enable-shared or --disable-shared was given.
if test "${enable_shared+set}" = set; then
enableval="$enable_shared"
tcl_ok=$enableval
else
tcl_ok=yes
fi
|
| ︙ | ︙ | |||
6082 6083 6084 6085 6086 6087 6088 |
#define STATIC_BUILD 1
EOF
fi
echo $ac_n "checking how to package libraries""... $ac_c" 1>&6
| | | 6225 6226 6227 6228 6229 6230 6231 6232 6233 6234 6235 6236 6237 6238 6239 |
#define STATIC_BUILD 1
EOF
fi
echo $ac_n "checking how to package libraries""... $ac_c" 1>&6
echo "configure:6233: checking how to package libraries" >&5
# Check whether --enable-framework or --disable-framework was given.
if test "${enable_framework+set}" = set; then
enableval="$enable_framework"
tcl_ok=$enableval
else
tcl_ok=no
fi
|
| ︙ | ︙ | |||
6111 6112 6113 6114 6115 6116 6117 6118 6119 |
FRAMEWORK_BUILD=1
else
echo "$ac_t""standard shared library" 1>&6
FRAMEWORK_BUILD=0
fi
if test "${SHARED_BUILD}" = "1" -a "${SHLIB_SUFFIX}" != "" ; then
TCL_SHLIB_CFLAGS="${SHLIB_CFLAGS}"
| > < < < < | | | | | | < | | | | | | | | | | | | | | | < > > | 6254 6255 6256 6257 6258 6259 6260 6261 6262 6263 6264 6265 6266 6267 6268 6269 6270 6271 6272 6273 6274 6275 6276 6277 6278 6279 6280 6281 6282 6283 6284 6285 6286 6287 6288 6289 6290 6291 6292 6293 6294 6295 6296 6297 6298 6299 6300 6301 6302 6303 6304 6305 6306 6307 6308 6309 6310 6311 6312 6313 6314 6315 6316 6317 6318 6319 6320 6321 6322 6323 6324 6325 6326 6327 6328 6329 6330 6331 6332 6333 6334 6335 6336 6337 6338 6339 6340 6341 6342 6343 6344 6345 6346 6347 6348 6349 |
FRAMEWORK_BUILD=1
else
echo "$ac_t""standard shared library" 1>&6
FRAMEWORK_BUILD=0
fi
TCL_LD_SEARCH_FLAGS="${LD_SEARCH_FLAGS}"
if test "${SHARED_BUILD}" = "1" -a "${SHLIB_SUFFIX}" != "" ; then
TCL_SHLIB_CFLAGS="${SHLIB_CFLAGS}"
eval "TCL_LIB_FILE=libtcl${TCL_SHARED_LIB_SUFFIX}"
if test "x$DL_OBJS" = "xtclLoadAout.o"; then
MAKE_LIB="\${STLIB_LD} \$@ \${OBJS}"
else
MAKE_LIB="\${SHLIB_LD} ${TCL_SHLIB_LD_EXTRAS} -o \$@ \${OBJS} ${SHLIB_LD_LIBS}"
fi
else
case $system in
BSD/OS*)
;;
AIX-[1-4].*)
;;
*)
SHLIB_LD_LIBS=""
;;
esac
TCL_SHLIB_CFLAGS=""
eval "TCL_LIB_FILE=libtcl${TCL_UNSHARED_LIB_SUFFIX}"
MAKE_LIB="\${STLIB_LD} \$@ \${OBJS}"
fi
# tclConfig.sh needs a version of the _LIB_SUFFIX that has been eval'ed
# so that the backslashes quoting the DBX braces are dropped.
# Trick to replace DBGX with TCL_DBGX
DBGX='${TCL_DBGX}'
eval "TCL_LIB_FILE=${TCL_LIB_FILE}"
# Note: in the following variable, it's important to use the absolute
# path name of the Tcl directory rather than "..": this is because
# AIX remembers this path and will attempt to use it at run-time to look
# up the Tcl library.
if test "$FRAMEWORK_BUILD" = "1" ; then
TCL_BUILD_LIB_SPEC="-F`pwd` -framework Tcl"
TCL_LIB_SPEC="-framework Tcl"
TCL_LIB_FILE="Tcl"
elif test "$SHARED_BUILD" = "0" -o $TCL_NEEDS_EXP_FILE = 0; then
if test "${TCL_LIB_VERSIONS_OK}" = "ok"; then
TCL_LIB_FLAG="-ltcl${TCL_VERSION}\${TCL_DBGX}"
else
TCL_LIB_FLAG="-ltcl`echo ${TCL_VERSION} | tr -d .`\${TCL_DBGX}"
fi
TCL_BUILD_LIB_SPEC="-L`pwd` ${TCL_LIB_FLAG}"
TCL_LIB_SPEC="-L${libdir} ${TCL_LIB_FLAG}"
else
TCL_BUILD_EXP_FILE="lib.exp"
eval "TCL_EXP_FILE=libtcl${TCL_EXPORT_FILE_SUFFIX}"
# Replace DBGX with TCL_DBGX
eval "TCL_EXP_FILE=\"${TCL_EXP_FILE}\""
if test "$GCC" = "yes" ; then
TCL_BUILD_LIB_SPEC="-Wl,-bI:`pwd`/${TCL_BUILD_EXP_FILE} -L`pwd`"
TCL_LIB_SPEC="-Wl,-bI:${libdir}/${TCL_EXP_FILE} -L`pwd`"
else
TCL_BUILD_LIB_SPEC="-bI:`pwd`/${TCL_BUILD_EXP_FILE}"
TCL_LIB_SPEC="-bI:${libdir}/${TCL_EXP_FILE}"
fi
fi
VERSION='${VERSION}'
eval "CFG_TCL_SHARED_LIB_SUFFIX=${TCL_SHARED_LIB_SUFFIX}"
eval "CFG_TCL_UNSHARED_LIB_SUFFIX=${TCL_UNSHARED_LIB_SUFFIX}"
eval "CFG_TCL_EXPORT_FILE_SUFFIX=${TCL_EXPORT_FILE_SUFFIX}"
VERSION=${TCL_VERSION}
#--------------------------------------------------------------------
# The statements below define the symbol TCL_PACKAGE_PATH, which
# gives a list of directories that may contain packages. The list
# consists of one directory for machine-dependent binaries and
# another for platform-independent scripts.
#--------------------------------------------------------------------
if test "$FRAMEWORK_BUILD" = "1" ; then
TCL_PACKAGE_PATH="${prefix}/Tcl.framework/Versions/${TCL_VERSION}/Resources/Scripts"
elif test "$prefix" != "$exec_prefix"; then
TCL_PACKAGE_PATH="${libdir} ${prefix}/lib"
else
if test "$prefix" != "$exec_prefix"; then
TCL_PACKAGE_PATH="${exec_prefix}/lib ${prefix}/lib"
else
TCL_PACKAGE_PATH="${prefix}/lib"
fi
fi
|
| ︙ | ︙ | |||
6227 6228 6229 6230 6231 6232 6233 |
fi
TCL_BUILD_STUB_LIB_SPEC="-L`pwd` ${TCL_STUB_LIB_FLAG}"
if test "$FRAMEWORK_BUILD" = "1" ; then
TCL_STUB_LIB_SPEC="-L${exec_prefix}/Tcl.framework/Versions/${TCL_VERSION} ${TCL_STUB_LIB_FLAG}"
TCL_STUB_LIB_PATH="${exec_prefix}/Tcl.framework/Versions/${TCL_VERSION}/${TCL_STUB_LIB_FILE}"
else
| | | > > > > > | 6367 6368 6369 6370 6371 6372 6373 6374 6375 6376 6377 6378 6379 6380 6381 6382 6383 6384 6385 6386 6387 6388 6389 |
fi
TCL_BUILD_STUB_LIB_SPEC="-L`pwd` ${TCL_STUB_LIB_FLAG}"
if test "$FRAMEWORK_BUILD" = "1" ; then
TCL_STUB_LIB_SPEC="-L${exec_prefix}/Tcl.framework/Versions/${TCL_VERSION} ${TCL_STUB_LIB_FLAG}"
TCL_STUB_LIB_PATH="${exec_prefix}/Tcl.framework/Versions/${TCL_VERSION}/${TCL_STUB_LIB_FILE}"
else
TCL_STUB_LIB_SPEC="-L${libdir} ${TCL_STUB_LIB_FLAG}"
TCL_STUB_LIB_PATH="${libdir}/${TCL_STUB_LIB_FILE}"
fi
TCL_BUILD_STUB_LIB_PATH="`pwd`/${TCL_STUB_LIB_FILE}"
# Install time header dir can be set via --includedir
eval "TCL_INCLUDE_SPEC=\"-I${includedir}\""
#------------------------------------------------------------------------
# tclConfig.sh refers to this by a different name
#------------------------------------------------------------------------
TCL_SHARED_BUILD=${SHARED_BUILD}
|
| ︙ | ︙ | |||
6259 6260 6261 6262 6263 6264 6265 |
| | > > > > > > > > > > | 6404 6405 6406 6407 6408 6409 6410 6411 6412 6413 6414 6415 6416 6417 6418 6419 6420 6421 6422 6423 6424 6425 6426 6427 6428 | |
| ︙ | ︙ | |||
6405 6406 6407 6408 6409 6410 6411 |
echo "\$ac_cs_usage"; exit 0 ;;
*) echo "\$ac_cs_usage"; exit 1 ;;
esac
done
ac_given_srcdir=$srcdir
| | | 6560 6561 6562 6563 6564 6565 6566 6567 6568 6569 6570 6571 6572 6573 6574 |
echo "\$ac_cs_usage"; exit 0 ;;
*) echo "\$ac_cs_usage"; exit 1 ;;
esac
done
ac_given_srcdir=$srcdir
trap 'rm -fr `echo "Makefile dltest/Makefile tclConfig.sh" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
EOF
cat >> $CONFIG_STATUS <<EOF
# Protect against being on the right side of a sed subst in config.status.
sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
$ac_vpsub
|
| ︙ | ︙ | |||
6449 6450 6451 6452 6453 6454 6455 6456 6457 | s%@TCL_LIBS@%$TCL_LIBS%g s%@MATH_LIBS@%$MATH_LIBS%g s%@AR@%$AR%g s%@DL_LIBS@%$DL_LIBS%g s%@CFLAGS_DEBUG@%$CFLAGS_DEBUG%g s%@CFLAGS_OPTIMIZE@%$CFLAGS_OPTIMIZE%g s%@CFLAGS_WARNING@%$CFLAGS_WARNING%g s%@TCL_STUB_LIB_FILE@%$TCL_STUB_LIB_FILE%g s%@TCL_STUB_LIB_FLAG@%$TCL_STUB_LIB_FLAG%g | > > > > > > > < < > | | > > | < > < < | < > > < < < < < < < < < > > > | | 6604 6605 6606 6607 6608 6609 6610 6611 6612 6613 6614 6615 6616 6617 6618 6619 6620 6621 6622 6623 6624 6625 6626 6627 6628 6629 6630 6631 6632 6633 6634 6635 6636 6637 6638 6639 6640 6641 6642 6643 6644 6645 6646 6647 6648 6649 6650 6651 6652 6653 6654 6655 6656 6657 6658 6659 6660 6661 6662 6663 6664 | s%@TCL_LIBS@%$TCL_LIBS%g s%@MATH_LIBS@%$MATH_LIBS%g s%@AR@%$AR%g s%@DL_LIBS@%$DL_LIBS%g s%@CFLAGS_DEBUG@%$CFLAGS_DEBUG%g s%@CFLAGS_OPTIMIZE@%$CFLAGS_OPTIMIZE%g s%@CFLAGS_WARNING@%$CFLAGS_WARNING%g s%@TCL_VERSION@%$TCL_VERSION%g s%@TCL_MAJOR_VERSION@%$TCL_MAJOR_VERSION%g s%@TCL_MINOR_VERSION@%$TCL_MINOR_VERSION%g s%@TCL_PATCH_LEVEL@%$TCL_PATCH_LEVEL%g s%@TCL_LIB_FILE@%$TCL_LIB_FILE%g s%@TCL_LIB_FLAG@%$TCL_LIB_FLAG%g s%@TCL_LIB_SPEC@%$TCL_LIB_SPEC%g s%@TCL_STUB_LIB_FILE@%$TCL_STUB_LIB_FILE%g s%@TCL_STUB_LIB_FLAG@%$TCL_STUB_LIB_FLAG%g s%@TCL_STUB_LIB_SPEC@%$TCL_STUB_LIB_SPEC%g s%@TCL_STUB_LIB_PATH@%$TCL_STUB_LIB_PATH%g s%@TCL_INCLUDE_SPEC@%$TCL_INCLUDE_SPEC%g s%@TCL_BUILD_STUB_LIB_SPEC@%$TCL_BUILD_STUB_LIB_SPEC%g s%@TCL_BUILD_STUB_LIB_PATH@%$TCL_BUILD_STUB_LIB_PATH%g s%@TCL_SRC_DIR@%$TCL_SRC_DIR%g s%@TCL_BIN_DIR@%$TCL_BIN_DIR%g s%@TCL_DBGX@%$TCL_DBGX%g s%@CFG_TCL_SHARED_LIB_SUFFIX@%$CFG_TCL_SHARED_LIB_SUFFIX%g s%@CFG_TCL_UNSHARED_LIB_SUFFIX@%$CFG_TCL_UNSHARED_LIB_SUFFIX%g s%@CFG_TCL_EXPORT_FILE_SUFFIX@%$CFG_TCL_EXPORT_FILE_SUFFIX%g s%@DL_OBJS@%$DL_OBJS%g s%@PLAT_OBJS@%$PLAT_OBJS%g s%@CFLAGS_DEFAULT@%$CFLAGS_DEFAULT%g s%@EXTRA_CFLAGS@%$EXTRA_CFLAGS%g s%@LD_LIBRARY_PATH_VAR@%$LD_LIBRARY_PATH_VAR%g s%@LDFLAGS_DEFAULT@%$LDFLAGS_DEFAULT%g s%@LDFLAGS_DEBUG@%$LDFLAGS_DEBUG%g s%@LDFLAGS_OPTIMIZE@%$LDFLAGS_OPTIMIZE%g s%@STLIB_LD@%$STLIB_LD%g s%@SHLIB_LD@%$SHLIB_LD%g s%@SHLIB_LD_LIBS@%$SHLIB_LD_LIBS%g s%@SHLIB_CFLAGS@%$SHLIB_CFLAGS%g s%@SHLIB_SUFFIX@%$SHLIB_SUFFIX%g s%@TCL_SHARED_BUILD@%$TCL_SHARED_BUILD%g s%@TCL_BUILD_LIB_SPEC@%$TCL_BUILD_LIB_SPEC%g s%@TCL_LD_SEARCH_FLAGS@%$TCL_LD_SEARCH_FLAGS%g s%@TCL_NEEDS_EXP_FILE@%$TCL_NEEDS_EXP_FILE%g s%@TCL_BUILD_EXP_FILE@%$TCL_BUILD_EXP_FILE%g s%@TCL_EXP_FILE@%$TCL_EXP_FILE%g s%@TCL_LIB_VERSIONS_OK@%$TCL_LIB_VERSIONS_OK%g s%@TCL_SHARED_LIB_SUFFIX@%$TCL_SHARED_LIB_SUFFIX%g s%@TCL_SHLIB_CFLAGS@%$TCL_SHLIB_CFLAGS%g s%@TCL_UNSHARED_LIB_SUFFIX@%$TCL_UNSHARED_LIB_SUFFIX%g s%@MAKE_LIB@%$MAKE_LIB%g s%@MAKE_STUB_LIB@%$MAKE_STUB_LIB%g s%@BUILD_DLTEST@%$BUILD_DLTEST%g s%@TCL_PACKAGE_PATH@%$TCL_PACKAGE_PATH%g CEOF EOF cat >> $CONFIG_STATUS <<\EOF # Split the substitutions into bite-sized pieces for seds with |
| ︙ | ︙ | |||
6536 6537 6538 6539 6540 6541 6542 | if test -z "$ac_sed_cmds"; then ac_sed_cmds=cat fi EOF cat >> $CONFIG_STATUS <<EOF | | | 6692 6693 6694 6695 6696 6697 6698 6699 6700 6701 6702 6703 6704 6705 6706 |
if test -z "$ac_sed_cmds"; then
ac_sed_cmds=cat
fi
EOF
cat >> $CONFIG_STATUS <<EOF
CONFIG_FILES=\${CONFIG_FILES-"Makefile dltest/Makefile tclConfig.sh"}
EOF
cat >> $CONFIG_STATUS <<\EOF
for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
# Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
case "$ac_file" in
*:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
|
| ︙ | ︙ |
Changes to unix/configure.in.
1 2 3 4 5 | #! /bin/bash -norc dnl This file is an input file used by the GNU "autoconf" program to dnl generate the file "configure", which is run during Tcl installation dnl to configure the system for the local environment. AC_INIT(../generic/tcl.h) | > > > < > > | 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 34 |
#! /bin/bash -norc
dnl This file is an input file used by the GNU "autoconf" program to
dnl generate the file "configure", which is run during Tcl installation
dnl to configure the system for the local environment.
#
# RCS: @(#) $Id: configure.in,v 1.72.8.4 2002/02/05 02:22:04 wolfsuit Exp $
AC_INIT(../generic/tcl.h)
TCL_VERSION=8.4
TCL_MAJOR_VERSION=8
TCL_MINOR_VERSION=4
TCL_PATCH_LEVEL="a4"
VERSION=${TCL_VERSION}
#------------------------------------------------------------------------
# Handle the --prefix=... option
#------------------------------------------------------------------------
if test "${prefix}" = "NONE"; then
prefix=/usr/local
fi
if test "${exec_prefix}" = "NONE"; then
exec_prefix=$prefix
fi
# libdir must be a fully qualified path and (not ${exec_prefix}/lib)
eval libdir="$libdir"
TCL_SRC_DIR=`cd $srcdir/..; pwd`
#------------------------------------------------------------------------
# Standard compiler checks
#------------------------------------------------------------------------
# If the user did not set CFLAGS, set it now to keep
|
| ︙ | ︙ | |||
331 332 333 334 335 336 337 338 339 340 341 342 343 344 |
signed char *p;
p = 0;
], tcl_ok=yes, tcl_ok=no)
AC_MSG_RESULT($tcl_ok)
if test $tcl_ok = yes; then
AC_DEFINE(HAVE_SIGNED_CHAR)
fi
#--------------------------------------------------------------------
# Look for libraries that we will need when compiling the Tcl shell
#--------------------------------------------------------------------
SC_TCL_LINK_LIBS
| > > > > > > | 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 |
signed char *p;
p = 0;
], tcl_ok=yes, tcl_ok=no)
AC_MSG_RESULT($tcl_ok)
if test $tcl_ok = yes; then
AC_DEFINE(HAVE_SIGNED_CHAR)
fi
#--------------------------------------------------------------------
# Check for support of nl_langinfo function
#--------------------------------------------------------------------
SC_ENABLE_LANGINFO
#--------------------------------------------------------------------
# Look for libraries that we will need when compiling the Tcl shell
#--------------------------------------------------------------------
SC_TCL_LINK_LIBS
|
| ︙ | ︙ | |||
374 375 376 377 378 379 380 381 382 |
TCL_UNSHARED_LIB_SUFFIX=${UNSHARED_LIB_SUFFIX}
TCL_SHARED_LIB_SUFFIX=${SHARED_LIB_SUFFIX}
SC_ENABLE_SHARED
SC_ENABLE_FRAMEWORK
if test "${SHARED_BUILD}" = "1" -a "${SHLIB_SUFFIX}" != "" ; then
TCL_SHLIB_CFLAGS="${SHLIB_CFLAGS}"
| > < < < < | | | | | | < | | | | | | | | | | | | | | | < > > | 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 |
TCL_UNSHARED_LIB_SUFFIX=${UNSHARED_LIB_SUFFIX}
TCL_SHARED_LIB_SUFFIX=${SHARED_LIB_SUFFIX}
SC_ENABLE_SHARED
SC_ENABLE_FRAMEWORK
TCL_LD_SEARCH_FLAGS="${LD_SEARCH_FLAGS}"
if test "${SHARED_BUILD}" = "1" -a "${SHLIB_SUFFIX}" != "" ; then
TCL_SHLIB_CFLAGS="${SHLIB_CFLAGS}"
eval "TCL_LIB_FILE=libtcl${TCL_SHARED_LIB_SUFFIX}"
if test "x$DL_OBJS" = "xtclLoadAout.o"; then
MAKE_LIB="\${STLIB_LD} \[$]@ \${OBJS}"
else
MAKE_LIB="\${SHLIB_LD} ${TCL_SHLIB_LD_EXTRAS} -o \[$]@ \${OBJS} ${SHLIB_LD_LIBS}"
fi
else
case $system in
BSD/OS*)
;;
AIX-[[1-4]].*)
;;
*)
SHLIB_LD_LIBS=""
;;
esac
TCL_SHLIB_CFLAGS=""
eval "TCL_LIB_FILE=libtcl${TCL_UNSHARED_LIB_SUFFIX}"
MAKE_LIB="\${STLIB_LD} \[$]@ \${OBJS}"
fi
# tclConfig.sh needs a version of the _LIB_SUFFIX that has been eval'ed
# so that the backslashes quoting the DBX braces are dropped.
# Trick to replace DBGX with TCL_DBGX
DBGX='${TCL_DBGX}'
eval "TCL_LIB_FILE=${TCL_LIB_FILE}"
# Note: in the following variable, it's important to use the absolute
# path name of the Tcl directory rather than "..": this is because
# AIX remembers this path and will attempt to use it at run-time to look
# up the Tcl library.
if test "$FRAMEWORK_BUILD" = "1" ; then
TCL_BUILD_LIB_SPEC="-F`pwd` -framework Tcl"
TCL_LIB_SPEC="-framework Tcl"
TCL_LIB_FILE="Tcl"
elif test "$SHARED_BUILD" = "0" -o $TCL_NEEDS_EXP_FILE = 0; then
if test "${TCL_LIB_VERSIONS_OK}" = "ok"; then
TCL_LIB_FLAG="-ltcl${TCL_VERSION}\${TCL_DBGX}"
else
TCL_LIB_FLAG="-ltcl`echo ${TCL_VERSION} | tr -d .`\${TCL_DBGX}"
fi
TCL_BUILD_LIB_SPEC="-L`pwd` ${TCL_LIB_FLAG}"
TCL_LIB_SPEC="-L${libdir} ${TCL_LIB_FLAG}"
else
TCL_BUILD_EXP_FILE="lib.exp"
eval "TCL_EXP_FILE=libtcl${TCL_EXPORT_FILE_SUFFIX}"
# Replace DBGX with TCL_DBGX
eval "TCL_EXP_FILE=\"${TCL_EXP_FILE}\""
if test "$GCC" = "yes" ; then
TCL_BUILD_LIB_SPEC="-Wl,-bI:`pwd`/${TCL_BUILD_EXP_FILE} -L`pwd`"
TCL_LIB_SPEC="-Wl,-bI:${libdir}/${TCL_EXP_FILE} -L`pwd`"
else
TCL_BUILD_LIB_SPEC="-bI:`pwd`/${TCL_BUILD_EXP_FILE}"
TCL_LIB_SPEC="-bI:${libdir}/${TCL_EXP_FILE}"
fi
fi
VERSION='${VERSION}'
eval "CFG_TCL_SHARED_LIB_SUFFIX=${TCL_SHARED_LIB_SUFFIX}"
eval "CFG_TCL_UNSHARED_LIB_SUFFIX=${TCL_UNSHARED_LIB_SUFFIX}"
eval "CFG_TCL_EXPORT_FILE_SUFFIX=${TCL_EXPORT_FILE_SUFFIX}"
VERSION=${TCL_VERSION}
#--------------------------------------------------------------------
# The statements below define the symbol TCL_PACKAGE_PATH, which
# gives a list of directories that may contain packages. The list
# consists of one directory for machine-dependent binaries and
# another for platform-independent scripts.
#--------------------------------------------------------------------
if test "$FRAMEWORK_BUILD" = "1" ; then
TCL_PACKAGE_PATH="${prefix}/Tcl.framework/Versions/${TCL_VERSION}/Resources/Scripts"
elif test "$prefix" != "$exec_prefix"; then
TCL_PACKAGE_PATH="${libdir} ${prefix}/lib"
else
if test "$prefix" != "$exec_prefix"; then
TCL_PACKAGE_PATH="${exec_prefix}/lib ${prefix}/lib"
else
TCL_PACKAGE_PATH="${prefix}/lib"
fi
fi
|
| ︙ | ︙ | |||
490 491 492 493 494 495 496 |
fi
TCL_BUILD_STUB_LIB_SPEC="-L`pwd` ${TCL_STUB_LIB_FLAG}"
if test "$FRAMEWORK_BUILD" = "1" ; then
TCL_STUB_LIB_SPEC="-L${exec_prefix}/Tcl.framework/Versions/${TCL_VERSION} ${TCL_STUB_LIB_FLAG}"
TCL_STUB_LIB_PATH="${exec_prefix}/Tcl.framework/Versions/${TCL_VERSION}/${TCL_STUB_LIB_FILE}"
else
| | | > > > > > | > > | > | | | > > > | > > | | | > > > > < | < | | | > > | < < < < | > | > | | | | 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 |
fi
TCL_BUILD_STUB_LIB_SPEC="-L`pwd` ${TCL_STUB_LIB_FLAG}"
if test "$FRAMEWORK_BUILD" = "1" ; then
TCL_STUB_LIB_SPEC="-L${exec_prefix}/Tcl.framework/Versions/${TCL_VERSION} ${TCL_STUB_LIB_FLAG}"
TCL_STUB_LIB_PATH="${exec_prefix}/Tcl.framework/Versions/${TCL_VERSION}/${TCL_STUB_LIB_FILE}"
else
TCL_STUB_LIB_SPEC="-L${libdir} ${TCL_STUB_LIB_FLAG}"
TCL_STUB_LIB_PATH="${libdir}/${TCL_STUB_LIB_FILE}"
fi
TCL_BUILD_STUB_LIB_PATH="`pwd`/${TCL_STUB_LIB_FILE}"
# Install time header dir can be set via --includedir
eval "TCL_INCLUDE_SPEC=\"-I${includedir}\""
#------------------------------------------------------------------------
# tclConfig.sh refers to this by a different name
#------------------------------------------------------------------------
TCL_SHARED_BUILD=${SHARED_BUILD}
AC_SUBST(TCL_VERSION)
AC_SUBST(TCL_MAJOR_VERSION)
AC_SUBST(TCL_MINOR_VERSION)
AC_SUBST(TCL_PATCH_LEVEL)
AC_SUBST(TCL_LIB_FILE)
AC_SUBST(TCL_LIB_FLAG)
AC_SUBST(TCL_LIB_SPEC)
AC_SUBST(TCL_STUB_LIB_FILE)
AC_SUBST(TCL_STUB_LIB_FLAG)
AC_SUBST(TCL_STUB_LIB_SPEC)
AC_SUBST(TCL_STUB_LIB_PATH)
AC_SUBST(TCL_INCLUDE_SPEC)
AC_SUBST(TCL_BUILD_STUB_LIB_SPEC)
AC_SUBST(TCL_BUILD_STUB_LIB_PATH)
AC_SUBST(TCL_SRC_DIR)
AC_SUBST(TCL_BIN_DIR)
AC_SUBST(TCL_DBGX)
AC_SUBST(CFG_TCL_SHARED_LIB_SUFFIX)
AC_SUBST(CFG_TCL_UNSHARED_LIB_SUFFIX)
AC_SUBST(CFG_TCL_EXPORT_FILE_SUFFIX)
AC_SUBST(TCL_DBGX)
AC_SUBST(DL_OBJS)
AC_SUBST(PLAT_OBJS)
AC_SUBST(CFLAGS)
AC_SUBST(CFLAGS_DEFAULT)
AC_SUBST(EXTRA_CFLAGS)
AC_SUBST(LD_LIBRARY_PATH_VAR)
AC_SUBST(LDFLAGS)
AC_SUBST(LDFLAGS_DEFAULT)
AC_SUBST(LDFLAGS_DEBUG)
AC_SUBST(LDFLAGS_OPTIMIZE)
AC_SUBST(AR)
AC_SUBST(RANLIB)
AC_SUBST(STLIB_LD)
AC_SUBST(SHLIB_LD)
AC_SUBST(SHLIB_LD_LIBS)
AC_SUBST(SHLIB_CFLAGS)
AC_SUBST(SHLIB_SUFFIX)
AC_SUBST(TCL_SHARED_BUILD)
AC_SUBST(TCL_BUILD_LIB_SPEC)
AC_SUBST(TCL_LD_SEARCH_FLAGS)
AC_SUBST(LDFLAGS_DEBUG)
AC_SUBST(LDFLAGS_OPTIMIZE)
AC_SUBST(TCL_LIB_FILE)
AC_SUBST(TCL_LIB_FLAG)
AC_SUBST(TCL_NEEDS_EXP_FILE)
AC_SUBST(TCL_BUILD_EXP_FILE)
AC_SUBST(TCL_EXP_FILE)
AC_SUBST(TCL_LIB_VERSIONS_OK)
AC_SUBST(TCL_SHARED_LIB_SUFFIX)
AC_SUBST(TCL_SHLIB_CFLAGS)
AC_SUBST(TCL_UNSHARED_LIB_SUFFIX)
AC_SUBST(MAKE_LIB)
AC_SUBST(MAKE_STUB_LIB)
AC_SUBST(BUILD_DLTEST)
AC_SUBST(TCL_PACKAGE_PATH)
AC_OUTPUT(Makefile dltest/Makefile tclConfig.sh)
|
Changes to unix/dltest/Makefile.in.
1 2 3 | # This Makefile is used to create several test cases for Tcl's load # command. It also illustrates how to take advantage of configuration # exported by Tcl to set up Makefiles for shared libraries. | | | > < | | | | | | 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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
# This Makefile is used to create several test cases for Tcl's load
# command. It also illustrates how to take advantage of configuration
# exported by Tcl to set up Makefiles for shared libraries.
# RCS: @(#) $Id: Makefile.in,v 1.6.18.1 2002/02/05 02:22:05 wolfsuit Exp $
TCL_DBGX = @TCL_DBGX@
CC = @CC@
LIBS = @TCL_BUILD_STUB_LIB_SPEC@ @DL_LIBS@ @LIBS@ @MATH_LIBS@
AC_FLAGS = @EXTRA_CFLAGS@
SHLIB_CFLAGS = @SHLIB_CFLAGS@
SHLIB_LD = @SHLIB_LD@
SHLIB_LD_LIBS = @SHLIB_LD_LIBS@
SHLIB_SUFFIX = @SHLIB_SUFFIX@
SRC_DIR = @srcdir@
TCL_VERSION= @TCL_VERSION@
CFLAGS = -g
CC_SWITCHES = $(CFLAGS) -I${SRC_DIR}/../../generic -DTCL_MEM_DEBUG \
${SHLIB_CFLAGS} -DUSE_TCL_STUBS ${AC_FLAGS}
all: pkga${SHLIB_SUFFIX} pkgb${SHLIB_SUFFIX} pkgc${SHLIB_SUFFIX} pkgd${SHLIB_SUFFIX} pkge${SHLIB_SUFFIX}
pkga${SHLIB_SUFFIX}: $(SRC_DIR)/pkga.c
$(CC) -c $(CC_SWITCHES) $(SRC_DIR)/pkga.c
${SHLIB_LD} -o pkga${SHLIB_SUFFIX} pkga.o ${SHLIB_LD_LIBS}
pkgb${SHLIB_SUFFIX}: $(SRC_DIR)/pkgb.c
$(CC) -c $(CC_SWITCHES) $(SRC_DIR)/pkgb.c
${SHLIB_LD} -o pkgb${SHLIB_SUFFIX} pkgb.o ${SHLIB_LD_LIBS}
pkgc${SHLIB_SUFFIX}: $(SRC_DIR)/pkgc.c
$(CC) -c $(CC_SWITCHES) $(SRC_DIR)/pkgc.c
${SHLIB_LD} -o pkgc${SHLIB_SUFFIX} pkgc.o ${SHLIB_LD_LIBS}
pkgd${SHLIB_SUFFIX}: $(SRC_DIR)/pkgd.c
$(CC) -c $(CC_SWITCHES) $(SRC_DIR)/pkgd.c
${SHLIB_LD} -o pkgd${SHLIB_SUFFIX} pkgd.o ${SHLIB_LD_LIBS}
pkge${SHLIB_SUFFIX}: $(SRC_DIR)/pkge.c
$(CC) -c $(CC_SWITCHES) $(SRC_DIR)/pkge.c
${SHLIB_LD} -o pkge${SHLIB_SUFFIX} pkge.o ${SHLIB_LD_LIBS}
clean:
rm -f *.o *${SHLIB_SUFFIX} config.cache config.log config.status lib.exp
distclean: clean
rm -f Makefile
|
Changes to unix/dltest/README.
1 | This directory contains several files for testing Tcl's dynamic | | | < | < < < < < | | 1 2 3 4 5 6 | This directory contains several files for testing Tcl's dynamic loading capabilities. If shared libraries are supported then the build system in the parent directory will create the shared libs and load them into the tcltest executable. RCS: @(#) $Id: README,v 1.2.34.1 2002/02/05 02:22:05 wolfsuit Exp $ |
Deleted unix/dltest/configure.
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
Deleted unix/dltest/configure.in.
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
Changes to unix/install-sh.
| ︙ | ︙ | |||
55 56 57 58 59 60 61 62 63 64 65 66 67 68 | -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd="$stripprog" shift continue;; *) if [ x"$src" = x ] then src=$1 else | > > > > > | 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd="$stripprog" shift continue;; -S) stripcmd="$stripprog $2" shift shift continue;; *) if [ x"$src" = x ] then src=$1 else |
| ︙ | ︙ |
Changes to unix/mkLinks.
| ︙ | ︙ | |||
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
echo "Usage: mkLinks dir"
exit 1
fi
cd $1
echo foo > xyzzyTestingAVeryLongFileName.foo
x=`echo xyzzyTe*`
rm xyzzyTe*
if test "$x" != "xyzzyTestingAVeryLongFileName.foo"; then
exit
fi
if test -r Access.3; then
rm -f Tcl_Access.3
rm -f Tcl_Stat.3
ln Access.3 Tcl_Access.3
ln Access.3 Tcl_Stat.3
| > > > > > | 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
echo "Usage: mkLinks dir"
exit 1
fi
cd $1
echo foo > xyzzyTestingAVeryLongFileName.foo
x=`echo xyzzyTe*`
echo foo > xyzzyTestingaverylongfilename.foo
y=`echo xyzzyTestingav*`
rm xyzzyTe*
if test "$x" != "xyzzyTestingAVeryLongFileName.foo"; then
exit
fi
if test "$y" != "xyzzyTestingaverylongfilename.foo"; then
CASEINSENSITIVEFS=1
fi
if test -r Access.3; then
rm -f Tcl_Access.3
rm -f Tcl_Stat.3
ln Access.3 Tcl_Access.3
ln Access.3 Tcl_Stat.3
|
| ︙ | ︙ | |||
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 |
ln CallDel.3 Tcl_CallWhenDeleted.3
ln CallDel.3 Tcl_DontCallWhenDeleted.3
fi
if test -r ChnlStack.3; then
rm -f Tcl_StackChannel.3
rm -f Tcl_UnstackChannel.3
rm -f Tcl_GetStackedChannel.3
ln ChnlStack.3 Tcl_StackChannel.3
ln ChnlStack.3 Tcl_UnstackChannel.3
ln ChnlStack.3 Tcl_GetStackedChannel.3
fi
if test -r CmdCmplt.3; then
rm -f Tcl_CommandComplete.3
ln CmdCmplt.3 Tcl_CommandComplete.3
fi
if test -r Concat.3; then
rm -f Tcl_Concat.3
| > > | 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
ln CallDel.3 Tcl_CallWhenDeleted.3
ln CallDel.3 Tcl_DontCallWhenDeleted.3
fi
if test -r ChnlStack.3; then
rm -f Tcl_StackChannel.3
rm -f Tcl_UnstackChannel.3
rm -f Tcl_GetStackedChannel.3
rm -f Tcl_GetTopChannel.3
ln ChnlStack.3 Tcl_StackChannel.3
ln ChnlStack.3 Tcl_UnstackChannel.3
ln ChnlStack.3 Tcl_GetStackedChannel.3
ln ChnlStack.3 Tcl_GetTopChannel.3
fi
if test -r CmdCmplt.3; then
rm -f Tcl_CommandComplete.3
ln CmdCmplt.3 Tcl_CommandComplete.3
fi
if test -r Concat.3; then
rm -f Tcl_Concat.3
|
| ︙ | ︙ | |||
167 168 169 170 171 172 173 |
rm -f Tcl_IsChannelRegistered.3
rm -f Tcl_CutChannel.3
rm -f Tcl_SpliceChannel.3
rm -f Tcl_IsChannelExisting.3
rm -f Tcl_ClearChannelHandlers.3
rm -f Tcl_GetChannelThread.3
rm -f Tcl_ChannelBuffered.3
| < | 174 175 176 177 178 179 180 181 182 183 184 185 186 187 |
rm -f Tcl_IsChannelRegistered.3
rm -f Tcl_CutChannel.3
rm -f Tcl_SpliceChannel.3
rm -f Tcl_IsChannelExisting.3
rm -f Tcl_ClearChannelHandlers.3
rm -f Tcl_GetChannelThread.3
rm -f Tcl_ChannelBuffered.3
ln CrtChannel.3 Tcl_CreateChannel.3
ln CrtChannel.3 Tcl_GetChannelInstanceData.3
ln CrtChannel.3 Tcl_GetChannelType.3
ln CrtChannel.3 Tcl_GetChannelName.3
ln CrtChannel.3 Tcl_GetChannelHandle.3
ln CrtChannel.3 Tcl_GetChannelMode.3
ln CrtChannel.3 Tcl_GetChannelBufferSize.3
|
| ︙ | ︙ | |||
200 201 202 203 204 205 206 |
ln CrtChannel.3 Tcl_IsChannelRegistered.3
ln CrtChannel.3 Tcl_CutChannel.3
ln CrtChannel.3 Tcl_SpliceChannel.3
ln CrtChannel.3 Tcl_IsChannelExisting.3
ln CrtChannel.3 Tcl_ClearChannelHandlers.3
ln CrtChannel.3 Tcl_GetChannelThread.3
ln CrtChannel.3 Tcl_ChannelBuffered.3
| < | 206 207 208 209 210 211 212 213 214 215 216 217 218 219 |
ln CrtChannel.3 Tcl_IsChannelRegistered.3
ln CrtChannel.3 Tcl_CutChannel.3
ln CrtChannel.3 Tcl_SpliceChannel.3
ln CrtChannel.3 Tcl_IsChannelExisting.3
ln CrtChannel.3 Tcl_ClearChannelHandlers.3
ln CrtChannel.3 Tcl_GetChannelThread.3
ln CrtChannel.3 Tcl_ChannelBuffered.3
fi
if test -r CrtChnlHdlr.3; then
rm -f Tcl_CreateChannelHandler.3
rm -f Tcl_DeleteChannelHandler.3
ln CrtChnlHdlr.3 Tcl_CreateChannelHandler.3
ln CrtChnlHdlr.3 Tcl_DeleteChannelHandler.3
fi
|
| ︙ | ︙ | |||
301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 |
rm -f Tcl_DStringAppend.3
rm -f Tcl_DStringAppendElement.3
rm -f Tcl_DStringStartSublist.3
rm -f Tcl_DStringEndSublist.3
rm -f Tcl_DStringLength.3
rm -f Tcl_DStringValue.3
rm -f Tcl_DStringSetLength.3
rm -f Tcl_DStringFree.3
rm -f Tcl_DStringResult.3
rm -f Tcl_DStringGetResult.3
ln DString.3 Tcl_DStringInit.3
ln DString.3 Tcl_DStringAppend.3
ln DString.3 Tcl_DStringAppendElement.3
ln DString.3 Tcl_DStringStartSublist.3
ln DString.3 Tcl_DStringEndSublist.3
ln DString.3 Tcl_DStringLength.3
ln DString.3 Tcl_DStringValue.3
ln DString.3 Tcl_DStringSetLength.3
ln DString.3 Tcl_DStringFree.3
ln DString.3 Tcl_DStringResult.3
ln DString.3 Tcl_DStringGetResult.3
fi
if test -r DetachPids.3; then
rm -f Tcl_DetachPids.3
rm -f Tcl_ReapDetachedProcs.3
| > > | 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 |
rm -f Tcl_DStringAppend.3
rm -f Tcl_DStringAppendElement.3
rm -f Tcl_DStringStartSublist.3
rm -f Tcl_DStringEndSublist.3
rm -f Tcl_DStringLength.3
rm -f Tcl_DStringValue.3
rm -f Tcl_DStringSetLength.3
rm -f Tcl_DStringTrunc.3
rm -f Tcl_DStringFree.3
rm -f Tcl_DStringResult.3
rm -f Tcl_DStringGetResult.3
ln DString.3 Tcl_DStringInit.3
ln DString.3 Tcl_DStringAppend.3
ln DString.3 Tcl_DStringAppendElement.3
ln DString.3 Tcl_DStringStartSublist.3
ln DString.3 Tcl_DStringEndSublist.3
ln DString.3 Tcl_DStringLength.3
ln DString.3 Tcl_DStringValue.3
ln DString.3 Tcl_DStringSetLength.3
ln DString.3 Tcl_DStringTrunc.3
ln DString.3 Tcl_DStringFree.3
ln DString.3 Tcl_DStringResult.3
ln DString.3 Tcl_DStringGetResult.3
fi
if test -r DetachPids.3; then
rm -f Tcl_DetachPids.3
rm -f Tcl_ReapDetachedProcs.3
|
| ︙ | ︙ | |||
446 447 448 449 450 451 452 453 454 455 456 457 458 459 |
ln ExprLongObj.3 Tcl_ExprBooleanObj.3
ln ExprLongObj.3 Tcl_ExprObj.3
fi
if test -r FileSystem.3; then
rm -f Tcl_FSRegister.3
rm -f Tcl_FSUnregister.3
rm -f Tcl_FSData.3
rm -f Tcl_FSCopyFile.3
rm -f Tcl_FSCopyDirectory.3
rm -f Tcl_FSCreateDirectory.3
rm -f Tcl_FSDeleteFile.3
rm -f Tcl_FSRemoveDirectory.3
rm -f Tcl_FSRenameFile.3
rm -f Tcl_FSListVolumes.3
| > > > | 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 |
ln ExprLongObj.3 Tcl_ExprBooleanObj.3
ln ExprLongObj.3 Tcl_ExprObj.3
fi
if test -r FileSystem.3; then
rm -f Tcl_FSRegister.3
rm -f Tcl_FSUnregister.3
rm -f Tcl_FSData.3
rm -f Tcl_FSMountsChanged.3
rm -f Tcl_FSGetFileSystemForPath.3
rm -f Tcl_FSGetPathType.3
rm -f Tcl_FSCopyFile.3
rm -f Tcl_FSCopyDirectory.3
rm -f Tcl_FSCreateDirectory.3
rm -f Tcl_FSDeleteFile.3
rm -f Tcl_FSRemoveDirectory.3
rm -f Tcl_FSRenameFile.3
rm -f Tcl_FSListVolumes.3
|
| ︙ | ︙ | |||
483 484 485 486 487 488 489 490 491 492 493 494 495 496 |
rm -f Tcl_FSGetTranslatedStringPath.3
rm -f Tcl_FSNewNativePath.3
rm -f Tcl_FSGetNativePath.3
rm -f Tcl_FSFileSystemInfo.3
ln FileSystem.3 Tcl_FSRegister.3
ln FileSystem.3 Tcl_FSUnregister.3
ln FileSystem.3 Tcl_FSData.3
ln FileSystem.3 Tcl_FSCopyFile.3
ln FileSystem.3 Tcl_FSCopyDirectory.3
ln FileSystem.3 Tcl_FSCreateDirectory.3
ln FileSystem.3 Tcl_FSDeleteFile.3
ln FileSystem.3 Tcl_FSRemoveDirectory.3
ln FileSystem.3 Tcl_FSRenameFile.3
ln FileSystem.3 Tcl_FSListVolumes.3
| > > > | 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 |
rm -f Tcl_FSGetTranslatedStringPath.3
rm -f Tcl_FSNewNativePath.3
rm -f Tcl_FSGetNativePath.3
rm -f Tcl_FSFileSystemInfo.3
ln FileSystem.3 Tcl_FSRegister.3
ln FileSystem.3 Tcl_FSUnregister.3
ln FileSystem.3 Tcl_FSData.3
ln FileSystem.3 Tcl_FSMountsChanged.3
ln FileSystem.3 Tcl_FSGetFileSystemForPath.3
ln FileSystem.3 Tcl_FSGetPathType.3
ln FileSystem.3 Tcl_FSCopyFile.3
ln FileSystem.3 Tcl_FSCopyDirectory.3
ln FileSystem.3 Tcl_FSCreateDirectory.3
ln FileSystem.3 Tcl_FSDeleteFile.3
ln FileSystem.3 Tcl_FSRemoveDirectory.3
ln FileSystem.3 Tcl_FSRenameFile.3
ln FileSystem.3 Tcl_FSListVolumes.3
|
| ︙ | ︙ | |||
558 559 560 561 562 563 564 565 566 567 568 569 570 571 |
fi
if test -r GetStdChan.3; then
rm -f Tcl_GetStdChannel.3
rm -f Tcl_SetStdChannel.3
ln GetStdChan.3 Tcl_GetStdChannel.3
ln GetStdChan.3 Tcl_SetStdChannel.3
fi
if test -r GetVersion.3; then
rm -f Tcl_GetVersion.3
ln GetVersion.3 Tcl_GetVersion.3
fi
if test -r Hash.3; then
rm -f Tcl_InitHashTable.3
rm -f Tcl_InitCustomHashTable.3
| > > > > | 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 |
fi
if test -r GetStdChan.3; then
rm -f Tcl_GetStdChannel.3
rm -f Tcl_SetStdChannel.3
ln GetStdChan.3 Tcl_GetStdChannel.3
ln GetStdChan.3 Tcl_SetStdChannel.3
fi
if test -r GetTime.3; then
rm -f Tcl_GetTime.3
ln GetTime.3 Tcl_GetTime.3
fi
if test -r GetVersion.3; then
rm -f Tcl_GetVersion.3
ln GetVersion.3 Tcl_GetVersion.3
fi
if test -r Hash.3; then
rm -f Tcl_InitHashTable.3
rm -f Tcl_InitCustomHashTable.3
|
| ︙ | ︙ | |||
792 793 794 795 796 797 798 |
ln OpenTcp.3 Tcl_MakeTcpClientChannel.3
ln OpenTcp.3 Tcl_OpenTcpServer.3
fi
if test -r Panic.3; then
rm -f Tcl_Panic.3
rm -f Tcl_PanicVA.3
rm -f Tcl_SetPanicProc.3
| | | | 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 |
ln OpenTcp.3 Tcl_MakeTcpClientChannel.3
ln OpenTcp.3 Tcl_OpenTcpServer.3
fi
if test -r Panic.3; then
rm -f Tcl_Panic.3
rm -f Tcl_PanicVA.3
rm -f Tcl_SetPanicProc.3
if test "${CASEINSENSITIVEFS:-}" != "1"; then rm -f panic.3; fi
rm -f panicVA.3
ln Panic.3 Tcl_Panic.3
ln Panic.3 Tcl_PanicVA.3
ln Panic.3 Tcl_SetPanicProc.3
if test "${CASEINSENSITIVEFS:-}" != "1"; then ln Panic.3 panic.3; fi
ln Panic.3 panicVA.3
fi
if test -r ParseCmd.3; then
rm -f Tcl_ParseCommand.3
rm -f Tcl_ParseExpr.3
rm -f Tcl_ParseBraces.3
rm -f Tcl_ParseQuotedString.3
|
| ︙ | ︙ | |||
1157 1158 1159 1160 1161 1162 1163 |
ln Utf.3 Tcl_UtfBackslash.3
fi
if test -r WrongNumArgs.3; then
rm -f Tcl_WrongNumArgs.3
ln WrongNumArgs.3 Tcl_WrongNumArgs.3
fi
if test -r http.n; then
| | | | 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 |
ln Utf.3 Tcl_UtfBackslash.3
fi
if test -r WrongNumArgs.3; then
rm -f Tcl_WrongNumArgs.3
ln WrongNumArgs.3 Tcl_WrongNumArgs.3
fi
if test -r http.n; then
if test "${CASEINSENSITIVEFS:-}" != "1"; then rm -f Http.n; fi
if test "${CASEINSENSITIVEFS:-}" != "1"; then ln http.n Http.n; fi
fi
if test -r library.n; then
rm -f auto_execok.n
rm -f auto_import.n
rm -f auto_load.n
rm -f auto_mkindex.n
rm -f auto_mkindex_old.n
|
| ︙ | ︙ |
Changes to unix/mkLinks.tcl.
| ︙ | ︙ | |||
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
echo "Usage: mkLinks dir"
exit 1
fi
cd $1
echo foo > xyzzyTestingAVeryLongFileName.foo
x=`echo xyzzyTe*`
rm xyzzyTe*
if test "$x" != "xyzzyTestingAVeryLongFileName.foo"; then
exit
fi
}
foreach file $argv {
set in [open $file]
set tail [file tail $file]
set ext [file extension $file]
set state begin
while {[gets $in line] >= 0} {
| > > > > > > > > | 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
echo "Usage: mkLinks dir"
exit 1
fi
cd $1
echo foo > xyzzyTestingAVeryLongFileName.foo
x=`echo xyzzyTe*`
echo foo > xyzzyTestingaverylongfilename.foo
y=`echo xyzzyTestingav*`
rm xyzzyTe*
if test "$x" != "xyzzyTestingAVeryLongFileName.foo"; then
exit
fi
if test "$y" != "xyzzyTestingaverylongfilename.foo"; then
CASEINSENSITIVEFS=1
fi
}
set case_insensitive_test { if test "${CASEINSENSITIVEFS:-}" != "1"; then}
set case_insensitive_test_fi {; fi}
foreach file $argv {
set in [open $file]
set tail [file tail $file]
set ext [file extension $file]
set state begin
while {[gets $in line] >= 0} {
|
| ︙ | ︙ | |||
52 53 54 55 56 57 58 59 |
regsub {\\-.*} $line {} line
set rmOutput ""
set lnOutput ""
set namelist {}
foreach name [split $line ,] {
regsub -all {(\\)? } $name "" name
if {![string match $name*$ext $tail]} {
lappend namelist $name$ext
| > > > > > > > | | | 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
regsub {\\-.*} $line {} line
set rmOutput ""
set lnOutput ""
set namelist {}
foreach name [split $line ,] {
regsub -all {(\\)? } $name "" name
if {![string match $name*$ext $tail]} {
if {[string match -nocase $name*$ext $tail]} {
set tst $case_insensitive_test
set tstfi $case_insensitive_test_fi
} else {
set tst ""
set tstfi ""
}
lappend namelist $name$ext
append rmOutput " $tst rm -f $name$ext$tstfi\n"
append lnOutput " $tst ln $tail $name$ext$tstfi\n"
}
}
if { [llength $namelist] } {
puts "if test -r $tail; then"
puts -nonewline $rmOutput
puts -nonewline $lnOutput
puts "fi"
|
| ︙ | ︙ |
Changes to unix/tcl.m4.
| ︙ | ︙ | |||
54 55 56 57 58 59 60 |
break
fi
done
fi
# check in a few common install locations
if test x"${ac_cv_c_tclconfig}" = x ; then
| | | 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
break
fi
done
fi
# check in a few common install locations
if test x"${ac_cv_c_tclconfig}" = x ; then
for i in `ls -d ${exec_prefix}/lib 2>/dev/null` \
`ls -d /usr/local/lib 2>/dev/null` \
`ls -d /usr/contrib/lib 2>/dev/null` \
`ls -d /usr/lib 2>/dev/null` \
; do
if test -f "$i/tclConfig.sh" ; then
ac_cv_c_tclconfig=`(cd $i; pwd)`
break
|
| ︙ | ︙ | |||
149 150 151 152 153 154 155 |
ac_cv_c_tkconfig=`(cd $i/unix; pwd)`
break
fi
done
fi
# check in a few common install locations
if test x"${ac_cv_c_tkconfig}" = x ; then
| | | 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 |
ac_cv_c_tkconfig=`(cd $i/unix; pwd)`
break
fi
done
fi
# check in a few common install locations
if test x"${ac_cv_c_tkconfig}" = x ; then
for i in `ls -d ${exec_prefix}/lib 2>/dev/null` \
`ls -d /usr/local/lib 2>/dev/null` \
`ls -d /usr/contrib/lib 2>/dev/null` \
`ls -d /usr/lib 2>/dev/null` \
; do
if test -f "$i/tkConfig.sh" ; then
ac_cv_c_tkconfig=`(cd $i; pwd)`
break
|
| ︙ | ︙ | |||
215 216 217 218 219 220 221 |
AC_MSG_RESULT([loading])
. $TCL_BIN_DIR/tclConfig.sh
else
AC_MSG_RESULT([file not found])
fi
#
| > > > > > > > > > > > > > > > | < | | > > > > > > > > > > > > > | 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 |
AC_MSG_RESULT([loading])
. $TCL_BIN_DIR/tclConfig.sh
else
AC_MSG_RESULT([file not found])
fi
#
# If the TCL_BIN_DIR is the build directory (not the install directory),
# then set the common variable name to the value of the build variables.
# For example, the variable TCL_LIB_SPEC will be set to the value
# of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC
# instead of TCL_BUILD_LIB_SPEC since it will work with both an
# installed and uninstalled version of Tcl.
#
if test -f $TCL_BIN_DIR/Makefile ; then
TCL_LIB_SPEC=${TCL_BUILD_LIB_SPEC}
TCL_STUB_LIB_SPEC=${TCL_BUILD_STUB_LIB_SPEC}
TCL_STUB_LIB_PATH=${TCL_BUILD_STUB_LIB_PATH}
fi
#
# eval is required to do the TCL_DBGX substitution
#
eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\""
eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\""
eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\""
eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\""
eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\""
eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\""
AC_SUBST(TCL_VERSION)
AC_SUBST(TCL_BIN_DIR)
AC_SUBST(TCL_SRC_DIR)
AC_SUBST(TCL_LIB_FILE)
AC_SUBST(TCL_LIB_FLAG)
AC_SUBST(TCL_LIB_SPEC)
AC_SUBST(TCL_STUB_LIB_FILE)
AC_SUBST(TCL_STUB_LIB_FLAG)
AC_SUBST(TCL_STUB_LIB_SPEC)
])
#------------------------------------------------------------------------
# SC_LOAD_TKCONFIG --
#
# Load the tkConfig.sh file
#
|
| ︙ | ︙ | |||
399 400 401 402 403 404 405 | AC_CHECK_LIB(pthreads,pthread_mutex_init,tcl_ok=yes,tcl_ok=no) if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthreads" else AC_CHECK_LIB(c,pthread_mutex_init,tcl_ok=yes,tcl_ok=no) if test "$tcl_ok" = "no"; then | > > > > > | | > | 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 |
AC_CHECK_LIB(pthreads,pthread_mutex_init,tcl_ok=yes,tcl_ok=no)
if test "$tcl_ok" = "yes"; then
# The space is needed
THREADS_LIBS=" -lpthreads"
else
AC_CHECK_LIB(c,pthread_mutex_init,tcl_ok=yes,tcl_ok=no)
if test "$tcl_ok" = "no"; then
AC_CHECK_LIB(c_r,pthread_mutex_init,tcl_ok=yes,tcl_ok=no)
if test "$tcl_ok" = "yes"; then
# The space is needed
THREADS_LIBS=" -pthread"
else
TCL_THREADS=0
AC_MSG_WARN("Don t know how to find pthread lib on your system - you must disable thread support or edit the LIBS in the Makefile...")
fi
fi
fi
fi
# Does the pthread-implementation provide
# 'pthread_attr_setstacksize' ?
|
| ︙ | ︙ | |||
460 461 462 463 464 465 466 467 468 469 470 471 472 473 |
else
CFLAGS_DEFAULT='$(CFLAGS_OPTIMIZE)'
LDFLAGS_DEFAULT='$(LDFLAGS_OPTIMIZE)'
DBGX=""
AC_MSG_RESULT([no])
fi
])
#--------------------------------------------------------------------
# SC_CONFIG_CFLAGS
#
# Try to determine the proper flags to pass to the compiler
# for building shared libraries and other such nonsense.
#
| > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 |
else
CFLAGS_DEFAULT='$(CFLAGS_OPTIMIZE)'
LDFLAGS_DEFAULT='$(LDFLAGS_OPTIMIZE)'
DBGX=""
AC_MSG_RESULT([no])
fi
])
#------------------------------------------------------------------------
# SC_ENABLE_LANGINFO --
#
# Allows use of modern nl_langinfo check for better l10n.
# This is only relevant for Unix.
#
# Arguments:
# none
#
# Results:
#
# Adds the following arguments to configure:
# --enable-langinfo=yes|no (default is yes)
#
# Defines the following vars:
# HAVE_LANGINFO Triggers use of nl_langinfo if defined.
#
#------------------------------------------------------------------------
AC_DEFUN(SC_ENABLE_LANGINFO, [
AC_ARG_ENABLE(langinfo,
[ --enable-langinfo use nl_langinfo if possible to determine
encoding at startup, otherwise use old heuristic],
[langinfo_ok=$enableval], [langinfo_ok=yes])
HAVE_LANGINFO=0
if test "$langinfo_ok" = "yes"; then
if test "$langinfo_ok" = "yes"; then
AC_CHECK_HEADER(langinfo.h,[langinfo_ok=yes],[langinfo_ok=no])
fi
fi
AC_MSG_CHECKING([whether to use nl_langinfo])
if test "$langinfo_ok" = "yes"; then
AC_TRY_COMPILE([#include <langinfo.h>],
[nl_langinfo(CODESET);],[langinfo_ok=yes],[langinfo_ok=no])
if test "$langinfo_ok" = "no"; then
langinfo_ok="no (could not compile with nl_langinfo)";
fi
if test "$langinfo_ok" = "yes"; then
AC_DEFINE(HAVE_LANGINFO)
fi
fi
AC_MSG_RESULT([$langinfo_ok])
])
#--------------------------------------------------------------------
# SC_CONFIG_CFLAGS
#
# Try to determine the proper flags to pass to the compiler
# for building shared libraries and other such nonsense.
#
|
| ︙ | ︙ | |||
613 614 615 616 617 618 619 |
# Linux can use either -ldl or -ldld for dynamic loading.
AC_CHECK_LIB(dl, dlopen, have_dl=yes, have_dl=no)
# Step 3: set configuration options based on system name and version.
do64bit_ok=no
| < | 691 692 693 694 695 696 697 698 699 700 701 702 703 704 |
# Linux can use either -ldl or -ldld for dynamic loading.
AC_CHECK_LIB(dl, dlopen, have_dl=yes, have_dl=no)
# Step 3: set configuration options based on system name and version.
do64bit_ok=no
EXTRA_CFLAGS=""
TCL_EXPORT_FILE_SUFFIX=""
UNSHARED_LIB_SUFFIX=""
TCL_TRIM_DOTS='`echo ${VERSION} | tr -d .`'
ECHO_VERSION='`echo ${VERSION}`'
TCL_LIB_VERSIONS_OK=ok
CFLAGS_DEBUG=-g
|
| ︙ | ︙ | |||
645 646 647 648 649 650 651 652 653 654 655 656 657 658 |
if test "${TCL_THREADS}" = "1" -a "$GCC" != "yes" ; then
# AIX requires the _r compiler when gcc isn't being used
if test "${CC}" != "cc_r" ; then
CC=${CC}_r
fi
AC_MSG_RESULT(Using $CC for compiling with threads)
fi
# AIX-5 uses ELF style dynamic libraries
SHLIB_CFLAGS=""
SHLIB_LD="/usr/ccs/bin/ld -G -z text"
# Note: need the LIBS below, otherwise Tk won't find Tcl's
# symbols when dynamically loaded into tclsh.
| > | 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 |
if test "${TCL_THREADS}" = "1" -a "$GCC" != "yes" ; then
# AIX requires the _r compiler when gcc isn't being used
if test "${CC}" != "cc_r" ; then
CC=${CC}_r
fi
AC_MSG_RESULT(Using $CC for compiling with threads)
fi
LIBS="$LIBS -lc"
# AIX-5 uses ELF style dynamic libraries
SHLIB_CFLAGS=""
SHLIB_LD="/usr/ccs/bin/ld -G -z text"
# Note: need the LIBS below, otherwise Tk won't find Tcl's
# symbols when dynamically loaded into tclsh.
|
| ︙ | ︙ | |||
682 683 684 685 686 687 688 689 |
if test "${TCL_THREADS}" = "1" -a "$GCC" != "yes" ; then
# AIX requires the _r compiler when gcc isn't being used
if test "${CC}" != "cc_r" ; then
CC=${CC}_r
fi
AC_MSG_RESULT(Using $CC for compiling with threads)
fi
SHLIB_CFLAGS=""
| > | | 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 |
if test "${TCL_THREADS}" = "1" -a "$GCC" != "yes" ; then
# AIX requires the _r compiler when gcc isn't being used
if test "${CC}" != "cc_r" ; then
CC=${CC}_r
fi
AC_MSG_RESULT(Using $CC for compiling with threads)
fi
LIBS="$LIBS -lc"
SHLIB_CFLAGS=""
SHLIB_LD="${TCL_SRC_DIR}/unix/ldAix /bin/ld -bhalt:4 -bM:SRE -bE:lib.exp -H512 -T512 -bnoentry"
SHLIB_LD_LIBS='${LIBS}'
SHLIB_SUFFIX=".so"
DL_OBJS="tclLoadDl.o"
DL_LIBS="-ldl"
LDFLAGS=""
LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}'
TCL_NEEDS_EXP_FILE=1
|
| ︙ | ︙ | |||
966 967 968 969 970 971 972 |
UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.a'
TCL_LIB_VERSIONS_OK=nodots
;;
FreeBSD-*)
# FreeBSD 3.* and greater have ELF.
SHLIB_CFLAGS="-fPIC"
SHLIB_LD="ld -Bshareable -x"
| | | 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 |
UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.a'
TCL_LIB_VERSIONS_OK=nodots
;;
FreeBSD-*)
# FreeBSD 3.* and greater have ELF.
SHLIB_CFLAGS="-fPIC"
SHLIB_LD="ld -Bshareable -x"
SHLIB_LD_LIBS='${LIBS}'
SHLIB_SUFFIX=".so"
DL_OBJS="tclLoadDl.o"
DL_LIBS=""
LDFLAGS="-export-dynamic"
LD_SEARCH_FLAGS=""
# FreeBSD doesn't handle version numbers with dots.
|
| ︙ | ︙ | |||
1049 1050 1051 1052 1053 1054 1055 1056 |
LDFLAGS=""
LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
if test "$GCC" != "yes" ; then
EXTRA_CFLAGS="-DHAVE_TZSET -std1"
fi
# see pthread_intro(3) for pthread support on osf1, k.furukawa
if test "${TCL_THREADS}" = "1" ; then
EXTRA_CFLAGS="${EXTRA_CFLAGS} -DTCL_THREAD_STACK_MIN=PTHREAD_STACK_MIN*64"
| > < | > | 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 |
LDFLAGS=""
LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
if test "$GCC" != "yes" ; then
EXTRA_CFLAGS="-DHAVE_TZSET -std1"
fi
# see pthread_intro(3) for pthread support on osf1, k.furukawa
if test "${TCL_THREADS}" = "1" ; then
EXTRA_CFLAGS="${EXTRA_CFLAGS} -DHAVE_PTHREAD_ATTR_SETSTACKSIZE"
EXTRA_CFLAGS="${EXTRA_CFLAGS} -DTCL_THREAD_STACK_MIN=PTHREAD_STACK_MIN*64"
LIBS=`echo $LIBS | sed s/-lpthreads//`
if test "$GCC" = "yes" ; then
LIBS="$LIBS -lpthread -lmach -lexc"
else
EXTRA_CFLAGS="${EXTRA_CFLAGS} -pthread"
LDFLAGS="-pthread"
fi
fi
|
| ︙ | ︙ | |||
1148 1149 1150 1151 1152 1153 1154 |
# symbols when dynamically loaded into tclsh.
SHLIB_LD_LIBS='${LIBS}'
SHLIB_SUFFIX=".so"
DL_OBJS="tclLoadDl.o"
DL_LIBS="-ldl"
LDFLAGS=""
| > | > > > | 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 |
# symbols when dynamically loaded into tclsh.
SHLIB_LD_LIBS='${LIBS}'
SHLIB_SUFFIX=".so"
DL_OBJS="tclLoadDl.o"
DL_LIBS="-ldl"
LDFLAGS=""
if test "$GCC" = "yes" ; then
LD_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}'
else
LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}'
fi
;;
SunOS-5*)
# Note: If _REENTRANT isn't defined, then Solaris
# won't define thread-safe library routines.
AC_DEFINE(_REENTRANT)
|
| ︙ | ︙ |
Changes to unix/tclConfig.sh.in.
1 2 3 4 5 6 7 8 9 10 11 | # tclConfig.sh -- # # This shell script (for sh) is generated automatically by Tcl's # configure script. It will create shell variables for most of # the configuration options discovered by the configure script. # This script is intended to be included by the configure scripts # for Tcl extensions so that they don't have to figure this all # out for themselves. # # The information in this file is specific to a single platform. # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # tclConfig.sh -- # # This shell script (for sh) is generated automatically by Tcl's # configure script. It will create shell variables for most of # the configuration options discovered by the configure script. # This script is intended to be included by the configure scripts # for Tcl extensions so that they don't have to figure this all # out for themselves. # # The information in this file is specific to a single platform. # # RCS: @(#) $Id: tclConfig.sh.in,v 1.15.12.1 2002/02/05 02:22:05 wolfsuit Exp $ # Tcl's version number. TCL_VERSION='@TCL_VERSION@' TCL_MAJOR_VERSION='@TCL_MAJOR_VERSION@' TCL_MINOR_VERSION='@TCL_MINOR_VERSION@' TCL_PATCH_LEVEL='@TCL_PATCH_LEVEL@' |
| ︙ | ︙ | |||
111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
# String to pass to linker to pick up the Tcl library from its
# build directory.
TCL_BUILD_LIB_SPEC='@TCL_BUILD_LIB_SPEC@'
# String to pass to linker to pick up the Tcl library from its
# installed directory.
TCL_LIB_SPEC='@TCL_LIB_SPEC@'
# Indicates whether a version numbers should be used in -l switches
# ("ok" means it's safe to use switches like -ltcl7.5; "nodots" means
# use switches like -ltcl75). SunOS and FreeBSD require "nodots", for
# example.
TCL_LIB_VERSIONS_OK='@TCL_LIB_VERSIONS_OK@'
| > > > > | 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
# String to pass to linker to pick up the Tcl library from its
# build directory.
TCL_BUILD_LIB_SPEC='@TCL_BUILD_LIB_SPEC@'
# String to pass to linker to pick up the Tcl library from its
# installed directory.
TCL_LIB_SPEC='@TCL_LIB_SPEC@'
# String to pass to the compiler so that an extension can
# find installed Tcl headers.
TCL_INCLUDE_SPEC='@TCL_INCLUDE_SPEC@'
# Indicates whether a version numbers should be used in -l switches
# ("ok" means it's safe to use switches like -ltcl7.5; "nodots" means
# use switches like -ltcl75). SunOS and FreeBSD require "nodots", for
# example.
TCL_LIB_VERSIONS_OK='@TCL_LIB_VERSIONS_OK@'
|
| ︙ | ︙ |
Changes to unix/tclLoadAout.c.
| ︙ | ︙ | |||
10 11 12 13 14 15 16 | * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * This work was supported in part by the ARPA Manufacturing Automation * and Design Engineering (MADE) Initiative through ARPA contract * F33615-94-C-4400. * | | > > > > > | 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * This work was supported in part by the ARPA Manufacturing Automation * and Design Engineering (MADE) Initiative through ARPA contract * F33615-94-C-4400. * * RCS: @(#) $Id: tclLoadAout.c,v 1.7.2.1 2002/02/05 02:22:05 wolfsuit Exp $ */ #include "tclInt.h" #include <fcntl.h> #ifdef HAVE_EXEC_AOUT_H # include <sys/exec_aout.h> #endif #ifdef HAVE_UNISTD_H # include <unistd.h> #else # include "../compat/unistd.h" #endif /* * Some systems describe the a.out header in sys/exec.h, and some in * a.out.h. */ #ifdef USE_SYS_EXEC_H |
| ︙ | ︙ | |||
332 333 334 335 336 337 338 |
static int
FindLibraries (interp, fileName, buf)
Tcl_Interp * interp; /* Used for error reporting */
char * fileName; /* Name of the load module */
Tcl_DString * buf; /* Buffer where the -l an -L flags */
{
FILE * f; /* The load module */
| | | 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 |
static int
FindLibraries (interp, fileName, buf)
Tcl_Interp * interp; /* Used for error reporting */
char * fileName; /* Name of the load module */
Tcl_DString * buf; /* Buffer where the -l an -L flags */
{
FILE * f; /* The load module */
int c = 0; /* Byte from the load module */
char * p;
Tcl_DString ds;
CONST char *native;
/* Open the load module */
native = Tcl_UtfToExternalDString(NULL, fileName, -1, &ds);
|
| ︙ | ︙ | |||
465 466 467 468 469 470 471 | * None. * *---------------------------------------------------------------------- */ int TclGuessPackageName(fileName, bufPtr) | | > | < | | 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 |
* None.
*
*----------------------------------------------------------------------
*/
int
TclGuessPackageName(fileName, bufPtr)
CONST char *fileName; /* Name of file containing package (already
* translated to local form if needed). */
Tcl_DString *bufPtr; /* Initialized empty dstring. Append
* package name to this if possible. */
{
CONST char *p, *q;
char *r;
if ((q = strrchr(fileName,'/'))) {
q++;
} else {
q = fileName;
}
if (!strncmp(q,"lib",3)) {
q+=3;
}
|
| ︙ | ︙ |
Changes to unix/tclLoadDl.c.
1 2 3 4 5 6 7 8 9 10 11 12 | /* * tclLoadDl.c -- * * This procedure provides a version of the TclLoadFile that * works with the "dlopen" and "dlsym" library procedures for * dynamic loading. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /* * tclLoadDl.c -- * * This procedure provides a version of the TclLoadFile that * works with the "dlopen" and "dlsym" library procedures for * dynamic loading. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclLoadDl.c,v 1.7.2.1 2002/02/05 02:22:05 wolfsuit Exp $ */ #include "tclInt.h" #ifdef NO_DLFCN_H # include "../compat/dlfcn.h" #else # include <dlfcn.h> |
| ︙ | ︙ | |||
177 178 179 180 181 182 183 | * None. * *---------------------------------------------------------------------- */ int TclGuessPackageName(fileName, bufPtr) | | | 177 178 179 180 181 182 183 184 185 186 187 188 189 190 |
* None.
*
*----------------------------------------------------------------------
*/
int
TclGuessPackageName(fileName, bufPtr)
CONST char *fileName; /* Name of file containing package (already
* translated to local form if needed). */
Tcl_DString *bufPtr; /* Initialized empty dstring. Append
* package name to this if possible. */
{
return 0;
}
|
Changes to unix/tclLoadDld.c.
| ︙ | ︙ | |||
8 9 10 11 12 13 14 | * makes more sense to use "dl_open" etc. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | * makes more sense to use "dl_open" etc. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclLoadDld.c,v 1.6.2.1 2002/02/05 02:22:05 wolfsuit Exp $ */ #include "tclInt.h" #include "dld.h" /* * In some systems, like SunOS 4.1.3, the RTLD_NOW flag isn't defined |
| ︙ | ︙ | |||
89 90 91 92 93 94 95 |
"initialization failed for dynamic loader: ",
dld_strerror(returnCode), (char *) NULL);
return TCL_ERROR;
}
firstTime = 0;
}
| | | 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
"initialization failed for dynamic loader: ",
dld_strerror(returnCode), (char *) NULL);
return TCL_ERROR;
}
firstTime = 0;
}
if ((returnCode = dld_link(Tcl_GetString(pathPtr))) != 0) {
Tcl_AppendResult(interp, "couldn't load file \"",
Tcl_GetString(pathPtr),
"\": ", dld_strerror(returnCode), (char *) NULL);
return TCL_ERROR;
}
*proc1Ptr = (Tcl_PackageInitProc *) dld_get_func(sym1);
*proc2Ptr = (Tcl_PackageInitProc *) dld_get_func(sym2);
|
| ︙ | ︙ | |||
157 158 159 160 161 162 163 | * None. * *---------------------------------------------------------------------- */ int TclGuessPackageName(fileName, bufPtr) | | | 157 158 159 160 161 162 163 164 165 166 167 168 169 170 |
* None.
*
*----------------------------------------------------------------------
*/
int
TclGuessPackageName(fileName, bufPtr)
CONST char *fileName; /* Name of file containing package (already
* translated to local form if needed). */
Tcl_DString *bufPtr; /* Initialized empty dstring. Append
* package name to this if possible. */
{
return 0;
}
|
Changes to unix/tclLoadDyld.c.
1 2 3 4 | /* * tclLoadDyld.c -- * * This procedure provides a version of the TclLoadFile that | | | < | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | /* * tclLoadDyld.c -- * * This procedure provides a version of the TclLoadFile that * works with Apple's dyld dynamic loading. This file * provided by Wilfredo Sanchez (wsanchez@apple.com). * This works on Mac OS X. * * Copyright (c) 1995 Apple Computer, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclLoadDyld.c,v 1.5.2.2 2002/02/05 02:22:05 wolfsuit Exp $ */ #include "tclInt.h" #include <mach-o/dyld.h> /* *---------------------------------------------------------------------- |
| ︙ | ︙ | |||
56 57 58 59 60 61 62 |
Tcl_FSUnloadFileProc **unloadProcPtr;
/* Filled with address of Tcl_FSUnloadFileProc
* function which should be used for
* this file. */
{
NSSymbol symbol;
enum DYLD_BOOL dyld_return;
| | | < | > > | > | > > > | > > > > > | < | > > > > | > > | > > | > > | < | > > | < > | | | 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
Tcl_FSUnloadFileProc **unloadProcPtr;
/* Filled with address of Tcl_FSUnloadFileProc
* function which should be used for
* this file. */
{
NSSymbol symbol;
enum DYLD_BOOL dyld_return;
Tcl_DString newName, ds;
char *native;
native = Tcl_FSGetNativePath(pathPtr);
dyld_return = NSAddLibrary(native);
if (dyld_return != TRUE) {
Tcl_AppendResult(interp, "dyld: couldn't add library \"",
Tcl_GetString(pathPtr),
"\": ", Tcl_PosixError(interp), (char *) NULL);
return TCL_ERROR;
}
*unloadProcPtr = &TclpUnloadFile;
/*
* dyld adds an underscore to the beginning of symbol names.
*/
native = Tcl_UtfToExternalDString(NULL, sym1, -1, &ds);
Tcl_DStringInit(&newName);
Tcl_DStringAppend(&newName, "_", 1);
native = Tcl_DStringAppend(&newName, native, -1);
if(NSIsSymbolNameDefined(native)) {
symbol = NSLookupAndBindSymbol(native);
*proc1Ptr = NSAddressOfSymbol(symbol);
*clientDataPtr = NSModuleForSymbol(symbol);
} else {
*proc1Ptr=NULL;
*clientDataPtr=NULL;
}
Tcl_DStringFree(&newName);
Tcl_DStringFree(&ds);
native = Tcl_UtfToExternalDString(NULL, sym2, -1, &ds);
Tcl_DStringInit(&newName);
Tcl_DStringAppend(&newName, "_", 1);
native = Tcl_DStringAppend(&newName, native, -1);
if(NSIsSymbolNameDefined(native)) {
symbol = NSLookupAndBindSymbol(native);
*proc2Ptr = NSAddressOfSymbol(symbol);
} else {
*proc2Ptr=NULL;
}
Tcl_DStringFree(&newName);
Tcl_DStringFree(&ds);
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
* TclpUnloadFile --
|
| ︙ | ︙ | |||
137 138 139 140 141 142 143 | * None. * *---------------------------------------------------------------------- */ int TclGuessPackageName(fileName, bufPtr) | | | 156 157 158 159 160 161 162 163 164 165 166 167 168 169 |
* None.
*
*----------------------------------------------------------------------
*/
int
TclGuessPackageName(fileName, bufPtr)
CONST char *fileName; /* Name of file containing package (already
* translated to local form if needed). */
Tcl_DString *bufPtr; /* Initialized empty dstring. Append
* package name to this if possible. */
{
return 0;
}
|
Changes to unix/tclLoadNext.c.
1 2 3 4 5 6 7 8 9 10 11 12 | /* * tclLoadNext.c -- * * This procedure provides a version of the TclLoadFile that * works with NeXTs rld_* dynamic loading. This file provided * by Pedja Bogdanovich. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /* * tclLoadNext.c -- * * This procedure provides a version of the TclLoadFile that * works with NeXTs rld_* dynamic loading. This file provided * by Pedja Bogdanovich. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclLoadNext.c,v 1.6.2.1 2002/02/05 02:22:05 wolfsuit Exp $ */ #include "tclInt.h" #include <mach-o/rld.h> #include <streams/streams.h> /* |
| ︙ | ︙ | |||
136 137 138 139 140 141 142 | * None. * *---------------------------------------------------------------------- */ int TclGuessPackageName(fileName, bufPtr) | | | 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
* None.
*
*----------------------------------------------------------------------
*/
int
TclGuessPackageName(fileName, bufPtr)
CONST char *fileName; /* Name of file containing package (already
* translated to local form if needed). */
Tcl_DString *bufPtr; /* Initialized empty dstring. Append
* package name to this if possible. */
{
return 0;
}
|
Changes to unix/tclLoadOSF.c.
| ︙ | ︙ | |||
27 28 29 30 31 32 33 | * John Robert LoVerso <loverso@freebsd.osf.org> * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | * John Robert LoVerso <loverso@freebsd.osf.org> * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclLoadOSF.c,v 1.6.2.1 2002/02/05 02:22:05 wolfsuit Exp $ */ #include "tclInt.h" #include <sys/types.h> #include <loader.h> /* |
| ︙ | ︙ | |||
154 155 156 157 158 159 160 | * None. * *---------------------------------------------------------------------- */ int TclGuessPackageName(fileName, bufPtr) | | | 154 155 156 157 158 159 160 161 162 163 164 165 166 167 |
* None.
*
*----------------------------------------------------------------------
*/
int
TclGuessPackageName(fileName, bufPtr)
CONST char *fileName; /* Name of file containing package (already
* translated to local form if needed). */
Tcl_DString *bufPtr; /* Initialized empty dstring. Append
* package name to this if possible. */
{
return 0;
}
|
Changes to unix/tclLoadShl.c.
1 2 3 4 5 6 7 8 9 10 11 12 | /* * tclLoadShl.c -- * * This procedure provides a version of the TclLoadFile that works * with the "shl_load" and "shl_findsym" library procedures for * dynamic loading (e.g. for HP machines). * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /* * tclLoadShl.c -- * * This procedure provides a version of the TclLoadFile that works * with the "shl_load" and "shl_findsym" library procedures for * dynamic loading (e.g. for HP machines). * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclLoadShl.c,v 1.8.2.1 2002/02/05 02:22:05 wolfsuit Exp $ */ #include <dl.h> /* * On some HP machines, dl.h defines EXTERN; remove that definition. */ |
| ︙ | ︙ | |||
170 171 172 173 174 175 176 | * None. * *---------------------------------------------------------------------- */ int TclGuessPackageName(fileName, bufPtr) | | | 170 171 172 173 174 175 176 177 178 179 180 181 182 183 |
* None.
*
*----------------------------------------------------------------------
*/
int
TclGuessPackageName(fileName, bufPtr)
CONST char *fileName; /* Name of file containing package (already
* translated to local form if needed). */
Tcl_DString *bufPtr; /* Initialized empty dstring. Append
* package name to this if possible. */
{
return 0;
}
|
Changes to unix/tclMtherr.c.
1 2 3 4 5 6 7 8 9 10 11 12 | /* * tclMatherr.c -- * * This function provides a default implementation of the * "matherr" function, for SYS-V systems where it's needed. * * Copyright (c) 1993-1994 The Regents of the University of California. * Copyright (c) 1994 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /* * tclMatherr.c -- * * This function provides a default implementation of the * "matherr" function, for SYS-V systems where it's needed. * * Copyright (c) 1993-1994 The Regents of the University of California. * Copyright (c) 1994 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclMtherr.c,v 1.3.28.1 2002/02/05 02:22:05 wolfsuit Exp $ */ #include "tclInt.h" #include <math.h> #ifndef TCL_GENERIC_ONLY #include "tclPort.h" |
| ︙ | ︙ | |||
57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
*
* Side effects:
* Sets errno based on what's in xPtr.
*
*----------------------------------------------------------------------
*/
int
matherr(xPtr)
struct exception *xPtr; /* Describes error that occurred. */
{
if (TclMathInProgress()) {
return 0;
}
| > > > | 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
*
* Side effects:
* Sets errno based on what's in xPtr.
*
*----------------------------------------------------------------------
*/
#ifdef __APPLE_CC__
__private_extern__
#endif
int
matherr(xPtr)
struct exception *xPtr; /* Describes error that occurred. */
{
if (TclMathInProgress()) {
return 0;
}
|
| ︙ | ︙ |
Changes to unix/tclUnixChan.c.
1 2 3 4 5 6 7 8 9 10 11 12 | /* * tclUnixChan.c * * Common channel driver for Unix channels based on files, command * pipes and TCP sockets. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * Copyright (c) 1998-1999 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /* * tclUnixChan.c * * Common channel driver for Unix channels based on files, command * pipes and TCP sockets. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * Copyright (c) 1998-1999 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclUnixChan.c,v 1.21.8.1 2002/02/05 02:22:05 wolfsuit Exp $ */ #include "tclInt.h" /* Internal definitions for Tcl. */ #include "tclPort.h" /* Portability features for Tcl. */ /* * sys/ioctl.h has already been included by tclPort.h. Including termios.h |
| ︙ | ︙ | |||
88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
* The following structure describes per-instance state of a tty-based
* channel.
*/
typedef struct TtyState {
FileState fs; /* Per-instance state of the file
* descriptor. Must be the first field. */
IOSTATE savedState; /* Initial state of device. Used to reset
* state when device closed. */
} TtyState;
/*
* The following structure is used to set or get the serial port
* attributes in a platform-independant manner.
| > > | 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
* The following structure describes per-instance state of a tty-based
* channel.
*/
typedef struct TtyState {
FileState fs; /* Per-instance state of the file
* descriptor. Must be the first field. */
int stateUpdated; /* Flag to say if the state has been
* modified and needs resetting. */
IOSTATE savedState; /* Initial state of device. Used to reset
* state when device closed. */
} TtyState;
/*
* The following structure is used to set or get the serial port
* attributes in a platform-independant manner.
|
| ︙ | ︙ | |||
169 170 171 172 173 174 175 | #define SOCKET_BUFSIZE 4096 /* * Static routines for this file: */ static TcpState * CreateSocket _ANSI_ARGS_((Tcl_Interp *interp, | | | | | | | | | | | | 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 |
#define SOCKET_BUFSIZE 4096
/*
* Static routines for this file:
*/
static TcpState * CreateSocket _ANSI_ARGS_((Tcl_Interp *interp,
int port, CONST char *host, int server,
CONST char *myaddr, int myport, int async));
static int CreateSocketAddress _ANSI_ARGS_(
(struct sockaddr_in *sockaddrPtr,
CONST char *host, int port));
static int FileBlockModeProc _ANSI_ARGS_((
ClientData instanceData, int mode));
static int FileCloseProc _ANSI_ARGS_((ClientData instanceData,
Tcl_Interp *interp));
static int FileGetHandleProc _ANSI_ARGS_((ClientData instanceData,
int direction, ClientData *handlePtr));
static int FileInputProc _ANSI_ARGS_((ClientData instanceData,
char *buf, int toRead, int *errorCode));
static int FileOutputProc _ANSI_ARGS_((
ClientData instanceData, CONST char *buf,
int toWrite, int *errorCode));
static int FileSeekProc _ANSI_ARGS_((ClientData instanceData,
long offset, int mode, int *errorCode));
static void FileWatchProc _ANSI_ARGS_((ClientData instanceData,
int mask));
static void TcpAccept _ANSI_ARGS_((ClientData data, int mask));
static int TcpBlockModeProc _ANSI_ARGS_((ClientData data,
int mode));
static int TcpCloseProc _ANSI_ARGS_((ClientData instanceData,
Tcl_Interp *interp));
static int TcpGetHandleProc _ANSI_ARGS_((ClientData instanceData,
int direction, ClientData *handlePtr));
static int TcpGetOptionProc _ANSI_ARGS_((ClientData instanceData,
Tcl_Interp *interp, CONST char *optionName,
Tcl_DString *dsPtr));
static int TcpInputProc _ANSI_ARGS_((ClientData instanceData,
char *buf, int toRead, int *errorCode));
static int TcpOutputProc _ANSI_ARGS_((ClientData instanceData,
CONST char *buf, int toWrite, int *errorCode));
static void TcpWatchProc _ANSI_ARGS_((ClientData instanceData,
int mask));
#ifdef SUPPORTS_TTY
static int TtyCloseProc _ANSI_ARGS_((ClientData instanceData,
Tcl_Interp *interp));
static void TtyGetAttributes _ANSI_ARGS_((int fd,
TtyAttrs *ttyPtr));
static int TtyGetOptionProc _ANSI_ARGS_((ClientData instanceData,
Tcl_Interp *interp, CONST char *optionName,
Tcl_DString *dsPtr));
static FileState * TtyInit _ANSI_ARGS_((int fd, int initialize));
static int TtyParseMode _ANSI_ARGS_((Tcl_Interp *interp,
CONST char *mode, int *speedPtr, int *parityPtr,
int *dataPtr, int *stopPtr));
static void TtySetAttributes _ANSI_ARGS_((int fd,
TtyAttrs *ttyPtr));
static int TtySetOptionProc _ANSI_ARGS_((ClientData instanceData,
Tcl_Interp *interp, CONST char *optionName,
CONST char *value));
#endif /* SUPPORTS_TTY */
static int WaitForConnect _ANSI_ARGS_((TcpState *statePtr,
int *errorCodePtr));
/*
* This structure describes the channel type structure for file based IO:
*/
|
| ︙ | ︙ | |||
415 416 417 418 419 420 421 |
*
*----------------------------------------------------------------------
*/
static int
FileOutputProc(instanceData, buf, toWrite, errorCodePtr)
ClientData instanceData; /* File state. */
| | | 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 |
*
*----------------------------------------------------------------------
*/
static int
FileOutputProc(instanceData, buf, toWrite, errorCodePtr)
ClientData instanceData; /* File state. */
CONST char *buf; /* The data buffer. */
int toWrite; /* How many bytes to write? */
int *errorCodePtr; /* Where to store error code. */
{
FileState *fsPtr = (FileState *) instanceData;
int written;
*errorCodePtr = 0;
|
| ︙ | ︙ | |||
628 629 630 631 632 633 634 |
TtyCloseProc(instanceData, interp)
ClientData instanceData; /* Tty state. */
Tcl_Interp *interp; /* For error reporting - unused. */
{
TtyState *ttyPtr;
ttyPtr = (TtyState *) instanceData;
| > | > | 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 |
TtyCloseProc(instanceData, interp)
ClientData instanceData; /* Tty state. */
Tcl_Interp *interp; /* For error reporting - unused. */
{
TtyState *ttyPtr;
ttyPtr = (TtyState *) instanceData;
if (ttyPtr->stateUpdated) {
SETIOSTATE(ttyPtr->fs.fd, &ttyPtr->savedState);
}
return FileCloseProc(instanceData, interp);
}
/*
*----------------------------------------------------------------------
*
* TtySetOptionProc --
|
| ︙ | ︙ | |||
654 655 656 657 658 659 660 |
*----------------------------------------------------------------------
*/
static int
TtySetOptionProc(instanceData, interp, optionName, value)
ClientData instanceData; /* File state. */
Tcl_Interp *interp; /* For error reporting - can be NULL. */
| | | > | 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 |
*----------------------------------------------------------------------
*/
static int
TtySetOptionProc(instanceData, interp, optionName, value)
ClientData instanceData; /* File state. */
Tcl_Interp *interp; /* For error reporting - can be NULL. */
CONST char *optionName; /* Which option to set? */
CONST char *value; /* New value for option. */
{
FileState *fsPtr = (FileState *) instanceData;
unsigned int len;
TtyAttrs tty;
len = strlen(optionName);
if ((len > 1) && (strncmp(optionName, "-mode", len) == 0)) {
if (TtyParseMode(interp, value, &tty.baud, &tty.parity, &tty.data,
&tty.stop) != TCL_OK) {
return TCL_ERROR;
}
/*
* system calls results should be checked there. -- dl
*/
TtySetAttributes(fsPtr->fd, &tty);
((TtyState *) fsPtr)->stateUpdated = 1;
return TCL_OK;
} else {
return Tcl_BadChannelOption(interp, optionName, "mode");
}
}
/*
|
| ︙ | ︙ | |||
704 705 706 707 708 709 710 |
*----------------------------------------------------------------------
*/
static int
TtyGetOptionProc(instanceData, interp, optionName, dsPtr)
ClientData instanceData; /* File state. */
Tcl_Interp *interp; /* For error reporting - can be NULL. */
| | | 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 |
*----------------------------------------------------------------------
*/
static int
TtyGetOptionProc(instanceData, interp, optionName, dsPtr)
ClientData instanceData; /* File state. */
Tcl_Interp *interp; /* For error reporting - can be NULL. */
CONST char *optionName; /* Option to get. */
Tcl_DString *dsPtr; /* Where to store value(s). */
{
FileState *fsPtr = (FileState *) instanceData;
unsigned int len;
char buf[3 * TCL_INTEGER_SPACE + 16];
TtyAttrs tty;
|
| ︙ | ︙ | |||
1223 1224 1225 1226 1227 1228 1229 |
* be initialized. */
int initialize;
{
TtyState *ttyPtr;
ttyPtr = (TtyState *) ckalloc((unsigned) sizeof(TtyState));
GETIOSTATE(fd, &ttyPtr->savedState);
| | | | | | | | | | | < | > > > > > > > > > | > | 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 |
* be initialized. */
int initialize;
{
TtyState *ttyPtr;
ttyPtr = (TtyState *) ckalloc((unsigned) sizeof(TtyState));
GETIOSTATE(fd, &ttyPtr->savedState);
ttyPtr->stateUpdated = 0;
if (initialize) {
IOSTATE iostate = ttyPtr->savedState;
#if defined(USE_TERMIOS) || defined(USE_TERMIO)
if (iostate.c_iflag != IGNBRK ||
iostate.c_oflag != 0 ||
iostate.c_lflag != 0 ||
iostate.c_cflag & CREAD ||
iostate.c_cc[VMIN] != 1 ||
iostate.c_cc[VTIME] != 0) {
ttyPtr->stateUpdated = 1;
}
iostate.c_iflag = IGNBRK;
iostate.c_oflag = 0;
iostate.c_lflag = 0;
iostate.c_cflag |= CREAD;
iostate.c_cc[VMIN] = 1;
iostate.c_cc[VTIME] = 0;
#endif /* USE_TERMIOS|USE_TERMIO */
#ifdef USE_SGTTY
if ((iostate.sg_flags & (EVENP | ODDP)) ||
!(iostate.sg_flags & RAW)) {
ttyPtr->stateUpdated = 1;
}
iostate.sg_flags &= (EVENP | ODDP);
iostate.sg_flags |= RAW;
#endif /* USE_SGTTY */
/*
* Only update if we're changing anything to avoid possible
* blocking.
*/
if (ttyPtr->stateUpdated) {
SETIOSTATE(fd, &iostate);
}
}
return &ttyPtr->fs;
}
#endif /* SUPPORTS_TTY */
/*
|
| ︙ | ︙ | |||
1281 1282 1283 1284 1285 1286 1287 |
*/
Tcl_Channel
TclpOpenFileChannel(interp, pathPtr, modeString, permissions)
Tcl_Interp *interp; /* Interpreter for error reporting;
* can be NULL. */
Tcl_Obj *pathPtr; /* Name of file to open. */
| | | | 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 |
*/
Tcl_Channel
TclpOpenFileChannel(interp, pathPtr, modeString, permissions)
Tcl_Interp *interp; /* Interpreter for error reporting;
* can be NULL. */
Tcl_Obj *pathPtr; /* Name of file to open. */
CONST char *modeString; /* A list of POSIX open modes or
* a string such as "rw". */
int permissions; /* If the open involves creating a
* file, with what modes to create
* it? */
{
int fd, seekFlag, mode, channelPermissions;
FileState *fsPtr;
CONST char *native, *translation;
char channelName[16 + TCL_INTEGER_SPACE];
Tcl_ChannelType *channelTypePtr;
#ifdef DEPRECATED
ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
#endif
mode = TclGetOpenMode(interp, modeString, &seekFlag);
|
| ︙ | ︙ | |||
1690 1691 1692 1693 1694 1695 1696 |
*
*----------------------------------------------------------------------
*/
static int
TcpOutputProc(instanceData, buf, toWrite, errorCodePtr)
ClientData instanceData; /* Socket state. */
| | | 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 |
*
*----------------------------------------------------------------------
*/
static int
TcpOutputProc(instanceData, buf, toWrite, errorCodePtr)
ClientData instanceData; /* Socket state. */
CONST char *buf; /* The data buffer. */
int toWrite; /* How many bytes to write? */
int *errorCodePtr; /* Where to store error code. */
{
TcpState *statePtr = (TcpState *) instanceData;
int written;
int state; /* Of waiting for connection. */
|
| ︙ | ︙ | |||
1782 1783 1784 1785 1786 1787 1788 |
*----------------------------------------------------------------------
*/
static int
TcpGetOptionProc(instanceData, interp, optionName, dsPtr)
ClientData instanceData; /* Socket state. */
Tcl_Interp *interp; /* For error reporting - can be NULL. */
| | | 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 |
*----------------------------------------------------------------------
*/
static int
TcpGetOptionProc(instanceData, interp, optionName, dsPtr)
ClientData instanceData; /* Socket state. */
Tcl_Interp *interp; /* For error reporting - can be NULL. */
CONST char *optionName; /* Name of the option to
* retrieve the value for, or
* NULL to get all options and
* their values. */
Tcl_DString *dsPtr; /* Where to store the computed
* value; initialized by caller. */
{
TcpState *statePtr = (TcpState *) instanceData;
|
| ︙ | ︙ | |||
2006 2007 2008 2009 2010 2011 2012 |
*----------------------------------------------------------------------
*/
static TcpState *
CreateSocket(interp, port, host, server, myaddr, myport, async)
Tcl_Interp *interp; /* For error reporting; can be NULL. */
int port; /* Port number to open. */
| | | | 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 |
*----------------------------------------------------------------------
*/
static TcpState *
CreateSocket(interp, port, host, server, myaddr, myport, async)
Tcl_Interp *interp; /* For error reporting; can be NULL. */
int port; /* Port number to open. */
CONST char *host; /* Name of host on which to open port.
* NULL implies INADDR_ANY */
int server; /* 1 if socket should be a server socket,
* else 0 for a client socket. */
CONST char *myaddr; /* Optional client-side address */
int myport; /* Optional client-side port */
int async; /* If nonzero and creating a client socket,
* attempt to do an async connect. Otherwise
* do a synchronous connect or bind. */
{
int status, sock, asyncConnect, curState, origState;
struct sockaddr_in sockaddr; /* socket address */
|
| ︙ | ︙ | |||
2187 2188 2189 2190 2191 2192 2193 |
*
*----------------------------------------------------------------------
*/
static int
CreateSocketAddress(sockaddrPtr, host, port)
struct sockaddr_in *sockaddrPtr; /* Socket address */
| | | 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 |
*
*----------------------------------------------------------------------
*/
static int
CreateSocketAddress(sockaddrPtr, host, port)
struct sockaddr_in *sockaddrPtr; /* Socket address */
CONST char *host; /* Host. NULL implies INADDR_ANY */
int port; /* Port number */
{
struct hostent *hostent; /* Host database entry */
struct in_addr addr; /* For 64/32 bit madness */
(void) memset((VOID *) sockaddrPtr, '\0', sizeof(struct sockaddr_in));
sockaddrPtr->sin_family = AF_INET;
|
| ︙ | ︙ | |||
2269 2270 2271 2272 2273 2274 2275 |
*----------------------------------------------------------------------
*/
Tcl_Channel
Tcl_OpenTcpClient(interp, port, host, myaddr, myport, async)
Tcl_Interp *interp; /* For error reporting; can be NULL. */
int port; /* Port number to open. */
| | | | 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 |
*----------------------------------------------------------------------
*/
Tcl_Channel
Tcl_OpenTcpClient(interp, port, host, myaddr, myport, async)
Tcl_Interp *interp; /* For error reporting; can be NULL. */
int port; /* Port number to open. */
CONST char *host; /* Host on which to open port. */
CONST char *myaddr; /* Client-side address */
int myport; /* Client-side port */
int async; /* If nonzero, attempt to do an
* asynchronous connect. Otherwise
* we do a blocking connect. */
{
TcpState *statePtr;
char channelName[16 + TCL_INTEGER_SPACE];
|
| ︙ | ︙ | |||
2366 2367 2368 2369 2370 2371 2372 |
*/
Tcl_Channel
Tcl_OpenTcpServer(interp, port, myHost, acceptProc, acceptProcData)
Tcl_Interp *interp; /* For error reporting - may be
* NULL. */
int port; /* Port number to open. */
| | | 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 |
*/
Tcl_Channel
Tcl_OpenTcpServer(interp, port, myHost, acceptProc, acceptProcData)
Tcl_Interp *interp; /* For error reporting - may be
* NULL. */
int port; /* Port number to open. */
CONST char *myHost; /* Name of local host. */
Tcl_TcpAcceptProc *acceptProc; /* Callback for accepting connections
* from new clients. */
ClientData acceptProcData; /* Data for the callback. */
{
TcpState *statePtr;
char channelName[16 + TCL_INTEGER_SPACE];
|
| ︙ | ︙ | |||
2567 2568 2569 2570 2571 2572 2573 |
*
*----------------------------------------------------------------------
*/
int
Tcl_GetOpenFile(interp, string, forWriting, checkUsage, filePtr)
Tcl_Interp *interp; /* Interpreter in which to find file. */
| | | 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 |
*
*----------------------------------------------------------------------
*/
int
Tcl_GetOpenFile(interp, string, forWriting, checkUsage, filePtr)
Tcl_Interp *interp; /* Interpreter in which to find file. */
CONST char *string; /* String that identifies file. */
int forWriting; /* 1 means the file is going to be used
* for writing, 0 means for reading. */
int checkUsage; /* 1 means verify that the file was opened
* in a mode that allows the access specified
* by "forWriting". Ignored, we always
* check that the channel is open for the
* requested mode. */
|
| ︙ | ︙ | |||
2688 2689 2690 2691 2692 2693 2694 |
/*
* If there is a non-zero finite timeout, compute the time when
* we give up.
*/
if (timeout > 0) {
| | | 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 |
/*
* If there is a non-zero finite timeout, compute the time when
* we give up.
*/
if (timeout > 0) {
Tcl_GetTime(&now);
abortTime.sec = now.sec + timeout/1000;
abortTime.usec = now.usec + (timeout%1000)*1000;
if (abortTime.usec >= 1000000) {
abortTime.usec -= 1000000;
abortTime.sec += 1;
}
timeoutPtr = &blockTime;
|
| ︙ | ︙ | |||
2778 2779 2780 2781 2782 2783 2784 | break; } /* * The select returned early, so we need to recompute the timeout. */ | | | 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 |
break;
}
/*
* The select returned early, so we need to recompute the timeout.
*/
Tcl_GetTime(&now);
if ((abortTime.sec < now.sec)
|| ((abortTime.sec == now.sec)
&& (abortTime.usec <= now.usec))) {
break;
}
}
return result;
}
|
Changes to unix/tclUnixEvent.c.
1 2 3 4 5 6 7 8 9 10 | /* * tclUnixEvent.c -- * * This file implements Unix specific event related routines. * * Copyright (c) 1997 by Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | /* * tclUnixEvent.c -- * * This file implements Unix specific event related routines. * * Copyright (c) 1997 by Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclUnixEvent.c,v 1.3.28.1 2002/02/05 02:22:05 wolfsuit Exp $ */ #include "tclInt.h" #include "tclPort.h" /* *---------------------------------------------------------------------- |
| ︙ | ︙ | |||
40 41 42 43 44 45 46 |
/*
* The only trick here is that select appears to return early
* under some conditions, so we have to check to make sure that
* the right amount of time really has elapsed. If it's too
* early, go back to sleep again.
*/
| | | 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
/*
* The only trick here is that select appears to return early
* under some conditions, so we have to check to make sure that
* the right amount of time really has elapsed. If it's too
* early, go back to sleep again.
*/
Tcl_GetTime(&before);
after = before;
after.sec += ms/1000;
after.usec += (ms%1000)*1000;
if (after.usec > 1000000) {
after.usec -= 1000000;
after.sec += 1;
}
|
| ︙ | ︙ | |||
67 68 69 70 71 72 73 |
if ((((int) delay.tv_sec) < 0)
|| ((delay.tv_usec == 0) && (delay.tv_sec == 0))) {
break;
}
(void) select(0, (SELECT_MASK *) 0, (SELECT_MASK *) 0,
(SELECT_MASK *) 0, &delay);
| | | 67 68 69 70 71 72 73 74 75 76 |
if ((((int) delay.tv_sec) < 0)
|| ((delay.tv_usec == 0) && (delay.tv_sec == 0))) {
break;
}
(void) select(0, (SELECT_MASK *) 0, (SELECT_MASK *) 0,
(SELECT_MASK *) 0, &delay);
Tcl_GetTime(&before);
}
}
|
Changes to unix/tclUnixFCmd.c.
1 2 3 4 5 6 7 8 9 10 11 12 | /* * tclUnixFCmd.c * * This file implements the unix specific portion of file manipulation * subcommands of the "file" command. All filename arguments should * already be translated to native format. * * Copyright (c) 1996-1998 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /* * tclUnixFCmd.c * * This file implements the unix specific portion of file manipulation * subcommands of the "file" command. All filename arguments should * already be translated to native format. * * Copyright (c) 1996-1998 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclUnixFCmd.c,v 1.13.2.1 2002/02/05 02:22:05 wolfsuit Exp $ * * Portions of this code were derived from NetBSD source code which has * the following copyright notice: * * Copyright (c) 1988, 1993, 1994 * The Regents of the University of California. All rights reserved. * |
| ︙ | ︙ | |||
106 107 108 109 110 111 112 |
enum {
UNIX_GROUP_ATTRIBUTE,
UNIX_OWNER_ATTRIBUTE,
UNIX_PERMISSIONS_ATTRIBUTE
};
| | | 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
enum {
UNIX_GROUP_ATTRIBUTE,
UNIX_OWNER_ATTRIBUTE,
UNIX_PERMISSIONS_ATTRIBUTE
};
CONST char *tclpFileAttrStrings[] = {
"-group",
"-owner",
"-permissions",
(char *) NULL
};
CONST TclFileAttrProcs tclpFileAttrProcs[] = {
|
| ︙ | ︙ | |||
1643 1644 1645 1646 1647 1648 1649 |
currentPathEndPosition = path + nextCheckpoint;
while (1) {
char cur = *currentPathEndPosition;
if ((cur == '/' || cur == 0) && (path != currentPathEndPosition)) {
/* Reached directory separator, or end of string */
Tcl_DString ds;
| | | 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 |
currentPathEndPosition = path + nextCheckpoint;
while (1) {
char cur = *currentPathEndPosition;
if ((cur == '/' || cur == 0) && (path != currentPathEndPosition)) {
/* Reached directory separator, or end of string */
Tcl_DString ds;
CONST char *nativePath;
int accessOk;
nativePath = Tcl_UtfToExternalDString(NULL, path,
currentPathEndPosition - path, &ds);
accessOk = access(nativePath, F_OK);
Tcl_DStringFree(&ds);
if (accessOk != 0) {
|
| ︙ | ︙ |
Changes to unix/tclUnixFile.c.
1 2 3 4 5 6 7 8 9 10 11 | /* * tclUnixFile.c -- * * This file contains wrappers around UNIX file handling functions. * These wrappers mask differences between Windows and UNIX. * * Copyright (c) 1995-1998 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | /* * tclUnixFile.c -- * * This file contains wrappers around UNIX file handling functions. * These wrappers mask differences between Windows and UNIX. * * Copyright (c) 1995-1998 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclUnixFile.c,v 1.12.8.1 2002/02/05 02:22:05 wolfsuit Exp $ */ #include "tclInt.h" #include "tclPort.h" /* |
| ︙ | ︙ | |||
192 193 194 195 196 197 198 |
*---------------------------------------------------------------------- */
int
TclpMatchInDirectory(interp, resultPtr, pathPtr, pattern, types)
Tcl_Interp *interp; /* Interpreter to receive errors. */
Tcl_Obj *resultPtr; /* List object to lappend results. */
Tcl_Obj *pathPtr; /* Contains path to directory to search. */
| | | | 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 |
*---------------------------------------------------------------------- */
int
TclpMatchInDirectory(interp, resultPtr, pathPtr, pattern, types)
Tcl_Interp *interp; /* Interpreter to receive errors. */
Tcl_Obj *resultPtr; /* List object to lappend results. */
Tcl_Obj *pathPtr; /* Contains path to directory to search. */
CONST char *pattern; /* Pattern to match against. */
Tcl_GlobTypeData *types; /* Object containing list of acceptable types.
* May be NULL. In particular the directory
* flag is very important. */
{
CONST char *native, *fname, *dirName;
DIR *d;
Tcl_DString ds;
struct stat statBuf;
int matchHidden;
int nativeDirLen;
int result = TCL_OK;
Tcl_DString dsOrig;
|
| ︙ | ︙ | |||
290 291 292 293 294 295 296 |
return TCL_ERROR;
}
nativeDirLen = Tcl_DStringLength(&ds);
while (1) {
Tcl_DString utfDs;
| | < | 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 |
return TCL_ERROR;
}
nativeDirLen = Tcl_DStringLength(&ds);
while (1) {
Tcl_DString utfDs;
CONST char *utf;
struct dirent *entryPtr;
entryPtr = readdir(d); /* INTL: Native. */
if (entryPtr == NULL) {
break;
}
if (types != NULL && (types->perm & TCL_GLOB_PERM_HIDDEN)) {
/*
* We explicitly asked for hidden files, so turn around
* and ignore any file which isn't hidden.
*/
if (*entryPtr->d_name != '.') {
continue;
|
| ︙ | ︙ | |||
361 362 363 364 365 366 367 | * readonly means that there are NO write permissions * (even for user), but execute is OK for anybody */ if (typeOk && ( ((types->perm & TCL_GLOB_PERM_RONLY) && (buf.st_mode & (S_IWOTH|S_IWGRP|S_IWUSR))) || ((types->perm & TCL_GLOB_PERM_R) && | | | | | 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 |
* readonly means that there are NO write permissions
* (even for user), but execute is OK for anybody
*/
if (typeOk && (
((types->perm & TCL_GLOB_PERM_RONLY) &&
(buf.st_mode & (S_IWOTH|S_IWGRP|S_IWUSR))) ||
((types->perm & TCL_GLOB_PERM_R) &&
(access(nativeEntry, R_OK) != 0)) ||
((types->perm & TCL_GLOB_PERM_W) &&
(access(nativeEntry, W_OK) != 0)) ||
((types->perm & TCL_GLOB_PERM_X) &&
(access(nativeEntry, X_OK) != 0))
)) {
typeOk = 0;
}
}
if (typeOk && (types->type != 0)) {
if (types->perm == 0) {
/* We haven't yet done a stat on the file */
|
| ︙ | ︙ | |||
457 458 459 460 461 462 463 |
TclpGetUserHome(name, bufferPtr)
CONST char *name; /* User name for desired home directory. */
Tcl_DString *bufferPtr; /* Uninitialized or free DString filled
* with name of user's home directory. */
{
struct passwd *pwPtr;
Tcl_DString ds;
| | | 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 |
TclpGetUserHome(name, bufferPtr)
CONST char *name; /* User name for desired home directory. */
Tcl_DString *bufferPtr; /* Uninitialized or free DString filled
* with name of user's home directory. */
{
struct passwd *pwPtr;
Tcl_DString ds;
CONST char *native;
native = Tcl_UtfToExternalDString(NULL, name, -1, &ds);
pwPtr = getpwnam(native); /* INTL: Native. */
Tcl_DStringFree(&ds);
if (pwPtr == NULL) {
endpwent();
|
| ︙ | ︙ | |||
493 494 495 496 497 498 499 |
*/
int
TclpObjAccess(pathPtr, mode)
Tcl_Obj *pathPtr; /* Path of file to access */
int mode; /* Permission setting. */
{
| | | 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 |
*/
int
TclpObjAccess(pathPtr, mode)
Tcl_Obj *pathPtr; /* Path of file to access */
int mode; /* Permission setting. */
{
CONST char *path = Tcl_FSGetNativePath(pathPtr);
if (path == NULL) {
return -1;
} else {
return access(path, mode);
}
}
|
| ︙ | ︙ | |||
521 522 523 524 525 526 527 |
*---------------------------------------------------------------------------
*/
int
TclpObjChdir(pathPtr)
Tcl_Obj *pathPtr; /* Path to new working directory */
{
| | | 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 |
*---------------------------------------------------------------------------
*/
int
TclpObjChdir(pathPtr)
Tcl_Obj *pathPtr; /* Path to new working directory */
{
CONST char *path = Tcl_FSGetNativePath(pathPtr);
if (path == NULL) {
return -1;
} else {
return chdir(path);
}
}
|
| ︙ | ︙ | |||
550 551 552 553 554 555 556 |
*/
int
TclpObjLstat(pathPtr, bufPtr)
Tcl_Obj *pathPtr; /* Path of file to stat */
struct stat *bufPtr; /* Filled with results of stat call. */
{
| | | 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 |
*/
int
TclpObjLstat(pathPtr, bufPtr)
Tcl_Obj *pathPtr; /* Path of file to stat */
struct stat *bufPtr; /* Filled with results of stat call. */
{
CONST char *path = Tcl_FSGetNativePath(pathPtr);
if (path == NULL) {
return -1;
} else {
return lstat(path, bufPtr);
}
}
|
| ︙ | ︙ | |||
595 596 597 598 599 600 601 |
return cwdPtr;
} else {
return NULL;
}
}
/* Older string based version */
| | | 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 |
return cwdPtr;
} else {
return NULL;
}
}
/* Older string based version */
CONST char *
TclpGetCwd(interp, bufferPtr)
Tcl_Interp *interp; /* If non-NULL, used for error reporting. */
Tcl_DString *bufferPtr; /* Uninitialized or free DString filled
* with name of current directory. */
{
char buffer[MAXPATHLEN+1];
|
| ︙ | ︙ | |||
646 647 648 649 650 651 652 |
TclpReadlink(path, linkPtr)
CONST char *path; /* Path of file to readlink (UTF-8). */
Tcl_DString *linkPtr; /* Uninitialized or free DString filled
* with contents of link (UTF-8). */
{
char link[MAXPATHLEN];
int length;
| | | 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 |
TclpReadlink(path, linkPtr)
CONST char *path; /* Path of file to readlink (UTF-8). */
Tcl_DString *linkPtr; /* Uninitialized or free DString filled
* with contents of link (UTF-8). */
{
char link[MAXPATHLEN];
int length;
CONST char *native;
Tcl_DString ds;
native = Tcl_UtfToExternalDString(NULL, path, -1, &ds);
length = readlink(native, link, sizeof(link)); /* INTL: Native. */
Tcl_DStringFree(&ds);
if (length < 0) {
|
| ︙ | ︙ | |||
682 683 684 685 686 687 688 |
*/
int
TclpObjStat(pathPtr, bufPtr)
Tcl_Obj *pathPtr; /* Path of file to stat */
struct stat *bufPtr; /* Filled with results of stat call. */
{
| | | 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 |
*/
int
TclpObjStat(pathPtr, bufPtr)
Tcl_Obj *pathPtr; /* Path of file to stat */
struct stat *bufPtr; /* Filled with results of stat call. */
{
CONST char *path = Tcl_FSGetNativePath(pathPtr);
if (path == NULL) {
return -1;
} else {
return stat(path, bufPtr);
}
}
|
| ︙ | ︙ |
Changes to unix/tclUnixInit.c.
1 2 3 4 5 6 7 8 9 | /* * tclUnixInit.c -- * * Contains the Unix-specific interpreter initialization functions. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * Copyright (c) 1999 by Scriptics Corporation. * All rights reserved. * | | > > > | 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 | /* * tclUnixInit.c -- * * Contains the Unix-specific interpreter initialization functions. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * Copyright (c) 1999 by Scriptics Corporation. * All rights reserved. * * RCS: @(#) $Id: tclUnixInit.c,v 1.24.8.3 2002/02/05 02:22:05 wolfsuit Exp $ */ #if defined(HAVE_CFBUNDLE) #include <CoreFoundation/CoreFoundation.h> #endif #include "tclInt.h" #include "tclPort.h" #include <locale.h> #ifdef HAVE_LANGINFO #include <langinfo.h> #endif #if defined(__FreeBSD__) # include <floatingpoint.h> #endif #if defined(__bsdi__) # include <sys/param.h> # if _BSDI_VERSION > 199501 # include <dlfcn.h> |
| ︙ | ︙ | |||
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | #include "tclInitScript.h" /* Used to store the encoding used for binary files */ static Tcl_Encoding binaryEncoding = NULL; /* Has the basic library path encoding issue been fixed */ static int libraryPathEncodingFixed = 0; /* * Default directory in which to look for Tcl library scripts. The * symbol is defined by Makefile. */ static char defaultLibraryDir[sizeof(TCL_LIBRARY)+200] = TCL_LIBRARY; /* * Directory in which to look for packages (each package is typically * installed as a subdirectory of this directory). The symbol is * defined by Makefile. */ static char pkgPath[sizeof(TCL_PACKAGE_PATH)+200] = TCL_PACKAGE_PATH; /* * The following table is used to map from Unix locale strings to | > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > | 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
#include "tclInitScript.h"
/* Used to store the encoding used for binary files */
static Tcl_Encoding binaryEncoding = NULL;
/* Has the basic library path encoding issue been fixed */
static int libraryPathEncodingFixed = 0;
/*
* Tcl tries to use standard and homebrew methods to guess the right
* encoding on the platform. However, there is always a final fallback,
* and this value is it. Make sure it is a real Tcl encoding.
*/
#ifndef TCL_DEFAULT_ENCODING
#define TCL_DEFAULT_ENCODING "iso8859-1"
#endif
/*
* Default directory in which to look for Tcl library scripts. The
* symbol is defined by Makefile.
*/
static char defaultLibraryDir[sizeof(TCL_LIBRARY)+200] = TCL_LIBRARY;
/*
* Directory in which to look for packages (each package is typically
* installed as a subdirectory of this directory). The symbol is
* defined by Makefile.
*/
static char pkgPath[sizeof(TCL_PACKAGE_PATH)+200] = TCL_PACKAGE_PATH;
/*
* The following table is used to map from Unix locale strings to
* encoding files. If HAVE_LANGINFO is defined, then this is a fallback
* table when the result from nl_langinfo isn't a recognized encoding.
* Otherwise this is the first list checked for a mapping from env
* encoding to Tcl encoding name.
*/
typedef struct LocaleTable {
CONST char *lang;
CONST char *encoding;
} LocaleTable;
static CONST LocaleTable localeTable[] = {
#ifdef HAVE_LANGINFO
{"gb2312-1980", "gb2312"},
#ifdef __hpux
{"SJIS", "shiftjis"},
{"eucjp", "euc-jp"},
{"euckr", "euc-kr"},
{"euctw", "euc-cn"},
{"greek8", "cp869"},
{"iso88591", "iso8859-1"},
{"iso88592", "iso8859-2"},
{"iso88595", "iso8859-5"},
{"iso88596", "iso8859-6"},
{"iso88597", "iso8859-7"},
{"iso88598", "iso8859-8"},
{"iso88599", "iso8859-9"},
{"iso885915", "iso8859-15"},
{"roman8", "iso8859-1"},
{"tis620", "tis-620"},
{"turkish8", "cp857"},
{"utf8", "utf-8"},
#endif /* __hpux */
#endif /* HAVE_LANGINFO */
{"ja_JP.SJIS", "shiftjis"},
{"ja_JP.EUC", "euc-jp"},
{"ja_JP.eucJP", "euc-jp"},
{"ja_JP.JIS", "iso2022-jp"},
{"ja_JP.mscode", "shiftjis"},
{"ja_JP.ujis", "euc-jp"},
{"ja_JP", "euc-jp"},
|
| ︙ | ︙ | |||
196 197 198 199 200 201 202 |
void
TclpInitLibraryPath(path)
CONST char *path; /* Path to the executable in native
* multi-byte encoding. */
{
#define LIBRARY_SIZE 32
Tcl_Obj *pathPtr, *objPtr;
| | | | 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 |
void
TclpInitLibraryPath(path)
CONST char *path; /* Path to the executable in native
* multi-byte encoding. */
{
#define LIBRARY_SIZE 32
Tcl_Obj *pathPtr, *objPtr;
CONST char *str;
Tcl_DString buffer, ds;
int pathc;
CONST char **pathv;
char installLib[LIBRARY_SIZE], developLib[LIBRARY_SIZE];
Tcl_DStringInit(&ds);
pathPtr = Tcl_NewObj();
/*
* Initialize the substrings used when locating an executable. The
|
| ︙ | ︙ | |||
392 393 394 395 396 397 398 |
*---------------------------------------------------------------------------
*/
void
TclpSetInitialEncodings()
{
if (libraryPathEncodingFixed == 0) {
| | | < > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > | | | | | | | | | < | | | | | | | | | | | | | | | | | | | | | | | | | | > | < | | < | | > > > > | > | | | | | | | | | | | | | > | | | > > | 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 |
*---------------------------------------------------------------------------
*/
void
TclpSetInitialEncodings()
{
if (libraryPathEncodingFixed == 0) {
CONST char *encoding = NULL;
int i, setSysEncCode = TCL_ERROR;
Tcl_Obj *pathPtr;
/*
* Determine the current encoding from the LC_* or LANG environment
* variables. We previously used setlocale() to determine the locale,
* but this does not work on some systems (e.g. Linux/i386 RH 5.0).
*/
#ifdef HAVE_LANGINFO
if (setlocale(LC_CTYPE, "") != NULL) {
Tcl_DString ds;
/*
* Use a DString so we can overwrite it in name compatability
* checks below.
*/
Tcl_DStringInit(&ds);
Tcl_DStringAppend(&ds, nl_langinfo(CODESET), -1);
encoding = Tcl_DStringValue(&ds);
Tcl_UtfToLower(Tcl_DStringValue(&ds));
#ifdef HAVE_LANGINFO_DEBUG
fprintf(stderr, "encoding '%s'", encoding);
#endif
if (encoding[0] == 'i' && encoding[1] == 's' && encoding[2] == 'o'
&& encoding[3] == '-') {
char *p, *q;
/* need to strip '-' from iso-* encoding */
for(p = Tcl_DStringValue(&ds)+3, q = Tcl_DStringValue(&ds)+4;
*p; *p++ = *q++);
} else if (encoding[0] == 'i' && encoding[1] == 'b'
&& encoding[2] == 'm' && encoding[3] >= '0'
&& encoding[3] <= '9') {
char *p, *q;
/* if langinfo reports "ibm*" we should use "cp*" */
p = Tcl_DStringValue(&ds);
*p++ = 'c'; *p++ = 'p';
for(q = p+1; *p ; *p++ = *q++);
} else if ((*encoding == '\0')
|| !strcmp(encoding, "ansi_x3.4-1968")) {
/* Use iso8859-1 for empty or 'ansi_x3.4-1968' encoding */
encoding = "iso8859-1";
}
#ifdef HAVE_LANGINFO_DEBUG
fprintf(stderr, " ?%s?", encoding);
#endif
setSysEncCode = Tcl_SetSystemEncoding(NULL, encoding);
if (setSysEncCode != TCL_OK) {
/*
* If this doesn't return TCL_OK, the encoding returned by
* nl_langinfo or as we translated it wasn't accepted. Do
* this fallback check. If this fails, we will enter the
* old fallback below.
*/
for (i = 0; localeTable[i].lang != NULL; i++) {
if (strcmp(localeTable[i].lang, encoding) == 0) {
setSysEncCode = Tcl_SetSystemEncoding(NULL,
localeTable[i].encoding);
break;
}
}
}
#ifdef HAVE_LANGINFO_DEBUG
fprintf(stderr, " => '%s'\n", encoding);
#endif
Tcl_DStringFree(&ds);
}
#ifdef HAVE_LANGINFO_DEBUG
else {
fprintf(stderr, "setlocale returned NULL\n");
}
#endif
#endif /* HAVE_LANGINFO */
if (setSysEncCode != TCL_OK) {
/*
* Classic fallback check. This tries a homebrew algorithm to
* determine what encoding should be used based on env vars.
*/
char *langEnv = getenv("LC_ALL");
encoding = NULL;
if (langEnv == NULL || langEnv[0] == '\0') {
langEnv = getenv("LC_CTYPE");
}
if (langEnv == NULL || langEnv[0] == '\0') {
langEnv = getenv("LANG");
}
if (langEnv == NULL || langEnv[0] == '\0') {
langEnv = NULL;
}
if (langEnv != NULL) {
for (i = 0; localeTable[i].lang != NULL; i++) {
if (strcmp(localeTable[i].lang, langEnv) == 0) {
encoding = localeTable[i].encoding;
break;
}
}
/*
* There was no mapping in the locale table. If there is an
* encoding subfield, we can try to guess from that.
*/
if (encoding == NULL) {
char *p;
for (p = langEnv; *p != '\0'; p++) {
if (*p == '.') {
p++;
break;
}
}
if (*p != '\0') {
Tcl_DString ds;
Tcl_DStringInit(&ds);
Tcl_DStringAppend(&ds, p, -1);
encoding = Tcl_DStringValue(&ds);
Tcl_UtfToLower(Tcl_DStringValue(&ds));
setSysEncCode = Tcl_SetSystemEncoding(NULL, encoding);
if (setSysEncCode != TCL_OK) {
encoding = NULL;
}
Tcl_DStringFree(&ds);
}
}
#ifdef HAVE_LANGINFO_DEBUG
fprintf(stderr, "encoding fallback check '%s' => '%s'\n",
langEnv, encoding);
#endif
}
if (setSysEncCode != TCL_OK) {
if (encoding == NULL) {
encoding = TCL_DEFAULT_ENCODING;
}
Tcl_SetSystemEncoding(NULL, encoding);
}
/*
* Initialize the C library's locale subsystem. This is required
* for input methods to work properly on X11. We only do this for
* LC_CTYPE because that's the necessary one, and we don't want to
* affect LC_TIME here. The side effect of setting the default
* locale should be to load any locale specific modules that are
* needed by X. [BUG: 5422 3345 4236 2522 2521].
* In HAVE_LANGINFO, this call is already done above.
*/
#ifndef HAVE_LANGINFO
setlocale(LC_CTYPE, "");
#endif
}
/*
* In case the initial locale is not "C", ensure that the numeric
* processing is done in "C" locale regardless. This is needed because
* Tcl relies on routines like strtod, but should not have locale
* dependent behavior.
*/
|
| ︙ | ︙ | |||
561 562 563 564 565 566 567 |
TclpSetVariables(interp)
Tcl_Interp *interp;
{
#ifndef NO_UNAME
struct utsname name;
#endif
int unameOK;
| | | 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 |
TclpSetVariables(interp)
Tcl_Interp *interp;
{
#ifndef NO_UNAME
struct utsname name;
#endif
int unameOK;
CONST char *user;
Tcl_DString ds;
#ifdef HAVE_CFBUNDLE
/*
* If we have a bundle structure for the Tcl installation,
* then check there first to see if we can find the libraries
* there.
|
| ︙ | ︙ | |||
600 601 602 603 604 605 606 |
}
#endif /* HAVE_CFBUNDLE */
Tcl_SetVar2(interp, "tcl_platform", "platform", "unix", TCL_GLOBAL_ONLY);
unameOK = 0;
#ifndef NO_UNAME
if (uname(&name) >= 0) {
| | | 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 |
}
#endif /* HAVE_CFBUNDLE */
Tcl_SetVar2(interp, "tcl_platform", "platform", "unix", TCL_GLOBAL_ONLY);
unameOK = 0;
#ifndef NO_UNAME
if (uname(&name) >= 0) {
CONST char *native;
unameOK = 1;
native = Tcl_ExternalToUtfDString(NULL, name.sysname, -1, &ds);
Tcl_SetVar2(interp, "tcl_platform", "os", native, TCL_GLOBAL_ONLY);
Tcl_DStringFree(&ds);
|
| ︙ | ︙ | |||
775 776 777 778 779 780 781 |
*/
void
Tcl_SourceRCFile(interp)
Tcl_Interp *interp; /* Interpreter to source rc file into. */
{
Tcl_DString temp;
| | | | 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 |
*/
void
Tcl_SourceRCFile(interp)
Tcl_Interp *interp; /* Interpreter to source rc file into. */
{
Tcl_DString temp;
CONST char *fileName;
Tcl_Channel errChannel;
fileName = Tcl_GetVar(interp, "tcl_rcFileName", TCL_GLOBAL_ONLY);
if (fileName != NULL) {
Tcl_Channel c;
CONST char *fullName;
Tcl_DStringInit(&temp);
fullName = Tcl_TranslateFileName(interp, fileName, &temp);
if (fullName == NULL) {
/*
* Couldn't translate the file name (e.g. it referred to a
* bogus user or there was no HOME environment variable).
|
| ︙ | ︙ |
Changes to unix/tclUnixPipe.c.
1 2 3 4 5 6 7 8 9 10 11 12 | /* * tclUnixPipe.c -- * * This file implements the UNIX-specific exec pipeline functions, * the "pipe" channel driver, and the "pid" Tcl command. * * Copyright (c) 1991-1994 The Regents of the University of California. * Copyright (c) 1994-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /* * tclUnixPipe.c -- * * This file implements the UNIX-specific exec pipeline functions, * the "pipe" channel driver, and the "pid" Tcl command. * * Copyright (c) 1991-1994 The Regents of the University of California. * Copyright (c) 1994-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclUnixPipe.c,v 1.15.8.1 2002/02/05 02:22:05 wolfsuit Exp $ */ #include "tclInt.h" #include "tclPort.h" /* * The following macros convert between TclFile's and fd's. The conversion |
| ︙ | ︙ | |||
51 52 53 54 55 56 57 | static int PipeCloseProc _ANSI_ARGS_((ClientData instanceData, Tcl_Interp *interp)); static int PipeGetHandleProc _ANSI_ARGS_((ClientData instanceData, int direction, ClientData *handlePtr)); static int PipeInputProc _ANSI_ARGS_((ClientData instanceData, char *buf, int toRead, int *errorCode)); static int PipeOutputProc _ANSI_ARGS_(( | | | 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | static int PipeCloseProc _ANSI_ARGS_((ClientData instanceData, Tcl_Interp *interp)); static int PipeGetHandleProc _ANSI_ARGS_((ClientData instanceData, int direction, ClientData *handlePtr)); static int PipeInputProc _ANSI_ARGS_((ClientData instanceData, char *buf, int toRead, int *errorCode)); static int PipeOutputProc _ANSI_ARGS_(( ClientData instanceData, CONST char *buf, int toWrite, int *errorCode)); static void PipeWatchProc _ANSI_ARGS_((ClientData instanceData, int mask)); static void RestoreSignals _ANSI_ARGS_((void)); static int SetupStdFile _ANSI_ARGS_((TclFile file, int type)); /* * This structure describes the channel type structure for command pipe |
| ︙ | ︙ | |||
132 133 134 135 136 137 138 |
TclFile
TclpOpenFile(fname, mode)
CONST char *fname; /* The name of the file to open. */
int mode; /* In what mode to open the file? */
{
int fd;
| | | 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
TclFile
TclpOpenFile(fname, mode)
CONST char *fname; /* The name of the file to open. */
int mode; /* In what mode to open the file? */
{
int fd;
CONST char *native;
Tcl_DString ds;
native = Tcl_UtfToExternalDString(NULL, fname, -1, &ds);
fd = open(native, mode, 0666); /* INTL: Native. */
Tcl_DStringFree(&ds);
if (fd != -1) {
fcntl(fd, F_SETFD, FD_CLOEXEC);
|
| ︙ | ︙ | |||
182 183 184 185 186 187 188 |
*----------------------------------------------------------------------
*/
TclFile
TclpCreateTempFile(contents)
CONST char *contents; /* String to write into temp file, or NULL. */
{
| | > | 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 |
*----------------------------------------------------------------------
*/
TclFile
TclpCreateTempFile(contents)
CONST char *contents; /* String to write into temp file, or NULL. */
{
char fileName[L_tmpnam + 9];
CONST char *native;
Tcl_DString dstring;
int fd;
/*
* We should also check against making more then TMP_MAX of these.
*/
|
| ︙ | ︙ | |||
363 364 365 366 367 368 369 |
TclpCreateProcess(interp, argc, argv, inputFile, outputFile, errorFile,
pidPtr)
Tcl_Interp *interp; /* Interpreter in which to leave errors that
* occurred when creating the child process.
* Error messages from the child process
* itself are sent to errorFile. */
int argc; /* Number of arguments in following array. */
| | | 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 |
TclpCreateProcess(interp, argc, argv, inputFile, outputFile, errorFile,
pidPtr)
Tcl_Interp *interp; /* Interpreter in which to leave errors that
* occurred when creating the child process.
* Error messages from the child process
* itself are sent to errorFile. */
int argc; /* Number of arguments in following array. */
CONST char **argv; /* Array of argument strings in UTF-8.
* argv[0] contains the name of the executable
* translated using Tcl_TranslateFileName
* call). Additional arguments have not been
* converted. */
TclFile inputFile; /* If non-NULL, gives the file to use as
* input for the child process. If inputFile
* file is not readable or is NULL, the child
|
| ︙ | ︙ | |||
416 417 418 419 420 421 422 |
* We need to allocate and convert this before the fork
* so it is properly deallocated later
*/
dsArray = (Tcl_DString *) ckalloc(argc * sizeof(Tcl_DString));
newArgv = (char **) ckalloc((argc+1) * sizeof(char *));
newArgv[argc] = NULL;
for (i = 0; i < argc; i++) {
| | > | | 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 |
* We need to allocate and convert this before the fork
* so it is properly deallocated later
*/
dsArray = (Tcl_DString *) ckalloc(argc * sizeof(Tcl_DString));
newArgv = (char **) ckalloc((argc+1) * sizeof(char *));
newArgv[argc] = NULL;
for (i = 0; i < argc; i++) {
Tcl_UtfToExternalDString(NULL, argv[i], -1, &dsArray[i]);
newArgv[i] = Tcl_DStringValue(&dsArray[i]);
}
joinThisError = errorFile && (errorFile == outputFile);
pid = fork();
if (pid == 0) {
fd = GetFd(errPipeOut);
/*
* Set up stdio file handles for the child process.
*/
|
| ︙ | ︙ | |||
999 1000 1001 1002 1003 1004 1005 1006 1007 |
*errorCodePtr = 0;
/*
* Assume there is always enough input available. This will block
* appropriately, and read will unblock as soon as a short read is
* possible, if the channel is in blocking mode. If the channel is
* nonblocking, the read will never block.
*/
| > > > | | < | > | | > > > | 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 |
*errorCodePtr = 0;
/*
* Assume there is always enough input available. This will block
* appropriately, and read will unblock as soon as a short read is
* possible, if the channel is in blocking mode. If the channel is
* nonblocking, the read will never block.
* Some OSes can throw an interrupt error, for which we should
* immediately retry. [Bug #415131]
*/
do {
bytesRead = read (GetFd(psPtr->inFile), buf, (size_t) toRead);
} while ((bytesRead < 0) && (errno == EINTR));
if (bytesRead < 0) {
*errorCodePtr = errno;
return -1;
} else {
return bytesRead;
}
}
/*
*----------------------------------------------------------------------
*
* PipeOutputProc--
*
|
| ︙ | ︙ | |||
1031 1032 1033 1034 1035 1036 1037 |
*
*----------------------------------------------------------------------
*/
static int
PipeOutputProc(instanceData, buf, toWrite, errorCodePtr)
ClientData instanceData; /* Pipe state. */
| | > > > > > > > | | < | > | | > > > | 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 |
*
*----------------------------------------------------------------------
*/
static int
PipeOutputProc(instanceData, buf, toWrite, errorCodePtr)
ClientData instanceData; /* Pipe state. */
CONST char *buf; /* The data buffer. */
int toWrite; /* How many bytes to write? */
int *errorCodePtr; /* Where to store error code. */
{
PipeState *psPtr = (PipeState *) instanceData;
int written;
*errorCodePtr = 0;
/*
* Some OSes can throw an interrupt error, for which we should
* immediately retry. [Bug #415131]
*/
do {
written = write(GetFd(psPtr->outFile), buf, (size_t) toWrite);
} while ((written < 0) && (errno == EINTR));
if (written < 0) {
*errorCodePtr = errno;
return -1;
} else {
return written;
}
}
/*
*----------------------------------------------------------------------
*
* PipeWatchProc --
*
|
| ︙ | ︙ |
Changes to unix/tclUnixSock.c.
1 2 3 4 5 6 7 8 9 10 | /* * tclUnixSock.c -- * * This file contains Unix-specific socket related code. * * Copyright (c) 1995 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | /* * tclUnixSock.c -- * * This file contains Unix-specific socket related code. * * Copyright (c) 1995 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclUnixSock.c,v 1.4.28.1 2002/02/05 02:22:05 wolfsuit Exp $ */ #include "tcl.h" #include "tclPort.h" /* * There is no portable macro for the maximum length |
| ︙ | ︙ | |||
58 59 60 61 62 63 64 | * * Side effects: * None. * *---------------------------------------------------------------------- */ | | | 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
*
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
CONST char *
Tcl_GetHostName()
{
#ifndef NO_UNAME
struct utsname u;
struct hostent *hp;
#else
char buffer[sizeof(hostname)];
|
| ︙ | ︙ |
Changes to unix/tclUnixThrd.c.
| ︙ | ︙ | |||
684 685 686 687 688 689 690 | Tcl_Time now; /* * Make sure to take into account the microsecond component of the * current time, including possible overflow situations. [Bug #411603] */ | | | 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 |
Tcl_Time now;
/*
* Make sure to take into account the microsecond component of the
* current time, including possible overflow situations. [Bug #411603]
*/
Tcl_GetTime(&now);
ptime.tv_sec = timePtr->sec + now.sec +
(timePtr->usec + now.usec) / 1000000;
ptime.tv_nsec = 1000 * ((timePtr->usec + now.usec) % 1000000);
pthread_cond_timedwait(pcondPtr, pmutexPtr, &ptime);
}
}
|
| ︙ | ︙ |
Changes to unix/tclUnixTime.c.
1 2 3 4 5 6 7 8 9 10 11 | /* * tclUnixTime.c -- * * Contains Unix specific versions of Tcl functions that * obtain time values from the operating system. * * Copyright (c) 1995 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | /* * tclUnixTime.c -- * * Contains Unix specific versions of Tcl functions that * obtain time values from the operating system. * * Copyright (c) 1995 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclUnixTime.c,v 1.11.12.1 2002/02/05 02:22:05 wolfsuit Exp $ */ #include "tclInt.h" #include "tclPort.h" #define TM_YEAR_BASE 1900 #define IsLeapYear(x) ((x % 4 == 0) && (x % 100 != 0 || x % 400 == 0)) |
| ︙ | ︙ | |||
236 237 238 239 240 241 242 | #endif } /* *---------------------------------------------------------------------- * | | | | 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 |
#endif
}
/*
*----------------------------------------------------------------------
*
* Tcl_GetTime --
*
* Gets the current system time in seconds and microseconds
* since the beginning of the epoch: 00:00 UCT, January 1, 1970.
*
* Results:
* Returns the current time in timePtr.
*
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
void
Tcl_GetTime(timePtr)
Tcl_Time *timePtr; /* Location to store time information. */
{
struct timeval tv;
struct timezone tz;
(void) gettimeofday(&tv, &tz);
timePtr->sec = tv.tv_sec;
|
| ︙ | ︙ |
Changes to win/.cvsignore.
1 2 | Debug Release | < < | 1 2 3 4 5 6 7 8 9 | Debug Release *.opt *.ncb *.plg *.00? *.o *.obj *.i |
| ︙ | ︙ |
Changes to win/Makefile.in.
1 2 3 4 5 6 7 | # # This file is a Makefile for Tcl. If it has the name "Makefile.in" # then it is a template for a Makefile; to generate the actual Makefile, # run "./configure", which is a configuration script generated by the # "autoconf" program (constructs like "@foo@" will get replaced in the # actual Makefile. # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # # This file is a Makefile for Tcl. If it has the name "Makefile.in" # then it is a template for a Makefile; to generate the actual Makefile, # run "./configure", which is a configuration script generated by the # "autoconf" program (constructs like "@foo@" will get replaced in the # actual Makefile. # # RCS: @(#) $Id: Makefile.in,v 1.55.2.1 2002/02/05 02:22:05 wolfsuit Exp $ VERSION = @TCL_VERSION@ #---------------------------------------------------------------- # Things you can change to personalize the Makefile for your own # site (you can make these changes in either Makefile.in or # Makefile, but changes to Makefile will get lost if you re-run |
| ︙ | ︙ | |||
123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
REG_DLL_FILE = tclreg$(REGVER)${DLLSUFFIX}
REG_LIB_FILE = tclreg$(REGVER)${LIBSUFFIX}
PIPE_DLL_FILE = tclpip$(VER)${DLLSUFFIX}
SHARED_LIBRARIES = $(TCL_DLL_FILE) $(TCL_STUB_LIB_FILE) \
$(DDE_DLL_FILE) $(REG_DLL_FILE) $(PIPE_DLL_FILE)
STATIC_LIBRARIES = $(TCL_LIB_FILE) $(REG_LIB_FILE) $(DDE_LIB_FILE)
TCLSH = tclsh$(VER)${EXESUFFIX}
TCLTEST = tcltest${EXEEXT}
CAT32 = cat32$(EXEEXT)
MAN2TCL = man2tcl$(EXEEXT)
@SET_MAKE@
| > > > > > > > | 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
REG_DLL_FILE = tclreg$(REGVER)${DLLSUFFIX}
REG_LIB_FILE = tclreg$(REGVER)${LIBSUFFIX}
PIPE_DLL_FILE = tclpip$(VER)${DLLSUFFIX}
SHARED_LIBRARIES = $(TCL_DLL_FILE) $(TCL_STUB_LIB_FILE) \
$(DDE_DLL_FILE) $(REG_DLL_FILE) $(PIPE_DLL_FILE)
STATIC_LIBRARIES = $(TCL_LIB_FILE) $(REG_LIB_FILE) $(DDE_LIB_FILE)
# TCL_EXE is the name of a tclsh executable that is available *BEFORE*
# running make for the first time. Certain build targets (make genstubs)
# need it to be available on the PATH. This executable should *NOT* be
# required just to do a normal build although it can be required to run
# make dist.
TCL_EXE = tclsh
TCLSH = tclsh$(VER)${EXESUFFIX}
TCLTEST = tcltest${EXEEXT}
CAT32 = cat32$(EXEEXT)
MAN2TCL = man2tcl$(EXEEXT)
@SET_MAKE@
|
| ︙ | ︙ | |||
545 546 547 548 549 550 551 552 553 554 555 556 557 558 | # This target can be used to run tclsh from the build directory # via `make shell SCRIPT=foo.tcl` shell: $(TCLSH) @TCL_LIBRARY="$(LIBRARY_DIR)"; export TCL_LIBRARY; \ ./$(TCLSH) $(SCRIPT) depend: Makefile: $(SRC_DIR)/Makefile.in ./config.status cleanhelp: $(RM) *.hlp *.cnt *.GID *.rtf man2tcl.exe | > > > > > > | 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 | # This target can be used to run tclsh from the build directory # via `make shell SCRIPT=foo.tcl` shell: $(TCLSH) @TCL_LIBRARY="$(LIBRARY_DIR)"; export TCL_LIBRARY; \ ./$(TCLSH) $(SCRIPT) # This target can be used to run tclsh inside either gdb or insight gdb: $(TCLSH) @echo "set env TCL_LIBRARY=$(LIBRARY_DIR)" > gdb.run gdb ./tclsh --command=gdb.run rm gdb.run depend: Makefile: $(SRC_DIR)/Makefile.in ./config.status cleanhelp: $(RM) *.hlp *.cnt *.GID *.rtf man2tcl.exe |
| ︙ | ︙ | |||
568 569 570 571 572 573 574 | # # Regenerate the stubs files. # $(GENERIC_DIR)/tclStubInit.c: $(GENERIC_DIR)/tcl.decls \ $(GENERIC_DIR)/tclInt.decls | | < < < < < | | 581 582 583 584 585 586 587 588 589 590 591 592 593 594 |
#
# Regenerate the stubs files.
#
$(GENERIC_DIR)/tclStubInit.c: $(GENERIC_DIR)/tcl.decls \
$(GENERIC_DIR)/tclInt.decls
@echo "Warning: run \"make genstubs\" to regenerate tclStubInit.c"
genstubs:
$(TCL_EXE) "$(ROOT_DIR_NATIVE)\tools\genStubs.tcl" \
"$(GENERIC_DIR_NATIVE)" \
"$(GENERIC_DIR_NATIVE)\tcl.decls" \
"$(GENERIC_DIR_NATIVE)\tclInt.decls"
|
Changes to win/README.
1 2 | Tcl 8.4 for Windows | | | 1 2 3 4 5 6 7 8 9 10 | Tcl 8.4 for Windows RCS: @(#) $Id: README,v 1.22.8.1 2002/02/05 02:22:05 wolfsuit Exp $ 1. Introduction --------------- This is the directory where you configure and compile the Windows version of Tcl. This directory also contains source files for Tcl that are specific to Microsoft Windows. |
| ︙ | ︙ | |||
18 19 20 21 22 23 24 | 2. Compiling Tcl ---------------- In order to compile Tcl for Windows, you need the following items: Tcl 8.4 Source Distribution (plus any patches) | | > > > > > > > > > > | > | | > > > > | < < > > | > > > | 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
2. Compiling Tcl
----------------
In order to compile Tcl for Windows, you need the following items:
Tcl 8.4 Source Distribution (plus any patches)
Visual C++ 5 or newer
or
Cygwin 1.1 (See http://sources.redhat.com/cygwin)
Mingw (The gcc msvcrt 2.95.2-1 snapshot from http://www.mingw.org)
ftp://ftp.nanotech.wisc.edu/pub/khan/gnu-win32/mingw32/snapshots/gcc-2.95.2-1/mingw-msvcrt-20000203.zip
ftp://ftp.nanotech.wisc.edu/pub/khan/gnu-win32/mingw32/snapshots/gcc-2.95.2-1/binutils-19990818-1-msvcrt.zip
ftp://ftp.nanotech.wisc.edu/pub/khan/gnu-win32/mingw32/snapshots/gcc-2.95.2-1/gcc-2.95.2-1-msvcrt.zip
Extract the contents of these zip files into /usr/local/mingw and
place /usr/local/mingw/bin at the front of your PATH env var.
In practice, this release is built with Visual C++ 6.0 and the TEA
Makefile.
If you are building with Visual C++, in the "win" subdirectory of the
source release, you will find "makefile.vc". This is the makefile for
the Visual C++ compiler and uses the stock NMAKE tool. Detailed
directions for using it, are in the comments of "makefile.vc". A quick
example would be:
C:\tcl_source\win\>nmake -f makefile.vc
There is also a Developer Studio workspace and project file, too, if you
would like to use them.
If you are building with Cygwin, you can use the configure script
that lives in the win subdirectory. The Cygwin based configure/build
process works just like the UNIX one, so you will want to refer to
../unix/README for available configure options. An error will be
generated by the configure script if you try to compile Tcl with
the Cygwin version of gcc instead of the Mingw version. Check your
PATH if you get this error.
In order to use the binaries generated by these makefiles, you will
need to place the Tcl script library files someplace where Tcl can
find them. Tcl looks in one of following places for the library files:
1) The path specified in the environment variable "TCL_LIBRARY".
|
| ︙ | ︙ |
Added win/buildall.vc.bat.
> > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | @echo off rem rem This is an example batchfile for building everything. Please rem edit this (or make your own) for your needs and wants using rem the instructions for calling makefile.vc found in makefile.vc rem rem RCS: @(#) $Id: buildall.vc.bat,v 1.2.4.1 2002/02/05 02:22:05 wolfsuit Exp $ if "%MSVCDir%" == "" call c:\progra~1\micros~4\vc98\bin\vcvars32.bat set INSTALLDIR=d:\tclTestArea nmake -nologo -f makefile.vc release winhelp OPTS=none nmake -nologo -f makefile.vc release OPTS=static nmake -nologo -f makefile.vc core dlls OPTS=static,msvcrt nmake -nologo -f makefile.vc core OPTS=static,threads nmake -nologo -f makefile.vc dlls OPTS=static,msvcrt,threads nmake -nologo -f makefile.vc shell OPTS=threads pause |
Changes to win/configure.
| ︙ | ︙ | |||
544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 |
TCL_REG_VERSION=1.0
TCL_REG_MAJOR_VERSION=1
TCL_REG_MINOR_VERSION=0
TCL_REG_PATCH_LEVEL=""
REGVER=$TCL_REG_MAJOR_VERSION$TCL_REG_MINOR_VERSION
if test "${prefix}" = "NONE"; then
prefix=/usr/local
fi
if test "${exec_prefix}" = "NONE"; then
exec_prefix=$prefix
fi
#------------------------------------------------------------------------
# Standard compiler checks
#------------------------------------------------------------------------
# If the user did not set CFLAGS, set it now to keep
# the AC_PROG_CC macro from adding "-g -O2".
if test "${CFLAGS+set}" != "set" ; then
CFLAGS=""
fi
# Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
| > > > > > > | | 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 |
TCL_REG_VERSION=1.0
TCL_REG_MAJOR_VERSION=1
TCL_REG_MINOR_VERSION=0
TCL_REG_PATCH_LEVEL=""
REGVER=$TCL_REG_MAJOR_VERSION$TCL_REG_MINOR_VERSION
#------------------------------------------------------------------------
# Handle the --prefix=... option
#------------------------------------------------------------------------
if test "${prefix}" = "NONE"; then
prefix=/usr/local
fi
if test "${exec_prefix}" = "NONE"; then
exec_prefix=$prefix
fi
# libdir must be a fully qualified path (not ${exec_prefix}/lib)
eval libdir="$libdir"
#------------------------------------------------------------------------
# Standard compiler checks
#------------------------------------------------------------------------
# If the user did not set CFLAGS, set it now to keep
# the AC_PROG_CC macro from adding "-g -O2".
if test "${CFLAGS+set}" != "set" ; then
CFLAGS=""
fi
# Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:578: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
|
| ︙ | ︙ | |||
594 595 596 597 598 599 600 | echo "$ac_t""no" 1>&6 fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | | | 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 |
echo "$ac_t""no" 1>&6
fi
if test -z "$CC"; then
# Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:608: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
|
| ︙ | ︙ | |||
645 646 647 648 649 650 651 |
if test -z "$CC"; then
case "`uname -s`" in
*win32* | *WIN32*)
# Extract the first word of "cl", so it can be a program name with args.
set dummy cl; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
| | | 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 |
if test -z "$CC"; then
case "`uname -s`" in
*win32* | *WIN32*)
# Extract the first word of "cl", so it can be a program name with args.
set dummy cl; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:659: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
|
| ︙ | ︙ | |||
677 678 679 680 681 682 683 |
;;
esac
fi
test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
| | | | | 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 |
;;
esac
fi
test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
echo "configure:691: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross
cat > conftest.$ac_ext << EOF
#line 702 "configure"
#include "confdefs.h"
main(){return(0);}
EOF
if { (eval echo configure:707: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
ac_cv_prog_cc_works=yes
# If we can't run a trivial program, we are probably using a cross compiler.
if (./conftest; exit) 2>/dev/null; then
ac_cv_prog_cc_cross=no
else
ac_cv_prog_cc_cross=yes
fi
|
| ︙ | ︙ | |||
719 720 721 722 723 724 725 |
cross_compiling=$ac_cv_prog_cc_cross
echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
if test $ac_cv_prog_cc_works = no; then
{ echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
| | | | | | 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 |
cross_compiling=$ac_cv_prog_cc_cross
echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
if test $ac_cv_prog_cc_works = no; then
{ echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
echo "configure:733: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
cross_compiling=$ac_cv_prog_cc_cross
echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
echo "configure:738: checking whether we are using GNU C" >&5
if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.c <<EOF
#ifdef __GNUC__
yes;
#endif
EOF
if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:747: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
ac_cv_prog_gcc=yes
else
ac_cv_prog_gcc=no
fi
fi
echo "$ac_t""$ac_cv_prog_gcc" 1>&6
if test $ac_cv_prog_gcc = yes; then
GCC=yes
else
GCC=
fi
ac_test_CFLAGS="${CFLAGS+set}"
ac_save_CFLAGS="$CFLAGS"
CFLAGS=
echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
echo "configure:766: checking whether ${CC-cc} accepts -g" >&5
if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
echo 'void f(){}' > conftest.c
if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
ac_cv_prog_cc_g=yes
else
|
| ︙ | ︙ | |||
795 796 797 798 799 800 801 |
# the CC, AR, RANLIB, and RC environment
# variables if you want to cross compile.
if test "${GCC}" = "yes" ; then
# Extract the first word of "ar", so it can be a program name with args.
set dummy ar; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
| | | 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 |
# the CC, AR, RANLIB, and RC environment
# variables if you want to cross compile.
if test "${GCC}" = "yes" ; then
# Extract the first word of "ar", so it can be a program name with args.
set dummy ar; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:809: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
if test -n "$AR"; then
ac_cv_prog_AR="$AR" # Let the user override the test.
else
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
|
| ︙ | ︙ | |||
824 825 826 827 828 829 830 |
else
echo "$ac_t""no" 1>&6
fi
# Extract the first word of "ranlib", so it can be a program name with args.
set dummy ranlib; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
| | | 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 |
else
echo "$ac_t""no" 1>&6
fi
# Extract the first word of "ranlib", so it can be a program name with args.
set dummy ranlib; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:838: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
if test -n "$RANLIB"; then
ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
else
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
|
| ︙ | ︙ | |||
853 854 855 856 857 858 859 |
else
echo "$ac_t""no" 1>&6
fi
# Extract the first word of "windres", so it can be a program name with args.
set dummy windres; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
| | | 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 |
else
echo "$ac_t""no" 1>&6
fi
# Extract the first word of "windres", so it can be a program name with args.
set dummy windres; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:867: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_RC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
if test -n "$RC"; then
ac_cv_prog_RC="$RC" # Let the user override the test.
else
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
|
| ︙ | ︙ | |||
886 887 888 889 890 891 892 |
fi
#--------------------------------------------------------------------
# Checks to see if the make progeam sets the $MAKE variable.
#--------------------------------------------------------------------
echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
| | | 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 |
fi
#--------------------------------------------------------------------
# Checks to see if the make progeam sets the $MAKE variable.
#--------------------------------------------------------------------
echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
echo "configure:900: checking whether ${MAKE-make} sets \${MAKE}" >&5
set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftestmake <<\EOF
all:
@echo 'ac_maketemp="${MAKE}"'
|
| ︙ | ︙ | |||
914 915 916 917 918 919 920 |
else
echo "$ac_t""no" 1>&6
SET_MAKE="MAKE=${MAKE-make}"
fi
#--------------------------------------------------------------------
| | | | | > > > > > | | | | | | | | 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 |
else
echo "$ac_t""no" 1>&6
SET_MAKE="MAKE=${MAKE-make}"
fi
#--------------------------------------------------------------------
# Perform additinal compiler tests.
#--------------------------------------------------------------------
echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6
echo "configure:932: checking for Cygwin environment" >&5
if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 937 "configure"
#include "confdefs.h"
int main() {
#ifndef __CYGWIN__
#define __CYGWIN__ __CYGWIN32__
#endif
return __CYGWIN__;
; return 0; }
EOF
if { (eval echo configure:948: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_cygwin=yes
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
ac_cv_cygwin=no
fi
rm -f conftest*
rm -f conftest*
fi
echo "$ac_t""$ac_cv_cygwin" 1>&6
CYGWIN=
test "$ac_cv_cygwin" = yes && CYGWIN=yes
if test "$ac_cv_cygwin" = "yes" ; then
{ echo "configure: error: Compiling with the Cygwin version of gcc is not supported.
Use the Mingw version of gcc from www.mingw.org instead." 1>&2; exit 1; }
fi
#--------------------------------------------------------------------
# Determines the correct binary file extension (.o, .obj, .exe etc.)
#--------------------------------------------------------------------
echo $ac_n "checking for object suffix""... $ac_c" 1>&6
echo "configure:975: checking for object suffix" >&5
if eval "test \"`echo '$''{'ac_cv_objext'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
rm -f conftest*
echo 'int i = 1;' > conftest.$ac_ext
if { (eval echo configure:981: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
for ac_file in conftest.*; do
case $ac_file in
*.c) ;;
*) ac_cv_objext=`echo $ac_file | sed -e s/conftest.//` ;;
esac
done
else
{ echo "configure: error: installation or configuration problem; compiler does not work" 1>&2; exit 1; }
fi
rm -f conftest*
fi
echo "$ac_t""$ac_cv_objext" 1>&6
OBJEXT=$ac_cv_objext
ac_objext=$ac_cv_objext
echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6
echo "configure:999: checking for mingw32 environment" >&5
if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 1004 "configure"
#include "confdefs.h"
int main() {
return __MINGW32__;
; return 0; }
EOF
if { (eval echo configure:1011: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_mingw32=yes
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
ac_cv_mingw32=no
fi
rm -f conftest*
rm -f conftest*
fi
echo "$ac_t""$ac_cv_mingw32" 1>&6
MINGW32=
test "$ac_cv_mingw32" = yes && MINGW32=yes
echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
echo "configure:1030: checking for executable suffix" >&5
if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
if test "$CYGWIN" = yes || test "$MINGW32" = yes; then
ac_cv_exeext=.exe
else
rm -f conftest*
echo 'int main () { return 0; }' > conftest.$ac_ext
ac_cv_exeext=
if { (eval echo configure:1040: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
for file in conftest.*; do
case $file in
*.c | *.o | *.obj) ;;
*) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;;
esac
done
else
|
| ︙ | ︙ | |||
1048 1049 1050 1051 1052 1053 1054 |
#--------------------------------------------------------------------
# Check whether --enable-threads or --disable-threads was given.
#--------------------------------------------------------------------
echo $ac_n "checking for building with threads""... $ac_c" 1>&6
| | | 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 |
#--------------------------------------------------------------------
# Check whether --enable-threads or --disable-threads was given.
#--------------------------------------------------------------------
echo $ac_n "checking for building with threads""... $ac_c" 1>&6
echo "configure:1067: checking for building with threads" >&5
# Check whether --enable-threads or --disable-threads was given.
if test "${enable_threads+set}" = set; then
enableval="$enable_threads"
tcl_ok=$enableval
else
tcl_ok=no
fi
|
| ︙ | ︙ | |||
1079 1080 1081 1082 1083 1084 1085 |
#--------------------------------------------------------------------
# The statements below define a collection of symbols related to
# building libtcl as a shared library instead of a static library.
#--------------------------------------------------------------------
echo $ac_n "checking how to build libraries""... $ac_c" 1>&6
| | | 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 |
#--------------------------------------------------------------------
# The statements below define a collection of symbols related to
# building libtcl as a shared library instead of a static library.
#--------------------------------------------------------------------
echo $ac_n "checking how to build libraries""... $ac_c" 1>&6
echo "configure:1098: checking how to build libraries" >&5
# Check whether --enable-shared or --disable-shared was given.
if test "${enable_shared+set}" = set; then
enableval="$enable_shared"
tcl_ok=$enableval
else
tcl_ok=yes
fi
|
| ︙ | ︙ | |||
1120 1121 1122 1123 1124 1125 1126 |
#--------------------------------------------------------------------
# Step 0: Enable 64 bit support?
echo $ac_n "checking if 64bit support is requested""... $ac_c" 1>&6
| | | | 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 |
#--------------------------------------------------------------------
# Step 0: Enable 64 bit support?
echo $ac_n "checking if 64bit support is requested""... $ac_c" 1>&6
echo "configure:1139: checking if 64bit support is requested" >&5
# Check whether --enable-64bit or --disable-64bit was given.
if test "${enable_64bit+set}" = set; then
enableval="$enable_64bit"
do64bit=$enableval
else
do64bit=no
fi
echo "$ac_t""$do64bit" 1>&6
# Set some defaults (may get changed below)
EXTRA_CFLAGS=""
# Extract the first word of "cygpath", so it can be a program name with args.
set dummy cygpath; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1156: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CYGPATH'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
if test -n "$CYGPATH"; then
ac_cv_prog_CYGPATH="$CYGPATH" # Let the user override the test.
else
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
|
| ︙ | ︙ | |||
1174 1175 1176 1177 1178 1179 1180 |
else
DEPARG='"$(shell $(CYGPATH) $<)"'
fi
# set various compiler flags depending on whether we are using gcc or cl
echo $ac_n "checking compiler flags""... $ac_c" 1>&6
| | | | 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 |
else
DEPARG='"$(shell $(CYGPATH) $<)"'
fi
# set various compiler flags depending on whether we are using gcc or cl
echo $ac_n "checking compiler flags""... $ac_c" 1>&6
echo "configure:1193: checking compiler flags" >&5
if test "${GCC}" = "yes" ; then
if test "$do64bit" = "yes" ; then
echo "configure: warning: "64bit mode not supported with GCC on Windows"" 1>&2
fi
SHLIB_LD=""
SHLIB_LD_LIBS=""
LIBS=""
LIBS_GUI="-lgdi32 -lcomdlg32 -limm32 -lcomctl32"
STLIB_LD='${AR} cr'
RC_OUT=-o
RC_TYPE=
RC_INCLUDE=--include
RC_DEFINE=--define
RES=res.o
MAKE_LIB="\${STLIB_LD} \$@"
|
| ︙ | ︙ | |||
1323 1324 1325 1326 1327 1328 1329 |
STLIB_LD="lib -nologo"
LINKBIN="link -link50compat"
fi
SHLIB_LD="${LINKBIN} -dll -nologo -incremental:no"
SHLIB_LD_LIBS="user32.lib advapi32.lib"
LIBS="user32.lib advapi32.lib"
| | | 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 |
STLIB_LD="lib -nologo"
LINKBIN="link -link50compat"
fi
SHLIB_LD="${LINKBIN} -dll -nologo -incremental:no"
SHLIB_LD_LIBS="user32.lib advapi32.lib"
LIBS="user32.lib advapi32.lib"
LIBS_GUI="gdi32.lib comdlg32.lib imm32.lib comctl32.lib"
RC_OUT=-fo
RC_TYPE=-r
RC_INCLUDE=-i
RC_DEFINE=-d
RES=res
MAKE_LIB="\${STLIB_LD} -out:\$@"
POST_MAKE_LIB=
|
| ︙ | ︙ | |||
1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 |
# Specify linker flags depending on the type of app being
# built -- Console vs. Window.
LDFLAGS_CONSOLE="-link -subsystem:console ${lflags}"
LDFLAGS_WINDOW="-link -subsystem:windows ${lflags}"
fi
#--------------------------------------------------------------------
# Set the default compiler switches based on the --enable-symbols
# option. This macro depends on C flags, and should be called
# after SC_CONFIG_CFLAGS macro is called.
#--------------------------------------------------------------------
echo $ac_n "checking for build with symbols""... $ac_c" 1>&6
| > > > > > > | | 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 |
# Specify linker flags depending on the type of app being
# built -- Console vs. Window.
LDFLAGS_CONSOLE="-link -subsystem:console ${lflags}"
LDFLAGS_WINDOW="-link -subsystem:windows ${lflags}"
fi
# DL_LIBS is empty, but then we match the Unix version
#--------------------------------------------------------------------
# Set the default compiler switches based on the --enable-symbols
# option. This macro depends on C flags, and should be called
# after SC_CONFIG_CFLAGS macro is called.
#--------------------------------------------------------------------
echo $ac_n "checking for build with symbols""... $ac_c" 1>&6
echo "configure:1383: checking for build with symbols" >&5
# Check whether --enable-symbols or --disable-symbols was given.
if test "${enable_symbols+set}" = set; then
enableval="$enable_symbols"
tcl_ok=$enableval
else
tcl_ok=no
fi
|
| ︙ | ︙ | |||
1388 1389 1390 1391 1392 1393 1394 |
TCL_DBGX=${DBGX}
#--------------------------------------------------------------------
# man2tcl needs this so that it can use errno.h
#--------------------------------------------------------------------
echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
| | < < < < < < < < < < < < < < < < < | > > > > > > > > > > > > > > > > > | 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 |
TCL_DBGX=${DBGX}
#--------------------------------------------------------------------
# man2tcl needs this so that it can use errno.h
#--------------------------------------------------------------------
echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
echo "configure:1413: checking how to run the C preprocessor" >&5
# On Suns, sometimes $CPP names a directory.
if test -n "$CPP" && test -d "$CPP"; then
CPP=
fi
if test -z "$CPP"; then
if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
# This must be in double quotes, not single quotes, because CPP may get
# substituted into the Makefile and "${CC-cc}" will confuse make.
CPP="${CC-cc} -E"
# On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp.
cat > conftest.$ac_ext <<EOF
#line 1428 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1434: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
else
echo "$ac_err" >&5
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
CPP="${CC-cc} -E -traditional-cpp"
cat > conftest.$ac_ext <<EOF
#line 1445 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1451: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
else
echo "$ac_err" >&5
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
CPP="${CC-cc} -nologo -E"
cat > conftest.$ac_ext <<EOF
#line 1462 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1468: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
else
echo "$ac_err" >&5
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
CPP=/lib/cpp
fi
|
| ︙ | ︙ | |||
1469 1470 1471 1472 1473 1474 1475 | else ac_cv_prog_CPP="$CPP" fi echo "$ac_t""$CPP" 1>&6 ac_safe=`echo "errno.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for errno.h""... $ac_c" 1>&6 | | | | | 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 |
else
ac_cv_prog_CPP="$CPP"
fi
echo "$ac_t""$CPP" 1>&6
ac_safe=`echo "errno.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for errno.h""... $ac_c" 1>&6
echo "configure:1494: checking for errno.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 1499 "configure"
#include "confdefs.h"
#include <errno.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1504: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
eval "ac_cv_header_$ac_safe=yes"
else
echo "$ac_err" >&5
echo "configure: failed program was:" >&5
|
| ︙ | ︙ | |||
1530 1531 1532 1533 1534 1535 1536 |
#TCL_LIB_FLAG
#TCL_BUILD_LIB_SPEC
#TCL_LIB_SPEC
eval "TCL_STUB_LIB_FILE=\"${LIBPREFIX}tclstub${VER}${LIBSUFFIX}\""
eval "TCL_STUB_LIB_FLAG=\"-ltclstub${VER}${TCL_DBGX}\""
eval "TCL_BUILD_STUB_LIB_SPEC=\"-L`pwd` ${TCL_STUB_LIB_FLAG}\""
| | | > > > > | 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 |
#TCL_LIB_FLAG
#TCL_BUILD_LIB_SPEC
#TCL_LIB_SPEC
eval "TCL_STUB_LIB_FILE=\"${LIBPREFIX}tclstub${VER}${LIBSUFFIX}\""
eval "TCL_STUB_LIB_FLAG=\"-ltclstub${VER}${TCL_DBGX}\""
eval "TCL_BUILD_STUB_LIB_SPEC=\"-L`pwd` ${TCL_STUB_LIB_FLAG}\""
eval "TCL_STUB_LIB_SPEC=\"-L${libdir} ${TCL_STUB_LIB_FLAG}\""
eval "TCL_BUILD_STUB_LIB_PATH=\"`pwd`/${TCL_STUB_LIB_FILE}\""
eval "TCL_STUB_LIB_PATH=\"${libdir}/${TCL_STUB_LIB_FILE}\""
# Install time header dir can be set via --includedir
eval "TCL_INCLUDE_SPEC=\"-I${includedir}\""
eval "DLLSUFFIX=${DLLSUFFIX}"
eval "LIBPREFIX=${LIBPREFIX}"
eval "LIBSUFFIX=${LIBSUFFIX}"
eval "EXESUFFIX=${EXESUFFIX}"
CFG_TCL_SHARED_LIB_SUFFIX=${TCL_SHARED_LIB_SUFFIX}
|
| ︙ | ︙ | |||
1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | < < < < < < < < < < < < < < < < < | 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 | # empty on win # win/tcl.m4 doesn't set (CFLAGS) # win/tcl.m4 doesn't set (LDFLAGS) # empty on win, but needs sub'ing # win only | |
| ︙ | ︙ | |||
1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 | s%@RANLIB@%$RANLIB%g s%@RC@%$RC%g s%@SET_MAKE@%$SET_MAKE%g s%@OBJEXT@%$OBJEXT%g s%@EXEEXT@%$EXEEXT%g s%@TCL_THREADS@%$TCL_THREADS%g s%@CYGPATH@%$CYGPATH%g s%@CPP@%$CPP%g s%@MAN2TCLFLAGS@%$MAN2TCLFLAGS%g s%@TCL_VERSION@%$TCL_VERSION%g s%@TCL_MAJOR_VERSION@%$TCL_MAJOR_VERSION%g s%@TCL_MINOR_VERSION@%$TCL_MINOR_VERSION%g s%@TCL_PATCH_LEVEL@%$TCL_PATCH_LEVEL%g | > > > > < < < < < < < < | < > > > | < < < < < | < < < < | | | | | | > > > > > > > > > > > > > > > > > > > > > > | 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 | s%@RANLIB@%$RANLIB%g s%@RC@%$RC%g s%@SET_MAKE@%$SET_MAKE%g s%@OBJEXT@%$OBJEXT%g s%@EXEEXT@%$EXEEXT%g s%@TCL_THREADS@%$TCL_THREADS%g s%@CYGPATH@%$CYGPATH%g s%@DL_LIBS@%$DL_LIBS%g s%@CFLAGS_DEBUG@%$CFLAGS_DEBUG%g s%@CFLAGS_OPTIMIZE@%$CFLAGS_OPTIMIZE%g s%@CFLAGS_WARNING@%$CFLAGS_WARNING%g s%@CPP@%$CPP%g s%@MAN2TCLFLAGS@%$MAN2TCLFLAGS%g s%@TCL_VERSION@%$TCL_VERSION%g s%@TCL_MAJOR_VERSION@%$TCL_MAJOR_VERSION%g s%@TCL_MINOR_VERSION@%$TCL_MINOR_VERSION%g s%@TCL_PATCH_LEVEL@%$TCL_PATCH_LEVEL%g s%@TCL_LIB_FILE@%$TCL_LIB_FILE%g s%@TCL_LIB_FLAG@%$TCL_LIB_FLAG%g s%@TCL_LIB_SPEC@%$TCL_LIB_SPEC%g s%@TCL_STUB_LIB_FILE@%$TCL_STUB_LIB_FILE%g s%@TCL_STUB_LIB_FLAG@%$TCL_STUB_LIB_FLAG%g s%@TCL_STUB_LIB_SPEC@%$TCL_STUB_LIB_SPEC%g s%@TCL_STUB_LIB_PATH@%$TCL_STUB_LIB_PATH%g s%@TCL_INCLUDE_SPEC@%$TCL_INCLUDE_SPEC%g s%@TCL_BUILD_STUB_LIB_SPEC@%$TCL_BUILD_STUB_LIB_SPEC%g s%@TCL_BUILD_STUB_LIB_PATH@%$TCL_BUILD_STUB_LIB_PATH%g s%@TCL_DLL_FILE@%$TCL_DLL_FILE%g s%@TCL_SRC_DIR@%$TCL_SRC_DIR%g s%@TCL_BIN_DIR@%$TCL_BIN_DIR%g s%@TCL_DBGX@%$TCL_DBGX%g s%@CFG_TCL_SHARED_LIB_SUFFIX@%$CFG_TCL_SHARED_LIB_SUFFIX%g s%@CFG_TCL_UNSHARED_LIB_SUFFIX@%$CFG_TCL_UNSHARED_LIB_SUFFIX%g s%@CFG_TCL_EXPORT_FILE_SUFFIX@%$CFG_TCL_EXPORT_FILE_SUFFIX%g s%@CFLAGS_DEFAULT@%$CFLAGS_DEFAULT%g s%@EXTRA_CFLAGS@%$EXTRA_CFLAGS%g s%@DEPARG@%$DEPARG%g s%@CC_OBJNAME@%$CC_OBJNAME%g s%@CC_EXENAME@%$CC_EXENAME%g s%@LDFLAGS_DEFAULT@%$LDFLAGS_DEFAULT%g s%@LDFLAGS_DEBUG@%$LDFLAGS_DEBUG%g s%@LDFLAGS_OPTIMIZE@%$LDFLAGS_OPTIMIZE%g s%@LDFLAGS_CONSOLE@%$LDFLAGS_CONSOLE%g s%@LDFLAGS_WINDOW@%$LDFLAGS_WINDOW%g s%@STLIB_LD@%$STLIB_LD%g s%@SHLIB_LD@%$SHLIB_LD%g s%@SHLIB_LD_LIBS@%$SHLIB_LD_LIBS%g s%@SHLIB_CFLAGS@%$SHLIB_CFLAGS%g s%@SHLIB_SUFFIX@%$SHLIB_SUFFIX%g s%@TCL_SHARED_BUILD@%$TCL_SHARED_BUILD%g s%@LIBS_GUI@%$LIBS_GUI%g s%@DLLSUFFIX@%$DLLSUFFIX%g s%@LIBPREFIX@%$LIBPREFIX%g s%@LIBSUFFIX@%$LIBSUFFIX%g s%@EXESUFFIX@%$EXESUFFIX%g s%@LIBRARIES@%$LIBRARIES%g s%@MAKE_LIB@%$MAKE_LIB%g s%@POST_MAKE_LIB@%$POST_MAKE_LIB%g s%@MAKE_DLL@%$MAKE_DLL%g s%@MAKE_EXE@%$MAKE_EXE%g s%@TCL_BUILD_LIB_SPEC@%$TCL_BUILD_LIB_SPEC%g s%@TCL_LD_SEARCH_FLAGS@%$TCL_LD_SEARCH_FLAGS%g s%@TCL_NEEDS_EXP_FILE@%$TCL_NEEDS_EXP_FILE%g s%@TCL_BUILD_EXP_FILE@%$TCL_BUILD_EXP_FILE%g s%@TCL_EXP_FILE@%$TCL_EXP_FILE%g s%@LIBOBJS@%$LIBOBJS%g s%@TCL_LIB_VERSIONS_OK@%$TCL_LIB_VERSIONS_OK%g s%@TCL_PACKAGE_PATH@%$TCL_PACKAGE_PATH%g s%@TCL_DDE_VERSION@%$TCL_DDE_VERSION%g s%@TCL_DDE_MAJOR_VERSION@%$TCL_DDE_MAJOR_VERSION%g s%@TCL_DDE_MINOR_VERSION@%$TCL_DDE_MINOR_VERSION%g s%@TCL_DDE_PATCH_LEVEL@%$TCL_DDE_PATCH_LEVEL%g s%@TCL_REG_VERSION@%$TCL_REG_VERSION%g s%@TCL_REG_MAJOR_VERSION@%$TCL_REG_MAJOR_VERSION%g s%@TCL_REG_MINOR_VERSION@%$TCL_REG_MINOR_VERSION%g s%@TCL_REG_PATCH_LEVEL@%$TCL_REG_PATCH_LEVEL%g s%@RC_OUT@%$RC_OUT%g s%@RC_TYPE@%$RC_TYPE%g s%@RC_INCLUDE@%$RC_INCLUDE%g s%@RC_DEFINE@%$RC_DEFINE%g s%@RC_DEFINES@%$RC_DEFINES%g s%@RES@%$RES%g CEOF EOF cat >> $CONFIG_STATUS <<\EOF # Split the substitutions into bite-sized pieces for seds with |
| ︙ | ︙ |
Changes to win/configure.in.
1 2 3 4 | # This file is an input file used by the GNU "autoconf" program to # generate the file "configure", which is run during Tcl installation # to configure the system for the local environment. # | > | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | #! /bin/bash -norc # This file is an input file used by the GNU "autoconf" program to # generate the file "configure", which is run during Tcl installation # to configure the system for the local environment. # # RCS: @(#) $Id: configure.in,v 1.41.4.1 2002/02/05 02:22:05 wolfsuit Exp $ AC_INIT(../generic/tcl.h) TCL_VERSION=8.4 TCL_MAJOR_VERSION=8 TCL_MINOR_VERSION=4 TCL_PATCH_LEVEL="a4" |
| ︙ | ︙ | |||
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
TCL_REG_VERSION=1.0
TCL_REG_MAJOR_VERSION=1
TCL_REG_MINOR_VERSION=0
TCL_REG_PATCH_LEVEL=""
REGVER=$TCL_REG_MAJOR_VERSION$TCL_REG_MINOR_VERSION
if test "${prefix}" = "NONE"; then
prefix=/usr/local
fi
if test "${exec_prefix}" = "NONE"; then
exec_prefix=$prefix
fi
#------------------------------------------------------------------------
# Standard compiler checks
#------------------------------------------------------------------------
# If the user did not set CFLAGS, set it now to keep
# the AC_PROG_CC macro from adding "-g -O2".
| > > > > > > | 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
TCL_REG_VERSION=1.0
TCL_REG_MAJOR_VERSION=1
TCL_REG_MINOR_VERSION=0
TCL_REG_PATCH_LEVEL=""
REGVER=$TCL_REG_MAJOR_VERSION$TCL_REG_MINOR_VERSION
#------------------------------------------------------------------------
# Handle the --prefix=... option
#------------------------------------------------------------------------
if test "${prefix}" = "NONE"; then
prefix=/usr/local
fi
if test "${exec_prefix}" = "NONE"; then
exec_prefix=$prefix
fi
# libdir must be a fully qualified path (not ${exec_prefix}/lib)
eval libdir="$libdir"
#------------------------------------------------------------------------
# Standard compiler checks
#------------------------------------------------------------------------
# If the user did not set CFLAGS, set it now to keep
# the AC_PROG_CC macro from adding "-g -O2".
|
| ︙ | ︙ | |||
62 63 64 65 66 67 68 | #-------------------------------------------------------------------- # Checks to see if the make progeam sets the $MAKE variable. #-------------------------------------------------------------------- AC_PROG_MAKE_SET #-------------------------------------------------------------------- | | > > > > > | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
#--------------------------------------------------------------------
# Checks to see if the make progeam sets the $MAKE variable.
#--------------------------------------------------------------------
AC_PROG_MAKE_SET
#--------------------------------------------------------------------
# Perform additinal compiler tests.
#--------------------------------------------------------------------
AC_CYGWIN
if test "$ac_cv_cygwin" = "yes" ; then
AC_MSG_ERROR([Compiling with the Cygwin version of gcc is not supported.
Use the Mingw version of gcc from www.mingw.org instead.])
fi
#--------------------------------------------------------------------
# Determines the correct binary file extension (.o, .obj, .exe etc.)
#--------------------------------------------------------------------
AC_OBJEXT
AC_EXEEXT
|
| ︙ | ︙ | |||
139 140 141 142 143 144 145 |
#TCL_LIB_FLAG
#TCL_BUILD_LIB_SPEC
#TCL_LIB_SPEC
eval "TCL_STUB_LIB_FILE=\"${LIBPREFIX}tclstub${VER}${LIBSUFFIX}\""
eval "TCL_STUB_LIB_FLAG=\"-ltclstub${VER}${TCL_DBGX}\""
eval "TCL_BUILD_STUB_LIB_SPEC=\"-L`pwd` ${TCL_STUB_LIB_FLAG}\""
| | | > > > > | 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 |
#TCL_LIB_FLAG
#TCL_BUILD_LIB_SPEC
#TCL_LIB_SPEC
eval "TCL_STUB_LIB_FILE=\"${LIBPREFIX}tclstub${VER}${LIBSUFFIX}\""
eval "TCL_STUB_LIB_FLAG=\"-ltclstub${VER}${TCL_DBGX}\""
eval "TCL_BUILD_STUB_LIB_SPEC=\"-L`pwd` ${TCL_STUB_LIB_FLAG}\""
eval "TCL_STUB_LIB_SPEC=\"-L${libdir} ${TCL_STUB_LIB_FLAG}\""
eval "TCL_BUILD_STUB_LIB_PATH=\"`pwd`/${TCL_STUB_LIB_FILE}\""
eval "TCL_STUB_LIB_PATH=\"${libdir}/${TCL_STUB_LIB_FILE}\""
# Install time header dir can be set via --includedir
eval "TCL_INCLUDE_SPEC=\"-I${includedir}\""
eval "DLLSUFFIX=${DLLSUFFIX}"
eval "LIBPREFIX=${LIBPREFIX}"
eval "LIBSUFFIX=${LIBSUFFIX}"
eval "EXESUFFIX=${EXESUFFIX}"
CFG_TCL_SHARED_LIB_SUFFIX=${TCL_SHARED_LIB_SUFFIX}
|
| ︙ | ︙ | |||
176 177 178 179 180 181 182 | fi AC_SUBST(TCL_VERSION) AC_SUBST(TCL_MAJOR_VERSION) AC_SUBST(TCL_MINOR_VERSION) AC_SUBST(TCL_PATCH_LEVEL) | | < < | | < < > | | | | | | < | < < < < | | < | | < < < > > > | | | | | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 | fi AC_SUBST(TCL_VERSION) AC_SUBST(TCL_MAJOR_VERSION) AC_SUBST(TCL_MINOR_VERSION) AC_SUBST(TCL_PATCH_LEVEL) AC_SUBST(TCL_LIB_FILE) AC_SUBST(TCL_LIB_FLAG) # empty on win AC_SUBST(TCL_LIB_SPEC) AC_SUBST(TCL_STUB_LIB_FILE) AC_SUBST(TCL_STUB_LIB_FLAG) AC_SUBST(TCL_STUB_LIB_SPEC) AC_SUBST(TCL_STUB_LIB_PATH) AC_SUBST(TCL_INCLUDE_SPEC) AC_SUBST(TCL_BUILD_STUB_LIB_SPEC) AC_SUBST(TCL_BUILD_STUB_LIB_PATH) AC_SUBST(TCL_DLL_FILE) AC_SUBST(TCL_SRC_DIR) AC_SUBST(TCL_BIN_DIR) AC_SUBST(TCL_DBGX) AC_SUBST(CFG_TCL_SHARED_LIB_SUFFIX) AC_SUBST(CFG_TCL_UNSHARED_LIB_SUFFIX) AC_SUBST(CFG_TCL_EXPORT_FILE_SUFFIX) # win/tcl.m4 doesn't set (CFLAGS) AC_SUBST(CFLAGS_DEFAULT) AC_SUBST(EXTRA_CFLAGS) AC_SUBST(CYGPATH) AC_SUBST(DEPARG) AC_SUBST(CC_OBJNAME) AC_SUBST(CC_EXENAME) # win/tcl.m4 doesn't set (LDFLAGS) AC_SUBST(LDFLAGS_DEFAULT) AC_SUBST(LDFLAGS_DEBUG) AC_SUBST(LDFLAGS_OPTIMIZE) AC_SUBST(LDFLAGS_CONSOLE) AC_SUBST(LDFLAGS_WINDOW) AC_SUBST(AR) AC_SUBST(RANLIB) AC_SUBST(STLIB_LD) AC_SUBST(SHLIB_LD) AC_SUBST(SHLIB_LD_LIBS) AC_SUBST(SHLIB_CFLAGS) AC_SUBST(SHLIB_SUFFIX) AC_SUBST(TCL_SHARED_BUILD) AC_SUBST(LIBS) AC_SUBST(LIBS_GUI) AC_SUBST(DLLSUFFIX) AC_SUBST(LIBPREFIX) AC_SUBST(LIBSUFFIX) AC_SUBST(EXESUFFIX) AC_SUBST(LIBRARIES) AC_SUBST(MAKE_LIB) AC_SUBST(POST_MAKE_LIB) AC_SUBST(MAKE_DLL) AC_SUBST(MAKE_EXE) # empty on win, but needs sub'ing AC_SUBST(TCL_BUILD_LIB_SPEC) AC_SUBST(TCL_LD_SEARCH_FLAGS) AC_SUBST(TCL_NEEDS_EXP_FILE) AC_SUBST(TCL_BUILD_EXP_FILE) AC_SUBST(TCL_EXP_FILE) AC_SUBST(DL_LIBS) AC_SUBST(LIBOBJS) AC_SUBST(TCL_LIB_VERSIONS_OK) AC_SUBST(TCL_PACKAGE_PATH) # win only AC_SUBST(TCL_DDE_VERSION) AC_SUBST(TCL_DDE_MAJOR_VERSION) AC_SUBST(TCL_DDE_MINOR_VERSION) AC_SUBST(TCL_DDE_PATCH_LEVEL) AC_SUBST(TCL_REG_VERSION) AC_SUBST(TCL_REG_MAJOR_VERSION) AC_SUBST(TCL_REG_MINOR_VERSION) AC_SUBST(TCL_REG_PATCH_LEVEL) AC_SUBST(RC) AC_SUBST(RC_OUT) AC_SUBST(RC_TYPE) AC_SUBST(RC_INCLUDE) AC_SUBST(RC_DEFINE) AC_SUBST(RC_DEFINES) AC_SUBST(RES) AC_OUTPUT(Makefile tclConfig.sh tcl.hpj) |
Changes to win/mkd.bat.
1 | @echo off | | | < < < < < < < < < | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | @echo off rem RCS: @(#) $Id: mkd.bat,v 1.7.8.1 2002/02/05 02:22:05 wolfsuit Exp $ if exist %1\nul goto end md %1 if errorlevel 1 goto end echo Created directory %1 :end |
Changes to win/rmd.bat.
1 | @echo off | | | | < < < < | | < < | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | @echo off rem RCS: @(#) $Id: rmd.bat,v 1.7.8.1 2002/02/05 02:22:05 wolfsuit Exp $ if not exist %1\nul goto end echo Removing directory %1 if "%OS%" == "Windows_NT" goto winnt deltree /y %1 if errorlevel 1 goto end goto success :winnt rmdir /s /q %1 if errorlevel 1 goto end :success echo Deleted directory %1 :end |
Added win/rules.vc.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 | #------------------------------------------------------------------------------ # rules.vc -- # # Microsoft Visual C++ makefile include for decoding the commandline # macros. This file does not need editing to build Tcl. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # Copyright (c) 2001 Tomasoft Engineering. # #------------------------------------------------------------------------------ # RCS: @(#) $Id: rules.vc,v 1.4.4.1 2002/02/05 02:22:05 wolfsuit Exp $ #------------------------------------------------------------------------------ !ifndef _RULES_VC _RULES_VC = 1 cc32 = $(CC) # built-in default. link32 = link lib32 = lib rc32 = $(RC) # built-in default. !ifndef INSTALLDIR INSTALLDIR = C:\Progra~1\Tcl !endif !ifndef MACHINE MACHINE = IX86 !endif #---------------------------------------------------------- # Decode the options requested. #---------------------------------------------------------- !if "$(OPTS)" == "" || ![echo $(OPTS) | find /i "none" > nul] STATIC_BUILD = 0 TCL_THREADS = 0 DEBUG = 0 PROFILE = 0 MSVCRT = 0 TCL_LINKWITHEXTENSIONS = 0 !else !if ![echo $(OPTS) | find /i "static" > nul] !message *** Doing static STATIC_BUILD = 1 !else STATIC_BUILD = 0 !endif !if ![echo $(OPTS) | find /i "msvcrt" > nul] !message *** Doing msvcrt MSVCRT = 1 !else MSVCRT = 0 !endif !if ![echo $(OPTS) | find /i "linkexten" > nul] !message *** Doing linkexten TCL_LINKWITHEXTENSIONS = 1 !else TCL_LINKWITHEXTENSIONS = 0 !endif !if ![echo $(OPTS) | find /i "threads" > nul] !message *** Doing threads TCL_THREADS = 1 !else TCL_THREADS = 0 !endif !if ![echo $(OPTS) | find /i "symbols" > nul] !message *** Doing symbols DEBUG = 1 !else DEBUG = 0 !endif !if ![echo $(OPTS) | find /i "profile" > nul] !message *** Doing profile PROFILE = 1 !else PROFILE = 0 !endif !endif !if !$(STATIC_BUILD) # Make sure we don't build overly fat DLLs. MSVCRT = 1 # Shouldn't statically put the extensions inside the shell when dynamic. TCL_LINKWITHEXTENSIONS = 0 !endif #---------------------------------------------------------- # Figure-out how to name our intermediate and output directories. # We wouldn't want different builds to use the same .obj files # by accident. #---------------------------------------------------------- SUFX = tsdx !if $(DEBUG) BUILDDIRTOP = Debug DBGX = d !else BUILDDIRTOP = Release DBGX = SUFX = $(SUFX:d=) !endif TMP_DIRFULL = .\$(BUILDDIRTOP)\$(PROJECT)_ThreadedDynamicStaticX !if !$(STATIC_BUILD) TMP_DIRFULL = $(TMP_DIRFULL:Static=) SUFX = $(SUFX:s=) EXT = dll !if $(MSVCRT) TMP_DIRFULL = $(TMP_DIRFULL:X=) SUFX = $(SUFX:x=) !endif !else TMP_DIRFULL = $(TMP_DIRFULL:Dynamic=) EXT = lib !if !$(MSVCRT) TMP_DIRFULL = $(TMP_DIRFULL:X=) SUFX = $(SUFX:x=) !endif !endif !if !$(TCL_THREADS) TMP_DIRFULL = $(TMP_DIRFULL:Threaded=) SUFX = $(SUFX:t=) !endif !ifndef TMP_DIR TMP_DIR = $(TMP_DIRFULL) !ifndef OUT_DIR OUT_DIR = .\$(BUILDDIRTOP) !endif !else !ifndef OUT_DIR OUT_DIR = $(TMP_DIR) !endif !endif !message *** Intermediate directory will be '$(TMP_DIR)' !message *** Output directory will be '$(OUT_DIR)' !message *** Suffix for binaries will be '$(SUFX)' #---------------------------------------------------------- # Decode the statistics requested. #---------------------------------------------------------- !if "$(STATS)" == "" || ![echo $(STATS) | find /i "none" > nul] TCL_MEM_DEBUG = 0 TCL_COMPILE_DEBUG = 0 !else !if ![echo $(STATS) | find /i "memdbg" > nul] !message *** Doing memdbg TCL_MEM_DEBUG = 1 !else TCL_MEM_DEBUG = 0 !endif !if ![echo $(STATS) | find /i "compdbg" > nul] !message *** Doing compdbg TCL_COMPILE_DEBUG = 1 !else TCL_COMPILE_DEBUG = 0 !endif !endif OPTDEFINES = !if $(TCL_MEM_DEBUG) OPTDEFINES = -DTCL_MEM_DEBUG !endif !if $(TCL_COMPILE_DEBUG) OPTDEFINES = $(OPTDEFINES) -DTCL_COMPILE_DEBUG -DTCL_COMPILE_STATS !endif !if $(TCL_THREADS) OPTDEFINES = $(OPTDEFINES) -DTCL_THREADS=1 !endif !if $(STATIC_BUILD) OPTDEFINES = $(OPTDEFINES) -DSTATIC_BUILD !endif !message *** Optional defines are '$(OPTDEFINES)' !endif |
Added win/tcl.dsp.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 | # Microsoft Developer Studio Project File - Name="tcl" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) External Target" 0x0106 CFG=tcl - Win32 Debug Static !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "tcl.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "tcl.mak" CFG="tcl - Win32 Debug Static" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "tcl - Win32 Release" (based on "Win32 (x86) External Target") !MESSAGE "tcl - Win32 Debug" (based on "Win32 (x86) External Target") !MESSAGE "tcl - Win32 Debug Static" (based on "Win32 (x86) External Target") !MESSAGE "tcl - Win32 Release Static" (based on "Win32 (x86) External Target") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" !IF "$(CFG)" == "tcl - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release\tcl_Dynamic" # PROP BASE Cmd_Line "nmake -nologo -f makefile.vc OPTS=none MSVCDIR=IDE" # PROP BASE Rebuild_Opt "-a" # PROP BASE Target_File "Release\tclsh84.exe" # PROP BASE Bsc_Name "" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release\tcl_Dynamic" # PROP Cmd_Line "nmake -nologo -f makefile.vc OPTS=none MSVCDIR=IDE" # PROP Rebuild_Opt "-a" # PROP Target_File "Release\tclsh84.exe" # PROP Bsc_Name "" # PROP Target_Dir "" !ELSEIF "$(CFG)" == "tcl - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug\tcl_Dynamic" # PROP BASE Cmd_Line "nmake -nologo -f makefile.vc OPTS=symbols MSVCDIR=IDE" # PROP BASE Rebuild_Opt "-a" # PROP BASE Target_File "Debug\tclsh84d.exe" # PROP BASE Bsc_Name "" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug\tcl_Dynamic" # PROP Cmd_Line "nmake -nologo -f makefile.vc OPTS=symbols MSVCDIR=IDE" # PROP Rebuild_Opt "-a" # PROP Target_File "Debug\tclsh84d.exe" # PROP Bsc_Name "" # PROP Target_Dir "" !ELSEIF "$(CFG)" == "tcl - Win32 Debug Static" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug\tcl_Static" # PROP BASE Cmd_Line "nmake -nologo -f makefile.vc OPTS=symbols,static MSVCDIR=IDE" # PROP BASE Rebuild_Opt "-a" # PROP BASE Target_File "Debug\tclsh84d.exe" # PROP BASE Bsc_Name "" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug\tcl_Static" # PROP Cmd_Line "nmake -nologo -f makefile.vc OPTS=symbols,static MSVCDIR=IDE" # PROP Rebuild_Opt "-a" # PROP Target_File "Debug\tclsh84sd.exe" # PROP Bsc_Name "" # PROP Target_Dir "" !ELSEIF "$(CFG)" == "tcl - Win32 Release Static" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release\tcl_Static" # PROP BASE Cmd_Line "nmake -nologo -f makefile.vc OPTS=static MSVCDIR=IDE" # PROP BASE Rebuild_Opt "-a" # PROP BASE Target_File "Release\tclsh84.exe" # PROP BASE Bsc_Name "" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release\tcl_Static" # PROP Cmd_Line "nmake -nologo -f makefile.vc OPTS=static MSVCDIR=IDE" # PROP Rebuild_Opt "-a" # PROP Target_File "Release\tclsh84s.exe" # PROP Bsc_Name "" # PROP Target_Dir "" !ENDIF # Begin Target # Name "tcl - Win32 Release" # Name "tcl - Win32 Debug" # Name "tcl - Win32 Debug Static" # Name "tcl - Win32 Release Static" !IF "$(CFG)" == "tcl - Win32 Release" !ELSEIF "$(CFG)" == "tcl - Win32 Debug" !ELSEIF "$(CFG)" == "tcl - Win32 Debug Static" !ELSEIF "$(CFG)" == "tcl - Win32 Release Static" !ENDIF # Begin Group "compat" # PROP Default_Filter "" # Begin Source File SOURCE=..\compat\dirent.h # End Source File # Begin Source File SOURCE=..\compat\dirent2.h # End Source File # Begin Source File SOURCE=..\compat\dlfcn.h # End Source File # Begin Source File SOURCE=..\compat\fixstrtod.c # End Source File # Begin Source File SOURCE=..\compat\float.h # End Source File # Begin Source File SOURCE=..\compat\gettod.c # End Source File # Begin Source File SOURCE=..\compat\limits.h # End Source File # Begin Source File SOURCE=..\compat\memcmp.c # End Source File # Begin Source File SOURCE=..\compat\opendir.c # End Source File # Begin Source File SOURCE=..\compat\README # End Source File # Begin Source File SOURCE=..\compat\stdlib.h # End Source File # Begin Source File SOURCE=..\compat\strftime.c # End Source File # Begin Source File SOURCE=..\compat\string.h # End Source File # Begin Source File SOURCE=..\compat\strncasecmp.c # End Source File # Begin Source File SOURCE=..\compat\strstr.c # End Source File # Begin Source File SOURCE=..\compat\strtod.c # End Source File # Begin Source File SOURCE=..\compat\strtol.c # End Source File # Begin Source File SOURCE=..\compat\strtoul.c # End Source File # Begin Source File SOURCE=..\compat\tclErrno.h # End Source File # Begin Source File SOURCE=..\compat\tmpnam.c # End Source File # Begin Source File SOURCE=..\compat\unistd.h # End Source File # Begin Source File SOURCE=..\compat\waitpid.c # End Source File # End Group # Begin Group "doc" # PROP Default_Filter "" # Begin Source File SOURCE=..\doc\Access.3 # End Source File # Begin Source File SOURCE=..\doc\AddErrInfo.3 # End Source File # Begin Source File SOURCE=..\doc\after.n # End Source File # Begin Source File SOURCE=..\doc\Alloc.3 # End Source File # Begin Source File SOURCE=..\doc\AllowExc.3 # End Source File # Begin Source File SOURCE=..\doc\append.n # End Source File # Begin Source File SOURCE=..\doc\AppInit.3 # End Source File # Begin Source File SOURCE=..\doc\array.n # End Source File # Begin Source File SOURCE=..\doc\AssocData.3 # End Source File # Begin Source File SOURCE=..\doc\Async.3 # End Source File # Begin Source File SOURCE=..\doc\BackgdErr.3 # End Source File # Begin Source File SOURCE=..\doc\Backslash.3 # End Source File # Begin Source File SOURCE=..\doc\bgerror.n # End Source File # Begin Source File SOURCE=..\doc\binary.n # End Source File # Begin Source File SOURCE=..\doc\BoolObj.3 # End Source File # Begin Source File SOURCE=..\doc\break.n # End Source File # Begin Source File SOURCE=..\doc\ByteArrObj.3 # End Source File # Begin Source File SOURCE=..\doc\CallDel.3 # End Source File # Begin Source File SOURCE=..\doc\case.n # End Source File # Begin Source File SOURCE=..\doc\catch.n # End Source File # Begin Source File SOURCE=..\doc\cd.n # End Source File # Begin Source File SOURCE=..\doc\ChnlStack.3 # End Source File # Begin Source File SOURCE=..\doc\clock.n # End Source File # Begin Source File SOURCE=..\doc\close.n # End Source File # Begin Source File SOURCE=..\doc\CmdCmplt.3 # End Source File # Begin Source File SOURCE=..\doc\Concat.3 # End Source File # Begin Source File SOURCE=..\doc\concat.n # End Source File # Begin Source File SOURCE=..\doc\continue.n # End Source File # Begin Source File SOURCE=..\doc\CrtChannel.3 # End Source File # Begin Source File SOURCE=..\doc\CrtChnlHdlr.3 # End Source File # Begin Source File SOURCE=..\doc\CrtCloseHdlr.3 # End Source File # Begin Source File SOURCE=..\doc\CrtCommand.3 # End Source File # Begin Source File SOURCE=..\doc\CrtFileHdlr.3 # End Source File # Begin Source File SOURCE=..\doc\CrtInterp.3 # End Source File # Begin Source File SOURCE=..\doc\CrtMathFnc.3 # End Source File # Begin Source File SOURCE=..\doc\CrtObjCmd.3 # End Source File # Begin Source File SOURCE=..\doc\CrtSlave.3 # End Source File # Begin Source File SOURCE=..\doc\CrtTimerHdlr.3 # End Source File # Begin Source File SOURCE=..\doc\CrtTrace.3 # End Source File # Begin Source File SOURCE=..\doc\dde.n # End Source File # Begin Source File SOURCE=..\doc\DetachPids.3 # End Source File # Begin Source File SOURCE=..\doc\DoOneEvent.3 # End Source File # Begin Source File SOURCE=..\doc\DoubleObj.3 # End Source File # Begin Source File SOURCE=..\doc\DoWhenIdle.3 # End Source File # Begin Source File SOURCE=..\doc\DString.3 # End Source File # Begin Source File SOURCE=..\doc\DumpActiveMemory.3 # End Source File # Begin Source File SOURCE=..\doc\Encoding.3 # End Source File # Begin Source File SOURCE=..\doc\encoding.n # End Source File # Begin Source File SOURCE=..\doc\Environment.3 # End Source File # Begin Source File SOURCE=..\doc\eof.n # End Source File # Begin Source File SOURCE=..\doc\error.n # End Source File # Begin Source File SOURCE=..\doc\Eval.3 # End Source File # Begin Source File SOURCE=..\doc\eval.n # End Source File # Begin Source File SOURCE=..\doc\exec.n # End Source File # Begin Source File SOURCE=..\doc\Exit.3 # End Source File # Begin Source File SOURCE=..\doc\exit.n # End Source File # Begin Source File SOURCE=..\doc\expr.n # End Source File # Begin Source File SOURCE=..\doc\ExprLong.3 # End Source File # Begin Source File SOURCE=..\doc\ExprLongObj.3 # End Source File # Begin Source File SOURCE=..\doc\fblocked.n # End Source File # Begin Source File SOURCE=..\doc\fconfigure.n # End Source File # Begin Source File SOURCE=..\doc\fcopy.n # End Source File # Begin Source File SOURCE=..\doc\file.n # End Source File # Begin Source File SOURCE=..\doc\fileevent.n # End Source File # Begin Source File SOURCE=..\doc\filename.n # End Source File # Begin Source File SOURCE=..\doc\FileSystem.3 # End Source File # Begin Source File SOURCE=..\doc\FindExec.3 # End Source File # Begin Source File SOURCE=..\doc\flush.n # End Source File # Begin Source File SOURCE=..\doc\for.n # End Source File # Begin Source File SOURCE=..\doc\foreach.n # End Source File # Begin Source File SOURCE=..\doc\format.n # End Source File # Begin Source File SOURCE=..\doc\GetCwd.3 # End Source File # Begin Source File SOURCE=..\doc\GetHostName.3 # End Source File # Begin Source File SOURCE=..\doc\GetIndex.3 # End Source File # Begin Source File SOURCE=..\doc\GetInt.3 # End Source File # Begin Source File SOURCE=..\doc\GetOpnFl.3 # End Source File # Begin Source File SOURCE=..\doc\gets.n # End Source File # Begin Source File SOURCE=..\doc\GetStdChan.3 # End Source File # Begin Source File SOURCE=..\doc\GetVersion.3 # End Source File # Begin Source File SOURCE=..\doc\glob.n # End Source File # Begin Source File SOURCE=..\doc\global.n # End Source File # Begin Source File SOURCE=..\doc\Hash.3 # End Source File # Begin Source File SOURCE=..\doc\history.n # End Source File # Begin Source File SOURCE=..\doc\http.n # End Source File # Begin Source File SOURCE=..\doc\if.n # End Source File # Begin Source File SOURCE=..\doc\incr.n # End Source File # Begin Source File SOURCE=..\doc\info.n # End Source File # Begin Source File SOURCE=..\doc\Init.3 # End Source File # Begin Source File SOURCE=..\doc\InitStubs.3 # End Source File # Begin Source File SOURCE=..\doc\Interp.3 # End Source File # Begin Source File SOURCE=..\doc\interp.n # End Source File # Begin Source File SOURCE=..\doc\IntObj.3 # End Source File # Begin Source File SOURCE=..\doc\join.n # End Source File # Begin Source File SOURCE=..\doc\lappend.n # End Source File # Begin Source File SOURCE=..\doc\library.n # End Source File # Begin Source File SOURCE=..\doc\lindex.n # End Source File # Begin Source File SOURCE=..\doc\LinkVar.3 # End Source File # Begin Source File SOURCE=..\doc\linsert.n # End Source File # Begin Source File SOURCE=..\doc\list.n # End Source File # Begin Source File SOURCE=..\doc\ListObj.3 # End Source File # Begin Source File SOURCE=..\doc\llength.n # End Source File # Begin Source File SOURCE=..\doc\load.n # End Source File # Begin Source File SOURCE=..\doc\lrange.n # End Source File # Begin Source File SOURCE=..\doc\lreplace.n # End Source File # Begin Source File SOURCE=..\doc\lsearch.n # End Source File # Begin Source File SOURCE=..\doc\lsort.n # End Source File # Begin Source File SOURCE=..\doc\Macintosh.3 # End Source File # Begin Source File SOURCE=..\doc\man.macros # End Source File # Begin Source File SOURCE=..\doc\memory.n # End Source File # Begin Source File SOURCE=..\doc\msgcat.n # End Source File # Begin Source File SOURCE=..\doc\namespace.n # End Source File # Begin Source File SOURCE=..\doc\Notifier.3 # End Source File # Begin Source File SOURCE=..\doc\Object.3 # End Source File # Begin Source File SOURCE=..\doc\ObjectType.3 # End Source File # Begin Source File SOURCE=..\doc\open.n # End Source File # Begin Source File SOURCE=..\doc\OpenFileChnl.3 # End Source File # Begin Source File SOURCE=..\doc\OpenTcp.3 # End Source File # Begin Source File SOURCE=..\doc\package.n # End Source File # Begin Source File SOURCE=..\doc\packagens.n # End Source File # Begin Source File SOURCE=..\doc\Panic.3 # End Source File # Begin Source File SOURCE=..\doc\ParseCmd.3 # End Source File # Begin Source File SOURCE=..\doc\pid.n # End Source File # Begin Source File SOURCE=..\doc\pkgMkIndex.n # End Source File # Begin Source File SOURCE=..\doc\PkgRequire.3 # End Source File # Begin Source File SOURCE=..\doc\Preserve.3 # End Source File # Begin Source File SOURCE=..\doc\PrintDbl.3 # End Source File # Begin Source File SOURCE=..\doc\proc.n # End Source File # Begin Source File SOURCE=..\doc\puts.n # End Source File # Begin Source File SOURCE=..\doc\pwd.n # End Source File # Begin Source File SOURCE=..\doc\re_syntax.n # End Source File # Begin Source File SOURCE=..\doc\read.n # End Source File # Begin Source File SOURCE=..\doc\RecEvalObj.3 # End Source File # Begin Source File SOURCE=..\doc\RecordEval.3 # End Source File # Begin Source File SOURCE=..\doc\RegExp.3 # End Source File # Begin Source File SOURCE=..\doc\regexp.n # End Source File # Begin Source File SOURCE=..\doc\registry.n # End Source File # Begin Source File SOURCE=..\doc\regsub.n # End Source File # Begin Source File SOURCE=..\doc\rename.n # End Source File # Begin Source File SOURCE=..\doc\resource.n # End Source File # Begin Source File SOURCE=..\doc\return.n # End Source File # Begin Source File SOURCE=..\doc\safe.n # End Source File # Begin Source File SOURCE=..\doc\SaveResult.3 # End Source File # Begin Source File SOURCE=..\doc\scan.n # End Source File # Begin Source File SOURCE=..\doc\seek.n # End Source File # Begin Source File SOURCE=..\doc\set.n # End Source File # Begin Source File SOURCE=..\doc\SetErrno.3 # End Source File # Begin Source File SOURCE=..\doc\SetRecLmt.3 # End Source File # Begin Source File SOURCE=..\doc\SetResult.3 # End Source File # Begin Source File SOURCE=..\doc\SetVar.3 # End Source File # Begin Source File SOURCE=..\doc\Signal.3 # End Source File # Begin Source File SOURCE=..\doc\Sleep.3 # End Source File # Begin Source File SOURCE=..\doc\socket.n # End Source File # Begin Source File SOURCE=..\doc\source.n # End Source File # Begin Source File SOURCE=..\doc\SourceRCFile.3 # End Source File # Begin Source File SOURCE=..\doc\split.n # End Source File # Begin Source File SOURCE=..\doc\SplitList.3 # End Source File # Begin Source File SOURCE=..\doc\SplitPath.3 # End Source File # Begin Source File SOURCE=..\doc\StaticPkg.3 # End Source File # Begin Source File SOURCE=..\doc\StdChannels.3 # End Source File # Begin Source File SOURCE=..\doc\string.n # End Source File # Begin Source File SOURCE=..\doc\StringObj.3 # End Source File # Begin Source File SOURCE=..\doc\StrMatch.3 # End Source File # Begin Source File SOURCE=..\doc\subst.n # End Source File # Begin Source File SOURCE=..\doc\SubstObj.3 # End Source File # Begin Source File SOURCE=..\doc\switch.n # End Source File # Begin Source File SOURCE=..\doc\Tcl.n # End Source File # Begin Source File SOURCE=..\doc\Tcl_Main.3 # End Source File # Begin Source File SOURCE=..\doc\TCL_MEM_DEBUG.3 # End Source File # Begin Source File SOURCE=..\doc\tclsh.1 # End Source File # Begin Source File SOURCE=..\doc\tcltest.n # End Source File # Begin Source File SOURCE=..\doc\tclvars.n # End Source File # Begin Source File SOURCE=..\doc\tell.n # End Source File # Begin Source File SOURCE=..\doc\Thread.3 # End Source File # Begin Source File SOURCE=..\doc\time.n # End Source File # Begin Source File SOURCE=..\doc\ToUpper.3 # End Source File # Begin Source File SOURCE=..\doc\trace.n # End Source File # Begin Source File SOURCE=..\doc\TraceVar.3 # End Source File # Begin Source File SOURCE=..\doc\Translate.3 # End Source File # Begin Source File SOURCE=..\doc\UniCharIsAlpha.3 # End Source File # Begin Source File SOURCE=..\doc\unknown.n # End Source File # Begin Source File SOURCE=..\doc\unset.n # End Source File # Begin Source File SOURCE=..\doc\update.n # End Source File # Begin Source File SOURCE=..\doc\uplevel.n # End Source File # Begin Source File SOURCE=..\doc\UpVar.3 # End Source File # Begin Source File SOURCE=..\doc\upvar.n # End Source File # Begin Source File SOURCE=..\doc\Utf.3 # End Source File # Begin Source File SOURCE=..\doc\variable.n # End Source File # Begin Source File SOURCE=..\doc\vwait.n # End Source File # Begin Source File SOURCE=..\doc\while.n # End Source File # Begin Source File SOURCE=..\doc\WrongNumArgs.3 # End Source File # End Group # Begin Group "generic" # PROP Default_Filter "" # Begin Source File SOURCE=..\generic\README # End Source File # Begin Source File SOURCE=..\generic\regc_color.c # End Source File # Begin Source File SOURCE=..\generic\regc_cvec.c # End Source File # Begin Source File SOURCE=..\generic\regc_lex.c # End Source File # Begin Source File SOURCE=..\generic\regc_locale.c # End Source File # Begin Source File SOURCE=..\generic\regc_nfa.c # End Source File # Begin Source File SOURCE=..\generic\regcomp.c # End Source File # Begin Source File SOURCE=..\generic\regcustom.h # End Source File # Begin Source File SOURCE=..\generic\rege_dfa.c # End Source File # Begin Source File SOURCE=..\generic\regerror.c # End Source File # Begin Source File SOURCE=..\generic\regerrs.h # End Source File # Begin Source File SOURCE=..\generic\regex.h # End Source File # Begin Source File SOURCE=..\generic\regexec.c # End Source File # Begin Source File SOURCE=..\generic\regfree.c # End Source File # Begin Source File SOURCE=..\generic\regfronts.c # End Source File # Begin Source File SOURCE=..\generic\regguts.h # End Source File # Begin Source File SOURCE=..\generic\tcl.decls # End Source File # Begin Source File SOURCE=..\generic\tcl.h # End Source File # Begin Source File SOURCE=..\generic\tclAlloc.c # End Source File # Begin Source File SOURCE=..\generic\tclAsync.c # End Source File # Begin Source File SOURCE=..\generic\tclBasic.c # End Source File # Begin Source File SOURCE=..\generic\tclBinary.c # End Source File # Begin Source File SOURCE=..\generic\tclCkalloc.c # End Source File # Begin Source File SOURCE=..\generic\tclClock.c # End Source File # Begin Source File SOURCE=..\generic\tclCmdAH.c # End Source File # Begin Source File SOURCE=..\generic\tclCmdIL.c # End Source File # Begin Source File SOURCE=..\generic\tclCmdMZ.c # End Source File # Begin Source File SOURCE=..\generic\tclCompCmds.c # End Source File # Begin Source File SOURCE=..\generic\tclCompExpr.c # End Source File # Begin Source File SOURCE=..\generic\tclCompile.c # End Source File # Begin Source File SOURCE=..\generic\tclCompile.h # End Source File # Begin Source File SOURCE=..\generic\tclDate.c # End Source File # Begin Source File SOURCE=..\generic\tclDecls.h # End Source File # Begin Source File SOURCE=..\generic\tclEncoding.c # End Source File # Begin Source File SOURCE=..\generic\tclEnv.c # End Source File # Begin Source File SOURCE=..\generic\tclEvent.c # End Source File # Begin Source File SOURCE=..\generic\tclExecute.c # End Source File # Begin Source File SOURCE=..\generic\tclFCmd.c # End Source File # Begin Source File SOURCE=..\generic\tclFileName.c # End Source File # Begin Source File SOURCE=..\generic\tclGet.c # End Source File # Begin Source File SOURCE=..\generic\tclGetDate.y # End Source File # Begin Source File SOURCE=..\generic\tclHash.c # End Source File # Begin Source File SOURCE=..\generic\tclHistory.c # End Source File # Begin Source File SOURCE=..\generic\tclIndexObj.c # End Source File # Begin Source File SOURCE=..\generic\tclInitScript.h # End Source File # Begin Source File SOURCE=..\generic\tclInt.decls # End Source File # Begin Source File SOURCE=..\generic\tclInt.h # End Source File # Begin Source File SOURCE=..\generic\tclIntDecls.h # End Source File # Begin Source File SOURCE=..\generic\tclInterp.c # End Source File # Begin Source File SOURCE=..\generic\tclIntPlatDecls.h # End Source File # Begin Source File SOURCE=..\generic\tclIO.c # End Source File # Begin Source File SOURCE=..\generic\tclIO.h # End Source File # Begin Source File SOURCE=..\generic\tclIOCmd.c # End Source File # Begin Source File SOURCE=..\generic\tclIOGT.c # End Source File # Begin Source File SOURCE=..\generic\tclIOSock.c # End Source File # Begin Source File SOURCE=..\generic\tclIOUtil.c # End Source File # Begin Source File SOURCE=..\generic\tclLink.c # End Source File # Begin Source File SOURCE=..\generic\tclListObj.c # End Source File # Begin Source File SOURCE=..\generic\tclLiteral.c # End Source File # Begin Source File SOURCE=..\generic\tclLoad.c # End Source File # Begin Source File SOURCE=..\generic\tclLoadNone.c # End Source File # Begin Source File SOURCE=..\generic\tclMain.c # End Source File # Begin Source File SOURCE=..\generic\tclMath.h # End Source File # Begin Source File SOURCE=..\generic\tclNamesp.c # End Source File # Begin Source File SOURCE=..\generic\tclNotify.c # End Source File # Begin Source File SOURCE=..\generic\tclObj.c # End Source File # Begin Source File SOURCE=..\generic\tclPanic.c # End Source File # Begin Source File SOURCE=..\generic\tclParse.c # End Source File # Begin Source File SOURCE=..\generic\tclParseExpr.c # End Source File # Begin Source File SOURCE=..\generic\tclPipe.c # End Source File # Begin Source File SOURCE=..\generic\tclPkg.c # End Source File # Begin Source File SOURCE=..\generic\tclPlatDecls.h # End Source File # Begin Source File SOURCE=..\generic\tclPort.h # End Source File # Begin Source File SOURCE=..\generic\tclPosixStr.c # End Source File # Begin Source File SOURCE=..\generic\tclPreserve.c # End Source File # Begin Source File SOURCE=..\generic\tclProc.c # End Source File # Begin Source File SOURCE=..\generic\tclRegexp.c # End Source File # Begin Source File SOURCE=..\generic\tclRegexp.h # End Source File # Begin Source File SOURCE=..\generic\tclResolve.c # End Source File # Begin Source File SOURCE=..\generic\tclResult.c # End Source File # Begin Source File SOURCE=..\generic\tclScan.c # End Source File # Begin Source File SOURCE=..\generic\tclStringObj.c # End Source File # Begin Source File SOURCE=..\generic\tclStubInit.c # End Source File # Begin Source File SOURCE=..\generic\tclStubLib.c # End Source File # Begin Source File SOURCE=..\generic\tclTest.c # End Source File # Begin Source File SOURCE=..\generic\tclTestObj.c # End Source File # Begin Source File SOURCE=..\generic\tclTestProcBodyObj.c # End Source File # Begin Source File SOURCE=..\generic\tclThread.c # End Source File # Begin Source File SOURCE=..\generic\tclThreadJoin.c # End Source File # Begin Source File SOURCE=..\generic\tclThreadTest.c # End Source File # Begin Source File SOURCE=..\generic\tclTimer.c # End Source File # Begin Source File SOURCE=..\generic\tclUniData.c # End Source File # Begin Source File SOURCE=..\generic\tclUtf.c # End Source File # Begin Source File SOURCE=..\generic\tclUtil.c # End Source File # Begin Source File SOURCE=..\generic\tclVar.c # End Source File # End Group # Begin Group "library" # PROP Default_Filter "" # Begin Source File SOURCE=..\library\auto.tcl # End Source File # Begin Source File SOURCE=..\library\history.tcl # End Source File # Begin Source File SOURCE=..\library\init.tcl # End Source File # Begin Source File SOURCE=..\library\ldAout.tcl # End Source File # Begin Source File SOURCE=..\library\package.tcl # End Source File # Begin Source File SOURCE=..\library\parray.tcl # End Source File # Begin Source File SOURCE=..\library\safe.tcl # End Source File # Begin Source File SOURCE=..\library\tclIndex # End Source File # Begin Source File SOURCE=..\library\word.tcl # End Source File # End Group # Begin Group "mac" # PROP Default_Filter "" # End Group # Begin Group "tests" # PROP Default_Filter "" # End Group # Begin Group "tools" # PROP Default_Filter "" # End Group # Begin Group "unix" # PROP Default_Filter "" # End Group # Begin Group "win" # PROP Default_Filter "" # Begin Source File SOURCE=.\aclocal.m4 # End Source File # Begin Source File SOURCE=.\cat.c # End Source File # Begin Source File SOURCE=.\configure # End Source File # Begin Source File SOURCE=.\configure.in # End Source File # Begin Source File SOURCE=.\makefile.bc # End Source File # Begin Source File SOURCE=.\Makefile.in # End Source File # Begin Source File SOURCE=.\makefile.vc # End Source File # Begin Source File SOURCE=.\mkd.bat # End Source File # Begin Source File SOURCE=.\README # End Source File # Begin Source File SOURCE=.\README.binary # End Source File # Begin Source File SOURCE=.\rmd.bat # End Source File # Begin Source File SOURCE=.\rules.vc # End Source File # Begin Source File SOURCE=.\stub16.c # End Source File # Begin Source File SOURCE=.\tcl.hpj.in # End Source File # Begin Source File SOURCE=.\tcl.m4 # End Source File # Begin Source File SOURCE=.\tcl.rc # End Source File # Begin Source File SOURCE=.\tclAppInit.c # End Source File # Begin Source File SOURCE=.\tclConfig.sh.in # End Source File # Begin Source File SOURCE=.\tclsh.ico # End Source File # Begin Source File SOURCE=.\tclsh.rc # End Source File # Begin Source File SOURCE=.\tclWin32Dll.c # End Source File # Begin Source File SOURCE=.\tclWinChan.c # End Source File # Begin Source File SOURCE=.\tclWinConsole.c # End Source File # Begin Source File SOURCE=.\tclWinDde.c # End Source File # Begin Source File SOURCE=.\tclWinError.c # End Source File # Begin Source File SOURCE=.\tclWinFCmd.c # End Source File # Begin Source File SOURCE=.\tclWinFile.c # End Source File # Begin Source File SOURCE=.\tclWinInit.c # End Source File # Begin Source File SOURCE=.\tclWinInt.h # End Source File # Begin Source File SOURCE=.\tclWinLoad.c # End Source File # Begin Source File SOURCE=.\tclWinMtherr.c # End Source File # Begin Source File SOURCE=.\tclWinNotify.c # End Source File # Begin Source File SOURCE=.\tclWinPipe.c # End Source File # Begin Source File SOURCE=.\tclWinPort.h # End Source File # Begin Source File SOURCE=.\tclWinReg.c # End Source File # Begin Source File SOURCE=.\tclWinSerial.c # End Source File # Begin Source File SOURCE=.\tclWinSock.c # End Source File # Begin Source File SOURCE=.\tclWinTest.c # End Source File # Begin Source File SOURCE=.\tclWinThrd.c # End Source File # Begin Source File SOURCE=.\tclWinThrd.h # End Source File # Begin Source File SOURCE=.\tclWinTime.c # End Source File # End Group # End Target # End Project |
Added win/tcl.dsw.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 |
Microsoft Developer Studio Workspace File, Format Version 6.00
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
###############################################################################
Project: "tcl"=.\tcl.dsp - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
}}}
###############################################################################
Global:
Package=<5>
{{{
}}}
Package=<3>
{{{
}}}
###############################################################################
|
Changes to win/tcl.m4.
| ︙ | ︙ | |||
102 103 104 105 106 107 108 |
if test -f "$TCL_BIN_DIR/tclConfig.sh" ; then
AC_MSG_RESULT([loading])
. $TCL_BIN_DIR/tclConfig.sh
else
AC_MSG_RESULT([file not found])
fi
| > > > > > > > > > > > > > > > > | < | > | | > > > > > > > > > > > > > | 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 |
if test -f "$TCL_BIN_DIR/tclConfig.sh" ; then
AC_MSG_RESULT([loading])
. $TCL_BIN_DIR/tclConfig.sh
else
AC_MSG_RESULT([file not found])
fi
#
# If the TCL_BIN_DIR is the build directory (not the install directory),
# then set the common variable name to the value of the build variables.
# For example, the variable TCL_LIB_SPEC will be set to the value
# of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC
# instead of TCL_BUILD_LIB_SPEC since it will work with both an
# installed and uninstalled version of Tcl.
#
if test -f $TCL_BIN_DIR/Makefile ; then
TCL_LIB_SPEC=${TCL_BUILD_LIB_SPEC}
TCL_STUB_LIB_SPEC=${TCL_BUILD_STUB_LIB_SPEC}
TCL_STUB_LIB_PATH=${TCL_BUILD_STUB_LIB_PATH}
fi
#
# eval is required to do the TCL_DBGX substitution
#
eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\""
eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\""
eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\""
eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\""
eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\""
eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\""
AC_SUBST(TCL_VERSION)
AC_SUBST(TCL_BIN_DIR)
AC_SUBST(TCL_SRC_DIR)
AC_SUBST(TCL_LIB_FILE)
AC_SUBST(TCL_LIB_FLAG)
AC_SUBST(TCL_LIB_SPEC)
AC_SUBST(TCL_STUB_LIB_FILE)
AC_SUBST(TCL_STUB_LIB_FLAG)
AC_SUBST(TCL_STUB_LIB_SPEC)
])
#------------------------------------------------------------------------
# SC_LOAD_TKCONFIG --
#
# Load the tkConfig.sh file
# Currently a no-op for Windows
|
| ︙ | ︙ | |||
343 344 345 346 347 348 349 |
if test "${GCC}" = "yes" ; then
if test "$do64bit" = "yes" ; then
AC_MSG_WARN("64bit mode not supported with GCC on Windows")
fi
SHLIB_LD=""
SHLIB_LD_LIBS=""
LIBS=""
| | | 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 |
if test "${GCC}" = "yes" ; then
if test "$do64bit" = "yes" ; then
AC_MSG_WARN("64bit mode not supported with GCC on Windows")
fi
SHLIB_LD=""
SHLIB_LD_LIBS=""
LIBS=""
LIBS_GUI="-lgdi32 -lcomdlg32 -limm32 -lcomctl32"
STLIB_LD='${AR} cr'
RC_OUT=-o
RC_TYPE=
RC_INCLUDE=--include
RC_DEFINE=--define
RES=res.o
MAKE_LIB="\${STLIB_LD} \[$]@"
|
| ︙ | ︙ | |||
484 485 486 487 488 489 490 |
STLIB_LD="lib -nologo"
LINKBIN="link -link50compat"
fi
SHLIB_LD="${LINKBIN} -dll -nologo -incremental:no"
SHLIB_LD_LIBS="user32.lib advapi32.lib"
LIBS="user32.lib advapi32.lib"
| | | 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 |
STLIB_LD="lib -nologo"
LINKBIN="link -link50compat"
fi
SHLIB_LD="${LINKBIN} -dll -nologo -incremental:no"
SHLIB_LD_LIBS="user32.lib advapi32.lib"
LIBS="user32.lib advapi32.lib"
LIBS_GUI="gdi32.lib comdlg32.lib imm32.lib comctl32.lib"
RC_OUT=-fo
RC_TYPE=-r
RC_INCLUDE=-i
RC_DEFINE=-d
RES=res
MAKE_LIB="\${STLIB_LD} -out:\[$]@"
POST_MAKE_LIB=
|
| ︙ | ︙ | |||
509 510 511 512 513 514 515 516 517 518 519 520 521 522 |
CC_EXENAME="-Fe\"\$(shell \$(CYGPATH) '\[$]@')\""
# Specify linker flags depending on the type of app being
# built -- Console vs. Window.
LDFLAGS_CONSOLE="-link -subsystem:console ${lflags}"
LDFLAGS_WINDOW="-link -subsystem:windows ${lflags}"
fi
])
#------------------------------------------------------------------------
# SC_WITH_TCL --
#
# Location of the Tcl build directory.
#
| > > > > > > | 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 |
CC_EXENAME="-Fe\"\$(shell \$(CYGPATH) '\[$]@')\""
# Specify linker flags depending on the type of app being
# built -- Console vs. Window.
LDFLAGS_CONSOLE="-link -subsystem:console ${lflags}"
LDFLAGS_WINDOW="-link -subsystem:windows ${lflags}"
fi
# DL_LIBS is empty, but then we match the Unix version
AC_SUBST(DL_LIBS)
AC_SUBST(CFLAGS_DEBUG)
AC_SUBST(CFLAGS_OPTIMIZE)
AC_SUBST(CFLAGS_WARNING)
])
#------------------------------------------------------------------------
# SC_WITH_TCL --
#
# Location of the Tcl build directory.
#
|
| ︙ | ︙ |
Changes to win/tclConfig.sh.in.
1 2 3 4 5 6 7 8 9 10 11 | # tclConfig.sh -- # # This shell script (for sh) is generated automatically by Tcl's # configure script. It will create shell variables for most of # the configuration options discovered by the configure script. # This script is intended to be included by the configure scripts # for Tcl extensions so that they don't have to figure this all # out for themselves. # # The information in this file is specific to a single platform. # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # tclConfig.sh -- # # This shell script (for sh) is generated automatically by Tcl's # configure script. It will create shell variables for most of # the configuration options discovered by the configure script. # This script is intended to be included by the configure scripts # for Tcl extensions so that they don't have to figure this all # out for themselves. # # The information in this file is specific to a single platform. # # RCS: @(#) $Id: tclConfig.sh.in,v 1.7.12.1 2002/02/05 02:22:05 wolfsuit Exp $ TCL_DLL_FILE="@TCL_DLL_FILE@" # Tcl's version number. TCL_VERSION='@TCL_VERSION@' TCL_MAJOR_VERSION='@TCL_MAJOR_VERSION@' TCL_MINOR_VERSION='@TCL_MINOR_VERSION@' |
| ︙ | ︙ | |||
113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
# String to pass to linker to pick up the Tcl library from its
# build directory.
TCL_BUILD_LIB_SPEC='@TCL_BUILD_LIB_SPEC@'
# String to pass to linker to pick up the Tcl library from its
# installed directory.
TCL_LIB_SPEC='@TCL_LIB_SPEC@'
# Indicates whether a version numbers should be used in -l switches
# ("ok" means it's safe to use switches like -ltcl7.5; "nodots" means
# use switches like -ltcl75). SunOS and FreeBSD require "nodots", for
# example.
TCL_LIB_VERSIONS_OK='@TCL_LIB_VERSIONS_OK@'
| > > > > | 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
# String to pass to linker to pick up the Tcl library from its
# build directory.
TCL_BUILD_LIB_SPEC='@TCL_BUILD_LIB_SPEC@'
# String to pass to linker to pick up the Tcl library from its
# installed directory.
TCL_LIB_SPEC='@TCL_LIB_SPEC@'
# String to pass to the compiler so that an extension can
# find installed Tcl headers.
TCL_INCLUDE_SPEC='@TCL_INCLUDE_SPEC@'
# Indicates whether a version numbers should be used in -l switches
# ("ok" means it's safe to use switches like -ltcl7.5; "nodots" means
# use switches like -ltcl75). SunOS and FreeBSD require "nodots", for
# example.
TCL_LIB_VERSIONS_OK='@TCL_LIB_VERSIONS_OK@'
|
| ︙ | ︙ |
Changes to win/tclWin32Dll.c.
1 2 3 4 5 6 7 8 9 10 11 | /* * tclWin32Dll.c -- * * This file contains the DLL entry point. * * Copyright (c) 1995-1996 Sun Microsystems, Inc. * Copyright (c) 1998-2000 Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | /* * tclWin32Dll.c -- * * This file contains the DLL entry point. * * Copyright (c) 1995-1996 Sun Microsystems, Inc. * Copyright (c) 1998-2000 Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclWin32Dll.c,v 1.9.18.1 2002/02/05 02:22:05 wolfsuit Exp $ */ #include "tclWinInt.h" /* * The following data structures are used when loading the thunking * library for execing child processes under Win32s. |
| ︙ | ︙ | |||
74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
(TCHAR (WINAPI *)(WCHAR *, CONST TCHAR *)) lstrcpyA,
(BOOL (WINAPI *)(CONST TCHAR *, CONST TCHAR *)) MoveFileA,
(BOOL (WINAPI *)(CONST TCHAR *)) RemoveDirectoryA,
(DWORD (WINAPI *)(CONST TCHAR *, CONST TCHAR *, CONST TCHAR *, DWORD,
WCHAR *, TCHAR **)) SearchPathA,
(BOOL (WINAPI *)(CONST TCHAR *)) SetCurrentDirectoryA,
(BOOL (WINAPI *)(CONST TCHAR *, DWORD)) SetFileAttributesA,
};
static TclWinProcs unicodeProcs = {
1,
(BOOL (WINAPI *)(CONST TCHAR *, LPDCB)) BuildCommDCBW,
(TCHAR *(WINAPI *)(TCHAR *)) CharLowerW,
| > | 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
(TCHAR (WINAPI *)(WCHAR *, CONST TCHAR *)) lstrcpyA,
(BOOL (WINAPI *)(CONST TCHAR *, CONST TCHAR *)) MoveFileA,
(BOOL (WINAPI *)(CONST TCHAR *)) RemoveDirectoryA,
(DWORD (WINAPI *)(CONST TCHAR *, CONST TCHAR *, CONST TCHAR *, DWORD,
WCHAR *, TCHAR **)) SearchPathA,
(BOOL (WINAPI *)(CONST TCHAR *)) SetCurrentDirectoryA,
(BOOL (WINAPI *)(CONST TCHAR *, DWORD)) SetFileAttributesA,
NULL,
};
static TclWinProcs unicodeProcs = {
1,
(BOOL (WINAPI *)(CONST TCHAR *, LPDCB)) BuildCommDCBW,
(TCHAR *(WINAPI *)(TCHAR *)) CharLowerW,
|
| ︙ | ︙ | |||
111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
(TCHAR (WINAPI *)(WCHAR *, CONST TCHAR *)) lstrcpyW,
(BOOL (WINAPI *)(CONST TCHAR *, CONST TCHAR *)) MoveFileW,
(BOOL (WINAPI *)(CONST TCHAR *)) RemoveDirectoryW,
(DWORD (WINAPI *)(CONST TCHAR *, CONST TCHAR *, CONST TCHAR *, DWORD,
WCHAR *, TCHAR **)) SearchPathW,
(BOOL (WINAPI *)(CONST TCHAR *)) SetCurrentDirectoryW,
(BOOL (WINAPI *)(CONST TCHAR *, DWORD)) SetFileAttributesW,
};
TclWinProcs *tclWinProcs;
static Tcl_Encoding tclWinTCharEncoding;
/*
* The following declaration is for the VC++ DLL entry point.
| > | 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
(TCHAR (WINAPI *)(WCHAR *, CONST TCHAR *)) lstrcpyW,
(BOOL (WINAPI *)(CONST TCHAR *, CONST TCHAR *)) MoveFileW,
(BOOL (WINAPI *)(CONST TCHAR *)) RemoveDirectoryW,
(DWORD (WINAPI *)(CONST TCHAR *, CONST TCHAR *, CONST TCHAR *, DWORD,
WCHAR *, TCHAR **)) SearchPathW,
(BOOL (WINAPI *)(CONST TCHAR *)) SetCurrentDirectoryW,
(BOOL (WINAPI *)(CONST TCHAR *, DWORD)) SetFileAttributesW,
NULL,
};
TclWinProcs *tclWinProcs;
static Tcl_Encoding tclWinTCharEncoding;
/*
* The following declaration is for the VC++ DLL entry point.
|
| ︙ | ︙ | |||
382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 |
*
* TclWinSetInterfaces --
*
* A helper proc that allows the test library to change the
* tclWinProcs structure to dispatch to either the wide-character
* or multi-byte versions of the operating system calls, depending
* on whether Unicode is the system encoding.
*
* Results:
* None.
*
* Side effects:
* None.
*
*---------------------------------------------------------------------------
*/
void
TclWinSetInterfaces(
int wide) /* Non-zero to use wide interfaces, 0
* otherwise. */
{
Tcl_FreeEncoding(tclWinTCharEncoding);
if (wide) {
tclWinProcs = &unicodeProcs;
tclWinTCharEncoding = Tcl_GetEncoding(NULL, "unicode");
} else {
tclWinProcs = &asciiProcs;
tclWinTCharEncoding = NULL;
}
}
/*
*---------------------------------------------------------------------------
*
* Tcl_WinUtfToTChar, Tcl_WinTCharToUtf --
| > > > > > > > > > > > > > > > > > > > > > > | 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 |
*
* TclWinSetInterfaces --
*
* A helper proc that allows the test library to change the
* tclWinProcs structure to dispatch to either the wide-character
* or multi-byte versions of the operating system calls, depending
* on whether Unicode is the system encoding.
*
* As well as this, we can also try to load in some additional
* procs which may/may not be present depending on the current
* Windows version (e.g. Win95 will not have the procs below).
*
* Results:
* None.
*
* Side effects:
* None.
*
*---------------------------------------------------------------------------
*/
void
TclWinSetInterfaces(
int wide) /* Non-zero to use wide interfaces, 0
* otherwise. */
{
Tcl_FreeEncoding(tclWinTCharEncoding);
if (wide) {
tclWinProcs = &unicodeProcs;
tclWinTCharEncoding = Tcl_GetEncoding(NULL, "unicode");
if (tclWinProcs->getFileAttributesExProc == NULL) {
HINSTANCE hInstance = LoadLibraryA("kernel32");
if (hInstance != NULL) {
tclWinProcs->getFileAttributesExProc =
(BOOL (WINAPI *)(CONST TCHAR *, GET_FILEEX_INFO_LEVELS,
LPVOID)) GetProcAddress(hInstance, "GetFileAttributesExW");
FreeLibrary(hInstance);
}
}
} else {
tclWinProcs = &asciiProcs;
tclWinTCharEncoding = NULL;
if (tclWinProcs->getFileAttributesExProc == NULL) {
HINSTANCE hInstance = LoadLibraryA("kernel32");
if (hInstance != NULL) {
tclWinProcs->getFileAttributesExProc =
(BOOL (WINAPI *)(CONST TCHAR *, GET_FILEEX_INFO_LEVELS,
LPVOID)) GetProcAddress(hInstance, "GetFileAttributesExA");
FreeLibrary(hInstance);
}
}
}
}
/*
*---------------------------------------------------------------------------
*
* Tcl_WinUtfToTChar, Tcl_WinTCharToUtf --
|
| ︙ | ︙ | |||
462 463 464 465 466 467 468 | * * Side effects: * None. * *--------------------------------------------------------------------------- */ | | | | 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 |
*
* Side effects:
* None.
*
*---------------------------------------------------------------------------
*/
CONST TCHAR *
Tcl_WinUtfToTChar(string, len, dsPtr)
CONST char *string; /* Source string in UTF-8. */
int len; /* Source string length in bytes, or < 0 for
* strlen(). */
Tcl_DString *dsPtr; /* Uninitialized or free DString in which
* the converted string is stored. */
{
return (TCHAR *) Tcl_UtfToExternalDString(tclWinTCharEncoding,
string, len, dsPtr);
}
CONST char *
Tcl_WinTCharToUtf(string, len, dsPtr)
CONST TCHAR *string; /* Source string in Unicode when running
* NT, ANSI when running 95. */
int len; /* Source string length in bytes, or < 0 for
* platform-specific string length. */
Tcl_DString *dsPtr; /* Uninitialized or free DString in which
* the converted string is stored. */
{
return Tcl_ExternalToUtfDString(tclWinTCharEncoding,
(CONST char *) string, len, dsPtr);
}
|
Changes to win/tclWinChan.c.
1 2 3 4 5 6 7 8 9 10 11 | /* * tclWinChan.c * * Channel drivers for Windows channels based on files, command * pipes and TCP sockets. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | /* * tclWinChan.c * * Channel drivers for Windows channels based on files, command * pipes and TCP sockets. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclWinChan.c,v 1.15.8.1 2002/02/05 02:22:05 wolfsuit Exp $ */ #include "tclWinInt.h" /* * State flags used in the info structures below. */ |
| ︙ | ︙ | |||
84 85 86 87 88 89 90 | int flags)); static int FileGetHandleProc _ANSI_ARGS_((ClientData instanceData, int direction, ClientData *handlePtr)); static ThreadSpecificData *FileInit _ANSI_ARGS_((void)); static int FileInputProc _ANSI_ARGS_((ClientData instanceData, char *buf, int toRead, int *errorCode)); static int FileOutputProc _ANSI_ARGS_((ClientData instanceData, | | | 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | int flags)); static int FileGetHandleProc _ANSI_ARGS_((ClientData instanceData, int direction, ClientData *handlePtr)); static ThreadSpecificData *FileInit _ANSI_ARGS_((void)); static int FileInputProc _ANSI_ARGS_((ClientData instanceData, char *buf, int toRead, int *errorCode)); static int FileOutputProc _ANSI_ARGS_((ClientData instanceData, CONST char *buf, int toWrite, int *errorCode)); static int FileSeekProc _ANSI_ARGS_((ClientData instanceData, long offset, int mode, int *errorCode)); static void FileSetupProc _ANSI_ARGS_((ClientData clientData, int flags)); static void FileWatchProc _ANSI_ARGS_((ClientData instanceData, int mask)); |
| ︙ | ︙ | |||
531 532 533 534 535 536 537 |
*
*----------------------------------------------------------------------
*/
static int
FileOutputProc(instanceData, buf, toWrite, errorCode)
ClientData instanceData; /* File state. */
| | | 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 |
*
*----------------------------------------------------------------------
*/
static int
FileOutputProc(instanceData, buf, toWrite, errorCode)
ClientData instanceData; /* File state. */
CONST char *buf; /* The data buffer. */
int toWrite; /* How many bytes to write? */
int *errorCode; /* Where to store error code. */
{
FileInfo *infoPtr = (FileInfo *) instanceData;
DWORD bytesWritten;
*errorCode = 0;
|
| ︙ | ︙ | |||
655 656 657 658 659 660 661 |
*/
Tcl_Channel
TclpOpenFileChannel(interp, pathPtr, modeString, permissions)
Tcl_Interp *interp; /* Interpreter for error reporting;
* can be NULL. */
Tcl_Obj *pathPtr; /* Name of file to open. */
| | | | 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 |
*/
Tcl_Channel
TclpOpenFileChannel(interp, pathPtr, modeString, permissions)
Tcl_Interp *interp; /* Interpreter for error reporting;
* can be NULL. */
Tcl_Obj *pathPtr; /* Name of file to open. */
CONST char *modeString; /* A list of POSIX open modes or
* a string such as "rw". */
int permissions; /* If the open involves creating a
* file, with what modes to create
* it? */
{
Tcl_Channel channel = 0;
int seekFlag, mode, channelPermissions;
DWORD accessMode, createMode, shareMode, flags, consoleParams, type;
CONST TCHAR *nativeName;
DCB dcb;
HANDLE handle;
char channelName[16 + TCL_INTEGER_SPACE];
TclFile readFile = NULL;
TclFile writeFile = NULL;
mode = TclGetOpenMode(interp, modeString, &seekFlag);
|
| ︙ | ︙ | |||
793 794 795 796 797 798 799 800 801 802 803 804 805 806 |
}
}
channel = NULL;
switch (type) {
case FILE_TYPE_SERIAL:
channel = TclWinOpenSerialChannel(handle, channelName,
channelPermissions);
break;
case FILE_TYPE_CONSOLE:
channel = TclWinOpenConsoleChannel(handle, channelName,
channelPermissions);
break;
| > > > > > > > > > > > > > > | 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 |
}
}
channel = NULL;
switch (type) {
case FILE_TYPE_SERIAL:
/*
* Reopen channel for OVERLAPPED operation
* Normally this shouldn't fail, because the channel exists
*/
handle = TclWinSerialReopen(handle, nativeName, accessMode);
if (handle == INVALID_HANDLE_VALUE) {
TclWinConvertError(GetLastError());
if (interp != (Tcl_Interp *) NULL) {
Tcl_AppendResult(interp, "couldn't reopen serial \"",
Tcl_GetString(pathPtr), "\": ",
Tcl_PosixError(interp), (char *) NULL);
}
return NULL;
}
channel = TclWinOpenSerialChannel(handle, channelName,
channelPermissions);
break;
case FILE_TYPE_CONSOLE:
channel = TclWinOpenConsoleChannel(handle, channelName,
channelPermissions);
break;
|
| ︙ | ︙ |
Changes to win/tclWinConsole.c.
1 2 3 4 5 6 7 8 9 10 11 | /* * tclWinConsole.c -- * * This file implements the Windows-specific console functions, * and the "console" channel driver. * * Copyright (c) 1999 by Scriptics Corp. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | /* * tclWinConsole.c -- * * This file implements the Windows-specific console functions, * and the "console" channel driver. * * Copyright (c) 1999 by Scriptics Corp. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclWinConsole.c,v 1.6.8.1 2002/02/05 02:22:05 wolfsuit Exp $ */ #include "tclWinInt.h" #include <fcntl.h> #include <io.h> #include <sys/stat.h> |
| ︙ | ︙ | |||
141 142 143 144 145 146 147 | static int ConsoleEventProc(Tcl_Event *evPtr, int flags); static void ConsoleExitHandler(ClientData clientData); static int ConsoleGetHandleProc(ClientData instanceData, int direction, ClientData *handlePtr); static ThreadSpecificData *ConsoleInit(void); static int ConsoleInputProc(ClientData instanceData, char *buf, int toRead, int *errorCode); | | | | 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 | static int ConsoleEventProc(Tcl_Event *evPtr, int flags); static void ConsoleExitHandler(ClientData clientData); static int ConsoleGetHandleProc(ClientData instanceData, int direction, ClientData *handlePtr); static ThreadSpecificData *ConsoleInit(void); static int ConsoleInputProc(ClientData instanceData, char *buf, int toRead, int *errorCode); static int ConsoleOutputProc(ClientData instanceData, CONST char *buf, int toWrite, int *errorCode); static DWORD WINAPI ConsoleReaderThread(LPVOID arg); static void ConsoleSetupProc(ClientData clientData, int flags); static void ConsoleWatchProc(ClientData instanceData, int mask); static DWORD WINAPI ConsoleWriterThread(LPVOID arg); static void ProcExitHandler(ClientData clientData); static int WaitForRead(ConsoleInfo *infoPtr, int blocking); |
| ︙ | ︙ | |||
676 677 678 679 680 681 682 |
*
*----------------------------------------------------------------------
*/
static int
ConsoleOutputProc(
ClientData instanceData, /* Console state. */
| | | 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 |
*
*----------------------------------------------------------------------
*/
static int
ConsoleOutputProc(
ClientData instanceData, /* Console state. */
CONST char *buf, /* The data buffer. */
int toWrite, /* How many bytes to write? */
int *errorCode) /* Where to store error code. */
{
ConsoleInfo *infoPtr = (ConsoleInfo *) instanceData;
DWORD bytesWritten, timeout;
*errorCode = 0;
|
| ︙ | ︙ |
Changes to win/tclWinDde.c.
1 2 3 4 5 6 7 8 9 10 11 12 | /* * tclWinDde.c -- * * This file provides procedures that implement the "send" * command, allowing commands to be passed from interpreter * to interpreter. * * Copyright (c) 1997 by Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /* * tclWinDde.c -- * * This file provides procedures that implement the "send" * command, allowing commands to be passed from interpreter * to interpreter. * * Copyright (c) 1997 by Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclWinDde.c,v 1.7.8.1 2002/02/05 02:22:05 wolfsuit Exp $ */ #include "tclPort.h" #include <ddeml.h> /* * TCL_STORAGE_CLASS is set unconditionally to DLLEXPORT because the |
| ︙ | ︙ | |||
830 831 832 833 834 835 836 |
DDE_EXECUTE,
DDE_POKE,
DDE_REQUEST,
DDE_SERVICES,
DDE_EVAL
};
| | | | | 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 |
DDE_EXECUTE,
DDE_POKE,
DDE_REQUEST,
DDE_SERVICES,
DDE_EVAL
};
static CONST char *ddeCommands[] = {"servername", "execute", "poke",
"request", "services", "eval",
(char *) NULL};
static CONST char *ddeOptions[] = {"-async", (char *) NULL};
static CONST char *ddeReqOptions[] = {"-binary", (char *) NULL};
int index, argIndex;
int async = 0, binary = 0;
int result = TCL_OK;
HSZ ddeService = NULL;
HSZ ddeTopic = NULL;
HSZ ddeItem = NULL;
HDDEDATA ddeData = NULL;
|
| ︙ | ︙ |
Changes to win/tclWinFCmd.c.
1 2 3 4 5 6 7 8 9 10 11 | /* * tclWinFCmd.c * * This file implements the Windows specific portion of file manipulation * subcommands of the "file" command. * * Copyright (c) 1996-1998 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | /* * tclWinFCmd.c * * This file implements the Windows specific portion of file manipulation * subcommands of the "file" command. * * Copyright (c) 1996-1998 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclWinFCmd.c,v 1.14.2.1 2002/02/05 02:22:05 wolfsuit Exp $ */ #include "tclWinInt.h" /* * The following constants specify the type of callback when * TraverseWinTree() calls the traverseProc() |
| ︙ | ︙ | |||
56 57 58 59 60 61 62 |
WIN_SYSTEM_ATTRIBUTE
};
static int attributeArray[] = {FILE_ATTRIBUTE_ARCHIVE, FILE_ATTRIBUTE_HIDDEN,
0, FILE_ATTRIBUTE_READONLY, 0, FILE_ATTRIBUTE_SYSTEM};
| | | | 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
WIN_SYSTEM_ATTRIBUTE
};
static int attributeArray[] = {FILE_ATTRIBUTE_ARCHIVE, FILE_ATTRIBUTE_HIDDEN,
0, FILE_ATTRIBUTE_READONLY, 0, FILE_ATTRIBUTE_SYSTEM};
CONST char *tclpFileAttrStrings[] = {
"-archive", "-hidden", "-longname", "-readonly",
"-shortname", "-system", (char *) NULL
};
CONST TclFileAttrProcs tclpFileAttrProcs[] = {
{GetWinFileAttributes, SetWinFileAttributes},
{GetWinFileAttributes, SetWinFileAttributes},
{GetWinFileLongName, CannotSetAttribute},
{GetWinFileAttributes, SetWinFileAttributes},
{GetWinFileShortName, CannotSetAttribute},
{GetWinFileAttributes, SetWinFileAttributes}};
|
| ︙ | ︙ | |||
443 444 445 446 447 448 449 450 451 452 453 454 455 456 |
* that point.
*/
if (nativeDst == NULL) {
Tcl_SetErrno(ENOENT);
return TCL_ERROR;
}
__try {
if ((*tclWinProcs->copyFileProc)(nativeSrc, nativeDst, 0) != FALSE) {
return TCL_OK;
}
} __except (-1) {}
TclWinConvertError(GetLastError());
| > > > > > > > > > > > > > > | 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 |
* that point.
*/
if (nativeDst == NULL) {
Tcl_SetErrno(ENOENT);
return TCL_ERROR;
}
/*
* Similarly, if 'nativeSrc' is NULL or empty, the following code
* locks up the process on WinNT; bail out.
*/
if (nativeSrc == NULL || nativeSrc[0] == '\0') {
Tcl_SetErrno(ENOENT);
return TCL_ERROR;
}
/*
* OK, now try the copy.
*/
__try {
if ((*tclWinProcs->copyFileProc)(nativeSrc, nativeDst, 0) != FALSE) {
return TCL_OK;
}
} __except (-1) {}
TclWinConvertError(GetLastError());
|
| ︙ | ︙ | |||
1285 1286 1287 1288 1289 1290 1291 |
GetWinFileAttributes(
Tcl_Interp *interp, /* The interp we are using for errors. */
int objIndex, /* The index of the attribute. */
Tcl_Obj *fileName, /* The name of the file. */
Tcl_Obj **attributePtrPtr) /* A pointer to return the object with. */
{
DWORD result;
| | | 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 |
GetWinFileAttributes(
Tcl_Interp *interp, /* The interp we are using for errors. */
int objIndex, /* The index of the attribute. */
Tcl_Obj *fileName, /* The name of the file. */
Tcl_Obj **attributePtrPtr) /* A pointer to return the object with. */
{
DWORD result;
CONST TCHAR *nativeName;
nativeName = Tcl_FSGetNativePath(fileName);
result = (*tclWinProcs->getFileAttributesProc)(nativeName);
if (result == 0xffffffff) {
StatError(interp, fileName);
return TCL_ERROR;
|
| ︙ | ︙ | |||
1565 1566 1567 1568 1569 1570 1571 |
int objIndex, /* The index of the attribute. */
Tcl_Obj *fileName, /* The name of the file. */
Tcl_Obj *attributePtr) /* The new value of the attribute. */
{
DWORD fileAttributes;
int yesNo;
int result;
| | | 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 |
int objIndex, /* The index of the attribute. */
Tcl_Obj *fileName, /* The name of the file. */
Tcl_Obj *attributePtr) /* The new value of the attribute. */
{
DWORD fileAttributes;
int yesNo;
int result;
CONST TCHAR *nativeName;
nativeName = Tcl_FSGetNativePath(fileName);
fileAttributes = (*tclWinProcs->getFileAttributesProc)(nativeName);
if (fileAttributes == 0xffffffff) {
StatError(interp, fileName);
return TCL_ERROR;
|
| ︙ | ︙ | |||
1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 |
Tcl_ListObjAppendElement(NULL, resultPtr, elemPtr);
}
}
Tcl_IncrRefCount(resultPtr);
return resultPtr;
}
/*
*---------------------------------------------------------------------------
*
* TclpObjNormalizePath --
*
* This function scans through a path specification and replaces
| > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 |
Tcl_ListObjAppendElement(NULL, resultPtr, elemPtr);
}
}
Tcl_IncrRefCount(resultPtr);
return resultPtr;
}
/*
* This function could be thoroughly tested and then substituted in
* below to speed up file normalization on Windows NT/2000/XP
*/
#if 0
void WinGetLongPathName(CONST TCHAR* origPath, Tcl_DString *dsPtr);
#define IsDirSep(a) (a == '/' || a == '\\')
void WinGetLongPathName(CONST TCHAR* pszOriginal, Tcl_DString *dsPtr) {
TCHAR szResult[_MAX_PATH * 2 + 1];
TCHAR* pchResult = szResult;
const TCHAR* pchScan = pszOriginal;
WIN32_FIND_DATA wfd;
/* Do Drive Letter check... */
if (pchScan[0] && pchScan[1] == ':') {
/* Copy drive letter and colon, ensuring drive is upper case. */
char drive = *pchScan++;
*pchResult++ = (drive < 97 ? drive : drive - 32);
*pchResult++ = *pchScan++;
} else if (IsDirSep(pchScan[0]) && IsDirSep(pchScan[1])) {
/* Copy \\ and machine name. */
*pchResult++ = *pchScan++;
*pchResult++ = *pchScan++;
while (*pchScan && !IsDirSep(*pchScan)) {
*pchResult++ = *pchScan++;
}
/*
* Note that the code below will fail since FindFirstFile
* on a UNC path seems not to work on directory name searches?
*/
}
if (!IsDirSep(*pchScan)) {
while ((*pchResult++ = *pchScan++) != '\0');
} else {
/* Now loop through directories and files... */
while (IsDirSep(*pchScan)) {
char* pchReplace;
const TCHAR* pchEnd;
HANDLE hFind;
*pchResult++ = *pchScan++;
pchReplace = pchResult;
pchEnd = pchScan;
while (*pchEnd && !IsDirSep(*pchEnd)) {
*pchResult++ = *pchEnd++;
}
*pchResult = '\0';
/* Now run this through FindFirstFile... */
hFind = FindFirstFileA(szResult, &wfd);
if (hFind != INVALID_HANDLE_VALUE) {
FindClose(hFind);
strcpy(pchReplace, wfd.cFileName);
pchResult = pchReplace + strlen(pchReplace);
} else {
/* Copy rest of input path & end. */
strcat(pchResult, pchEnd);
break;
}
pchScan = pchEnd;
}
}
/* Copy it over */
Tcl_ExternalToUtfDString(NULL, szResult, -1, dsPtr);
}
#endif
/*
*---------------------------------------------------------------------------
*
* TclpObjNormalizePath --
*
* This function scans through a path specification and replaces
|
| ︙ | ︙ | |||
1719 1720 1721 1722 1723 1724 1725 |
int
TclpObjNormalizePath(interp, pathPtr, nextCheckpoint)
Tcl_Interp *interp;
Tcl_Obj *pathPtr;
int nextCheckpoint;
{
| < > > > | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | | < < < | | | < | < | > | | > > | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | > > | 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 |
int
TclpObjNormalizePath(interp, pathPtr, nextCheckpoint)
Tcl_Interp *interp;
Tcl_Obj *pathPtr;
int nextCheckpoint;
{
char *lastValidPathEnd = NULL;
Tcl_DString ds;
int pathLen;
char *path = Tcl_GetStringFromObj(pathPtr, &pathLen);
if (TclWinGetPlatformId() == VER_PLATFORM_WIN32_WINDOWS) {
Tcl_DString eDs;
char *nativePath;
int nativeLen;
Tcl_UtfToExternalDString(NULL, path, -1, &ds);
nativePath = Tcl_DStringValue(&ds);
nativeLen = Tcl_DStringLength(&ds);
/* We're on Windows 95/98 */
lastValidPathEnd = nativePath + Tcl_DStringLength(&ds);
while (1) {
DWORD res = GetShortPathNameA(nativePath, nativePath, 1+nativeLen);
if (res != 0) {
/* We found an ok path */
break;
}
/* Undo the null-termination we put in before */
if (lastValidPathEnd != (nativePath + nativeLen)) {
*lastValidPathEnd = '/';
}
/*
* The path doesn't exist. Back up the path, one component
* (directory/file) at a time, until one does exist.
*/
while (1) {
char cur;
lastValidPathEnd--;
if (lastValidPathEnd == nativePath) {
/* We didn't accept any of the path */
Tcl_DStringFree(&ds);
return nextCheckpoint;
}
cur = *(lastValidPathEnd);
if (cur == '/' || cur == '\\') {
/* Reached directory separator */
break;
}
}
/* Temporarily terminate the string */
*lastValidPathEnd = '\0';
}
/*
* If we get here, we found a valid path, which we've converted to
* short form, and the valid string ends at or before 'lastValidPathEnd'
* and the invalid string starts at 'lastValidPathEnd'.
*/
/* Copy over the valid part of the path and find its length */
Tcl_ExternalToUtfDString(NULL, nativePath, -1, &eDs);
path = Tcl_DStringValue(&eDs);
if (path[1] == ':') {
if (path[0] >= 'a' && path[0] <= 'z') {
/* Make uppercase */
path[0] -= 32;
}
}
nextCheckpoint = Tcl_DStringLength(&eDs);
Tcl_SetStringObj(pathPtr, path, Tcl_DStringLength(&eDs));
Tcl_DStringFree(&eDs);
if (lastValidPathEnd != (nativePath + nativeLen)) {
CONST char *tmp;
*lastValidPathEnd = '/';
/* Now copy over the invalid (i.e. non-existent) part of the path */
tmp = Tcl_ExternalToUtfDString(NULL, lastValidPathEnd, -1, &eDs);
Tcl_AppendToObj(pathPtr, tmp, Tcl_DStringLength(&eDs));
Tcl_DStringFree(&eDs);
}
Tcl_DStringFree(&ds);
} else {
/* We're on WinNT or 2000 or XP */
CONST char *nativePath;
#if 0
/*
* We don't use this simpler version, because the speed
* increase does not seem significant at present and the version
* below is thoroughly debugged.
*/
int nativeLen;
Tcl_DString eDs;
nativePath = Tcl_UtfToExternalDString(NULL, path, -1, &ds);
nativeLen = Tcl_DStringLength(&ds);
WinGetLongPathName(nativePath, &eDs);
/*
* We need to add code here to calculate the new value of
* 'nextCheckpoint' -- i.e. the longest part of the path
* which is an existing file.
*/
Tcl_SetStringObj(pathPtr, Tcl_DStringValue(&eDs), Tcl_DStringLength(&eDs));
Tcl_DStringFree(&eDs);
Tcl_DStringFree(&ds);
#else
char *currentPathEndPosition;
WIN32_FILE_ATTRIBUTE_DATA data;
nativePath = Tcl_WinUtfToTChar(path, -1, &ds);
if ((*tclWinProcs->getFileAttributesExProc)(nativePath,
GetFileExInfoStandard,
&data) == TRUE) {
currentPathEndPosition = path + pathLen;
nextCheckpoint = pathLen;
lastValidPathEnd = currentPathEndPosition;
Tcl_DStringFree(&ds);
} else {
Tcl_DStringFree(&ds);
currentPathEndPosition = path + nextCheckpoint;
while (1) {
char cur = *currentPathEndPosition;
if ((cur == '/' || cur == 0) && (path != currentPathEndPosition)) {
/* Reached directory separator, or end of string */
nativePath = Tcl_WinUtfToTChar(path, currentPathEndPosition - path,
&ds);
if ((*tclWinProcs->getFileAttributesExProc)(nativePath,
GetFileExInfoStandard, &data) != TRUE) {
/* File doesn't exist */
Tcl_DStringFree(&ds);
break;
}
Tcl_DStringFree(&ds);
lastValidPathEnd = currentPathEndPosition;
/* File does exist */
if (cur == 0) {
break;
}
}
currentPathEndPosition++;
}
nextCheckpoint = currentPathEndPosition - path;
}
if (lastValidPathEnd != NULL) {
Tcl_Obj *tmpPathPtr;
/*
* The leading end of the path description was acceptable to
* us. We therefore convert it to its long form, and return
* that.
*/
Tcl_Obj* objPtr = NULL;
int endOfString;
int useLength = lastValidPathEnd - path;
if (*lastValidPathEnd == 0) {
tmpPathPtr = Tcl_NewStringObj(path, useLength);
endOfString = 1;
} else {
tmpPathPtr = Tcl_NewStringObj(path, useLength + 1);
endOfString = 0;
}
/*
* If this returns an error, we have a strange situation; the
* file exists, but we can't get its long name. We will have
* to assume the name we have is ok.
*/
Tcl_IncrRefCount(tmpPathPtr);
if (ConvertFileNameFormat(interp, 0, tmpPathPtr, 1, &objPtr) == TCL_OK) {
int len;
(void) Tcl_GetStringFromObj(objPtr,&len);
if (!endOfString) {
/* Be nice and fix the string before we clear it */
Tcl_AppendToObj(objPtr, lastValidPathEnd, -1);
}
nextCheckpoint += (len - useLength);
path = Tcl_GetStringFromObj(objPtr,&len);
Tcl_SetStringObj(pathPtr,path, len);
Tcl_DecrRefCount(objPtr);
}
Tcl_DecrRefCount(tmpPathPtr);
}
#endif
}
return nextCheckpoint;
}
|
Changes to win/tclWinFile.c.
1 2 3 4 5 6 7 8 9 10 11 12 13 | /* * tclWinFile.c -- * * This file contains temporary wrappers around UNIX file handling * functions. These wrappers map the UNIX functions to Win32 HANDLE-style * files, which can be manipulated through the Win32 console redirection * interfaces. * * Copyright (c) 1995-1998 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | | | | 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 34 35 36 37 38 39 40 41 42 | /* * tclWinFile.c -- * * This file contains temporary wrappers around UNIX file handling * functions. These wrappers map the UNIX functions to Win32 HANDLE-style * files, which can be manipulated through the Win32 console redirection * interfaces. * * Copyright (c) 1995-1998 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclWinFile.c,v 1.17.2.1 2002/02/05 02:22:05 wolfsuit Exp $ */ #include "tclWinInt.h" #include <sys/stat.h> #include <shlobj.h> #include <lmaccess.h> /* For TclpGetUserHome(). */ static time_t ToCTime(FILETIME fileTime); typedef NET_API_STATUS NET_API_FUNCTION NETUSERGETINFOPROC (LPWSTR servername, LPWSTR username, DWORD level, LPBYTE *bufptr); typedef NET_API_STATUS NET_API_FUNCTION NETAPIBUFFERFREEPROC (LPVOID Buffer); typedef NET_API_STATUS NET_API_FUNCTION NETGETDCNAMEPROC (LPWSTR servername, LPWSTR domainname, LPBYTE *bufptr); static int NativeAccess(CONST TCHAR *path, int mode); static int NativeStat(CONST TCHAR *path, struct stat *statPtr); static int NativeIsExec(CONST TCHAR *path); /* *--------------------------------------------------------------------------- * * TclpFindExecutable -- * |
| ︙ | ︙ | |||
76 77 78 79 80 81 82 |
/*
* Under Windows we ignore argv0, and return the path for the file used to
* create this process.
*/
(*tclWinProcs->getModuleFileNameProc)(NULL, wName, MAX_PATH);
| | | 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
/*
* Under Windows we ignore argv0, and return the path for the file used to
* create this process.
*/
(*tclWinProcs->getModuleFileNameProc)(NULL, wName, MAX_PATH);
Tcl_WinTCharToUtf((CONST TCHAR *) wName, -1, &ds);
tclNativeExecutableName = ckalloc((unsigned) (Tcl_DStringLength(&ds) + 1));
strcpy(tclNativeExecutableName, Tcl_DStringValue(&ds));
Tcl_DStringFree(&ds);
TclWinNoBackslash(tclNativeExecutableName);
return tclNativeExecutableName;
|
| ︙ | ︙ | |||
110 111 112 113 114 115 116 |
*---------------------------------------------------------------------- */
int
TclpMatchInDirectory(interp, resultPtr, pathPtr, pattern, types)
Tcl_Interp *interp; /* Interpreter to receive errors. */
Tcl_Obj *resultPtr; /* List object to lappend results. */
Tcl_Obj *pathPtr; /* Contains path to directory to search. */
| | | | 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 |
*---------------------------------------------------------------------- */
int
TclpMatchInDirectory(interp, resultPtr, pathPtr, pattern, types)
Tcl_Interp *interp; /* Interpreter to receive errors. */
Tcl_Obj *resultPtr; /* List object to lappend results. */
Tcl_Obj *pathPtr; /* Contains path to directory to search. */
CONST char *pattern; /* Pattern to match against. */
Tcl_GlobTypeData *types; /* Object containing list of acceptable types.
* May be NULL. In particular the directory
* flag is very important. */
{
char drivePat[] = "?:\\";
const char *message;
CONST char *dir;
char *root;
int dirLength;
Tcl_DString dirString;
DWORD attr, volFlags;
HANDLE handle;
WIN32_FIND_DATAT data;
BOOL found;
Tcl_DString ds;
Tcl_DString dsOrig;
Tcl_Obj *fileNamePtr;
CONST TCHAR *nativeName;
int matchSpecialDots;
/*
* Convert the path to normalized form since some interfaces only
* accept backslashes. Also, ensure that the directory ends with a
* separator character.
*/
|
| ︙ | ︙ | |||
265 266 267 268 269 270 271 |
/*
* Now iterate over all of the files in the directory.
*/
for (found = 1; found != 0;
found = (*tclWinProcs->findNextFileProc)(handle, &data)) {
| | | | | | 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 |
/*
* Now iterate over all of the files in the directory.
*/
for (found = 1; found != 0;
found = (*tclWinProcs->findNextFileProc)(handle, &data)) {
CONST TCHAR *nativeMatchResult;
CONST char *name, *fname;
int typeOk = 1;
if (tclWinProcs->useWide) {
nativeName = (CONST TCHAR *) data.w.cFileName;
} else {
nativeName = (CONST TCHAR *) data.a.cFileName;
}
name = Tcl_WinTCharToUtf(nativeName, -1, &ds);
if (!matchSpecialDots) {
/* If it is exactly '.' or '..' then we ignore it */
if (name[0] == '.') {
if (name[1] == '\0' || (name[1] == '.' && name[2] == '\0')) {
|
| ︙ | ︙ | |||
335 336 337 338 339 340 341 |
attr = (*tclWinProcs->getFileAttributesProc)(nativeName);
if (types == NULL) {
/* If invisible, don't return the file */
if (attr & FILE_ATTRIBUTE_HIDDEN) {
typeOk = 0;
}
} else {
| < < | 335 336 337 338 339 340 341 342 343 344 345 346 347 348 |
attr = (*tclWinProcs->getFileAttributesProc)(nativeName);
if (types == NULL) {
/* If invisible, don't return the file */
if (attr & FILE_ATTRIBUTE_HIDDEN) {
typeOk = 0;
}
} else {
if (attr & FILE_ATTRIBUTE_HIDDEN) {
/* If invisible */
if ((types->perm == 0) ||
!(types->perm & TCL_GLOB_PERM_HIDDEN)) {
typeOk = 0;
}
} else {
|
| ︙ | ︙ | |||
365 366 367 368 369 370 371 |
((types->perm & TCL_GLOB_PERM_X) &&
(NativeAccess(nativeName, X_OK) != 0))
) {
typeOk = 0;
}
}
if (typeOk && types->type != 0) {
| | | | > | > > > > | < | 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 |
((types->perm & TCL_GLOB_PERM_X) &&
(NativeAccess(nativeName, X_OK) != 0))
) {
typeOk = 0;
}
}
if (typeOk && types->type != 0) {
struct stat buf;
if (NativeStat(nativeName, &buf) != 0) {
/*
* Posix error occurred, either the file
* has disappeared, or there is some other
* strange error. In any case we don't
* return this file.
*/
typeOk = 0;
}
if (typeOk) {
/*
* In order bcdpfls as in 'find -t'
*/
if (
((types->type & TCL_GLOB_TYPE_BLOCK) &&
|
| ︙ | ︙ | |||
493 494 495 496 497 498 499 |
GetProcAddress(netapiInst, "NetUserGetInfo");
if ((netUserGetInfoProc != NULL) && (netGetDCNameProc != NULL)
&& (netApiBufferFreeProc != NULL)) {
USER_INFO_1 *uiPtr;
Tcl_DString ds;
int nameLen, badDomain;
char *domain;
| | | | > | | > | 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 |
GetProcAddress(netapiInst, "NetUserGetInfo");
if ((netUserGetInfoProc != NULL) && (netGetDCNameProc != NULL)
&& (netApiBufferFreeProc != NULL)) {
USER_INFO_1 *uiPtr;
Tcl_DString ds;
int nameLen, badDomain;
char *domain;
WCHAR *wHomeDir, *wDomain;
WCHAR buf[MAX_PATH];
badDomain = 0;
nameLen = -1;
wDomain = NULL;
domain = strchr(name, '@');
if (domain != NULL) {
Tcl_DStringInit(&ds);
Tcl_UtfToUniCharDString(domain + 1, -1, &ds);
badDomain = (*netGetDCNameProc)(NULL,
(LPWSTR) Tcl_DStringValue(&ds),
(LPBYTE *) &wDomain);
Tcl_DStringFree(&ds);
nameLen = domain - name;
}
if (badDomain == 0) {
Tcl_DStringInit(&ds);
Tcl_UtfToUniCharDString(name, nameLen, &ds);
if ((*netUserGetInfoProc)(wDomain,
(LPWSTR) Tcl_DStringValue(&ds), 1,
(LPBYTE *) &uiPtr) == 0) {
wHomeDir = uiPtr->usri1_home_dir;
if ((wHomeDir != NULL) && (wHomeDir[0] != L'\0')) {
Tcl_UniCharToUtfDString(wHomeDir, lstrlenW(wHomeDir),
bufferPtr);
} else {
/*
|
| ︙ | ︙ | |||
588 589 590 591 592 593 594 | * See access documentation. * *--------------------------------------------------------------------------- */ static int NativeAccess( | | | 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 |
* See access documentation.
*
*---------------------------------------------------------------------------
*/
static int
NativeAccess(
CONST TCHAR *nativePath, /* Path of file to access (UTF-8). */
int mode) /* Permission setting. */
{
DWORD attr;
attr = (*tclWinProcs->getFileAttributesProc)(nativePath);
if (attr == 0xffffffff) {
|
| ︙ | ︙ | |||
633 634 635 636 637 638 639 |
}
return 0;
}
static int
NativeIsExec(nativePath)
| | | < | 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 |
}
return 0;
}
static int
NativeIsExec(nativePath)
CONST TCHAR *nativePath;
{
CONST char *p, *path;
Tcl_DString ds;
/*
* This is really not efficient. We should be able to examine
* the native path directly without converting to UTF.
*/
Tcl_DStringInit(&ds);
|
| ︙ | ︙ | |||
689 690 691 692 693 694 695 |
*/
int
TclpObjChdir(pathPtr)
Tcl_Obj *pathPtr; /* Path to new working directory. */
{
int result;
| | | | 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 |
*/
int
TclpObjChdir(pathPtr)
Tcl_Obj *pathPtr; /* Path to new working directory. */
{
int result;
CONST TCHAR *nativePath;
nativePath = (CONST TCHAR *) Tcl_FSGetNativePath(pathPtr);
result = (*tclWinProcs->setCurrentDirectoryProc)(nativePath);
if (result == 0) {
TclWinConvertError(GetLastError());
return -1;
}
return 0;
|
| ︙ | ︙ | |||
767 768 769 770 771 772 773 | * * Side effects: * None. * *---------------------------------------------------------------------- */ | | | | 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 |
*
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
CONST char *
TclpGetCwd(interp, bufferPtr)
Tcl_Interp *interp; /* If non-NULL, used for error reporting. */
Tcl_DString *bufferPtr; /* Uninitialized or free DString filled
* with name of current directory. */
{
WCHAR buffer[MAX_PATH];
char *p;
if ((*tclWinProcs->getCurrentDirectoryProc)(MAX_PATH, buffer) == 0) {
TclWinConvertError(GetLastError());
if (interp != NULL) {
Tcl_AppendResult(interp,
"error getting working directory name: ",
Tcl_PosixError(interp), (char *) NULL);
}
return NULL;
}
/*
* Watch for the weird Windows c:\\UNC syntax.
*/
if (tclWinProcs->useWide) {
WCHAR *native;
native = (WCHAR *) buffer;
if ((native[0] != '\0') && (native[1] == ':')
|
| ︙ | ︙ | |||
827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 |
}
int
TclpObjStat(pathPtr, statPtr)
Tcl_Obj *pathPtr; /* Path of file to stat */
struct stat *statPtr; /* Filled with results of stat call. */
{
Tcl_Obj *transPtr;
/*
* Eliminate file names containing wildcard characters, or subsequent
* call to FindFirstFile() will expand them, matching some other file.
*/
transPtr = Tcl_FSGetTranslatedPath(NULL, pathPtr);
if (transPtr == NULL || (strpbrk(Tcl_GetString(transPtr), "?*") != NULL)) {
Tcl_SetErrno(ENOENT);
return -1;
}
| > > | | | 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 |
}
int
TclpObjStat(pathPtr, statPtr)
Tcl_Obj *pathPtr; /* Path of file to stat */
struct stat *statPtr; /* Filled with results of stat call. */
{
#ifdef OLD_API
Tcl_Obj *transPtr;
/*
* Eliminate file names containing wildcard characters, or subsequent
* call to FindFirstFile() will expand them, matching some other file.
*/
transPtr = Tcl_FSGetTranslatedPath(NULL, pathPtr);
if (transPtr == NULL || (strpbrk(Tcl_GetString(transPtr), "?*") != NULL)) {
Tcl_SetErrno(ENOENT);
return -1;
}
#endif
/*
* Ensure correct file sizes by forcing the OS to write any
* pending data to disk. This is done only for channels which are
* dirty, i.e. have been written to since the last flush here.
*/
TclWinFlushDirtyChannels ();
return NativeStat((CONST TCHAR*) Tcl_FSGetNativePath(pathPtr), statPtr);
}
/*
*----------------------------------------------------------------------
*
* NativeStat --
*
|
| ︙ | ︙ | |||
875 876 877 878 879 880 881 | * See stat documentation. * *---------------------------------------------------------------------- */ static int NativeStat(nativePath, statPtr) | | < < | > > > > > > > > | | | | | | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > < < < < | < < < < < < | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 |
* See stat documentation.
*
*----------------------------------------------------------------------
*/
static int
NativeStat(nativePath, statPtr)
CONST TCHAR *nativePath; /* Path of file to stat */
struct stat *statPtr; /* Filled with results of stat call. */
{
Tcl_DString ds;
DWORD attr;
WCHAR nativeFullPath[MAX_PATH];
TCHAR *nativePart;
CONST char *fullPath;
int dev, mode;
if (tclWinProcs->getFileAttributesExProc == NULL) {
/*
* We don't have the faster attributes proc, so we're
* probably running on Win95
*/
WIN32_FIND_DATAT data;
HANDLE handle;
handle = (*tclWinProcs->findFirstFileProc)(nativePath, &data);
if (handle == INVALID_HANDLE_VALUE) {
/*
* FindFirstFile() doesn't work on root directories, so call
* GetFileAttributes() to see if the specified file exists.
*/
attr = (*tclWinProcs->getFileAttributesProc)(nativePath);
if (attr == 0xffffffff) {
Tcl_SetErrno(ENOENT);
return -1;
}
/*
* Make up some fake information for this file. It has the
* correct file attributes and a time of 0.
*/
memset(&data, 0, sizeof(data));
data.a.dwFileAttributes = attr;
} else {
FindClose(handle);
}
(*tclWinProcs->getFullPathNameProc)(nativePath, MAX_PATH, nativeFullPath,
&nativePart);
fullPath = Tcl_WinTCharToUtf((TCHAR *) nativeFullPath, -1, &ds);
dev = -1;
if ((fullPath[0] == '\\') && (fullPath[1] == '\\')) {
CONST char *p;
DWORD dw;
CONST TCHAR *nativeVol;
Tcl_DString volString;
p = strchr(fullPath + 2, '\\');
p = strchr(p + 1, '\\');
if (p == NULL) {
/*
* Add terminating backslash to fullpath or
* GetVolumeInformation() won't work.
*/
fullPath = Tcl_DStringAppend(&ds, "\\", 1);
p = fullPath + Tcl_DStringLength(&ds);
} else {
p++;
}
nativeVol = Tcl_WinUtfToTChar(fullPath, p - fullPath, &volString);
dw = (DWORD) -1;
(*tclWinProcs->getVolumeInformationProc)(nativeVol, NULL, 0, &dw,
NULL, NULL, NULL, 0);
/*
* GetFullPathName() turns special devices like "NUL" into "\\.\NUL",
* but GetVolumeInformation() returns failure for "\\.\NUL". This
* will cause "NUL" to get a drive number of -1, which makes about
* as much sense as anything since the special devices don't live on
* any drive.
*/
dev = dw;
Tcl_DStringFree(&volString);
} else if ((fullPath[0] != '\0') && (fullPath[1] == ':')) {
dev = Tcl_UniCharToLower(fullPath[0]) - 'a';
}
Tcl_DStringFree(&ds);
attr = data.a.dwFileAttributes;
statPtr->st_size = data.a.nFileSizeLow;
statPtr->st_atime = ToCTime(data.a.ftLastAccessTime);
statPtr->st_mtime = ToCTime(data.a.ftLastWriteTime);
statPtr->st_ctime = ToCTime(data.a.ftCreationTime);
} else {
WIN32_FILE_ATTRIBUTE_DATA data;
if((*tclWinProcs->getFileAttributesExProc)(nativePath,
GetFileExInfoStandard,
&data) != TRUE) {
Tcl_SetErrno(ENOENT);
return -1;
}
(*tclWinProcs->getFullPathNameProc)(nativePath, MAX_PATH, nativeFullPath,
&nativePart);
fullPath = Tcl_WinTCharToUtf((TCHAR *) nativeFullPath, -1, &ds);
dev = -1;
if ((fullPath[0] == '\\') && (fullPath[1] == '\\')) {
CONST char *p;
DWORD dw;
CONST TCHAR *nativeVol;
Tcl_DString volString;
p = strchr(fullPath + 2, '\\');
p = strchr(p + 1, '\\');
if (p == NULL) {
/*
* Add terminating backslash to fullpath or
* GetVolumeInformation() won't work.
*/
fullPath = Tcl_DStringAppend(&ds, "\\", 1);
p = fullPath + Tcl_DStringLength(&ds);
} else {
p++;
}
nativeVol = Tcl_WinUtfToTChar(fullPath, p - fullPath, &volString);
dw = (DWORD) -1;
(*tclWinProcs->getVolumeInformationProc)(nativeVol, NULL, 0, &dw,
NULL, NULL, NULL, 0);
/*
* GetFullPathName() turns special devices like "NUL" into "\\.\NUL",
* but GetVolumeInformation() returns failure for "\\.\NUL". This
* will cause "NUL" to get a drive number of -1, which makes about
* as much sense as anything since the special devices don't live on
* any drive.
*/
dev = dw;
Tcl_DStringFree(&volString);
} else if ((fullPath[0] != '\0') && (fullPath[1] == ':')) {
dev = Tcl_UniCharToLower(fullPath[0]) - 'a';
}
Tcl_DStringFree(&ds);
attr = data.dwFileAttributes;
statPtr->st_size = data.nFileSizeLow;
statPtr->st_atime = ToCTime(data.ftLastAccessTime);
statPtr->st_mtime = ToCTime(data.ftLastWriteTime);
statPtr->st_ctime = ToCTime(data.ftCreationTime);
}
mode = (attr & FILE_ATTRIBUTE_DIRECTORY) ? S_IFDIR | S_IEXEC : S_IFREG;
mode |= (attr & FILE_ATTRIBUTE_READONLY) ? S_IREAD : S_IREAD | S_IWRITE;
if (NativeIsExec(nativePath)) {
mode |= S_IEXEC;
}
/*
|
| ︙ | ︙ | |||
977 978 979 980 981 982 983 |
statPtr->st_dev = (dev_t) dev;
statPtr->st_ino = 0;
statPtr->st_mode = (unsigned short) mode;
statPtr->st_nlink = 1;
statPtr->st_uid = 0;
statPtr->st_gid = 0;
statPtr->st_rdev = (dev_t) dev;
| < < < < | 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 |
statPtr->st_dev = (dev_t) dev;
statPtr->st_ino = 0;
statPtr->st_mode = (unsigned short) mode;
statPtr->st_nlink = 1;
statPtr->st_uid = 0;
statPtr->st_gid = 0;
statPtr->st_rdev = (dev_t) dev;
return 0;
}
static time_t
ToCTime(
FILETIME fileTime) /* UTC Time to convert to local time_t. */
{
|
| ︙ | ︙ | |||
1134 1135 1136 1137 1138 1139 1140 |
}
int
TclpObjAccess(pathPtr, mode)
Tcl_Obj *pathPtr;
int mode;
{
| | | 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 |
}
int
TclpObjAccess(pathPtr, mode)
Tcl_Obj *pathPtr;
int mode;
{
return NativeAccess((CONST TCHAR*) Tcl_FSGetNativePath(pathPtr), mode);
}
int
TclpObjLstat(pathPtr, buf)
Tcl_Obj *pathPtr;
struct stat *buf;
{
|
| ︙ | ︙ |
Changes to win/tclWinInit.c.
1 2 3 4 5 6 7 8 9 | /* * tclWinInit.c -- * * Contains the Windows-specific interpreter initialization functions. * * Copyright (c) 1994-1997 Sun Microsystems, Inc. * Copyright (c) 1998-1999 by Scriptics Corporation. * All rights reserved. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | /* * tclWinInit.c -- * * Contains the Windows-specific interpreter initialization functions. * * Copyright (c) 1994-1997 Sun Microsystems, Inc. * Copyright (c) 1998-1999 by Scriptics Corporation. * All rights reserved. * * RCS: @(#) $Id: tclWinInit.c,v 1.31.2.1 2002/02/05 02:22:05 wolfsuit Exp $ */ #include "tclWinInt.h" #include <winnt.h> #include <winbase.h> /* |
| ︙ | ︙ | |||
168 169 170 171 172 173 174 |
void
TclpInitLibraryPath(path)
CONST char *path; /* Potentially dirty UTF string that is */
/* the path to the executable name. */
{
#define LIBRARY_SIZE 32
Tcl_Obj *pathPtr, *objPtr;
| | | | 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 |
void
TclpInitLibraryPath(path)
CONST char *path; /* Potentially dirty UTF string that is */
/* the path to the executable name. */
{
#define LIBRARY_SIZE 32
Tcl_Obj *pathPtr, *objPtr;
CONST char *str;
Tcl_DString ds;
int pathc;
CONST char **pathv;
char installLib[LIBRARY_SIZE], developLib[LIBRARY_SIZE];
Tcl_DStringInit(&ds);
pathPtr = Tcl_NewObj();
/*
* Initialize the substrings used when locating an executable. The
|
| ︙ | ︙ | |||
329 330 331 332 333 334 335 |
Tcl_Obj *pathPtr,
CONST char *lib)
{
int pathc;
WCHAR wBuf[MAX_PATH];
char buf[MAX_PATH * TCL_UTF_MAX];
Tcl_Obj *objPtr;
| < | | 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 |
Tcl_Obj *pathPtr,
CONST char *lib)
{
int pathc;
WCHAR wBuf[MAX_PATH];
char buf[MAX_PATH * TCL_UTF_MAX];
Tcl_Obj *objPtr;
Tcl_DString ds;
CONST char **pathv;
/*
* The "L" preceeding the TCL_LIBRARY string is used to tell VC++
* that this is a unicode string.
*/
if (GetEnvironmentVariableW(L"TCL_LIBRARY", wBuf, MAX_PATH) == 0) {
|
| ︙ | ︙ | |||
358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 |
/*
* The lstrcmpi() will work even if pathv[pathc - 1] is random
* UTF-8 chars because I know lib is ascii.
*/
if ((pathc > 0) && (lstrcmpiA(lib + 4, pathv[pathc - 1]) != 0)) {
/*
* TCL_LIBRARY is set but refers to a different tcl
* installation than the current version. Try fiddling with the
* specified directory to make it refer to this installation by
* removing the old "tclX.Y" and substituting the current
* version string.
*/
| > | | 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 |
/*
* The lstrcmpi() will work even if pathv[pathc - 1] is random
* UTF-8 chars because I know lib is ascii.
*/
if ((pathc > 0) && (lstrcmpiA(lib + 4, pathv[pathc - 1]) != 0)) {
CONST char *str;
/*
* TCL_LIBRARY is set but refers to a different tcl
* installation than the current version. Try fiddling with the
* specified directory to make it refer to this installation by
* removing the old "tclX.Y" and substituting the current
* version string.
*/
pathv[pathc - 1] = (lib + 4);
Tcl_DStringInit(&ds);
str = Tcl_JoinPath(pathc, pathv, &ds);
objPtr = Tcl_NewStringObj(str, Tcl_DStringLength(&ds));
Tcl_DStringFree(&ds);
} else {
objPtr = Tcl_NewStringObj(buf, -1);
}
|
| ︙ | ︙ | |||
558 559 560 561 562 563 564 |
*----------------------------------------------------------------------
*/
void
TclpSetVariables(interp)
Tcl_Interp *interp; /* Interp to initialize. */
{
| | | 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 |
*----------------------------------------------------------------------
*/
void
TclpSetVariables(interp)
Tcl_Interp *interp; /* Interp to initialize. */
{
CONST char *ptr;
char buffer[TCL_INTEGER_SPACE * 2];
SYSTEM_INFO sysInfo;
OemId *oemId;
OSVERSIONINFOA osInfo;
Tcl_DString ds;
osInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA);
|
| ︙ | ︙ | |||
694 695 696 697 698 699 700 |
for (i = 0, env = environ[i]; env != NULL; i++, env = environ[i]) {
/*
* Chop the env string off after the equal sign, then Convert
* the name to all upper case, so we do not have to convert
* all the characters after the equal sign.
*/
| | > | 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 |
for (i = 0, env = environ[i]; env != NULL; i++, env = environ[i]) {
/*
* Chop the env string off after the equal sign, then Convert
* the name to all upper case, so we do not have to convert
* all the characters after the equal sign.
*/
Tcl_ExternalToUtfDString(NULL, env, -1, &envString);
envUpper = Tcl_DStringValue(&envString);
p1 = strchr(envUpper, '=');
if (p1 == NULL) {
continue;
}
length = (int) (p1 - envUpper);
Tcl_DStringSetLength(&envString, length+1);
Tcl_UtfToUpper(envUpper);
|
| ︙ | ︙ | |||
787 788 789 790 791 792 793 |
*/
void
Tcl_SourceRCFile(interp)
Tcl_Interp *interp; /* Interpreter to source rc file into. */
{
Tcl_DString temp;
| | | | 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 |
*/
void
Tcl_SourceRCFile(interp)
Tcl_Interp *interp; /* Interpreter to source rc file into. */
{
Tcl_DString temp;
CONST char *fileName;
Tcl_Channel errChannel;
fileName = Tcl_GetVar(interp, "tcl_rcFileName", TCL_GLOBAL_ONLY);
if (fileName != NULL) {
Tcl_Channel c;
CONST char *fullName;
Tcl_DStringInit(&temp);
fullName = Tcl_TranslateFileName(interp, fileName, &temp);
if (fullName == NULL) {
/*
* Couldn't translate the file name (e.g. it referred to a
* bogus user or there was no HOME environment variable).
|
| ︙ | ︙ |
Changes to win/tclWinInt.h.
1 2 3 4 5 6 7 8 9 10 | /* * tclWinInt.h -- * * Declarations of Windows-specific shared variables and procedures. * * Copyright (c) 1994-1996 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | /* * tclWinInt.h -- * * Declarations of Windows-specific shared variables and procedures. * * Copyright (c) 1994-1996 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclWinInt.h,v 1.11.6.1 2002/02/05 02:22:05 wolfsuit Exp $ */ #ifndef _TCLWININT #define _TCLWININT #ifndef _TCLINT #include "tclInt.h" |
| ︙ | ︙ | |||
85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
TCHAR (WINAPI *lstrcpyProc)(WCHAR *, CONST TCHAR *);
BOOL (WINAPI *moveFileProc)(CONST TCHAR *, CONST TCHAR *);
BOOL (WINAPI *removeDirectoryProc)(CONST TCHAR *);
DWORD (WINAPI *searchPathProc)(CONST TCHAR *, CONST TCHAR *,
CONST TCHAR *, DWORD, WCHAR *, TCHAR **);
BOOL (WINAPI *setCurrentDirectoryProc)(CONST TCHAR *);
BOOL (WINAPI *setFileAttributesProc)(CONST TCHAR *, DWORD);
} TclWinProcs;
EXTERN TclWinProcs *tclWinProcs;
/*
* Declarations of functions that are not accessible by way of the
* stubs table.
| > > > | 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
TCHAR (WINAPI *lstrcpyProc)(WCHAR *, CONST TCHAR *);
BOOL (WINAPI *moveFileProc)(CONST TCHAR *, CONST TCHAR *);
BOOL (WINAPI *removeDirectoryProc)(CONST TCHAR *);
DWORD (WINAPI *searchPathProc)(CONST TCHAR *, CONST TCHAR *,
CONST TCHAR *, DWORD, WCHAR *, TCHAR **);
BOOL (WINAPI *setCurrentDirectoryProc)(CONST TCHAR *);
BOOL (WINAPI *setFileAttributesProc)(CONST TCHAR *, DWORD);
BOOL (WINAPI *getFileAttributesExProc)(CONST TCHAR *,
GET_FILEEX_INFO_LEVELS, LPVOID);
} TclWinProcs;
EXTERN TclWinProcs *tclWinProcs;
/*
* Declarations of functions that are not accessible by way of the
* stubs table.
|
| ︙ | ︙ |
Changes to win/tclWinLoad.c.
1 2 3 4 5 6 7 8 9 10 11 12 | /* * tclWinLoad.c -- * * This procedure provides a version of the TclLoadFile that * works with the Windows "LoadLibrary" and "GetProcAddress" * API for dynamic loading. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /* * tclWinLoad.c -- * * This procedure provides a version of the TclLoadFile that * works with the Windows "LoadLibrary" and "GetProcAddress" * API for dynamic loading. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclWinLoad.c,v 1.9.2.1 2002/02/05 02:22:05 wolfsuit Exp $ */ #include "tclWinInt.h" /* *---------------------------------------------------------------------- |
| ︙ | ︙ | |||
51 52 53 54 55 56 57 |
* (*unloadProcPtr)() to unload the file. */
Tcl_FSUnloadFileProc **unloadProcPtr;
/* Filled with address of Tcl_FSUnloadFileProc
* function which should be used for
* this file. */
{
HINSTANCE handle;
| | | 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
* (*unloadProcPtr)() to unload the file. */
Tcl_FSUnloadFileProc **unloadProcPtr;
/* Filled with address of Tcl_FSUnloadFileProc
* function which should be used for
* this file. */
{
HINSTANCE handle;
CONST TCHAR *nativeName;
Tcl_DString ds;
char *fileName = Tcl_GetString(pathPtr);
nativeName = Tcl_WinUtfToTChar(fileName, -1, &ds);
handle = (*tclWinProcs->loadLibraryProc)(nativeName);
Tcl_DStringFree(&ds);
|
| ︙ | ︙ | |||
189 190 191 192 193 194 195 | * None. * *---------------------------------------------------------------------- */ int TclGuessPackageName(fileName, bufPtr) | | | 189 190 191 192 193 194 195 196 197 198 199 200 201 202 |
* None.
*
*----------------------------------------------------------------------
*/
int
TclGuessPackageName(fileName, bufPtr)
CONST char *fileName; /* Name of file containing package (already
* translated to local form if needed). */
Tcl_DString *bufPtr; /* Initialized empty dstring. Append
* package name to this if possible. */
{
return 0;
}
|
Changes to win/tclWinNotify.c.
1 2 3 4 5 6 7 8 9 10 11 12 | /* * tclWinNotify.c -- * * This file contains Windows-specific procedures for the notifier, * which is the lowest-level part of the Tcl event loop. This file * works together with ../generic/tclNotify.c. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /* * tclWinNotify.c -- * * This file contains Windows-specific procedures for the notifier, * which is the lowest-level part of the Tcl event loop. This file * works together with ../generic/tclNotify.c. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclWinNotify.c,v 1.8.4.1 2002/02/05 02:22:05 wolfsuit Exp $ */ #include "tclWinInt.h" /* * The follwing static indicates whether this module has been initialized. */ |
| ︙ | ︙ | |||
142 143 144 145 146 147 148 149 150 151 152 153 154 155 |
*/
void
Tcl_FinalizeNotifier(clientData)
ClientData clientData; /* Pointer to notifier data. */
{
ThreadSpecificData *tsdPtr = (ThreadSpecificData *) clientData;
DeleteCriticalSection(&tsdPtr->crit);
CloseHandle(tsdPtr->event);
/*
* Clean up the timer and messaging window for this thread.
*/
| > > > > > > > > > > > > > > | 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 |
*/
void
Tcl_FinalizeNotifier(clientData)
ClientData clientData; /* Pointer to notifier data. */
{
ThreadSpecificData *tsdPtr = (ThreadSpecificData *) clientData;
/*
* Only finalize the notifier if a notifier was installed in the
* current thread; there is a route in which this is not
* guaranteed to be true (when tclWin32Dll.c:DllMain() is called
* with the flag DLL_PROCESS_DETACH by the OS, which could be
* doing so from a thread that's never previously been involved
* with Tcl, e.g. the task manager) so this check is important.
*
* Fixes Bug #217982 reported by Hugh Vu and Gene Leache.
*/
if (tsdPtr == NULL) {
return;
}
DeleteCriticalSection(&tsdPtr->crit);
CloseHandle(tsdPtr->event);
/*
* Clean up the timer and messaging window for this thread.
*/
|
| ︙ | ︙ | |||
517 518 519 520 521 522 523 |
* as necessary to make the clock advance by the requisite amount.
*/
Tcl_Time now; /* Current wall clock time */
Tcl_Time desired; /* Desired wakeup time */
int sleepTime = ms; /* Time to sleep */
| | | | 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 |
* as necessary to make the clock advance by the requisite amount.
*/
Tcl_Time now; /* Current wall clock time */
Tcl_Time desired; /* Desired wakeup time */
int sleepTime = ms; /* Time to sleep */
Tcl_GetTime( &now );
desired.sec = now.sec + ( ms / 1000 );
desired.usec = now.usec + 1000 * ( ms % 1000 );
if ( desired.usec > 1000000 ) {
++desired.sec;
desired.usec -= 1000000;
}
for ( ; ; ) {
Sleep( sleepTime );
Tcl_GetTime( &now );
if ( now.sec > desired.sec ) {
break;
} else if ( ( now.sec == desired.sec )
&& ( now.usec >= desired.usec ) ) {
break;
}
sleepTime = ( ( 1000 * ( desired.sec - now.sec ) )
+ ( ( desired.usec - now.usec ) / 1000 ) );
}
}
|
Changes to win/tclWinPipe.c.
1 2 3 4 5 6 7 8 9 10 11 | /* * tclWinPipe.c -- * * This file implements the Windows-specific exec pipeline functions, * the "pipe" channel driver, and the "pid" Tcl command. * * Copyright (c) 1996-1997 by Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | /* * tclWinPipe.c -- * * This file implements the Windows-specific exec pipeline functions, * the "pipe" channel driver, and the "pid" Tcl command. * * Copyright (c) 1996-1997 by Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclWinPipe.c,v 1.20.8.1 2002/02/05 02:22:05 wolfsuit Exp $ */ #include "tclWinInt.h" #include <fcntl.h> #include <io.h> #include <sys/stat.h> |
| ︙ | ︙ | |||
176 177 178 179 180 181 182 | /* * Declarations for functions used only in this file. */ static int ApplicationType(Tcl_Interp *interp, const char *fileName, char *fullName); static void BuildCommandLine(const char *executable, int argc, | | | | | 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 | /* * Declarations for functions used only in this file. */ static int ApplicationType(Tcl_Interp *interp, const char *fileName, char *fullName); static void BuildCommandLine(const char *executable, int argc, CONST char **argv, Tcl_DString *linePtr); static BOOL HasConsole(void); static int PipeBlockModeProc(ClientData instanceData, int mode); static void PipeCheckProc(ClientData clientData, int flags); static int PipeClose2Proc(ClientData instanceData, Tcl_Interp *interp, int flags); static int PipeEventProc(Tcl_Event *evPtr, int flags); static void PipeExitHandler(ClientData clientData); static int PipeGetHandleProc(ClientData instanceData, int direction, ClientData *handlePtr); static void PipeInit(void); static int PipeInputProc(ClientData instanceData, char *buf, int toRead, int *errorCode); static int PipeOutputProc(ClientData instanceData, CONST char *buf, int toWrite, int *errorCode); static DWORD WINAPI PipeReaderThread(LPVOID arg); static void PipeSetupProc(ClientData clientData, int flags); static void PipeWatchProc(ClientData instanceData, int mask); static DWORD WINAPI PipeWriterThread(LPVOID arg); static void ProcExitHandler(ClientData clientData); static int TempFileName(WCHAR name[MAX_PATH]); static int WaitForRead(PipeInfo *infoPtr, int blocking); |
| ︙ | ︙ | |||
574 575 576 577 578 579 580 |
TclpOpenFile(path, mode)
CONST char *path; /* The name of the file to open. */
int mode; /* In what mode to open the file? */
{
HANDLE handle;
DWORD accessMode, createMode, shareMode, flags;
Tcl_DString ds;
| | | 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 |
TclpOpenFile(path, mode)
CONST char *path; /* The name of the file to open. */
int mode; /* In what mode to open the file? */
{
HANDLE handle;
DWORD accessMode, createMode, shareMode, flags;
Tcl_DString ds;
CONST TCHAR *nativePath;
/*
* Map the access bits to the NT access mode.
*/
switch (mode & (O_RDONLY | O_WRONLY | O_RDWR)) {
case O_RDONLY:
|
| ︙ | ︙ | |||
945 946 947 948 949 950 951 |
int
TclpCreateProcess(
Tcl_Interp *interp, /* Interpreter in which to leave errors that
* occurred when creating the child process.
* Error messages from the child process
* itself are sent to errorFile. */
int argc, /* Number of arguments in following array. */
| | | 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 |
int
TclpCreateProcess(
Tcl_Interp *interp, /* Interpreter in which to leave errors that
* occurred when creating the child process.
* Error messages from the child process
* itself are sent to errorFile. */
int argc, /* Number of arguments in following array. */
CONST char **argv, /* Array of argument strings. argv[0]
* contains the name of the executable
* converted to native format (using the
* Tcl_TranslateFileName call). Additional
* arguments have not been converted. */
TclFile inputFile, /* If non-NULL, gives the file to use as
* input for the child process. If inputFile
* file is not readable or is NULL, the child
|
| ︙ | ︙ | |||
1356 1357 1358 1359 1360 1361 1362 |
HANDLE hFile;
TCHAR *rest;
char *ext;
char buf[2];
DWORD attr, read;
IMAGE_DOS_HEADER header;
Tcl_DString nameBuf, ds;
| | | 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 |
HANDLE hFile;
TCHAR *rest;
char *ext;
char buf[2];
DWORD attr, read;
IMAGE_DOS_HEADER header;
Tcl_DString nameBuf, ds;
CONST TCHAR *nativeName;
WCHAR nativeFullPath[MAX_PATH];
static char extensions[][5] = {"", ".com", ".exe", ".bat"};
/* Look for the program as an external program. First try the name
* as it is, then try adding .com, .exe, and .bat, in that order, to
* the name, looking for an executable.
*
|
| ︙ | ︙ | |||
1520 1521 1522 1523 1524 1525 1526 |
*/
static void
BuildCommandLine(
CONST char *executable, /* Full path of executable (including
* extension). Replacement for argv[0]. */
int argc, /* Number of arguments. */
| | | 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 |
*/
static void
BuildCommandLine(
CONST char *executable, /* Full path of executable (including
* extension). Replacement for argv[0]. */
int argc, /* Number of arguments. */
CONST char **argv, /* Argument strings in UTF. */
Tcl_DString *linePtr) /* Initialized Tcl_DString that receives the
* command line (TCHAR). */
{
CONST char *arg, *start, *special;
int quote, i;
Tcl_DString ds;
|
| ︙ | ︙ | |||
2129 2130 2131 2132 2133 2134 2135 |
*
*----------------------------------------------------------------------
*/
static int
PipeOutputProc(
ClientData instanceData, /* Pipe state. */
| | | 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 |
*
*----------------------------------------------------------------------
*/
static int
PipeOutputProc(
ClientData instanceData, /* Pipe state. */
CONST char *buf, /* The data buffer. */
int toWrite, /* How many bytes to write? */
int *errorCode) /* Where to store error code. */
{
PipeInfo *infoPtr = (PipeInfo *) instanceData;
WinFile *filePtr = (WinFile*) infoPtr->writeFile;
DWORD bytesWritten, timeout;
|
| ︙ | ︙ |
Changes to win/tclWinPort.h.
1 2 3 4 5 6 7 8 9 10 11 12 | /* * tclWinPort.h -- * * This header file handles porting issues that occur because of * differences between Windows and Unix. It should be the only * file that contains #ifdefs to handle different flavors of OS. * * Copyright (c) 1994-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /* * tclWinPort.h -- * * This header file handles porting issues that occur because of * differences between Windows and Unix. It should be the only * file that contains #ifdefs to handle different flavors of OS. * * Copyright (c) 1994-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclWinPort.h,v 1.23.2.1 2002/02/05 02:22:05 wolfsuit Exp $ */ #ifndef _TCLWINPORT #define _TCLWINPORT #ifndef _TCLINT # include "tclInt.h" |
| ︙ | ︙ | |||
64 65 66 67 68 69 70 | #endif #include <time.h> #define WIN32_LEAN_AND_MEAN #include <windows.h> #undef WIN32_LEAN_AND_MEAN | | | 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | #endif #include <time.h> #define WIN32_LEAN_AND_MEAN #include <windows.h> #undef WIN32_LEAN_AND_MEAN #include <winsock2.h> #ifdef BUILD_tcl # undef TCL_STORAGE_CLASS # define TCL_STORAGE_CLASS DLLEXPORT #endif |
| ︙ | ︙ | |||
430 431 432 433 434 435 436 437 438 439 440 441 442 443 |
*/
#define TclpExit exit
/*
* Declarations for Windows-only functions.
*/
EXTERN Tcl_Channel TclWinOpenSerialChannel _ANSI_ARGS_((HANDLE handle,
char *channelName, int permissions));
EXTERN Tcl_Channel TclWinOpenConsoleChannel _ANSI_ARGS_((HANDLE handle,
char *channelName, int permissions));
| > > > | 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 |
*/
#define TclpExit exit
/*
* Declarations for Windows-only functions.
*/
EXTERN HANDLE TclWinSerialReopen _ANSI_ARGS_(( HANDLE handle,
CONST TCHAR *name, DWORD access));
EXTERN Tcl_Channel TclWinOpenSerialChannel _ANSI_ARGS_((HANDLE handle,
char *channelName, int permissions));
EXTERN Tcl_Channel TclWinOpenConsoleChannel _ANSI_ARGS_((HANDLE handle,
char *channelName, int permissions));
|
| ︙ | ︙ |
Changes to win/tclWinReg.c.
1 2 3 4 5 6 7 8 9 10 11 12 13 | /* * tclWinReg.c -- * * This file contains the implementation of the "registry" Tcl * built-in command. This command is built as a dynamically * loadable extension in a separate DLL. * * Copyright (c) 1997 by Sun Microsystems, Inc. * Copyright (c) 1998-1999 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | /* * tclWinReg.c -- * * This file contains the implementation of the "registry" Tcl * built-in command. This command is built as a dynamically * loadable extension in a separate DLL. * * Copyright (c) 1997 by Sun Microsystems, Inc. * Copyright (c) 1998-1999 by Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclWinReg.c,v 1.13.8.1 2002/02/05 02:22:05 wolfsuit Exp $ */ #include <tclPort.h> #include <stdlib.h> /* * TCL_STORAGE_CLASS is set unconditionally to DLLEXPORT because the |
| ︙ | ︙ | |||
41 42 43 44 45 46 47 | #define REG_CREATE 1 /* * The following tables contain the mapping from registry root names * to the system predefined keys. */ | | | | | 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
#define REG_CREATE 1
/*
* The following tables contain the mapping from registry root names
* to the system predefined keys.
*/
static CONST char *rootKeyNames[] = {
"HKEY_LOCAL_MACHINE", "HKEY_USERS", "HKEY_CLASSES_ROOT",
"HKEY_CURRENT_USER", "HKEY_CURRENT_CONFIG",
"HKEY_PERFORMANCE_DATA", "HKEY_DYN_DATA", NULL
};
static HKEY rootKeys[] = {
HKEY_LOCAL_MACHINE, HKEY_USERS, HKEY_CLASSES_ROOT, HKEY_CURRENT_USER,
HKEY_CURRENT_CONFIG, HKEY_PERFORMANCE_DATA, HKEY_DYN_DATA
};
/*
* The following table maps from registry types to strings. Note that
* the indices for this array are the same as the constants for the
* known registry types so we don't need a separate table to hold the
* mapping.
*/
static CONST char *typeNames[] = {
"none", "sz", "expand_sz", "binary", "dword",
"dword_big_endian", "link", "multi_sz", "resource_list", NULL
};
static DWORD lastType = REG_RESOURCE_LIST;
/*
* The following structures allow us to select between the Unicode and ASCII
* interfaces at run time based on whether Unicode APIs are available. The
* Unicode APIs are preferable because they will handle characters outside
* of the current code page.
*/
typedef struct RegWinProcs {
int useWide;
LONG (WINAPI *regConnectRegistryProc)(CONST TCHAR *, HKEY, PHKEY);
LONG (WINAPI *regCreateKeyExProc)(HKEY, CONST TCHAR *, DWORD, TCHAR *,
DWORD, REGSAM, SECURITY_ATTRIBUTES *, HKEY *, DWORD *);
LONG (WINAPI *regDeleteKeyProc)(HKEY, CONST TCHAR *);
LONG (WINAPI *regDeleteValueProc)(HKEY, CONST TCHAR *);
LONG (WINAPI *regEnumKeyProc)(HKEY, DWORD, TCHAR *, DWORD);
LONG (WINAPI *regEnumKeyExProc)(HKEY, DWORD, TCHAR *, DWORD *, DWORD *,
TCHAR *, DWORD *, FILETIME *);
|
| ︙ | ︙ | |||
102 103 104 105 106 107 108 |
} RegWinProcs;
static RegWinProcs *regWinProcs;
static RegWinProcs asciiProcs = {
0,
| | | 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
} RegWinProcs;
static RegWinProcs *regWinProcs;
static RegWinProcs asciiProcs = {
0,
(LONG (WINAPI *)(CONST TCHAR *, HKEY, PHKEY)) RegConnectRegistryA,
(LONG (WINAPI *)(HKEY, CONST TCHAR *, DWORD, TCHAR *,
DWORD, REGSAM, SECURITY_ATTRIBUTES *, HKEY *,
DWORD *)) RegCreateKeyExA,
(LONG (WINAPI *)(HKEY, CONST TCHAR *)) RegDeleteKeyA,
(LONG (WINAPI *)(HKEY, CONST TCHAR *)) RegDeleteValueA,
(LONG (WINAPI *)(HKEY, DWORD, TCHAR *, DWORD)) RegEnumKeyA,
(LONG (WINAPI *)(HKEY, DWORD, TCHAR *, DWORD *, DWORD *,
|
| ︙ | ︙ | |||
127 128 129 130 131 132 133 |
(LONG (WINAPI *)(HKEY, CONST TCHAR *, DWORD, DWORD,
CONST BYTE*, DWORD)) RegSetValueExA,
};
static RegWinProcs unicodeProcs = {
1,
| | | 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
(LONG (WINAPI *)(HKEY, CONST TCHAR *, DWORD, DWORD,
CONST BYTE*, DWORD)) RegSetValueExA,
};
static RegWinProcs unicodeProcs = {
1,
(LONG (WINAPI *)(CONST TCHAR *, HKEY, PHKEY)) RegConnectRegistryW,
(LONG (WINAPI *)(HKEY, CONST TCHAR *, DWORD, TCHAR *,
DWORD, REGSAM, SECURITY_ATTRIBUTES *, HKEY *,
DWORD *)) RegCreateKeyExW,
(LONG (WINAPI *)(HKEY, CONST TCHAR *)) RegDeleteKeyW,
(LONG (WINAPI *)(HKEY, CONST TCHAR *)) RegDeleteValueW,
(LONG (WINAPI *)(HKEY, DWORD, TCHAR *, DWORD)) RegEnumKeyW,
(LONG (WINAPI *)(HKEY, DWORD, TCHAR *, DWORD *, DWORD *,
|
| ︙ | ︙ | |||
175 176 177 178 179 180 181 | REGSAM mode, int flags, HKEY *keyPtr); static DWORD OpenSubKey(char *hostName, HKEY rootKey, char *keyName, REGSAM mode, int flags, HKEY *keyPtr); static int ParseKeyName(Tcl_Interp *interp, char *name, char **hostNamePtr, HKEY *rootKeyPtr, char **keyNamePtr); | | > | 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 | REGSAM mode, int flags, HKEY *keyPtr); static DWORD OpenSubKey(char *hostName, HKEY rootKey, char *keyName, REGSAM mode, int flags, HKEY *keyPtr); static int ParseKeyName(Tcl_Interp *interp, char *name, char **hostNamePtr, HKEY *rootKeyPtr, char **keyNamePtr); static DWORD RecursiveDeleteKey(HKEY hStartKey, CONST TCHAR * pKeyName); static int RegistryObjCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj * CONST objv[]); static int SetValue(Tcl_Interp *interp, Tcl_Obj *keyNameObj, Tcl_Obj *valueNameObj, Tcl_Obj *dataObj, Tcl_Obj *typeObj); |
| ︙ | ︙ | |||
250 251 252 253 254 255 256 |
Tcl_Interp *interp, /* Current interpreter. */
int objc, /* Number of arguments. */
Tcl_Obj * CONST objv[]) /* Argument values. */
{
int index;
char *errString;
| | | > | 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 |
Tcl_Interp *interp, /* Current interpreter. */
int objc, /* Number of arguments. */
Tcl_Obj * CONST objv[]) /* Argument values. */
{
int index;
char *errString;
static CONST char *subcommands[] = {
"delete", "get", "keys", "set", "type", "values", (char *) NULL
};
enum SubCmdIdx { DeleteIdx, GetIdx, KeysIdx, SetIdx, TypeIdx, ValuesIdx };
if (objc < 2) {
Tcl_WrongNumArgs(interp, objc, objv, "option ?arg arg ...?");
return TCL_ERROR;
}
|
| ︙ | ︙ | |||
348 349 350 351 352 353 354 355 356 357 358 359 360 361 |
static int
DeleteKey(
Tcl_Interp *interp, /* Current interpreter. */
Tcl_Obj *keyNameObj) /* Name of key to delete. */
{
char *tail, *buffer, *hostName, *keyName;
HKEY rootKey, subkey;
DWORD result;
int length;
Tcl_Obj *resultPtr;
Tcl_DString buf;
/*
| > | 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 |
static int
DeleteKey(
Tcl_Interp *interp, /* Current interpreter. */
Tcl_Obj *keyNameObj) /* Name of key to delete. */
{
char *tail, *buffer, *hostName, *keyName;
CONST char *nativeTail;
HKEY rootKey, subkey;
DWORD result;
int length;
Tcl_Obj *resultPtr;
Tcl_DString buf;
/*
|
| ︙ | ︙ | |||
400 401 402 403 404 405 406 |
}
}
/*
* Now we recursively delete the key and everything below it.
*/
| | | | 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 |
}
}
/*
* Now we recursively delete the key and everything below it.
*/
nativeTail = Tcl_WinUtfToTChar(tail, -1, &buf);
result = RecursiveDeleteKey(subkey, nativeTail);
Tcl_DStringFree(&buf);
if (result != ERROR_SUCCESS && result != ERROR_FILE_NOT_FOUND) {
Tcl_AppendToObj(resultPtr, "unable to delete key: ", -1);
AppendSystemError(interp, result);
result = TCL_ERROR;
} else {
|
| ︙ | ︙ | |||
575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 |
{
HKEY key;
Tcl_Obj *resultPtr;
DWORD result;
DWORD type;
Tcl_DString ds;
char *valueName;
int length;
/*
* Attempt to open the key for reading.
*/
if (OpenKey(interp, keyNameObj, KEY_QUERY_VALUE, 0, &key)
!= TCL_OK) {
return TCL_ERROR;
}
/*
* Get the type of the value.
*/
resultPtr = Tcl_GetObjResult(interp);
valueName = Tcl_GetStringFromObj(valueNameObj, &length);
| > | | | 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 |
{
HKEY key;
Tcl_Obj *resultPtr;
DWORD result;
DWORD type;
Tcl_DString ds;
char *valueName;
CONST char *nativeValue;
int length;
/*
* Attempt to open the key for reading.
*/
if (OpenKey(interp, keyNameObj, KEY_QUERY_VALUE, 0, &key)
!= TCL_OK) {
return TCL_ERROR;
}
/*
* Get the type of the value.
*/
resultPtr = Tcl_GetObjResult(interp);
valueName = Tcl_GetStringFromObj(valueNameObj, &length);
nativeValue = Tcl_WinUtfToTChar(valueName, length, &ds);
result = (*regWinProcs->regQueryValueExProc)(key, nativeValue, NULL, &type,
NULL, NULL);
Tcl_DStringFree(&ds);
RegCloseKey(key);
if (result != ERROR_SUCCESS) {
Tcl_AppendStringsToObj(resultPtr, "unable to get type of value \"",
Tcl_GetString(valueNameObj), "\" from key \"",
|
| ︙ | ︙ | |||
646 647 648 649 650 651 652 653 654 655 656 657 658 659 |
GetValue(
Tcl_Interp *interp, /* Current interpreter. */
Tcl_Obj *keyNameObj, /* Name of key. */
Tcl_Obj *valueNameObj) /* Name of value to get. */
{
HKEY key;
char *valueName;
DWORD result, length, type;
Tcl_Obj *resultPtr;
Tcl_DString data, buf;
int nameLen;
/*
* Attempt to open the key for reading.
| > | 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 |
GetValue(
Tcl_Interp *interp, /* Current interpreter. */
Tcl_Obj *keyNameObj, /* Name of key. */
Tcl_Obj *valueNameObj) /* Name of value to get. */
{
HKEY key;
char *valueName;
CONST char *nativeValue;
DWORD result, length, type;
Tcl_Obj *resultPtr;
Tcl_DString data, buf;
int nameLen;
/*
* Attempt to open the key for reading.
|
| ︙ | ︙ | |||
677 678 679 680 681 682 683 |
Tcl_DStringInit(&data);
length = TCL_DSTRING_STATIC_SIZE - 1;
Tcl_DStringSetLength(&data, (int) length);
resultPtr = Tcl_GetObjResult(interp);
valueName = Tcl_GetStringFromObj(valueNameObj, &nameLen);
| | | | | | 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 |
Tcl_DStringInit(&data);
length = TCL_DSTRING_STATIC_SIZE - 1;
Tcl_DStringSetLength(&data, (int) length);
resultPtr = Tcl_GetObjResult(interp);
valueName = Tcl_GetStringFromObj(valueNameObj, &nameLen);
nativeValue = Tcl_WinUtfToTChar(valueName, nameLen, &buf);
result = (*regWinProcs->regQueryValueExProc)(key, nativeValue, NULL, &type,
(BYTE *) Tcl_DStringValue(&data), &length);
while (result == ERROR_MORE_DATA) {
/*
* The Windows docs say that in this error case, we just need
* to expand our buffer and request more data.
* Required for HKEY_PERFORMANCE_DATA
*/
length *= 2;
Tcl_DStringSetLength(&data, (int) length);
result = (*regWinProcs->regQueryValueExProc)(key, (char *) nativeValue,
NULL, &type, (BYTE *) Tcl_DStringValue(&data), &length);
}
Tcl_DStringFree(&buf);
RegCloseKey(key);
if (result != ERROR_SUCCESS) {
Tcl_AppendStringsToObj(resultPtr, "unable to get value \"",
Tcl_GetString(valueNameObj), "\" from key \"",
Tcl_GetString(keyNameObj), "\": ", NULL);
|
| ︙ | ︙ | |||
948 949 950 951 952 953 954 |
Tcl_DString buf;
/*
* Attempt to open the root key on a remote host if necessary.
*/
if (hostName) {
| | | | 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 |
Tcl_DString buf;
/*
* Attempt to open the root key on a remote host if necessary.
*/
if (hostName) {
hostName = (char *) Tcl_WinUtfToTChar(hostName, -1, &buf);
result = (*regWinProcs->regConnectRegistryProc)(hostName, rootKey,
&rootKey);
Tcl_DStringFree(&buf);
if (result != ERROR_SUCCESS) {
return result;
}
}
/*
* Now open the specified key with the requested permissions. Note
* that this key must be closed by the caller.
*/
keyName = (char *) Tcl_WinUtfToTChar(keyName, -1, &buf);
if (flags & REG_CREATE) {
DWORD create;
result = (*regWinProcs->regCreateKeyExProc)(rootKey, keyName, 0, "",
REG_OPTION_NON_VOLATILE, mode, NULL, keyPtr, &create);
} else {
if (rootKey == HKEY_PERFORMANCE_DATA) {
/*
|
| ︙ | ︙ | |||
1098 1099 1100 1101 1102 1103 1104 |
*
*----------------------------------------------------------------------
*/
static DWORD
RecursiveDeleteKey(
HKEY startKey, /* Parent of key to be deleted. */
| | | 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 |
*
*----------------------------------------------------------------------
*/
static DWORD
RecursiveDeleteKey(
HKEY startKey, /* Parent of key to be deleted. */
CONST char *keyName) /* Name of key to be deleted in external
* encoding, not UTF. */
{
DWORD result, size, maxSize;
Tcl_DString subkey;
HKEY hKey;
/*
|
| ︙ | ︙ | |||
1196 1197 1198 1199 1200 1201 1202 |
Tcl_ResetResult(interp);
}
if (OpenKey(interp, keyNameObj, KEY_ALL_ACCESS, 1, &key) != TCL_OK) {
return TCL_ERROR;
}
valueName = Tcl_GetStringFromObj(valueNameObj, &length);
| | | 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 |
Tcl_ResetResult(interp);
}
if (OpenKey(interp, keyNameObj, KEY_ALL_ACCESS, 1, &key) != TCL_OK) {
return TCL_ERROR;
}
valueName = Tcl_GetStringFromObj(valueNameObj, &length);
valueName = (char *) Tcl_WinUtfToTChar(valueName, length, &nameBuf);
resultPtr = Tcl_GetObjResult(interp);
if (type == REG_DWORD || type == REG_DWORD_BIG_ENDIAN) {
DWORD value;
if (Tcl_GetIntFromObj(interp, dataObj, (int*) &value) != TCL_OK) {
RegCloseKey(key);
Tcl_DStringFree(&nameBuf);
|
| ︙ | ︙ | |||
1252 1253 1254 1255 1256 1257 1258 |
(DWORD) Tcl_DStringLength(&buf));
Tcl_DStringFree(&data);
Tcl_DStringFree(&buf);
} else if (type == REG_SZ || type == REG_EXPAND_SZ) {
Tcl_DString buf;
char *data = Tcl_GetStringFromObj(dataObj, &length);
| | | 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 |
(DWORD) Tcl_DStringLength(&buf));
Tcl_DStringFree(&data);
Tcl_DStringFree(&buf);
} else if (type == REG_SZ || type == REG_EXPAND_SZ) {
Tcl_DString buf;
char *data = Tcl_GetStringFromObj(dataObj, &length);
data = (char *) Tcl_WinUtfToTChar(data, length, &buf);
/*
* Include the null in the length, padding if needed for Unicode.
*/
if (regWinProcs->useWide) {
Tcl_DStringSetLength(&buf, Tcl_DStringLength(&buf)+1);
|
| ︙ | ︙ |
Changes to win/tclWinSock.c.
1 2 3 4 5 6 7 8 9 10 | /* * tclWinSock.c -- * * This file contains Windows-specific socket related code. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | /* * tclWinSock.c -- * * This file contains Windows-specific socket related code. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclWinSock.c,v 1.21.4.1 2002/02/05 02:22:05 wolfsuit Exp $ */ #include "tclWinInt.h" /* * The following variable is used to tell whether this module has been * initialized. |
| ︙ | ︙ | |||
167 168 169 170 171 172 173 | static WNDCLASSA windowClass; /* * Static functions defined in this file. */ static SocketInfo * CreateSocket _ANSI_ARGS_((Tcl_Interp *interp, | | | | | | | 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 | static WNDCLASSA windowClass; /* * Static functions defined in this file. */ static SocketInfo * CreateSocket _ANSI_ARGS_((Tcl_Interp *interp, int port, CONST char *host, int server, CONST char *myaddr, int myport, int async)); static int CreateSocketAddress _ANSI_ARGS_( (struct sockaddr_in *sockaddrPtr, CONST char *host, int port)); static void InitSockets _ANSI_ARGS_((void)); static SocketInfo * NewSocketInfo _ANSI_ARGS_((SOCKET socket)); static void SocketCheckProc _ANSI_ARGS_((ClientData clientData, int flags)); static int SocketEventProc _ANSI_ARGS_((Tcl_Event *evPtr, int flags)); static void SocketExitHandler _ANSI_ARGS_((ClientData clientData)); static LRESULT CALLBACK SocketProc _ANSI_ARGS_((HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)); static void SocketSetupProc _ANSI_ARGS_((ClientData clientData, int flags)); static void SocketThreadExitHandler _ANSI_ARGS_((ClientData clientData)); static int SocketsEnabled _ANSI_ARGS_((void)); static void TcpAccept _ANSI_ARGS_((SocketInfo *infoPtr)); static int TcpBlockProc _ANSI_ARGS_((ClientData instanceData, int mode)); static int TcpCloseProc _ANSI_ARGS_((ClientData instanceData, Tcl_Interp *interp)); static int TcpGetOptionProc _ANSI_ARGS_((ClientData instanceData, Tcl_Interp *interp, CONST char *optionName, Tcl_DString *optionValue)); static int TcpInputProc _ANSI_ARGS_((ClientData instanceData, char *buf, int toRead, int *errorCode)); static int TcpOutputProc _ANSI_ARGS_((ClientData instanceData, CONST char *buf, int toWrite, int *errorCode)); static void TcpWatchProc _ANSI_ARGS_((ClientData instanceData, int mask)); static int TcpGetHandleProc _ANSI_ARGS_((ClientData instanceData, int direction, ClientData *handlePtr)); static int WaitForSocketEvent _ANSI_ARGS_((SocketInfo *infoPtr, int events, int *errorCodePtr)); static DWORD WINAPI SocketThread _ANSI_ARGS_((LPVOID arg)); |
| ︙ | ︙ | |||
1010 1011 1012 1013 1014 1015 1016 |
*----------------------------------------------------------------------
*/
static SocketInfo *
CreateSocket(interp, port, host, server, myaddr, myport, async)
Tcl_Interp *interp; /* For error reporting; can be NULL. */
int port; /* Port number to open. */
| | | | 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 |
*----------------------------------------------------------------------
*/
static SocketInfo *
CreateSocket(interp, port, host, server, myaddr, myport, async)
Tcl_Interp *interp; /* For error reporting; can be NULL. */
int port; /* Port number to open. */
CONST char *host; /* Name of host on which to open port. */
int server; /* 1 if socket should be a server socket,
* else 0 for a client socket. */
CONST char *myaddr; /* Optional client-side address */
int myport; /* Optional client-side port */
int async; /* If nonzero, connect client socket
* asynchronously. */
{
u_long flag = 1; /* Indicates nonblocking mode. */
int asyncConnect = 0; /* Will be 1 if async connect is
* in progress. */
|
| ︙ | ︙ | |||
1207 1208 1209 1210 1211 1212 1213 |
*
*----------------------------------------------------------------------
*/
static int
CreateSocketAddress(sockaddrPtr, host, port)
struct sockaddr_in *sockaddrPtr; /* Socket address */
| | | 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 |
*
*----------------------------------------------------------------------
*/
static int
CreateSocketAddress(sockaddrPtr, host, port)
struct sockaddr_in *sockaddrPtr; /* Socket address */
CONST char *host; /* Host. NULL implies INADDR_ANY */
int port; /* Port number */
{
struct hostent *hostent; /* Host database entry */
struct in_addr addr; /* For 64/32 bit madness */
/*
* Check that WinSock is initialized; do not call it if not, to
|
| ︙ | ︙ | |||
1351 1352 1353 1354 1355 1356 1357 |
*----------------------------------------------------------------------
*/
Tcl_Channel
Tcl_OpenTcpClient(interp, port, host, myaddr, myport, async)
Tcl_Interp *interp; /* For error reporting; can be NULL. */
int port; /* Port number to open. */
| | | | 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 |
*----------------------------------------------------------------------
*/
Tcl_Channel
Tcl_OpenTcpClient(interp, port, host, myaddr, myport, async)
Tcl_Interp *interp; /* For error reporting; can be NULL. */
int port; /* Port number to open. */
CONST char *host; /* Host on which to open port. */
CONST char *myaddr; /* Client-side address */
int myport; /* Client-side port */
int async; /* If nonzero, should connect
* client socket asynchronously. */
{
SocketInfo *infoPtr;
char channelName[16 + TCL_INTEGER_SPACE];
|
| ︙ | ︙ | |||
1467 1468 1469 1470 1471 1472 1473 |
*/
Tcl_Channel
Tcl_OpenTcpServer(interp, port, host, acceptProc, acceptProcData)
Tcl_Interp *interp; /* For error reporting - may be
* NULL. */
int port; /* Port number to open. */
| | | 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 |
*/
Tcl_Channel
Tcl_OpenTcpServer(interp, port, host, acceptProc, acceptProcData)
Tcl_Interp *interp; /* For error reporting - may be
* NULL. */
int port; /* Port number to open. */
CONST char *host; /* Name of local host. */
Tcl_TcpAcceptProc *acceptProc; /* Callback for accepting connections
* from new clients. */
ClientData acceptProcData; /* Data for the callback. */
{
SocketInfo *infoPtr;
char channelName[16 + TCL_INTEGER_SPACE];
|
| ︙ | ︙ | |||
1761 1762 1763 1764 1765 1766 1767 |
*
*----------------------------------------------------------------------
*/
static int
TcpOutputProc(instanceData, buf, toWrite, errorCodePtr)
ClientData instanceData; /* The socket state. */
| | | 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 |
*
*----------------------------------------------------------------------
*/
static int
TcpOutputProc(instanceData, buf, toWrite, errorCodePtr)
ClientData instanceData; /* The socket state. */
CONST char *buf; /* Where to get data. */
int toWrite; /* Maximum number of bytes to write. */
int *errorCodePtr; /* Where to store error codes. */
{
SocketInfo *infoPtr = (SocketInfo *) instanceData;
int bytesWritten;
int error;
ThreadSpecificData *tsdPtr =
|
| ︙ | ︙ | |||
1877 1878 1879 1880 1881 1882 1883 |
*----------------------------------------------------------------------
*/
static int
TcpGetOptionProc(instanceData, interp, optionName, dsPtr)
ClientData instanceData; /* Socket state. */
Tcl_Interp *interp; /* For error reporting - can be NULL */
| | | 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 |
*----------------------------------------------------------------------
*/
static int
TcpGetOptionProc(instanceData, interp, optionName, dsPtr)
ClientData instanceData; /* Socket state. */
Tcl_Interp *interp; /* For error reporting - can be NULL */
CONST char *optionName; /* Name of the option to
* retrieve the value for, or
* NULL to get all options and
* their values. */
Tcl_DString *dsPtr; /* Where to store the computed
* value; initialized by caller. */
{
SocketInfo *infoPtr;
|
| ︙ | ︙ | |||
1942 1943 1944 1945 1946 1947 1948 |
== 0) {
if (len == 0) {
Tcl_DStringAppendElement(dsPtr, "-peername");
Tcl_DStringStartSublist(dsPtr);
}
Tcl_DStringAppendElement(dsPtr,
(*winSock.inet_ntoa)(peername.sin_addr));
| > > > > | | | > | 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 |
== 0) {
if (len == 0) {
Tcl_DStringAppendElement(dsPtr, "-peername");
Tcl_DStringStartSublist(dsPtr);
}
Tcl_DStringAppendElement(dsPtr,
(*winSock.inet_ntoa)(peername.sin_addr));
if (peername.sin_addr.s_addr == 0) {
hostEntPtr = (struct hostent *) NULL;
} else {
hostEntPtr = (*winSock.gethostbyaddr)(
(char *) &(peername.sin_addr), sizeof(peername.sin_addr),
AF_INET);
}
if (hostEntPtr != (struct hostent *) NULL) {
Tcl_DStringAppendElement(dsPtr, hostEntPtr->h_name);
} else {
Tcl_DStringAppendElement(dsPtr,
(*winSock.inet_ntoa)(peername.sin_addr));
}
TclFormatInt(buf, (*winSock.ntohs)(peername.sin_port));
|
| ︙ | ︙ | |||
1988 1989 1990 1991 1992 1993 1994 |
== 0) {
if (len == 0) {
Tcl_DStringAppendElement(dsPtr, "-sockname");
Tcl_DStringStartSublist(dsPtr);
}
Tcl_DStringAppendElement(dsPtr,
(*winSock.inet_ntoa)(sockname.sin_addr));
| > > > | | | > | 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 |
== 0) {
if (len == 0) {
Tcl_DStringAppendElement(dsPtr, "-sockname");
Tcl_DStringStartSublist(dsPtr);
}
Tcl_DStringAppendElement(dsPtr,
(*winSock.inet_ntoa)(sockname.sin_addr));
if (sockname.sin_addr.s_addr == 0) {
hostEntPtr = (struct hostent *) NULL;
} else {
hostEntPtr = (*winSock.gethostbyaddr)(
(char *) &(sockname.sin_addr), sizeof(peername.sin_addr),
AF_INET);
}
if (hostEntPtr != (struct hostent *) NULL) {
Tcl_DStringAppendElement(dsPtr, hostEntPtr->h_name);
} else {
Tcl_DStringAppendElement(dsPtr,
(*winSock.inet_ntoa)(sockname.sin_addr));
}
TclFormatInt(buf, (*winSock.ntohs)(sockname.sin_port));
|
| ︙ | ︙ | |||
2314 2315 2316 2317 2318 2319 2320 | * * Side effects: * None. * *---------------------------------------------------------------------- */ | | | 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 |
*
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
CONST char *
Tcl_GetHostName()
{
DWORD length;
WCHAR wbuf[MAX_COMPUTERNAME_LENGTH + 1];
Tcl_MutexLock(&socketMutex);
InitSockets();
|
| ︙ | ︙ |
Changes to win/tclWinTest.c.
1 2 3 4 5 6 7 8 9 10 | /* * tclWinTest.c -- * * Contains commands for platform specific tests on Windows. * * Copyright (c) 1996 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | /* * tclWinTest.c -- * * Contains commands for platform specific tests on Windows. * * Copyright (c) 1996 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclWinTest.c,v 1.5.14.1 2002/02/05 02:22:05 wolfsuit Exp $ */ #include "tclWinInt.h" /* * Forward declarations of procedures defined later in this file: */ |
| ︙ | ︙ | |||
240 241 242 243 244 245 246 |
LARGE_INTEGER t1, t2;
if ( objc != 1 ) {
Tcl_WrongNumArgs( interp, 1, objv, "" );
return TCL_ERROR;
}
| | | 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 |
LARGE_INTEGER t1, t2;
if ( objc != 1 ) {
Tcl_WrongNumArgs( interp, 1, objv, "" );
return TCL_ERROR;
}
Tcl_GetTime( &tclTime );
GetSystemTimeAsFileTime( &sysTime );
t1.LowPart = posixEpoch.dwLowDateTime;
t1.HighPart = posixEpoch.dwHighDateTime;
t2.LowPart = sysTime.dwLowDateTime;
t2.HighPart = sysTime.dwHighDateTime;
t2.QuadPart -= t1.QuadPart;
|
| ︙ | ︙ |
Changes to win/tclWinTime.c.
1 2 3 4 5 6 7 8 9 10 11 | /* * tclWinTime.c -- * * Contains Windows specific versions of Tcl functions that * obtain time values from the operating system. * * Copyright 1995-1998 by Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | /* * tclWinTime.c -- * * Contains Windows specific versions of Tcl functions that * obtain time values from the operating system. * * Copyright 1995-1998 by Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tclWinTime.c,v 1.8.8.1 2002/02/05 02:22:05 wolfsuit Exp $ */ #include "tclWinInt.h" #define SECSPERDAY (60L * 60L * 24L) #define SECSPERYEAR (SECSPERDAY * 365L) #define SECSPER4YEAR (SECSPERYEAR * 4L + SECSPERDAY) |
| ︙ | ︙ | |||
127 128 129 130 131 132 133 |
*----------------------------------------------------------------------
*/
unsigned long
TclpGetSeconds()
{
Tcl_Time t;
| | | 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
*----------------------------------------------------------------------
*/
unsigned long
TclpGetSeconds()
{
Tcl_Time t;
Tcl_GetTime( &t );
return t.sec;
}
/*
*----------------------------------------------------------------------
*
* TclpGetClicks --
|
| ︙ | ︙ | |||
155 156 157 158 159 160 161 |
*----------------------------------------------------------------------
*/
unsigned long
TclpGetClicks()
{
/*
| | | | 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 |
*----------------------------------------------------------------------
*/
unsigned long
TclpGetClicks()
{
/*
* Use the Tcl_GetTime abstraction to get the time in microseconds,
* as nearly as we can, and return it.
*/
Tcl_Time now; /* Current Tcl time */
unsigned long retval; /* Value to return */
Tcl_GetTime( &now );
retval = ( now.sec * 1000000 ) + now.usec;
return retval;
}
/*
*----------------------------------------------------------------------
|
| ︙ | ︙ | |||
201 202 203 204 205 206 207 |
return timeZone;
}
/*
*----------------------------------------------------------------------
*
| | | | 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 |
return timeZone;
}
/*
*----------------------------------------------------------------------
*
* Tcl_GetTime --
*
* Gets the current system time in seconds and microseconds
* since the beginning of the epoch: 00:00 UCT, January 1, 1970.
*
* Results:
* Returns the current time in timePtr.
*
* Side effects:
* On the first call, initializes a set of static variables to
* keep track of the base value of the performance counter, the
* corresponding wall clock (obtained through ftime) and the
* frequency of the performance counter. Also spins a thread
* whose function is to wake up periodically and monitor these
* values, adjusting them as necessary to correct for drift
* in the performance counter's oscillator.
*
*----------------------------------------------------------------------
*/
void
Tcl_GetTime(timePtr)
Tcl_Time *timePtr; /* Location to store time information. */
{
struct timeb t;
/* Initialize static storage on the first trip through. */
|
| ︙ | ︙ |