2013-12-19

SampleExtension

SampleExtension implements an extension calculating the Core Secure Hash Algorithm (sha1).

Below is how to download SampleExtension and tclconfig source code method (from Tcler's Wiki):
# Replace sample with the name of your extension
wget -qO- http://core.tcl.tk/sampleextension/tarball/sample.tar.gz | tar xzv
cd sample
wget -qO- http://core.tcl.tk/tclconfig/tarball/tclconfig.tar.gz | tar xzv
# Write your source files
# Edit configure.in
autoconf
# And then the usual:
./configure
make

2013-11-19

openSUSE 13.1 updated Tcl/Tk to 8.6.1

 Please check Features 13.1


Tcl/Tk updated to 8.6.1
  • Tcl major new features:
    • threads enabled by default
    • coroutines
    • IPv6 support
    • built-in OOP witch TclOO
    • built-in zlib support
    • stacked channels
  • Tk major new features:
    • built-in PNG support
    • new portable fontchooser
    • canvas: commands to move items, rotate text
    • additional wm hints
所以如果升級到 openSUSE 13.1,內建的 Tcl/Tk 為 8.6.1.

2013-10-09

Build TclX 8.4.1

在 build 的時候,需要 Tcl 的 source code。configure 使用下列的方式設定:

CPPFLAGS="-I/home/danilo/rpm/SOURCES/tcl8.6.1/generic/ -I/home/danilo/rpm/SOURCES/tcl8.6.1/unix/" ./configure --enable-threads --with-tcl=/usr/lib64


* notice:因為我是使用 x86_64 的作業系統,所以目錄指向 /usr/lib64,如果是 32 位元應該要指向 /usr/lib 才對。然後,因為 TclX 有使用 Tcl 的內部宣告,所以要設定  CPPFLAGS 讓 TclX 在 build 的時候可以找到 header file。


再來就是 make,跟 make install 就可以了。

Build a Tcl/Tk RPM (on openSUSE 12.3)

首先,要先安裝 rpm-build 這個工具。如果是 Ubuntu 的使用者,安裝的命令如下:
sudo apt-get install rpm

在 openSUSE 上我是使用 GUI 安裝軟體,下列是我猜可以使用的 openSUSE 命令,但是我沒試過:
sudo zypper install rpm-build

再來是環境設定,首先在自己的家目錄建立下列的目錄:
  • */rpm
  • */rpm/BUILD
  • */rpm/RPMS
  • */rpm/SOURCES
  • */rpm/SPECS
  • */rpm/SRPMS
Create the .rpmmacros at your home folder for your own rpm build configuratio(下面是相關的範例):

%packager       test <test@gmail.com>
 
%_topdir        /home/test/rpm
%_tmppath       /var/tmp
 
%_rpmtopdir     %{_topdir}
%_builddir      %{_rpmtopdir}/BUILD
%_rpmdir        %{_rpmtopdir}/RPMS
%_sourcedir     %{_rpmtopdir}/SOURCES
%_specdir       %{_rpmtopdir}/SPECS
%_srcrpmdir     %{_rpmtopdir}/SRPMS


再來就下載 Tcl 和 Tk 8.6.1 的 source code package。放到 rpm/SOURCES,使用下列的命令解壓縮:

tar xzvf tcl8.6.1-src.tar.gz
tar xzvf tk8.6.1-src.tar.gz

1. tcl

進入 tcl8.6.1 的目錄下,再進入 unix 目錄,對於 tcl.spec 我們有二個地方要修改:
  1. 預設的安裝目錄:原本是 /usr/local,可以改成 /usr
  2. 在最後再加入一行 %{directory}/share/man/mann,有檔案會安裝到這裡,如果不加會出現問題
如果要建立一個 tclsh 的連結,在  make INSTALL_ROOT=%{buildroot} install 之後,加入下面這一行:
ln -s tclsh%{majorver} $RPM_BUILD_ROOT%{_bindir}/tclsh


然後 tcl.spec 要在 Name:          tcl 這行之前加入版本宣告:

%global majorver1 8
%global majorver2 6
%global majorver %{majorver1}.%{majorver2}


再來使用下列的命令建立 RPM:
rpmbuild --bb tcl.spec

2. tk

先確定 tcl 做好 rpm 之後有安裝成功。另外,還需要 XFree86-dev 有安裝才行。

進入 tk8.6.1 的目錄下,再進入 unix 目錄,對於 tk.spec 我們有一個地方要修改:
  1. 預設的安裝目錄:原本是 /usr/local,可以改成 /usr 
如果要建立一個 wish 的連結,在  make INSTALL_ROOT=%{buildroot} install 之後,加入下面這一行:
ln -s wish%{majorver} $RPM_BUILD_ROOT%{_bindir}/wish

然後在 Name:          tk 這行之前加入版本宣告:

%global majorver1 8
%global majorver2 6
%global majorver %{majorver1}.%{majorver2}


再來使用下列的命令建立 RPM:
rpmbuild --bb tk.spec

2013-10-02

Network Time Protocol (NTP) client

範例:來自 Network Time Protocol - NTP

使用了 Tcllib 中的 NTP package,並且需要使用 TclUDP 或者是 ceptcl 來提供 UDP 支援。
 
package require time

set timeserver "time.stdtime.gov.tw"

proc NetTime {server} {
set tok [time::getsntp $server] ;# or gettime to use the TIME protocol
time::wait $tok
if {[time::status $tok] eq "ok"} {
   set result [time::unixtime $tok]
   set code ok
} else {
   set result [time::error $tok]
   set code error
}
time::cleanup $tok
return -code $code $result
}


exec cmd.exe /c time [clock format [NetTime $timeserver] -format %H:%M:%S]

2013-09-14

PHP on Wub (Wndows Platform, update)

測試環境資料:

Windows 7 64 bit,
ActiveTcl 64 bit,
Tcllib 1.15,
PHP 5.4.19

我在另外一台 Windows XP 重做一次無法成功,目前找不出來失敗的原因,不過我發現我之前沒有全盤讀懂 source code,做了一些沒有用的步驟,更新一次方法。


資料放置目錄:
Wub 放在 c:/Wub
PHP 放在 c:/php


PHP 要修改的地方集中在 php.ini,為下列三個項目:
doc_root = c:/Wub/docroot
cgi.force_redirect = 0
cgi.redirect_status_env = ENV_VAR_NAME


Wub 我修改了二個項目,第一項是 c:/Wub/site.config:

/CGI/ {
    domain CGI
    root $Wub::docroot/cgi
    # windows tcl executor
    executors   {.TCL C:/Tcl/bin/tclsh86.exe .PHP C:/php/php-cgi.exe}
}

另外一個則是增加 PHP mime type 到 Wub 設定 (檔案為 c:/Wub/mime.types):

application/x-php              php

這樣就可以了,不用修改 CGI.tcl。


然後在 c:/Wub/docroot 建立 CGI 目錄,放一個 info.php 測試:

<?php
    phpinfo();
?>    

連線 http://localhost:8080/CGI/info.php 如果有出現資訊就表示成功了。

2013-09-13

Get current OS string

使用下面的變數就可以拿到目前的 OS 字串:

$::tcl_platform(os)


以 Windows XP 來說,結果是下面的字串:

Windows NT

2013-06-16

Check Tcl support Thread or not

proc is_threaded {} {
 return [expr {[info exists ::tcl_platform(threaded)] && $::tcl_platform(threaded)}]
}


然後就可以使用 is_threaded 來判斷是否有支援 Thread.


如果要共用資料,可以使用 tsv command。下面是改寫以後的備份程式:
#!/usr/local/bin/tclsh
#
# This file is used to backup my homepage
#


proc is_threaded {} {
 return [expr {[info exists ::tcl_platform(threaded)] && $::tcl_platform(threaded)}]
}

set support [is_threaded]

proc backup_to_7z {} {
  set backupfile $::env(HOME)
  append backupfile "/Homepage-"
  append backupfile [clock format [clock seconds] -format %Y%m%d]
  append backupfile ".7z"

  set backupdir $::env(HOME)
  append backupdir "/public_html"

  set fileExist [file exists $backupfile]
  if {$fileExist > 0} {
      puts "Now try to remove old backup file."
      file delete $backupfile
  }

  set var [list 7z -p12345 a $backupfile $backupdir]
  exec {*}$var
}


if {$support == 1} {
  package require Tk
  package require Thread

  set ::gThread [thread::create {thread::wait} ]
  tsv::set body_backup_to_7z shared [info body backup_to_7z]


  label .greetings -text "Now backup my homepage..." -bd 4 -relief ridge
  pack .greetings -fill both

  wm title . "Backup"

  thread::send -async $::gThread { 
    set command [tsv::get body_backup_to_7z shared]
    eval $command
  } result  

  vwait result
} else {
  puts "No thread support..., so this script can't use Thread."

  backup_to_7z
}

exit

利用 Tcl 的特性,所以可以取得 proc body 以後當成是共用資料傳遞,如果資料量很小的時候,這是個很好玩的做法。

2013-06-15

Build snack 2.2.10 on openSUSE 12.3

如果是從 Snack 下載 source code 自己 build,會遇到二個問題。

1. math.h compilation error: expected declaration specifiers or '…' before '('

解決方法參考: http://stackoverflow.com/questions/9503473/math-h-compilation-error-expected-declaration-specifiers-or-before

找到 math.h,然後放到 roundf 函式的宣告的前面(這是只有 GCC 才有的問題) ,所以要做的就是修正 ./jkFormatMP3.c,

#include
#include
#include "snack.h"
#include "jkFormatMP3.h"


2. 因為要在 Linux 上使用 ALSA,所以要這樣下(在 x86_64 版本上):
./configure --enable-alsa --enable-shared --with-tcl=/usr/lib64 --with-tk=/usr/lib64

如果是 x86 的版本:
./configure --enable-alsa --enable-shared --with-tcl=/usr/lib --with-tk=/usr/lib


但是因為 _snd_pcm_mmap_hw_ptr 已經是過時的 function,所以要使用 snack-alsa.patch 裡面的內容來修正,下面是修正的地方:

Index: unix/jkAudIO_alsa.c
===================================================================
--- unix/jkAudIO_alsa.c.orig
+++ unix/jkAudIO_alsa.c
@@ -49,6 +49,8 @@ static int littleEndian = 0;

 static int minNumChan = 1;

+static snd_pcm_uframes_t hw_bufsize = 0;
+
 int
 SnackAudioOpen(ADesc *A, Tcl_Interp *interp, char *device, int mode, int freq,
            int nchannels, int encoding)
@@ -135,6 +137,9 @@ SnackAudioOpen(ADesc *A, Tcl_Interp *int
     Tcl_AppendResult(interp, "Failed setting HW params.", NULL);
     return TCL_ERROR;
   }
+
+  snd_pcm_hw_params_get_buffer_size (hw_params, &hw_bufsize);
+
   snd_pcm_hw_params_free(hw_params);
   snd_pcm_prepare(A->handle);
   if (A->mode == RECORD) {
@@ -202,6 +207,8 @@ SnackAudioPost(ADesc *A)
   int i;
   static char buf[64];

+  return;
+     
   if (A->debug > 1) Snack_WriteLog("  Enter SnackAudioPost\n");

   for (i = 0; i < 1000; i++) {
@@ -267,12 +274,14 @@ SnackAudioWriteable(ADesc *A)
 long
 SnackAudioPlayed(ADesc *A)
 {
-  long avail = _snd_pcm_mmap_hw_ptr(A->handle);
+  // FIX Here, _snd_pcm_mmap_hw_ptr is deprecated in new alsalib
+  long played = A->nWritten - (hw_bufsize - SnackAudioWriteable(A));
+  // long avail = _snd_pcm_mmap_hw_ptr(A->handle);
  
-  if (avail < 0)
-    avail = 0;
+  if (played < 0)
+   return 0;

-  return (avail+A->nPlayed);
+  return (played);
 }



在修正過後,就可以編譯出來正確的 Tcl-Snack (Linux-ALSA) 版本。但是我不知道實際上執行的時候是否正常。


剛剛快速測試以後,確定可以撥放 wav 檔,所以是可以正確使用的。



更新:
在將 tclsh 放置在 /usr/bin 以後,即使 snack 在 configure 時設定 prefix ,make install 以後仍然會放置在 /lib64/,需要自己手動放置到 /usr/lib64 (不知道怎麼解決)

Build tDOM-0.8.3 on openSUSE 12.3

錯誤訊息:

./generic/tcldom.c: In function ‘tcldom_EvalLocked’:
./generic/tcldom.c:5937:47: error: ‘Tcl_Interp’ has no member named ‘errorLine’
./generic/tcldom.c: In function ‘tcldom_RegisterDocShared’:
./generic/tcldom.c:5957:9: warning: variable ‘refCount’ set but not used [-Wunused-but-set-variable]
make: *** [tcldom.o] Error 1



解決方法:
http://sourceforge.net/p/modules/bugs/62/

Apparently errorLine is a deprecated feature.

A temporary fix is to enable this deprecated feature - although eventually this will cease to work. To do this configure with a line like this:

bash> CPPFLAGS="-DUSE_INTERP_ERRORLINE" ./configure
Then make && make install as usual.

2013-06-04

Tcl/Tk 8.4.20 RELEASED

Tcl/Tk 8.4.20 RELEASED



文章中寫到:

This is the twentieth and *FINAL*  patch release of Tcl/Tk 8.4.  With this release, support for Tcl/Tk 8.4 comes to an end.

所以如果沒有意外,這將是最後一個 Tcl/Tk 8.4.x 的版本。

2013-06-02

FreeWrap 6.6: both 32 and 64 bit Windows version support

FreeWrap


在隔了一陣子回來看 FreeWrap 的情況以後,發現 FreeWrap 現在 32/64 bit Windows 環境都支援了,我想這是一個好消息,提供了更多的彈性。

How to find out the Tcl version

How to find out the Tcl version


如果我們要知道目前的 Tcl 版本,可以使用 puts $tcl_version 就可以知道目前使用的版本。

2013-06-01

Building Tcl/Tk with Mingw

Building Tcl/Tk with Mingw


Tcler's Wiki 上有說明怎麼使用 Mingw + MSYS build Tcl/Tk,經過測試,Tcl 8.6.0 也 buld 成功。

我主要使用下列的 script:

#!/bin/sh
mkdir -p /src
mkdir -p /opt/tcl
mkdir -p /build/tcl
mkdir -p /build/tk
[ -e /src/tcl ] && {
    cd /build/tcl
    /src/tcl/win/configure --prefix=/opt/tcl --enable-threads && make && make install && {
        [ -e /src/tk ] && {
        cd /build/tk
        /src/tk/win/configure --prefix=/opt/tcl --enable-threads --with-tcl=/build/tcl \
            && make && make install
        }
    }
}

2013-04-12

freeWrap version 6.6

freeWrap 6.6 released (supports TCL/TK 8.6.0)

Changes implemented in version 6.6
------------------------------
------
  1. This version is based on TCL/TK 8.6.0.
  2. FreeWrap is now distributed as a 64-bit application. 
  3. The freeWrapPLUS variation has been discontinued. The regular freeWrap variation contains any added extensions. 
  4. Tkpng is no longer included in freeWrap since the TCL/TK core itself now supports PNG image formats. 
  5. SQLite is now included as part of the regular TCL 8.6 distribution and is packaged as such. 
  6. BLT is no longer included in freeWrap since BLT does not support TCL/TK 8.6. 
  7. TCLLIB (version 1.15) is now included in freeWrap at the virtual directory of /tcllib1.15
  8. TKLIB (version 0.5) is now included in freeWrap at the virtual directory of /tklib0.5 
  9. The virtual directory structure has been modified to better reflect the normal TCL/TK directory layout.

freeWrap 6.6 對應的版本是 Tcl/Tk 8.6.0,change log 我已經轉貼過來了。

我想把 Tcllib 和 Tklib 包在一起也好,Tcllib 一開始就有 Tcl standard library 的企圖,而 Tklib 則是掛在 Tcllib 下面。


相關連結:
官方網站

2013-04-09

7zip and password

要建立一個有設密碼的 7zip 檔,只要使用 7zip 的 -p 這個選項就可以搞定了。

下面是在 Windows 的範例:

    set backupfile $env(HOME)
    append backupfile "\\My Documents"
    append backupfile "\\Homepage-"
    append backupfile [clock format [clock seconds] -format %Y%m%d]
    append backupfile ".7z"

    set backupdir $env(HOME)
    append backupdir "\\My Documents"
    append backupdir "\\public_html"

    set fileExist [file exists $backupfile]
    if {$fileExist > 0} {
        puts "Now try to remove old backup file."
        file delete $backupfile
    }

    set var [list 7z -ppassword a $backupfile $backupdir]
    exec {*}$var

這樣子做就可以建立一個有設密碼的 7zip 檔。

2013-03-29

Tklib 0.6 released

[ANN] Tklib 0.6 released


Overview
========

    38 new packages                in 9  modules
    9  changed packages            in 8  modules
    1  internally changed packages in 1  modules
    13 unchanged packages          in 11 modules
    75 packages, total             in 27 modules, total 



詳細的情況請看文章。

2013-03-03

修改檔名

因為手機拍的檔名是 CAM00000 這種格式,所以加了一些判斷,純粹只是方便用而已。
#!/usr/bin/tclsh
#
# Rename script
#
# argument 1: folder location (option)
#

package require jpeg

puts "##########   Start   ##########"

if {$argc >= 1} {
   cd [lindex $argv 0]
} elseif {$argc == 0} {
   cd "c:/tmp"
}

foreach filename [glob *.jpg] {
   array set exif [::jpeg::getExif $filename]
   set today [clock format [clock scan $exif(DateTimeOriginal) \
            -format {%Y:%m:%d %H:%M:%S}] -format %Y%m%d]
            
   set today2 $today
   append today2 "_"   

   regsub -all {\mIMG} $filename $today newFileName   
   
   regsub -all {\mCAM0} $filename $today2 newFileName
   
   file rename $filename $newFileName
}

puts "##########    End    ##########"

exit

使用 Tcl 呼叫 LibreOffice Basic macro 執行

#!c:/tcl/bin/tclsh86.exe
package require http
package require vfs::zip

########################################################################
# Now download file from network
########################################################################
set day [clock format [clock seconds] -format {%d}]
set now [clock seconds]

if {$day > 7} {
 set value [clock format [clock add $now -30 day] -format {%Y%m}]
} else {
 set value [clock format [clock add $now -60 day] -format {%Y%m}]
}

set remoteFile "http://www.twse.com.tw/ch/statistics/download/04/001/"
append remoteFile $value
append remoteFile "_C04001.zip"

puts "======================================================"
puts "URL: $remoteFile"

set localFile $value
append localFile "_C04001.zip"

puts "Download File name: $localFile"
puts "======================================================"

set token [::http::geturl $remoteFile -binary 1]
set data [::http::data $token]

set channel [open $localFile w+]
fconfigure $channel -encoding binary -translation binary
puts -nonewline $channel $data
close $channel

::http::cleanup $token

########################################################################
# Now handle zip file
########################################################################
set mnt_file [vfs::zip::Mount $localFile $localFile]
file copy -force [glob $localFile/*] ./
vfs::zip::Unmount $mnt_file $localFile
file delete $localFile

set DIR [pwd]
set DOCS [glob *.xls]

foreach file $DOCS {
    set inputFile $DIR
    append inputFile "/" $file
    set exeList [list "C:\\Program Files\\LibreOffice 4.0\\program\\soffice.exe" "macro:///Standard.Module1.AutoFindGoodMan($inputFile)"]
    exec {*}$exeList
}

exit

這只是備份。


而 LibreOffice 使用的 macro:
REM ***** BASIC *****

Option Explicit

Sub AutoFindGoodMan(cFile)
Dim Doc As Object
Dim Dummy()

Dim Sheet As Object
Dim Cell As Object
Dim Cell2 As Object
Dim Cell3 As Object
Dim Cell4 As Object
Dim Cell5 As Object
Dim Count As Integer

Doc = StarDesktop.loadComponentFromURL(ConvertToUrl(cFile), "_default", 0, Dummy())

Sheet = Doc.Sheets(0)

dim document   as object
dim dispatcher as object
rem ---------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(2) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Zoom.Value"
args1(0).Value = 100
args1(1).Name = "Zoom.ValueSet"
args1(1).Value = 28703
args1(2).Name = "Zoom.Type"
args1(2).Value = 0
dispatcher.executeDispatch(document, ".uno:Zoom", "", 0, args1())

Dim CellRange As Object
CellRange = Sheet.getCellRangeByName("A66:J845")
CellRange.CellBackColor = RGB(255, 255, 255)

For Count = 66 To 950 Step 1
Cell = Sheet.getCellByPosition(0, Count)
IF Cell.Value > 1000 Then
    Cell.CellBackColor = RGB(0, 0, 255)
    Cell2  = Sheet.getCellByPosition(3, Count)
    Cell3  = Sheet.getCellByPosition(5, Count)
    Cell4  = Sheet.getCellByPosition(7, Count)
    Cell5  = Sheet.getCellByPosition(9, Count)

    IF Cell3.Type = com.sun.star.table.CellContentType.EMPTY Then
        IF Cell4.Value = 0.00 Then
            Cell3.CellBackColor = RGB(255, 0, 0)
            Cell4.CellBackColor = RGB(255, 0, 0)
        ENDIF
    ELSE
        IF Cell3.Value < 10 Then
            IF Cell2.Value <= 15 Then
                Cell2.CellBackColor = RGB(255, 255, 0)
            ELSEIF Cell2.Value > 15 AND Cell2.Value <= 40 THEN
                Cell2.CellBackColor = RGB(0, 255, 0)
            ELSEIF Cell2.Value > 40 THEN
                Cell2.CellBackColor = RGB(0, 255, 255)
            END IF                       
   
            Cell3.CellBackColor = RGB(0, 255, 0)
            
            IF Cell4.Value > 7 THEN
                   Cell4.CellBackColor = RGB(0, 255, 0)
            END IF
        ELSEIF Cell3.Value >= 75 Then
            Cell3.CellBackColor = RGB(0, 255, 255)
        End IF
      End IF  
      
      IF  Cell5.Value <= 2.0 Then
          Cell5.CellBackColor = RGB(0, 255, 255)
      END IF 
End IF
Next Count

If (Doc.isModified) Then
If (Doc.hasLocation And (Not Doc.isReadOnly)) Then
    Doc.store()
End If
End If


Doc.close(True)

End Sub

從證交所下載資料,解壓縮,再使用巨集來標出顏色。新版的 LibreOffice 會有警告,但是不影響使用。

2013-02-08

Tcllib 1.15 is released

Tcllib已經釋出了 1.15 版,下面是發佈的連結和更新的內容。


Tcllib 1.15 Released


Overview
========

    7   new packages                in 5   modules
    33  changed packages            in 29  modules
    10  internally changed packages in 6   modules
    344 unchanged packages          in 90  modules
    400 packages, total             in 110 modules, total

New in tcllib 1.15
==================

    Module      Package                   New Version   Comments
    ----------- ------------------------- ------------- ----------
    clock       clock::iso8601            0.1
                clock::rfc2822            0.1
    ----------- ------------------------- ------------- ----------
    fileutil    fileutil::decode          0.1
    generator   generator                 0.1
    map         map::geocode::nominatim   0.1
    ----------- ------------------------- ------------- ----------
    zip         zipfile::decode           0.2
                zipfile::encode           0.1
    ----------- ------------------------- ------------- ----------

Changes from tcllib 1.14 to 1.15
================================
                                                tcllib 1.14   tcllib 1.15
    Module             Package                  Old Version   New Version   Comments
    ------------------ ------------------------ ------------- ------------- ----------
    aes                aes                      1.0.2         1.1           D EF
    crc                crc16                    1.1.1         1.1.2         B
    csv                csv                      0.7.3         0.8           EF
    doctools           doctools                 1.4.13        1.4.14        T B
    ------------------ ------------------------ ------------- ------------- ----------
    fileutil           fileutil                 1.14.4        1.14.5        B
                       fileutil::traverse       0.4.2         0.4.3         B
    ------------------ ------------------------ ------------- ------------- ----------
    grammar_peg        grammar::peg             0.1           0.2           B
    htmlparse          htmlparse                1.2           1.2.1         B
    http               autoproxy                1.5.1         1.5.3         B
    imap4              imap4                    0.3           0.4           EF
    inifile            inifile                  0.2.4         0.2.5         B
    json               json::write              1.0.1         1.0.2         B
    log                logger                   0.9           0.9.3         B
    ------------------ ------------------------ ------------- ------------- ----------
    map                map::slippy              0.4           0.5           EF
                       map::slippy::fetcher     0.2           0.3           EF
    ------------------ ------------------------ ------------- ------------- ----------
    math               math::statistics         0.7.0         0.8.0         EF
    mime               mime                     1.5.4         1.5.6         B
    ncgi               ncgi                     1.3.2         1.4.1         EF B T D
    ooutil             oo::util                 1             1.1           EF
    pki                pki                      0.2           0.6           EF
    png                png                      0.1.2         0.2           EF
    pop3               pop3                     1.8           1.9           B T
    simulation         simulation::random       0.3           0.3.1         B
    ------------------ ------------------------ ------------- ------------- ----------
    struct             struct::list             1.8.1         1.8.2         B T
                       struct::queue            1.4.2         1.4.4         B T D
                       struct::stack            1.5.1         1.5.3         B T
    ------------------ ------------------------ ------------- ------------- ----------
    tar                tar                      0.7           0.7.1         B
    tepam              tepam                    0.2.0         0.4.0         EF D T
    term               term::ansi::code::ctrl   0.1.1         0.1.2         B
    uev                uevent                   0.2           0.3.1         EF B
    uuid               uuid                     1.0.1         1.0.2         B
    valtype            valtype::iban            1             1.1           EF
    virtchannel_base   tcl::chan::cat           1.0.1         1.0.2         B
    ------------------ ------------------------ ------------- ------------- ----------

Invisible changes (documentation, testsuites)
=============================================

                                          tcllib 1.14   tcllib 1.15
    Module       Package                  Old Version   New Version   Comments
    ------------ ------------------------ ------------- ------------- ----------
    base64       base64                   2.4.2         2.4.2         D
    cmdline      cmdline                  1.3.3         1.3.3         T
    ------------ ------------------------ ------------- ------------- ----------
    grammar_me   grammar::me::cpu         0.2           0.2           T
                 grammar::me::cpu::core   0.2           0.2           T
                 grammar::me::cpu::gasm   0.1           0.1           T
                 grammar::me::tcl         0.1           0.1           T
                 grammar::me::util        0.1           0.1           T
    ------------ ------------------------ ------------- ------------- ----------
    irc          irc                      0.6.1         0.6.1         D
    ------------ ------------------------ ------------- ------------- ----------
    struct       struct::tree             1.2.2         1.2.2         D
                 struct::tree             2.1.2         2.1.2         D
    ------------ ------------------------ ------------- ------------- ----------
    try          try                      1             1             D
    ------------ ------------------------ ------------- ------------- ----------

Legend  Change  Details Comments
        ------  ------- ---------
        Major   API:    ** incompatible ** API changes.

        Minor   EF :    Extended functionality, API.
                I  :    Major rewrite, but no API change

        Patch   B  :    Bug fixes.
                EX :    New examples.
                P  :    Performance enhancement.

        None    T  :    Testsuite changes.
                D  :    Documentation updates.