1#!/usr/local/bin/wish
2# -*- tcl -*-
3# demo of trf features
4
5wm withdraw .
6wm title    . "Trf demonstration"
7
8package require Trf
9
10set fdata {
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
45g2cOICAyfnCBwMQJkhc4Tv4EQePEAxUELkSsWLFCBQgCAAI8+MBixYoVK1asWLFixYoVK6yw
46wgorrNBBIYLAcccdd9xxxx134KHIIopcAgAVO8DAgxFnOEEBCyussMIKK6ywwgospKAAAAAA
47gEAKIqywwgorrLDCCiussMIKLYggAgspJADAKXH4McckCVDyxhx4SEKEFVbIEAYJJCxiBA5N
48HMHCCiussMIKK6ywAgseSAAAAAAAkEAKIqywwgorMGHFMsTwUossOshyTC+wMHMKL80444Us
49xzQTBC6VPINML0X8IMQLRiyRwxJRdOHECiussMIKK6ywAgsfVAAAAAAIIIEHLKwAhAis0AIN
50NP68SBNNM6tUsUgTR6zQQQNsaKIHAwDAkQcccRBDTDTRHOMFEkLQAYMMP5CwRA4zoEFECyus
51sMIKKoBgAAAAFOCBCkykYYUstBADTTOrTFHFDkessMIKK6zQAREFiALHJAeY8oYcbxxSiA66
527BLNMcNwgQMM5DjhhBM7eAEDDieAskQOL4ShRAAWJKBDGmmkkQYQXPDyCzTINJOMDE2AAQ88
537Nyywi3stHMLCx9QoQUIK6wAhjzzlHMMMtQU8cgP8EBCRAtltHDEERpEkQMXTvRwwyI5QOAB
54C1KIkAYQLZSRxjfHNBNNL8a8csw5VtTQwwossMDCCius0EMaVpyzS/400ESDzCpTTFGME05w
55scIKK6ywwgorrLDCCiuskEICAFCgQgcegBBCCDro4AIINXQADDHA9NMPML9EY8wvxkATzS+8
568AINL7aEo8AqwPBiiywQPADBBBJIMIEHHnjgAQgffPABCCCAkIIKA1DQwgorrMACCyuswAIL
57K6ywwgorrLDCCiussMIKK6ywwgorrLDCCiussMIKK6ywwgossLCCCh300IMPPwBCD3oQBCHA
58YAhAIEIRjHCCBoCAAixYwQpWsIIVrGAFK2DBB74AABV0oAMqAAACUqCCFaxgBStYwQpWIIIP
59hMADLviACFZwBDDcwAhGCMMRnCCGKZwAA/4wwMASblCEIBRBA2M4wAdEsIIVrGAFK1jBClaw
60ghWsYAUsCEEC+OACFbBgBStQAQj64IY35OEOd7jDHfDgByfUoQg3EAIJcpADIeAAB0X4wwHU
618AERsGAFK2BBChQAAAFQoAMsWMEKVrCCFaxgBStYwQpWIAIRqKEFK1iBCoBAhjnI4Q53uMMd
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
96EuABLMACFNACQNADw0AMxhANzfALy/ADTdACIqACHhAIiTAHwUAFAQAHciAJo+AHyxAN0NAM
97ODACXWANXRALtfANI/7AAziQBV3ABEewAiuwAiIQAgcAAAAwAB6gBKkwC8cADcYQDcYADdFg
98DLRADmmwAiuwAivwAYVACm+gCXNgCQPQCHmAB3ngBwRQBr9ADNBwDMMABGkACnvgBblwBD9A
99AjCwBGYQBTIABk4QAgoAAABwAB+gAizAAivQA0DwC8RgDMbwCr/QAWWwAiuwAiuwAiuwAh4A
100CZ4wDg3gBm+AB6UACR1QBkDwC8fQDMxADdRADVUQBFPQAaCQAzDwAz8QBVswAmGwATiQA1uQ
101ANmgDdowC7twDMQADdBgDF7QC8RwBD3AAiuwAiuwAitwC+zQDiwABiGgBYwQAizAAisABv49
1028AvHcAyw4A6B0AMi4AQysAdhcARH4ARi8AIkEAZEwARBAANLsAAgsAIrsAIrIAI2oAu70Ayr
103sArU4Az20A63wAXqAAYscAvs0A63wAIq0AFkEAEewALvoA71YAvG0AzNgAyr4AxBMAVgcAQr
104sAJH0AIvAAU/cAROIAZVYAYx0AAgUAZDsAvasAvDMAS6QAvG0Ayw8ALMkAyhkAZgQAEsAAa3
1058A63wAIroAIigAVgkAahsAvHgAy9UATF0ARN0ARMwAQtwAIrsAIrsAIrsAItsAItQAQ7EAMC
106AAEdQAEisAIswAJlkAb7gA3HcAzGYAzRQAe9QA2rAA7TkA1WQP4ETAAEVjAEXpAKx9AM0YAM
107vWAOrbALx0AHQcAPTkABK7ACK7ACK7ACK7ACK7ACK8ACKaAAADABLUABK7ACPfAN2jAMRMAE
108IpAGUrAL0AANxgAN0AAN0dAMv2AMzRAN0QAN0dAMxiALu0AMv/ALvCACQFAGQFAGK8ACLMAC
109LLACK7ACK7ACK7ACK8ACIKAMAnAABHAAB8ABCZAAC7AADfAAFSABEtABHeABHuABH/ABIAAC
110IQACIPABHuABHdABIiACIiACHgACItAABQAAAAAAAAAAAAAAAAAAAAAAI0ACJQAAAmACGnAC
111KCACIiACKyACIiACLMACLMACLMACFP7AAizAAiLAAizAAiuwAiuwAivAAizAAizAAiuwAiuw
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
144axatWi4yubIFK4iqWwBewQqCZw4uH7k+ff76dOYEjhddiKxYsWLFihUrVrBgEWIBAAAAACAI
145sWLFihUrRDABkgZIICCAav36tWqBK2C9ggRTIwyYFw134HBClOoThSNHSOSIAqpJixUrVqxY
146sWIFCxYhGAAAAABAghQsVqxYsQKIklm0avHiAohljuEllQzWAIaXID5x4JhjNMBljjx4QaaK
147HZxAYoMctsABBzSOWGGFFVZYYYUVWGABBGUAAAAAABYIgYUVVlhhBRHSkKUWY3ipBRApdmmG
148F16IgSaaV145pplmssAFD2mQyWILGGAgwYwRRsgBhjCYOGKFFVZYYYUVVmDBAwkAAAAAABZw
149gQURegACCCB6SP5Dll2iWYWXX6KJBppooImmGWmiiSaaaJppJhpkkvlEhjOs4eIabLKAgQcY
150kHBihRVWWGGFFVZgoQMPAAAAgAAecKEMFXiZpZZZfvlBB11oiSYaaJrhZRlqpOjkjUomYcSV
151VKSJJppojhlGBF2wwSYLG5CAgYQcvEDCiRVWWGGFFVZgQYUPBAAAAAEe+KAFIERghZZofuEF
152GGCgiSYabpLJJo0egOjGjzkm6YaPN+B4hhhooIGGmGaW+eEHGJZ4gQQccPBCBidaWGGFFVZY
153QYUPBgAAAAEk8ICFFVZIowxWaIEmmmiiiQabaSZgYgUKOoCkkUr0oCKANzTxg4gxjv6Jphlj
154cMgBhjB+AKIOGEZYwogwnDhihRVWWEEEFwoAAAABjvAAiDSAACINHYagBZpmpqHGDCbKWKGD
155LxjQYZQ54FADADnyMASPN0SRBppmmCnmD1ZmAUcaHszgYQkcYJCBiSNWWGGFEA4AAIABbBhC
156m12OOWaXWn4hBhpjjgGGiR5WWEGEEAwYRBRNNEEDgHHeuOOONw4JpxZojGlmF2OkSCOMF7wI
157I4ctliBhDySccEKEFBIAAIACbKjBClmA2YUYaKKJphloUsmGiRVWWGGFamxAgJI3/JikAEre
158uAMOTjLRYZhdoNllCB1k2GOPMFhwAhNkkAMS4CAHXvCCDP500A0AAKAAHVDBClrAhDRwgRfQ
159iAYskkEMJxxhBStYwQpWIIIPQOIQ5QhGJkjxhjw0IgEfSAMgdkEMZKziCiO4gTl2IA4nIGEP
160QjDDC3KwBBLgAAY3eEEMDvABFYgACEBIQxp4AY1mNGMV56hBGVawghWsYAUrWIEIagAGPVyC
161D5WQRCBqsIIy1IAYxzBGM5Dxile8Yha62MELohAGJjjhCRvYAg5wsAUcLIEDNhjCMHaxi2Mc
162oxnRaAYzqOGMHpRhBStYwQpWsAIWpEMdLQCDBwZQiBq0gAUs6IEKfnGMZqxiHYCoBhDSsAMo
163REEGTHBCD2YghBeY4wc5wMEWEv7wg2/IQhayGAYtfgENaEDjFdgYAhBWcItbgGEFKwADO9px
164ixWEAAtYCAELVvCOdMDDGMcwhjPi4YQm9KAJLADFD5ywAic8IQpRQIITjhCEHGyhGyBYAQtE
165wAUg9IAXv2jGKuiQjGk0gR7wgEc7VsCCW7CjHbdYQQcmQIYOqGAF76BHPbARjWaswhlBmMII
166unCEI6xgBUcowxSygAQnHKEHN8DBFhYAAhasYAU9SIMVfnGMaETjEdO4Rz3acYt3gIEFLLgF
167O9pxCzCsIAQIYAQIVtADdeDDFsc4hi1s8YpmpMIZPTjCClbQAifgIAxMOIITnjAFM2SgAR8o
168AxCs0P4KbGBjF8T4RTSa0YxnUAMD6UgHO27BAi6kQx3wWMEKOhCBAnRABUBoxS6asQsZ5EMd
169+YCHPgABhBasYAUrWMERWtACFhyBC1B4QQmU4QEuzAIYsuACEGxQBmD8ohmr6IUzaLGLUACB
170AixgAQu4wAIWrEAEKviCE+pAi2NEoxmrCMIUiuGEI4hABCtYwQpWsIIVrGAFK1hBC1pggwMA
171AAIeEAETyrACFrSgB0DYxzGiEY1mNCMa1EhGMobgBCAwoQxHOAITgFCDISSDFs1oBjF+QYxX
1729CIIVSjGEVqwghWsYAUrWMEKVrCCFaxgBSlIAAAioAIWrGAFKxBBGgCxC/5sEKMVwIhGNJrR
173C1i8YhVTSAU3jOGMXqSCGssgRjOgAQ1enOMHQNAFMbBBDTE4YQUrWMEKVrCCFaxgBStYwQpY
174EAIGAEACKljBClbQAyC0QhutAAIQ0gCIX0AjGtGIRjSMEY1orIIOvICGMZoRjWgQgxi/+MUv
175aqGLNACBC7oQQRlWsIIVrGAFK1jBClawghWsgAUgUIYAKNACFrCAAkyQhSyYUAMVdCANrdjF
176MVaxCl4YIxrRiAY0ohGNaEDDGNBYxSrQoARg/IIXtciGDj7wAQ94wAMd6IAKOqACFahABSoQ
177gQpEAIIKCIACE6iAMhjQDQVwAAEHIAAB/PGLX0CcwgIWuAY0jMELXvDCGMZgxSmuAQ1e8AIR
178APCFMXghDV8EIAACEMAABDCAAQxgAAMgAAEIUAADHMAABzhAAAICADs=
179}
180
181
182label .logo -anchor ne -bd 2 -relief raised \
183	-image [image create photo -data $fdata]
184
185entry  .input  -relief sunken -border 2 -textvariable input ;#-width 70
186frame  .output -relief raised -border 2
187button .quit   -text Quit -command exit
188button .demo   -text Demo -command startAnimation
189
190pack   .logo   -side left -expand 0 -fill both
191pack   .input  -side top  -expand 1 -fill x -ipadx 1m -ipady 1m
192pack   .output -side top  -expand 1 -fill both
193pack   .quit   -side left -expand 0 -padx 2m -pady 2m
194pack   .demo   -side left -expand 0 -padx 2m -pady 2m
195
196foreach {r m t} {
197    0    rep Input:
198    1    zip {uuencode Zip:}
199    2    hex Hex:
200    3    b64 Base64:
201    4    md5 {hex'd MD5 Hash:}
202} {
203    label  .output.l$m -anchor w -text $t
204    label  .output.x$m -anchor e -text "__"
205    entry  .output.$m  -relief sunken -border 2 -width 100 -textvariable out$m
206
207    grid   .output.l$m -row $r -column 1 -sticky swen
208    grid   .output.x$m -row $r -column 2 -sticky swen
209    grid   .output.$m  -row $r -column 3 -sticky swen -ipadx 1m -ipady 1m
210}
211
212
213proc startAnimation {} {
214    global input
215    set    input ""
216
217    animate 300 \
218	    "Hello world, this is a demonstration \
219of the Trf extension to tcl, a package for transforming \
220data in various ways, as can be seen below"
221}
222
223
224proc animate {delay text} {
225    global input
226
227    set first [string range $text 0 0]
228    set text  [string range $text 1 end]
229
230    if {$first == {}} {
231	return
232    }
233
234    after $delay [list animate $delay $text]
235
236    append input $first
237}
238
239
240proc trf {args} {
241    global input outhex outmd5 outb64 outzip outrep
242
243    # do various transformations on the current input
244    # executed for every change
245    #
246    # convert to HEX
247    # convert into Base64
248    # compute MD5 message digest (display in HEX)
249    # compress using ZIP (display in UUencoded form)
250
251    set temp [zip -mode compress -level 9 $input]
252    set mtmp [md5 $input]
253
254    set outrep $input
255    set outhex [hex      -mode encode $input]
256    set outb64 [base64   -mode encode $input]
257    set outmd5 [hex      -mode encode $mtmp]
258    set outzip [uuencode -mode encode $temp]
259
260    set i  [string length $outrep]
261    set zi [string length $temp]
262
263    # count length of real hash and zip, not the encoded forms
264
265    .output.xrep configure -text $i
266    .output.xhex configure -text [string length $outhex]
267    .output.xb64 configure -text [string length $outb64]
268    .output.xmd5 configure -text [string length $mtmp]
269    .output.xzip configure -text $zi
270
271    if {$zi < $i} {
272	# indicate real compression in interface
273	.output.xzip configure -bg seagreen
274	.output.xrep configure -bg [.output.xhex cget -bg]
275    } else {
276	.output.xzip configure -bg [.output.xhex cget -bg]
277	.output.xrep configure -bg coral
278    }
279}
280
281
282proc out {args} {
283    catch {trf $args} msg
284    if {$msg != {}} {puts "error > $msg"}
285}
286
287trace variable input w trf
288
289
290
291
292focus        .input 
293wm deiconify .
294