Compare commits
2 Commits
tcl-core-8
...
tcl-core-8
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1aadb2455c | ||
|
|
3bb8e3e086 |
49
.github/workflows/linux-build.yml
vendored
Normal file
49
.github/workflows/linux-build.yml
vendored
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
name: Linux
|
||||||
|
on: [push]
|
||||||
|
jobs:
|
||||||
|
gcc:
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
cfgopt:
|
||||||
|
- ""
|
||||||
|
- "--disable-shared"
|
||||||
|
- "--enable-symbols"
|
||||||
|
- "--enable-symbols=mem"
|
||||||
|
- "CFLAGS=-DTCL_UTF_MAX=4"
|
||||||
|
- "CFLAGS=-DTCL_UTF_MAX=6"
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
|
working-directory: unix
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
- name: Prepare
|
||||||
|
run: |
|
||||||
|
touch tclStubInit.c tclOOStubInit.c
|
||||||
|
working-directory: generic
|
||||||
|
- name: Configure ${{ matrix.cfgopt }}
|
||||||
|
run: |
|
||||||
|
mkdir "${HOME}/install dir"
|
||||||
|
./configure ${CFGOPT} "--prefix=$HOME/install dir" || (cat config.log && exit 1)
|
||||||
|
env:
|
||||||
|
CFGOPT: ${{ matrix.cfgopt }}
|
||||||
|
- name: Build
|
||||||
|
run: |
|
||||||
|
make all
|
||||||
|
- name: Build Test Harness
|
||||||
|
run: |
|
||||||
|
make tcltest
|
||||||
|
- name: Run Tests
|
||||||
|
run: |
|
||||||
|
make test
|
||||||
|
- name: Test-Drive Installation
|
||||||
|
run: |
|
||||||
|
make install
|
||||||
|
- name: Create Distribution Package
|
||||||
|
run: |
|
||||||
|
make dist
|
||||||
|
- name: Convert Documentation to HTML
|
||||||
|
run: |
|
||||||
|
make html-tcl
|
||||||
58
.github/workflows/mac-build.yml
vendored
Normal file
58
.github/workflows/mac-build.yml
vendored
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
name: macOS
|
||||||
|
on: [push]
|
||||||
|
jobs:
|
||||||
|
xcode:
|
||||||
|
runs-on: macos-11.0
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
|
working-directory: macosx
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
- name: Prepare
|
||||||
|
run: |
|
||||||
|
touch tclStubInit.c tclOOStubInit.c
|
||||||
|
working-directory: generic
|
||||||
|
- name: Build
|
||||||
|
run: make all
|
||||||
|
- name: Run Tests
|
||||||
|
run: make test styles=develop
|
||||||
|
env:
|
||||||
|
ERROR_ON_FAILURES: 1
|
||||||
|
MAC_CI: 1
|
||||||
|
clang:
|
||||||
|
runs-on: macos-11.0
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
cfgopt:
|
||||||
|
- ""
|
||||||
|
- "--disable-shared"
|
||||||
|
- "--enable-symbols"
|
||||||
|
- "--enable-symbols=mem"
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
|
working-directory: unix
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
- name: Prepare
|
||||||
|
run: |
|
||||||
|
touch tclStubInit.c tclOOStubInit.c
|
||||||
|
mkdir "$HOME/install dir"
|
||||||
|
working-directory: generic
|
||||||
|
- name: Configure ${{ matrix.cfgopt }}
|
||||||
|
# Note that macOS is always a 64 bit platform
|
||||||
|
run: ./configure --enable-64bit --enable-dtrace --enable-framework ${CFGOPT} "--prefix=$HOME/install" || (cat config.log && exit 1)
|
||||||
|
env:
|
||||||
|
CFGOPT: ${{ matrix.cfgopt }}
|
||||||
|
- name: Build
|
||||||
|
run: |
|
||||||
|
make all tcltest
|
||||||
|
- name: Run Tests
|
||||||
|
run: |
|
||||||
|
make test
|
||||||
|
env:
|
||||||
|
ERROR_ON_FAILURES: 1
|
||||||
|
MAC_CI: 1
|
||||||
79
.github/workflows/win-build.yml
vendored
Normal file
79
.github/workflows/win-build.yml
vendored
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
name: Windows
|
||||||
|
on: [push]
|
||||||
|
jobs:
|
||||||
|
msvc:
|
||||||
|
runs-on: windows-latest
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: powershell
|
||||||
|
working-directory: win
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
cfgopt:
|
||||||
|
- ""
|
||||||
|
- "OPTS=static,msvcrt"
|
||||||
|
- "OPTS=symbols"
|
||||||
|
- "OPTS=memdbg"
|
||||||
|
# Using powershell means we need to explicitly stop on failure
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
- name: Init MSVC
|
||||||
|
uses: ilammy/msvc-dev-cmd@v1
|
||||||
|
- name: Build ${{ matrix.cfgopt }}
|
||||||
|
run: |
|
||||||
|
&nmake -f makefile.vc ${{ matrix.cfgopt }} all
|
||||||
|
if ($lastexitcode -ne 0) {
|
||||||
|
throw "nmake exit code: $lastexitcode"
|
||||||
|
}
|
||||||
|
- name: Build Test Harness ${{ matrix.cfgopt }}
|
||||||
|
run: |
|
||||||
|
&nmake -f makefile.vc ${{ matrix.cfgopt }} tcltest
|
||||||
|
if ($lastexitcode -ne 0) {
|
||||||
|
throw "nmake exit code: $lastexitcode"
|
||||||
|
}
|
||||||
|
- name: Run Tests ${{ matrix.cfgopt }}
|
||||||
|
run: |
|
||||||
|
&nmake -f makefile.vc ${{ matrix.cfgopt }} test
|
||||||
|
if ($lastexitcode -ne 0) {
|
||||||
|
throw "nmake exit code: $lastexitcode"
|
||||||
|
}
|
||||||
|
env:
|
||||||
|
ERROR_ON_FAILURES: 1
|
||||||
|
gcc:
|
||||||
|
runs-on: windows-latest
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
|
working-directory: win
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
cfgopt:
|
||||||
|
- ""
|
||||||
|
- "--disable-shared"
|
||||||
|
- "--enable-symbols"
|
||||||
|
- "--enable-symbols=mem"
|
||||||
|
# Using powershell means we need to explicitly stop on failure
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
- name: Install MSYS2 and Make
|
||||||
|
run: choco install msys2 make
|
||||||
|
- name: Prepare
|
||||||
|
run: |
|
||||||
|
touch tclStubInit.c tclOOStubInit.c
|
||||||
|
mkdir "${HOME}/install dir"
|
||||||
|
working-directory: generic
|
||||||
|
- name: Configure ${{ matrix.cfgopt }}
|
||||||
|
run: |
|
||||||
|
./configure ${CFGOPT} "--prefix=$HOME/install dir" || (cat config.log && exit 1)
|
||||||
|
env:
|
||||||
|
CFGOPT: --enable-64bit ${{ matrix.cfgopt }}
|
||||||
|
- name: Build
|
||||||
|
run: make all
|
||||||
|
- name: Build Test Harness
|
||||||
|
run: make tcltest
|
||||||
|
- name: Run Tests
|
||||||
|
run: make test
|
||||||
|
env:
|
||||||
|
ERROR_ON_FAILURES: 1
|
||||||
385
.travis.yml
Normal file
385
.travis.yml
Normal file
@@ -0,0 +1,385 @@
|
|||||||
|
language: c
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
sources:
|
||||||
|
- ubuntu-toolchain-r-test
|
||||||
|
packages:
|
||||||
|
- binutils-mingw-w64-i686
|
||||||
|
- binutils-mingw-w64-x86-64
|
||||||
|
- gcc-mingw-w64
|
||||||
|
- gcc-mingw-w64-base
|
||||||
|
- gcc-mingw-w64-i686
|
||||||
|
- gcc-mingw-w64-x86-64
|
||||||
|
- gcc-multilib
|
||||||
|
jobs:
|
||||||
|
include:
|
||||||
|
# Testing on Linux GCC
|
||||||
|
- name: "Linux/GCC/Shared"
|
||||||
|
os: linux
|
||||||
|
dist: focal
|
||||||
|
compiler: gcc
|
||||||
|
env:
|
||||||
|
- BUILD_DIR=unix
|
||||||
|
- name: "Linux/GCC/Shared: UTF_MAX=4"
|
||||||
|
os: linux
|
||||||
|
dist: focal
|
||||||
|
compiler: gcc
|
||||||
|
env:
|
||||||
|
- BUILD_DIR=unix
|
||||||
|
- CFGOPT=CFLAGS=-DTCL_UTF_MAX=4
|
||||||
|
- name: "Linux/GCC/Shared: UTF_MAX=6"
|
||||||
|
os: linux
|
||||||
|
dist: focal
|
||||||
|
compiler: gcc
|
||||||
|
env:
|
||||||
|
- BUILD_DIR=unix
|
||||||
|
- CFGOPT=CFLAGS=-DTCL_UTF_MAX=6
|
||||||
|
- name: "Linux/GCC/Static"
|
||||||
|
os: linux
|
||||||
|
dist: focal
|
||||||
|
compiler: gcc
|
||||||
|
env:
|
||||||
|
- CFGOPT="--disable-shared"
|
||||||
|
- BUILD_DIR=unix
|
||||||
|
- name: "Linux/GCC/Debug"
|
||||||
|
os: linux
|
||||||
|
dist: focal
|
||||||
|
compiler: gcc
|
||||||
|
env:
|
||||||
|
- BUILD_DIR=unix
|
||||||
|
- CFGOPT="--enable-symbols"
|
||||||
|
- name: "Linux/GCC/Mem-Debug"
|
||||||
|
os: linux
|
||||||
|
dist: focal
|
||||||
|
compiler: gcc
|
||||||
|
env:
|
||||||
|
- BUILD_DIR=unix
|
||||||
|
- CFGOPT="--enable-symbols=mem"
|
||||||
|
# Newer/Older versions of GCC
|
||||||
|
- name: "Linux/GCC 10/Shared"
|
||||||
|
os: linux
|
||||||
|
dist: focal
|
||||||
|
compiler: gcc-10
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
packages:
|
||||||
|
- g++-10
|
||||||
|
env:
|
||||||
|
- BUILD_DIR=unix
|
||||||
|
- name: "Linux/GCC 5/Shared"
|
||||||
|
os: linux
|
||||||
|
dist: bionic
|
||||||
|
compiler: gcc-5
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
packages:
|
||||||
|
- g++-5
|
||||||
|
env:
|
||||||
|
- BUILD_DIR=unix
|
||||||
|
# Testing on Linux Clang
|
||||||
|
- name: "Linux/Clang/Shared"
|
||||||
|
os: linux
|
||||||
|
dist: focal
|
||||||
|
compiler: clang
|
||||||
|
env:
|
||||||
|
- BUILD_DIR=unix
|
||||||
|
- name: "Linux/Clang/Static"
|
||||||
|
os: linux
|
||||||
|
dist: focal
|
||||||
|
compiler: clang
|
||||||
|
env:
|
||||||
|
- CFGOPT="--disable-shared"
|
||||||
|
- BUILD_DIR=unix
|
||||||
|
- name: "Linux/Clang/Debug"
|
||||||
|
os: linux
|
||||||
|
dist: focal
|
||||||
|
compiler: clang
|
||||||
|
env:
|
||||||
|
- BUILD_DIR=unix
|
||||||
|
- CFGOPT="--enable-symbols"
|
||||||
|
- name: "Linux/Clang/Mem-Debug"
|
||||||
|
os: linux
|
||||||
|
dist: focal
|
||||||
|
compiler: clang
|
||||||
|
env:
|
||||||
|
- BUILD_DIR=unix
|
||||||
|
- CFGOPT="--enable-symbols=mem"
|
||||||
|
# Testing on Mac, various styles
|
||||||
|
- name: "macOS/Xcode 12/Shared"
|
||||||
|
os: osx
|
||||||
|
osx_image: xcode12.2
|
||||||
|
env:
|
||||||
|
- BUILD_DIR=macosx
|
||||||
|
install: []
|
||||||
|
script: &mactest
|
||||||
|
- make all
|
||||||
|
# The styles=develop avoids some weird problems on OSX
|
||||||
|
- make test styles=develop
|
||||||
|
- name: "macOS/Xcode 12/Shared/Unix-like"
|
||||||
|
os: osx
|
||||||
|
osx_image: xcode12.2
|
||||||
|
env:
|
||||||
|
- BUILD_DIR=unix
|
||||||
|
- CFGOPT="--enable-dtrace"
|
||||||
|
# Newer MacOS versions
|
||||||
|
- name: "macOS/Xcode 12/Universal Apps/Shared"
|
||||||
|
os: osx
|
||||||
|
osx_image: xcode12u
|
||||||
|
env:
|
||||||
|
- BUILD_DIR=macosx
|
||||||
|
install: []
|
||||||
|
script: *mactest
|
||||||
|
# Older MacOS versions
|
||||||
|
- name: "macOS/Xcode 11/Shared"
|
||||||
|
os: osx
|
||||||
|
osx_image: xcode11.7
|
||||||
|
env:
|
||||||
|
- BUILD_DIR=macosx
|
||||||
|
install: []
|
||||||
|
script: *mactest
|
||||||
|
- name: "macOS/Xcode 10/Shared"
|
||||||
|
os: osx
|
||||||
|
osx_image: xcode10.3
|
||||||
|
env:
|
||||||
|
- BUILD_DIR=macosx
|
||||||
|
install: []
|
||||||
|
script: *mactest
|
||||||
|
- name: "macOS/Xcode 9/Shared"
|
||||||
|
os: osx
|
||||||
|
osx_image: xcode9.4
|
||||||
|
env:
|
||||||
|
- BUILD_DIR=macosx
|
||||||
|
install: []
|
||||||
|
script: *mactest
|
||||||
|
- name: "macOS/Xcode 8/Shared"
|
||||||
|
os: osx
|
||||||
|
osx_image: xcode8.3
|
||||||
|
env:
|
||||||
|
- BUILD_DIR=macosx
|
||||||
|
install: []
|
||||||
|
script: *mactest
|
||||||
|
# Test with mingw-w64 cross-compile
|
||||||
|
# Doesn't run tests because wine is only an imperfect Windows emulation
|
||||||
|
- name: "Linux-cross-Windows/GCC/Shared/no test"
|
||||||
|
os: linux
|
||||||
|
dist: focal
|
||||||
|
compiler: x86_64-w64-mingw32-gcc
|
||||||
|
env:
|
||||||
|
- BUILD_DIR=win
|
||||||
|
- CFGOPT="--host=x86_64-w64-mingw32 --enable-64bit"
|
||||||
|
script: &crosstest
|
||||||
|
- make all tcltest
|
||||||
|
# Include a high visibility marker that tests are skipped outright
|
||||||
|
- >
|
||||||
|
echo "`tput setaf 3`SKIPPED TEST: CROSS COMPILING`tput sgr0`"
|
||||||
|
# Test with mingw-w64 (32 bit) cross-compile
|
||||||
|
# Doesn't run tests because wine is only an imperfect Windows emulation
|
||||||
|
- name: "Linux-cross-Windows-32/GCC/Shared/no test"
|
||||||
|
os: linux
|
||||||
|
dist: focal
|
||||||
|
compiler: i686-w64-mingw32-gcc
|
||||||
|
env:
|
||||||
|
- BUILD_DIR=win
|
||||||
|
- CFGOPT=--host=i686-w64-mingw32
|
||||||
|
script: *crosstest
|
||||||
|
# Test on Windows with MSVC native
|
||||||
|
- name: "Windows/MSVC/Shared"
|
||||||
|
os: windows
|
||||||
|
compiler: cl
|
||||||
|
env: &vcenv
|
||||||
|
- BUILD_DIR=win
|
||||||
|
- VCDIR="/C/Program Files (x86)/Microsoft Visual Studio/2017/BuildTools/VC/Auxiliary/Build"
|
||||||
|
before_install: &vcpreinst
|
||||||
|
- touch generic/tclStubInit.c generic/tclOOStubInit.c
|
||||||
|
- PATH="$PATH:$VCDIR"
|
||||||
|
- cd ${BUILD_DIR}
|
||||||
|
install: []
|
||||||
|
script:
|
||||||
|
- cmd.exe //C vcvarsall.bat x64 '&&' nmake '-f' makefile.vc all tcltest
|
||||||
|
- cmd.exe //C vcvarsall.bat x64 '&&' nmake '-f' makefile.vc test
|
||||||
|
- name: "Windows/MSVC/Shared: UTF_MAX=4"
|
||||||
|
os: windows
|
||||||
|
compiler: cl
|
||||||
|
env: *vcenv
|
||||||
|
before_install: *vcpreinst
|
||||||
|
install: []
|
||||||
|
script:
|
||||||
|
- cmd.exe //C vcvarsall.bat x64 '&&' nmake 'OPTS=utfmax' '-f' makefile.vc all tcltest
|
||||||
|
- cmd.exe //C vcvarsall.bat x64 '&&' nmake 'OPTS=utfmax' '-f' makefile.vc test
|
||||||
|
- name: "Windows/MSVC/Static"
|
||||||
|
os: windows
|
||||||
|
compiler: cl
|
||||||
|
env: *vcenv
|
||||||
|
before_install: *vcpreinst
|
||||||
|
install: []
|
||||||
|
script:
|
||||||
|
- cmd.exe //C vcvarsall.bat x64 '&&' nmake 'OPTS=static,msvcrt' '-f' makefile.vc all tcltest
|
||||||
|
- cmd.exe //C vcvarsall.bat x64 '&&' nmake 'OPTS=static,msvcrt' '-f' makefile.vc test
|
||||||
|
- name: "Windows/MSVC/StaticPackage"
|
||||||
|
os: windows
|
||||||
|
compiler: cl
|
||||||
|
env: *vcenv
|
||||||
|
before_install: *vcpreinst
|
||||||
|
install: []
|
||||||
|
script:
|
||||||
|
- cmd.exe //C vcvarsall.bat x64 '&&' nmake 'OPTS=static,staticpkg,msvcrt' '-f' makefile.vc all tcltest
|
||||||
|
- cmd.exe //C vcvarsall.bat x64 '&&' nmake 'OPTS=static,staticpkg,msvcrt' '-f' makefile.vc test
|
||||||
|
- name: "Windows/MSVC/Debug"
|
||||||
|
os: windows
|
||||||
|
compiler: cl
|
||||||
|
env: *vcenv
|
||||||
|
before_install: *vcpreinst
|
||||||
|
install: []
|
||||||
|
script:
|
||||||
|
- cmd.exe //C vcvarsall.bat x64 '&&' nmake 'OPTS=symbols' '-f' makefile.vc all tcltest
|
||||||
|
- cmd.exe //C vcvarsall.bat x64 '&&' nmake 'OPTS=symbols' '-f' makefile.vc test
|
||||||
|
- name: "Windows/MSVC/Mem-Debug"
|
||||||
|
os: windows
|
||||||
|
compiler: cl
|
||||||
|
env: *vcenv
|
||||||
|
before_install: *vcpreinst
|
||||||
|
install: []
|
||||||
|
script:
|
||||||
|
- cmd.exe //C vcvarsall.bat x64 '&&' nmake 'STATS=memdbg' '-f' makefile.vc all tcltest
|
||||||
|
- cmd.exe //C vcvarsall.bat x64 '&&' nmake 'STATS=memdbg' '-f' makefile.vc test
|
||||||
|
# Test on Windows with MSVC native (32-bit)
|
||||||
|
- name: "Windows/MSVC-x86/Shared"
|
||||||
|
os: windows
|
||||||
|
compiler: cl
|
||||||
|
env: *vcenv
|
||||||
|
before_install: *vcpreinst
|
||||||
|
install: []
|
||||||
|
script:
|
||||||
|
- cmd.exe //C vcvarsall.bat x86 '&&' nmake '-f' makefile.vc all tcltest
|
||||||
|
- cmd.exe //C vcvarsall.bat x86 '&&' nmake '-f' makefile.vc test
|
||||||
|
- name: "Windows/MSVC-x86/Shared: UTF_MAX=4"
|
||||||
|
os: windows
|
||||||
|
compiler: cl
|
||||||
|
env: *vcenv
|
||||||
|
before_install: *vcpreinst
|
||||||
|
install: []
|
||||||
|
script:
|
||||||
|
- cmd.exe //C vcvarsall.bat x86 '&&' nmake 'OPTS=utfmax' '-f' makefile.vc all tcltest
|
||||||
|
- cmd.exe //C vcvarsall.bat x86 '&&' nmake 'OPTS=utfmax' '-f' makefile.vc test
|
||||||
|
- name: "Windows/MSVC-x86/Static"
|
||||||
|
os: windows
|
||||||
|
compiler: cl
|
||||||
|
env: *vcenv
|
||||||
|
before_install: *vcpreinst
|
||||||
|
install: []
|
||||||
|
script:
|
||||||
|
- cmd.exe //C vcvarsall.bat x86 '&&' nmake 'OPTS=static,msvcrt' '-f' makefile.vc all tcltest
|
||||||
|
- cmd.exe //C vcvarsall.bat x86 '&&' nmake 'OPTS=static,msvcrt' '-f' makefile.vc test
|
||||||
|
- name: "Windows/MSVC-x86/Debug"
|
||||||
|
os: windows
|
||||||
|
compiler: cl
|
||||||
|
env: *vcenv
|
||||||
|
before_install: *vcpreinst
|
||||||
|
install: []
|
||||||
|
script:
|
||||||
|
- cmd.exe //C vcvarsall.bat x86 '&&' nmake 'OPTS=symbols' '-f' makefile.vc all tcltest
|
||||||
|
- cmd.exe //C vcvarsall.bat x86 '&&' nmake 'OPTS=symbols' '-f' makefile.vc test
|
||||||
|
- name: "Windows/MSVC-x86/Mem-Debug"
|
||||||
|
os: windows
|
||||||
|
compiler: cl
|
||||||
|
env: *vcenv
|
||||||
|
before_install: *vcpreinst
|
||||||
|
install: []
|
||||||
|
script:
|
||||||
|
- cmd.exe //C vcvarsall.bat x86 '&&' nmake 'STATS=memdbg' '-f' makefile.vc all tcltest
|
||||||
|
- cmd.exe //C vcvarsall.bat x86 '&&' nmake 'STATS=memdbg' '-f' makefile.vc test
|
||||||
|
# Test on Windows with GCC native
|
||||||
|
- name: "Windows/GCC/Shared"
|
||||||
|
os: windows
|
||||||
|
compiler: gcc
|
||||||
|
env:
|
||||||
|
- BUILD_DIR=win
|
||||||
|
- CFGOPT="--enable-64bit"
|
||||||
|
before_install: &makepreinst
|
||||||
|
- touch generic/tclStubInit.c generic/tclOOStubInit.c
|
||||||
|
- choco install -y make
|
||||||
|
- cd ${BUILD_DIR}
|
||||||
|
- name: "Windows/GCC/Shared: UTF_MAX=4"
|
||||||
|
os: windows
|
||||||
|
compiler: gcc
|
||||||
|
env:
|
||||||
|
- BUILD_DIR=win
|
||||||
|
- CFGOPT="--enable-64bit CFLAGS=-DTCL_UTF_MAX=4"
|
||||||
|
before_install: *makepreinst
|
||||||
|
- name: "Windows/GCC/Static"
|
||||||
|
os: windows
|
||||||
|
compiler: gcc
|
||||||
|
env:
|
||||||
|
- BUILD_DIR=win
|
||||||
|
- CFGOPT="--enable-64bit --disable-shared"
|
||||||
|
before_install: *makepreinst
|
||||||
|
- name: "Windows/GCC/Debug"
|
||||||
|
os: windows
|
||||||
|
compiler: gcc
|
||||||
|
env:
|
||||||
|
- BUILD_DIR=win
|
||||||
|
- CFGOPT="--enable-64bit --enable-symbols"
|
||||||
|
before_install: *makepreinst
|
||||||
|
- name: "Windows/GCC/Mem-Debug"
|
||||||
|
os: windows
|
||||||
|
compiler: gcc
|
||||||
|
env:
|
||||||
|
- BUILD_DIR=win
|
||||||
|
- CFGOPT="--enable-64bit --enable-symbols=mem"
|
||||||
|
before_install: *makepreinst
|
||||||
|
# Test on Windows with GCC native (32-bit)
|
||||||
|
- name: "Windows/GCC-x86/Shared"
|
||||||
|
os: windows
|
||||||
|
compiler: gcc
|
||||||
|
env:
|
||||||
|
- BUILD_DIR=win
|
||||||
|
before_install: *makepreinst
|
||||||
|
- name: "Windows/GCC-x86/Shared: UTF_MAX=4"
|
||||||
|
os: windows
|
||||||
|
compiler: gcc
|
||||||
|
env:
|
||||||
|
- BUILD_DIR=win
|
||||||
|
- CFGOPT="CFLAGS=-DTCL_UTF_MAX=4"
|
||||||
|
before_install: *makepreinst
|
||||||
|
- name: "Windows/GCC-x86/Static"
|
||||||
|
os: windows
|
||||||
|
compiler: gcc
|
||||||
|
env:
|
||||||
|
- BUILD_DIR=win
|
||||||
|
- CFGOPT="--disable-shared"
|
||||||
|
before_install: *makepreinst
|
||||||
|
- name: "Windows/GCC-x86/Debug"
|
||||||
|
os: windows
|
||||||
|
compiler: gcc
|
||||||
|
env:
|
||||||
|
- BUILD_DIR=win
|
||||||
|
- CFGOPT="--enable-symbols"
|
||||||
|
before_install: *makepreinst
|
||||||
|
- name: "Windows/GCC-x86/Mem-Debug"
|
||||||
|
os: windows
|
||||||
|
compiler: gcc
|
||||||
|
env:
|
||||||
|
- BUILD_DIR=win
|
||||||
|
- CFGOPT="--enable-symbols=mem"
|
||||||
|
before_install: *makepreinst
|
||||||
|
# "make dist" only
|
||||||
|
- name: "Linux: make dist"
|
||||||
|
os: linux
|
||||||
|
dist: focal
|
||||||
|
compiler: gcc
|
||||||
|
env:
|
||||||
|
- BUILD_DIR=unix
|
||||||
|
script:
|
||||||
|
- make dist
|
||||||
|
before_install:
|
||||||
|
- touch generic/tclStubInit.c generic/tclOOStubInit.c
|
||||||
|
- cd ${BUILD_DIR}
|
||||||
|
install:
|
||||||
|
- mkdir "$HOME/install dir"
|
||||||
|
- ./configure ${CFGOPT} "--prefix=$HOME/install dir" || (cat config.log && exit 1)
|
||||||
|
before_script:
|
||||||
|
- export ERROR_ON_FAILURES=1
|
||||||
|
script:
|
||||||
|
- make all tcltest || echo "Something wrong, maybe a hickup, let's try again"
|
||||||
|
- make test
|
||||||
|
- make install
|
||||||
@@ -1847,7 +1847,7 @@ a better first place to look now.
|
|||||||
|
|
||||||
* tools/uniClass.tcl: [FRQ 3473670]: Various Unicode-related
|
* tools/uniClass.tcl: [FRQ 3473670]: Various Unicode-related
|
||||||
* tools/uniParse.tcl: speedups/robustness. Enhanced tools to be
|
* tools/uniParse.tcl: speedups/robustness. Enhanced tools to be
|
||||||
* generic/tclUniData.c: able to handle characters > 0xffff. Done in
|
* generic/tclUniData.c: able to handle characters > 0xFFFF. Done in
|
||||||
* generic/tclUtf.c: all branches in order to simplify merges for
|
* generic/tclUtf.c: all branches in order to simplify merges for
|
||||||
* generic/regc_locale.c: new Unicode versions (such as 6.1)
|
* generic/regc_locale.c: new Unicode versions (such as 6.1)
|
||||||
|
|
||||||
|
|||||||
@@ -1779,7 +1779,7 @@
|
|||||||
* generic/tclCmdMZ.c: Fixed infinite loop bug with [regexp -all]
|
* generic/tclCmdMZ.c: Fixed infinite loop bug with [regexp -all]
|
||||||
[Bug: 4981].
|
[Bug: 4981].
|
||||||
|
|
||||||
* tests/*.test: Changed all occurances of "namespace import
|
* tests/*.test: Changed all occurrences of "namespace import
|
||||||
::tcltest" to "namespace import -force ::tcltest" [Bug: 3948].
|
::tcltest" to "namespace import -force ::tcltest" [Bug: 3948].
|
||||||
|
|
||||||
2000-04-09 Brent Welch <welch@scriptics.com>
|
2000-04-09 Brent Welch <welch@scriptics.com>
|
||||||
|
|||||||
@@ -351,7 +351,7 @@
|
|||||||
|
|
||||||
* mac/tclMacFile.c: fixed bug in permission checking code
|
* mac/tclMacFile.c: fixed bug in permission checking code
|
||||||
|
|
||||||
* mac/tclMacLoad.c: corrected utf8 handling, comparison of package
|
* mac/tclMacLoad.c: corrected utf-8 handling, comparison of package
|
||||||
names to code fragment names changed to only match on the length of
|
names to code fragment names changed to only match on the length of
|
||||||
package name, this allows for fragment names with version numbers
|
package name, this allows for fragment names with version numbers
|
||||||
appended.
|
appended.
|
||||||
@@ -3525,7 +3525,7 @@
|
|||||||
* generic/tclVar.c (Tcl_UnsetObjCmd): Rewrote argument parser to avoid
|
* generic/tclVar.c (Tcl_UnsetObjCmd): Rewrote argument parser to avoid
|
||||||
a read off the end of the argument array that could occur when
|
a read off the end of the argument array that could occur when
|
||||||
executing something like [unset -nocomplain] was executed. Improved
|
executing something like [unset -nocomplain] was executed. Improved
|
||||||
the error message given when too few arguments are given (-nocomplain
|
the error message given when not enough arguments are given (-nocomplain
|
||||||
should obviously be *before* --, not after it) and also modified the
|
should obviously be *before* --, not after it) and also modified the
|
||||||
test suite to take account of that and the documentation to use the
|
test suite to take account of that and the documentation to use the
|
||||||
same improvement. [Bug 405769]
|
same improvement. [Bug 405769]
|
||||||
|
|||||||
@@ -1753,7 +1753,7 @@
|
|||||||
|
|
||||||
2002-07-05 Reinhard Max <max@suse.de>
|
2002-07-05 Reinhard Max <max@suse.de>
|
||||||
|
|
||||||
* generic/tclClock.c (FormatClock): Convert the format string to UTF8
|
* generic/tclClock.c (FormatClock): Convert the format string to utf-8
|
||||||
before calling TclpStrftime, so that non-ASCII characters don't get
|
before calling TclpStrftime, so that non-ASCII characters don't get
|
||||||
mangled when the result string is being converted back.
|
mangled when the result string is being converted back.
|
||||||
* tests/clock.test: Added a test for that.
|
* tests/clock.test: Added a test for that.
|
||||||
|
|||||||
@@ -2302,7 +2302,7 @@
|
|||||||
934511].
|
934511].
|
||||||
|
|
||||||
* doc/CrtCommand.3: Added note that the arguments given to the command
|
* doc/CrtCommand.3: Added note that the arguments given to the command
|
||||||
proc of a Tcl_CreateCommand are in utf8 since Tcl 8.1. Closing [Patch
|
proc of a Tcl_CreateCommand are in utf-8 since Tcl 8.1. Closing [Patch
|
||||||
414778].
|
414778].
|
||||||
|
|
||||||
* doc/ChnlStack.3: Removed the declaration that the interp argument to
|
* doc/ChnlStack.3: Removed the declaration that the interp argument to
|
||||||
@@ -2873,7 +2873,7 @@
|
|||||||
2004-06-02 Jeff Hobbs <jeffh@ActiveState.com>
|
2004-06-02 Jeff Hobbs <jeffh@ActiveState.com>
|
||||||
|
|
||||||
* win/tclWinFile.c (TclpFindExecutable): when using GetModuleFileNameA
|
* win/tclWinFile.c (TclpFindExecutable): when using GetModuleFileNameA
|
||||||
(Win9x), convert from CP_ACP to WCHAR then convert back to utf8.
|
(Win9x), convert from CP_ACP to WCHAR then convert back to utf-8.
|
||||||
Adjunct to 2004-04-07 fix.
|
Adjunct to 2004-04-07 fix.
|
||||||
|
|
||||||
2004-06-02 David Gravereaux <davygrvy@pobox.com>
|
2004-06-02 David Gravereaux <davygrvy@pobox.com>
|
||||||
|
|||||||
@@ -2913,7 +2913,7 @@
|
|||||||
* generic/tclCompCmds.c: Updated callers to call new routine.
|
* generic/tclCompCmds.c: Updated callers to call new routine.
|
||||||
* generic/tclDictObj.c: Updated callers to call new routine.
|
* generic/tclDictObj.c: Updated callers to call new routine.
|
||||||
* tests/obj.test: Corrected bad tests that actually expected
|
* tests/obj.test: Corrected bad tests that actually expected
|
||||||
values like "47" and "0xac" to be accepted as booleans.
|
values like "47" and "0xAC" to be accepted as booleans.
|
||||||
|
|
||||||
* generic/tclLiteral.c: Disabled the code that forces some literals
|
* generic/tclLiteral.c: Disabled the code that forces some literals
|
||||||
into the "int" Tcl_ObjType during registration. We can re-enable it if
|
into the "int" Tcl_ObjType during registration. We can re-enable it if
|
||||||
|
|||||||
185
README
185
README
@@ -1,185 +0,0 @@
|
|||||||
README: Tcl
|
|
||||||
This is the Tcl 8.6.9 source distribution.
|
|
||||||
http://sourceforge.net/projects/tcl/files/Tcl/
|
|
||||||
You can get any source release of Tcl from the URL above.
|
|
||||||
|
|
||||||
Contents
|
|
||||||
--------
|
|
||||||
1. Introduction
|
|
||||||
2. Documentation
|
|
||||||
3. Compiling and installing Tcl
|
|
||||||
4. Development tools
|
|
||||||
5. Tcl newsgroup
|
|
||||||
6. The Tcler's Wiki
|
|
||||||
7. Mailing lists
|
|
||||||
8. Support and Training
|
|
||||||
9. Tracking Development
|
|
||||||
10. Thank You
|
|
||||||
|
|
||||||
1. Introduction
|
|
||||||
---------------
|
|
||||||
Tcl provides a powerful platform for creating integration applications that
|
|
||||||
tie together diverse applications, protocols, devices, and frameworks.
|
|
||||||
When paired with the Tk toolkit, Tcl provides the fastest and most powerful
|
|
||||||
way to create GUI applications that run on PCs, Unix, and Mac OS X.
|
|
||||||
Tcl can also be used for a variety of web-related tasks and for creating
|
|
||||||
powerful command languages for applications.
|
|
||||||
|
|
||||||
Tcl is maintained, enhanced, and distributed freely by the Tcl community.
|
|
||||||
Source code development and tracking of bug reports and feature requests
|
|
||||||
takes place at:
|
|
||||||
|
|
||||||
http://core.tcl-lang.org/
|
|
||||||
|
|
||||||
Tcl/Tk release and mailing list services are hosted by SourceForge:
|
|
||||||
|
|
||||||
http://sourceforge.net/projects/tcl/
|
|
||||||
|
|
||||||
with the Tcl Developer Xchange hosted at:
|
|
||||||
|
|
||||||
http://www.tcl-lang.org/
|
|
||||||
|
|
||||||
Tcl is a freely available open source package. You can do virtually
|
|
||||||
anything you like with it, such as modifying it, redistributing it,
|
|
||||||
and selling it either in whole or in part. See the file
|
|
||||||
"license.terms" for complete information.
|
|
||||||
|
|
||||||
2. Documentation
|
|
||||||
----------------
|
|
||||||
|
|
||||||
Extensive documentation is available at our website.
|
|
||||||
The home page for this release, including new features, is
|
|
||||||
http://www.tcl-lang.org/software/tcltk/8.6.html
|
|
||||||
|
|
||||||
Detailed release notes can be found at the file distributions page
|
|
||||||
by clicking on the relevant version.
|
|
||||||
http://sourceforge.net/projects/tcl/files/Tcl/
|
|
||||||
|
|
||||||
Information about Tcl itself can be found at
|
|
||||||
http://www.tcl-lang.org/about/
|
|
||||||
|
|
||||||
There have been many Tcl books on the market. Many are mentioned in the Wiki:
|
|
||||||
http://wiki.tcl-lang.org/_/ref?N=25206
|
|
||||||
|
|
||||||
To view the complete set of reference manual entries for Tcl 8.6 online,
|
|
||||||
visit the URL:
|
|
||||||
http://www.tcl-lang.org/man/tcl8.6/
|
|
||||||
|
|
||||||
2a. Unix Documentation
|
|
||||||
----------------------
|
|
||||||
|
|
||||||
The "doc" subdirectory in this release contains a complete set of
|
|
||||||
reference manual entries for Tcl. Files with extension ".1" are for
|
|
||||||
programs (for example, tclsh.1); files with extension ".3" are for C
|
|
||||||
library procedures; and files with extension ".n" describe Tcl
|
|
||||||
commands. The file "doc/Tcl.n" gives a quick summary of the Tcl
|
|
||||||
language syntax. To print any of the man pages on Unix, cd to the
|
|
||||||
"doc" directory and invoke your favorite variant of troff using the
|
|
||||||
normal -man macros, for example
|
|
||||||
|
|
||||||
ditroff -man Tcl.n
|
|
||||||
|
|
||||||
to print Tcl.n. If Tcl has been installed correctly and your "man" program
|
|
||||||
supports it, you should be able to access the Tcl manual entries using the
|
|
||||||
normal "man" mechanisms, such as
|
|
||||||
|
|
||||||
man Tcl
|
|
||||||
|
|
||||||
2b. Windows Documentation
|
|
||||||
-------------------------
|
|
||||||
|
|
||||||
The "doc" subdirectory in this release contains a complete set of Windows
|
|
||||||
help files for Tcl. Once you install this Tcl release, a shortcut to the
|
|
||||||
Windows help Tcl documentation will appear in the "Start" menu:
|
|
||||||
|
|
||||||
Start | Programs | Tcl | Tcl Help
|
|
||||||
|
|
||||||
3. Compiling and installing Tcl
|
|
||||||
-------------------------------
|
|
||||||
|
|
||||||
There are brief notes in the unix/README, win/README, and macosx/README about
|
|
||||||
compiling on these different platforms. There is additional information
|
|
||||||
about building Tcl from sources at
|
|
||||||
|
|
||||||
http://www.tcl-lang.org/doc/howto/compile.html
|
|
||||||
|
|
||||||
4. Development tools
|
|
||||||
---------------------------
|
|
||||||
|
|
||||||
ActiveState produces a high quality set of commercial quality development
|
|
||||||
tools that is available to accelerate your Tcl application development.
|
|
||||||
Tcl Dev Kit builds on the earlier TclPro toolset and provides a debugger,
|
|
||||||
static code checker, single-file wrapping utility, bytecode compiler and
|
|
||||||
more. More information can be found at
|
|
||||||
|
|
||||||
http://www.ActiveState.com/Tcl
|
|
||||||
|
|
||||||
5. Tcl newsgroup
|
|
||||||
----------------
|
|
||||||
|
|
||||||
There is a USENET news group, "comp.lang.tcl", intended for the exchange of
|
|
||||||
information about Tcl, Tk, and related applications. The newsgroup is a
|
|
||||||
great place to ask general information questions. For bug reports, please
|
|
||||||
see the "Support and bug fixes" section below.
|
|
||||||
|
|
||||||
6. Tcl'ers Wiki
|
|
||||||
---------------
|
|
||||||
|
|
||||||
A Wiki-based open community site covering all aspects of Tcl/Tk is at:
|
|
||||||
|
|
||||||
http://wiki.tcl-lang.org/
|
|
||||||
|
|
||||||
It is dedicated to the Tcl programming language and its extensions. A
|
|
||||||
wealth of useful information can be found there. It contains code
|
|
||||||
snippets, references to papers, books, and FAQs, as well as pointers to
|
|
||||||
development tools, extensions, and applications. You can also recommend
|
|
||||||
additional URLs by editing the wiki yourself.
|
|
||||||
|
|
||||||
7. Mailing lists
|
|
||||||
----------------
|
|
||||||
|
|
||||||
Several mailing lists are hosted at SourceForge to discuss development or
|
|
||||||
use issues (like Macintosh and Windows topics). For more information and
|
|
||||||
to subscribe, visit:
|
|
||||||
|
|
||||||
http://sourceforge.net/projects/tcl/
|
|
||||||
|
|
||||||
and go to the Mailing Lists page.
|
|
||||||
|
|
||||||
8. Support and Training
|
|
||||||
------------------------
|
|
||||||
|
|
||||||
We are very interested in receiving bug reports, patches, and suggestions
|
|
||||||
for improvements. We prefer that you send this information to us as
|
|
||||||
tickets entered into our tracker at:
|
|
||||||
|
|
||||||
http://core.tcl-lang.org/tcl/reportlist
|
|
||||||
|
|
||||||
We will log and follow-up on each bug, although we cannot promise a
|
|
||||||
specific turn-around time. Enhancements may take longer and may not happen
|
|
||||||
at all unless there is widespread support for them (we're trying to
|
|
||||||
slow the rate at which Tcl/Tk turns into a kitchen sink). It's very
|
|
||||||
difficult to make incompatible changes to Tcl/Tk at this point, due to
|
|
||||||
the size of the installed base.
|
|
||||||
|
|
||||||
The Tcl community is too large for us to provide much individual support
|
|
||||||
for users. If you need help we suggest that you post questions to
|
|
||||||
comp.lang.tcl. We read the newsgroup and will attempt to answer esoteric
|
|
||||||
questions for which no one else is likely to know the answer. In addition,
|
|
||||||
see the following Web site for links to other organizations that offer
|
|
||||||
Tcl/Tk training:
|
|
||||||
|
|
||||||
http://wiki.tcl-lang.org/training
|
|
||||||
|
|
||||||
9. Tracking Development
|
|
||||||
-----------------------
|
|
||||||
|
|
||||||
Tcl is developed in public. To keep an eye on how Tcl is changing, see
|
|
||||||
http://core.tcl-lang.org/
|
|
||||||
|
|
||||||
10. Thank You
|
|
||||||
-------------
|
|
||||||
|
|
||||||
We'd like to express our thanks to the Tcl community for all the
|
|
||||||
helpful suggestions, bug reports, and patches we have received.
|
|
||||||
Tcl/Tk has improved vastly and will continue to do so with your help.
|
|
||||||
152
README.md
152
README.md
@@ -1,2 +1,150 @@
|
|||||||
# cpython-source-deps
|
# README: Tcl
|
||||||
Source for packages that the cpython build process depends on
|
|
||||||
|
This is the **Tcl 8.6.11** source distribution.
|
||||||
|
|
||||||
|
You can get any source release of Tcl from [our distribution
|
||||||
|
site](https://sourceforge.net/projects/tcl/files/Tcl/).
|
||||||
|
|
||||||
|
[](https://github.com/tcltk/tcl/actions?query=workflow%3A%22Linux%22+branch%3Acore-8-6-branch)
|
||||||
|
[](https://github.com/tcltk/tcl/actions?query=workflow%3A%22Windows%22+branch%3Acore-8-6-branch)
|
||||||
|
[](https://github.com/tcltk/tcl/actions?query=workflow%3A%22macOS%22+branch%3Acore-8-6-branch)
|
||||||
|
|
||||||
|
## Contents
|
||||||
|
1. [Introduction](#intro)
|
||||||
|
2. [Documentation](#doc)
|
||||||
|
3. [Compiling and installing Tcl](#build)
|
||||||
|
4. [Development tools](#devtools)
|
||||||
|
5. [Tcl newsgroup](#complangtcl)
|
||||||
|
6. [The Tcler's Wiki](#wiki)
|
||||||
|
7. [Mailing lists](#email)
|
||||||
|
8. [Support and Training](#support)
|
||||||
|
9. [Tracking Development](#watch)
|
||||||
|
10. [Thank You](#thanks)
|
||||||
|
|
||||||
|
## <a id="intro">1.</a> Introduction
|
||||||
|
Tcl provides a powerful platform for creating integration applications that
|
||||||
|
tie together diverse applications, protocols, devices, and frameworks.
|
||||||
|
When paired with the Tk toolkit, Tcl provides the fastest and most powerful
|
||||||
|
way to create GUI applications that run on PCs, Unix, and Mac OS X.
|
||||||
|
Tcl can also be used for a variety of web-related tasks and for creating
|
||||||
|
powerful command languages for applications.
|
||||||
|
|
||||||
|
Tcl is maintained, enhanced, and distributed freely by the Tcl community.
|
||||||
|
Source code development and tracking of bug reports and feature requests
|
||||||
|
take place at [core.tcl-lang.org](https://core.tcl-lang.org/).
|
||||||
|
Tcl/Tk release and mailing list services are [hosted by
|
||||||
|
SourceForge](https://sourceforge.net/projects/tcl/)
|
||||||
|
with the Tcl Developer Xchange hosted at
|
||||||
|
[www.tcl-lang.org](https://www.tcl-lang.org).
|
||||||
|
|
||||||
|
Tcl is a freely available open-source package. You can do virtually
|
||||||
|
anything you like with it, such as modifying it, redistributing it,
|
||||||
|
and selling it either in whole or in part. See the file
|
||||||
|
`license.terms` for complete information.
|
||||||
|
|
||||||
|
## <a id="doc">2.</a> Documentation
|
||||||
|
Extensive documentation is available on our website.
|
||||||
|
The home page for this release, including new features, is
|
||||||
|
[here](https://www.tcl.tk/software/tcltk/8.6.html).
|
||||||
|
Detailed release notes can be found at the
|
||||||
|
[file distributions page](https://sourceforge.net/projects/tcl/files/Tcl/)
|
||||||
|
by clicking on the relevant version.
|
||||||
|
|
||||||
|
Information about Tcl itself can be found at the [Developer
|
||||||
|
Xchange](https://www.tcl-lang.org/about/).
|
||||||
|
There have been many Tcl books on the market. Many are mentioned in
|
||||||
|
[the Wiki](https://wiki.tcl-lang.org/_/ref?N=25206).
|
||||||
|
|
||||||
|
The complete set of reference manual entries for Tcl 8.6 is [online,
|
||||||
|
here](https://www.tcl-lang.org/man/tcl8.6/).
|
||||||
|
|
||||||
|
### <a id="doc.unix">2a.</a> Unix Documentation
|
||||||
|
The `doc` subdirectory in this release contains a complete set of
|
||||||
|
reference manual entries for Tcl. Files with extension "`.1`" are for
|
||||||
|
programs (for example, `tclsh.1`); files with extension "`.3`" are for C
|
||||||
|
library procedures; and files with extension "`.n`" describe Tcl
|
||||||
|
commands. The file "`doc/Tcl.n`" gives a quick summary of the Tcl
|
||||||
|
language syntax. To print any of the man pages on Unix, cd to the
|
||||||
|
"doc" directory and invoke your favorite variant of troff using the
|
||||||
|
normal -man macros, for example
|
||||||
|
|
||||||
|
groff -man -Tpdf Tcl.n >output.pdf
|
||||||
|
|
||||||
|
to print Tcl.n to PDF. If Tcl has been installed correctly and your "man" program
|
||||||
|
supports it, you should be able to access the Tcl manual entries using the
|
||||||
|
normal "man" mechanisms, such as
|
||||||
|
|
||||||
|
man Tcl
|
||||||
|
|
||||||
|
### <a id="doc.win">2b.</a> Windows Documentation
|
||||||
|
The "doc" subdirectory in this release contains a complete set of Windows
|
||||||
|
help files for Tcl. Once you install this Tcl release, a shortcut to the
|
||||||
|
Windows help Tcl documentation will appear in the "Start" menu:
|
||||||
|
|
||||||
|
Start | Programs | Tcl | Tcl Help
|
||||||
|
|
||||||
|
## <a id="build">3.</a> Compiling and installing Tcl
|
||||||
|
There are brief notes in the `unix/README`, `win/README`, and `macosx/README`
|
||||||
|
about compiling on these different platforms. There is additional information
|
||||||
|
about building Tcl from sources
|
||||||
|
[online](https://www.tcl-lang.org/doc/howto/compile.html).
|
||||||
|
|
||||||
|
## <a id="devtools">4.</a> Development tools
|
||||||
|
ActiveState produces a high-quality set of commercial quality development
|
||||||
|
tools that is available to accelerate your Tcl application development.
|
||||||
|
Tcl Dev Kit builds on the earlier TclPro toolset and provides a debugger,
|
||||||
|
static code checker, single-file wrapping utility, bytecode compiler, and
|
||||||
|
more. More information can be found at
|
||||||
|
|
||||||
|
http://www.ActiveState.com/Tcl
|
||||||
|
|
||||||
|
## <a id="complangtcl">5.</a> Tcl newsgroup
|
||||||
|
There is a USENET newsgroup, "`comp.lang.tcl`", intended for the exchange of
|
||||||
|
information about Tcl, Tk, and related applications. The newsgroup is a
|
||||||
|
great place to ask general information questions. For bug reports, please
|
||||||
|
see the "Support and bug fixes" section below.
|
||||||
|
|
||||||
|
## <a id="wiki">6.</a> Tcl'ers Wiki
|
||||||
|
There is a [wiki-based open community site](https://wiki.tcl-lang.org/)
|
||||||
|
covering all aspects of Tcl/Tk.
|
||||||
|
|
||||||
|
It is dedicated to the Tcl programming language and its extensions. A
|
||||||
|
wealth of useful information can be found there. It contains code
|
||||||
|
snippets, references to papers, books, and FAQs, as well as pointers to
|
||||||
|
development tools, extensions, and applications. You can also recommend
|
||||||
|
additional URLs by editing the wiki yourself.
|
||||||
|
|
||||||
|
## <a id="email">7.</a> Mailing lists
|
||||||
|
Several mailing lists are hosted at SourceForge to discuss development or use
|
||||||
|
issues (like Macintosh and Windows topics). For more information and to
|
||||||
|
subscribe, visit [here](https://sourceforge.net/projects/tcl/) and go to the
|
||||||
|
Mailing Lists page.
|
||||||
|
|
||||||
|
## <a id="support">8.</a> Support and Training
|
||||||
|
We are very interested in receiving bug reports, patches, and suggestions for
|
||||||
|
improvements. We prefer that you send this information to us as tickets
|
||||||
|
entered into [our issue tracker](https://core.tcl-lang.org/tcl/reportlist).
|
||||||
|
|
||||||
|
We will log and follow-up on each bug, although we cannot promise a
|
||||||
|
specific turn-around time. Enhancements may take longer and may not happen
|
||||||
|
at all unless there is widespread support for them (we're trying to
|
||||||
|
slow the rate at which Tcl/Tk turns into a kitchen sink). It's very
|
||||||
|
difficult to make incompatible changes to Tcl/Tk at this point, due to
|
||||||
|
the size of the installed base.
|
||||||
|
|
||||||
|
The Tcl community is too large for us to provide much individual support for
|
||||||
|
users. If you need help we suggest that you post questions to `comp.lang.tcl`
|
||||||
|
or ask a question on [Stack
|
||||||
|
Overflow](https://stackoverflow.com/questions/tagged/tcl). We read the
|
||||||
|
newsgroup and will attempt to answer esoteric questions for which no one else
|
||||||
|
is likely to know the answer. In addition, see the wiki for [links to other
|
||||||
|
organizations](https://wiki.tcl-lang.org/training) that offer Tcl/Tk training.
|
||||||
|
|
||||||
|
## <a id="watch">9.</a> Tracking Development
|
||||||
|
Tcl is developed in public. You can keep an eye on how Tcl is changing at
|
||||||
|
[core.tcl-lang.org](https://core.tcl-lang.org/).
|
||||||
|
|
||||||
|
## <a id="thanks">10.</a> Thank You
|
||||||
|
We'd like to express our thanks to the Tcl community for all the
|
||||||
|
helpful suggestions, bug reports, and patches we have received.
|
||||||
|
Tcl/Tk has improved vastly and will continue to do so with your help.
|
||||||
|
|||||||
198
changes
198
changes
@@ -2307,7 +2307,7 @@ to the standard channel, do not increment the refcount. The channel can
|
|||||||
be NULL if there is for example no standard input. (JL)
|
be NULL if there is for example no standard input. (JL)
|
||||||
|
|
||||||
9/6/96 (portability improvement) Changed parsing of backslash sequences
|
9/6/96 (portability improvement) Changed parsing of backslash sequences
|
||||||
like \n to translate directly to absolute values like 0xa instead of
|
like \n to translate directly to absolute values like 0xA instead of
|
||||||
letting the compiler do the translation. This guarantees that the
|
letting the compiler do the translation. This guarantees that the
|
||||||
translation is done the same everywhere. (JO)
|
translation is done the same everywhere. (JO)
|
||||||
|
|
||||||
@@ -8303,7 +8303,7 @@ reported usage of large expressions (porter)
|
|||||||
|
|
||||||
Many optmizations, improvements, and tightened stack management in bytecode.
|
Many optmizations, improvements, and tightened stack management in bytecode.
|
||||||
|
|
||||||
--- Released 8.6.1, September 20, 2013 --- http://core.tcl.tk/tcl/ for details
|
--- Released 8.6.1, September 20, 2013 --- https://core.tcl-lang.org/tcl/ for details
|
||||||
|
|
||||||
2013-09-27 (enhancement) improved ::env synchronization (fellows)
|
2013-09-27 (enhancement) improved ::env synchronization (fellows)
|
||||||
|
|
||||||
@@ -8451,7 +8451,7 @@ include ::oo::class (fellows)
|
|||||||
|
|
||||||
2014-08-25 (TIP 429) New command [string cat] (leitgeb,ferrieux)
|
2014-08-25 (TIP 429) New command [string cat] (leitgeb,ferrieux)
|
||||||
|
|
||||||
--- Released 8.6.2, August 27, 2014 --- http://core.tcl.tk/tcl/ for details
|
--- Released 8.6.2, August 27, 2014 --- https://core.tcl-lang.org/tcl/ for details
|
||||||
|
|
||||||
2014-08-28 (bug)[b9e1a3] Correct Method Search Order (nadkarni,fellows)
|
2014-08-28 (bug)[b9e1a3] Correct Method Search Order (nadkarni,fellows)
|
||||||
=> TclOO 1.0.3
|
=> TclOO 1.0.3
|
||||||
@@ -8491,7 +8491,7 @@ include ::oo::class (fellows)
|
|||||||
|
|
||||||
2014-11-06 (bug)[5adc35] Stop forcing EOF to be permanent (porter)
|
2014-11-06 (bug)[5adc35] Stop forcing EOF to be permanent (porter)
|
||||||
|
|
||||||
--- Released 8.6.3, November 12, 2014 --- http://core.tcl.tk/tcl/ for details
|
--- Released 8.6.3, November 12, 2014 --- https://core.tcl-lang.org/tcl/ for details
|
||||||
|
|
||||||
2014-11-21 (bug)[743338] Win: socket error encoding (ladayaroslav,nijtmans)
|
2014-11-21 (bug)[743338] Win: socket error encoding (ladayaroslav,nijtmans)
|
||||||
|
|
||||||
@@ -8527,7 +8527,7 @@ include ::oo::class (fellows)
|
|||||||
2015-03-10 (enhancement) Revise OS X notifier for better Cocoa (walzer)
|
2015-03-10 (enhancement) Revise OS X notifier for better Cocoa (walzer)
|
||||||
*** POTENTIAL INCOMPATIBILITY ***
|
*** POTENTIAL INCOMPATIBILITY ***
|
||||||
|
|
||||||
--- Released 8.6.4, March 12, 2015 --- http://core.tcl.tk/tcl/ for details
|
--- Released 8.6.4, March 12, 2015 --- https://core.tcl-lang.org/tcl/ for details
|
||||||
|
|
||||||
2015-03-19 (bug)[e66e44] Win: Ctrl-C/Ctrl-Break in console not EOF (nadkarni)
|
2015-03-19 (bug)[e66e44] Win: Ctrl-C/Ctrl-Break in console not EOF (nadkarni)
|
||||||
|
|
||||||
@@ -8623,7 +8623,7 @@ improvements to regexp engine from Postgres (lane,porter,fellows,seltenreich)
|
|||||||
|
|
||||||
2016-02-22 (bug)[9b4702] [info exists env(missing)] kills trace (nijtmans)
|
2016-02-22 (bug)[9b4702] [info exists env(missing)] kills trace (nijtmans)
|
||||||
|
|
||||||
--- Released 8.6.5, February 29, 2016 --- http://core.tcl.tk/tcl/ for details
|
--- Released 8.6.5, February 29, 2016 --- https://core.tcl-lang.org/tcl/ for details
|
||||||
|
|
||||||
2016-03-01 (bug)[803042] mem leak due to reference cycle (porter)
|
2016-03-01 (bug)[803042] mem leak due to reference cycle (porter)
|
||||||
|
|
||||||
@@ -8697,7 +8697,7 @@ improvements to regexp engine from Postgres (lane,porter,fellows,seltenreich)
|
|||||||
|
|
||||||
2016-07-20 tzdata updated to Olson's tzdata2016f (venkat)
|
2016-07-20 tzdata updated to Olson's tzdata2016f (venkat)
|
||||||
|
|
||||||
--- Released 8.6.6, July 27, 2016 --- http://core.tcl.tk/tcl/ for details
|
--- Released 8.6.6, July 27, 2016 --- https://core.tcl-lang.org/tcl/ for details
|
||||||
|
|
||||||
2016-09-07 (bug)[c09edf] Bad caching with custom resolver (neumann,nijtmans)
|
2016-09-07 (bug)[c09edf] Bad caching with custom resolver (neumann,nijtmans)
|
||||||
|
|
||||||
@@ -8794,7 +8794,7 @@ improvements to regexp engine from Postgres (lane,porter,fellows,seltenreich)
|
|||||||
|
|
||||||
2017-07-17 (bug)[fb2208] Repeatable tclIndex generation (wiedemann,nijtmans)
|
2017-07-17 (bug)[fb2208] Repeatable tclIndex generation (wiedemann,nijtmans)
|
||||||
|
|
||||||
--- Released 8.6.7, August 9, 2017 --- http://core.tcl.tk/tcl/ for details
|
--- Released 8.6.7, August 9, 2017 --- https://core.tcl-lang.org/tcl/ for details
|
||||||
|
|
||||||
2017-08-10 [array names -regexp] supports backrefs (goth)
|
2017-08-10 [array names -regexp] supports backrefs (goth)
|
||||||
|
|
||||||
@@ -8829,7 +8829,7 @@ improvements to regexp engine from Postgres (lane,porter,fellows,seltenreich)
|
|||||||
|
|
||||||
2017-12-19 (bug)[586e71] EvalObjv exception handling at level #0 (sebres,porter)
|
2017-12-19 (bug)[586e71] EvalObjv exception handling at level #0 (sebres,porter)
|
||||||
|
|
||||||
--- Released 8.6.8, December 22, 2017 --- http://core.tcl.tk/tcl/ for details
|
--- Released 8.6.8, December 22, 2017 --- https://core.tcl-lang.org/tcl/ for details
|
||||||
|
|
||||||
2018-02-11 (enhance) stop blocking conversion of object to/from class (coulter)
|
2018-02-11 (enhance) stop blocking conversion of object to/from class (coulter)
|
||||||
|
|
||||||
@@ -8894,3 +8894,183 @@ improvements to regexp engine from Postgres (lane,porter,fellows,seltenreich)
|
|||||||
2018-11-16 (bug)[00d04c] Repair [binary encode base64] (sebres)
|
2018-11-16 (bug)[00d04c] Repair [binary encode base64] (sebres)
|
||||||
|
|
||||||
- Released 8.6.9, November 16, 2018 - details at http://core.tcl-lang.org/tcl/ -
|
- Released 8.6.9, November 16, 2018 - details at http://core.tcl-lang.org/tcl/ -
|
||||||
|
|
||||||
|
2018-11-22 (bug)[7a9dc5] [file normalize ~/~foo] segfault (sebres)
|
||||||
|
|
||||||
|
2018-12-30 (bug)[3cf3a9] variable 'timezone' deprecated in vc2017 (nijtmans)
|
||||||
|
|
||||||
|
2019-01-09 (bug)[cc1e91] [list [list {*}[set a " "]]] regression (sebres)
|
||||||
|
|
||||||
|
2019-02-01 (bug)[e3f481] tests var-1.2[01] (sebres)
|
||||||
|
|
||||||
|
2019-03-01 (new) Update to Unicode 12.0 (nijtmans)
|
||||||
|
|
||||||
|
2019-03-05 (new)[TIP 527] New command [timerate] (sebres)
|
||||||
|
|
||||||
|
2019-03-08 (bug)[39fed4] [package require] memory validity (hume,porter)
|
||||||
|
|
||||||
|
2019-04-23 (new) New command tcl::unsupported::corotype (fellows)
|
||||||
|
|
||||||
|
2019-05-04 (bug) memlink when namespace deletion kills linked var (porter)
|
||||||
|
|
||||||
|
2019-05-28 (new) README file converted to README.md in Markdown (nijtmans)
|
||||||
|
|
||||||
|
2019-06-17 (bug)[8b9854] [info level 0] regression with ensembles (porter)
|
||||||
|
|
||||||
|
2019-06-20 (bug)[6bdadf] crash multi-arg write-traced [lappend] (fellows,porter)
|
||||||
|
|
||||||
|
2019-06-21 (bug)[f8a33c] crash Tcl_Exit before init (brooks,sebres)
|
||||||
|
|
||||||
|
2019-08-27 (bug)[fa6bf3] Bytecode fails epoch recovery at numLevel=0 (sebres)
|
||||||
|
|
||||||
|
2019-08-29 (bug)[fec0c1] C stack overflow compiling bytecode (ade,sebres)
|
||||||
|
|
||||||
|
2019-09-12 tzdata updated to Olson's tzdata2019c (jima)
|
||||||
|
|
||||||
|
2019-09-20 (new) registry/dde no longer need -DUNICODE (nijtmans)
|
||||||
|
=> registry 1.3.4
|
||||||
|
=> dde 1.4.2
|
||||||
|
|
||||||
|
2019-10-02 (bug)[16768d] Fix [info hostname] on NetBSD (rytaro)
|
||||||
|
|
||||||
|
2019-10-23 (new) libtommath updated to release 1.2.0 (nijtmans)
|
||||||
|
|
||||||
|
2019-10-25 OSX: system Tcl deprecated. End default use of its packages. (walzer)
|
||||||
|
|
||||||
|
2019-10-28 (bug)[bcd100] bad fs cache when system encoding changes (coulter)
|
||||||
|
|
||||||
|
2019-11-15 (bug)[135804] segfault in [next] after destroy (coulter,sebres)
|
||||||
|
|
||||||
|
2019-11-18 (bug)[13657a] application/json us text, not binary (noe,nijtmans)
|
||||||
|
=> http 2.9.1
|
||||||
|
|
||||||
|
- Released 8.6.10, Nov 21, 2019 - details at http://core.tcl-lang.org/tcl/ -
|
||||||
|
|
||||||
|
2019-12-03 (bug)[3cd9be] Corner case in surrogate handling (nijtmans)
|
||||||
|
|
||||||
|
2019-12-09 (new) Add tcltest::(Setup|Eval|Cleanup|)Test (coulter,sebres)
|
||||||
|
=> tcltest 2.5.2
|
||||||
|
|
||||||
|
2019-12-12 (new) Add 3 libtommath functions to stub table (nijtmans)
|
||||||
|
|
||||||
|
2019-12-23 (bug)[ce3b9f] compilation errors with clang, windows msys2 (nijtmans)
|
||||||
|
|
||||||
|
2019-12-27 (bug)[1de6b0] [expr 1e2147483648] => 0.0 (kbk)
|
||||||
|
|
||||||
|
2020-01-04 (bug)[912886] tis-620 encoding fails to load (coulter)
|
||||||
|
|
||||||
|
2020-01-13 (bug)[0b9332] Win: support system encoding init to utf-8 (jedlička)
|
||||||
|
|
||||||
|
2020-01-17 (bug)[8cd2fe] [unload] corrupted list of loaded packages (berc)
|
||||||
|
|
||||||
|
2020-01-17 (bug)[5d989f] segfault in lsort for large list length (sebres)
|
||||||
|
|
||||||
|
2020-01-30 (bug) Reset WSAGetLastError()/errno in channel close (nijtmans)
|
||||||
|
|
||||||
|
2020-02-17 (bug) Win: avoid create of legacy error-vars on init phase (sebres)
|
||||||
|
|
||||||
|
2020-02-25 (bug) release refs when setting class's superclasses fails (dkf)
|
||||||
|
|
||||||
|
2020-02-26 (bug) C++ compiler compatibility for registry and dde (nijtmans)
|
||||||
|
=> registry 1.4.3
|
||||||
|
=> dde 1.3.5
|
||||||
|
|
||||||
|
2020-03-05 (new) Update to Unicode-13 (nijtmans)
|
||||||
|
|
||||||
|
2020-03-16 (bug)[8f89e2] Win: env var encoding, env-2.5 (sebres, nijtmans)
|
||||||
|
|
||||||
|
2020-03-27 (bug)[767e07] Tcl_Get(Range|UniChar) validate index inputs (nijtmans)
|
||||||
|
|
||||||
|
2020-03-28 (bug)[8edfce] [binary encode base64] & multi-byte wrapchars (dgp)
|
||||||
|
|
||||||
|
2020-03-28 (bug)[ffeb20] [binary decode base64] ignore invalid chars (dgp)
|
||||||
|
See RFC 2045
|
||||||
|
*** POTENTIAL INCOMPATIBILITY ***
|
||||||
|
|
||||||
|
2020-03-31 (bug)[b8e82d] some -maxlen values break uuencode round trip (dgp)
|
||||||
|
*** POTENTIAL INCOMPATIBILITY ***
|
||||||
|
|
||||||
|
2020-04-01 (bug)[f58371] Fileevent run in proper thread (bron,sebres)
|
||||||
|
|
||||||
|
2020-04-13 (bug)[afa4b2] TclNeedSpace bug; tests util-8.5 .. util-8.11 (dgp)
|
||||||
|
|
||||||
|
2020-04-13 (bug)[085913] Tcl_DStringAppendElement # quoting precision (dgp)
|
||||||
|
*** POTENTIAL INCOMPATIBILITY ***
|
||||||
|
|
||||||
|
2020-04-13 (bug)[a7f685] test util-5.52 (dgp)
|
||||||
|
|
||||||
|
2020-04-13 (bug)[c61818] Tcl_UtfPrev regression (dgp)
|
||||||
|
|
||||||
|
2020-04-15 (bug)[8af92d] zlib transform issue, bad inflate (sebres)
|
||||||
|
|
||||||
|
2020-04-16 (bug)[5e6346] Tcl_UtfPrev handling of overlong sequences (dgp)
|
||||||
|
|
||||||
|
2020-04-27 (bug)[45ca23] [string tolower] inconsistency (dgp)
|
||||||
|
|
||||||
|
2020-04-30 (bug)[da2352] init [info hostname] with DNS, not NetBIOS (nadkarni)
|
||||||
|
|
||||||
|
2020-05-11 (bug)[d402ff] Win32 potential crash when using main() (werner)
|
||||||
|
|
||||||
|
2020-05-13 (bug)[81242a] revised documentation for Tcl_UtfAtIndex() (nijtmans)
|
||||||
|
*** POTENTIAL INCOMPATIBILITY ***
|
||||||
|
|
||||||
|
2020-05-13 (bug)[ed2980] Tcl_UtfToUniChar reads > TCL_UTF_MAX bytes (nijtmans)
|
||||||
|
*** POTENTIAL INCOMPATIBILITY ***
|
||||||
|
|
||||||
|
2020-06-02 (bug) prevent segfault in parser (sebres)
|
||||||
|
|
||||||
|
2020-06-21 (bug)[f81bec] http POST a binary file (alakendu,nash)
|
||||||
|
=> http 2.9.2
|
||||||
|
|
||||||
|
2020-06-23 (bug)[41c985] auto_path nonsense in Safe Base (nash)
|
||||||
|
|
||||||
|
2020-06-24 (bug)[f70ce1] zlib multi-stream inflate acts only on first (sebres)
|
||||||
|
|
||||||
|
2020-07-09 (bug)[a1bd37] [clock scan] new ISO format (clock-34.(19-24)) (sebres)
|
||||||
|
*** POTENTIAL INCOMPATIBILITY ***
|
||||||
|
|
||||||
|
2020-07-10 (bug)[501974] [clock scan] +time zone (clock-34.(53-68)) (sebres)
|
||||||
|
*** POTENTIAL INCOMPATIBILITY ***
|
||||||
|
|
||||||
|
2020-07-15 (bug)[3c6e47] compiled [lappend] performance, avoid copy (sebres)
|
||||||
|
|
||||||
|
2020-07-16 (bug)[5bbd04] Fix index underflow (schwab)
|
||||||
|
|
||||||
|
2020-07-27 (bug)[cb0373] http::geturl -keepalive fixes (nash)
|
||||||
|
=> http 2.9.3
|
||||||
|
|
||||||
|
2020-08-10 (bug)[29e884] cmd resolution cycle (namespace-57.0) (coulter,sebres)
|
||||||
|
|
||||||
|
2020-08-12 (bug)[e87000] Tcl_BadChannelOption tolerate NULL (werner,nijtmans)
|
||||||
|
|
||||||
|
2020-08-31 (TIP #581) disfavor Master/Slave terminology (nijtmans)
|
||||||
|
=> opt 0.4.8
|
||||||
|
|
||||||
|
2020-09-11 (bug)[3bc0f4] UBSan complains about body.chars[] usage (nijtmans)
|
||||||
|
|
||||||
|
2020-09-17 (bug)[835c93] Support TIP 525 exit code for -singleproc 1 (nijtmans)
|
||||||
|
=> tcltest 2.5.3
|
||||||
|
|
||||||
|
2020-09-25 (new) force -eofchar \032 when evaluating library scripts (nijtmans)
|
||||||
|
*** POTENTIAL INCOMPATIBILITY ***
|
||||||
|
|
||||||
|
2020-09-29 (bug)[0063cb] http::geturl -headers must be dict (oehlmann,nijtmans)
|
||||||
|
|
||||||
|
2020-10-19 (bug)[cb4582] Update install-sh script (stu,nijtmans)
|
||||||
|
|
||||||
|
2020-10-22 (bug)[c97593] Usage of gnu_printf in latest mingw-w64 (nijtmans)
|
||||||
|
|
||||||
|
2020-10-26 (new)[48898a] improve error message consistency (stu)
|
||||||
|
*** POTENTIAL INCOMPATIBILITY ***
|
||||||
|
|
||||||
|
2020-11-06 (new) revised case of module names (nijtmans)
|
||||||
|
*** POTENTIAL INCOMPATIBILITY ***
|
||||||
|
|
||||||
|
2020-12-10 (bug)[ed5be7] Win: recognize "comx:" as serial port (oehlmann)
|
||||||
|
|
||||||
|
2020-12-11 (new) support for msys2, Big Sur (nijtmans)
|
||||||
|
=> platform 1.0.15
|
||||||
|
|
||||||
|
2020-12-23 tzdata updated to Olson's tzdata2020e (jima)
|
||||||
|
|
||||||
|
- Released 8.6.11, Dec 31, 2020 - details at http://core.tcl-lang.org/tcl/ -
|
||||||
|
|||||||
@@ -217,7 +217,7 @@ fake_getaddrinfo(const char *hostname, const char *servname,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!hostname) {
|
if (!hostname) {
|
||||||
*res = malloc_ai(port, htonl(0x7f000001), hints);
|
*res = malloc_ai(port, htonl(0x7F000001), hints);
|
||||||
if (*res == NULL)
|
if (*res == NULL)
|
||||||
return (EAI_MEMORY);
|
return (EAI_MEMORY);
|
||||||
return (0);
|
return (0);
|
||||||
|
|||||||
@@ -21,10 +21,11 @@ gettimeofday(
|
|||||||
struct timezone *tz)
|
struct timezone *tz)
|
||||||
{
|
{
|
||||||
struct timeb t;
|
struct timeb t;
|
||||||
|
(void)tz;
|
||||||
|
|
||||||
ftime(&t);
|
ftime(&t);
|
||||||
tp->tv_sec = t.time;
|
tp->tv_sec = t.time;
|
||||||
tp->tv_usec = t. millitm * 1000;
|
tp->tv_usec = t.millitm * 1000;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ mkstemp(
|
|||||||
{
|
{
|
||||||
static const char alphanumerics[] =
|
static const char alphanumerics[] =
|
||||||
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
||||||
register char *a, *b;
|
char *a, *b;
|
||||||
int fd, count, alphanumericsLen = strlen(alphanumerics); /* == 62 */
|
int fd, count, alphanumericsLen = strlen(alphanumerics); /* == 62 */
|
||||||
|
|
||||||
a = template + strlen(template);
|
a = template + strlen(template);
|
||||||
|
|||||||
@@ -20,9 +20,9 @@ DIR *
|
|||||||
opendir(
|
opendir(
|
||||||
char *name)
|
char *name)
|
||||||
{
|
{
|
||||||
register DIR *dirp;
|
DIR *dirp;
|
||||||
register int fd;
|
int fd;
|
||||||
char *myname;
|
const char *myname;
|
||||||
|
|
||||||
myname = ((*name == '\0') ? "." : name);
|
myname = ((*name == '\0') ? "." : name);
|
||||||
if ((fd = open(myname, 0, 0)) == -1) {
|
if ((fd = open(myname, 0, 0)) == -1) {
|
||||||
@@ -65,9 +65,9 @@ struct olddirect {
|
|||||||
|
|
||||||
struct dirent *
|
struct dirent *
|
||||||
readdir(
|
readdir(
|
||||||
register DIR *dirp)
|
DIR *dirp)
|
||||||
{
|
{
|
||||||
register struct olddirect *dp;
|
struct olddirect *dp;
|
||||||
static struct dirent dir;
|
static struct dirent dir;
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
@@ -101,10 +101,10 @@ readdir(
|
|||||||
|
|
||||||
void
|
void
|
||||||
closedir(
|
closedir(
|
||||||
register DIR *dirp)
|
DIR *dirp)
|
||||||
{
|
{
|
||||||
close(dirp->dd_fd);
|
close(dirp->dd_fd);
|
||||||
dirp->dd_fd = -1;
|
dirp->dd_fd = -1;
|
||||||
dirp->dd_loc = 0;
|
dirp->dd_loc = 0;
|
||||||
ckfree((char *) dirp);
|
ckfree((char *)dirp);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,10 +36,10 @@
|
|||||||
|
|
||||||
char *
|
char *
|
||||||
strstr(
|
strstr(
|
||||||
register char *string, /* String to search. */
|
const char *string, /* String to search. */
|
||||||
char *substring) /* Substring to try to find in string. */
|
const char *substring) /* Substring to try to find in string. */
|
||||||
{
|
{
|
||||||
register char *a, *b;
|
const char *a, *b;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* First scan quickly through the two strings looking for a
|
* First scan quickly through the two strings looking for a
|
||||||
@@ -49,7 +49,7 @@ strstr(
|
|||||||
|
|
||||||
b = substring;
|
b = substring;
|
||||||
if (*b == 0) {
|
if (*b == 0) {
|
||||||
return string;
|
return (char *)string;
|
||||||
}
|
}
|
||||||
for ( ; *string != 0; string += 1) {
|
for ( ; *string != 0; string += 1) {
|
||||||
if (*string != *b) {
|
if (*string != *b) {
|
||||||
@@ -58,7 +58,7 @@ strstr(
|
|||||||
a = string;
|
a = string;
|
||||||
while (1) {
|
while (1) {
|
||||||
if (*b == 0) {
|
if (*b == 0) {
|
||||||
return string;
|
return (char *)string;
|
||||||
}
|
}
|
||||||
if (*a++ != *b++) {
|
if (*a++ != *b++) {
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ strtol(
|
|||||||
* hex, "0" means octal, anything else means
|
* hex, "0" means octal, anything else means
|
||||||
* decimal. */
|
* decimal. */
|
||||||
{
|
{
|
||||||
register const char *p;
|
const char *p;
|
||||||
long result;
|
long result;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -62,9 +62,9 @@ strtoul(
|
|||||||
* hex, "0" means octal, anything else means
|
* hex, "0" means octal, anything else means
|
||||||
* decimal. */
|
* decimal. */
|
||||||
{
|
{
|
||||||
register const char *p;
|
const char *p;
|
||||||
register unsigned long int result = 0;
|
unsigned long int result = 0;
|
||||||
register unsigned digit;
|
unsigned digit;
|
||||||
int anyDigits = 0;
|
int anyDigits = 0;
|
||||||
int negative=0;
|
int negative=0;
|
||||||
int overflow=0;
|
int overflow=0;
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ waitpid(
|
|||||||
int options) /* OR'ed combination of WNOHANG and
|
int options) /* OR'ed combination of WNOHANG and
|
||||||
* WUNTRACED. */
|
* WUNTRACED. */
|
||||||
{
|
{
|
||||||
register WaitInfo *waitPtr, *prevPtr;
|
WaitInfo *waitPtr, *prevPtr;
|
||||||
pid_t result;
|
pid_t result;
|
||||||
WAIT_STATUS_TYPE status;
|
WAIT_STATUS_TYPE status;
|
||||||
|
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ static int decrypt_byte(unsigned long* pkeys, const z_crc_t* pcrc_32_tab)
|
|||||||
unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an
|
unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an
|
||||||
* unpredictable manner on 16-bit systems; not a problem
|
* unpredictable manner on 16-bit systems; not a problem
|
||||||
* with any known compiler so far, though */
|
* with any known compiler so far, though */
|
||||||
|
(void)pcrc_32_tab;
|
||||||
|
|
||||||
temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2;
|
temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2;
|
||||||
return (int)(((temp * (temp ^ 1)) >> 8) & 0xff);
|
return (int)(((temp * (temp ^ 1)) >> 8) & 0xff);
|
||||||
@@ -51,7 +52,7 @@ static int update_keys(unsigned long* pkeys,const z_crc_t* pcrc_32_tab,int c)
|
|||||||
(*(pkeys+1)) += (*(pkeys+0)) & 0xff;
|
(*(pkeys+1)) += (*(pkeys+0)) & 0xff;
|
||||||
(*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1;
|
(*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1;
|
||||||
{
|
{
|
||||||
register int keyshift = (int)((*(pkeys+1)) >> 24);
|
int keyshift = (int)((*(pkeys+1)) >> 24);
|
||||||
(*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift);
|
(*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift);
|
||||||
}
|
}
|
||||||
return c;
|
return c;
|
||||||
|
|||||||
@@ -14,7 +14,11 @@
|
|||||||
#define _CRT_SECURE_NO_WARNINGS
|
#define _CRT_SECURE_NO_WARNINGS
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__APPLE__) || defined(IOAPI_NO_64)
|
#if defined(_WIN32)
|
||||||
|
#define FOPEN_FUNC(filename, mode) fopen(filename, mode)
|
||||||
|
#define FTELLO_FUNC(stream) _ftelli64(stream)
|
||||||
|
#define FSEEKO_FUNC(stream, offset, origin) _fseeki64(stream, offset, origin)
|
||||||
|
#elif defined(__APPLE__) || defined(IOAPI_NO_64)
|
||||||
// In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions
|
// In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions
|
||||||
#define FOPEN_FUNC(filename, mode) fopen(filename, mode)
|
#define FOPEN_FUNC(filename, mode) fopen(filename, mode)
|
||||||
#define FTELLO_FUNC(stream) ftello(stream)
|
#define FTELLO_FUNC(stream) ftello(stream)
|
||||||
|
|||||||
@@ -97,7 +97,7 @@ void change_file_date(filename,dosdate,tmu_date)
|
|||||||
SetFileTime(hFile,&ftm,&ftLastAcc,&ftm);
|
SetFileTime(hFile,&ftm,&ftLastAcc,&ftm);
|
||||||
CloseHandle(hFile);
|
CloseHandle(hFile);
|
||||||
#else
|
#else
|
||||||
#ifdef unix || __APPLE__
|
#if defined(unix) || defined(__APPLE__)
|
||||||
struct utimbuf ut;
|
struct utimbuf ut;
|
||||||
struct tm newdate;
|
struct tm newdate;
|
||||||
newdate.tm_sec = tmu_date.tm_sec;
|
newdate.tm_sec = tmu_date.tm_sec;
|
||||||
|
|||||||
@@ -12,7 +12,6 @@
|
|||||||
Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
|
Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__))
|
#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__))
|
||||||
#ifndef __USE_FILE_OFFSET64
|
#ifndef __USE_FILE_OFFSET64
|
||||||
#define __USE_FILE_OFFSET64
|
#define __USE_FILE_OFFSET64
|
||||||
@@ -28,7 +27,11 @@
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#if defined(_WIN32)
|
||||||
|
#define FOPEN_FUNC(filename, mode) fopen(filename, mode)
|
||||||
|
#define FTELLO_FUNC(stream) _ftelli64(stream)
|
||||||
|
#define FSEEKO_FUNC(stream, offset, origin) _fseeki64(stream, offset, origin)
|
||||||
|
#elif defined(__APPLE__) || defined(IOAPI_NO_64)
|
||||||
// In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions
|
// In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions
|
||||||
#define FOPEN_FUNC(filename, mode) fopen(filename, mode)
|
#define FOPEN_FUNC(filename, mode) fopen(filename, mode)
|
||||||
#define FTELLO_FUNC(stream) ftello(stream)
|
#define FTELLO_FUNC(stream) ftello(stream)
|
||||||
@@ -39,8 +42,7 @@
|
|||||||
#define FSEEKO_FUNC(stream, offset, origin) fseeko64(stream, offset, origin)
|
#define FSEEKO_FUNC(stream, offset, origin) fseeko64(stream, offset, origin)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "tinydir.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -72,8 +74,8 @@
|
|||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
uLong filetime(f, tmzip, dt)
|
uLong filetime(f, tmzip, dt)
|
||||||
char *f; /* name of file to get info on */
|
const char *f; /* name of file to get info on */
|
||||||
tm_zip *tmzip; /* return value: access, modific. and creation times */
|
tm_zip *tmzip; /* return value: access, modific. and creation times */
|
||||||
uLong *dt; /* dostime */
|
uLong *dt; /* dostime */
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
@@ -94,9 +96,9 @@ uLong filetime(f, tmzip, dt)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
#ifdef unix || __APPLE__
|
#if defined(unix) || defined(__APPLE__)
|
||||||
uLong filetime(f, tmzip, dt)
|
uLong filetime(f, tmzip, dt)
|
||||||
char *f; /* name of file to get info on */
|
const char *f; /* name of file to get info on */
|
||||||
tm_zip *tmzip; /* return value: access, modific. and creation times */
|
tm_zip *tmzip; /* return value: access, modific. and creation times */
|
||||||
uLong *dt; /* dostime */
|
uLong *dt; /* dostime */
|
||||||
{
|
{
|
||||||
@@ -138,8 +140,8 @@ uLong filetime(f, tmzip, dt)
|
|||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
uLong filetime(f, tmzip, dt)
|
uLong filetime(f, tmzip, dt)
|
||||||
char *f; /* name of file to get info on */
|
const char *f; /* name of file to get info on */
|
||||||
tm_zip *tmzip; /* return value: access, modific. and creation times */
|
tm_zip *tmzip; /* return value: access, modific. and creation times */
|
||||||
uLong *dt; /* dostime */
|
uLong *dt; /* dostime */
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
@@ -172,6 +174,7 @@ void do_banner()
|
|||||||
void do_help()
|
void do_help()
|
||||||
{
|
{
|
||||||
printf("Usage : minizip [-o] [-a] [-0 to -9] [-p password] [-j] file.zip [files_to_add]\n\n" \
|
printf("Usage : minizip [-o] [-a] [-0 to -9] [-p password] [-j] file.zip [files_to_add]\n\n" \
|
||||||
|
" -r Scan directories recursively\n" \
|
||||||
" -o Overwrite existing file.zip\n" \
|
" -o Overwrite existing file.zip\n" \
|
||||||
" -a Append to existing file.zip\n" \
|
" -a Append to existing file.zip\n" \
|
||||||
" -0 Store only\n" \
|
" -0 Store only\n" \
|
||||||
@@ -243,12 +246,153 @@ int isLargeFile(const char* filename)
|
|||||||
return largeFile;
|
return largeFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void addFileToZip(zipFile zf, const char *filenameinzip, const char *password, int opt_exclude_path,int opt_compress_level) {
|
||||||
|
FILE * fin;
|
||||||
|
int size_read;
|
||||||
|
const char *savefilenameinzip;
|
||||||
|
zip_fileinfo zi;
|
||||||
|
unsigned long crcFile=0;
|
||||||
|
int zip64 = 0;
|
||||||
|
int err=0;
|
||||||
|
int size_buf=WRITEBUFFERSIZE;
|
||||||
|
unsigned char buf[WRITEBUFFERSIZE];
|
||||||
|
zi.tmz_date.tm_sec = zi.tmz_date.tm_min = zi.tmz_date.tm_hour =
|
||||||
|
zi.tmz_date.tm_mday = zi.tmz_date.tm_mon = zi.tmz_date.tm_year = 0;
|
||||||
|
zi.dosDate = 0;
|
||||||
|
zi.internal_fa = 0;
|
||||||
|
zi.external_fa = 0;
|
||||||
|
filetime(filenameinzip,&zi.tmz_date,&zi.dosDate);
|
||||||
|
|
||||||
|
/*
|
||||||
|
err = zipOpenNewFileInZip(zf,filenameinzip,&zi,
|
||||||
|
NULL,0,NULL,0,NULL / * comment * /,
|
||||||
|
(opt_compress_level != 0) ? Z_DEFLATED : 0,
|
||||||
|
opt_compress_level);
|
||||||
|
*/
|
||||||
|
if ((password != NULL) && (err==ZIP_OK))
|
||||||
|
err = getFileCrc(filenameinzip,buf,size_buf,&crcFile);
|
||||||
|
|
||||||
|
zip64 = isLargeFile(filenameinzip);
|
||||||
|
|
||||||
|
/* The path name saved, should not include a leading slash. */
|
||||||
|
/*if it did, windows/xp and dynazip couldn't read the zip file. */
|
||||||
|
savefilenameinzip = filenameinzip;
|
||||||
|
while( savefilenameinzip[0] == '\\' || savefilenameinzip[0] == '/' )
|
||||||
|
{
|
||||||
|
savefilenameinzip++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*should the zip file contain any path at all?*/
|
||||||
|
if( opt_exclude_path )
|
||||||
|
{
|
||||||
|
const char *tmpptr;
|
||||||
|
const char *lastslash = 0;
|
||||||
|
for( tmpptr = savefilenameinzip; *tmpptr; tmpptr++)
|
||||||
|
{
|
||||||
|
if( *tmpptr == '\\' || *tmpptr == '/')
|
||||||
|
{
|
||||||
|
lastslash = tmpptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( lastslash != NULL )
|
||||||
|
{
|
||||||
|
savefilenameinzip = lastslash+1; // base filename follows last slash.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**/
|
||||||
|
err = zipOpenNewFileInZip3_64(zf,savefilenameinzip,&zi,
|
||||||
|
NULL,0,NULL,0,NULL /* comment*/,
|
||||||
|
(opt_compress_level != 0) ? Z_DEFLATED : 0,
|
||||||
|
opt_compress_level,0,
|
||||||
|
/* -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, */
|
||||||
|
-MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY,
|
||||||
|
password,crcFile, zip64);
|
||||||
|
|
||||||
|
if (err != ZIP_OK)
|
||||||
|
printf("error in opening %s in zipfile\n",filenameinzip);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fin = FOPEN_FUNC(filenameinzip,"rb");
|
||||||
|
if (fin==NULL)
|
||||||
|
{
|
||||||
|
err=ZIP_ERRNO;
|
||||||
|
printf("error in opening %s for reading\n",filenameinzip);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (err == ZIP_OK)
|
||||||
|
do
|
||||||
|
{
|
||||||
|
err = ZIP_OK;
|
||||||
|
size_read = (int)fread(buf,1,size_buf,fin);
|
||||||
|
if (size_read < size_buf)
|
||||||
|
if (feof(fin)==0)
|
||||||
|
{
|
||||||
|
printf("error in reading %s\n",filenameinzip);
|
||||||
|
err = ZIP_ERRNO;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (size_read>0)
|
||||||
|
{
|
||||||
|
err = zipWriteInFileInZip (zf,buf,size_read);
|
||||||
|
if (err<0)
|
||||||
|
{
|
||||||
|
printf("error in writing %s in the zipfile\n",
|
||||||
|
filenameinzip);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
} while ((err == ZIP_OK) && (size_read>0));
|
||||||
|
|
||||||
|
if (fin)
|
||||||
|
fclose(fin);
|
||||||
|
|
||||||
|
if (err<0)
|
||||||
|
err=ZIP_ERRNO;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
err = zipCloseFileInZip(zf);
|
||||||
|
if (err!=ZIP_OK)
|
||||||
|
printf("error in closing %s in the zipfile\n",
|
||||||
|
filenameinzip);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void addPathToZip(zipFile zf, const char *filenameinzip, const char *password, int opt_exclude_path,int opt_compress_level) {
|
||||||
|
tinydir_dir dir;
|
||||||
|
int i;
|
||||||
|
char newname[512];
|
||||||
|
|
||||||
|
tinydir_open_sorted(&dir, filenameinzip);
|
||||||
|
|
||||||
|
for (i = 0; i < dir.n_files; i++)
|
||||||
|
{
|
||||||
|
tinydir_file file;
|
||||||
|
tinydir_readfile_n(&dir, &file, i);
|
||||||
|
if(strcmp(file.name,".")==0) continue;
|
||||||
|
if(strcmp(file.name,"..")==0) continue;
|
||||||
|
sprintf(newname,"%s/%s",dir.path,file.name);
|
||||||
|
if (file.is_dir)
|
||||||
|
{
|
||||||
|
addPathToZip(zf,newname,password,opt_exclude_path,opt_compress_level);
|
||||||
|
} else {
|
||||||
|
addFileToZip(zf,newname,password,opt_exclude_path,opt_compress_level);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tinydir_close(&dir);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int main(argc,argv)
|
int main(argc,argv)
|
||||||
int argc;
|
int argc;
|
||||||
char *argv[];
|
char *argv[];
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int opt_overwrite=0;
|
int opt_recursive=0;
|
||||||
|
int opt_overwrite=1;
|
||||||
int opt_compress_level=Z_DEFAULT_COMPRESSION;
|
int opt_compress_level=Z_DEFAULT_COMPRESSION;
|
||||||
int opt_exclude_path=0;
|
int opt_exclude_path=0;
|
||||||
int zipfilenamearg = 0;
|
int zipfilenamearg = 0;
|
||||||
@@ -285,7 +429,8 @@ int main(argc,argv)
|
|||||||
opt_compress_level = c-'0';
|
opt_compress_level = c-'0';
|
||||||
if ((c=='j') || (c=='J'))
|
if ((c=='j') || (c=='J'))
|
||||||
opt_exclude_path = 1;
|
opt_exclude_path = 1;
|
||||||
|
if ((c=='r') || (c=='R'))
|
||||||
|
opt_recursive = 1;
|
||||||
if (((c=='p') || (c=='P')) && (i+1<argc))
|
if (((c=='p') || (c=='P')) && (i+1<argc))
|
||||||
{
|
{
|
||||||
password=argv[i+1];
|
password=argv[i+1];
|
||||||
@@ -392,117 +537,14 @@ int main(argc,argv)
|
|||||||
((argv[i][1]=='o') || (argv[i][1]=='O') ||
|
((argv[i][1]=='o') || (argv[i][1]=='O') ||
|
||||||
(argv[i][1]=='a') || (argv[i][1]=='A') ||
|
(argv[i][1]=='a') || (argv[i][1]=='A') ||
|
||||||
(argv[i][1]=='p') || (argv[i][1]=='P') ||
|
(argv[i][1]=='p') || (argv[i][1]=='P') ||
|
||||||
|
(argv[i][1]=='r') || (argv[i][1]=='R') ||
|
||||||
((argv[i][1]>='0') || (argv[i][1]<='9'))) &&
|
((argv[i][1]>='0') || (argv[i][1]<='9'))) &&
|
||||||
(strlen(argv[i]) == 2)))
|
(strlen(argv[i]) == 2)))
|
||||||
{
|
{
|
||||||
FILE * fin;
|
if(opt_recursive) {
|
||||||
int size_read;
|
addPathToZip(zf,argv[i],password,opt_exclude_path,opt_compress_level);
|
||||||
const char* filenameinzip = argv[i];
|
} else {
|
||||||
const char *savefilenameinzip;
|
addFileToZip(zf,argv[i],password,opt_exclude_path,opt_compress_level);
|
||||||
zip_fileinfo zi;
|
|
||||||
unsigned long crcFile=0;
|
|
||||||
int zip64 = 0;
|
|
||||||
|
|
||||||
zi.tmz_date.tm_sec = zi.tmz_date.tm_min = zi.tmz_date.tm_hour =
|
|
||||||
zi.tmz_date.tm_mday = zi.tmz_date.tm_mon = zi.tmz_date.tm_year = 0;
|
|
||||||
zi.dosDate = 0;
|
|
||||||
zi.internal_fa = 0;
|
|
||||||
zi.external_fa = 0;
|
|
||||||
filetime(filenameinzip,&zi.tmz_date,&zi.dosDate);
|
|
||||||
|
|
||||||
/*
|
|
||||||
err = zipOpenNewFileInZip(zf,filenameinzip,&zi,
|
|
||||||
NULL,0,NULL,0,NULL / * comment * /,
|
|
||||||
(opt_compress_level != 0) ? Z_DEFLATED : 0,
|
|
||||||
opt_compress_level);
|
|
||||||
*/
|
|
||||||
if ((password != NULL) && (err==ZIP_OK))
|
|
||||||
err = getFileCrc(filenameinzip,buf,size_buf,&crcFile);
|
|
||||||
|
|
||||||
zip64 = isLargeFile(filenameinzip);
|
|
||||||
|
|
||||||
/* The path name saved, should not include a leading slash. */
|
|
||||||
/*if it did, windows/xp and dynazip couldn't read the zip file. */
|
|
||||||
savefilenameinzip = filenameinzip;
|
|
||||||
while( savefilenameinzip[0] == '\\' || savefilenameinzip[0] == '/' )
|
|
||||||
{
|
|
||||||
savefilenameinzip++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*should the zip file contain any path at all?*/
|
|
||||||
if( opt_exclude_path )
|
|
||||||
{
|
|
||||||
const char *tmpptr;
|
|
||||||
const char *lastslash = 0;
|
|
||||||
for( tmpptr = savefilenameinzip; *tmpptr; tmpptr++)
|
|
||||||
{
|
|
||||||
if( *tmpptr == '\\' || *tmpptr == '/')
|
|
||||||
{
|
|
||||||
lastslash = tmpptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if( lastslash != NULL )
|
|
||||||
{
|
|
||||||
savefilenameinzip = lastslash+1; // base filename follows last slash.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**/
|
|
||||||
err = zipOpenNewFileInZip3_64(zf,savefilenameinzip,&zi,
|
|
||||||
NULL,0,NULL,0,NULL /* comment*/,
|
|
||||||
(opt_compress_level != 0) ? Z_DEFLATED : 0,
|
|
||||||
opt_compress_level,0,
|
|
||||||
/* -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, */
|
|
||||||
-MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY,
|
|
||||||
password,crcFile, zip64);
|
|
||||||
|
|
||||||
if (err != ZIP_OK)
|
|
||||||
printf("error in opening %s in zipfile\n",filenameinzip);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
fin = FOPEN_FUNC(filenameinzip,"rb");
|
|
||||||
if (fin==NULL)
|
|
||||||
{
|
|
||||||
err=ZIP_ERRNO;
|
|
||||||
printf("error in opening %s for reading\n",filenameinzip);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (err == ZIP_OK)
|
|
||||||
do
|
|
||||||
{
|
|
||||||
err = ZIP_OK;
|
|
||||||
size_read = (int)fread(buf,1,size_buf,fin);
|
|
||||||
if (size_read < size_buf)
|
|
||||||
if (feof(fin)==0)
|
|
||||||
{
|
|
||||||
printf("error in reading %s\n",filenameinzip);
|
|
||||||
err = ZIP_ERRNO;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (size_read>0)
|
|
||||||
{
|
|
||||||
err = zipWriteInFileInZip (zf,buf,size_read);
|
|
||||||
if (err<0)
|
|
||||||
{
|
|
||||||
printf("error in writing %s in the zipfile\n",
|
|
||||||
filenameinzip);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
} while ((err == ZIP_OK) && (size_read>0));
|
|
||||||
|
|
||||||
if (fin)
|
|
||||||
fclose(fin);
|
|
||||||
|
|
||||||
if (err<0)
|
|
||||||
err=ZIP_ERRNO;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
err = zipCloseFileInZip(zf);
|
|
||||||
if (err!=ZIP_OK)
|
|
||||||
printf("error in closing %s in the zipfile\n",
|
|
||||||
filenameinzip);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
816
compat/zlib/contrib/minizip/tinydir.h
Normal file
816
compat/zlib/contrib/minizip/tinydir.h
Normal file
@@ -0,0 +1,816 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2013-2017, tinydir authors:
|
||||||
|
- Cong Xu
|
||||||
|
- Lautis Sun
|
||||||
|
- Baudouin Feildel
|
||||||
|
- Andargor <andargor@yahoo.com>
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer.
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||||
|
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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.
|
||||||
|
*/
|
||||||
|
#ifndef TINYDIR_H
|
||||||
|
#define TINYDIR_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if ((defined _UNICODE) && !(defined UNICODE))
|
||||||
|
#define UNICODE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if ((defined UNICODE) && !(defined _UNICODE))
|
||||||
|
#define _UNICODE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
# define WIN32_LEAN_AND_MEAN
|
||||||
|
# include <windows.h>
|
||||||
|
# include <tchar.h>
|
||||||
|
# pragma warning(push)
|
||||||
|
# pragma warning (disable : 4996)
|
||||||
|
#else
|
||||||
|
# include <dirent.h>
|
||||||
|
# include <libgen.h>
|
||||||
|
# include <sys/stat.h>
|
||||||
|
# include <stddef.h>
|
||||||
|
#endif
|
||||||
|
#ifdef __MINGW32__
|
||||||
|
# include <tchar.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* types */
|
||||||
|
|
||||||
|
/* Windows UNICODE wide character support */
|
||||||
|
#if defined _MSC_VER || defined __MINGW32__
|
||||||
|
# define _tinydir_char_t TCHAR
|
||||||
|
# define TINYDIR_STRING(s) _TEXT(s)
|
||||||
|
# define _tinydir_strlen _tcslen
|
||||||
|
# define _tinydir_strcpy _tcscpy
|
||||||
|
# define _tinydir_strcat _tcscat
|
||||||
|
# define _tinydir_strcmp _tcscmp
|
||||||
|
# define _tinydir_strrchr _tcsrchr
|
||||||
|
# define _tinydir_strncmp _tcsncmp
|
||||||
|
#else
|
||||||
|
# define _tinydir_char_t char
|
||||||
|
# define TINYDIR_STRING(s) s
|
||||||
|
# define _tinydir_strlen strlen
|
||||||
|
# define _tinydir_strcpy strcpy
|
||||||
|
# define _tinydir_strcat strcat
|
||||||
|
# define _tinydir_strcmp strcmp
|
||||||
|
# define _tinydir_strrchr strrchr
|
||||||
|
# define _tinydir_strncmp strncmp
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined _MSC_VER || defined __MINGW32__)
|
||||||
|
# include <windows.h>
|
||||||
|
# define _TINYDIR_PATH_MAX MAX_PATH
|
||||||
|
#elif defined __linux__
|
||||||
|
# include <limits.h>
|
||||||
|
# define _TINYDIR_PATH_MAX PATH_MAX
|
||||||
|
#elif defined(__unix__) || (defined(__APPLE__) && defined(__MACH__))
|
||||||
|
# include <sys/param.h>
|
||||||
|
# if defined(BSD)
|
||||||
|
# include <limits.h>
|
||||||
|
# define _TINYDIR_PATH_MAX PATH_MAX
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _TINYDIR_PATH_MAX
|
||||||
|
#define _TINYDIR_PATH_MAX 4096
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
/* extra chars for the "\\*" mask */
|
||||||
|
# define _TINYDIR_PATH_EXTRA 2
|
||||||
|
#else
|
||||||
|
# define _TINYDIR_PATH_EXTRA 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define _TINYDIR_FILENAME_MAX 256
|
||||||
|
|
||||||
|
#if (defined _MSC_VER || defined __MINGW32__)
|
||||||
|
#define _TINYDIR_DRIVE_MAX 3
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
# define _TINYDIR_FUNC static __inline
|
||||||
|
#elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L
|
||||||
|
# define _TINYDIR_FUNC static __inline__
|
||||||
|
#else
|
||||||
|
# define _TINYDIR_FUNC static inline
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* readdir_r usage; define TINYDIR_USE_READDIR_R to use it (if supported) */
|
||||||
|
#ifdef TINYDIR_USE_READDIR_R
|
||||||
|
|
||||||
|
/* readdir_r is a POSIX-only function, and may not be available under various
|
||||||
|
* environments/settings, e.g. MinGW. Use readdir fallback */
|
||||||
|
#if _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _BSD_SOURCE || _SVID_SOURCE ||\
|
||||||
|
_POSIX_SOURCE
|
||||||
|
# define _TINYDIR_HAS_READDIR_R
|
||||||
|
#endif
|
||||||
|
#if _POSIX_C_SOURCE >= 200112L
|
||||||
|
# define _TINYDIR_HAS_FPATHCONF
|
||||||
|
# include <unistd.h>
|
||||||
|
#endif
|
||||||
|
#if _BSD_SOURCE || _SVID_SOURCE || \
|
||||||
|
(_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700)
|
||||||
|
# define _TINYDIR_HAS_DIRFD
|
||||||
|
# include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#if defined _TINYDIR_HAS_FPATHCONF && defined _TINYDIR_HAS_DIRFD &&\
|
||||||
|
defined _PC_NAME_MAX
|
||||||
|
# define _TINYDIR_USE_FPATHCONF
|
||||||
|
#endif
|
||||||
|
#if defined __MINGW32__ || !defined _TINYDIR_HAS_READDIR_R ||\
|
||||||
|
!(defined _TINYDIR_USE_FPATHCONF || defined NAME_MAX)
|
||||||
|
# define _TINYDIR_USE_READDIR
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Use readdir by default */
|
||||||
|
#else
|
||||||
|
# define _TINYDIR_USE_READDIR
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* MINGW32 has two versions of dirent, ASCII and UNICODE*/
|
||||||
|
#ifndef _MSC_VER
|
||||||
|
#if (defined __MINGW32__) && (defined _UNICODE)
|
||||||
|
#define _TINYDIR_DIR _WDIR
|
||||||
|
#define _tinydir_dirent _wdirent
|
||||||
|
#define _tinydir_opendir _wopendir
|
||||||
|
#define _tinydir_readdir _wreaddir
|
||||||
|
#define _tinydir_closedir _wclosedir
|
||||||
|
#else
|
||||||
|
#define _TINYDIR_DIR DIR
|
||||||
|
#define _tinydir_dirent dirent
|
||||||
|
#define _tinydir_opendir opendir
|
||||||
|
#define _tinydir_readdir readdir
|
||||||
|
#define _tinydir_closedir closedir
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Allow user to use a custom allocator by defining _TINYDIR_MALLOC and _TINYDIR_FREE. */
|
||||||
|
#if defined(_TINYDIR_MALLOC) && defined(_TINYDIR_FREE)
|
||||||
|
#elif !defined(_TINYDIR_MALLOC) && !defined(_TINYDIR_FREE)
|
||||||
|
#else
|
||||||
|
#error "Either define both alloc and free or none of them!"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(_TINYDIR_MALLOC)
|
||||||
|
#define _TINYDIR_MALLOC(_size) malloc(_size)
|
||||||
|
#define _TINYDIR_FREE(_ptr) free(_ptr)
|
||||||
|
#endif /* !defined(_TINYDIR_MALLOC) */
|
||||||
|
|
||||||
|
typedef struct tinydir_file
|
||||||
|
{
|
||||||
|
_tinydir_char_t path[_TINYDIR_PATH_MAX];
|
||||||
|
_tinydir_char_t name[_TINYDIR_FILENAME_MAX];
|
||||||
|
_tinydir_char_t *extension;
|
||||||
|
int is_dir;
|
||||||
|
int is_reg;
|
||||||
|
|
||||||
|
#ifndef _MSC_VER
|
||||||
|
#ifdef __MINGW32__
|
||||||
|
struct _stat _s;
|
||||||
|
#else
|
||||||
|
struct stat _s;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
} tinydir_file;
|
||||||
|
|
||||||
|
typedef struct tinydir_dir
|
||||||
|
{
|
||||||
|
_tinydir_char_t path[_TINYDIR_PATH_MAX];
|
||||||
|
int has_next;
|
||||||
|
size_t n_files;
|
||||||
|
|
||||||
|
tinydir_file *_files;
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
HANDLE _h;
|
||||||
|
WIN32_FIND_DATA _f;
|
||||||
|
#else
|
||||||
|
_TINYDIR_DIR *_d;
|
||||||
|
struct _tinydir_dirent *_e;
|
||||||
|
#ifndef _TINYDIR_USE_READDIR
|
||||||
|
struct _tinydir_dirent *_ep;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
} tinydir_dir;
|
||||||
|
|
||||||
|
|
||||||
|
/* declarations */
|
||||||
|
|
||||||
|
_TINYDIR_FUNC
|
||||||
|
int tinydir_open(tinydir_dir *dir, const _tinydir_char_t *path);
|
||||||
|
_TINYDIR_FUNC
|
||||||
|
int tinydir_open_sorted(tinydir_dir *dir, const _tinydir_char_t *path);
|
||||||
|
_TINYDIR_FUNC
|
||||||
|
void tinydir_close(tinydir_dir *dir);
|
||||||
|
|
||||||
|
_TINYDIR_FUNC
|
||||||
|
int tinydir_next(tinydir_dir *dir);
|
||||||
|
_TINYDIR_FUNC
|
||||||
|
int tinydir_readfile(const tinydir_dir *dir, tinydir_file *file);
|
||||||
|
_TINYDIR_FUNC
|
||||||
|
int tinydir_readfile_n(const tinydir_dir *dir, tinydir_file *file, size_t i);
|
||||||
|
_TINYDIR_FUNC
|
||||||
|
int tinydir_open_subdir_n(tinydir_dir *dir, size_t i);
|
||||||
|
|
||||||
|
_TINYDIR_FUNC
|
||||||
|
int tinydir_file_open(tinydir_file *file, const _tinydir_char_t *path);
|
||||||
|
_TINYDIR_FUNC
|
||||||
|
void _tinydir_get_ext(tinydir_file *file);
|
||||||
|
_TINYDIR_FUNC
|
||||||
|
int _tinydir_file_cmp(const void *a, const void *b);
|
||||||
|
#ifndef _MSC_VER
|
||||||
|
#ifndef _TINYDIR_USE_READDIR
|
||||||
|
_TINYDIR_FUNC
|
||||||
|
size_t _tinydir_dirent_buf_size(_TINYDIR_DIR *dirp);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* definitions*/
|
||||||
|
|
||||||
|
_TINYDIR_FUNC
|
||||||
|
int tinydir_open(tinydir_dir *dir, const _tinydir_char_t *path)
|
||||||
|
{
|
||||||
|
#ifndef _MSC_VER
|
||||||
|
#ifndef _TINYDIR_USE_READDIR
|
||||||
|
int error;
|
||||||
|
int size; /* using int size */
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
_tinydir_char_t path_buf[_TINYDIR_PATH_MAX];
|
||||||
|
#endif
|
||||||
|
_tinydir_char_t *pathp;
|
||||||
|
|
||||||
|
if (dir == NULL || path == NULL || _tinydir_strlen(path) == 0)
|
||||||
|
{
|
||||||
|
errno = EINVAL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (_tinydir_strlen(path) + _TINYDIR_PATH_EXTRA >= _TINYDIR_PATH_MAX)
|
||||||
|
{
|
||||||
|
errno = ENAMETOOLONG;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* initialise dir */
|
||||||
|
dir->_files = NULL;
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
dir->_h = INVALID_HANDLE_VALUE;
|
||||||
|
#else
|
||||||
|
dir->_d = NULL;
|
||||||
|
#ifndef _TINYDIR_USE_READDIR
|
||||||
|
dir->_ep = NULL;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
tinydir_close(dir);
|
||||||
|
|
||||||
|
_tinydir_strcpy(dir->path, path);
|
||||||
|
/* Remove trailing slashes */
|
||||||
|
pathp = &dir->path[_tinydir_strlen(dir->path) - 1];
|
||||||
|
while (pathp != dir->path && (*pathp == TINYDIR_STRING('\\') || *pathp == TINYDIR_STRING('/')))
|
||||||
|
{
|
||||||
|
*pathp = TINYDIR_STRING('\0');
|
||||||
|
pathp++;
|
||||||
|
}
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
_tinydir_strcpy(path_buf, dir->path);
|
||||||
|
_tinydir_strcat(path_buf, TINYDIR_STRING("\\*"));
|
||||||
|
#if (defined WINAPI_FAMILY) && (WINAPI_FAMILY != WINAPI_FAMILY_DESKTOP_APP)
|
||||||
|
dir->_h = FindFirstFileEx(path_buf, FindExInfoStandard, &dir->_f, FindExSearchNameMatch, NULL, 0);
|
||||||
|
#else
|
||||||
|
dir->_h = FindFirstFile(path_buf, &dir->_f);
|
||||||
|
#endif
|
||||||
|
if (dir->_h == INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
errno = ENOENT;
|
||||||
|
#else
|
||||||
|
dir->_d = _tinydir_opendir(path);
|
||||||
|
if (dir->_d == NULL)
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
goto bail;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* read first file */
|
||||||
|
dir->has_next = 1;
|
||||||
|
#ifndef _MSC_VER
|
||||||
|
#ifdef _TINYDIR_USE_READDIR
|
||||||
|
dir->_e = _tinydir_readdir(dir->_d);
|
||||||
|
#else
|
||||||
|
/* allocate dirent buffer for readdir_r */
|
||||||
|
size = _tinydir_dirent_buf_size(dir->_d); /* conversion to int */
|
||||||
|
if (size == -1) return -1;
|
||||||
|
dir->_ep = (struct _tinydir_dirent*)_TINYDIR_MALLOC(size);
|
||||||
|
if (dir->_ep == NULL) return -1;
|
||||||
|
|
||||||
|
error = readdir_r(dir->_d, dir->_ep, &dir->_e);
|
||||||
|
if (error != 0) return -1;
|
||||||
|
#endif
|
||||||
|
if (dir->_e == NULL)
|
||||||
|
{
|
||||||
|
dir->has_next = 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
bail:
|
||||||
|
tinydir_close(dir);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
_TINYDIR_FUNC
|
||||||
|
int tinydir_open_sorted(tinydir_dir *dir, const _tinydir_char_t *path)
|
||||||
|
{
|
||||||
|
/* Count the number of files first, to pre-allocate the files array */
|
||||||
|
size_t n_files = 0;
|
||||||
|
if (tinydir_open(dir, path) == -1)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
while (dir->has_next)
|
||||||
|
{
|
||||||
|
n_files++;
|
||||||
|
if (tinydir_next(dir) == -1)
|
||||||
|
{
|
||||||
|
goto bail;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tinydir_close(dir);
|
||||||
|
|
||||||
|
if (tinydir_open(dir, path) == -1)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
dir->n_files = 0;
|
||||||
|
dir->_files = (tinydir_file *)_TINYDIR_MALLOC(sizeof *dir->_files * n_files);
|
||||||
|
if (dir->_files == NULL)
|
||||||
|
{
|
||||||
|
goto bail;
|
||||||
|
}
|
||||||
|
while (dir->has_next)
|
||||||
|
{
|
||||||
|
tinydir_file *p_file;
|
||||||
|
dir->n_files++;
|
||||||
|
|
||||||
|
p_file = &dir->_files[dir->n_files - 1];
|
||||||
|
if (tinydir_readfile(dir, p_file) == -1)
|
||||||
|
{
|
||||||
|
goto bail;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tinydir_next(dir) == -1)
|
||||||
|
{
|
||||||
|
goto bail;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Just in case the number of files has changed between the first and
|
||||||
|
second reads, terminate without writing into unallocated memory */
|
||||||
|
if (dir->n_files == n_files)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
qsort(dir->_files, dir->n_files, sizeof(tinydir_file), _tinydir_file_cmp);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
bail:
|
||||||
|
tinydir_close(dir);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
_TINYDIR_FUNC
|
||||||
|
void tinydir_close(tinydir_dir *dir)
|
||||||
|
{
|
||||||
|
if (dir == NULL)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(dir->path, 0, sizeof(dir->path));
|
||||||
|
dir->has_next = 0;
|
||||||
|
dir->n_files = 0;
|
||||||
|
_TINYDIR_FREE(dir->_files);
|
||||||
|
dir->_files = NULL;
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
if (dir->_h != INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
FindClose(dir->_h);
|
||||||
|
}
|
||||||
|
dir->_h = INVALID_HANDLE_VALUE;
|
||||||
|
#else
|
||||||
|
if (dir->_d)
|
||||||
|
{
|
||||||
|
_tinydir_closedir(dir->_d);
|
||||||
|
}
|
||||||
|
dir->_d = NULL;
|
||||||
|
dir->_e = NULL;
|
||||||
|
#ifndef _TINYDIR_USE_READDIR
|
||||||
|
_TINYDIR_FREE(dir->_ep);
|
||||||
|
dir->_ep = NULL;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
_TINYDIR_FUNC
|
||||||
|
int tinydir_next(tinydir_dir *dir)
|
||||||
|
{
|
||||||
|
if (dir == NULL)
|
||||||
|
{
|
||||||
|
errno = EINVAL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (!dir->has_next)
|
||||||
|
{
|
||||||
|
errno = ENOENT;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
if (FindNextFile(dir->_h, &dir->_f) == 0)
|
||||||
|
#else
|
||||||
|
#ifdef _TINYDIR_USE_READDIR
|
||||||
|
dir->_e = _tinydir_readdir(dir->_d);
|
||||||
|
#else
|
||||||
|
if (dir->_ep == NULL)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (readdir_r(dir->_d, dir->_ep, &dir->_e) != 0)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (dir->_e == NULL)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
dir->has_next = 0;
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
if (GetLastError() != ERROR_SUCCESS &&
|
||||||
|
GetLastError() != ERROR_NO_MORE_FILES)
|
||||||
|
{
|
||||||
|
tinydir_close(dir);
|
||||||
|
errno = EIO;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
_TINYDIR_FUNC
|
||||||
|
int tinydir_readfile(const tinydir_dir *dir, tinydir_file *file)
|
||||||
|
{
|
||||||
|
if (dir == NULL || file == NULL)
|
||||||
|
{
|
||||||
|
errno = EINVAL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
if (dir->_h == INVALID_HANDLE_VALUE)
|
||||||
|
#else
|
||||||
|
if (dir->_e == NULL)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
errno = ENOENT;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (_tinydir_strlen(dir->path) +
|
||||||
|
_tinydir_strlen(
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
dir->_f.cFileName
|
||||||
|
#else
|
||||||
|
dir->_e->d_name
|
||||||
|
#endif
|
||||||
|
) + 1 + _TINYDIR_PATH_EXTRA >=
|
||||||
|
_TINYDIR_PATH_MAX)
|
||||||
|
{
|
||||||
|
/* the path for the file will be too long */
|
||||||
|
errno = ENAMETOOLONG;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (_tinydir_strlen(
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
dir->_f.cFileName
|
||||||
|
#else
|
||||||
|
dir->_e->d_name
|
||||||
|
#endif
|
||||||
|
) >= _TINYDIR_FILENAME_MAX)
|
||||||
|
{
|
||||||
|
errno = ENAMETOOLONG;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
_tinydir_strcpy(file->path, dir->path);
|
||||||
|
_tinydir_strcat(file->path, TINYDIR_STRING("/"));
|
||||||
|
_tinydir_strcpy(file->name,
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
dir->_f.cFileName
|
||||||
|
#else
|
||||||
|
dir->_e->d_name
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
_tinydir_strcat(file->path, file->name);
|
||||||
|
#ifndef _MSC_VER
|
||||||
|
#ifdef __MINGW32__
|
||||||
|
if (_tstat(
|
||||||
|
#else
|
||||||
|
if (stat(
|
||||||
|
#endif
|
||||||
|
file->path, &file->_s) == -1)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
_tinydir_get_ext(file);
|
||||||
|
|
||||||
|
file->is_dir =
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
!!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);
|
||||||
|
#else
|
||||||
|
S_ISDIR(file->_s.st_mode);
|
||||||
|
#endif
|
||||||
|
file->is_reg =
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
!!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_NORMAL) ||
|
||||||
|
(
|
||||||
|
!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_DEVICE) &&
|
||||||
|
!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&
|
||||||
|
!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_ENCRYPTED) &&
|
||||||
|
#ifdef FILE_ATTRIBUTE_INTEGRITY_STREAM
|
||||||
|
!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_INTEGRITY_STREAM) &&
|
||||||
|
#endif
|
||||||
|
#ifdef FILE_ATTRIBUTE_NO_SCRUB_DATA
|
||||||
|
!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_NO_SCRUB_DATA) &&
|
||||||
|
#endif
|
||||||
|
!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_OFFLINE) &&
|
||||||
|
!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_TEMPORARY));
|
||||||
|
#else
|
||||||
|
S_ISREG(file->_s.st_mode);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
_TINYDIR_FUNC
|
||||||
|
int tinydir_readfile_n(const tinydir_dir *dir, tinydir_file *file, size_t i)
|
||||||
|
{
|
||||||
|
if (dir == NULL || file == NULL)
|
||||||
|
{
|
||||||
|
errno = EINVAL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (i >= dir->n_files)
|
||||||
|
{
|
||||||
|
errno = ENOENT;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(file, &dir->_files[i], sizeof(tinydir_file));
|
||||||
|
_tinydir_get_ext(file);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
_TINYDIR_FUNC
|
||||||
|
int tinydir_open_subdir_n(tinydir_dir *dir, size_t i)
|
||||||
|
{
|
||||||
|
_tinydir_char_t path[_TINYDIR_PATH_MAX];
|
||||||
|
if (dir == NULL)
|
||||||
|
{
|
||||||
|
errno = EINVAL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (i >= dir->n_files || !dir->_files[i].is_dir)
|
||||||
|
{
|
||||||
|
errno = ENOENT;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
_tinydir_strcpy(path, dir->_files[i].path);
|
||||||
|
tinydir_close(dir);
|
||||||
|
if (tinydir_open_sorted(dir, path) == -1)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Open a single file given its path */
|
||||||
|
_TINYDIR_FUNC
|
||||||
|
int tinydir_file_open(tinydir_file *file, const _tinydir_char_t *path)
|
||||||
|
{
|
||||||
|
tinydir_dir dir;
|
||||||
|
int result = 0;
|
||||||
|
int found = 0;
|
||||||
|
_tinydir_char_t dir_name_buf[_TINYDIR_PATH_MAX];
|
||||||
|
_tinydir_char_t file_name_buf[_TINYDIR_FILENAME_MAX];
|
||||||
|
_tinydir_char_t *dir_name;
|
||||||
|
_tinydir_char_t *base_name;
|
||||||
|
#if (defined _MSC_VER || defined __MINGW32__)
|
||||||
|
_tinydir_char_t drive_buf[_TINYDIR_PATH_MAX];
|
||||||
|
_tinydir_char_t ext_buf[_TINYDIR_FILENAME_MAX];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (file == NULL || path == NULL || _tinydir_strlen(path) == 0)
|
||||||
|
{
|
||||||
|
errno = EINVAL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (_tinydir_strlen(path) + _TINYDIR_PATH_EXTRA >= _TINYDIR_PATH_MAX)
|
||||||
|
{
|
||||||
|
errno = ENAMETOOLONG;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get the parent path */
|
||||||
|
#if (defined _MSC_VER || defined __MINGW32__)
|
||||||
|
#if ((defined _MSC_VER) && (_MSC_VER >= 1400))
|
||||||
|
_tsplitpath_s(
|
||||||
|
path,
|
||||||
|
drive_buf, _TINYDIR_DRIVE_MAX,
|
||||||
|
dir_name_buf, _TINYDIR_FILENAME_MAX,
|
||||||
|
file_name_buf, _TINYDIR_FILENAME_MAX,
|
||||||
|
ext_buf, _TINYDIR_FILENAME_MAX);
|
||||||
|
#else
|
||||||
|
_tsplitpath(
|
||||||
|
path,
|
||||||
|
drive_buf,
|
||||||
|
dir_name_buf,
|
||||||
|
file_name_buf,
|
||||||
|
ext_buf);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* _splitpath_s not work fine with only filename and widechar support */
|
||||||
|
#ifdef _UNICODE
|
||||||
|
if (drive_buf[0] == L'\xFEFE')
|
||||||
|
drive_buf[0] = '\0';
|
||||||
|
if (dir_name_buf[0] == L'\xFEFE')
|
||||||
|
dir_name_buf[0] = '\0';
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (errno)
|
||||||
|
{
|
||||||
|
errno = EINVAL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
/* Emulate the behavior of dirname by returning "." for dir name if it's
|
||||||
|
empty */
|
||||||
|
if (drive_buf[0] == '\0' && dir_name_buf[0] == '\0')
|
||||||
|
{
|
||||||
|
_tinydir_strcpy(dir_name_buf, TINYDIR_STRING("."));
|
||||||
|
}
|
||||||
|
/* Concatenate the drive letter and dir name to form full dir name */
|
||||||
|
_tinydir_strcat(drive_buf, dir_name_buf);
|
||||||
|
dir_name = drive_buf;
|
||||||
|
/* Concatenate the file name and extension to form base name */
|
||||||
|
_tinydir_strcat(file_name_buf, ext_buf);
|
||||||
|
base_name = file_name_buf;
|
||||||
|
#else
|
||||||
|
_tinydir_strcpy(dir_name_buf, path);
|
||||||
|
dir_name = dirname(dir_name_buf);
|
||||||
|
_tinydir_strcpy(file_name_buf, path);
|
||||||
|
base_name =basename(file_name_buf);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Open the parent directory */
|
||||||
|
if (tinydir_open(&dir, dir_name) == -1)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Read through the parent directory and look for the file */
|
||||||
|
while (dir.has_next)
|
||||||
|
{
|
||||||
|
if (tinydir_readfile(&dir, file) == -1)
|
||||||
|
{
|
||||||
|
result = -1;
|
||||||
|
goto bail;
|
||||||
|
}
|
||||||
|
if (_tinydir_strcmp(file->name, base_name) == 0)
|
||||||
|
{
|
||||||
|
/* File found */
|
||||||
|
found = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
tinydir_next(&dir);
|
||||||
|
}
|
||||||
|
if (!found)
|
||||||
|
{
|
||||||
|
result = -1;
|
||||||
|
errno = ENOENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
bail:
|
||||||
|
tinydir_close(&dir);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
_TINYDIR_FUNC
|
||||||
|
void _tinydir_get_ext(tinydir_file *file)
|
||||||
|
{
|
||||||
|
_tinydir_char_t *period = _tinydir_strrchr(file->name, TINYDIR_STRING('.'));
|
||||||
|
if (period == NULL)
|
||||||
|
{
|
||||||
|
file->extension = &(file->name[_tinydir_strlen(file->name)]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
file->extension = period + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_TINYDIR_FUNC
|
||||||
|
int _tinydir_file_cmp(const void *a, const void *b)
|
||||||
|
{
|
||||||
|
const tinydir_file *fa = (const tinydir_file *)a;
|
||||||
|
const tinydir_file *fb = (const tinydir_file *)b;
|
||||||
|
if (fa->is_dir != fb->is_dir)
|
||||||
|
{
|
||||||
|
return -(fa->is_dir - fb->is_dir);
|
||||||
|
}
|
||||||
|
return _tinydir_strncmp(fa->name, fb->name, _TINYDIR_FILENAME_MAX);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef _MSC_VER
|
||||||
|
#ifndef _TINYDIR_USE_READDIR
|
||||||
|
/*
|
||||||
|
The following authored by Ben Hutchings <ben@decadent.org.uk>
|
||||||
|
from https://womble.decadent.org.uk/readdir_r-advisory.html
|
||||||
|
*/
|
||||||
|
/* Calculate the required buffer size (in bytes) for directory *
|
||||||
|
* entries read from the given directory handle. Return -1 if this *
|
||||||
|
* this cannot be done. *
|
||||||
|
* *
|
||||||
|
* This code does not trust values of NAME_MAX that are less than *
|
||||||
|
* 255, since some systems (including at least HP-UX) incorrectly *
|
||||||
|
* define it to be a smaller value. */
|
||||||
|
_TINYDIR_FUNC
|
||||||
|
size_t _tinydir_dirent_buf_size(_TINYDIR_DIR *dirp)
|
||||||
|
{
|
||||||
|
long name_max;
|
||||||
|
size_t name_end;
|
||||||
|
/* parameter may be unused */
|
||||||
|
(void)dirp;
|
||||||
|
|
||||||
|
#if defined _TINYDIR_USE_FPATHCONF
|
||||||
|
name_max = fpathconf(dirfd(dirp), _PC_NAME_MAX);
|
||||||
|
if (name_max == -1)
|
||||||
|
#if defined(NAME_MAX)
|
||||||
|
name_max = (NAME_MAX > 255) ? NAME_MAX : 255;
|
||||||
|
#else
|
||||||
|
return (size_t)(-1);
|
||||||
|
#endif
|
||||||
|
#elif defined(NAME_MAX)
|
||||||
|
name_max = (NAME_MAX > 255) ? NAME_MAX : 255;
|
||||||
|
#else
|
||||||
|
#error "buffer size for readdir_r cannot be determined"
|
||||||
|
#endif
|
||||||
|
name_end = (size_t)offsetof(struct _tinydir_dirent, d_name) + name_max + 1;
|
||||||
|
return (name_end > sizeof(struct _tinydir_dirent) ?
|
||||||
|
name_end : sizeof(struct _tinydir_dirent));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
# if defined (_MSC_VER)
|
||||||
|
# pragma warning(pop)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 11.00
|
Microsoft Visual Studio Solution File, Format Version 11.00
|
||||||
# Visual Studio 2010
|
# Visual Studio 2010
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibvc", "zlibvc.vcxproj", "{8FD826F8-3739-44E6-8CC8-997122E53B8D}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibvc", "zlibvc.vcxproj", "{8FD826F8-3739-44E6-8CC8-997122E53B8D}"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
# Visual Studio 2012
|
# Visual Studio 2012
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibvc", "zlibvc.vcxproj", "{8FD826F8-3739-44E6-8CC8-997122E53B8D}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibvc", "zlibvc.vcxproj", "{8FD826F8-3739-44E6-8CC8-997122E53B8D}"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
# Visual Studio 2013
|
# Visual Studio 2013
|
||||||
VisualStudioVersion = 12.0.40629.0
|
VisualStudioVersion = 12.0.40629.0
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
# Visual Studio 14
|
# Visual Studio 14
|
||||||
VisualStudioVersion = 14.0.25420.1
|
VisualStudioVersion = 14.0.25420.1
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 10.00
|
Microsoft Visual Studio Solution File, Format Version 10.00
|
||||||
# Visual Studio 2008
|
# Visual Studio 2008
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibvc", "zlibvc.vcproj", "{8FD826F8-3739-44E6-8CC8-997122E53B8D}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibvc", "zlibvc.vcproj", "{8FD826F8-3739-44E6-8CC8-997122E53B8D}"
|
||||||
|
|||||||
18
doc/Class.3
18
doc/Class.3
@@ -79,7 +79,9 @@ The number of elements in the \fIobjv\fR array.
|
|||||||
The arguments to the command to create the instance of the class.
|
The arguments to the command to create the instance of the class.
|
||||||
.AP int skip in
|
.AP int skip in
|
||||||
The number of arguments at the start of the argument array, \fIobjv\fR, that
|
The number of arguments at the start of the argument array, \fIobjv\fR, that
|
||||||
are not arguments to any constructors.
|
are not arguments to any constructors. This allows the generation of correct
|
||||||
|
error messages even when complicated calling patterns are used (e.g., via the
|
||||||
|
\fBnext\fR command).
|
||||||
.AP Tcl_ObjectMetadataType *metaTypePtr in
|
.AP Tcl_ObjectMetadataType *metaTypePtr in
|
||||||
The type of \fImetadata\fR being set with \fBTcl_ClassSetMetadata\fR or
|
The type of \fImetadata\fR being set with \fBTcl_ClassSetMetadata\fR or
|
||||||
retrieved with \fBTcl_ClassGetMetadata\fR.
|
retrieved with \fBTcl_ClassGetMetadata\fR.
|
||||||
@@ -109,7 +111,9 @@ may be retrieved using the \fBTcl_GetObjectCommand\fR function, the name of
|
|||||||
the object (and hence the name of the command) with \fBTcl_GetObjectName\fR,
|
the object (and hence the name of the command) with \fBTcl_GetObjectName\fR,
|
||||||
and the namespace may be retrieved using the \fBTcl_GetObjectNamespace\fR
|
and the namespace may be retrieved using the \fBTcl_GetObjectNamespace\fR
|
||||||
function. Note that the Tcl_Obj reference returned by \fBTcl_GetObjectName\fR
|
function. Note that the Tcl_Obj reference returned by \fBTcl_GetObjectName\fR
|
||||||
is a shared reference.
|
is a shared reference. You can also get whether the object has been marked for
|
||||||
|
deletion with \fBTcl_ObjectDeleted\fR (it returns true if deletion of the
|
||||||
|
object has begun); this can be useful during the processing of methods.
|
||||||
.PP
|
.PP
|
||||||
Instances of classes are created using \fBTcl_NewObjectInstance\fR, which
|
Instances of classes are created using \fBTcl_NewObjectInstance\fR, which
|
||||||
creates an object from any class (and which is internally called by both
|
creates an object from any class (and which is internally called by both
|
||||||
@@ -121,6 +125,16 @@ created object, or NULL if the creation failed (when an error message will be
|
|||||||
left in the interpreter result). In addition, objects may be copied by using
|
left in the interpreter result). In addition, objects may be copied by using
|
||||||
\fBTcl_CopyObjectInstance\fR which creates a copy of an object without running
|
\fBTcl_CopyObjectInstance\fR which creates a copy of an object without running
|
||||||
any constructors.
|
any constructors.
|
||||||
|
.PP
|
||||||
|
Note that the lifetime management of objects is handled internally within
|
||||||
|
TclOO, and does not use \fBTcl_Preserve\fR. \fIIt is not safe to put a
|
||||||
|
Tcl_Object handle in a C structure with a lifespan different to the object;\fR
|
||||||
|
you should use the object's command name (as retrieved with
|
||||||
|
\fBTcl_GetObjectName\fR) instead. It is safe to use a Tcl_Object handle for
|
||||||
|
the lifespan of a call of a method on that object; handles do not become
|
||||||
|
invalid while there is an outstanding call on their object (even if the only
|
||||||
|
operation guaranteed to be safe on them is \fBTcl_ObjectDeleted\fR; the other
|
||||||
|
operations are only guaranteed to work on non-deleted objects).
|
||||||
.SH "OBJECT AND CLASS METADATA"
|
.SH "OBJECT AND CLASS METADATA"
|
||||||
.PP
|
.PP
|
||||||
Every object and every class may have arbitrary amounts of metadata attached
|
Every object and every class may have arbitrary amounts of metadata attached
|
||||||
|
|||||||
@@ -4,11 +4,11 @@
|
|||||||
'\" See the file "license.terms" for information on usage and redistribution
|
'\" See the file "license.terms" for information on usage and redistribution
|
||||||
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
'\"
|
'\"
|
||||||
.TH Tcl_CreateSlave 3 7.6 Tcl "Tcl Library Procedures"
|
.TH Tcl_CreateAlias 3 7.6 Tcl "Tcl Library Procedures"
|
||||||
.so man.macros
|
.so man.macros
|
||||||
.BS
|
.BS
|
||||||
.SH NAME
|
.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
|
Tcl_IsSafe, Tcl_MakeSafe, Tcl_CreateChild, Tcl_CreateSlave, Tcl_GetChild, Tcl_GetSlave, Tcl_GetParent, 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
|
.SH SYNOPSIS
|
||||||
.nf
|
.nf
|
||||||
\fB#include <tcl.h>\fR
|
\fB#include <tcl.h>\fR
|
||||||
@@ -19,32 +19,47 @@ int
|
|||||||
int
|
int
|
||||||
\fBTcl_MakeSafe\fR(\fIinterp\fR)
|
\fBTcl_MakeSafe\fR(\fIinterp\fR)
|
||||||
.sp
|
.sp
|
||||||
|
.VS "TIP 581"
|
||||||
Tcl_Interp *
|
Tcl_Interp *
|
||||||
\fBTcl_CreateSlave\fR(\fIinterp, slaveName, isSafe\fR)
|
\fBTcl_CreateChild\fR(\fIinterp, name, isSafe\fR)
|
||||||
|
.VE "TIP 581"
|
||||||
.sp
|
.sp
|
||||||
Tcl_Interp *
|
Tcl_Interp *
|
||||||
\fBTcl_GetSlave\fR(\fIinterp, slaveName\fR)
|
\fBTcl_CreateSlave\fR(\fIinterp, name, isSafe\fR)
|
||||||
|
.sp
|
||||||
|
.VS "TIP 581"
|
||||||
|
Tcl_Interp *
|
||||||
|
\fBTcl_GetChild\fR(\fIinterp, name\fR)
|
||||||
|
.VE "TIP 581"
|
||||||
|
.sp
|
||||||
|
Tcl_Interp *
|
||||||
|
\fBTcl_GetSlave\fR(\fIinterp, name\fR)
|
||||||
|
.sp
|
||||||
|
.VS "TIP 581"
|
||||||
|
Tcl_Interp *
|
||||||
|
\fBTcl_GetParent\fR(\fIinterp\fR)
|
||||||
|
.VE "TIP 581"
|
||||||
.sp
|
.sp
|
||||||
Tcl_Interp *
|
Tcl_Interp *
|
||||||
\fBTcl_GetMaster\fR(\fIinterp\fR)
|
\fBTcl_GetMaster\fR(\fIinterp\fR)
|
||||||
.sp
|
.sp
|
||||||
int
|
int
|
||||||
\fBTcl_GetInterpPath\fR(\fIaskingInterp, slaveInterp\fR)
|
\fBTcl_GetInterpPath\fR(\fIinterp, childInterp\fR)
|
||||||
.sp
|
.sp
|
||||||
int
|
int
|
||||||
\fBTcl_CreateAlias\fR(\fIslaveInterp, slaveCmd, targetInterp, targetCmd,
|
\fBTcl_CreateAlias\fR(\fIchildInterp, childCmd, targetInterp, targetCmd,
|
||||||
argc, argv\fR)
|
argc, argv\fR)
|
||||||
.sp
|
.sp
|
||||||
int
|
int
|
||||||
\fBTcl_CreateAliasObj\fR(\fIslaveInterp, slaveCmd, targetInterp, targetCmd,
|
\fBTcl_CreateAliasObj\fR(\fIchildInterp, childCmd, targetInterp, targetCmd,
|
||||||
objc, objv\fR)
|
objc, objv\fR)
|
||||||
.sp
|
.sp
|
||||||
int
|
int
|
||||||
\fBTcl_GetAlias\fR(\fIinterp, slaveCmd, targetInterpPtr, targetCmdPtr,
|
\fBTcl_GetAlias\fR(\fIinterp, childCmd, targetInterpPtr, targetCmdPtr,
|
||||||
argcPtr, argvPtr\fR)
|
argcPtr, argvPtr\fR)
|
||||||
.sp
|
.sp
|
||||||
int
|
int
|
||||||
\fBTcl_GetAliasObj\fR(\fIinterp, slaveCmd, targetInterpPtr, targetCmdPtr,
|
\fBTcl_GetAliasObj\fR(\fIinterp, childCmd, targetInterpPtr, targetCmdPtr,
|
||||||
objcPtr, objvPtr\fR)
|
objcPtr, objvPtr\fR)
|
||||||
.sp
|
.sp
|
||||||
int
|
int
|
||||||
@@ -56,17 +71,17 @@ int
|
|||||||
.AS "const char *const" **targetInterpPtr out
|
.AS "const char *const" **targetInterpPtr out
|
||||||
.AP Tcl_Interp *interp in
|
.AP Tcl_Interp *interp in
|
||||||
Interpreter in which to execute the specified command.
|
Interpreter in which to execute the specified command.
|
||||||
.AP "const char" *slaveName in
|
.AP "const char" *name in
|
||||||
Name of slave interpreter to create or manipulate.
|
Name of child interpreter to create or manipulate.
|
||||||
.AP int isSafe in
|
.AP int isSafe in
|
||||||
If non-zero, a
|
If non-zero, a
|
||||||
.QW safe
|
.QW safe
|
||||||
slave that is suitable for running untrusted code
|
child that is suitable for running untrusted code
|
||||||
is created, otherwise a trusted slave is created.
|
is created, otherwise a trusted child is created.
|
||||||
.AP Tcl_Interp *slaveInterp in
|
.AP Tcl_Interp *childInterp in
|
||||||
Interpreter to use for creating the source command for an alias (see
|
Interpreter to use for creating the source command for an alias (see
|
||||||
below).
|
below).
|
||||||
.AP "const char" *slaveCmd in
|
.AP "const char" *childCmd in
|
||||||
Name of source command for alias.
|
Name of source command for alias.
|
||||||
.AP Tcl_Interp *targetInterp in
|
.AP Tcl_Interp *targetInterp in
|
||||||
Interpreter that contains the target command for an alias.
|
Interpreter that contains the target command for an alias.
|
||||||
@@ -119,19 +134,23 @@ in a hierarchical relationship, and the management of aliases, commands
|
|||||||
that when invoked in one interpreter execute a command in another
|
that when invoked in one interpreter execute a command in another
|
||||||
interpreter. The return value for those procedures that return an \fBint\fR
|
interpreter. The return value for those procedures that return an \fBint\fR
|
||||||
is either \fBTCL_OK\fR or \fBTCL_ERROR\fR. If \fBTCL_ERROR\fR is returned
|
is either \fBTCL_OK\fR or \fBTCL_ERROR\fR. If \fBTCL_ERROR\fR is returned
|
||||||
then the \fBresult\fR field of the interpreter contains an error message.
|
then the interpreter's result contains an error message.
|
||||||
.PP
|
.PP
|
||||||
\fBTcl_CreateSlave\fR creates a new interpreter as a slave of \fIinterp\fR.
|
\fBTcl_CreateSlave\fR creates a new interpreter as a child of \fIinterp\fR.
|
||||||
It also creates a slave command named \fIslaveName\fR in \fIinterp\fR which
|
It also creates a child command named \fIchildName\fR in \fIinterp\fR which
|
||||||
allows \fIinterp\fR to manipulate the new slave.
|
allows \fIinterp\fR to manipulate the new child.
|
||||||
If \fIisSafe\fR is zero, the command creates a trusted slave in which Tcl
|
If \fIisSafe\fR is zero, the command creates a trusted child in which Tcl
|
||||||
code has access to all the Tcl commands.
|
code has access to all the Tcl commands.
|
||||||
If it is \fB1\fR, the command creates a
|
If it is \fB1\fR, the command creates a
|
||||||
.QW safe
|
.QW safe
|
||||||
slave in which Tcl code has access only to set of Tcl commands defined as
|
child in which Tcl code has access only to set of Tcl commands defined as
|
||||||
.QW "Safe Tcl" ;
|
.QW "Safe Tcl" ;
|
||||||
see the manual entry for the Tcl \fBinterp\fR command for details.
|
see the manual entry for the Tcl \fBinterp\fR command for details.
|
||||||
If the creation of the new slave interpreter failed, \fBNULL\fR is returned.
|
If the creation of the new child interpreter failed, \fBNULL\fR is returned.
|
||||||
|
.PP
|
||||||
|
.VS "TIP 581"
|
||||||
|
\fBTcl_CreateChild\fR is a synonym for \fBTcl_CreateSlave\fR.
|
||||||
|
.VE "TIP 581"
|
||||||
.PP
|
.PP
|
||||||
\fBTcl_IsSafe\fR returns \fB1\fR if \fIinterp\fR is
|
\fBTcl_IsSafe\fR returns \fB1\fR if \fIinterp\fR is
|
||||||
.QW safe
|
.QW safe
|
||||||
@@ -150,31 +169,39 @@ Callers will want to take care with their use of \fBTcl_MakeSafe\fR
|
|||||||
to avoid false claims of safety. For many situations, \fBTcl_CreateSlave\fR
|
to avoid false claims of safety. For many situations, \fBTcl_CreateSlave\fR
|
||||||
may be a better choice, since it creates interpreters in a known-safe state.
|
may be a better choice, since it creates interpreters in a known-safe state.
|
||||||
.PP
|
.PP
|
||||||
\fBTcl_GetSlave\fR returns a pointer to a slave interpreter of
|
\fBTcl_GetSlave\fR returns a pointer to a child interpreter of
|
||||||
\fIinterp\fR. The slave interpreter is identified by \fIslaveName\fR.
|
\fIinterp\fR. The child interpreter is identified by \fIchildName\fR.
|
||||||
If no such slave interpreter exists, \fBNULL\fR is returned.
|
If no such child interpreter exists, \fBNULL\fR is returned.
|
||||||
|
.PP
|
||||||
|
.VS "TIP 581"
|
||||||
|
\fBTcl_GetChild\fR is a synonym for \fBTcl_GetSlave\fR.
|
||||||
|
.VE "TIP 581"
|
||||||
.PP
|
.PP
|
||||||
\fBTcl_GetMaster\fR returns a pointer to the master interpreter of
|
\fBTcl_GetMaster\fR returns a pointer to the master interpreter of
|
||||||
\fIinterp\fR. If \fIinterp\fR has no master (it is a
|
\fIinterp\fR. If \fIinterp\fR has no master (it is a
|
||||||
top-level interpreter) then \fBNULL\fR is returned.
|
top-level interpreter) then \fBNULL\fR is returned.
|
||||||
.PP
|
.PP
|
||||||
\fBTcl_GetInterpPath\fR sets the \fIresult\fR field in \fIaskingInterp\fR
|
.VS "TIP 581"
|
||||||
to the relative path between \fIaskingInterp\fR and \fIslaveInterp\fR;
|
\fBTcl_GetParent\fR is a synonym for \fBTcl_GetMaster\fR.
|
||||||
\fIslaveInterp\fR must be a slave of \fIaskingInterp\fR. If the computation
|
.VE "TIP 581"
|
||||||
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
|
.PP
|
||||||
\fBTcl_CreateAlias\fR creates a command named \fIslaveCmd\fR in
|
\fBTcl_GetInterpPath\fR stores in the result of \fIinterp\fR
|
||||||
\fIslaveInterp\fR that when invoked, will cause the command \fItargetCmd\fR
|
the relative path between \fIinterp\fR and \fIchildInterp\fR;
|
||||||
|
\fIchildInterp\fR must be a child of \fIinterp\fR. If the computation
|
||||||
|
of the relative path succeeds, \fBTCL_OK\fR is returned, else
|
||||||
|
\fBTCL_ERROR\fR is returned and an error message is stored as the
|
||||||
|
result of \fIinterp\fR.
|
||||||
|
.PP
|
||||||
|
\fBTcl_CreateAlias\fR creates a command named \fIchildCmd\fR in
|
||||||
|
\fIchildInterp\fR that when invoked, will cause the command \fItargetCmd\fR
|
||||||
to be invoked in \fItargetInterp\fR. The arguments specified by the strings
|
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
|
contained in \fIargv\fR are always prepended to any arguments supplied in the
|
||||||
invocation of \fIslaveCmd\fR and passed to \fItargetCmd\fR.
|
invocation of \fIchildCmd\fR and passed to \fItargetCmd\fR.
|
||||||
This operation returns \fBTCL_OK\fR if it succeeds, or \fBTCL_ERROR\fR if
|
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 value result
|
it fails; in that case, an error message is left in the value result
|
||||||
of \fIslaveInterp\fR.
|
of \fIchildInterp\fR.
|
||||||
Note that there are no restrictions on the ancestry relationship (as
|
Note that there are no restrictions on the ancestry relationship (as
|
||||||
created by \fBTcl_CreateSlave\fR) between \fIslaveInterp\fR and
|
created by \fBTcl_CreateSlave\fR) between \fIchildInterp\fR and
|
||||||
\fItargetInterp\fR. Any two interpreters can be used, without any
|
\fItargetInterp\fR. Any two interpreters can be used, without any
|
||||||
restrictions on how they are related.
|
restrictions on how they are related.
|
||||||
.PP
|
.PP
|
||||||
@@ -198,33 +225,33 @@ the set of hidden commands to the set of exposed commands, putting
|
|||||||
it under the name
|
it under the name
|
||||||
\fIcmdName\fR.
|
\fIcmdName\fR.
|
||||||
\fIHiddenCmdName\fR must be the name of an existing hidden
|
\fIHiddenCmdName\fR must be the name of an existing hidden
|
||||||
command, or the operation will return \fBTCL_ERROR\fR and leave an error
|
command, or the operation will return \fBTCL_ERROR\fR and
|
||||||
message in the \fIresult\fR field in \fIinterp\fR.
|
leave an error message as the result of \fIinterp\fR.
|
||||||
If an exposed command named \fIcmdName\fR already exists,
|
If an exposed command named \fIcmdName\fR already exists,
|
||||||
the operation returns \fBTCL_ERROR\fR and leaves an error message in the
|
the operation returns \fBTCL_ERROR\fR and leaves an error message as
|
||||||
value result of \fIinterp\fR.
|
the result of \fIinterp\fR.
|
||||||
If the operation succeeds, it returns \fBTCL_OK\fR.
|
If the operation succeeds, it returns \fBTCL_OK\fR.
|
||||||
After executing this command, attempts to use \fIcmdName\fR in a call to
|
After executing this command, attempts to use \fIcmdName\fR in any
|
||||||
\fBTcl_Eval\fR or with the Tcl \fBeval\fR command will again succeed.
|
script evaluation mechanism will again succeed.
|
||||||
.PP
|
.PP
|
||||||
\fBTcl_HideCommand\fR moves the command named \fIcmdName\fR from the set of
|
\fBTcl_HideCommand\fR moves the command named \fIcmdName\fR from the set of
|
||||||
exposed commands to the set of hidden commands, under the name
|
exposed commands to the set of hidden commands, under the name
|
||||||
\fIhiddenCmdName\fR.
|
\fIhiddenCmdName\fR.
|
||||||
\fICmdName\fR must be the name of an existing exposed
|
\fICmdName\fR must be the name of an existing exposed
|
||||||
command, or the operation will return \fBTCL_ERROR\fR and leave an error
|
command, or the operation will return \fBTCL_ERROR\fR and leave an error
|
||||||
message in the value result of \fIinterp\fR.
|
message as the result of \fIinterp\fR.
|
||||||
Currently both \fIcmdName\fR and \fIhiddenCmdName\fR must not contain
|
Currently both \fIcmdName\fR and \fIhiddenCmdName\fR must not contain
|
||||||
namespace qualifiers, or the operation will return \fBTCL_ERROR\fR and
|
namespace qualifiers, or the operation will return \fBTCL_ERROR\fR and
|
||||||
leave an error message in the value result of \fIinterp\fR.
|
leave an error message as the result of \fIinterp\fR.
|
||||||
The \fICmdName\fR will be looked up in the global namespace, and not
|
The \fICmdName\fR will be looked up in the global namespace, and not
|
||||||
relative to the current namespace, even if the current namespace is not the
|
relative to the current namespace, even if the current namespace is not the
|
||||||
global one.
|
global one.
|
||||||
If a hidden command whose name is \fIhiddenCmdName\fR already
|
If a hidden command whose name is \fIhiddenCmdName\fR already
|
||||||
exists, the operation also returns \fBTCL_ERROR\fR and the \fIresult\fR
|
exists, the operation also returns \fBTCL_ERROR\fR and an error
|
||||||
field in \fIinterp\fR contains an error message.
|
message is left as the result of \fIinterp\fR.
|
||||||
If the operation succeeds, it returns \fBTCL_OK\fR.
|
If the operation succeeds, it returns \fBTCL_OK\fR.
|
||||||
After executing this command, attempts to use \fIcmdName\fR in a call to
|
After executing this command, attempts to use \fIcmdName\fR in
|
||||||
\fBTcl_Eval\fR or with the Tcl \fBeval\fR command will fail.
|
any script evaluation mechanism will fail.
|
||||||
.PP
|
.PP
|
||||||
For a description of the Tcl interface to multiple interpreters, see
|
For a description of the Tcl interface to multiple interpreters, see
|
||||||
\fIinterp(n)\fR.
|
\fIinterp(n)\fR.
|
||||||
@@ -233,4 +260,4 @@ interp
|
|||||||
|
|
||||||
.SH KEYWORDS
|
.SH KEYWORDS
|
||||||
alias, command, exposed commands, hidden commands, interpreter, invoke,
|
alias, command, exposed commands, hidden commands, interpreter, invoke,
|
||||||
master, slave
|
parent, child
|
||||||
@@ -259,7 +259,8 @@ outside this range, \fBTcl_SetChannelBufferSize\fR sets the buffer size to
|
|||||||
the generic layer that the events specified by \fImask\fR have
|
the generic layer that the events specified by \fImask\fR have
|
||||||
occurred on the channel. Channel drivers are responsible for invoking
|
occurred on the channel. Channel drivers are responsible for invoking
|
||||||
this function whenever the channel handlers need to be called for the
|
this function whenever the channel handlers need to be called for the
|
||||||
channel. See \fBWATCHPROC\fR below for more details.
|
channel (or other pending tasks like a write flush should be performed).
|
||||||
|
See \fBWATCHPROC\fR below for more details.
|
||||||
.PP
|
.PP
|
||||||
\fBTcl_BadChannelOption\fR is called from driver specific
|
\fBTcl_BadChannelOption\fR is called from driver specific
|
||||||
\fIsetOptionProc\fR or \fIgetOptionProc\fR to generate a complete
|
\fIsetOptionProc\fR or \fIgetOptionProc\fR to generate a complete
|
||||||
@@ -648,8 +649,8 @@ It should call \fBTcl_BadChannelOption\fR which itself returns
|
|||||||
unrecognized.
|
unrecognized.
|
||||||
If \fInewValue\fR specifies a value for the option that
|
If \fInewValue\fR specifies a value for the option that
|
||||||
is not supported or if a system call error occurs,
|
is not supported or if a system call error occurs,
|
||||||
the function should leave an error message in the
|
the function should leave an error message in the result
|
||||||
\fIresult\fR field of \fIinterp\fR if \fIinterp\fR is not NULL. The
|
of \fIinterp\fR if \fIinterp\fR is not NULL. The
|
||||||
function should also call \fBTcl_SetErrno\fR to store an appropriate POSIX
|
function should also call \fBTcl_SetErrno\fR to store an appropriate POSIX
|
||||||
error code.
|
error code.
|
||||||
.PP
|
.PP
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
'\"
|
'\"
|
||||||
'\" Copyright (c) 1989-1993 The Regents of the University of California.
|
'\" Copyright (c) 1989-1993 The Regents of the University of California.
|
||||||
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
|
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
|
||||||
'\" Copyright (c) 2002 by Kevin B. Kenny <kennykb@acm.org>. All rights reserved.
|
'\" Copyright (c) 2002 Kevin B. Kenny <kennykb@acm.org>. All rights reserved.
|
||||||
'\"
|
'\"
|
||||||
'\" See the file "license.terms" for information on usage and redistribution
|
'\" See the file "license.terms" for information on usage and redistribution
|
||||||
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
'\"
|
'\"
|
||||||
'\" Copyright (c) 1992-1999 Karl Lehenbauer and Mark Diekhans.
|
'\" Copyright (c) 1992-1999 Karl Lehenbauer & Mark Diekhans.
|
||||||
'\" Copyright (c) 2000 by Scriptics Corporation.
|
'\" Copyright (c) 2000 Scriptics Corporation.
|
||||||
'\" All rights reserved.
|
'\" All rights reserved.
|
||||||
'\"
|
'\"
|
||||||
.TH "Tcl_DumpActiveMemory" 3 8.1 Tcl "Tcl Library Procedures"
|
.TH "Tcl_DumpActiveMemory" 3 8.1 Tcl "Tcl Library Procedures"
|
||||||
|
|||||||
@@ -1350,11 +1350,11 @@ is considered to be owned by the filesystem (not by Tcl's core), but
|
|||||||
should be given a reference count for Tcl. Tcl will use the contents of the
|
should be given a reference count for Tcl. Tcl will use the contents of the
|
||||||
list and then decrement that reference count. This allows filesystems to
|
list and then decrement that reference count. This allows filesystems to
|
||||||
choose whether they actually want to retain a
|
choose whether they actually want to retain a
|
||||||
.QW "master list"
|
.QW "global list"
|
||||||
of volumes
|
of volumes
|
||||||
or not (if not, they generate the list on the fly and pass it to Tcl
|
or not (if not, they generate the list on the fly and pass it to Tcl
|
||||||
with a reference count of 1 and then forget about the list, if yes, then
|
with a reference count of 1 and then forget about the list, if yes, then
|
||||||
they simply increment the reference count of their master list and pass it
|
they simply increment the reference count of their global list and pass it
|
||||||
to Tcl which will copy the contents and then decrement the count back
|
to Tcl which will copy the contents and then decrement the count back
|
||||||
to where it was).
|
to where it was).
|
||||||
.PP
|
.PP
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
'\"
|
'\"
|
||||||
'\" Copyright (c) 1998-2000 by Scriptics Corporation.
|
'\" Copyright (c) 1998-2000 Scriptics Corporation.
|
||||||
'\" All rights reserved.
|
'\" All rights reserved.
|
||||||
'\"
|
'\"
|
||||||
.TH Tcl_GetHostName 3 8.3 Tcl "Tcl Library Procedures"
|
.TH Tcl_GetHostName 3 8.3 Tcl "Tcl Library Procedures"
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
'\"
|
'\"
|
||||||
'\" Copyright (c) 1996 by Sun Microsystems, Inc.
|
'\" Copyright (c) 1996 Sun Microsystems, Inc.
|
||||||
'\"
|
'\"
|
||||||
'\" See the file "license.terms" for information on usage and redistribution
|
'\" See the file "license.terms" for information on usage and redistribution
|
||||||
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
'\"
|
'\"
|
||||||
'\" Copyright (c) 2001 by Kevin B. Kenny <kennykb@acm.org>.
|
'\" Copyright (c) 2001 Kevin B. Kenny <kennykb@acm.org>.
|
||||||
'\"
|
'\"
|
||||||
'\" See the file "license.terms" for information on usage and redistribution
|
'\" See the file "license.terms" for information on usage and redistribution
|
||||||
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
'\"
|
'\"
|
||||||
'\" Copyright (c) 1998-2000 by Scriptics Corporation.
|
'\" Copyright (c) 1998-2000 Scriptics Corporation.
|
||||||
'\" All rights reserved.
|
'\" All rights reserved.
|
||||||
'\"
|
'\"
|
||||||
.TH Tcl_Init 3 8.0 Tcl "Tcl Library Procedures"
|
.TH Tcl_Init 3 8.0 Tcl "Tcl Library Procedures"
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ execution of the callbacks is unspecified) execution in the limited
|
|||||||
interpreter is stopped by raising an error and setting a flag that
|
interpreter is stopped by raising an error and setting a flag that
|
||||||
prevents the \fBcatch\fR command in that interpreter from trapping
|
prevents the \fBcatch\fR command in that interpreter from trapping
|
||||||
that error. It is up to the context that started execution in that
|
that error. It is up to the context that started execution in that
|
||||||
interpreter (typically a master interpreter) to handle the error.
|
interpreter (typically the main interpreter) to handle the error.
|
||||||
.SH "LIMIT CHECKING API"
|
.SH "LIMIT CHECKING API"
|
||||||
.PP
|
.PP
|
||||||
To check the resource limits for an interpreter, call
|
To check the resource limits for an interpreter, call
|
||||||
|
|||||||
@@ -138,7 +138,9 @@ create a new value or modify an existing value to hold
|
|||||||
the \fIobjc\fR elements of the array referenced by \fIobjv\fR
|
the \fIobjc\fR elements of the array referenced by \fIobjv\fR
|
||||||
where each element is a pointer to a Tcl value.
|
where each element is a pointer to a Tcl value.
|
||||||
If \fIobjc\fR is less than or equal to zero,
|
If \fIobjc\fR is less than or equal to zero,
|
||||||
they return an empty value.
|
they return an empty value. If \fIobjv\fR is NULL, the resulting list
|
||||||
|
contains 0 elements, with reserved space in an internal representation
|
||||||
|
for \fIobjc\fR more elements (to avoid its reallocation later).
|
||||||
The new value's string representation is left invalid.
|
The new value's string representation is left invalid.
|
||||||
The two procedures increment the reference counts
|
The two procedures increment the reference counts
|
||||||
of the elements in \fIobjc\fR since the list value now refers to them.
|
of the elements in \fIobjc\fR since the list value now refers to them.
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
.\"
|
.\"
|
||||||
.\" Copyright (c) 2008 by Kevin B. Kenny.
|
.\" Copyright (c) 2008 Kevin B. Kenny.
|
||||||
.\" Copyright (c) 2018 by Nathan Coulter.
|
.\" Copyright (c) 2018 Nathan Coulter.
|
||||||
.\"
|
.\"
|
||||||
'\" See the file "license.terms" for information on usage and redistribution
|
'\" See the file "license.terms" for information on usage and redistribution
|
||||||
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
@@ -232,5 +232,5 @@ Tcl_CreateCommand(3), Tcl_CreateObjCommand(3), Tcl_EvalObjEx(3), Tcl_GetCommandF
|
|||||||
.SH KEYWORDS
|
.SH KEYWORDS
|
||||||
stackless, nonrecursive, execute, command, global, value, result, script
|
stackless, nonrecursive, execute, command, global, value, result, script
|
||||||
.SH COPYRIGHT
|
.SH COPYRIGHT
|
||||||
Copyright (c) 2008 by Kevin B. Kenny.
|
Copyright \(co 2008 Kevin B. Kenny.
|
||||||
Copyright (c) 2018 by Nathan Coulter.
|
Copyright \(co 2018 Nathan Coulter.
|
||||||
|
|||||||
@@ -85,14 +85,12 @@ unless \fIinterp\fR is NULL.
|
|||||||
Otherwise, it returns \fBTCL_OK\fR.
|
Otherwise, it returns \fBTCL_OK\fR.
|
||||||
Passing a NULL \fIinterp\fR allows this procedure to be used
|
Passing a NULL \fIinterp\fR allows this procedure to be used
|
||||||
as a test whether the conversion can be done (and in fact was done).
|
as a test whether the conversion can be done (and in fact was done).
|
||||||
.VS 8.5
|
|
||||||
.PP
|
.PP
|
||||||
In many cases, the \fItypePtr->setFromAnyProc\fR routine will
|
In many cases, the \fItypePtr->setFromAnyProc\fR routine will
|
||||||
set \fIobjPtr->typePtr\fR to the argument value \fItypePtr\fR,
|
set \fIobjPtr->typePtr\fR to the argument value \fItypePtr\fR,
|
||||||
but that is no longer guaranteed. The \fIsetFromAnyProc\fR is
|
but that is no longer guaranteed. The \fIsetFromAnyProc\fR is
|
||||||
free to set the internal representation for \fIobjPtr\fR to make
|
free to set the internal representation for \fIobjPtr\fR to make
|
||||||
use of another related Tcl_ObjType, if it sees fit.
|
use of another related Tcl_ObjType, if it sees fit.
|
||||||
.VE 8.5
|
|
||||||
.SH "THE TCL_OBJTYPE STRUCTURE"
|
.SH "THE TCL_OBJTYPE STRUCTURE"
|
||||||
.PP
|
.PP
|
||||||
Extension writers can define new value types by defining four
|
Extension writers can define new value types by defining four
|
||||||
|
|||||||
@@ -277,7 +277,7 @@ If an error occurs while opening the channel, \fBTcl_OpenCommandChannel\fR
|
|||||||
returns NULL and records a POSIX error code that can be retrieved with
|
returns NULL and records a POSIX error code that can be retrieved with
|
||||||
\fBTcl_GetErrno\fR.
|
\fBTcl_GetErrno\fR.
|
||||||
In addition, \fBTcl_OpenCommandChannel\fR leaves an error message in
|
In addition, \fBTcl_OpenCommandChannel\fR leaves an error message in
|
||||||
the interpreter's result if \fIinterp\fR is not NULL.
|
the interpreter's result. \fIinterp\fR cannot be NULL.
|
||||||
.PP
|
.PP
|
||||||
The newly created channel is not registered in the supplied interpreter; to
|
The newly created channel is not registered in the supplied interpreter; to
|
||||||
register it, use \fBTcl_RegisterChannel\fR, described below.
|
register it, use \fBTcl_RegisterChannel\fR, described below.
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ In a freshly loaded Tcl library, \fBTcl_Panic\fR prints the formatted
|
|||||||
error message to the standard error file of the process, and then
|
error message to the standard error file of the process, and then
|
||||||
calls \fBabort\fR to terminate the process. \fBTcl_Panic\fR does not
|
calls \fBabort\fR to terminate the process. \fBTcl_Panic\fR does not
|
||||||
return. On Windows, when a debugger is running, the formatted error
|
return. On Windows, when a debugger is running, the formatted error
|
||||||
message is sent to the debugger in stead. If the windows executable
|
message is sent to the debugger instead. If the windows executable
|
||||||
does not have a stderr channel (e.g. \fBwish.exe\fR), then a
|
does not have a stderr channel (e.g. \fBwish.exe\fR), then a
|
||||||
system dialog box is used to display the panic message.
|
system dialog box is used to display the panic message.
|
||||||
.PP
|
.PP
|
||||||
|
|||||||
@@ -103,8 +103,8 @@ the argument's value. The following values are acceptable values for
|
|||||||
\fBTCL_ARGV_CONSTANT\fR
|
\fBTCL_ARGV_CONSTANT\fR
|
||||||
.
|
.
|
||||||
The argument does not take any following value argument. If this argument is
|
The argument does not take any following value argument. If this argument is
|
||||||
present, the int pointed to by the \fIsrcPtr\fR field is copied to the
|
present, the (integer) value of the \fIsrcPtr\fR field is copied to the variable
|
||||||
\fIdstPtr\fR field. The \fIclientData\fR field is ignored.
|
pointed to by the \fIdstPtr\fR field. The \fIclientData\fR field is ignored.
|
||||||
.TP
|
.TP
|
||||||
\fBTCL_ARGV_END\fR
|
\fBTCL_ARGV_END\fR
|
||||||
.
|
.
|
||||||
|
|||||||
@@ -302,7 +302,7 @@ The \fInumComponents\fR field is always 0.
|
|||||||
.TP
|
.TP
|
||||||
\fBTCL_TOKEN_BS\fR
|
\fBTCL_TOKEN_BS\fR
|
||||||
.
|
.
|
||||||
The token describes a backslash sequence such as \fB\en\fR or \fB\e0xa3\fR.
|
The token describes a backslash sequence such as \fB\en\fR or \fB\e0xA3\fR.
|
||||||
The \fInumComponents\fR field is always 0.
|
The \fInumComponents\fR field is always 0.
|
||||||
.TP
|
.TP
|
||||||
\fBTCL_TOKEN_COMMAND\fR
|
\fBTCL_TOKEN_COMMAND\fR
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
'\"
|
'\"
|
||||||
'\" Copyright (c) 1997 by Sun Microsystems, Inc.
|
'\" Copyright (c) 1997 Sun Microsystems, Inc.
|
||||||
'\" Contributions from Don Porter, NIST, 2004. (not subject to US copyright)
|
'\" Contributions from Don Porter, NIST, 2004. (not subject to US copyright)
|
||||||
'\"
|
'\"
|
||||||
'\" See the file "license.terms" for information on usage and redistribution
|
'\" See the file "license.terms" for information on usage and redistribution
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
'\" See the file "license.terms" for information on usage and redistribution
|
'\" See the file "license.terms" for information on usage and redistribution
|
||||||
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
'\"
|
'\"
|
||||||
.TH Tcl_SetResult 3 8.0 Tcl "Tcl Library Procedures"
|
.TH Tcl_SetResult 3 8.6 Tcl "Tcl Library Procedures"
|
||||||
.so man.macros
|
.so man.macros
|
||||||
.BS
|
.BS
|
||||||
.SH NAME
|
.SH NAME
|
||||||
@@ -31,7 +31,7 @@ const char *
|
|||||||
\fBTcl_ResetResult\fR(\fIinterp\fR)
|
\fBTcl_ResetResult\fR(\fIinterp\fR)
|
||||||
.sp
|
.sp
|
||||||
.VS 8.6
|
.VS 8.6
|
||||||
\fBTcl_TransferResult\fR(\fIsourceInterp, result, targetInterp\fR)
|
\fBTcl_TransferResult\fR(\fIsourceInterp, code, targetInterp\fR)
|
||||||
.VE 8.6
|
.VE 8.6
|
||||||
.sp
|
.sp
|
||||||
\fBTcl_AppendElement\fR(\fIinterp, element\fR)
|
\fBTcl_AppendElement\fR(\fIinterp, element\fR)
|
||||||
@@ -58,16 +58,15 @@ An argument list which must have been initialized using
|
|||||||
\fBva_start\fR, and cleared using \fBva_end\fR.
|
\fBva_start\fR, and cleared using \fBva_end\fR.
|
||||||
.AP Tcl_Interp *sourceInterp in
|
.AP Tcl_Interp *sourceInterp in
|
||||||
.VS 8.6
|
.VS 8.6
|
||||||
Interpreter that the result and error information should be copied from.
|
Interpreter that the result and return options should be transferred from.
|
||||||
.VE 8.6
|
.VE 8.6
|
||||||
.AP Tcl_Interp *targetInterp in
|
.AP Tcl_Interp *targetInterp in
|
||||||
.VS 8.6
|
.VS 8.6
|
||||||
Interpreter that the result and error information should be copied to.
|
Interpreter that the result and return options should be transferred to.
|
||||||
.VE 8.6
|
.VE 8.6
|
||||||
.AP int result in
|
.AP int code in
|
||||||
.VS 8.6
|
.VS 8.6
|
||||||
If \fBTCL_OK\fR, only copy the result. If \fBTCL_ERROR\fR, copy the error
|
Return code value that controls transfer of return options.
|
||||||
information as well.
|
|
||||||
.VE 8.6
|
.VE 8.6
|
||||||
.BE
|
.BE
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
@@ -156,10 +155,14 @@ call; the last argument in the list must be a NULL pointer.
|
|||||||
instead of taking a variable number of arguments it takes an argument list.
|
instead of taking a variable number of arguments it takes an argument list.
|
||||||
.PP
|
.PP
|
||||||
.VS 8.6
|
.VS 8.6
|
||||||
\fBTcl_TransferResult\fR moves a result from one interpreter to another,
|
\fBTcl_TransferResult\fR transfers interpreter state from \fIsourceInterp\fR
|
||||||
optionally (dependent on the \fIresult\fR parameter) including the error
|
to \fItargetInterp\fR. The two interpreters must have been created in the
|
||||||
information dictionary as well. The interpreters must be in the same thread.
|
same thread. If \fIsourceInterp\fR and \fItargetInterp\fR are the same,
|
||||||
The source interpreter will have its result reset by this operation.
|
nothing is done. Otherwise, \fBTcl_TransferResult\fR moves the result
|
||||||
|
from \fIsourceInterp\fR to \fItargetInterp\fR, and resets the result
|
||||||
|
in \fIsourceInterp\fR. It also moves the return options dictionary as
|
||||||
|
controlled by the return code value \fIcode\fR in the same manner
|
||||||
|
as \fBTcl_GetReturnOptions\fR.
|
||||||
.VE 8.6
|
.VE 8.6
|
||||||
.SH "DEPRECATED INTERFACES"
|
.SH "DEPRECATED INTERFACES"
|
||||||
.SS "OLD STRING PROCEDURES"
|
.SS "OLD STRING PROCEDURES"
|
||||||
@@ -250,6 +253,7 @@ typedef void \fBTcl_FreeProc\fR(
|
|||||||
When \fIfreeProc\fR is called, its \fIblockPtr\fR will be set to
|
When \fIfreeProc\fR is called, its \fIblockPtr\fR will be set to
|
||||||
the value of \fIresult\fR passed to \fBTcl_SetResult\fR.
|
the value of \fIresult\fR passed to \fBTcl_SetResult\fR.
|
||||||
.SH "SEE ALSO"
|
.SH "SEE ALSO"
|
||||||
Tcl_AddErrorInfo, Tcl_CreateObjCommand, Tcl_SetErrorCode, Tcl_Interp
|
Tcl_AddErrorInfo, Tcl_CreateObjCommand, Tcl_SetErrorCode, Tcl_Interp,
|
||||||
|
Tcl_GetReturnOptions
|
||||||
.SH KEYWORDS
|
.SH KEYWORDS
|
||||||
append, command, element, list, value, result, return value, interpreter
|
append, command, element, list, value, result, return value, interpreter
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
'\"
|
'\"
|
||||||
'\" Copyright (c) 1998-2000 by Scriptics Corporation.
|
'\" Copyright (c) 1998-2000 Scriptics Corporation.
|
||||||
'\" All rights reserved.
|
'\" All rights reserved.
|
||||||
'\"
|
'\"
|
||||||
.TH Tcl_SourceRCFile 3 8.3 Tcl "Tcl Library Procedures"
|
.TH Tcl_SourceRCFile 3 8.3 Tcl "Tcl Library Procedures"
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
'\"
|
'\"
|
||||||
'\" Copyright (c) 2001 by ActiveState Corporation
|
'\" Copyright (c) 2001 ActiveState Corporation
|
||||||
'\"
|
'\"
|
||||||
'\" See the file "license.terms" for information on usage and redistribution
|
'\" See the file "license.terms" for information on usage and redistribution
|
||||||
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
|
|||||||
@@ -91,7 +91,7 @@ Points to the first byte of an array of UTF-8-encoded bytes
|
|||||||
used to set or append to a string value.
|
used to set or append to a string value.
|
||||||
This byte array may contain embedded null characters
|
This byte array may contain embedded null characters
|
||||||
unless \fInumChars\fR is negative. (Applications needing null bytes
|
unless \fInumChars\fR is negative. (Applications needing null bytes
|
||||||
should represent them as the two-byte sequence \fI\e700\e600\fR, use
|
should represent them as the two-byte sequence \fI\e300\e200\fR, use
|
||||||
\fBTcl_ExternalToUtf\fR to convert, or \fBTcl_NewByteArrayObj\fR if
|
\fBTcl_ExternalToUtf\fR to convert, or \fBTcl_NewByteArrayObj\fR if
|
||||||
the string is a collection of uninterpreted bytes.)
|
the string is a collection of uninterpreted bytes.)
|
||||||
.AP int length in
|
.AP int length in
|
||||||
@@ -204,7 +204,8 @@ where the caller does not need the length of the unicode string
|
|||||||
representation.
|
representation.
|
||||||
.PP
|
.PP
|
||||||
\fBTcl_GetUniChar\fR returns the \fIindex\fR'th character in the
|
\fBTcl_GetUniChar\fR returns the \fIindex\fR'th character in the
|
||||||
value's Unicode representation.
|
value's Unicode representation. The index is assumed to be in the
|
||||||
|
appropriate range.
|
||||||
.PP
|
.PP
|
||||||
\fBTcl_GetRange\fR returns a newly created value comprised of the
|
\fBTcl_GetRange\fR returns a newly created value comprised of the
|
||||||
characters between \fIfirst\fR and \fIlast\fR (inclusive) in the
|
characters between \fIfirst\fR and \fIlast\fR (inclusive) in the
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
'\"
|
'\"
|
||||||
'\" Copyright (c) 1992-1999 Karl Lehenbauer and Mark Diekhans.
|
'\" Copyright (c) 1992-1999 Karl Lehenbauer & Mark Diekhans.
|
||||||
'\" Copyright (c) 2000 by Scriptics Corporation.
|
'\" Copyright (c) 2000 Scriptics Corporation.
|
||||||
'\" All rights reserved.
|
'\" All rights reserved.
|
||||||
'\"
|
'\"
|
||||||
.TH TCL_MEM_DEBUG 3 8.1 Tcl "Tcl Library Procedures"
|
.TH TCL_MEM_DEBUG 3 8.1 Tcl "Tcl Library Procedures"
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ against the standard Tcl library. Extensions (stub-enabled or
|
|||||||
not) are not intended to call \fBTcl_Main\fR.
|
not) are not intended to call \fBTcl_Main\fR.
|
||||||
.PP
|
.PP
|
||||||
\fBTcl_Main\fR is not thread-safe. It should only be called by
|
\fBTcl_Main\fR is not thread-safe. It should only be called by
|
||||||
a single master thread of a multi-threaded application. This
|
a single main thread of a multi-threaded application. This
|
||||||
restriction is not a problem with normal use described above.
|
restriction is not a problem with normal use described above.
|
||||||
.PP
|
.PP
|
||||||
\fBTcl_Main\fR and therefore all applications based upon it, like
|
\fBTcl_Main\fR and therefore all applications based upon it, like
|
||||||
@@ -112,7 +112,7 @@ The file name and encoding values managed by the routines
|
|||||||
\fBTcl_SetStartupScript\fR and \fBTcl_GetStartupScript\fR
|
\fBTcl_SetStartupScript\fR and \fBTcl_GetStartupScript\fR
|
||||||
are stored per-thread. Although the storage and retrieval
|
are stored per-thread. Although the storage and retrieval
|
||||||
functions of these routines work in any thread, only those
|
functions of these routines work in any thread, only those
|
||||||
calls in the same master thread as \fBTcl_Main\fR can have
|
calls in the same main thread as \fBTcl_Main\fR can have
|
||||||
any influence on it.
|
any influence on it.
|
||||||
.PP
|
.PP
|
||||||
The caller of \fBTcl_Main\fR may call \fBTcl_SetStartupScript\fR
|
The caller of \fBTcl_Main\fR may call \fBTcl_SetStartupScript\fR
|
||||||
@@ -126,7 +126,7 @@ a \fIstartup script\fR, and \fIname\fR is taken to be the name
|
|||||||
of the encoding of the contents of that file. \fBTcl_Main\fR
|
of the encoding of the contents of that file. \fBTcl_Main\fR
|
||||||
then calls \fBTcl_SetStartupScript\fR with these values.
|
then calls \fBTcl_SetStartupScript\fR with these values.
|
||||||
.PP
|
.PP
|
||||||
\fBTcl_Main\fR then defines in its master interpreter
|
\fBTcl_Main\fR then defines in its main interpreter
|
||||||
the Tcl variables \fIargc\fR, \fIargv\fR, \fIargv0\fR, and
|
the Tcl variables \fIargc\fR, \fIargv\fR, \fIargv0\fR, and
|
||||||
\fItcl_interactive\fR, as described in the documentation for \fBtclsh\fR.
|
\fItcl_interactive\fR, as described in the documentation for \fBtclsh\fR.
|
||||||
.PP
|
.PP
|
||||||
@@ -154,9 +154,9 @@ When the \fIappInitProc\fR is finished, \fBTcl_Main\fR calls
|
|||||||
been requested, if any. If a startup script has been provided,
|
been requested, if any. If a startup script has been provided,
|
||||||
\fBTcl_Main\fR attempts to evaluate it. Otherwise, interactive
|
\fBTcl_Main\fR attempts to evaluate it. Otherwise, interactive
|
||||||
mode begins with examination of the variable \fItcl_rcFileName\fR
|
mode begins with examination of the variable \fItcl_rcFileName\fR
|
||||||
in the master interpreter. If that variable exists and holds the
|
in the main interpreter. If that variable exists and holds the
|
||||||
name of a readable file, the contents of that file are evaluated
|
name of a readable file, the contents of that file are evaluated
|
||||||
in the master interpreter. Then interactive operations begin,
|
in the main interpreter. Then interactive operations begin,
|
||||||
with prompts and command evaluation results written to the standard
|
with prompts and command evaluation results written to the standard
|
||||||
output channel, and commands read from the standard input channel
|
output channel, and commands read from the standard input channel
|
||||||
and then evaluated. The prompts written to the standard output
|
and then evaluated. The prompts written to the standard output
|
||||||
@@ -164,7 +164,7 @@ channel may be customized by defining the Tcl variables \fItcl_prompt1\fR
|
|||||||
and \fItcl_prompt2\fR as described in the documentation for \fBtclsh\fR.
|
and \fItcl_prompt2\fR as described in the documentation for \fBtclsh\fR.
|
||||||
The prompts and command evaluation results are written to the standard
|
The prompts and command evaluation results are written to the standard
|
||||||
output channel only if the Tcl variable \fItcl_interactive\fR in the
|
output channel only if the Tcl variable \fItcl_interactive\fR in the
|
||||||
master interpreter holds a non-zero integer value.
|
main interpreter holds a non-zero integer value.
|
||||||
.PP
|
.PP
|
||||||
\fBTcl_SetMainLoop\fR allows setting an event loop procedure to be run.
|
\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
|
This allows, for example, Tk to be dynamically loaded and set its event
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
'\"
|
'\"
|
||||||
'\" Copyright (c) 1997 by Sun Microsystems, Inc.
|
'\" Copyright (c) 1997 Sun Microsystems, Inc.
|
||||||
'\"
|
'\"
|
||||||
'\" See the file "license.terms" for information on usage and redistribution
|
'\" See the file "license.terms" for information on usage and redistribution
|
||||||
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
@@ -80,9 +80,10 @@ and all following characters into their lower-case equivalents.
|
|||||||
|
|
||||||
.SH BUGS
|
.SH BUGS
|
||||||
.PP
|
.PP
|
||||||
At this time, the case conversions are only defined for the ISO8859-1
|
At this time, the case conversions are only defined for the Unicode
|
||||||
characters. Unicode characters above 0x00ff are not modified by these
|
plane 0 characters. The result for Unicode characters above 0xFFFF
|
||||||
routines.
|
is undefined, but - actually - only the lower 16 bits of the
|
||||||
|
character value is handled.
|
||||||
|
|
||||||
.SH KEYWORDS
|
.SH KEYWORDS
|
||||||
utf, unicode, toupper, tolower, totitle, case
|
utf, unicode, toupper, tolower, totitle, case
|
||||||
|
|||||||
@@ -331,11 +331,11 @@ trace procedures will always be invoked.
|
|||||||
.SH "RESTRICTIONS"
|
.SH "RESTRICTIONS"
|
||||||
.PP
|
.PP
|
||||||
A trace procedure can be called at any time, even when there
|
A trace procedure can be called at any time, even when there
|
||||||
is a partially formed result in the interpreter's result area. If
|
are partially formed results stored in the interpreter. If
|
||||||
the trace procedure does anything that could damage this result (such
|
the trace procedure does anything that could damage this result (such
|
||||||
as calling \fBTcl_Eval\fR) then it must save the original values of
|
as calling \fBTcl_Eval\fR) then it must use the \fBTcl_SaveInterpState\fR
|
||||||
the interpreter's \fBresult\fR and \fBfreeProc\fR fields and restore
|
and related routines to save and restore the original state of
|
||||||
them before it returns.
|
the interpreter before it returns.
|
||||||
.SH "UNDEFINED VARIABLES"
|
.SH "UNDEFINED VARIABLES"
|
||||||
.PP
|
.PP
|
||||||
It is legal to set a trace on an undefined variable.
|
It is legal to set a trace on an undefined variable.
|
||||||
|
|||||||
34
doc/Utf.3
34
doc/Utf.3
@@ -141,8 +141,8 @@ source buffer is long enough such that this routine does not run off the
|
|||||||
end and dereference non-existent or random memory; if the source buffer
|
end and dereference non-existent or random memory; if the source buffer
|
||||||
is known to be null-terminated, this will not happen. If the input is
|
is known to be null-terminated, this will not happen. If the input is
|
||||||
not in proper UTF-8 format, \fBTcl_UtfToUniChar\fR will store the first
|
not in proper UTF-8 format, \fBTcl_UtfToUniChar\fR will store the first
|
||||||
byte of \fIsrc\fR in \fI*chPtr\fR as a Tcl_UniChar between 0x0000 and
|
byte of \fIsrc\fR in \fI*chPtr\fR as a Tcl_UniChar between 0x0080 and
|
||||||
0x00ff and return 1.
|
0x00FF and return 1.
|
||||||
.PP
|
.PP
|
||||||
\fBTcl_UniCharToUtfDString\fR converts the given Unicode string
|
\fBTcl_UniCharToUtfDString\fR converts the given Unicode string
|
||||||
to UTF-8, storing the result in a previously initialized \fBTcl_DString\fR.
|
to UTF-8, storing the result in a previously initialized \fBTcl_DString\fR.
|
||||||
@@ -223,13 +223,27 @@ string. The caller must not ask for the next character after the last
|
|||||||
character in the string if the string is not terminated by a null
|
character in the string if the string is not terminated by a null
|
||||||
character.
|
character.
|
||||||
.PP
|
.PP
|
||||||
Given \fIsrc\fR, a pointer to some location in a UTF-8 string (or to a
|
\fBTcl_UtfPrev\fR is used to step backward through but not beyond the
|
||||||
null byte immediately following such a string), \fBTcl_UtfPrev\fR
|
UTF-8 string that begins at \fIstart\fR. If the UTF-8 string is made
|
||||||
returns a pointer to the closest preceding byte that starts a UTF-8
|
up entirely of complete and well-formed characters, and \fIsrc\fR points
|
||||||
character.
|
to the lead byte of one of those characters (or to the location one byte
|
||||||
This function will not back up to a position before \fIstart\fR,
|
past the end of the string), then repeated calls of \fBTcl_UtfPrev\fR will
|
||||||
the start of the UTF-8 string. If \fIsrc\fR was already at \fIstart\fR, the
|
return pointers to the lead bytes of each character in the string, one
|
||||||
return value will be \fIstart\fR.
|
character at a time, terminating when it returns \fIstart\fR.
|
||||||
|
.PP
|
||||||
|
When the conditions of completeness and well-formedness may not be satisfied,
|
||||||
|
a more precise description of the function of \fBTcl_UtfPrev\fR is necessary.
|
||||||
|
It always returns a pointer greater than or equal to \fIstart\fR; that is,
|
||||||
|
always a pointer to a location in the string. It always returns a pointer to
|
||||||
|
a byte that begins a character when scanning for characters beginning
|
||||||
|
from \fIstart\fR. When \fIsrc\fR is greater than \fIstart\fR, it
|
||||||
|
always returns a pointer less than \fIsrc\fR and greater than or
|
||||||
|
equal to (\fIsrc\fR - \fBTCL_UTF_MAX\fR). The character that begins
|
||||||
|
at the returned pointer is the first one that either includes the
|
||||||
|
byte \fIsrc[-1]\fR, or might include it if the right trail bytes are
|
||||||
|
present at \fIsrc\fR and greater. \fBTcl_UtfPrev\fR never reads the
|
||||||
|
byte \fIsrc[0]\fR nor the byte \fIstart[-1]\fR nor the byte
|
||||||
|
\fIsrc[-\fBTCL_UTF_MAX\fI-1]\fR.
|
||||||
.PP
|
.PP
|
||||||
\fBTcl_UniCharAtIndex\fR corresponds to a C string array dereference or the
|
\fBTcl_UniCharAtIndex\fR corresponds to a C string array dereference or the
|
||||||
Pascal Ord() function. It returns the Tcl_UniChar represented at the
|
Pascal Ord() function. It returns the Tcl_UniChar represented at the
|
||||||
@@ -240,7 +254,7 @@ characters. Behavior is undefined if a negative \fIindex\fR is given.
|
|||||||
\fBTcl_UtfAtIndex\fR returns a pointer to the specified character (not
|
\fBTcl_UtfAtIndex\fR returns a pointer to the specified character (not
|
||||||
byte) \fIindex\fR in the UTF-8 string \fIsrc\fR. The source string must
|
byte) \fIindex\fR in the UTF-8 string \fIsrc\fR. The source string must
|
||||||
contain at least \fIindex\fR characters. This is equivalent to calling
|
contain at least \fIindex\fR characters. This is equivalent to calling
|
||||||
\fBTcl_UtfNext\fR \fIindex\fR times. If a negative \fIindex\fR is given,
|
\fBTcl_UtfToUniChar\fR \fIindex\fR times. If a negative \fIindex\fR is given,
|
||||||
the return pointer points to the first character in the source string.
|
the return pointer points to the first character in the source string.
|
||||||
.PP
|
.PP
|
||||||
\fBTcl_UtfBackslash\fR is a utility procedure used by several of the Tcl
|
\fBTcl_UtfBackslash\fR is a utility procedure used by several of the Tcl
|
||||||
|
|||||||
39
doc/binary.n
39
doc/binary.n
@@ -1,6 +1,6 @@
|
|||||||
'\"
|
'\"
|
||||||
'\" Copyright (c) 1997 by Sun Microsystems, Inc.
|
'\" Copyright (c) 1997 Sun Microsystems, Inc.
|
||||||
'\" Copyright (c) 2008 by Donal K. Fellows
|
'\" Copyright (c) 2008 Donal K. Fellows
|
||||||
'\"
|
'\"
|
||||||
'\" See the file "license.terms" for information on usage and redistribution
|
'\" See the file "license.terms" for information on usage and redistribution
|
||||||
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
@@ -78,7 +78,9 @@ During decoding, the following options are supported:
|
|||||||
.TP
|
.TP
|
||||||
\fB\-strict\fR
|
\fB\-strict\fR
|
||||||
.
|
.
|
||||||
Instructs the decoder to throw an error if it encounters whitespace characters. Otherwise it ignores them.
|
Instructs the decoder to throw an error if it encounters any characters
|
||||||
|
that are not strictly part of the encoding itself. Otherwise it ignores them.
|
||||||
|
RFC 2045 calls for base64 decoders to be non-strict.
|
||||||
.RE
|
.RE
|
||||||
.TP
|
.TP
|
||||||
\fBhex\fR
|
\fBhex\fR
|
||||||
@@ -92,7 +94,8 @@ options are supported:
|
|||||||
.TP
|
.TP
|
||||||
\fB\-strict\fR
|
\fB\-strict\fR
|
||||||
.
|
.
|
||||||
Instructs the decoder to throw an error if it encounters whitespace characters. Otherwise it ignores them.
|
Instructs the decoder to throw an error if it encounters whitespace characters.
|
||||||
|
Otherwise it ignores them.
|
||||||
.RE
|
.RE
|
||||||
.TP
|
.TP
|
||||||
\fBuuencode\fR
|
\fBuuencode\fR
|
||||||
@@ -107,23 +110,27 @@ produce files that other implementations of decoders cannot process):
|
|||||||
.TP
|
.TP
|
||||||
\fB\-maxlen \fIlength\fR
|
\fB\-maxlen \fIlength\fR
|
||||||
.
|
.
|
||||||
Indicates that the output should be split into lines of no more than
|
Indicates the maximum number of characters to produce for each encoded line.
|
||||||
\fIlength\fR characters. By default, lines are split every 61 characters, and
|
The valid range is 5 to 85. Line lengths outside that range cannot be
|
||||||
this must be in the range 3 to 85 due to limitations in the encoding.
|
accommodated by the encoding format. The default value is 61.
|
||||||
.TP
|
.TP
|
||||||
\fB\-wrapchar \fIcharacter\fR
|
\fB\-wrapchar \fIcharacter\fR
|
||||||
.
|
.
|
||||||
Indicates that, when lines are split because of the \fB\-maxlen\fR option,
|
Indicates the character(s) to use to mark the end of each encoded line.
|
||||||
\fIcharacter\fR should be used to separate lines. By default, this is a
|
Acceptable values are a sequence of zero or more characters from the
|
||||||
newline character,
|
set { \\x09 (TAB), \\x0B (VT), \\x0C (FF), \\x0D (CR) } followed
|
||||||
.QW \en .
|
by zero or one newline \\x0A (LF). Any other values are rejected because
|
||||||
|
they would generate encoded text that could not be decoded. The default value
|
||||||
|
is a single newline.
|
||||||
.PP
|
.PP
|
||||||
During decoding, the following options are supported:
|
During decoding, the following options are supported:
|
||||||
.TP
|
.TP
|
||||||
\fB\-strict\fR
|
\fB\-strict\fR
|
||||||
.
|
.
|
||||||
Instructs the decoder to throw an error if it encounters unexpected whitespace
|
Instructs the decoder to throw an error if it encounters anything
|
||||||
characters. Otherwise it ignores them.
|
outside of the standard encoding format. Without this option, the
|
||||||
|
decoder tolerates some deviations, mostly to forgive reflows of lines
|
||||||
|
between the encoder and decoder.
|
||||||
.PP
|
.PP
|
||||||
Note that neither the encoder nor the decoder handle the header and footer of
|
Note that neither the encoder nor the decoder handle the header and footer of
|
||||||
the uuencode format.
|
the uuencode format.
|
||||||
@@ -653,7 +660,7 @@ stored in \fIvar2\fR. Note that the integers returned are signed, but
|
|||||||
they can be converted to unsigned 8-bit quantities using an expression
|
they can be converted to unsigned 8-bit quantities using an expression
|
||||||
like:
|
like:
|
||||||
.CS
|
.CS
|
||||||
set num [expr { $num & 0xff }]
|
set num [expr { $num & 0xFF }]
|
||||||
.CE
|
.CE
|
||||||
.RE
|
.RE
|
||||||
.IP \fBs\fR 5
|
.IP \fBs\fR 5
|
||||||
@@ -672,7 +679,7 @@ stored in \fIvar2\fR. Note that the integers returned are signed, but
|
|||||||
they can be converted to unsigned 16-bit quantities using an expression
|
they can be converted to unsigned 16-bit quantities using an expression
|
||||||
like:
|
like:
|
||||||
.CS
|
.CS
|
||||||
set num [expr { $num & 0xffff }]
|
set num [expr { $num & 0xFFFF }]
|
||||||
.CE
|
.CE
|
||||||
.RE
|
.RE
|
||||||
.IP \fBS\fR 5
|
.IP \fBS\fR 5
|
||||||
@@ -709,7 +716,7 @@ stored in \fIvar2\fR. Note that the integers returned are signed, but
|
|||||||
they can be converted to unsigned 32-bit quantities using an expression
|
they can be converted to unsigned 32-bit quantities using an expression
|
||||||
like:
|
like:
|
||||||
.CS
|
.CS
|
||||||
set num [expr { $num & 0xffffffff }]
|
set num [expr { $num & 0xFFFFFFFF }]
|
||||||
.CE
|
.CE
|
||||||
.RE
|
.RE
|
||||||
.IP \fBI\fR 5
|
.IP \fBI\fR 5
|
||||||
|
|||||||
@@ -179,7 +179,7 @@ operating system, as returned by \fBencoding system\fR.
|
|||||||
.TP
|
.TP
|
||||||
\fB\-eofchar\fR \fB{\fIinChar outChar\fB}\fR
|
\fB\-eofchar\fR \fB{\fIinChar outChar\fB}\fR
|
||||||
.
|
.
|
||||||
This option supports DOS file systems that use Control-z (\ex1a) as an
|
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
|
end of file marker. If \fIchar\fR is not an empty string, then this
|
||||||
character signals end-of-file when it is encountered during input.
|
character signals end-of-file when it is encountered during input.
|
||||||
For output, the end-of-file character is output when the channel is
|
For output, the end-of-file character is output when the channel is
|
||||||
@@ -192,7 +192,7 @@ will apply to both reading and writing. When querying the end-of-file
|
|||||||
character of a read-write channel, a two-element list will always be
|
character of a read-write channel, a two-element list will always be
|
||||||
returned. The default value for \fB\-eofchar\fR is the empty string
|
returned. The default value for \fB\-eofchar\fR is the empty string
|
||||||
in all cases except for files under Windows. In that case the
|
in all cases except for files under Windows. In that case the
|
||||||
\fB\-eofchar\fR is Control-z (\ex1a) for reading and the empty string
|
\fB\-eofchar\fR is Control-z (\ex1A) for reading and the empty string
|
||||||
for writing.
|
for writing.
|
||||||
The acceptable range for \fB\-eofchar\fR values is \ex01 - \ex7f;
|
The acceptable range for \fB\-eofchar\fR values is \ex01 - \ex7f;
|
||||||
attempting to set \fB\-eofchar\fR to a value outside of this range will
|
attempting to set \fB\-eofchar\fR to a value outside of this range will
|
||||||
|
|||||||
19
doc/clock.n
19
doc/clock.n
@@ -472,36 +472,36 @@ The following format groups are recognized by the \fBclock scan\fR and
|
|||||||
\fBclock format\fR commands.
|
\fBclock format\fR commands.
|
||||||
.TP
|
.TP
|
||||||
\fB%a\fR
|
\fB%a\fR
|
||||||
On output, receives an abbreviation (\fIe.g.,\fR \fBMon\fR) for the day
|
On output, produces an abbreviation (\fIe.g.,\fR \fBMon\fR) for the day
|
||||||
of the week in the given locale. On input, matches the name of the day
|
of the week in the given locale. On input, matches the name of the day
|
||||||
of the week in the given locale (in either abbreviated or full form, or
|
of the week in the given locale (in either abbreviated or full form, or
|
||||||
any unique prefix of either form).
|
any unique prefix of either form).
|
||||||
.TP
|
.TP
|
||||||
\fB%A\fR
|
\fB%A\fR
|
||||||
On output, receives the full name (\fIe.g.,\fR \fBMonday\fR) of the day
|
On output, produces the full name (\fIe.g.,\fR \fBMonday\fR) of the day
|
||||||
of the week in the given locale. On input, matches the name of the day
|
of the week in the given locale. On input, matches the name of the day
|
||||||
of the week in the given locale (in either abbreviated or full form, or
|
of the week in the given locale (in either abbreviated or full form, or
|
||||||
any unique prefix of either form).
|
any unique prefix of either form).
|
||||||
.TP
|
.TP
|
||||||
\fB%b\fR
|
\fB%b\fR
|
||||||
On output, receives an abbreviation (\fIe.g.,\fR \fBJan\fR) for the name
|
On output, produces an abbreviation (\fIe.g.,\fR \fBJan\fR) for the name
|
||||||
of the month in the given locale. On input, matches the name of the month
|
of the month in the given locale. On input, matches the name of the month
|
||||||
in the given locale (in either abbreviated or full form, or
|
in the given locale (in either abbreviated or full form, or
|
||||||
any unique prefix of either form).
|
any unique prefix of either form).
|
||||||
.TP
|
.TP
|
||||||
\fB%B\fR
|
\fB%B\fR
|
||||||
On output, receives the full name (\fIe.g.,\fR \fBJanuary\fR)
|
On output, produces the full name (\fIe.g.,\fR \fBJanuary\fR)
|
||||||
of the month in the given locale. On input, matches the name of the month
|
of the month in the given locale. On input, matches the name of the month
|
||||||
in the given locale (in either abbreviated or full form, or
|
in the given locale (in either abbreviated or full form, or
|
||||||
any unique prefix of either form).
|
any unique prefix of either form).
|
||||||
.TP
|
.TP
|
||||||
\fB%c\fR
|
\fB%c\fR
|
||||||
On output, receives a localized representation of date and time of day;
|
On output, produces a localized representation of date and time of day;
|
||||||
the localized representation is expected to use the Gregorian calendar.
|
the localized representation is expected to use the Gregorian calendar.
|
||||||
On input, matches whatever \fB%c\fR produces.
|
On input, matches whatever \fB%c\fR produces.
|
||||||
.TP
|
.TP
|
||||||
\fB%C\fR
|
\fB%C\fR
|
||||||
On output, receives the number of the century in Indo-Arabic numerals.
|
On output, produces the number of the century in Indo-Arabic numerals.
|
||||||
On input, matches one or two digits, possibly with leading whitespace,
|
On input, matches one or two digits, possibly with leading whitespace,
|
||||||
that are expected to be the number of the century.
|
that are expected to be the number of the century.
|
||||||
.TP
|
.TP
|
||||||
@@ -913,9 +913,10 @@ An ISO 8601 point-in-time specification, such as
|
|||||||
where \fBT\fR is the literal
|
where \fBT\fR is the literal
|
||||||
.QW T ,
|
.QW T ,
|
||||||
.QW "\fICCyymmdd hhmmss\fR" ,
|
.QW "\fICCyymmdd hhmmss\fR" ,
|
||||||
|
.QW \fICCyymmdd\fBT\fIhh:mm:ss\fR ,
|
||||||
or
|
or
|
||||||
.QW \fICCyymmdd\fBT\fIhh:mm:ss\fR .
|
.QW \fICCyy-mm-dd\fBT\fIhh:mm:ss\fR.
|
||||||
Note that only these three formats are accepted.
|
Note that only these four formats are accepted.
|
||||||
The command does \fInot\fR accept the full range of point-in-time
|
The command does \fInot\fR accept the full range of point-in-time
|
||||||
specifications specified in ISO8601. Other formats can be recognized by
|
specifications specified in ISO8601. Other formats can be recognized by
|
||||||
giving an explicit \fB\-format\fR option to the \fBclock scan\fR command.
|
giving an explicit \fB\-format\fR option to the \fBclock scan\fR command.
|
||||||
@@ -945,7 +946,7 @@ msgcat(n)
|
|||||||
.SH KEYWORDS
|
.SH KEYWORDS
|
||||||
clock, date, time
|
clock, date, time
|
||||||
.SH "COPYRIGHT"
|
.SH "COPYRIGHT"
|
||||||
Copyright (c) 2004 Kevin B. Kenny <kennykb@acm.org>. All rights reserved.
|
Copyright \(co 2004 Kevin B. Kenny <kennykb@acm.org>. All rights reserved.
|
||||||
'\" Local Variables:
|
'\" Local Variables:
|
||||||
'\" mode: nroff
|
'\" mode: nroff
|
||||||
'\" End:
|
'\" End:
|
||||||
|
|||||||
18
doc/define.n
18
doc/define.n
@@ -55,7 +55,8 @@ string, the constructor will be deleted.
|
|||||||
This deletes each of the methods called \fIname\fR from a class. The methods
|
This deletes each of the methods called \fIname\fR from a class. The methods
|
||||||
must have previously existed in that class. Does not affect the superclasses
|
must have previously existed in that class. Does not affect the superclasses
|
||||||
of the class, nor does it affect the subclasses or instances of the class
|
of the class, nor does it affect the subclasses or instances of the class
|
||||||
(except when they have a call chain through the class being modified).
|
(except when they have a call chain through the class being modified) or the
|
||||||
|
class object itself.
|
||||||
.TP
|
.TP
|
||||||
\fBdestructor\fI bodyScript\fR
|
\fBdestructor\fI bodyScript\fR
|
||||||
.
|
.
|
||||||
@@ -135,7 +136,8 @@ This renames the method called \fIfromName\fR in a class to \fItoName\fR. The
|
|||||||
method must have previously existed in the class, and \fItoName\fR must not
|
method must have previously existed in the class, and \fItoName\fR must not
|
||||||
previously refer to a method in that class. Does not affect the superclasses
|
previously refer to a method in that class. Does not affect the superclasses
|
||||||
of the class, nor does it affect the subclasses or instances of the class
|
of the class, nor does it affect the subclasses or instances of the class
|
||||||
(except when they have a call chain through the class being modified). Does
|
(except when they have a call chain through the class being modified), or the
|
||||||
|
class object itself. Does
|
||||||
not change the export status of the method; if it was exported before, it will
|
not change the export status of the method; if it was exported before, it will
|
||||||
be afterwards.
|
be afterwards.
|
||||||
.TP
|
.TP
|
||||||
@@ -203,8 +205,10 @@ well be in an inconsistent state unless additional configuration work is done.
|
|||||||
\fBdeletemethod\fI name\fR ?\fIname ...\fR
|
\fBdeletemethod\fI name\fR ?\fIname ...\fR
|
||||||
.
|
.
|
||||||
This deletes each of the methods called \fIname\fR from an object. The methods
|
This deletes each of the methods called \fIname\fR from an object. The methods
|
||||||
must have previously existed in that object. Does not affect the classes that
|
must have previously existed in that object (e.g., because it was created
|
||||||
the object is an instance of.
|
through \fBoo::objdefine method\fR). Does not affect the classes that the
|
||||||
|
object is an instance of, or remove the exposure of those class-provided
|
||||||
|
methods in the instance of that class.
|
||||||
.TP
|
.TP
|
||||||
\fBexport\fI name \fR?\fIname ...\fR?
|
\fBexport\fI name \fR?\fIname ...\fR?
|
||||||
.
|
.
|
||||||
@@ -262,8 +266,10 @@ By default, this slot works by replacement.
|
|||||||
This renames the method called \fIfromName\fR in an object to \fItoName\fR.
|
This renames the method called \fIfromName\fR in an object to \fItoName\fR.
|
||||||
The method must have previously existed in the object, and \fItoName\fR must
|
The method must have previously existed in the object, and \fItoName\fR must
|
||||||
not previously refer to a method in that object. Does not affect the classes
|
not previously refer to a method in that object. Does not affect the classes
|
||||||
that the object is an instance of. Does not change the export status of the
|
that the object is an instance of and cannot rename in an instance object the
|
||||||
method; if it was exported before, it will be afterwards.
|
methods provided by those classes (though a \fBoo::objdefine forward\fRed
|
||||||
|
method may provide an equivalent capability). Does not change the export
|
||||||
|
status of the method; if it was exported before, it will be afterwards.
|
||||||
.TP
|
.TP
|
||||||
\fBunexport\fI name \fR?\fIname ...\fR?
|
\fBunexport\fI name \fR?\fIname ...\fR?
|
||||||
.
|
.
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ of the given patterns (in the style of \fBstring match\fR.)
|
|||||||
.
|
.
|
||||||
The script rule tests for matching by assigning the key to the
|
The script rule tests for matching by assigning the key to the
|
||||||
\fIkeyVariable\fR and the value to the \fIvalueVariable\fR, and then evaluating
|
\fIkeyVariable\fR and the value to the \fIvalueVariable\fR, and then evaluating
|
||||||
the given script which should return a boolean value (with the
|
the given script which should result in a boolean value (with the
|
||||||
key/value pair only being included in the result of the \fBdict
|
key/value pair only being included in the result of the \fBdict
|
||||||
filter\fR when a true value is returned.) Note that the first
|
filter\fR when a true value is returned.) Note that the first
|
||||||
argument after the rule selection word is a two-element list. If the
|
argument after the rule selection word is a two-element list. If the
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
'\"
|
'\"
|
||||||
'\" Copyright (c) 1998 by Scriptics Corporation.
|
'\" Copyright (c) 1998 Scriptics Corporation.
|
||||||
'\"
|
'\"
|
||||||
'\" See the file "license.terms" for information on usage and redistribution
|
'\" See the file "license.terms" for information on usage and redistribution
|
||||||
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
|
|||||||
15
doc/exec.n
15
doc/exec.n
@@ -246,15 +246,6 @@ the backslash character. If an argument contains forward slashes as the
|
|||||||
path separator, it may or may not be recognized as a path name, depending on
|
path separator, it may or may not be recognized as a path name, depending on
|
||||||
the program.
|
the program.
|
||||||
.PP
|
.PP
|
||||||
Additionally, when calling a 16-bit DOS or Windows 3.X application, all path
|
|
||||||
names must use the short, cryptic, path format (e.g., using
|
|
||||||
.QW applba~1.def
|
|
||||||
instead of
|
|
||||||
.QW applbakery.default ),
|
|
||||||
which can be obtained with the
|
|
||||||
.QW "\fBfile attributes\fI fileName \fB\-shortname\fR"
|
|
||||||
command.
|
|
||||||
.PP
|
|
||||||
Two or more forward or backward slashes in a row in a path refer to a
|
Two or more forward or backward slashes in a row in a path refer to a
|
||||||
network path. For example, a simple concatenation of the root directory
|
network path. For example, a simple concatenation of the root directory
|
||||||
\fBc:/\fR with a subdirectory \fB/windows/system\fR will yield
|
\fBc:/\fR with a subdirectory \fB/windows/system\fR will yield
|
||||||
@@ -295,11 +286,9 @@ The directory from which the Tcl executable was loaded.
|
|||||||
.IP \(bu 3
|
.IP \(bu 3
|
||||||
The current directory.
|
The current directory.
|
||||||
.IP \(bu 3
|
.IP \(bu 3
|
||||||
The Windows NT 32-bit system directory.
|
The Windows 32-bit system directory.
|
||||||
.IP \(bu 3
|
.IP \(bu 3
|
||||||
The Windows NT 16-bit system directory.
|
The Windows home directory.
|
||||||
.IP \(bu 3
|
|
||||||
The Windows NT home directory.
|
|
||||||
.IP \(bu 3
|
.IP \(bu 3
|
||||||
The directories listed in the path.
|
The directories listed in the path.
|
||||||
.PP
|
.PP
|
||||||
|
|||||||
55
doc/expr.n
55
doc/expr.n
@@ -1,7 +1,7 @@
|
|||||||
'\"
|
'\"
|
||||||
'\" Copyright (c) 1993 The Regents of the University of California.
|
'\" Copyright (c) 1993 The Regents of the University of California.
|
||||||
'\" Copyright (c) 1994-2000 Sun Microsystems, Inc.
|
'\" Copyright (c) 1994-2000 Sun Microsystems, Inc.
|
||||||
'\" Copyright (c) 2005 by Kevin B. Kenny <kennykb@acm.org>. All rights reserved
|
'\" Copyright (c) 2005 Kevin B. Kenny <kennykb@acm.org>. All rights reserved
|
||||||
'\"
|
'\"
|
||||||
'\" See the file "license.terms" for information on usage and redistribution
|
'\" See the file "license.terms" for information on usage and redistribution
|
||||||
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
@@ -106,10 +106,10 @@ Then the command on the left side of each of the lines below
|
|||||||
will produce the value on the right side of the line:
|
will produce the value on the right side of the line:
|
||||||
.PP
|
.PP
|
||||||
.CS
|
.CS
|
||||||
.ta 6c
|
.ta 9c
|
||||||
\fBexpr\fR 3.1 + $a \fI6.1\fR
|
\fBexpr\fR {3.1 + $a} \fI6.1\fR
|
||||||
\fBexpr\fR 2 + "$a.$b" \fI5.6\fR
|
\fBexpr\fR {2 + "$a.$b"} \fI5.6\fR
|
||||||
\fBexpr\fR 4*[llength "6 2"] \fI8\fR
|
\fBexpr\fR {4*[llength "6 2"]} \fI8\fR
|
||||||
\fBexpr\fR {{word one} < "word $a"} \fI0\fR
|
\fBexpr\fR {{word one} < "word $a"} \fI0\fR
|
||||||
.CE
|
.CE
|
||||||
.SS OPERATORS
|
.SS OPERATORS
|
||||||
@@ -126,7 +126,8 @@ applied only to integers.
|
|||||||
.TP 20
|
.TP 20
|
||||||
\fB**\fR
|
\fB**\fR
|
||||||
.
|
.
|
||||||
Exponentiation. Valid for any numeric operands.
|
Exponentiation. Valid for any numeric operands. The maximum exponent value
|
||||||
|
that Tcl can handle if the first number is an integer > 1 is 268435455.
|
||||||
.TP 20
|
.TP 20
|
||||||
\fB*\0\0/\0\0%\fR
|
\fB*\0\0/\0\0%\fR
|
||||||
.
|
.
|
||||||
@@ -200,18 +201,23 @@ Bit-wise OR. Valid for integer operands only.
|
|||||||
Logical AND. Produces a 1 result if both operands are non-zero,
|
Logical AND. Produces a 1 result if both operands are non-zero,
|
||||||
0 otherwise.
|
0 otherwise.
|
||||||
Valid for boolean and numeric (integers or floating-point) operands only.
|
Valid for boolean and numeric (integers or floating-point) operands only.
|
||||||
|
This operator evaluates lazily; it only evaluates its second operand if it
|
||||||
|
must in order to determine its result.
|
||||||
.TP 20
|
.TP 20
|
||||||
\fB||\fR
|
\fB||\fR
|
||||||
.
|
.
|
||||||
Logical OR. Produces a 0 result if both operands are zero, 1 otherwise.
|
Logical OR. Produces a 0 result if both operands are zero, 1 otherwise.
|
||||||
Valid for boolean and numeric (integers or floating-point) operands only.
|
Valid for boolean and numeric (integers or floating-point) operands only.
|
||||||
|
This operator evaluates lazily; it only evaluates its second operand if it
|
||||||
|
must in order to determine its result.
|
||||||
.TP 20
|
.TP 20
|
||||||
\fIx\fB?\fIy\fB:\fIz\fR
|
\fIx \fB?\fI y \fB:\fI z\fR
|
||||||
.
|
.
|
||||||
If-then-else, as in C. If \fIx\fR
|
If-then-else, as in C. If \fIx\fR
|
||||||
evaluates to non-zero, then the result is the value of \fIy\fR.
|
evaluates to non-zero, then the result is the value of \fIy\fR.
|
||||||
Otherwise the result is the value of \fIz\fR.
|
Otherwise the result is the value of \fIz\fR.
|
||||||
The \fIx\fR operand must have a boolean or numeric value.
|
The \fIx\fR operand must have a boolean or numeric value.
|
||||||
|
This operator evaluates lazily; it evaluates only one of \fIy\fR or \fIz\fR.
|
||||||
.PP
|
.PP
|
||||||
See the C manual for more details on the results
|
See the C manual for more details on the results
|
||||||
produced by each operator.
|
produced by each operator.
|
||||||
@@ -221,6 +227,7 @@ of the \fBpow\fR function (after any type conversions.)
|
|||||||
All of the binary operators but exponentiation group left-to-right
|
All of the binary operators but exponentiation group left-to-right
|
||||||
within the same precedence level; exponentiation groups right-to-left. For example, the command
|
within the same precedence level; exponentiation groups right-to-left. For example, the command
|
||||||
.PP
|
.PP
|
||||||
|
.PP
|
||||||
.CS
|
.CS
|
||||||
\fBexpr\fR {4*2 < 7}
|
\fBexpr\fR {4*2 < 7}
|
||||||
.CE
|
.CE
|
||||||
@@ -239,7 +246,7 @@ just as in C, which means that operands are not evaluated if they are
|
|||||||
not needed to determine the outcome. For example, in the command
|
not needed to determine the outcome. For example, in the command
|
||||||
.PP
|
.PP
|
||||||
.CS
|
.CS
|
||||||
\fBexpr\fR {$v ? [a] : [b]}
|
\fBexpr\fR {$v?[a]:[b]}
|
||||||
.CE
|
.CE
|
||||||
.PP
|
.PP
|
||||||
only one of
|
only one of
|
||||||
@@ -258,7 +265,7 @@ before invoking the \fBexpr\fR command.
|
|||||||
.PP
|
.PP
|
||||||
When the expression parser encounters a mathematical function
|
When the expression parser encounters a mathematical function
|
||||||
such as \fBsin($x)\fR, it replaces it with a call to an ordinary
|
such as \fBsin($x)\fR, it replaces it with a call to an ordinary
|
||||||
Tcl function in the \fBtcl::mathfunc\fR namespace. The processing
|
Tcl command in the \fBtcl::mathfunc\fR namespace. The processing
|
||||||
of an expression such as:
|
of an expression such as:
|
||||||
.PP
|
.PP
|
||||||
.CS
|
.CS
|
||||||
@@ -390,9 +397,11 @@ set b {$a + 2}
|
|||||||
.CE
|
.CE
|
||||||
.PP
|
.PP
|
||||||
return 11, not a multiple of 4.
|
return 11, not a multiple of 4.
|
||||||
This is because the Tcl parser will first substitute \fB$a + 2\fR for
|
This is because the Tcl parser will first substitute
|
||||||
the variable \fBb\fR,
|
.QW "\fB$a + 2\fR"
|
||||||
then the \fBexpr\fR command will evaluate the expression \fB$a + 2*4\fR.
|
for the variable \fBb\fR,
|
||||||
|
then the \fBexpr\fR command will evaluate the expression
|
||||||
|
.QW "\fB$a + 2*4\fR" .
|
||||||
.PP
|
.PP
|
||||||
Most expressions do not require a second round of substitutions.
|
Most expressions do not require a second round of substitutions.
|
||||||
Either they are enclosed in braces or, if not,
|
Either they are enclosed in braces or, if not,
|
||||||
@@ -406,6 +415,21 @@ The most expensive code is required for
|
|||||||
unbraced expressions that contain command substitutions.
|
unbraced expressions that contain command substitutions.
|
||||||
These expressions must be implemented by generating new code
|
These expressions must be implemented by generating new code
|
||||||
each time the expression is executed.
|
each time the expression is executed.
|
||||||
|
.PP
|
||||||
|
If it is necessary to include a non-constant expression string within the
|
||||||
|
wider context of an otherwise-constant expression, the most efficient
|
||||||
|
technique is to put the varying part inside a recursive \fBexpr\fR, as this at
|
||||||
|
least allows for the compilation of the outer part, though it does mean that
|
||||||
|
the varying part must itself be evaluated as a separate expression. Thus, in
|
||||||
|
this example the result is 20 and the outer expression benefits from fully
|
||||||
|
cached bytecode compilation.
|
||||||
|
.PP
|
||||||
|
.CS
|
||||||
|
set a 3
|
||||||
|
set b {$a + 2}
|
||||||
|
\fBexpr\fR {[\fBexpr\fR $b] * 4}
|
||||||
|
.CE
|
||||||
|
.PP
|
||||||
When the expression is unbraced to allow the substitution of a function or
|
When the expression is unbraced to allow the substitution of a function or
|
||||||
operator, consider using the commands documented in the \fBmathfunc\fR(n) or
|
operator, consider using the commands documented in the \fBmathfunc\fR(n) or
|
||||||
\fBmathop\fR(n) manual pages directly instead.
|
\fBmathop\fR(n) manual pages directly instead.
|
||||||
@@ -466,10 +490,11 @@ string(n), Tcl(n), while(n)
|
|||||||
arithmetic, boolean, compare, expression, fuzzy comparison
|
arithmetic, boolean, compare, expression, fuzzy comparison
|
||||||
.SH COPYRIGHT
|
.SH COPYRIGHT
|
||||||
.nf
|
.nf
|
||||||
Copyright (c) 1993 The Regents of the University of California.
|
Copyright \(co 1993 The Regents of the University of California.
|
||||||
Copyright (c) 1994-2000 Sun Microsystems Incorporated.
|
Copyright \(co 1994-2000 Sun Microsystems Incorporated.
|
||||||
Copyright (c) 2005 by Kevin B. Kenny <kennykb@acm.org>. All rights reserved.
|
Copyright \(co 2005 Kevin B. Kenny <kennykb@acm.org>. All rights reserved.
|
||||||
.fi
|
.fi
|
||||||
'\" Local Variables:
|
'\" Local Variables:
|
||||||
'\" mode: nroff
|
'\" mode: nroff
|
||||||
|
'\" fill-column: 78
|
||||||
'\" End:
|
'\" End:
|
||||||
|
|||||||
@@ -105,7 +105,7 @@ system, as returned by \fBencoding system\fR.
|
|||||||
.TP
|
.TP
|
||||||
\fB\-eofchar\fR \fB{\fIinChar outChar\fB}\fR
|
\fB\-eofchar\fR \fB{\fIinChar outChar\fB}\fR
|
||||||
.
|
.
|
||||||
This option supports DOS file systems that use Control-z (\ex1a) as an
|
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
|
end of file marker. If \fIchar\fR is not an empty string, then this
|
||||||
character signals end-of-file when it is encountered during input. For
|
character signals end-of-file when it is encountered during input. For
|
||||||
output, the end-of-file character is output when the channel is closed.
|
output, the end-of-file character is output when the channel is closed.
|
||||||
@@ -117,9 +117,9 @@ channel you can specify a single value that will apply to both reading
|
|||||||
and writing. When querying the end-of-file character of a read-write
|
and writing. When querying the end-of-file character of a read-write
|
||||||
channel, a two-element list will always be returned. The default value
|
channel, a two-element list will always be returned. The default value
|
||||||
for \fB\-eofchar\fR is the empty string in all cases except for files
|
for \fB\-eofchar\fR is the empty string in all cases except for files
|
||||||
under Windows. In that case the \fB\-eofchar\fR is Control-z (\ex1a) for
|
under Windows. In that case the \fB\-eofchar\fR is Control-z (\ex1A) for
|
||||||
reading and the empty string for writing.
|
reading and the empty string for writing.
|
||||||
The acceptable range for \fB\-eofchar\fR values is \ex01 - \ex7f;
|
The acceptable range for \fB\-eofchar\fR values is \ex01 - \ex7F;
|
||||||
attempting to set \fB\-eofchar\fR to a value outside of this range will
|
attempting to set \fB\-eofchar\fR to a value outside of this range will
|
||||||
generate an error.
|
generate an error.
|
||||||
.TP
|
.TP
|
||||||
|
|||||||
36
doc/http.n
36
doc/http.n
@@ -1,6 +1,6 @@
|
|||||||
'\"
|
'\"
|
||||||
'\" Copyright (c) 1995-1997 Sun Microsystems, Inc.
|
'\" Copyright (c) 1995-1997 Sun Microsystems, Inc.
|
||||||
'\" Copyright (c) 1998-2000 by Ajuba Solutions.
|
'\" Copyright (c) 1998-2000 Ajuba Solutions.
|
||||||
'\" Copyright (c) 2004 ActiveState Corporation.
|
'\" Copyright (c) 2004 ActiveState Corporation.
|
||||||
'\"
|
'\"
|
||||||
'\" See the file "license.terms" for information on usage and redistribution
|
'\" See the file "license.terms" for information on usage and redistribution
|
||||||
@@ -13,7 +13,7 @@
|
|||||||
.SH NAME
|
.SH NAME
|
||||||
http \- Client-side implementation of the HTTP/1.1 protocol
|
http \- Client-side implementation of the HTTP/1.1 protocol
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
\fBpackage require http ?2.8?\fR
|
\fBpackage require http ?2.9?\fR
|
||||||
.\" See Also -useragent option documentation in body!
|
.\" See Also -useragent option documentation in body!
|
||||||
.sp
|
.sp
|
||||||
\fB::http::config ?\fI\-option value\fR ...?
|
\fB::http::config ?\fI\-option value\fR ...?
|
||||||
@@ -78,6 +78,9 @@ when the transaction completes. For this to work, the Tcl event loop
|
|||||||
must be active. In Tk applications this is always true. For pure-Tcl
|
must be active. In Tk applications this is always true. For pure-Tcl
|
||||||
applications, the caller can use \fB::http::wait\fR after calling
|
applications, the caller can use \fB::http::wait\fR after calling
|
||||||
\fB::http::geturl\fR to start the event loop.
|
\fB::http::geturl\fR to start the event loop.
|
||||||
|
.PP
|
||||||
|
\fBNote:\fR The event queue is even used without the \fB-command\fR option.
|
||||||
|
As a side effect, arbitrary commands may be processed while \fBhttp::geturl\fR is running.
|
||||||
.SH COMMANDS
|
.SH COMMANDS
|
||||||
.TP
|
.TP
|
||||||
\fB::http::config\fR ?\fIoptions\fR?
|
\fB::http::config\fR ?\fIoptions\fR?
|
||||||
@@ -161,7 +164,7 @@ throwing an error processing non-latin-1 characters.
|
|||||||
The value of the User-Agent header in the HTTP request. In an unsafe
|
The value of the User-Agent header in the HTTP request. In an unsafe
|
||||||
interpreter, the default value depends upon the operating system, and
|
interpreter, the default value depends upon the operating system, and
|
||||||
the version numbers of \fBhttp\fR and \fBTcl\fR, and is (for example)
|
the version numbers of \fBhttp\fR and \fBTcl\fR, and is (for example)
|
||||||
.QW "\fBMozilla/5.0 (Windows; U; Windows NT 10.0) http/2.8.12 Tcl/8.6.8\fR" .
|
.QW "\fBMozilla/5.0 (Windows; U; Windows NT 10.0) http/2.9.0 Tcl/8.6.9\fR" .
|
||||||
A safe interpreter cannot determine its operating system, and so the default
|
A safe interpreter cannot determine its operating system, and so the default
|
||||||
in a safe interpreter is to use a Windows 10 value with the current version
|
in a safe interpreter is to use a Windows 10 value with the current version
|
||||||
numbers of \fBhttp\fR and \fBTcl\fR.
|
numbers of \fBhttp\fR and \fBTcl\fR.
|
||||||
@@ -250,6 +253,10 @@ proc httpHandlerCallback {socket token} {
|
|||||||
return $nbytes
|
return $nbytes
|
||||||
}
|
}
|
||||||
.CE
|
.CE
|
||||||
|
.PP
|
||||||
|
The \fBhttp::geturl\fR code for the \fB-handler\fR option is not compatible with either compression or chunked transfer-encoding. If \fB-handler\fR is specified, then to work around these issues \fBhttp::geturl\fR will reduce the HTTP protocol to 1.0, and override the \fB-zip\fR option (i.e. it will not send the header "\fBAccept-Encoding: gzip,deflate,compress\fR").
|
||||||
|
.PP
|
||||||
|
If options \fB-handler\fR and \fB-channel\fR are used together, the handler is responsible for copying the data from the HTTP socket to the specified channel. The name of the channel is available to the handler as element \fB-channel\fR of the token array.
|
||||||
.RE
|
.RE
|
||||||
.TP
|
.TP
|
||||||
\fB\-headers\fR \fIkeyvaluelist\fR
|
\fB\-headers\fR \fIkeyvaluelist\fR
|
||||||
@@ -312,9 +319,11 @@ otherwise complain about HTTP/1.1.
|
|||||||
\fB\-query\fR \fIquery\fR
|
\fB\-query\fR \fIquery\fR
|
||||||
.
|
.
|
||||||
This flag causes \fB::http::geturl\fR to do a POST request that passes the
|
This flag causes \fB::http::geturl\fR to do a POST request that passes the
|
||||||
\fIquery\fR to the server. The \fIquery\fR must be an x-url-encoding
|
\fIquery\fR as payload verbatim to the server.
|
||||||
formatted query. The \fB::http::formatQuery\fR procedure can be used to
|
The content format (and encoding) of \fIquery\fR is announced by the header
|
||||||
do the formatting.
|
field \fBcontent-type\fR set by the option \fB-type\fR.
|
||||||
|
\fIquery\fR is an x-url-encoding formatted query, if used for html forms.
|
||||||
|
The \fB::http::formatQuery\fR procedure can be used to do the formatting.
|
||||||
.TP
|
.TP
|
||||||
\fB\-queryblocksize\fR \fIsize\fR
|
\fB\-queryblocksize\fR \fIsize\fR
|
||||||
.
|
.
|
||||||
@@ -538,6 +547,14 @@ is raised, but the status of the transaction will be \fBeof\fR.
|
|||||||
.
|
.
|
||||||
The error message will also be stored in the \fBerror\fR status
|
The error message will also be stored in the \fBerror\fR status
|
||||||
array element, accessible via \fB::http::error\fR.
|
array element, accessible via \fB::http::error\fR.
|
||||||
|
.TP
|
||||||
|
\fBtimeout\fR
|
||||||
|
.
|
||||||
|
A timeout occurred before the transaction could complete
|
||||||
|
.TP
|
||||||
|
\fBreset\fR
|
||||||
|
.
|
||||||
|
user-reset
|
||||||
.PP
|
.PP
|
||||||
Another error possibility is that \fB::http::geturl\fR is unable to
|
Another error possibility is that \fB::http::geturl\fR is unable to
|
||||||
write all the post query data to the server before the server
|
write all the post query data to the server before the server
|
||||||
@@ -653,10 +670,9 @@ the post query data to the server.
|
|||||||
.TP
|
.TP
|
||||||
\fBstatus\fR
|
\fBstatus\fR
|
||||||
.
|
.
|
||||||
Either \fBok\fR, for successful completion, \fBreset\fR for
|
See description in the chapter \fBERRORS\fR above for a
|
||||||
user-reset, \fBtimeout\fR if a timeout occurred before the transaction
|
list and description of \fBstatus\fR.
|
||||||
could complete, or \fBerror\fR for an error condition. During the
|
During the transaction this value is the empty string.
|
||||||
transaction this value is the empty string.
|
|
||||||
.TP
|
.TP
|
||||||
\fBtotalsize\fR
|
\fBtotalsize\fR
|
||||||
.
|
.
|
||||||
|
|||||||
250
doc/interp.n
250
doc/interp.n
@@ -19,18 +19,18 @@ interp \- Create and manipulate Tcl interpreters
|
|||||||
.PP
|
.PP
|
||||||
This command makes it possible to create one or more new Tcl
|
This command makes it possible to create one or more new Tcl
|
||||||
interpreters that co-exist with the creating interpreter in the
|
interpreters that co-exist with the creating interpreter in the
|
||||||
same application. The creating interpreter is called the \fImaster\fR
|
same application. The creating interpreter is called the \fIparent\fR
|
||||||
and the new interpreter is called a \fIslave\fR.
|
and the new interpreter is called a \fIchild\fR.
|
||||||
A master can create any number of slaves, and each slave can
|
A parent can create any number of children, and each child can
|
||||||
itself create additional slaves for which it is master, resulting
|
itself create additional children for which it is parent, resulting
|
||||||
in a hierarchy of interpreters.
|
in a hierarchy of interpreters.
|
||||||
.PP
|
.PP
|
||||||
Each interpreter is independent from the others: it has its own name
|
Each interpreter is independent from the others: it has its own name
|
||||||
space for commands, procedures, and global variables.
|
space for commands, procedures, and global variables.
|
||||||
A master interpreter may create connections between its slaves and
|
A parent interpreter may create connections between its children and
|
||||||
itself using a mechanism called an \fIalias\fR. An \fIalias\fR is
|
itself using a mechanism called an \fIalias\fR. An \fIalias\fR is
|
||||||
a command in a slave interpreter which, when invoked, causes a
|
a command in a child interpreter which, when invoked, causes a
|
||||||
command to be invoked in its master interpreter or in another slave
|
command to be invoked in its parent interpreter or in another child
|
||||||
interpreter. The only other connections between interpreters are
|
interpreter. The only other connections between interpreters are
|
||||||
through environment variables (the \fBenv\fR variable), which are
|
through environment variables (the \fBenv\fR variable), which are
|
||||||
normally shared among all interpreters in the application,
|
normally shared among all interpreters in the application,
|
||||||
@@ -41,7 +41,7 @@ share files and to transfer references to open files from one interpreter
|
|||||||
to another.
|
to another.
|
||||||
.PP
|
.PP
|
||||||
The \fBinterp\fR command also provides support for \fIsafe\fR
|
The \fBinterp\fR command also provides support for \fIsafe\fR
|
||||||
interpreters. A safe interpreter is a slave whose functions have
|
interpreters. A safe interpreter is a child whose functions have
|
||||||
been greatly restricted, so that it is safe to execute untrusted
|
been greatly restricted, so that it is safe to execute untrusted
|
||||||
scripts without fear of them damaging other interpreters or the
|
scripts without fear of them damaging other interpreters or the
|
||||||
application's environment. For example, all IO channel creation
|
application's environment. For example, all IO channel creation
|
||||||
@@ -54,18 +54,18 @@ instead, it is \fIhidden\fR, so that only trusted interpreters can obtain
|
|||||||
access to it. For a detailed explanation of hidden commands, see
|
access to it. For a detailed explanation of hidden commands, see
|
||||||
\fBHIDDEN COMMANDS\fR, below.
|
\fBHIDDEN COMMANDS\fR, below.
|
||||||
The alias mechanism can be used for protected communication (analogous to a
|
The alias mechanism can be used for protected communication (analogous to a
|
||||||
kernel call) between a slave interpreter and its master.
|
kernel call) between a child interpreter and its parent.
|
||||||
See \fBALIAS INVOCATION\fR, below, for more details
|
See \fBALIAS INVOCATION\fR, below, for more details
|
||||||
on how the alias mechanism works.
|
on how the alias mechanism works.
|
||||||
.PP
|
.PP
|
||||||
A qualified interpreter name is a proper Tcl lists containing a subset of its
|
A qualified interpreter name is a proper Tcl list containing a subset of its
|
||||||
ancestors in the interpreter hierarchy, terminated by the string naming the
|
ancestors in the interpreter hierarchy, terminated by the string naming the
|
||||||
interpreter in its immediate master. Interpreter names are relative to the
|
interpreter in its immediate parent. Interpreter names are relative to the
|
||||||
interpreter in which they are used. For example, if
|
interpreter in which they are used. For example, if
|
||||||
.QW \fBa\fR
|
.QW \fBa\fR
|
||||||
is a slave of the current interpreter and it has a slave
|
is a child of the current interpreter and it has a child
|
||||||
.QW \fBa1\fR ,
|
.QW \fBa1\fR ,
|
||||||
which in turn has a slave
|
which in turn has a child
|
||||||
.QW \fBa11\fR ,
|
.QW \fBa11\fR ,
|
||||||
the qualified name of
|
the qualified name of
|
||||||
.QW \fBa11\fR
|
.QW \fBa11\fR
|
||||||
@@ -77,14 +77,14 @@ is the list
|
|||||||
The \fBinterp\fR command, described below, accepts qualified interpreter
|
The \fBinterp\fR command, described below, accepts qualified interpreter
|
||||||
names as arguments; the interpreter in which the command is being evaluated
|
names as arguments; the interpreter in which the command is being evaluated
|
||||||
can always be referred to as \fB{}\fR (the empty list or string). Note that
|
can always be referred to as \fB{}\fR (the empty list or string). Note that
|
||||||
it is impossible to refer to a master (ancestor) interpreter by name in a
|
it is impossible to refer to a parent (ancestor) interpreter by name in a
|
||||||
slave interpreter except through aliases. Also, there is no global name by
|
child interpreter except through aliases. Also, there is no global name by
|
||||||
which one can refer to the first interpreter created in an application.
|
which one can refer to the first interpreter created in an application.
|
||||||
Both restrictions are motivated by safety concerns.
|
Both restrictions are motivated by safety concerns.
|
||||||
.SH "THE INTERP COMMAND"
|
.SH "THE INTERP COMMAND"
|
||||||
.PP
|
.PP
|
||||||
The \fBinterp\fR command is used to create, delete, and manipulate
|
The \fBinterp\fR command is used to create, delete, and manipulate
|
||||||
slave interpreters, and to share or transfer
|
child interpreters, and to share or transfer
|
||||||
channels between interpreters. It can have any of several forms, depending
|
channels between interpreters. It can have any of several forms, depending
|
||||||
on the \fIsubcommand\fR argument:
|
on the \fIsubcommand\fR argument:
|
||||||
.TP
|
.TP
|
||||||
@@ -94,11 +94,11 @@ Returns a Tcl list whose elements are the \fItargetCmd\fR and
|
|||||||
\fIarg\fRs associated with the alias represented by \fIsrcToken\fR
|
\fIarg\fRs associated with the alias represented by \fIsrcToken\fR
|
||||||
(this is the value returned when the alias was
|
(this is the value returned when the alias was
|
||||||
created; it is possible that the name of the source command in the
|
created; it is possible that the name of the source command in the
|
||||||
slave is different from \fIsrcToken\fR).
|
child is different from \fIsrcToken\fR).
|
||||||
.TP
|
.TP
|
||||||
\fBinterp\fR \fBalias\fR \fIsrcPath\fR \fIsrcToken\fR \fB{}\fR
|
\fBinterp\fR \fBalias\fR \fIsrcPath\fR \fIsrcToken\fR \fB{}\fR
|
||||||
.
|
.
|
||||||
Deletes the alias for \fIsrcToken\fR in the slave interpreter identified by
|
Deletes the alias for \fIsrcToken\fR in the child interpreter identified by
|
||||||
\fIsrcPath\fR.
|
\fIsrcPath\fR.
|
||||||
\fIsrcToken\fR refers to the value returned when the alias
|
\fIsrcToken\fR refers to the value returned when the alias
|
||||||
was created; if the source command has been renamed, the renamed
|
was created; if the source command has been renamed, the renamed
|
||||||
@@ -106,9 +106,9 @@ command will be deleted.
|
|||||||
.TP
|
.TP
|
||||||
\fBinterp\fR \fBalias\fR \fIsrcPath\fR \fIsrcCmd\fR \fItargetPath\fR \fItargetCmd \fR?\fIarg arg ...\fR?
|
\fBinterp\fR \fBalias\fR \fIsrcPath\fR \fIsrcCmd\fR \fItargetPath\fR \fItargetCmd \fR?\fIarg arg ...\fR?
|
||||||
.
|
.
|
||||||
This command creates an alias between one slave and another (see the
|
This command creates an alias between one child and another (see the
|
||||||
\fBalias\fR slave command below for creating aliases between a slave
|
\fBalias\fR child command below for creating aliases between a child
|
||||||
and its master). In this command, either of the slave interpreters
|
and its parent). In this command, either of the child interpreters
|
||||||
may be anywhere in the hierarchy of interpreters under the interpreter
|
may be anywhere in the hierarchy of interpreters under the interpreter
|
||||||
invoking the command.
|
invoking the command.
|
||||||
\fISrcPath\fR and \fIsrcCmd\fR identify the source of the alias.
|
\fISrcPath\fR and \fIsrcCmd\fR identify the source of the alias.
|
||||||
@@ -117,9 +117,9 @@ interpreter. For example,
|
|||||||
.QW "\fBa b\fR"
|
.QW "\fBa b\fR"
|
||||||
identifies an interpreter
|
identifies an interpreter
|
||||||
.QW \fBb\fR ,
|
.QW \fBb\fR ,
|
||||||
which is a slave of interpreter
|
which is a child of interpreter
|
||||||
.QW \fBa\fR ,
|
.QW \fBa\fR ,
|
||||||
which is a slave of the invoking interpreter. An empty list specifies
|
which is a child of the invoking interpreter. An empty list specifies
|
||||||
the interpreter invoking the command. \fIsrcCmd\fR gives the name of
|
the interpreter invoking the command. \fIsrcCmd\fR gives the name of
|
||||||
a new command, which will be created in the source interpreter.
|
a new command, which will be created in the source interpreter.
|
||||||
\fITargetPath\fR and \fItargetCmd\fR specify a target interpreter
|
\fITargetPath\fR and \fItargetCmd\fR specify a target interpreter
|
||||||
@@ -171,37 +171,37 @@ used.
|
|||||||
.TP
|
.TP
|
||||||
\fBinterp\fR \fBcreate \fR?\fB\-safe\fR? ?\fB\-\|\-\fR? ?\fIpath\fR?
|
\fBinterp\fR \fBcreate \fR?\fB\-safe\fR? ?\fB\-\|\-\fR? ?\fIpath\fR?
|
||||||
.
|
.
|
||||||
Creates a slave interpreter identified by \fIpath\fR and a new command,
|
Creates a child interpreter identified by \fIpath\fR and a new command,
|
||||||
called a \fIslave command\fR. The name of the slave command is the last
|
called a \fIchild command\fR. The name of the child command is the last
|
||||||
component of \fIpath\fR. The new slave interpreter and the slave command
|
component of \fIpath\fR. The new child interpreter and the child command
|
||||||
are created in the interpreter identified by the path obtained by removing
|
are created in the interpreter identified by the path obtained by removing
|
||||||
the last component from \fIpath\fR. For example, if \fIpath\fR is \fBa b
|
the last component from \fIpath\fR. For example, if \fIpath\fR is \fBa b
|
||||||
c\fR then a new slave interpreter and slave command named \fBc\fR are
|
c\fR then a new child interpreter and child command named \fBc\fR are
|
||||||
created in the interpreter identified by the path \fBa b\fR.
|
created in the interpreter identified by the path \fBa b\fR.
|
||||||
The slave command may be used to manipulate the new interpreter as
|
The child command may be used to manipulate the new interpreter as
|
||||||
described below. If \fIpath\fR is omitted, Tcl creates a unique name of the
|
described below. If \fIpath\fR is omitted, Tcl creates a unique name of the
|
||||||
form \fBinterp\fIx\fR, where \fIx\fR is an integer, and uses it for the
|
form \fBinterp\fIx\fR, where \fIx\fR is an integer, and uses it for the
|
||||||
interpreter and the slave command. If the \fB\-safe\fR switch is specified
|
interpreter and the child command. If the \fB\-safe\fR switch is specified
|
||||||
(or if the master interpreter is a safe interpreter), the new slave
|
(or if the parent interpreter is a safe interpreter), the new child
|
||||||
interpreter will be created as a safe interpreter with limited
|
interpreter will be created as a safe interpreter with limited
|
||||||
functionality; otherwise the slave will include the full set of Tcl
|
functionality; otherwise the child will include the full set of Tcl
|
||||||
built-in commands and variables. The \fB\-\|\-\fR switch can be used to
|
built-in commands and variables. The \fB\-\|\-\fR switch can be used to
|
||||||
mark the end of switches; it may be needed if \fIpath\fR is an unusual
|
mark the end of switches; it may be needed if \fIpath\fR is an unusual
|
||||||
value such as \fB\-safe\fR. The result of the command is the name of the
|
value such as \fB\-safe\fR. The result of the command is the name of the
|
||||||
new interpreter. The name of a slave interpreter must be unique among all
|
new interpreter. The name of a child interpreter must be unique among all
|
||||||
the slaves for its master; an error occurs if a slave interpreter by the
|
the children for its parent; an error occurs if a child interpreter by the
|
||||||
given name already exists in this master.
|
given name already exists in this parent.
|
||||||
The initial recursion limit of the slave interpreter is set to the
|
The initial recursion limit of the child interpreter is set to the
|
||||||
current recursion limit of its parent interpreter.
|
current recursion limit of its parent interpreter.
|
||||||
.TP
|
.TP
|
||||||
\fBinterp\fR \fBdebug \fIpath\fR ?\fB\-frame\fR ?\fIbool\fR??
|
\fBinterp\fR \fBdebug \fIpath\fR ?\fB\-frame\fR ?\fIbool\fR??
|
||||||
.
|
.
|
||||||
Controls whether frame-level stack information is captured in the
|
Controls whether frame-level stack information is captured in the
|
||||||
slave interpreter identified by \fIpath\fR. If no arguments are
|
child interpreter identified by \fIpath\fR. If no arguments are
|
||||||
given, option and current setting are returned. If \fB\-frame\fR
|
given, option and current setting are returned. If \fB\-frame\fR
|
||||||
is given, the debug setting is set to the given boolean if provided
|
is given, the debug setting is set to the given boolean if provided
|
||||||
and the current setting is returned.
|
and the current setting is returned.
|
||||||
This only effects the output of \fBinfo frame\fR, in that exact
|
This only affects the output of \fBinfo frame\fR, in that exact
|
||||||
frame-level information for command invocation at the bytecode level
|
frame-level information for command invocation at the bytecode level
|
||||||
is only captured with this setting on.
|
is only captured with this setting on.
|
||||||
.RS
|
.RS
|
||||||
@@ -239,8 +239,8 @@ consistency of the underlying interpreter's state.
|
|||||||
\fBinterp\fR \fBdelete \fR?\fIpath ...?\fR
|
\fBinterp\fR \fBdelete \fR?\fIpath ...?\fR
|
||||||
.
|
.
|
||||||
Deletes zero or more interpreters given by the optional \fIpath\fR
|
Deletes zero or more interpreters given by the optional \fIpath\fR
|
||||||
arguments, and for each interpreter, it also deletes its slaves. The
|
arguments, and for each interpreter, it also deletes its children. The
|
||||||
command also deletes the slave command for each interpreter deleted.
|
command also deletes the child command for each interpreter deleted.
|
||||||
For each \fIpath\fR argument, if no interpreter by that name
|
For each \fIpath\fR argument, if no interpreter by that name
|
||||||
exists, the command raises an error.
|
exists, the command raises an error.
|
||||||
.TP
|
.TP
|
||||||
@@ -248,20 +248,20 @@ exists, the command raises an error.
|
|||||||
.
|
.
|
||||||
This command concatenates all of the \fIarg\fR arguments in the same
|
This command concatenates all of the \fIarg\fR arguments in the same
|
||||||
fashion as the \fBconcat\fR command, then evaluates the resulting string as
|
fashion as the \fBconcat\fR command, then evaluates the resulting string as
|
||||||
a Tcl script in the slave interpreter identified by \fIpath\fR. The result
|
a Tcl script in the child interpreter identified by \fIpath\fR. The result
|
||||||
of this evaluation (including all \fBreturn\fR options,
|
of this evaluation (including all \fBreturn\fR options,
|
||||||
such as \fB\-errorinfo\fR and \fB\-errorcode\fR information, if an
|
such as \fB\-errorinfo\fR and \fB\-errorcode\fR information, if an
|
||||||
error occurs) is returned to the invoking interpreter.
|
error occurs) is returned to the invoking interpreter.
|
||||||
Note that the script will be executed in the current context stack frame of the
|
Note that the script will be executed in the current context stack frame of the
|
||||||
\fIpath\fR interpreter; this is so that the implementations (in a master
|
\fIpath\fR interpreter; this is so that the implementations (in a parent
|
||||||
interpreter) of aliases in a slave interpreter can execute scripts in
|
interpreter) of aliases in a child interpreter can execute scripts in
|
||||||
the slave that find out information about the slave's current state
|
the child that find out information about the child's current state
|
||||||
and stack frame.
|
and stack frame.
|
||||||
.TP
|
.TP
|
||||||
\fBinterp exists \fIpath\fR
|
\fBinterp exists \fIpath\fR
|
||||||
.
|
.
|
||||||
Returns \fB1\fR if a slave interpreter by the specified \fIpath\fR
|
Returns \fB1\fR if a child interpreter by the specified \fIpath\fR
|
||||||
exists in this master, \fB0\fR otherwise. If \fIpath\fR is omitted, the
|
exists in this parent, \fB0\fR otherwise. If \fIpath\fR is omitted, the
|
||||||
invoking interpreter is used.
|
invoking interpreter is used.
|
||||||
.TP
|
.TP
|
||||||
\fBinterp expose \fIpath\fR \fIhiddenName\fR ?\fIexposedCmdName\fR?
|
\fBinterp expose \fIpath\fR \fIhiddenName\fR ?\fIexposedCmdName\fR?
|
||||||
@@ -287,7 +287,7 @@ Currently both \fIexposedCmdName\fR and \fIhiddenCmdName\fR can
|
|||||||
not contain namespace qualifiers, or an error is raised.
|
not contain namespace qualifiers, or an error is raised.
|
||||||
Commands to be hidden by \fBinterp hide\fR are looked up in the global
|
Commands to be hidden by \fBinterp hide\fR are looked up in the global
|
||||||
namespace even if the current namespace is not the global one. This
|
namespace even if the current namespace is not the global one. This
|
||||||
prevents slaves from fooling a master interpreter into hiding the wrong
|
prevents children from fooling a parent interpreter into hiding the wrong
|
||||||
command, by making the current namespace be different from the global one.
|
command, by making the current namespace be different from the global one.
|
||||||
Hidden commands are explained in more detail in \fBHIDDEN COMMANDS\fR, below.
|
Hidden commands are explained in more detail in \fBHIDDEN COMMANDS\fR, below.
|
||||||
.TP
|
.TP
|
||||||
@@ -373,9 +373,15 @@ interpreter is destroyed.
|
|||||||
.TP
|
.TP
|
||||||
\fBinterp\fR \fBslaves\fR ?\fIpath\fR?
|
\fBinterp\fR \fBslaves\fR ?\fIpath\fR?
|
||||||
.
|
.
|
||||||
Returns a Tcl list of the names of all the slave interpreters associated
|
Returns a Tcl list of the names of all the child interpreters associated
|
||||||
with the interpreter identified by \fIpath\fR. If \fIpath\fR is omitted,
|
with the interpreter identified by \fIpath\fR. If \fIpath\fR is omitted,
|
||||||
the invoking interpreter is used.
|
the invoking interpreter is used.
|
||||||
|
.VS "TIP 581"
|
||||||
|
.TP
|
||||||
|
\fBinterp\fR \fBchildren\fR ?\fIpath\fR?
|
||||||
|
.
|
||||||
|
Synonym for . \fBinterp\fR \fBslaves\fR ?\fIpath\fR?
|
||||||
|
.VE "TIP 581"
|
||||||
.TP
|
.TP
|
||||||
\fBinterp\fR \fBtarget\fR \fIpath alias\fR
|
\fBinterp\fR \fBtarget\fR \fIpath alias\fR
|
||||||
.
|
.
|
||||||
@@ -393,48 +399,48 @@ The target command does not have to be defined at the time of this invocation.
|
|||||||
Causes the IO channel identified by \fIchannelId\fR to become available in
|
Causes the IO channel identified by \fIchannelId\fR to become available in
|
||||||
the interpreter identified by \fIdestPath\fR and unavailable in the
|
the interpreter identified by \fIdestPath\fR and unavailable in the
|
||||||
interpreter identified by \fIsrcPath\fR.
|
interpreter identified by \fIsrcPath\fR.
|
||||||
.SH "SLAVE COMMAND"
|
.SH "child COMMAND"
|
||||||
.PP
|
.PP
|
||||||
For each slave interpreter created with the \fBinterp\fR command, a
|
For each child interpreter created with the \fBinterp\fR command, a
|
||||||
new Tcl command is created in the master interpreter with the same
|
new Tcl command is created in the parent interpreter with the same
|
||||||
name as the new interpreter. This command may be used to invoke
|
name as the new interpreter. This command may be used to invoke
|
||||||
various operations on the interpreter. It has the following
|
various operations on the interpreter. It has the following
|
||||||
general form:
|
general form:
|
||||||
.PP
|
.PP
|
||||||
.CS
|
.CS
|
||||||
\fIslave command \fR?\fIarg arg ...\fR?
|
\fIchild command \fR?\fIarg arg ...\fR?
|
||||||
.CE
|
.CE
|
||||||
.PP
|
.PP
|
||||||
\fISlave\fR is the name of the interpreter, and \fIcommand\fR
|
\fIchild\fR is the name of the interpreter, and \fIcommand\fR
|
||||||
and the \fIarg\fRs determine the exact behavior of the command.
|
and the \fIarg\fRs determine the exact behavior of the command.
|
||||||
The valid forms of this command are:
|
The valid forms of this command are:
|
||||||
.TP
|
.TP
|
||||||
\fIslave \fBaliases\fR
|
\fIchild \fBaliases\fR
|
||||||
.
|
.
|
||||||
Returns a Tcl list whose elements are the tokens of all the
|
Returns a Tcl list whose elements are the tokens of all the
|
||||||
aliases in \fIslave\fR. The tokens correspond to the values returned when
|
aliases in \fIchild\fR. The tokens correspond to the values returned when
|
||||||
the aliases were created (which may not be the same
|
the aliases were created (which may not be the same
|
||||||
as the current names of the commands).
|
as the current names of the commands).
|
||||||
.TP
|
.TP
|
||||||
\fIslave \fBalias \fIsrcToken\fR
|
\fIchild \fBalias \fIsrcToken\fR
|
||||||
.
|
.
|
||||||
Returns a Tcl list whose elements are the \fItargetCmd\fR and
|
Returns a Tcl list whose elements are the \fItargetCmd\fR and
|
||||||
\fIarg\fRs associated with the alias represented by \fIsrcToken\fR
|
\fIarg\fRs associated with the alias represented by \fIsrcToken\fR
|
||||||
(this is the value returned when the alias was
|
(this is the value returned when the alias was
|
||||||
created; it is possible that the actual source command in the
|
created; it is possible that the actual source command in the
|
||||||
slave is different from \fIsrcToken\fR).
|
child is different from \fIsrcToken\fR).
|
||||||
.TP
|
.TP
|
||||||
\fIslave \fBalias \fIsrcToken \fB{}\fR
|
\fIchild \fBalias \fIsrcToken \fB{}\fR
|
||||||
.
|
.
|
||||||
Deletes the alias for \fIsrcToken\fR in the slave interpreter.
|
Deletes the alias for \fIsrcToken\fR in the child interpreter.
|
||||||
\fIsrcToken\fR refers to the value returned when the alias
|
\fIsrcToken\fR refers to the value returned when the alias
|
||||||
was created; if the source command has been renamed, the renamed
|
was created; if the source command has been renamed, the renamed
|
||||||
command will be deleted.
|
command will be deleted.
|
||||||
.TP
|
.TP
|
||||||
\fIslave \fBalias \fIsrcCmd targetCmd \fR?\fIarg ..\fR?
|
\fIchild \fBalias \fIsrcCmd targetCmd \fR?\fIarg ..\fR?
|
||||||
.
|
.
|
||||||
Creates an alias such that whenever \fIsrcCmd\fR is invoked
|
Creates an alias such that whenever \fIsrcCmd\fR is invoked
|
||||||
in \fIslave\fR, \fItargetCmd\fR is invoked in the master.
|
in \fIchild\fR, \fItargetCmd\fR is invoked in the parent.
|
||||||
The \fIarg\fR arguments will be passed to \fItargetCmd\fR as additional
|
The \fIarg\fR arguments will be passed to \fItargetCmd\fR as additional
|
||||||
arguments, prepended before any arguments passed in the invocation of
|
arguments, prepended before any arguments passed in the invocation of
|
||||||
\fIsrcCmd\fR.
|
\fIsrcCmd\fR.
|
||||||
@@ -443,69 +449,69 @@ The command returns a token that uniquely identifies the command created
|
|||||||
\fIsrcCmd\fR, even if the command is renamed afterwards. The token may but
|
\fIsrcCmd\fR, even if the command is renamed afterwards. The token may but
|
||||||
does not have to be equal to \fIsrcCmd\fR.
|
does not have to be equal to \fIsrcCmd\fR.
|
||||||
.TP
|
.TP
|
||||||
\fIslave \fBbgerror\fR ?\fIcmdPrefix\fR?
|
\fIchild \fBbgerror\fR ?\fIcmdPrefix\fR?
|
||||||
.
|
.
|
||||||
This command either gets or sets the current background exception handler
|
This command either gets or sets the current background exception handler
|
||||||
for the \fIslave\fR interpreter. If \fIcmdPrefix\fR is
|
for the \fIchild\fR interpreter. If \fIcmdPrefix\fR is
|
||||||
absent, the current background exception handler is returned, and if it is
|
absent, the current background exception handler is returned, and if it is
|
||||||
present, it is a list of words (of minimum length one) that describes
|
present, it is a list of words (of minimum length one) that describes
|
||||||
what to set the interpreter's background exception handler to. See the
|
what to set the interpreter's background exception handler to. See the
|
||||||
\fBBACKGROUND EXCEPTION HANDLING\fR section for more details.
|
\fBBACKGROUND EXCEPTION HANDLING\fR section for more details.
|
||||||
.TP
|
.TP
|
||||||
\fIslave \fBeval \fIarg \fR?\fIarg ..\fR?
|
\fIchild \fBeval \fIarg \fR?\fIarg ..\fR?
|
||||||
.
|
.
|
||||||
This command concatenates all of the \fIarg\fR arguments in
|
This command concatenates all of the \fIarg\fR arguments in
|
||||||
the same fashion as the \fBconcat\fR command, then evaluates
|
the same fashion as the \fBconcat\fR command, then evaluates
|
||||||
the resulting string as a Tcl script in \fIslave\fR.
|
the resulting string as a Tcl script in \fIchild\fR.
|
||||||
The result of this evaluation (including all \fBreturn\fR options,
|
The result of this evaluation (including all \fBreturn\fR options,
|
||||||
such as \fB\-errorinfo\fR and \fB\-errorcode\fR information, if an
|
such as \fB\-errorinfo\fR and \fB\-errorcode\fR information, if an
|
||||||
error occurs) is returned to the invoking interpreter.
|
error occurs) is returned to the invoking interpreter.
|
||||||
Note that the script will be executed in the current context stack frame
|
Note that the script will be executed in the current context stack frame
|
||||||
of \fIslave\fR; this is so that the implementations (in a master
|
of \fIchild\fR; this is so that the implementations (in a parent
|
||||||
interpreter) of aliases in a slave interpreter can execute scripts in
|
interpreter) of aliases in a child interpreter can execute scripts in
|
||||||
the slave that find out information about the slave's current state
|
the child that find out information about the child's current state
|
||||||
and stack frame.
|
and stack frame.
|
||||||
.TP
|
.TP
|
||||||
\fIslave \fBexpose \fIhiddenName \fR?\fIexposedCmdName\fR?
|
\fIchild \fBexpose \fIhiddenName \fR?\fIexposedCmdName\fR?
|
||||||
.
|
.
|
||||||
This command exposes the hidden command \fIhiddenName\fR, eventually bringing
|
This command exposes the hidden command \fIhiddenName\fR, eventually bringing
|
||||||
it back under a new \fIexposedCmdName\fR name (this name is currently
|
it back under a new \fIexposedCmdName\fR name (this name is currently
|
||||||
accepted only if it is a valid global name space name without any ::),
|
accepted only if it is a valid global name space name without any ::),
|
||||||
in \fIslave\fR.
|
in \fIchild\fR.
|
||||||
If an exposed command with the targeted name already exists, this command
|
If an exposed command with the targeted name already exists, this command
|
||||||
fails.
|
fails.
|
||||||
For more details on hidden commands, see \fBHIDDEN COMMANDS\fR, below.
|
For more details on hidden commands, see \fBHIDDEN COMMANDS\fR, below.
|
||||||
.TP
|
.TP
|
||||||
\fIslave \fBhide \fIexposedCmdName\fR ?\fIhiddenCmdName\fR?
|
\fIchild \fBhide \fIexposedCmdName\fR ?\fIhiddenCmdName\fR?
|
||||||
.
|
.
|
||||||
This command hides the exposed command \fIexposedCmdName\fR, renaming it to
|
This command hides the exposed command \fIexposedCmdName\fR, renaming it to
|
||||||
the hidden command \fIhiddenCmdName\fR, or keeping the same name if the
|
the hidden command \fIhiddenCmdName\fR, or keeping the same name if the
|
||||||
argument is not given, in the \fIslave\fR interpreter.
|
argument is not given, in the \fIchild\fR interpreter.
|
||||||
If a hidden command with the targeted name already exists, this command
|
If a hidden command with the targeted name already exists, this command
|
||||||
fails.
|
fails.
|
||||||
Currently both \fIexposedCmdName\fR and \fIhiddenCmdName\fR can
|
Currently both \fIexposedCmdName\fR and \fIhiddenCmdName\fR can
|
||||||
not contain namespace qualifiers, or an error is raised.
|
not contain namespace qualifiers, or an error is raised.
|
||||||
Commands to be hidden are looked up in the global
|
Commands to be hidden are looked up in the global
|
||||||
namespace even if the current namespace is not the global one. This
|
namespace even if the current namespace is not the global one. This
|
||||||
prevents slaves from fooling a master interpreter into hiding the wrong
|
prevents children from fooling a parent interpreter into hiding the wrong
|
||||||
command, by making the current namespace be different from the global one.
|
command, by making the current namespace be different from the global one.
|
||||||
For more details on hidden commands, see \fBHIDDEN COMMANDS\fR, below.
|
For more details on hidden commands, see \fBHIDDEN COMMANDS\fR, below.
|
||||||
.TP
|
.TP
|
||||||
\fIslave \fBhidden\fR
|
\fIchild \fBhidden\fR
|
||||||
.
|
.
|
||||||
Returns a list of the names of all hidden commands in \fIslave\fR.
|
Returns a list of the names of all hidden commands in \fIchild\fR.
|
||||||
.TP
|
.TP
|
||||||
\fIslave \fBinvokehidden\fR ?\fI\-option ...\fR? \fIhiddenName \fR?\fIarg ..\fR?
|
\fIchild \fBinvokehidden\fR ?\fI\-option ...\fR? \fIhiddenName \fR?\fIarg ..\fR?
|
||||||
.
|
.
|
||||||
This command invokes the hidden command \fIhiddenName\fR with the
|
This command invokes the hidden command \fIhiddenName\fR with the
|
||||||
supplied arguments, in \fIslave\fR. No substitutions or evaluations are
|
supplied arguments, in \fIchild\fR. No substitutions or evaluations are
|
||||||
applied to the arguments. Three \fI\-option\fRs are supported, all
|
applied to the arguments. Three \fI\-option\fRs are supported, all
|
||||||
of which start with \fB\-\fR: \fB\-namespace\fR (which takes a single
|
of which start with \fB\-\fR: \fB\-namespace\fR (which takes a single
|
||||||
argument afterwards, \fInsName\fR), \fB\-global\fR, and \fB\-\|\-\fR.
|
argument afterwards, \fInsName\fR), \fB\-global\fR, and \fB\-\|\-\fR.
|
||||||
If the \fB\-namespace\fR flag is given, the hidden command is invoked in
|
If the \fB\-namespace\fR flag is given, the hidden command is invoked in
|
||||||
the specified namespace in the slave.
|
the specified namespace in the child.
|
||||||
If the \fB\-global\fR flag is given, the command is invoked at the global
|
If the \fB\-global\fR flag is given, the command is invoked at the global
|
||||||
level in the slave; otherwise it is invoked at the current call frame and
|
level in the child; otherwise it is invoked at the current call frame and
|
||||||
can access local variables in that or outer call frames.
|
can access local variables in that or outer call frames.
|
||||||
The \fB\-\|\-\fR flag allows the \fIhiddenCmdName\fR argument to start with a
|
The \fB\-\|\-\fR flag allows the \fIhiddenCmdName\fR argument to start with a
|
||||||
.QW \-
|
.QW \-
|
||||||
@@ -513,37 +519,37 @@ character, and is otherwise unnecessary.
|
|||||||
If both the \fB\-namespace\fR and \fB\-global\fR flags are given, the
|
If both the \fB\-namespace\fR and \fB\-global\fR flags are given, the
|
||||||
\fB\-namespace\fR flag is ignored.
|
\fB\-namespace\fR flag is ignored.
|
||||||
Note that the hidden command will be executed (by default) in the
|
Note that the hidden command will be executed (by default) in the
|
||||||
current context stack frame of \fIslave\fR.
|
current context stack frame of \fIchild\fR.
|
||||||
For more details on hidden commands,
|
For more details on hidden commands,
|
||||||
see \fBHIDDEN COMMANDS\fR, below.
|
see \fBHIDDEN COMMANDS\fR, below.
|
||||||
.TP
|
.TP
|
||||||
\fIslave \fBissafe\fR
|
\fIchild \fBissafe\fR
|
||||||
.
|
.
|
||||||
Returns \fB1\fR if the slave interpreter is safe, \fB0\fR otherwise.
|
Returns \fB1\fR if the child interpreter is safe, \fB0\fR otherwise.
|
||||||
.TP
|
.TP
|
||||||
\fIslave \fBlimit\fR \fIlimitType\fR ?\fI\-option\fR? ?\fIvalue\fR \fI...\fR?
|
\fIchild \fBlimit\fR \fIlimitType\fR ?\fI\-option\fR? ?\fIvalue\fR \fI...\fR?
|
||||||
.
|
.
|
||||||
Sets up, manipulates and queries the configuration of the resource
|
Sets up, manipulates and queries the configuration of the resource
|
||||||
limit \fIlimitType\fR for the slave interpreter. If no \fI\-option\fR
|
limit \fIlimitType\fR for the child interpreter. If no \fI\-option\fR
|
||||||
is specified, return the current configuration of the limit. If
|
is specified, return the current configuration of the limit. If
|
||||||
\fI\-option\fR is the sole argument, return the value of that option.
|
\fI\-option\fR is the sole argument, return the value of that option.
|
||||||
Otherwise, a list of \fI\-option\fR/\fIvalue\fR argument pairs must
|
Otherwise, a list of \fI\-option\fR/\fIvalue\fR argument pairs must
|
||||||
supplied. See \fBRESOURCE LIMITS\fR below for a more detailed explanation of
|
supplied. See \fBRESOURCE LIMITS\fR below for a more detailed explanation of
|
||||||
what limits and options are supported.
|
what limits and options are supported.
|
||||||
.TP
|
.TP
|
||||||
\fIslave \fBmarktrusted\fR
|
\fIchild \fBmarktrusted\fR
|
||||||
.
|
.
|
||||||
Marks the slave interpreter as trusted. Can only be invoked by a
|
Marks the child interpreter as trusted. Can only be invoked by a
|
||||||
trusted interpreter. This command does not expose any hidden
|
trusted interpreter. This command does not expose any hidden
|
||||||
commands in the slave interpreter. The command has no effect if the slave
|
commands in the child interpreter. The command has no effect if the child
|
||||||
is already trusted.
|
is already trusted.
|
||||||
.TP
|
.TP
|
||||||
\fIslave\fR \fBrecursionlimit\fR ?\fInewlimit\fR?
|
\fIchild\fR \fBrecursionlimit\fR ?\fInewlimit\fR?
|
||||||
.
|
.
|
||||||
Returns the maximum allowable nesting depth for the \fIslave\fR interpreter.
|
Returns the maximum allowable nesting depth for the \fIchild\fR interpreter.
|
||||||
If \fInewlimit\fR is specified, the recursion limit in \fIslave\fR will be
|
If \fInewlimit\fR is specified, the recursion limit in \fIchild\fR will be
|
||||||
set so that nesting of more than \fInewlimit\fR calls to \fBTcl_Eval()\fR
|
set so that nesting of more than \fInewlimit\fR calls to \fBTcl_Eval()\fR
|
||||||
and related procedures in \fIslave\fR will return an error.
|
and related procedures in \fIchild\fR will return an error.
|
||||||
The \fInewlimit\fR value is also returned.
|
The \fInewlimit\fR value is also returned.
|
||||||
The \fInewlimit\fR value must be a positive integer between 1 and the
|
The \fInewlimit\fR value must be a positive integer between 1 and the
|
||||||
maximum value of a non-long integer on the platform.
|
maximum value of a non-long integer on the platform.
|
||||||
@@ -567,14 +573,14 @@ For example, commands to create files on disk are removed, and the
|
|||||||
\fBexec\fR command is removed, since it could be used to cause damage
|
\fBexec\fR command is removed, since it could be used to cause damage
|
||||||
through subprocesses.
|
through subprocesses.
|
||||||
Limited access to these facilities can be provided, by creating
|
Limited access to these facilities can be provided, by creating
|
||||||
aliases to the master interpreter which check their arguments carefully
|
aliases to the parent interpreter which check their arguments carefully
|
||||||
and provide restricted access to a safe subset of facilities.
|
and provide restricted access to a safe subset of facilities.
|
||||||
For example, file creation might be allowed in a particular subdirectory
|
For example, file creation might be allowed in a particular subdirectory
|
||||||
and subprocess invocation might be allowed for a carefully selected and
|
and subprocess invocation might be allowed for a carefully selected and
|
||||||
fixed set of programs.
|
fixed set of programs.
|
||||||
.PP
|
.PP
|
||||||
A safe interpreter is created by specifying the \fB\-safe\fR switch
|
A safe interpreter is created by specifying the \fB\-safe\fR switch
|
||||||
to the \fBinterp create\fR command. Furthermore, any slave created
|
to the \fBinterp create\fR command. Furthermore, any child created
|
||||||
by a safe interpreter will also be safe.
|
by a safe interpreter will also be safe.
|
||||||
.PP
|
.PP
|
||||||
A safe interpreter is created with exactly the following set of
|
A safe interpreter is created with exactly the following set of
|
||||||
@@ -661,15 +667,15 @@ including itself.
|
|||||||
.SH "ALIAS INVOCATION"
|
.SH "ALIAS INVOCATION"
|
||||||
.PP
|
.PP
|
||||||
The alias mechanism has been carefully designed so that it can
|
The alias mechanism has been carefully designed so that it can
|
||||||
be used safely when an untrusted script is executing
|
be used safely in an untrusted script which is being executed in a
|
||||||
in a safe slave and the target of the alias is a trusted
|
safe interpreter even if the target of the alias is not a safe
|
||||||
master. The most important thing in guaranteeing safety is to
|
interpreter. The most important thing in guaranteeing safety is to
|
||||||
ensure that information passed from the slave to the master is
|
ensure that information passed from the child to the parent is
|
||||||
never evaluated or substituted in the master; if this were to
|
never evaluated or substituted in the parent; if this were to
|
||||||
occur, it would enable an evil script in the slave to invoke
|
occur, it would enable an evil script in the child to invoke
|
||||||
arbitrary functions in the master, which would compromise security.
|
arbitrary functions in the parent, which would compromise security.
|
||||||
.PP
|
.PP
|
||||||
When the source for an alias is invoked in the slave interpreter, the
|
When the source for an alias is invoked in the child interpreter, the
|
||||||
usual Tcl substitutions are performed when parsing that command.
|
usual Tcl substitutions are performed when parsing that command.
|
||||||
These substitutions are carried out in the source interpreter just
|
These substitutions are carried out in the source interpreter just
|
||||||
as they would be for any other command invoked in that interpreter.
|
as they would be for any other command invoked in that interpreter.
|
||||||
@@ -696,8 +702,8 @@ the alias's source command is parsed in the source interpreter.
|
|||||||
When writing the \fItargetCmd\fRs for aliases in safe interpreters,
|
When writing the \fItargetCmd\fRs for aliases in safe interpreters,
|
||||||
it is very important that the arguments to that command never be
|
it is very important that the arguments to that command never be
|
||||||
evaluated or substituted, since this would provide an escape
|
evaluated or substituted, since this would provide an escape
|
||||||
mechanism whereby the slave interpreter could execute arbitrary
|
mechanism whereby the child interpreter could execute arbitrary
|
||||||
code in the master. This in turn would compromise the security
|
code in the parent. This in turn would compromise the security
|
||||||
of the system.
|
of the system.
|
||||||
.SH "HIDDEN COMMANDS"
|
.SH "HIDDEN COMMANDS"
|
||||||
.PP
|
.PP
|
||||||
@@ -724,28 +730,28 @@ invoke\fR. Hidden commands and exposed commands reside in separate name
|
|||||||
spaces. It is possible to define a hidden command and an exposed command by
|
spaces. It is possible to define a hidden command and an exposed command by
|
||||||
the same name within one interpreter.
|
the same name within one interpreter.
|
||||||
.PP
|
.PP
|
||||||
Hidden commands in a slave interpreter can be invoked in the body of
|
Hidden commands in a child interpreter can be invoked in the body of
|
||||||
procedures called in the master during alias invocation. For example, an
|
procedures called in the parent during alias invocation. For example, an
|
||||||
alias for \fBsource\fR could be created in a slave interpreter. When it is
|
alias for \fBsource\fR could be created in a child interpreter. When it is
|
||||||
invoked in the slave interpreter, a procedure is called in the master
|
invoked in the child interpreter, a procedure is called in the parent
|
||||||
interpreter to check that the operation is allowable (e.g. it asks to
|
interpreter to check that the operation is allowable (e.g. it asks to
|
||||||
source a file that the slave interpreter is allowed to access). The
|
source a file that the child interpreter is allowed to access). The
|
||||||
procedure then it invokes the hidden \fBsource\fR command in the slave
|
procedure then it invokes the hidden \fBsource\fR command in the child
|
||||||
interpreter to actually source in the contents of the file. Note that two
|
interpreter to actually source in the contents of the file. Note that two
|
||||||
commands named \fBsource\fR exist in the slave interpreter: the alias, and
|
commands named \fBsource\fR exist in the child interpreter: the alias, and
|
||||||
the hidden command.
|
the hidden command.
|
||||||
.PP
|
.PP
|
||||||
Because a master interpreter may invoke a hidden command as part of
|
Because a parent interpreter may invoke a hidden command as part of
|
||||||
handling an alias invocation, great care must be taken to avoid evaluating
|
handling an alias invocation, great care must be taken to avoid evaluating
|
||||||
any arguments passed in through the alias invocation.
|
any arguments passed in through the alias invocation.
|
||||||
Otherwise, malicious slave interpreters could cause a trusted master
|
Otherwise, malicious child interpreters could cause a trusted parent
|
||||||
interpreter to execute dangerous commands on their behalf. See the section
|
interpreter to execute dangerous commands on their behalf. See the section
|
||||||
on \fBALIAS INVOCATION\fR for a more complete discussion of this topic.
|
on \fBALIAS INVOCATION\fR for a more complete discussion of this topic.
|
||||||
To help avoid this problem, no substitutions or evaluations are
|
To help avoid this problem, no substitutions or evaluations are
|
||||||
applied to arguments of \fBinterp invokehidden\fR.
|
applied to arguments of \fBinterp invokehidden\fR.
|
||||||
.PP
|
.PP
|
||||||
Safe interpreters are not allowed to invoke hidden commands in themselves
|
Safe interpreters are not allowed to invoke hidden commands in themselves
|
||||||
or in their descendants. This prevents safe slaves from gaining access to
|
or in their descendants. This prevents them from gaining access to
|
||||||
hidden functionality in themselves or their descendants.
|
hidden functionality in themselves or their descendants.
|
||||||
.PP
|
.PP
|
||||||
The set of hidden commands in an interpreter can be manipulated by a trusted
|
The set of hidden commands in an interpreter can be manipulated by a trusted
|
||||||
@@ -764,12 +770,12 @@ qualifiers, and you must first rename a command in a namespace to the
|
|||||||
global namespace before you can hide it.
|
global namespace before you can hide it.
|
||||||
Commands to be hidden by \fBinterp hide\fR are looked up in the global
|
Commands to be hidden by \fBinterp hide\fR are looked up in the global
|
||||||
namespace even if the current namespace is not the global one. This
|
namespace even if the current namespace is not the global one. This
|
||||||
prevents slaves from fooling a master interpreter into hiding the wrong
|
prevents children from fooling a parent interpreter into hiding the wrong
|
||||||
command, by making the current namespace be different from the global one.
|
command, by making the current namespace be different from the global one.
|
||||||
.SH "RESOURCE LIMITS"
|
.SH "RESOURCE LIMITS"
|
||||||
.PP
|
.PP
|
||||||
Every interpreter has two kinds of resource limits that may be imposed by any
|
Every interpreter has two kinds of resource limits that may be imposed by any
|
||||||
master interpreter upon its slaves. Command limits (of type \fBcommand\fR)
|
parent interpreter upon its children. Command limits (of type \fBcommand\fR)
|
||||||
restrict the total number of Tcl commands that may be executed by an
|
restrict the total number of Tcl commands that may be executed by an
|
||||||
interpreter (as can be inspected via the \fBinfo cmdcount\fR command), and
|
interpreter (as can be inspected via the \fBinfo cmdcount\fR command), and
|
||||||
time limits (of type \fBtime\fR) place a limit by which execution within the
|
time limits (of type \fBtime\fR) place a limit by which execution within the
|
||||||
@@ -778,7 +784,7 @@ interpreter must complete. Note that time limits are expressed as
|
|||||||
\fBafter\fR) because they may be modified after creation.
|
\fBafter\fR) because they may be modified after creation.
|
||||||
.PP
|
.PP
|
||||||
When a limit is exceeded for an interpreter, first any handler callbacks
|
When a limit is exceeded for an interpreter, first any handler callbacks
|
||||||
defined by master interpreters are called. If those callbacks increase or
|
defined by parent interpreters are called. If those callbacks increase or
|
||||||
remove the limit, execution within the (previously) limited interpreter
|
remove the limit, execution within the (previously) limited interpreter
|
||||||
continues. If the limit is still in force, an error is generated at that point
|
continues. If the limit is still in force, an error is generated at that point
|
||||||
and normal processing of errors within the interpreter (by the \fBcatch\fR
|
and normal processing of errors within the interpreter (by the \fBcatch\fR
|
||||||
@@ -835,13 +841,13 @@ This option specifies the number of commands that the interpreter may execute
|
|||||||
before triggering the command limit. This option may be the empty string,
|
before triggering the command limit. This option may be the empty string,
|
||||||
which indicates that a command limit is not set for the interpreter.
|
which indicates that a command limit is not set for the interpreter.
|
||||||
.PP
|
.PP
|
||||||
Where an interpreter with a resource limit set on it creates a slave
|
Where an interpreter with a resource limit set on it creates a child
|
||||||
interpreter, that slave interpreter will have resource limits imposed on it
|
interpreter, that child interpreter will have resource limits imposed on it
|
||||||
that are at least as restrictive as the limits on the creating master
|
that are at least as restrictive as the limits on the creating parent
|
||||||
interpreter. If the master interpreter of the limited master wishes to relax
|
interpreter. If the parent interpreter of the limited parent wishes to relax
|
||||||
these conditions, it should hide the \fBinterp\fR command in the child and
|
these conditions, it should hide the \fBinterp\fR command in the child and
|
||||||
then use aliases and the \fBinterp invokehidden\fR subcommand to provide such
|
then use aliases and the \fBinterp invokehidden\fR subcommand to provide such
|
||||||
access as it chooses to the \fBinterp\fR command to the limited master as
|
access as it chooses to the \fBinterp\fR command to the limited parent as
|
||||||
necessary.
|
necessary.
|
||||||
.SH "BACKGROUND EXCEPTION HANDLING"
|
.SH "BACKGROUND EXCEPTION HANDLING"
|
||||||
.PP
|
.PP
|
||||||
@@ -902,9 +908,9 @@ set i [\fBinterp create\fR]
|
|||||||
}
|
}
|
||||||
.CE
|
.CE
|
||||||
.SH "SEE ALSO"
|
.SH "SEE ALSO"
|
||||||
bgerror(n), load(n), safe(n), Tcl_CreateSlave(3), Tcl_Eval(3), Tcl_BackgroundException(3)
|
bgerror(n), load(n), safe(n), Tcl_CreateChild(3), Tcl_Eval(3), Tcl_BackgroundException(3)
|
||||||
.SH KEYWORDS
|
.SH KEYWORDS
|
||||||
alias, master interpreter, safe interpreter, slave interpreter
|
alias, parent interpreter, safe interpreter, child interpreter
|
||||||
'\"Local Variables:
|
'\"Local Variables:
|
||||||
'\"mode: nroff
|
'\"mode: nroff
|
||||||
'\"End:
|
'\"End:
|
||||||
|
|||||||
@@ -124,7 +124,7 @@ will read all the \fB.tcl\fR files in subdirectory \fBfoo\fR and
|
|||||||
generate a new index file \fBfoo/tclIndex\fR.
|
generate a new index file \fBfoo/tclIndex\fR.
|
||||||
.PP
|
.PP
|
||||||
\fBAuto_mkindex\fR parses the Tcl scripts by sourcing them into a
|
\fBAuto_mkindex\fR parses the Tcl scripts by sourcing them into a
|
||||||
slave interpreter and monitoring the proc and namespace commands that
|
child interpreter and monitoring the proc and namespace commands that
|
||||||
are executed. Extensions can use the (undocumented)
|
are executed. Extensions can use the (undocumented)
|
||||||
auto_mkindex_parser package to register other commands that can
|
auto_mkindex_parser package to register other commands that can
|
||||||
contribute to the auto_load index. You will have to read through
|
contribute to the auto_load index. You will have to read through
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
'\"
|
'\"
|
||||||
'\" Copyright (c) 1993 The Regents of the University of California.
|
'\" Copyright (c) 1993 The Regents of the University of California.
|
||||||
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
|
'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.
|
||||||
'\" Copyright (c) 2001 by Kevin B. Kenny <kennykb@acm.org>. All rights reserved.
|
'\" Copyright (c) 2001 Kevin B. Kenny <kennykb@acm.org>. All rights reserved.
|
||||||
'\"
|
'\"
|
||||||
'\" See the file "license.terms" for information on usage and redistribution
|
'\" See the file "license.terms" for information on usage and redistribution
|
||||||
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
'\"
|
'\"
|
||||||
'\" Copyright (c) 2003 by Simon Geard. All rights reserved.
|
'\" Copyright (c) 2003 Simon Geard. All rights reserved.
|
||||||
'\"
|
'\"
|
||||||
'\" See the file "license.terms" for information on usage and redistribution
|
'\" See the file "license.terms" for information on usage and redistribution
|
||||||
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
'\"
|
'\"
|
||||||
'\" Copyright (c) 2006 by Donal K. Fellows. All rights reserved.
|
'\" Copyright (c) 2006 Donal K. Fellows. All rights reserved.
|
||||||
'\"
|
'\"
|
||||||
'\" See the file "license.terms" for information on usage and redistribution
|
'\" See the file "license.terms" for information on usage and redistribution
|
||||||
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
|
|||||||
@@ -22,7 +22,8 @@ This command searches the elements of \fIlist\fR to see if one
|
|||||||
of them matches \fIpattern\fR. If so, the command returns the index
|
of them matches \fIpattern\fR. If so, the command returns the index
|
||||||
of the first matching element
|
of the first matching element
|
||||||
(unless the options \fB\-all\fR or \fB\-inline\fR are specified.)
|
(unless the options \fB\-all\fR or \fB\-inline\fR are specified.)
|
||||||
If not, the command returns \fB\-1\fR. The \fIoption\fR arguments
|
If not, the command returns \fB\-1\fR or (if options \fB\-all\fR
|
||||||
|
or \fB\-inline\fR are specified) the empty string. The \fIoption\fR arguments
|
||||||
indicates how the elements of the list are to be matched against
|
indicates how the elements of the list are to be matched against
|
||||||
\fIpattern\fR and must have one of the values below:
|
\fIpattern\fR and must have one of the values below:
|
||||||
.SS "MATCHING STYLE OPTIONS"
|
.SS "MATCHING STYLE OPTIONS"
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
'\"
|
'\"
|
||||||
'\" Copyright (c) 2001 by Kevin B. Kenny <kennykb@acm.org>. All rights reserved.
|
'\" Copyright (c) 2001 Kevin B. Kenny <kennykb@acm.org>. All rights reserved.
|
||||||
'\"
|
'\"
|
||||||
'\" See the file "license.terms" for information on usage and redistribution
|
'\" See the file "license.terms" for information on usage and redistribution
|
||||||
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
'\"
|
'\"
|
||||||
'\" Copyright (c) 1993 The Regents of the University of California.
|
'\" Copyright (c) 1993 The Regents of the University of California.
|
||||||
'\" Copyright (c) 1994-2000 Sun Microsystems, Inc.
|
'\" Copyright (c) 1994-2000 Sun Microsystems, Inc.
|
||||||
'\" Copyright (c) 2005 by Kevin B. Kenny <kennykb@acm.org>. All rights reserved
|
'\" Copyright (c) 2005 Kevin B. Kenny <kennykb@acm.org>. All rights reserved
|
||||||
'\"
|
'\"
|
||||||
'\" See the file "license.terms" for information on usage and redistribution
|
'\" See the file "license.terms" for information on usage and redistribution
|
||||||
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
@@ -295,9 +295,9 @@ are returned as an integer value.
|
|||||||
expr(n), mathop(n), namespace(n)
|
expr(n), mathop(n), namespace(n)
|
||||||
.SH "COPYRIGHT"
|
.SH "COPYRIGHT"
|
||||||
.nf
|
.nf
|
||||||
Copyright (c) 1993 The Regents of the University of California.
|
Copyright \(co 1993 The Regents of the University of California.
|
||||||
Copyright (c) 1994-2000 Sun Microsystems Incorporated.
|
Copyright \(co 1994-2000 Sun Microsystems Incorporated.
|
||||||
Copyright (c) 2005, 2006 by Kevin B. Kenny <kennykb@acm.org>.
|
Copyright \(co 2005, 2006 Kevin B. Kenny <kennykb@acm.org>.
|
||||||
.fi
|
.fi
|
||||||
'\" Local Variables:
|
'\" Local Variables:
|
||||||
'\" mode: nroff
|
'\" mode: nroff
|
||||||
|
|||||||
@@ -151,10 +151,11 @@ is the same as
|
|||||||
.QW "\fB** 2 [** 3 4]\fR" .
|
.QW "\fB** 2 [** 3 4]\fR" .
|
||||||
Each \fInumber\fR may be
|
Each \fInumber\fR may be
|
||||||
any numeric value, though the second number must not be fractional if the
|
any numeric value, though the second number must not be fractional if the
|
||||||
first is negative. If no arguments are given, the result will be one, and if
|
first is negative. The maximum exponent value that Tcl can handle if the
|
||||||
only one argument is given, the result will be that argument. The
|
first number is an integer > 1 is 268435455. If no arguments are given,
|
||||||
result will have an integral value only when all arguments are
|
the result will be one, and if only one argument is given, the result will
|
||||||
integral values.
|
be that argument. The result will have an integral value only when all
|
||||||
|
arguments are integral values.
|
||||||
.SS "COMPARISON OPERATORS"
|
.SS "COMPARISON OPERATORS"
|
||||||
.PP
|
.PP
|
||||||
The behaviors of the comparison operator commands (most of which operate
|
The behaviors of the comparison operator commands (most of which operate
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
'\"
|
'\"
|
||||||
'\" Copyright (c) 1992-1999 by Karl Lehenbauer and Mark Diekhans
|
'\" Copyright (c) 1992-1999 Karl Lehenbauer & Mark Diekhans
|
||||||
'\" Copyright (c) 2000 by Scriptics Corporation.
|
'\" Copyright (c) 2000 Scriptics Corporation.
|
||||||
'\" All rights reserved.
|
'\" All rights reserved.
|
||||||
'\"
|
'\"
|
||||||
.TH memory n 8.1 Tcl "Tcl Built-In Commands"
|
.TH memory n 8.1 Tcl "Tcl Built-In Commands"
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
'\"
|
'\"
|
||||||
'\" Copyright (c) 1998-2000 by Scriptics Corporation.
|
'\" Copyright (c) 1998-2000 Scriptics Corporation.
|
||||||
'\" All rights reserved.
|
'\" All rights reserved.
|
||||||
'\"
|
'\"
|
||||||
.TH pkg::create n 8.3 Tcl "Tcl Built-In Commands"
|
.TH pkg::create n 8.3 Tcl "Tcl Built-In Commands"
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ The default pattern is \fB*.tcl\fR and \fB*.[info sharedlibextension]\fR.
|
|||||||
\fBPkg_mkIndex\fR will create a file \fBpkgIndex.tcl\fR in \fIdir\fR
|
\fBPkg_mkIndex\fR will create a file \fBpkgIndex.tcl\fR in \fIdir\fR
|
||||||
with package information about all the files given by the \fIpattern\fR
|
with package information about all the files given by the \fIpattern\fR
|
||||||
arguments.
|
arguments.
|
||||||
It does this by loading each file into a slave
|
It does this by loading each file into a child
|
||||||
interpreter and seeing what packages
|
interpreter and seeing what packages
|
||||||
and new commands appear (this is why it is essential to have
|
and new commands appear (this is why it is essential to have
|
||||||
\fBpackage provide\fR commands or \fBTcl_PkgProvide\fR calls
|
\fBpackage provide\fR commands or \fBTcl_PkgProvide\fR calls
|
||||||
@@ -109,7 +109,7 @@ the use of \fIauto_reset\fR, and therefore its use is discouraged.
|
|||||||
.TP 15
|
.TP 15
|
||||||
\fB\-load \fIpkgPat\fR
|
\fB\-load \fIpkgPat\fR
|
||||||
The index process will pre-load any packages that exist in the
|
The index process will pre-load any packages that exist in the
|
||||||
current interpreter and match \fIpkgPat\fR into the slave interpreter used to
|
current interpreter and match \fIpkgPat\fR into the child interpreter used to
|
||||||
generate the index. The pattern match uses string match rules, but without
|
generate the index. The pattern match uses string match rules, but without
|
||||||
making case distinctions.
|
making case distinctions.
|
||||||
See \fBCOMPLEX CASES\fR below.
|
See \fBCOMPLEX CASES\fR below.
|
||||||
|
|||||||
@@ -293,12 +293,12 @@ treatment is as if the enclosing delimiters were
|
|||||||
.QW \fB[.\fR \&
|
.QW \fB[.\fR \&
|
||||||
and
|
and
|
||||||
.QW \fB.]\fR .)
|
.QW \fB.]\fR .)
|
||||||
For example, if \fBo\fR and \fB\*(qo\fR are the members of an
|
For example, if \fBo\fR and \fB\(^o\fR are the members of an
|
||||||
equivalence class, then
|
equivalence class, then
|
||||||
.QW \fB[[=o=]]\fR ,
|
.QW \fB[[=o=]]\fR ,
|
||||||
.QW \fB[[=\*(qo=]]\fR ,
|
.QW \fB[[=\(^o=]]\fR ,
|
||||||
and
|
and
|
||||||
.QW \fB[o\*(qo]\fR \&
|
.QW \fB[o\(^o]\fR \&
|
||||||
are all synonymous. An equivalence class may not be an endpoint of a range.
|
are all synonymous. An equivalence class may not be an endpoint of a range.
|
||||||
.RS
|
.RS
|
||||||
.PP
|
.PP
|
||||||
|
|||||||
110
doc/safe.n
110
doc/safe.n
@@ -11,17 +11,17 @@
|
|||||||
.SH NAME
|
.SH NAME
|
||||||
safe \- Creating and manipulating safe interpreters
|
safe \- Creating and manipulating safe interpreters
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
\fB::safe::interpCreate\fR ?\fIslave\fR? ?\fIoptions...\fR?
|
\fB::safe::interpCreate\fR ?\fIchild\fR? ?\fIoptions...\fR?
|
||||||
.sp
|
.sp
|
||||||
\fB::safe::interpInit\fR \fIslave\fR ?\fIoptions...\fR?
|
\fB::safe::interpInit\fR \fIchild\fR ?\fIoptions...\fR?
|
||||||
.sp
|
.sp
|
||||||
\fB::safe::interpConfigure\fR \fIslave\fR ?\fIoptions...\fR?
|
\fB::safe::interpConfigure\fR \fIchild\fR ?\fIoptions...\fR?
|
||||||
.sp
|
.sp
|
||||||
\fB::safe::interpDelete\fR \fIslave\fR
|
\fB::safe::interpDelete\fR \fIchild\fR
|
||||||
.sp
|
.sp
|
||||||
\fB::safe::interpAddToAccessPath\fR \fIslave\fR \fIdirectory\fR
|
\fB::safe::interpAddToAccessPath\fR \fIchild\fR \fIdirectory\fR
|
||||||
.sp
|
.sp
|
||||||
\fB::safe::interpFindInAccessPath\fR \fIslave\fR \fIdirectory\fR
|
\fB::safe::interpFindInAccessPath\fR \fIchild\fR \fIdirectory\fR
|
||||||
.sp
|
.sp
|
||||||
\fB::safe::setLogCmd\fR ?\fIcmd arg...\fR?
|
\fB::safe::setLogCmd\fR ?\fIcmd arg...\fR?
|
||||||
.SS OPTIONS
|
.SS OPTIONS
|
||||||
@@ -44,7 +44,7 @@ application or computer. Untrusted scripts are also prevented from
|
|||||||
disclosing information stored on the hosting computer or in the
|
disclosing information stored on the hosting computer or in the
|
||||||
hosting application to any party.
|
hosting application to any party.
|
||||||
.PP
|
.PP
|
||||||
Safe Tcl allows a master interpreter to create safe, restricted
|
Safe Tcl allows a parent interpreter to create safe, restricted
|
||||||
interpreters that contain a set of predefined aliases for the \fBsource\fR,
|
interpreters that contain a set of predefined aliases for the \fBsource\fR,
|
||||||
\fBload\fR, \fBfile\fR, \fBencoding\fR, and \fBexit\fR commands and
|
\fBload\fR, \fBfile\fR, \fBencoding\fR, and \fBexit\fR commands and
|
||||||
are able to use the auto-loading and package mechanisms.
|
are able to use the auto-loading and package mechanisms.
|
||||||
@@ -53,39 +53,47 @@ No knowledge of the file system structure is leaked to the
|
|||||||
safe interpreter, because it has access only to a virtualized path
|
safe interpreter, because it has access only to a virtualized path
|
||||||
containing tokens. When the safe interpreter requests to source a file, it
|
containing tokens. When the safe interpreter requests to source a file, it
|
||||||
uses the token in the virtual path as part of the file name to source; the
|
uses the token in the virtual path as part of the file name to source; the
|
||||||
master interpreter transparently
|
parent interpreter transparently
|
||||||
translates the token into a real directory name and executes the
|
translates the token into a real directory name and executes the
|
||||||
requested operation (see the section \fBSECURITY\fR below for details).
|
requested operation (see the section \fBSECURITY\fR below for details).
|
||||||
Different levels of security can be selected by using the optional flags
|
Different levels of security can be selected by using the optional flags
|
||||||
of the commands described below.
|
of the commands described below.
|
||||||
.PP
|
.PP
|
||||||
All commands provided in the master interpreter by Safe Tcl reside in
|
All commands provided in the parent interpreter by Safe Tcl reside in
|
||||||
the \fBsafe\fR namespace.
|
the \fBsafe\fR namespace.
|
||||||
.SH COMMANDS
|
.SH COMMANDS
|
||||||
The following commands are provided in the master interpreter:
|
The following commands are provided in the parent interpreter:
|
||||||
.TP
|
.TP
|
||||||
\fB::safe::interpCreate\fR ?\fIslave\fR? ?\fIoptions...\fR?
|
\fB::safe::interpCreate\fR ?\fIchild\fR? ?\fIoptions...\fR?
|
||||||
Creates a safe interpreter, installs the aliases described in the section
|
Creates a safe interpreter, installs the aliases described in the section
|
||||||
\fBALIASES\fR and initializes the auto-loading and package mechanism as
|
\fBALIASES\fR and initializes the auto-loading and package mechanism as
|
||||||
specified by the supplied \fIoptions\fR.
|
specified by the supplied \fIoptions\fR.
|
||||||
See the \fBOPTIONS\fR section below for a description of the
|
See the \fBOPTIONS\fR section below for a description of the
|
||||||
optional arguments.
|
optional arguments.
|
||||||
If the \fIslave\fR argument is omitted, a name will be generated.
|
If the \fIchild\fR argument is omitted, a name will be generated.
|
||||||
\fB::safe::interpCreate\fR always returns the interpreter name.
|
\fB::safe::interpCreate\fR always returns the interpreter name.
|
||||||
|
.sp
|
||||||
|
The interpreter name \fIchild\fR may include namespace separators,
|
||||||
|
but may not have leading or trailing namespace separators, or excess
|
||||||
|
colon characters in namespace separators. The interpreter name is
|
||||||
|
qualified relative to the global namespace ::, not the namespace in which
|
||||||
|
the \fB::safe::interpCreate\fR command is evaluated.
|
||||||
.TP
|
.TP
|
||||||
\fB::safe::interpInit\fR \fIslave\fR ?\fIoptions...\fR?
|
\fB::safe::interpInit\fR \fIchild\fR ?\fIoptions...\fR?
|
||||||
This command is similar to \fBinterpCreate\fR except it that does not
|
This command is similar to \fBinterpCreate\fR except it that does not
|
||||||
create the safe interpreter. \fIslave\fR must have been created by some
|
create the safe interpreter. \fIchild\fR must have been created by some
|
||||||
other means, like \fBinterp create\fR \fB\-safe\fR.
|
other means, like \fBinterp create\fR \fB\-safe\fR. The interpreter
|
||||||
|
name \fIchild\fR may include namespace separators, subject to the same
|
||||||
|
restrictions as for \fBinterpCreate\fR.
|
||||||
.TP
|
.TP
|
||||||
\fB::safe::interpConfigure\fR \fIslave\fR ?\fIoptions...\fR?
|
\fB::safe::interpConfigure\fR \fIchild\fR ?\fIoptions...\fR?
|
||||||
If no \fIoptions\fR are given, returns the settings for all options for the
|
If no \fIoptions\fR are given, returns the settings for all options for the
|
||||||
named safe interpreter as a list of options and their current values
|
named safe interpreter as a list of options and their current values
|
||||||
for that \fIslave\fR.
|
for that \fIchild\fR.
|
||||||
If a single additional argument is provided,
|
If a single additional argument is provided,
|
||||||
it will return a list of 2 elements \fIname\fR and \fIvalue\fR where
|
it will return a list of 2 elements \fIname\fR and \fIvalue\fR where
|
||||||
\fIname\fR is the full name of that option and \fIvalue\fR the current value
|
\fIname\fR is the full name of that option and \fIvalue\fR the current value
|
||||||
for that option and the \fIslave\fR.
|
for that option and the \fIchild\fR.
|
||||||
If more than two additional arguments are provided, it will reconfigure the
|
If more than two additional arguments are provided, it will reconfigure the
|
||||||
safe interpreter and change each and only the provided options.
|
safe interpreter and change each and only the provided options.
|
||||||
See the section on \fBOPTIONS\fR below for options description.
|
See the section on \fBOPTIONS\fR below for options description.
|
||||||
@@ -105,14 +113,14 @@ safe::interpConfigure $i0 \-delete {foo bar} \-statics 0
|
|||||||
.CE
|
.CE
|
||||||
.RE
|
.RE
|
||||||
.TP
|
.TP
|
||||||
\fB::safe::interpDelete\fR \fIslave\fR
|
\fB::safe::interpDelete\fR \fIchild\fR
|
||||||
Deletes the safe interpreter and cleans up the corresponding
|
Deletes the safe interpreter and cleans up the corresponding
|
||||||
master interpreter data structures.
|
parent interpreter data structures.
|
||||||
If a \fIdeleteHook\fR script was specified for this interpreter it is
|
If a \fIdeleteHook\fR script was specified for this interpreter it is
|
||||||
evaluated before the interpreter is deleted, with the name of the
|
evaluated before the interpreter is deleted, with the name of the
|
||||||
interpreter as an additional argument.
|
interpreter as an additional argument.
|
||||||
.TP
|
.TP
|
||||||
\fB::safe::interpFindInAccessPath\fR \fIslave\fR \fIdirectory\fR
|
\fB::safe::interpFindInAccessPath\fR \fIchild\fR \fIdirectory\fR
|
||||||
This command finds and returns the token for the real directory
|
This command finds and returns the token for the real directory
|
||||||
\fIdirectory\fR in the safe interpreter's current virtual access path.
|
\fIdirectory\fR in the safe interpreter's current virtual access path.
|
||||||
It generates an error if the directory is not found.
|
It generates an error if the directory is not found.
|
||||||
@@ -120,14 +128,14 @@ Example of use:
|
|||||||
.RS
|
.RS
|
||||||
.PP
|
.PP
|
||||||
.CS
|
.CS
|
||||||
$slave eval [list set tk_library \e
|
$child eval [list set tk_library \e
|
||||||
[::safe::interpFindInAccessPath $name $tk_library]]
|
[::safe::interpFindInAccessPath $name $tk_library]]
|
||||||
.CE
|
.CE
|
||||||
.RE
|
.RE
|
||||||
.TP
|
.TP
|
||||||
\fB::safe::interpAddToAccessPath\fR \fIslave\fR \fIdirectory\fR
|
\fB::safe::interpAddToAccessPath\fR \fIchild\fR \fIdirectory\fR
|
||||||
This command adds \fIdirectory\fR to the virtual path maintained for the
|
This command adds \fIdirectory\fR to the virtual path maintained for the
|
||||||
safe interpreter in the master, and returns the token that can be used in
|
safe interpreter in the parent, and returns the token that can be used in
|
||||||
the safe interpreter to obtain access to files in that directory.
|
the safe interpreter to obtain access to files in that directory.
|
||||||
If the directory is already in the virtual path, it only returns the token
|
If the directory is already in the virtual path, it only returns the token
|
||||||
without adding the directory to the virtual path again.
|
without adding the directory to the virtual path again.
|
||||||
@@ -135,7 +143,7 @@ Example of use:
|
|||||||
.RS
|
.RS
|
||||||
.PP
|
.PP
|
||||||
.CS
|
.CS
|
||||||
$slave eval [list set tk_library \e
|
$child eval [list set tk_library \e
|
||||||
[::safe::interpAddToAccessPath $name $tk_library]]
|
[::safe::interpAddToAccessPath $name $tk_library]]
|
||||||
.CE
|
.CE
|
||||||
.RE
|
.RE
|
||||||
@@ -168,10 +176,10 @@ Note that the safe interpreter only received an error message saying that
|
|||||||
the file was not found:
|
the file was not found:
|
||||||
.PP
|
.PP
|
||||||
.CS
|
.CS
|
||||||
NOTICE for slave interp10 : Created
|
NOTICE for child interp10 : Created
|
||||||
NOTICE for slave interp10 : Setting accessPath=(/foo/bar) staticsok=1 nestedok=0 deletehook=()
|
NOTICE for child interp10 : Setting accessPath=(/foo/bar) staticsok=1 nestedok=0 deletehook=()
|
||||||
NOTICE for slave interp10 : auto_path in interp10 has been set to {$p(:0:)}
|
NOTICE for child interp10 : auto_path in interp10 has been set to {$p(:0:)}
|
||||||
ERROR for slave interp10 : /foo/bar/init.tcl: no such file or directory
|
ERROR for child interp10 : /foo/bar/init.tcl: no such file or directory
|
||||||
.CE
|
.CE
|
||||||
.RE
|
.RE
|
||||||
.SS OPTIONS
|
.SS OPTIONS
|
||||||
@@ -187,7 +195,7 @@ This option sets the list of directories from which the safe interpreter
|
|||||||
can \fBsource\fR and \fBload\fR files.
|
can \fBsource\fR and \fBload\fR files.
|
||||||
If this option is not specified, or if it is given as the
|
If this option is not specified, or if it is given as the
|
||||||
empty list, the safe interpreter will use the same directories as its
|
empty list, the safe interpreter will use the same directories as its
|
||||||
master for auto-loading.
|
parent for auto-loading.
|
||||||
See the section \fBSECURITY\fR below for more detail about virtual paths,
|
See the section \fBSECURITY\fR below for more detail about virtual paths,
|
||||||
tokens and access control.
|
tokens and access control.
|
||||||
.TP
|
.TP
|
||||||
@@ -216,7 +224,7 @@ to load packages into its own sub-interpreters.
|
|||||||
.TP
|
.TP
|
||||||
\fB\-deleteHook\fR \fIscript\fR
|
\fB\-deleteHook\fR \fIscript\fR
|
||||||
When this option is given a non-empty \fIscript\fR, it will be
|
When this option is given a non-empty \fIscript\fR, it will be
|
||||||
evaluated in the master with the name of
|
evaluated in the parent with the name of
|
||||||
the safe interpreter as an additional argument
|
the safe interpreter as an additional argument
|
||||||
just before actually deleting the safe interpreter.
|
just before actually deleting the safe interpreter.
|
||||||
Giving an empty value removes any currently installed deletion hook
|
Giving an empty value removes any currently installed deletion hook
|
||||||
@@ -281,8 +289,8 @@ potential for information leakage about its directory structure.
|
|||||||
To prevent this, commands that take file names as arguments in a safe
|
To prevent this, commands that take file names as arguments in a safe
|
||||||
interpreter use tokens instead of the real directory names.
|
interpreter use tokens instead of the real directory names.
|
||||||
These tokens are translated to the real directory name while a request to,
|
These tokens are translated to the real directory name while a request to,
|
||||||
e.g., source a file is mediated by the master interpreter.
|
e.g., source a file is mediated by the parent interpreter.
|
||||||
This virtual path system is maintained in the master interpreter for each safe
|
This virtual path system is maintained in the parent interpreter for each safe
|
||||||
interpreter created by \fB::safe::interpCreate\fR or initialized by
|
interpreter created by \fB::safe::interpCreate\fR or initialized by
|
||||||
\fB::safe::interpInit\fR and
|
\fB::safe::interpInit\fR and
|
||||||
the path maps tokens accessible in the safe interpreter into real path
|
the path maps tokens accessible in the safe interpreter into real path
|
||||||
@@ -291,7 +299,7 @@ from gaining knowledge about the
|
|||||||
structure of the file system of the host on which the interpreter is
|
structure of the file system of the host on which the interpreter is
|
||||||
executing.
|
executing.
|
||||||
The only valid file names arguments
|
The only valid file names arguments
|
||||||
for the \fBsource\fR and \fBload\fR aliases provided to the slave
|
for the \fBsource\fR and \fBload\fR aliases provided to the child
|
||||||
are path in the form of
|
are path in the form of
|
||||||
\fB[file join \fItoken filename\fB]\fR (i.e. when using the
|
\fB[file join \fItoken filename\fB]\fR (i.e. when using the
|
||||||
native file path formats: \fItoken\fB/\fIfilename\fR
|
native file path formats: \fItoken\fB/\fIfilename\fR
|
||||||
@@ -320,26 +328,26 @@ or be called
|
|||||||
.PP
|
.PP
|
||||||
Each element of the initial access path
|
Each element of the initial access path
|
||||||
list will be assigned a token that will be set in
|
list will be assigned a token that will be set in
|
||||||
the slave \fBauto_path\fR and the first element of that list will be set as
|
the child \fBauto_path\fR and the first element of that list will be set as
|
||||||
the \fBtcl_library\fR for that slave.
|
the \fBtcl_library\fR for that child.
|
||||||
.PP
|
.PP
|
||||||
If the access path argument is not given or is the empty list,
|
If the access path argument is not given or is the empty list,
|
||||||
the default behavior is to let the slave access the same packages
|
the default behavior is to let the child access the same packages
|
||||||
as the master has access to (Or to be more precise:
|
as the parent has access to (Or to be more precise:
|
||||||
only packages written in Tcl (which by definition cannot be dangerous
|
only packages written in Tcl (which by definition cannot be dangerous
|
||||||
as they run in the slave interpreter) and C extensions that
|
as they run in the child interpreter) and C extensions that
|
||||||
provides a _SafeInit entry point). For that purpose, the master's
|
provides a _SafeInit entry point). For that purpose, the parent's
|
||||||
\fBauto_path\fR will be used to construct the slave access path.
|
\fBauto_path\fR will be used to construct the child access path.
|
||||||
In order that the slave successfully loads the Tcl library files
|
In order that the child successfully loads the Tcl library files
|
||||||
(which includes the auto-loading mechanism itself) the \fBtcl_library\fR will be
|
(which includes the auto-loading mechanism itself) the \fBtcl_library\fR will be
|
||||||
added or moved to the first position if necessary, in the
|
added or moved to the first position if necessary, in the
|
||||||
slave access path, so the slave
|
child access path, so the child
|
||||||
\fBtcl_library\fR will be the same as the master's (its real
|
\fBtcl_library\fR will be the same as the parent's (its real
|
||||||
path will still be invisible to the slave though).
|
path will still be invisible to the child though).
|
||||||
In order that auto-loading works the same for the slave and
|
In order that auto-loading works the same for the child and
|
||||||
the master in this by default case, the first-level
|
the parent in this by default case, the first-level
|
||||||
sub directories of each directory in the master \fBauto_path\fR will
|
sub directories of each directory in the parent \fBauto_path\fR will
|
||||||
also be added (if not already included) to the slave access path.
|
also be added (if not already included) to the child access path.
|
||||||
You can always specify a more
|
You can always specify a more
|
||||||
restrictive path for which sub directories will never be searched by
|
restrictive path for which sub directories will never be searched by
|
||||||
explicitly specifying your directory list with the \fB\-accessPath\fR flag
|
explicitly specifying your directory list with the \fB\-accessPath\fR flag
|
||||||
@@ -352,8 +360,8 @@ to synchronize its \fBauto_index\fR with the new token list.
|
|||||||
.SH "SEE ALSO"
|
.SH "SEE ALSO"
|
||||||
interp(n), library(n), load(n), package(n), source(n), unknown(n)
|
interp(n), library(n), load(n), package(n), source(n), unknown(n)
|
||||||
.SH KEYWORDS
|
.SH KEYWORDS
|
||||||
alias, auto\-loading, auto_mkindex, load, master interpreter, safe
|
alias, auto\-loading, auto_mkindex, load, parent interpreter, safe
|
||||||
interpreter, slave interpreter, source
|
interpreter, child interpreter, source
|
||||||
'\" Local Variables:
|
'\" Local Variables:
|
||||||
'\" mode: nroff
|
'\" mode: nroff
|
||||||
'\" End:
|
'\" End:
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
'\"
|
'\"
|
||||||
'\" Copyright (c) 1996 Sun Microsystems, Inc.
|
'\" Copyright (c) 1996 Sun Microsystems, Inc.
|
||||||
'\" Copyright (c) 1998-1999 by Scriptics Corporation.
|
'\" Copyright (c) 1998-1999 Scriptics Corporation.
|
||||||
'\"
|
'\"
|
||||||
'\" See the file "license.terms" for information on usage and redistribution
|
'\" See the file "license.terms" for information on usage and redistribution
|
||||||
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
|
|||||||
@@ -333,21 +333,21 @@ specified using the forms described in \fBSTRING INDICES\fR.
|
|||||||
Returns a value equal to \fIstring\fR except that any leading or
|
Returns a value equal to \fIstring\fR except that any leading or
|
||||||
trailing characters present in the string given by \fIchars\fR are removed. If
|
trailing characters present in the string given by \fIchars\fR are removed. If
|
||||||
\fIchars\fR is not specified then white space is removed (any character
|
\fIchars\fR is not specified then white space is removed (any character
|
||||||
for which \fBstring is space\fR returns 1, and "\0").
|
for which \fBstring is space\fR returns 1, and "\e0").
|
||||||
.TP
|
.TP
|
||||||
\fBstring trimleft \fIstring\fR ?\fIchars\fR?
|
\fBstring trimleft \fIstring\fR ?\fIchars\fR?
|
||||||
.
|
.
|
||||||
Returns a value equal to \fIstring\fR except that any leading
|
Returns a value equal to \fIstring\fR except that any leading
|
||||||
characters present in the string given by \fIchars\fR are removed. If
|
characters present in the string given by \fIchars\fR are removed. If
|
||||||
\fIchars\fR is not specified then white space is removed (any character
|
\fIchars\fR is not specified then white space is removed (any character
|
||||||
for which \fBstring is space\fR returns 1, and "\0").
|
for which \fBstring is space\fR returns 1, and "\e0").
|
||||||
.TP
|
.TP
|
||||||
\fBstring trimright \fIstring\fR ?\fIchars\fR?
|
\fBstring trimright \fIstring\fR ?\fIchars\fR?
|
||||||
.
|
.
|
||||||
Returns a value equal to \fIstring\fR except that any trailing
|
Returns a value equal to \fIstring\fR except that any trailing
|
||||||
characters present in the string given by \fIchars\fR are removed. If
|
characters present in the string given by \fIchars\fR are removed. If
|
||||||
\fIchars\fR is not specified then white space is removed (any character
|
\fIchars\fR is not specified then white space is removed (any character
|
||||||
for which \fBstring is space\fR returns 1, and "\0").
|
for which \fBstring is space\fR returns 1, and "\e0").
|
||||||
.SS "OBSOLETE SUBCOMMANDS"
|
.SS "OBSOLETE SUBCOMMANDS"
|
||||||
.PP
|
.PP
|
||||||
These subcommands are currently supported, but are likely to go away in a
|
These subcommands are currently supported, but are likely to go away in a
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ If this character is present in the file, the \fBtclsh\fR application
|
|||||||
will read text up to but not including the character. An application
|
will read text up to but not including the character. An application
|
||||||
that requires this character in the file may safely encode it as
|
that requires this character in the file may safely encode it as
|
||||||
.QW \e032 ,
|
.QW \e032 ,
|
||||||
.QW \ex1a ,
|
.QW \ex1A ,
|
||||||
or
|
or
|
||||||
.QW \eu001a ;
|
.QW \eu001a ;
|
||||||
or may generate it by use of commands such as \fBformat\fR or \fBbinary\fR.
|
or may generate it by use of commands such as \fBformat\fR or \fBbinary\fR.
|
||||||
|
|||||||
@@ -203,7 +203,7 @@ array. Returns an empty string.
|
|||||||
.TP
|
.TP
|
||||||
\fBrunAllTests\fR
|
\fBrunAllTests\fR
|
||||||
.
|
.
|
||||||
This is a master command meant to run an entire suite of tests,
|
This is a main command meant to run an entire suite of tests,
|
||||||
spanning multiple files and/or directories, as governed by
|
spanning multiple files and/or directories, as governed by
|
||||||
the configurable options of \fBtcltest\fR. See \fBRUNNING ALL TESTS\fR
|
the configurable options of \fBtcltest\fR. See \fBRUNNING ALL TESTS\fR
|
||||||
below for a complete description of the many variations possible
|
below for a complete description of the many variations possible
|
||||||
@@ -804,17 +804,17 @@ then a copy of \fBinterpreter\fR will be \fBexec\fR'd to
|
|||||||
evaluate each file. The multi-process operation is useful
|
evaluate each file. The multi-process operation is useful
|
||||||
when testing can cause errors so severe that a process
|
when testing can cause errors so severe that a process
|
||||||
terminates. Although such an error may terminate a child
|
terminates. Although such an error may terminate a child
|
||||||
process evaluating one file, the master process can continue
|
process evaluating one file, the main process can continue
|
||||||
with the rest of the test suite. In multi-process operation,
|
with the rest of the test suite. In multi-process operation,
|
||||||
the configuration of \fBtcltest\fR in the master process is
|
the configuration of \fBtcltest\fR in the main process is
|
||||||
passed to the child processes as command line arguments,
|
passed to the child processes as command line arguments,
|
||||||
with the exception of \fBconfigure \-outfile\fR. The
|
with the exception of \fBconfigure \-outfile\fR. The
|
||||||
\fBrunAllTests\fR command in the
|
\fBrunAllTests\fR command in the
|
||||||
master process collects all output from the child processes
|
main process collects all output from the child processes
|
||||||
and collates their results into one master report. Any
|
and collates their results into one main report. Any
|
||||||
reports of individual test failures, or messages requested
|
reports of individual test failures, or messages requested
|
||||||
by a \fBconfigure \-verbose\fR setting are passed directly
|
by a \fBconfigure \-verbose\fR setting are passed directly
|
||||||
on to \fBoutputChannel\fR by the master process.
|
on to \fBoutputChannel\fR by the main process.
|
||||||
.PP
|
.PP
|
||||||
After evaluating all selected test files, a summary of the
|
After evaluating all selected test files, a summary of the
|
||||||
results is printed to \fBoutputChannel\fR. The summary
|
results is printed to \fBoutputChannel\fR. The summary
|
||||||
@@ -1134,7 +1134,7 @@ A good namespace to use is a child namespace \fBtest\fR of the namespace
|
|||||||
of the module you are testing.
|
of the module you are testing.
|
||||||
.PP
|
.PP
|
||||||
A test file should also be able to be evaluated directly as a script,
|
A test file should also be able to be evaluated directly as a script,
|
||||||
not depending on being called by a master \fBrunAllTests\fR. This
|
not depending on being called by a main \fBrunAllTests\fR. This
|
||||||
means that each test file should process command line arguments to give
|
means that each test file should process command line arguments to give
|
||||||
the tester all the configuration control that \fBtcltest\fR provides.
|
the tester all the configuration control that \fBtcltest\fR provides.
|
||||||
.PP
|
.PP
|
||||||
@@ -1145,7 +1145,7 @@ Here is a sketch of a sample test file illustrating those points:
|
|||||||
.RS
|
.RS
|
||||||
.PP
|
.PP
|
||||||
.CS
|
.CS
|
||||||
package require tcltest 2.2
|
package require tcltest 2.5
|
||||||
eval \fB::tcltest::configure\fR $argv
|
eval \fB::tcltest::configure\fR $argv
|
||||||
package require example
|
package require example
|
||||||
namespace eval ::example::test {
|
namespace eval ::example::test {
|
||||||
@@ -1175,12 +1175,12 @@ doing any necessary setup. This script is usually named \fBall.tcl\fR
|
|||||||
because that is the default name used by \fBrunAllTests\fR when combining
|
because that is the default name used by \fBrunAllTests\fR when combining
|
||||||
multiple test suites into one testing run.
|
multiple test suites into one testing run.
|
||||||
.IP [8]
|
.IP [8]
|
||||||
Here is a sketch of a sample test suite master script:
|
Here is a sketch of a sample test suite main script:
|
||||||
.RS
|
.RS
|
||||||
.PP
|
.PP
|
||||||
.CS
|
.CS
|
||||||
package require Tcl 8.4
|
package require Tcl 8.6
|
||||||
package require tcltest 2.2
|
package require tcltest 2.5
|
||||||
package require example
|
package require example
|
||||||
\fB::tcltest::configure\fR -testdir \e
|
\fB::tcltest::configure\fR -testdir \e
|
||||||
[file dirname [file normalize [info script]]]
|
[file dirname [file normalize [info script]]]
|
||||||
|
|||||||
146
doc/timerate.n
Normal file
146
doc/timerate.n
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
'\"
|
||||||
|
'\" Copyright (c) 2005 Sergey Brester aka sebres.
|
||||||
|
'\"
|
||||||
|
'\" See the file "license.terms" for information on usage and redistribution
|
||||||
|
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
|
'\"
|
||||||
|
.TH timerate n "" Tcl "Tcl Built-In Commands"
|
||||||
|
.so man.macros
|
||||||
|
.BS
|
||||||
|
'\" Note: do not modify the .SH NAME line immediately below!
|
||||||
|
.SH NAME
|
||||||
|
timerate \- Calibrated performance measurements of script execution time
|
||||||
|
.SH SYNOPSIS
|
||||||
|
\fBtimerate \fIscript\fR ?\fItime\fR? ?\fImax-count\fR?
|
||||||
|
.sp
|
||||||
|
\fBtimerate \fR?\fB\-direct\fR? ?\fB\-overhead\fI double\fR? \fIscript\fR ?\fItime\fR? ?\fImax-count\fR?
|
||||||
|
.sp
|
||||||
|
\fBtimerate \fR?\fB\-calibrate\fR? ?\fB\-direct\fR? \fIscript\fR ?\fItime\fR? ?\fImax-count\fR?
|
||||||
|
.BE
|
||||||
|
.SH DESCRIPTION
|
||||||
|
.PP
|
||||||
|
The \fBtimerate\fR command does calibrated performance measurement of a Tcl
|
||||||
|
command or script, \fIscript\fR. The \fIscript\fR should be written so that it
|
||||||
|
can be executed multiple times during the performance measurement process.
|
||||||
|
Time is measured in elapsed time using the finest timer resolution as possible,
|
||||||
|
not CPU time; if \fIscript\fR interacts with the OS, the cost of that
|
||||||
|
interaction is included.
|
||||||
|
This command may be used to provide information as to how well a script or
|
||||||
|
Tcl command is performing, and can help determine bottlenecks and fine-tune
|
||||||
|
application performance.
|
||||||
|
.PP
|
||||||
|
The first and second form will evaluate \fIscript\fR until the interval
|
||||||
|
\fItime\fR given in milliseconds elapses, or for 1000 milliseconds (1 second)
|
||||||
|
if \fItime\fR is not specified.
|
||||||
|
.sp
|
||||||
|
The parameter \fImax-count\fR could additionally impose a further restriction
|
||||||
|
by the maximal number of iterations to evaluate the script.
|
||||||
|
If \fImax-count\fR is specified, the evalution will stop either this count of
|
||||||
|
iterations is reached or the time is exceeded.
|
||||||
|
.sp
|
||||||
|
It will then return a canonical tcl-list of the form:
|
||||||
|
.PP
|
||||||
|
.CS
|
||||||
|
\fB0.095977 \(mcs/# 52095836 # 10419167 #/sec 5000.000 net-ms\fR
|
||||||
|
.CE
|
||||||
|
.PP
|
||||||
|
which indicates:
|
||||||
|
.IP \(bu 3
|
||||||
|
the average amount of time required per iteration, in microseconds ([\fBlindex\fR $result 0])
|
||||||
|
.IP \(bu 3
|
||||||
|
the count how many times it was executed ([\fBlindex\fR $result 2])
|
||||||
|
.IP \(bu 3
|
||||||
|
the estimated rate per second ([\fBlindex\fR $result 4])
|
||||||
|
.IP \(bu 3
|
||||||
|
the estimated real execution time without measurement overhead ([\fBlindex\fR $result 6])
|
||||||
|
.PP
|
||||||
|
The following options may be supplied to the \fBtimerate\fR command:
|
||||||
|
.TP
|
||||||
|
\fB\-calibrate\fR
|
||||||
|
.
|
||||||
|
To measure very fast scripts as exactly as possible, a calibration process
|
||||||
|
may be required.
|
||||||
|
The \fB\-calibrate\fR option is used to calibrate \fBtimerate\fR itself,
|
||||||
|
calculating the estimated overhead of the given script as the default overhead
|
||||||
|
for future invocations of the \fBtimerate\fR command. If the \fItime\fR
|
||||||
|
parameter is not specified, the calibrate procedure runs for up to 10 seconds.
|
||||||
|
.RS
|
||||||
|
.PP
|
||||||
|
Note that calibration is not thread safe in the current implementation.
|
||||||
|
.RE
|
||||||
|
.TP
|
||||||
|
\fB\-overhead \fIdouble\fR
|
||||||
|
.
|
||||||
|
The \fB\-overhead\fR parameter supplies an estimate (in microseconds) of the
|
||||||
|
measurement overhead of each iteration of the tested script. This quantity
|
||||||
|
will be subtracted from the measured time prior to reporting results. This can
|
||||||
|
be useful for removing the cost of interpreter state reset commands from the
|
||||||
|
script being measured.
|
||||||
|
.TP
|
||||||
|
\fB\-direct\fR
|
||||||
|
.
|
||||||
|
The \fB-direct\fR option causes direct execution of the supplied script,
|
||||||
|
without compilation, in a manner similar to the \fBtime\fR command. It can be
|
||||||
|
used to measure the cost of \fBTcl_EvalObjEx\fR, of the invocation of canonical
|
||||||
|
lists, and of the uncompiled versions of bytecoded commands.
|
||||||
|
.PP
|
||||||
|
As opposed to the \fBtime\fR commmand, which runs the tested script for a fixed
|
||||||
|
number of iterations, the timerate command runs it for a fixed time.
|
||||||
|
Additionally, the compiled variant of the script will be used during the entire
|
||||||
|
measurement, as if the script were part of a compiled procedure, if the \fB\-direct\fR
|
||||||
|
option is not specified. The fixed time period and possibility of compilation allow
|
||||||
|
for more precise results and prevent very long execution times by slow scripts, making
|
||||||
|
it practical for measuring scripts with highly uncertain execution times.
|
||||||
|
.SH EXAMPLES
|
||||||
|
Estimate how fast it takes for a simple Tcl \fBfor\fR loop (including
|
||||||
|
operations on variable \fIi\fR) to count to ten:
|
||||||
|
.PP
|
||||||
|
.CS
|
||||||
|
\fI# calibrate\fR
|
||||||
|
\fBtimerate\fR -calibrate {}
|
||||||
|
|
||||||
|
\fI# measure\fR
|
||||||
|
\fBtimerate\fR { for {set i 0} {$i<10} {incr i} {} } 5000
|
||||||
|
.CE
|
||||||
|
.PP
|
||||||
|
Estimate how fast it takes for a simple Tcl \fBfor\fR loop, ignoring the
|
||||||
|
overhead of the management of the variable that controls the loop:
|
||||||
|
.PP
|
||||||
|
.CS
|
||||||
|
\fI# calibrate for overhead of variable operations\fR
|
||||||
|
set i 0; \fBtimerate\fR -calibrate {expr {$i<10}; incr i} 1000
|
||||||
|
|
||||||
|
\fI# measure\fR
|
||||||
|
\fBtimerate\fR {
|
||||||
|
for {set i 0} {$i<10} {incr i} {}
|
||||||
|
} 5000
|
||||||
|
.CE
|
||||||
|
.PP
|
||||||
|
Estimate the speed of calculating the hour of the day using \fBclock format\fR only,
|
||||||
|
ignoring overhead of the portion of the script that prepares the time for it to
|
||||||
|
calculate:
|
||||||
|
.PP
|
||||||
|
.CS
|
||||||
|
\fI# calibrate\fR
|
||||||
|
\fBtimerate\fR -calibrate {}
|
||||||
|
|
||||||
|
\fI# estimate overhead\fR
|
||||||
|
set tm 0
|
||||||
|
set ovh [lindex [\fBtimerate\fR {
|
||||||
|
incr tm [expr {24*60*60}]
|
||||||
|
}] 0]
|
||||||
|
|
||||||
|
\fI# measure using estimated overhead\fR
|
||||||
|
set tm 0
|
||||||
|
\fBtimerate\fR -overhead $ovh {
|
||||||
|
clock format $tm -format %H
|
||||||
|
incr tm [expr {24*60*60}]; # overhead for this is ignored
|
||||||
|
} 5000
|
||||||
|
.CE
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
time(n)
|
||||||
|
.SH KEYWORDS
|
||||||
|
performance measurement, script, time
|
||||||
|
.\" Local Variables:
|
||||||
|
.\" mode: nroff
|
||||||
|
.\" End:
|
||||||
22
doc/zlib.n
22
doc/zlib.n
@@ -193,10 +193,18 @@ How hard to compress the data. Must be an integer from 0 (uncompressed) to 9
|
|||||||
.TP
|
.TP
|
||||||
\fB\-limit\fI readaheadLimit\fR
|
\fB\-limit\fI readaheadLimit\fR
|
||||||
.
|
.
|
||||||
The maximum number of bytes ahead to read when decompressing. This defaults to
|
The maximum number of bytes ahead to read when decompressing.
|
||||||
1, which ensures that data is always decompressed correctly, but may be
|
.RS
|
||||||
increased to improve performance. This is more useful when the channel is
|
.PP
|
||||||
non-blocking.
|
This option has become \fBirrelevant\fR. It was originally introduced
|
||||||
|
to prevent Tcl from reading beyond the end of a compressed stream in
|
||||||
|
multi-stream channels to ensure that the data after was left alone for
|
||||||
|
further reading, at the cost of speed.
|
||||||
|
.PP
|
||||||
|
Tcl now automatically returns any bytes it has read beyond the end of
|
||||||
|
a compressed stream back to the channel, making them appear as unread
|
||||||
|
to further readers.
|
||||||
|
.RE
|
||||||
.PP
|
.PP
|
||||||
Both compressing and decompressing channel transformations add extra
|
Both compressing and decompressing channel transformations add extra
|
||||||
configuration options that may be accessed through \fBchan configure\fR. The
|
configuration options that may be accessed through \fBchan configure\fR. The
|
||||||
@@ -238,10 +246,8 @@ off the data stream.
|
|||||||
\fB\-limit\fI readaheadLimit\fR
|
\fB\-limit\fI readaheadLimit\fR
|
||||||
.
|
.
|
||||||
This read-write option is used by decompressing channels to control the
|
This read-write option is used by decompressing channels to control the
|
||||||
maximum number of bytes ahead to read from the underlying data source. This
|
maximum number of bytes ahead to read from the underlying data source. See
|
||||||
defaults to 1, which ensures that data is always decompressed correctly, but
|
above for more information.
|
||||||
may be increased to improve performance. This is more useful when the channel
|
|
||||||
is non-blocking.
|
|
||||||
.RE
|
.RE
|
||||||
.SS "STREAMING SUBCOMMAND"
|
.SS "STREAMING SUBCOMMAND"
|
||||||
.TP
|
.TP
|
||||||
|
|||||||
@@ -259,15 +259,15 @@ static const chr brbacks[] = { /* \s within brackets */
|
|||||||
|
|
||||||
#define PUNCT_CONN \
|
#define PUNCT_CONN \
|
||||||
CHR('_'), \
|
CHR('_'), \
|
||||||
0x203f /* UNDERTIE */, \
|
0x203F /* UNDERTIE */, \
|
||||||
0x2040 /* CHARACTER TIE */,\
|
0x2040 /* CHARACTER TIE */,\
|
||||||
0x2054 /* INVERTED UNDERTIE */,\
|
0x2054 /* INVERTED UNDERTIE */,\
|
||||||
0xfe33 /* PRESENTATION FORM FOR VERTICAL LOW LINE */, \
|
0xFE33 /* PRESENTATION FORM FOR VERTICAL LOW LINE */, \
|
||||||
0xfe34 /* PRESENTATION FORM FOR VERTICAL WAVY LOW LINE */, \
|
0xFE34 /* PRESENTATION FORM FOR VERTICAL WAVY LOW LINE */, \
|
||||||
0xfe4d /* DASHED LOW LINE */, \
|
0xFE4D /* DASHED LOW LINE */, \
|
||||||
0xfe4e /* CENTRELINE LOW LINE */, \
|
0xFE4E /* CENTRELINE LOW LINE */, \
|
||||||
0xfe4f /* WAVY LOW LINE */, \
|
0xFE4F /* WAVY LOW LINE */, \
|
||||||
0xff3f /* FULLWIDTH LOW LINE */
|
0xFF3F /* FULLWIDTH LOW LINE */
|
||||||
|
|
||||||
static const chr backw[] = { /* \w */
|
static const chr backw[] = { /* \w */
|
||||||
CHR('['), CHR('['), CHR(':'),
|
CHR('['), CHR('['), CHR(':'),
|
||||||
@@ -905,9 +905,7 @@ lexescape(
|
|||||||
|
|
||||||
v->now = save;
|
v->now = save;
|
||||||
|
|
||||||
/*
|
/* FALLTHRU */
|
||||||
* And fall through into octal number.
|
|
||||||
*/
|
|
||||||
|
|
||||||
case CHR('0'):
|
case CHR('0'):
|
||||||
NOTE(REG_UUNPORT);
|
NOTE(REG_UUNPORT);
|
||||||
@@ -916,7 +914,7 @@ lexescape(
|
|||||||
if (ISERR()) {
|
if (ISERR()) {
|
||||||
FAILW(REG_EESCAPE);
|
FAILW(REG_EESCAPE);
|
||||||
}
|
}
|
||||||
if (c > 0xff) {
|
if (c > 0xFF) {
|
||||||
/* out of range, so we handled one digit too much */
|
/* out of range, so we handled one digit too much */
|
||||||
v->now--;
|
v->now--;
|
||||||
c >>= 3;
|
c >>= 3;
|
||||||
@@ -950,7 +948,7 @@ lexdigits(
|
|||||||
|
|
||||||
n = 0;
|
n = 0;
|
||||||
for (len = 0; len < maxlen && !ATEOS(); len++) {
|
for (len = 0; len < maxlen && !ATEOS(); len++) {
|
||||||
if (n > 0x10fff) {
|
if (n > 0x10FFF) {
|
||||||
/* Stop when continuing would otherwise overflow */
|
/* Stop when continuing would otherwise overflow */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -2978,6 +2978,9 @@ dumpnfa(
|
|||||||
dumpcolors(nfa->cm, f);
|
dumpcolors(nfa->cm, f);
|
||||||
}
|
}
|
||||||
fflush(f);
|
fflush(f);
|
||||||
|
#else
|
||||||
|
(void)nfa;
|
||||||
|
(void)f;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3157,6 +3160,9 @@ dumpcnfa(
|
|||||||
dumpcstate(st, cnfa, f);
|
dumpcstate(st, cnfa, f);
|
||||||
}
|
}
|
||||||
fflush(f);
|
fflush(f);
|
||||||
|
#else
|
||||||
|
(void)cnfa;
|
||||||
|
(void)f;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -59,7 +59,6 @@ static void wordchrs(struct vars *);
|
|||||||
static struct subre *subre(struct vars *, int, int, struct state *, struct state *);
|
static struct subre *subre(struct vars *, int, int, struct state *, struct state *);
|
||||||
static void freesubre(struct vars *, struct subre *);
|
static void freesubre(struct vars *, struct subre *);
|
||||||
static void freesrnode(struct vars *, struct subre *);
|
static void freesrnode(struct vars *, struct subre *);
|
||||||
static void optst(struct vars *, struct subre *);
|
|
||||||
static int numst(struct subre *, int);
|
static int numst(struct subre *, int);
|
||||||
static void markst(struct subre *);
|
static void markst(struct subre *);
|
||||||
static void cleanst(struct vars *);
|
static void cleanst(struct vars *);
|
||||||
@@ -244,6 +243,7 @@ struct vars {
|
|||||||
#define EMPTYARC(x, y) newarc(v->nfa, EMPTY, 0, x, y)
|
#define EMPTYARC(x, y) newarc(v->nfa, EMPTY, 0, x, y)
|
||||||
|
|
||||||
/* token type codes, some also used as NFA arc types */
|
/* token type codes, some also used as NFA arc types */
|
||||||
|
#undef DIGIT /* prevent conflict with libtommath */
|
||||||
#define EMPTY 'n' /* no token present */
|
#define EMPTY 'n' /* no token present */
|
||||||
#define EOS 'e' /* end of string */
|
#define EOS 'e' /* end of string */
|
||||||
#define PLAIN 'p' /* ordinary character */
|
#define PLAIN 'p' /* ordinary character */
|
||||||
@@ -341,13 +341,13 @@ compile(
|
|||||||
re->re_info = 0; /* bits get set during parse */
|
re->re_info = 0; /* bits get set during parse */
|
||||||
re->re_csize = sizeof(chr);
|
re->re_csize = sizeof(chr);
|
||||||
re->re_guts = NULL;
|
re->re_guts = NULL;
|
||||||
re->re_fns = VS(&functions);
|
re->re_fns = (char *)&functions;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* More complex setup, malloced things.
|
* More complex setup, malloced things.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
re->re_guts = VS(MALLOC(sizeof(struct guts)));
|
re->re_guts = (char *)(MALLOC(sizeof(struct guts)));
|
||||||
if (re->re_guts == NULL) {
|
if (re->re_guts == NULL) {
|
||||||
return freev(v, REG_ESPACE);
|
return freev(v, REG_ESPACE);
|
||||||
}
|
}
|
||||||
@@ -395,7 +395,6 @@ compile(
|
|||||||
dumpnfa(v->nfa, debug);
|
dumpnfa(v->nfa, debug);
|
||||||
dumpst(v->tree, debug, 1);
|
dumpst(v->tree, debug, 1);
|
||||||
}
|
}
|
||||||
optst(v, v->tree);
|
|
||||||
v->ntree = numst(v->tree, 1);
|
v->ntree = numst(v->tree, 1);
|
||||||
markst(v->tree);
|
markst(v->tree);
|
||||||
cleanst(v);
|
cleanst(v);
|
||||||
@@ -513,7 +512,7 @@ freev(
|
|||||||
struct vars *v,
|
struct vars *v,
|
||||||
int err)
|
int err)
|
||||||
{
|
{
|
||||||
register int ret;
|
int ret;
|
||||||
|
|
||||||
if (v->re != NULL) {
|
if (v->re != NULL) {
|
||||||
rfree(v->re);
|
rfree(v->re);
|
||||||
@@ -923,7 +922,7 @@ parseqatom(
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
NOTE(REG_UPBOTCH);
|
NOTE(REG_UPBOTCH);
|
||||||
/* fallthrough into case PLAIN */
|
/* FALLTHRU */
|
||||||
case PLAIN:
|
case PLAIN:
|
||||||
onechr(v, v->nextvalue, lp, rp);
|
onechr(v, v->nextvalue, lp, rp);
|
||||||
okcolors(v->nfa, v->cm);
|
okcolors(v->nfa, v->cm);
|
||||||
@@ -1811,25 +1810,6 @@ freesrnode(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
- optst - optimize a subRE subtree
|
|
||||||
^ static void optst(struct vars *, struct subre *);
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
optst(
|
|
||||||
struct vars *v,
|
|
||||||
struct subre *t)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* DGP (2007-11-13): I assume it was the programmer's intent to eventually
|
|
||||||
* come back and add code to optimize subRE trees, but the routine coded
|
|
||||||
* just spends effort traversing the tree and doing nothing. We can do
|
|
||||||
* nothing with less effort.
|
|
||||||
*/
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
- numst - number tree nodes (assigning "id" indexes)
|
- numst - number tree nodes (assigning "id" indexes)
|
||||||
^ static int numst(struct subre *, int);
|
^ static int numst(struct subre *, int);
|
||||||
@@ -2101,6 +2081,9 @@ dump(
|
|||||||
}
|
}
|
||||||
fprintf(f, "\n");
|
fprintf(f, "\n");
|
||||||
dumpst(g->tree, f, 0);
|
dumpst(g->tree, f, 0);
|
||||||
|
#else
|
||||||
|
(void)re;
|
||||||
|
(void)f;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -92,11 +92,11 @@ typedef int celt; /* Type to hold chr, or NOCELT */
|
|||||||
#if TCL_UTF_MAX > 4
|
#if TCL_UTF_MAX > 4
|
||||||
#define CHRBITS 32 /* Bits in a chr; must not use sizeof */
|
#define CHRBITS 32 /* Bits in a chr; must not use sizeof */
|
||||||
#define CHR_MIN 0x00000000 /* Smallest and largest chr; the value */
|
#define CHR_MIN 0x00000000 /* Smallest and largest chr; the value */
|
||||||
#define CHR_MAX 0xffffffff /* CHR_MAX-CHR_MIN+1 should fit in uchr */
|
#define CHR_MAX 0xFFFFFFFF /* CHR_MAX-CHR_MIN+1 should fit in uchr */
|
||||||
#else
|
#else
|
||||||
#define CHRBITS 16 /* Bits in a chr; must not use sizeof */
|
#define CHRBITS 16 /* Bits in a chr; must not use sizeof */
|
||||||
#define CHR_MIN 0x0000 /* Smallest and largest chr; the value */
|
#define CHR_MIN 0x0000 /* Smallest and largest chr; the value */
|
||||||
#define CHR_MAX 0xffff /* CHR_MAX-CHR_MIN+1 should fit in uchr */
|
#define CHR_MAX 0xFFFF /* CHR_MAX-CHR_MIN+1 should fit in uchr */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -132,7 +132,7 @@ typedef int celt; /* Type to hold chr, or NOCELT */
|
|||||||
#if 1
|
#if 1
|
||||||
#define AllocVars(vPtr) \
|
#define AllocVars(vPtr) \
|
||||||
static Tcl_ThreadDataKey varsKey; \
|
static Tcl_ThreadDataKey varsKey; \
|
||||||
register struct vars *vPtr = (struct vars *) \
|
struct vars *vPtr = (struct vars *) \
|
||||||
Tcl_GetThreadData(&varsKey, sizeof(struct vars))
|
Tcl_GetThreadData(&varsKey, sizeof(struct vars))
|
||||||
#else
|
#else
|
||||||
/*
|
/*
|
||||||
@@ -141,7 +141,7 @@ typedef int celt; /* Type to hold chr, or NOCELT */
|
|||||||
* faster in practice (measured!)
|
* faster in practice (measured!)
|
||||||
*/
|
*/
|
||||||
#define AllocVars(vPtr) \
|
#define AllocVars(vPtr) \
|
||||||
register struct vars *vPtr = (struct vars *) MALLOC(sizeof(struct vars))
|
struct vars *vPtr = (struct vars *) MALLOC(sizeof(struct vars))
|
||||||
#define FreeVars(vPtr) \
|
#define FreeVars(vPtr) \
|
||||||
FREE(vPtr)
|
FREE(vPtr)
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -58,7 +58,6 @@ static const struct rerr {
|
|||||||
size_t /* Actual space needed (including NUL) */
|
size_t /* Actual space needed (including NUL) */
|
||||||
regerror(
|
regerror(
|
||||||
int code, /* Error code, or REG_ATOI or REG_ITOA */
|
int code, /* Error code, or REG_ATOI or REG_ITOA */
|
||||||
const regex_t *preg, /* Associated regex_t (unused at present) */
|
|
||||||
char *errbuf, /* Result buffer (unless errbuf_size==0) */
|
char *errbuf, /* Result buffer (unless errbuf_size==0) */
|
||||||
size_t errbuf_size) /* Available space in errbuf, can be 0 */
|
size_t errbuf_size) /* Available space in errbuf, can be 0 */
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -232,7 +232,7 @@ typedef struct {
|
|||||||
* of character is used for error reports is independent of what kind is used
|
* of character is used for error reports is independent of what kind is used
|
||||||
* in matching.
|
* in matching.
|
||||||
*
|
*
|
||||||
^ extern size_t regerror(int, const regex_t *, char *, size_t);
|
^ extern size_t regerror(int, char *, size_t);
|
||||||
*/
|
*/
|
||||||
#define REG_OKAY 0 /* no errors detected */
|
#define REG_OKAY 0 /* no errors detected */
|
||||||
#define REG_NOMATCH 1 /* failed to match */
|
#define REG_NOMATCH 1 /* failed to match */
|
||||||
@@ -283,7 +283,7 @@ int regexec(regex_t *, const char *, size_t, regmatch_t [], int);
|
|||||||
MODULE_SCOPE int __REG_WIDE_EXEC(regex_t *, const __REG_WIDE_T *, size_t, rm_detail_t *, size_t, regmatch_t [], int);
|
MODULE_SCOPE int __REG_WIDE_EXEC(regex_t *, const __REG_WIDE_T *, size_t, rm_detail_t *, size_t, regmatch_t [], int);
|
||||||
#endif
|
#endif
|
||||||
MODULE_SCOPE void regfree(regex_t *);
|
MODULE_SCOPE void regfree(regex_t *);
|
||||||
MODULE_SCOPE size_t regerror(int, const regex_t *, char *, size_t);
|
MODULE_SCOPE size_t regerror(int, char *, size_t);
|
||||||
/* automatically gathered by fwd; do not hand-edit */
|
/* automatically gathered by fwd; do not hand-edit */
|
||||||
/* =====^!^===== end forwards =====^!^===== */
|
/* =====^!^===== end forwards =====^!^===== */
|
||||||
|
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ struct dfa {
|
|||||||
chr *lastnopr; /* location of last cache-flushed NOPROGRESS */
|
chr *lastnopr; /* location of last cache-flushed NOPROGRESS */
|
||||||
struct sset *search; /* replacement-search-pointer memory */
|
struct sset *search; /* replacement-search-pointer memory */
|
||||||
int cptsmalloced; /* were the areas individually malloced? */
|
int cptsmalloced; /* were the areas individually malloced? */
|
||||||
char *mallocarea; /* self, or master malloced area, or NULL */
|
char *mallocarea; /* self, or malloced area, or NULL */
|
||||||
};
|
};
|
||||||
|
|
||||||
#define WORK 1 /* number of work bitvectors needed */
|
#define WORK 1 /* number of work bitvectors needed */
|
||||||
@@ -129,7 +129,7 @@ int exec(regex_t *, const chr *, size_t, rm_detail_t *, size_t, regmatch_t [], i
|
|||||||
static struct dfa *getsubdfa(struct vars *, struct subre *);
|
static struct dfa *getsubdfa(struct vars *, struct subre *);
|
||||||
static int simpleFind(struct vars *const, struct cnfa *const, struct colormap *const);
|
static int simpleFind(struct vars *const, struct cnfa *const, struct colormap *const);
|
||||||
static int complicatedFind(struct vars *const, struct cnfa *const, struct colormap *const);
|
static int complicatedFind(struct vars *const, struct cnfa *const, struct colormap *const);
|
||||||
static int complicatedFindLoop(struct vars *const, struct cnfa *const, struct colormap *const, struct dfa *const, struct dfa *const, chr **const);
|
static int complicatedFindLoop(struct vars *const, struct dfa *const, struct dfa *const, chr **const);
|
||||||
static void zapallsubs(regmatch_t *const, const size_t);
|
static void zapallsubs(regmatch_t *const, const size_t);
|
||||||
static void zaptreesubs(struct vars *const, struct subre *const);
|
static void zaptreesubs(struct vars *const, struct subre *const);
|
||||||
static void subset(struct vars *const, struct subre *const, chr *const, chr *const);
|
static void subset(struct vars *const, struct subre *const, chr *const, chr *const);
|
||||||
@@ -434,7 +434,7 @@ complicatedFind(
|
|||||||
return v->err;
|
return v->err;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = complicatedFindLoop(v, cnfa, cm, d, s, &cold);
|
ret = complicatedFindLoop(v, d, s, &cold);
|
||||||
|
|
||||||
freeDFA(d);
|
freeDFA(d);
|
||||||
freeDFA(s);
|
freeDFA(s);
|
||||||
@@ -453,14 +453,12 @@ complicatedFind(
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
- complicatedFindLoop - the heart of complicatedFind
|
- complicatedFindLoop - the heart of complicatedFind
|
||||||
^ static int complicatedFindLoop(struct vars *, struct cnfa *, struct colormap *,
|
^ static int complicatedFindLoop(struct vars *,
|
||||||
^ struct dfa *, struct dfa *, chr **);
|
^ struct dfa *, struct dfa *, chr **);
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
complicatedFindLoop(
|
complicatedFindLoop(
|
||||||
struct vars *const v,
|
struct vars *const v,
|
||||||
struct cnfa *const cnfa,
|
|
||||||
struct colormap *const cm,
|
|
||||||
struct dfa *const d,
|
struct dfa *const d,
|
||||||
struct dfa *const s,
|
struct dfa *const s,
|
||||||
chr **const coldp) /* where to put coldstart pointer */
|
chr **const coldp) /* where to put coldstart pointer */
|
||||||
|
|||||||
@@ -101,7 +101,7 @@
|
|||||||
#define DUPMAX _POSIX2_RE_DUP_MAX
|
#define DUPMAX _POSIX2_RE_DUP_MAX
|
||||||
#define DUPINF (DUPMAX+1)
|
#define DUPINF (DUPMAX+1)
|
||||||
|
|
||||||
#define REMAGIC 0xfed7 /* magic number for main struct */
|
#define REMAGIC 0xFED7 /* magic number for main struct */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* debugging facilities
|
* debugging facilities
|
||||||
@@ -417,7 +417,7 @@ struct fns {
|
|||||||
|
|
||||||
struct guts {
|
struct guts {
|
||||||
int magic;
|
int magic;
|
||||||
#define GUTSMAGIC 0xfed9
|
#define GUTSMAGIC 0xFED9
|
||||||
int cflags; /* copy of compile flags */
|
int cflags; /* copy of compile flags */
|
||||||
long info; /* copy of re_info */
|
long info; /* copy of re_info */
|
||||||
size_t nsub; /* copy of re_nsub */
|
size_t nsub; /* copy of re_nsub */
|
||||||
@@ -438,7 +438,7 @@ struct guts {
|
|||||||
#ifndef AllocVars
|
#ifndef AllocVars
|
||||||
#define AllocVars(vPtr) \
|
#define AllocVars(vPtr) \
|
||||||
struct vars var; \
|
struct vars var; \
|
||||||
register struct vars *vPtr = &var
|
struct vars *vPtr = &var
|
||||||
#endif
|
#endif
|
||||||
#ifndef FreeVars
|
#ifndef FreeVars
|
||||||
#define FreeVars(vPtr) ((void) 0)
|
#define FreeVars(vPtr) ((void) 0)
|
||||||
|
|||||||
@@ -316,12 +316,12 @@ declare 85 {
|
|||||||
int flags)
|
int flags)
|
||||||
}
|
}
|
||||||
declare 86 {
|
declare 86 {
|
||||||
int Tcl_CreateAlias(Tcl_Interp *slave, const char *slaveCmd,
|
int Tcl_CreateAlias(Tcl_Interp *childInterp, const char *childCmd,
|
||||||
Tcl_Interp *target, const char *targetCmd, int argc,
|
Tcl_Interp *target, const char *targetCmd, int argc,
|
||||||
CONST84 char *const *argv)
|
CONST84 char *const *argv)
|
||||||
}
|
}
|
||||||
declare 87 {
|
declare 87 {
|
||||||
int Tcl_CreateAliasObj(Tcl_Interp *slave, const char *slaveCmd,
|
int Tcl_CreateAliasObj(Tcl_Interp *childInterp, const char *childCmd,
|
||||||
Tcl_Interp *target, const char *targetCmd, int objc,
|
Tcl_Interp *target, const char *targetCmd, int objc,
|
||||||
Tcl_Obj *const objv[])
|
Tcl_Obj *const objv[])
|
||||||
}
|
}
|
||||||
@@ -364,7 +364,7 @@ declare 96 {
|
|||||||
Tcl_CmdDeleteProc *deleteProc)
|
Tcl_CmdDeleteProc *deleteProc)
|
||||||
}
|
}
|
||||||
declare 97 {
|
declare 97 {
|
||||||
Tcl_Interp *Tcl_CreateSlave(Tcl_Interp *interp, const char *slaveName,
|
Tcl_Interp *Tcl_CreateSlave(Tcl_Interp *interp, const char *name,
|
||||||
int isSafe)
|
int isSafe)
|
||||||
}
|
}
|
||||||
declare 98 {
|
declare 98 {
|
||||||
@@ -527,12 +527,12 @@ declare 147 {
|
|||||||
void Tcl_FreeResult(Tcl_Interp *interp)
|
void Tcl_FreeResult(Tcl_Interp *interp)
|
||||||
}
|
}
|
||||||
declare 148 {
|
declare 148 {
|
||||||
int Tcl_GetAlias(Tcl_Interp *interp, const char *slaveCmd,
|
int Tcl_GetAlias(Tcl_Interp *interp, const char *childCmd,
|
||||||
Tcl_Interp **targetInterpPtr, CONST84 char **targetCmdPtr,
|
Tcl_Interp **targetInterpPtr, CONST84 char **targetCmdPtr,
|
||||||
int *argcPtr, CONST84 char ***argvPtr)
|
int *argcPtr, CONST84 char ***argvPtr)
|
||||||
}
|
}
|
||||||
declare 149 {
|
declare 149 {
|
||||||
int Tcl_GetAliasObj(Tcl_Interp *interp, const char *slaveCmd,
|
int Tcl_GetAliasObj(Tcl_Interp *interp, const char *childCmd,
|
||||||
Tcl_Interp **targetInterpPtr, CONST84 char **targetCmdPtr,
|
Tcl_Interp **targetInterpPtr, CONST84 char **targetCmdPtr,
|
||||||
int *objcPtr, Tcl_Obj ***objv)
|
int *objcPtr, Tcl_Obj ***objv)
|
||||||
}
|
}
|
||||||
@@ -582,7 +582,7 @@ declare 162 {
|
|||||||
CONST84_RETURN char *Tcl_GetHostName(void)
|
CONST84_RETURN char *Tcl_GetHostName(void)
|
||||||
}
|
}
|
||||||
declare 163 {
|
declare 163 {
|
||||||
int Tcl_GetInterpPath(Tcl_Interp *askInterp, Tcl_Interp *slaveInterp)
|
int Tcl_GetInterpPath(Tcl_Interp *interp, Tcl_Interp *childInterp)
|
||||||
}
|
}
|
||||||
declare 164 {
|
declare 164 {
|
||||||
Tcl_Interp *Tcl_GetMaster(Tcl_Interp *interp)
|
Tcl_Interp *Tcl_GetMaster(Tcl_Interp *interp)
|
||||||
@@ -595,7 +595,7 @@ declare 166 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Tcl_GetOpenFile is only available on unix, but it is a part of the old
|
# 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.
|
# generic interface, so we include it here for compatibility reasons.
|
||||||
|
|
||||||
declare 167 unix {
|
declare 167 unix {
|
||||||
int Tcl_GetOpenFile(Tcl_Interp *interp, const char *chanID, int forWriting,
|
int Tcl_GetOpenFile(Tcl_Interp *interp, const char *chanID, int forWriting,
|
||||||
@@ -616,7 +616,7 @@ declare 171 {
|
|||||||
int Tcl_GetServiceMode(void)
|
int Tcl_GetServiceMode(void)
|
||||||
}
|
}
|
||||||
declare 172 {
|
declare 172 {
|
||||||
Tcl_Interp *Tcl_GetSlave(Tcl_Interp *interp, const char *slaveName)
|
Tcl_Interp *Tcl_GetSlave(Tcl_Interp *interp, const char *name)
|
||||||
}
|
}
|
||||||
declare 173 {
|
declare 173 {
|
||||||
Tcl_Channel Tcl_GetStdChannel(int type)
|
Tcl_Channel Tcl_GetStdChannel(int type)
|
||||||
@@ -2223,7 +2223,7 @@ declare 606 {
|
|||||||
|
|
||||||
# TIP#307 (move results between interpreters) dkf
|
# TIP#307 (move results between interpreters) dkf
|
||||||
declare 607 {
|
declare 607 {
|
||||||
void Tcl_TransferResult(Tcl_Interp *sourceInterp, int result,
|
void Tcl_TransferResult(Tcl_Interp *sourceInterp, int code,
|
||||||
Tcl_Interp *targetInterp)
|
Tcl_Interp *targetInterp)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2325,6 +2325,10 @@ declare 630 {
|
|||||||
|
|
||||||
# ----- BASELINE -- FOR -- 8.6.0 ----- #
|
# ----- BASELINE -- FOR -- 8.6.0 ----- #
|
||||||
|
|
||||||
|
declare 649 {
|
||||||
|
void TclUnusedStubEntry(void)
|
||||||
|
}
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
# Define the platform specific public Tcl interface. These functions are only
|
# Define the platform specific public Tcl interface. These functions are only
|
||||||
|
|||||||
@@ -51,10 +51,10 @@ extern "C" {
|
|||||||
#define TCL_MAJOR_VERSION 8
|
#define TCL_MAJOR_VERSION 8
|
||||||
#define TCL_MINOR_VERSION 6
|
#define TCL_MINOR_VERSION 6
|
||||||
#define TCL_RELEASE_LEVEL TCL_FINAL_RELEASE
|
#define TCL_RELEASE_LEVEL TCL_FINAL_RELEASE
|
||||||
#define TCL_RELEASE_SERIAL 9
|
#define TCL_RELEASE_SERIAL 11
|
||||||
|
|
||||||
#define TCL_VERSION "8.6"
|
#define TCL_VERSION "8.6"
|
||||||
#define TCL_PATCH_LEVEL "8.6.9"
|
#define TCL_PATCH_LEVEL "8.6.11"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*----------------------------------------------------------------------------
|
*----------------------------------------------------------------------------
|
||||||
@@ -384,7 +384,7 @@ typedef long LONG;
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#if !defined(TCL_WIDE_INT_TYPE)&&!defined(TCL_WIDE_INT_IS_LONG)
|
#if !defined(TCL_WIDE_INT_TYPE)&&!defined(TCL_WIDE_INT_IS_LONG)
|
||||||
# if defined(_WIN32)
|
# if defined(_WIN32) && (!defined(__USE_MINGW_ANSI_STDIO) || !__USE_MINGW_ANSI_STDIO)
|
||||||
# define TCL_WIDE_INT_TYPE __int64
|
# define TCL_WIDE_INT_TYPE __int64
|
||||||
# ifdef __BORLANDC__
|
# ifdef __BORLANDC__
|
||||||
# define TCL_LL_MODIFIER "L"
|
# define TCL_LL_MODIFIER "L"
|
||||||
@@ -440,7 +440,7 @@ typedef unsigned TCL_WIDE_INT_TYPE Tcl_WideUInt;
|
|||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
# ifdef __BORLANDC__
|
# ifdef __BORLANDC__
|
||||||
typedef struct stati64 Tcl_StatBuf;
|
typedef struct stati64 Tcl_StatBuf;
|
||||||
# elif defined(_WIN64)
|
# elif defined(_WIN64) || defined(_USE_64BIT_TIME_T)
|
||||||
typedef struct __stat64 Tcl_StatBuf;
|
typedef struct __stat64 Tcl_StatBuf;
|
||||||
# elif (defined(_MSC_VER) && (_MSC_VER < 1400)) || defined(_USE_32BIT_TIME_T)
|
# elif (defined(_MSC_VER) && (_MSC_VER < 1400)) || defined(_USE_32BIT_TIME_T)
|
||||||
typedef struct _stati64 Tcl_StatBuf;
|
typedef struct _stati64 Tcl_StatBuf;
|
||||||
@@ -2517,7 +2517,7 @@ EXTERN void Tcl_GetMemoryInfo(Tcl_DString *dsPtr);
|
|||||||
# define Tcl_DecrRefCount(objPtr) \
|
# define Tcl_DecrRefCount(objPtr) \
|
||||||
do { \
|
do { \
|
||||||
Tcl_Obj *_objPtr = (objPtr); \
|
Tcl_Obj *_objPtr = (objPtr); \
|
||||||
if ((_objPtr)->refCount-- <= 1) { \
|
if (_objPtr->refCount-- <= 1) { \
|
||||||
TclFreeObj(_objPtr); \
|
TclFreeObj(_objPtr); \
|
||||||
} \
|
} \
|
||||||
} while(0)
|
} while(0)
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user